From 0cc30a0ae27d4cd9bd3e3cef40dd92a4d967f71b Mon Sep 17 00:00:00 2001 From: =?utf8?q?Rafa=C5=82=20D=C5=82ugo=C5=82=C4=99cki?= Date: Sun, 4 Aug 2013 21:35:46 +0200 Subject: [PATCH 1/1] Added upstream from http://ftp.icm.edu.pl/pub/loglan/ --- .mirror | 403 ++ HTML/HomePage.gif | Bin 0 -> 1485 bytes HTML/MicroMan/Classes.htm | 154 + HTML/MicroMan/Concurre.htm | 177 + HTML/MicroMan/Exceptio.htm | 104 + HTML/MicroMan/FormalTy.htm | 66 + HTML/MicroMan/HomePage.htm | 25 + HTML/MicroMan/Introduc.htm | 98 + HTML/MicroMan/Prefixin.htm | 237 + HTML/MicroMan/Procedur.htm | 170 + HTML/MicroMan/Programm.htm | 111 + HTML/MicroMan/Protecti.htm | 75 + HTML/MicroMan/Referenc.htm | 60 + HTML/MicroMan/TableOfC.htm | 55 + HTML/MicroMan/adjustab.htm | 110 + HTML/MicroMan/compound.htm | 217 + HTML/MicroMan/coroutin.htm | 92 + HTML/MicroMan/gifs/HomePage.gif | Bin 0 -> 1485 bytes HTML/MicroMan/gifs/NextPage.gif | Bin 0 -> 2018 bytes HTML/MicroMan/gifs/PrevPage.gif | Bin 0 -> 2044 bytes HTML/MicroMan/gifs/aa01.gif | Bin 0 -> 1498 bytes HTML/MicroMan/gifs/aa02.gif | Bin 0 -> 166 bytes HTML/MicroMan/gifs/aa03.gif | Bin 0 -> 230 bytes HTML/MicroMan/gifs/aa04.gif | Bin 0 -> 260 bytes HTML/MicroMan/gifs/aa05.gif | Bin 0 -> 480 bytes HTML/MicroMan/gifs/aa06.gif | Bin 0 -> 2124 bytes HTML/MicroMan/gifs/aa07.gif | Bin 0 -> 1994 bytes HTML/MicroMan/gifs/cl01.gif | Bin 0 -> 664 bytes HTML/MicroMan/gifs/cl02.gif | Bin 0 -> 163 bytes HTML/MicroMan/gifs/cl03.gif | Bin 0 -> 1868 bytes HTML/MicroMan/gifs/cl04.gif | Bin 0 -> 472 bytes HTML/MicroMan/gifs/cl05.gif | Bin 0 -> 548 bytes HTML/MicroMan/gifs/cl06.gif | Bin 0 -> 708 bytes HTML/MicroMan/gifs/cl07.gif | Bin 0 -> 643 bytes HTML/MicroMan/gifs/cl08.gif | Bin 0 -> 2289 bytes HTML/MicroMan/gifs/cl09.gif | Bin 0 -> 182 bytes HTML/MicroMan/gifs/cl10.gif | Bin 0 -> 483 bytes HTML/MicroMan/gifs/cl11.gif | Bin 0 -> 709 bytes HTML/MicroMan/gifs/co01.gif | Bin 0 -> 130 bytes HTML/MicroMan/gifs/co02.gif | Bin 0 -> 4849 bytes HTML/MicroMan/gifs/co03.gif | Bin 0 -> 265 bytes HTML/MicroMan/gifs/co04.gif | Bin 0 -> 9021 bytes HTML/MicroMan/gifs/cp01.gif | Bin 0 -> 1950 bytes HTML/MicroMan/gifs/cp02.gif | Bin 0 -> 159 bytes HTML/MicroMan/gifs/cp03.gif | Bin 0 -> 167 bytes HTML/MicroMan/gifs/cp04.gif | Bin 0 -> 307 bytes HTML/MicroMan/gifs/cp05.gif | Bin 0 -> 158 bytes HTML/MicroMan/gifs/cp06.gif | Bin 0 -> 21705 bytes HTML/MicroMan/gifs/cs01.gif | Bin 0 -> 606 bytes HTML/MicroMan/gifs/cs02.gif | Bin 0 -> 429 bytes HTML/MicroMan/gifs/cs03.gif | Bin 0 -> 1265 bytes HTML/MicroMan/gifs/cs04.gif | Bin 0 -> 658 bytes HTML/MicroMan/gifs/cs05.gif | Bin 0 -> 612 bytes HTML/MicroMan/gifs/cs06.gif | Bin 0 -> 183 bytes HTML/MicroMan/gifs/cs07.gif | Bin 0 -> 347 bytes HTML/MicroMan/gifs/cs08.gif | Bin 0 -> 367 bytes HTML/MicroMan/gifs/cs09.gif | Bin 0 -> 682 bytes HTML/MicroMan/gifs/cs10.gif | Bin 0 -> 242 bytes HTML/MicroMan/gifs/cs11.gif | Bin 0 -> 636 bytes HTML/MicroMan/gifs/cs12.gif | Bin 0 -> 1362 bytes HTML/MicroMan/gifs/cs13.gif | Bin 0 -> 444 bytes HTML/MicroMan/gifs/cs14.gif | Bin 0 -> 586 bytes HTML/MicroMan/gifs/cs15.gif | Bin 0 -> 458 bytes HTML/MicroMan/gifs/cs16.gif | Bin 0 -> 492 bytes HTML/MicroMan/gifs/cs17.gif | Bin 0 -> 406 bytes HTML/MicroMan/gifs/cs18.gif | Bin 0 -> 1227 bytes HTML/MicroMan/gifs/cs19.gif | Bin 0 -> 491 bytes HTML/MicroMan/gifs/eh01.gif | Bin 0 -> 1583 bytes HTML/MicroMan/gifs/eh02.gif | Bin 0 -> 70 bytes HTML/MicroMan/gifs/eh03.gif | Bin 0 -> 688 bytes HTML/MicroMan/gifs/fig0401.gif | Bin 0 -> 1019 bytes HTML/MicroMan/gifs/fig0402.gif | Bin 0 -> 975 bytes HTML/MicroMan/gifs/fig0403.gif | Bin 0 -> 1599 bytes HTML/MicroMan/gifs/fig0501.gif | Bin 0 -> 1251 bytes HTML/MicroMan/gifs/fig0502.gif | Bin 0 -> 1723 bytes HTML/MicroMan/gifs/fig0701.gif | Bin 0 -> 1255 bytes HTML/MicroMan/gifs/fig0702.gif | Bin 0 -> 3049 bytes HTML/MicroMan/gifs/fig0703.gif | Bin 0 -> 979 bytes HTML/MicroMan/gifs/ft01.gif | Bin 0 -> 1944 bytes HTML/MicroMan/gifs/ft02.gif | Bin 0 -> 647 bytes HTML/MicroMan/gifs/ft03.gif | Bin 0 -> 227 bytes HTML/MicroMan/gifs/ft04.gif | Bin 0 -> 1598 bytes HTML/MicroMan/gifs/logo.gif | Bin 0 -> 4765 bytes HTML/MicroMan/gifs/logo2.gif | Bin 0 -> 1212 bytes HTML/MicroMan/gifs/mo01.gif | Bin 0 -> 509 bytes HTML/MicroMan/gifs/mo02.gif | Bin 0 -> 2309 bytes HTML/MicroMan/gifs/mo03.gif | Bin 0 -> 537 bytes HTML/MicroMan/gifs/mo04.gif | Bin 0 -> 1436 bytes HTML/MicroMan/gifs/pd01.gif | Bin 0 -> 117 bytes HTML/MicroMan/gifs/pd02.gif | Bin 0 -> 208 bytes HTML/MicroMan/gifs/pd03.gif | Bin 0 -> 165 bytes HTML/MicroMan/gifs/pd04.gif | Bin 0 -> 2017 bytes HTML/MicroMan/gifs/pd05.gif | Bin 0 -> 227 bytes HTML/MicroMan/gifs/pd06.gif | Bin 0 -> 1211 bytes HTML/MicroMan/gifs/pf01.gif | Bin 0 -> 1037 bytes HTML/MicroMan/gifs/pf02.gif | Bin 0 -> 1158 bytes HTML/MicroMan/gifs/pf03.gif | Bin 0 -> 409 bytes HTML/MicroMan/gifs/pf04.gif | Bin 0 -> 587 bytes HTML/MicroMan/gifs/pf05.gif | Bin 0 -> 3593 bytes HTML/MicroMan/gifs/pf06.gif | Bin 0 -> 345 bytes HTML/MicroMan/gifs/pf07.gif | Bin 0 -> 1210 bytes HTML/MicroMan/gifs/pf08.gif | Bin 0 -> 2495 bytes HTML/MicroMan/gifs/pf09.gif | Bin 0 -> 849 bytes HTML/MicroMan/gifs/pf10.gif | Bin 0 -> 170 bytes HTML/MicroMan/gifs/pr01.gif | Bin 0 -> 673 bytes HTML/MicroMan/gifs/pr02.gif | Bin 0 -> 468 bytes HTML/MicroMan/gifs/pr03.gif | Bin 0 -> 160 bytes HTML/MicroMan/gifs/pr04.gif | Bin 0 -> 532 bytes HTML/MicroMan/gifs/pr05.gif | Bin 0 -> 468 bytes HTML/MicroMan/gifs/pr06.gif | Bin 0 -> 484 bytes HTML/MicroMan/gifs/pr07.gif | Bin 0 -> 508 bytes HTML/MicroMan/gifs/pr08.gif | Bin 0 -> 667 bytes HTML/MicroMan/gifs/pr09.gif | Bin 0 -> 426 bytes HTML/MicroMan/gifs/pr10.gif | Bin 0 -> 113 bytes HTML/MicroMan/gifs/pr11.gif | Bin 0 -> 111 bytes HTML/MicroMan/gifs/pr12.gif | Bin 0 -> 235 bytes HTML/MicroMan/gifs/pr13.gif | Bin 0 -> 384 bytes HTML/MicroMan/gifs/pr14.gif | Bin 0 -> 684 bytes HTML/MicroMan/gifs/pr15.gif | Bin 0 -> 678 bytes HTML/MicroMan/gifs/pr16.gif | Bin 0 -> 1625 bytes HTML/MicroMan/gifs/pr17.gif | Bin 0 -> 5253 bytes HTML/MicroMan/gifs/pr18.gif | Bin 0 -> 693 bytes HTML/MicroMan/gifs/pr19.gif | Bin 0 -> 624 bytes HTML/MicroMan/gifs/pr20.gif | Bin 0 -> 1426 bytes HTML/MicroMan/gifs/pt01.gif | Bin 0 -> 487 bytes HTML/MicroMan/modulari.htm | 103 + HTML/MicroMan/monitors.htm | 204 + HTML/NextPage.gif | Bin 0 -> 2018 bytes HTML/PrevPage.gif | Bin 0 -> 2044 bytes HTML/alglogc2.htm | 209 + HTML/availlty.htm | 56 + HTML/availlty.htm~ | 56 + HTML/biblio.htm | 224 + HTML/biul2.html | 182 + HTML/biul2.html.bak | 182 + HTML/biul2.html~ | 145 + HTML/biul2.txt | 98 + HTML/biul2.txt~ | 88 + HTML/comptble.ps.Z | Bin 0 -> 23003 bytes HTML/credits.htm | 165 + HTML/credits.htm~ | 158 + HTML/crowd2.jpg | Bin 0 -> 18254 bytes HTML/default1.hot | 79 + HTML/doc3.htm | 14 + HTML/errorcd.htm | 415 ++ HTML/homepage.gif | Bin 0 -> 1485 bytes HTML/icons/HomePage.gif | Bin 0 -> 1485 bytes HTML/icons/NextPage.gif | Bin 0 -> 2018 bytes HTML/icons/PrevPage.gif | Bin 0 -> 2044 bytes HTML/icons/loglanmm.gif | Bin 0 -> 1212 bytes HTML/icons/logo.gif | Bin 0 -> 4765 bytes HTML/index.html | 113 + HTML/index.html.bak | 110 + HTML/index.html~ | 95 + HTML/iuwgraf3.htm | 774 +++ HTML/iuwgraf4.htm | 750 +++ HTML/iuwgraf5.htm | 735 +++ HTML/klasyiob.htm | 590 ++ HTML/loghome.htm | 95 + HTML/loghome.htm~ | 95 + HTML/loglan82.htm | 36 + HTML/loglanmm.gif | Bin 0 -> 1212 bytes HTML/logo.gif | Bin 0 -> 4765 bytes HTML/mosaic.ghi | Bin 0 -> 161 bytes HTML/nextpage.gif | Bin 0 -> 2018 bytes HTML/openpbms.htm | 131 + HTML/openpbms.htm~ | 131 + HTML/platform.htm | 79 + HTML/prevpage.gif | Bin 0 -> 2044 bytes HTML/procesy.htm | 490 ++ HTML/progobi.htm | 62 + HTML/quick.htm | 391 ++ HTML/quick.htm~ | 391 ++ HTML/quickref.ps.Z | Bin 0 -> 51935 bytes HTML/quickref.txt | 311 + HTML/read_it.htm | 29 + HTML/signals.htm | 525 ++ HTML/solate.htm | 41 + HTML/tablica3.htm | 314 + HTML/tablica3.htm~ | 314 + HTML/tablica3.txt | 67 + HTML/tarski/default1.hot | 79 + HTML/tarski/ghostscr.htm | 163 + HTML/tarski/tarski1.htm | 24 + HTML/tarski/tarski10.gif | Bin 0 -> 81478 bytes HTML/tarski/tarski11.gif | Bin 0 -> 81478 bytes HTML/tarski/tarski12.gif | Bin 0 -> 140270 bytes HTML/tarski/tarski14.gif | Bin 0 -> 110806 bytes HTML/tarski/tarski3d.htm | 0 HTML/tarski/tarski3e.htm | 26 + HTML/tarski/tarski3e.url | 2 + HTML/tarski/tarski5.gif | Bin 0 -> 5762 bytes HTML/tarski/tarski6.gif | Bin 0 -> 81478 bytes HTML/tarski/tarski7.gif | Bin 0 -> 227138 bytes HTML/tarski/tarski8.gif | Bin 0 -> 81478 bytes HTML/tarski/tarski9.gif | Bin 0 -> 90994 bytes HTML/tarski/~wrd2230.tmp | Bin 0 -> 573440 bytes HTML/userman.htm | 1195 ++++ HTML/whylog.htm | 258 + HTML/whylog.htm~ | 258 + HTML/xiiuwgr.htm | 430 ++ HTML/zaproszenie.html | 188 + at_work/case_al/index.html | 17 + at_work/case_al/index.html~ | 17 + at_work/exe_old/486.inc/bank2.log | 336 ++ at_work/exe_old/486.inc/cc.bat | 11 + at_work/exe_old/486.inc/essai.log | 10 + at_work/exe_old/486.inc/exec.bat | 6 + at_work/exe_old/486.inc/gen.exe | Bin 0 -> 70174 bytes at_work/exe_old/486.inc/int.exe | Bin 0 -> 150360 bytes at_work/exe_old/486.inc/loglan.exe | Bin 0 -> 225368 bytes at_work/exe_old/486.inc/logpp.exe | Bin 0 -> 72704 bytes at_work/exe_old/486.inc/old1.ccd | Bin 0 -> 5272 bytes at_work/exe_old/486.inc/old1.log | 91 + at_work/exe_old/486.inc/old1.pcd | Bin 0 -> 400 bytes at_work/exe_old/486.inc/readme | 9 + at_work/exe_old/486.inc/simula.inc | 187 + at_work/exe_old/486.inc/var.inc | 2 + at_work/exe_old/bank2.log | 336 ++ at_work/exe_old/cc.bat | 11 + at_work/exe_old/essai.ccd | Bin 0 -> 828 bytes at_work/exe_old/essai.lcd | Bin 0 -> 194272 bytes at_work/exe_old/essai.log | 10 + at_work/exe_old/essai.pcd | Bin 0 -> 240 bytes at_work/exe_old/exec.bat | 6 + at_work/exe_old/gen.exe | Bin 0 -> 70174 bytes at_work/exe_old/go32.exe | Bin 0 -> 78666 bytes at_work/exe_old/info.log | 7 + at_work/exe_old/int.exe | Bin 0 -> 150360 bytes at_work/exe_old/logcomp.bat | 5 + at_work/exe_old/loglan.exe | Bin 0 -> 225368 bytes at_work/exe_old/logpp.exe | Bin 0 -> 72704 bytes at_work/exe_old/logsesja.bat | 5 + at_work/exe_old/old1.log | 91 + at_work/exe_old/readme | 9 + at_work/exe_old/simula.inc | 187 + at_work/exe_old/var.inc | 2 + at_work/loglan96/index.html | 44 + at_work/loglan96/index.html.bak | 44 + at_work/loglan96/index.html~ | 28 + at_work/loglan96/index.map | 2 + at_work/loglan96/intro.gif | Bin 0 -> 117569 bytes at_work/loglan96/intro.jpg | Bin 0 -> 230819 bytes at_work/logpp/logpp/logpp.arj | Bin 0 -> 174697 bytes at_work/logpp/pass1/pass1.arj | Bin 0 -> 232203 bytes at_work/random_alg/index.html | 17 + at_work/random_alg/index.html~ | 17 + bin/atari/atari.doc | Bin 0 -> 11257 bytes bin/atari/atari.ps | 1147 ++++ bin/atari/atari.use | 15 + bin/atari/atari.usr | Bin 0 -> 11161 bytes bin/atari/atariusr.txt | 104 + bin/atari/desktop.inf | 18 + bin/atari/emacs.rc | 266 + bin/atari/gen.ttp | Bin 0 -> 39297 bytes bin/atari/intgem.prg | Bin 0 -> 79502 bytes bin/atari/loglan.ttp | Bin 0 -> 237302 bytes bin/atari/me.ttp | Bin 0 -> 76692 bytes bin/atari/ms.tos | Bin 0 -> 9104 bytes bin/dos/286/cga/cg32int.exe | Bin 0 -> 82955 bytes bin/dos/286/cga/cg64hint.exe | Bin 0 -> 150497 bytes bin/dos/286/cga/cg64int.exe | Bin 0 -> 82587 bytes bin/dos/286/cga/cgaint1.exe | Bin 0 -> 101203 bytes bin/dos/286/dirinfo | 9 + bin/dos/286/egahint.exe | Bin 0 -> 134410 bytes bin/dos/286/egahint.old | Bin 0 -> 152057 bytes bin/dos/286/egaint.exe | Bin 0 -> 93444 bytes bin/dos/286/egaint.old | Bin 0 -> 83883 bytes bin/dos/286/gen.exe | Bin 0 -> 48840 bytes bin/dos/286/hgchint.exe | Bin 0 -> 133290 bytes bin/dos/286/hgcint.exe | Bin 0 -> 92340 bytes bin/dos/286/hgen.exe | Bin 0 -> 51404 bytes bin/dos/286/loglan.exe | Bin 0 -> 248828 bytes bin/dos/286/old/gen.exe | Bin 0 -> 31402 bytes bin/dos/286/old/hgen.exe | Bin 0 -> 32672 bytes bin/dos/286/old/hint.exe | Bin 0 -> 150689 bytes bin/dos/286/old/int.exe | Bin 0 -> 82779 bytes bin/dos/286/old/l2c1.exe | Bin 0 -> 104360 bytes bin/dos/286/old/l2c2.exe | Bin 0 -> 114748 bytes bin/dos/286/old/loglan.exe | Bin 0 -> 248828 bytes bin/dos/286/old/ne2lotek.exe | Bin 0 -> 10064 bytes bin/dos/286/old/pkzip.exe | Bin 0 -> 32880 bytes bin/dos/286/old/prep.exe | Bin 0 -> 18644 bytes bin/dos/286/readme | 21 + bin/dos/386/cc.bat | 12 + bin/dos/386/dirinfo | 2 + bin/dos/386/gen.exe | Bin 0 -> 69598 bytes bin/dos/386/int.exe | Bin 0 -> 149912 bytes bin/dos/386/loglan.exe | Bin 0 -> 219928 bytes bin/dos/386/old1.log | 91 + bin/dos/386/readme | 26 + bin/dos/486/cc.bat | 11 + bin/dos/486/gen.exe | Bin 0 -> 70174 bytes bin/dos/486/go32.exe | Bin 0 -> 78666 bytes bin/dos/486/int.exe | Bin 0 -> 150360 bytes bin/dos/486/logcomp.bat | 5 + bin/dos/486/loglan.exe | Bin 0 -> 225368 bytes bin/dos/486/logpp.exe | Bin 0 -> 72704 bytes bin/dos/486/logsesja.bat | 5 + bin/dos/486/readme | 9 + bin/dos/drivers.grp/acumos.grn | Bin 0 -> 547 bytes bin/dos/drivers.grp/aheada.grd | Bin 0 -> 287 bytes bin/dos/drivers.grp/aheadb.grd | Bin 0 -> 267 bytes bin/dos/drivers.grp/ati.grd | Bin 0 -> 375 bytes bin/dos/drivers.grp/ati_16md.grn | Bin 0 -> 979 bytes bin/dos/drivers.grp/atigupro.grn | Bin 0 -> 513 bytes bin/dos/drivers.grp/atiultra.grn | Bin 0 -> 1208 bytes bin/dos/drivers.grp/ativga.grn | Bin 0 -> 565 bytes bin/dos/drivers.grp/chips.grd | Bin 0 -> 282 bytes bin/dos/drivers.grp/cirrus54.grn | Bin 0 -> 700 bytes bin/dos/drivers.grp/cl5426.grn | Bin 0 -> 549 bytes bin/dos/drivers.grp/et3000.grn | Bin 0 -> 530 bytes bin/dos/drivers.grp/et4000.grn | Bin 0 -> 884 bytes bin/dos/drivers.grp/everex.grd | Bin 0 -> 311 bytes bin/dos/drivers.grp/genoa.grd | Bin 0 -> 285 bytes bin/dos/drivers.grp/newss24x.grn | Bin 0 -> 668 bytes bin/dos/drivers.grp/oak.grn | Bin 0 -> 499 bytes bin/dos/drivers.grp/paradise.grd | Bin 0 -> 263 bytes bin/dos/drivers.grp/realtek.grn | Bin 0 -> 577 bytes bin/dos/drivers.grp/s3805_1m.grn | Bin 0 -> 832 bytes bin/dos/drivers.grp/s3864_2m.grn | Bin 0 -> 904 bytes bin/dos/drivers.grp/sparadis.grn | Bin 0 -> 549 bytes bin/dos/drivers.grp/ss24x.grn | Bin 0 -> 1041 bytes bin/dos/drivers.grp/stdvga.grn | Bin 0 -> 502 bytes bin/dos/drivers.grp/stealth.grn | Bin 0 -> 617 bytes bin/dos/drivers.grp/tr8900.grn | Bin 0 -> 578 bytes bin/dos/drivers.grp/vesa111.vdr | Bin 0 -> 3046 bytes bin/dos/drivers.grp/vesa_s3.grn | Bin 0 -> 735 bytes bin/dos/drivers.grp/video7.grd | Bin 0 -> 331 bytes bin/dos/drivers.grp/viper.grn | Bin 0 -> 749 bytes bin/dos/drivers.grp/wd90c3x.grn | Bin 0 -> 624 bytes bin/dos/drivers.grp/wdvanila.grn | Bin 0 -> 609 bytes bin/l2c/l2c1.exe | Bin 0 -> 104360 bytes bin/l2c/l2c2.exe | Bin 0 -> 114748 bytes bin/l2c/readme | 19 + bin/readme | 19 + bin/unix/linux/loglan | Bin 0 -> 200704 bytes bin/unix/linux/readme | 9 + biuletyn/biul1.html | 61 + biuletyn/biul2.html | 32 + biuletyn/index.html | 38 + biuletyn/index.html.bak | 38 + biuletyn/index.html~ | 61 + biuletyn/marble2.jpg | Bin 0 -> 2257 bytes biuletyn/n1.gif | Bin 0 -> 1150 bytes biuletyn/nieprzeg.gif | Bin 0 -> 4661 bytes biuletyn/nieprzeg.jpg | Bin 0 -> 4172 bytes doc/comptble.doc | Bin 0 -> 7756 bytes doc/comptble.ps | 4033 +++++++++++++ doc/credits.doc | Bin 0 -> 37577 bytes doc/iiuwgraf.pl | 1546 +++++ doc/iuwgraf.doc | Bin 0 -> 24880 bytes doc/iuwgraf.txt | 423 ++ doc/iuwgraf3.doc | Bin 0 -> 25453 bytes doc/iuwgraf3.ps | 2815 +++++++++ doc/iuwgraf3.txt | 558 ++ doc/leaflet.doc | Bin 0 -> 2855 bytes doc/loghelp.hlp | Bin 0 -> 1791 bytes doc/loglan.inf | 49 + doc/loglan.txt | 2010 +++++++ doc/loglanmi.doc | Bin 0 -> 89346 bytes doc/loglanmi.rtf | 807 +++ doc/loglanmi.txt | 1374 +++++ doc/loglgraf.doc | Bin 0 -> 24554 bytes doc/lotek.hlp | 566 ++ doc/nguide/lisez.moi | 14 + doc/nguide/loglan.ng | Bin 0 -> 43980 bytes doc/nguide/ng.exe | Bin 0 -> 38160 bytes doc/nguide/ngc.exe | Bin 0 -> 13057 bytes doc/nguide/ngdump/bufio.pas | 124 + doc/nguide/ngdump/ngdump.pas | 545 ++ doc/nguide/ngdump/readme | 18 + doc/nguide/ngml.exe | Bin 0 -> 14519 bytes doc/nguide/prelog.exe | Bin 0 -> 24610 bytes doc/nguide/readme | 18 + doc/prototyp.doc | 34 + doc/quickref.doc | Bin 0 -> 15331 bytes doc/quickref.ps | 5006 ++++++++++++++++ doc/quickref.txt | 311 + doc/readme | 10 + doc/report.hlp | 7110 ++++++++++++++++++++++ doc/report82/index82.doc | Bin 0 -> 9913 bytes doc/report82/indexr82.doc | Bin 0 -> 9802 bytes doc/report82/oldgramr.doc | Bin 0 -> 39597 bytes doc/report82/rep82tyt.doc | Bin 0 -> 4417 bytes doc/report82/report82.doc | Bin 0 -> 308696 bytes doc/report82/sepcompi.doc | Bin 0 -> 27752 bytes doc/userman.txt | 1406 +++++ doc/userman2.doc | Bin 0 -> 151097 bytes doc/xiiuwgra.doc | Bin 0 -> 24123 bytes doc/xiiuwgra.txt | 506 ++ examples.zip | Bin 0 -> 190194 bytes examples/ansi.log | 59 + examples/apply/backtrac.log | 920 +++ examples/apply/deriv.ccd | Bin 0 -> 23664 bytes examples/apply/deriv.log | 747 +++ examples/apply/deriv.pcd | Bin 0 -> 2000 bytes examples/apply/kmpalg.ccd | Bin 0 -> 16950 bytes examples/apply/kmpalg.log | 635 ++ examples/apply/kmpalg.pcd | Bin 0 -> 1160 bytes examples/apply/paretn.ccd | Bin 0 -> 16950 bytes examples/apply/paretn.log | 637 ++ examples/apply/paretn.pcd | Bin 0 -> 1160 bytes examples/apply/sacados.ccd | Bin 0 -> 6366 bytes examples/apply/sacados.log | 283 + examples/apply/sacados.pcd | Bin 0 -> 560 bytes examples/apply/total/d | 1 + examples/apply/total/m | 4 + examples/apply/total/neocogni.log | 1085 ++++ examples/apply/total/presenta | Bin 0 -> 10080 bytes examples/apply/total/t | 1 + examples/apply/windo.log | 546 ++ examples/backtrac/graphcol.log | 358 ++ examples/backtrac/roundcm.log | 321 + examples/backtrac/search.log | 402 ++ examples/backtrac/stsearch.his | 7125 +++++++++++++++++++++++ examples/backtrac/stsearch.log | 369 ++ examples/bank2.log | 521 ++ examples/biela/r.ccd | Bin 0 -> 183364 bytes examples/biela/r.log | 3694 ++++++++++++ examples/biela/r.pcd | Bin 0 -> 7936 bytes examples/biela/retrprov.d10 | 1 + examples/biela/retrprov.d11 | 1 + examples/biela/retrprov.d15 | 1 + examples/biela/retrprov.d16 | 1 + examples/biela/retrprov.d17 | 1 + examples/biela/retrprov.d19 | 1 + examples/biela/retrprov.d20 | 1 + examples/biela/retrprov.d21 | 1 + examples/biela/retrprov.d22 | 1 + examples/biela/retrprov.d23 | 1 + examples/biela/retrprov.dat | 1 + examples/biela/retrprov.de1 | 1 + examples/biela/retrprov.de2 | 1 + examples/biela/retrprov.de3 | 1 + examples/biela/retrprov.de4 | 1 + examples/biela/retrprov.de5 | 1 + examples/biela/retrprov.de6 | 1 + examples/biela/retrprov.de7 | 1 + examples/biela/retrprov.de8 | 1 + examples/biela/retrprov.de9 | 1 + examples/biela/retrprov.def | 1 + examples/chin/alop | Bin 0 -> 864 bytes examples/chin/c_testy.log | 902 +++ examples/chin/ch.lcd | Bin 0 -> 4 bytes examples/chin/ch.log | 343 ++ examples/chin/chinczyk.ccd | Bin 0 -> 42044 bytes examples/chin/chinczyk.log | 1349 +++++ examples/chin/chinczyk.pcd | Bin 0 -> 2560 bytes examples/chin/li1004.ccd | Bin 0 -> 18978 bytes examples/chin/li1004.lcd | Bin 0 -> 64512 bytes examples/chin/li1004.log | 631 ++ examples/chin/li1004.pcd | Bin 0 -> 2120 bytes examples/chin/nalp | Bin 0 -> 752 bytes examples/chin/plan | Bin 0 -> 752 bytes examples/chin/pola | Bin 0 -> 864 bytes examples/chin/projet1.ccd | Bin 0 -> 29478 bytes examples/chin/projet1.log | 637 ++ examples/chin/projet1.pcd | Bin 0 -> 1040 bytes examples/data_str/2_3arb.ccd | Bin 0 -> 31924 bytes examples/data_str/2_3arb.log | 982 ++++ examples/data_str/2_3arb.pcd | Bin 0 -> 1920 bytes examples/data_str/2_3kujaw.ccd | Bin 0 -> 28218 bytes examples/data_str/2_3kujaw.log | 1118 ++++ examples/data_str/2_3kujaw.pcd | Bin 0 -> 2000 bytes examples/data_str/avl.ccd | Bin 0 -> 13916 bytes examples/data_str/avl.log | 425 ++ examples/data_str/avl.pcd | Bin 0 -> 1320 bytes examples/data_str/barbre.ccd | Bin 0 -> 34008 bytes examples/data_str/barbre.log | 1100 ++++ examples/data_str/barbre.pcd | Bin 0 -> 2360 bytes examples/data_str/bicol2.ccd | Bin 0 -> 23286 bytes examples/data_str/bicol2.log | 724 +++ examples/data_str/bicol2.pcd | Bin 0 -> 840 bytes examples/data_str/bicol3.log | 678 +++ examples/data_str/bst.ccd | Bin 0 -> 28490 bytes examples/data_str/bst.log | 830 +++ examples/data_str/bst.pcd | Bin 0 -> 1680 bytes examples/data_str/bst2.ccd | Bin 0 -> 15538 bytes examples/data_str/bst2.log | 473 ++ examples/data_str/bst2.pcd | Bin 0 -> 920 bytes examples/data_str/bst3.ccd | Bin 0 -> 19020 bytes examples/data_str/bst3.log | 663 +++ examples/data_str/bst3.pcd | Bin 0 -> 1360 bytes examples/data_str/bstscan.ccd | Bin 0 -> 34998 bytes examples/data_str/bstscan.log | 1053 ++++ examples/data_str/bstscan.pcd | Bin 0 -> 1560 bytes examples/data_str/new.ccd | Bin 0 -> 32252 bytes examples/data_str/new.log | 1051 ++++ examples/data_str/new.pcd | Bin 0 -> 2200 bytes examples/data_str/projet.log | 334 ++ examples/data_str/queue2.ccd | Bin 0 -> 29894 bytes examples/data_str/queue2.log | 1145 ++++ examples/data_str/queue2.pcd | Bin 0 -> 1960 bytes examples/data_str/str_poly.ccd | Bin 0 -> 24928 bytes examples/data_str/str_poly.lcd | Bin 0 -> 71680 bytes examples/data_str/str_poly.log | 793 +++ examples/data_str/str_poly.pcd | Bin 0 -> 1840 bytes examples/data_str/temp16.tmp | 1 + examples/data_str/temp18.tmp | 1 + examples/database/authors.idx | Bin 0 -> 456 bytes examples/database/library.bas | 0 examples/database/library.dat | Bin 0 -> 2192 bytes examples/database/noinv.idx | Bin 0 -> 56 bytes examples/database/sgbd.ccd | Bin 0 -> 103028 bytes examples/database/sgbd.log | 2204 +++++++ examples/database/sgbd.pcd | Bin 0 -> 6634 bytes examples/database/test19.ccd | Bin 0 -> 111260 bytes examples/database/test19.log | 2829 +++++++++ examples/database/test19.pcd | Bin 0 -> 5890 bytes examples/demos.pau/sort95/600 | 0 examples/demos.pau/sort95/egahint.exe | Bin 0 -> 152057 bytes examples/demos.pau/sort95/sort.ccd | Bin 0 -> 368808 bytes examples/demos.pau/sort95/sort.log | 2423 ++++++++ examples/demos.pau/sort95/sort.pcd | Bin 0 -> 5022 bytes examples/demos.pau/sort95/zrob!to.bat | 4 + examples/examples.old/avl.log | 1226 ++++ examples/examples.old/bbarbre1.log | 720 +++ examples/examples.old/bbarbre2.log | 885 +++ examples/examples.old/bicolore.log | 1246 ++++ examples/examples.old/bidim.log | 637 ++ examples/examples.old/data.bas | 275 + examples/examples.old/data.dem | 91 + examples/examples.old/explan | 24 + examples/examples.old/geometri.log | 1009 ++++ examples/examples.old/hull.log | 593 ++ examples/examples.old/proj_li1.log | 1048 ++++ examples/examples.old/projet.log | 1669 ++++++ examples/examples.old/projli11.log | 1006 ++++ examples/examples.old/search.log | 402 ++ examples/examples.old/texte.log | 972 ++++ examples/examples/helpcor.log | 2033 +++++++ examples/examples/p.log | 1502 +++++ examples/examples/strassen.log | 1244 ++++ examples/gare/gare.ccd | Bin 0 -> 69960 bytes examples/gare/gare.log | 1561 +++++ examples/gare/gare.pcd | Bin 0 -> 5332 bytes examples/gare/new-1.exe | Bin 0 -> 74880 bytes examples/geometri/convexh1.ccd | Bin 0 -> 13480 bytes examples/geometri/convexh1.log | 395 ++ examples/geometri/convexh1.pcd | Bin 0 -> 1000 bytes examples/geometri/convexh2.log | 373 ++ examples/geometri/convexh3.log | 946 +++ examples/geometri/convgraf.ccd | Bin 0 -> 19428 bytes examples/geometri/convgraf.log | 472 ++ examples/geometri/convgraf.pcd | Bin 0 -> 1040 bytes examples/geometri/cub.ccd | Bin 0 -> 36284 bytes examples/geometri/cub.log | 727 +++ examples/geometri/cub.pcd | Bin 0 -> 1116 bytes examples/geometri/grafika.log | 394 ++ examples/geometri/inwers.ccd | Bin 0 -> 19214 bytes examples/geometri/inwers.log | 604 ++ examples/geometri/inwers.pcd | Bin 0 -> 800 bytes examples/geometri/leser5.log | 323 + examples/geometri/mariusz4.log | 249 + examples/geometri/odcinki.ccd | Bin 0 -> 35516 bytes examples/geometri/odcinki.lcd | Bin 0 -> 82432 bytes examples/geometri/odcinki.log | 1049 ++++ examples/geometri/odcinki.pcd | Bin 0 -> 2680 bytes examples/geometri/p3d.log | 1082 ++++ examples/graphcol.ccd | Bin 0 -> 8888 bytes examples/graphcol.log | 301 + examples/graphcol.pcd | Bin 0 -> 1120 bytes examples/grazyna.xmp/belote.log | 3556 +++++++++++ examples/grazyna.xmp/binda3.log | 408 ++ examples/grazyna.xmp/bus13.log | 994 ++++ examples/grazyna.xmp/convexh1.log | 395 ++ examples/grazyna.xmp/cub.log | 727 +++ examples/grazyna.xmp/dominate.log | 1226 ++++ examples/grazyna.xmp/morp3d.log | 2787 +++++++++ examples/grazyna.xmp/morps.log | 5001 ++++++++++++++++ examples/grazyna.xmp/new.log | 1051 ++++ examples/grazyna.xmp/part.log | 239 + examples/grazyna.xmp/pina.log | 1983 +++++++ examples/grazyna.xmp/sort.log | 452 ++ examples/grazyna.xmp/station.log | 1248 ++++ examples/jeu/alumet.ccd | Bin 0 -> 9176 bytes examples/jeu/alumet.log | 379 ++ examples/jeu/alumet.pcd | Bin 0 -> 520 bytes examples/jeu/dames.ccd | Bin 0 -> 44640 bytes examples/jeu/dames.log | 1309 +++++ examples/jeu/dames.pcd | Bin 0 -> 1680 bytes examples/jeu/donnees.lab | Bin 0 -> 728 bytes examples/jeu/jeu.log | 2485 ++++++++ examples/jeu/laby.ccd | Bin 0 -> 98040 bytes examples/jeu/laby.log | 1147 ++++ examples/jeu/laby.pcd | Bin 0 -> 3472 bytes examples/jeu/labyrint.ccd | Bin 0 -> 26426 bytes examples/jeu/labyrint.log | 846 +++ examples/jeu/labyrint.pcd | Bin 0 -> 1560 bytes examples/jeu/othello.log | 1211 ++++ examples/jeu/pina.ccd | Bin 0 -> 119800 bytes examples/jeu/pina.lcd | Bin 0 -> 131584 bytes examples/jeu/pina.log | 1983 +++++++ examples/jeu/pina.pcd | Bin 0 -> 5456 bytes examples/jeu/reversi.ccd | Bin 0 -> 21700 bytes examples/jeu/reversi.log | 764 +++ examples/jeu/reversi.pcd | Bin 0 -> 1320 bytes examples/logic/gentzen.ccd | Bin 0 -> 38598 bytes examples/logic/gentzen.log | 1135 ++++ examples/logic/gentzen.pcd | Bin 0 -> 2560 bytes examples/new-1.exe | Bin 0 -> 74880 bytes examples/pataud/mon.log | 187 + examples/pataud/multilvl.log | 37 + examples/pataud/new1.log | 253 + examples/pataud/new2.log | 567 ++ examples/pataud/new3.log | 897 +++ examples/pataud/new5.log | 798 +++ examples/pataud/proc2.log | 400 ++ examples/pataud/simula.log | 2663 +++++++++ examples/pataud/simula2.log | 3982 +++++++++++++ examples/pataud/test.dat | 2 + examples/pataud/verspec.log | 272 + examples/pataud/verspecf.doc | Bin 0 -> 10707 bytes examples/pataud/ville.dat | 67 + examples/pataud/ville.log | 262 + examples/pataud/windows.log | 880 +++ examples/process/binda3.ccd | Bin 0 -> 11420 bytes examples/process/binda3.log | 408 ++ examples/process/binda3.pcd | Bin 0 -> 800 bytes examples/process/part.ccd | Bin 0 -> 7108 bytes examples/process/part.log | 239 + examples/process/part.pcd | Bin 0 -> 600 bytes examples/process/parth.log | 239 + examples/process/philos.log | 372 ++ examples/process/ring2.ccd | Bin 0 -> 4646 bytes examples/process/ring2.log | 160 + examples/process/ring2.pcd | Bin 0 -> 720 bytes examples/process/sort.bak | 452 ++ examples/process/sort.ccd | Bin 0 -> 14490 bytes examples/process/sort.err | 35 + examples/process/sort.log | 452 ++ examples/process/sort.ltk | Bin 0 -> 13 bytes examples/process/sort.pcd | Bin 0 -> 1680 bytes examples/simulati/bank2.ccd | Bin 0 -> 16212 bytes examples/simulati/bank2.log | 521 ++ examples/simulati/bank2.pcd | Bin 0 -> 2120 bytes examples/simulati/bank22.log | 752 +++ examples/simulati/bus.ccd | Bin 0 -> 31856 bytes examples/simulati/bus.log | 965 +++ examples/simulati/bus.pcd | Bin 0 -> 2320 bytes examples/simulati/bus13.ccd | Bin 0 -> 32104 bytes examples/simulati/bus13.log | 1017 ++++ examples/simulati/bus13.pcd | Bin 0 -> 2360 bytes examples/simulati/gare.ccd | Bin 0 -> 69984 bytes examples/simulati/gare.log | 1561 +++++ examples/simulati/gare.pcd | Bin 0 -> 5332 bytes examples/simulati/station.ccd | Bin 0 -> 47872 bytes examples/simulati/station.log | 1248 ++++ examples/simulati/station.pcd | Bin 0 -> 3658 bytes examples/test19/autor.idx | 0 examples/test19/bibliog.bas | 0 examples/test19/bibliog.dta | 0 examples/test19/data.bas | 275 + examples/test19/nrpzycji.idx | 0 examples/test19/test19.log | 2830 +++++++++ examples/ulica.log | 1608 +++++ loglan96/lcode/lcode | 261 + loglan96/lcode/readme | 10 + loglan96/loglan84.rs/antek2.txt | 1098 ++++ loglan96/loglan84.rs/antek3.txt | 1375 +++++ loglan96/loglan84.rs/antek4.txt | 2393 ++++++++ loglan96/loglan84.rs/antek6.txt | 5326 +++++++++++++++++ loglan96/loglan84.rs/loginlog.txt | 3386 +++++++++++ loglan96/loglan84.rs/readme | 21 + loglan96/loglan84.rs/rsloglan.doc | Bin 0 -> 146021 bytes loglan96/loglan93/expr.cc | 856 +++ loglan96/loglan93/expr.h | 332 ++ loglan96/loglan93/instr.cc | 454 ++ loglan96/loglan93/instr.h | 248 + loglan96/loglan93/lex.l | 926 +++ loglan96/loglan93/loglan.tar | Bin 0 -> 163840 bytes loglan96/loglan93/makefile | 75 + loglan96/loglan93/objects.cc | 220 + loglan96/loglan93/objects.h | 152 + loglan96/loglan93/symtable.cc | 340 ++ loglan96/loglan93/symtable.h | 202 + loglan96/loglan93/syntax.y | 1406 +++++ loglan96/loglan93/test.log | 44 + loglan96/loglan93/test1.log | 7 + loglan96/loglan93/test2.log | 7 + loglan96/loglan93/test3.log | 4 + loglan96/loglan93/test4.log | 5 + loglan96/loglan93/tstexpr.cc | 25 + loglan96/loglan93/tstobj.cc | 27 + loglan96/loglan93/tstsymbt.cc | 76 + loglan96/loglan94/neweditr.log | Bin 0 -> 4318 bytes loglan96/loglan94/newgramr.doc | Bin 0 -> 39647 bytes loglan96/loglan95/examples.doc | Bin 0 -> 16386 bytes loglan96/loglan95/filesys.doc | Bin 0 -> 2428 bytes loglan96/loglan95/grammar0.doc | Bin 0 -> 32166 bytes loglan96/loglan95/libmangr.doc | Bin 0 -> 4083 bytes loglan96/loglan95/library.doc | Bin 0 -> 4027 bytes loglan96/loglan95/liste.doc | Bin 0 -> 1848 bytes loglan96/loglan95/newgram2.doc | Bin 0 -> 44002 bytes loglan96/loglan95/newgram3.doc | Bin 0 -> 47488 bytes loglan96/loglan95/planwork.doc | Bin 0 -> 28417 bytes loglan96/loglan95/propo1.doc | Bin 0 -> 4419 bytes loglan96/loglan95/pv1.doc | Bin 0 -> 3372 bytes loglan96/loglan95/pv2.doc | Bin 0 -> 10011 bytes loglan96/loglan95/pv3.doc | Bin 0 -> 2349 bytes sources/f2c/cds.c | 180 + sources/f2c/data.c | 401 ++ sources/f2c/defines.h | 288 + sources/f2c/defs.h | 773 +++ sources/f2c/equiv.c | 371 ++ sources/f2c/error.c | 245 + sources/f2c/exec.c | 816 +++ sources/f2c/expr.c | 2822 +++++++++ sources/f2c/f2c.1 | 161 + sources/f2c/f2c.h | 209 + sources/f2c/format.c | 2094 +++++++ sources/f2c/format.h | 10 + sources/f2c/formatd.c | 1015 ++++ sources/f2c/ftypes.h | 39 + sources/f2c/gram.c | 2486 ++++++++ sources/f2c/gram.dcl | 395 ++ sources/f2c/gram.exe | 148 + sources/f2c/gram.exp | 140 + sources/f2c/gram.hd | 298 + sources/f2c/gram.io | 173 + sources/f2c/init.c | 434 ++ sources/f2c/intr.c | 846 +++ sources/f2c/io.c | 1357 +++++ sources/f2c/iob.h | 24 + sources/f2c/lex.c | 1456 +++++ sources/f2c/link.lnk | 2 + sources/f2c/machdefs.h | 31 + sources/f2c/main.c | 561 ++ sources/f2c/makefile | 71 + sources/f2c/makefile.bak | 71 + sources/f2c/makefile.txt | 71 + sources/f2c/malloc.c | 142 + sources/f2c/mem.c | 222 + sources/f2c/memset.c | 66 + sources/f2c/misc.c | 1050 ++++ sources/f2c/names.c | 688 +++ sources/f2c/names.h | 23 + sources/f2c/nicepr.c | 324 ++ sources/f2c/nicepr.h | 16 + sources/f2c/notice | 23 + sources/f2c/output.c | 1443 +++++ sources/f2c/output.h | 65 + sources/f2c/p1defs.h | 158 + sources/f2c/p1output.c | 564 ++ sources/f2c/parse.h | 39 + sources/f2c/parsearg.c | 508 ++ sources/f2c/pccdefs.h | 64 + sources/f2c/pread.c | 882 +++ sources/f2c/proc.c | 1518 +++++ sources/f2c/put.c | 378 ++ sources/f2c/putpcc.c | 1713 ++++++ sources/f2c/readme | 38 + sources/f2c/rm.bat | 9 + sources/f2c/safstrcp.c | 86 + sources/f2c/sysdep.c | 314 + sources/f2c/tokdefs.h | 99 + sources/f2c/tokens | 99 + sources/f2c/usignal.h | 7 + sources/f2c/vax.c | 325 ++ sources/f2c/version.c | 2 + sources/gen/back.c | 168 + sources/gen/back.o | Bin 0 -> 1816 bytes sources/gen/deb.c | 205 + sources/gen/deb.o | Bin 0 -> 4912 bytes sources/gen/gen | Bin 0 -> 36864 bytes sources/gen/gen.c | 680 +++ sources/gen/gen.o | Bin 0 -> 10437 bytes sources/gen/genint.h | 169 + sources/gen/genio.c | 304 + sources/gen/genio.o | Bin 0 -> 3869 bytes sources/gen/genprot.c | 521 ++ sources/gen/genprot.o | Bin 0 -> 6274 bytes sources/gen/glodefs.h | 360 ++ sources/gen/lcode.c | 295 + sources/gen/lcode.o | Bin 0 -> 93 bytes sources/gen/lists.c | 629 ++ sources/gen/lists.o | Bin 0 -> 8342 bytes sources/gen/logen.c | 368 ++ sources/gen/logen.o | Bin 0 -> 5457 bytes sources/gen/mainvar.c | 188 + sources/gen/mainvar.h | 109 + sources/gen/mainvar.o | Bin 0 -> 1888 bytes sources/gen/makefile | 73 + sources/gen/oxen.c | 732 +++ sources/gen/oxen.h | 110 + sources/gen/oxen.o | Bin 0 -> 8747 bytes sources/gen/rm.bat | 9 + sources/int/cint.c | 283 + sources/int/compact.c | 763 +++ sources/int/control.c | 421 ++ sources/int/depend.h | 173 + sources/int/dlink.asm | 327 ++ sources/int/dlink.h | 54 + sources/int/dosgraf1.c | 79 + sources/int/dosgraf2.c | 263 + sources/int/eventque.h | 145 + sources/int/execute.c | 618 ++ sources/int/fileio.c | 337 ++ sources/int/genint.h | 50 + sources/int/graf/cirb.c | 396 ++ sources/int/graf/doc/distrib.txt | 83 + sources/int/graf/doc/fedit.doc | 116 + sources/int/graf/doc/gmouse.doc | 1321 +++++ sources/int/graf/doc/graph.h | 62 + sources/int/graf/doc/graphsal.h | 63 + sources/int/graf/doc/iiuwgraf.ang | 804 +++ sources/int/graf/doc/iiuwgraf.pol | 1546 +++++ sources/int/graf/doc/nullgraf.asm | 32 + sources/int/graf/draw.c | 108 + sources/int/graf/gpmap.c | 128 + sources/int/graf/graf.h | 59 + sources/int/graf/hercules.c | 315 + sources/int/graf/hlineio.c | 41 + sources/int/graf/hvfill.c | 40 + sources/int/graf/lib/egamsf4.lib | Bin 0 -> 26889 bytes sources/int/graf/lib/hgcmsf4.lib | Bin 0 -> 25355 bytes sources/int/graf/lib/mgc64mf4.lib | Bin 0 -> 25353 bytes sources/int/graf/lib/mgcmsf4.lib | Bin 0 -> 26377 bytes sources/int/graf/makefile | 32 + sources/int/handler.c | 243 + sources/int/herc.c | 636 ++ sources/int/inkeydos.c | 25 + sources/int/inkeyos2.c | 28 + sources/int/inkeyux.c | 744 +++ sources/int/int.h | 165 + sources/int/intdt.c | 96 + sources/int/intproto.h | 196 + sources/int/link.lnk | 1 + sources/int/makefile | 101 + sources/int/memory.c | 225 + sources/int/net/ip/cli.c | 202 + sources/int/net/ip/graph.c | 81 + sources/int/net/ip/graph.h | 20 + sources/int/net/ip/graphsrv.c | 265 + sources/int/net/ip/makefile | 40 + sources/int/net/ip/sock.c | 197 + sources/int/net/ip/sock.h | 57 + sources/int/net/ip/sockcrc.c | 79 + sources/int/net/ip/srv.c | 105 + sources/int/net/ip/srv.h | 14 + sources/int/net/ip/t.c | 51 + sources/int/net/ip/time.c | 68 + sources/int/net/ip/timediff.c | 144 + sources/int/net/ip/udpmsg.c | 92 + sources/int/net/rpc/clnt.c | 77 + sources/int/net/rpc/makefile | 18 + sources/int/net/rpc/srvr.c | 127 + sources/int/net/rpc/srvr.h | 4 + sources/int/net/rpc/stop.c | 62 + sources/int/nettest/m | 3 + sources/int/nettest/m2 | 3 + sources/int/nettest/p.log | 89 + sources/int/nettest/s1 | 3 + sources/int/nettest/s2 | 3 + sources/int/nonstand.c | 63 + sources/int/nonstand.h | 105 + sources/int/object.c | 195 + sources/int/os2graf2.c | 3 + sources/int/procaddr.c | 216 + sources/int/process.c | 676 +++ sources/int/process.h | 137 + sources/int/queue.c | 112 + sources/int/queue.h | 40 + sources/int/rm.bat | 9 + sources/int/rpcall.c | 266 + sources/int/runsys.c | 281 + sources/int/sock.c | 216 + sources/int/sock.h | 81 + sources/int/standard.c | 456 ++ sources/int/svga1.c | 293 + sources/int/svga2.c | 321 + sources/int/tcpip.c | 289 + sources/int/tcpip.h | 52 + sources/int/typchk.c | 383 ++ sources/int/util.c | 194 + sources/int/x11graf1.c | 51 + sources/int/x11graf2.c | 414 ++ sources/lotek.src/lha.exe | Bin 0 -> 33951 bytes sources/lotek.src/lotek/englotek.txt | 121 + sources/lotek.src/lotek/exe.lzh | Bin 0 -> 113754 bytes sources/lotek.src/lotek/logdoc.zip | Bin 0 -> 142259 bytes sources/lotek.src/lotek/loghelp.hlp | Bin 0 -> 1791 bytes sources/lotek.src/lotek/loghelp.mph | Bin 0 -> 1819 bytes sources/lotek.src/lotek/loghelp.spt | Bin 0 -> 24240 bytes sources/lotek.src/lotek/loghelp.str | 517 ++ sources/lotek.src/lotek/lotek.hlp | 737 +++ sources/lotek.src/lotek/lotek.txt | 118 + sources/lotek.src/lotek/ne2lotek.doc | 22 + sources/lotek.src/lotek/pomoc.txt | 56 + sources/lotek.src/lotek/readme | 15 + sources/lotek.src/mph/comp/helpcomp.lzh | Bin 0 -> 16536 bytes sources/lotek.src/mph/doc/mph.hlp | 195 + sources/lotek.src/mph/exe/mph.exe | Bin 0 -> 52320 bytes sources/lotek.src/mph/mph/mph.lzh | Bin 0 -> 34371 bytes sources/lotek.src/pkunzip.exe | Bin 0 -> 22540 bytes sources/lotek.src/source/doc.zip | Bin 0 -> 44661 bytes sources/lotek.src/source/lotek.lzh | Bin 0 -> 89322 bytes sources/lotek.src/source/lotekins.lzh | Bin 0 -> 26280 bytes sources/lotek.src/source/lsttest.lzh | Bin 0 -> 1796 bytes sources/lotek.src/source/mplgd112.lzh | Bin 0 -> 87526 bytes sources/lotek.src/source/ne2lotek.lzh | Bin 0 -> 3672 bytes sources/new-s5r4/changes.doc | 3 + sources/new-s5r4/cint.c | 283 + sources/new-s5r4/cint.o | Bin 0 -> 6770 bytes sources/new-s5r4/compact.c | 763 +++ sources/new-s5r4/compact.o | Bin 0 -> 8390 bytes sources/new-s5r4/control.c | 421 ++ sources/new-s5r4/control.o | Bin 0 -> 8097 bytes sources/new-s5r4/depend.h | 173 + sources/new-s5r4/dlink.asm | 327 ++ sources/new-s5r4/dlink.h | 54 + sources/new-s5r4/dosgraf1.c | 79 + sources/new-s5r4/dosgraf2.c | 263 + sources/new-s5r4/eventque.h | 144 + sources/new-s5r4/execute.c | 618 ++ sources/new-s5r4/execute.o | Bin 0 -> 25873 bytes sources/new-s5r4/fileio.c | 337 ++ sources/new-s5r4/fileio.o | Bin 0 -> 5244 bytes sources/new-s5r4/genint.h | 50 + sources/new-s5r4/graf/cirb.c | 396 ++ sources/new-s5r4/graf/doc/distrib.txt | 83 + sources/new-s5r4/graf/doc/fedit.doc | 116 + sources/new-s5r4/graf/doc/gmouse.doc | 1321 +++++ sources/new-s5r4/graf/doc/graph.h | 62 + sources/new-s5r4/graf/doc/graphsal.h | 63 + sources/new-s5r4/graf/doc/iiuwgraf.ang | 804 +++ sources/new-s5r4/graf/doc/iiuwgraf.pol | 1546 +++++ sources/new-s5r4/graf/doc/nullgraf.asm | 32 + sources/new-s5r4/graf/draw.c | 108 + sources/new-s5r4/graf/gpmap.c | 128 + sources/new-s5r4/graf/graf.h | 59 + sources/new-s5r4/graf/hercules.c | 315 + sources/new-s5r4/graf/hlineio.c | 41 + sources/new-s5r4/graf/hvfill.c | 40 + sources/new-s5r4/graf/lib/egamsf4.lib | Bin 0 -> 26889 bytes sources/new-s5r4/graf/lib/hgcmsf4.lib | Bin 0 -> 25355 bytes sources/new-s5r4/graf/lib/mgc64mf4.lib | Bin 0 -> 25353 bytes sources/new-s5r4/graf/lib/mgcmsf4.lib | Bin 0 -> 26377 bytes sources/new-s5r4/graf/makefile | 32 + sources/new-s5r4/handler.c | 243 + sources/new-s5r4/handler.o | Bin 0 -> 6413 bytes sources/new-s5r4/herc.c | 636 ++ sources/new-s5r4/info | 11 + sources/new-s5r4/inkeydos.c | 25 + sources/new-s5r4/inkeyos2.c | 28 + sources/new-s5r4/inkeyux.c | 744 +++ sources/new-s5r4/inkeyux.o | Bin 0 -> 12433 bytes sources/new-s5r4/int | Bin 0 -> 90112 bytes sources/new-s5r4/int.h | 165 + sources/new-s5r4/intdt.c | 96 + sources/new-s5r4/intdt.o | Bin 0 -> 896 bytes sources/new-s5r4/intproto.h | 196 + sources/new-s5r4/link.lnk | 1 + sources/new-s5r4/makefile | 102 + sources/new-s5r4/memory.c | 225 + sources/new-s5r4/memory.o | Bin 0 -> 3536 bytes sources/new-s5r4/nonstand.c | 63 + sources/new-s5r4/nonstand.h | 105 + sources/new-s5r4/nonstand.o | Bin 0 -> 208 bytes sources/new-s5r4/object.c | 195 + sources/new-s5r4/object.o | Bin 0 -> 3978 bytes sources/new-s5r4/os2graf2.c | 3 + sources/new-s5r4/procaddr.c | 212 + sources/new-s5r4/procaddr.o | Bin 0 -> 3594 bytes sources/new-s5r4/process.c | 679 +++ sources/new-s5r4/process.h | 137 + sources/new-s5r4/process.o | Bin 0 -> 9339 bytes sources/new-s5r4/queue.c | 112 + sources/new-s5r4/queue.h | 40 + sources/new-s5r4/queue.o | Bin 0 -> 1345 bytes sources/new-s5r4/rm.bat | 9 + sources/new-s5r4/rpcall.c | 266 + sources/new-s5r4/rpcall.o | Bin 0 -> 4496 bytes sources/new-s5r4/runsys.c | 281 + sources/new-s5r4/runsys.o | Bin 0 -> 5214 bytes sources/new-s5r4/sock.c | 219 + sources/new-s5r4/sock.h | 81 + sources/new-s5r4/soct.h | 6 + sources/new-s5r4/standard.c | 456 ++ sources/new-s5r4/standard.o | Bin 0 -> 10908 bytes sources/new-s5r4/svga1.c | 293 + sources/new-s5r4/svga2.c | 321 + sources/new-s5r4/sys5r4.arj | Bin 0 -> 155740 bytes sources/new-s5r4/tcpip.c | 290 + sources/new-s5r4/tcpip.h | 52 + sources/new-s5r4/typchk.c | 383 ++ sources/new-s5r4/typchk.o | Bin 0 -> 5196 bytes sources/new-s5r4/util.c | 194 + sources/new-s5r4/util.o | Bin 0 -> 2887 bytes sources/new-s5r4/x11graf1.c | 51 + sources/new-s5r4/x11graf2.c | 414 ++ sources/pass1/al11.ff | 4208 +++++++++++++ sources/pass1/al12.ff | 2448 ++++++++ sources/pass1/al13.ff | 3175 ++++++++++ sources/pass1/blank.doc | 60 + sources/pass1/blank.h | 35 + sources/pass1/blank2.h | 23 + sources/pass1/blank3.h | 20 + sources/pass1/debug.f | 494 ++ sources/pass1/dsw.f | 4305 ++++++++++++++ sources/pass1/f2c.h | 209 + sources/pass1/hash.f | 1663 ++++++ sources/pass1/ifun.f | 72 + sources/pass1/it0.ff | 1025 ++++ sources/pass1/it1.ff | 1892 ++++++ sources/pass1/logdeb.log | 1952 +++++++ sources/pass1/loglan | Bin 0 -> 200098 bytes sources/pass1/main.c | 94 + sources/pass1/makefil | 97 + sources/pass1/makefile | 99 + sources/pass1/memfil.c | 215 + sources/pass1/ml2.f | 901 +++ sources/pass1/ml3.c | 294 + sources/pass1/msdos.lnk | 13 + sources/pass1/names/doctext.pas | 24 + sources/pass1/names/exec.pas | 222 + sources/pass1/names/names | 12 + sources/pass1/names/nazwy.pas | 72 + sources/pass1/names/printmem.pas | 126 + sources/pass1/names/search.for | 1169 ++++ sources/pass1/option.h | 3 + sources/pass1/resume.f | 131 + sources/pass1/rm.bat | 9 + sources/pass1/scan.ff | 915 +++ sources/pass1/spgrec.f | 106 + sources/pass1/statist.f | 117 + sources/pass1/stdio.c | 66 + sources/pass1/stos.h | 24 + sources/pass1/unix.lnk | 2 + sources/pass1/wan1.ff | 937 +++ sources/pass1/wan2.f | 1767 ++++++ sources/pass1/wan3.f | 1573 +++++ sources/readme | 34 + utils/editor.dos/edibase0.dba | 105 + utils/editor.dos/edihelp0.def | 3 + utils/editor.dos/edihelp0.hlp | 3 + utils/editor.dos/editor0.exe | Bin 0 -> 235206 bytes utils/editor.dos/edytrap2.chi | 967 +++ utils/editor.dos/grammar0 | 144 + utils/editor.dos/prolog.err | 157 + utils/editor.dos/readme | 27 + utils/lotek/aide_lot.ek | 121 + utils/lotek/anglotek.hlp | 561 ++ utils/lotek/englotek.txt | 121 + utils/lotek/iiuwgraf.pl | 1546 +++++ utils/lotek/logdeb.exe | Bin 0 -> 26192 bytes utils/lotek/loghelp.hlp | Bin 0 -> 1791 bytes utils/lotek/loghelp.mph | Bin 0 -> 1819 bytes utils/lotek/loghelp.spt | Bin 0 -> 24240 bytes utils/lotek/loghelp.str | 517 ++ utils/lotek/loglan.txt | 2010 +++++++ utils/lotek/lotek.exe | Bin 0 -> 4048 bytes utils/lotek/lotek.hlp | 561 ++ utils/lotek/lotek.pth | 26 + utils/lotek/lotek.txt | 118 + utils/lotek/lotekins.exe | Bin 0 -> 47664 bytes utils/lotek/lsttest.exe | Bin 0 -> 7536 bytes utils/lotek/mpled.dat | Bin 0 -> 2703 bytes utils/lotek/mpled.old | Bin 0 -> 2943 bytes utils/lotek/mploged.exe | Bin 0 -> 98944 bytes utils/lotek/ne2lotek.doc | 22 + utils/lotek/ne2lotek.exe | Bin 0 -> 10160 bytes utils/lotek/noname.ltk | Bin 0 -> 13 bytes utils/lotek/pllotek.hlp | 566 ++ utils/lotek/pllotek.pth | 26 + utils/lotek/pomoc.txt | 56 + utils/lotek/praca.bak | 15 + utils/lotek/praca.bat | 2 + utils/lotek/prep.exe | Bin 0 -> 18420 bytes utils/lotek/report.hlp | 7110 ++++++++++++++++++++++ utils/lotek/spis_tre.sci | 21 + utils/lotek/structr.doc | Bin 0 -> 11692 bytes utils/lotek/to_do.txt | 17 + utils/lotek/userman.txt | 1925 ++++++ 1075 files changed, 303790 insertions(+) create mode 100644 .mirror create mode 100644 HTML/HomePage.gif create mode 100644 HTML/MicroMan/Classes.htm create mode 100644 HTML/MicroMan/Concurre.htm create mode 100644 HTML/MicroMan/Exceptio.htm create mode 100644 HTML/MicroMan/FormalTy.htm create mode 100644 HTML/MicroMan/HomePage.htm create mode 100644 HTML/MicroMan/Introduc.htm create mode 100644 HTML/MicroMan/Prefixin.htm create mode 100644 HTML/MicroMan/Procedur.htm create mode 100644 HTML/MicroMan/Programm.htm create mode 100644 HTML/MicroMan/Protecti.htm create mode 100644 HTML/MicroMan/Referenc.htm create mode 100644 HTML/MicroMan/TableOfC.htm create mode 100644 HTML/MicroMan/adjustab.htm create mode 100644 HTML/MicroMan/compound.htm create mode 100644 HTML/MicroMan/coroutin.htm create mode 100644 HTML/MicroMan/gifs/HomePage.gif create mode 100644 HTML/MicroMan/gifs/NextPage.gif create mode 100644 HTML/MicroMan/gifs/PrevPage.gif create mode 100644 HTML/MicroMan/gifs/aa01.gif create mode 100644 HTML/MicroMan/gifs/aa02.gif create mode 100644 HTML/MicroMan/gifs/aa03.gif create mode 100644 HTML/MicroMan/gifs/aa04.gif create mode 100644 HTML/MicroMan/gifs/aa05.gif create mode 100644 HTML/MicroMan/gifs/aa06.gif create mode 100644 HTML/MicroMan/gifs/aa07.gif create mode 100644 HTML/MicroMan/gifs/cl01.gif create mode 100644 HTML/MicroMan/gifs/cl02.gif create mode 100644 HTML/MicroMan/gifs/cl03.gif create mode 100644 HTML/MicroMan/gifs/cl04.gif create mode 100644 HTML/MicroMan/gifs/cl05.gif create mode 100644 HTML/MicroMan/gifs/cl06.gif create mode 100644 HTML/MicroMan/gifs/cl07.gif create mode 100644 HTML/MicroMan/gifs/cl08.gif create mode 100644 HTML/MicroMan/gifs/cl09.gif create mode 100644 HTML/MicroMan/gifs/cl10.gif create mode 100644 HTML/MicroMan/gifs/cl11.gif create mode 100644 HTML/MicroMan/gifs/co01.gif create mode 100644 HTML/MicroMan/gifs/co02.gif create mode 100644 HTML/MicroMan/gifs/co03.gif create mode 100644 HTML/MicroMan/gifs/co04.gif create mode 100644 HTML/MicroMan/gifs/cp01.gif create mode 100644 HTML/MicroMan/gifs/cp02.gif create mode 100644 HTML/MicroMan/gifs/cp03.gif create mode 100644 HTML/MicroMan/gifs/cp04.gif create mode 100644 HTML/MicroMan/gifs/cp05.gif create mode 100644 HTML/MicroMan/gifs/cp06.gif create mode 100644 HTML/MicroMan/gifs/cs01.gif create mode 100644 HTML/MicroMan/gifs/cs02.gif create mode 100644 HTML/MicroMan/gifs/cs03.gif create mode 100644 HTML/MicroMan/gifs/cs04.gif create mode 100644 HTML/MicroMan/gifs/cs05.gif create mode 100644 HTML/MicroMan/gifs/cs06.gif create mode 100644 HTML/MicroMan/gifs/cs07.gif create mode 100644 HTML/MicroMan/gifs/cs08.gif create mode 100644 HTML/MicroMan/gifs/cs09.gif create mode 100644 HTML/MicroMan/gifs/cs10.gif create mode 100644 HTML/MicroMan/gifs/cs11.gif create mode 100644 HTML/MicroMan/gifs/cs12.gif create mode 100644 HTML/MicroMan/gifs/cs13.gif create mode 100644 HTML/MicroMan/gifs/cs14.gif create mode 100644 HTML/MicroMan/gifs/cs15.gif create mode 100644 HTML/MicroMan/gifs/cs16.gif create mode 100644 HTML/MicroMan/gifs/cs17.gif create mode 100644 HTML/MicroMan/gifs/cs18.gif create mode 100644 HTML/MicroMan/gifs/cs19.gif create mode 100644 HTML/MicroMan/gifs/eh01.gif create mode 100644 HTML/MicroMan/gifs/eh02.gif create mode 100644 HTML/MicroMan/gifs/eh03.gif create mode 100644 HTML/MicroMan/gifs/fig0401.gif create mode 100644 HTML/MicroMan/gifs/fig0402.gif create mode 100644 HTML/MicroMan/gifs/fig0403.gif create mode 100644 HTML/MicroMan/gifs/fig0501.gif create mode 100644 HTML/MicroMan/gifs/fig0502.gif create mode 100644 HTML/MicroMan/gifs/fig0701.gif create mode 100644 HTML/MicroMan/gifs/fig0702.gif create mode 100644 HTML/MicroMan/gifs/fig0703.gif create mode 100644 HTML/MicroMan/gifs/ft01.gif create mode 100644 HTML/MicroMan/gifs/ft02.gif create mode 100644 HTML/MicroMan/gifs/ft03.gif create mode 100644 HTML/MicroMan/gifs/ft04.gif create mode 100644 HTML/MicroMan/gifs/logo.gif create mode 100644 HTML/MicroMan/gifs/logo2.gif create mode 100644 HTML/MicroMan/gifs/mo01.gif create mode 100644 HTML/MicroMan/gifs/mo02.gif create mode 100644 HTML/MicroMan/gifs/mo03.gif create mode 100644 HTML/MicroMan/gifs/mo04.gif create mode 100644 HTML/MicroMan/gifs/pd01.gif create mode 100644 HTML/MicroMan/gifs/pd02.gif create mode 100644 HTML/MicroMan/gifs/pd03.gif create mode 100644 HTML/MicroMan/gifs/pd04.gif create mode 100644 HTML/MicroMan/gifs/pd05.gif create mode 100644 HTML/MicroMan/gifs/pd06.gif create mode 100644 HTML/MicroMan/gifs/pf01.gif create mode 100644 HTML/MicroMan/gifs/pf02.gif create mode 100644 HTML/MicroMan/gifs/pf03.gif create mode 100644 HTML/MicroMan/gifs/pf04.gif create mode 100644 HTML/MicroMan/gifs/pf05.gif create mode 100644 HTML/MicroMan/gifs/pf06.gif create mode 100644 HTML/MicroMan/gifs/pf07.gif create mode 100644 HTML/MicroMan/gifs/pf08.gif create mode 100644 HTML/MicroMan/gifs/pf09.gif create mode 100644 HTML/MicroMan/gifs/pf10.gif create mode 100644 HTML/MicroMan/gifs/pr01.gif create mode 100644 HTML/MicroMan/gifs/pr02.gif create mode 100644 HTML/MicroMan/gifs/pr03.gif create mode 100644 HTML/MicroMan/gifs/pr04.gif create mode 100644 HTML/MicroMan/gifs/pr05.gif create mode 100644 HTML/MicroMan/gifs/pr06.gif create mode 100644 HTML/MicroMan/gifs/pr07.gif create mode 100644 HTML/MicroMan/gifs/pr08.gif create mode 100644 HTML/MicroMan/gifs/pr09.gif create mode 100644 HTML/MicroMan/gifs/pr10.gif create mode 100644 HTML/MicroMan/gifs/pr11.gif create mode 100644 HTML/MicroMan/gifs/pr12.gif create mode 100644 HTML/MicroMan/gifs/pr13.gif create mode 100644 HTML/MicroMan/gifs/pr14.gif create mode 100644 HTML/MicroMan/gifs/pr15.gif create mode 100644 HTML/MicroMan/gifs/pr16.gif create mode 100644 HTML/MicroMan/gifs/pr17.gif create mode 100644 HTML/MicroMan/gifs/pr18.gif create mode 100644 HTML/MicroMan/gifs/pr19.gif create mode 100644 HTML/MicroMan/gifs/pr20.gif create mode 100644 HTML/MicroMan/gifs/pt01.gif create mode 100644 HTML/MicroMan/modulari.htm create mode 100644 HTML/MicroMan/monitors.htm create mode 100644 HTML/NextPage.gif create mode 100644 HTML/PrevPage.gif create mode 100644 HTML/alglogc2.htm create mode 100644 HTML/availlty.htm create mode 100644 HTML/availlty.htm~ create mode 100644 HTML/biblio.htm create mode 100644 HTML/biul2.html create mode 100644 HTML/biul2.html.bak create mode 100644 HTML/biul2.html~ create mode 100644 HTML/biul2.txt create mode 100644 HTML/biul2.txt~ create mode 100644 HTML/comptble.ps.Z create mode 100644 HTML/credits.htm create mode 100644 HTML/credits.htm~ create mode 100644 HTML/crowd2.jpg create mode 100644 HTML/default1.hot create mode 100644 HTML/doc3.htm create mode 100644 HTML/errorcd.htm create mode 100644 HTML/homepage.gif create mode 100644 HTML/icons/HomePage.gif create mode 100644 HTML/icons/NextPage.gif create mode 100644 HTML/icons/PrevPage.gif create mode 100644 HTML/icons/loglanmm.gif create mode 100644 HTML/icons/logo.gif create mode 100644 HTML/index.html create mode 100644 HTML/index.html.bak create mode 100644 HTML/index.html~ create mode 100644 HTML/iuwgraf3.htm create mode 100644 HTML/iuwgraf4.htm create mode 100644 HTML/iuwgraf5.htm create mode 100644 HTML/klasyiob.htm create mode 100644 HTML/loghome.htm create mode 100644 HTML/loghome.htm~ create mode 100644 HTML/loglan82.htm create mode 100644 HTML/loglanmm.gif create mode 100644 HTML/logo.gif create mode 100644 HTML/mosaic.ghi create mode 100644 HTML/nextpage.gif create mode 100644 HTML/openpbms.htm create mode 100644 HTML/openpbms.htm~ create mode 100644 HTML/platform.htm create mode 100644 HTML/prevpage.gif create mode 100644 HTML/procesy.htm create mode 100644 HTML/progobi.htm create mode 100644 HTML/quick.htm create mode 100644 HTML/quick.htm~ create mode 100644 HTML/quickref.ps.Z create mode 100644 HTML/quickref.txt create mode 100644 HTML/read_it.htm create mode 100644 HTML/signals.htm create mode 100644 HTML/solate.htm create mode 100644 HTML/tablica3.htm create mode 100644 HTML/tablica3.htm~ create mode 100644 HTML/tablica3.txt create mode 100644 HTML/tarski/default1.hot create mode 100644 HTML/tarski/ghostscr.htm create mode 100644 HTML/tarski/tarski1.htm create mode 100644 HTML/tarski/tarski10.gif create mode 100644 HTML/tarski/tarski11.gif create mode 100644 HTML/tarski/tarski12.gif create mode 100644 HTML/tarski/tarski14.gif create mode 100644 HTML/tarski/tarski3d.htm create mode 100644 HTML/tarski/tarski3e.htm create mode 100644 HTML/tarski/tarski3e.url create mode 100644 HTML/tarski/tarski5.gif create mode 100644 HTML/tarski/tarski6.gif create mode 100644 HTML/tarski/tarski7.gif create mode 100644 HTML/tarski/tarski8.gif create mode 100644 HTML/tarski/tarski9.gif create mode 100644 HTML/tarski/~wrd2230.tmp create mode 100644 HTML/userman.htm create mode 100644 HTML/whylog.htm create mode 100644 HTML/whylog.htm~ create mode 100644 HTML/xiiuwgr.htm create mode 100644 HTML/zaproszenie.html create mode 100644 at_work/case_al/index.html create mode 100644 at_work/case_al/index.html~ create mode 100644 at_work/exe_old/486.inc/bank2.log create mode 100644 at_work/exe_old/486.inc/cc.bat create mode 100644 at_work/exe_old/486.inc/essai.log create mode 100644 at_work/exe_old/486.inc/exec.bat create mode 100644 at_work/exe_old/486.inc/gen.exe create mode 100644 at_work/exe_old/486.inc/int.exe create mode 100644 at_work/exe_old/486.inc/loglan.exe create mode 100644 at_work/exe_old/486.inc/logpp.exe create mode 100644 at_work/exe_old/486.inc/old1.ccd create mode 100644 at_work/exe_old/486.inc/old1.log create mode 100644 at_work/exe_old/486.inc/old1.pcd create mode 100644 at_work/exe_old/486.inc/readme create mode 100644 at_work/exe_old/486.inc/simula.inc create mode 100644 at_work/exe_old/486.inc/var.inc create mode 100644 at_work/exe_old/bank2.log create mode 100644 at_work/exe_old/cc.bat create mode 100644 at_work/exe_old/essai.ccd create mode 100644 at_work/exe_old/essai.lcd create mode 100644 at_work/exe_old/essai.log create mode 100644 at_work/exe_old/essai.pcd create mode 100644 at_work/exe_old/exec.bat create mode 100644 at_work/exe_old/gen.exe create mode 100644 at_work/exe_old/go32.exe create mode 100644 at_work/exe_old/info.log create mode 100644 at_work/exe_old/int.exe create mode 100644 at_work/exe_old/logcomp.bat create mode 100644 at_work/exe_old/loglan.exe create mode 100644 at_work/exe_old/logpp.exe create mode 100644 at_work/exe_old/logsesja.bat create mode 100644 at_work/exe_old/old1.log create mode 100644 at_work/exe_old/readme create mode 100644 at_work/exe_old/simula.inc create mode 100644 at_work/exe_old/var.inc create mode 100644 at_work/loglan96/index.html create mode 100644 at_work/loglan96/index.html.bak create mode 100644 at_work/loglan96/index.html~ create mode 100644 at_work/loglan96/index.map create mode 100644 at_work/loglan96/intro.gif create mode 100644 at_work/loglan96/intro.jpg create mode 100644 at_work/logpp/logpp/logpp.arj create mode 100644 at_work/logpp/pass1/pass1.arj create mode 100644 at_work/random_alg/index.html create mode 100644 at_work/random_alg/index.html~ create mode 100644 bin/atari/atari.doc create mode 100644 bin/atari/atari.ps create mode 100644 bin/atari/atari.use create mode 100644 bin/atari/atari.usr create mode 100644 bin/atari/atariusr.txt create mode 100644 bin/atari/desktop.inf create mode 100644 bin/atari/emacs.rc create mode 100644 bin/atari/gen.ttp create mode 100644 bin/atari/intgem.prg create mode 100644 bin/atari/loglan.ttp create mode 100644 bin/atari/me.ttp create mode 100644 bin/atari/ms.tos create mode 100644 bin/dos/286/cga/cg32int.exe create mode 100644 bin/dos/286/cga/cg64hint.exe create mode 100644 bin/dos/286/cga/cg64int.exe create mode 100644 bin/dos/286/cga/cgaint1.exe create mode 100644 bin/dos/286/dirinfo create mode 100644 bin/dos/286/egahint.exe create mode 100644 bin/dos/286/egahint.old create mode 100644 bin/dos/286/egaint.exe create mode 100644 bin/dos/286/egaint.old create mode 100644 bin/dos/286/gen.exe create mode 100644 bin/dos/286/hgchint.exe create mode 100644 bin/dos/286/hgcint.exe create mode 100644 bin/dos/286/hgen.exe create mode 100644 bin/dos/286/loglan.exe create mode 100644 bin/dos/286/old/gen.exe create mode 100644 bin/dos/286/old/hgen.exe create mode 100644 bin/dos/286/old/hint.exe create mode 100644 bin/dos/286/old/int.exe create mode 100644 bin/dos/286/old/l2c1.exe create mode 100644 bin/dos/286/old/l2c2.exe create mode 100644 bin/dos/286/old/loglan.exe create mode 100644 bin/dos/286/old/ne2lotek.exe create mode 100644 bin/dos/286/old/pkzip.exe create mode 100644 bin/dos/286/old/prep.exe create mode 100644 bin/dos/286/readme create mode 100644 bin/dos/386/cc.bat create mode 100644 bin/dos/386/dirinfo create mode 100644 bin/dos/386/gen.exe create mode 100644 bin/dos/386/int.exe create mode 100644 bin/dos/386/loglan.exe create mode 100644 bin/dos/386/old1.log create mode 100644 bin/dos/386/readme create mode 100644 bin/dos/486/cc.bat create mode 100644 bin/dos/486/gen.exe create mode 100644 bin/dos/486/go32.exe create mode 100644 bin/dos/486/int.exe create mode 100644 bin/dos/486/logcomp.bat create mode 100644 bin/dos/486/loglan.exe create mode 100644 bin/dos/486/logpp.exe create mode 100644 bin/dos/486/logsesja.bat create mode 100644 bin/dos/486/readme create mode 100644 bin/dos/drivers.grp/acumos.grn create mode 100644 bin/dos/drivers.grp/aheada.grd create mode 100644 bin/dos/drivers.grp/aheadb.grd create mode 100644 bin/dos/drivers.grp/ati.grd create mode 100644 bin/dos/drivers.grp/ati_16md.grn create mode 100644 bin/dos/drivers.grp/atigupro.grn create mode 100644 bin/dos/drivers.grp/atiultra.grn create mode 100644 bin/dos/drivers.grp/ativga.grn create mode 100644 bin/dos/drivers.grp/chips.grd create mode 100644 bin/dos/drivers.grp/cirrus54.grn create mode 100644 bin/dos/drivers.grp/cl5426.grn create mode 100644 bin/dos/drivers.grp/et3000.grn create mode 100644 bin/dos/drivers.grp/et4000.grn create mode 100644 bin/dos/drivers.grp/everex.grd create mode 100644 bin/dos/drivers.grp/genoa.grd create mode 100644 bin/dos/drivers.grp/newss24x.grn create mode 100644 bin/dos/drivers.grp/oak.grn create mode 100644 bin/dos/drivers.grp/paradise.grd create mode 100644 bin/dos/drivers.grp/realtek.grn create mode 100644 bin/dos/drivers.grp/s3805_1m.grn create mode 100644 bin/dos/drivers.grp/s3864_2m.grn create mode 100644 bin/dos/drivers.grp/sparadis.grn create mode 100644 bin/dos/drivers.grp/ss24x.grn create mode 100644 bin/dos/drivers.grp/stdvga.grn create mode 100644 bin/dos/drivers.grp/stealth.grn create mode 100644 bin/dos/drivers.grp/tr8900.grn create mode 100644 bin/dos/drivers.grp/vesa111.vdr create mode 100644 bin/dos/drivers.grp/vesa_s3.grn create mode 100644 bin/dos/drivers.grp/video7.grd create mode 100644 bin/dos/drivers.grp/viper.grn create mode 100644 bin/dos/drivers.grp/wd90c3x.grn create mode 100644 bin/dos/drivers.grp/wdvanila.grn create mode 100644 bin/l2c/l2c1.exe create mode 100644 bin/l2c/l2c2.exe create mode 100644 bin/l2c/readme create mode 100644 bin/readme create mode 100644 bin/unix/linux/loglan create mode 100644 bin/unix/linux/readme create mode 100644 biuletyn/biul1.html create mode 100644 biuletyn/biul2.html create mode 100644 biuletyn/index.html create mode 100644 biuletyn/index.html.bak create mode 100644 biuletyn/index.html~ create mode 100644 biuletyn/marble2.jpg create mode 100644 biuletyn/n1.gif create mode 100644 biuletyn/nieprzeg.gif create mode 100644 biuletyn/nieprzeg.jpg create mode 100644 doc/comptble.doc create mode 100644 doc/comptble.ps create mode 100644 doc/credits.doc create mode 100644 doc/iiuwgraf.pl create mode 100644 doc/iuwgraf.doc create mode 100644 doc/iuwgraf.txt create mode 100644 doc/iuwgraf3.doc create mode 100644 doc/iuwgraf3.ps create mode 100644 doc/iuwgraf3.txt create mode 100644 doc/leaflet.doc create mode 100644 doc/loghelp.hlp create mode 100644 doc/loglan.inf create mode 100644 doc/loglan.txt create mode 100644 doc/loglanmi.doc create mode 100644 doc/loglanmi.rtf create mode 100644 doc/loglanmi.txt create mode 100644 doc/loglgraf.doc create mode 100644 doc/lotek.hlp create mode 100644 doc/nguide/lisez.moi create mode 100644 doc/nguide/loglan.ng create mode 100644 doc/nguide/ng.exe create mode 100644 doc/nguide/ngc.exe create mode 100644 doc/nguide/ngdump/bufio.pas create mode 100644 doc/nguide/ngdump/ngdump.pas create mode 100644 doc/nguide/ngdump/readme create mode 100644 doc/nguide/ngml.exe create mode 100644 doc/nguide/prelog.exe create mode 100644 doc/nguide/readme create mode 100644 doc/prototyp.doc create mode 100644 doc/quickref.doc create mode 100644 doc/quickref.ps create mode 100644 doc/quickref.txt create mode 100644 doc/readme create mode 100644 doc/report.hlp create mode 100644 doc/report82/index82.doc create mode 100644 doc/report82/indexr82.doc create mode 100644 doc/report82/oldgramr.doc create mode 100644 doc/report82/rep82tyt.doc create mode 100644 doc/report82/report82.doc create mode 100644 doc/report82/sepcompi.doc create mode 100644 doc/userman.txt create mode 100644 doc/userman2.doc create mode 100644 doc/xiiuwgra.doc create mode 100644 doc/xiiuwgra.txt create mode 100644 examples.zip create mode 100644 examples/ansi.log create mode 100644 examples/apply/backtrac.log create mode 100644 examples/apply/deriv.ccd create mode 100644 examples/apply/deriv.log create mode 100644 examples/apply/deriv.pcd create mode 100644 examples/apply/kmpalg.ccd create mode 100644 examples/apply/kmpalg.log create mode 100644 examples/apply/kmpalg.pcd create mode 100644 examples/apply/paretn.ccd create mode 100644 examples/apply/paretn.log create mode 100644 examples/apply/paretn.pcd create mode 100644 examples/apply/sacados.ccd create mode 100644 examples/apply/sacados.log create mode 100644 examples/apply/sacados.pcd create mode 100644 examples/apply/total/d create mode 100644 examples/apply/total/m create mode 100644 examples/apply/total/neocogni.log create mode 100644 examples/apply/total/presenta create mode 100644 examples/apply/total/t create mode 100644 examples/apply/windo.log create mode 100644 examples/backtrac/graphcol.log create mode 100644 examples/backtrac/roundcm.log create mode 100644 examples/backtrac/search.log create mode 100644 examples/backtrac/stsearch.his create mode 100644 examples/backtrac/stsearch.log create mode 100644 examples/bank2.log create mode 100644 examples/biela/r.ccd create mode 100644 examples/biela/r.log create mode 100644 examples/biela/r.pcd create mode 100644 examples/biela/retrprov.d10 create mode 100644 examples/biela/retrprov.d11 create mode 100644 examples/biela/retrprov.d15 create mode 100644 examples/biela/retrprov.d16 create mode 100644 examples/biela/retrprov.d17 create mode 100644 examples/biela/retrprov.d19 create mode 100644 examples/biela/retrprov.d20 create mode 100644 examples/biela/retrprov.d21 create mode 100644 examples/biela/retrprov.d22 create mode 100644 examples/biela/retrprov.d23 create mode 100644 examples/biela/retrprov.dat create mode 100644 examples/biela/retrprov.de1 create mode 100644 examples/biela/retrprov.de2 create mode 100644 examples/biela/retrprov.de3 create mode 100644 examples/biela/retrprov.de4 create mode 100644 examples/biela/retrprov.de5 create mode 100644 examples/biela/retrprov.de6 create mode 100644 examples/biela/retrprov.de7 create mode 100644 examples/biela/retrprov.de8 create mode 100644 examples/biela/retrprov.de9 create mode 100644 examples/biela/retrprov.def create mode 100644 examples/chin/alop create mode 100644 examples/chin/c_testy.log create mode 100644 examples/chin/ch.lcd create mode 100644 examples/chin/ch.log create mode 100644 examples/chin/chinczyk.ccd create mode 100644 examples/chin/chinczyk.log create mode 100644 examples/chin/chinczyk.pcd create mode 100644 examples/chin/li1004.ccd create mode 100644 examples/chin/li1004.lcd create mode 100644 examples/chin/li1004.log create mode 100644 examples/chin/li1004.pcd create mode 100644 examples/chin/nalp create mode 100644 examples/chin/plan create mode 100644 examples/chin/pola create mode 100644 examples/chin/projet1.ccd create mode 100644 examples/chin/projet1.log create mode 100644 examples/chin/projet1.pcd create mode 100644 examples/data_str/2_3arb.ccd create mode 100644 examples/data_str/2_3arb.log create mode 100644 examples/data_str/2_3arb.pcd create mode 100644 examples/data_str/2_3kujaw.ccd create mode 100644 examples/data_str/2_3kujaw.log create mode 100644 examples/data_str/2_3kujaw.pcd create mode 100644 examples/data_str/avl.ccd create mode 100644 examples/data_str/avl.log create mode 100644 examples/data_str/avl.pcd create mode 100644 examples/data_str/barbre.ccd create mode 100644 examples/data_str/barbre.log create mode 100644 examples/data_str/barbre.pcd create mode 100644 examples/data_str/bicol2.ccd create mode 100644 examples/data_str/bicol2.log create mode 100644 examples/data_str/bicol2.pcd create mode 100644 examples/data_str/bicol3.log create mode 100644 examples/data_str/bst.ccd create mode 100644 examples/data_str/bst.log create mode 100644 examples/data_str/bst.pcd create mode 100644 examples/data_str/bst2.ccd create mode 100644 examples/data_str/bst2.log create mode 100644 examples/data_str/bst2.pcd create mode 100644 examples/data_str/bst3.ccd create mode 100644 examples/data_str/bst3.log create mode 100644 examples/data_str/bst3.pcd create mode 100644 examples/data_str/bstscan.ccd create mode 100644 examples/data_str/bstscan.log create mode 100644 examples/data_str/bstscan.pcd create mode 100644 examples/data_str/new.ccd create mode 100644 examples/data_str/new.log create mode 100644 examples/data_str/new.pcd create mode 100644 examples/data_str/projet.log create mode 100644 examples/data_str/queue2.ccd create mode 100644 examples/data_str/queue2.log create mode 100644 examples/data_str/queue2.pcd create mode 100644 examples/data_str/str_poly.ccd create mode 100644 examples/data_str/str_poly.lcd create mode 100644 examples/data_str/str_poly.log create mode 100644 examples/data_str/str_poly.pcd create mode 100644 examples/data_str/temp16.tmp create mode 100644 examples/data_str/temp18.tmp create mode 100644 examples/database/authors.idx create mode 100644 examples/database/library.bas create mode 100644 examples/database/library.dat create mode 100644 examples/database/noinv.idx create mode 100644 examples/database/sgbd.ccd create mode 100644 examples/database/sgbd.log create mode 100644 examples/database/sgbd.pcd create mode 100644 examples/database/test19.ccd create mode 100644 examples/database/test19.log create mode 100644 examples/database/test19.pcd create mode 100644 examples/demos.pau/sort95/600 create mode 100644 examples/demos.pau/sort95/egahint.exe create mode 100644 examples/demos.pau/sort95/sort.ccd create mode 100644 examples/demos.pau/sort95/sort.log create mode 100644 examples/demos.pau/sort95/sort.pcd create mode 100644 examples/demos.pau/sort95/zrob!to.bat create mode 100644 examples/examples.old/avl.log create mode 100644 examples/examples.old/bbarbre1.log create mode 100644 examples/examples.old/bbarbre2.log create mode 100644 examples/examples.old/bicolore.log create mode 100644 examples/examples.old/bidim.log create mode 100644 examples/examples.old/data.bas create mode 100644 examples/examples.old/data.dem create mode 100644 examples/examples.old/explan create mode 100644 examples/examples.old/geometri.log create mode 100644 examples/examples.old/hull.log create mode 100644 examples/examples.old/proj_li1.log create mode 100644 examples/examples.old/projet.log create mode 100644 examples/examples.old/projli11.log create mode 100644 examples/examples.old/search.log create mode 100644 examples/examples.old/texte.log create mode 100644 examples/examples/helpcor.log create mode 100644 examples/examples/p.log create mode 100644 examples/examples/strassen.log create mode 100644 examples/gare/gare.ccd create mode 100644 examples/gare/gare.log create mode 100644 examples/gare/gare.pcd create mode 100644 examples/gare/new-1.exe create mode 100644 examples/geometri/convexh1.ccd create mode 100644 examples/geometri/convexh1.log create mode 100644 examples/geometri/convexh1.pcd create mode 100644 examples/geometri/convexh2.log create mode 100644 examples/geometri/convexh3.log create mode 100644 examples/geometri/convgraf.ccd create mode 100644 examples/geometri/convgraf.log create mode 100644 examples/geometri/convgraf.pcd create mode 100644 examples/geometri/cub.ccd create mode 100644 examples/geometri/cub.log create mode 100644 examples/geometri/cub.pcd create mode 100644 examples/geometri/grafika.log create mode 100644 examples/geometri/inwers.ccd create mode 100644 examples/geometri/inwers.log create mode 100644 examples/geometri/inwers.pcd create mode 100644 examples/geometri/leser5.log create mode 100644 examples/geometri/mariusz4.log create mode 100644 examples/geometri/odcinki.ccd create mode 100644 examples/geometri/odcinki.lcd create mode 100644 examples/geometri/odcinki.log create mode 100644 examples/geometri/odcinki.pcd create mode 100644 examples/geometri/p3d.log create mode 100644 examples/graphcol.ccd create mode 100644 examples/graphcol.log create mode 100644 examples/graphcol.pcd create mode 100644 examples/grazyna.xmp/belote.log create mode 100644 examples/grazyna.xmp/binda3.log create mode 100644 examples/grazyna.xmp/bus13.log create mode 100644 examples/grazyna.xmp/convexh1.log create mode 100644 examples/grazyna.xmp/cub.log create mode 100644 examples/grazyna.xmp/dominate.log create mode 100644 examples/grazyna.xmp/morp3d.log create mode 100644 examples/grazyna.xmp/morps.log create mode 100644 examples/grazyna.xmp/new.log create mode 100644 examples/grazyna.xmp/part.log create mode 100644 examples/grazyna.xmp/pina.log create mode 100644 examples/grazyna.xmp/sort.log create mode 100644 examples/grazyna.xmp/station.log create mode 100644 examples/jeu/alumet.ccd create mode 100644 examples/jeu/alumet.log create mode 100644 examples/jeu/alumet.pcd create mode 100644 examples/jeu/dames.ccd create mode 100644 examples/jeu/dames.log create mode 100644 examples/jeu/dames.pcd create mode 100644 examples/jeu/donnees.lab create mode 100644 examples/jeu/jeu.log create mode 100644 examples/jeu/laby.ccd create mode 100644 examples/jeu/laby.log create mode 100644 examples/jeu/laby.pcd create mode 100644 examples/jeu/labyrint.ccd create mode 100644 examples/jeu/labyrint.log create mode 100644 examples/jeu/labyrint.pcd create mode 100644 examples/jeu/othello.log create mode 100644 examples/jeu/pina.ccd create mode 100644 examples/jeu/pina.lcd create mode 100644 examples/jeu/pina.log create mode 100644 examples/jeu/pina.pcd create mode 100644 examples/jeu/reversi.ccd create mode 100644 examples/jeu/reversi.log create mode 100644 examples/jeu/reversi.pcd create mode 100644 examples/logic/gentzen.ccd create mode 100644 examples/logic/gentzen.log create mode 100644 examples/logic/gentzen.pcd create mode 100644 examples/new-1.exe create mode 100644 examples/pataud/mon.log create mode 100644 examples/pataud/multilvl.log create mode 100644 examples/pataud/new1.log create mode 100644 examples/pataud/new2.log create mode 100644 examples/pataud/new3.log create mode 100644 examples/pataud/new5.log create mode 100644 examples/pataud/proc2.log create mode 100644 examples/pataud/simula.log create mode 100644 examples/pataud/simula2.log create mode 100644 examples/pataud/test.dat create mode 100644 examples/pataud/verspec.log create mode 100644 examples/pataud/verspecf.doc create mode 100644 examples/pataud/ville.dat create mode 100644 examples/pataud/ville.log create mode 100644 examples/pataud/windows.log create mode 100644 examples/process/binda3.ccd create mode 100644 examples/process/binda3.log create mode 100644 examples/process/binda3.pcd create mode 100644 examples/process/part.ccd create mode 100644 examples/process/part.log create mode 100644 examples/process/part.pcd create mode 100644 examples/process/parth.log create mode 100644 examples/process/philos.log create mode 100644 examples/process/ring2.ccd create mode 100644 examples/process/ring2.log create mode 100644 examples/process/ring2.pcd create mode 100644 examples/process/sort.bak create mode 100644 examples/process/sort.ccd create mode 100644 examples/process/sort.err create mode 100644 examples/process/sort.log create mode 100644 examples/process/sort.ltk create mode 100644 examples/process/sort.pcd create mode 100644 examples/simulati/bank2.ccd create mode 100644 examples/simulati/bank2.log create mode 100644 examples/simulati/bank2.pcd create mode 100644 examples/simulati/bank22.log create mode 100644 examples/simulati/bus.ccd create mode 100644 examples/simulati/bus.log create mode 100644 examples/simulati/bus.pcd create mode 100644 examples/simulati/bus13.ccd create mode 100644 examples/simulati/bus13.log create mode 100644 examples/simulati/bus13.pcd create mode 100644 examples/simulati/gare.ccd create mode 100644 examples/simulati/gare.log create mode 100644 examples/simulati/gare.pcd create mode 100644 examples/simulati/station.ccd create mode 100644 examples/simulati/station.log create mode 100644 examples/simulati/station.pcd create mode 100644 examples/test19/autor.idx create mode 100644 examples/test19/bibliog.bas create mode 100644 examples/test19/bibliog.dta create mode 100644 examples/test19/data.bas create mode 100644 examples/test19/nrpzycji.idx create mode 100644 examples/test19/test19.log create mode 100644 examples/ulica.log create mode 100644 loglan96/lcode/lcode create mode 100644 loglan96/lcode/readme create mode 100644 loglan96/loglan84.rs/antek2.txt create mode 100644 loglan96/loglan84.rs/antek3.txt create mode 100644 loglan96/loglan84.rs/antek4.txt create mode 100644 loglan96/loglan84.rs/antek6.txt create mode 100644 loglan96/loglan84.rs/loginlog.txt create mode 100644 loglan96/loglan84.rs/readme create mode 100644 loglan96/loglan84.rs/rsloglan.doc create mode 100644 loglan96/loglan93/expr.cc create mode 100644 loglan96/loglan93/expr.h create mode 100644 loglan96/loglan93/instr.cc create mode 100644 loglan96/loglan93/instr.h create mode 100644 loglan96/loglan93/lex.l create mode 100644 loglan96/loglan93/loglan.tar create mode 100644 loglan96/loglan93/makefile create mode 100644 loglan96/loglan93/objects.cc create mode 100644 loglan96/loglan93/objects.h create mode 100644 loglan96/loglan93/symtable.cc create mode 100644 loglan96/loglan93/symtable.h create mode 100644 loglan96/loglan93/syntax.y create mode 100644 loglan96/loglan93/test.log create mode 100644 loglan96/loglan93/test1.log create mode 100644 loglan96/loglan93/test2.log create mode 100644 loglan96/loglan93/test3.log create mode 100644 loglan96/loglan93/test4.log create mode 100644 loglan96/loglan93/tstexpr.cc create mode 100644 loglan96/loglan93/tstobj.cc create mode 100644 loglan96/loglan93/tstsymbt.cc create mode 100644 loglan96/loglan94/neweditr.log create mode 100644 loglan96/loglan94/newgramr.doc create mode 100644 loglan96/loglan95/examples.doc create mode 100644 loglan96/loglan95/filesys.doc create mode 100644 loglan96/loglan95/grammar0.doc create mode 100644 loglan96/loglan95/libmangr.doc create mode 100644 loglan96/loglan95/library.doc create mode 100644 loglan96/loglan95/liste.doc create mode 100644 loglan96/loglan95/newgram2.doc create mode 100644 loglan96/loglan95/newgram3.doc create mode 100644 loglan96/loglan95/planwork.doc create mode 100644 loglan96/loglan95/propo1.doc create mode 100644 loglan96/loglan95/pv1.doc create mode 100644 loglan96/loglan95/pv2.doc create mode 100644 loglan96/loglan95/pv3.doc create mode 100644 sources/f2c/cds.c create mode 100644 sources/f2c/data.c create mode 100644 sources/f2c/defines.h create mode 100644 sources/f2c/defs.h create mode 100644 sources/f2c/equiv.c create mode 100644 sources/f2c/error.c create mode 100644 sources/f2c/exec.c create mode 100644 sources/f2c/expr.c create mode 100644 sources/f2c/f2c.1 create mode 100644 sources/f2c/f2c.h create mode 100644 sources/f2c/format.c create mode 100644 sources/f2c/format.h create mode 100644 sources/f2c/formatd.c create mode 100644 sources/f2c/ftypes.h create mode 100644 sources/f2c/gram.c create mode 100644 sources/f2c/gram.dcl create mode 100644 sources/f2c/gram.exe create mode 100644 sources/f2c/gram.exp create mode 100644 sources/f2c/gram.hd create mode 100644 sources/f2c/gram.io create mode 100644 sources/f2c/init.c create mode 100644 sources/f2c/intr.c create mode 100644 sources/f2c/io.c create mode 100644 sources/f2c/iob.h create mode 100644 sources/f2c/lex.c create mode 100644 sources/f2c/link.lnk create mode 100644 sources/f2c/machdefs.h create mode 100644 sources/f2c/main.c create mode 100644 sources/f2c/makefile create mode 100644 sources/f2c/makefile.bak create mode 100644 sources/f2c/makefile.txt create mode 100644 sources/f2c/malloc.c create mode 100644 sources/f2c/mem.c create mode 100644 sources/f2c/memset.c create mode 100644 sources/f2c/misc.c create mode 100644 sources/f2c/names.c create mode 100644 sources/f2c/names.h create mode 100644 sources/f2c/nicepr.c create mode 100644 sources/f2c/nicepr.h create mode 100644 sources/f2c/notice create mode 100644 sources/f2c/output.c create mode 100644 sources/f2c/output.h create mode 100644 sources/f2c/p1defs.h create mode 100644 sources/f2c/p1output.c create mode 100644 sources/f2c/parse.h create mode 100644 sources/f2c/parsearg.c create mode 100644 sources/f2c/pccdefs.h create mode 100644 sources/f2c/pread.c create mode 100644 sources/f2c/proc.c create mode 100644 sources/f2c/put.c create mode 100644 sources/f2c/putpcc.c create mode 100644 sources/f2c/readme create mode 100644 sources/f2c/rm.bat create mode 100644 sources/f2c/safstrcp.c create mode 100644 sources/f2c/sysdep.c create mode 100644 sources/f2c/tokdefs.h create mode 100644 sources/f2c/tokens create mode 100644 sources/f2c/usignal.h create mode 100644 sources/f2c/vax.c create mode 100644 sources/f2c/version.c create mode 100644 sources/gen/back.c create mode 100644 sources/gen/back.o create mode 100644 sources/gen/deb.c create mode 100644 sources/gen/deb.o create mode 100644 sources/gen/gen create mode 100644 sources/gen/gen.c create mode 100644 sources/gen/gen.o create mode 100644 sources/gen/genint.h create mode 100644 sources/gen/genio.c create mode 100644 sources/gen/genio.o create mode 100644 sources/gen/genprot.c create mode 100644 sources/gen/genprot.o create mode 100644 sources/gen/glodefs.h create mode 100644 sources/gen/lcode.c create mode 100644 sources/gen/lcode.o create mode 100644 sources/gen/lists.c create mode 100644 sources/gen/lists.o create mode 100644 sources/gen/logen.c create mode 100644 sources/gen/logen.o create mode 100644 sources/gen/mainvar.c create mode 100644 sources/gen/mainvar.h create mode 100644 sources/gen/mainvar.o create mode 100644 sources/gen/makefile create mode 100644 sources/gen/oxen.c create mode 100644 sources/gen/oxen.h create mode 100644 sources/gen/oxen.o create mode 100644 sources/gen/rm.bat create mode 100644 sources/int/cint.c create mode 100644 sources/int/compact.c create mode 100644 sources/int/control.c create mode 100644 sources/int/depend.h create mode 100644 sources/int/dlink.asm create mode 100644 sources/int/dlink.h create mode 100644 sources/int/dosgraf1.c create mode 100644 sources/int/dosgraf2.c create mode 100644 sources/int/eventque.h create mode 100644 sources/int/execute.c create mode 100644 sources/int/fileio.c create mode 100644 sources/int/genint.h create mode 100644 sources/int/graf/cirb.c create mode 100644 sources/int/graf/doc/distrib.txt create mode 100644 sources/int/graf/doc/fedit.doc create mode 100644 sources/int/graf/doc/gmouse.doc create mode 100644 sources/int/graf/doc/graph.h create mode 100644 sources/int/graf/doc/graphsal.h create mode 100644 sources/int/graf/doc/iiuwgraf.ang create mode 100644 sources/int/graf/doc/iiuwgraf.pol create mode 100644 sources/int/graf/doc/nullgraf.asm create mode 100644 sources/int/graf/draw.c create mode 100644 sources/int/graf/gpmap.c create mode 100644 sources/int/graf/graf.h create mode 100644 sources/int/graf/hercules.c create mode 100644 sources/int/graf/hlineio.c create mode 100644 sources/int/graf/hvfill.c create mode 100644 sources/int/graf/lib/egamsf4.lib create mode 100644 sources/int/graf/lib/hgcmsf4.lib create mode 100644 sources/int/graf/lib/mgc64mf4.lib create mode 100644 sources/int/graf/lib/mgcmsf4.lib create mode 100644 sources/int/graf/makefile create mode 100644 sources/int/handler.c create mode 100644 sources/int/herc.c create mode 100644 sources/int/inkeydos.c create mode 100644 sources/int/inkeyos2.c create mode 100644 sources/int/inkeyux.c create mode 100644 sources/int/int.h create mode 100644 sources/int/intdt.c create mode 100644 sources/int/intproto.h create mode 100644 sources/int/link.lnk create mode 100644 sources/int/makefile create mode 100644 sources/int/memory.c create mode 100644 sources/int/net/ip/cli.c create mode 100644 sources/int/net/ip/graph.c create mode 100644 sources/int/net/ip/graph.h create mode 100644 sources/int/net/ip/graphsrv.c create mode 100644 sources/int/net/ip/makefile create mode 100644 sources/int/net/ip/sock.c create mode 100644 sources/int/net/ip/sock.h create mode 100644 sources/int/net/ip/sockcrc.c create mode 100644 sources/int/net/ip/srv.c create mode 100644 sources/int/net/ip/srv.h create mode 100644 sources/int/net/ip/t.c create mode 100644 sources/int/net/ip/time.c create mode 100644 sources/int/net/ip/timediff.c create mode 100644 sources/int/net/ip/udpmsg.c create mode 100644 sources/int/net/rpc/clnt.c create mode 100644 sources/int/net/rpc/makefile create mode 100644 sources/int/net/rpc/srvr.c create mode 100644 sources/int/net/rpc/srvr.h create mode 100644 sources/int/net/rpc/stop.c create mode 100644 sources/int/nettest/m create mode 100644 sources/int/nettest/m2 create mode 100644 sources/int/nettest/p.log create mode 100644 sources/int/nettest/s1 create mode 100644 sources/int/nettest/s2 create mode 100644 sources/int/nonstand.c create mode 100644 sources/int/nonstand.h create mode 100644 sources/int/object.c create mode 100644 sources/int/os2graf2.c create mode 100644 sources/int/procaddr.c create mode 100644 sources/int/process.c create mode 100644 sources/int/process.h create mode 100644 sources/int/queue.c create mode 100644 sources/int/queue.h create mode 100644 sources/int/rm.bat create mode 100644 sources/int/rpcall.c create mode 100644 sources/int/runsys.c create mode 100644 sources/int/sock.c create mode 100644 sources/int/sock.h create mode 100644 sources/int/standard.c create mode 100644 sources/int/svga1.c create mode 100644 sources/int/svga2.c create mode 100644 sources/int/tcpip.c create mode 100644 sources/int/tcpip.h create mode 100644 sources/int/typchk.c create mode 100644 sources/int/util.c create mode 100644 sources/int/x11graf1.c create mode 100644 sources/int/x11graf2.c create mode 100644 sources/lotek.src/lha.exe create mode 100644 sources/lotek.src/lotek/englotek.txt create mode 100644 sources/lotek.src/lotek/exe.lzh create mode 100644 sources/lotek.src/lotek/logdoc.zip create mode 100644 sources/lotek.src/lotek/loghelp.hlp create mode 100644 sources/lotek.src/lotek/loghelp.mph create mode 100644 sources/lotek.src/lotek/loghelp.spt create mode 100644 sources/lotek.src/lotek/loghelp.str create mode 100644 sources/lotek.src/lotek/lotek.hlp create mode 100644 sources/lotek.src/lotek/lotek.txt create mode 100644 sources/lotek.src/lotek/ne2lotek.doc create mode 100644 sources/lotek.src/lotek/pomoc.txt create mode 100644 sources/lotek.src/lotek/readme create mode 100644 sources/lotek.src/mph/comp/helpcomp.lzh create mode 100644 sources/lotek.src/mph/doc/mph.hlp create mode 100644 sources/lotek.src/mph/exe/mph.exe create mode 100644 sources/lotek.src/mph/mph/mph.lzh create mode 100644 sources/lotek.src/pkunzip.exe create mode 100644 sources/lotek.src/source/doc.zip create mode 100644 sources/lotek.src/source/lotek.lzh create mode 100644 sources/lotek.src/source/lotekins.lzh create mode 100644 sources/lotek.src/source/lsttest.lzh create mode 100644 sources/lotek.src/source/mplgd112.lzh create mode 100644 sources/lotek.src/source/ne2lotek.lzh create mode 100644 sources/new-s5r4/changes.doc create mode 100644 sources/new-s5r4/cint.c create mode 100644 sources/new-s5r4/cint.o create mode 100644 sources/new-s5r4/compact.c create mode 100644 sources/new-s5r4/compact.o create mode 100644 sources/new-s5r4/control.c create mode 100644 sources/new-s5r4/control.o create mode 100644 sources/new-s5r4/depend.h create mode 100644 sources/new-s5r4/dlink.asm create mode 100644 sources/new-s5r4/dlink.h create mode 100644 sources/new-s5r4/dosgraf1.c create mode 100644 sources/new-s5r4/dosgraf2.c create mode 100644 sources/new-s5r4/eventque.h create mode 100644 sources/new-s5r4/execute.c create mode 100644 sources/new-s5r4/execute.o create mode 100644 sources/new-s5r4/fileio.c create mode 100644 sources/new-s5r4/fileio.o create mode 100644 sources/new-s5r4/genint.h create mode 100644 sources/new-s5r4/graf/cirb.c create mode 100644 sources/new-s5r4/graf/doc/distrib.txt create mode 100644 sources/new-s5r4/graf/doc/fedit.doc create mode 100644 sources/new-s5r4/graf/doc/gmouse.doc create mode 100644 sources/new-s5r4/graf/doc/graph.h create mode 100644 sources/new-s5r4/graf/doc/graphsal.h create mode 100644 sources/new-s5r4/graf/doc/iiuwgraf.ang create mode 100644 sources/new-s5r4/graf/doc/iiuwgraf.pol create mode 100644 sources/new-s5r4/graf/doc/nullgraf.asm create mode 100644 sources/new-s5r4/graf/draw.c create mode 100644 sources/new-s5r4/graf/gpmap.c create mode 100644 sources/new-s5r4/graf/graf.h create mode 100644 sources/new-s5r4/graf/hercules.c create mode 100644 sources/new-s5r4/graf/hlineio.c create mode 100644 sources/new-s5r4/graf/hvfill.c create mode 100644 sources/new-s5r4/graf/lib/egamsf4.lib create mode 100644 sources/new-s5r4/graf/lib/hgcmsf4.lib create mode 100644 sources/new-s5r4/graf/lib/mgc64mf4.lib create mode 100644 sources/new-s5r4/graf/lib/mgcmsf4.lib create mode 100644 sources/new-s5r4/graf/makefile create mode 100644 sources/new-s5r4/handler.c create mode 100644 sources/new-s5r4/handler.o create mode 100644 sources/new-s5r4/herc.c create mode 100644 sources/new-s5r4/info create mode 100644 sources/new-s5r4/inkeydos.c create mode 100644 sources/new-s5r4/inkeyos2.c create mode 100644 sources/new-s5r4/inkeyux.c create mode 100644 sources/new-s5r4/inkeyux.o create mode 100644 sources/new-s5r4/int create mode 100644 sources/new-s5r4/int.h create mode 100644 sources/new-s5r4/intdt.c create mode 100644 sources/new-s5r4/intdt.o create mode 100644 sources/new-s5r4/intproto.h create mode 100644 sources/new-s5r4/link.lnk create mode 100644 sources/new-s5r4/makefile create mode 100644 sources/new-s5r4/memory.c create mode 100644 sources/new-s5r4/memory.o create mode 100644 sources/new-s5r4/nonstand.c create mode 100644 sources/new-s5r4/nonstand.h create mode 100644 sources/new-s5r4/nonstand.o create mode 100644 sources/new-s5r4/object.c create mode 100644 sources/new-s5r4/object.o create mode 100644 sources/new-s5r4/os2graf2.c create mode 100644 sources/new-s5r4/procaddr.c create mode 100644 sources/new-s5r4/procaddr.o create mode 100644 sources/new-s5r4/process.c create mode 100644 sources/new-s5r4/process.h create mode 100644 sources/new-s5r4/process.o create mode 100644 sources/new-s5r4/queue.c create mode 100644 sources/new-s5r4/queue.h create mode 100644 sources/new-s5r4/queue.o create mode 100644 sources/new-s5r4/rm.bat create mode 100644 sources/new-s5r4/rpcall.c create mode 100644 sources/new-s5r4/rpcall.o create mode 100644 sources/new-s5r4/runsys.c create mode 100644 sources/new-s5r4/runsys.o create mode 100644 sources/new-s5r4/sock.c create mode 100644 sources/new-s5r4/sock.h create mode 100644 sources/new-s5r4/soct.h create mode 100644 sources/new-s5r4/standard.c create mode 100644 sources/new-s5r4/standard.o create mode 100644 sources/new-s5r4/svga1.c create mode 100644 sources/new-s5r4/svga2.c create mode 100644 sources/new-s5r4/sys5r4.arj create mode 100644 sources/new-s5r4/tcpip.c create mode 100644 sources/new-s5r4/tcpip.h create mode 100644 sources/new-s5r4/typchk.c create mode 100644 sources/new-s5r4/typchk.o create mode 100644 sources/new-s5r4/util.c create mode 100644 sources/new-s5r4/util.o create mode 100644 sources/new-s5r4/x11graf1.c create mode 100644 sources/new-s5r4/x11graf2.c create mode 100644 sources/pass1/al11.ff create mode 100644 sources/pass1/al12.ff create mode 100644 sources/pass1/al13.ff create mode 100644 sources/pass1/blank.doc create mode 100644 sources/pass1/blank.h create mode 100644 sources/pass1/blank2.h create mode 100644 sources/pass1/blank3.h create mode 100644 sources/pass1/debug.f create mode 100644 sources/pass1/dsw.f create mode 100644 sources/pass1/f2c.h create mode 100644 sources/pass1/hash.f create mode 100644 sources/pass1/ifun.f create mode 100644 sources/pass1/it0.ff create mode 100644 sources/pass1/it1.ff create mode 100644 sources/pass1/logdeb.log create mode 100644 sources/pass1/loglan create mode 100644 sources/pass1/main.c create mode 100644 sources/pass1/makefil create mode 100644 sources/pass1/makefile create mode 100644 sources/pass1/memfil.c create mode 100644 sources/pass1/ml2.f create mode 100644 sources/pass1/ml3.c create mode 100644 sources/pass1/msdos.lnk create mode 100644 sources/pass1/names/doctext.pas create mode 100644 sources/pass1/names/exec.pas create mode 100644 sources/pass1/names/names create mode 100644 sources/pass1/names/nazwy.pas create mode 100644 sources/pass1/names/printmem.pas create mode 100644 sources/pass1/names/search.for create mode 100644 sources/pass1/option.h create mode 100644 sources/pass1/resume.f create mode 100644 sources/pass1/rm.bat create mode 100644 sources/pass1/scan.ff create mode 100644 sources/pass1/spgrec.f create mode 100644 sources/pass1/statist.f create mode 100644 sources/pass1/stdio.c create mode 100644 sources/pass1/stos.h create mode 100644 sources/pass1/unix.lnk create mode 100644 sources/pass1/wan1.ff create mode 100644 sources/pass1/wan2.f create mode 100644 sources/pass1/wan3.f create mode 100644 sources/readme create mode 100644 utils/editor.dos/edibase0.dba create mode 100644 utils/editor.dos/edihelp0.def create mode 100644 utils/editor.dos/edihelp0.hlp create mode 100644 utils/editor.dos/editor0.exe create mode 100644 utils/editor.dos/edytrap2.chi create mode 100644 utils/editor.dos/grammar0 create mode 100644 utils/editor.dos/prolog.err create mode 100644 utils/editor.dos/readme create mode 100644 utils/lotek/aide_lot.ek create mode 100644 utils/lotek/anglotek.hlp create mode 100644 utils/lotek/englotek.txt create mode 100644 utils/lotek/iiuwgraf.pl create mode 100644 utils/lotek/logdeb.exe create mode 100644 utils/lotek/loghelp.hlp create mode 100644 utils/lotek/loghelp.mph create mode 100644 utils/lotek/loghelp.spt create mode 100644 utils/lotek/loghelp.str create mode 100644 utils/lotek/loglan.txt create mode 100644 utils/lotek/lotek.exe create mode 100644 utils/lotek/lotek.hlp create mode 100644 utils/lotek/lotek.pth create mode 100644 utils/lotek/lotek.txt create mode 100644 utils/lotek/lotekins.exe create mode 100644 utils/lotek/lsttest.exe create mode 100644 utils/lotek/mpled.dat create mode 100644 utils/lotek/mpled.old create mode 100644 utils/lotek/mploged.exe create mode 100644 utils/lotek/ne2lotek.doc create mode 100644 utils/lotek/ne2lotek.exe create mode 100644 utils/lotek/noname.ltk create mode 100644 utils/lotek/pllotek.hlp create mode 100644 utils/lotek/pllotek.pth create mode 100644 utils/lotek/pomoc.txt create mode 100644 utils/lotek/praca.bak create mode 100644 utils/lotek/praca.bat create mode 100644 utils/lotek/prep.exe create mode 100644 utils/lotek/report.hlp create mode 100644 utils/lotek/spis_tre.sci create mode 100644 utils/lotek/structr.doc create mode 100644 utils/lotek/to_do.txt create mode 100644 utils/lotek/userman.txt diff --git a/.mirror b/.mirror new file mode 100644 index 0000000..a0d4b99 --- /dev/null +++ b/.mirror @@ -0,0 +1,403 @@ +mirroring loglan (aragorn.pb.bialystok.pl:/pub/loglan) completed successfully @ Mon Nov 25 01:14:37 MET 1996 +Failed to get HTML/index.html: 150 Opening BINARY mode data connection for HTML/index.html (2715 bytes). +Failed to get HTML/index.html.bak: 227 Entering Passive Mode (193,59,9,226,4,165) +Failed to get HTML/quickref.ps.Z: timed out +Failed to get HTML/comptble.ps.Z: timed out +Failed to get sources/pass1/unix.lnk: timed out +Failed to get sources/pass1/stdio.c: timed out +Failed to get sources/pass1/memfil.c: timed out +Failed to get sources/pass1/ml3.c: timed out +Failed to get sources/pass1/main.c: timed out +Failed to get sources/pass1/wan1.ff: timed out +Failed to get sources/pass1/scan.ff: timed out +Failed to get sources/pass1/it1.ff: timed out +Failed to get sources/pass1/al13.ff: timed out +Failed to get sources/pass1/al12.ff: timed out +Failed to get sources/pass1/al11.ff: timed out +Failed to get sources/pass1/it0.ff: timed out +Failed to get sources/pass1/debug.f: timed out +Failed to get sources/pass1/hash.f: timed out +Failed to get sources/pass1/wan2.f: timed out +Failed to get sources/pass1/wan3.f: timed out +Failed to get sources/pass1/dsw.f: timed out +Failed to get sources/pass1/statist.f: timed out +Failed to get sources/pass1/spgrec.f: timed out +mirroring loglan (aragorn.pb.bialystok.pl:/pub/loglan) completed successfully @ Tue Nov 26 00:20:42 MET 1996 +Failed to get HTML/index.html: 150 Opening BINARY mode data connection for HTML/index.html (2715 bytes). +Failed to get HTML/index.html.bak: 227 Entering Passive Mode (193,59,9,226,6,122) +Failed to get HTML/quickref.ps.Z: timed out +Failed to get HTML/comptble.ps.Z: timed out +Failed to get sources/pass1/unix.lnk: timed out +Failed to get sources/pass1/stdio.c: timed out +Failed to get sources/pass1/memfil.c: timed out +Failed to get sources/pass1/ml3.c: timed out +Failed to get sources/pass1/main.c: timed out +Failed to get sources/pass1/wan1.ff: timed out +Failed to get sources/pass1/scan.ff: timed out +Failed to get sources/pass1/it1.ff: timed out +Failed to get sources/pass1/al13.ff: timed out +Failed to get sources/pass1/al12.ff: timed out +Failed to get sources/pass1/al11.ff: timed out +Failed to get sources/pass1/it0.ff: timed out +Failed to get sources/pass1/debug.f: timed out +Failed to get sources/pass1/hash.f: timed out +Failed to get sources/pass1/wan2.f: timed out +Failed to get sources/pass1/wan3.f: timed out +Failed to get sources/pass1/dsw.f: timed out +Failed to get sources/pass1/statist.f: timed out +Failed to get sources/pass1/spgrec.f: timed out +mirroring loglan (aragorn.pb.bialystok.pl:/pub/loglan) completed successfully @ Thu Nov 28 08:34:34 MET 1996 +Failed to get HTML/index.html: 150 Opening BINARY mode data connection for HTML/index.html (2715 bytes). +Failed to get HTML/index.html.bak: 227 Entering Passive Mode (193,59,9,226,4,244) +Failed to get HTML/quickref.ps.Z: timed out +Failed to get HTML/comptble.ps.Z: timed out +Failed to get sources/pass1/unix.lnk: timed out +Failed to get sources/pass1/stdio.c: timed out +Failed to get sources/pass1/memfil.c: timed out +Failed to get sources/pass1/ml3.c: timed out +Failed to get sources/pass1/main.c: timed out +Failed to get sources/pass1/wan1.ff: timed out +Failed to get sources/pass1/scan.ff: timed out +Failed to get sources/pass1/it1.ff: timed out +Failed to get sources/pass1/al13.ff: timed out +Failed to get sources/pass1/al12.ff: timed out +Failed to get sources/pass1/al11.ff: timed out +Failed to get sources/pass1/it0.ff: timed out +Failed to get sources/pass1/debug.f: timed out +Failed to get sources/pass1/hash.f: timed out +Failed to get sources/pass1/wan2.f: timed out +Failed to get sources/pass1/wan3.f: timed out +Failed to get sources/pass1/dsw.f: timed out +Failed to get sources/pass1/statist.f: timed out +Failed to get sources/pass1/spgrec.f: timed out +mirroring loglan (aragorn.pb.bialystok.pl:/pub/loglan) completed successfully @ Mon Dec 2 14:49:10 MET 1996 +Failed to get HTML/index.html: 150 Opening BINARY mode data connection for HTML/index.html (2715 bytes). +Failed to get HTML/quickref.ps.Z: 227 Entering Passive Mode (193,59,9,226,5,158) +Failed to get HTML/comptble.ps.Z: timed out +Failed to get sources/pass1/unix.lnk: timed out +Failed to get sources/pass1/stdio.c: timed out +Failed to get sources/pass1/memfil.c: timed out +Failed to get sources/pass1/ml3.c: timed out +Failed to get sources/pass1/main.c: timed out +Failed to get sources/pass1/wan1.ff: timed out +Failed to get sources/pass1/scan.ff: timed out +Failed to get sources/pass1/it1.ff: timed out +Failed to get sources/pass1/al13.ff: timed out +Failed to get sources/pass1/al12.ff: timed out +Failed to get sources/pass1/al11.ff: timed out +Failed to get sources/pass1/it0.ff: timed out +Failed to get sources/pass1/debug.f: timed out +Failed to get sources/pass1/hash.f: timed out +Failed to get sources/pass1/wan2.f: timed out +Failed to get sources/pass1/wan3.f: timed out +Failed to get sources/pass1/dsw.f: timed out +Failed to get sources/pass1/statist.f: timed out +Failed to get sources/pass1/spgrec.f: timed out +Failed to get sources/pass1/resume.f: timed out +mirroring loglan (aragorn.pb.bialystok.pl:/pub/loglan) completed successfully @ Tue Dec 3 00:21:09 MET 1996 +Got HTML/index.html 2715 +Got HTML/quickref.ps.Z 51935 +Got HTML/comptble.ps.Z 23003 +Got sources/pass1/unix.lnk 144 +Got sources/pass1/stdio.c 1770 +Got sources/pass1/memfil.c 5868 +Got sources/pass1/ml3.c 10756 +Got sources/pass1/main.c 2319 +Got sources/pass1/wan1.ff 29014 +Got sources/pass1/scan.ff 24601 +Got sources/pass1/it1.ff 60577 +Got sources/pass1/al13.ff 98702 +Got sources/pass1/al12.ff 67222 +Got sources/pass1/al11.ff 113254 +Got sources/pass1/it0.ff 28091 +Got sources/pass1/debug.f 12469 +Got sources/pass1/hash.f 48676 +Got sources/pass1/wan2.f 55883 +Got sources/pass1/wan3.f 49687 +Got sources/pass1/dsw.f 141801 +Got sources/pass1/statist.f 3009 +Got sources/pass1/spgrec.f 3456 +Got sources/pass1/resume.f 4405 +Got sources/pass1/ml2.f 25660 +Got sources/pass1/ifun.f 1618 +Got sources/pass1/stos.h 1179 +Got sources/pass1/option.h 106 +Got sources/pass1/f2c.h 4093 +Got sources/pass1/blank3.h 910 +Got sources/pass1/blank2.h 1108 +Got sources/pass1/blank.h 1418 +Got sources/pass1/makefile 2254 +Got sources/pass1/logdeb.log 60113 +Got sources/pass1/makefil 2043 +Got sources/pass1/msdos.lnk 131 +Got sources/pass1/loglan 200098 +Got sources/pass1/blank.doc 2683 +Got sources/gen/genint.h 6370 +Got sources/gen/glodefs.h 10497 +Got sources/gen/mainvar.h 4811 +Got sources/gen/oxen.h 3564 +Got sources/gen/oxen.c 20711 +Got sources/gen/gen.c 19658 +Got sources/gen/lists.c 17680 +Got sources/gen/genprot.c 13547 +Got sources/gen/logen.c 10076 +Got sources/gen/mainvar.c 8154 +Got sources/gen/lcode.c 6858 +Got sources/gen/genio.c 6306 +Got sources/gen/deb.c 5358 +Got sources/gen/back.c 4306 +Got sources/f2c/putpcc.c 36792 +Got sources/f2c/put.c 9081 +Got sources/f2c/vax.c 7649 +Got sources/f2c/sysdep.c 6792 +Got sources/f2c/safstrcp.c 2884 +Got sources/f2c/readme 1831 +Got sources/f2c/tokdefs.h 1807 +Got sources/f2c/tokens 727 +Got sources/f2c/version.c 143 +Got sources/f2c/usignal.h 124 +Got sources/f2c/rm.bat 80 +Got sources/f2c/gram.c 79753 +Got sources/f2c/expr.c 55807 +Got sources/f2c/format.c 49696 +Got sources/f2c/output.c 38940 +Got sources/f2c/proc.c 33028 +Got sources/f2c/lex.c 29242 +Got sources/f2c/io.c 27451 +Got sources/f2c/defs.h 23461 +Got sources/f2c/formatd.c 23180 +Got sources/f2c/intr.c 19638 +Got sources/f2c/names.c 18381 +Got sources/f2c/misc.c 17876 +Got sources/f2c/exec.c 17697 +Got sources/f2c/pread.c 15807 +Got sources/f2c/main.c 15305 +Got sources/f2c/parsearg.c 13258 +Got sources/f2c/p1output.c 12088 +Got sources/f2c/init.c 10018 +Got sources/f2c/equiv.c 8503 +Got sources/f2c/nicepr.c 8497 +Got sources/f2c/data.c 8255 +Got sources/f2c/defines.h 8162 +Got sources/f2c/gram.dcl 8031 +Got sources/f2c/gram.hd 7531 +Got sources/f2c/f2c.1 5964 +Got sources/f2c/p1defs.h 5688 +Got sources/f2c/mem.c 4672 +Got sources/f2c/f2c.h 4093 +Got sources/f2c/cds.c 3919 +Got sources/f2c/error.c 3484 +Got sources/f2c/malloc.c 3370 +Got sources/f2c/gram.io 3274 +Got sources/f2c/gram.exp 3072 +Got sources/f2c/gram.exe 3067 +Got sources/f2c/output.h 2109 +Got sources/f2c/memset.c 1964 +Got sources/f2c/makefile 1870 +Got sources/f2c/makefile.txt 1870 +Got sources/f2c/makefile.bak 1870 +Got sources/f2c/pccdefs.h 1195 +Got sources/f2c/notice 1177 +Got sources/f2c/ftypes.h 941 +Got sources/f2c/parse.h 862 +Got sources/f2c/names.h 727 +Got sources/f2c/machdefs.h 659 +Got sources/f2c/iob.h 459 +Got sources/f2c/nicepr.h 412 +Got sources/f2c/format.h 300 +Got sources/f2c/link.lnk 229 +Got loglan96/loglan93/loglan.tar 163840 +Got loglan96/loglan93/instr.cc 11894 +Got loglan96/loglan93/instr.h 5504 +Got loglan96/loglan93/expr.cc 20426 +Got loglan96/loglan93/objects.h 4646 +Got loglan96/loglan93/objects.cc 5845 +Got loglan96/loglan93/syntax.y 40972 +Got loglan96/loglan93/expr.h 9372 +Got loglan96/loglan93/lex.l 24428 +Got loglan96/loglan93/makefile 1840 +Got loglan96/loglan93/symtable.h 3508 +Got loglan96/loglan93/tstsymbt.cc 1959 +Got loglan96/loglan93/test3.log 50 +Got loglan96/loglan93/tstobj.cc 862 +Got loglan96/loglan93/test.log 837 +Got loglan96/loglan93/tstexpr.cc 677 +Got loglan96/loglan93/symtable.cc 7209 +Got loglan96/loglan93/test4.log 38 +Got loglan96/loglan93/test2.log 59 +Got loglan96/loglan93/test1.log 71 +Got loglan96/loglan94/newgramr.doc 39647 +Got loglan96/loglan94/neweditr.log 4318 +Got loglan96/loglan95/planwork.doc 28417 +Got loglan96/loglan95/liste.doc 1848 +Got loglan96/loglan95/pv3.doc 2349 +Got loglan96/loglan95/library.doc 4027 +Got loglan96/loglan95/libmangr.doc 4083 +Got loglan96/loglan95/filesys.doc 2428 +Got loglan96/loglan95/grammar0.doc 32166 +Got loglan96/loglan95/newgram3.doc 47488 +Got loglan96/loglan95/propo1.doc 4419 +Got loglan96/loglan95/pv2.doc 10011 +Got loglan96/loglan95/pv1.doc 3372 +Got loglan96/loglan95/newgram2.doc 44002 +Got loglan96/loglan84.rs/readme 566 +Got loglan96/loglan84.rs/rsloglan.doc 146021 +Got loglan96/loglan84.rs/antek6.txt 111361 +Got loglan96/loglan84.rs/loginlog.txt 126932 +Got loglan96/loglan84.rs/antek4.txt 49087 +Got loglan96/loglan84.rs/antek3.txt 27563 +Got loglan96/loglan84.rs/antek2.txt 24156 +Got loglan96/lcode/readme 281 +Got loglan96/lcode/lcode 10354 +Got at_work/loglan96/index.html 790 +Got at_work/loglan96/index.html.bak 790 +Got at_work/loglan96/index.map 23 +Got at_work/loglan96/intro.gif 117569 +Got examples/examples/strassen.log 46434 +Got examples/examples/helpcor.log 62131 +Got examples/examples/p.log 32491 +Got examples/grazyna.xmp/belote.log 86360 +Got examples/grazyna.xmp/morp3d.log 87908 +Got examples/grazyna.xmp/morps.log 170790 +Got examples/grazyna.xmp/dominate.log 37905 +Got examples/grazyna.xmp/bus13.log 29550 +Got examples/grazyna.xmp/sort.log 12098 +Got examples/grazyna.xmp/convexh1.log 10218 +Got examples/grazyna.xmp/station.log 41691 +Got examples/grazyna.xmp/binda3.log 13827 +Got examples/grazyna.xmp/part.log 5367 +Got examples/grazyna.xmp/cub.log 19147 +Got examples/grazyna.xmp/pina.log 51927 +Got examples/grazyna.xmp/new.log 37043 +Got examples/pataud/new5.log 20732 +Got examples/pataud/new3.log 22058 +Got examples/pataud/new2.log 14921 +Got examples/pataud/new1.log 5881 +Got examples/pataud/multilvl.log 622 +Got examples/pataud/simula2.log 116904 +Got examples/pataud/mon.log 4045 +Got examples/pataud/test.dat 16 +Got examples/pataud/simula.log 78001 +Got examples/pataud/windows.log 27546 +Got examples/pataud/ville.dat 973 +Got examples/pataud/ville.log 9137 +Got examples/pataud/verspec.log 7583 +Got examples/pataud/verspecf.doc 10707 +Got examples/pataud/proc2.log 11727 +Got examples/test19/bibliog.bas 0 +Got examples/test19/bibliog.dta 0 +Got examples/test19/autor.idx 0 +Got examples/test19/nrpzycji.idx 0 +Got examples/test19/data.bas 2512 +Got examples/test19/test19.log 83228 +Got bin/readme 546 +Got bin/atari/loglan.ttp 237302 +Got bin/atari/intgem.prg 79502 +Got bin/atari/gen.ttp 39297 +Got bin/atari/atari.ps 112696 +Got bin/atari/atari.doc 11257 +Got bin/atari/atari.use 987 +Got bin/atari/atari.usr 11161 +Got bin/atari/atariusr.txt 8307 +Got bin/atari/ms.tos 9104 +Got bin/atari/desktop.inf 481 +Got bin/atari/me.ttp 76692 +Got bin/atari/emacs.rc 6796 +Got bin/l2c/readme 498 +Got bin/l2c/l2c1.exe 104360 +Got bin/l2c/l2c2.exe 114748 +Got bin/dos/drivers.grp/s3864_2m.grn 904 +Got bin/dos/drivers.grp/s3805_1m.grn 832 +Got bin/dos/drivers.grp/ati_16md.grn 979 +Got bin/dos/drivers.grp/vesa111.vdr 3046 +Got bin/dos/drivers.grp/oak.grn 499 +Got bin/dos/drivers.grp/atiultra.grn 1208 +Got bin/dos/drivers.grp/ati.grd 375 +Got bin/dos/drivers.grp/video7.grd 331 +Got bin/dos/drivers.grp/aheadb.grd 267 +Got bin/dos/drivers.grp/chips.grd 282 +Got bin/dos/drivers.grp/everex.grd 311 +Got bin/dos/drivers.grp/genoa.grd 285 +Got bin/dos/drivers.grp/paradise.grd 263 +Got bin/dos/drivers.grp/aheada.grd 287 +Got bin/dos/drivers.grp/cl5426.grn 549 +Got bin/dos/drivers.grp/wd90c3x.grn 624 +Got bin/dos/drivers.grp/wdvanila.grn 609 +Got bin/dos/drivers.grp/newss24x.grn 668 +Got bin/dos/drivers.grp/stealth.grn 617 +Got bin/dos/drivers.grp/tr8900.grn 578 +Got bin/dos/drivers.grp/vesa_s3.grn 735 +Got bin/dos/drivers.grp/viper.grn 749 +Got bin/dos/drivers.grp/realtek.grn 577 +Got bin/dos/drivers.grp/stdvga.grn 502 +Got bin/dos/drivers.grp/ativga.grn 565 +Got bin/dos/drivers.grp/cirrus54.grn 700 +Got bin/dos/drivers.grp/et3000.grn 530 +Got bin/dos/drivers.grp/acumos.grn 547 +Got bin/dos/drivers.grp/atigupro.grn 513 +Got bin/dos/drivers.grp/et4000.grn 884 +Got bin/dos/drivers.grp/ss24x.grn 1041 +Got bin/dos/drivers.grp/sparadis.grn 549 +Got bin/dos/286/dirinfo 279 +Got bin/dos/286/readme 619 +Got bin/dos/286/hgchint.exe 133290 +Got bin/dos/286/egahint.exe 134410 +Got bin/dos/286/egaint.exe 93444 +Got bin/dos/286/hgcint.exe 92340 +Got bin/dos/286/hgen.exe 51404 +Got bin/dos/286/gen.exe 48840 +Got bin/dos/286/loglan.exe 248828 +Got bin/dos/286/egahint.old 152057 +Got bin/dos/286/egaint.old 83883 +Got bin/dos/286/old/ne2lotek.exe 10064 +Got bin/dos/286/old/pkzip.exe 32880 +Got bin/dos/286/old/l2c1.exe 104360 +Got bin/dos/286/old/l2c2.exe 114748 +Got bin/dos/286/old/gen.exe 31402 +Got bin/dos/286/old/prep.exe 18644 +Got bin/dos/286/old/loglan.exe 248828 +Got bin/dos/286/old/hint.exe 150689 +Got bin/dos/286/old/int.exe 82779 +Got bin/dos/286/old/hgen.exe 32672 +Got bin/dos/286/cga/cg64int.exe 82587 +Got bin/dos/286/cga/cg32int.exe 82955 +Got bin/dos/286/cga/cg64hint.exe 150497 +Got bin/dos/286/cga/cgaint1.exe 101203 +Got bin/dos/386/readme 787 +Got bin/dos/386/cc.bat 266 +Got bin/dos/386/int.exe 149912 +Got bin/dos/386/gen.exe 69598 +Got bin/dos/386/loglan.exe 219928 +Got bin/dos/386/old1.log 2301 +Got bin/dos/386/dirinfo 71 +Got bin/dos/486/loglan.exe 225368 +Got bin/dos/486/readme 158 +Got bin/dos/486/logpp.exe 72704 +Got bin/dos/486/int.exe 150360 +Got bin/dos/486/cc.bat 308 +Got bin/dos/486/gen.exe 70174 +Got bin/dos/486/go32.exe 78666 +unlink /ftp/mirrors/aragorn.pb.bialystok.pl/pub/loglan/HTML/.in.index.html. +unlink /ftp/mirrors/aragorn.pb.bialystok.pl/pub/loglan/HTML/.in.index.html. failed: No such file or directory +mirroring loglan (aragorn.pb.bialystok.pl:/pub/loglan) completed successfully @ Thu Dec 5 02:39:15 MET 1996 +mirroring loglan (aragorn.pb.bialystok.pl:/pub/loglan) completed successfully @ Fri Dec 6 02:57:32 MET 1996 +mirroring loglan (aragorn.pb.bialystok.pl:/pub/loglan) completed successfully @ Sat Dec 7 01:58:35 MET 1996 +mirroring loglan (aragorn.pb.bialystok.pl:/pub/loglan) completed successfully @ Sun Dec 8 02:22:37 MET 1996 +mirroring loglan (aragorn.pb.bialystok.pl:/pub/loglan) completed successfully @ Mon Dec 9 02:06:24 MET 1996 +mirroring loglan (aragorn.pb.bialystok.pl:/pub/loglan) completed successfully @ Mon Dec 9 23:11:39 MET 1996 +mirroring loglan (aragorn.pb.bialystok.pl:/pub/loglan) completed successfully @ Thu Dec 12 02:37:46 MET 1996 +mirroring loglan (aragorn.pb.bialystok.pl:/pub/loglan) completed successfully @ Sat Dec 14 11:14:35 MET 1996 +mirroring loglan (aragorn.pb.bialystok.pl:/pub/loglan) completed successfully @ Sun Dec 15 00:35:25 MET 1996 +mirroring loglan (aragorn.pb.bialystok.pl:/pub/loglan) completed successfully @ Sun Dec 15 23:57:12 MET 1996 +mirroring loglan (aragorn.pb.bialystok.pl:/pub/loglan) completed successfully @ Mon Dec 16 23:32:41 MET 1996 +mirroring loglan (aragorn.pb.bialystok.pl:/pub/loglan) completed successfully @ Wed Dec 18 01:03:48 MET 1996 +mirroring loglan (aragorn.pb.bialystok.pl:/pub/loglan) completed successfully @ Wed Dec 18 23:37:27 MET 1996 +mirroring loglan (aragorn.pb.bialystok.pl:/pub/loglan) completed successfully @ Fri Dec 20 02:23:16 MET 1996 +mirroring loglan (aragorn.pb.bialystok.pl:/pub/loglan) completed successfully @ Sun Dec 22 02:44:08 MET 1996 +mirroring loglan (aragorn.pb.bialystok.pl:/pub/loglan) completed successfully @ Mon Dec 23 00:01:53 MET 1996 +mirroring loglan (aragorn.pb.bialystok.pl:/pub/loglan) completed successfully @ Tue Dec 24 00:56:29 MET 1996 +mirroring loglan (aragorn.pb.bialystok.pl:/pub/loglan) completed successfully @ Wed Dec 25 00:05:35 MET 1996 +mirroring loglan (aragorn.pb.bialystok.pl:/pub/loglan) completed successfully @ Thu Dec 26 01:26:19 MET 1996 +mirroring loglan (aragorn.pb.bialystok.pl:/pub/loglan) completed successfully @ Fri Dec 27 01:56:13 MET 1996 +mirroring loglan (aragorn.pb.bialystok.pl:/pub/loglan) completed successfully @ Sat Dec 28 00:26:15 MET 1996 +mirroring loglan (aragorn.pb.bialystok.pl:/pub/loglan) completed successfully @ Sat Dec 28 23:17:43 MET 1996 diff --git a/HTML/HomePage.gif b/HTML/HomePage.gif new file mode 100644 index 0000000000000000000000000000000000000000..da7870489cdb021d406b56f5885313f0ab8a37ac GIT binary patch literal 1485 zcmV;;1v2_aNk%v~VPpVC0M!5h|NsBq=l}Qj|L5ob-roPMt@o{^_ukh3t(^C*l=sfP z_wVQb*2ee7t@o{j@7BHd&aL;Yd+)}a_pNj9-p2R$@Bi=K|JJql&ZYOQYwx96@4bZY ztz++;Lg&t$_q}`Xty=G#Ip@xl_r{FxrAp_VG3W2r|Hg#xr9$VNDd(+9=cPI4r7`Em zd+)76=cOs<_vinuIp?Jz=cO3ur4Z-$-v9U3|L?~4|M&m@@BaV*000000000000000 z00000EC2ui0Av70000L6K!9*aEE2dn74a)DA?dU|~|Fo-oZ7Kkv9c5Z@`V*+-MFpVYz44n)I zpcW>MWoMM9Mr(YTq7p$D%plK!gL}u4^^xSy3LSI|ez9vYAt8y6AU`I|5TPChaG?6+5TKY0dR;*ybLgxzq6e1@$NFWTE$~P{fJhL!!TSuHcUr3$GbA?Ef35b0n07FeuDd%e3 zU~mD$hzK5czL3FoMhdqwQoJYuR6~ZLCqMCP`PB&yLrfo-{gBWFi?uRlC|<0X?OdyN z9Y}!Ci7T_dOw8bs2|>b%2_SMJW=y*A+`18nKA^yr4N}ZV0A|W)7A=XLZAsIZv0HHp z8FNW!5Q+e0fMu^?rxJkif`=0bQ5;UZc(--Mz1_YDAv^*C2*(2CNv^yI4m>qX{Boy( zL<|U%ivFRoN-q$IfR+j? z02-*5Hl}djp#|)B9HWim0fS5zc$TGfTy{vGZ!gHHL2BUfSiyu-KEo%55foTysthKn zU7?2>u%mc);yDChkb2<2iw3@cU}^OMSLmFnbt=no{TVw4G-Uay!iKz(##Ra?EEz0i z1lTG6rM6w5H;`wxZ5S6@^g5=gtHfbY*>MuGI|m*M+}fD~lin7BTq*n}R|)0fo0S)GkQ@WvW|un`xr30QT))yS7AJ@%||c&^wd{x{q@*Op~Ln%48eW( zlYGzpl-n0k{we2=PvQCAgHH+j?3Wim0P_a|zx(pzPrv)(@Bh93MEIW((#Jpb`A>ZU zjDz_8hrsfU?}6Qep#Bb6KmZcZg7ve){2Yis4hrFd_Z#2@0~kT@dGLcHtilFMNW%T0 z@P!MUVEq>8LKntR4lAr73{A*G9U>uzFFarn!>2zE@{ol!G~y83XFesau!nF+AOi(B n#S&U^h6Y3-75mq}>?t9HUUWkIG8o1qfU%5C=pq`E5(EG{h0wyu literal 0 HcmV?d00001 diff --git a/HTML/MicroMan/Classes.htm b/HTML/MicroMan/Classes.htm new file mode 100644 index 0000000..099c7de --- /dev/null +++ b/HTML/MicroMan/Classes.htm @@ -0,0 +1,154 @@ + + + + + +Classes + + + + + + + +

+Loglan 82, A micro-manual of the programming language - +Basic constructs and facilities +

5) Classes

+
+ +

+Class is a facility which covers such programming constructs as +structured type, package, access type, data structure etc. To +begin with the presentation of this construct, let us consider +a structured type assembled from primitive ones: +

+ +

+The above class declaration has the attributes : dollars (real), +not_paid (boolean), and year,month,day (integer). Wherever class +bill is visibile one can declare variables of type bill: +

+var x,y,z: bill
+
+ +

+The values of variables x, y, z can be the addresses of objects +of class bill. These variables are called reference variables. +With reference variable one can create and operate the objects +of reference variable type. +

+An object of a class is created by the class generation statement +(new), and thereafter, its attributes are accessed through dot +notation. +

+ +

+If an object of class bill has been created (new bill) and its +address has been assigned to variable x (x:=new bill), then the +attributes of that object are accessible through dot notation +(remote access). The expression x.dollars gives , for instance, +the remote access to attribute dollars of the object referenced +by x. All attributes of class objects are initialized as usual. +For the above example the object referenced by x, after the execution +of the specified sequence of statements, has the following structure: +

+ +

+The object referenced by y and z has the following structure: +

+ +

+The value none is the default initial value of any reference variable +and denotes no object. A remote access to an attribute of none +raises a run time error. +

+Class may have also formal parameters (as procedures and functions). +Kinds and transmission modes of formal parameters are the same +as in the case of procedures. +

+Example: +

+ +

+Let, for instance, variables z1, z2, z3 be of type node. Then +the sequence of statements: +

+ +

+creates the structure: +

+ +

+where arrows denote the values of the reference variables. +

+Class may also have a sequence of statements (as any other unit). +That sequence can initialize the attributes of the class objects. +

+Example: +

+ +

+Attribute module is evaluated for any object generation of class +complex: +

+ +

+For the execution of a class generator, first a class object is +created, then the input parameters are transmitted , and finally, +the sequence of statements (if any) is performed. Return is made +with the execution of return statement or the final end of a unit. +Upon return the output parameters are transmitted. +

+Procedure object is automatically deallocated when return is made +to the caller. Class object is not deallocated , its address can +be assigned to a reference variable, and its attributes can be +thereafter accessed via this variable. +

+The classes presented so far had only variable attributes. In +general, class attributes may be also other syntactic entities, +such as constants, procedures, functions, classes etc. Classes +with procedure and function attributes provide a good facility +to define data structures. +

+Example: +

+A push_down memory of integers may be implemented in the following +way: +

+ +

+Assume that somewhere in a program reference variables of type +push_down are declared (of course, in place where push_down is +visibile): +

+ +

+Three different push_down memories may be now generated: +

+ +

+One can use these push_down memories as follows: +

+ +

+etc.


+ +

+ + + +


+ +
+Last update 02/07/95 +
+ +
+Comments, suggestions and critiques are welcome to : linfo062@crisv2.univ-pau.fr + +
+ + + + diff --git a/HTML/MicroMan/Concurre.htm b/HTML/MicroMan/Concurre.htm new file mode 100644 index 0000000..0af7252 --- /dev/null +++ b/HTML/MicroMan/Concurre.htm @@ -0,0 +1,177 @@ + + + + + +Concurrent processes + + + + + + + +

+Loglan 82, A micro-manual of the programming language - +Basic constructs and facilities +

13) Concurrent processes +

+
+ +

+Loglan allows to create and execute objects-processes. They can +operate simultaneously on different computers linked into a LAN +network or a few processes can share one processor (its time-slices). +

+Process modules are different from the classes and coroutines +for, they use the keyword process. The syntax of process modules +is otherwise the same. In a process one can use a few more instructions: +resume (resume a process which is passive), stop - make the current +process passive, etc. +

+All processes (even those executed on the same computer) are implemented +as distributed, i.e. without any shared memory. This fact implies +some restrictions on how processes may be used. Not all restrictions +are enforced by the present compiler, so it is the programmer's +responsibility to respect them. For the details see the User's +Manual. +

+Semantics of the generator new is slightly modified when +applied to the processes. The first parameter of the first process +unit in the prefix sequence must be of type INTEGER. This parameter +denotes the node number of the computer on which this process +will be created. For a single computer operation this parameter +must be equal to 0. +

+Example: +

+ +

+COMMUNICATION MECHANISM +

+Processes may communicate and synchronize by a mechanism based +on rendez-vous. It will be referred to as "alien call" +in the following description. +

+An alien call is either: +

    +
  • a procedure call performed by a remote access to a process +object, or +
  • a call of a procedure which is a formal parameter of a process, +or +
  • a call of a procedure which is a formal parameter of an alien-called +procedure (this is a recursive definition). +
+ +

+Every process object has an enable mask. It is defined as a subset +of all procedures declared directly inside a process unit or any +unit from its prefix sequence (i.e. subset of all procedures that +may be alien-called). +

+A procedure is enabled in a process if it belongs to that process' +enable mask. A procedure is disabled if it does not belong to +the enable mask. +

+Immediately after generation of a process object its enable mask +is empty (all procedures are disabled). +

+Semantics of the alien call is different from the remote call +described in the report. Both the calling process and the process +in which the procedure is declared (i.e. the called process) are +involved in the alien call. This way the alien call may be used +as a synchronization mechanism. +

+The calling process passes the input parameters and waits for +the call to be completed. +

+The alien-called procedure is executed by the called process. +Execution of the procedure will not begin before certain conditions +are satisfied. First, the called process must not be suspended +in any way. The only exception is that it may be waiting during +the ACCEPT statement (see below). Second, the procedure must be +enabled in the called process. +

+When the above two conditions are met the called process is interrupted +and forced to execute the alien-called procedure (with parameters +passed by the calling process). +

+Upon entry to the alien-called procedure all procedures become +disabled in the called process. +

+Upon exit the enable mask of the called process is restored to +that from before the call (regardless of how it has been changed +during the execution of the procedure). The called process is +resumed at the point of the interruption. The execution of the +ACCEPT statement is ended if the called process was waiting during +the ACCEPT (see below). At last the calling process reads back +the output parameters and resumes its execution after the call +statement. +

+The process executing an alien-called procedure can easily be +interrupted by another alien call if the enable mask is changed. +

+There are some new language constructs associated with the alien +call mechanism. The following statements change the enable mask +of a process: +

+ +

+enables the procedures with identifiers p1, ..., pn. If there +are any processes waiting for an alien call of one of these procedures, +one of them is chosen and its request is processed. The scheduling +is done on a FIFO basis, so it is strongly fair. The statement: +

+ +

+disables the procedures with identifiers p1, ..., pn. +

+In addition a special form of the RETURN statement: +

+ +

+allows to enable the procedures p1, ..., pn and disable the procedures +q1,...,qn after the enable mask is restored on exit from the alien-called +procedure. It is legal only in the alien-called procedures (the +legality is not enforced by the compiler). +

+A called process may avoid busy waiting for an alien call by means +of the ACCEPT statement: +

+ +

+adds the procedures p1, ..., pn to the current mask, and waits +for an alien call of one of the currently enabled procedures. +After the procedure return the enable mask is restored to that +from before the ACCEPT statement. +

+Note that the ACCEPT statement alone (i.e. without any ENABLE/DISABLE +statements or options) provides a sufficient communication mechanism. +In this case the called process may execute the alien-called procedure +only during the ACCEPT statement (because otherwise all procedures +are disabled). It means that the enable mask may be forgotten +altogether and the alien call may be used as a pure totally synchronous +rendez-vous. Other constructs are introduced to make partially +asynchronous communication patterns possible. +

+Below find a complete listing of a simple example - monitors. +

+


+
+

+ + +


+ +
+Last update 02/07/95 +
+ +
+Comments, suggestions and critiques are welcome to : linfo062@crisv2.univ-pau.fr + +
+ + + + diff --git a/HTML/MicroMan/Exceptio.htm b/HTML/MicroMan/Exceptio.htm new file mode 100644 index 0000000..f7686d1 --- /dev/null +++ b/HTML/MicroMan/Exceptio.htm @@ -0,0 +1,104 @@ + + + + + +Exception handling + + + + + + + +

+Loglan 82, A micro-manual of the programming language - +Basic constructs and facilities +

12) Exception handling +

+
+ +

+Exceptions are events that cause interruption of normal program +execution. One kind of exceptions are those which are raised as +a result of some run time errors. For instance, when an attempt +is made to access a killed object, when the result of numeric +operation does not lie within the range, when the dynamic storage +allocated to a program is exceeded etc. +

+Another kind of exceptions are those which are raised explicitly +by a user (with the execution of the raise statement). +

+The response to exceptions (one or more) is defined by an exception +handler. A handler may appear at the end of declarations of any +unit. The corresponding actions are defined as sequences of statements +preceded by keyword when and an exception identifier. +

+Example: +

+In procedure squareeq (p.3) we wish to include the case when a=0. +It may be treated as an exception (division by zero). +

+ +

+The handler declared in that procedure handles the only one exception +(division_by_zero). +

+When an exception is raised, the corresponding handler is searched +for, starting from the active object and going through return +traces. If there is no object containing the declaration of the +handler, then the program (or the corresponding process) is terminated. +Otherwise the control is transferred to the first found handler. +

+In our example the handler is declared within the unit itself, +so control is passed to a sequence: +

+ +

+Therefore, when b=/=0, the unique root of square equation will +be determined and the procedure will be normally terminated (terminate). +In general, terminate causes that all the objects are terminated, +starting from that one where the exception was raised and ending +on that one where the handler was found. Then the computation +is continued in a normal way. +

+In our example, when b=0, a new exception is raised by the user. +For this kind of exceptions , the exception itself should be declared +(because it is not predefined as a run time error). Its declaration +may have parameters which are transmitted to a handler. The exception +declaration need not be visible by the exception handler. However +the way the handler is searched for does not differ from the standard +one. Consider an example: +

+ +

+Exception Wrong_data may be raised wherever its declaration (signal +Wrong_data) is visible. When its handler is found the specified +sequence of actions is performed. In the example above different +handlers may be 0efined in inner units to the main block where +squereeq is called. +

+The case a=0 could be included, of course, in a normal way, i.e. +by a corresponding conditional statement occurring in the procedure +body. But the case a=0 was assumed to be exceptional (happens +scarcely). Thus the evaluation of condition a=0 would be mostly +unnecessary. As can be noticed thanks to exceptions the above +problem can be solved with the minimal waste of run time.


+ +

+ + +


+ +
+Last update 02/07/95 +
+ +
+Comments, suggestions and critiques are welcome to : linfo062@crisv2.univ-pau.fr + +
+ + + + diff --git a/HTML/MicroMan/FormalTy.htm b/HTML/MicroMan/FormalTy.htm new file mode 100644 index 0000000..5406e63 --- /dev/null +++ b/HTML/MicroMan/FormalTy.htm @@ -0,0 +1,66 @@ + + + + + +Formal types + + + + + + + +

+Loglan 82, A micro-manual of the programming language - +Basic constructs and facilities +

9) Formal types

+
+ +

+Formal types serve for unit parametrization with respect to any +non-primitive type. +

+Example: +

+ +

+Procedure Gsort (the generalization of procedure sort from p.4) +has type parameter T. A corresponding actual parameter may be +an arbitrary non-primitive type. An actual parameter corresponding +to A should be an array of elements of the actual type T. Function +less should define the linear ordering on the domain T. +

+For instance, the array A of type bill (cf p.7) may be sorted +with respect to attribute dollars , if the function: +

+ +

+is used as an actual parameter: +

+ +

+If the user desires to sort A with respect to date, it is sufficient +to declare : +

+ +

+and to call: call Gsort(bill,A,earlier);


+ +


+ + +
+ +
+Last update 02/07/95 +
+ +
+Comments, suggestions and critiques are welcome to : linfo062@crisv2.univ-pau.fr + +
+ + + + diff --git a/HTML/MicroMan/HomePage.htm b/HTML/MicroMan/HomePage.htm new file mode 100644 index 0000000..e77b9d7 --- /dev/null +++ b/HTML/MicroMan/HomePage.htm @@ -0,0 +1,25 @@ + + +Loglan Home Page + + + +

Welcome to the Loglan 82 Micro Manual.

+ +
+

Author : Antoni Kreczmar Institute of Informatics, Warsaw University - March 1990 +

Edited by : Andrzej Salwicki LITA, Pau - November 1990 +

HTML version : Karl-Stefan Lapère +


+ + + +
+ +
Last update 02/07/95 +

Comments, suggestions and critiques are welcome to : Andrzej.Salwicki@univ-pau.fr +

+

+ + + diff --git a/HTML/MicroMan/Introduc.htm b/HTML/MicroMan/Introduc.htm new file mode 100644 index 0000000..3744de2 --- /dev/null +++ b/HTML/MicroMan/Introduc.htm @@ -0,0 +1,98 @@ + + + + + +Introduction + + + + + + + +

+Loglan 82, A micro-manual of the programming language - +Basic constructs and facilities +

1) Introduction

+
+ +

+LOGLAN-82 is a universal programming language designed at the +Institute of Informatics, University of Warsaw. Its syntax is +patterned upon Pascal's. Its rich semantics includes the classical +constructs and facilities offered by the Algol-family programming +languages as well as more modern facilities, such as concurrency +and exception handling. +

+The basic constructs and facilities of the LOGLAN-82 programming +language include: +

    +
  • A convenient set of structured statements, +
  • Modularity (with the possibility +of module nesting and extending), +
  • Classes (as a generalization of +records) which enable to define complex structured types, data +structures, packages, etc., +
  • Adjustable arrays whose bounds +are determined at run-time in such a way that multidimensional +arrays may be of various shapes, e.g. triangular, k-diagonal, +streaked, etc., +
  • Coroutines and semi-coroutines, +
  • Prefixing - the facility borrowed +from Simula-67, substantially generalized in LOGLAN-82 - which +enables to build up hierarchies of types and data structures, +problem-oriented languages, etc., +
  • Formal types treated as a method +of module parametrization, +
  • Module protection and encapsulation +techniques, +
  • Programmed deallocator - a tool +for efficient and secure garbage collection, which allows the +user to implement the optimal strategy of storage management, +
  • Exception handling which provides +facilities for dealing with run-time errors and other exceptional +situations raised by the user, +
  • Concurrency easily adaptable to +any operating system kernel and allowing parallel programming +in a natural and efficient way. +
+ +

+The language covers system programming, data processing, and numerical +computations. Its constructs represent the state-of-art and are +efficiently implementable. Large systems consisting of many cooperating +modules are easily decomposed and assembled, due to the class +concept and prefixing. +

+LOGLAN-82 constructs and facilities have appeared and evolved +simultaneously with the experiments on the first pilot compiler +(implemented on Mera-400 Polish minicomputer). The research on +LOGLAN-82 implementation engendered with new algorithms for static +semantics, context analysis, code generation, data structures +for storage management etc. +

+The LOGLAN-82 compiler provides a keen analysis of syntactic and +semantic errors at compilation as well as at run time. The object +code is very efficient with respect to time and space. The completeness +of error checking guarantees full security and ease of program +debugging.


+ +


+ + + +
+ +
+Last update 02/07/95 +
+ +
+Comments, suggestions and critiques are welcome to : linfo062@crisv2.univ-pau.fr + +
+ + + + diff --git a/HTML/MicroMan/Prefixin.htm b/HTML/MicroMan/Prefixin.htm new file mode 100644 index 0000000..0c140af --- /dev/null +++ b/HTML/MicroMan/Prefixin.htm @@ -0,0 +1,237 @@ + + + + + +Prefixing + + + + + + + +

+Loglan 82, A micro-manual of the programming language - +Basic constructs and facilities +

8) Prefixing

+
+ +

+Classes and prefixing are ingenius inventions of Simula-67(cf +[1]). Unfortunately they were hardly ever known and, perhaps, +by this have not been introduced into many programming language +that gained certain popularity. Moreover, implementation constraints +of Simula-67 bind prefixing and classes workableness to such a +degree that both facilities cannot be used in all respects. We +hope that LOGLAN-82, adopting merits and rooting up deficiencies +of these constructs, will smooth their variations and vivify theirs +usefulness. +

+What is prefixing ? First of all it is a method for unit extending. +Consider the simplest example: +

+ +

+Assume the user desires to extend this class with new attributes. +Instead of writing a completely new class, he may enlarge the +existing one: +

+ +

+Class gas_bill is prefixed by class bill. This new declaration +may appear anywhere within the scope of declaration of class bill. +(In Simula-67 such a prefixing is forbidden in nested units.) +Class gas_bill has all the attributes of class bill and additionally +its own attributes (in this case the only one: cube_meters). The +generation statement of this class has the form: +

+ +

+where z is a reference variable of type gas_bill. Remote access +to the attributes of prefixed class is standard: +

+ +

+Consider now the example of a class with parameters. +

+Assume that in a program a class: +

+ +

+and its extension: +

+ +

+are declared. +

+Then for variable z of type id_card and variable t of type idf_card +the corresponding generation statement may be the following: +

+ +

+Thus the formal parameters of a class are concatenated with the +formal parameters of its prefix. +

+One can still extend class idf_card. For instance: +

+ +

+Prefixing allows to build up hierarchies of classes. Each one +hierarchy has a tree structure. A root of such a tree is a class +without prefix. One class is a successor of another class iff +the first is prefixed by the latter one. +

+Consider the prefix structure: +

+ +

+Class H has a prefix sequence A, B, E, F, H. Let a, b, ... , h +denote the corresponding unique attributes of classes A, B, ... +, H, respectively. The objects of these classes have the following +forms: +

+ +

+Let Ra, Rb,..., Rh denote reference variables of types A, B,..., +H, respectively. Then the following expressions are correct: +

+ +

+Variable Ra may designate the object of class B (or C,..., H), +i.e. the statement: +

+ +

+is legal. But then attribute b is not accessible through dot via +Ra, i.e. Ra.b is incorrect. This follows from insecurity of such +a remote access. In fact, variable Ra may point any object of +a class prefixed by A, in particular, Ra may point the object +of A itself, which has no attribute b. If Ra.b had been correct, +a compiler should have distiguish the cases Ra points to the object +of A or not. But this, of course, is undistinguishable at compilation +time. +

+To allow, however, the user's access to attribute b (after instruction +Ra:=new B), the instantaneous type modification is provided +within the language: +

+ +

+The correctness of this expression is checked at run time. If +Ra designates an object of B or prefixed ba B, the type of the +expression is B. Otherwise the expression is erroneous. Thus, +for instance, the expressions: +

+ +

+enable remote access to the attributes b, c, ... via Ra. +

+So far the question of attribute concatenation was merely discussed. +However the sequences of statements can be also concatenated. +

+Consider class B prefixed with class A. In the sequence of statements +of class A the keyword inner may occur anywhere, but only once. +The sequence of statements of class B consists of the sequence +of statements of class A with inner replaced by the sequence of +statements of class B. +

+ +

+In this case inner in class B is equivalent to the empty statement. +If class B prefixes another class, say C, then inner in B is replaced +by the sequence of statements of class C, and so on. If inner +does not occur explicitly, an implicit occurrence of inner before +the final end of a class is assumed. +

+Example +

+Let class complex be declared as usual: +

+ +

+and assume one desires to declare a class mcomplex with the additional +attribute module. In order the generation of class mcomplex define +the value of attribute module, one can declare a class: +

+ +

+Class mcomplex may be still extended: +

+ +

+For these declarations each generation of class mcomplex defines +the value of attribute module, each generation of class pcomplex +defines the values of attributes module and alfa. +

+For reference variables z1, z2 z3 of type complex, the following +sequence of statements illustrates the presented constructs: +

+ +

+Example: +

+Binary search tree (Bst) is a binary tree where for each node +x the nodes in the left subtree are less than x, the nodes in +the right subtree are greater than x. It is the well-known exercise +to program the algorithms for the following operations on Bst: +

+member(x) = true iff x belongs to Bst +

+insert(x), enlarge Bst with x, if x does not yet belong to Bst +

+We define both these operations in a class: +

+ +

+In the example the common actions of member and insert are programmed +in class help. Then it suffices to use class help as a prefix +of function member and procedure insert, instead of redundant +occurrences of the corresponding sequence of statements in both +units. +

+Class Bst may be applied as follows: +

+ +

+As shown in the declaration of Bst, class may prefix not only +other classes but also procedures and functions. Class may prefix +blocks as well. +

+Example: +

+Let class push_down (p. 5) prefix a block: +

+ +

+In the above block prefixed with class push_down one can use pop +and push as local attributes. (They are local since the block +is embedded in the prefix push down.) +

+Example: +

+ +

+In place where classes push_down and Bst are visible together +a block prefixed with Bst may be nested in a block prefixed with +push_down (or vice versa). In the inner block both data structures +are directly accessible. Note that this construct is illegal in +Simula 67.


+ +


+ + +
+ +
+Last update 02/07/95 +
+ +
+Comments, suggestions and critiques are welcome to : linfo062@crisv2.univ-pau.fr + +
+ + + + diff --git a/HTML/MicroMan/Procedur.htm b/HTML/MicroMan/Procedur.htm new file mode 100644 index 0000000..b03aef6 --- /dev/null +++ b/HTML/MicroMan/Procedur.htm @@ -0,0 +1,170 @@ + + + + + +Procedures and functions + + + + + + + +

+Loglan 82, A micro-manual of the programming language - +Basic constructs and facilities +

4) Procedures and +functions

+
+ +

+Procedures and functions are well-known kinds of units. Their +syntax is modelled on Pascal's, though with some slight modifications. +Procedure (function) declaration consists of a specification part +and a body. +

+Example: +

+ +

+Procedure or function specification begins with its identifier +preceded by the keyword unit. (The same syntax concerns any other +module named unit.) Then follows its kind declaration, its formal +parameters (if any), and the type of the returned value (only +for functions). A body consists of declaration lists for local +entities and a sequence of statements. The keyword begin +commences the sequence of statements, and is omitted, if this +sequence is empty. The value returned by a function equals to +the most recent value of the standard variable "result", +implicitly declared in any function. This variable can be used +as a local auxiliary variable as well. +

+Example: +

+ +

+The optional identifier at the end of a unit must repeat the identifier +of a unit. It is suggested that the compilers check the order +of unit nesting, so these optional occurrences of identifiers +would facilitate program debugging. +

+All the local variables of a unit are initialized (real with 0.0, +integer with 0, boolean with false etc.). Thus , for instance, +the value of function Newton is 0 for m&gtn, since "result" +is also initialized, as any other local variable. +

+The return statement (return) completes the execution of a procedure +(function) body,i.e. return is made to the caller. If return does +not appear explicitly, return is made with the execution of the +final end of a unit. Upon return to the caller the procedure (function) +object is deallocated. +

+Functions are invoked in expressions with the corresponding list +of actual parameters. Procedures are invoked by call statement +(also with the corresponding list of actual parameters). +

+Example: +

+ +

+Formal parameters are of four categories: variable parameters, +procedure parameters, function parameters and type parameters +(cf p.8). Variable parameters are considered local variables to +the unit. A variable parameter has one of three transmission modes: +input, output or inout. If no mode is explicitly given the input +mode is assumed. For instance in the unit declaration: +

+ +

+x,y,b are input parameters , c,i are output parameters , and j +is inout parameter. +

+Input parameter acts as a local variable whose value is initialized +by the value of the corresponding actual parameter. Output parameter +acts as a local variable initialized in the standard manner (real +with 0.0, integer with 0, boolean with false etc.). Upon return +its value is assigned to the corresponding actual parameter, in +which case it must be a variable. However the address of such +an actual parameter is determined upon entry to the body. Inout +parameter acts as an input parameter and output parameter together. +

+Example: +

+ +

+A procedure call to the above unit may be the following: +

+ +

+where g,h,gi,hi are real variables. +

+No restriction is imposed on the order of declarations. In particular, +recursive procedures and functions can be declared without additional +announcements (in contrast to Pascal). +

+Example: +

+For two recursive sequences defined as: +

+a(n)=b(n-1)+n+2 n>0 +

+b(n)=a(n-1)+(n-1)*n n>0 +

+a(0)=b(0)=0 +

+one can declare two functions: +

+ +

+and invoke them: +

+k:=a(100)*b(50)+a(15); +

+Functions and procedures can be formal parameters as well. +

+Example: +

+ +

+In the above declaration, after the input variable parameters +a,b,eps and the output variable parameter x, a function parameter +f appears. Note that its specification part is complete. Thus +the check of actual-formal parameter compatibility is possible +at compilation time. Making use of this syntactic facility is +not possible in general, if a formal procedure (function) is again +a formal parameter of a formal procedure (function). The second +degree of formal procedures (functions) nesting is rather scarce, +but LOGLAN-82 admits such a construct. Then formal procedure (function) +has no specification part and the full check of actual-formal +parameter compatibility is left to be done at run time. +

+Example: +

+ +

+Procedure G is a first degree parameter, therefore it occurs with +complete specification part. Procedure H is a second degree parameter +and has no specification part. In this case a procedure call can +be strongly recursive: +

+


+ +

+ + + +


+ +
+Last update 02/07/95 +
+ +
+Comments, suggestions and critiques are welcome to : linfo062@crisv2.univ-pau.fr + +
+ + + + diff --git a/HTML/MicroMan/Programm.htm b/HTML/MicroMan/Programm.htm new file mode 100644 index 0000000..ea2b042 --- /dev/null +++ b/HTML/MicroMan/Programm.htm @@ -0,0 +1,111 @@ + + + + + +Programmed deallocation + + + + + + + +

Loglan 82, A micro-manual of the programming language +- Basic constructs and facilities

+ +

11) Programmed deallocation +

+
+ +

+The classical methods implemented to deallocate class objects +are based on reference counters or garbage collection. Sometimes +the both methods may be combined. A reference counter is a system +attribute holding the number of references pointing to the given +object. Hence any change of the value of a reference variable +X is followed by a corresponding increase or decrease of the value +of its reference counter. When the reference counter becomes equal +0, the object can be deallocated. +

+The deallocation of class objects may also occur during the process +of garbage collection. During this process all unreferenced objects +are found and removed (while memory may be compactified). In order +to keep the garbage collector able to collect all the garbage, +the user should clear all reference variables , i.e. set to None, +whenever possible. This system has many disadvantages. First of +all, the programmer is forced to clear all reference variables, +even those which are of auxiliary character. Moreover, garbage +collector is a very expensive mechanism and thus it can be used +only in emergency cases. +

+In LOGLAN a dual operation to the object generator, the so-called +object deallocator is provided. Its syntactic form is as follows: +

+ +

+where X is a reference expression. If the value of X points to +no object (none) then kill(X) is equivalent to an empty statement. +If the value of X points to an object O, then after the execution +of kill(X), the object O is deallocated. Moreover all reference +variables which pointed to O are set to none. This deallocator +provides full security, i.e. the attempt to access the +deallocated object O is checked and results in a run-time error. +

+For example: +

+ +

+causes the same run-time error as: +

+ +

+The system of storage management is arranged in such a way that +the frames of killed objects may be immediately reused without +the necessity of calling the garbage collector, i.e. the relocation +is performed automatically. There is nothing for it but to remember +not to use remote access to a killed object. (Note that the same +problem appears when remote access X.W is used and X=none). +

+Example: +

+Below a practical example of the programmed deallocation is presented. +Consider class Bst (p.7). Let us define a procedure that deallocates +the whole tree and is called with the termination of the class +Bst. +

+ +

+Bst may be applied as a prefix: +

+ +

+and automatically will cause the deallocation of the whole tree +after return to call kill_all(root) from the prefixed block. +

+To use properly this structure by remote accessing one must call +kill_all by himself: +

+ +

+Finally note that deallocator kill enables deallocation of array +objects, and suspended coroutines and processes as well (cf p.13). +


+ +


+ + +
+ +
+Last update 02/07/95 +
+ +
+Comments, suggestions and critiques are welcome to : linfo062@crisv2.univ-pau.fr + +
+ + + + diff --git a/HTML/MicroMan/Protecti.htm b/HTML/MicroMan/Protecti.htm new file mode 100644 index 0000000..a8a993e --- /dev/null +++ b/HTML/MicroMan/Protecti.htm @@ -0,0 +1,75 @@ + + + + + +Protection techniques + + + + + + + +

Loglan 82, A micro-manual of the programming language +- Basic constructs and facilities

+ +

10) Protection techniques +

+
+ +

+Protection techniques ease secure programming. If a program is +large, uses some system classes, is designed by a team etc., this +is important (and non-trivial) to impose some restrictions on +access to non-local attributes. +

+Let us consider a data structure declared as a class. Some of +its attributes should be accessible for the class users, the others +should not. For instance, in class Bst (p.7) the attributes member +and insert are to be accessible. On the other hand the attributes +root, node and help should not be accessible, even for a meddlesome +user. An improper use of them may jeopardize the data structure +invariants. +

+To forbid the access to some class attributes the three following +protection mechanisms are provided: close, hidden +and taken. +

+The protection close defined in a class forbids remote access +to the specified attributes. For example, consider the class declaration: +

+ +

+Remote access to the attributes x,y,z from outside of A is forbidden. +

+The protection hidden (with akin syntax) does not allow to use +the specified attributes form outside of A neither by the remote +access nor in the units prefixed by A. The only way to use a hidden +attribute is to use it within the body of class A. +

+Protection taken defines these attributes derived from prefix, +which the user wishes to use in the prefixed unit. Consider a +unit B prefixed by a class A. In unit B one may specify the attributes +of A which are used in B. This protects the user against an unconscious +use of an attribute of class A in unit B (because of identifier +conflict). When taken list does not occur, then by default, all +non-hidden attributes of class A are accessible in unit B.


+ +


+ + +
+ +
+Last update 02/07/95 +
+ +
+Comments, suggestions and critiques are welcome to : linfo062@crisv2.univ-pau.fr + +
+ + + + diff --git a/HTML/MicroMan/Referenc.htm b/HTML/MicroMan/Referenc.htm new file mode 100644 index 0000000..1ea44ba --- /dev/null +++ b/HTML/MicroMan/Referenc.htm @@ -0,0 +1,60 @@ + + + + + +References + + + + + + + +

Loglan 82, A micro-manual of the programming language +- Basic constructs and facilities

+ +

14) References

+
+ +

+Report on the Loglan 82 programming Language Bartol, Warszawa-Lodz, +PWN, 1984 +

+Simula 67 Common Base Language O.-J. Dahl, B. Myhrhaug, +K. Nygaard, Norwegian Computing Center, Oslo, 1970 +

+Monitors, an operating system structuring concept Hoare +C.A.R., CACM, vol.17,N.10, October 1974, pp.549-57 +

+Loglan'82 User's guide, Institute of Informatics, University +of Warsaw 1983-1988, LITA, Université de Pau et +des pays de l'Adour, 1993 +

+Loglan'88 - Report on the Programming Language A.Kreczmar, +A.Salwicki, M. Warpechowski, , +

+Lecture Notes on Computer Science vol. 414, Springer +Vlg, 1990, ISBN 3-540-52325-1 +

+LOGLAN, Wydawnictwa Naukowo-Techniczne, A.Szalas, J.Warpechowska, +Warszawa, 1991 ISBN 82-204-1295-1 (if you can read polish) +


+ +

+ + +


+ +
+Last update 02/07/95 +
+ +
+Comments, suggestions and critiques are welcome to : linfo062@crisv2.univ-pau.fr + +
+ + + + diff --git a/HTML/MicroMan/TableOfC.htm b/HTML/MicroMan/TableOfC.htm new file mode 100644 index 0000000..77a40fb --- /dev/null +++ b/HTML/MicroMan/TableOfC.htm @@ -0,0 +1,55 @@ + + + + + +Table of contents + + + + + + + +

+Loglan 82, A micro-manual of the programming language - +Basic constructs and facilities +

Table of contents +

+
+ +
    +
  1. Introduction +
  2. Compound statements +
  3. Modularity +
  4. Procedures and functions +
  5. Classes +
  6. Adjustable arrays +
  7. Coroutines and semicoroutines +
  8. Prefixing +
  9. Formal types +
  10. Protection techniques +
  11. Programmed deallocation +
  12. Exception handling +
  13. Concurrent processes +
  14. References +
+
+
+

+ + +


+
+
+Last update 02/07/95 +
+ +
+Comments, suggestions and critiques are welcome to : linfo062@crisv2.univ-pau.fr + +
+ + + + diff --git a/HTML/MicroMan/adjustab.htm b/HTML/MicroMan/adjustab.htm new file mode 100644 index 0000000..f1a8c92 --- /dev/null +++ b/HTML/MicroMan/adjustab.htm @@ -0,0 +1,110 @@ + + + + + +Adjustable arrays + + + + + + + +

Loglan 82, A micro-manual of the programming language +- Basic constructs and facilities

+ +

6) Adjustable arrays +

+
+ +

+In LOGLAN-82 arrays are adjustable at run time. They may be treated +as objects of specified standard type with index instead of identifier +selecting an attribute. An adjustable array should be declare +somewhere among the lists of declarations and then may be generated +in the sequence of statements. +

+Example: +

+ +

+A variable A is an array variable. Its value should be the reference +to an integer array, i.e. a composite object consisting of integer +components each one defined by an integer index. +

+Array generation statement: +

+ +

+allocates a one-dimensional integer array with the index bounds +1,n , and assigns its address to variable A. +

+The figure below illustrates this situation: +

+ +

+A general case of array generation statement has the form: +

+ +

+where lower and upper are arithmetic expressions which define +the range of the array index. +

+Example: +

+Two-dimensional array declaration : +

+ +

+and generation: +

+ +

+create the structure: +

+ +

+ +

+Array A is the square array n by n. Each element A(i) , 1<=i<=n +contains the address of row A(i,j), 1<=j<=n. Array B is +the lower-triangular array. Each element B(i), 1<=i<=n, +contains the address of row B(i,j), 1<=j<=i. Thus an assignment +statement A(n,n):=B(n,n) transmits real value B(n,n) to real variable +A(n,n). Assignment B(1):=A(1) transmits the address of the first +row of A to variable B(1). Finally assignment B(1):=copy (A(1)) +creates a copy of the first row of A and assigns its address to +B(1). +

+Upper and lower bounds of an adjustable array A are determined +by standard operators lower(A) and upper(A). +

+Example: +

+ +

+If an array variable A refers to no array its value is equal none +(the standard default value of any array variable). An attempt +to access an array element (e.g. A(i)) or a bound (e.g. lower(A)), +where A is none, raises a run time error.


+ +

+


+ + + +
+ +
+Last update 02/07/95 +
+ +
+Comments, suggestions and critiques are welcome to : linfo062@crisv2.univ-pau.fr + +
+ + + + diff --git a/HTML/MicroMan/compound.htm b/HTML/MicroMan/compound.htm new file mode 100644 index 0000000..cb9ee77 --- /dev/null +++ b/HTML/MicroMan/compound.htm @@ -0,0 +1,217 @@ + + + + + +Compound Statements + + + + + + + +

Loglan 82, A micro-manual of the programming language +- Basic constructs and facilities

+ +

2) Compound Statements +

+
+ +

+Compound statements in LOGLAN-82 are built up from simple statements +(like assignment statement e.g. x:=y+0.5, call statement e.g. +call P(7,x+5) etc.) by means of conditional, iteration and case +statements. +

+The syntax of conditional statement is as follows: +

+ +

+where "else part" may be omitted: +

+ +

+The semantics of conditional statement is standard. The keyword +fi allows to nest conditional statements without appearence +of "dangling else" ambiguity. +

+Example: +

+ +

+The statements in a sequence of statements are separated with +semicolons (semicolon may end a sequence , and then, the last +statement in the sequence is the empty statement). +

+The short circuit control forms are realized in LOGLAN-82 by the +conditional statements with orif (or andif) list. +A conditional statement with orif list has the form: +

+ +

+and corresponds somehow to a conditional statement: +

+ +

+The above conditional statement (without orif list) selects for +execution one of two sequences of statements, depending on the +truth value of the boolean expression: +

+ +

+which is always evaluated till the end. For the execution of the +conditional statement with orif list the specified conditons +wb1,...,wbk are evaluated in succession, until the first one evaluates +to true. Then the rest of the sequence wb1,...,wbk is abandoned +and "then part" is executed. If none of the conditions +wb1,...,wbk evaluates to true "else part" is +executed (if any). +

+Conditional statements with orif list facilitate to program +those conditions, which evaluation to the end may raise a run-time +error. +

+Example: +

+The execution of the statement: +

+ +

+where the value of i is greater than n, and A is an array with +upper bound n, will raise the run-time error. Then the user can +write: +

+ +

+what allows to avoid this run-time error and probably agrees with +his intension. +

+Conditional statement with andif list has the form: +

+ +

+For the execution of this kind of statements, the conditions wb1,...,wbk +are evaluated in succession, until the first one evaluates to +false; then "else part" (if any) is executed. +Otherwise "then part" is executed. +

+Iteration statement in LOGLAN-82 has the form: +

+ +

+An iteration statement specifies repeated execution of the sequence +of statements and terminates with the execution of the simple +statement exit +

+Example: +

+ +

+If two iteration statements are nested, then double exit +in the inner one terminates both of them. +

+Example: +

+ +

+In the example above simultaneous assignment statements are illustrated +(e.g. r,x:=0) and comments, which begin with a left parenthesis +immediately followed by an asterisk and end with an asterisk immediately +followed by a right parenthesis. +

+Triple exit terminates three nested iteration statements, +four exit terminates four nested iteration statements etc. +

+The iteration statement with while condition: +

+ +

+is equivalent to: +

+ +

+The iteration statements with controlled variables (for statements) +have the forms: +

+ +

+or +

+ +

+The type of the controlled variable j must be discrete. The value +of this variable in the case of the for statement with to is increased, +and in the case of the for statement with downto +is decreased. The discrete range begins with the value of wa1 +and changes with the step equal to the value of wa2. The execution +of the for statement with to terminates when the value +of j for the first time becomes greater than the value of wa3 +(with downto when the value of j for the first time becomes less +than the value of wa3). After the for statement termination the +value of its controlled variable is determined and equal to the +first value exceeding the specified discrete range. +

+The values of expressions wa1, wa2 and wa3 are evaluated once, +upon entry to the iteration statement. Default value of wa2 is +equal 1 (when the keyword step and expression wa2 are omitted). +

+For or while statements may be combined with exit +statement. +

+Example: +

+ +

+The above iteration statement terminates either for the least +j, 1<=j<=n, such that x=A(j) or for j=n+1 when x=/=A(j), +j=1,...,n. +

+To enhance the user's comfort, the simple statement repeat +is provided. It may appear in an iteration statement and causes +the current iteration to be finished and the next one to be continued +(something like jump to CONTINUE in Fortran's DO statements). +

+Example: +

+ +

+Just as exit, repeat may appear in for statement +or while statement. Then the next iteration begins with +either the evaluation of a new value of the controlled variable +(for statement) or with the evaluation of the condition +(while statement). +

+Case statement in LOGLAN-82 has the form: +

+ +

+where WA is an expression , L1,...,Lk are constants and I1,..., +Ik,I are sequences of statements. +

+A case statement selects for execution a sequence of statements +Ij, 1<=j<=k, where the value of WA equals Lj. The choice +otherwise covers all values (possibly none) not given in +the previous choices. The execution of a case statement +chooses one and only one alternative (since the choices are to +be exhaustive and mutually exclusive).


+ +

+


+ + + +
+ +
+Last update 02/07/95 +
+ +
+Comments, suggestions and critiques are welcome to : linfo062@crisv2.univ-pau.fr + +
+ + + + diff --git a/HTML/MicroMan/coroutin.htm b/HTML/MicroMan/coroutin.htm new file mode 100644 index 0000000..34e023e --- /dev/null +++ b/HTML/MicroMan/coroutin.htm @@ -0,0 +1,92 @@ + + + + + +Coroutines and semicoroutines + + + + + + + +

Loglan 82, A micro-manual of the programming language +- Basic constructs and facilities

+ +

7) Coroutines and +semicoroutines

+
+ +

+Coroutine is a generalization of class. A coroutine object is +an object such that the execution of its sequence of statements +can be suspended and reactivated in a programmed manner. Consider +first a simple class with a sequence of statements such that after +return some non-executed statements remain. The generation of +its object terminates with the execution of return statement, +although the object can be later reactivated. If such a class +is declared as a coroutine, then its objects may be reactivated. +This can be realized by an attach statement: +

+attach(X)
+
+ +

+where X is a reference variable designating the activating coroutine +object. +

+In general, since the moment of generation a coroutine object +is either active or suspended. Any reactivation of a suspended +coroutine object X (by attach(X)) causes the active coroutine +object to be suspended and continues the execution of X from the +statement following the last executed one. +

+Main program is also a coroutine. It is accessed through the standard +variable main and may be reactivated (if suspended) by the statement +attach(main). +

+Example: +

+In the example below the cooperation of two coroutines is presented. +One reads the real values from an input device, another prints +these values in columns on a line-printer, n numbers in a line. +The input stream ends with 0. +

+ +

+Then +

+ +

+In the example below the application of detach statement is illustrated. +

+Example: +

+ +

+Coroutines play the substantial role in process simulation. Class +Simulation provided in Simula-67 makes use of coroutines at most +degree. LOGLAN-82 provides for easy simulation as well. The LOGLAN-82 +class Simulation is implemented on a heap what gives lg(n) time +cost (in contrast with O(n) cost of the original implementation). +It covers also various simulation problems of large size and degree +of complexity.


+
+

+ + +


+ +
+Last update 02/07/95 +
+ +
+Comments, suggestions and critiques are welcome to : linfo062@crisv2.univ-pau.fr + +
+ + + + diff --git a/HTML/MicroMan/gifs/HomePage.gif b/HTML/MicroMan/gifs/HomePage.gif new file mode 100644 index 0000000000000000000000000000000000000000..da7870489cdb021d406b56f5885313f0ab8a37ac GIT binary patch literal 1485 zcmV;;1v2_aNk%v~VPpVC0M!5h|NsBq=l}Qj|L5ob-roPMt@o{^_ukh3t(^C*l=sfP z_wVQb*2ee7t@o{j@7BHd&aL;Yd+)}a_pNj9-p2R$@Bi=K|JJql&ZYOQYwx96@4bZY ztz++;Lg&t$_q}`Xty=G#Ip@xl_r{FxrAp_VG3W2r|Hg#xr9$VNDd(+9=cPI4r7`Em zd+)76=cOs<_vinuIp?Jz=cO3ur4Z-$-v9U3|L?~4|M&m@@BaV*000000000000000 z00000EC2ui0Av70000L6K!9*aEE2dn74a)DA?dU|~|Fo-oZ7Kkv9c5Z@`V*+-MFpVYz44n)I zpcW>MWoMM9Mr(YTq7p$D%plK!gL}u4^^xSy3LSI|ez9vYAt8y6AU`I|5TPChaG?6+5TKY0dR;*ybLgxzq6e1@$NFWTE$~P{fJhL!!TSuHcUr3$GbA?Ef35b0n07FeuDd%e3 zU~mD$hzK5czL3FoMhdqwQoJYuR6~ZLCqMCP`PB&yLrfo-{gBWFi?uRlC|<0X?OdyN z9Y}!Ci7T_dOw8bs2|>b%2_SMJW=y*A+`18nKA^yr4N}ZV0A|W)7A=XLZAsIZv0HHp z8FNW!5Q+e0fMu^?rxJkif`=0bQ5;UZc(--Mz1_YDAv^*C2*(2CNv^yI4m>qX{Boy( zL<|U%ivFRoN-q$IfR+j? z02-*5Hl}djp#|)B9HWim0fS5zc$TGfTy{vGZ!gHHL2BUfSiyu-KEo%55foTysthKn zU7?2>u%mc);yDChkb2<2iw3@cU}^OMSLmFnbt=no{TVw4G-Uay!iKz(##Ra?EEz0i z1lTG6rM6w5H;`wxZ5S6@^g5=gtHfbY*>MuGI|m*M+}fD~lin7BTq*n}R|)0fo0S)GkQ@WvW|un`xr30QT))yS7AJ@%||c&^wd{x{q@*Op~Ln%48eW( zlYGzpl-n0k{we2=PvQCAgHH+j?3Wim0P_a|zx(pzPrv)(@Bh93MEIW((#Jpb`A>ZU zjDz_8hrsfU?}6Qep#Bb6KmZcZg7ve){2Yis4hrFd_Z#2@0~kT@dGLcHtilFMNW%T0 z@P!MUVEq>8LKntR4lAr73{A*G9U>uzFFarn!>2zE@{ol!G~y83XFesau!nF+AOi(B n#S&U^h6Y3-75mq}>?t9HUUWkIG8o1qfU%5C=pq`E5(EG{h0wyu literal 0 HcmV?d00001 diff --git a/HTML/MicroMan/gifs/NextPage.gif b/HTML/MicroMan/gifs/NextPage.gif new file mode 100644 index 0000000000000000000000000000000000000000..4f510e0ea210f9405743d3419223818c577ac7e7 GIT binary patch literal 2018 zcmcJM`B##O8pl}#1k^B5u`G83(;3rD$t6Y6+!`{nLQ_ktQR}K{T}$tb3#j0dI%uYp zBH}{x-qDVf)n!HqNh`M&DyKMQ%d2+lHLZEAndZIpN8IlZ&-s2o&pFRI-}6L8M+W#G z$UsG+UZYTmQ80o)Uk3~$u+e}BY(QW=0zn7_B9H-rj9zEN2nZt}gn%Fd8W2#AfJUf- zK_v_VumMC22E?F83_94Lf(=U8V1#nmAc6HdSg(ThN>~rTdSevBdOkD(z!P$KLIO{S z;R$0bf+q4IoeI_guucx^B(Saq((xf(5u`KnY)F?5spPPV52=bERX(K3hEztvgH#ES zDh5*4K*}OWnGY$mA!RzGe5s(s8Svg-& zfkF$>CKwZ(iAY%alenq*Y|FVSG!BPvC$!_wi(0#Tdb@?^@dUD&x!EN%sZ8ECbhWRV zX1B)4+1}d5+L}5*ZpUF7u1!n|M0h(V7lzM9UmrI|hjrEi()0D>Q?G~6c(N12*DokI zXiK1s*CpCS#T^@4tWYCbuT>(vH7J(bUmt&Q|<7 zigUD&{3Vr<&}sjEpj=1F(PcbXxZj%`RVp#tyuwL$ZSvZ71r^+PX|&GHms{vq5%z+yWKOPslph=w2GK=r3==%;$oA-ei?u{I26YWaN zJKV}iF%h>RAOha8}i866Z1cC4zh*AYkS!czCF@oGJPS zc}+%%8f$_=dG>QX95rTa8hKs&_`;`G7w?ra+xF~BL*uMswTmp%8P=57P+mNvYREUp zNnn%2>Hcs1yoGR9NIEjpY)qGz(+ zlFf^cSJ&3Xm1z2~2t89%cslc3J^fZCTYLE%DIZ7m_LlsXaBOfpy82dsxlEzCskjz_ z7e1sVS6Sk1(vqJ?Sj9?E8r;pQ@`B&0T`8q_?NSLlW81Y`Sp{z4{uQ(&?HfNU&wh@E z5OF0=KTYmT&I>1dN=jA*#Mf%> z)Jg+8L;W^BO54!oVufVAR06adL>usEN<)Mxy9RS*t|zz5eDS7e!a``H0`>44_FspZ zQ{QWs#($UmaCo+vU9%9`XUQR*TrB_C`z~0io@v)s3XpR-Cne-cAJU4CKcGQThZ9bB zQ?7*6&S$*1fkyek{}Gv1mh%Ij)do$Mlz(s}{(J24b$XS6{#QrwxG&l?fFQB8;Z(e0 zgobfK%N;uEwulc>YSHa3|@=f(AjmIPQ*CmOaEaKf}7Mv=N#UwqSGftQtzRsK&lKVN_q{&45VW z{ezboXp_}XXAk?!)WpQ2Q`T(p_iQH+Ap$G9TBT zRn>TDb8lpn%7fb=dcYbL_r&g3#8)e%Ef#(kS#K44k`#Bl>%>1NoLkuYRP;c2{3DPG h^s=xbvSP{4)_(Uw>bIXcYK!Lnlfg&*v1nA_{{R4Cr&0g_ literal 0 HcmV?d00001 diff --git a/HTML/MicroMan/gifs/PrevPage.gif b/HTML/MicroMan/gifs/PrevPage.gif new file mode 100644 index 0000000000000000000000000000000000000000..52968013b5528eea1f5881a325353ad066c32279 GIT binary patch literal 2044 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 A2mk;8 literal 0 HcmV?d00001 diff --git a/HTML/MicroMan/gifs/aa02.gif b/HTML/MicroMan/gifs/aa02.gif new file mode 100644 index 0000000000000000000000000000000000000000..988a7f8bf41459e4eef4932b8d386e0aa14dbc68 GIT binary patch literal 166 zcmV;X09pS>Nk%v~VOanU0Du4h|Ns90001li0001401f~E0)>Q+smtvTqnxzbi$e?A z^!R-nmN}vno{Wlc9>8g?3(u###2#)d;t#7GLWz!X_zEhQFV!*m1h#TXW|2nR5pT%p zGFr8=p4KiI+`Q_%S#-Fp%=)0_FxN}Zlf~5UMy9hi(>0Xx6Bq+nBejTx=tn{riDDs_ U!7}-PxgweA`3V{-dQkuXJD;9PXaE2J literal 0 HcmV?d00001 diff --git a/HTML/MicroMan/gifs/aa03.gif b/HTML/MicroMan/gifs/aa03.gif new file mode 100644 index 0000000000000000000000000000000000000000..7014e297b594abda9f2e4d87733c746fb646448b GIT binary patch literal 230 zcmVy-nsmtvTqnxzbi?iOm zdmIE$C?4TelHb~tZ05Exn9T2Mo2Nml{jTEu7^0jI7z7N7idgVhL@Hg>=oGoT3a5zN zDVx-8!Qq;cXw~U@Of%1PE}q}q7Cm*J&$I9ad)qbhcV)CxlLko0*VWV)_qb%#hqw0@ z>F0;I$oJ(WNtIcb2-U_&S4nAVSIH{p_Il`(G^nVCCKlVtMvA$H1y_}_c^F3)eAIXo gsEooKA!s4_LF@cnEpt2}ea+qN{S6*2u228~JGxbG!T5w%s#=<}%T0xG#dG4xKS)}`j`e!I8!00SjuL=@+S7tz&tWcP^XhvfCO zDCpo=S-A$rm)CN5M!1xy6}cdY`9k#e$JPf&`T2^f7B>_7S4+E_Dq2{Si`X_1J0`c; zlv!$tG|30nC5hZg3JqvQeJfjwD;-_DGrmb~jB4I0fu0UB-JY5ZKW98|e~+K9zt7+A K{|^vf0RTHGqJ3fj literal 0 HcmV?d00001 diff --git a/HTML/MicroMan/gifs/aa05.gif b/HTML/MicroMan/gifs/aa05.gif new file mode 100644 index 0000000000000000000000000000000000000000..72c515db359affed66f69131951adaef74ea8d73 GIT binary patch literal 480 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 CcM&xJ literal 0 HcmV?d00001 diff --git a/HTML/MicroMan/gifs/aa07.gif b/HTML/MicroMan/gifs/aa07.gif new file mode 100644 index 0000000000000000000000000000000000000000..282621406aa2deb48fe4bd5664307ed09179d58f GIT binary patch literal 1994 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 literal 0 HcmV?d00001 diff --git a/HTML/MicroMan/gifs/cl01.gif b/HTML/MicroMan/gifs/cl01.gif new file mode 100644 index 0000000000000000000000000000000000000000..443b7980f831340846c7dac1e5cdf3fa582894de GIT binary patch literal 664 zcmV;J0%!e4Nk%v~Vb%aV0Du4h|Ns90001li0002i06YKy0{?`MsmtvTqnxzbi!%rT zarY&i!Hrvpm8QnF?hA|SGSgy<#`?}f>h~j+4nfB7G)vwZD$nXDJQhj4s+HCW0ZqA_ zZ9`m!C0efeB$Qp(Y%Cg$>eiNAF_k=*$Dz%(-@28y=k%s9Qs-g!P)2m-RhafCx${$L z**J%E*c3FC8MWEhDcUzSd5W6K_Nm(H`WnFsJ4;(@dyAW^yUW|_`}-J$`RfWrJi)4T z+$wujDGVBnW%gt@SSH=;7}}^fNm^*Uc!vm(stgUEziv%h z&Acrg8FcFK*?V`6UqXH6{;ATlCEGM^nzHz_NR3`DYX43$R$QnsWJrx7OWq=BGNsCu zEL*yK39|x9BWl)3G;|Z@%z^xN?$pKyTc&x#iu!u8hodPZ0!!(#he#IGcTp8irPA(R z!!bW4UEKu~L|ukH#i1&bHgkcfngB*iEc7$&7mKNi-+ zG>*%zF?leaWhrOlHIFA-zKl7u=FOaO^kw%jZ0B#@zMQ-q=MG8xE|HB%*7sU=7HofSo_9QI^j zgu6X&2t7hd%C{QSPWum1kK)`z=fyRQ7`!6_?-Hx>jwI-P&Pbn|r6W7ua(&c<40;gJlP}827jY9F0{?`MsmtvTqnxzbi?iOm z`wxcVNS5Y_rs@#{ifgnmAX_uNLhW)ty|mK>J3|(0SabYL%S7>oXy%kUXQd~d#x_|- z7y9{PwbW{3taKsIvROOUe!^i%V-(DbzIoC;Ef}{{H;7b7SNCGrgm_c5=jR0YgvQs1 zsCW1`cXVXf=>^%P2AZ^Eni=S|wQAQI@zci&Ho7$`Xh(O4Q;S=+`-|t+3rw8%ODSty zY_+<^d#sC-dxl3nar*a`YAhU`>|@m@*Bd9j+&$f_T^;Po{GR=}sS54A?0xADTpll5 zo(=_Bo<)z;7)&&-nLB~tu6-jHklrqU0P9s`)lFH(i~kH2ChKVLAv$~Ma-sPGFOjB) zbF>jkSg^*wP}Z*Hi+4(xxI>fV^@GEPCrnADWELGtG^bKQE)(`+q=?hJY$)}SDUqe> zRf$`>dL^Uv>jg1lfrKrKHmyUoY}>kh3pcLZxpeE=y^A-m-n}7^`V_%$CD2MvUxke1 zBcoWdR{74&ni2#okGD90Jlwb}e^=~^78*g%!G zB;}~H=6lmNzALGi@JY%IZLrf-av}11%uJdij{086v%0ZbOa2kl!ou`=v*hgS*{qhq z8`XlO-5jmx-ldEGUVX*-<`|WGTT|(Ly?EV4|IO)5xbq3~0R! zBdW^C9g})yqZK1~A4#c#V>5d0`_WpT=_tnB2)$^8xT-~*P4E30>n;qXMI zWz6z8zzJG&yLk&p->K65v*^idNeuesxl<(O?fHUv)T*>r{w&m5N?j?{rahjz?ZyZG zbl*T0fBoLh7N@vg(pukr`R1RGe){UKpRFAHj^B0l{lO(W(W}L6L&U`O>^P@vQ7~mlE+l%fbW@C-iCA|!5=sf1 zUFr=RXQ-*Od8$!N)0n^7`G{!>GXo{sq4k9M#h>kig?cj^C5(b6r$~q&uS-J$Z80mu z*d!@9Y$#}^R;xKi2>)UB1Lm^gVk+^S%b$qUkO=?By|l&W;4Eai&R zED5=du12AgBx7Z0TFD&oaBoTsWxDovEdQBMa4I{}D@!Frm0*o(0S%HXSlP0dTu>;g z1elNnT9nyH@TwTp*N_|$)lEt&b?_{O058g!Kn;pNVZ_)7iTSx0{!$qVshh`KW)&E+ zkey|iVI9N6O`cWrW7m8iC!Mho^e~g0`vl`x>0`kQ5@=#&XVa^K4sA%-U*sSz6dj%O>>JSEnud4%C3?+?t?izCQ=xeyy#&~u@g)M zR1JtUtWwpBm@5=(1c_V1=z?~SEJ9`b{8(GKkuRtyf?tnFs@;mVbiCv(uX)dl-t@Yv G0027|?vnff literal 0 HcmV?d00001 diff --git a/HTML/MicroMan/gifs/cl04.gif b/HTML/MicroMan/gifs/cl04.gif new file mode 100644 index 0000000000000000000000000000000000000000..0794c54f9e56cf30b7cf569120235a80235e8db8 GIT binary patch literal 472 zcmV;}0Vn=PNk%v~VY>h(0Du4h|Ns90001li0002H044wc0{?`MsmtvTqnxzbi?iOm z`wxcVNS0O*ASkzbXgj8p%+RiBz?$9ZAin{!BCi*qC@UV2HDeCuJnDqYs8lsoO0BAd zj~3Nxw^gHaHT5pg$rRM)QzVZ|x*bexSNE+iwOeOb12`8*hlh8i2Eq2E_z1a{Bj`4{ z6}Kjo^~U+f!?kEx_+(bcBnbG>c=d)A8CW@4_}AoU%L?Q-2iK6mK%yAKE6wC$Y^b@u1*^Q3Z1?#KTlt8e~+K9zt2zp zer<_@r%x=}^_$nu*N<=+3?7`Z?a?Yp$w)Dy(#XoRKDQdPRU|`-;lo~c0%A&)2vtIY zCV!!#C@j_}ha;^uO9{^+&V=z2%~Ay{=(m$Kfx3K25vj_6B2)e>36m03nnlZ90-4F1 z&OL-W4ZXw>WyVe+iB%m*^_;x4XAue{I*x7IxpeE=y^A-mUUUB>z}*YDSdhSkqjftu z=I}?Rgdc{*1$kG@scIV+MFx3dy2-PuS-zZWo90EFkA9|WSjnktqRC=qd^+|G*|dAq OzKuJ#?%fCq0029(Mc%0Z literal 0 HcmV?d00001 diff --git a/HTML/MicroMan/gifs/cl05.gif b/HTML/MicroMan/gifs/cl05.gif new file mode 100644 index 0000000000000000000000000000000000000000..4b3ae5c55a5f01c7d6b659f21b6c983c43d37bda GIT binary patch literal 548 zcmV+<0^9vZNk%v~VW9vs0Du4h|Ns90001li0001?05bpp0{?`MsmtvTqnxzbi?iOm z`wxa<7>r#|Iw{H;sR=`9yuHh7A2~g;vzyrIe8Zow6+{A*%-<40ga&z_m6UOGm1f3m z_6Ec~$KtWVCZtxU6RwwdOk2g)WmJAu_kjG{-D`KIbQY#V)@PV#wy5{ zCRw!NlrzW}*$5ii@X1&zdWxDy$d=mb`U)E>J4;*Z+6n7~RitQpQ8xPt4D9lN%h_HYK?>kDkN`q{dCW*k;r!jQ<=vdi)47q{xT0x>>t3l9j+v z!jMJ8*vyQh*I6k6*o)Fqaz32ghd8cVtj*+}RW< zR(wPCnN&*kXGDu1@u3-YkftT5&UBU{%QR)RidW@MOjg&f-o1SL`t3VYhS*lua!tp*x0XZDv1R(L~jxYbH5WN+S>BDY^5xm12cK z6qgjO>}iuLZ&Y@+f^Wx<;o|;hII%{V#DxTRZZ#a`J}p(YmM$opKXjQ;=P}ESGwaQr mJ&X2^jB~?gT?le9@u1o&bB=vyTDlC^lgt#zGom2PFfy>d_GgqQ2$#3_r#RVA zM|O5+dDQeK*vH64sd?meb{g5)1tr({$hnHO1s8F7xu%u~_{bN?sG1{$WtZ!N2nsyf zDk+?%ItvSdG)=u~dCFYICR>~wCdLHLYI+s7-J8nF7JKeoIaFZ;Zz2CQzwCZ5p{^f9 z)Spioz<~q{8a#+Fp~8g>8#=^Qs-6aZ4=a|CCvihYi~sPZX*&mG%10=-$N{sJDd0wq zBEI3G=*m;fUB7BVI_WDJ%YveMVwCBqW;#*P+O5;MlVGNl_IgR8300swbI_6+{Gx;? zr%$Ntcsv@)v%WjHNOsvS-euZDv$a3vep2f-P^rWh6%#dj&zOCt%cJx@5IWmEbKZQ2OX|*|smTWT4NMnsQ64#<` zc-@%Ljx+E`;c^x>Vw^}snRLs9Kwh&*a}c3NQ-wCcm*bML4C5q>>*X|*b5?SYh?BI< qq#b<)lKCYHLW)LPk^ikpNMgyQxl@&8(aF$@wcyETpMJVk0029!312Dz literal 0 HcmV?d00001 diff --git a/HTML/MicroMan/gifs/cl07.gif b/HTML/MicroMan/gifs/cl07.gif new file mode 100644 index 0000000000000000000000000000000000000000..92048c193c40b6275eb2ed4d06f94d28772144a7 GIT binary patch literal 643 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 literal 0 HcmV?d00001 diff --git a/HTML/MicroMan/gifs/cl10.gif b/HTML/MicroMan/gifs/cl10.gif new file mode 100644 index 0000000000000000000000000000000000000000..476c1c14d4f7a342efa2b918e61fff1055ee97db GIT binary patch literal 483 zcmV<90UZ8ENk%v~VVVIB0Du4h|Ns90001li0001*0S*8F0{?`MsmtvTqnxzbi?iOm z`wxcVNS5Y_rs~SJTo6F;79X{J1GAAwy(`%{gqRyF*FyqPL`Kt6JMMnV5LIyvB8X9* z_p7Z^vRjSO#zQ8>B{Dj5#!jT~h17UV-?4dJY}(gnClq)`2Ue%^)s?6?$kni?7iGu? z=r^esNeF02SO&J1AZq#Pbm-TKigT%|d5TBr8J7v#i1^t0N0}-(y6E-8`0IG~R}4&? zJnZN*bT|{uTWPo4{6@uStf-BPN_y*r%c_fsNiB!Wot~Y%eyo0_=-SFUBU|?YBSaDpTvOIY?YLeYnsMU zzVx}X#x7JakLh5}b9ORentP=%QY7gz;!K#zN(!4(P!hr?9cdbU=@eNUX0&ql3^ysy zx0YMDa8y+f+9z4(SgPq-)ap*G8^4mbSthDmJ!KJgc-m9H*n~L4W zFPd4tY-%=U8^+{gwN>1pO#9ff3pYn6^D8p<1sundxn^uyWHjc+rh|m0fl;#O*|clh ZzKuJ#?%lk5`~D3)xbWe`i)SbR06Vc2^}qlC literal 0 HcmV?d00001 diff --git a/HTML/MicroMan/gifs/cl11.gif b/HTML/MicroMan/gifs/cl11.gif new file mode 100644 index 0000000000000000000000000000000000000000..1930c5302470920225856d57f7728e016463fdae GIT binary patch literal 709 zcmV;$0y_OiNk%v~VFv*y0Du4h|Ns90001li000070Vn_f0{?`MsmtvTqnxzbi?iOm z`wxcVNS5Y_rs~SJ?hD6eKnF){tMroN{gpEWIlGCEG4u?RGGel*Qv|2C$`izNPgY8~XYRHS33nNm}PRS$oQ=xHE<( z{Cf#o>r6cAO9Ac03syP|YziTG2zcb9SD3~e7(BT5<{51nXOuk7M?Q@>KzAgicsmg$>-8(SL3R>vrFrvhX6f0W1h%uwajsF}cf;$*cgCkMWx&agkF=WYl zEK^=o=FMfMXv(Z86lo=>Tzf1oPjfYP)hNlzAl~-7R?KBE5-8X~C?ER&kAE zrrI;RNz?W+D;9EJukI4}WI0$>xXt+tlRAj3jkw4l1p~IXM4q~aM_Zk7O|2senV8AS zH7VO)ZW2{@F1&ma3G3XncN;&BJh}4a%$qxJUL1PxQ@t^y9Ij;g^M|LYW5K<`^lR-* zgH1K6eYW|LnxEPuD%BhwWaC9w4->leG2vCqC!~~0Uu3_mAq#LVw1rq@j15?zCP-01 zAc1y;WlCLVX|q^u|LK+>Uk0*}7iAs_s2^laS(wf+s!a%QoxG#DLk zJ4q;6f(uIXmx=-^)|HD@L^xM$cW6fAU+vu^UU)e{IUa!Lu(z6iNS<@08vKQp+Kq%% r_ge}5{2>EvXKn{Wjz9=g+7~X}haHQNk%v~VL$*50Du4h|Ns90001li0000$01f~E0%3%YsmtvTqnxzb8$(Fi z>aBoX2Y?cJppmj-F3Ej#mF02=KTI^;`jW%|4;w`J8joJAOHXW literal 0 HcmV?d00001 diff --git a/HTML/MicroMan/gifs/co02.gif b/HTML/MicroMan/gifs/co02.gif new file mode 100644 index 0000000000000000000000000000000000000000..b2fb3b73b74cf5f5f64d80d4b314a8f51da3b4fe GIT binary patch literal 4849 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 X(V6{?BBOes{kxtG-O(K@1poj$9ISrW literal 0 HcmV?d00001 diff --git a/HTML/MicroMan/gifs/co03.gif b/HTML/MicroMan/gifs/co03.gif new file mode 100644 index 0000000000000000000000000000000000000000..e543bc166b78c0d4550f83f408e01119e1bbce60 GIT binary patch literal 265 zcmV+k0rvh!Nk%v~VXFWS0Du4h|Ns90001li0002101p5F0_cQ~smtvTqnxzbi?iOm z`wxcVNJ_z}1i-1X>!LR9ik4=Lw6z;2J&c+;cE4e0<$cUA`kg|{`f zmx4(ZXxH&I*)@oWmHFtXIr_P%CwB>WdUlxUWVOntYT2jxrwjSYn!0xzY}#8KOB_d7 zt2kWP{F)3~Jgwx(tVW}V-9&e^&8EG9O_`mi4Qd#U{5>{X;!bTN?=51+5^ P{|_*rz<~rk6aWA_&|-f@ literal 0 HcmV?d00001 diff --git a/HTML/MicroMan/gifs/co04.gif b/HTML/MicroMan/gifs/co04.gif new file mode 100644 index 0000000000000000000000000000000000000000..0eb16dc918262fc90baf9291104550c6817243ff GIT binary patch literal 9021 zcmV-DBf{KANk%v~VdeqQ0)PMj|Ns90001li0002y0nh>f0{?`MsmtvTqnxzbi?iOm z`wxcVNR~$snCWS@?hD8AOxHHGzWL4f{tpa_P(%Z<2soaOOq9|2L@Jz6DKxrVQFmEp zGGz^G!Q*REh)%25?8+AVj91IcZ&aGN=D^1O`Tu8@cQ!W2au~SRw#eA%i1ubzXEzsz zp!9_~b%}|jb@$o87kXLRMGE(*y2{$R5ouOgDJfTmXX^vnUxwPXqP0y01>Kal6 zjH56=i+3SHeApLZU3wow1?M;rW1iq>DRTU)SZL6bWqvGNS@Gq_xjs|or8+Tc&7(FW z)+2cC=G{SE%EYC)^loB(LB+lLiAwNTWVo!c@YK7UcQgHbb?WNF zp_|5TxHV_e$>(;;!;)y!)8rrEWGFkh^6iP+)Bo0Q*?JnqrJH*BVMbkMFHr{!d!>yw zoPn%C_MdF#6?GvYuMH-lN7L0-A#fr}Hrs6n+IJFFkyr#uJ@df97Zn=Lmz`g3U4vFM zYOMvIig_`U9CITj^%jVCb>kzBYC+VNH#)-QP>;5(Wer!&O<59OPAv)JS-!!wm6E;r z6O;>OqNq>?XQs(tIs6oN1DqVl$!3;o);S`cdhW?*pML%cXrO`)N@$@A;Rh6O@x_-X zJe*DS!JPw2r$R%BGHJ=2J7J1liYs2Q=n&~;D%47yMI`A6Af;MgO)YHXVWSvGN@1&m z_@^cfv5J@CQ#4v7Us_Q%PZp7IQi$MO{9Hhz6~jdgO`B_+Fza#!G`A-Xjqajc;_L9LS&qG*J!Rc9i>r5KqW zzyt#a(7{7l0jJBzLVM}UcnfT_c1OIOI)C>O;%{{Vix9WFT)z68CZ!u zS==OS4d;g+!X(0mC@K!QbWw)$NSCZlWp_Rr?kXR2T0;;FP^G$$|W17 zHGu#2+osn61Nh~rNJoro!u`pdFR%DYICO)e%{;WtZ5QmdNkQ?;a@(!tNgn=l;YfO}_{qe!c%qn^ z1Lh)KR9?BbIm z>8$5Sg#)JYphq~Q+jn4&r5kf^?Bm@}f<4&n&*?jnW=n%;aaOZ7 zCqdIy4p=L6pao+lFJN&)g>V831!JfzJAqC>vtrPY3hMhWFTg-&?w40cFUWFNK-`VjBICXLz}SD2fnYV z?v45inJ~U`AT)00jx~JZ;Np8c_o;|WoO_7y8VVu)%O6XO>rbV?!Otzvl$4-ut!v-@$FAWMCVVqW zl$559j>$d-axZq48mH_`IL#v|a1?tnNj95Cz5eBMpR70@^Zd!rfC_Y=1TCmR4~o!) zDs-X1vtCGw_lmFFXa9ii)7_a;cBgqgaD3Xk9w0ZBPVa?p9~q4Sh~fvcmdxaU1gz-! z^cl;RTvUAloR~}LF+pp2vz^EK%MDY=sFS|%Svyr$jd$Zod&4BhI$B`b_MIy0Ib**^0?xxzUVMsTF#@*|wwA%c^Hw*j23q z%e{ika{bd8wMOMMNU{u=W%DIW#VX3l&NXTqa%@Y-#!KO}wXLgkS!+AXp{#xKZfpx> zU;D4lDEELq|K>F zDUs7gSy-n*Y7yyhsjOrYcnjMRloS60gFBI?YZ5 zKSfg(anVyaq$WAl`L1}ziz^Eh7mcJExZ3Sc#;xcMStm(e{bfUpWoj)LS3AVz`mMKu zNbIE)Cgnvk*&T>wTYq1Qu2OQdYN-_omXnLuEgzR|z9nRs|2X0?3ploWrB4A-WZO+W zH+9mb?El<|IbAQ05^yldv!3H*UGO$VnMB3e8LyTS);SVODTJ?jMR&|;OHj zrv^voL)EG}H8~QjCUV|ZPq4-?rtj?PT5nhlxCG2Di0iyP0 znkHjYR%J`OvMe0dbuo8KHrq@_YL@POrw#6KiJQpf^N`Y-;cOOAS;=?{x4Y5DxDoo7 zxtmPvt-Af>ckA1ll*6$C1^XCuYx$&+-R-^)9<7}|6|@J_#=3_6ANsCYeym2g#SJ*W zi);L_uiCiBKMwMci+toHFL^>v9P3$A6vQq5@Ng5jazC3~6%|*xt5WV_kEW{T7H?ct z9RC=uzw~%TKAoLcxg~36S*e-zL~{OUTx46E&goa|YBvQ5REL!u>W|ITz<3L0Ynqj2 ziF8{UaSP?JzkHDS{_;oFC)7@&y}2RBmeAQM$VgtLfTbh5Ee)1vGtV)lz06`T?9AqS z^BFuFit)wY`(D0>cJaEM{M^kRc-b=k&!I)TDUD^fzY>wLZ=U(E_si25O8s+1i(^su zYq-|85Sd;lb*1$ZY1(_n_H-m=)P)ZFCvDR7261~%hW{p;6Q4}piK?hb+x6$ynj+0# zzV)w<{p@Rh``quo_rDMR@QZ)^HB5C8bffBy8Zf3GdPr~l$j z-v|4*KVbVbQOCe@2j_EM;zC~*PuNmUBQ#{c0!fl2Q9XrD%$$ zh>EGGimS+qt>}uc2#c{Oi?c|JwP=gCh>N+Xi@V5+z37X-2#mofjKfHb#b}JjD2ziA zK${mlVh2F@w00MUjLt|tG`Bm6LJ_*iPDYk=En-eg2USLhbgrXt^ksM9m~gmPZFdM> z97tHQs3np2c7Z5W)l_yCB5y_~ZcTA|KLRjl$b)HTR#Aq0tr(9QXit|UcZLT>a5Zl6 zmQ)|nDd)rsBFG>$qi%?ohNgIs{pfV1H%X)?di(f~$o6kUH<1}6A{J>zi^YruX^>AP zlattlwewDTIEZ{`WXR%&*R+ktfn5vukaj_7*D;ODhHANUiA#2r>i=MgkYG~A7L83w zl~rk#SE-H1^ORxEwABhgzpYn%0y5b&if>U0KL* zD5Q?y7>DinDQB5}AP7zlLw6atK^>TY$>b4a1Z7LPc8Z3DSk{%Gn1k~uT1+`_6i1YZ z$#+=Cl(r&b0^@^(ppmpVg*s??Folxv0TIeLl%MHrH-ToJ=Y^RAldHIfi4$LhDRAL6 znKpS@o(5V)Vu(JrlC7tELzQ>sBbJchmx=dMtk!7D83dAebBP$45676&sh!)&o!uF1 zwRWA}2|eK{o&?sLG8rA^iBQrMkse8&>NzOpv|hWnn#~EH2misI=7o?dd7lAgZ3gI* z-PoVzX`cg{Jk)8R396tA%AgGzJS>r2lnGhHrj#4mWK)?^1sZNF32z-Gp%|KRorw(b z!(!m}b2}1hY#DSyvU(@;R-$nWC7N?e#wq^Tnjg7LKz5Sr7)PL1eba`L6{wO&HA`gC zLk5Uii1uwAM^nmyY;cAWV%S7pmt=!QmLi&KmsyYSvP)0LpGfMQsib__*l=LNVvH1} z8JS6z<0qPTX0{+&iWFUXrL9<^OVCmo=Aah+Es$2BcJKC zlja()co=Vzrc-OyUBG8!Zc;~Be0Oo`rd zfZx@`$D6!BHHk{R5)R2mD7Z&9D8ZJrHB<~~s<}$e0EP~@vuql`*U_q8OnqQ{#e_Cx zsI+KZoWwzltvBM2w7IEYB_o$pV|lB_wED*YD4<3h$c1dkhm6R~cbAF$CtWtjjC@$< zc~6jBd~jvBeoV;*X33Ijv6&nY9sgNwIO@r7B0K52r=yI@sjSMY%*w5tj3s=atMa5g zCO&cdl>MiU~MY6vNx3s)1b;zPUHWqyR z&0sZ!^#nmFd2J)yPDCAK$p3pnp9X>LIKz4Bd|zpvt15qtSi06Y&cYU8S?$VQ?bTmR zQeFAE9csf-tyZhT(vMopF6%|eTsfeE$sQNiwnNq)fXQuLZ+*%{Xj!K#ZTkH3_t=TOgu zm1F+8*S3?NfjtSGE!F&^jFLr{C0T|Mo6(jn(WJM(LwmZaZKLW3s^^>1yE)qr`Es94 zXfj9AWD3E44cqBjTi8a)@}DF*%!_RHR+;#cwIHf;rKb?#aH4dj^Zi)xHqxjQTdjb zYQpJU*d6VE5KdAv-fCl7&Z?S;#oAjqBh(L=d-%$YdQ5E;7cD;iJ$k9UD?1k8y+bXo zZ$}NWVR*Hs?Y+6gg80kb(mRHYji-huy&XH@(M#jw_t7mzI%90mxnwj6-Kyr@qiO6e z#m2rDDO6q4w)02jH2q2eon~Da$E)=cyE(EPEkFqDuzoj#AqmTYz1h?#B%aFV?6{hr zgW&hoxQrSYdjHeGv#V(hCw0LW-l?deQl7fd+N-1)DT9ocBYJ#xt>Uvz>$ToIbZ+Yc zi0Zj+Otaj$ydKH5=dQvH?9=I}dP(2Kj&p3>yUHHPrTpOm?(EY}?bUAW*N*Mgnd*<; zfbiBe*}mi~MV3Ky;!1vdCAzz!xuQ=*R zFS$Q?uJ7?~BbN2gX!7qG%%a@ou!mgX+f5u@W@|{zzCY&K-o2B%Ubm@A;2);(xq6mY z8c}-=?j>*XC*NS@Ch{oX-XCx6Oe^Gw&GJsk>=(VJF7MxtjN>*w^Kf1Bit*+>uPUf_ zfOag(LjRBSNw4%v&-9QhwN2mhKM(a1p{|oW^+T_kmyGk}zR7aQyjS1qB#C4=2KKG4 z%v{n{Wv}*Y&-QKa_T7ogV@=nhYnHRNr0KoZE=hP1suR*~a>?%2itF<;I=?&b&v}ix zF$J~Zj()#>%E39~|GCrhr7gmOli>*O8}{3XXYP?LXPREwThCy@o!JWy+a~EmSx?)b zE%Bbk^Tu?t&W&h(e!24``VmI@M{mM;FWlRfxKvl>i%H(H-tbud+*%f~`q|0mm-|5l z@!4Ck1NZy-dPo;c<1KCcv#-&IuKZ+==8o@A0B&DUmD9_7-2we`T3hPtG2Wx;`SWF* zp#T5fXO8BLEZ?R^@;v_D^L_gS03TDAFB-Zy!85^Lx>@G^3&oKv%@a-4m2KS@j^&xI z?HkYao$vi07!(ePMdJ~fR4#cQj{@^#PN`Mv6|0g$vt92O9HvFd4@~8Ji8|66b=xhL z&*}B5xuQ-u5gC6!&Q5TUuuuojLW+-VEilm#GE#D~1TWB0V{37XveWaE(6SM2w5_p> z6iot@wbk`?gA;a^wzg2#Hdl9-x7YU$1Qs-S5Me@v3;!85 zbofwMDS{9wE^Jm2W5zyYNKMrEkzccmAW0q+>9J(Wawk=`3|PjDJ(n|S*0gyOXHK0v zdG_@A6KGIF5``B1HPUEOU8p!JbxMonQ>m_^PPOW(>Q${nnabSy6>M0sW672^dlqe4 zwQHwfWBYaqQn+&uNt8<$@0dg}Rps@IBh4AXDE}4~5t#2?!;4Wg?MRq$WXY2$SGIf^ zb7sw(E4mG_C>`gyia$UWEwrgU$9rHVHg)QCY*VLqBGxmwFBehyLa%aT=^kyJFmJmC zA&QG{<&XXd?|Bh7?&He0HUB-$v~!H9iF=i>*NDO0y{ypp7aTVpa57oc@?g;R|Te^ZxHcq4?ijg-M3GWmL#6yt6H_EHfLI`;)aF7N0 z(u0i%X3OL{bvD6{0^4j$1wb0 z#tuKc5x*IG+c2K>n4_+PAz#GtN)K~u^2Q`1X$?%fs?_m83m;46NbB&C&CD_%1TRDL zI6{&@FQKV32t4gH#xpVW+!N411s#;ovHDE$&q7rqO;NQbOi(o>8%0eQXKf&9tFS_1iK=CqaGgQ4Qrx^UzbLV$@ZzB#o8UT5Y`**IZeERsYvlKkXGF;yTJO z&c{~O23U<4BvO^}HZnEYjPT=5KW4j(R@qXkwenI-vHfVZaHkd4ST(=>>eq8gN>|-> z-F+9{c-d)H-k^A`7pGM5^~utE_XVk6cK;1&$twrW2_AY6UYOyA9ex<%h$VJ(!x03Y zI3fW*!?+s{!`nzr!HOjIl8ZT3(l_M9SuPKiLq6FW9i3enlilJm5$0;vqxoh&5aDs> zoRM*l&0%r28N8iM7P=Oc%ngoddHyLSxu~ta8tbebhR)y8rY5tPu4P~_KCwBtS;Tyn z_H*qj%O<){k-PPd=Ctk7kmMi5G1!IFllO%)AB@WUZ&EN8^P9g128XuomwJ@%vYRMtt2wnHW8#bqUIP#qzaVNu)Sx1N4ARG#jWyzFrFOi)*og%q+ zBAoqZ9EU_C>p&om6gnt4C0x!cLC46!aZZGjJEf0W*+@Ui(v&ijWhg^4Ok1unm%=0? z6NjTkU}kQSn-owCOIS@x0*9I}#H55i_c~pkGK9$FW-pDI%tU5WoUK%)Hzs1kk-3vx z9UPpeV#BxG!IFM;yf^KR`6(vIG@PIg+c4i0?|O{%B` zx`9z(@g(9#Ioi<=7O;8DJWM)|hy;>~NN-sLr3(sZN4yZ|PwfQY7HikbWv;+9SIi3< z2TI7hy(x|tI;a}oF&;TW51`X(6HykrH-g@Aph!KaQt|nrf1c+rF$5hXq4}h4A~AWs ztfeTi$HWm;GMZl1Dri(j$+EKWtYIbLGENE?6h?@5cx@{=(m&l ztb@udXZ0?s%=w`buUORSXdJmRWbXAuI>e?}1*-{jrV^Kt0~%RbG7RQeRVfx+{!L^ZLz)ak{3XNM6b>gx?cCb7ryb8?|kWNz+Jht zz9`#Oej|!LH%V2E`}}F%xa-~(iOPK2Ty2js$=`t_ta}zLTwpY5S&=%p2V9G=O7F2? zzBU-c8P1{P3Yypo9msT84RP2sw&Gp%&&4s8@r-Gl0_onc#*;X2j=wbEa^#+*E-WzW;HpuE8=M3yaSR zOYh8u4y}im3E^uQ&8?9{+n{esU%2g&q5A7{`uDvqd0ZEvY|S2Bli(yNn$Bwe+=VO5WW zd{;~-q&Hnj*2V&rtt11*@&2HJ^@999UqaMGGSb*9ap$XD0sm}gxX3p8l zx;b@}QCxPv@-y2vUuCbyZPShsn%o#CSVptVHfH;sc{f&K;nj>dl()Fnk(d1BU!Zu( zJK5@&2exoE-*~MDyYoH>Sm@dI`OK5v;h0AK>RI1<*S{Y2vv9myV{cN(3%>Tqo*9-x zChFVgKDr9_WZqp3d@8P-!hNN=@nfL0;YSkp%uh7f=9v80n(OqM=XcK&&b+MN5JkK=kMwSfgWz0ejE~e-H?RP&gE@rlO1cmW}rI5Alf2 z{3TZO4A0Q0NdK)|Te@}1t@PXEk7XweGaFGdHYuz9S3&&6kgHDXH@MBD@_xubQ<;VqJ27~Z0 z4NY(j1+NV^P7;x2l(^BCNP`Qr#v1Ku8f(sLurCx(P}3+*-w2VI3=vQe(NxYctoE<7 zy6O#eY2kXr!h~@St8v7tPf~tHHT94pQnM+^Qc(U5$H zBH5!UD~AN%RY4 zIg`^OXtOt&lOy9!If3WNqEk9$ggUDe8?Up^fJ!^N(>uQtJi{|0oD(+5(+6$R=~NQU j@*L7SyR#f!Fgi7CI^A<1by7T&>pqn*Kligc3jhE+UqtdI literal 0 HcmV?d00001 diff --git a/HTML/MicroMan/gifs/cp01.gif b/HTML/MicroMan/gifs/cp01.gif new file mode 100644 index 0000000000000000000000000000000000000000..0da6b34d29682e197002658b153679277a3250d8 GIT binary patch literal 1950 zcmV;P2VwX}Nk%v~VVwcN0Du4h|Ns90001li0001;0l@$O0{?`MsmtvTqnxzbi?iOm z`wxcVNS5Y_rs~ReL4drEJiWAA!ZW3}{tpZaH@8NwcGM(8OHOkLjY_98o6M@S9-Q(QI^I)Mv=GMtw-pHZcenI)Rv5EIsE{=1 z_$Zmlx5?Q#;>Q-ci0EL(Na*%A7p4{o$r@;A7kNhunbzv5yUWX?7`lo!n2U=hdJJkz zT3lF(iDI9mxh;|h&K=pc7>A)f=C2srxfQF%yLxsO-Mulz^8NeKFW|w13mZO+ zII-fzx&%Q}tBjLhu!c%O5nM_T;~e_LP3nXh^FD=HH#5?5ZWZ24{ldzEl{%4X*>GSL zl>IGtyVYjQ?6-Jhk`8|jcWCE=fN$-9#>PE_-c@;iT@*GO&y*|;Mrrhk#kLY>&=&pW5OwT z9xCsEVO=syVMkAZ|3z@ghQ+BTSb>)12VO!8F4awnzM&XbIPoEv3Ol|1Mk9D=(FWaa zVeA-OjxrKwVth3|;~0*nBzNK_ nX3*=SiWROWx(O;B&$Oom6D>O1?mtKAeW|(4* zNoJX5o{46fYOcvm9*bg-RJ9@k%k-$5AdO;sWD+$}6- zJCs%KjhH34;ZiqlW!{-fRFUCG*W8NOvb$KY^p0ikz54FUZ@>Qj3vj>!4@_{u1|N*D z1;8fEaKjEi3~|H~Ps|XORZxu6q!GQbkk1fwD8kXPfc~zR$q-ZRZ+c$ z!O8Xb44*G6JJA}4d3a4{4Uu)dH4bh2qa51XC=oX%Y4f1O*?PaNaHbgm_?gK*F8ao6 z^&zNR;WNtkZI$9C9<(cLzoHrvF8@}jGl9nm&MlEJ>V_%T_(AZvk5wpTFPG)AykFU6 zU#pjfk|5WjcAv?P-rd)-&DwSZW~bM@x92{Kes<^XJJ{t_kfHBp`+b2k;7FO8e~#N; zUL|%VUOV#NwLWBKk;A9o&TTh}5Z?T~Zksx`jRP&|1*!eL`L6LDJ@eQjnY`|{UxT~A zO(R0_;|}=z7dHL%PBdAWp7-|g3jb)Q87A`90G|iF3Qo`isZ$u@Ah$WwoyK(30v&PS zg*Z-i3P+05-0M#F8{oL`T{2u8%Sgu?)a}S_Iy9kJ?lKt|UG8rOkqn>Y))B8Ek!(xc z%=lW;#H>kiid19*{x0|_AOD0XEegCLXM~5H-@PXY-BOmw(V+!&`J168ok8%W_qJFf((Shs~wZYGgI9Ec^g^qEFMA6{}H!990gej$Kp(7#b zn@WyQkhcM0S}KQ0!&T=Bo}}4<`k0;;L(4vYW0Tk~G{zt*r%a_Xw% z2C?{|{h%j;qanyGA!NM!iD-BR7=V#ZU|DXR~5es*05egEv*Y(BPUT+4wdnr`2^)Css~bl9TcFpY@-D)hCwbW zBY4~C2l^res71#0ltulRJrznqY!Wdvr{Giw&$uSDoSyAl zUZcs*$u?7?u6-kvU}x)%j)@MWK2>MVKA6DyVav4K0}>>;*}}8#(_mc{=~MxtI)s(i zq9Of9dc_Lg_{w*_^sTRb?~C93>X$9L-LHTD3*Z0?c)+q+DuL~x)dOGVge+7rFCZ1O k1Une2=eX2*CrmcX#tg%|5ETtM4B`-rc*G+{&J03vD82|tP literal 0 HcmV?d00001 diff --git a/HTML/MicroMan/gifs/cp02.gif b/HTML/MicroMan/gifs/cp02.gif new file mode 100644 index 0000000000000000000000000000000000000000..d1fd5d679e76f19fcdd9c79e7f76439379e94809 GIT binary patch literal 159 zcmV;Q0AT+|Nk%v~VP60a0Du4h|Ns90001li0001A01f~E0)B*#smtvTqnxzbi%r;Q z2m58>$aUdVj%4Yj-qFJ0Yo@@dYV>ED_sk3abi*O1H-qI8$(v@;0v2ONX_WcQF0)OX zj43=?$Bd?P%S|i9L^exUEh^9SZC48hUavoW(Ay`2<8@Nlk*5QPMgh16g0+}KQ}$RB Nd5M{+xw%jP06VS$NEHA8 literal 0 HcmV?d00001 diff --git a/HTML/MicroMan/gifs/cp03.gif b/HTML/MicroMan/gifs/cp03.gif new file mode 100644 index 0000000000000000000000000000000000000000..38f88c1f52a7c7ddd93f7bf82ba9d25728fd1f6c GIT binary patch literal 167 zcmV;Y09gM=Nk%v~VPpUf0Du4h|Ns90001li0001F01f~E0)~W-smtvTqnxzbJA*zO z>VSL}h?PxOp@tfm+v9XmZs&hQ7febn`C5;@#qLbPiW1^40UDqmx9Z#REpy_Xfw+06Qz?Neuu1 literal 0 HcmV?d00001 diff --git a/HTML/MicroMan/gifs/cp04.gif b/HTML/MicroMan/gifs/cp04.gif new file mode 100644 index 0000000000000000000000000000000000000000..e54fc59ad9f004a8a4b0ec39419acd7da6d8c13c GIT binary patch literal 307 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℞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 literal 0 HcmV?d00001 diff --git a/HTML/MicroMan/gifs/cs01.gif b/HTML/MicroMan/gifs/cs01.gif new file mode 100644 index 0000000000000000000000000000000000000000..40a8b2be019359a2939c679c62dcd876fabf9e20 GIT binary patch literal 606 zcmV-k0-^m!Nk%v~VW0p?0Du4h|Ns90001li0001>07?J=0{?`MsmtvTqnxzbi?iOm zrw}M$D3a3XrIx97pu?W+Ot&L@#|LWgfd51IUOnK4_)7AWMboVr0xpd-;!Y>*1+~td zm#Yn9yFoI^+Kr9B+jH%Dgn{SVdan5$Kf_}FZ$D&Zm*-cdhDDghMn>2t@@VFVSjWfc zMrm`Gqleac2Iv{ZRPyM3u0sqpr zEpghvhHb_>d-HAM6agzkoP0Pk;lh|Zd;SbMwCK^KODknK(8g%VsYNbhwXv<+vAMho z7V<7o$hk?9!t*G3s!yDeA{Bi)OKMb?NNa*w>!>6qu26_4I(q!!nw1rU;vTB0D72m5 zZEnq(bt%;3+#l?$O6U1>@@lwx9BWD}*l_rTRy{YH%5Ggj*9u~{=@Oi2uPMl2gAP7; smu?X5!q|khXi}Sn05PNCGI4ZxA%`HI_QWP5o`_MT~5F zn48>8v#DCgYUNxFu`Ft;J!;(@fo+OY%IsYZ7ZskvZO(2q{q(8VK2Kk7e~+K9zt7+A z|4$-D92V37GAQWb0m2Il8G?$I4wXDllR6!PI8mCkbBw9@ebC;)uFk3^}so$&@PtEC2vIM10J= literal 0 HcmV?d00001 diff --git a/HTML/MicroMan/gifs/cs03.gif b/HTML/MicroMan/gifs/cs03.gif new file mode 100644 index 0000000000000000000000000000000000000000..fcf5cb8331606c52ab0a96a480ebf43425bc6439 GIT binary patch literal 1265 zcmV;0Du4h|Ns90001li0002M0MGyc0{?`MsmtvTqnxzbi?iOm z`wxcVNS5Y_rYac(O6xMMJRdPtulj!F&Ak8uBe5axxPu9mv>OcJd>VYiBJzs#0kqJm z_q*-dz~ONji&km5<|30^UANP8)Y>>di@z?bnO_$uqBKK@w)cawr%nIZ0V* zd5M{+xyjk-`3c%d#THtca%Y;lLfDw|#;O|I6USI%+XpGD`myFD}OQFPG zi@f+j7*fnja#m)7tauY)ta}1~d{aa#-!pWsqENAj$QG2A^}6XiXQF8ZsoTC0DM6K^ z)2&>)di`q8h}A|ANP(qf_NmOXk(jnz3dts0I;h@-fhBh?n!4r=<<)zIZxENSPy#+; zDCtdzJR4xoh4W;*-Kx; zM!fIIv$wZ<`~D3)xbWe`KTaK8d;@a3YLg#-y^&chq|Py@G)%On@#@yML#58WM^0vr z@M#WDwi&$It(T*J4?n*A`SeNiuCK#Ae&tp(@BiCxof~8oRGV!8N{|?Vj47tyfeIGL zl7SB5AXdUZ3IcW1?hmez+#4nr_PJDMfV};-#P>+Rv!7L}==B5T=S?P^{X>M1rr*N^7mQ z-U``$xcanfpR3|kDW<3?SeJ_c%IaTsqW{XrMzgfBx*MYl_DXHF)?SP4C&-v3Vwn^& zTTd=>(zq;OZdDrENCJslqi>x}>CZ_a71o@)t{RkGNi5x1Z*TAB5zbokc2urjiOISz ziTM&6tg+cX3~|H~bC}t~|LzJ}QMo~D8leI@ydP^zeq1nor!g5J$RX#}p0XuR40Fsf z&s?jHB9aSouvc-TGM(ofq*c3(S(6NvhAuQvlYSk8Bcwn}^JHAQCTgeASADr~)YxF% zgi=a-D|CusfAsPtT6gVpyhI9G4xeJW^ruE1kJ~j;^e&8@qlfYm>9I1GO>^LaYolwn zDsSr6oYR6jEObE~J|D6sk*ITr&d?$WxXBeRiRj>-e-3)+(8g_MzgR&|`du^HBjXsE zBM1VFbkk)BrJbX*Izue7r|^SN&JEDIX}zwT>ITZoHdJ{Q86?%bHjk53#A~3CT=L!x zyYXsG-g~?1#ux{TAU;jelVc0K;+t!CxsKahpO07>>3)hk{7KEWv`L*u$zr+%7H+>( zOwSVoltckFaX`^2P-3C6SOO>HjLO;SVi>!ZwJ12j2m)|{9PFS6Klqgf8t#D((jW;V bXTfS=@K!6N)xr1&!WhbMhBT~30RR9y9;k7Z literal 0 HcmV?d00001 diff --git a/HTML/MicroMan/gifs/cs04.gif b/HTML/MicroMan/gifs/cs04.gif new file mode 100644 index 0000000000000000000000000000000000000000..15646782b0f8f77c964b36a4dfacb93464135820 GIT binary patch literal 658 zcmV;D0&V?ANk%v~VYmQF0Du4h|Ns90001li0002E07?J=0{?`MsmtvTqnxzbi?iOm z`wxcVNPQBhI^ zb+Nr_YoxBYYmTP9Unm!=6E?Zgx*fdI?)LCH{dxyDqNkR`Hz%0q_aw(arzjYil1Dk& z2nGm=R6;0b$%d$@_Hc-3x9M2vc{ysDcsi)+Q|cHg+7}jvNl9as#f#MTwOa_>Cy9J~ z2CRcN?85BHq(oh9eT|*1z0KY2{S6*2K2Bb4uH7?zzJ5;2{=WX4X7&tkUwv35`*z>2 zl>devKYs*8=o@uVj=F*jE!fx+(AdI;6f0W1h%uwajsF}wdi)47q(Nm~ND&cIuz+6GDn}Xdx!>V zCVEDT!BMKrO%|$Nr7jbdY@)Y6R8g^QTa+Z&8L%L|GGulsTC(Ei**x+nrnJ8`jp0d$ zQ|HXQSO>-odKIPQ2{$KOzKl7u=FObfaJH=WGsQLO8bcO6uG6a3twN&)r;GJZ*RR)p zz0JDzz1b0g>i!KpxbWe`iyJ?V97AZiCzA)Eyz;~8a4r)kG|hAI;lzh?wp!+sEq3rb z$>AmHw&>lYe908-&FXP$7f8R9IP)AXeUL4`lS~`~)bc>s-yUW|_`wJW_JWO0{d>lbz zip;!gW7`~^#YO$qDveF?%*5>&2Av%)xYIql0xphyZn>^Do(>;MCu%(!e~+K9zt7+A z{|_*rz=3)sbn0XQAwg0%E^WHSDh544^(0yZbg>RSi~r;O2c3?lYv|<%*cT9Y zELV1mSURX~qvghNp4&(vg&W^6W~f_&q&d{deY#VXdVQr3u2+@cn%COCea-4UKiY~qgV~iaX0029HTO_^! literal 0 HcmV?d00001 diff --git a/HTML/MicroMan/gifs/cs06.gif b/HTML/MicroMan/gifs/cs06.gif new file mode 100644 index 0000000000000000000000000000000000000000..e9772cfe4a10f95caaf03d87ab68249360e36d53 GIT binary patch literal 183 zcmV;o07(BwNk%v~VT%9`0Du4h|Ns90001li0001s01f~E0+xi2smtvTqnxzbi?iOm z`wwD4ppaoQqUrgqhFh5j%mT7K*WQgo<4^h_c&ZhU_Bz^(xdkx!JRO5Bsw3Dl$%r$p zm;1tL!_ATxs>6=6y@r~+b)T14F}!R}>eF^M-Pg9(miLE*5_mV*wPy%|mH1fqwbi&} lB;=NbspPbYnK^WrIjL8vbBda(y2{$>`U)E>I}1<%06PkfS%Uxo literal 0 HcmV?d00001 diff --git a/HTML/MicroMan/gifs/cs07.gif b/HTML/MicroMan/gifs/cs07.gif new file mode 100644 index 0000000000000000000000000000000000000000..26f4105cafb8d1a19a86d87a7e9c591a97ce9117 GIT binary patch literal 347 zcmV-h0i^y%Nk%v~VI=_%0Du4h|Ns90001li0000b0S^EG0{?`MsmtvTqnxzbi?iOm z`wxcVNS5Y_rs~SJ?hD8AOfx~C+_>%DIkGbZ8$R1m=NU$nzln}%DFUYl=)($>N;%t_ zFoFFN#W`iydxoT=;45Wa4Lgx>I(U1umy6FeE||xJwFA{x2S{hQpa(DrN4BVk_awwP z1(+pBHAX~9dC~RQ*j5D@S6LbMS4v8yNN9A|_(xbf%Nc1W=ZM;So8{Yv*~+@7b!8^k zDeIsqR%rWcl-RV{WEDy~`{@Ix+^RS_ts7YTc}Gob>eif$k@Nf z);*|`u6Si485DJ|n!HTM+A(`$s1LMssiZMX#S2NfBRUQRV$_&OqOoDQ{CErL>D)P4 t8X0n2h;AIfm0nEjs)-ZD&73?l1ndbk#Lu8aiyA$OG^x_1Oequq06WUgqZI%E literal 0 HcmV?d00001 diff --git a/HTML/MicroMan/gifs/cs08.gif b/HTML/MicroMan/gifs/cs08.gif new file mode 100644 index 0000000000000000000000000000000000000000..6a5a02eb56a4495e59a2be84d298d78a879acaa4 GIT binary patch literal 367 zcmV-#0g(PjNk%v~VJra=0Du4h|Ns90001li0000i0TBQI0{?`MsmtvTqnxzbi?iOm z`wxcVNS5Y_rs~SJ?hD8AOxN~}=Xw?dO7CL?PrYApaYPIO%can%Y$i9*M^#AyUbE09 zwz53{#bL)3cm5^H;o$Y0uEnioiIdHxTeQ)!(MvYRDEPS`AOQE`?UI7$gLc1hv*Dh>?zCH2M&!L!R9@^Tr2+A zyWMLal3R_Q>GB5)ps<9)Fmbw8E}*YWyb#)Z6|EgPYEBNvoO4G{RysuS*eTLg&f`2l z8!g52Na*9LhaKMtqErcGs%0wK^*dz~70MkcAQC;w!xYk`dmJ%+ilHIYsZ^_4y^1xf N)~#H-dVN{|06Po59IGjIa@H*r%oEZH;T-f)k?S=kpkW6yy)NlPqV@2eg`CIkgMz zs|UbRpIo1;Y&LpTx@R;@^Nw3+IC%bz!;e>S_)nKJBg96wm&cUY1t|D87=@UGIMgS^ z=osjiqzJ>-=tdYzu~rNL4sD%Cb#9~OH!_+@ILtUb4W4Li2%*|clB zV`;l~&)i7C2t>_0rn=DxcL!Ift(ey2$9aN&uDrSGxYtBWzm7e-_U+ued;bm|qj9q^ zj)pfcWifi1NkxkU&ex9Xs!%x_+S&~({L2s}UWrlMmROJpk{4r@6}8u6ZxQ&HFwCgs zQd|#ak`#l2sbS!JedOgADiuB$pK5lMmDpr!sn?czCC>GqWIj;_VMhFQ28(9$arTs6 zbU9NBel$v!(rM|e))JBD$vEDTN-oJ{lTP|G&6Cba36n}mQpwLoSR$FsmJ4a=C305w Q7iO7eo{46f02BZKJC1o!b^rhX literal 0 HcmV?d00001 diff --git a/HTML/MicroMan/gifs/cs10.gif b/HTML/MicroMan/gifs/cs10.gif new file mode 100644 index 0000000000000000000000000000000000000000..504a6c181018bad5920a979f30481153bd6de58a GIT binary patch literal 242 zcmVmrVkngYv^)kys+wRQZ%!7eP%Pw4znL|2tX!>C>FAKq$w3jXpLEwW@F8$ z!D?Lwg|_f<`Q;jW(&U%;ZoA!WdBSdd-*fYR-vvkqH^;@--~^aRrHIzJsK%s6DCQJ* zXEylfP<3fX83+od$2N9`*7Sp#wz}yzIqEuD_ad3MCtGWo14;$!x~6st{4_xyjk-`3V{-I!gK|Sc;lTbE?|v`k`0&I!lW%ql0@{ySsVok;@yb>bvu+D~vo@ zD4X2u{0to}JxyJ0eT|*1t$m3^*-ZptwY|%l^%3quu8bJiUI%ZhH%ORkM7%X`xL(5p z_r8w`m1XJN06fO;5xQcrx0A8k`7{Vxx;$NUjj%C*r_B z9QVNSC{h$cGc#jO3RTml&Ye7a`uv&dls=Z?;^l-{jG;MtOaBZVDQ^Urr6;HsED|yv zEP-);5tZ_z&(RWAliFbRGU`byQG)36#uaPVqWSntjn$UfA!Bqd>aFKXXd1ES0C`m+ zG4UIXa{0!cn}<+KV3Wg|MeFt`*gnG z{aS>M78G2di^f_i%>HKl`Sk1CzpozueE0e}nOk&M-CzC9;!R(;T{qw>Pr36Qf(a4` zTVg8l_aHke*_9P?6>i93haP?iVu&J+SjvJVQd8E6wU~#IinIWOkBiN~$U%xSwnC$Z WHwwezg*&47V>J{8NhF8`0029X);{t8 literal 0 HcmV?d00001 diff --git a/HTML/MicroMan/gifs/cs12.gif b/HTML/MicroMan/gifs/cs12.gif new file mode 100644 index 0000000000000000000000000000000000000000..acf7e3246742f1d3b35c8bd409f29adeb5761543 GIT binary patch literal 1362 zcmV-Y1+Dr=Nk%v~VWRs3?hD5~7euuP9!lvk+&fVGoil?LqZYs#+ z1&k)mk`y=KffE;SoOO({Bh|pk~h5sB^naHp%B*c;C*5EtXF=fLo zS|pyF5V2lDm^0^q!iZ1fkD4my$;??W!o8Oz2@2(BkzGus`*zwGDzB%ts2>A~p(<4x z){R!fY|RQbtk|(+%bGolcHh^uY#Wtp3-{B#pKD#-14?n*A`5uI&_MWAnXm9!#_5Y_ZmpjR=#KCU0fso98|5>yiferFk z1V0agG~pZoes!H@F;vJ}hq}?!6?j1W?@dQlAN7nvtEN;z6gU@&AaZ>9Nf|`>CmSo@5|75*;($jeo-E8jXh* zRnA4%Ix3pDtzg@vJ?BdKDn$f+DQ%85ZndRX5-wjTG+ejtI|j;kA#`|A)Y z*D6JZ1k&(=!66Irpw0e)d83TXZuhQ@G#;hzxAroqG|Q#nm}1en%GMo|yjo4>iyjG_ zWYyZLsC9Q;mKLzp>dpq?$!U^2w4{U0DiE(EmRac4Jg*HLpGNIDtwH{D3T>&&QEO~; zZhE?=pvXE)>O>Vj+V0L7Yk8=w;s27$C?k-|OzDo)#ak?@pgQ|(OMu_Z29IPbD{teS z?LDn(s-}%Ap*Q0VH<11eRJXt!!+d5CoCzBg--s_x`l+TPFWvDA!;?Dh%=7K~?Io`( zw1QhJNgTIHU;cgfQZrrofH_ksHk(n5%X^IWvdFu-OVcX;y=UjxJ-t=m?=`8nD3-id3wk6|acJEHP?vi(GsI54+fwA%Zb0LY(3lo#8|=o-rk9G~*hV(Z)Bj UrHpQrqaE*v$2{tB6a@ePJ7$xq@c;k- literal 0 HcmV?d00001 diff --git a/HTML/MicroMan/gifs/cs13.gif b/HTML/MicroMan/gifs/cs13.gif new file mode 100644 index 0000000000000000000000000000000000000000..46b7b2882b19048272ea4c6514bc734de6e6f6a9 GIT binary patch literal 444 zcmV;t0Ym;rNk%v~VVwXl0Du4h|Ns90001li0001;05AXm0{?`MsmtvTqnxzbi?iOm zg8(X_0gjRxmELLv?145h4cK7{HII_z50w!v!z|eY!@)p${pYDXmlH z?Y9FvNl7vjhBlMe-*kDJt{u_s_PYGOi+J*GSh>@bAcqHc=am)b)bvG&XO#HU=;mm* z5C_;Lc7up#_Icgc$#|I0U)ylZ^N@d&Sx7U{mDY+$iEBp$~se_!1 zs?6N%9Q+(DJxyJ0eT|*1EseD8y?y*G{#+YAe(n(^W{%#Dq3+A>K0g7EOOMaNC!F8! z{|_*rz<~q{8a#+F;Wc@W#;|CmFa-sOdOA={7fDtoT${syd0d2uR*xzn1A#%rPh(1b zsggL#V~WrjQ!QzdYI*9>OqZZeO~NtDP)u2s8t%K(*>*M1Xkr`uz(yu;9VU`V#KP m@bE&Ci4{}32hZ_2$h#zuqwLG_WyXy)d;SbMv}j}n002AY^xOUb literal 0 HcmV?d00001 diff --git a/HTML/MicroMan/gifs/cs14.gif b/HTML/MicroMan/gifs/cs14.gif new file mode 100644 index 0000000000000000000000000000000000000000..1111bbe7ebd8170bd8370c728351f1b13163228b GIT binary patch literal 586 zcmV-Q0=4}|Nk%v~VH*K50Du4h|Ns90001li0000R0Wtsp0{?`MsmtvTqnxzbi?iOm z`wxcVNS023n(E57?yIHnOxN~Zp)#Nc_zw&UJt>*dH%uy*%Odi~j7q03rvXaMYPX!; zQ^yU9$KL|?{tfd^dP0f-ztvU#L24!P9#Ew z+cwTaH*Xxfm+~kj>>{kws)ze-Y5GO#i>{y;GeSBiG?YN0OqKFm*HETYU%G|`tGbZj z1fD#(O=?l|YZI|xVUqn3_N>~qY}>kh3pcJ9vtiTbkc&44g}Nc^=Djr3DZQjUl?H8q z$`YttL=V$*JTR8uzba66ELpOf$8QD^b5w~CU$@K$#Zd-=)tX41_hdH8SM!rplZ!{Y z3hDFokaFHSYc9y!W1p0gRF`fIkoTj5rA_OG0o3qIs8DA)-pSP8%)$*>X&zb+*mEV5 z$D2oO_PqM_?AyD44?jK{@$&1NNN+#CgkRhz0KY2{S6*2K2Bb4ZlQgyz8=f&{_dy@KOcTF>r9{j%nFLH z|8K3|A%Fx);PO{6p~8g>8#;UlF`~qY6f0WfgGf|}YpEA8aD1at#W^fq)bML2Oc1eQ zY3!AhS4o!2cr%df>Pq?29h|G_JaN)$pxn_UPZh7oM~#x zA7ij|#spU^DbZ77eeQA^vZvFqTiMp~O17G=myq!Ml9jS$yg^f0X3DkoOQn11%6;r8 zu`uGrj2kv; z_o}U8kv^&v>MB~T=c#wJMIRAus5F+!Z_n{Knx3Y&rZsrfBbX)kcUbqeW*1TC=Es!e zKn7Vv2FIspcj%NUNC=7esME)mSf(Z_*;ID5XbJl;x|fCPGyBIorHhEkS?IdLJ4Z_= z1{PG?yUWA;#u)t-{SyV)#bv-5hczV1=ZK7sizKTlt8e~+K9zt7+A z{|^v|yMP1>nn-6bp+bSy5H5W9a9A;j6e}v5IMAZTe#;U~ZTx5uoI{W#OPV~1GNsCu zEL*yK2{We5iWy&xlyGyVy_+^wTf(}!rOqF$o%+19YtC%}s&2ipeor_Rx~GLk-xI<@N6tXl&F?K<{F*{p@Z irak&rCfulXo93<3w`kxdZQmx2Jh}4a%$xr!0028HYVubA literal 0 HcmV?d00001 diff --git a/HTML/MicroMan/gifs/cs17.gif b/HTML/MicroMan/gifs/cs17.gif new file mode 100644 index 0000000000000000000000000000000000000000..feea60444bcc686c42edad031e3113e25be5c1ad GIT binary patch literal 406 zcmV;H0crk6Nk%v~VXpu)0Du4h|Ns90001li0002505bpp0{?`MsmtvTqnxzbi?iOm z`wxcVNFKq-1(e#Lzs7lYoel*BvcTbKq ze668eq&;<_+%eQgTrexLZo%p&XBf9R^3VmWc&4AdHFXLZ)_53*%#@JnO8OG`0;Lf_ zwh+>hccd3cGq&ahn<#Q1#t|V&GE`ENU_yi%3+l@^O_5Pp^$_*scaRj#j?k!jf|8~x zIjvl~di@G5DcE1;#$IY_(JZDhHPxbG`_Qe_IBn(5g(KFk-o1SL`uz(yaMuC=JIt!c A82|tP literal 0 HcmV?d00001 diff --git a/HTML/MicroMan/gifs/cs18.gif b/HTML/MicroMan/gifs/cs18.gif new file mode 100644 index 0000000000000000000000000000000000000000..10f415c11658b722a16e4b3a3d745d969fbf2c3a GIT binary patch literal 1227 zcmV;+1T_0cNk%v~VV(h20Du4h|Ns90001li0001<0agG20{?`MsmtvTqnxzbi?iOm z`wxcVNS5Y_rs~Q@K^44f+}8Gu=lbp%GAjG=hQy-rn2HGj%R~^-Y$$)x!_$h)YPZ}j zQ#$pDEmdpyi}tG5?6#@AxRPlSx%-aK>lx+g72c!ZHwL(8c!;<&I0oiarv&vthm}}q zdC687qKVn*`FX`U)E>J4-t{S&N&iYqs0#3wy={`Ab}ENkf-R zYRueRgd7y@JWb67?IT^Sy*;!T%ncqcK2Bb4evY25zRuq6{th2cv<$c`f4_Z;zaKkH z8K-Ya6MOs$9_kZJpd*6}UC}e+k6^=zdk{uk_>ZDSPydV32ucVg;Kq^7B$7Od$|TB_ zEL*yK2{We5nJxzEzGjPw~vtaPIc=O>D?FCq6v-* zhRR{ZdZj6YXqata$b1wF^O+dpWMPdf`};fRYSp!7pHiw4kg#fOtfLBLefe7K)vzUD zrO>wOTf%7U08SHSt?!(sdy^&&__&yQjO0pf4*ac7tAeU;NS!#D_2dgt--c%Qa%HxI zXWP|VQ}hId%y)nJ!-xBJ-k_6`_k9tga^n`0`v0A}pB=+tq0n`=#V6fwR+;9Vc!f3P z8c`6^#tV8|VYl7|%JBvtS@eM>9CgGkw_R_i{S%;BCN3xmfhVp=-$NPrq1u1o>GVy3 zwZRowUxU%LS&(@()|qEM=2#XPTp`1sQ;cO6B!B2(#u<4yd815?pVd{PWS(hOIAe<-6xF5%r0i5&eKRhK+krUfDINeauykw|Nl*v7iCm3`7EzrI?JW9t3jJvA z*@D{=pP&}1VN8oI&UmJgPfmH|ma1Qlc_qP7%%W6~XHL_*GjIJl=+1zY-O9So_P5h3 z2YagN?$i@AS);!_x{D%;Ub^gkk{USQE9MR}%Lw1>dpyDIm9Os2+uQWLQYSxqx2dC; z_Lk0-J8oLB_fEa?Y;FyEu;Bx$GUDcYzW({{zYl->^3PBIr{LF*Iq>+$KVP_Xf)uQv1uuxf47#HL06XxrcBlXV literal 0 HcmV?d00001 diff --git a/HTML/MicroMan/gifs/cs19.gif b/HTML/MicroMan/gifs/cs19.gif new file mode 100644 index 0000000000000000000000000000000000000000..71bf9959d94341951436a5b8d309ce0c014f1cbc GIT binary patch literal 491 zcmVMES3*L0DDf1#d?TSWc zgSX^fCs3`)Y8Kn7TlM%2kIU!uy8VvN>lda?f8A8(_TdGTP-szv2z1lt1BHep=`i^6 zL})dnb)?BRX?Pivxs{f+xC98A+961a*g5&=cL)O6m=;xLV_P{mTDcc2JWO0{e2hHy z$EbJ;@%!UUp}1NhYw35}Dz!|T>ickw%G{@!wRx%r9R8VYi$1#P>8*;*`e!Z%>#a0C z9lA~euN(url{!d82SHuQ8ajLkF`~qY6f0W1h%uwajmjJkarxLWq{xvZOPaJMO`wyM z;TB$D83E+1YVH=UEXOd^8fU<$!F(34lPNbK1Ae(=6zIDlONn}%c|_Drct}XiQ<8LE z4@}%_5{Z<{6*z@wte!lJHm%yViJE0?83Js!r^(({?fM8GPOpvJcKyeQ(?_v_^S0VW z_ou&UM51ImO6s;W90cBhSr|F&6Cncee87%t;mi06V$H?;QXD literal 0 HcmV?d00001 diff --git a/HTML/MicroMan/gifs/eh01.gif b/HTML/MicroMan/gifs/eh01.gif new file mode 100644 index 0000000000000000000000000000000000000000..fa74491b02688229cab96a2f8543197588660ed5 GIT binary patch literal 1583 zcmV+~2GIFONk%v~VLSn=0Du4h|Ns90001li0000y0jmH20{?`MsmtvTqnxzbi?iOm z`wxcVNS5Y_rs~SJ?wbVxBE!`j)vJta`rRu9M?>EaP$V5~k7UDXf=-qaD)V|6N)tRD zvTFc`#S1aGru(6B-f_>&mA1>r_bjc}D(v{P`R_Lu_eE&6_62o#xOdm6H%5q<^+?0@ z)CieJBWH<}73LWlDSG$G_KBJZx`)cxS}Gbl7`eDqi#f^wo68!+Y3HyjJ4+hs%UXrI zm}|9pT5PQ5yyo>RE7+N|72CyDcL`bOJ%~rUecaTk3;o0$JnfBMnQT5Wzw-o+5~C`sV;L^M8Ok_ z8zDcNzI)0+rH~sfE9Q)XOsm?pY}>kh3pcLZxpeE=y^A+5S6y92oYf0Buv<=7Lr@ir zI5DG|Gn>s3X;WvvTfq7iR*V_*AA8M=RYiy{5kybc24+5unq=f~6XQvv_?H`Fjj3yA z)}*PO=d_+nU(9CNw(!J7V+O<7C%0;#HzN++t)^@u{!z*+Q5$!2eo`sIeO&`<1Ogn&vEf(CVh_W1D)FYPItX zWh#VL0pV@A=AMggy6UdWZoBR>TGYF~UMugb!5XPwy+cBKOD5gwYpoXlPTi5j|}c{N4w*5~DG<9~VobP6Tl#X+@(Uet<>WW@>e2&aXqihOv!Gakm*!LyeV4q43{C9>Y1_&8Z zSs89KUvd*J_mgnue4J4}dq{cZ1^-IE=a;(aUF%#cQ_P1`oqF)OVI`lAdg`jLu5#9_ zr|A0YzrF;I&$0*1nsNk|emikNLl|!Fz-SW1ZT>y#{iR;v1_CYf+J@8cH8`b|P z_@|8!WP}y1d2 ze!83>y-7VS0nRaR>J3olR6}W2GLh>L literal 0 HcmV?d00001 diff --git a/HTML/MicroMan/gifs/eh02.gif b/HTML/MicroMan/gifs/eh02.gif new file mode 100644 index 0000000000000000000000000000000000000000..f1272141f6c2b0de7d0476c8121cb45d9200c82f GIT binary patch literal 70 zcmZ?wbh9u|Ol06^XkcLY|NlP&1A`6_Gk`=Gm{eQ(SDt>$zj)4;Tiu)Q?fK2$_Q+$} Yv(9C&PHlU~ef*Qp^>4k;V;C8%0cUg`B>(^b literal 0 HcmV?d00001 diff --git a/HTML/MicroMan/gifs/eh03.gif b/HTML/MicroMan/gifs/eh03.gif new file mode 100644 index 0000000000000000000000000000000000000000..42784b162488d700fc0ccc125ba73b34f7c07e56 GIT binary patch literal 688 zcmV;h0#E%%Nk%v~VYdKn0Du4h|Ns90001li0002D0BryO0{?`MsmtvTqnxzbi?iOm z`wxcVNN&N2oG7K1?h8+A8d!6T=dfBIH}7j1cs-r**g?&fJ!SKGLrSNz8Z$Vw7K2-= z_q%Xnv*eXo2u_2ESs=ju781May8VvN>-YS={|^`_I7nDHrU9ogM-r71QAGC;nJ~#v z>DB1-wpmhnIpoM9@@WZ_ILFpT>A9&Dry9qEMgv)UrOCCW+u|mM2A9f-+mLyC_9}L$ z*h&WK+$0J+;V znbvf2*)V2?L}}z;G%@9uHbXpn`uqtrXwPs$i-Krr^yeapAZNXUl9FE;jV6I5#X!#A ztA8u)*%LXB87PrgXZlOFwHYxp^$dnR372fy3t7_=MLM=^-g{m8%A6Y!m0($=2xCEs za%0sWfcKEX*|?9>qj)1*zKl7u=FOZtd;SbMwCK^KOPj{*m)_~stXsQ&4Li2%(vxQc zs%+cH$EKca`jXmjaY)soj|E5DRiQet@DPf99D3sKw2IgYtV*jRLg=6yO~<{xpmJTw z<+k2!ie?*I+YrZ6{NCi>+;m^0rjH1>S%Ucc`;Y$*V1NP+NML~m9*AIqF5EYtf(||i zVT2M+NTGZza93e<86E))Zxg|_;X+YOrPf^-M)+HLCGJ99h^quQ(k&#qSRHSW+6g0=MsWROA*No0{m9*Ja7AHgg6Ug&KVHdZn{Mh*0028HxJ%Ul literal 0 HcmV?d00001 diff --git a/HTML/MicroMan/gifs/fig0401.gif b/HTML/MicroMan/gifs/fig0401.gif new file mode 100644 index 0000000000000000000000000000000000000000..c183e50afc1d7e8dc221f42d48267c637a7588db GIT binary patch literal 1019 zcmVNk%v~Vd?;q0Du4h|Ns90001li0002$0FnRz0{?`MsmtvTqnxzbi!%zm z`wxcVNS5Y_rfQ(I?t8HCOxLb#=emLK{%`96hZrI8h>RGMOvbVaO+KU0DfPOuVvpLb z_tpLS!s2p;Y_6fx?8dr%gUc=NdC`uC)bo@*U+nj%XD8IL!2uVjWMvqGh@?pL$P+_p znHD+tV3c_#$I^o%Bih!v;Bi=}5IPBfIN9hq7h36BiW+>$q_{Vfw@S>uW|F zyerI^YV5eDoV9!`TsFPi%F`N)oBQqx`~CqBsxKTA*0e=d5Y_CR!@#u`|`a z;y3E*NW)pJg&$(eTyuBQ3fsk?br-zj|z_3YZKa;N6~d+Vjw zZI<`yGQIls>`QDH4>3G^8t4Dck1qdy#{BwQ)c=q2Ur7Nz*57_l4Hy!FP!%ZAfebcC zo>FqP70o;jVv^Zw$eG1oXBn!NS7HSDmRnjVV7iG zDCPxV@>r&qSEXs@du;aM=9^Le>hQAZLauDy|ytB`XZSu5v7|{@Mu(VzaIlYoMwN(UT8jZP|7$biLBrm7$3M zD`HW}RyeJhQ7vM{H5T6bCzTz7T6X>BVa5%Q2)Lx9O|4w)RE{z5xRX-g4zCY~hzC zW-C^^2WR!Eu7g3MGR!#7n`1D$p$jdmw_0N3&^;#`PGquSVYA6b(}&M(;A#r8eNbEc pm((d{Y_6gs)4_GvhmI{vzagKyw%F7e40qh>B}{kSc3V&Y06Q`K1QY-O literal 0 HcmV?d00001 diff --git a/HTML/MicroMan/gifs/fig0402.gif b/HTML/MicroMan/gifs/fig0402.gif new file mode 100644 index 0000000000000000000000000000000000000000..d5734d3369232d07cf6c7d56fa681fbc4aaabf22 GIT binary patch literal 975 zcmV;=12FtYNk%v~Vdemm0Du4h|Ns90001li0002y0FnRz0{?`MsmtvTqnxzbi?iOm z`wxa+K$hl-rs~SJ?hD6qAl5c*=lYKCKGypQhn67m$S@+8On|b9d_t!@YEx>>g0R{g zw+jY_hu^U|Qa*Fi>UM(dzQE({IelWkkMsHmzpwQNxFASXa#sjJ;&6D-ST)#_NCwHM zFo`zkjdq8O0g5I@-EvPK8~|qj3*9Q?HjK*?^bKm0qyNBjB z#s3R$ekuC&{MNIVaccBCOiKs=Amd` zEjZ42r~3I*mpp#@E1k*!*=wAF!g`;ebFQw0Y>3A8*{piX5+>}lyfSAkst-kL;GNk5 zE7F$Yj!Uk8RDKICa_Dj!sI~0s=&r9`zB^>L^crceyi(rVnX|P*Vg=ntMp{Q+;osL?WPYhQaRc#%@0@TLWrrMpRw1m8Cy2ZNb>Y(`zJ7!z! x90H9@{&vj7zX#_`FrUy0%%sk=<@+q2LO(^cw@FtU@0H~~4Rv+sPMt*o06TI_<4gbm literal 0 HcmV?d00001 diff --git a/HTML/MicroMan/gifs/fig0403.gif b/HTML/MicroMan/gifs/fig0403.gif new file mode 100644 index 0000000000000000000000000000000000000000..603faf2ebad4ad6a1e155b4fa4fe6633042ff9aa GIT binary patch literal 1599 zcmV-F2Eh48Nk%v~VZi~*0Du4h|Ns90001li0002N0m}dY0{?`MsmtvTqnxzbi?iOm z`wxcVNS5a51nSDR?hD8AOxJdd=K9X}{(lJohZ`aBh)gP%KO^&*a6+fls+B3dCbQbE z_Y1~w!@V*2j80q4Y7@H+kIPZ-`KNBr>-Q2oU;Gy+I2c8EXNZ`n*x>jmIhhg} z1l96nNy%xL2_UptA$mfZW7?UjXOx8+;W`3aBCA>p$3+W?xq@lyJ2@77Q`2jZ>v8<6 zeB~sStndsH-MCyW`1u)I4614E{XIIx+YMfBzA(*~e$KwPzSrKe~)HAr;p$7 z#UBTtzkyT)wlPRBp%R2?7%F@S#Nio<5GyWXN716jS^pR}dbBevq{xvZOOE@9QcXrM zD^t3>bgt#gnSDCayvfWa&Yj!J$>a%?Tg;$Dk^Izhv?$G_Ym_?m!L&-$ryr+^ql%SI zL=~@`4Y8WFqC`BnzJ@(3Vr&$y#!j+mf;KKPB3_LhC>v2OCzE{phNO!i8(z42feli7 z7acUSg(ZRQfY`2Np@Apwc-&aqwXJU1f;!ojaOOmqi|8Ef>F{aPsy7d1o!Ygz(y%$u z&T!jkZ9=(W&feWRP;bD%g$MUp+_-Gy$<-a7*WCFvztpQ+e-Yi?^KZkmKj=;YylC%o z#MgXHzWjD?=F?YR4&8mg_14kjSO3%R9)P-_$6r4F@$iOc?;%*AN(U|x z3{(v^^k4{Fu>~47ohhi*gcDV0;b6@qHkm;Jl6RtF3@%n8iIkamU5wP#mLiM$**Id0 zmR$s2W;GVFB9Je-m?J+wE{NKZE}pU>hU4(kS&;eB2x4C3D94(TJ8r?@LRDs^C4TW? zndFzMgc;_PJ+fyeRcNlJ9c*tBC|#Cqb~2}(Yu0zCQ+YB+=4fcjNNAyd?WtFq9-gP? zqNykvr=xgMDe0tgR%&UZm^w!3rkq~t>8F~8iU_3ekgABO^`M$+r>yek>Z^##r7Ehm z?jvh#qvl#?nY_*#*R7!ntC9=9)?;j8$^Ra^Pd14<%j_-C()w1k&4Tu9m(~`mZLrvG z%Pq0of_rV2;#S%%wd6J%>$(ndXK1|g!qD8j_TCF2oS^>ZC7tcE*)PAvof}TTfC5Kw zc=`If@4-hTJORZ0F>Iy42*A`kBRr+ zd>;bUg-)`fIO7P()b)1?2?n;;cmET2dBcQ146>k|TTQXAna{lWzkCkP9m}JSSGwk@ zqYm)EpG(>LuCePDy63t7d~ffC*6VxlF)qBi?!|+Cd}EQPK)l1I|JQu&qB~zV^|qgG zxAoIYFX8UW&wgX_%7V|M_=%D)xcRiA-=X@!vVXSwXe~cr_DrgswBs3??eoP5I$Nz} zJB|PIlgF zAoqL(zY#X^d{a!H_KbH$0{=eodsXD%7RT4c_+^oc@{?j2!$Lm>KrV`CWMdM?2*xwQ zOn7vhQF7{tN4}8ob~bdQX5@&KG^$96d>rC0))>aK2=Zt={2~sxGlUB6k`!E?vNIqqeLb9MI=jX>za`Ka+)S3bJw>Ve|gp~i_oh-|COCiGWemPVi z3Y}=kv?vaTP@-Wc8(G3$h7f;V3}%RkDZ>qlk#j$TrZrjTOld@On=kC98@Q=VfY7oF zHw@=Bceu+^6ftc_tQ_K)c)@n+&xo_!BlbFYN;9q!m7ugxDo6QGSGH0q<3yS_mr>B1 x^i!bwRAfNk+0aQ2bRJ_9B}zgOS<#?e6he9Is7Qe4(U20uT_i23NxM)006UFpF8=@k literal 0 HcmV?d00001 diff --git a/HTML/MicroMan/gifs/fig0501.gif b/HTML/MicroMan/gifs/fig0501.gif new file mode 100644 index 0000000000000000000000000000000000000000..b27d0ba7ba25fbd2f2a7b16a4ebf6a8433454f28 GIT binary patch literal 1251 zcmV<91RVQENk%v~VOasG0Du4h|Ns90001li000140jU500{?`MsmtvTqnxzbi?iOm z=KzM{NS5Y_rs~R~-V4V@OV{>|pGYA0KF0eAhm9cdcr*f($fl3!jC!Eb>St%oa;Vxa zgzF72lwh&>P(F*(YA?AB$Hw98dG&2?*YnOjABp$3COAmwCTG~?m-xh}73g>uX|*`{ z0%_S)nYqQ;hv=CU3YY~lmcX=m2|6mI+FJ2CrH~3GyMYPYbF2IHNQ-4l$=VykTU=DS zM7#_vm5V$ZZLADUb$kImjk^tloh^cP>Kvur4RkL3EIu=iD#@PSDbM|E8WO)0p8v^D zpZ!n6w^hF2wF`I!AwV^023jzu@PWf^6Q@Cpm<%I@ivQ6rY9#luU`Ub8Mv^qifFm-G zC{-47*^8w~n7U}fk~z|5E1jcohU6J4htQ!!i~2(e5@}MUpnwKtni8tJl2VyLb;`-- zN35B+TGFb~>m;#}z+xop2rVPC5!EJgYly8vxP<5ml8eypAF`%E;yX$T@YSmClodWm zRV?0sdikIgHdV3J!Gr}9;h_z3xyei$=i!@ps^uSx|9Q5fcpp{7hx@Uve0q*##Hsjs zEuD~!9ed)c`xBr|EAR0vtNML~`%x7SN3KHetOaX3J z+BXq=1|(kP*d z6ngmLiazpK3TCHe$eV~b+H>S)IvNS2be<8pj*d^lD9Vy2Qh6DcLqMtIkIDU(oQ*YV zIhU9@CRw7DJvKS!k4$pe<&JN52q$q;(rIRjXtt>4jBK7M=aqZL*yoMgRDo zl3J#z-{JbGuHO8`5U-#5D#NX;0&44X$N#>Xtah|ksoPR^Y6@+4!j4KTHO?|QCvwWV zDX6RE02l1CjZ)hyxUsIPZmsM-+p4V9avQF^S(+QExcSn%?zN|4sA#|flYrpB1_zui zMgH!Zutf{khvK>LBKt1C?mny^i1=2zqrF>V+)aKVgRF4F9g*y?$t$6JvdS;9yt2z5 z#O5(+L5e2rtTcPO@h&;H=9<27THAB6878Kdg`jL&U)*v zzYcrsvd>O??Y7^Jd+xgL&U^2^{|M64E+6KWz^)qfw zF0j(uN&TTaXusOsz)h|Ep=NVU+x7;bpME~*v)^{hp~cg^`uvgY{`Y_3k2ufsw_m=} z!Eb;~ISc_~_P_Wk(0lh-yOWpIQfETIWc Nh{6=A&;SJh06Q=4l;{8e literal 0 HcmV?d00001 diff --git a/HTML/MicroMan/gifs/fig0502.gif b/HTML/MicroMan/gifs/fig0502.gif new file mode 100644 index 0000000000000000000000000000000000000000..432f976e67011874bf593b66a16ce43bd5c5e8fe GIT binary patch literal 1723 zcmV;s21NNsNk%v~VUhtL0e}Di|Ns90001li0001z0U!YY0{?`MsmtvTqnxzbi?iOm z`wxcVNS5Y_X2Hs~?hD8AOxN};r~1zK{?7;ihZ`aBh)gPv#-(%7d`hR(sv~MuVzb|d?BMz>b3j5Zo@_Lx&1z^<2m}h{|^R8(kEDG2ts%mk*L_{D8cv$B}rLn z5ou|FnaNqWc^QVKC#v(=d5ULRu_ao!qM!GsX4b@^?4c)7pJ-)Xc9_@V&o?xC!{yx`k{K}H9*=-+d}2f z9dWpP2{We594u=R{I}Ak#GGe%>SXBi;Lo8Uf(j#ww1d$vOOs}6>d>jwGzFnf1!gr% z)~l$tPUH&KW7V)^zrFKXmJ-@LY1^X1={D_JDRbi*s;kW|S-ea5>hH?dI|C1 z2YoN!iTnul=n#OUWnm^$z{l4haSd2AB4Y6SVV~akoX6RDwqh5iV%tT)`=T}<|0+a)rg=w zFye;eDl9g4BaI3E)guL@>_}UYxBSRokT5DakZ@2Yln)rwR4LzwT5ic@mpGJiB|kad zRHc17&QsqGQv!6`nfG8o(UHorSd5#m&Ddr>b#k+3jMmwCr!;1XY37Iv37RH-eLf^7 zX?})Trf*Un3aFoxEJ`M!R@S3wq$#b5Mx6UV+6$)AMJj0%q*|KiZgJYPsyn9siK;U6 zyrQWKl}c);t-9d)=sq#RP-}q2jzMLiuKz|RR~KjCN37Ds6o+c@#bz*^sKyIs?D1y_hYSeE|B{>{$S9vS^2!Lq>#`>* z$IMpCG)rvr%@yaYGsZmkyz$IH3nui?iv4V~7bfGIbkImQ%`(hT?=1DyK38qE(^zMH z)YDvJRP@)^HYv8&_m(Y`*Jwu@_S)vD?RK?i$IZpke_c_~lDluDP*|cMdt(pfkJm=y!5%y0xXJ?n}R} zd&zp}*-H6(?OUGw;JZ>AjxB4vTgvDP7LRe*xgN18hfo>JUdT{E0Z{uDEf0aWV>Pc7`0pa9km_8pSkzG-e zpKR9QDE!H8Oqt@Lz@)gl>;LH_dp1l@^pXcXELsnBa#@}R!}G=Mr7&D#?A`(2D3cq( zagHyE-4R!3#~$J_k9062AKjO{KZY=ng4E;Z3VA;=A`*&+T%-%7=ST-CGLj9X9wjBY z$4lC1lA2s28#~E2E#{GnpbRA^J4wn?{_T{SOricFWGFM~2+y z>uDrF#&aX|+g}jqK~XABw1|&l#{!u+t3l4xf&=sabow!x~D}iiVWuQpGA&pV)$?VbZI$FH`i9y RRjU#0D^1!8*uWJ406R<;X7>O9 literal 0 HcmV?d00001 diff --git a/HTML/MicroMan/gifs/fig0701.gif b/HTML/MicroMan/gifs/fig0701.gif new file mode 100644 index 0000000000000000000000000000000000000000..f59fe0d45b61aed6eb9b3e5585996b34bf967392 GIT binary patch literal 1255 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 rXOQQpk59orQvd)vA_Eao literal 0 HcmV?d00001 diff --git a/HTML/MicroMan/gifs/fig0703.gif b/HTML/MicroMan/gifs/fig0703.gif new file mode 100644 index 0000000000000000000000000000000000000000..c498b472de6e4048344ce821b3dc8c4c72f82900 GIT binary patch literal 979 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 literal 0 HcmV?d00001 diff --git a/HTML/MicroMan/gifs/ft02.gif b/HTML/MicroMan/gifs/ft02.gif new file mode 100644 index 0000000000000000000000000000000000000000..304f1fb8e2840eff54b62fb0772b393b233b891e GIT binary patch literal 647 zcmV;20(kvLNk%v~Ve|ko0Du4h|Ns90001li0002=05Jdn0{?`MsmtvTqnxzbi?iOm z`wxcV_yhrBI_60p>y{?5#RBy;yYBqzO%Ca`Xg5Yt1jHmWw`0XAi=tGt(du<&U3bDo zlh@lCpyO@!l;vv0;&LoKMs?-3+IL;dE1GgUn9sGNCMAQmRwtN96&I&RME7QhIGF@i zcKJqV#JI=l=rgrxGujAhr=#UVCKx&C`YKu%_D7ME(t3MT>34~k8T!L1bqXwO9Eyf& zs)nZ;BoyA?mObZgc?y^di@$vPXvw-aNMXAn6f1UsN6sQfi~rX+di)q+)y5AaKb8cEGNsCu zEL*yK2{We5nKWzmQF79z&Ydlm@caq1X2U=80OkyeG%3MuOf5}Q3N>oTZT$}Q!gN%s zR-52}aC-%At5~UU9x{8F(BIg#Z0WRp3s=RQxOD59|O(9Rr`dy8cWD)L(cbIbye2mm`)TZ-rmWkZRA*Z1UhKcTb*==;t6Wg;UF0c}fh}Sn%l{Vfw(UF+fWnDoNOL2&?*rF~cYUtj2 hG?s{vLWRk=Uw}F8NF-xL9+@1HN-oJ{lL;0806XrbI(q;B literal 0 HcmV?d00001 diff --git a/HTML/MicroMan/gifs/ft03.gif b/HTML/MicroMan/gifs/ft03.gif new file mode 100644 index 0000000000000000000000000000000000000000..1cb4989f0bfda7c82b5fb9be4e0ab9ffa90f7952 GIT binary patch literal 227 zcmV<90382ENk%v~VVM9A0Du4h|Ns90001li0001)01p5F0>XrksmtvTqnxzbi?iOm z`wxbq6O_SWo{gEQiCQWyYtT%5*l^Lk5JH_=u_HR4MpYi1v7D`Q}M!>QOy1IP(@@!@(ua9Sb3mYbZ z)@;hfTMs*ayrePY$&^Q=t&BOd=FOZtd;SbMwCK!CBFdvXSjykjHqNOovC-FS$zB8B zWL?EIZ5q3uobdyw9I1SJUCq0&3j63xbZSLF&fZ|Q*;oMIOE<4NVdl86T>suSn0)^Dr(a%j{f3_ewh>iddahu! z-GJPA0w07hb%P!|;T3mWcMv959b8kubIX4nf+u2ew!L;@iY6@ho_qXYSPM1-0kobd z`fvzhF<@ng4?XReNDV)`_1B|{4YEkmkBE^6T!sK<1(Hh+9;c8t8_m&ENO++%WNIh{ z_fSg``e>yyX-eo(n_@cT;Z|_Md74k=!8RHScebUJX{+Ul=U00IN@$^m9*St9igs37 zAd5bV+D?N)N~v84`bp$I#O=qNhK$6;X{Cw6Xw3r!?J{3Qu~f)QLX(QB8L2|SV&SJ< z(s-(Lb;63MtQ5-lYcFEim0~ z3vRgLj!SO2=AP??nCPy{kgx2%tJ5CxdigE9@UEz7r}plv6?$A|$0WZ3`?n*fp$?3& zC>H(;UcCuF3~|H~PfT&e7GI2U#)~!zA5QHpM30VU>V_m2x}6Z4Y?3ZfqdCpCh#bfv zQ*ttF4rBLb7n!E|p++Om>M2R$RO$1l&9OxEvK|r*9i5=I8J#fp8O`Rf^rEONwcnLz zvy`Pi_(v{98VfYp;1m>Jmc*v$R>3#sV=#Ut9}VDjVecx@a?%8iV9Y-T{DHf8e}nee z0pV&YhJ??z>XcRcyWzol(K+waPX8uOV%R1&i6U~tK`!#gdNydB&UcI5c-roLZTjM= z8@{%ZJnGBr+x!Wsvoi7hb1cE4%f5G#zW@H@ms$sC(1l{$x4ERzCeO(7p*Wp4brv<8 zA2VadIj`MlMr0EB1ZuB6nce@F^=}$;cC%6I$7)sk@6S(v{r2DAZ}nxjM*NGH*Dk-Z z%uGSch*xAn^pn}JY(oBHpy&Xngt=jEf<%Eq0C|(M>=A5eMeE)MbH}r!ZE1W+>tOS& zHXWx;XICc-5n+UrASzi7a8QCEgS@uCvoTI}-Vo2)7KggsrH*rN*_-527B|cF?>onW z9XP_FJJa#-ZrH)0%SbnrQvbP*hcmK~7OBWZvpvv0#_*enC>I;zm~nMpwABtv$GVoF z?L7bcixqoli!C})b;DBJ>3A2$$4MiJs*&LIiL6l=erMaX`(m~&)YQ?<~;%#!lVVXd6)JQL_(tMo6Uu7=rTQOu5N;Kq$DjVWeNZQJB+?54*&oF literal 0 HcmV?d00001 diff --git a/HTML/MicroMan/gifs/logo.gif b/HTML/MicroMan/gifs/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..feed42ac740925e5a163368ce4e7a94c08d9ce8b GIT binary patch literal 4765 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 literal 0 HcmV?d00001 diff --git a/HTML/MicroMan/gifs/logo2.gif b/HTML/MicroMan/gifs/logo2.gif new file mode 100644 index 0000000000000000000000000000000000000000..8cf0382b8dddf3a3d43aaed91efec7759968b63d GIT binary patch literal 1212 zcmeH`;cFXZ9LJxmG5N(c^x3H8k)Guq*J00fm>X4lTfyYiZ9TNzqF_0Fv3l&qb||_V zV!0J|?X_<8$}$M3GhkAdQka3jJSfPyRkmCECQQ&MIKn1u*#;vbD+dETpDFB5@Rh%} z&-e5B{rJMOXL$GEi{m`vQGiewhCvXtTCHZY*=RKC^?I#V^L^j*JlAzAl}fo>E))v+ zeBN;!+qO;9Gz>%6bxqS$Rn2CzilWG}EJ>0mih>|eN(mttV*q$0Wx7WqreHiH8RnSg zzoe=tj5JhLktEM?OjQ+`2jje|n(T=XS5-AiT}iS9!Dks!EU-KwH9>GG6#?p$mI*O1 zmH=ErY>XX-W2^vV0V)`406KsT;IIIIgpi03K?oz%QnO7(uFFzWmRediFtxzZ!-^An z`Or1PmKO#!))Q;xpQFI@J;O94Spp0}7`B4I^}Is4Y&#AW1i%o_A4`ePwh-qkDpyj_P_hWP-^pv z6>Wpo+IRW%bK_@VcweSC z9eZZm&d(pWzP=bAooavb&4co6cIYg=5kInYVL=^3j}^J+H+&G8>$|&meEy~PuSatH;@Fm4x@WDI hZdWd5;-fnfnfYkyPVd}D>r0V2ZZL%=w#K4p*WU^{Mv?#k literal 0 HcmV?d00001 diff --git a/HTML/MicroMan/gifs/mo01.gif b/HTML/MicroMan/gifs/mo01.gif new file mode 100644 index 0000000000000000000000000000000000000000..22f336905c0dbfa6a7ac44cbe8f2dd3a3db67748 GIT binary patch literal 509 zcmVzixt!ao8CBe7N?D0qd~pqK)|_^0tm#wF$h zw8iv8S?IOtX)@^5HHx_ev*amhSd~Kr>Ok4bfYj3(TZ_9Xd;2=ITdRrz=w~&YiR+8( zntYbbswoStjC@Or88QsX{LIa}Y#q%DPE1{H4n7^I(tJ7EUZtjJme#3ut*KjTdVLnW z_YW|jz<~q{8a#+_1*Ztd61r*Vu;8VM{ffPd$mfejQQTpqaP)@}+s1zG@_h`MXrwVw zEKi~w(ySgnjh0BhtOM~To{Ktr`uqtrs8EMFd(FZ&)TpBeAPI?>m#PaInVqElNh5Ea zMSRkVbj3lj=%Q}hayhg1#a6Ul-ngwD$JSTcYG&7}tC#jHFf+j5aS{j1h~KxCv*g=re@(r?hE->S-TU$T9tZF>%GxL;$77dwIx``V5!*4l623)*tBcg zzKxs4?A((S^A^_HqS)UXI!aYZTz5<;T9Q9KgnYPj;PH~|o{l}c_U+uK7XSb|9aIEb literal 0 HcmV?d00001 diff --git a/HTML/MicroMan/gifs/mo02.gif b/HTML/MicroMan/gifs/mo02.gif new file mode 100644 index 0000000000000000000000000000000000000000..fbc92290dc79b6a8c7dc04fb7f52e4f0ec057e03 GIT binary patch literal 2309 zcmV+g3HtU&Nk%v~VPpZd0Du4h|Ns90001li0001F0kr@C0{?`MsmtvTqnxzbi?iOm z`wxcVNS5Y_rs~SJ?hD6gKqGWb-SW=&{(r*R0u~|gh)gPvH{!wAeCiBM=kkipYCScf z*VzS&joY&Mj1EiJ0Ci%Dj?3pv;+O5lMd|#$f3{aOW))cVcZis%xX9S(_y`#(IZ0V* zd5M{+xyjjiNmit{*JkBudYV&O^wg#Rh6)QgS_o%oxG?(0I!k2}`}-$KN+mW73aZ8#;^zkU>Od_*PwGf$ZAEH~$$Qe#01IW5|CNJxa+(EY})j z;t1WdXN@8RIJi2#B*@XFs4qIh6ziDNmqwi@g{HKoQe>w>!;W4AXh)+tWipjcy(kgq zgHq18?)tjU>NcgX)TyIr7OhNo@a}AN5H;(`okk^WgesO`S9)D`q06xrYh0>oQ_@{0 z@Q&N3a2sD8TQ|a8#uL0kCOmcU{A6<-@aknK|RU!UMW%bKIHLDg8$2{#xW5^WuG2}@z<~yCVr#)iAwu&RCJ$E`afnZY^z0X6i%Nj#VvN_xNMnsQ-iTw4 zI-+u)T`=zGVtPOhnZbx8F0%}gI|iuXg-&Alqml~VGtV?lK`G^uR7#WEmDFUJBa*e8 zX3IQap2-oKYWgVTnr^-cXPk1*NhcutP3Bu7mVICo2LrmWXE%Xf5aklifdEwyfU+n{ zgNqHP7f`(&+J}if=J9Bczg2l6Pu1vFW|P0=1luHDfVEd(cp~UscT%a9YNB6(rrc$F zf_B!aoH6={rH5ft&Z>DN*wsT~#^hg{dlWlV^H$q2*C1<9BUT!)t{ zp-gJIE0(+<%RBg551B5FRa?JTw$&P@o$}?Hy7FLHbUd0SsdCENntSYJ;eIIYu+zc2 z;jGSTTo|sSf$JDHolUqGhq*e7mCG>vX%(=~)%Wf@)8=<8VRCn?tAyOdY7@V@{XI5S z1pZ}qHk9^2HGjA4ttz97U-2EQn7$iGVgCrN@i1Q5$6 zwR06Ncu4Uf4T09i_4P`WS>wVR@92xTo$`6fE6#@u#JYIA(2fs08)`u4!Clc&kK-dH z1;xcfT+T3l&W;4EN!Wb z&goM5Y&53n`qxZp>aYQ}6Q{q(sLXg;5TEW8sIc(eP>G7vq$+i(Ol_)DpDM&Yp6{on z+@J$Zhs1lbF(!UG>OfnT9&~Yagj%)86)l68VhS{?MG7Uy_UJ}m+Qps9EEA-NR+XSN z5>_-r>s25G!xB=GUAQBn6LZ(ZeI3eZLlIhP&~_8Tv1DDbL9ACF1j>?u4r^drY{C5c zOSwu8lQIKs9wUUyRI<&l_6%KCI%~6ql@5oPQ5lL_m`ez{P-CZ^tqDc@E?FgxhQoDT zI&N9pN0#N5uK!ieZgJMe;^JhvFm0>xSXOyH`hh92>c(E~2) z;<{GBo(_3el`Cw>GLrX{6^`HhuNUbEvz`Q_rfGyjR0&aWTlrDSA?a_9Sg+T?;llYd2T2{ULHPCrsat zHjSWbo#fSQCR)%AdcG{onhTd$K1qJExm?O}dkHyX(G1qlJv?+p)w;6H0+Y?Db@SOa z$-wu*St~uW@O#&cUS63EyLc?GEt#RkuPMY-FZ(`3Wj z-A#J;yrY37d*7Sf`3CpC8D~>}|9jvBFSx-Ej_`!nRNx9%a>M;dAICmCrw;v+z9$Yl f-&vgD7!M>!x76`3UK`pR54p)tj`EbNpa1|nv=n-d literal 0 HcmV?d00001 diff --git a/HTML/MicroMan/gifs/mo03.gif b/HTML/MicroMan/gifs/mo03.gif new file mode 100644 index 0000000000000000000000000000000000000000..80eb1d5783f8f36ee1c68815c170a72c75d542be GIT binary patch literal 537 zcmV+!0_OckNk%v~VUz$o0Du4h|Ns90001li0001#06YKy0{?`MsmtvTqnxzbi?iOm z`wxcVNS0-QqDGpot;@y%e8db}&n}?zD$+BBRKJ&RSJWAaO4~xoTS;fsn()fp<&aHn zE{S_eebB1&dZKo>$E3I23@gfGa}^A*d|mnq#aD%H`2AiA9=-0%C@sBiJr565 zhi^_Fv26nR>Fd{uSBpP!)PZ5uOxZgp3I#2C7>9-oQTQA?di)47q{xvZOPVZc?~${U zoglJ&c|+JR88cVH6f&rbn>Sf*a>~ie%PuuOe-cHt6B(SMn$E}pq_7fGk1nU0lxj7r z)~#H-di^S*Dn3)=z>1l5X~+jX7Z(zpDD2#vwl1S~d+KIbL}q*?kh4-SO1LS2_YpK~ zcwjnzgbR5)XmeG=c7rJrwg@rcrHiS|u@fv<&p(T|N4oGhiUx_+^%qJdZQ6< zrYn~S+@rW-PL^B@*xe$lU%1tR)k9>no>DS@4n4Z`=^>p{Z@&Ec2DUP_*)+!b%}=tppmn!UaJ`Sk0I=v6Oq=d>*ZR))U;qRfg27?YNKCqpfFy%>U_zmYobQUw_JqP_ z*J}ierL3;v4I2baQmuEQUr%1&%w1x)RMo3v{ zsb}})_2tyKIp>+cnYoyDd5Q|BX|d`vnF<>l6BlWnjVexK;^>~iNdHJOZG?bO+C_%`IzA-$XCkjr z;?_0nQ_>tqjgme-2-$97w1y{3_Kc~LqMst+Ix@s~592&d;O;0L_jDs3cP7i#Ln4ok z){H^B4xE{S+gF-mKa?%&HP}cwE%c;&f%InDxpeE=y^A-m-o1R`u49I_uV7$*2OG|7 z5uTEzaSuD*WvJd&dx;)f))krFA*TB-dlm|2)nv{RKbxlH#Awwsi%+{I9Qd{DSVd>s zzKuJ#?%lk5`^F{uVC=U*e;WsBvtOa(xzDlW2h=6G#_XgrcTJU`zn682?}X{S`0(p{ zhkC3TeY*E-ZN`&FY#n{X?aBd;{pkL^U8RauTmSK-)ql|K1R!zxk%yCV3WAs1fxkhs z)`DE!=U{~vUWj3a8gA$ne}#$iA%_;W5~5ooo|u)1s(q4Gekkfz*>ldV_@ag}E)@oe zCDzE?jql`$2a7yrnA$f@ndIV-N-oJ{lTJPfWt37*N#z@_>wBxBT3 zhmu2`p@ZL-)#%ewVF}TsVn8p!spgtT9->np5Mpv(cy%7b(sOdqRu#Q(yG=(3m9=4`amPD^dIi8iYu1y^EwXf0~I z`JATrC@FfK$Aayux6I<%*)x*6b0LR12Y`|W&sb~j*ni^bX> zR+K&ikHRz-Y)fJVW0Inf>{JFK!43n$E19*@X%6-?7ynPUhdzt}nQwd;(`&f7+H}5xltHJA`ZoDBizVoJ zHd#vOu3Jlc?Y7^p0japlHtg=jk|Ji`zSnitue}csW|0V&hCE+7hW2suf@z-X$Fci=L- zb>(2t3*N@G1rCQ$zj)4;Tiw1lx?ao5B+QsF z$KCAS<~miOWes05AVXNk%v~VV(dE0Du4h|Ns90001li0001<01f~E0msgtgZM(jO%E~Ef~Sn{H;lb(#hI?D5JDZbByVb6YE!h> z@jJANx2!2sYRHn!P6jZo>CTd1=9(S<6|--=yP_r`V?$SHci83;xHqvFg*1qEA(v)I zh{%Y!u_*b{RTbnDxRXc%)FX8I7M60pZh literal 0 HcmV?d00001 diff --git a/HTML/MicroMan/gifs/pd03.gif b/HTML/MicroMan/gifs/pd03.gif new file mode 100644 index 0000000000000000000000000000000000000000..0abb9148062b201f767da8940ed38de50f02c2dd GIT binary patch literal 165 zcmV;W09yY?Nk%v~VR8Tv0Du4h|Ns90001li0001T01yBG0)&K*smtvTqnxzbi?iOm z`wxa)5CEhYo~J^#<>S6mDWf0F;B_PK(C$0Lge}9+SVRPQOq}tTSSoogq>1)gsjyaz zRJS;qF48bpn>~vyWoM+^%vG;+v~|mIv&QCPZ-VzEH#8TswIVdbCHPeHHOFX^C+S5w TX;}e>xyjk-`3V}TQ2+ot(tAqW literal 0 HcmV?d00001 diff --git a/HTML/MicroMan/gifs/pd04.gif b/HTML/MicroMan/gifs/pd04.gif new file mode 100644 index 0000000000000000000000000000000000000000..d6e3e1bc97a24fc318b7e54ca136c619e68cd260 GIT binary patch literal 2017 zcmV<72OjuGNk%v~VO0UB0Du4h|Ns90001li000100jK}~0{?`MsmtvTqnxzbi?iOm z`wxcVNS5Y_o-YRo+KOe_ubY2t*3|axEd3UGW-AW&I6CT23u(z1e+H&OY9r@xDQiD=(kv1Fya> z+nR=rphk&8&B8V?VT&!8KG7O9E8#g-TLPXF$Zb=^K>ycn*;D5YNSuY@G---8P>VQ? zoz|!<*-}u;kuy=Q6iM=?&YUuf+@bjbXunB?F7~8o$R?PVN@+%PDfG~sqc3}&499N~ zRiImmqGUsq$VX{oRhp~`^(xboPVXJHx)yC!vu<%RrMvTOwVP^-42|$Hi^D5~*SHE; z5#Yh49Pbp?nzHfY$5_o7rp!==5PlZP~ulvAlb!{CPcV-2hvqy1!z=IA)kxH_;ePk;5D`+l0PPP*DDHH$7Fg9_K4+jWI*VnP*@@pT|K^? zu~?VyiO{Baz!M}!cVb#lXLR6)-c(^$$*Cu> zcFGy6mJ!M$qaem zzVyz3>iZpx|8_mW(4q;M|%Cvr$XxXjQ@^D?HFQ(ujB)>?1P z^_x{=({K@;M@0Rke z(XBFg;s`>jc;hsD?ReypPfmH|mj7SArYK~qrWNNZV2C*gn-e#q=Ov6Dx@H;@va_r@ z2Pvy}O5PItMlT<3b4Iyaow|#jd`mlBaACV`=?VHxuh0`VRBPa)w%WT-zmM$CfJp_P zU5sHmpP6OL&#f+vzIPwJ^yIgNy-mX>%<`+^gFk-uH6G8rp68eUAdvv=dG|q~CcldA zR3=0|gN&1~hr1BrPjrc6+yY}oHwQj&f)uQv1uuv}TJ1~}II{=r7&a9jP)mXt^ik=+ zg)i)+@L@^o)s0HXgb$7)DF0*O`3ROIa5X|a>Ve_n=C&Z{87pGQ$``6K#+A9)hlD<4 z5R{;&yNB73XgEY7JCH;uCjU0kexABvHWDU9fwf3Q7-Jodw75l>Nu)?@^j*wyXCyef zC0@7ljNC+(#@cYn54_7Gn9^r3)ICjwek`OR4~fV`b}enedEp1420=m=?1mguBzsPn z!d^+Thaltt3(=THMov$D4Z92{pEt%Q3Mo`JQxXv^$)GMm@rx-s2Fr?b5osIQUt7sU{I9KU1IjZqU3M6ah+{#WsP7bF>8$ntO5;a+5WF<5iKQL&fZX=h*4 zy3dMsw4^O<1vzWl)MhZSPsx-=R9lL~HWO~Og6%0}`^|^g*0bQ7tPpo=*v&qvJMaW< zUyYkkv5Dy_&fuIlxMDo$irr?%p>imk*L|@D zXxqg`Qmdsl_9VQjIx?yBI0c#mvc@3xVH*oDW;5g2sfKKfBtx0VQ?9aW3IG5*dbQP* literal 0 HcmV?d00001 diff --git a/HTML/MicroMan/gifs/pd05.gif b/HTML/MicroMan/gifs/pd05.gif new file mode 100644 index 0000000000000000000000000000000000000000..a7fc708167f0708721d5a0927b7a39985c67a07e GIT binary patch literal 227 zcmV<90382ENk%v~VPXIz0Du4h|Ns90001li0001D03-ka0>XrksmtvTqnxzbi(%Mn za~3!r;)T?hi6&^QiQB=zcgja;;yF5(?A#jpK)fD_H|!N}p$~G$ROJ-5qcIpYI(M{J z6Ut0>sjc9u8l|bBV`YQ0wNlZ*`mJpDUib01vO1LXXSPIWm^Fu@b2#|dwwDqq87Vkv zd5M{+xyjk-`3V{-I!an`T!IAI!jw?dyAW^yPHzToB8+)t0?9x{00X1 d1$jIixUAeP(H0#o9r29gc+K7I{XJO#06W%PZ2kZM literal 0 HcmV?d00001 diff --git a/HTML/MicroMan/gifs/pd06.gif b/HTML/MicroMan/gifs/pd06.gif new file mode 100644 index 0000000000000000000000000000000000000000..578fcc9653af5b45b47fa0b398339d6f79c704cb GIT binary patch literal 1211 zcmV;s1VsBsNk%v~VF3Y<0Du4h|Ns90001li000010gwOy0{?`MsmtvTqnxzbi?iOm z`wxcVNGd^qoF$;DCh8_UwT0VC$;lg?y?o!QX zOUXTo$DHppM&s3lZ0ZA>{kh;;vi+_xOVL=htPWQ9^XAaDWJQOkxF{#JhuBv&*ab+K zxHSo9c*)qQm;@Rc7#QbO#i>Vm7Z~nK2Bb4evY25zRuq6{{BHq;Rj#;#%rHnHp(vw zDX-6-nK_ai8GIBl;6PB0_@pS9P@p7OuH3kx7f~HUQ~y+yglYvaqezP*OHP1dGNsCu zEL*yKIVKejlz%eFyg?IOL?A^BeX}WOS2&$JYhHokL{uDCUtpaSgbFDbrQevI(xfly z)QJ^89`%VSkDRRtALaBiG-%P2T$y;SiZ-nUd>5}a4XK4`*o-`7B<1=7BiOuhC1@pB z_MzaRn|4Ax?6KdaziF@;KogUVLBi*GqI^^idrq7zNb^BBk)g zA5VjA;$Ro3`P5h?tT>3_PZbVE)OZl86<|1#Ohw3nAaPdVh(k{Vc0zhSCbuXxW$w$GU+3E1+sM)BmvSm1xTl` zxZHggnR$?UUxMk^errb7Sw~*3cwb~fb|7ME+yRqkdAIc=OrORLN@$_Rxfj(zB!va& zW$(oZQFBnjM3IrGWap=rjBz1okt4b1SExn~(o}S@IF%rf@|j7Wsae&RrY5(XI;2jQ z)_UAeM=`2ld!Op)*+VIE=4z&|eCFwc9RK#HszmYyyXYFE+S;s)$o_F_j=h>#5~6l} zyX%h6Y6d5I<=SQ9VA*f-xzB|uG7sNa4r1b8~Z@>P^qQ;|W-dGU6|89Am zyGZJLFcM}Jn^v+}HoQV#dm?C{!4%JR@wFLme22vlGe|PXF}2ktoy!sUoyoJzIy_C&YIZ_TAc-kzV1dg{IX>>ulT zXsr6tCFi<$>>{+~G`1t#4pi;4A09gIHrbu)$HIq)tKoUWuKGgfs*E||$BO}T-_zri zaLd$`K#}4e){UK&wl&vClmDhBm^#hz5D%FKb{qh9cljE%?KF! Z`R^W4SjYgCL!ajzaDfbLU}*{f06VRrW|IH_ literal 0 HcmV?d00001 diff --git a/HTML/MicroMan/gifs/pf01.gif b/HTML/MicroMan/gifs/pf01.gif new file mode 100644 index 0000000000000000000000000000000000000000..16e8d82f1b34e10a37bf5f89a02ec952b238c78b GIT binary patch literal 1037 zcmV+o1oHbwNk%v~VG;pu0Du4h|Ns90001li0000I0d4>Q0{?`MsmtvTqnxzbi?iOm z`wxcVNS5Y_rs~RKL4dr@OGkB_$kd(bF?<0Ugbkv?mbmfjpXxry_kPJ|=EjOno>r_iAR#ZeO>N7jj?N{Kps3N@^G3pLIJIq}b&bv)79&8b$VyM{#-+KRXA9of5tQE+5e z`~UwBV1RZFCt!gc)MsFVuQjJ&gQZ-P zo`Vu%0U?4DHki_N7j8%rTpWG~Vu&J+NMea5o`_Ac+O?88puzrlLI>baP3L zLRn~GjebBUMshedCK76o1<8^}L?UU-G|?$I41yr}MPVBmj#g!o$V6DBH9mIvT~W$F z5oLLK?e$)m;60<`mu;%a%yUDwlSy`T28jiFcfPo#oA0G*8<=@Q*W{FFW>n~DOeVUR zn?cO?WQsio7pbF`UW#d^nm#qDNj=mD+iPIh=wqcWm`W9@0fsk4ZO{FfAB=UW=IJGx zZ8U3JDgtJ!CySa^UQ=2mCdW@?hNG%~o$Nx^>y>sIwNp^ivRNaq9oFjHHP3Pu=(X5t zlP4_6@|Rt!vBFm*kYXN-NVLuvWiFSSa<>{6_1-(LRZ+5sFP!=Q3vj>!4{QQ~1aG(O z!MU}UtHKM{8J@$+StqZ=y-}R7#jYLJsK)D!>#<}YhfH$GCZCM*WF@7Ovd9g$tS_)D z1xwn>w!%!5uYvVaPABc+yrZ{2Ys9P#KnMLTJ>4|A#H%A8{Sas#u2WI2uR@J=)>?1P zb=O`yXzD4^FrO H1poj$xUBlF literal 0 HcmV?d00001 diff --git a/HTML/MicroMan/gifs/pf02.gif b/HTML/MicroMan/gifs/pf02.gif new file mode 100644 index 0000000000000000000000000000000000000000..c7173923fb29970b3f11ab126644be4a150b76d3 GIT binary patch literal 1158 zcmV;11bO>MNk%v~VLky?0Du4h|Ns90001li0000!0agG20{?`MsmtvTqnxzbi?iOm z`wxcVNS5Z=1p%Tut-3;S2ybn2TXX8ta*qm%a*UT`=OJd48sy2zflj1C6s&fQT@TrY z5l{nXw}vpe?AngSVYZfhc9+k)IBQks=HTtV`u38?r8mR3cZdauCs>sxHungr_pk^y zh-aCJwy8B$SNRwy$#gghiqxrqNhO%NX<4ZGrV7OQDvKK%*+?N8TKGx%iv@eD>nanh z_^awv8tIFAd#On~nE6SJ)>VC7#9~YM1q;Wka|*i4ywK^4TO3Z+dZCV=n=8nhPAAHjhK%|#dkksF&LU;0!-H0P8TiT@G*5HZ8ekeWN`+P!nL2pu7D z8C&x6)+Ldoi5cJ6MCdT5&YfO<@RIlPNiUv6i}I8Qlm?TYCfYnS3N@C^lo%6k=1$ zH}P6Jeta@bD2`!DK#D6{o&@Pxt#1KsNi*#2vgo!SJ+h(`dEz~qa`2KG4Li0@#Cm1h zzMTXxXWYDd`~D3)xbWe`i!atqiMH|OdyzALPMk5^H8qt(zm8SZvel*4VgLSBd(2rg z@qs_jRXh&z>hhw0f0d)3M5g1yzhBll{{3g|@c;i0V1NP+NML~m9(a^9`jJqYbv8Iy zL1PFKwO|QKRG6Dv6Ydm;MD(zd24M2hbr(elT#cdWurjHrtVq>Twa`$PMstWcQhzci3WttL`>ZErO z_E=A_PeH3OI~-4<&yDc1=E|$tq6qXWj!O2DiU3J*4VRdph6XWJ(xfZN0lhOSCzQ%>)hle(GbjT+*_$R`)=9gwjHl>(& zSXtO8iSp99XUMdA`3N=XbyxHm*cDZ&7`ix%c+~3%44LV( zNt`L`n7d4hEFw7UQhm)!c_YYL4JJi8cIQ?DcgCz2w|>rkOxZWaI8Ris(-UNmgrA|T z|9_85K7cF&V(>>Wp~8g>8#;UlF`~qY6e}*ohOLM^D|nx9S^UV*O)*m+j?n{&G7Gs= z*8*Y+mj|XvX`E8pq&7pQ36{GSy|jqF^i{>=WJmplsl3Vkn+t@757 zR=En1jcS1gQ9Fom4I5O$81^|-=pY+H3#aj+wycvxF8}uSc^u(w-?e-vMjkQwF(n0s zD&qlMq*7nZnKWzKyoocX&Ye7a`uqtrXwQ%XK@cUfOH@geku136AymUrAt9KOuzC`! z77m2-Y?9=Jp|gxoVbSC+Fh|0 z?bWr#?_}L;Wo+(KOz9m?u7Vqh&I=xSS_k zhR4?w?A4yf2`)TZFg|^V>t){BZr15}sMubFYsK?jH2=})qdBs*} z3AMH+XxXcMNC;XLi2vU>Mnp7W87AYx%!>neF5;|GIwK*&9ax6h^r+T1-CPPfR3>?w z=fowK_Ex}NB++ZeoANp^@xhPJCjRfGGKVcC^8a(G*fFr^Hxxp&99W7>>-gahNa}F& zU}p|?)SrO?BFLXd@VvAjbc=ywnSLDU6I6Y!0Qgyfb%hiTh+}D3p>)|j7!FlyjbjLn zH(s;iixtMmph6TbS6pTslHwSO|Ak0chg@`+j7~ZYb7G6P@E22ndu5{_h$5y~C6!%b zIb?FMN$Av8prwh2RTbN@}U5o{DO!s;Qj3vj>!4@_{u1|N)Y z!V04%u2BugSwv}$=G0pgT7HP>!p-@`YI1n;;(JEG@=_j<(uH(V<4dkL>GuEcxj=@aGMT72`)KM#HM(oau)^}-$R zT@iOfD)9x3s>B5IxtWdq@5Xg}Th^2v|D@}U((IDynI;OpH!^#gi^_d2rGLrs`%;~} zz3zY9nNQDpXPupGf_@3apH@&+w1f=qFcGrS=c**RC@BMKUuql7mgc1o3Wh+(Y1~e@ z7PvBHt{Q&Z5`IV(I0<$Oe`+yQJk<6$Zr$ieVd5LND8~-h@epGJBAuM3l%WuQsD(sA zV)>9Wwk-XnB1&6Q<+i6d4*v=TMlWR1n8Jjli*asqAwyvjJ-Ealj*&MI|O?qCc(9j=6iBRSdX18x4dy4h$3m*`zZ)6>xW)g5i~vwJPF8%6gaiRPyBV z#MoTYR)M6X**po#P>OPtq%5T=TSdnSM&^{Pj85NXkjYjCj5-5MCGXO64rVYgm&%dl z^vp9eD-MxIkertii|NbfB}IS!>67Mo);II0GMUx`AOPpqAQct!XjP;pDHTbq8}1Mf z_j^yy<`frisv+dJ?y--54CEjSIaS{qaw&sqWMKJEUd2KtUBMULBqQ&uT41JY3ko+W>q@IJ z1XNA^lw&P-@3f*x+xK`FW-+f%er0we%4(~-G^;r^Wai79l}uSX-+9k`?z5l&?3+X^ zkEs}l2W8uxo$DDx$$Go}G?pHrgcR`$CkG!1zR z8P_*GI<{9vlr$ylh$HT=cC%Zo?&ixzXL>GZ24oR-Pi(INS~N(nrZg<=i`e%PGqYdL z^v#|DY=^m&BrtsnNmt!zXR($p`rx+PFqcx;4)Jgn+z@h*UC@Q**NO|gC@rHM>37?= zATV|IwPPx`y~$9Fqpe(Q)t$4Bf&{O#LifMPr$o{!1tYtIcRvNq@LZOIcAB2TzG)gc zhg#%|2hZq`mc6|-&oPzbRI~u&bi{Dht}my)i$ZsL$DT%!d#1qM2v2@nek&^0!&>n8 zbpOn0P+NR8a;|D}C7Eq=(izZ9Z@Sa{Y|HHSN{GYtXwmN+@*H;&uFu5S(?w<8yHZ_` zth2fy?P6sqex2rD6zq1KC>JU&r0uL#``R-m$a3d%O&zs6BZi?S0iERT4V9d8X8wRVoIJ|-SpM4+ebkMSf02}4DgXQH zfB*dNKf#jjfAtlB6ZL9(wL0jeeFHcI*FaAf}mG_pSFbFQ+gOhiIu2{o5+b!Cus45G@bYw5dSlGq9|4% zSan!tifa}-l%sH~c#5s4ifIUofhLO=^oq48PzQKNk*15k2#mofjKfHb#iL=xcpo^3 zjI9A;=^IJ}?$-)ToV^k#az@a^Fafqz9gsIq7 zkXVaWXj$sGWPY@Ju0|Yl!E5z`Bf=MdcNalt=zYqjSUogFX;(H};)44Ze{iT-a(Fq` zhk3TubphCA$M;%%*i9E%djM$-5h;JWrh6s#QY6A)@s)?t*lX^%g8V>*>bNyA7>_O~ zlQT(^8UvFxNdqdWjq)aIv=)Rn`HeQyfbLNpILS#9h;1BLlt#IazW>LK6zGjiITcfR zOEH6EQi+vWsg+yFm9wX4U3pbtxs5lLiDC(932Bx&d5dWYDr?D>IXQCu_?EFZmz`3V zcZrvI89j4RGok2gd*@(h>1cM<0)RP~_C|4e)p?3}Z+jVXvsgdEBO$hja8y8-lu3Vb z36w>Jig8pp63KhThJR`EkoBm3XXraTH=2^>ndkA95;++<$zIBsh68zvO?E84c4c(; zBORoX!C+Cnab~u*LTtE2zPOp=;)ASqM(q|rZ#A5c#8W`hkc=5v%v5aP#zxc0khSHI z`jngq<(6P%n;qC>9mt#-hc$+$O(g<~3xr-L#4a7zW|x(ijp$ipyhuP*NSfoAou4>O zLMR`NNO`E~lgnhFz!gX$**_-olewjrQx~DGG@%u0p{ZA7OBbFi>2;=ddipnyQTAl3 z=AQhxn1JMFQb=XQ$((ywWiH52zL`NLxRCRSEVOc1;)Fze$buCKnymJ5lxb!G)F?g8*W+z#VEGbYfSy$n6p;wBfSt@N>YMESmJMOnvs-u)dDQqXIgfsy^ zM5H6VnKYmUjq+xqvO{hSIdTOCjC>iV`-Ve|Q)-0RiT_z^cf}MyBRX=_q-L3DWjT|E PsXQL(rH^Ws1poj$SoY%Y literal 0 HcmV?d00001 diff --git a/HTML/MicroMan/gifs/pf06.gif b/HTML/MicroMan/gifs/pf06.gif new file mode 100644 index 0000000000000000000000000000000000000000..2660f635a4ab940edabb37d6037c80017df6aceb GIT binary patch literal 345 zcmV-f0jB;(Nk%v~Vg3LQ0Du4h|Ns90001li0002~01p5F0{?`MsmtvTqnxzbi?iOm z`wxcVNS5Y_rfM3r!Qs9uCIc=Lzc~!IcHMLA7Pkh_aNHz=#w2j5Jo;vqnw7{~K9M*f zPjMwmp(8T)VMfGyGZ)xvcoJ#=G8io_+@QW`pI$$3-^emNO`rNY_ZHCWxeC zsn&LQ7N!$emjx;*%47ugRT;T?x=LB9S~z+d#s_uB8Y|}blnG}m>WjB~v*U{!2>aFf zYD%bR?B@EXb^A-5OnaO5Q@K6Zm}**VD?V9%eLTxtU0CZ0eVC~JZaiyN{GNW?R3}I5 z%%*2ovti!&1!RRMmatyiHYJpz?jfdyvLvFiWRX!aMmT=-X=8C>3zd(CJ~%OFO`kjn rC#g6pVNnIiXdWn{1E+FcgqALQ`uqtrsL-KAiyA$OG^tV%1poj$<42(w literal 0 HcmV?d00001 diff --git a/HTML/MicroMan/gifs/pf07.gif b/HTML/MicroMan/gifs/pf07.gif new file mode 100644 index 0000000000000000000000000000000000000000..52514669eab64828a68505567c06072cb06fb3ed GIT binary patch literal 1210 zcmV;r1V#HtNk%v~VfX-H0Du4h|Ns90001li0002^0AT7GCd24x%i7~X}!&z?R&fY`91zUnuQLQ8hl%`HI}Ydm{>>emdgr=7k#Hs zpN6d+7JhRI{u>i;iNb{~7DH*6e}`uxb9+)jQ<)fdi)47q{xvZOPV~1GNsCu zA~>pI2{UF%S2AnbgsHAgI)4&x`uvHi4>f16o&i0IG(xL^(pJ$-3Ki;7A5CFBjf&Oh zyPW&nWXTFPY!$I&%c{C+Hm%yVY}>kh3pcJ@l{8(xloY7v#yEtO5tStidN10v|poz1ECAfH@Kn8$RU=*cHScNWUz z5yl|X40HK)xt<~f5eDgP{A6~Te7arYoFI;=9t znV>OODzC_0-`glWqrOX=U83Upb;>%&Dp;?j zaKBAh+UZaW z7rynbLl~a;+j6$Ok8g3C8(o2#9B6i>IoTO}Ueg7N_MfmKpKb13=V>*_h)*iCm^Xi9 zyHZkK&wcmafBzFl(Sv^!TGNxST)BuQTs``fY3if-_qrcvb@9(WKm8_|?qjj~+mxi< YX(n3#gINLPa=rs9aDfc;NC5x;M1& literal 0 HcmV?d00001 diff --git a/HTML/MicroMan/gifs/pf08.gif b/HTML/MicroMan/gifs/pf08.gif new file mode 100644 index 0000000000000000000000000000000000000000..57319bbd7e5fdc5722cb06972b04f34f91a38800 GIT binary patch literal 2495 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 literal 0 HcmV?d00001 diff --git a/HTML/MicroMan/gifs/pf10.gif b/HTML/MicroMan/gifs/pf10.gif new file mode 100644 index 0000000000000000000000000000000000000000..122e605f97aaa69003eb332d089acaa6a148854e GIT binary patch literal 170 zcmV;b09F4-Nk%v~VPXIf0Du4h|Ns90001li0001D01yBG0*Qo=smtvTqnxzbi?iOm z`wt$$7>Hy;mWXPwj0=qK*@iJJqxCN3J1pV>XFi%K;ajMdt7Hth;z6ImC~{enC7sSI z3y7Qkh+-7jc)L2n;?&nVq?Tu`ti7q$S@%*oH9i#Q^_6l{=oYxuWaNUzRR=a_6Cs#U Y897-|X>qBrnF$&yI!anX{_|2r3P+LKw2I@@ zw46r7O5yc1+*1VPZki@X{&_jG=FOZtd;Yu%ARo&$%YsJclVMQLagZJgW8`DN#5=QZPMVvmE>_{T8P+8mHf&$8d?iD)n^(A5cfZ^*T1E{fSUK1EU}1}eumc!5 zcdR#5jW!Ol$!&&o#9WU*9@9sTzo~X!b3PvF#%vUkD5ZZ^atLLMPi7g@mRx=bW|(45 HPyhfsX%I#6 literal 0 HcmV?d00001 diff --git a/HTML/MicroMan/gifs/pr02.gif b/HTML/MicroMan/gifs/pr02.gif new file mode 100644 index 0000000000000000000000000000000000000000..1dcbe54edcf03bedb100ee206691584a57c5dfaf GIT binary patch literal 468 zcmV;_0W1DTNk%v~VWa>i0Du4h|Ns90001li0001_044wc0{?`MsmtvTqnxzbi?iOm z`wxcVI0XS>l17@GD+`$J0w1$%*N{A`nJ(%vgu>R&SOJE3Ddr329P(nlDUF3gA#EtE zj_9zyx>aj*C8ds`lNOdzu%Q~(#ICqaPyQ?M2BdXN0SHU*s@q7 zcA2#^2)F6?SNZlR%D6W-iPTuSIHty`2K2Sc$3#o3c$hUMM(Ks)bas=gJDkbOX-3@p z$smtvTqnxzbi?iM+ z1oatS2#nl`Hl&)Y&gdO(2g_y&$6&3C_a6F*TA)Rck@Mk}%iOFagG!%7sdd<)P?4XQ z6IUx@f5Ixsg`OONI&XIt7DLxrBle2lw&GjoyBEjiSvwxyh+e0029A(@Wm~ literal 0 HcmV?d00001 diff --git a/HTML/MicroMan/gifs/pr04.gif b/HTML/MicroMan/gifs/pr04.gif new file mode 100644 index 0000000000000000000000000000000000000000..a577e470c89547a4be50f4b5f5491fed2583560a GIT binary patch literal 532 zcmV+v0_*)pNk%v~VL|~K0Du4h|Ns90001li0000&0U7`R0{?`MsmtvTqnxzbi?iOm z`wxcVNS5Y_rs~SJ?wbYyBhN-%*7C9QwxavNC_>z=2Qa>h!ichi#-+P1d^ zb|^vqX5%Ceb|s#(p0XoI6Gzj&dQZ3ZD!Jyqb@~MdM7AYo=hlEoc82KpH+AG^gqO58 z=Y$YQIXKo?nFj=_)#XL1Xtm}^nz(7|>R1ZFS30{W`Bk}>IT;0;xQe>y#z%)G_=)NJ zTC1FU*ZWKJDv9dTm}@~iEgkmOC#YLtObwh&Yc{<7Ek1!;E7lxZ9y`9iN@w3}jF)a- zA79NKsC>AbT_dP2+BjjUmL)VuPS!ksz})d0$O)dcLh~GVfWu+w5-TRVGVQ|mNTVn@ z9(xtEbn?g(P2tdedqyad!C87xo>b{f=CzkD!5Ec@q2N)BOVyB2+O4V7iD95k1$dR) z2uSR*di@GEtk|(+%bGolHm%yVY-K_1YT^pXI&^imy^B|Cn-e0nQT&@X@X=$BBH^?a z=T=9=pKu*O2+W^JhqgJ&CgkB88`&nEPq*@|n_`y~Z56o8lGCvX%^YX0U1ZyfF8>aG?c4C= WT?84A7k&Bl?AyD44?jNn0suR)XA21c literal 0 HcmV?d00001 diff --git a/HTML/MicroMan/gifs/pr05.gif b/HTML/MicroMan/gifs/pr05.gif new file mode 100644 index 0000000000000000000000000000000000000000..4b18972f3400a5a3fb6f0eca44e4515f20305eb4 GIT binary patch literal 468 zcmV;_0W1DTNk%v~VH*J%0Du4h|Ns90001li0000R0T}=Q0{?`MsmtvTqnxzbi?iOm z`wxcVNS0g>ASjfot+!%m+`Xn@Gx@#jYUl$7A4A!OcI5q(rJ|8FTSZ&Z!&HZyHMF>w zl$v!^tu}6#dj*uuG%304`o_NMHhY}NR?X`78*JybH3P^iYFYTG0P1Dwy1E29nhM#vc)FEnYR4(28nnX}D}j_*7bw`~ z30V7yhiI!>IvEW;dt5wSxu(^c=Hs-h$jg{5ElWyUjV`8WD!!UCw~X3Md$~O-U0?ls z9sY_{vqSgx8O${$VVYxD(C~@#hhap0@d%B%@(m9+O|#uZ@kzGk%%4QMo`F2W?A#z- zwCzxTCNyilvZ(PMVCOUM|=IbG8maVaQ3v*2f zuP@VjfUW6cXE-w6YL0RTHEf#$^k literal 0 HcmV?d00001 diff --git a/HTML/MicroMan/gifs/pr06.gif b/HTML/MicroMan/gifs/pr06.gif new file mode 100644 index 0000000000000000000000000000000000000000..6ce3d98e3c4f9e2ecb5fffbccaf439dbdc28000b GIT binary patch literal 484 zcmV}aJ>5f{TEs~(q?6c=z6vw*tVJn5&2)IRTzNbI z*Ts#67hN%ItSEcWDw*1Aem&K|HaKZs>i6#PuS;il1NbJ#CI&aSWVqJ1)|i)fmJr0^ zSocztxL6ajiFgy*FqxR<2?qK}c9&|&nn`K80$b|ofQky&R(e!PS!KH`Iy@@)h?zPX zJlpw8DjG$~R0+g9-OCrL_-xx<3rS1{?WWs^2mbB5%)Mpon*83Z8qQqKYkj*c9-3R* z|2wFaF_y1+k61&A55HKn7-vm&DBUzeNWD=)O)U<1J aHElb$ZOI&P>;4TqxbWe`iyJpk00295_UBsw literal 0 HcmV?d00001 diff --git a/HTML/MicroMan/gifs/pr07.gif b/HTML/MicroMan/gifs/pr07.gif new file mode 100644 index 0000000000000000000000000000000000000000..db9254f198b3cedf342e0f3fc55c7466f37a56c6 GIT binary patch literal 508 zcmVoL`C_r^=Sm+oZ4!%lgi#E8+vt3_+e^cytMsMB@(UD*|yY8xbnCR;Amj zH>O=WUS#1d3Z}BqU+%cYj5|BI1@vmp=dm@WJ1WN3Bu2=96hn9z*hEvOH-R`PH#g#D zSjNX^=(mZ2802V)CwIpMI20!OHmORf;W(wWR^}O*H29|!3M8qj$jZ6YxF|Ujm*rYX zRa~o<8rFRF_h|*aEIMljN-aGstqp+&dOMkHetyx4-YJ2+{tlu^2M8YsSd6sp4urry-qHv5Qijs~gvv8cTI4VXIS< yv*vWlR9f5~?p`dqpp1_Ah`UC2PqC~%Rzm7e-_U&^D002AqT=Z=K literal 0 HcmV?d00001 diff --git a/HTML/MicroMan/gifs/pr08.gif b/HTML/MicroMan/gifs/pr08.gif new file mode 100644 index 0000000000000000000000000000000000000000..0fda2b49b1fb568467b5743ecbd32dcfd8f11297 GIT binary patch literal 667 zcmV;M0%ZM1Nk%v~VY>h@0Du4h|Ns90001li0002H05AXm0{?`MsmtvTqnxzbi?iOm z`#%K%B0?j1f~b=kOWVX|!biJ8zs_G|a*LOSVc3P?n^KcX_EX9ST(jO23;0r96SyEj1#Nl{S6)tEUtk~o@jjj(XHO@{th26KTlt8e~(`gg>}g8 zji`@BzJG9b$n#h3o;hXdNb#FykQkX~*@`V%^AO@hR{spaWITqfkeLhDdTI1jDc7Nt zcOvDAc*~WmSuVScoW*G-o|-W_-a!eI(<@nKt_fmEb0?-V>~6kXvWMvqEW8AEVl@;i zke9HQDoq;E>Q!4|bqc*vbXhcq*@iJyn-=1}H5-+tYZ8qgwM8dOf~hqyu;8#g28%Oi z*dhgli5ok93^}so$&|zG6PpShxTckd1f(T_G0DzB{5k`O*NZlZldk+i!&=s{*>!!k zJsYniuVh1a$;MfWW2djbkM<*M2dhHcnY-d53_K{VCk|0l!tIo(VAWKuYL(6vsdnII z$Kl-CRr&I2$VU04Hs}mnkQHH{B+9IB61B9Cl6od5T0S@Z_l+vmkksE06Xo- BG+3mch7HF|OztGkSDUR}&c1zzZY!NLZ>xBZ__?jm zJ?XDYJto~Im9h2@&?9pQ%Pn-*P|-neZR&}6M$8c`WQpeJ?aC-|BSkwR6J9F$&`v>n zBL!Y`CB@P}G&1)+sn)Be&6sqAwc_N;-L!)+ck)a}Q_?L+7?I^v3N9$lqy%kpL@KbV zCMr|2vI45k$zj)4;TT(?k=Dgh7kl-$r zlrby$Rc$+Wjg(ZoEu`2pSf7zf0LEu3cz#v%^c_i$%@8x_!yTyT2rr QKA!Zm$8YuZ4kiX`0Q+ez)&Kwi literal 0 HcmV?d00001 diff --git a/HTML/MicroMan/gifs/pr11.gif b/HTML/MicroMan/gifs/pr11.gif new file mode 100644 index 0000000000000000000000000000000000000000..767a57064ac1cfda66031c4fd0414891abf15fed GIT binary patch literal 111 zcmZ?wbh9u|G-u#rXkcLY|NlP&1A`6_Gk`=GnEYD$SDt>$zj)4;Qw_~`HL}0f-VtkZ z)6ko@ZP7~3J%(l1w6rf--Al=;`EWPQ@m|j{4OK6%2@`iHtL3^byU=M<*?03?X$VVq O{@sl~d;HY77_0&L=PjQA literal 0 HcmV?d00001 diff --git a/HTML/MicroMan/gifs/pr12.gif b/HTML/MicroMan/gifs/pr12.gif new file mode 100644 index 0000000000000000000000000000000000000000..3e497088b283cddcd6baa058445ec31c1c482c57 GIT binary patch literal 235 zcmV(YCB lc^vl(yo@4TBF$o0biGj=gMCZQ{S6*2K2Bb4ehyIp06Q&CaR>ka literal 0 HcmV?d00001 diff --git a/HTML/MicroMan/gifs/pr13.gif b/HTML/MicroMan/gifs/pr13.gif new file mode 100644 index 0000000000000000000000000000000000000000..31cbcd945a3edbfb69520dee8d585e179b365b29 GIT binary patch literal 384 zcmV-`0e}8SNk%v~VbA~>0Du4h|Ns90001li0002c02u%P0{?`MsmtvTqnxzbi?iOm z`wxaefQ(@>l4qHID)yf35wCQ;;<+O27gqjsN1;;{HxaW4q$CjqJ__zo0b`__l zW>~j|*O!SFNO4Jtls5KRHkzmj+3D#Ng(*2mDOeb~=x4Xd*BGh#M_4I~(w2AHE2hZv zdb(^JQ3M^0)KIGGss)%``QTNAJt(!rveovTdpn)(+3LLdqha+960aoB4Qmf$n?DcA zj~wKmz<~q{8a#+Fp~8g>8#?5+kHeFP6e|vUN6(^08DHT9MXUzKRWmfRMs7U$OVp%E z^?aT4Qw$xaj3{d=@fK3nzH-)fAwtEY$r9oQz22ftf8_ e$#zh?7NmL4t5|{)Er1=1Hm%yVY};-q0027?M7H<< literal 0 HcmV?d00001 diff --git a/HTML/MicroMan/gifs/pr14.gif b/HTML/MicroMan/gifs/pr14.gif new file mode 100644 index 0000000000000000000000000000000000000000..a34865472bbf3a67ccd974c975ffd086ddd9556c GIT binary patch literal 684 zcmV;d0#p4*Nk%v~VYL7}0Du4h|Ns90001li0002B06YKy0{?`MsmtvTqnxzbi?iOm z`)>pRB7%@OniC45smhhG^UkL#&u+Pgtp8K+4#D3L;3AP^yjQKr9Ho-Pgjkj^a)EUh}x;PyIHWrx-Dv^(CuXNgz7KbnveAx2g>=GTyBho^X#S5}l5Sm*dg z7Rexp2n5+Vh&7fYNI2ODw`MxUD3mvON~!vYM;F$2Sg2{ZNwd@2%eVJ>1t|=~IUH(v z30%B<>6M&m)borr{ncvIqCLnB6YQOV9nMVN0dAhIzRuq6{th26KQEtatYc5Fzk!~O zvrq1qvueSP44kHmi;`#uv+U^yP#i*0`PeM7^Tv|0CI72p!HMXN%ClXpOv%Z}NTjP{ z_dbH;MloT(MyOnR+&E{JBbP62j7p-ilpBgM1%4q`ZX`9HJ)1U#=rk%ks8Xw1y^1xf z)~#ImRebQZt5}X>%YK7G)EBU@W~+(;1n3qns%@Ww`W08#+`3)gI<%#i6kn`MMfSie zaIj*MiyKR0>o~IH$&@QwzU(32IBf+f(3Ny%VWxRA(><*48AED+EiMve*y<=RFL$je zBXrGg%ST07Ldmw;vqf4cZR+&xs*Gr+qE>CvxYDFUO2o{LQT2Q{)ih7>lhaP?iB8E6X2BHZhW>(@kxp`6xZv|pB;5~wEs90ROX~v!$ z!^Hv}efyX0EAE0RTG=ZAk?H literal 0 HcmV?d00001 diff --git a/HTML/MicroMan/gifs/pr15.gif b/HTML/MicroMan/gifs/pr15.gif new file mode 100644 index 0000000000000000000000000000000000000000..49a003d44ea0ff0c0c7daf705a9f2f4a4d01b90c GIT binary patch literal 678 zcmV;X0$Ke>Nk%v~VZ8u70Du4h|Ns90001li0002J06hQz0{?`MsmtvTqnxzbi?iOm z`+o%iB7%@Oni&eBsp^%m^UhWs%`RCXGxB4Ca$uQ> zTZm~RbJ1i$RUB#9(F7=2%s)G2_8ZmhA+jz(xkUpy)FBw3Oq-r@3e{=Cs8p+3y^1xf z)~)|KwwcN`Y#y*;%W6oe%9s?PX1Aj8MTjOavTdQh^#K>68n1P&-W>~ZRKUJizoCT! z=3f#$&@QwzKl5^K)#x9Oi;(RWJZ=U9p5}*Gc`eB+VqMJ%t~3qYiufF zyfPbZm6kpAktFRgUAI8dX7#Zp5+qM)u5yB^^!naPj15oh{scpf)q4} z4ulR)NMVH*UWh?xEpUdRf)aYx;Rh0x(u-{W5f}z zca(-pKOOkh3pcLZxkJoxvl}+AKfS+#(PiPcn^~;AHg=gu z_%A|~LSq4(suSwfDNBb+iKx_aV8nz6!#zcD=`PG?c8cm*@#mt`jfomorqHuukY;nr zN_t3T&r+7&ytMrLwd=&P|34HQpnY96tIp1mXat9&MDRX*%He8s*v zAqL*}!`J01TCo!=uJ8i<_-MttugM%x{t5HX7ys>lUw{G*NML~m9!N=Kwe9B&UL7#! zAYg4VI1_;O(2&-H7QV-xY4`Ybn|9p&Bc3MT<#AaSy_85EW*y~6&xXuE1EVR2si;Xw z^2BkGPtdKF(T*6!u^MNYy(1%soSdardH|_t8jrB_$Xj$1CFbKNMdB0Xc}WgKqfDwf z>06FCN=IaxEdAJ;ZdnpJijnor8B%xMEmsm9*bYu!xipmr6Fj|cr|ziO#>>{c^xlhazWVMfPE-62nCriCg}8^nbFpf$ zdk7~y+rkVVOfb9;6KL#$&Z zhSsM%@9I*v(2vs7a|>n^dEyo|k&%V_!CQwteNF zc&2lbo-9fcD5^fY=xO4TpE%rd!2fv)tA(0(42Gm6L0dBCqK{5`>BeDhI#)=i?#@f5 zipIL&qJmvj#j$e`tK_5IZVl}}`x83v#rW!-Nwy1*eDcaK&wTUFuNCqL(Tfl=$w^ip zS*cwc{lUtQqAdNmm2-cL_#X`hv#8WFwlvP>JEj%bF2_V)-H}VwB>nl@pAP6{%hcS(CkDEvUD2Un-TFqpaf~l$%`%&PA_uJv4$4M41B3_- z_Xl28>r~h}&feZfxFC(og7OiY-1t@@5GBWk6Lg?(q;|3lmOw-m+78-2=f0H~aelBv zVgDj_BJQl`a+71%wa~Vw{r>@MU®7oP{lFp6;!{u(1Tf@j8~@QGw;1e5yO*q}GU zaYk~SqqZVOLpxTZi+bDuANvT%KnfC&f9xI_vjd(S6!K_`>>h@;rva_K#e>|^-3V8t zvlQjxaiW(5pgeF$@rfgn|k|aMX_ytXS{ZgEM6$3eXY?c7Qyw!O6+Vt> zetKQ)i1n2N`%&z|1;Uf@b39-fC_$BJosPoLPw=y->9)zGP>KSbN{k>Y X&z8$MdNihOoT(P`iPM}`qW}Oq!g?j% literal 0 HcmV?d00001 diff --git a/HTML/MicroMan/gifs/pr17.gif b/HTML/MicroMan/gifs/pr17.gif new file mode 100644 index 0000000000000000000000000000000000000000..0b21d459c28ebd99e628c2d3107c98acf11813f3 GIT binary patch literal 5253 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 L?cHue1poj$duBnC literal 0 HcmV?d00001 diff --git a/HTML/MicroMan/gifs/pr18.gif b/HTML/MicroMan/gifs/pr18.gif new file mode 100644 index 0000000000000000000000000000000000000000..eb1d96d26911596e6d2e242a36ac0d10b9330067 GIT binary patch literal 693 zcmV;m0!sZyNk%v~Va5PT0Du4h|Ns90001li0002S07?J=0{?`MsmtvTqnxzbi?iOm z`wxcVNS0<81VFm5tdhR%N!RwIs!ZPKI(!QXBe9slcr5;ay%l2VOS+JUTfVz491?VjgD*|f^8I-7heJWm(sArm)6D3$|-r>NG5*CrS#Ib#Ai zd3j~Yp^4e)`3V{-I!anV=zIHQ zOw5d9eAv6D{M%gpHjAxgdn|12t;+c=et|n~evY25zRup>;cHX=w7VRiI{(Qd1jm%2 zAH)w*K7lZ@MN>k_hmmsOoG@x(P$5Dl5)(m_lxHF@h5y`k^y=rYN1BaWwm}SdBviv+ zh89kwC`HePl^eCagd|a>r+J=ED$$RuFCS(=l*>S6IL9+xJU(RDh8MAq~_A$J;Tbkq*-G(ph#)?a` zjhMLQtEaUrc8qyAGTzL#?Gg)3(D-r6#g#jM4n4YbP@Q+zqi1xoMle-3AAjv#?$v8L zYr~B!&a=Ffr~e^c10Qj7kbT=z*?RNTXE$GX$dvIW}W)jkoN-oJ{lTJ?cq*z8q36M|s1x4j03X;@emV%hX<&<9T b1yq7!j#-J7Hercon{K`dXPk1LQvd)vshCv8 literal 0 HcmV?d00001 diff --git a/HTML/MicroMan/gifs/pr19.gif b/HTML/MicroMan/gifs/pr19.gif new file mode 100644 index 0000000000000000000000000000000000000000..35b3f921d270ac55900d02f5d0c31d84d675508e GIT binary patch literal 624 zcmV-$0+0PiNk%v~VXOdP0Du4h|Ns90001li000220AK(B0{?`MsmtvTqnxzbi?iOm z`y7Ow_>dqHBqp$$X%oIiEKBjXtXvIibvp~PgfgDWsEZ_zHx}(hJ3Mnu5h?04N?q3{ zcBn!T$6z6~^=oE}UxgLQov|IzG14ps7l*03-ks+sm`CNbb!gZnw{)nu^~Fdg=z=Fj z#)tV=X306IS&7m&Cr6s3#_&dpctj@|_8Dkaw+D;o=?U66YM2POsPzbk*3}l8wkCWU zyl5$$$P^mAnv48P%yu0axdDu0(TxG_4N*L@T{7h%PO(1j{th26KTlt8e~+K9zt7+A z{|_*rKp5%Nco~TBAC^?i5<27u$zZ#O6y3#%Q!%5xVgGN=@%X4Qq{xvZOPV~1GNsCu zEL&z&HsPGhkuqo6JcBLgL2EZ@isHo(W2uQf{iQnSh}Y1f8jpVTrD`ctis{w_6BWe^ z(Wx)Da!pz8tJtw*%bGolHm%yVY}>kh3pcJ@lpqPsy^A-m-o1SL`u!TQrVTC0c6nW^ zL$D1%p!{q?8<>?eoKhE3T6XF2VY-UWj3a8g9tpM$>hO4v73^gPDlJsp3>^CSKLqPajT*S}!WD_=`2abw^{4 KI_}s{0RTH~FD!Zh literal 0 HcmV?d00001 diff --git a/HTML/MicroMan/gifs/pr20.gif b/HTML/MicroMan/gifs/pr20.gif new file mode 100644 index 0000000000000000000000000000000000000000..9c2adf770bdd000104e8487d8b0e35994620fe0d GIT binary patch literal 1426 zcmV;D1#S9ANk%v~Vfp~50Du4h|Ns90001li0002`0H^=}0{?`MsmtvTqnxzbi?iOm z`wxcVI0j~SK4}&pt@|1)u*QpN<939T{?FTOgf~qtCri?lG2&q+b2^~FYOqJsy>w5m z!h1@Asokbn>s=<0>MhgNNM~U+Y}Rhg$6IG}v^({-B;@ubIEdJ$1otFZ$acf$_cwPI zMW&beXIW;4>Bv;G$XJNT2f9Xz3i%}oNEt@>si_xBc?%P$sMfff>g(2Y*tD-rPKEgs%G`#SS0BjG~_I9*>`|zt7+A z{|_*rz<~q{8f0)yLcN0w8yb1%Frq{&X)2=eG;gBDjsKfmRoeEdBgc^(xmDvd2hc*2 zEdQBY0}>aqmNW}iD|aUrmy0!fwp{5msK$&!iyA$OG^x_1Oq)7=3N@u%4ti4FG54)&@2_~O$I{9vr{^IK@ zoawR&E|Ut@N86>oT`HxbBPOfUv=U3GETvU8hN7Utod~PBqh1K{$tbAIa?38Wyq!DY z(%bFJt#J$@G15A0GfvV#@yQsGCMqJn``SESlag{vaE~P#(=)J;0{yX`EE;?#&o3wa zjnvl~Y_*Ei7VPqNk{otu*Mps;nuHieUBYJ-*b28irjpGdzjg1;ci(=iX&*#-lUr`H z-quZZCUl>sGtBmR9W;rI>3a6O+5aLqcynAY7!u)4H{4|2ke^J2rAu%4$jC>RdpYZ$ zZtk|=R@%AO*r3amxpih2TKUBo7f11Hl5$u3-}`8~xbgAKm%Q@MKM#HM3d)i@E)Sb& zd0*PLe7EZma1IQFEf#3{#QB0m{EM4inIx)#PYz&miP!t>x@Q*YDjNw~|6bDB&0mB` z?IaPw0E6g^c8sNE%zwH&T>!sjr~9#QTL|2PZ7?IB2BOV31QdfQ9=EK0bGaZ%({Nhg4Wa4{`7+g<0&P7rzL`Fp6=EWGtf@&*+}wp>d6DY@-|B2**57 zCytPz$zPdckNGMb|(Pl?J@0;B){JLp8Qk^lez literal 0 HcmV?d00001 diff --git a/HTML/MicroMan/gifs/pt01.gif b/HTML/MicroMan/gifs/pt01.gif new file mode 100644 index 0000000000000000000000000000000000000000..b9835b90ee815251764b4e0fbb6d4b119d7bada9 GIT binary patch literal 487 zcmV0Du4h|Ns90001li0002406PEx0{?`MsmtvTqnxzbi?iOm z`xyjC_>fs>e(K6rX(MiLOV=ez;xT^cFc32Y7rfpOH7fdgwkAkq$^~CD1ymB9YJs~U z*9pc*h0v|hvAhwFNOGzej;pg@a1COzxq`Xr`3V{-I!an&Jy6PFo`f4Ldg}9`87C4rO2n3tjb=H>)?0UseY&F>{ zhijJQyqkx{`=h-4+gArz260RzJzWi^R2xYPeS0*5%(dGY{_dR|{S99q&puCWzt7+A z{|_)AKzH&4o)gFfVL}a#@I7*sXIsIDTAmRi1j!GqRlp-3!|@ErWHab2=S z3y-?w}!4X{SxvdybEu;9Uj3mZO+ zII-fzj2k$9>4GX_77JUNB}06Pg{;-~-s literal 0 HcmV?d00001 diff --git a/HTML/MicroMan/modulari.htm b/HTML/MicroMan/modulari.htm new file mode 100644 index 0000000..9f85409 --- /dev/null +++ b/HTML/MicroMan/modulari.htm @@ -0,0 +1,103 @@ + + + + + +Modularity + + + + + + + +

+Loglan 82, A micro-manual of the programming language - +Basic constructs and facilities +

3) Modularity

+
+ +

+Modular structure of the language is gained due to the large set +of means for module nesting and extending. Program modules (units) +are blocks, procedures, functions, +classes, coroutines +and processes. Block is the +simplest kind of unit. Its syntax is the following: +

+ +

+The sequence of statements commences with the keyword begin +(it may be omitted when this sequence is empty). The lists of +declarations define the syntactic entities (variables, constants, +other units), whose scope is that block. The syntactic +entities are identified in the sequence of statements by means +of names (identifiers). +

+Example: +

+ +

+In the lists of declarations semicolons terminate the whole lists, +not the lists elements. Any declaration list must begin with the +pertinent keyword (var for variables, const for +constants etc.). The value of an expression defining a constant +must be determinable statically (at compilation time). +

+Program in LOGLAN-82 may be a block or alternatively may be of +the following form: +

+ +

+Then the whole program can be identified by that name (the source +as well as the object code). +

+A block can appear in the sequence of statements (of any unit), +thus it is a statement. (Main block is assumed to appear as a +statement of the given job control language.) +

+For the execution of a block statement the object of block is +created in a computer memory, and then, the sequence of statements +is performed. The syntactic entities declared in the block are +allocated in its object. After a block's termination its object +is automatically deallocated (and the corresponding space may +be immediately reused). +

+The modular structure of the language works "in full steam" +when not only blocks, but the other kinds of units are +also used. They will be described closer in the following points. +

+Unit nesting allows to build up hierarchies of units and +supports security of programming. It follows from the general +visibility rules; namely, a syntactic entity declared in an outer +unit is visible in an inner one (unless hidden by an inner +declaration). On the other hand, a syntactic entity declared in +an inner unit is not visible from an outer one. +

+Example: +

+ +

+In this program, first the main block statement is executed (with +variables a,b,c,i,j,k). Next, after the read statement, the inner +block statement is executed (with variables j,k). In the inner +block the global variables j,k are hidden by the local ones. +


+ +

+ + +


+ +
+Last update 02/07/95 +
+ +
+Comments, suggestions and critiques are welcome to : linfo062@crisv2.univ-pau.fr + +
+ + + + diff --git a/HTML/MicroMan/monitors.htm b/HTML/MicroMan/monitors.htm new file mode 100644 index 0000000..aa7ada2 --- /dev/null +++ b/HTML/MicroMan/monitors.htm @@ -0,0 +1,204 @@ +
+program monitors;
+ 
+(* this an example showing 5 processes: two of them are in fact monitors, one controls the screen=ekran *)
+
+  unit ANSI: class;  
+  (* CHECK whether config.sys contains a line device=ansi.sy the class ANSI enables operations on cursor, and bold, blink, underscore etc. *) 
+                               
+  unit Bold : procedure;
+  begin
+    write( chr(27), "[1m")
+  end Bold;
+    
+  unit Blink : procedure;
+  begin
+    write( chr(27), "[5m")
+  end Blink;
+  
+  unit Reverse : procedure;
+  begin
+    write( chr(27), "[7m")
+  end Reverse;
+
+  unit Normal : procedure;
+  begin
+    write( chr(27), "[0m")
+  end Normal;
+  
+  unit Underscore : procedure;
+  begin
+    write( chr(27), "[4m")
+  end Underscore;
+
+  unit inchar : IIUWgraph function : integer;
+    (*podaj nr znaku przeslanego z klawiatury *)
+    var i : integer;
+  begin
+    do
+      i := inkey;
+      if i <> 0 then exit fi;
+    od;
+    result := i;
+  end inchar;
+  
+  unit NewPage : procedure;
+  begin
+    write( chr(27), "[2J")
+  end NewPage;
+  
+  unit  SetCursor : procedure(row, column : integer);
+    var c,d,e,f  : char,
+        i,j : integer;
+  begin
+    i := row div 10;
+    j := row mod 10;
+    c := chr(48+i);
+    d := chr(48+j);
+    i := column div 10;
+    j := column mod 10;
+    e := chr(48+i);
+    f := chr(48+j);
+    write( chr(27), "[", c, d, ";", e, f, "H")
+  end SetCursor;        
+end ANSI;
+
+  
+    unit monitor:  process(node:integer, size:integer,e: ekran);
+
+       var buf: arrayof integer,
+           nr,i,j,k1,k2,n1,n2: integer;
+
+	
+    unit lire: procedure(output k: integer);
+    begin
+      call e.druk(13,2+nr*30+k1,0,k2);
+      call e.druk(13,2+nr*30+(i-1)*6,1,buf(i));
+      k1:=(i-1)*6;
+      k:=buf(i);
+      k2:=k;
+      i:= (i mod size)+1;
+      if i=j
+      then
+        call e.printtext("i equal j")
+      fi; 
+    end lire;
+    
+    unit ecrire: procedure(n:integer);
+    begin
+      call e.druk(13,2+nr*30+n1,0,n2);
+      call e.druk(13,2+nr*30+(j-1)*6,2,n);
+      n1:=(j-1)*6;
+      buf(j) := n;
+      n2:=buf(j);
+      j := (j mod size)+1;
+      if i=j
+      then
+        call e.printtext("j equal i")
+      fi; 
+    end ecrire;
+  begin
+    array buf dim(1:size);
+    nr := size - 4;
+    for i := 1 to size
+    do
+      buf(i) :=  i+nr*4;
+      call e.druk(13,2+nr*30+(i-1)*6,0,buf(i));
+    od;
+    i:=1;  
+    j := size;
+    k1:=0;
+    k2:=buf(1);
+    n1:=(size-1)*6;
+    n2:=buf(size);
+    (* end initialize buffer *)
+    return;
+    
+    do
+      accept lire, ecrire
+    od
+  end monitor;
+  
+  unit prcs:  process(node,nr:integer, mleft,mright:
+							 monitor, e: ekran);
+    var l,o: integer;
+
+  begin
+    call e.SetCursor(8+(nr-1)*10,29);
+    if nr = 1
+    then
+      call e.printtext("<-- p1 <--");
+    else
+      call e.printtext("--> p2 -->");
+    fi;    
+    return;
+    do
+      call mleft.lire(l) ;
+      call e.druk(11+(nr-1)*4,31-(nr-1)*8,1,l);
+      l:= l+1;
+      call mright.ecrire(l) ; 
+      call e.druk(10+(nr-1)*6,23+(nr-1)*8,2,l);
+      if l mod 15 = 0 
+      then
+        o:= e.inchar;
+	      if o = -79 then call endrun fi;
+      fi;	
+    od;
+  end prcs;
+  
+unit ekran : ANSI process(nrprocesora: integer);
+    unit printtext: procedure(s:string);
+    begin
+      write(s);
+      call Normal;
+    end printtext;
+
+    unit  druk: procedure(gdzieW,gdzieK,jak,co:integer);
+    begin
+      call SetCursor(gdzieW,gdzieK);
+      write("   ");
+      if jak=0 then call Normal else
+        if jak=1 then call Reverse else
+          if jak=2 then call Bold 
+          fi
+        fi
+      fi;
+      write(co:3);
+      call Normal;
+    end druk;
+
+    unit print: procedure (i:integer);
+    begin
+      write(i:4)
+    end print;
+  begin
+    return;
+    
+    do accept inchar, 
+              Normal,NewPage, SetCursor, Bold, Underscore,
+	      Reverse, Blink, print, printtext, druk
+    od
+  end ekran;
+  
+var m1,m2:monitor,
+    e:ekran,
+    p1,p2:prcs;
+     
+begin     (* ----- HERE IS THE MAIN PROGRAM ----- *)
+  (* create a  configuration *)
+  e:= new ekran(0);
+  resume(e);
+  call e.Normal;
+  call e.NewPage;
+  m1 := new monitor(0,4,e);
+  m2 := new monitor(0,5,e);
+  
+  p1 := new prcs(0,1,m2,m1,e);
+  p2 := new prcs(0,2,m1,m2,e);
+    
+  resume(m1);
+  resume(m2);
+  resume(p1);
+  resume(p2);
+end monitors;
+
\ No newline at end of file diff --git a/HTML/NextPage.gif b/HTML/NextPage.gif new file mode 100644 index 0000000000000000000000000000000000000000..4f510e0ea210f9405743d3419223818c577ac7e7 GIT binary patch literal 2018 zcmcJM`B##O8pl}#1k^B5u`G83(;3rD$t6Y6+!`{nLQ_ktQR}K{T}$tb3#j0dI%uYp zBH}{x-qDVf)n!HqNh`M&DyKMQ%d2+lHLZEAndZIpN8IlZ&-s2o&pFRI-}6L8M+W#G z$UsG+UZYTmQ80o)Uk3~$u+e}BY(QW=0zn7_B9H-rj9zEN2nZt}gn%Fd8W2#AfJUf- zK_v_VumMC22E?F83_94Lf(=U8V1#nmAc6HdSg(ThN>~rTdSevBdOkD(z!P$KLIO{S z;R$0bf+q4IoeI_guucx^B(Saq((xf(5u`KnY)F?5spPPV52=bERX(K3hEztvgH#ES zDh5*4K*}OWnGY$mA!RzGe5s(s8Svg-& zfkF$>CKwZ(iAY%alenq*Y|FVSG!BPvC$!_wi(0#Tdb@?^@dUD&x!EN%sZ8ECbhWRV zX1B)4+1}d5+L}5*ZpUF7u1!n|M0h(V7lzM9UmrI|hjrEi()0D>Q?G~6c(N12*DokI zXiK1s*CpCS#T^@4tWYCbuT>(vH7J(bUmt&Q|<7 zigUD&{3Vr<&}sjEpj=1F(PcbXxZj%`RVp#tyuwL$ZSvZ71r^+PX|&GHms{vq5%z+yWKOPslph=w2GK=r3==%;$oA-ei?u{I26YWaN zJKV}iF%h>RAOha8}i866Z1cC4zh*AYkS!czCF@oGJPS zc}+%%8f$_=dG>QX95rTa8hKs&_`;`G7w?ra+xF~BL*uMswTmp%8P=57P+mNvYREUp zNnn%2>Hcs1yoGR9NIEjpY)qGz(+ zlFf^cSJ&3Xm1z2~2t89%cslc3J^fZCTYLE%DIZ7m_LlsXaBOfpy82dsxlEzCskjz_ z7e1sVS6Sk1(vqJ?Sj9?E8r;pQ@`B&0T`8q_?NSLlW81Y`Sp{z4{uQ(&?HfNU&wh@E z5OF0=KTYmT&I>1dN=jA*#Mf%> z)Jg+8L;W^BO54!oVufVAR06adL>usEN<)Mxy9RS*t|zz5eDS7e!a``H0`>44_FspZ zQ{QWs#($UmaCo+vU9%9`XUQR*TrB_C`z~0io@v)s3XpR-Cne-cAJU4CKcGQThZ9bB zQ?7*6&S$*1fkyek{}Gv1mh%Ij)do$Mlz(s}{(J24b$XS6{#QrwxG&l?fFQB8;Z(e0 zgobfK%N;uEwulc>YSHa3|@=f(AjmIPQ*CmOaEaKf}7Mv=N#UwqSGftQtzRsK&lKVN_q{&45VW z{ezboXp_}XXAk?!)WpQ2Q`T(p_iQH+Ap$G9TBT zRn>TDb8lpn%7fb=dcYbL_r&g3#8)e%Ef#(kS#K44k`#Bl>%>1NoLkuYRP;c2{3DPG h^s=xbvSP{4)_(Uw>bIXcYK!Lnlfg&*v1nA_{{R4Cr&0g_ literal 0 HcmV?d00001 diff --git a/HTML/PrevPage.gif b/HTML/PrevPage.gif new file mode 100644 index 0000000000000000000000000000000000000000..52968013b5528eea1f5881a325353ad066c32279 GIT binary patch literal 2044 zcmcJM`CC$n9>xI$#T5etEejLVloA}Bw5$R5%q&fFDIL?CT(XybhON}XJWMNnALN%#iMnnbLo$`?+@SSeLv6pyuW-ywg>xcI&csb zjCzGaAqK$+0)0C$jKBs1BCsBTClLrjAP|A{2xRa&7=#fJLO>7!^$0kLfCi$5K_v_V zupUJ8dPF~o=ykAO4eOP#-T)P_UItI<;7K(+se~s1c+wE1@T3451>jKyJSu}nrSPaB z7DA(WkWLNj09dDhbuw620qF#gt`O20cow8fg>(s!S^=vCkh&03=RxW$NSz9)4KNB) zRzS)^NSOyIvmj+Eq)dR62IvneeL+A90|E#rgn&E<$bx`W2uOf{C%g`po|5|)`O`3gBag7zx@Jbf^bp%Vu4Up zQd(ACjIK0BW3l4O$}=^!7wYN-QVH&o9E-zLUu>7eVGW(-`NYMAMs4|R^m*-=Sp9(Hu-e(vYm2wv zRzELKy*bwS#h3Ci$^D!BnB+|XdTXbU)>WL8))F<|BosRxV#D=KnoWv%LkqxJuL*7q zt@9M#v2_bQ`!P<-9 z_q|=a?RH?A>3!|Te({`lb2F1+--Hc+&bwOcQM-I9Xt`KqGQhM+jbhx%Hp*PNS-#sb zRVQA%J2-ddi8AYzhYHzS*Bpg2X_W>#c~ZEVlvv`k#^iVPp*E6)YfoO?rQ{vC!ILaq zkns6;2l~xpqP`4oh&CgyzHa->Z}IkqU)xjL&VKp#wBBXiw7G-6Iq3Nr$N8F6pJCcy z)>=s)_GC@kvG^jZf*2twcueeXx^Zj&rSypErg{0l4Ieg=@DciY5lw>i_+{3un_;9@DI=TMg z%ipr($tTAF`F@Ab0*keQ8n+rgVIE~n5*GzFNN&AQ5* zMl$F9trq+_P?Eg+amsnCNASBrf@sSSqC&lKWd@<=@0<07F=qm88-mdTQXzTPCOUlmawYp`?)ZB}&S!{`RXO0VqA4I)E z>b62&?$`~p`h!i1_k@7zWldjBQ09~$0q-8T^XK8%lx z-kNHh8rf-16ym*CPW&x(CDe z>8q^0*cILwEv8@V#bFntFeot;2J;31Id;%|P4-tQJ$vMq*`6h>)oyN+@lM2^v67rO$3cUk6kU?w8UGWpIB#-)*dWh zp1$YG)7Y%0Q3rb1CJ~R-5FqBr%Etw#n8iezbG(n2F_D#m!iF1#I;ccOSx1W*vW{@& zR9Ld-;~{%Kt0E;o5DH#0bA2K><=&yS=8CcBH484TQ)ekTCAV_-TNmD>HASlq8LdL0 z@y^5a?YdmYliY4ZGQhf(P_Tfn2v4mV_z%zel$hYeZZh@iNW@X`VIgz9wnO8NMqT6V znO-iAk*u{)Ibraw@*?F#kX0G6KF{Lzy4CZj@0;U!c1y4RSF5PS22HORDE`7Lkkm z>kp*zF(K}w+_ z+&!V#aNu2MWOezTvl|~?PE2##dHQp7PwvC^l@Gh(M(*sbzUI~HHzbHTZXer~ + + + Algorithmic Logic: its home page + + + +

Algorithmic Logic

+
its home page
+ +

Table of contents

+
    +
  1. Definition per genus proximus et differentia specifica +
  2. Goals of AL +
  3. Structure of AL +
  4. Applications + +
  5. specifications of algorithms, data structures and programming languages + + + +
  6. analysis of properties of programs (verification) + +
  7. axiomatic definition of programming languages + +
  8. +
  9. Copyrights +
  10. Readings + +
  11. What's new in AL? +
  12. Invitation to projects + +
  13. the assistant in proving, more precisely ... +
  14. an axiomatic specification of the Loglan'95 programming language... +
  15. + +
+



+
    +

  1. Definitions
    +
    +
    algorithmic logics
    +
    are a kind of logics of programs, their components are: + a formalized algorithmic language and + a consequence operation defined by means of logical axioms and inference rules. +
    +

    +

    logics of programs
    +
    is a family of logics, the language of a logic of programs admits + programs as modalities.
    + Examples:
      +
    • calculus of Floyd (descriptions of flowdiagrams)[1967],
    • calculus (Hoare) of partial correctness formulas [1969], +
    • algorithmic logic [1969-1994],
    • calculus of weakest preconditions (Dijkstra)[1974],
    • dynamic logic [1976], etc. +
    +
    +

    +

    an algorithmic language
    +
    + is the smallest language which contains both the set of programs and the set of first order formulas and which is closed under the formation rule:
    +if P is a program and f is a formula then the expression Pf is an algorithmic formula. The set of algorithmic formulas admits the usual formation rules: disjunction, conjunction, negation, implication, quantification. +
    + +
    + +
  2. +

    Goals of AL
    +- the study of semantic properties of computer programs. The role of AL +in computer science is similar to that of mathematical logic in mathematics. +AL studies those properties of programs whih are valid by virtue of their +syntactical structure, independently of any interpretation of functional and +relational symbols in programs. This leads to the discovery of algorithmic +tautologies and inference rules, thus enabling algorithmic reasoning. +Various programming constructs, one may say, various programming languages +lead to various logics. In one logic you can discuss the properties of +deterministic iterative programs, in another one may analyse the properties +of concurrent(hence non-deterministic) programs, in yet another ... +The theories based on AL are of interest for the study of abstract data types. +For example, an algorithmic theory of stacks is the theory determined by its +algorithmic language and the set specific axioms,
    + +

    +

  3. Structure of AL
    + A recipe: +Take one programming language Lp and its semantics. Consider the +semantical phenomena of the executions of programs (like termination, +correctness, partial correctness, equivalence etc.). Add a first-order +language L1. Mix well, you will obtain an algorithmic language La. +Remark its capability to express the semantical properties of programs +(mentioned earlier). +What you need now is a handful of axioms and inference rules. Be careful. +Avoid inconsistency. Search for the completeness of your logic. +Now, you are ready to serve formal proofs +of semantical properties of programs and other theorems. + +
  4. +
    Applications
    +
      +
    • specification of algorithms, data structures and programming languages +A program K is specified by a pair of formulae alpha and beta. The formula + of the form
      +alpha => K beta
      +is satisfied by a state of memory s iff either s does not satifies the +precondition alpha, or if program K transforms the initial state s into a +resulting state s' (i.e. no infinite loops, no fails either) and the state +s' satisfies the post-condition beta. +A set Z of formulae specifies a (family of) data structure(s) iff all formulas +are valid in the data structure belonging to the family and no data structure +outide the family satisfies all the formulae of the given set Z + + +
    • verification and more precisely analysis of properties of programs +One does it by proving the formulas that express the properties f programs + +
    • axiomatic definition of programming languages +In a paper we we proved that the meanings of programming operators such as +assignment operator, composition of programs operator begin... end, +condititional instruction operator if ... then ... else ... fi operator, +iteration instruction operator while... do ... od are uniquely determined +by he fact that they satisfy the tautologies of algorithmic logic and that +they are conformant to the inference rules of AL. +In other papers we show that the primitive data types of programming languages +are axiomatizable and we study their algorihmic theories. +
    +
    + +
  5. Copyrights
    + +
  6. +
    What to read?
    +
    + +
  7. What's new in AL?
    +We would like to announce two results of 1994.
    +In spite of the Tennenbaum's theorem + it is possible to +to construct a programmable and non-standard model for + the elementary theory of stacks. +The same remark applies as well to other specifications.
    + +Theorem 1
    +Let S be the algebraic specification of stacks. There exists a programmed +module Stacks which correctly implements all the axioms mentioned in the specification S, +the module Stacks admits infinite popping of certain stacks. +
    WARNING. Be careful, it may be the case that a software module satisfies +all axioms of a given first-order specification, yet it may be pathological +one. The facts: a module fulfills the axioms and the module is programmable +do not necessarily means that the module has any value.
    + +
    Theorem 2
    +Algorithmic theory of stacks of bounded capacity is the +complement of a recursively enumerable set. +
    Intuitively speaking this result gives an assuring answer to the question + 'Can one do the research of properties of programs +using the calculus of AL? The nature of AL seem so complicated. Perhaps it would be better +to use another logic of programs.'
    +Quite unexpectedly the oponents of AL are confronted with +two facts:
    +- the dynamic logic has finitistic inference rules and + the highly undecidable set of axioms,
    +- the algorithmic logic has a number of omega-rules, + but the set of theorems of algorithmic theories of + practical interest is relatively low in the hierarchy of Kleene-Mostowski. + + + + + + + + + + + +
  8. +
    Two projects
    +
      +
    • the assistant in proving, more precisely ... +
    • an axiomatic specification of the Loglan'95 programming language... +
    + +
+
+

Explanations of notions used


+
+ +Algebraic specification of stacks:
+The universe is a union of two sets S- for stacks and E- for elements.
+Operations and predicates:
+push: E x S -> S
+pop: S -> S
+top: S -> E
+empty: S -> {true, false}
+Axioms:
+not empty(push(e,s))
+s = pop(push(e, s))
+e = top(push(e, s))
+not empty(s) => s = push(top(s), pop(s)) +
Back


+ +
+Tennenbaum's theorem
+If M is a recursive(i.e. programmable) model of Peano's +axioms of arithmetic of natural numbers then it is isomorphic to the +standard model of natural numbers.
Back + +
+
GM y AS 10:07 01/01/1995
+ + diff --git a/HTML/availlty.htm b/HTML/availlty.htm new file mode 100644 index 0000000..4e91a22 --- /dev/null +++ b/HTML/availlty.htm @@ -0,0 +1,56 @@ + + + +Loglan'82 - Availability + + + +

How to get a copy of Loglan'82

+ +Institute of Informatics, University of Warsaw and
+LITA Universite de Pau
+have the privilege and the pleasure to inform you that since August 1993 +the programming language LOGLAN'82, its compilers and its environments are + accessible for the usage from
+ + the server: aragorn.pb.bialystok.pl = 193.59.9.226
+ user: anonymous = ftp
+ Password:{your internet mail address}
+ directory: pub/loglan
+ + + FTP with WWW directly . + +Or use the following link to the + Loglan82 archive on +the aragorn.pb.bialystok.pl
+Our apologies for the eventual inconveniences, at present we do not dispose a better link/server. +

However you can try a mirror located at + sunsite.icm.edu.pl +We acknowledge the help of ICM.
There is also a French site at + LITA Universite de Pau +
+

+
+

     These programs are free software; you can redistribute it 
+     and/or modify it under the terms of the GNU General Public License
+     as published by the Free Software Foundation; either version 2 of 
+     the License, or (at your option) any later version.
+     
+     These programs are distributed in the hope that it will be useful,
+     but WITHOUT ANY WARRANTY; without even the implied warranty of
+     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
+     See the GNU General Public License for more details.
+
+ + + + +
+
+AS 11:12 01/12/1994 +
+ + + +ppp \ No newline at end of file diff --git a/HTML/availlty.htm~ b/HTML/availlty.htm~ new file mode 100644 index 0000000..25b44bd --- /dev/null +++ b/HTML/availlty.htm~ @@ -0,0 +1,56 @@ + + + +Loglan'82 - Availability + + + +

How to get a copy of Loglan'82

+ +Institute of Informatics, University of Warsaw and
+LITA Universite de Pau
+have the privilege and the pleasure to inform you that since August 1993 +the programming language LOGLAN'82, its compilers and its environments are + accessible for the usage from
+ + the server: aragorn.pb.bialystok.pl = 193.59.9.226
+ user: anonymous = ftp
+ Password:{your internet mail address}
+ directory: pub/loglan
+ + + FTP with WWW directly . + +Or use the following link to the + Loglan82 archive on +the aragorn.pb.bialystok.pl
+Our apologies for the eventual inconveniences, at present we do not dispose a better link/server. +

However you can try a mirror located at + sunsite.icm.edu.pl +We acknowledge the help of ICM.
There is also a French site at + LITA Universite de Pau +
+

+
+

     These programs are free software; you can redistribute it 
+     and/or modify it under the terms of the GNU General Public License
+     as published by the Free Software Foundation; either version 2 of 
+     the License, or (at your option) any later version.
+     
+     These programs are distributed in the hope that it will be useful,
+     but WITHOUT ANY WARRANTY; without even the implied warranty of
+     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
+     See the GNU General Public License for more details.
+
+ + + + +
+
+AS 11:12 01/12/1994 +
+ + + +ppp \ No newline at end of file diff --git a/HTML/biblio.htm b/HTML/biblio.htm new file mode 100644 index 0000000..140bd8c --- /dev/null +++ b/HTML/biblio.htm @@ -0,0 +1,224 @@ + +Bibliography on Loglan'82 + +

BIBLIOGRAPHY

+
Last update: November 24, 1994
+

+ +Should you like to read on Loglan and its companion Algorithmic Logic, here it is, a short list of more important +papers.

+

LOGLAN'82

+
    +
  • Bartol,W.M., et al.
    +Report on the Loglan 82 programming Language,
    +Warszawa-Lodz, PWN, 1984

    + +

  • A.Kreczmar
    +A micro-manual of the programming language LOGLAN-82,
    +Institute of Informatics, University of Warsaw, 1984

    +(there exists a french translation of the above manual) +(both texts are distributed together with this package)

    + +

  • A.Kreczmar, A.Salwicki, M. Warpechowski,
    +Loglan'88 - Report on the Programming Language,

    +Lecture Notes on Computer Science vol. 414, Springer Vlg, 1990, +ISBN 3-540-52325-1

    + +

  • do you read polish? there exists a good manual of Loglan!

    +A.Szalas, J.Warpechowska,
    +LOGLAN,
    +Wydawnictwa Naukowo-Techniczne, Warszawa, 1991 ISBN 82-204-1295-1

    + + +

  • Some papers devoted to the problems and challenges of Loglan.

    +
      + +
    • Bartol,W.M., Kreczmar, A., Litwiniuk, A., Oktaba, H.,

      +Semantic and Implementation of Prefixing at Many Levels,

      +in Lecture Notes in Computer Science vol.148, Springer Verlag, Berlin, +1983, pp.45-80

      + +

    • Krause,M., Kreczmar, A., Langmaack, H., Salwicki,A., +Specification and Implementation Problems of Programming Languaages +Proper for Hierarchical Data Types,

      +Report 8410 of Institut fuer Informatik und Praktische Mathematik +Christian-Albrechts-Universitaet Kiel, 1984, pp.1-68

      + +

    • Kreczmar,A., Salwicki,A.,

      +Concatenable Type Declarations, Their Application and Implementation

      +in: Programming Languages and System Design, in Programming, Languages and System Design Proc. IFIP TC2 +Conference (J.Bormann ed.) Dresden, 1983 +North Holland, Amsterdam, 1983, pp.29-41

      + + +

    • Cioni, G., Kreczmar, A., +Modules in high level programming languages +in: Advanced Programming Methodologies (G.Cioni, A.Salwicki eds.) +Academic Press, London, 1989, 247-340

      + +

    • Kreczmar, A.,

      +On inheritance Rule in Object Oriented Programming +in: Advanced Programming Methodologies +Academic Press, London, 1989, pp. 141-164 + +

    • Cioni,G., Kreczmar,A., Vitale, R.,

      +Storage Management

      +in: Advanced Programming Methodologies +Academic Press, London, 1989, pp.341-366 + + +

    • Cioni, G., Kreczmar, A.,

      +Programmed deallocation without Dangling References,

      +IPL, vol. 18 1984, pp. 179-185 + +

    • Krause, M., Kreczmar, A., Langmaack, H., Warpechowski, M.,

      +Concatenation of program modules, an Algebraic Approach to the Semantic and Implementation +Problems,

      +in: Proc. Computation Theory, LNCS 208, Springer Vlg, Berlin, 1986, pp. 134-156 +full text in: Report 8701 of Institut fuer Informatik und Praktische Mathematik +Christian-Albrechts-Universitaet Kiel, 1987, pp.1-48

      + +

    • Krause, M.,

      +Die Korrektheit einer Implementation der Modulpraefigerung mit reiner Static Scope Semantik,

      +Report 8616 of Institut fuer Informatik und Praktische Mathematik

      +Christian-Albrechts-Universitaet Kiel, 1986, pp.1-139

      + +

    • Langmaack, H.,

      +On static Semantic of Prefixing (=inheritance),

      +Talk delivered during the Summer School on Loglan'82, Zaborow, September 1983

      + +

    + +
  • Ph.D. theses (in polish!) related somehow to Loglan project.

    +

    +

      +
    • Szalas, A.,
      +On parallel processes, 1984

      + +

    • Gburzynski, P.,

      +GPR - theorem prover 1982

      + +

    • Petermann, U.,
      +On file system and signalling exceptions between processes 1987

      + +

    • Oktaba, H.

      +On Formalisation of the Notion of Reference and its Applications in Theory of Data Structures, 1982

      + +

    • Bartol, W.M.,

      +Application of Static Structure of Type Declarations and the System of Dynamic Configurations in a Definition +of Semantics of a Universal Programming Language 1981

      + +

    • Szczepanska-Wasersztrum, D.,

      +A logical system for reasoning about exceptions,1990

      + +

    • Litwiniuk, A.I.,

      +Several algorithms for optimisation of code in presence of nesting, 1988

      + +

    • Jankowska-Puchalka B.
      +A code genarator generator for an object oriented language, 1992

      +

    +
+

Algorithmic Logic

+
    +
  • There is a monograph:

    + +G.Mirkowska, A.Salwicki,
    +Algorithmic Logic,
    +D.Reidel & Polish Scientific Publ., Dordrecht & Warszawa, 1987, ISBN 83-01-06859-0

    + the book contains a chapter devoted to certain problems of Loglan.

    + +

  • A new book on AL appeared in polish
    +G.Mirkowska, A.Salwicki,
    +Logika algorytmiczna dla programistow,
    +Wydawnictwa Naukowo-Techniczne, Warszawa, 1993 (ISBN 83-204-1296-X).

    +An english version in preparation.

    + + +

  • There are many papers discussing the applications of AL in programming.

    +

    +

      +
    • Salwicki, A.,

      +Development of Software from Algorithmic Specifications

      +in: Advanced Programming Methodologies +Academic Press, London, 1989, pp.1-40

      + +

    • Salwicki, A.,

      +On algorithmic theory of Stacks,

      +in Proc. MFCS'78 (J.Winnkowski ed.), LNCS 63, Springer Berlin 1978, pp.

      + +

    • Salwicki, A.,

      +On algorithmic theory of dictionaries,

      +Proc. Logic of Programs (E.Engeler ed.), LNCS 125, Springer, Berlin 1981 pp.145-168

      + +

    • Müldner, T., Salwicki, A.,

      +On algorithmic Properties of Concurrent Programs,

      +in: Proc. Logic of Programs (E.Engeler ed.), LNCS 125, Springer, Berlin 1981 pp.170-193

      + +

    • Mirkowska,G., Salwicki, A.,

      +On applications of Algorithmic Logic,

      +in: Proc. CAAP'86 (P. Franchi-Zanetacci ed.) Springer, 1986 pp.288-306

      + +

    • Mirkowska,G., Salwicki, A.,

      +Axiomatic definability of programming language semantics,

      +in: Proc. IFIP Working Conf on Formal Description of Programming Concepts +Ebberup 1986 (M. Wirsing ed.) +North Holland, Amsterdam, 1986, pp1-15

      + +

    • Mirkowska,G., Salwicki, A.,

      +On Axiomatic Definition of Max-model of concurrency,

      +in Proc. Advanced School on Mathematical Models of Parallelism Rome 1986 +(M. Venturini-Zilli ed.) LNCS Springer Berlin

      + +

    • Salwicki, A.,

      +Algorithmic Theories of Data Structures,

      +in Proc. ICALP'82 (M.Nilsen, E.Schmidt eds.) LNCS 140 Springer, Berlin, 1982, pp. 458-472 +

    +
+ + +

Related literature

+
    +
  • on object programming

    + is immense

    + +Let us quote a few books:

    +

      +
    • E. Horowitz,
      +Fundamentals of Programming Languages,
      +Springer, New York, 1983

      + + +

    • O.-J. Dahl, B. Myhrhaug, K. Nygaard,
      +Simula 67 Common Base Language,
      +Norwegian Computing Center, Oslo, 1970
      the mother of object languages!!

      + +

    • B. Meyer,
      +Object-oriented software construction,
      +Prentice Hall, 1988

      + +

    • B. Stroustrup
      +The C++ Programming Language,
      +Addison-Wesley, Reading, Mass., 1991

      +

    +
  • on logics of programs:

    +

    + +see a survey

    +

      +
    • D. Kozen, J. Tiuryn
      +Logics of Programs,
      +in: Handbook of Theoretical Computer Science, vol.B, Formal Models and Semantics +Elsevier, Amsterdam, 1990, pp. 789-998

      +

    +
+
+up +
+
GMyAS +Last update Wed 10 May 1995
+ + + + + + diff --git a/HTML/biul2.html b/HTML/biul2.html new file mode 100644 index 0000000..a029127 --- /dev/null +++ b/HTML/biul2.html @@ -0,0 +1,182 @@ + + +Loglan'82 Biuletyn nr 2 + + + + +

Instytut Informatyki Politechniki Bia³ostockiej z +przyjemnoœci¹ zawiadamia, ¿e od +pewnego czasu dzia³a w sieci Internetu

+ + + + + + + +
repozytorium jêzyka pogramowania obiektowego
Loglan'82
+ + + + + + + + + + + + + + + + +
+

Co?

+

Loglan'82 jest jêzykiem programowania obiektowego, +wspó³bie¿nego, rozproszonego o niepowtarzalnych walorach.

+ +

+Udostêpniamy: +

    +
  • kompilatory+interpretatory Loglanu na rózne platformy, w tym sieciowe, +
  • dokumentacjê, +
  • zbiór przyk³adów, +
  • edytory: +LOTEK i edytor strukturalny (tylko dla œrodowiska DOS), +
  • ZRÓD£A! +
+

Gdzie?

+ +

+http://aragorn.pb.bialystok.pl +

+lub +

+ftp://aragorn.pb.bialystok.pl/pub/loglan +

+i jego lustrzane odbicia (znacznie szybciej osi¹galne w sieci) +

+ http://sunsite.icm.edu.pl/loglan/ +

+ ftp://sunsite/icm.edu.pl/pub/loglan/ + +

+ http://infpc1.univ-pau.fr/ +

+ftp://infpc1.univ-pau.fr/pub/loglan82 +

+

Jak?

+ +

+dla WWW: Mosaic, Netscape, Lynx, ... +

+dla anonymous FTP +

+

+ Dziekujemy prof. Markowi Niezgodce +

+i p. Wojtkowi Sylwestrzakowi z ICM +

ten server dziala od 1993 + +

+

Zachecamy do (bezplatnego!) korzystania z naszej bazy wiedzy.

+ +
+

Dlaczego?

+ + +

Uczelnie, jednostki badawcze, pracownicy uczelni i studenci, firmy softwareowe, etc. mog¹ wykorzystywaæ Loglan jako jêzyk programowania obiektowego: + +
    +
  • W dydaktyce programowania pocz¹tkowego, algorytmów i struktur danych, programowania obiektowego, programowania wspó³bie¿nego i rozproszonego, itd. +
  • W szybkim tworzeniu prototypów du¿ych, skomplikowanych aplikacji. +
  • W badaniach: jako narzêdzie badawcze, a tak¿e jako bogate Ÿród³o ciekawych i wa¿nych problemów badawczych (http://aragorn.pb.bialystok.pl/loglan/openpbms.html). +
+ + +

+Loglan nie jest gorszy od innych jêzyków programowania obiektowego (por. http://aragorn.pb.bialystok.pl/loglan/tablica3.html ) +Stosowanie Loglanu pozwola wyposa¿yæ uczelnie, pracowników, studentów itd. w licencjonowane oprogramowanie, bez ¿adnych kosztów! Co wiêcej, stwarza doœæ rzadk¹ okazjê rozdawania studentom legalnie i za darmo oprogramowania wspieraj¹cego proces dydaktyczny. Nauczyciele i s³uchacze bêd¹ mogli wymieniaæ siê Ÿród³ami programów loglanowskich i uzyskaj¹ te same wyniki bowiem Loglan jest niezale¿ny od platformy i dzia³a tak samo w DOSie, Unixie, Atari ST (myœlimy te¿ o platformach MacIntosh i Amiga), w sieciach rozleg³ych Internet i lokalnych Novell. + + +

+Jezyk oferuje niezwykle bogaty zestaw narzêdzi programowania obiektowego, ³¹cznie z obiektami-procesami rozproszonymi w sieci komputerowej. . Procesy komunikuj¹ siê w sposób ca³kowicie obiektowy: dwa procesy wspólnie realizuj¹ jak¹œ metodê jednego z dwu procesów wg pewnego protoko³u, jest to obce wywo³anie inaczej alien call zaproponowany i zrealizowany przez B. Ciesielskiego w r.1988. Wszystkie znane mechanizmy synchronizacji i komunikacji procesów sprowadzaj¹ siê do mechanizmu alien call w prosty i tani sposób. +

UWAGA

+. +Ostatnio reklamuja siê jêzyki przyblizaj¹ce siê do wysokiego standardu rozwi¹zañ opracowanych dla Loglanu. Mo¿emy jednak przewidywac, ¿e w bie¿¹cym stuleciu nie pojawi siê nowy istotnie lepszy od Loglanu jêzyk programowania obiektowego. Zalety naszych rozwiazañ zostan¹ nale¿ycie docenione w odleg³ej jeszcze przysz³oœci, gdy jakaœ bogata firma zechce promowaæ "swoje" odkrycie. Rozwi¹zania Loglanu wspieraj¹ siê wynikami badañ przeprowadzonych przez zespó³ profesorów A. Kreczmara, A. Salwickiego. (por. credits.html) Czy mo¿na oczekiwaæ ¿e jakaœ, nawet bogata, firma zainwestuje w potrzebne badania? +

KONIEC UWAGI.

+ + +

+Programowanie w Loglanie jest znacznie ³atwiejsze ni¿ w innych jêzykach programowania obiektowego (por http://aragorn.pb.bialystok.pl/loglan/quick.htm). + + +

+Programowanie w Loglanie jest o wiele bezpieczniejsze ni¿ w innych jêzykach programowania: +kompilator wykrywa wiele b³êdów (tak¿e tych nie dostrzeganych przez inne kompilatory), i opisuje nature i miejsce b³êdów, +wiele b³êdów jest wykrywanych i sygnalizowanych w trakcie wykonywania programu (b³êdy takie s¹ lokalizowane w tekscie programu Ÿród³owego i czytelnie opisane), +zarz¹dzanie zasobami pamiêciowymi jest bezpieczne i mocne, +np. programista nie musi siê obawiaæ groŸby trudnego do wykrycia b³êdu "wisz¹cych referencji": + +


+ +

+

PRZYKLAD (w Pascalu lub C++)

+ +
Niech x, y, z bêd¹ zmiennymi wskazuj¹cymi na rekord lub obiekt typu T. +
Po wykonaniu instrukcji dispose(y) lub odp. free(y) wartoœci¹ zmiennej y jest wskaŸnik nil do pustego obiektu. WskaŸniki x i z nadal pokazuj¹ na pole pamiêci zajmowane przez nieistniej¹cy ju¿ obiekt. Po wykonaniu instukcji new lub malloc to samo pole mo¿e byæ wskazywane przez zmienn¹ u jako obiekt typu T'. +
Porównaj to z aksjomatem Loglanu + {(x<>none&y=x&z=x) ( [kill(y)](x=y=z=none)} +
Jego sens jest oczywisty. Warto nadmieniæ, ¿e 1° koszt tej dealokacji obiektu x nie zale¿y od liczby wskaŸników do obiektu, nie musisz o tym mysleæ 2° system sygnalizuje wszelkie próby dostêpu do informacji w obiekcie, który (ju¿/jeszcze) nie istnieje. +ponadto programista mo¿e sam zaprojektowaæ reakcjê na b³êdy i na sygna³y podnoszone przez program w trakcie jego realizacji. + +
+ + + + + +
+ +

NIE PRZEGAP!

+ +
    +
  1. Porównaj sam, Loglan i inne jêzyki programowania i wyrób sobie swój w³asny pogl¹d w tej sprawie, +
  2. Policz: jedna licencja na kompilator jêzyka pretenduj¹cego do miana obiektowoœci to XXX z³ razy iloœæ stanowisk pracy w twej uczelni i u studentów. Ile to by kosztowa³o? +
  3. Zauwa¿! w jednym jêzyku programowania oferujemy Ci komplet narzêdzi: +klasy i obiekty, wspó³programy, procesy, dziedziczenie i zagnie¿dzanie modu³ów, ochronê atrybutów prywatnych obiektów wg ¿yczenia twórcy klasy, deklaracje sygna³ów i obs³ugê przerwañ i sygna³ów, wiele sposobów na tworzenie modu³ów generycznych - sparametryzowanych typem danych, dziedziczenie ne tylko w klasach ale w ka¿dym rodzaju modu³u: funkcji, procedurze, bloku, zspó³programie, procesie . +
  4. Uwierz nam! jêzyki o podobnych w³asnoœciach zostan¹ odkryte w Ameryce dopiero za parê lat. Chcesz czekaæ? +
  5. Zrób sobie wieloprocesorow¹, sieciow¹, virtualn¹ maszynê Loglanowsk¹! (Tanio! oto jedna z recept: weŸ tyle PC ile zdo³asz, po³¹cz je w sieæ lokaln¹, zainstaluj Loglan. ) +
  6. Zarób na Loglanie! Mo¿esz go sprzedawaæ, nie mamy nic przeciw temu i nie ¿¹damy niczego od Ciebie. Musisz tylko zachowaæ informacjê o prawach autorskich w sprzedawanych przez Ciebie kopiach. Tak jak to siê dzieje (lub jak powinno siê dziaæ) w przypadku TEXa, Linuxa, produktów GNU, etc. +
+ +
+ + +

+Przekonaj siê lub znajdŸ s³aby punkt w naszej argumentacji. +Napisz nam o Twoich zastrze¿eniach mailto:salwicki@aragorn.pb.bialystok.pl + +

+Nie przejdŸ obojêtnie wobec naszej oferty bo byæ mo¿e przegapisz coœ co ma dla Ciebie znaczenie. Jeœli masz j¹ odrzuciæ to zrób to œwiadomie, na podstawie rzeczowych przes³anek. (Napisz nam o Twych zastrze¿eniach.) + + +

+Czy argument "to siê nie przyjmie" ma tu istotne znaczenie? +a) jeœli prowadzisz zajêcia dydaktyczne lub jestes ich s³uchaczem: to zauwa¿, ¿e ¿aden inny +jêzyk programowania nie dostarczy Ci tak w³aœciwej podstawy do studiowania zjawisk zwi¹zanych z obiektami. Np. temat "modu³y generyczne" w jêzyku C++ sprowadza siê do szablonów (ang. template). W Loglanie znamy kilkanaœcie ró¿nych rowi¹zañ tego problemu. A same szablony maj¹ wiêcej wad ni¿ tego mo¿na by oczekiwaæ. +Po Loglanie mo¿na nauczaæ jakiegokolwiek jêzyka programowania znacznie szybciej i wydajniej. Wystarcz¹ 2 popo³udnia by nauczyæ C++, Smalltalka lub innego jêzyka z obiektami. (A w³aœciwie dlaczego naucza siê Pascala a nie Loglanu?) +b) jeœli tworzysz swoje w³asne oprogramowanie i ma ono byæ w³¹czone w wiêkszy system ju¿ istniej¹cych modu³ów to pozostañ przy wybranym jêzyku progamowania. Rozwa¿ jednak mo¿liwoœæ napisania najpierw prototypu Twego oprogramowania w Loglanie i sprawdzenia jego zgodnoœci ze specyfikacj¹ (poprzez walidacjê lub weryfikacjê) a potem przekodowania do C czy C++1. Prototyp powinien powstaæ trzy razy szybciej. Wspomnieæ o nowoœci: sieæ maszyn DOSowych mo¿e realizowaæ maszynê wieloprocesorow¹ + +


+Notatki
+Wspomnieæ o tym, ¿e chocia¿ Loglan jest "samoróbk¹" uczelnian¹ to i tak mo¿e byæ u¿ywany przez wielu, w odró¿nieniu od samochodu. + + +
+1 Wspomnijmy tu o eksperymentalnym programie L2C t³umacz¹cym z Loglanu na C jaki powsta³ parê lat temu na Uniwersytecie Œl¹skim. + + + diff --git a/HTML/biul2.html.bak b/HTML/biul2.html.bak new file mode 100644 index 0000000..a029127 --- /dev/null +++ b/HTML/biul2.html.bak @@ -0,0 +1,182 @@ + + +Loglan'82 Biuletyn nr 2 + + + + +

Instytut Informatyki Politechniki Bia³ostockiej z +przyjemnoœci¹ zawiadamia, ¿e od +pewnego czasu dzia³a w sieci Internetu

+ + + + + + + +
repozytorium jêzyka pogramowania obiektowego
Loglan'82
+ + + + + + + + + + + + + + + + +
+

Co?

+

Loglan'82 jest jêzykiem programowania obiektowego, +wspó³bie¿nego, rozproszonego o niepowtarzalnych walorach.

+ +

+Udostêpniamy: +

    +
  • kompilatory+interpretatory Loglanu na rózne platformy, w tym sieciowe, +
  • dokumentacjê, +
  • zbiór przyk³adów, +
  • edytory: +LOTEK i edytor strukturalny (tylko dla œrodowiska DOS), +
  • ZRÓD£A! +
+

Gdzie?

+ +

+http://aragorn.pb.bialystok.pl +

+lub +

+ftp://aragorn.pb.bialystok.pl/pub/loglan +

+i jego lustrzane odbicia (znacznie szybciej osi¹galne w sieci) +

+ http://sunsite.icm.edu.pl/loglan/ +

+ ftp://sunsite/icm.edu.pl/pub/loglan/ + +

+ http://infpc1.univ-pau.fr/ +

+ftp://infpc1.univ-pau.fr/pub/loglan82 +

+

Jak?

+ +

+dla WWW: Mosaic, Netscape, Lynx, ... +

+dla anonymous FTP +

+

+ Dziekujemy prof. Markowi Niezgodce +

+i p. Wojtkowi Sylwestrzakowi z ICM +

ten server dziala od 1993 + +

+

Zachecamy do (bezplatnego!) korzystania z naszej bazy wiedzy.

+ +
+

Dlaczego?

+ + +

Uczelnie, jednostki badawcze, pracownicy uczelni i studenci, firmy softwareowe, etc. mog¹ wykorzystywaæ Loglan jako jêzyk programowania obiektowego: + +
    +
  • W dydaktyce programowania pocz¹tkowego, algorytmów i struktur danych, programowania obiektowego, programowania wspó³bie¿nego i rozproszonego, itd. +
  • W szybkim tworzeniu prototypów du¿ych, skomplikowanych aplikacji. +
  • W badaniach: jako narzêdzie badawcze, a tak¿e jako bogate Ÿród³o ciekawych i wa¿nych problemów badawczych (http://aragorn.pb.bialystok.pl/loglan/openpbms.html). +
+ + +

+Loglan nie jest gorszy od innych jêzyków programowania obiektowego (por. http://aragorn.pb.bialystok.pl/loglan/tablica3.html ) +Stosowanie Loglanu pozwola wyposa¿yæ uczelnie, pracowników, studentów itd. w licencjonowane oprogramowanie, bez ¿adnych kosztów! Co wiêcej, stwarza doœæ rzadk¹ okazjê rozdawania studentom legalnie i za darmo oprogramowania wspieraj¹cego proces dydaktyczny. Nauczyciele i s³uchacze bêd¹ mogli wymieniaæ siê Ÿród³ami programów loglanowskich i uzyskaj¹ te same wyniki bowiem Loglan jest niezale¿ny od platformy i dzia³a tak samo w DOSie, Unixie, Atari ST (myœlimy te¿ o platformach MacIntosh i Amiga), w sieciach rozleg³ych Internet i lokalnych Novell. + + +

+Jezyk oferuje niezwykle bogaty zestaw narzêdzi programowania obiektowego, ³¹cznie z obiektami-procesami rozproszonymi w sieci komputerowej. . Procesy komunikuj¹ siê w sposób ca³kowicie obiektowy: dwa procesy wspólnie realizuj¹ jak¹œ metodê jednego z dwu procesów wg pewnego protoko³u, jest to obce wywo³anie inaczej alien call zaproponowany i zrealizowany przez B. Ciesielskiego w r.1988. Wszystkie znane mechanizmy synchronizacji i komunikacji procesów sprowadzaj¹ siê do mechanizmu alien call w prosty i tani sposób. +

UWAGA

+. +Ostatnio reklamuja siê jêzyki przyblizaj¹ce siê do wysokiego standardu rozwi¹zañ opracowanych dla Loglanu. Mo¿emy jednak przewidywac, ¿e w bie¿¹cym stuleciu nie pojawi siê nowy istotnie lepszy od Loglanu jêzyk programowania obiektowego. Zalety naszych rozwiazañ zostan¹ nale¿ycie docenione w odleg³ej jeszcze przysz³oœci, gdy jakaœ bogata firma zechce promowaæ "swoje" odkrycie. Rozwi¹zania Loglanu wspieraj¹ siê wynikami badañ przeprowadzonych przez zespó³ profesorów A. Kreczmara, A. Salwickiego. (por. credits.html) Czy mo¿na oczekiwaæ ¿e jakaœ, nawet bogata, firma zainwestuje w potrzebne badania? +

KONIEC UWAGI.

+ + +

+Programowanie w Loglanie jest znacznie ³atwiejsze ni¿ w innych jêzykach programowania obiektowego (por http://aragorn.pb.bialystok.pl/loglan/quick.htm). + + +

+Programowanie w Loglanie jest o wiele bezpieczniejsze ni¿ w innych jêzykach programowania: +kompilator wykrywa wiele b³êdów (tak¿e tych nie dostrzeganych przez inne kompilatory), i opisuje nature i miejsce b³êdów, +wiele b³êdów jest wykrywanych i sygnalizowanych w trakcie wykonywania programu (b³êdy takie s¹ lokalizowane w tekscie programu Ÿród³owego i czytelnie opisane), +zarz¹dzanie zasobami pamiêciowymi jest bezpieczne i mocne, +np. programista nie musi siê obawiaæ groŸby trudnego do wykrycia b³êdu "wisz¹cych referencji": + +


+ +

+

PRZYKLAD (w Pascalu lub C++)

+ +
Niech x, y, z bêd¹ zmiennymi wskazuj¹cymi na rekord lub obiekt typu T. +
Po wykonaniu instrukcji dispose(y) lub odp. free(y) wartoœci¹ zmiennej y jest wskaŸnik nil do pustego obiektu. WskaŸniki x i z nadal pokazuj¹ na pole pamiêci zajmowane przez nieistniej¹cy ju¿ obiekt. Po wykonaniu instukcji new lub malloc to samo pole mo¿e byæ wskazywane przez zmienn¹ u jako obiekt typu T'. +
Porównaj to z aksjomatem Loglanu + {(x<>none&y=x&z=x) ( [kill(y)](x=y=z=none)} +
Jego sens jest oczywisty. Warto nadmieniæ, ¿e 1° koszt tej dealokacji obiektu x nie zale¿y od liczby wskaŸników do obiektu, nie musisz o tym mysleæ 2° system sygnalizuje wszelkie próby dostêpu do informacji w obiekcie, który (ju¿/jeszcze) nie istnieje. +ponadto programista mo¿e sam zaprojektowaæ reakcjê na b³êdy i na sygna³y podnoszone przez program w trakcie jego realizacji. + +
+ + + + + +
+ +

NIE PRZEGAP!

+ +
    +
  1. Porównaj sam, Loglan i inne jêzyki programowania i wyrób sobie swój w³asny pogl¹d w tej sprawie, +
  2. Policz: jedna licencja na kompilator jêzyka pretenduj¹cego do miana obiektowoœci to XXX z³ razy iloœæ stanowisk pracy w twej uczelni i u studentów. Ile to by kosztowa³o? +
  3. Zauwa¿! w jednym jêzyku programowania oferujemy Ci komplet narzêdzi: +klasy i obiekty, wspó³programy, procesy, dziedziczenie i zagnie¿dzanie modu³ów, ochronê atrybutów prywatnych obiektów wg ¿yczenia twórcy klasy, deklaracje sygna³ów i obs³ugê przerwañ i sygna³ów, wiele sposobów na tworzenie modu³ów generycznych - sparametryzowanych typem danych, dziedziczenie ne tylko w klasach ale w ka¿dym rodzaju modu³u: funkcji, procedurze, bloku, zspó³programie, procesie . +
  4. Uwierz nam! jêzyki o podobnych w³asnoœciach zostan¹ odkryte w Ameryce dopiero za parê lat. Chcesz czekaæ? +
  5. Zrób sobie wieloprocesorow¹, sieciow¹, virtualn¹ maszynê Loglanowsk¹! (Tanio! oto jedna z recept: weŸ tyle PC ile zdo³asz, po³¹cz je w sieæ lokaln¹, zainstaluj Loglan. ) +
  6. Zarób na Loglanie! Mo¿esz go sprzedawaæ, nie mamy nic przeciw temu i nie ¿¹damy niczego od Ciebie. Musisz tylko zachowaæ informacjê o prawach autorskich w sprzedawanych przez Ciebie kopiach. Tak jak to siê dzieje (lub jak powinno siê dziaæ) w przypadku TEXa, Linuxa, produktów GNU, etc. +
+ +
+ + +

+Przekonaj siê lub znajdŸ s³aby punkt w naszej argumentacji. +Napisz nam o Twoich zastrze¿eniach mailto:salwicki@aragorn.pb.bialystok.pl + +

+Nie przejdŸ obojêtnie wobec naszej oferty bo byæ mo¿e przegapisz coœ co ma dla Ciebie znaczenie. Jeœli masz j¹ odrzuciæ to zrób to œwiadomie, na podstawie rzeczowych przes³anek. (Napisz nam o Twych zastrze¿eniach.) + + +

+Czy argument "to siê nie przyjmie" ma tu istotne znaczenie? +a) jeœli prowadzisz zajêcia dydaktyczne lub jestes ich s³uchaczem: to zauwa¿, ¿e ¿aden inny +jêzyk programowania nie dostarczy Ci tak w³aœciwej podstawy do studiowania zjawisk zwi¹zanych z obiektami. Np. temat "modu³y generyczne" w jêzyku C++ sprowadza siê do szablonów (ang. template). W Loglanie znamy kilkanaœcie ró¿nych rowi¹zañ tego problemu. A same szablony maj¹ wiêcej wad ni¿ tego mo¿na by oczekiwaæ. +Po Loglanie mo¿na nauczaæ jakiegokolwiek jêzyka programowania znacznie szybciej i wydajniej. Wystarcz¹ 2 popo³udnia by nauczyæ C++, Smalltalka lub innego jêzyka z obiektami. (A w³aœciwie dlaczego naucza siê Pascala a nie Loglanu?) +b) jeœli tworzysz swoje w³asne oprogramowanie i ma ono byæ w³¹czone w wiêkszy system ju¿ istniej¹cych modu³ów to pozostañ przy wybranym jêzyku progamowania. Rozwa¿ jednak mo¿liwoœæ napisania najpierw prototypu Twego oprogramowania w Loglanie i sprawdzenia jego zgodnoœci ze specyfikacj¹ (poprzez walidacjê lub weryfikacjê) a potem przekodowania do C czy C++1. Prototyp powinien powstaæ trzy razy szybciej. Wspomnieæ o nowoœci: sieæ maszyn DOSowych mo¿e realizowaæ maszynê wieloprocesorow¹ + +


+Notatki
+Wspomnieæ o tym, ¿e chocia¿ Loglan jest "samoróbk¹" uczelnian¹ to i tak mo¿e byæ u¿ywany przez wielu, w odró¿nieniu od samochodu. + + +
+1 Wspomnijmy tu o eksperymentalnym programie L2C t³umacz¹cym z Loglanu na C jaki powsta³ parê lat temu na Uniwersytecie Œl¹skim. + + + diff --git a/HTML/biul2.html~ b/HTML/biul2.html~ new file mode 100644 index 0000000..ffb4aab --- /dev/null +++ b/HTML/biul2.html~ @@ -0,0 +1,145 @@ + + +Loglan'82 Biuletyn nr 2 + + + + +

Instytut Informatyki Politechniki Bia³ostockiej z +przyjemnoœci¹ zawiadamia, ¿e od +pewnego czasu dzia³a w sieci Internetu

+ + + repozytorium jêzyka pogramowania obiektowego +

+ + Loglan'82

+ + + + + + + + + + + + + + + +
+

Co?

+

Loglan'82 jest jêzykiem programowania obiektowego, +wspó³bie¿nego, rozproszonego o niepowtarzalnych walorach.

+ +

+Udostêpniamy: +

    +
  • kompilatory+interpretatory Loglanu na rózne platformy, w tym sieciowe, +
  • dokumentacjê, +
  • zbiór przyk³adów, +
  • edytory: +LOTEK i edytor strukturalny (tylko dla œrodowiska DOS), +
  • RZRÓD£A! +
+

Gdzie?

+ +

+http://aragorn.pb.bialystok.pl +

+lub +

+ftp://aragorn.pb.bialystok.pl/pub/loglan +

+i jego lustrzane odbicia (znacznie szybciej osi¹galne w sieci) +

+ http://sunsite.icm.edu.pl/loglan/ +

+ ftp://sunsite/icm.edu.pl/pub/loglan/ + +

+ http://infpc1.univ-pau.fr/ +

+ftp://infpc1.univ-pau.fr/pub/loglan82 +

+

Jak?

+ +

+dla WWW: Mosaic, Netscape, Lynx, ... +

+dla anonymous FTP +

+

+ Dziekujemy prof. Markowi Niezgodce +

+i p. Wojtkowi Sylwestrzakowi z ICM +

ten server dziala od 1993 + +

+

Zachecamy do (bezplatnego!) korzystania z naszej bazy wiedzy.

+ +
+

Dlaczego?

+ + +

+ + + + +Uczelnie, jednostki badawcze, pracownicy uczelni i studenci, firmy softwareowe, etc. mog¹ wykorzystywaæ Loglan jako jêzyk programowania obiektowego: + +W dydaktyce programowania pocz¹tkowego, algorytmów i struktur danych, programowania obiektowego, programowania wspó³bie¿nego i rozproszonego, itd. +W szybkim tworzeniu prototypów du¿ych, skomplikowanych aplikacji. +W badaniach: jako narzêdzie badawcze, a tak¿e jako bogate Ÿród³o ciekawych i wa¿nych problemów badawczych (http://aragorn.pb.bialystok.pl/loglan/openpbms.html). + +Loglan nie jest gorszy od innych jêzyków programowania obiektowego (por. http://aragorn.pb.bialystok.pl/loglan/tablica3.html ) +Stosowanie Loglanu pozwola wyposa¿yæ uczelnie, pracowników, studentów itd. w licencjonowane oprogramowanie, bez ¿adnych kosztów! Co wiêcej, stwarza doœæ rzadk¹ okazjê rozdawania studentom legalnie i za darmo oprogramowania wspieraj¹cego proces dydaktyczny. Nauczyciele i s³uchacze bêd¹ mogli wymieniaæ siê Ÿród³ami programów loglanowskich i uzyskaj¹ te same wyniki bowiem Loglan jest niezale¿ny od platformy i dzia³a tak samo w DOSie, Unixie, Atari ST (myœlimy te¿ o platformach MacIntosh i Amiga), w sieciach rozleg³ych Internet i lokalnych Novell. + +Jezyk oferuje niezwykle bogaty zestaw narzêdzi programowania obiektowego, ³¹cznie z obiektami-procesami rozproszonymi w sieci komputerowej. . Procesy komunikuj¹ siê w sposób ca³kowicie obiektowy: dwa procesy wspólnie realizuj¹ jak¹œ metodê jednego z dwu procesów wg pewnego protoko³u, jest to obce wywo³anie inaczej alien call zaproponowany i zrealizowany przez B. Ciesielskiego w r.1988. Wszystkie znane mechanizmy synchronizacji i komunikacji procesów sprowadzaj¹ siê do mechanizmu alien call w prosty i tani sposób. +UWAGA. +Ostatnio reklamuja siê jêzyki przyblizaj¹ce siê do wysokiego standardu rozwi¹zañ opracowanych dla Loglanu. Mo¿emy jednak przewidywac, ¿e w bie¿¹cym stuleciu nie pojawi siê nowy istotnie lepszy od Loglanu jêzyk programowania obiektowego. Zalety naszych rozwiazañ zostan¹ nale¿ycie docenione w odleg³ej jeszcze przysz³oœci, gdy jakaœ bogata firma zechce promowaæ "swoje" odkrycie. Rozwi¹zania Loglanu wspieraj¹ siê wynikami badañ przeprowadzonych przez zespó³ profesorów A. Kreczmara, A. Salwickiego. (por. credits.html) Czy mo¿na oczekiwaæ ¿e jakaœ, nawet bogata, firma zainwestuje w potrzebne badania? +KONIEC UWAGI. +Programowanie w Loglanie jest znacznie ³atwiejsze ni¿ w innych jêzykach programowania obiektowego (por http://aragorn.pb.bialystok.pl/loglan/quick.htm). + +Programowanie w Loglanie jest o wiele bezpieczniejsze ni¿ w innych jêzykach programowania: +kompilator wykrywa wiele b³êdów (tak¿e tych nie dostrzeganych przez inne kompilatory), i opisuje nature i miejsce b³êdów, +wiele b³êdów jest wykrywanych i sygnalizowanych w trakcie wykonywania programu (b³êdy takie s¹ lokalizowane w tekscie programu Ÿród³owego i czytelnie opisane), +zarz¹dzanie zasobami pamiêciowymi jest bezpieczne i mocne, +np. programista nie musi siê obawiaæ groŸby trudnego do wykrycia b³êdu "wisz¹cych referencji": +PRZYKLAD (w Pascalu lub C++) +Niech x, y, z bêd¹ zmiennymi wskazuj¹cymi na rekord lub obiekt typu T. +Po wykonaniu instrukcji dispose(y) lub odp. free(y) wartoœci¹ zmiennej y jest wskaŸnik nil do pustego obiektu. WskaŸniki x i z nadal pokazuj¹ na pole pamiêci zajmowane przez nieistniej¹cy ju¿ obiekt. Po wykonaniu instukcji new lub malloc to samo pole mo¿e byæ wskazywane przez zmienn¹ u jako obiekt typu T'. +Porównaj to z aksjomatem Loglanu + {(x<>none&y=x&z=x) ( [kill(y)](x=y=z=none)} +Jego sens jest oczywisty. Warto nadmieniæ, ¿e 1° koszt tej dealokacji obiektu x nie zale¿y od liczby wskaŸników do obiektu, nie musisz o tym mysleæ 2° system sygnalizuje wszelkie próby dostêpu do informacji w obiekcie, który (ju¿/jeszcze) nie istnieje. +ponadto programista mo¿e sam zaprojektowaæ reakcjê na b³êdy i na sygna³y podnoszone przez program w trakcie jego realizacji. + +NIE PRZEGAP! +Porównaj sam, Loglan i inne jêzyki programowania i wyrób sobie swój w³asny pogl¹d w tej sprawie, +Policz: jedna licencja na kompilator jêzyka pretenduj¹cego do miana obiektowoœci to XXX z³ razy iloœæ stanowisk pracy w twej uczelni i u studentów. Ile to by kosztowa³o? +Zauwa¿! w jednym jêzyku programowania oferujemy Ci komplet narzêdzi: +klasy i obiekty, wspó³programy, procesy, dziedziczenie i zagnie¿dzanie modu³ów, ochronê atrybutów prywatnych obiektów wg ¿yczenia twórcy klasy, deklaracje sygna³ów i obs³ugê przerwañ i sygna³ów, wiele sposobów na tworzenie modu³ów generycznych - sparametryzowanych typem danych, dziedziczenie ne tylko w klasach ale w ka¿dym rodzaju modu³u: funkcji, procedurze, bloku, zspó³programie, procesie . +Uwierz nam! jêzyki o podobnych w³asnoœciach zostan¹ odkryte w Ameryce dopiero za parê lat. Chcesz czekaæ? +Zrób sobie wieloprocesorow¹, sieciow¹, virtualn¹ maszynê Loglanowsk¹! (Tanio! oto jedna z recept: weŸ tyle PC ile zdo³asz, po³¹cz je w sieæ lokaln¹, zainstaluj Loglan. ) +Zarób na Loglanie! Mo¿esz go sprzedawaæ, nie mamy nic przeciw temu i nie ¿¹damy niczego od Ciebie. Musisz tylko zachowaæ informacjê o prawach autorskich w sprzedawanych przez Ciebie kopiach. Tak jak to siê dzieje (lub jak powinno siê dziaæ) w przypadku TEXa, Linuxa, produktów GNU, etc. + +Przekonaj siê lub znajdŸ s³aby punkt w naszej argumentacji. Napisz nam o Twoich zastrze¿eniach mailto:salwicki@aragorn.pb.bialystok.pl +Nie przejdŸ obojêtnie wobec naszej oferty bo byæ mo¿e przegapisz coœ co ma dla Ciebie znaczenie. Jeœli masz j¹ odrzuciæ to zrób to œwiadomie, na podstawie rzeczowych przes³anek. (Napisz nam o Twych zastrze¿eniach.) + +Czy argument "to siê nie przyjmie" ma tu istotne znaczenie? +a) jeœli prowadzisz zajêcia dydaktyczne lub jestes ich s³uchaczem: to zauwa¿, ¿e ¿aden inny +jêzyk programowania nie dostarczy Ci tak w³aœciwej podstawy do studiowania zjawisk zwi¹zanych z obiektami. Np. temat "modu³y generyczne" w jêzyku C++ sprowadza siê do szablonów (ang. template). W Loglanie znamy kilkanaœcie ró¿nych rowi¹zañ tego problemu. A same szablony maj¹ wiêcej wad ni¿ tego mo¿na by oczekiwaæ. +Po Loglanie mo¿na nauczaæ jakiegokolwiek jêzyka programowania znacznie szybciej i wydajniej. Wystarcz¹ 2 popo³udnia by nauczyæ C++, Smalltalka lub innego jêzyka z obiektami. (A w³aœciwie dlaczego naucza siê Pascala a nie Loglanu?) +b) jeœli tworzysz swoje w³asne oprogramowanie i ma ono byæ w³¹czone w wiêkszy system ju¿ istniej¹cych modu³ów to pozostañ przy wybranym jêzyku progamowania. Rozwa¿ jednak mo¿liwoœæ napisania najpierw prototypu Twego oprogramowania w Loglanie i sprawdzenia jego zgodnoœci ze specyfikacj¹ (poprzez walidacjê lub weryfikacjê) a potem przekodowania do C czy C++1. Prototyp powinien powstaæ trzy razy szybciej. Wspomnieæ o nowoœci: sieæ maszyn DOSowych mo¿e realizowaæ maszynê wieloprocesorow¹ + +Wspomnieæ o tym, ¿e chocia¿ Loglan jest "samoróbk¹" uczelnian¹ to i tak mo¿e byæ u¿ywany przez wielu, w odró¿nieniu od samochodu. + + + +1 Wspomnijmy tu o eksperymentalnym programie L2C t³umacz¹cym z Loglanu na C jaki powsta³ parê lat temu na Uniwersytecie Œl¹skim. + + +p \ No newline at end of file diff --git a/HTML/biul2.txt b/HTML/biul2.txt new file mode 100644 index 0000000..f0303e9 --- /dev/null +++ b/HTML/biul2.txt @@ -0,0 +1,98 @@ + + +Loglan'82 Biuletyn nr 2 + + + + +

Instytut Informatyki Politechniki Bia³ostockiej z +przyjemnoœsci¹ zawiadamia, ¿e od p +pewnego czasu dzia³a w sieci Internetu + +repozytorium jêzyka pogramowania obiektowego Loglan'82

+ + +

Co?

+

Loglan'82 jest jêzykiem programowania obiektowego, +wspó³bie¿nego, rozproszonego o niepowtarzalnych walorach.

+ +

+Udostêpniamy: + +

    +
  • kompilatory+interpretatory Loglanu na róne platformy, w tym sieciowe, +dokumentacjê, +
  • zbiór przyk³adów, +
  • edytory: + + LOTEK i edytor strukturalny (tylko dla œrodowiska DOS), +
  • RZRÓD£A! +
+Gdzie? Jak? + http://aragorn.pb.bialystok.pl dla WWW: Mosaic, Netscape, Lynx, ... +lub + ftp://aragorn.pb.bialystok.pl/pub/loglan dla anonymous FTP +i jego lustrzane odbicia (znacznie szybciej osi¹galne w sieci) + http://sunsite.icm.edu.pl/loglan/ DZIEKUJEMY prof. Markowi Niezgódce + ftp://sunsite/icm.edu.pl/pub/loglan/ i Wojtkowi Sylwestrzakowi z ICM + + http://infpc1.univ-pau.fr/ ten server dzia³a od 1993 + ftp://infpc1.univ-pau.fr/pub/loglan82 +Zachêcamy do (bezp³atnego!) korzystania z naszej bazy wiedzy. + +Dlaczego? + +Uczelnie, jednostki badawcze, pracownicy uczelni i studenci, firmy softwareowe, etc. mog¹ wykorzystywaæ Loglan jako jêzyk programowania obiektowego: + +W dydaktyce programowania pocz¹tkowego, algorytmów i struktur danych, programowania obiektowego, programowania wspó³bie¿nego i rozproszonego, itd. +W szybkim tworzeniu prototypów du¿ych, skomplikowanych aplikacji. +W badaniach: jako narzêdzie badawcze, a tak¿e jako bogate Ÿród³o ciekawych i wa¿nych problemów badawczych (http://aragorn.pb.bialystok.pl/loglan/openpbms.html). + +Loglan nie jest gorszy od innych jêzyków programowania obiektowego (por. http://aragorn.pb.bialystok.pl/loglan/tablica3.html ) +Stosowanie Loglanu pozwola wyposa¿yæ uczelnie, pracowników, studentów itd. w licencjonowane oprogramowanie, bez ¿adnych kosztów! Co wiêcej, stwarza doœæ rzadk¹ okazjê rozdawania studentom legalnie i za darmo oprogramowania wspieraj¹cego proces dydaktyczny. Nauczyciele i s³uchacze bêd¹ mogli wymieniaæ siê Ÿród³ami programów loglanowskich i uzyskaj¹ te same wyniki bowiem Loglan jest niezale¿ny od platformy i dzia³a tak samo w DOSie, Unixie, Atari ST (myœlimy te¿ o platformach MacIntosh i Amiga), w sieciach rozleg³ych Internet i lokalnych Novell. + +Jezyk oferuje niezwykle bogaty zestaw narzêdzi programowania obiektowego, ³¹cznie z obiektami-procesami rozproszonymi w sieci komputerowej. . Procesy komunikuj¹ siê w sposób ca³kowicie obiektowy: dwa procesy wspólnie realizuj¹ jak¹œ metodê jednego z dwu procesów wg pewnego protoko³u, jest to obce wywo³anie inaczej alien call zaproponowany i zrealizowany przez B. Ciesielskiego w r.1988. Wszystkie znane mechanizmy synchronizacji i komunikacji procesów sprowadzaj¹ siê do mechanizmu alien call w prosty i tani sposób. +UWAGA. +Ostatnio reklamuja siê jêzyki przyblizaj¹ce siê do wysokiego standardu rozwi¹zañ opracowanych dla Loglanu. Mo¿emy jednak przewidywac, ¿e w bie¿¹cym stuleciu nie pojawi siê nowy istotnie lepszy od Loglanu jêzyk programowania obiektowego. Zalety naszych rozwiazañ zostan¹ nale¿ycie docenione w odleg³ej jeszcze przysz³oœci, gdy jakaœ bogata firma zechce promowaæ "swoje" odkrycie. Rozwi¹zania Loglanu wspieraj¹ siê wynikami badañ przeprowadzonych przez zespó³ profesorów A. Kreczmara, A. Salwickiego. (por. credits.html) Czy mo¿na oczekiwaæ ¿e jakaœ, nawet bogata, firma zainwestuje w potrzebne badania? +KONIEC UWAGI. +Programowanie w Loglanie jest znacznie ³atwiejsze ni¿ w innych jêzykach programowania obiektowego (por http://aragorn.pb.bialystok.pl/loglan/quick.htm). + +Programowanie w Loglanie jest o wiele bezpieczniejsze ni¿ w innych jêzykach programowania: +kompilator wykrywa wiele b³êdów (tak¿e tych nie dostrzeganych przez inne kompilatory), i opisuje nature i miejsce b³êdów, +wiele b³êdów jest wykrywanych i sygnalizowanych w trakcie wykonywania programu (b³êdy takie s¹ lokalizowane w tekscie programu Ÿród³owego i czytelnie opisane), +zarz¹dzanie zasobami pamiêciowymi jest bezpieczne i mocne, +np. programista nie musi siê obawiaæ groŸby trudnego do wykrycia b³êdu "wisz¹cych referencji": +PRZYKLAD (w Pascalu lub C++) +Niech x, y, z bêd¹ zmiennymi wskazuj¹cymi na rekord lub obiekt typu T. +Po wykonaniu instrukcji dispose(y) lub odp. free(y) wartoœci¹ zmiennej y jest wskaŸnik nil do pustego obiektu. WskaŸniki x i z nadal pokazuj¹ na pole pamiêci zajmowane przez nieistniej¹cy ju¿ obiekt. Po wykonaniu instukcji new lub malloc to samo pole mo¿e byæ wskazywane przez zmienn¹ u jako obiekt typu T'. +Porównaj to z aksjomatem Loglanu + {(x<>none&y=x&z=x) ( [kill(y)](x=y=z=none)} +Jego sens jest oczywisty. Warto nadmieniæ, ¿e 1° koszt tej dealokacji obiektu x nie zale¿y od liczby wskaŸników do obiektu, nie musisz o tym mysleæ 2° system sygnalizuje wszelkie próby dostêpu do informacji w obiekcie, który (ju¿/jeszcze) nie istnieje. +ponadto programista mo¿e sam zaprojektowaæ reakcjê na b³êdy i na sygna³y podnoszone przez program w trakcie jego realizacji. + +NIE PRZEGAP! +Porównaj sam, Loglan i inne jêzyki programowania i wyrób sobie swój w³asny pogl¹d w tej sprawie, +Policz: jedna licencja na kompilator jêzyka pretenduj¹cego do miana obiektowoœci to XXX z³ razy iloœæ stanowisk pracy w twej uczelni i u studentów. Ile to by kosztowa³o? +Zauwa¿! w jednym jêzyku programowania oferujemy Ci komplet narzêdzi: +klasy i obiekty, wspó³programy, procesy, dziedziczenie i zagnie¿dzanie modu³ów, ochronê atrybutów prywatnych obiektów wg ¿yczenia twórcy klasy, deklaracje sygna³ów i obs³ugê przerwañ i sygna³ów, wiele sposobów na tworzenie modu³ów generycznych - sparametryzowanych typem danych, dziedziczenie ne tylko w klasach ale w ka¿dym rodzaju modu³u: funkcji, procedurze, bloku, zspó³programie, procesie . +Uwierz nam! jêzyki o podobnych w³asnoœciach zostan¹ odkryte w Ameryce dopiero za parê lat. Chcesz czekaæ? +Zrób sobie wieloprocesorow¹, sieciow¹, virtualn¹ maszynê Loglanowsk¹! (Tanio! oto jedna z recept: weŸ tyle PC ile zdo³asz, po³¹cz je w sieæ lokaln¹, zainstaluj Loglan. ) +Zarób na Loglanie! Mo¿esz go sprzedawaæ, nie mamy nic przeciw temu i nie ¿¹damy niczego od Ciebie. Musisz tylko zachowaæ informacjê o prawach autorskich w sprzedawanych przez Ciebie kopiach. Tak jak to siê dzieje (lub jak powinno siê dziaæ) w przypadku TEXa, Linuxa, produktów GNU, etc. + +Przekonaj siê lub znajdŸ s³aby punkt w naszej argumentacji. Napisz nam o Twoich zastrze¿eniach mailto:salwicki@aragorn.pb.bialystok.pl +Nie przejdŸ obojêtnie wobec naszej oferty bo byæ mo¿e przegapisz coœ co ma dla Ciebie znaczenie. Jeœli masz j¹ odrzuciæ to zrób to œwiadomie, na podstawie rzeczowych przes³anek. (Napisz nam o Twych zastrze¿eniach.) + +Czy argument "to siê nie przyjmie" ma tu istotne znaczenie? +a) jeœli prowadzisz zajêcia dydaktyczne lub jestes ich s³uchaczem: to zauwa¿, ¿e ¿aden inny +jêzyk programowania nie dostarczy Ci tak w³aœciwej podstawy do studiowania zjawisk zwi¹zanych z obiektami. Np. temat "modu³y generyczne" w jêzyku C++ sprowadza siê do szablonów (ang. template). W Loglanie znamy kilkanaœcie ró¿nych rowi¹zañ tego problemu. A same szablony maj¹ wiêcej wad ni¿ tego mo¿na by oczekiwaæ. +Po Loglanie mo¿na nauczaæ jakiegokolwiek jêzyka programowania znacznie szybciej i wydajniej. Wystarcz¹ 2 popo³udnia by nauczyæ C++, Smalltalka lub innego jêzyka z obiektami. (A w³aœciwie dlaczego naucza siê Pascala a nie Loglanu?) +b) jeœli tworzysz swoje w³asne oprogramowanie i ma ono byæ w³¹czone w wiêkszy system ju¿ istniej¹cych modu³ów to pozostañ przy wybranym jêzyku progamowania. Rozwa¿ jednak mo¿liwoœæ napisania najpierw prototypu Twego oprogramowania w Loglanie i sprawdzenia jego zgodnoœci ze specyfikacj¹ (poprzez walidacjê lub weryfikacjê) a potem przekodowania do C czy C++1. Prototyp powinien powstaæ trzy razy szybciej. Wspomnieæ o nowoœci: sieæ maszyn DOSowych mo¿e realizowaæ maszynê wieloprocesorow¹ + +Wspomnieæ o tym, ¿e chocia¿ Loglan jest "samoróbk¹" uczelnian¹ to i tak mo¿e byæ u¿ywany przez wielu, w odró¿nieniu od samochodu. + + + +1 Wspomnijmy tu o eksperymentalnym programie L2C t³umacz¹cym z Loglanu na C jaki powsta³ parê lat temu na Uniwersytecie Œl¹skim. + + +p \ No newline at end of file diff --git a/HTML/biul2.txt~ b/HTML/biul2.txt~ new file mode 100644 index 0000000..b59df33 --- /dev/null +++ b/HTML/biul2.txt~ @@ -0,0 +1,88 @@ + + +Loglan'82 Biuletyn nr 2 + + + + +

Instytut Informatyki Politechniki Bia³ostockiej z przyjemnoœsci¹ zawiadamia, ¿e od pewnego czasu dzia³a w sieci Internetu + +repozytorium jêzyka pogramowania obiektowego Loglan'82

+ + +Co? Loglan'82 jest jêzykiem programowania obiektowego, wspó³bie¿nego, rozproszonego o niepowtarzalnych walorach. +Udostêpniamy: +kompilatory+interpretatory Loglanu na róne platformy, w tym sieciowe, +dokumentacjê, +zbiór przyk³adów, +edytory: LOTEK i edytor strukturalny (tylko dla œrodowiska DOS), +RÓD£A! + +Gdzie? Jak? + http://aragorn.pb.bialystok.pl dla WWW: Mosaic, Netscape, Lynx, ... +lub + ftp://aragorn.pb.bialystok.pl/pub/loglan dla anonymous FTP +i jego lustrzane odbicia (znacznie szybciej osi¹galne w sieci) + http://sunsite.icm.edu.pl/loglan/ DZIEKUJEMY prof. Markowi Niezgódce + ftp://sunsite/icm.edu.pl/pub/loglan/ i Wojtkowi Sylwestrzakowi z ICM + + http://infpc1.univ-pau.fr/ ten server dzia³a od 1993 + ftp://infpc1.univ-pau.fr/pub/loglan82 +Zachêcamy do (bezp³atnego!) korzystania z naszej bazy wiedzy. + +Dlaczego? + +Uczelnie, jednostki badawcze, pracownicy uczelni i studenci, firmy softwareowe, etc. mog¹ wykorzystywaæ Loglan jako jêzyk programowania obiektowego: + +W dydaktyce programowania pocz¹tkowego, algorytmów i struktur danych, programowania obiektowego, programowania wspó³bie¿nego i rozproszonego, itd. +W szybkim tworzeniu prototypów du¿ych, skomplikowanych aplikacji. +W badaniach: jako narzêdzie badawcze, a tak¿e jako bogate Ÿród³o ciekawych i wa¿nych problemów badawczych (http://aragorn.pb.bialystok.pl/loglan/openpbms.html). + +Loglan nie jest gorszy od innych jêzyków programowania obiektowego (por. http://aragorn.pb.bialystok.pl/loglan/tablica3.html ) +Stosowanie Loglanu pozwola wyposa¿yæ uczelnie, pracowników, studentów itd. w licencjonowane oprogramowanie, bez ¿adnych kosztów! Co wiêcej, stwarza doœæ rzadk¹ okazjê rozdawania studentom legalnie i za darmo oprogramowania wspieraj¹cego proces dydaktyczny. Nauczyciele i s³uchacze bêd¹ mogli wymieniaæ siê Ÿród³ami programów loglanowskich i uzyskaj¹ te same wyniki bowiem Loglan jest niezale¿ny od platformy i dzia³a tak samo w DOSie, Unixie, Atari ST (myœlimy te¿ o platformach MacIntosh i Amiga), w sieciach rozleg³ych Internet i lokalnych Novell. + +Jezyk oferuje niezwykle bogaty zestaw narzêdzi programowania obiektowego, ³¹cznie z obiektami-procesami rozproszonymi w sieci komputerowej. . Procesy komunikuj¹ siê w sposób ca³kowicie obiektowy: dwa procesy wspólnie realizuj¹ jak¹œ metodê jednego z dwu procesów wg pewnego protoko³u, jest to obce wywo³anie inaczej alien call zaproponowany i zrealizowany przez B. Ciesielskiego w r.1988. Wszystkie znane mechanizmy synchronizacji i komunikacji procesów sprowadzaj¹ siê do mechanizmu alien call w prosty i tani sposób. +UWAGA. +Ostatnio reklamuja siê jêzyki przyblizaj¹ce siê do wysokiego standardu rozwi¹zañ opracowanych dla Loglanu. Mo¿emy jednak przewidywac, ¿e w bie¿¹cym stuleciu nie pojawi siê nowy istotnie lepszy od Loglanu jêzyk programowania obiektowego. Zalety naszych rozwiazañ zostan¹ nale¿ycie docenione w odleg³ej jeszcze przysz³oœci, gdy jakaœ bogata firma zechce promowaæ "swoje" odkrycie. Rozwi¹zania Loglanu wspieraj¹ siê wynikami badañ przeprowadzonych przez zespó³ profesorów A. Kreczmara, A. Salwickiego. (por. credits.html) Czy mo¿na oczekiwaæ ¿e jakaœ, nawet bogata, firma zainwestuje w potrzebne badania? +KONIEC UWAGI. +Programowanie w Loglanie jest znacznie ³atwiejsze ni¿ w innych jêzykach programowania obiektowego (por http://aragorn.pb.bialystok.pl/loglan/quick.htm). + +Programowanie w Loglanie jest o wiele bezpieczniejsze ni¿ w innych jêzykach programowania: +kompilator wykrywa wiele b³êdów (tak¿e tych nie dostrzeganych przez inne kompilatory), i opisuje nature i miejsce b³êdów, +wiele b³êdów jest wykrywanych i sygnalizowanych w trakcie wykonywania programu (b³êdy takie s¹ lokalizowane w tekscie programu Ÿród³owego i czytelnie opisane), +zarz¹dzanie zasobami pamiêciowymi jest bezpieczne i mocne, +np. programista nie musi siê obawiaæ groŸby trudnego do wykrycia b³êdu "wisz¹cych referencji": +PRZYKLAD (w Pascalu lub C++) +Niech x, y, z bêd¹ zmiennymi wskazuj¹cymi na rekord lub obiekt typu T. +Po wykonaniu instrukcji dispose(y) lub odp. free(y) wartoœci¹ zmiennej y jest wskaŸnik nil do pustego obiektu. WskaŸniki x i z nadal pokazuj¹ na pole pamiêci zajmowane przez nieistniej¹cy ju¿ obiekt. Po wykonaniu instukcji new lub malloc to samo pole mo¿e byæ wskazywane przez zmienn¹ u jako obiekt typu T'. +Porównaj to z aksjomatem Loglanu + {(x<>none&y=x&z=x) ( [kill(y)](x=y=z=none)} +Jego sens jest oczywisty. Warto nadmieniæ, ¿e 1° koszt tej dealokacji obiektu x nie zale¿y od liczby wskaŸników do obiektu, nie musisz o tym mysleæ 2° system sygnalizuje wszelkie próby dostêpu do informacji w obiekcie, który (ju¿/jeszcze) nie istnieje. +ponadto programista mo¿e sam zaprojektowaæ reakcjê na b³êdy i na sygna³y podnoszone przez program w trakcie jego realizacji. + +NIE PRZEGAP! +Porównaj sam, Loglan i inne jêzyki programowania i wyrób sobie swój w³asny pogl¹d w tej sprawie, +Policz: jedna licencja na kompilator jêzyka pretenduj¹cego do miana obiektowoœci to XXX z³ razy iloœæ stanowisk pracy w twej uczelni i u studentów. Ile to by kosztowa³o? +Zauwa¿! w jednym jêzyku programowania oferujemy Ci komplet narzêdzi: +klasy i obiekty, wspó³programy, procesy, dziedziczenie i zagnie¿dzanie modu³ów, ochronê atrybutów prywatnych obiektów wg ¿yczenia twórcy klasy, deklaracje sygna³ów i obs³ugê przerwañ i sygna³ów, wiele sposobów na tworzenie modu³ów generycznych - sparametryzowanych typem danych, dziedziczenie ne tylko w klasach ale w ka¿dym rodzaju modu³u: funkcji, procedurze, bloku, zspó³programie, procesie . +Uwierz nam! jêzyki o podobnych w³asnoœciach zostan¹ odkryte w Ameryce dopiero za parê lat. Chcesz czekaæ? +Zrób sobie wieloprocesorow¹, sieciow¹, virtualn¹ maszynê Loglanowsk¹! (Tanio! oto jedna z recept: weŸ tyle PC ile zdo³asz, po³¹cz je w sieæ lokaln¹, zainstaluj Loglan. ) +Zarób na Loglanie! Mo¿esz go sprzedawaæ, nie mamy nic przeciw temu i nie ¿¹damy niczego od Ciebie. Musisz tylko zachowaæ informacjê o prawach autorskich w sprzedawanych przez Ciebie kopiach. Tak jak to siê dzieje (lub jak powinno siê dziaæ) w przypadku TEXa, Linuxa, produktów GNU, etc. + +Przekonaj siê lub znajdŸ s³aby punkt w naszej argumentacji. Napisz nam o Twoich zastrze¿eniach mailto:salwicki@aragorn.pb.bialystok.pl +Nie przejdŸ obojêtnie wobec naszej oferty bo byæ mo¿e przegapisz coœ co ma dla Ciebie znaczenie. Jeœli masz j¹ odrzuciæ to zrób to œwiadomie, na podstawie rzeczowych przes³anek. (Napisz nam o Twych zastrze¿eniach.) + +Czy argument "to siê nie przyjmie" ma tu istotne znaczenie? +a) jeœli prowadzisz zajêcia dydaktyczne lub jestes ich s³uchaczem: to zauwa¿, ¿e ¿aden inny +jêzyk programowania nie dostarczy Ci tak w³aœciwej podstawy do studiowania zjawisk zwi¹zanych z obiektami. Np. temat "modu³y generyczne" w jêzyku C++ sprowadza siê do szablonów (ang. template). W Loglanie znamy kilkanaœcie ró¿nych rowi¹zañ tego problemu. A same szablony maj¹ wiêcej wad ni¿ tego mo¿na by oczekiwaæ. +Po Loglanie mo¿na nauczaæ jakiegokolwiek jêzyka programowania znacznie szybciej i wydajniej. Wystarcz¹ 2 popo³udnia by nauczyæ C++, Smalltalka lub innego jêzyka z obiektami. (A w³aœciwie dlaczego naucza siê Pascala a nie Loglanu?) +b) jeœli tworzysz swoje w³asne oprogramowanie i ma ono byæ w³¹czone w wiêkszy system ju¿ istniej¹cych modu³ów to pozostañ przy wybranym jêzyku progamowania. Rozwa¿ jednak mo¿liwoœæ napisania najpierw prototypu Twego oprogramowania w Loglanie i sprawdzenia jego zgodnoœci ze specyfikacj¹ (poprzez walidacjê lub weryfikacjê) a potem przekodowania do C czy C++1. Prototyp powinien powstaæ trzy razy szybciej. Wspomnieæ o nowoœci: sieæ maszyn DOSowych mo¿e realizowaæ maszynê wieloprocesorow¹ + +Wspomnieæ o tym, ¿e chocia¿ Loglan jest "samoróbk¹" uczelnian¹ to i tak mo¿e byæ u¿ywany przez wielu, w odró¿nieniu od samochodu. + + + +1 Wspomnijmy tu o eksperymentalnym programie L2C t³umacz¹cym z Loglanu na C jaki powsta³ parê lat temu na Uniwersytecie Œl¹skim. + + +p \ No newline at end of file diff --git a/HTML/comptble.ps.Z b/HTML/comptble.ps.Z new file mode 100644 index 0000000000000000000000000000000000000000..359ed99254fcc161e1399cbf43cdf9fec9ccafdf GIT binary patch literal 23003 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 literal 0 HcmV?d00001 diff --git a/HTML/credits.htm b/HTML/credits.htm new file mode 100644 index 0000000..f01d9bd --- /dev/null +++ b/HTML/credits.htm @@ -0,0 +1,165 @@ + + + +credits & acknowledgements + + + +

Credits & Acknowledgments

+
+

this is a preliminary version

+
+
+ + +

1st step: Loglan'77

+In 1977 A. Salwicki aided by Tomasz Müldner, Hanna Oktaba, Wieslawa +Ratajczak initiated a research on the feasability of a universal programming +language which was to go beyond the Simula'67 and to enable new features: +processes, inheritance from unequal levels, inheritance in procedures, +fuctions etc..
The report on the language was ready in 1978. It helped us to +sign a contract with polish computer industry (We thank A. Janicki once the +deputy director of the Mera trust for his enthousiastic support.)
Our next +success was the arrival of prof. Antoni Kreczmar as the leader of the compiler +group. + +

Loglan'82

+In October 1978 the Loglan group started its work. The compiler group +headed by A. Kreczmar included also: W. Nykowski, Marek Lao, Andrzej I. +Litwiniuk, Danuta Szczepanska-Wasersztrum, Pawel Gburzynski.
+We had to install, repair* (* means iterations) the Mera 400 computers, +develop its poor software environment. This task was accomplished by Pawel +Gburzynski and Piotr Findeisen) . They did a lot of things:the file system and +other extensions of the operating system of Mera 400, the assembler Gass, the editor +EDM, ...
+The only programming language installed then on Mera was Fortran; we had no +choice, our compiler group had to write the compiler of Loglan in Fortran.
+And it works efficiently till today!
+The compiler group was encouraged by the analysis and application group +including Lech Banachowski, Hanna Oktaba, Tomasz Müldner, Wieslawa +Ratajczak-Bartol, Andrzej Salwicki, Lucjan Stapp and others.
+Our main question was the following: is it possible at all? does it exist a way to execute in a +consistent way programs that accept inheritance and nesting, inheritance +which permits to inherit from a different level ?
+Other important problems were: is it possible to maintain the Dijkstra's +mechanism of update of the Display Vector? is it posible to do deallocation of +an object in a safe way, without dangling references? Is it possible to give a +simpler but equally powerful mechanism of coroutines to that of Simula'67? +And many other questions.
+It was Antoni Kreczmar who found the answers to the basic questions [ ].
+Moreover, he wrote the kernel of the executing system for Loglan - the +Running System (1979).
+W.Nykowski wrote the scanner and the parser.
+Andrzej I. Litwiniuk wrote the code generator using many novel ideas.
+Danuta Szczepanska did static semantic module.
+The late Marek Lao did the module that checks the compatibility of types, using his own results.
+After different adventures the first version of the Loglan compiler became +operational in December 1981.
+Everybody worked with the enthousiasm testing, debugging, extending our +child.
+In June 1982 Danuta Szczepanska in cooperation with A. Kreczmar added +the mechanism of exception handling.
+The Loglan system was ready. In comparison with the report of the language +it lacked of separate compilation (and it still lacks of this mechanism) and +processes. +A. Salwicki did a prothese implementing processes as coroutines. But it never +became popular. Happily in 1988 Bolek Ciesielski did a superb contribution: +his concept of procedure calls as the synchronisation mechanism deserves +attention.[ ]
+The industrial partner accepted our work in June 1982. There was no +continuation however. + +

1982-1990

+1983 Loglan's summer school in Zaborow and Hans Langmaack's contribution
+1984 P. Gburzynski and A. I. Litwiniuk port the Loglan to Siemens komputer +(a clone of IBM mainframe - have you ever heard of these jurassic +mainframes my dear?)
+A. Szalas presented his Ph.D. thesis ..
+1984 an interactive debugger was added to the Loglan system by Teresa +Przytycka.
+1984 Radziejowice french-polish meeting on formal methods of programs +theory and object tools of programming
+1985 a longlife and successful cooperation with CNR IASI Rome begins. In +cooperation with, Gianna Cioni, Alfonso Miola and others (Giorgio Ausiello)<
+The results of the cooperation are numerous: here we shall quote only the the +installation of Loglan on VAX/VMS, debugger, report
+U. Petermann
+1986 the members of Loglan team were distinguished by the first price
+1986-90. A multi-goal and multi-university project was launched. Among 27 +teams there were 4 using or developping Loglan.
The results: +M. Warpechowski
+Loglan book by A. Szalas and J.Warpechowska appeared in
+A proposal for the new standard of Loglan in LNCS + +

porting to Unix environment

+A step toward it was made by Marcin Benke and Grzegorz who translated +GEN part of Loglan's system.
+It was Pawel Susicki who ported Loglan to Xenix using the hints of A. +Salwicki. It turned out that using f2c crosscompiler we are able to create +Loglan compiler in the Unix environment without using a Fortran compiler.
+In the summer 1991 Pawel Susicki installed Loglan on several Unix +computers accesible to LITA: PC486/SCO Unix, HP900, Sun4 with SunOS +(thanks to O. Rafiq for leasing us the Sun during August 1991).
+In 1992 Pawel Susicki wrote a support for processes distributed in network of +(hetergeneous) Unix machines. He had no chance to debug it however.
+Sebastien Bernard ported Loglan to the Atari.
+1993. Eric Becourt and Jerome Larrieu did a new version of predefined class +Xiiuwgraf for the users of Unix.
+ A. Salwicki prepared a distribution packet of +Loglan and put it in the server infpc1 of anonymous FTP users.
+1994. Frederic Pataud made a new better version of predefined class +IIuwgraph for users of Dos 386/486 machines.
+Eric Becourt did Logpp - now you can #include +

+November 1995

+Oskar Swida made a network version of Loglan.

+For a moment it was a network of SUNs equipped with Solaris. +

April 1996 (Oskar Swida) +A network of DOS machines equipped with LANWORKPLACE aor NETWARE +constitutes a virtual, multiprocessor, network Loglan machine. + +


+see also: +
    +

  • +

  • +
+
+
+ + + +
+
+AS 12:12 02/02/1995 +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +p \ No newline at end of file diff --git a/HTML/credits.htm~ b/HTML/credits.htm~ new file mode 100644 index 0000000..99610be --- /dev/null +++ b/HTML/credits.htm~ @@ -0,0 +1,158 @@ + + + +credits & acknowledgements + + + +

Credits & Acknowledgments

+
+

this is a preliminary version

+
+
+ + +

1st step: Loglan'77

+In 1977 A. Salwicki aided by Tomasz Müldner, Hanna Oktaba, Wieslawa +Ratajczak initiated a research on the feasability of a universal programming +language which was to go beyond the Simula'67 and to enable new features: +processes, inheritance from unequal levels, inheritance in procedures, +fuctions etc..
The report on the language was ready in 1978. It helped us to +sign a contract with polish computer industry (We thank A. Janicki once the +deputy director of the Mera trust for his enthousiastic support.)
Our next +success was the arrival of prof. Antoni Kreczmar as the leader of the compiler +group. + +

Loglan'82

+In October 1978 the Loglan group started its work. The compiler group +headed by A. Kreczmar included also: W. Nykowski, Marek Lao, Andrzej I. +Litwiniuk, Danuta Szczepanska-Wasersztrum, Pawel Gburzynski.
+We had to install, repair* (* means iterations) the Mera 400 computers, +develop its poor software environment. This task was accomplished by Pawel +Gburzynski and Piotr Findeisen) . They did a lot of things:the file system and +other extensions of the operating system of Mera 400, the assembler Gass, the editor +EDM, ...
+The only programming language installed then on Mera was Fortran; we had no +choice, our compiler group had to write the compiler of Loglan in Fortran.
+And it works efficiently till today!
+The compiler group was encouraged by the analysis and application group +including Lech Banachowski, Hanna Oktaba, Tomasz Müldner, Wieslawa +Ratajczak-Bartol, Andrzej Salwicki, Lucjan Stapp and others.
+Our main question was the following: is it possible at all? does it exist a way to execute in a +consistent way programs that accept inheritance and nesting, inheritance +which permits to inherit from a different level ?
+Other important problems were: is it possible to maintain the Dijkstra's +mechanism of update of the Display Vector? is it posible to do deallocation of +an object in a safe way, without dangling references? Is it possible to give a +simpler but equally powerful mechanism of coroutines to that of Simula'67? +And many other questions.
+It was Antoni Kreczmar who found the answers to the basic questions [ ].
+Moreover, he wrote the kernel of the executing system for Loglan - the +Running System (1979).
+W.Nykowski wrote the scanner and the parser.
+Andrzej I. Litwiniuk wrote the code generator using many novel ideas.
+Danuta Szczepanska did static semantic module.
+The late Marek Lao did the module that checks the compatibility of types, using his own results.
+After different adventures the first version of the Loglan compiler became +operational in December 1981.
+Everybody worked with the enthousiasm testing, debugging, extending our +child.
+In June 1982 Danuta Szczepanska in cooperation with A. Kreczmar added +the mechanism of exception handling.
+The Loglan system was ready. In comparison with the report of the language +it lacked of separate compilation (and it still lacks of this mechanism) and +processes. +A. Salwicki did a prothese implementing processes as coroutines. But it never +became popular. Happily in 1988 Bolek Ciesielski did a superb contribution: +his concept of procedure calls as the synchronisation mechanism deserves +attention.[ ]
+The industrial partner accepted our work in June 1982. There was no +continuation however. + +

1982-1990

+1983 Loglan's summer school in Zaborow and Hans Langmaack's contribution
+1984 P. Gburzynski and A. I. Litwiniuk port the Loglan to Siemens komputer +(a clone of IBM mainframe - have you ever heard of these jurassic +mainframes my dear?)
+A. Szalas presented his Ph.D. thesis ..
+1984 an interactive debugger was added to the Loglan system by Teresa +Przytycka.
+1984 Radziejowice french-polish meeting on formal methods of programs +theory and object tools of programming
+1985 a longlife and successful cooperation with CNR IASI Rome begins. In +cooperation with, Gianna Cioni, Alfonso Miola and others (Giorgio Ausiello)<
+The results of the cooperation are numerous: here we shall quote only the the +installation of Loglan on VAX/VMS, debugger, report
+U. Petermann
+1986 the members of Loglan team were distinguished by the first price
+1986-90. A multi-goal and multi-university project was launched. Among 27 +teams there were 4 using or developping Loglan.
The results: +M. Warpechowski
+Loglan book by A. Szalas and J.Warpechowska appeared in
+A proposal for the new standard of Loglan in LNCS + +

porting to Unix environment

+A step toward it was made by Marcin Benke and Grzegorz who translated +GEN part of Loglan's system.
+It was Pawel Susicki who ported Loglan to Xenix using the hints of A. +Salwicki. It turned out that using f2c crosscompiler we are able to create +Loglan compiler in the Unix environment without using a Fortran compiler.
+In the summer 1991 Pawel Susicki installed Loglan on several Unix +computers accesible to LITA: PC486/SCO Unix, HP900, Sun4 with SunOS +(thanks to O. Rafiq for leasing us the Sun during August 1991).
+In 1992 Pawel Susicki wrote a support for processes distributed in network of +(hetergeneous) Unix machines. He had no chance to debug it however.
+Sebastien Bernard ported Loglan to the Atari.
+1993. Eric Becourt and Jerome Larrieu did a new version of predefined class +Xiiuwgraf for the users of Unix.
+ A. Salwicki prepared a distribution packet of +Loglan and put it in the server infpc1 of anonymous FTP users.
+1994. Frederic Pataud made a new better version of predefined class +IIuwgraph for users of Dos 386/486 machines.
+Eric Becourt did Logpp - now you can #include + +
+see also: +
    +

  • +

  • +
+
+
+ + + +
+
+AS 12:12 02/02/1995 +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +p \ No newline at end of file diff --git a/HTML/crowd2.jpg b/HTML/crowd2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8337fabcf2062e8034818361924169a60953304f GIT binary patch literal 18254 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 Yx2$+~NT5et#|dOBDdA3zTKoSu0p_;8`Tzg` literal 0 HcmV?d00001 diff --git a/HTML/default1.hot b/HTML/default1.hot new file mode 100644 index 0000000..0410c7f --- /dev/null +++ b/HTML/default1.hot @@ -0,0 +1,79 @@ +[User Menu0] +Menu_Name=Starting Points +Menu_Type=TOPLEVEL +Item0=Starting Points Document,http://www.ncsa.uiuc.edu/SDG/Software/Mosaic/StartingPoints/NetworkStartingPoints.html +Item1=NCSA Mosaic Demo Document,http://www.ncsa.uiuc.edu/demoweb/demo.html +Item2=NCSA Mosaic's 'What's New' Page,http://www.ncsa.uiuc.edu/SDG/Software/Mosaic/Docs/whats-new.html +Item3=NCSA Mosaic Home Page,http://www.ncsa.uiuc.edu/SDG/Software/Mosaic/NCSAMosaicHome.html +Item4=Windows Mosaic home page,http://www.ncsa.uiuc.edu/SDG/Software/WinMosaic/HomePage.html +Item5=MENU,UserMenu1 +Item6=MENU,UserMenu2 +Item7=MENU,UserMenu3 +Item8=Finger Gateway,http://cs.indiana.edu/finger/gateway +Item9=Whois Gateway,gopher://sipb.mit.edu:70/1B%3aInternet%20whois%20servers +Item10=MENU,UserMenu4 +Item11=Archie Request Form,http://hoohoo.ncsa.uiuc.edu/archie.html + +[User Menu1] +Menu_Name=World Wide Web Info +Item0=Web Overview,http://www.w3.org/hypertext/WWW/LineMode/Defaults/default.html +Item1=Web Project,http://www.w3.org/hypertext/WWW/TheProject.html +Item2=Data Sources By Service,http://www.w3.org/hypertext/DataSources/ByAccess.html +Item3=Information By Subject,http://www.w3.org/hypertext/DataSources/bySubject/Overview.html +Item4=Web Servers Directory,http://www.w3.org/hypertext/DataSources/WWW/Servers.html +Item5=HTML Quick Reference,http://www.ncsa.uiuc.edu/General/Internet/WWW/HTMLQuickRef.html +Item6=Internet RFCs,http://www.cis.ohio-state.edu:80/hypertext/information/rfc.html + +[User Menu2] +Menu_Name=Home Pages +Item0=The University of Illinois at Urbana-Champaign,http://www.uiuc.edu +Item1=NCSA Home Page,http://www.ncsa.uiuc.edu/General/NCSAHome.html +Item2=CERN Home Page,http://info.cern.ch/ +Item3=UNC-Chapel Hill home page,http://sunsite.unc.edu +Item4=ANU Bioinformatics,http://life.anu.edu.au:80/ +Item5=Data Research Home Page,http://dranet.dra.com/ +Item6=British Columbia,http://www.cs.ubc.ca/ +Item7=BSDI Home Page,http://www.bsdi.com/ +Item8=Carnegie Mellon,http://www.cs.cmu.edu:8001/Web/FrontDoor.html +Item9=Cornell Law School,http://www.law.cornell.edu/lii.table.html +Item10=Cornell Theory Center,http://www.tc.cornell.edu:80/ctc.html +Item11=DESY Home Page,http://info.desy.de:80/ +Item12=ECE WWW Page,http://www.ece.uiuc.edu +Item13=Honolulu Home Page,http://www.hcc.hawaii.edu/ +Item14=Indiana Home Page,http://cs.indiana.edu/home-page.html +Item15=Lysator ACS Sweden,http://www.lysator.liu.se:80/ +Item16=National Center for Atmospheric Research,http://http.ucar.edu/metapage.html +Item17=Northwestern Home Page,http://www.acns.nwu.edu/ +Item18=CICA's WWW Server ,http://www.cica.indiana.edu +Item19=Ohio State Home Page,http://www.cis.ohio-state.edu:80/hypertext/information/information.html +Item20=SSC Home Page,http://www.ssc.gov/SSC.html + +[User Menu3] +Menu_Name=Gopher Servers +Item0=Gopherspace Overview,gopher://gopher.micro.umn.edu:70/11/Other%20Gopher%20and%20Information%20Servers +Item1=Veronica Search,gopher://veronica.scs.unr.edu:70/11/veronica +Item2=NCSA Gopher,gopher://gopher.ncsa.uiuc.edu:70/1 +Item3=PSC Gopher,gopher://gopher.psc.edu:70/1 +Item4=SDSC Gopher,gopher://gopher.sdsc.edu:70/1 +Item5=Original (UMN) Gopher,gopher://gopher.micro.umn.edu:70/1 +Item6=UIUC Gopher,gopher://gopher.uiuc.edu:70/1 +Item7=UIUC Weather Machine,gopher://wx.atmos.uiuc.edu:70/1 +Item8=SDSU Sounds,gopher://athena.sdsu.edu:71/11/sounds + +[User Menu4] +Menu_Name=Other Documents +Item0=Beginner's Guide to HTML,http://www.ncsa.uiuc.edu/demoweb/html-primer.html +Item1=InterNIC Info Source,gopher://is.internic.net:70/11/infosource +Item2=Internet Services List,http://slacvx.slac.stanford.edu:80/misc/internet-services.html +Item3=Internet Talk Radio,http://www.ncsa.uiuc.edu/radio/radio.html +Item4=Library of Congress Vatican Exhibit,http://www.ncsa.uiuc.edu/SDG/Experimental/vatican.exhibit/Vatican.exhibit.html +Item5=NCSA Access Magazine,http://www.ncsa.uiuc.edu/Pubs/access/accessDir.html +Item6=Doctor Fun,http://sunsite.unc.edu/Dave/drfun.html +Item7=Postmodern Culture,http://jefferson.village.virginia.edu/pmc/contents.all.html +Item8=Zippy The Pinhead,http://www.cis.ohio-state.edu:84/ +Item9=Britannica Online,http://www.eb.com/ +Item10=ANU Art History Exhibit,http://www.ncsa.uiuc.edu/SDG/Experimental/anu-art-history/home.html +Item11=Web/Net T-Shirts,http://sashimi.wwa.com/~notime/mdd/www_shirt.html +Item12=Census Information,gopher://bigcat.missouri.edu/11/reference/census/us/basictables/ +Item13=FTP Sites,http://hoohoo.ncsa.uiuc.edu:80/ftp-interface.html + diff --git a/HTML/doc3.htm b/HTML/doc3.htm new file mode 100644 index 0000000..6e49d98 --- /dev/null +++ b/HTML/doc3.htm @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/HTML/errorcd.htm b/HTML/errorcd.htm new file mode 100644 index 0000000..58bedc5 --- /dev/null +++ b/HTML/errorcd.htm @@ -0,0 +1,415 @@ + + Error Codes + +

APPENDIX D : ERROR CODES

+ 0 - ***declaration part overloaded

+Overflow of compiler data structure of declaration part. Possible reasons: too complicated program structure +(too many classes, protection lists, parameter lists,...), too complicated function expressions e.g. f(g(h(...))). +It is possible that removing some errors e.g. "unvisible identifier" causes shortening of the program.

+ 10 - ***too many errors

+Overflow of error diagnostic table. 1024 first detected errors are printed, but global number of error is equal +to number of all detected errors.

+ 41 - ***declaration part overloaded

+Comments as for 0.

+ 101 - ':=' expected

+ 102 - ';' expected

+ 103 - 'then' expected

+ 104 - 'fi'/'else' expected

+ 105 - 'od' expected

+ 106 - '(' expected

+ 107 - ')' expected

+ 108 - 'do' expected

+ 109 - identifier expected

+ 110 - too many exits found

+ Length of sequence exit exit ...exit exceeds level of loop nesting +1.

+ 111 - illegal character

+ 112 - wrong structure of 'if'-statement

+ 113 - 'end' missing

+ 114 - '.' expected

+ 115 - illegal constant in expression

+ Character constant or text appears in logical or arithmetical expression.

+ 116 - '=' expected

+ 117 - constant expected

+ 118 - ':' expected

+ 119 - unit kind specification expected

+Keywords: class, procedure, function, coroutine or process missing in module headline.

+ 120 - 'hidden' or 'close' occurred twice

+ 121 - 'hidden' or 'close' out of a class

+ 122 - 'block' expected

+ 123 - object expression is not a generator

+Object expression appearing as instruction is not a generator e.g. new (a).b

+ 124 - 'dim' expected

+ 125 - 'to'/'downto' expected

+ 126 - illegal arithmetic operator

+ 127 - declaration part expected

+ 128 - incorrect identifier at 'end'

+Module name after end does not correspond to name in module headline.

+ 129 - wrong structure of 'case'-statement

+ 130 - wrong structure of 'do'-statement

+ 131 - illegal use of 'main'

+ Name main may be used only as an argument of attach operator; in other cases it is illegal.

+ 132 - 'when' expected

+ 133 - too many branches in 'case'-statement

+Number of branches in case instruction is greater than 160.

+ 134 - 'begin' missed

+ 135 - bad option

+ 136 - is it really a loglan program???

+There is no Loglan keyword found in source program like: begin, block, unit, class,...

+ 137 - 'block' missed - parsing began

+There is no keyword block or program at the beginning of the Loglan program. This message indicates +the source line, that is the first compiled line.

+ 138 - 'repeat' out of a loop

+ The length of sequence: (exit)*repeat exceeds nested depth of the loop.

+ 139 - there is no path to this statement

+ 140 - 'andif'/'orif' mixed

+ 141 - array of 'semaphore' is illegal

+ 142 - wrong handler end

+Handler declaration is not ended by instruction end or end handlers.

+ 143 - lastwill inside a structured statement

+ 144 - repeated lastwill

+Label LASTWILL appears more than once in the same module.

+ 145 - no parameter specification

+ 146 - wrong register specification

+ 147 - "," expected

+ 191 - ***null program

+There is no source program on the input file or there is no module declaration. Causes termination of +program compilation.

+ 196 - ***too many identifiers

+Entire length of all identifiers and keywords is greater than 3000 characters. This overflow terminates program +compilation.

+ 197 - ***too many formal parameters

+The length of formal parameter list and declared local variables (in actual module) is greater than 130. This +error terminates program compilation.

+ 198 - ***parsing stack overloaded

+Too complicated (nested) program structure. This error terminates program compilation.

+ 199 - ***too many prototypes

+Too many declarations in program caused overflow of the compiler data structure. This error terminates +program compilation.

+ 201 - wrong real constant

+ 202 - wrong comment

+ 203 - wrong character constant

+ 204 - wrong integer constant

+ 205 - integer overflow

+Integer constant out of range.

+ 206 - real overflow

+Real constant out of range.

+ 211 - identifier too long

+Length of identifier is greater than 20 characters.

+ 212 - string too long

+Length of string constant is greater than 260 characters.

+ 301 - prefix is not a class id

+Prefix name ID is not a class name. It may appear when identifier ID is used earlier (declared more than +once).

+ 303 - coroutine/process illegal here as prefix id

+Procedure, function or block can't be prefixed by coroutine or process.

+ 304 - hidden identifier cannot be taken id

+Identifier ID placed on taken list is on hidden list in the prefixing module.

+ 305 - undeclared identifier id

+ 306 - undeclared type identifier id

+ 307 - type identifier expected id

+Identifier ID used in variable or function declaration as a type name, is not declared earlier as a type (but +name has been used earlier).

+ 308 - undeclared prefix identifier id

+ 309 - declared more than once id

+ 310 - taken list in unprefixed unit

+ 316 - formal type specification after use id

+Formal type ID appears in the parameter list after using this identifier as parameter type e.g. (... x: ID; type +ID, ...).

+ 317 - hidden type identifier id

+Type name ID is on hidden list in a prefix of one of the modules from SL chain of actual module and it is a +nearest declaration of this identifier.

+ 318 - type identifier not taken id

+Type name ID is not on taken list in a prefix of one of the modules from SL chain of actual module.

+ 319 - hidden identifier in the list id

+Identifier ID from hidden or close list is on hidden list in one of the prefixing modules.

+ 320 - identifier in the list not taken id

+Identifer ID from hidden or close list is not placed on taken list in none of the prefixing modules.

+ 321 - identifier cannot be taken id

+Identifer ID from taken list is placed on taken list in none of the prefixes.

+ 322 - hidden prefix identifier id

+Analogical to 317 error.

+ 323 - prefix identifier not taken id

+Analogical to 318 error.

+ 329 - only procedure and function may be virtual

+ virtual specification appears with class specification.

+ 330 - virtual in unprefixed block/procedure/function

+ 331 - incompatible kinds of virtuals id

+Kind of virtual module ID is different from kind of replaced module (e.g. one of them is a function, the other +one is a procedure).

+ 332 - incompatible types of virtuals id

+ Type of virtual function ID is different from type of replaced function.

+ 333 - different lengths of form.param.lists in virtuals id

+Virtual module ID and replaced module have different number of formal parameters.

+ 334 - conflict kinds of the 1st level parameters id

+In the headline of virtual module ID kind of formal parameter differs from corresponding formal parameter in +the headline of replaced module (e.g. type and variable, input and output parameters,.).

+ 335 - incompatible types of the 1st level parameters id

+There are formal parameters of different types (function, procedure) in the headline of virtual module ID +and in the headline of replaced module on the same position.

+ 336 - different lengths of the 2nd level params lists id

+There are formal procedures/functions with different numbers of parameters in the headline of virtual +module ID and in the headline of replaced module on the same position.

+ 337 - incompatible kinds of the 2nd level parameters id

+There are parameters of different kinds on the same position in the corresponding procedure or function +parameters in the headline of virtual module ID and in the headline of replaced module.

+ 338 - incompatible types of the 2nd level parameters id

+There are parameters of different types on the same position in the corresponding procedure or function in the +headline of virtual module ID and in the headline of replaced module.

+ 341 - ***declaration part overloaded

+Analogical to error 0.

+ 342 - ***too many classes declared

+ 343 - ***too many prototypes

+Too many modules declared on the same level.

+ 350 - undeclared signal identifier id

+ 351 - hidden signal identifier id

+Analogical to error 317.

+ 352 - signal identifier not taken id

+Analogical to error 318.

+ 353 - signal identifier expected id

+Identifier ID placed in handler declaration as a signal name has not been declared as a signal.

+ 354 - different types of parameters id

+In the headlines of signals, that have common handler, parameters of the different types appear on the same +position. ID is one of these parameters.

+ 355 - incompatible kinds of parameters id

+In the headlines of signals that have common handler, parameters of different kinds appear on the same +position. ID is one of these parameters.

+ 356 - different identifiers of parameters id

+In the headlines of signals that have common handler parameters of different names appear on the same +position. ID is one of these parameters.

+ 357 - incompatible kinds of the 2nd level parameters id

+Analogous to error 355 for 2-nd level paramKters.

+ 358 - different types of the 2nd level parameters id

+Analogous to error 354 for the 2-nd level parameters.

+ 359 - different lengths of the 2nd level params lists id

+There are formal procedures or formal functions with different number of parameters on the same position in +the headlines of signals this have common handler. ID is one of these formal parameters/functions.

+ 360 - different lengths of form. param. lists in signals id

+There are different number of formal parameters in the signals that have common handler. ID is one of these +signals.

+ 361 - non-local formal type cannot be used id

+Formal parameter ID of signal is of non local formal type.

+ 362 - repeated handler for signal id

+There are more than one handler for signal ID in the same module.

+ 370 - only 'input' is legal here

+Formal parameter output or inout is illegal in process.

+ 398 - class prefixed by itself id

+Construction unit ID: ID class is not allowed.

+ 399 - cycle in prefix sequence id

+ID is a class identifier used in cyclic prefixing i.e. ID prefixes a, a prefixes b, ... , z prefixes ID. This +construction is not allowed.

+ 401 - wrong label in 'case' id

+Label in case instruction is not a constant.

+ 402 - 'case' statement nested too deeply

+Nesting level in case instruction is greater than 6.

+ 403 - too long span of 'case' labels

+Range of branches in case instruction is greater than 160.

+ 404 - repeated label in 'case'-statement id

+Label ID appears more than once in case instruction.

+ 405 - illegal type of 'case' expression id

+Control expression in case statement is not of

+ integer or char type.

+ 406 - different types of labels and 'case' expression

+ 407 - non-logical expression after 'if'/'while' id

+ 408 - real constant out of integer range

+Error during conversion of real constant to integer constant.

+ 410 - simple variable expected id

+Control variable in for loop is not a simple variable.

+ 411 - non-integer control variable id

+Control variable ID in for loop is not of integer type.

+ 412 - non-integer expression id

+Expression placed as array index or bound limit in array generation or as step in for loop or as format in +write statement should be reducable to integer type.

+ 413 - file expression expected id

+ 414 - string expression expected id

+ 415 - reference expression expected id

+Expression placed before dot (remote access), before qua or as a argument of kill or copy statement is +not of class type.

+ 416 - array expression expected id

+ 417 - boolean expression expected id

+ 418 - semaphore variable expected

+ 419 - illegal type in 'open'

+The type name placed in open is different than TEXT, REAL, INTEGER, CHAR and DIRECT.

+ 420 - variable expected id

+Expression placed on the left side of assignment statement or as an argument of read instruction or in array +instruction is not a variable.

+ 421 - class identifier after 'new' expected id

+Identifier ID placed after new is not a class identifier.

+ 422 - procedure identifier after 'call' expected id

+ 423 - 'new' missing id

+Keyword new doesn't appear before class identifier for object generation.

+ 424 - 'call' missing id

+Keyword call doesn't appear before procedure identifier for procedure call.

+ 425 - 'inner' out of a class

+ 426 - 'inner' occurred more than once

+ 427 - 'wind'/'terminate' out of a handler

+ 428 - 'inner' inside lastwill

+ 429 - definition cannot be reduced to constant id

+Identifier ID placed in constant definition is not a constant.

+ 430 - undefined constant in the definition id

+ 431 - wrong number of indices id

+Number of indices in referencing to array element is different from declared number of indices.

+ 432 - index out of range id

+ 433 - upper bound less than lower bound id

+ 434 - too many subscripts id

+Dimension of static array ID is greater than 7.

+ 435 - variable is not array id

+ 440 - type identifier expected after 'arrayof' id

+Identifier ID placed after arrayof in actual parameter list, corresponding to type parameter is not a type name. +

+ 441 - incorrect format in 'write'

+There is format for expression of char type or there is double format for expression of type integer or +string.

+ 442 - illegal expression in 'write'

+Argument of write statement is not of type char, string, integer or real.

+ 443 - illegal type of variable in 'read' id

+Argument of read statement is not of type char, integer or real.

+ 444 - no data for i/o transfer

+There is only file identifier in I/O instruction.

+ 445 - illegal expression in 'put'

+ 446 - illegal expression in 'get'

+ 448 - 'raise' missing id

+There is signal identifier without keyword raise in the context of signal raising.

+ 449 - signal identifier expected id

+Identifer ID after keyword raise is not a signal identifier.

+ 450 - illegal procedure occurrence id

+Procedure name ID appears in illegal context.

+ 451 - illegal class occurrence id

+Class name ID appears in illegal context.

+ 452 - illegal type occurrence id

+Type name ID appears in illegal context.

+ 453 - illegal signal occurrence id

+Signal name ID appears in illegal context.

+ 454 - illegal operator occurence

+ 455 - wrong number of operands

+ 460 - divided by zero

+ 470 - illegal input parameter id

+Actual parameter associated with input parameter is not expression that may have any value: it is e.g. +procedure name

+ 471 - illegal output parameter id

+Actual parameter corredponded to output parameter is not a variable.

+ 472 - illegal type parameter id

+Actual parameter ID associated with type parameter is not a type name.

+ 473 - illegal procedure parameter id

+Actual parameter ID associated with procedure parameter is not a procedure name.

+ 474 - illegal function parameter id

+Actual parameter ID associated with function parameter is not a function name.

+ 475 - illegal left side of 'is'/'in' id

+Left side argument ID of is/in is not a reference expression.

+ 476 - illegal right side od 'is'/'in' id

+Right side argument ID of is / in is not a class name.

+ 477 - illegal parameter of 'attach' id

+Parameter ID of attach statement is not a reference variable of class object.

+ 478 - illegal type of expression

+ 479 - negative step value

+ 550 - ***stack overloaded

+This error may be removed by dividing expressions into subexpressions, making simpler nested callings of +arrays, functions, classes and for loops. This error terminates compilation of current module, but other modules +will be compiled.

+ 551 - ***too many auxiliary variables needed

+Too complicated expressions. This error may be removed by declaration of additional variables and using +them as auxiliary variables in expressions.

+ 552 - ***too many auxiliary reference variable needed

+Analogical to error 551.

+ 553 - ***statement sequence too long or too complicated

+This error may be removed by adding 'goto' statement into sequence of instructions e.g. if false then exit fi, +inner, ... or by dividing complicated expression into subexpressions.

+ 554 - ***real constants dictionary overflow

+Too many real constant, maybe because of evaluation of expressions built from real constants.

+ 600 - undeclared identifier id

+ 601 - illegal type before '.' id

+Expression placed before dot (remote access) is not of class type.

+ 602 - close identifier after '.' id

+Identifier ID placed after dot is on close list in the class or its prefix that construct expression before dot.

+ 603 - undeclared identifier after '.' id

+Identifier ID placed after dot is not attribute of expression placed before dot. It may be caused by missing +declaration or using bad prefix for class constructing expression before dot.

+ 604 - illegal operand type id

+One of the arguments in arithmetical expression or in relation is not of arithmetical type.

+ 605 - illegal type in 'div/'mod' term id

+Expression identified by ID used as argument of div or mode operation is not of integer type.

+ 606 - incompatible types in comparison id

+ID is an identifier of left argument of relation.

+ 607 - unrelated class types in comparison id

+ID is an identifier of left argument of relation. Both arguments are of class type and none of these classes +prefixes the other one.

+ 608 - string cannot be compared id

+ID identifies a string.

+ 609 - incompatible types in assignment/transmission id

+ID is an identifier of left side of assignment statement or an identifier of actual parameter in object generation. +Types of both sides of instruction or type of formal parameter and type of actual parameter are incompatible. +

+ 610 - unrelated class types in assignment/transmission id

+Analogical to errors 609 and 607.

+ 611 - constant after '.' id

+An attempt to remote access to constant.

+ 612 - this class does not occur in sl-chain id

+ Class ID appeared in expression this ID, but ID dosn't prefix any module in SL chain of actual module. It +may be a cycle.

+ 613,614 - class identifier expected id

+For error 613: identifier ID used in expression this ID is not of class type. For error 614: identifier ID used in +expression this ID is not name of any type.

+ 615 - illegal type before 'qua' id

+ Object expression before qua should be of one of the types: class, coroutine, process or simple (not array) +formal type.

+ 616,617 - illegal type after 'qua' id

+For error 616: identifier ID used after qua is not of any type.
+For error 617: identifier ID used after qua is not of class type.

+ 618 - unrelated types in 'qua'-expression id

+Identifier ID is a name of class type used after qua. This class type and class type used before qua doesn't +prefix each other.

+ 619 - hidden identifier id

+Identifier ID used in construction qua ID or this ID is on hidden list in the prefix of one of the module from +SL chain of actual module.

+ 620 - not taken identifier id

+Identifier ID used in construction qua ID or this ID is not on taken list in any prefix of any module of +actual module.

+ 621 - invisible identifier after '.' id

+Identifier ID placed after dot is on hidden list or is not on taken list in prefix.

+ 622 - formal parameter list is shorter id

+Identifier ID identifies generated object: class, procedure or function. Formal parameters list of this object is +shorter than actual parameters list.

+ 623 - formal parameter list is longer id

+Analogical to error 622.

+ 624 - actual parameter is not a reference type id

+Actual parameter identified by ID in generated object can't be of primitive type: integer, real, boolean or +string.

+ 625 - actual parameter is not a type id

+Actual parameter identified by ID is not a type, so it can't replace formal type parameter.

+ 626 - procedure-function conflict between parameters id

+Actual parameter, identified by ID, that replaced formal parameter in generated object is function whereas +formal parameter is a procedure or vice versa.

+ 627 - unmatched heads-wrong kinds of parameters id

+ID identifies actual module that replaced formal module. There are parameters of different kinds on the same +position in the headlines of these modules. For input - output conflict the agreement of parameter types is +checked also.

+ 628 - unmatched heads-incompatible types in lists id

+ID identifies actual module that replaced formal module. There are input /output parameters of different +types on the same position in the headlines of actual and formal module.

+ 629 - unmatched heads-unrelated class types in lists id

+ID identifies actual module that replaced formal module. There are input/output parameters specifying +classes of disjointed prefix sequences

+in the headlines of actual and formal module.

+ 630 - unmatched heads-different numbers of parameters id

+There are different lengths of headlines in actual module identified by ID and formal module.

+ 631 - incompatible types of function parameters id

+There are different types of actual function specified by identifier ID and formal function in generated +object.

+ 632 - function/procedure expected id

+Actual parameter identified by identifier ID is not function/procedure, whereas corresponding formal +parameter is function/procedure.

+ 633 - actual function type defined weaker than formal id

+Type of actual function identified by ID is weaker defined than formal function type e.g. formal function +type is statically defined, whereas actual function type is formal (external) or formal +function is class, whereas actual function type is coroutine or process.

+ 634 - unmatched heads-too weak type in actual list id

+There are input/output parameters on the same position in the headlines of actual module identified by +identifier ID and formal module, but ID is weaker defined than corresponding formal module parameter (see +error 633).

+ 635 - standard function/procedure cannot be actual par. id

+ID identifies standard procedure/function used as actual parameter.

+ 636 - illegal use of semaphore id

+ 637 - 'semaphore' cannot be used id

+


+
BACK
+ + diff --git a/HTML/homepage.gif b/HTML/homepage.gif new file mode 100644 index 0000000000000000000000000000000000000000..da7870489cdb021d406b56f5885313f0ab8a37ac GIT binary patch literal 1485 zcmV;;1v2_aNk%v~VPpVC0M!5h|NsBq=l}Qj|L5ob-roPMt@o{^_ukh3t(^C*l=sfP z_wVQb*2ee7t@o{j@7BHd&aL;Yd+)}a_pNj9-p2R$@Bi=K|JJql&ZYOQYwx96@4bZY ztz++;Lg&t$_q}`Xty=G#Ip@xl_r{FxrAp_VG3W2r|Hg#xr9$VNDd(+9=cPI4r7`Em zd+)76=cOs<_vinuIp?Jz=cO3ur4Z-$-v9U3|L?~4|M&m@@BaV*000000000000000 z00000EC2ui0Av70000L6K!9*aEE2dn74a)DA?dU|~|Fo-oZ7Kkv9c5Z@`V*+-MFpVYz44n)I zpcW>MWoMM9Mr(YTq7p$D%plK!gL}u4^^xSy3LSI|ez9vYAt8y6AU`I|5TPChaG?6+5TKY0dR;*ybLgxzq6e1@$NFWTE$~P{fJhL!!TSuHcUr3$GbA?Ef35b0n07FeuDd%e3 zU~mD$hzK5czL3FoMhdqwQoJYuR6~ZLCqMCP`PB&yLrfo-{gBWFi?uRlC|<0X?OdyN z9Y}!Ci7T_dOw8bs2|>b%2_SMJW=y*A+`18nKA^yr4N}ZV0A|W)7A=XLZAsIZv0HHp z8FNW!5Q+e0fMu^?rxJkif`=0bQ5;UZc(--Mz1_YDAv^*C2*(2CNv^yI4m>qX{Boy( zL<|U%ivFRoN-q$IfR+j? z02-*5Hl}djp#|)B9HWim0fS5zc$TGfTy{vGZ!gHHL2BUfSiyu-KEo%55foTysthKn zU7?2>u%mc);yDChkb2<2iw3@cU}^OMSLmFnbt=no{TVw4G-Uay!iKz(##Ra?EEz0i z1lTG6rM6w5H;`wxZ5S6@^g5=gtHfbY*>MuGI|m*M+}fD~lin7BTq*n}R|)0fo0S)GkQ@WvW|un`xr30QT))yS7AJ@%||c&^wd{x{q@*Op~Ln%48eW( zlYGzpl-n0k{we2=PvQCAgHH+j?3Wim0P_a|zx(pzPrv)(@Bh93MEIW((#Jpb`A>ZU zjDz_8hrsfU?}6Qep#Bb6KmZcZg7ve){2Yis4hrFd_Z#2@0~kT@dGLcHtilFMNW%T0 z@P!MUVEq>8LKntR4lAr73{A*G9U>uzFFarn!>2zE@{ol!G~y83XFesau!nF+AOi(B n#S&U^h6Y3-75mq}>?t9HUUWkIG8o1qfU%5C=pq`E5(EG{h0wyu literal 0 HcmV?d00001 diff --git a/HTML/icons/HomePage.gif b/HTML/icons/HomePage.gif new file mode 100644 index 0000000000000000000000000000000000000000..da7870489cdb021d406b56f5885313f0ab8a37ac GIT binary patch literal 1485 zcmV;;1v2_aNk%v~VPpVC0M!5h|NsBq=l}Qj|L5ob-roPMt@o{^_ukh3t(^C*l=sfP z_wVQb*2ee7t@o{j@7BHd&aL;Yd+)}a_pNj9-p2R$@Bi=K|JJql&ZYOQYwx96@4bZY ztz++;Lg&t$_q}`Xty=G#Ip@xl_r{FxrAp_VG3W2r|Hg#xr9$VNDd(+9=cPI4r7`Em zd+)76=cOs<_vinuIp?Jz=cO3ur4Z-$-v9U3|L?~4|M&m@@BaV*000000000000000 z00000EC2ui0Av70000L6K!9*aEE2dn74a)DA?dU|~|Fo-oZ7Kkv9c5Z@`V*+-MFpVYz44n)I zpcW>MWoMM9Mr(YTq7p$D%plK!gL}u4^^xSy3LSI|ez9vYAt8y6AU`I|5TPChaG?6+5TKY0dR;*ybLgxzq6e1@$NFWTE$~P{fJhL!!TSuHcUr3$GbA?Ef35b0n07FeuDd%e3 zU~mD$hzK5czL3FoMhdqwQoJYuR6~ZLCqMCP`PB&yLrfo-{gBWFi?uRlC|<0X?OdyN z9Y}!Ci7T_dOw8bs2|>b%2_SMJW=y*A+`18nKA^yr4N}ZV0A|W)7A=XLZAsIZv0HHp z8FNW!5Q+e0fMu^?rxJkif`=0bQ5;UZc(--Mz1_YDAv^*C2*(2CNv^yI4m>qX{Boy( zL<|U%ivFRoN-q$IfR+j? z02-*5Hl}djp#|)B9HWim0fS5zc$TGfTy{vGZ!gHHL2BUfSiyu-KEo%55foTysthKn zU7?2>u%mc);yDChkb2<2iw3@cU}^OMSLmFnbt=no{TVw4G-Uay!iKz(##Ra?EEz0i z1lTG6rM6w5H;`wxZ5S6@^g5=gtHfbY*>MuGI|m*M+}fD~lin7BTq*n}R|)0fo0S)GkQ@WvW|un`xr30QT))yS7AJ@%||c&^wd{x{q@*Op~Ln%48eW( zlYGzpl-n0k{we2=PvQCAgHH+j?3Wim0P_a|zx(pzPrv)(@Bh93MEIW((#Jpb`A>ZU zjDz_8hrsfU?}6Qep#Bb6KmZcZg7ve){2Yis4hrFd_Z#2@0~kT@dGLcHtilFMNW%T0 z@P!MUVEq>8LKntR4lAr73{A*G9U>uzFFarn!>2zE@{ol!G~y83XFesau!nF+AOi(B n#S&U^h6Y3-75mq}>?t9HUUWkIG8o1qfU%5C=pq`E5(EG{h0wyu literal 0 HcmV?d00001 diff --git a/HTML/icons/NextPage.gif b/HTML/icons/NextPage.gif new file mode 100644 index 0000000000000000000000000000000000000000..4f510e0ea210f9405743d3419223818c577ac7e7 GIT binary patch literal 2018 zcmcJM`B##O8pl}#1k^B5u`G83(;3rD$t6Y6+!`{nLQ_ktQR}K{T}$tb3#j0dI%uYp zBH}{x-qDVf)n!HqNh`M&DyKMQ%d2+lHLZEAndZIpN8IlZ&-s2o&pFRI-}6L8M+W#G z$UsG+UZYTmQ80o)Uk3~$u+e}BY(QW=0zn7_B9H-rj9zEN2nZt}gn%Fd8W2#AfJUf- zK_v_VumMC22E?F83_94Lf(=U8V1#nmAc6HdSg(ThN>~rTdSevBdOkD(z!P$KLIO{S z;R$0bf+q4IoeI_guucx^B(Saq((xf(5u`KnY)F?5spPPV52=bERX(K3hEztvgH#ES zDh5*4K*}OWnGY$mA!RzGe5s(s8Svg-& zfkF$>CKwZ(iAY%alenq*Y|FVSG!BPvC$!_wi(0#Tdb@?^@dUD&x!EN%sZ8ECbhWRV zX1B)4+1}d5+L}5*ZpUF7u1!n|M0h(V7lzM9UmrI|hjrEi()0D>Q?G~6c(N12*DokI zXiK1s*CpCS#T^@4tWYCbuT>(vH7J(bUmt&Q|<7 zigUD&{3Vr<&}sjEpj=1F(PcbXxZj%`RVp#tyuwL$ZSvZ71r^+PX|&GHms{vq5%z+yWKOPslph=w2GK=r3==%;$oA-ei?u{I26YWaN zJKV}iF%h>RAOha8}i866Z1cC4zh*AYkS!czCF@oGJPS zc}+%%8f$_=dG>QX95rTa8hKs&_`;`G7w?ra+xF~BL*uMswTmp%8P=57P+mNvYREUp zNnn%2>Hcs1yoGR9NIEjpY)qGz(+ zlFf^cSJ&3Xm1z2~2t89%cslc3J^fZCTYLE%DIZ7m_LlsXaBOfpy82dsxlEzCskjz_ z7e1sVS6Sk1(vqJ?Sj9?E8r;pQ@`B&0T`8q_?NSLlW81Y`Sp{z4{uQ(&?HfNU&wh@E z5OF0=KTYmT&I>1dN=jA*#Mf%> z)Jg+8L;W^BO54!oVufVAR06adL>usEN<)Mxy9RS*t|zz5eDS7e!a``H0`>44_FspZ zQ{QWs#($UmaCo+vU9%9`XUQR*TrB_C`z~0io@v)s3XpR-Cne-cAJU4CKcGQThZ9bB zQ?7*6&S$*1fkyek{}Gv1mh%Ij)do$Mlz(s}{(J24b$XS6{#QrwxG&l?fFQB8;Z(e0 zgobfK%N;uEwulc>YSHa3|@=f(AjmIPQ*CmOaEaKf}7Mv=N#UwqSGftQtzRsK&lKVN_q{&45VW z{ezboXp_}XXAk?!)WpQ2Q`T(p_iQH+Ap$G9TBT zRn>TDb8lpn%7fb=dcYbL_r&g3#8)e%Ef#(kS#K44k`#Bl>%>1NoLkuYRP;c2{3DPG h^s=xbvSP{4)_(Uw>bIXcYK!Lnlfg&*v1nA_{{R4Cr&0g_ literal 0 HcmV?d00001 diff --git a/HTML/icons/PrevPage.gif b/HTML/icons/PrevPage.gif new file mode 100644 index 0000000000000000000000000000000000000000..52968013b5528eea1f5881a325353ad066c32279 GIT binary patch literal 2044 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 literal 0 HcmV?d00001 diff --git a/HTML/icons/logo.gif b/HTML/icons/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..feed42ac740925e5a163368ce4e7a94c08d9ce8b GIT binary patch literal 4765 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 literal 0 HcmV?d00001 diff --git a/HTML/index.html b/HTML/index.html new file mode 100644 index 0000000..2e0ab5f --- /dev/null +++ b/HTML/index.html @@ -0,0 +1,113 @@ + + + + + +Loglan'82 home page + + + + + + + +

+Loglan'82 - programming with objects

+
+ +

Loglan's home page

+
+Your ticket No.: +
+
+ +

+Loglan'82 is an object-oriented, universal, imperative programming +language.
+It comes with Doc, Compilers (DOS, Unix, Atari,.), Examples etc. +
+Four features of Loglan'82 make it original and interesting for +everybody: +

+ +

+


+ +

INDEX

+ +

+ A SUGGESTION: Use recent versions of Mosaic or Netscape viewers +in order to read the tables we prepared for you.
+For those who can not see the tables there are ASCII versions +of tables as well as postscript files
+ +

+ +

+ +
+ +
+AS last +update Sun 21 May 1995 +
+ + + + diff --git a/HTML/index.html.bak b/HTML/index.html.bak new file mode 100644 index 0000000..f9bebc8 --- /dev/null +++ b/HTML/index.html.bak @@ -0,0 +1,110 @@ + + + + + +Loglan'82 home page + + + + + + + +

+Loglan'82 - programming with objects

+
+ +

Loglan's home page

+
+ +

+Loglan'82 is an object-oriented, universal, imperative programming +language.
+It comes with Doc, Compilers (DOS, Unix, Atari,.), Examples etc. +
+Four features of Loglan'82 make it original and interesting for +everybody: +

+ +

+


+ +

INDEX

+ +

+ A SUGGESTION: Use recent versions of Mosaic or Netscape viewers +in order to read the tables we prepared for you.
+For those who can not see the tables there are ASCII versions +of tables as well as postscript files
+ +

+ +

+ +
+ +
+AS last +update Sun 21 May 1995 +
+ + + + diff --git a/HTML/index.html~ b/HTML/index.html~ new file mode 100644 index 0000000..1f88a00 --- /dev/null +++ b/HTML/index.html~ @@ -0,0 +1,95 @@ + + + + + +Loglan'82 home page + + + + + + + +

+Loglan'82 - programming with objects

+
+ +

Loglan's home page

+
+ +

+Loglan'82 is an object-oriented, universal, imperative programming +language.
+It comes with Doc, Compilers (DOS, Unix, Atari,.), Examples etc. +
+Four features of Loglan'82 make it original and interesting for +everybody: +

+ +

+


+ +

INDEX

+ + +
  • Why Loglan'82? Should I be acquainted with it? + + +
    A SUGGESTION: Use recent versions of Mosaic or Netscape viewers +in order to read the tables we prepared for you.
    +For those who can not see the tables there are ASCII versions +of tables as well as postscript files
    + + +
  • a Quick Reference Card of Loglan'82 + + +
  • a short comparison with other OO languages + + +
  • A micro-manual of Loglan'82 + +
  • How to get a copy of Loglan'82 system? +
  • existing platforms + + +
  • research problems related to Loglan'82 +
      +
    • solved ones +
    • open ones +
    + +
  • Dr Fun or the mysteries of "scientific" bureaucracy +
  • a short history of Loglan'82 project +
  • why I learn so late on Loglan'82? + +
  • +
    + +
    +AS last +update Sun 21 May 1995 +
    + + + + +p \ No newline at end of file diff --git a/HTML/iuwgraf3.htm b/HTML/iuwgraf3.htm new file mode 100644 index 0000000..5721007 --- /dev/null +++ b/HTML/iuwgraf3.htm @@ -0,0 +1,774 @@ + +iiuwgraph +

    unit IIUWGRAPH: class;

    +

    a predefined Loglan'82 LOGLAN class

    + +{ this predefined class enables basic graphic operations + for DOS machines based on 486 or 386 processors +}

    + +{this document gives the specification of new version of IIUWGRAPH + class
    + made in October 1994 by Frederic Pataud à Pau}

    +


    +Table of Contents.
    + + +
      +
    • unit GRON : procedure (i: integer); +
    • unit GROFF : procedure; +
    • unit CLS : procedure; +
    • unit COLOR : procedure(co : integer); +
    • unit STYLE : procedure(styl : integer); +
    • unit BORDER : procedure (background_Colour: integer); +
    • unit PALLET : procedure (nr : integer); +
    • { PROCEDURES CONTROLLING POSITION } +
    • unit MOVE : procedure (x,y :integer); +
    • unit INXPOS : function: integer; +
    • unit INYPOS : function : integer; +
    • unit PUSHXY : procedure; +
    • unit POPXY: procedure; +
    • { PROCEDURES SERVING POINTS LINES} +
    • unit POINT : procedure(x,y: integer); +
    • unit INPIX : function (x,y : integer) : integer; +
    • unit DRAW : procedure( x,y : integer); +
    • unit intens: procedure(Size :integer; xCoord,yCoord:arrayof integer, +Colour,Filled :integer); +
    • unit cirb {draw a circle} procedure; +
    • unit hfill: procedure( x : integer); +
    • unit vfill: procedure( y : integer); +
    • unit patern: procedure( x1,y1,x2,y2,c,b : integer); +
    • { Procedures operating on bitmaps } +
    • unit GETMAP : function (x,y : integer) : arrayof integer; +
    • unit PUTMAP : procedure ( a: arrayof integer); +
    • unit ORMAP : procedure ( a : arrayof integer); +
    • unit XORMAP : procedure ( a: arrayof integer); +
    • {Procedures operating on characters and strings} +
    • unit outstring: procedure(x,y: integer, s: string, back_col, front_col: + integer); +
    • unit track: procedure( x,y,c,valeur : integer); +
    • unit inkey : function : integer; +
    • unit HASCII : procedure(c: integer); +
    • unit hfont: function( x,y,lg,min,max,default,col_f,col_e,col_c : integer): + integer; +
    • unit hfont8: function( x,y,lg,maxlg: integer, +default: arrayof char,col_f,col_e,col_c : integer): arrayof char; +
    • unit HPAGE : procedure(x,y,long: integer, A: arrayof char, back, front: + integer); +
    • unit MOUSE: class; +
    • unit init: procedure(checkMouse, checkKeyboard: integer); +
    • unit getmovement: procedure(checkMouse, checkKeyboard: + integer); +
    • unit getpress: function(v,p,h,l,r,c : integer): Boolean; +
    • unit showcursor: procedure; +
    • unit hidecursor: procedure; +
    • a sample program +
    + +
    + + + +{ the early versions of library IIUWGRAPH have been elaborated by + Piotr Carlsson, Miroslawa Milkowska, Janina Jankowska, + Michal Jankowski at Institute of Informatics, + University of Warsaw 1987,

    + and added to Loglan system by Danuta Szczepanska 1987,

    + + the recent versions were done at LITA, Pau,

    + by

    + Pawel Susicki (1991) for Unix,

    + Sebastien Bernard (1992) for ATARI, see a separate document,
    + Eric Becourt et Jerôme Larrieu (1993) for Unix and Xwindows, see a + separate document on Xiiuwgraf , +

    + +

    +fait à Pau, le 15 Novembre 1994, par Andrzej Salwicki, LITA}

    + +{ the predefined class IIUWGRAPH is included in all versions of interpreter of +Loglan, with the exception of the present version of interpreter for +VAX/VMS.}

    +


    +

    +

    +hidden   MaxX, MaxY,  current_X, current_Y, is_graphic_On,       
    +              current_Colour, current_Background_Colour,  current_Style, 
    +              current_Palette,  current_Pattern ; 
    +
    +
    +                
    +const  MaxX =            
    +          MaxY =            
    +
    +{    the screen's coordinates are 
    +        
    +       (0,0)   ---------------------->   (MaxX,0) 
    +           ¦ 
    +           ¦ 
    +           ¦ 
    +          V 
    +       (0, MaxY)                            (MaxX,MaxY) 
    +
    +}
    + 
    +
    +var  currentDriver : integer,                     { see NOCARD below }  
    +       current_X, current_Y:  integer         { it is the current position } 
    +       is_graphic_On:  Boolean,	   { evidently tells whether we are in 			
    +			graphics mode } 
    +       current_Colour : integer,		{ } 
    +       current_Background_Colour : integer, 
    +       current_Style : integer,		{ } 
    +       current_Palette : integer, 
    +       current_Pattern  
    +
    +

    +

    unit GRON procedure +(i: integer);

    + { procedure sets the monitor in graphic mode and clears the buffer + of screen. The parameter determines the resolution and the number of + colours.
    +The user should assure that the resolution chosen should correspond to that +which is set by means of command
    +SET go32 drivers {path}< driver.file> < width> < height> < +noColours> +eg.
    +set go32 drivers c:\loglan\svga\drivers\vesa.grn gw 1024 gh 480 nc 256
    +

    An execution of instruction call gron(i) must precede + any of the graphic commands described below.

    +

    +case (i)
    +  {
    +  0 : 640x480x16
    +  1 : 640x480x256
    +  2 : 800x600x16
    +  3 : 800x600x256
    +  4 : 1024x768x16
    +  5 : 1024x768x256
    +  6 : 1280x1024x16
    +  7 : 1280x1024x256
    +  8 : 1600x1280x16
    +  9 : 1600x1280x256
    + }
    +
    +

    to ToC + +

    unit GROFF procedure ;

    + { the procedure sets the monitor in the text mode filling it with + spaces.

    + DO NOT FORGET to set the monitor in the text mode before +you terminate your program

    + }

    +

    to ToC + + +

    unit CLS . +: procedure;

    + { the screen will be cleared and filled with colour 0 }

    +

    to ToC

    + + + +

    { PROCEDURES CONTROLLING THE COLOURS }

    +

    + +

    unit COLOR : + procedure(co : integer);

    +{ sets current color to co
    + for monochrome displays, 0 means black, non-0 - white
    + for color displays, 0 means background
    + see PALLET

    +}

    +

    to ToC + +

    unit STYLE : + procedure(styl : integer);

    +{ sets style of lines and fill shades to a combination

    + of current color and background color (for mono -

    + white and black, respectively) according to 5 predefined

    + patterns:

    +

    +		0	....
    +		1	****
    +		2	***.
    +		3	**..
    +		4	*.*.
    +		5	*...
    +
    + where '*' means current color, '.' background colour

    +When drawing the segments the subsequent pixels will have colour determined +by cyclic application of style pattern. The first and the last pixels of a segment +will have always current colour.

    +When filling contours the given style will be applied to horizontal lines with even +coordinate. The style for odd lines is determined automatically.

    +The same applies for perpendicular lines.

    +} +

    +

    to ToC + +

    unit BORDER . : +procedure (background_Colour: +integer);

    + +

    { sets actual background color to i ( i = 0,1,...,15 ) }

    + +

    to ToC + +

    unit PALLET : +procedure (nr : integer);

    + {the following line makes an example, it is not valid for, say, +256 colours +

    +the codes of colors are usually i.e. when you have 16 colours, as follows

    +

    +		0	black
    +		1	blue dark
    +		2	green dark
    +		3	turquoise dark
    +		4	red dark
    +		5	violet
    +		6	brown
    +		7	grey light
    +		8	grey dark	 
    +		9	blue
    +		10	green
    +		11	turquoise
    +		12	red light
    +		13	rose
    +		14	yellow
    +		15	white
    +
    } +

    +

    to ToC + + + +

    { PROCEDURES CONTROLLING POSITION }

    + +

    unit MOVE : +procedure (x,y :integer);

    + { procedure MOVE sets the current position on the screen on the pixel + with coordinates

    + x - column,

    + y - line }

    + { precondition of MOVE: + 0<x<MaxX & 0<y<MaxY + }

    +

    to ToC + +

    unit INXPOS : +function: integer;

    + { function INXPOS returns the x coordinate of the current position }

    +

    to ToC + + +

    unit INYPOS : +function : integer;

    + { function INYPOS returns the y coordinate of the current position }

    +

    to ToC + + +

    unit PUSHXY : +procedure;

    +{ pushes current position, color & style onto the stack.

    + The stack is kept internally, max depth is 16

    +} +

    +

    to ToC + +

    unit POPXY : +procedure;

    + +{ restores position, color & style from internal stack }

    + +{ Example

    +

    unit  DIAGONAL : procedure;
    +    var ix, iy : integer;
    +begin
    +	call PUSHXY;
    +	ix := INXPOS;
    +	iy := INYPOS;
    +	call DRAW(ix+10, iy+10);
    +	call POPXY
    +end DIAGONAL;
    +
    } +

    +

    to ToC + + +

    { PROCEDURES SERVING POINTS & +LINES}

    + +

    unit POINT : +procedure(x,y: integer);

    +{ moves current position to pixel (x,y) and sets it to the current color +

    + }

    to ToC + +

    +

    unit INPIX : function +(x,y : integer) : integer;

    + {

    + moves to pixel (x,y) and returns its color setting;

    + } +

    to ToC +

    + +

    unit DRAW : +procedure( x,y : integer);

    + {

    + draws a line from current screen position to (x,y);

    + sets current position to (x,y);

    + line is drawn in current color, with both terminal pixels

    + always turned white ( non-background) for non-black

    + ( non-background ) line color.

    + } +

    to ToC +

    +

    unit intens : +procedure(Size :integer; +xCoord,yCoord:arrayof integer, Colour,Filled +:integer);

    + +/* draw a polygon*/ +{ draw a simple, closed polygon of Size points, the edges of the polygon go from +(xCoord[i], yCoord[i]) to (xCoord[i+1], yCoord[i+1]) for i = 1, ..., Size-1 +The colour used will be Colour. The polygon will be filled iff Filled< +> 0. +}

    +

    to ToC +

    +

    unit CIRB : procedure (xi, yi, rx,ry : integer, alfa, beta : real, +cbord, fill : integer);

    + + + { +

    draws a circle (or ellipse, depending on aspect value, see below),

    + optionally filling its interior;

    + does not preserve position;

    + (xi,yi) - are center coordinates,

    + rx - radius in pixels (horizontally),
    + ry - radius in pixels (perpendicularly),

    + alfa, beta - starting & ending angles; if alfa=beta a full

    + circle is drawn; values should be given in radians;

    + cbord - border color,

    + fill - if fill < > 0, interior is filled in current style& color

    + } +

    to ToC +

    +

    unit hfill : +procedure( x : integer);

    + { draw an horizontal line between the current position and

    + (x,currentY) with the current color, after it change the current

    + position to (x, currentY)

    + }

    +

    to ToC + +

    unit vfill : +procedure( y : integer);

    + { draw a vertical line between the current position and

    + (currentX,y) with the current color, after it change the current

    + position to (currentX,y)

    + }

    +

    to ToC + +

    unit patern : +procedure( x1,y1,x2,y2,c,b : +integer);

    + { draw a rectangle between the points (x1,y1) and +(x2,y2) with the

    + color c (the current color is not change). if b=0 then the box +is

    + empty else it is filled.

    + }

    +

    to ToC + +

    { Procedures operating on bitmaps }

    + +

    unit GETMAP : +function (x,y : integer) : arrayof +integer;

    + {saves rectangular area between current position as

    + top left corner and (ix,iy) as bottom right corner,

    + including border lines;

    + position remains unchanged.

    + array of integer should have

    + 4+(rows**columns/8* *coeff)

    + bytes. The coefficient coeff is 1 for Hercules, 2 for CGA, 4 for EGA

    + card.

    + ATTENTION: in DOS 286 environment a bigger size of the array may + necessitate the use of loglan with the option H+, see also +memavail

    + }

    +

    to ToC + +

    unit PUTMAP : +procedure ( a: arrayof +integer);

    + {sets rectangular area of screen pixels to that saved

    + by "getmap" in "iarray";

    + same size is restored, with top left corner in current

    + position;

    + position remains unchanged.

    + } +

    to ToC +

    +

    unit ORMAP : +procedure ( a : arrayof +integer);

    + {same as putmap, but saved bitmap is or'ed into screen

    + rather than just set.

    + } +

    to ToC +

    +

    unit XORMAP : procedure ( a: +arrayof integer);

    + {same as putmap, but saved bitmap is xor'ed into screen

    + rather than just set.

    + } +

    to ToC +

    + +

    {Procedures operating on characters and strings}

    + +

    unit outstring : +procedure(x,y: integer, s: string, back_col, +front_col: integer);

    + { x, y are the coordinates where to put the string,

    + s is the string to be shown, in front_col colour letters on the +back_col colour background

    + }

    +

    to ToC + +

    unit track +: procedure( x,y,c,valeur : integer); +

    + { write an integer value valeur at the position (x,y) with the +color c. + It does not change the current position nor the current color

    + }

    +

    to ToC + +

    unit inkey + : function : integer;

    + + { returns next character from keyboard buffer;

    + 0 is returned if buffer is empty;

    + special keys are returned as negative numbers;

    + ALT-NUM method may be used for entering character codes

    + above 127 (this makes entering special keys 128-132

    + impossible);

    + if a character is returned, it is also removed

    + from the buffer, so MS-DOS will not see it (CTRL-C!);

    + typeahead is allowed, echo is suppressed.

    + }

    +

    to ToC + +

    unit HASCII : procedure(c: +integer);

    + {'xor's the character = chr(c) in a 8*8 box with top left corner

    + in the current position;

    + moves current position by (8,0);

    + call hascii(0)- sets complete box to black ( =background ),

    + with no change in position.

    +} +

    to ToC +

    + + +

    unit hfont +: function( +x,y,lg,min,max,default,col_f,col_e,col_c : integer): + integer;

    + + { arrange a small 1 line window for reading an integer value +from this window, +the position of the window corner is (x, y), +the length of the window is lg characters, +the value v should be greater than min and smaller than max, +the default value read is default,

    +the colour of the window is col_f,
    +the colour of the digits is col_e,
    +the colour of cursor is col_c

    + + reads in graphic mode an integer in the window which begins at the (x,y) + position, window is lg caracteres long. the maximum length of the

    + integer that is read is 10. there is a default value, a minimum value + and a maximum value. the window is drawn with the col_f color, the + cursor is in the col_c color and the integer is writing in the col_e

    + color. you can use 0..9,+,-,backspace,escape and return keys. }

    +

    to ToC + +

    unit hfont8 +: function( +x,y,lg,maxlg: integer,default: arrayof char, +col_f,col_e,col_c : integer): arrayof char;

    + + { arrange a small 1 line window for reading an array of characters (text) +from this window, +the position of the window corner is (x, y), +the length of the window is lg characters, +the text should not be longer than maxlg characters, +the default text shown is default,

    +the colour of the window is col_f,
    +the colour of the digits is col_e,
    +the colour of cursor is col_c

    + + reads in graphic mode a text (i.e. an array of characters) + in the window which begins at the (x,y) + position, window is lg caracteres long. the maximum length of the + text that is read is maxlg. there is a default text shown, + the window is drawn with the col_f color, the + cursor is in the col_c color and the integer is writing in the col_e

    + color.

    You can use 0..9,+,-,backspace,escape and return keys. }

    +

    to ToC + + +

    unit HPAGE : procedure(x,y,long: +integer, A: arrayof char, back, front: integer);

    + { this procedure arranges a 1-line high window in position x,y of +length long in which a portion of text A is shown in colour +front on the background colour back.

    + Making use of keys controlling the cursor {left, right, PgUp, PgDn}

    + the user can scroll the text (horizontally) in the window. Pressing the + Enter key terminates the procedure}

    +

    to ToC + +

    end IIUWGRAPH;

    + + + +


    +

    unit MOUSE : +class;

    +

    +You can safely skip the following french text if you can not read french.
    +It is put here for the convenience of my french students.
    +
    + +


    +
    { init -lors de l'initialisation de la souris, on peut définir les événements qui vont faire réagir la +fonction getpress; le premier et le deuxième paramètre représentent respectivement la souris et le clavier, si une +valeur non nulle est donnée comme paramètre alors getpress réagira à l'événement.

    + + Une paire (1,1) va permettre de prendre en compte à la fois les événements de la souris et ceux du clavier; +une paire (1,0) quand à elle ne prendra en compte que la souris. Pour une plus grande souplesse d'utilisation, il est +possible lors du programme, après l'initalisation, de changer cette prise en compte, cela se fera par l'appel de la +procedure getmovement, procédure ayant les mêmes paramètres (avec le même ordre) que la fonction +init.

    + + Pour detecter les événements, on utilisa la fonction getpress, qui retourne un booléen indiquant la +présence ou l'absence d'événement (respectivement les valeurs true et false). Il est bon de noter qu'ainsi définie la +fonction getpress n'est pas bloquante. Les paramètres en retour sont soit nuls (pas d'événement) soit +correspondent:

    + + bool:=getpress(v,p,h,l,r,c : integer);

    + v = position en y de la souris

    + p = keyboard status (Touche control_left,control_right, alt, alt_gr, shift_left, shift_right)

    + h = position en x de la souris

    + l = touche clavier

    + r = flags

    + c = boutons de la souris (0=aucun, 1=gauche, 2=droite, 3=gauche et droite)

    + Nb: le bouton central n'est pas géré.

    + +NOTEZ BIEN! Lorsque les événements du clavier sont pris en compte dans +le gestionnaire, il ne faut +pas utiliser les fonctions d'entrées clavier readl, readln, hfont, hfont8, hpage, inkey,...) sous peine de +plantage de l'ordinateur.

    +}

    +
    +

    +

    unit init +: procedure(checkMouse, +checkKeyboard: integer);

    + { initializes the Mouse driver.

    + tells which events will be checked:

    + if checkMouse < > 0 then the events of Mouse will be +reported to getpress, otherwise +ignored;

    + if checkKeyboard < > 0 then the events of Keyboard will be +reported to getpress, otherwise ignored

    + Attention please! While the events of +the keyboard are taken under control by +init or getmovement

    + do not use the functions or procedures: read, + readln, hfont, hfont8, hpage, inkey +that read keys

    + YOU RISK TO HANG YOUR SYSTEM!

    + }

    + end init

    +

    to ToC + +

    unit getmovement : +procedure(checkMouse, checkKeyboard: +integer);

    + tells which events will be checked:

    + if checkMouse < > 0 then the events of Mouse will be +reported to getpress, otherwise +ignored;

    + if checkKeyboard < > 0 then the events of Keyboard will be +reported to getpress, otherwise ignored

    + Attention please! While the events of the +keyboard are taken under control by +init or getmovement

    + do not use the functions or procedures: read, + readln, hfont, hfont8, hpage, inkey +that read keys

    + YOU RISK TO HANG YOUR SYSTEM!

    + end getmovement;

    +

    to ToC + +

    unit getpress : +function(v,p,h,l,r,c : integer): +Boolean;

    + { v = y coordinate of the cursor,

    + h = x coordinate of the cursor,

    + p = keybord status control_left,control_right, alt, alt_gr, shift_left, shift_right

    + l = code of key pressed

    + r = flags

    + c = buttons pressed (0=none, 1=left, 2=right, 3=both)

    + Nb: the middle button is not taken into account.

    + end getpress

    +

    to ToC + + +

    unit showcursor : +procedure;

    + {the cursor becomes visible and follows the movements of the mouse}

    + end showcursor;

    +

    to ToC + +

    unit hidecursor : +procedure;

    + {the cursor becomes invisible}

    + end hidecursor;

    +

    to ToC
    + +

    end MOUSE;

    + +


    + +

    Enclosed you find a sample program .

    +
    +Program SystemeGraph; 
    +       (* by Frederic Pataud, October 1994 *) 
    +Begin 
    +Pref iiuwgraph block     (* inherit the graphic functions *) 
    + Begin 
    + Pref mouse block	(* inherit the mouse functions *) 
    +
    +
    +(*********************************************************************) 
    +(*                   P r o g r a m  m e   P r i n c i p a l                  *) 
    +(*********************************************************************) 
    +     var v,p,h,i : integer, 
    +       l,r,c : integer, 
    +       rep : arrayof char, 
    +       d : boolean, 
    +       xx,yy : arrayof integer, 
    +       status,code,x,y,flags,button : integer; 
    +    
    +   Begin 
    +      
    +     call gron(0);            (* enter the graphic mode *) 
    +     call init(1,0);            (* initialize the mouse, disregard the keyboard events, check for mouse events *) 
    +      
    +     call showcursor;		(* show cursor *) 
    +     call patern(5,5,635,475,2,0);         (* make a frame around the screen *) 
    +     call outstring(10,10,"x=",2,0); 
    +     call outstring(100,10,"y=",2,0); 
    +     call outstring(10,30,"status = ",2,0); 
    +     call outstring(10,50,"code   = ",2,0); 
    +     call outstring(10,70,"flags  = ",2,0); 
    +     call outstring(10,90,"button = ",2,0); 
    +     call patern(100,210,300,320,3,1);         (* make a rectangle filled in colour 3 *) 
    +
    +     array xx dim (1:6); 
    +     array yy dim (1:6); 
    +     xx(1):=410; yy(1):=10; 
    +     xx(2):=450; yy(2):=30; 
    +     xx(3):=460; yy(3):=50; 
    +     xx(4):=430; yy(4):=80; 
    +     xx(5):=420; yy(5):=40; 
    +     xx(6):=480; yy(6):=30; 
    +     call intens(6,xx,yy,8,1); 		(* show a polygon filled*) 
    +     for i:=1 to 6 
    +      do 
    +       yy(i):=yy(i)+100; 
    +      od; 
    +     call intens(6,xx,yy,15,0);		(* show another polygon empty *) 
    +      
    +     call cirb(500,300,50,40,100,3500,10,0);	(* draw an empty pie or camembert *) 
    +     call cirb(400,400,40,40,600,4000,11,1);     (* draw a filled pie *) 
    +
    +
    +     i:=hfont(100,350,6,-9999999,9999999,500,9,0,15);      (* read integer from a window *) 
    +     call hpage(100,400,10,unpack("Il fait beau dans ma verte campagne"),9,0);   (* show text *) 
    +     rep:=hfont8(100,430,10,80,unpack("tototutu"),9,0,15);		(* read text *) 
    +      
    +     call getmovement(1,1);           (* take into consideration both key events and mouse events *) 
    +      
    +     do 
    +      d:=getpress(v,p,h,l,r,c);		(* ask about an event *) 
    +      if (d) 
    +      then call outstring(10,400,"Event",2,0); 
    +           call patern(80,25,130,100,0,1); 
    +           call track(40,10,v,0,4);		(* print integer *) 
    +           call track(140,10,p,0,4); 
    +           call track(80,30,h,0,4); 
    +           call track(80,50,l,0,4); 
    +           call track(80,70,r,0,4); 
    +           call track(80,90,c,0,4); 
    +           if((h=164 and l=27) or (c=3))                 (* exit if either two buttons were pressed c=3 or Ctrl+Esc key *) 
    +           then exit; 
    +           fi; 
    +      fi; 
    +     od; 
    +     call groff;				(* leave the graphic mode and return to the text mode *) 
    +     writeln("i=",i); 
    +     for i:=lower(rep) to upper(rep) 
    +     do 
    +       write(rep(i)); 
    +     od; 
    +     writeln; 
    +   End 
    + End 
    +End. 
    +
    +

    to ToC +

    +


    +
    GMyAS Last update Sun 7 May +1995
    + + + diff --git a/HTML/iuwgraf4.htm b/HTML/iuwgraf4.htm new file mode 100644 index 0000000..5c332d7 --- /dev/null +++ b/HTML/iuwgraf4.htm @@ -0,0 +1,750 @@ + +iiuwgraph + + +

    unit IIUWGRAPH: class;

    +

    LOGLAN's LOGOa predefined Loglan'82 class

    + +{ this predefined class enables basic graphic operations + for DOS machines based on 486 or 386 processors +}

    + +{this document gives the specification of new version of IIUWGRAPH + class
    + made in October 1994 by Frederic Pataud à Pau}

    +


    +Table of Contents.
    + + +
  • {IIUWGRAPH class} +
      +
    • {PROCEDURES of OVERALL CONTROL} +
        +
      • unit GRON : procedure (i: integer); +
      • unit GROFF : procedure; +
      • unit CLS : procedure; +
      • unit COLOR : procedure(co : integer); +
      • unit STYLE : procedure(styl : integer); +
      • unit BORDER : procedure (background_Colour: integer); +
      • unit PALLET : procedure (nr : integer); +
      +
    • { PROCEDURES CONTROLLING POSITION } +
        +
      • unit MOVE : procedure (x,y :integer); +
      • unit INXPOS : function: integer; +
      • unit INYPOS : function : integer; +
      • unit PUSHXY : procedure; +
      • unit POPXY: procedure; +
      +
    • { PROCEDURES SERVING POINTS and LINES} +
        +
      • unit POINT : procedure(x,y: integer); +
      • unit INPIX : function (x,y : integer) : integer; +
      • unit DRAW : procedure( x,y : integer); +
      • unit intens: procedure(Size :integer; xCoord,yCoord:arrayof integer, +Colour,Filled :integer); +
      • unit cirb {draw a circle} procedure; +
      • unit hfill: procedure( x : integer); +
      • unit vfill: procedure( y : integer); +
      • unit patern: procedure( x1,y1,x2,y2,c,b : integer); +
      +
    • { Procedures operating on bitmaps } +
        +
      • unit GETMAP : function (x,y : integer) : arrayof integer; +
      • unit PUTMAP : procedure ( a: arrayof integer); +
      • unit ORMAP : procedure ( a : arrayof integer); +
      • unit XORMAP : procedure ( a: arrayof integer); +
      +
    • {Procedures operating on characters and strings} +
        +
      • unit outstring: procedure(x,y: integer, s: string, back_col, front_col: + integer); +
      • unit track: procedure( x,y,c,valeur : integer); +
      • unit inkey : function : integer; +
      • unit HASCII : procedure(c: integer); +
      • unit hfont: function( x,y,lg,min,max,default,col_f,col_e,col_c : integer): + integer; +
      • unit HPAGE : procedure(x,y,long: integer, A: arrayof char, back, front: + integer); +
      +
    + +
  • unit MOUSE: class; +
      +
    • unit init: procedure(checkMouse, checkKeyboard: integer); +
    • unit getmovement: procedure(checkMouse, checkKeyboard: + integer); +
    • unit getpress: function(v,p,h,l,r,c : integer): Boolean; +
    • unit showcursor: procedure; +
    • unit hidecursor: procedure; +
    +
  • a sample program +
  • + +
    + + + +{ the early versions of library IIUWGRAPH have been elaborated by + Piotr Carlsson, Miroslawa Milkowska, Janina Jankowska, + Michal Jankowski at Institute of Informatics, + University of Warsaw 1987,

    + and added to Loglan system by Danuta Szczepanska 1987,

    + + the recent versions were done at LITA, Pau,

    + by

    + Pawel Susicki (1991) for Unix,

    + Sebastien Bernard (1992) for ATARI, see a separate document,
    + Eric Becourt et Jerôme Larrieu (1993) for Unix and Xwindows, see a + separate document on Xiiuwgraf , +

    + +

    +fait à Pau, le 15 Novembre 1994, par Andrzej Salwicki, LITA}

    + +{ the predefined class IIUWGRAPH is included in all versions of interpreter of +Loglan, with the exception of the present version of interpreter for +VAX/VMS.}

    +


    +

    +

    +unit IIUWGRAPH: class;
    +   hidden   MaxX, MaxY,  current_X, current_Y, is_graphic_On,       
    +              current_Colour, current_Background_Colour,  current_Style, 
    +              current_Palette,  current_Pattern ; 
    +
    +
    +                
    +   const  MaxX =            
    +          MaxY =            
    +
    +{    the screen's coordinates are 
    +        
    +       (0,0)   ---------------------->   (MaxX,0) 
    +           ¦ 
    +           ¦ 
    +           ¦ 
    +          V 
    +       (0, MaxY)                            (MaxX,MaxY) 
    +
    +}
    + 
    +
    +   var  currentDriver : integer,                     { see NOCARD below }  
    +          current_X, current_Y:  integer         { it is the current position } 
    +          is_graphic_On:  Boolean,	   { evidently tells whether we are in 			
    +	   		graphics mode } 
    +          current_Colour : integer,		{ } 
    +          current_Background_Colour : integer, 
    +          current_Style : integer,		{ } 
    +          current_Palette : integer, 
    +          current_Pattern  
    +
    + +

    unit GRON procedure +(i: integer);

    + { procedure sets the monitor in graphic mode and clears the buffer + of screen. The parameter determines the resolution and the number of + colours.
    +The user should assure that the resolution chosen should correspond to that +which is set by means of command
    +SET go32 drivers {path}< driver.file> < width> < height> < +noColours> +eg.
    +set go32 drivers c:\loglan\svga\drivers\vesa.grn gw 1024 gh 480 nc 256
    +

    An execution of instruction call gron(i) must precede + any of the graphic commands described below.

    +

    +case (i)
    +  {
    +  0 : 640x480x16
    +  1 : 640x480x256
    +  2 : 800x600x16
    +  3 : 800x600x256
    +  4 : 1024x768x16
    +  5 : 1024x768x256
    +  6 : 1280x1024x16
    +  7 : 1280x1024x256
    +  8 : 1600x1280x16
    +  9 : 1600x1280x256
    + }
    +
    } +

    to ToC + +

    unit GROFF procedure;

    + { the procedure sets the monitor in the text mode filling it with + spaces.

    + DO NOT FORGET to set the monitor in the text mode before +you terminate your program

    + }

    +

    to ToC + + +

    unit CLS . +: procedure;

    + { the screen will be cleared and filled with colour 0 }

    +

    to ToC + + + +{ PROCEDURES CONTROLLING THE COLOURS }

    + +

    unit COLOR . : + procedure(co : integer);

    +{ sets current color to co
    + for monochrome displays, 0 means black, non-0 - white
    + for color displays, 0 means background
    + see PALLET

    +}

    +

    to ToC + +

    unit STYLE : + procedure(styl : integer);

    +{ sets style of lines and fill shades to a combination

    + of current color and background color (for mono -

    + white and black, respectively) according to 5 predefined

    + patterns:

    +

    +		0	....
    +		1	****
    +		2	***.
    +		3	**..
    +		4	*.*.
    +		5	*...
    +
    + where '*' means current color, '.' background colour

    +When drawing the segments the subsequent pixels will have colour determined +by cyclic application of style pattern. The first and the last pixels of a segment +will have always current colour.

    +When filling contours the given style will be applied to horizontal lines with even +coordinate. The style for odd lines is determined automatically.

    +The same applies for perpendicular lines.

    +} +

    +

    to ToC + +

    unit BORDER . : +procedure (background_Colour: +integer);

    + +

    { sets actual background color to i ( i = 0,1,...,15 ) }

    + +

    to ToC + +

    unit PALLET : +procedure (nr : integer);

    + {the following line makes an example, it is not valid for, say, +256 colours +

    +the codes of colors are usually i.e. when you have 16 colours, as follows

    + 0 black

    + 1 blue dark

    + 2 green dark

    + 3 turquoise dark

    + 4 red dark

    + 5 violet

    + 6 brown

    + 7 grey light

    + 8 grey dark

    + 9 blue

    + 10 green

    + 11 turquoise

    + 12 red light

    + 13 rose

    + 14 yellow

    + 15 white

    + +

    }

    +

    to ToC + + + +

    { PROCEDURES CONTROLLING POSITION }

    + +

    unit MOVE : +procedure (x,y :integer);

    + { procedure MOVE sets the current position on the screen on the pixel + with coordinates

    + x - column,

    + y - line }

    + { precondition of MOVE:

    + 0*x*MaxX & 0*y*MaxY

    + }

    +

    to ToC + +

    unit INXPOS : +function: integer;

    + { function INXPOS returns the x coordinate of the current position }

    +

    to ToC + + +

    unit INYPOS : +function : integer;

    + { function INYPOS returns the y coordinate of the current position }

    +

    to ToC + + +

    unit PUSHXY : +procedure;

    +{ pushes current position, color & style onto the stack.

    + The stack is kept internally, max depth is 16

    +} +

    +

    to ToC + +

    unit POPXY : +procedure;

    + +{ restores position, color & style from internal stack }

    + +{ Example

    +

    unit  DIAGONAL : procedure;

    + var ix, iy : integer;

    +begin

    + call PUSHXY;

    + ix := INXPOS;

    + iy := INYPOS;

    + call DRAW(ix+10, iy+10);

    + call POPXY

    +end DIAGONAL;

    +

    } +

    +

    to ToC + + +

    { PROCEDURES SERVING POINTS & +LINES}

    + +

    unit POINT : +procedure(x,y: integer);

    +{ moves current position to pixel (x,y) and sets it to the current color +

    + }

    to ToC + +

    +

    unit INPIX : function +(x,y : integer) : integer;

    + {

    + moves to pixel (x,y) and returns its color setting;

    + } +

    to ToC +

    + +

    unit DRAW : +procedure( x,y : integer);

    + {

    + draws a line from current screen position to (x,y);

    + sets current position to (x,y);

    + line is drawn in current color, with both terminal pixels

    + always turned white ( non-background) for non-black

    + ( non-background ) line color.

    + } +

    to ToC +

    +

    unit intens : +procedure(Size :integer; +xCoord,yCoord:arrayof integer, Colour,Filled +:integer);

    + +/* draw a polygon*/ +{ draw a simple, closed polygon of Size points, the edges of the polygon go from +(xCoord[i], yCoord[i]) to (xCoord[i+1], yCoord[i+1]) for i = 1, ..., Size-1 +The colour used will be Colour. The polygon will be filled iff Filled< +> 0. +}

    +

    to ToC +

    +

    unit CIRB : procedure (xi, yi, rx,ry : integer, alfa, beta : real, +cbord, fill : integer);

    + + + { +

    draws a circle (or ellipse, depending on aspect value, see below),

    + optionally filling its interior;

    + does not preserve position;

    + (xi,yi) - are center coordinates,

    + rx - radius in pixels (horizontally),
    + ry - radius in pixels (perpendicularly),

    + alfa, beta - starting & ending angles; if alfa=beta a full

    + circle is drawn; values should be given in radians;

    + cbord - border color,

    + fill - if fill < > 0, interior is filled in current style& color

    + } +

    to ToC +

    +

    unit hfill : +procedure( x : integer);

    + { draw an horizontal line between the current position and

    + (x,currentY) with the current color, after it change the current

    + position to (x, currentY)

    + }

    +

    to ToC + +

    unit vfill : +procedure( y : integer);

    + { draw a vertical line between the current position and

    + (currentX,y) with the current color, after it change the current

    + position to (currentX,y)

    + }

    +

    to ToC + +

    unit patern : +procedure( x1,y1,x2,y2,c,b : +integer);

    + { draw a rectangle between the points (x1,y1) and +(x2,y2) with the

    + color c (the current color is not change). if b=0 then the box +is

    + empty else it is filled.

    + }

    +

    to ToC + +

    { Procedures operating on bitmaps }

    + +

    unit GETMAP : +function (x,y : integer) : arrayof +integer;

    + {saves rectangular area between current position as

    + top left corner and (ix,iy) as bottom right corner,

    + including border lines;

    + position remains unchanged.

    + array of integer should have

    + 4+(rows**columns/8* *coeff)

    + bytes. The coefficient coeff is 1 for Hercules, 2 for CGA, 4 for EGA

    + card.

    + ATTENTION: in DOS 286 environment a bigger size of the array may + necessitate the use of loglan with the option H+, see also +memavail

    + }

    +

    to ToC + +

    unit PUTMAP : +procedure ( a: arrayof +integer);

    + {sets rectangular area of screen pixels to that saved

    + by "getmap" in "iarray";

    + same size is restored, with top left corner in current

    + position;

    + position remains unchanged.

    + } +

    to ToC +

    +

    unit ORMAP : +procedure ( a : arrayof +integer);

    + {same as putmap, but saved bitmap is or'ed into screen

    + rather than just set.

    + } +

    to ToC +

    +

    unit XORMAP : +procedure ( a: +arrayof integer);

    + {same as putmap, but saved bitmap is xor'ed into screen

    + rather than just set.

    + } +

    to ToC +

    + +

    {Procedures operating on characters and strings}

    + +

    unit outstring : +procedure(x,y: integer, s: string, back_col, +front_col: integer);

    + { x, y are the coordinates where to put the string,

    + s is the string to be shown, in front_col colour letters on the +back_col colour background

    + }

    +

    to ToC + +

    unit track +: procedure( x,y,c,valeur : integer); +

    + { write an integer value valeur at the position (x,y) with the +color c. + It does not change the current position nor the current color

    + }

    +

    to ToC + +

    unit inkey + : function : integer;

    + + { returns next character from keyboard buffer;

    + 0 is returned if buffer is empty;

    + special keys are returned as negative numbers;

    + ALT-NUM method may be used for entering character codes

    + above 127 (this makes entering special keys 128-132

    + impossible);

    + if a character is returned, it is also removed

    + from the buffer, so MS-DOS will not see it (CTRL-C!);

    + typeahead is allowed, echo is suppressed.

    + }

    +

    to ToC + +

    unit HASCII : procedure(c: +integer);

    + {'xor's the character = chr(c) in a 8*8 box with top left corner

    + in the current position;

    + moves current position by (8,0);

    + call hascii(0)- sets complete box to black ( =background ),

    + with no change in position.

    +} +

    to ToC +

    + + +

    unit hfont +: function( +x,y,lg,min,max,default,col_f,col_e,col_c : integer): + integer;

    + + { arrange a small 1 line window for reading an integer value +from this window, +the position of the window corner is (x, y), +the length of the window is lg characters, +the value v should be greater than min and smaller than max, +the default value read is default,

    +the colour of the window is col_f,
    +the colour of the digits is col_e,
    +the colour of cursor is col_c

    + + reads in graphic mode an integer in the window which begins at the (x,y) + position, window is lg caracteres long. the maximum length of the

    + integer that is read is 10. there is a default value, a minimum value + and a maximum value. the window is drawn with the col_f color, the + cursor is in the col_c color and the integer is writing in the col_e

    + color. you can use 0..9,+,-,backspace,escape and return keys. }

    +

    to ToC + + +

    unit HPAGE : procedure(x,y,long: +integer, A: arrayof char, back, front: integer);

    + { this procedure arranges a 1-line high window in position x,y of +length long in which a portion of text A is shown in colour +front on the background colour back.

    + Making use of keys controlling the cursor {left, right, PgUp, PgDn}

    + the user can scroll the text (horizontally) in the window. Pressing the + Enter key terminates the procedure}

    +

    to ToC + +

    end IIUWGRAPH;

    + + + +


    +

    unit MOUSE .: +class;

    +


    +
    { init -lors de l'initialisation de la souris, on peut définir les événements qui vont faire réagir la +fonction getpress; le premier et le deuxième paramètre représentent respectivement la souris et le clavier, si une +valeur non nulle est donnée comme paramètre alors getpress réagira à l'événement.

    + + Une paire (1,1) va permettre de prendre en compte à la fois les événements de la souris et ceux du clavier; +une paire (1,0) quand à elle ne prendra en compte que la souris. Pour une plus grande souplesse d'utilisation, il est +possible lors du programme, après l'initalisation, de changer cette prise en compte, cela se fera par l'appel de la +procedure getmovement, procédure ayant les mêmes paramètres (avec le même ordre) que la fonction +init.

    + + Pour detecter les événements, on utilisa la fonction getpress, qui retourne un booléen indiquant la +présence ou l'absence d'événement (respectivement les valeurs true et false). Il est bon de noter qu'ainsi définie la +fonction getpress n'est pas bloquante. Les paramètres en retour sont soit nuls (pas d'événement) soit +correspondent:

    + + bool:=getpress(v,p,h,l,r,c : integer);

    + v = position en y de la souris

    + p = keyboard status (Touche control_left,control_right, alt, alt_gr, shift_left, shift_right)

    + h = position en x de la souris

    + l = touche clavier

    + r = flags

    + c = boutons de la souris (0=aucun, 1=gauche, 2=droite, 3=gauche et droite)

    + Nb: le bouton central n'est pas géré.

    + +NOTEZ BIEN! Lorsque les événements du clavier sont pris en compte dans le gestionnaire, il ne faut +pas utiliser les fonctions d'entrées clavier readl, readln, hfont, hfont8, hpage, inkey,...) sous peine de +plantage de l'ordinateur.

    +}

    +
    +

    +

    unit init +: procedure(checkMouse, +checkKeyboard: integer);

    + { initializes the Mouse driver.

    + tells which events will be checked:

    + if checkMouse < > 0 then the events of Mouse will be reported to getpress, see below otherwise +ignored;

    + if checkKeyboard < > 0 then the events of Keyboard will be reported to getpress, otherwise ignored

    + Attention please! While the events of the keyboard are taken under control by +init or getmovement

    + do not use the functions or procedures: read, readln, hfont, hfont8, hpage, inkey +that read keys

    + YOU RISK TO HANG YOUR SYSTEM!

    + }

    + end init

    +

    to ToC + +

    unit getmovement : +procedure(checkMouse, checkKeyboard: +integer);

    + tells which events will be checked:

    + if checkMouse < > 0 then the events of Mouse will be reported to getpress, see below otherwise +ignored;

    + if checkKeyboard < > 0 then the events of Keyboard will be reported to getpress, otherwise ignored

    + Attention please! While the events of the keyboard are taken under control by +init or getmovement

    + do not use the functions or procedures: read, readln, hfont, hfont8, hpage, inkey +that read keys

    + YOU RISK TO HANG YOUR SYSTEM!

    + end getmovement;

    +

    to ToC + +

    unit getpress : +function(v,p,h,l,r,c : integer): +Boolean;

    + { v = y coordinate of the cursor,

    + h = x coordinate of the cursor,

    + p = keybord status control_left,control_right, alt, alt_gr, shift_left, shift_right

    + l = code of key pressed

    + r = flags

    + c = buttons pressed (0=aucun, 1=gauche, 2=droite, 3=gauche et droite)

    + Nb: the middle button is not taken into account.

    + end getpress

    +

    to ToC + + +

    unit showcursor : +procedure;

    + {the cursor becomes visible and follows the movements of the mouse}

    + end showcursor;

    +

    to ToC + +

    unit hidecursor : +procedure;

    + {the cursor becomes invisible}

    + end hidecursor;

    +

    to ToC
    + +

    end MOUSE;

    + +


    + +

    Enclosed you find a sample program .

    +
    +Program SystemeGraph; 
    +       (* by Frederic Pataud, October 1994 *) 
    +Begin 
    +Pref iiuwgraph block     (* inherit the graphic functions *) 
    + Begin 
    + Pref mouse block	(* inherit the mouse functions *) 
    +
    +
    +(*********************************************************************) 
    +(*                   P r o g r a m  m e   P r i n c i p a l                  *) 
    +(*********************************************************************) 
    +     var v,p,h,i : integer, 
    +       l,r,c : integer, 
    +       rep : arrayof char, 
    +       d : boolean, 
    +       xx,yy : arrayof integer, 
    +       status,code,x,y,flags,button : integer; 
    +    
    +   Begin 
    +      
    +     call gron(0);            (* enter the graphic mode *) 
    +     call init(1,0);            (* initialize the mouse, disregard the keyboard events, check for mouse events *) 
    +      
    +     call showcursor;		(* show cursor *) 
    +     call patern(5,5,635,475,2,0);         (* make a frame around the screen *) 
    +     call outstring(10,10,"x=",2,0); 
    +     call outstring(100,10,"y=",2,0); 
    +     call outstring(10,30,"status = ",2,0); 
    +     call outstring(10,50,"code   = ",2,0); 
    +     call outstring(10,70,"flags  = ",2,0); 
    +     call outstring(10,90,"button = ",2,0); 
    +     call patern(100,210,300,320,3,1);         (* make a rectangle filled in colour 3 *) 
    +
    +     array xx dim (1:6); 
    +     array yy dim (1:6); 
    +     xx(1):=410; yy(1):=10; 
    +     xx(2):=450; yy(2):=30; 
    +     xx(3):=460; yy(3):=50; 
    +     xx(4):=430; yy(4):=80; 
    +     xx(5):=420; yy(5):=40; 
    +     xx(6):=480; yy(6):=30; 
    +     call intens(6,xx,yy,8,1); 		(* show a polygon filled*) 
    +     for i:=1 to 6 
    +      do 
    +       yy(i):=yy(i)+100; 
    +      od; 
    +     call intens(6,xx,yy,15,0);		(* show another polygon empty *) 
    +      
    +     call cirb(500,300,50,40,100,3500,10,0);	(* draw an empty pie or camembert *) 
    +     call cirb(400,400,40,40,600,4000,11,1);     (* draw a filled pie *) 
    +
    +
    +     i:=hfont(100,350,6,-9999999,9999999,500,9,0,15);      (* read integer from a window *) 
    +     call hpage(100,400,10,unpack("Il fait beau dans ma verte campagne"),9,0);   (* show text *) 
    +     rep:=hfont8(100,430,10,80,unpack("tototutu"),9,0,15);		(* read text *) 
    +      
    +     call getmovement(1,1);           (* take into consideration both key events and mouse events *) 
    +      
    +     do 
    +      d:=getpress(v,p,h,l,r,c);		(* ask about an event *) 
    +      if (d) 
    +      then call outstring(10,400,"Event",2,0); 
    +           call patern(80,25,130,100,0,1); 
    +           call track(40,10,v,0,4);		(* print integer *) 
    +           call track(140,10,p,0,4); 
    +           call track(80,30,h,0,4); 
    +           call track(80,50,l,0,4); 
    +           call track(80,70,r,0,4); 
    +           call track(80,90,c,0,4); 
    +           if((h=164 and l=27) or (c=3))                 (* exit if either two buttons were pressed c=3 or Ctrl+Esc key *) 
    +           then exit; 
    +           fi; 
    +      fi; 
    +     od; 
    +     call groff;				(* leave the graphic mode and return to the text mode *) 
    +     writeln("i=",i); 
    +     for i:=lower(rep) to upper(rep) 
    +     do 
    +       write(rep(i)); 
    +     od; 
    +     writeln; 
    +   End 
    + End 
    +End. 
    +
    +

    to ToC +

    +


    +
    GMyAS Last update Sun 7 May +1995
    + + + diff --git a/HTML/iuwgraf5.htm b/HTML/iuwgraf5.htm new file mode 100644 index 0000000..aefad61 --- /dev/null +++ b/HTML/iuwgraf5.htm @@ -0,0 +1,735 @@ + +iiuwgraph +

    unit IIUWGRAPH: class;

    +

    a predefined Loglan'82 class LOGLAN

    + +{ this predefined class enables basic graphic operations + for DOS machines based on 486 or 386 processors +}

    + +{this document gives the specification of new version of IIUWGRAPH + class
    + made in October 1994 by Frederic Pataud à Pau}

    +


    +Table of Contents.
    + + +
      +
    • unit GRON : procedure (i: integer); +
    • unit GROFF : procedure; +
    • unit CLS : procedure; +
    • unit COLOR : procedure(co : integer); +
    • unit STYLE : procedure(styl : integer); +
    • unit BORDER : procedure (background_Colour: integer); +
    • unit PALLET : procedure (nr : integer); +
    • { PROCEDURES CONTROLLING POSITION } +
    • unit MOVE : procedure (x,y :integer); +
    • unit INXPOS : function: integer; +
    • unit INYPOS : function : integer; +
    • unit PUSHXY : procedure; +
    • unit POPXY: procedure; +
    • { PROCEDURES SERVING POINTS LINES} +
    • unit POINT : procedure(x,y: integer); +
    • unit INPIX : function (x,y : integer) : integer; +
    • unit DRAW : procedure( x,y : integer); +
    • unit intens: procedure(Size :integer; xCoord,yCoord:arrayof integer, +Colour,Filled :integer); +
    • unit cirb {draw a circle} procedure; +
    • unit hfill: procedure( x : integer); +
    • unit vfill: procedure( y : integer); +
    • unit patern: procedure( x1,y1,x2,y2,c,b : integer); +
    • { Procedures operating on bitmaps } +
    • unit GETMAP : function (x,y : integer) : arrayof integer; +
    • unit PUTMAP : procedure ( a: arrayof integer); +
    • unit ORMAP : procedure ( a : arrayof integer); +
    • unit XORMAP : procedure ( a: arrayof integer); +
    • {Procedures operating on characters and strings} +
    • unit outstring: procedure(x,y: integer, s: string, back_col, front_col: + integer); +
    • unit track: procedure( x,y,c,valeur : integer); +
    • unit inkey : function : integer; +
    • unit HASCII : procedure(c: integer); +
    • unit hfont: function( x,y,lg,min,max,default,col_f,col_e,col_c : integer): + integer; +
    • unit HPAGE : procedure(x,y,long: integer, A: arrayof char, back, front: + integer); +
    • unit MOUSE: class; +
    • unit init: procedure(checkMouse, checkKeyboard: integer); +
    • unit getmovement: procedure(checkMouse, checkKeyboard: + integer); +
    • unit getpress: function(v,p,h,l,r,c : integer): Boolean; +
    • unit showcursor: procedure; +
    • unit hidecursor: procedure; +
    • a sample program +
    + +
    + + + +{ the early versions of library IIUWGRAPH have been elaborated by + Piotr Carlsson, Miroslawa Milkowska, Janina Jankowska, + Michal Jankowski at Institute of Informatics, + University of Warsaw 1987,

    + and added to Loglan system by Danuta Szczepanska 1987,

    + + the recent versions were done at LITA, Pau,

    + by

    + Pawel Susicki (1991) for Unix,

    + Sebastien Bernard (1992) for ATARI, see a separate document,
    + Eric Becourt et Jerôme Larrieu (1993) for Unix and Xwindows, see a + separate document on Xiiuwgraf , +

    + +

    +fait à Pau, le 15 Novembre 1994, par Andrzej Salwicki, LITA}

    + +{ the predefined class IIUWGRAPH is included in all versions of interpreter of +Loglan, with the exception of the present version of interpreter for +VAX/VMS.}

    +


    +

    +

    +hidden   MaxX, MaxY,  current_X, current_Y, is_graphic_On,       
    +              current_Colour, current_Background_Colour,  current_Style, 
    +              current_Palette,  current_Pattern ; 
    +
    +
    +                
    +const  MaxX =            
    +          MaxY =            
    +
    +{    the screen's coordinates are 
    +        
    +       (0,0)   ---------------------->   (MaxX,0) 
    +           ¦ 
    +           ¦ 
    +           ¦ 
    +          V 
    +       (0, MaxY)                            (MaxX,MaxY) 
    +
    +}
    + 
    +
    +var  currentDriver : integer,                     { see NOCARD below }  
    +       current_X, current_Y:  integer         { it is the current position } 
    +       is_graphic_On:  Boolean,	   { evidently tells whether we are in 			
    +			graphics mode } 
    +       current_Colour : integer,		{ } 
    +       current_Background_Colour : integer, 
    +       current_Style : integer,		{ } 
    +       current_Palette : integer, 
    +       current_Pattern  
    +
    +

    +

    unit GRON procedure +(i: integer);

    + { procedure sets the monitor in graphic mode and clears the buffer + of screen. The parameter determines the resolution and the number of + colours.
    +The user should assure that the resolution chosen should correspond to that +which is set by means of command
    +SET go32 drivers {path}< driver.file> < width> < height> < +noColours> +eg.
    +set go32 drivers c:\loglan\svga\drivers\vesa.grn gw 1024 gh 480 nc 256
    +

    An execution of instruction call gron(i) must precede + any of the graphic commands described below.

    +

    +case (i)
    +  {
    +  0 : 640x480x16
    +  1 : 640x480x256
    +  2 : 800x600x16
    +  3 : 800x600x256
    +  4 : 1024x768x16
    +  5 : 1024x768x256
    +  6 : 1280x1024x16
    +  7 : 1280x1024x256
    +  8 : 1600x1280x16
    +  9 : 1600x1280x256
    + }
    +
    +

    to ToC + +

    unit GROFF procedure;

    + { the procedure sets the monitor in the text mode filling it with + spaces.

    + DO NOT FORGET to set the monitor in the text mode before +you terminate your program

    + }

    +

    to ToC + + +

    unit CLS . +: procedure;

    + { the screen will be cleared and filled with colour 0 }

    +

    to ToC

    + + + +

    { PROCEDURES CONTROLLING THE COLOURS }

    +

    + +

    unit COLOR . : + procedure(co : integer);

    +{ sets current color to co
    + for monochrome displays, 0 means black, non-0 - white
    + for color displays, 0 means background
    + see PALLET

    +}

    +

    to ToC + +

    unit STYLE : + procedure(styl : integer);

    +{ sets style of lines and fill shades to a combination

    + of current color and background color (for mono -

    + white and black, respectively) according to 5 predefined

    + patterns:

    +

    +		0	....
    +		1	****
    +		2	***.
    +		3	**..
    +		4	*.*.
    +		5	*...
    +
    + where '*' means current color, '.' background colour

    +When drawing the segments the subsequent pixels will have colour determined +by cyclic application of style pattern. The first and the last pixels of a segment +will have always current colour.

    +When filling contours the given style will be applied to horizontal lines with even +coordinate. The style for odd lines is determined automatically.

    +The same applies for perpendicular lines.

    +} +

    +

    to ToC + +

    unit BORDER . : +procedure (background_Colour: +integer);

    + +

    { sets actual background color to i ( i = 0,1,...,15 ) }

    + +

    to ToC + +

    unit PALLET : +procedure (nr : integer);

    + {the following line makes an example, it is not valid for, say, +256 colours +

    +the codes of colors are usually i.e. when you have 16 colours, as follows

    +

    +		0	black
    +		1	blue dark
    +		2	green dark
    +		3	turquoise dark
    +		4	red dark
    +		5	violet
    +		6	brown
    +		7	grey light
    +		8	grey dark	 
    +		9	blue
    +		10	green
    +		11	turquoise
    +		12	red light
    +		13	rose
    +		14	yellow
    +		15	white
    +
    } +

    +

    to ToC + + + +

    { PROCEDURES CONTROLLING POSITION }

    + +

    unit MOVE : +procedure (x,y :integer);

    + { procedure MOVE sets the current position on the screen on the pixel + with coordinates

    + x - column,

    + y - line }

    + { precondition of MOVE: + 0*x*MaxX & 0*y*MaxY + }

    +

    to ToC + +

    unit INXPOS : +function: integer;

    + { function INXPOS returns the x coordinate of the current position }

    +

    to ToC + + +

    unit INYPOS : +function : integer;

    + { function INYPOS returns the y coordinate of the current position }

    +

    to ToC + + +

    unit PUSHXY : +procedure;

    +{ pushes current position, color & style onto the stack.

    + The stack is kept internally, max depth is 16

    +} +

    +

    to ToC + +

    unit POPXY : +procedure;

    + +{ restores position, color & style from internal stack }

    + +{ Example

    +

    unit  DIAGONAL : procedure;
    +    var ix, iy : integer;
    +begin
    +	call PUSHXY;
    +	ix := INXPOS;
    +	iy := INYPOS;
    +	call DRAW(ix+10, iy+10);
    +	call POPXY
    +end DIAGONAL;
    +
    } +

    +

    to ToC + + +

    { PROCEDURES SERVING POINTS & +LINES}

    + +

    unit POINT : +procedure(x,y: integer);

    +{ moves current position to pixel (x,y) and sets it to the current color +

    + }

    to ToC + +

    +

    unit INPIX : function +(x,y : integer) : integer;

    + {

    + moves to pixel (x,y) and returns its color setting;

    + } +

    to ToC +

    + +

    unit DRAW : +procedure( x,y : integer);

    + {

    + draws a line from current screen position to (x,y);

    + sets current position to (x,y);

    + line is drawn in current color, with both terminal pixels

    + always turned white ( non-background) for non-black

    + ( non-background ) line color.

    + } +

    to ToC +

    +

    unit intens : +procedure(Size :integer; +xCoord,yCoord:arrayof integer, Colour,Filled +:integer);

    + +/* draw a polygon*/ +{ draw a simple, closed polygon of Size points, the edges of the polygon go from +(xCoord[i], yCoord[i]) to (xCoord[i+1], yCoord[i+1]) for i = 1, ..., Size-1 +The colour used will be Colour. The polygon will be filled iff Filled< +> 0. +}

    +

    to ToC +

    +

    unit CIRB : procedure (xi, yi, rx,ry : integer, alfa, beta : real, +cbord, fill : integer);

    + + + { +

    draws a circle (or ellipse, depending on aspect value, see below),

    + optionally filling its interior;

    + does not preserve position;

    + (xi,yi) - are center coordinates,

    + rx - radius in pixels (horizontally),
    + ry - radius in pixels (perpendicularly),

    + alfa, beta - starting & ending angles; if alfa=beta a full

    + circle is drawn; values should be given in radians;

    + cbord - border color,

    + fill - if fill < > 0, interior is filled in current style& color

    + } +

    to ToC +

    +

    unit hfill : +procedure( x : integer);

    + { draw an horizontal line between the current position and

    + (x,currentY) with the current color, after it change the current

    + position to (x, currentY)

    + }

    +

    to ToC + +

    unit vfill : +procedure( y : integer);

    + { draw a vertical line between the current position and

    + (currentX,y) with the current color, after it change the current

    + position to (currentX,y)

    + }

    +

    to ToC + +

    unit patern : +procedure( x1,y1,x2,y2,c,b : +integer);

    + { draw a rectangle between the points (x1,y1) and +(x2,y2) with the

    + color c (the current color is not change). if b=0 then the box +is

    + empty else it is filled.

    + }

    +

    to ToC + +

    { Procedures operating on bitmaps }

    + +

    unit GETMAP : +function (x,y : integer) : arrayof +integer;

    + {saves rectangular area between current position as

    + top left corner and (ix,iy) as bottom right corner,

    + including border lines;

    + position remains unchanged.

    + array of integer should have

    + 4+(rows**columns/8* *coeff)

    + bytes. The coefficient coeff is 1 for Hercules, 2 for CGA, 4 for EGA

    + card.

    + ATTENTION: in DOS 286 environment a bigger size of the array may + necessitate the use of loglan with the option H+, see also +memavail

    + }

    +

    to ToC + +

    unit PUTMAP : +procedure ( a: arrayof +integer);

    + {sets rectangular area of screen pixels to that saved

    + by "getmap" in "iarray";

    + same size is restored, with top left corner in current

    + position;

    + position remains unchanged.

    + } +

    to ToC +

    +

    unit ORMAP : +procedure ( a : arrayof +integer);

    + {same as putmap, but saved bitmap is or'ed into screen

    + rather than just set.

    + } +

    to ToC +

    +

    unit XORMAP : procedure ( a: +arrayof integer);

    + {same as putmap, but saved bitmap is xor'ed into screen

    + rather than just set.

    + } +

    to ToC +

    + +

    {Procedures operating on characters and strings}

    + +

    unit outstring : +procedure(x,y: integer, s: string, back_col, +front_col: integer);

    + { x, y are the coordinates where to put the string,

    + s is the string to be shown, in front_col colour letters on the +back_col colour background

    + }

    +

    to ToC + +

    unit track +: procedure( x,y,c,valeur : integer); +

    + { write an integer value valeur at the position (x,y) with the +color c. + It does not change the current position nor the current color

    + }

    +

    to ToC + +

    unit inkey + : function : integer;

    + + { returns next character from keyboard buffer;

    + 0 is returned if buffer is empty;

    + special keys are returned as negative numbers;

    + ALT-NUM method may be used for entering character codes

    + above 127 (this makes entering special keys 128-132

    + impossible);

    + if a character is returned, it is also removed

    + from the buffer, so MS-DOS will not see it (CTRL-C!);

    + typeahead is allowed, echo is suppressed.

    + }

    +

    to ToC + +

    unit HASCII : procedure(c: +integer);

    + {'xor's the character = chr(c) in a 8*8 box with top left corner

    + in the current position;

    + moves current position by (8,0);

    + call hascii(0)- sets complete box to black ( =background ),

    + with no change in position.

    +} +

    to ToC +

    + + +

    unit hfont +: function( +x,y,lg,min,max,default,col_f,col_e,col_c : integer): + integer;

    + + { arrange a small 1 line window for reading an integer value +from this window, +the position of the window corner is (x, y), +the length of the window is lg characters, +the value v should be greater than min and smaller than max, +the default value read is default,

    +the colour of the window is col_f,
    +the colour of the digits is col_e,
    +the colour of cursor is col_c

    + + reads in graphic mode an integer in the window which begins at the (x,y) + position, window is lg caracteres long. the maximum length of the

    + integer that is read is 10. there is a default value, a minimum value + and a maximum value. the window is drawn with the col_f color, the + cursor is in the col_c color and the integer is writing in the col_e

    + color. you can use 0..9,+,-,backspace,escape and return keys. }

    +

    to ToC + + +

    unit HPAGE : procedure(x,y,long: +integer, A: arrayof char, back, front: integer);

    + { this procedure arranges a 1-line high window in position x,y of +length long in which a portion of text A is shown in colour +front on the background colour back.

    + Making use of keys controlling the cursor {left, right, PgUp, PgDn}

    + the user can scroll the text (horizontally) in the window. Pressing the + Enter key terminates the procedure}

    +

    to ToC + +

    end IIUWGRAPH;

    + + + +


    +

    unit MOUSE .: +class;

    +


    +
    { init -lors de l'initialisation de la souris, on peut définir les événements qui vont faire réagir la +fonction getpress; le premier et le deuxième paramètre représentent respectivement la souris et le clavier, si une +valeur non nulle est donnée comme paramètre alors getpress réagira à l'événement.

    + + Une paire (1,1) va permettre de prendre en compte à la fois les événements de la souris et ceux du clavier; +une paire (1,0) quand à elle ne prendra en compte que la souris. Pour une plus grande souplesse d'utilisation, il est +possible lors du programme, après l'initalisation, de changer cette prise en compte, cela se fera par l'appel de la +procedure getmovement, procédure ayant les mêmes paramètres (avec le même ordre) que la fonction +init.

    + + Pour detecter les événements, on utilisa la fonction getpress, qui retourne un booléen indiquant la +présence ou l'absence d'événement (respectivement les valeurs true et false). Il est bon de noter qu'ainsi définie la +fonction getpress n'est pas bloquante. Les paramètres en retour sont soit nuls (pas d'événement) soit +correspondent:

    + + bool:=getpress(v,p,h,l,r,c : integer);

    + v = position en y de la souris

    + p = keyboard status (Touche control_left,control_right, alt, alt_gr, shift_left, shift_right)

    + h = position en x de la souris

    + l = touche clavier

    + r = flags

    + c = boutons de la souris (0=aucun, 1=gauche, 2=droite, 3=gauche et droite)

    + Nb: le bouton central n'est pas géré.

    + +NOTEZ BIEN! Lorsque les événements du clavier sont pris en compte dans le gestionnaire, il ne faut +pas utiliser les fonctions d'entrées clavier readl, readln, hfont, hfont8, hpage, inkey,...) sous peine de +plantage de l'ordinateur.

    +}

    +
    +

    +

    unit init +: procedure(checkMouse, +checkKeyboard: integer);

    + { initializes the Mouse driver.

    + tells which events will be checked:

    + if checkMouse < > 0 then the events of Mouse will be reported to getpress, see below otherwise +ignored;

    + if checkKeyboard < > 0 then the events of Keyboard will be reported to getpress, otherwise ignored

    + Attention please! While the events of the keyboard are taken under control by +init or getmovement

    + do not use the functions or procedures: read, readln, hfont, hfont8, hpage, inkey +that read keys

    + YOU RISK TO HANG YOUR SYSTEM!

    + }

    + end init

    +

    to ToC + +

    unit getmovement : +procedure(checkMouse, checkKeyboard: +integer);

    + tells which events will be checked:

    + if checkMouse < > 0 then the events of Mouse will be reported to getpress, see below otherwise +ignored;

    + if checkKeyboard < > 0 then the events of Keyboard will be reported to getpress, otherwise ignored

    + Attention please! While the events of the keyboard are taken under control by +init or getmovement

    + do not use the functions or procedures: read, readln, hfont, hfont8, hpage, inkey +that read keys

    + YOU RISK TO HANG YOUR SYSTEM!

    + end getmovement;

    +

    to ToC + +

    unit getpress : +function(v,p,h,l,r,c : integer): +Boolean;

    + { v = y coordinate of the cursor,

    + h = x coordinate of the cursor,

    + p = keybord status control_left,control_right, alt, alt_gr, shift_left, shift_right

    + l = code of key pressed

    + r = flags

    + c = buttons pressed (0=aucun, 1=gauche, 2=droite, 3=gauche et droite)

    + Nb: the middle button is not taken into account.

    + end getpress

    +

    to ToC + + +

    unit showcursor : +procedure;

    + {the cursor becomes visible and follows the movements of the mouse}

    + end showcursor;

    +

    to ToC + +

    unit hidecursor : +procedure;

    + {the cursor becomes invisible}

    + end hidecursor;

    +

    to ToC
    + +

    end MOUSE;

    + +


    + +

    Enclosed you find a sample program .

    +
    +Program SystemeGraph; 
    +       (* by Frederic Pataud, October 1994 *) 
    +Begin 
    +Pref iiuwgraph block     (* inherit the graphic functions *) 
    + Begin 
    + Pref mouse block	(* inherit the mouse functions *) 
    +
    +
    +(*********************************************************************) 
    +(*                   P r o g r a m  m e   P r i n c i p a l                  *) 
    +(*********************************************************************) 
    +     var v,p,h,i : integer, 
    +       l,r,c : integer, 
    +       rep : arrayof char, 
    +       d : boolean, 
    +       xx,yy : arrayof integer, 
    +       status,code,x,y,flags,button : integer; 
    +    
    +   Begin 
    +      
    +     call gron(0);            (* enter the graphic mode *) 
    +     call init(1,0);            (* initialize the mouse, disregard the keyboard events, check for mouse events *) 
    +      
    +     call showcursor;		(* show cursor *) 
    +     call patern(5,5,635,475,2,0);         (* make a frame around the screen *) 
    +     call outstring(10,10,"x=",2,0); 
    +     call outstring(100,10,"y=",2,0); 
    +     call outstring(10,30,"status = ",2,0); 
    +     call outstring(10,50,"code   = ",2,0); 
    +     call outstring(10,70,"flags  = ",2,0); 
    +     call outstring(10,90,"button = ",2,0); 
    +     call patern(100,210,300,320,3,1);         (* make a rectangle filled in colour 3 *) 
    +
    +     array xx dim (1:6); 
    +     array yy dim (1:6); 
    +     xx(1):=410; yy(1):=10; 
    +     xx(2):=450; yy(2):=30; 
    +     xx(3):=460; yy(3):=50; 
    +     xx(4):=430; yy(4):=80; 
    +     xx(5):=420; yy(5):=40; 
    +     xx(6):=480; yy(6):=30; 
    +     call intens(6,xx,yy,8,1); 		(* show a polygon filled*) 
    +     for i:=1 to 6 
    +      do 
    +       yy(i):=yy(i)+100; 
    +      od; 
    +     call intens(6,xx,yy,15,0);		(* show another polygon empty *) 
    +      
    +     call cirb(500,300,50,40,100,3500,10,0);	(* draw an empty pie or camembert *) 
    +     call cirb(400,400,40,40,600,4000,11,1);     (* draw a filled pie *) 
    +
    +
    +     i:=hfont(100,350,6,-9999999,9999999,500,9,0,15);      (* read integer from a window *) 
    +     call hpage(100,400,10,unpack("Il fait beau dans ma verte campagne"),9,0);   (* show text *) 
    +     rep:=hfont8(100,430,10,80,unpack("tototutu"),9,0,15);		(* read text *) 
    +      
    +     call getmovement(1,1);           (* take into consideration both key events and mouse events *) 
    +      
    +     do 
    +      d:=getpress(v,p,h,l,r,c);		(* ask about an event *) 
    +      if (d) 
    +      then call outstring(10,400,"Event",2,0); 
    +           call patern(80,25,130,100,0,1); 
    +           call track(40,10,v,0,4);		(* print integer *) 
    +           call track(140,10,p,0,4); 
    +           call track(80,30,h,0,4); 
    +           call track(80,50,l,0,4); 
    +           call track(80,70,r,0,4); 
    +           call track(80,90,c,0,4); 
    +           if((h=164 and l=27) or (c=3))                 (* exit if either two buttons were pressed c=3 or Ctrl+Esc key *) 
    +           then exit; 
    +           fi; 
    +      fi; 
    +     od; 
    +     call groff;				(* leave the graphic mode and return to the text mode *) 
    +     writeln("i=",i); 
    +     for i:=lower(rep) to upper(rep) 
    +     do 
    +       write(rep(i)); 
    +     od; 
    +     writeln; 
    +   End 
    + End 
    +End. 
    +
    +

    to ToC +

    +


    +
    GMyAS Last update Sun 7 May +1995
    + + + diff --git a/HTML/klasyiob.htm b/HTML/klasyiob.htm new file mode 100644 index 0000000..d906c80 --- /dev/null +++ b/HTML/klasyiob.htm @@ -0,0 +1,590 @@ + + + + + +Klasy i obiekty + + + + + + + +

    Chapter 1: Classes +and objects

    + +

    +The still growing fascination of object-oriented programming dates +to 1989 when several software companies offered compilers of object-oriented +Pascal's, of C (C++ and Objective C) etc. We welcome this recognition +of merits of object-oriented programming with satisfaction. Let +us recall that classes and objects have more than 24 years of +tradition. They appeared in Simula-67. Along the line of R&D +concerning classes and their objects one can find the results +achieved at the Institute of Informatics, University of Warsaw. +We shall present many of them during these lectures. +

    +Notion of object has its roots in the well known structure of +an Algol and Pascal-like program. +

    +Let us begin with the notion of module. In a program one can indicate +several modules. The whole program is a module, every procedure +and function declared in a program is a module too. +

    +In the language Loglan we have more kinds of modules: +

      +
    • blocks, +
    • procedures, +
    • functions, +
    • classes, +
    • coroutines, +
    • processes, +
    • modules which serve the exceptions and/or signals - they are +shortly called handlers. +
    + +

    +Let us look at the most external module of a program +

    +      _______________________ 
    +      |program name (...)   |
    +      |                     |    This a module.
    +      | <declarations> e.g. |    (It can contain other modules) 
    +      | var x,y:real,a:bool;|
    +      |                     |
    +      |begin                |
    +      |                     |
    +      | <instructions> e.g. |
    +      | x:=x+y;             |
    +      | a:=x*x<y;           |
    +      | if not a then ...fi;|
    +      | while ...           |
    +      | do                  |
    +      |   ...               |
    +      | od                  |
    +      |                     |
    +      |end                  |
    +      |_____________________|
    +
    + +

    +During an execution of a program the so called activation record +of the above module is allocated in a memory. This is a prototype +of the notion of object. +

    +    _________________________
    +    |memory of data         |
    +    |                       |
    +    | x real  0.5           |
    +R   | y real -1.17          |    This is an activation record,
    +A   | a bool  true          |    sometimes called a dynamic ins-
    +M   | ..................... |    tance of the (program) module.
    +    |memory of instructions |
    +m   | x:=x+y;               |
    +e   | a:=x*x<y;             |
    +m   | if not a then ... fi; |
    +o   | while ...             |
    +r   | do                    |
    +y   |   ...                 |
    +    | od                    |
    +    |_______________________|
    +
    + +

    +Object-oriented programming develops the above remarks and enriches +the image the reader could build from them. In particular, object-oriented +programming requires more frames and assumes a wider spectrum +of the types of frames. Objects are just one type of frames appearing +in programming. +

    +More frames! Where they are coming from? Can we recognize them +in our Pascal practice? Yes, they arise during execution of procedure +statements. How? They are known under the name of activation records +or dynamic instances of procedures. +

    +An example, a snapshot of program's execution may look like: +

    +The above picture is a snapshot of an execution of the main program +taken in the moment when in the main program we executed a call +g procedure instruction, which caused the creation of an activation +record for g and its execution, which in turn executed a call +f procedure instruction, which caused the creation of (1st) +instance of an activation record for f procedure and ... +

    +   __________________________________________________
    +   |                                   ___________  |
    + __|______________       _____________|____      |  |        
    + | activ.rec f   |       | activ.rec. g   |      |  |
    + |               ÆÍÍÍÍÍ>͵                |      |  |
    + | (1st instance)|       | (1st instance) |      |  |
    + |               |       |                |     ____________
    + |               |       | ______________ ====> | Main     |
    + | ____________  |       |                |     |          |
    + |  ...          |       | call f         |     |f: proc   |
    + |  call f       |       |                |     |          |
    + |               |       |                |     |g: proc   |
    + |               |       |                |     |          |
    + -----------------       ------------------     |_________ |
    +   ^                                            |          |
    +   |       _________________________________>___|call g    |
    + ________________       __________________      |          |
    +| activ.rec. f   |     | activ.rec. f    ÃÄÄÄÄ>Ä´          |
    +|                ÆÍ<ÍÍ͵                 |      ÀÄÄÄÄÄÄÄÄÄÄÙ
    +| (2nd instance) |     | (3rd instance)  |
    +|                |     |                 |
    +| _____________  |     |                 |
    +|                |     |                 |
    +|  call f        |     |   ...           |
    +|                |     |                 |
    +|________________|     |_________________|
    +
    + +

    +The instance of main program is the static father of all remaining +activation records. This may be denoted by single lines (static +links) leading to the leftmost object. A static father of an object +is to be searched when the processor finds an identifier e.g. +a variable which is non-local for a currently executed object. +This in turn may lead to further searches along the path of static +links. In every snapshot the set of objects together with the +set of all static links creates a tree. Every edge of this graph +corresponds to the tree structure of module nesting in an obvious +way. +

    +Another kind of arrows (double lines) leads from an object to +its dynamic father i.e. to the object in which processor subsumes +the execution of instructions when all the instructions of a current +object are executed to the end. The graph structure +of objects and dynamic links differs from the previous one and +shows "who called who". Making use of our Pascal experience +we would like to assert it is a straight line structure. Later +we shall see that objects and coroutines enrich and complicate +the picture. +

    +Let us think of a scenario for an activation record of +a procedure. +

    +About Simula-67
    +
    The origins of object oriented programming go back to 1967 +when O.-J.Dahl, K.Nygaard and B.Myhrhaug defined the language +Simula-67. [books: SIMULAbegin by G.Birtwistle, O.J.Dahl, +Auerbach Publ. and Simula 67 by W.M.Bartol, H.Oktaba, PWN Publ. +are worth reading]. +

    +about class
    +
    General structure of a class module is as follows: +

    +   unit <name_of_class >:  class (<formal parameters>);
    +      <local declarations
    +        of variables, procedures, functions and classes! >
    +   begin 
    +      <instructions>
    +   end <name_of_class >
    +
    + +

    +Example +

    +unit circle :  class (center: point, radius: real);
    +unit intersects: function (c: circle): line;
    +{the function returns the line which passes through the intersection points of this circle object and the c circle object, NOTE! it might return none if the two circles have no common points, see how it is solved below }...
    +end intersects; 
    +begin 
    +if r=0 then raise SignalNoCircle fi
    +end circle
    +
    + +

    +Let us remark that the syntactic difference between a procedure +declaration and class declaration is little: the keyword procedure +is replaced by another keyword class. However, the semantics +is entirely different as it will be seen from the diagram-scenario +below. +

    +declaration of variables of type class
    +
    One can assume that every declaration of a class introduces +a new type, for it enables declarations of variables like: +

    +   var x : circle
    +
    + +

    +objects
    +Objects of classes can be generated by means of expressions (object +generator) of the form
    +new KLASA(actual_parameters>
    +and stored in variables
    +k:= new KLASA(actual_paramts)
    +One module of a class can serve as a pattern for many objects +
    +x:= new circle(point1, 88);
    +y:= new circle(new point(45,159), 644)
    +they can have different names. The names help to acces objects +
    +z:= x
    +and their internal structure
    +x.center ... y.radius
    +The values of the latter expressions will be correspondingly: +point1 and 644. +

    +scenario of an object looks as follows
    +
    + +

    +IMPORTANT consequences
    +1. one can use initialization phase to execute an algorithm or +to initialize objects.
    +EXERCISE. write factorial algorithm using objects and no +recursion.
    +2. objects can be used as records,
    +EXERCISE. write a piece of program which realizes a tree. +
    +3. one can send commands to objects, an object is able to execute +the call commands referring to its local procedure declarations +(and local functions too)
    +e.g. call x.aProc(a)
    +z:= x.aFun(b)
    +if aProc and aFun were declared in a class C and if x denotes +an object of the class C. +

    +Examples
    +  complex numbers
    +unit complex:  class (re,im: real);
    +var module: real;
    +   unit add: function(z: complex): complex;
    +begin      result:=  new complex(re+z.re, im+z.im)
    +   end add;
    +unit mult: function(z: complex): complex;
    +begin      result:=  new complex(re*z.re-im*z.im, re*z.im+z.re*im)
    +   end mult;
    +begin   module:= sqrt(re*re+im*im)
    +end complex;
    +
    +Having such class one can create several objects of type complex and manipulate on them e.g.
    +program UsingComplex;
    +unit complex ...   end complex;
    +var c1,c2,z1,z2: complex;
    +begin   c1:= new complex(1,9);     {creation of complex number 1+9i}   c2:= new complex(-3,-21);  {second object of class complex}   z1:= c1.add(c2.mult(c1));  {now z1=c1+(c2*c1))}   z2:= z1.mult(new complex(z1.re,-z1.im)) {Note an object without a name, once used, it becomes a garbage}end UsingComplex
    +
    + +

    +EXERCISE. Write a similar program in Pascal and compare +: how many parameters transmitted in an expression?, are the concepts +of complex numbers encapsulated? +

    +EXAMPLE which follows introduces concepts of planar geometry and +uses them in a prefixed block. The reader can run it and modify +it as well. {This is the first Loglan program I wrote in December +1981 to test the compiler.}
    + +

    +program CircumscribedCircle;
    +
    +unit GEOPLAN : class;
    +(* This class is in fact a problem oriented language, it offers various facilities for problem solving in the field of analitical planar geometry. 
    +The class has the following structure: remark the correspondence between software notions of class, procedure, function and the notions of general algebra: algebraic structure, sorts and operations  
    +
    +                            GEOPLAN                    <----- class                                       algebraic structure                           /   |   \
    +                          /    |    \
    +                         /     |     \
    +                    POINT    CIRCLE  LINE              <----- classes                                                 sorts                   /  |  \     |     / | \ 
    +                  /   |   \    |    /  |  \          operations                 /    |    |   |   |   |   \           <--|
    +                /     |    |   |   |   |    \             |
    +opera-     EQUALS   DIST   |   | MEETS |     \            |
    +                        ERROR  |       |    ERROR         \   tions 
    +                               |       |                  /         
    +                          INTERSECTS   |                  |
    +                                       |                  |
    +                                   PARALLELTO          <--|
    +*)   unit POINT : class(X,Y : REAL);
    +unit EQUALS : function (Q : POINT) : BOOLEAN;
    +begin        RESULT:= Q.X=X and Q.Y=Y ;
    +end EQUALS;
    +
    +unit DIST : function (P : POINT) : REAL;
    +(* DISTANCE BETWEEN THIS POINT AND POINT P *)      begin        if P = none        then          call ERROR
    +else          result:= SQRT((X-P.X)*(X-P.X)+(Y-P.Y)*(Y-P.Y))
    +fi      end DIST;
    +
    +
    +unit virtual ERROR : procedure;
    +begin        WRITELN(" THERE IS NO POINT")
    +end ERROR;
    +end POINT;
    +
    +
    +unit CIRCLE : class (P : POINT, R : REAL);
    +{ THE CIRCLE IS REPRESENTED BY ITS CENTER P AND THE RADIUS R } 
    +unit INTERSECTS : function (C : CIRCLE) : LINE;
    +(* IF BOTH CIRCLES INTERSECT AT 2 POINTS, THE LINE JOINING THEM
    +  IS RETURNED. IF CIRCLES INTERSECT AT ONE POINT, IT IS TANGENT
    +  TO BOTH OF THEM. OTHERWISE PERPENDICULAR BISECTION OF THEIR    CENTRES IS RETURNED *)     var R1,R2 : REAL;
    +begin       if C=/= none       then         R1:= R*R-P.X*P.X-P.Y*P.Y;
    +         R2:= C.R*C.R-C.P.X*C.P.X-C.P.Y*C.P.Y;
    +result := new LINE (P.X-C.P.X,P.Y-C.P.Y,(R1-R2)/2);
    +fi     end INTERSECTS;
    +
    +begin     if P=none 
    +then       WRITELN (" WRONG CENTRE")
    +fi   end CIRCLE;
    +
    +
    +unit LINE : class (A,B,C : REAL);
    +{LINE IS REPRESENTED BY COEFFICIENTS OF EQUATION AX+BY+C=0 } 
    +
    +unit MEETS : function (L : LINE) : POINT;
    +     (* IF TWO LINES INTERSECT function MEETS RETURNS THE POINT
    +          OF INTERSECTION, OTHERWISE RETURNS NONE *)     VAR T  : REAL;
    +begin       if L =/= none and not PARALLELTO (L)
    +then         T := 1/(L.A*B-L.B*A);
    +result := new POINT (-T*(B*L.C-C*L.B),
    +                               T*(A*L.C-C*L.A));
    +else         call ERROR
    +fi     end MEETS;
    +unit PARALLELTO : function (L : LINE) : BOOLEAN;
    +begin       if L=/= none       then         if A*L.B-B*L.A = 0.0
    +then           result:=TRUE; WRITELN(" zle"); 
    +else           result:=FALSE; WRITELN(" dobrze");
    +fi        
    +else         call ERROR
    +fi     end PARALLELTO;
    +
    +unit virtual ERROR  : procedure;
    +begin       WRITELN(" THERE IS NO LINE")
    +end ERROR;
    +
    +var D : REAL;
    +
    +begin (* NORMALIZATION OF COEFFICIENTS *)     D := SQRT(A*A+B*B);
    +if D= 0.0
    +then       WRITELN( " ZLE, ZERO"); call ERROR
    +else       A := A/D;
    +       B := B/D;
    +       C := C/D;
    +fi   end LINE;
    +
    +end GEOPLAN;
    +
    +
    +
    +begin 
    +pref GEOPLAN block    (* THE LANGUAGE GEOPLAN IS USED FOR FINDING THE CIRCLE CIRCUMSCRIBED ON A GIVEN TRIANGLE:             
    +                          P
    +                         / \
    +                        /   \
    +                       /  .<-\------- CENTRE  
    +                      /       \
    +                     Q---------R 
    +*)  taken POINT,LINE,CIRCLE;
    +
    +var P,Q,R,CENTRE : POINT,
    +    L1,L2 : LINE,
    +    C1,C2,C4 : CIRCLE,
    +    RADIUS, X1,Y1 : REAL;
    +
    +begin   do    WRITELN("THIS PROGRAM FINDS THE CENTRE AND RADIUS OF ");
    +    WRITELN(" THE CIRCLE CIRCUMSCRIBED  ON A GIVEN TRIANGLE ");
    +    WRITELN(" GIVE THE VERTICES COEFFICIENTS OF A TRIANGLE");
    +    WRITELN(" X1,Y1= ?? ??");
    +    READ (X1,Y1);
    +    P := new POINT(X1,Y1);
    +    WRITELN(" ",X1,"   ",Y1);
    +    WRITELN(" X2,Y2= ?? ??");
    +    READ (X1,Y1);
    +    Q := new POINT(X1,Y1);
    +    WRITELN(" ",X1,"   ",Y1);
    +    WRITELN(" X3,Y3= ?? ??");
    +    READ (X1,Y1);
    +    R := new POINT (X1,Y1);
    +    WRITELN(" ",X1,"   ",Y1);
    +
    +    RADIUS := P.DIST(Q) + Q.DIST(R);
    +    C1 := new CIRCLE (P,RADIUS);
    +    C2 := new CIRCLE (Q,RADIUS);
    +    C4 := new CIRCLE (R,RADIUS);
    +
    +    L1 := C2.INTERSECTS(C1); 
    +		(*THE PERPENDICULAR BISECTOR OF THE SIDE PQ*)    L2 := C2.INTERSECTS(C4); 
    +		(*THE PERPENDICULAR BISECTOR OF THE SIDE QR *) 
    +    CENTRE := L1.MEETS(L2);
    +
    +if CENTRE = none    then      WRITELN(" ALL POINTS LAY ON THE SAME LINE");
    +else      WRITELN(" THE CIRCUMSCRIBED CIRCLE IS AS FOLOWS:");
    +      WRITELN(" CENTRE = (",CENTRE.X,',',CENTRE.Y,')');
    +      WRITELN(" RADIUS = ",CENTRE.DIST(P));
    +fi   od  end
    +end 
    +The static structure of modules in the above program is the tree
    +
    +
    +                          PROGRAM
    +                          /    \
    +                         /      \
    +                        /        \     
    +                       /          \
    +                   GEOPLAN      pref GEOPLAN block            
    +
    +                  /   |   \
    +                 /    |    \
    +                /     |     \
    +           POINT    CIRCLE  LINE             
    +
    +          /  |  \     |     / | \ 
    +         /   |   \    |    /  |  \
    +        /    |    |   |   |   |   \          
    +       /     |    |   |   |   |    \         
    +  EQUALS   DIST   |   | MEETS |     \        
    +               ERROR  |       |    ERROR     
    +                      |       |
    +                      |       |              
    +                 INTERSECTS   |              
    +                              |              
    +                          PARALLELTO         
    +
    +
    +The edges lead from a module to its static father (up). The module GEOPLAN and the block prefixed with the name GEOPLAN are in another relation: namely of prefixing, or inheritance. We shall develop this remark later. What is worth noting here is that the structure of GEOPLAN remains intact. This is due to the fact that the class GEOPLAN encapsulates the structure of internal classes and modules.
    +
    + +

    +Let us view a few snapshots. +

    +   ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿      The initial snapshot shows just one 
    +   |program          |      dynamic instance of the main prog-
    +   | ÚÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ |      ram.
    +   | |GEOPLAN      | |
    +   | |             | |      The only instruction to be execu-
    +   | |             | |      ted is the instruction of prefixed 
    +   | |             | |      block.
    +   | |             | |
    +   | ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÙ |
    +   |                 |
    +   | ÚÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ |
    +   | |block        | |    ---- block prefixed with GEOPLAN
    +   | |             | |
    +   | |             | |
    +   | |             | |
    +   | |             | |
    +   | |             | |
    +   | ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÙ |
    +   |                 |
    +   ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
    +
    +Just before the first writeln ... instruction
    +
    +   ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿SL          ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
    +   |program          ÃÄÄ<ÄÄÄÄÄÄÄÄÄ´GEOPLAN block    |
    +   | ÚÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ |DL          |                 |
    +   | |GEOPLAN      | ÆÍÍ<ÍÍÍÍÍÍÍÍ͵ all features of |
    +   | |             | |            | GEOPLAN inhtd.  |
    +   | |             | |            |                 |
    +   | |             | |            | P  point none   |
    +   | |             | |            | Q  point none   |
    +   | ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÙ |            | R  point none   |
    +   |                 |            | C1 circle none  |
    +   | ÚÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ |            | C2 circle none  |
    +   | |block        | |            | C4 circle none  |
    +   | |             | |            | L1 line none    |
    +   | |             | |            | L2 line  none   |
    +   | |             | |            | RADIUS real 0   |
    +   | |             | |            | CENTRE          |
    +   | |             | |            |                 |
    +   | ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÙ |            |                 |
    +   |                 |            |                 |
    +   ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ            ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
    +    This may be a snapshot just before the instruction putting radius to be equal the sum of distances PQ and QR. We omitted all SL links and DL links in order to simplify the picture. 
    +
    +
    +   ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿   ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿       ÚÄÄÄÄÄÄÄÄÄÄ¿
    +   |program          |   |GEOPLAN block    | ÚÄÄÄÄÄ´ X real 4 |
    +   | ÚÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ |   |                 | |     | Y real 6 |
    +   | |GEOPLAN      | |   | all features of | |     ÀÄÄÄÄÄÄÄÄÄÄÙ
    +   | |             | |   | GEOPLAN inhtd.  | |     ÚÄÄÄÄÄÄÄÄÄÄ¿
    +   | |             | |   |                 | | ÚÄÄÄ´ X real -4|
    +   | |             | |   | P  point ÄÄÄÄÄÄÄÅÄÙ |   | Y real 88|
    +   | |             | |   | Q  point ÄÄÄÄÄÄÄÅÄÄÄÙ   ÀÄÄÄÄÄÄÄÄÄÄÙ
    +   | ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÙ |   | R  point ÄÄÄÄÄÄÄÅÄÄÄ¿   ÚÄÄÄÄÄÄÄÄÄÄ¿
    +   |                 |   | C1 circle none  |   |   | X real -9|
    +   | ÚÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ |   | C2 circle none  |   ÀÄÄÄ´ Y real 23|
    +   | |block        | |   | C4 circle none  |       ÀÄÄÄÄÄÄÄÄÄÄÙ
    +   | |             | |   | L1 line none    |                   
    +   | |             | |   | L2 line  none   |                
    +   | |             | |   | RADIUS real 0   |
    +   | |             | |   |                 |
    +   | |             | |   |                 |
    +   | ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÙ |   | => radius:= ... |
    +   |                 |   |                 |
    +   ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ   ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
    +
    +
    +
    +
    +   This may be a snapshot just after the three circles were created.  
    +
    +
    +   ___________________   ___________________       ÚÄÄÄÄÄÄÄÄÄÄ¿
    +   |program          |   |GEOPLAN block    | ÚÄÄÄÄÄ´ X real 4 |
    +   | _______________ |   |                 | |     | Y real 6 |
    +   | |GEOPLAN      | |   | all features of | |     ÀÄÄÄÄÄÄÄÄÄÄÙ
    +   | |             | |   | GEOPLAN inhtd.  | |     ÚÄÄÄÄÄÄÄÄÄÄ¿
    +   | |             | |   |                 | | ÚÄÄÄ´ X real -4|
    +   | |             | |   | P  point ÄÄÄÄÄÄÄÅÄÙ |   | Y real 88|
    +   | |             | |   | Q  point ÄÄÄÄÄÄÄÅÄÄÄÙ   ÀÄÄÄÄÄÄÄÄÄÄÙ
    +   | |_____________| |   | R  point ÄÄÄÄÄÄÄÅÄÄÄ¿   ÚÄÄÄÄÄÄÄÄÄÄ¿
    +   |                 |   | C1 circle ÄÄÄÄÄÄÅÄÄ¿|   | X real -9|
    +   | _______________ |   | C2 circle ÄÄÄÄÄÄÅÄ¿|ÀÄÄÄ´ Y real 23|
    +   | |block        | |   | C4 circle ÄÄÄÄÄÄÅ¿|ÀÄÄ¿ ÀÄÄÄÄÄÄÄÄÄÄÙ
    +   | |             | |   | L1 line none    ||ÀÄÄ¿| ÚÄÄÄÄÄÄÄÄÄÄ¿
    +   | |             | |   | L2 line  none   |ÀÄ¿ |ÀÄ´CENTER  P |
    +   | |             | |   | RADIUS real 0   |  | |  ÀÄÄÄÄÄÄÄÄÄÄÙ
    +   | |             | |   |                 |  | ÀÄÄÂÄÄÄÄÄÄÄÄÄÄ¿
    +   | |             | |   |                 |  |    |CENTER  Q |
    +   | |_____________| |   | => L1:= ...     |  |    ÀÄÄÄÄÄÄÄÄÄÄÙ
    +   |                 |   |                 |  |    ÚÄÄÄÄÄÄÄÄÄÄ¿
    +   |_________________|   |_________________|  ÀÄÄÄÄ´CENTER  R |
    +                                                   ÀÄÄÄÄÄÄÄÄÄÄÙ
    +
    + +

    +This may be a snapshot of situation in which two lines were +created and their intersection point was found. +

    +   ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿   ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿       ÚÄÄÄÄÄÄÄÄÄÄ¿
    +   |program          |   |GEOPLAN block    | ÚÄÄÄÄÄ´ X real 4 |
    +   | ÚÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ |   |                 | |     | Y real 6 |
    +   | |GEOPLAN      | |   | all features of | |     ÀÄÄÄÄÄÄÄÄÄÄÙ
    +   | |             | |   | GEOPLAN inhtd.  | |     ÚÄÄÄÄÄÄÄÄÄÄ¿
    +   | |             | |   |                 | | ÚÄÄÄ´ X real -4|
    +   | |             | |   | P  point  ÄÄÄÄÄÄÅÄÙ |   | Y real 88|
    +   | |             | |   | Q  point  ÄÄÄÄÄÄÅÄÄÄÙ   ÀÄÄÄÄÄÄÄÄÄÄÙ
    +   | ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÙ |   | R  point  ÄÄÄÄÄÄÅÄÄÄ¿   ÚÄÄÄÄÄÄÄÄÄÄ¿
    +   |                 |   | C1 circle ÄÄÄÄÄÄÅÄÄ¿|   | X real -9|
    +   | ÚÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ |   | C2 circle ÄÄÄÄÄÄÅÄ¿|ÀÄÄÄ´ Y real 23|
    +   | |block        | |   | C4 circle ÄÄÄÄÄÄÅ¿|ÀÄÄ¿ ÀÄÄÄÄÄÄÄÄÄÄÙ
    +   | |             | |   | L1 line  ÄÄÄÄÄÄ¿||ÀÄÄ¿| ÚÄÄÄÄÄÄÄÄÄÄ¿
    +   | |             | |   | L2 line  ÄÄÄÄÄ¿||ÀÄ¿ |ÀÄ´CENTER  P |
    +   | |             | |   | RADIUS real 0 |ÀÅÄ¿| |  ÀÄÄÄÄÄÄÄÄÄÄÙ
    +   | |             | |   | CENTRE Ä¿     | | || ÀÄÄÂÄÄÄÄÄÄÄÄÄÄ¿
    +   | |             | |   |         |     | | ||    |CENTER  Q |
    +   | ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÙ |   | => if CE|NTRE | | ||    ÀÄÄÄÄÄÄÄÄÄÄÙ
    +   |                 |   |         |     | | ||    ÚÄÄÄÄÄÄÄÄÄÄ¿
    +   ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ   ÀÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÅÄÙ |ÀÄÄÄÄ´CENTER  R |
    +            ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ     |   |     ÀÄÄÄÄÄÄÄÄÄÄÙ
    +   ÚÄÄÄÄÄÄÄÄÁÄÄÄÄ¿      ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´   | ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
    +   | X coeff. of |      |A real ...      |   ÀÄ´A real   ...  |
    +   | Y solution  |      |B real ...      |     |B real   ...  |
    +   |             |      |C real ...      |     |C real   ...  |
    +   ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÙ      ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ     ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
    +
    +
    +Exercises. Add drawing functions as attributes of classes point, line, circle.	
    +Write the algorithm inverting a point w.r.t. a given circle.
    +
    + +
    +Andrzej Salwicki +
    + + + + diff --git a/HTML/loghome.htm b/HTML/loghome.htm new file mode 100644 index 0000000..149c644 --- /dev/null +++ b/HTML/loghome.htm @@ -0,0 +1,95 @@ + + + + + +Loglan'82 home page + + + + + + + +

    logo +Loglan'82 - programming with objects

    +
    + +

    Loglan's home page

    +
    + +

    +Loglan'82 is an object-oriented, universal, imperative programming +language.
    +It comes with Doc, Compilers (DOS, Unix, Atari,.), Examples etc. +
    +Four features of Loglan'82 make it original and interesting for +everybody: +

    + +

    +


    + +

    INDEX

    + + +
  • Why Loglan'82? Should I be acquainted with it? + + +
    A SUGGESTION: Use recent versions of Mosaic or Netscape viewers +in order to read the tables we prepared for you.
    +For those who can not see the tables there are ASCII versions +of tables as well as postscript files
    + + +
  • a Quick Reference Card of Loglan'82 + + +
  • a short comparison with other OO languages + + +
  • A micro-manual of Loglan'82 + +
  • How to get a copy of Loglan'82 system? +
  • existing platforms + + +
  • research problems related to Loglan'82 +
      +
    • solved ones +
    • open ones +
    + +
  • Dr Fun or the mysteries of "scientific" bureaucracy +
  • a short history of Loglan'82 project +
  • why I learn so late on Loglan'82? + +
  • +
    + +
    +AS last +update Sun 21 May 1995 +
    + + + + +pp \ No newline at end of file diff --git a/HTML/loghome.htm~ b/HTML/loghome.htm~ new file mode 100644 index 0000000..46bd5d6 --- /dev/null +++ b/HTML/loghome.htm~ @@ -0,0 +1,95 @@ + + + + + +Loglan'82 home page + + + + + + + +

    logo +Loglan'82 - programming with objects

    +
    + +

    Loglan's home page

    +
    + +

    +Loglan'82 is an object-oriented, universal, imperative programming +language.
    +It comes with Doc, Compilers (DOS, Unix, Atari,.), Examples etc. +
    +Four features of Loglan'82 make it original and interesting for +everybody: +

    + +

    +


    + +

    INDEX

    + + +
  • Why Loglan'82? Should I be acquainted with it? + + +
    A SUGGESTION: Use recent versions of Mosaic or Netscape viewers +in order to read the tables we prepared for you.
    +For those who can not see the tables there are ASCII versions +of tables as well as postscript files
    + + +
  • a Quick Reference Card of Loglan'82 + + +
  • a short comparison with other OO languages + + +
  • A micro-manual of Loglan'82 + +
  • How to get a copy of Loglan'82 system? +
  • existing platforms + + +
  • research problems related to Loglan'82 +
      +
    • solved ones +
    • open ones +
    + +
  • Dr Fun or the mysteries of "scientific" bureaucracy +
  • a short history of Loglan'82 project +
  • why I learn so late on Loglan'82? + +
  • +
    + +
    +AS last +update Sun 21 May 1995 +
    + + + + +p \ No newline at end of file diff --git a/HTML/loglan82.htm b/HTML/loglan82.htm new file mode 100644 index 0000000..a02dfcf --- /dev/null +++ b/HTML/loglan82.htm @@ -0,0 +1,36 @@ + + Index of Loglan82 archive + + +

    Index of Loglan82 archive

    +

    on infpc1.univ-pau.fr

    + + +
    +
    AS Last update Mon 6 Mar 1995
    + + \ No newline at end of file diff --git a/HTML/loglanmm.gif b/HTML/loglanmm.gif new file mode 100644 index 0000000000000000000000000000000000000000..8cf0382b8dddf3a3d43aaed91efec7759968b63d GIT binary patch literal 1212 zcmeH`;cFXZ9LJxmG5N(c^x3H8k)Guq*J00fm>X4lTfyYiZ9TNzqF_0Fv3l&qb||_V zV!0J|?X_<8$}$M3GhkAdQka3jJSfPyRkmCECQQ&MIKn1u*#;vbD+dETpDFB5@Rh%} z&-e5B{rJMOXL$GEi{m`vQGiewhCvXtTCHZY*=RKC^?I#V^L^j*JlAzAl}fo>E))v+ zeBN;!+qO;9Gz>%6bxqS$Rn2CzilWG}EJ>0mih>|eN(mttV*q$0Wx7WqreHiH8RnSg zzoe=tj5JhLktEM?OjQ+`2jje|n(T=XS5-AiT}iS9!Dks!EU-KwH9>GG6#?p$mI*O1 zmH=ErY>XX-W2^vV0V)`406KsT;IIIIgpi03K?oz%QnO7(uFFzWmRediFtxzZ!-^An z`Or1PmKO#!))Q;xpQFI@J;O94Spp0}7`B4I^}Is4Y&#AW1i%o_A4`ePwh-qkDpyj_P_hWP-^pv z6>Wpo+IRW%bK_@VcweSC z9eZZm&d(pWzP=bAooavb&4co6cIYg=5kInYVL=^3j}^J+H+&G8>$|&meEy~PuSatH;@Fm4x@WDI hZdWd5;-fnfnfYkyPVd}D>r0V2ZZL%=w#K4p*WU^{Mv?#k literal 0 HcmV?d00001 diff --git a/HTML/logo.gif b/HTML/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..feed42ac740925e5a163368ce4e7a94c08d9ce8b GIT binary patch literal 4765 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 literal 0 HcmV?d00001 diff --git a/HTML/mosaic.ghi b/HTML/mosaic.ghi new file mode 100644 index 0000000000000000000000000000000000000000..5204a76b6a44456ef58a6a6eed08f322922cb389 GIT binary patch literal 161 zcmY%JV_;AOV$uMkI#7LDW=^V=zP`R&jlPe+yN{!vo=b3uzDJ0!4~XyK@9V0UQIg9b N?J>!KG}BR30|1Le4Q>Dc literal 0 HcmV?d00001 diff --git a/HTML/nextpage.gif b/HTML/nextpage.gif new file mode 100644 index 0000000000000000000000000000000000000000..4f510e0ea210f9405743d3419223818c577ac7e7 GIT binary patch literal 2018 zcmcJM`B##O8pl}#1k^B5u`G83(;3rD$t6Y6+!`{nLQ_ktQR}K{T}$tb3#j0dI%uYp zBH}{x-qDVf)n!HqNh`M&DyKMQ%d2+lHLZEAndZIpN8IlZ&-s2o&pFRI-}6L8M+W#G z$UsG+UZYTmQ80o)Uk3~$u+e}BY(QW=0zn7_B9H-rj9zEN2nZt}gn%Fd8W2#AfJUf- zK_v_VumMC22E?F83_94Lf(=U8V1#nmAc6HdSg(ThN>~rTdSevBdOkD(z!P$KLIO{S z;R$0bf+q4IoeI_guucx^B(Saq((xf(5u`KnY)F?5spPPV52=bERX(K3hEztvgH#ES zDh5*4K*}OWnGY$mA!RzGe5s(s8Svg-& zfkF$>CKwZ(iAY%alenq*Y|FVSG!BPvC$!_wi(0#Tdb@?^@dUD&x!EN%sZ8ECbhWRV zX1B)4+1}d5+L}5*ZpUF7u1!n|M0h(V7lzM9UmrI|hjrEi()0D>Q?G~6c(N12*DokI zXiK1s*CpCS#T^@4tWYCbuT>(vH7J(bUmt&Q|<7 zigUD&{3Vr<&}sjEpj=1F(PcbXxZj%`RVp#tyuwL$ZSvZ71r^+PX|&GHms{vq5%z+yWKOPslph=w2GK=r3==%;$oA-ei?u{I26YWaN zJKV}iF%h>RAOha8}i866Z1cC4zh*AYkS!czCF@oGJPS zc}+%%8f$_=dG>QX95rTa8hKs&_`;`G7w?ra+xF~BL*uMswTmp%8P=57P+mNvYREUp zNnn%2>Hcs1yoGR9NIEjpY)qGz(+ zlFf^cSJ&3Xm1z2~2t89%cslc3J^fZCTYLE%DIZ7m_LlsXaBOfpy82dsxlEzCskjz_ z7e1sVS6Sk1(vqJ?Sj9?E8r;pQ@`B&0T`8q_?NSLlW81Y`Sp{z4{uQ(&?HfNU&wh@E z5OF0=KTYmT&I>1dN=jA*#Mf%> z)Jg+8L;W^BO54!oVufVAR06adL>usEN<)Mxy9RS*t|zz5eDS7e!a``H0`>44_FspZ zQ{QWs#($UmaCo+vU9%9`XUQR*TrB_C`z~0io@v)s3XpR-Cne-cAJU4CKcGQThZ9bB zQ?7*6&S$*1fkyek{}Gv1mh%Ij)do$Mlz(s}{(J24b$XS6{#QrwxG&l?fFQB8;Z(e0 zgobfK%N;uEwulc>YSHa3|@=f(AjmIPQ*CmOaEaKf}7Mv=N#UwqSGftQtzRsK&lKVN_q{&45VW z{ezboXp_}XXAk?!)WpQ2Q`T(p_iQH+Ap$G9TBT zRn>TDb8lpn%7fb=dcYbL_r&g3#8)e%Ef#(kS#K44k`#Bl>%>1NoLkuYRP;c2{3DPG h^s=xbvSP{4)_(Uw>bIXcYK!Lnlfg&*v1nA_{{R4Cr&0g_ literal 0 HcmV?d00001 diff --git a/HTML/openpbms.htm b/HTML/openpbms.htm new file mode 100644 index 0000000..f3550f3 --- /dev/null +++ b/HTML/openpbms.htm @@ -0,0 +1,131 @@ + + +Open research problems + + + +

    Open problems and questions

    +

    Loglan'82 is the result of university +research. +We were not pretending to conquer the market. It happened however that the + language turned out to be +a good vehicle for teaching objects. Its features still make him +a good candidate language for those who wish to have a reliable +tool for programming quite complicated algorithms, data structures and +systems. + +

    On the other hand we believe that it is necessary to study the +problems and questions which arise in the domain of object +programming. +We believe that the progress is done by profiting from the experience +and results obtained by others and by adding someones own results. +Therefore we propose to study the questions listed below. +To our knowledge they are still open. We shall be happy to hear any news + and comments +from you. + +

    List of open questions and problems

    + +
      +
    • 1. Is it possible to have simultaneously in + one programming language:
      +

        +
      • nesting of modules, +
      • multiple inheritance? +
      +

      REMARKS.
      + a) One may doubt: do we need nesting of modules in the presence of + (multiple) inheritance? I believe that YES, we really need both +ways + of module's construction.
      + b) From the experience of Loglan'82 we know that nesting + +multilevel + inheritance + multikind inheritance + effective managemant of + objects is possible. Similar experience is witnessed by BETA + project.
      + c) It is possible to simulate multiple inheritance in Loglan'82 + (to some extent).
      + d) Still, one may doubt whether a consistent semantics of a language + that admits both multiple inheritance and nesting exists. + Another question which is strongly related to this one arise: + can we do it efficiently? +

    • 2. Is it possible to manage in a (quasi-) uniform way object of different + nature: +

        +
      • "usual" objects, +
      • persistent objects, +
      • process objects - they may be realised as network objects + or process-objects in a parallel computer? +
      + +

      REMARKS.
      + a) The experience of Loglan'82 witnesses that usual objects and process objects + may coexist.
      + b) We imagine that the system created by A. Kreczmar may be easily + cloned in order to manage persistent objects.
      + + +

    • 3. Is it possible to use the mechanisms of +classes, inheritance etc. in order to + manage the libraries of predefined modules? +

      REMARKS.
      + We imagine that it would be much better to use inheritance etc. + instead of #INCLUDE mechanism. Why we should mix up these + notions so different: file and module? +

    • 4. Is it possible to conceive the virtual + Loglan computer (i.e. + its interpreter or if you prefer its running system) + as a confederation of processes? +

      REMARKS.
      + In fact the present system of Loglan'82 is already a pair of processes + 1° an interpreter of graphic commands and 2° the running system of Loglan'82 + itself. + +

    • 5. How to specify and implement a symbol + table for a language + (say Loglan'95) that admits both nesting and multi inheritance? +

      REMARKS.
      + To tell the truth we know how to implement the sumbol table. It + seems very interesting to make and publish a specification of + this subsystem of the future Loglan'95 system as it contains + plenty of interesting features and brings a new and important variant + of the notion of dictionary data structure [cf.] +

    • 6. Is it possible to use efficiently object + programming in a compiler + project? +

      REMARKS. We wish to advocate two theses: that the recursive + descending analysis should + gain as much attention as the ascending one, that OO programming + has to play its proper rôle in the automatic construction of parsers. + Moreover, we see the importance and multiple usage of trees of + abstract syntax of a program for various transformations of it. + +

    • 7. Is it possible to construct an editor +which would aid the programmer + to develop a program within certain guidelines of "good" programming? +

      Remarks. We believe that it is possible to give a new shape to + the "webbing" of programs as proposed by D. Knuth. + +

    • 8. Is it possible to conjuge the compiler + project for Loglan'95 + together with a proof assistant project for Algorithmic Logic? +

      REMARKS. + + +

    +As you see the list of questions is quite long. We would appreciate any + help. +We are looking for collaborators to work together on the problems listed +above. +There is plenty of work for everybody. +For example, we have a system of network objects=processes written by +Pawel Susicki. He could not debug the system. Would you? +
    + + + + +
    +Andrzej Salwicki Last update Fri 19 May 1995 + +pp \ No newline at end of file diff --git a/HTML/openpbms.htm~ b/HTML/openpbms.htm~ new file mode 100644 index 0000000..7021300 --- /dev/null +++ b/HTML/openpbms.htm~ @@ -0,0 +1,131 @@ + + +Open research problems + + + +

    Open problems and questions

    +

    Loglan'82 is the result of university +research. +We were not pretending to conquer the market. It happened however that the + language turned out to be +a good vehicle for teaching objects. Its features still make him +a good candidate language for those who wish to have a reliable +tool for programming quite complicated algorithms, data structures and +systems. + +

    On the other hand we believe that it is necessary to study the +problems and questions which arise in the domain of object +programming. +We believe that the progress is done by profiting from the experience +and results obtained by others and by adding someones own results. +Therefore we propose to study the questions listed below. +To our knowledge they are still open. We shall be happy to hear any news + and comments +from you. + +

    List of open questions and problems

    + +
      +
    • 1. Is it possible to have simultaneously in + one programming language:
      +

        +
      • nesting of modules, +
      • multiple inheritance? +
      +

      REMARKS.
      + a) One may doubt: do we need nesting of modules in the presence of + (multiple) inheritance? I believe that YES, we really need both +ways + of module's construction.
      + b) From the experience of Loglan'82 we know that nesting + +multilevel + inheritance + multikind inheritance + effective managemant of + objects is possible. Similar experience is witnessed by BETA + project.
      + c) It is possible to simulate multiple inheritance in Loglan'82 + (to some extent).
      + d) Still, one may doubt whether a consistent semantics of a language + that admits both multiple inheritance and nesting exists. + Another question which is strongly related to this one arise: + can we do it efficiently? +

    • 2. Is it possible to manage in a (quasi-) uniform way object of different + nature: +

        +
      • "usual" objects, +
      • persistent objects, +
      • process objects - they may be realised as network objects + or process-objects in a parallel computer? +
      + +

      REMARKS.
      + a) The experience of Loglan'82 witnesses that usual objects and process objects + may coexist.
      + b) We imagine that the system created by A. Kreczmar may be easily + cloned in order to manage persistent objects.
      + + +

    • 3. Is it possible to use the mechanisms of +classes, inheritance etc. in order to + manage the libraries of predefined modules? +

      REMARKS.
      + We imagine that it would be much better to use inheritance etc. + instead of #INCLUDE mechanism. Why we should mix up these + notions so different: file and module? +

    • 4. Is it possible to conceive the virtual + Loglan computer (i.e. + its interpreter or if you prefer its running system) + as a confederation of processes? +

      REMARKS.
      + In fact the present system of Loglan'82 is already a pair of processes + 1° an interpreter of graphic commands and 2° the running system of Loglan'82 + itself. + +

    • 5. How to specify and implement a symbol + table for a language + (say Loglan'95) that admits both nesting and multi inheritance? +

      REMARKS.
      + To tell the truth we know how to implement the sumbol table. It + seems very interesting to make and publish a specification of + this subsystem of the future Loglan'95 system as it contains + plenty of interesting features and brings a new and important variant + of the notion of dictionary data structure [cf.] +

    • 6. Is it possible to use efficiently object + programming in a compiler + project? +

      REMARKS. We wish to advocate two theses: that the recursive + descending analysis should + gain as much attention as the ascending one, that OO programming + has to play its proper rôle in the automatic construction of parsers. + Moreover, we see the importance and multiple usage of trees of + abstract syntax of a program for various transformations of it. + +

    • 7. Is it possible to construct an editor +which would aid the programmer + to develop a program within certain guidelines of "good" programming? +

      Remarks. We believe that it is possible to give a new shape to + the "webbing" of programs as proposed by D. Knuth. + +

    • 8. Is it possible to conjuge the compiler + project for Loglan'95 + together with a proof assistant project for Algorithmic Logic? +

      REMARKS. + + +

    +As you see the list of questions is quite long. We would appreciate any + help. +We are looking for collaborators to work together on the problems listed +above. +There is plenty of work for everybody. +For example, we have a system of network objects=processes written by +Pawel Susicki. He could not debug the system. Would you? +
    + + + + +
    +Andrzej Salwicki Last update Fri 19 May 1995 + +p \ No newline at end of file diff --git a/HTML/platform.htm b/HTML/platform.htm new file mode 100644 index 0000000..52f882d --- /dev/null +++ b/HTML/platform.htm @@ -0,0 +1,79 @@ + + +Supported Platforms + + + +

    Supported Platforms

    + +
  • DOS +
  • Unix +
  • Atari +
  • others +
  • + +
      +
    • Dos
      + There exist versions adapted to various machines: AT, 486, 386. + Therefore you should choose a version that corresponds to your + computer in order to gain on the speed of compilation and execution. + Next, you should choose the driver corresponding to your graphic + card. If it seems too complicated for you choose VGA. + We feel sorry to tell you that for a moment the versions of + predefined class + + vary depending on the hardware. It means + that you should indicate in your program the platform & graphics + used. + +
    • Unix
      + Most of Unix machines allow to install Loglan'82 without problems. + We have verified PC/Linux - it is probably the most popular choice, + PC/SCO Unix, HP, Sun4 with SunOS, SunSparcStation10 with Solaris. + Some users encountered the difficulties however.
      + + In order to install Loglan: copy the source files,adapt the files + makefile and execute make in each subdirectory:f2c, pass1, gen, in. + +If you wish to use the predefined class IIUWGRAPH then
      +please read the following description Xiiuwgraf , or click here Xiiuwgraf.txt in order to view an ASCII file.
      + +
    • Atari
      + In the subdirectory "ATARI" we put the executables. It suffices to copy them. + Please read the accompanying text. + Pay attention to the fact that grapic operations are realised + somewhat differently. +
    • others
      + The first compiler of Loglan'82 was running (1982-1988?) on + mini-computers MERA 400.
      + There is a version for VAX/VMS which was used in several places. + Should you be interested in it, please contact us. + +
    + +
    + + + +
    +
    +AS + last update 2 January 1995 +
    + + + + + + + + + + + + + + diff --git a/HTML/prevpage.gif b/HTML/prevpage.gif new file mode 100644 index 0000000000000000000000000000000000000000..52968013b5528eea1f5881a325353ad066c32279 GIT binary patch literal 2044 zcmcJM`CC$n9>xI$#T5etEejLVloA}Bw5$R5%q&fFDIL?CT(XybhON}XJWMNnALN%#iMnnbLo$`?+@SSeLv6pyuW-ywg>xcI&csb zjCzGaAqK$+0)0C$jKBs1BCsBTClLrjAP|A{2xRa&7=#fJLO>7!^$0kLfCi$5K_v_V zupUJ8dPF~o=ykAO4eOP#-T)P_UItI<;7K(+se~s1c+wE1@T3451>jKyJSu}nrSPaB z7DA(WkWLNj09dDhbuw620qF#gt`O20cow8fg>(s!S^=vCkh&03=RxW$NSz9)4KNB) zRzS)^NSOyIvmj+Eq)dR62IvneeL+A90|E#rgn&E<$bx`W2uOf{C%g`po|5|)`O`3gBag7zx@Jbf^bp%Vu4Up zQd(ACjIK0BW3l4O$}=^!7wYN-QVH&o9E-zLUu>7eVGW(-`NYMAMs4|R^m*-=Sp9(Hu-e(vYm2wv zRzELKy*bwS#h3Ci$^D!BnB+|XdTXbU)>WL8))F<|BosRxV#D=KnoWv%LkqxJuL*7q zt@9M#v2_bQ`!P<-9 z_q|=a?RH?A>3!|Te({`lb2F1+--Hc+&bwOcQM-I9Xt`KqGQhM+jbhx%Hp*PNS-#sb zRVQA%J2-ddi8AYzhYHzS*Bpg2X_W>#c~ZEVlvv`k#^iVPp*E6)YfoO?rQ{vC!ILaq zkns6;2l~xpqP`4oh&CgyzHa->Z}IkqU)xjL&VKp#wBBXiw7G-6Iq3Nr$N8F6pJCcy z)>=s)_GC@kvG^jZf*2twcueeXx^Zj&rSypErg{0l4Ieg=@DciY5lw>i_+{3un_;9@DI=TMg z%ipr($tTAF`F@Ab0*keQ8n+rgVIE~n5*GzFNN&AQ5* zMl$F9trq+_P?Eg+amsnCNASBrf@sSSqC&lKWd@<=@0<07F=qm88-mdTQXzTPCOUlmawYp`?)ZB}&S!{`RXO0VqA4I)E z>b62&?$`~p`h!i1_k@7zWldjBQ09~$0q-8T^XK8%lx z-kNHh8rf-16ym*CPW&x(CDe z>8q^0*cILwEv8@V#bFntFeot;2J;31Id;%|P4-tQJ$vMq*`6h>)oyN+@lM2^v67rO$3cUk6kU?w8UGWpIB#-)*dWh zp1$YG)7Y%0Q3rb1CJ~R-5FqBr%Etw#n8iezbG(n2F_D#m!iF1#I;ccOSx1W*vW{@& zR9Ld-;~{%Kt0E;o5DH#0bA2K><=&yS=8CcBH484TQ)ekTCAV_-TNmD>HASlq8LdL0 z@y^5a?YdmYliY4ZGQhf(P_Tfn2v4mV_z%zel$hYeZZh@iNW@X`VIgz9wnO8NMqT6V znO-iAk*u{)Ibraw@*?F#kX0G6KF{Lzy4CZj@0;U!c1y4RSF5PS22HORDE`7Lkkm z>kp*zF(K}w+_ z+&!V#aNu2MWOezTvl|~?PE2##dHQp7PwvC^l@Gh(M(*sbzUI~HHzbHTZXer~ +Processes + + + +

    Chapter: PROCESSES

    + +

    by Andrzej Salwicki

    + +

    Plan

    + + + + +
    +

    Introduction

    +

    +The word process has two meanings: it may denote a module of a programm or +it may denote an object of a module.
    +Once created a process-object may be activated. Its instructions are executed in parallel +with the instructions of other processes-objects. The word multithread execution explains +well the intuition of concurrent processes. +While the objects of classes and of coroutines share a processor, +the objects of processes do have a processor associated with each +object of process. The processor can be either a physical processor +e.g. a personal computer or workstation connected to other computers +by means of LAN network, or it may be a virtual processor, in reality +it can be an ability to acquire a time slice of a real computer. +(More or less like a process in Unix system). + + +

    +

    Syntax

    + + +

    The syntax of module process is similar to those of modules class or coroutine + +

    unit {processTypeName}: {prefix} process ({formalParameters}):
    +     {declarations}
    +begin
    +     {instructions}
    +end {processTypeName};
    + +The present status of the processes in Loglan82 is experimental. There are several contextual restrictions imposed. Some of them are explained by the experimental and temporary status ... Some of them are not checked by the compiler. Sorry! Attention please! + +

    Context restrictions.

    + + +
      +
    1. All process modules should be declared as global units. They can not be nested. They can inherit however. +
      This is explained by the distributed model of memory of processes. +
    2. There is no shared memory. Every process can access only its private resources, whether declared locally or transmitted as parameters, or procedures and functions declared in other object of process if it is accessible to the process. +
    3. The parameters of a process can be +
      integer, real, char, Boolean, string i.e. of primitive type +
      or +
      process objects +
      or +
      procedure declared in a process object +
      or +
      procedure transmitted as a formal parameter. + +
    4. The procedure's instruction of the form +

      + call X.proced1(params) + +
      placed in the body of a process module has an effect of communicating the calling process with the callee X. +
      Therefore such an instruction will be named an alien call of a procedure. We shall see later that the execution of an alien call needs a cooperation of both the calling and the callee processes. + +

    5. The operations in, is , qua, this +are not defined on processes. The user should not put them in the body of a process module. +

      Sorry, the compiler will not check it as an error!!! + +

    6. There is no dynamic type checking concerning objects of processes. +
      Again, the compiler does not warn you. Be careful! + +
    7. Each process has its own subsystem of coroutines. The instructions attach and detach can not transfer the control beyond the subsystem. + + +
    8. No process object can access the global variables declared in the MAIN process. This does not apply to the principal program=MAIN. Remark that MAIN is a process object too. + +
    +

    Allien call

    + + +

    Let Y be a process object. Let X be another process object. If a command of the following form + +

    call X.procedr1(actual_params) + +
    is to be executed in Y then we shall say of an allien call. +
    The called procedure, in this example procedr1, can be either: +

      +
    • - one of the procedures declared in the process X, or +
    • - one of procedures being formal parameters of X, or + +
    • - a procedure which is a formal parameter of another procedure called by alien call (this is a recursive definition). +
    +

    Y is said a calling process, X is the callee process. + + +

    Mask.

    + + +

    Each process has a predefined variable MASK associated with it. The value of the variable is a subset of the set of names of procedures and functions that are declared inside the process. + +The initial value of the MASK is the empty set . + +The instructions ENABLE and DISABLE can change the value of the MASK variable. + +

    +
    +		         MASK={q1, ... ,qn}
    +                                
    +                                
    +         enable p1,p2;          
    +		                      	disable p1, p2;
    +                                
    +                                
    +		MASK={q1, ... , qn, p1, p2}
    +
    +As you see from the above diagram an instruction 'enable' adds the names to the MASK. An instruction 'disable' deletes the names from the mask. + +There are two other instructions + RETURN ENABLE p1, ... , pn DISABLE q1, ... , qk; +and + ACCEPT p1, ... , pl; + +which modify the value of the mask. Their meaning is described below. + +The instruction RETURN ENABLE p1, ... , pn DISABLE q1, ... , qk; is legible in the body of a procedure or function only. The instruction ACCEPT can be put anywhere in a process module. + + + +

    +

    SEMANTICS

    + +

    Let us repeat: a process can be initialised, its initialisation phase terminates when the return statement is reached. It can be given a name, say p, and it remains passive. When another proces executes the command resume(p) then the process p is activated, its actions are executed in parallel with the actions of the other active processes. +Once activated it continues the execution of its commands. It may execute a stop command and become a passive process. Other processescan call for an allien call of a procedure (or function) declared in the process p. The permission to interrupt the execution of its own commands and to do a service for an external process will be granted iffthe process p is active and if the name of the called procedure is in MASK. +The process can change the value of the MASK variable by means of commands enable and disable. One can use also the commands accept and return disable ... enable... +

    +

    ACCEPT

    + +

    +The execution of the command accept p1, ... , pn is as follows: +1° the names p1, ... ,pn are added to the MASK +2° the process waits for an allien call of a procedure listed in the MASK. + +When an allien call is terminated the MASK is set to its previous value, i.e. to that before the ACCEPT was executed. This is a rule with an exception: see the return disable ... enable... command below. + + + +

    Execution of an allien call

    + + +
      +
      +
    1. 1. The calling process Y calls the callee process X and waits, +
    2. 2. If the callee process X is active and if it is before execution of its Loglan command C and if the name of the called procedure is in the value of MASK variable, (let us recall it is a set of names of procedures) then the callee X is interrupted and +
    3. 3. The calling process Y transmits the actual parameters of the called procedure to the process X and waits. +
    4. 4. The calllee X saves the MASK, next, the MASK is set to empty (it means that all further alien calls are to wait) +
      REMARK that the called procedure can change the value of MASK. +
    5. 5. The callee X executes the called procedure. +
    6. 6. When the execution of the procedure reaches its end then the output parameters of the procedure are transmitted to the calling process Y which receives them. +
    7. 7. The MASK is restored to its state before the call. +
      REMARK. If the execution of the called procedure ends with the command +
      return enable ... disable ...; +
    8. Then the restored MASK is subject to the modifications described by this command. +
    9. 8. Both processes resume their activities from before alien call +
      - the calling process passes to the instruction next to the alien call, +
      - the callee process executes the instruction C which was planned already to be executed. +
      +
    + + +The semantical phenomena +of parallel programming are different than those of sequential programming. + +Example 1 +Let us look what will happen if you execute the following program First. +First of all, you will remark that the strings are mixed. This is because + the commands write(a(i)) of the process w1 are executed in parallel with +the commands write(a(i)) of the another process w2. The screen receives +them interleaved and so the characters appear on the screen interleaved. + +Next, remark that the execution of a program is no longer determined +by its text and its data. Execute the following program twice and compare +the results. You will observe that the results displayed on the screen are +different. However there is no visible reason for this difference. + + +
    program First;
    +     unit writer: process(node:integer, nr:integer,s: string);
    +         var i: integer,
    +             A: arrayof char;
    +     begin
    +           return;
    +        a:=unpack(s);
    +           for i := lower(a) to upper(a)
    +           do
    +              write(a(i));
    +           od;
    +           writeln;
    +     end writer;
    + 
    +     var w1, w2: writer, i: integer;
    + 
    +begin
    +     w1:=new writer(0,1,"ici un texte tres long,
    +             		tres long, tres long tres long tres long tres long");
    +     w2:=new writer(0,2,"zdies otche'n dolgoj tiekst, otche'n dolgoj     	 	                 tiekst, otche'n dolgoj tiekst");
    +        resume(w1);
    +        resume(w2);
    +     writeln("give me a character");
    +     readln;
    +end First
    + 
    +We are going now to remede the interleaving the characters. +For this purpose we are going to construct a semaphore. +But what it is a semaphore? Well, it is a device that allows +a train to pass iff it is in a state permitting to pass and in +the same moment of the passage it changes its state to blocking one. +Therefore only one train is authoised to pass. In the state blocking +it accepts only the demand to liberate the semaphore i.e. the state of +the semaphore changes from blocking to free. By default, it is assumed +that it is only the train that passed who will execute the command: +liberate (when it leaves the station). + + + +
    program Second;
    +
    +  unit aSemaphore: process(node:integer);
    +     unit pass: procedure;
    +     end pass;
    +     unit free: procedure;
    +     end free;
    +  begin
    +     return;
    +     do
    +	  accept pass;
    +	  accept free;
    +     od
    +  end aSemaphore;
    +
    +  unit writer: process(node:integer, nr:integer,s: string, sem: aSemaphore);
    +    var i: integer,
    +        A: arrayof char;
    +  begin
    +     return;
    +     call sem.pass;
    +     a:=unpack(s);
    +     for i := lower(a) to upper(a)
    +     do
    +       write(a(i));
    +     od;
    +     writeln;
    +     call sem.free;
    +  end writer;
    + 
    +  var s: aSemaphore, w1, w2: writer, i: integer;
    + 
    +begin
    +  s := new aSemaphore(0);
    +  resume(s);
    +  w1:=new writer(0,1,"ici un texte tres long,
    +          		tres long, tres long tres long tres long tres long",s);
    +  w2:=new writer(0,2,"zdies otche'n dolgoj tiekst, otche'n dolgoj     	 	                     			tiekst, otche'n dolgoj tiekst", s);
    +  resume(w1);
    +  resume(w2);
    +  writeln("give me a character");
    +  readln;
    +end Second
    +
    + +Theorem +The texts shown on the screen will never be mixed. + +We can prove even stronger theorem that for any number of objects-processes of type writer defined as in the program Second they critical sections (here it means printing on the screen) will be executed in mutual exclusivity. + +Therefore with the use of semaphores one is able to assure +the mutual exclusivity of critical sections of given processes. + +A new question appears: is it true that semaphores garantee +the mutual exclusion? +The answer is no, as it can be seen from the Third program. + + + +
    program Third;
    +
    +  unit Semaphore: process(node:integer);
    +     unit pass: procedure;
    +     end pass;
    +     unit free: procedure;
    +     end free;
    +  begin
    +     return;
    +     do
    +	  accept pass;
    +	  accept free;
    +     od
    +  end Semaphore;
    +
    +  unit writer1: process(node:integer, nr:integer,s: string, sem: semaphore);
    +    var i: integer,
    +        A: arrayof char;
    +  begin
    +     return;
    +     call sem.pass;
    +     a:=unpack(s);
    +     for i := lower(a) to upper(a)
    +     do
    +       write(a(i));
    +     od;
    +     writeln;
    +     call sem.free;
    +  end writer1;
    +  unit writer2: process(node:integer, nr:integer,s: string, sem: semaphore);
    +    var i: integer,
    +        A: arrayof char;
    +  begin
    +     return;
    +     call sem.free;
    +     a:=unpack(s);
    +     for i := lower(a) to upper(a)
    +     do
    +       write(a(i));
    +     od;
    +     writeln;
    +     call sem.pass;
    +  end writer2;
    +  var s: semaphore, w1: writer1, w2: writer2, i: integer;
    +begin
    +  s := new semaphore(0);
    +  resume(s);
    +  w1:=new writer1(0,1,"ici un texte tres long,
    +          		tres long, tres long tres long tres long tres long",s);
    +  w2:=new writer2(0,2,"zdies otche'n dolgoj tiekst, otche'n dolgoj     	 	                     			tiekst, otche'n dolgoj tiekst", s);
    +  resume(w1);
    +  resume(w2);
    +  writeln("give me a character");
    +  readln;
    +end Third
    +
    +The example above reveals that one should use semaphores with rigour. +It may be the case that both processes use a semaphore but due +to an error their critical sections are executed in parallel causing +a chaos. + +In most cases it would be better to conceive the architecture of the +system of parallel processes as clients and servers. In the example +below we create one server: ecran for serving the resourc eof screen. +The processes are calling the process server asking for a service. +In this case it will be printing on the screen. + +
    program Fourth;
    +  unit ecran: process(node: integer);    (* it is a server *)
    +    unit print: procedure(s: string);
    +       var i: integer,
    +           A: arrayof char;
    +    begin
    +     a:=unpack(s);
    +     for i := lower(a) to upper(a)
    +     do
    +       write(a(i));
    +     od;
    +     writeln;
    +    end print;
    +  begin
    +    return;
    +    do accept print od             (* it offers just the print service *)
    +  end ecran;
    +
    +  unit writer: process(node:integer, nr:integer,s: string, ec:ecran); 
    +    (* it is a client *)
    +  begin
    +     return;
    +     call ec.print(s)
    +  end writer;
    + 
    +  var e: ecran, w1, w2: writer, i: integer;
    + 
    +begin
    +  e := new ecran(0);
    +  resume(e);
    +  w1:=new writer(0,1,"ici un texte tres long,
    +          		tres long, tres long tres long tres long tres long", e);
    +  w2:=new writer(0,2,"zdies otche'n dolgoj tiekst, otche'n dolgoj     	 	                 				tiekst, otche'n dolgoj tiekst", e);
    +  resume(w1);
    +  resume(w2);
    +  writeln("give me a character");
    +  readln;
    +end Fourth
    +
    +Theorem +The critical sections of printing the texts supplied by the processes w1 and w2 is done in mutual exclusion. + +============================================================================ +Example 5 + +In the example below we shall illustrate an asynchronous cooperation of processes. +The case we are going to discuss now is as follows: there are several processes " writers ". Any of writers may print a file on a designated printer. In order to increase the throughput and in order to avoid an intermixed printing we have spoolers - one for each printer. A printer prints files taking them out of a queue. + +
    program Five;
    + 
    +  unit writer1: process(node: integer, printer1: spooler);
    +
    +  begin
    +
    +  end writer1;
    +
    +  unit writer2: process(node: integer, printer1, printer2: spooler);
    +     (* this process may print on any of 2 printers *)
    +  end writer2
    +
    +  unit spooler: process(node: integer);
    +
    +    var Q: queue,
    +	  f: file,
    +     tick: integer;
    + 
    +    unit print: procedure(f: file, ticket: integer);
    +    begin
    +       call Q.insert(f);
    +       if Q.full then return disable print fi;
    +       tick := tick + 1;
    +       ticket := tick;
    +    end print;
    +
    +  begin (*spooler*)
    +    Q := new queue;
    +    return;
    +
    +     do
    +       disable print;
    +       if Q.empty then accept print fi;
    +       f := Q.out;
    +       enable print;
    +       (* printing the file *)
    +        ...
    +     od
    +   end spooler;
    +
    + var s1, s2: spooler,
    +     w1, w2: writer1,
    +     w3    : writer2;
    +begin
    +
    +   ...
    +   s1 := new spooler(0);
    +   resume(s1);
    +
    +   w1:= new writer1(0, s1);
    +   w2 := new writer1(0, s1);
    +   resume(s1);
    +   resume(s2);
    +
    +   
    +end Five
    +
    +What are the properties of the program Five? +Is it possible to obtain a mixture of texts coming from different files? +
    +
    + + +
    + + + + + +

    +ò +
    \ No newline at end of file diff --git a/HTML/progobi.htm b/HTML/progobi.htm new file mode 100644 index 0000000..dcc0bb9 --- /dev/null +++ b/HTML/progobi.htm @@ -0,0 +1,62 @@ + + + + + +Programowanie Obiktowe + + + + + + + +

    Programowanie Obiektowe

    + +

    1995/96 prof. Andrzej Salwicki

    + +

    wyklad i cwiczenia, III rok informatyki PB

    +
    + +

    +Spis Tresci +

    +
  • Cele: +
  • Streszczenie +
  • Program +
  • Metody pracy +
  • Pomoce dydaktyczne - Loglan'82 +
  • Notatki z wykladow +
  • Notatki z cwiczen +
  • Pytania egzaminacyjne +
  • +
    + +

    Cele:

    + +
      +
    1. pomoc sluchaczom w wyrobieniu sobie pogladu na obiekty, +
    2. opanowac narzedzia programowania obiektowego +
    + +

    Streszczenie

    + +

    Program

    + +

    Metody pracy

    + +

    Pomoce dydaktyczne - Loglan'82

    + +

    +Metody programowania obiektowego sa ilustrowane przykladami zrealizowanymi +w jezyku Loglan'82. Wybralismy Loglan z wielu powodow:
    +mozemy w nim zrealizowac +

    Notatki z wykladow

    + +

    Notatki z cwiczen

    + +

    Pytania egzaminacyjne

    + + + + diff --git a/HTML/quick.htm b/HTML/quick.htm new file mode 100644 index 0000000..c114ba9 --- /dev/null +++ b/HTML/quick.htm @@ -0,0 +1,391 @@ + + +Quick Reference Card + + + +

    LOGLAN'82

    +

    Quick Reference Card

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Syntax Form its (informal) meaning
    program < name>;
    <declarations>
    +begin
    <instructions>
    end
    Program is a module (=unit).
    It is the root of a tree of nested units.
    During an execution of a program this tree is used as a collection of patterns for instances . An instance of a unit is either an activation record of a procedure, a function, a block unit, or an object of a class, a coroutine, a process.
    DECLARATIONS
    there are five forms of a declaration var, const, unit, signal, handlers
    var x:T, y,z: U declaration of variables: x of type T, y,z of type U
    There exist units in several colours i.e. kinds procedure, class, coroutine, process, block, handler, function
    unit A: <kind>(<params>);
    + <declarations>
    +begin
    +<instructions>;
    end A;
    declaration of a module A.
    + + params is a list of formal parameters.
    +Remarks +- block has no name +- - its first line is: block or pref C block +- function has a type of result after parameters, +- handler has a different form, see below, +- lastwill instructions are executed exceptionally.
    const cc=82 declaration of a constant
    signal S;
    signal Alarm(x:T, y:Q);
    declaration of a signal S
    a signal may have a list of formal parameters
    handlers
    + when sig1, SIGN3: Inst; return
    +when sig2: instructions2; wind;
    +others instr2; terminate
    + end handlers
    declaration of a module which handles exceptions,
    +sig1, sig2, SIGN3 are names of exceptions or signals
    +Inst, instructions2, instr2 are sequences of instructions,
    + handler appears as the last declaration in a unit!!
    Parametrisation of Units
    modes of transmission of values of expressions are: input, output, inout
    procedure, function, type can be transmitted as parameter as well formal procedures and functions should be specified i.e. the types of arguments and results should be given.
    A formal type T alone is of limited use, however it may accompany other parameters using T.
    Processes are distributed, it means that they cannot share objects. You can transmit only values of simple types and names of processes or formal procedures to be used for alien calls. Processes can reside on different processors of your computer or network. Or several processes may share one processor (UNIX and DOS systems). This explains the reasons for the restrictions. The present implementation of processes has several limitations. Sorry.
    INSTRUCTIONS
    Atomic instructions
    x := <expression> assignment instruction
    x := copy(<expression) a copying assignment instruction, has sense only for object expressions
    call Aprocedure(params) procedure call instruction
    return leaving procedure or function
    exit or exit exit or exitexitexit ... leaving one, two or more nested loops do ...od
    new Aclass(params) instruction generating an object
    Objects
    x := new Aclass(params) creates an object of class Aclass with params and stores it under the name of x
    end Aclass
    also return
    terminating initialisation of a newly created object
    kill(x) deallocation instruction, causes x=none and kill x
    REMARK
    No dangling references!
    {x=y & x=z}=>kill(x){x=none & y=none & z =none}
    inner pseudoinstruction; it is a slot to put the instructions of an inheriting unit;
    Coroutines
    x := new Cor(params) creates a coroutine object x of type Cor, the coroutine-object x is passive
    attach(x) makes the current coroutine chain passive and activates coroutine x
    detach undoes the last attach
    You can combine coroutines and recursive procedures.
    +Coroutines enable quasi-parallel programming - of importance for SIMULATION and games.
    +
    Processes & Concurrency
    Loglan'82 offers truly object oriented processes and an object oriented communication mechanism alien call just by calling methods of a distant process
    process5 := new prcsTyp(...) creates an object-process of
    unit prcsTyp:process(<params>)
    resume(process5) activate a passive process process5
    stop the current process passivates
    enable hisProcedure process adds the name of hisProcedure to the MASK of the process, enabling other processes to communicate with the process by means of hisProcdure.
    disable aProcedure, aFunction deletes the names: aProcedure, aFunction from the MASK.
    accept aProc1, aProc2, AFun process waits (inactively) for another process calling a method.
    +accept makes possible rendez-vous of this process and another process calling a method from the MASK or the list aProc1, aProc2, aFun.
    return disable aProc1 enable aProc2 return from a rendez-vous reestablishes the MASK of the called process; it is possible to modify its MASK disabling some procedures and enabling others.
    call process5.hisProcedure(par)
    +

    this is ALIEN CALL

    The current process demands process5 process to execute hisProcedure with the par parameters transmitted and waits for the results, eventually gets outputs.
    +1) this instruction may meet with an accept instruction of process5 processs - in such a case there is a rendez-vous of two processes,
    +2) otherwise the call tents to interrupt the normal flow of execution of the called process.
    Exception handling
    raise aSignal A signal is raised. This lances the research of a module handler of the aSignal signal along the chain of DL links i.e. along dynamic fathers of instances.
    3 forms of terminating an exception handling are provided:
    return returns to after raise statement
    wind destructs several instances of units (cf.lastwill) but the instance containing the handler.
    terminate destructs several instances of units (cf.lastwill) and the instance containing the handler.
    Composed Instructions
    if Cond then I else J fi Cond is a Boolean expression, I,J are sequences of instructions,
    +(else J is optional )
    do I od looping instruction, it is suggested to put an exit instruction among the instructions I.
    while Cond do I odis equivalent to
    +do
    if Cond then I else exit fi
    od
    for i := A to B do I od i - an integer variable, A, B integer expressions, I a sequence of instructions
    case c
    + when c1: I1;
    + when c2: I2;
    + otherwise J
    +esac
    case instruction,
    +I, J are sequences of instructions,
    +c an integer expression, c1, c2 integer constants
    EXPRESSIONS
    Arithmetic expressions they are as you believe they should be
    Boolean expressions NOTE object relations in and is , e.g. if x in Class2
    Object expressions
    new T(actual_params)returns a new object of class (coroutine, process) T
    this T returns as a value the object of type T containing this expression
    E qua A qualifies the value of object expression E as of type A
    +Raises error if not E in A
    copy(E) returns a copy of the value of the object expression E
    Character expressions as usual
    String expressions no operations on strings

    INHERITANCE & NESTING

    2 fundamental methods of unit's composition
    Multi-level inheritance permits to make extensions of classes, coroutines, processes defined on different levels of the nesting structure of units. Multi-kind inheritance permits to inherit in a block, procedure, function, class, coroutine or process.
    Multiple inheritance is emulated by means of multi-level inheritance and other ingredients of Loglan'82 Generic modules are doable in various ways: by formal types, by multi-level inheritance combined with nesting, to say nothing about virtuals.
    +
    + + + +
    +
    +AS Last update Sat 4 Feb 1995 +
    + + +pp \ No newline at end of file diff --git a/HTML/quick.htm~ b/HTML/quick.htm~ new file mode 100644 index 0000000..44fb6c6 --- /dev/null +++ b/HTML/quick.htm~ @@ -0,0 +1,391 @@ + + +Quick Reference Card + + + +

    LOGLAN'82

    +

    Quick Reference Card

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Syntax Form its (informal) meaning
    program < name>;
    <declarations>
    +begin
    <instructions>
    end
    Program is a module (=unit).
    It is the root of a tree of nested units.
    During an execution of a program this tree is used as a collection of patterns for instances . An instance of a unit is either an activation record of a procedure, a function, a block unit, or an object of a class, a coroutine, a process.
    DECLARATIONS
    there are five forms of a declaration var, const, unit, signal, handlers
    var x:T, y,z: U declaration of variables: x of type T, y,z of type U
    There exist units in several colours i.e. kinds procedure, class, coroutine, process, block, handler, function
    unit A: <kind>(<params>);
    + <declarations>
    +begin
    +<instructions>;
    end A;
    declaration of a module A.
    + + params is a list of formal parameters.
    +Remarks +- block has no name +- - its first line is: block or pref C block +- function has a type of result after parameters, +- handler has a different form, see below, +- lastwill instructions are executed exceptionally.
    const cc=82 declaration of a constant
    signal S;
    signal Alarm(x:T, y:Q);
    declaration of a signal S
    a signal may have a list of formal parameters
    handlers
    + when sig1, SIGN3: Inst; return
    +when sig2: instructions2; wind;
    +others instr2; terminate
    + end handlers
    declaration of a module which handles exceptions,
    +sig1, sig2, SIGN3 are names of exceptions or signals
    +Inst, instructions2, instr2 are sequences of instructions,
    + handler appears as the last declaration in a unit!!
    Parametrisation of Units
    modes of transmission of values of expressions are: input, output, inout
    procedure, function, type can be transmitted as parameter as well formal procedures and functions should be specified i.e. the types of arguments and results should be given.
    A formal type T alone is of limited use, however it may accompany other parameters using T.
    Processes are distributed, it means that they cannot share objects. You can transmit only values of simple types and names of processes or formal procedures to be used for alien calls. Processes can reside on different processors of your computer or network. Or several processes may share one processor (UNIX and DOS systems). This explains the reasons for the restrictions. The present implementation of processes has several limitations. Sorry.
    INSTRUCTIONS
    Atomic instructions
    x := <expression> assignment instruction
    x := copy(<expression) a copying assignment instruction, has sense only for object expressions
    call Aprocedure(params) procedure call instruction
    return leaving procedure or function
    exit or exit exit or exitexitexit ... leaving one, two or more nested loops do ...od
    new Aclass(params) instruction generating an object
    Objects
    x := new Aclass(params) creates an object of class Aclass with params and stores it under the name of x
    end Aclass
    also return
    terminating initialisation of a newly created object
    kill(x) deallocation instruction, causes x=none and kill x
    REMARK
    No dangling references!
    {x=y & x=z}=>kill(x){x=none & y=none & z =none}
    inner pseudoinstruction; it is a slot to put the instructions of an inheriting unit;
    Coroutines
    x := new Cor(params) creates a coroutine object x of type Cor, the coroutine-object x is passive
    attach(x) makes the current coroutine chain passive and activates coroutine x
    detach undoes the last attach
    You can combine coroutines and recursive procedures.
    +Coroutines enable quasi-parallel programming - of importance for SIMULATION and games.
    +
    Processes & Concurrency
    Loglan'82 offers truly object oriented processes and an object oriented communication mechanism alien call just by calling methods of a distant process
    process5 := new prcsTyp(...) creates an object-process of
    unit prcsTyp:process(<params>)
    resume(process5) activate a passive process process5
    stop the current process passivates
    enable hisProcedure process adds the name of hisProcedure to the MASK of the process, enabling other processes to communicate with the process by means of hisProcdure.
    disable aProcedure, aFunction deletes the names: aProcedure, aFunction from the MASK.
    accept aProc1, aProc2, AFun process waits (inactively) for another process calling a method.
    +accept makes possible rendez-vous of this process and another process calling a method from the MASK or the list aProc1, aProc2, aFun.
    return disable aProc1 enable aProc2 return from a rendez-vous reestablishes the MASK of the called process; it is possible to modify its MASK disabling some procedures and enabling others.
    call process5.hisProcedure(par)
    +

    this is ALIEN CALL

    The current process demands process5 process to execute hisProcedure with the par parameters transmitted and waits for the results, eventually gets outputs.
    +1) this instruction may meet with an accept instruction of process5 processs - in such a case there is a rendez-vous of two processes,
    +2) otherwise the call tents to interrupt the normal flow of execution of the called process.
    Exception handling
    raise aSignal A signal is raised. This lances the research of a module handler of the aSignal signal along the chain of DL links i.e. along dynamic fathers of instances.
    3 forms of terminating an exception handling are provided:
    return returns to after raise statement
    wind destructs several instances of units (cf.lastwill) but the instance containing the handler.
    terminate destructs several instances of units (cf.lastwill) and the instance containing the handler.
    Composed Instructions
    if Cond then I else J fi Cond is a Boolean expression, I,J are sequences of instructions,
    +(else J is optional )
    do I od looping instruction, it is suggested to put an exit instruction among the instructions I.
    while Cond do I odis equivalent to
    +do
    if Cond then I else exit fi
    od
    for i := A to B do I od i - an integer variable, A, B integer expressions, I a sequence of instructions
    case c
    + when c1: I1;
    + when c2: I2;
    + otherwise J
    +esac
    case instruction,
    +I, J are sequences of instructions,
    +c an integer expression, c1, c2 integer constants
    EXPRESSIONS
    Arithmetic expressions they are as you believe they should be
    Boolean expressions NOTE object relations in and is , e.g. if x in Class2
    Object expressions
    new T(actual_params)returns a new object of class (coroutine, process) T
    this T returns as a value the object of type T containing this expression
    E qua A qualifies the value of object expression E as of type A
    +Raises error if not E in A
    copy(E) returns a copy of the value of the object expression E
    Character expressions as usual
    String expressions no operations on strings

    INHERITANCE & NESTING

    2 fundamental methods of unit's composition
    Multi-level inheritance permits to make extensions of classes, coroutines, processes defined on different levels of the nesting structure of units. Multi-kind inheritance permits to inherit in a block, procedure, function, class, coroutine or process.
    Multiple inheritance is emulated by means of multi-level inheritance and other ingredients of Loglan'82 Generic modules are doable in various ways: by formal types, by multi-level inheritance combined with nesting, to say nothing about virtuals.
    +
    + + + +
    +
    +AS Last update Sat 4 Feb 1995 +
    + + +pp \ No newline at end of file diff --git a/HTML/quickref.ps.Z b/HTML/quickref.ps.Z new file mode 100644 index 0000000000000000000000000000000000000000..a5bc51b07eedb90f9ac589d8eab89e6d0d585dc8 GIT binary patch literal 51935 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%0D4#NFo3QV|gc2!5B8C!VzT_tQ?kSUijm@E2sp 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 MG)IO!0o+{#0Mq$2Y5)KL literal 0 HcmV?d00001 diff --git a/HTML/quickref.txt b/HTML/quickref.txt new file mode 100644 index 0000000..d69f4ce --- /dev/null +++ b/HTML/quickref.txt @@ -0,0 +1,311 @@ +LOGLAN'82 +Quick Reference Card +Syntax Form + its meaning (informal) + + program ; + + begin + ; + end +Program is a unit. It is the root of a tree of units. +During an execution of the program this tree is +used as a collection of patterns for instances. An +instance of a unit is either an activation record (of +a procedure) or an object(of a class). + +Declarations + + +there are five forms of a declaration: + + + +var, const, unit, signal, handlers + + var x: T, y,z: U; +declaration of variables x of type T, y,z of type U + + unit A: B(params); + + begin + ; + last_will: + end A; + +evidently you need not to inherit from a module +declaration of a module A which inherits from B. +kind may be one of: procedure, class, coroutine, +process, block, handler, function +params is a list of formal parameters, +REMARKS +- block has no name + its first line is: block or pref C block +- function has a type of result after parameters, +- handler has a different form., see below, +- last_will instruction are executed exceptionally. + + const cc=80 +declaration of a constant + + signal S; + signal Alarm(x: T, y: Q); +declaration of a signal S +it may have a list of formal parameters + + + handlers + when sig1,SIGN3: Inst; return; + when sig2: instructions2; wind; + others in; terminate + end handlers +declaration of a module handling exceptions, +sig1, sig2, SIGN3 are names of exceptions, +Inst, instructions2,in are sequences of instructions + +handlers appear as the last declaration in a unit + + + + +Parametrisation of Units + + +modes of transmission: +input, output, inout values of expressions + +also procedure, function, type can be +transmitted as a parameter +formal procedures(functions) should be specified +i.e. the types of arguments and results should be +given. +a formal type T alone is of limited use, however it +may accompany other parameters using T. + +Processes are distributed it means that +they cannot share objects. You can +transmit only values of simple types and +names of processes or formal procedures +to be used for alien calls. +Processes can reside on different systems of your +network. This explains the reasons for the +restrictions. +The present implementation of processes has +several limitations. Sorry. + +Instructions + + +Atomic instructions + + + x := +assignment instruction + + x := copy () +copying assignment instruction, has sense only for +object expressions + + call Aprocedure(params) +procedure call instruction + + return +leaving procedure or function + + exit or exit exit or exit exit exit +leaving one, two or three nested loops do od + + new Aclass(params) +instruction generating an object + + Objects + + + x := new Aclass(params) +creates an object of class Aclass with params +and stores it under the name of x + + end Aclass or return +terminating initialisation of a newly created object + + kill(x) +deallocation instruction, causes{x=none}and kills x +REMARK. No dangling references! +{x=y&x=z} => kill(x) {x=none&y=none&z=none} + + inner +pseudoinstruction: a slot for the instructions of an +inheriting unit + + Coroutines + + + x := new Cor(params) +creates a coroutine object x of type Cor + + attach(x) +activates coroutine x, and then makes the current +coroutine chain passive + + detach +undoes the last attach + + Processes & Concurrency +truly object oriented processes and an objective com- +munication mechanism just by calling methods of a +distant process + + proces5:=new procesType(...); +creates an object of + unit procesType: process(); ... + + resume(proces5) +activate a passive process process5 + + stop +the current process passivates + + enable hisprocedure +adds the name hisprocedure to the MASK of the +process, enabling other processes to communicate +with the process by means of hisprocedure + + disable aProcedure,aFunction +deletes aProcedure,aFunction from the MASK + + accept aProc1, aProc2, aFnctn +process waits (inactively) for another process +calling a method; +accept makes possible rendez-vous of this process +and another process calling his method + + return disable aProc1 enable aQ +return from a rendez-vous reestablishes the MASK +of the called process; it is posible to modify its +MASK disabling some procedures and enabling +others + + call proces5.hisprocedure(par) + + * + + this is ALIEN CALL +the current process demands process5 process to +execute hisprocedure with the transmitted par +parameters and waits for the eventual outputs; +1 this instruction may meet with an accept +instruction of process5 process - in such case there +is a rendez-vous of two process, +2 otherwise the call tents to interrupt the normal +flow of execution of the called process5 process. + + + Exception handling + + + raise Asignal +Asignal is raised. This lances the research of a +module handling the signal along the chain of DL +links i.e. along dynamic fathers of instances. + + return +* returns to after raise statement + + wind +* 3 forms of terminating an exception handling + + terminate +* destructs (lastwill) several instances of units + + +Composed instructions + + + if * then I else J fi +* is a Boolean expression +I, J are sequences of instructions {else J is optional} + + do I od +looping instruction; it is suggested to put an exit +instruction among the instructions I, see below + + while * do I od +* is a Boolean expression +I a sequence of instructions +equivalent to +do + if * then I else exit fi +od + + for i:= A to B do I od +i integer variable, A, B integer expressions, +I a sequence of instructions + + case c + when c1: I; + otherwise J + esac +case instruction +I, J are sequences of instructions +c is an expression, c1 is a constant + + + +Expressions + + +Arithmetic expressions + + +Boolean expressions +remark in and is object relations, e.g. if x in Clas2 + +Object expressions + + + new T(actual_params) +create new object of class (coroutine, process) T +passing the actual_params list to it + + this T +returns as a value the object of type T containing +this expression + + E qua A +qualifies the value of E as of type A +Raises error if not E in A + + copy(E) +returns a copy of value of the object expression E + +Character expressions + + +String expressions +only constant strings! + + +Inheritance & Nesting * + +2 fundamental methods of unit's composition + +Multi-level inheritance permits to make +extensions of classes, coroutines, +processes defined on different level of +the nesting structure of units. +Multi-kind inheritance permits to inherit in a +block, procedure, function, class, coroutine or +process. + + +Multiple inheritance is doable by means +of multi-level inheritance and other +ingredients of Loglan. +Generic modules are doable in various ways: by +formal types, by multi-level inheritance combined +with nesting, to say nothing about virtuals. + + +Loglan'82 Quick Reference Card - 3 - December, 94 + + diff --git a/HTML/read_it.htm b/HTML/read_it.htm new file mode 100644 index 0000000..598566e --- /dev/null +++ b/HTML/read_it.htm @@ -0,0 +1,29 @@ +Read it first + + +

    Index of pub directory on infpc1.univ-pau.fr

    + +We are giving you access to several directories. + +
      + +

    • In Loglan82 directory you will find the Loglan'82 system: + its compilers, the documentation, the sources, its environment, the examples + +

    • In Algorithmic_Logic directory you will find some reports and papers in preliminary form. +You are bound by the Copyright. + +

    • In Lecture_Notes_Li1 directory we present a sample of lecture notes on the course Li& and other +material. This is our intelectual property and you are bound by the Copyright. + +

    • In Loglan'95 Research directory we put some material to inform you about our plans of research.Should you be +interested in the topics please contact us. +
    + +
    AS Last update Sun 5 Mar 1995
    + + + + +

    + diff --git a/HTML/signals.htm b/HTML/signals.htm new file mode 100644 index 0000000..3eb3329 --- /dev/null +++ b/HTML/signals.htm @@ -0,0 +1,525 @@ + + + + + +Signals + + + + + + + +

    Loglan'82 Programming Language
    +______________________________

    + +

    Signallling Exceptional Situations & Treatment of Exceptions +
    +

    + +

    1. MOTIVATIONS

    + +

    +Programs which we are constructing should be robust, i.e. +they should not fail even if the values of parameters(data) for +a procedure, function etc.are out of the domain of a procedure +in question. The minimal requirement would be: if the data do +not belong to the assumed domain of program then this information +should be displayed. However, in many cases the programmer is +able to react at errors which appear during the execution of a +program.
    +Sometimes she(he) is able to use the mechanisms build for the +use in unusual situations in a non-standard, elegant way (see +the example MAZE below). However we are not suggesting this to +turn into your style or "maniere" of writing programs. +

    +Another keyword applicable here is security. If we wish to construct +a secure program then we need appropriate tools to assure this +property.
    +What will be called an exceptional situation?
    +Example 1
    +
    Let us consider the data structure STACKS with operations +
    + +

      +
    • pop(s) +
    • push(e,s) +
    • top(s) +
    • empty(s) +
    + +

    +It will be an exceptional situation, if one will call pop for +an empty stack or will call push for a full stack. Obviously we +can require that the user never calls pop(s) when s in an empty +stack, but our program can be more flexible i.e. clever and we +can foresee eventual unproper usage of the partial operations +from our module.
    + +

    +Another example of exceptional situation arrive when one thinks +of getting an element of an array in such a way that the index +of the element is outside the limits of the array. Obviously we +can advise to replace any occurrency of a subscripted variable +A[i] by a guarded command like the following one +

    +   if lower(A)-1 < i and i < upper(A)+1 
    +   then 
    +       y := A[i]
    +   else
    +      (* put here your reaction for the array index error *)
    +   fi 
    + +
    + +

    +which replaces the instruction +

    +   y := A[i]
    +
    + +

    +.
    +The advice consequently applied throughout a program would make +it unreadable, thus opening the doors for numerous errors. A solution +lies in signalling an error or exception and propagating such +a signal to the nearest object or dynamic instance of a procedure +which contain a recipe (a handler) how to react. Some exceptional +situations are detected automatically by the Loglan system (see +the list of run-time errors) . Some exceptions may be signalled +trough the raise instruction.
    + +

    2. SYNTAX

    + +

    +Treatment of signals in Loglan is distributed onto different fragments +of a program. +

      +
    • (a) declaration of signal +
    • (b) handlers of exceptions +
    • (c) raise instruction +
    • (d) return, terminated, wind: the ways +to terminate handlers +
    • (e) lastwill +
    + +

    +In order to do with signals and exceptional situations one must: +
    + +

      +
    1. declare a signal,
      + +
    2. propagate the signal toward a handler,
      + +
    3. write one or more modules which will handle the signal,
      + +
    4. exit from a handler,
      + +
    5. the latter action may necessitate the execution of the lastwill +instructions for the instances of modules that may be killed by +such an exit.
      + +
    + +

    3. SEMANTICS

    + +

    (a) Signal declaration
    +

    + +

    +A signal declaration consists of keyword signal and the +list of names of signals we are going to use together with eventual +lists of formal parameters (the parameters of signals are not +obligatory however ), e.g.
    + +

    +signal empty_stack(s:stack),
    +        no_record(r:key),
    +        stackoverflow; 
    +
    + +

    +Declaration of signal(s)may appear anywhere in the declaration +part of a module.
    + +

    (b) Modules handling signals
    +

    + +

    +Let Ni be a name of a signal and Si a sequence of +instructions. We assume that names of signals are visible (declared). +Then we can write ( as the end part of the declaration part of +a module) the following definition of handling signals:
    + +

    +handlers
    +   when N1: S1;
    +when N2: S2;
    +   ..............
    +others Sn
    +end handlers
    +
    + +

    +The sequence of instructions Si is called a handler for the signal +Ni. The sequence Sn appearing after the clause others is +a universal handler for any signal which can be propagated into +an object of this module and which is not listed above. Si - can +contain any legal instructions and moreover instructions return, +wind, terminate which determine the way in which this handler +will be finished, and the place where the execution of program +will be continued.
    + +

    (c) Raising a signal
    +

    + +

    +An instruction raising a signal contains the keyword raise +and the name of a signal which we would like to be handled, the +list of actual parameters can be given if the signal was declared +with a list of formal parameters.
    +Example 2
    + raise
    found;
    +if x> size then raise too_much fi;
    +raise
    empty_stack(s)
    +
    +Meaning:
    +A signal can be raised during an execution of a program either +by run-time system (e.g. MEMERROR) or by program (cf. raise +instruction above) Suppose that a signal f has been raised in +an object M. For brevity, we shall use the name object also for +dynamic instances of blocks, functions, procedures. If M contains +a handler for f then this handler is executed. More precisely: +an instance H of this handler is created, the static father of +H is M, the dynamic father of H is the module in which the signal +was raised, in this case it is again M. Otherwise the search of +a handler for a signal is continued in the dynamic father of the +object M. One can also say that the signal has been propagated +to the dynamic father of the object. There are three modifications +to this scheme: 1. if M is an exception handler then signal is +propagated to the object in which M is declared 2. if M is a coroutine +or the whole program then the whole program is terminated' 3. +If M is a process then the process is terminated. When an object +containing a handler for the signal was found, the object of handler +is created. Its dynamic father is the object in which the signal +was raised, its static father is the object in which a declaration +of the handler was found.
    +Example 3
    + +

    +program three;
    +unit record : class;
    +var key : T;
    +  end record;
    +
    +  signal no_record(k:T);
    +unit search :  function(k:T): record;
    +var r:record;
    +handlers
    +        when eof_error: raise no_record(k);
    +end handlers;
    +   begin
    +      do         get(f,r);
    +  if equal(r.key,k) then  result:=r; exit fi;
    +od
    +   end search;
    +handlers
    +      when no_record : ...
    +end handlers;
    +begin    ...
    +    r:=search(k);
    +    ...
    +end three
    + +
    + +

    +In this example the signal no-record is raised when the system +raises the signal eof. Thus we reinterpret the eof signal and +adapt it to our aims.
    + +

    +Example 4
    + +

    +program exercise4;
    +   signal f;
    +   unit A: procedure;
    +   begin...
    +      raise f;
    +       ...
    +   end A;
    +
    +   unit B : procedure;
    +     handlers
    +         when f : ...
    +     end handlers;
    +   begin
    +     call A; 
    +      ...
    +     raise f;
    +   end B;
    +   handlers
    +       when f :...
    +   end handlers;
    +begin        (*main program *)
    +    ...
    +   raise f;
    +    ...
    +   call B;
    +    ...
    +   call A
    +end exercise4.
    + +
    + +

    +In this example one signal has two handlers. The signal f raised +in the main program or in procedure A will be served by the handler +declared in the main program module. The signal f raised in procedure +B either directly: by raise, or indirectly by raise +in the procedure A called from B will be served by the handler +declared in procedure B.
    +.
    +
    +
    +

    (d) How to end a service (handling) of a signal?
    +

    + +

    +When the handler finishes the service of a signal, the execution +continues in a module determined by the appropriate instruction +which should be: +

      +
    • return - then the execution is resumed in an object +where the instruction raise was executed, +
    • wind - then all objects we were searching for a handler +will be terminated (see lastwill) and the program continues +in the object containing the handler from the dynamic instance +in which it generated an object that later led to the signal raising, +
    • terminate - then all objects we were searching will +be terminated including also the object containing the handler, +the execution is continued in the dynamic father of the object +containing handler, +
    • call endrun - in order to halt the entire program. +
      + +
    + +

    (e) Lastwill
    +

    + +

    +When an object (or a dynamic instance of a block, procedure, function) +is terminated abnormally through the execution of wind +or terminate instructions, then the lastwill - a sequence +of instructions will be executed before such an object will be +terminated. The sequence of lastwill instructions must +be located at the end of a module and is announced by a +label lastwill:. A normal termination of an object will +never cause the execution of lastwill. Termination of a dynamic +instance of block, function, procedure causes its deallocation. +In the following example we shall demonstrate the usage of the +wind instruction in a handler. When executed it causes +that all objects - instances beginning from the module in which +a signal was raised and ending in the module containing the handler +are closed and terminated. The execution will be continued in +the object containing the handler from the point which caused +creation. In order to assure the smooth continuation the language +offers a possibility to define a lastwill instruction(s).
    + +

    +Example 5
    + +

    +program MAZE;
    + var  A : arrayof arrayof boolean,
    +      i,n : integer,
    +      there_is_a_path : boolean;
    + signal Found;
    + 
    + unit PATH :  procedure (i,j : integer);
    +      (* the procedure makes one move from(i,j) *)
    + begin
    +   if A(i,j)
    +   then  (* we can go through (i,j) field *)
    +      if i=n and j=n  then raise Found fi;
    +      if i< n then call PATH(i+1,j) fi;
    +      if j< n then call PATH(i,j+1) fi;
    +   fi;
    + last_will : write(i,j);
    +       (* the path will be printed in the reverse order *)
    + end PATH;
    +
    + handlers
    +        when Found : there _is_a_path :=true; wind
    + end handlers;
    +begin (**  main program **)
    +     .... (* create a maze A etc. *)
    +   call PATH(1,1);
    +   if there_is_a_path  then ...
    +     ...
    +end MAZE.
    + +
    + +

    +In this example we can observe how the programmer turned unusual +situation of a raised signal into the desired one: through lastwills +she got a simple program to print the path through the maze. +
    + +

    (f) Inheritance vs. signalling
    +

    + +

    +Handlers (modules handling signals) behave similarly to virtual +procedures, i.e. the new handler from the prefixed module replaces +the module from the prefixing module.
    +Example 6
    +
    +

    +unit STACKS:  class (type :telem);
    +  signal empty_stack(s:stack), stack_overflow(s:stack);
    +  unit stack : class (size:integer);
    +    hidden place, top;
    +    var place : arrayof taken,
    +        top: integer;
    +    unit pop: function:telem;
    +      handlers
    +       when conerror: raise empty_stack(this stack)
    +      end handlers;
    +    begin
    +     result :=place(top);
    +      (** here con_error signal can be raised by run_time_system **)
    +      top:=top-1
    +    end pop;
    +
    +    unit push : procedure (e:telem);
    +    begin
    +      if top> size 
    +      then
    +        raise stack_overflow(this stack)
    +      fi;
    +      top:=top+1;
    +      place(top):=e
    +    end push;
    +
    +    unit empty: function : boolean;
    +    begin
    +      result:=top< 1
    +    end empty;
    +
    +    unit increase : procedure (addition: integer);
    +      var i : integer,
    +          x : arrayof telem;
    +    begin
    +      array X dim (size+addition);
    +      size:=size+addition;
    +      for i:=1 to upper(place)
    +      do
    +        x(i):=place(i)
    +      od;
    +      kill(place);
    +      place:=X
    +    end increase.
    +
    +  begin
    +    array place dim(1:size);
    +  end stack;
    +  handlers
    +    when empty_stack: write("empty stack"); terminate;
    +    when stack_overflow: write("stack overflow"); terminate;  
    +    when conerror : write("error in stack increasing");
    +         call endrun;
    +  end handlers;
    +
    +end STACKS; 
    + +
    + +

    +Applications
    + Example 7
    +
    +

    +program APPLICATION_1;
    +  unit STACKS: ...
    +  unit element: ...
    +   ...
    +  pref STACKS(element) block
    +    var s1,s2 : stack
    +       ...
    +    handlers
    +      when stack_overflow : ...
    +      call s.increase(70);
    +      return;
    +    end handler;
    +  begin (***  block ***)
    +       ...
    +       s1:= new stack(c1);
    +       s2:= new stack(c2);
    +       ...
    +       call s1.push(e);
    +       ...
    +       y:=s2.pop;
    +       ...
    +  end (*block*);
    +
    +end APPLICATION_1
    + +
    + +

    +In this example the handler for stack_overflow from the prefixed +block overrides the handler given in the class STACKS.
    +
    +Example 8
    + +

    +program ReversePolishNotation;   (* Application 2 *)
    +  unit STACKS: class; ... end STACKS;
    +        ...
    +  unit element : class(sign:char);
    +  end element;
    +    ...
    +  pref STACKS(element) block;
    +      ...
    +    handlers
    +       when empty_stack: write("
    +            error in expression_to many ( closing brackets ");
    +       terminate;
    +    end handlers;
    +
    +  begin (*block *)
    +    while not eof
    +    do
    +      read(x);
    +      if x= ')' then 
    +         (* take operators from stack until ( is met *)
    +      else
    +          ....
    +      fi
    +    od
    +  end (*block*)
    +end ReversePolishNotation;
    + +
    + +

    +This example shows that there are situations in which the user +of a class STACKS knows how to handle the signal empty_stack and +solves the problem gracefully since in this case empty_stack means +that the data were not a well formed expression.


    + +
    +GMyAS +
    + +

    +Last update Wed 3 May 1995 + + + diff --git a/HTML/solate.htm b/HTML/solate.htm new file mode 100644 index 0000000..10bc386 --- /dev/null +++ b/HTML/solate.htm @@ -0,0 +1,41 @@ + + +Why I learn so late about Loglan? + + + + +

    Why I learned so late about Loglan'82?

    + +Do not worry. It is not your fault. It is not too late, neither. +As you can see we worked steadily, but slowly. Making the best use of our modest resources.
    +But now you can use it: +
      +

    • +in your classes,
      WE RECOMMEND IT warmly. You can verify it ... +

    • +If you are looking for a software vehicle for your nearest research project here it is. A good candidate +which will speed up the programming phase of your project. It is quite probable that your Loglan +experience will influence your project, as Loglan permits to elaborate your own view of the systems. +
    + +If you are looking for an interesting project do not hesitate and join us in our Loglan'95 project or in +Programmers_Assistant project. + + + + +
    + + + +
    + +
    +AS + last update 2 January 1995 +
    + + + + diff --git a/HTML/tablica3.htm b/HTML/tablica3.htm new file mode 100644 index 0000000..05455a1 --- /dev/null +++ b/HTML/tablica3.htm @@ -0,0 +1,314 @@ + + +Brief comparison of OO Languages + + + + + +

    A brief comparison of several object oriented languages

    +

    In the table below you will find a comparison of several languages with respect to the most important features and tools of programming.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Languages:
    ________
    ________
    Features
    ----v----
    S
    i
    m
    u
    l
    a
    6
    7
    o
    b
    j
    .
    P
    a
    s
    c
    a
    l
    s
    C
    +
    +
    M
    o
    d
    u
    l
    a
    3
    S
    m
    a
    l
    l
    t
    a
    l
    k
    E
    i
    f
    f
    e
    l
    A
    d
    a
    B
    e
    t
    a
    J
    a
    v
    a
    L
    o
    g
    l
    a
    n
    '
    8
    2
    Modularisation
    - nesting of modules + + - - - - + + - +
    - inheritance + + + + + + - + + +
    - - multilevel inheritance - - - - - - - + - +
    - - multiple inheritance - - + - + + - - +7) +1)
    -inherit in other modules2) - - - - - - - + - +
    - static binding of names + + - + - - + + - +
    Classes & Objects + + + + + + - + + +
    Coroutines + + - - - - + + - +
    Processes - - - + - - + + + +
    - alien call of methods 3) - - - - - - - - - +
    Signals & Exceptions - - - - - - + + ? +4)
    Safety
    - safe deallocation5) - - - - - - - ? - +
    - type checking + + - - - - + + +? +
    - protection of private + - - + - - + + + +
    Genericity & Polymorphism
    - types as formal param. - - - - - -+ -+ -+ -+ +
    - overloading of operators - ? + + ? + + + + -
    - virtual methods6) + - + ? + -+ - + + +
    + + + +
    +

    Footnotes

    + + +In Loglan'82:
    +
      +
    1. multiple inheritance may be obtained from multi-level inheritance and + coroutines, +
    2. it is possible to inherit a class in a procedure, a function, a process, a coroutine, a block, +
    3. alien call is a truly object oriented protocol of executing a method of + a callee process in cooperation between a calling and the callee processes, +
    4. exceptions are handled with continuations and lastwill actions, +
    5. i.e. absence of dangling references & possibility to deallocate no longer needed objects, +
    6. with virtual methods there is no need for overloading,
      +several languages admit only virtual methods, they do not admit usual methods +
    7. in Java there is no multiple inheritance of classes, quite reasonably +Java distinguishes between classes and interfaces. Multiple inheritance of interfaces is allowed. +
    +
    + + + +
    +
    +AS Last update Tue 12 Mar 1996 +
    + + + + + +ppp \ No newline at end of file diff --git a/HTML/tablica3.htm~ b/HTML/tablica3.htm~ new file mode 100644 index 0000000..8bdd21d --- /dev/null +++ b/HTML/tablica3.htm~ @@ -0,0 +1,314 @@ + + +Brief comparison of OO Languages + + + + + +

    A brief comparison of several object oriented languages

    +

    In the table below you will find a comparison of several languages with respect to the most important features and tools of programming.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Languages:
    ________
    ________
    Features
    ----v----
    S
    i
    m
    u
    l
    a
    6
    7
    o
    b
    j
    .
    P
    a
    s
    c
    a
    l
    s
    C
    +
    +
    M
    o
    d
    u
    l
    a
    3
    S
    m
    a
    l
    l
    t
    a
    l
    k
    E
    i
    f
    f
    e
    l
    A
    d
    a
    B
    e
    t
    a
    J
    a
    v
    a
    L
    o
    g
    l
    a
    n
    '
    8
    2
    Modularisation
    - nesting of modules + + - - - - + + - +
    - inheritance + + + + + + - + + +
    - - multilevel inheritance - - - - - - - + - +
    - - multiple inheritance - - + - + + - - +7) +1)
    -inherit in other modules2) - - - - - - - + - +
    - static binding of names + + - + - - + + - +
    Classes & Objects + + + + + + - + + +
    Coroutines + + - - - - + + - +
    Processes - - - + - - + + + +
    - alien call of methods 3) - - - - - - - - - +
    Signals & Exceptions - - - - - - + + ? +4)
    Safety
    - safe deallocation5) - - - - - - - ? - +
    - type checking + + - - - - + + +? +
    - protection of private + - - + - - + + + +
    Genericity & Polymorphism
    - types as formal param. - - - - - -+ -+ -+ -+ +
    - overloading of operators - ? + + ? + + + + -
    - virtual methods6) + - + ? + -+ - + + +
    + + + +
    +

    Footnotes

    + + +In Loglan'82:
    +
      +
    1. multiple inheritance may be obtained from multi-level inheritance and + coroutines, +
    2. it is possible to inherit a class in a procedure, a function, a process, a coroutine, a block, +
    3. alien call is a truly object oriented protocol of executing a method of + a callee process in cooperation between a calling and the callee processes, +
    4. exceptions are handled with continuations and lastwill actions, +
    5. i.e. absence of dangling references & possibility to deallocate no longer needed objects, +
    6. with virtual methods there is no need for overloading,
      +several languages admit only virtual methods, they do not admit usual methods +
    7. in Java there is no multiple inheritance of classes, quite reasonably +Java distinguishes between classes and interfaces. Multiple inheritance of interfaces is allowed. +
    +
    + + + +
    +
    +AS Last update Tue 12 Mar 1996 +
    + + + + + +ppp \ No newline at end of file diff --git a/HTML/tablica3.txt b/HTML/tablica3.txt new file mode 100644 index 0000000..6d9cf12 --- /dev/null +++ b/HTML/tablica3.txt @@ -0,0 +1,67 @@ + + A brief comparison of several object oriented languages + ======================================================= + + + + Languages -> S o C M S E A L + i b + o m i d o + m j + d a f a g + Comparison u . u l f l + of main features l P l l e a + | a a a t l n + | - s 3 a ' + V 6 c l 8 + 7 a k 2 + l + s + + + +Modularisation + nesting of modules + + - - - - + + + inheritance + + + + + + - + + - multilevel - - - - - - - + + inheritance + - multiple inh. - - + - + + - + 1) + inherit in other - - - - - - - + 2) + modules + static binding + + - + - - + + + of identifiers + +Classes & Objects + + + + + + - + + +Coroutines + - - + - - - + + +Processes - - - + - - + + + alien call - - - - - - - + 3) + of methods + +Signals & Exceptions - - - - - - + + 4) + +Safety +safe deallocation i.e. + no dangling - - - - - - - + + references + + type checking + + - - - - + + + protection of private + - - + - - + + + +Genericity&Polymorphism + types as formal - - - ? - -+ -+ + + parameters + overloading - - + + ? + + - + of operators + virtual methods + - + ? + + - + + +_______________________________________________________________________ + + +In Loglan'82: +1) - multiple inheritance may be obtained from multi-level inheritance and + coroutines, +2) - it is possible to inherit a class in a procedure, a function, a process, a coroutine, a block, +3) - alien call is a truly object oriented protocol of executing a method of + a callee process in cooperation between a calling and the callee processes, +4) - exceptions are handled with continuations and last will actions. + diff --git a/HTML/tarski/default1.hot b/HTML/tarski/default1.hot new file mode 100644 index 0000000..0410c7f --- /dev/null +++ b/HTML/tarski/default1.hot @@ -0,0 +1,79 @@ +[User Menu0] +Menu_Name=Starting Points +Menu_Type=TOPLEVEL +Item0=Starting Points Document,http://www.ncsa.uiuc.edu/SDG/Software/Mosaic/StartingPoints/NetworkStartingPoints.html +Item1=NCSA Mosaic Demo Document,http://www.ncsa.uiuc.edu/demoweb/demo.html +Item2=NCSA Mosaic's 'What's New' Page,http://www.ncsa.uiuc.edu/SDG/Software/Mosaic/Docs/whats-new.html +Item3=NCSA Mosaic Home Page,http://www.ncsa.uiuc.edu/SDG/Software/Mosaic/NCSAMosaicHome.html +Item4=Windows Mosaic home page,http://www.ncsa.uiuc.edu/SDG/Software/WinMosaic/HomePage.html +Item5=MENU,UserMenu1 +Item6=MENU,UserMenu2 +Item7=MENU,UserMenu3 +Item8=Finger Gateway,http://cs.indiana.edu/finger/gateway +Item9=Whois Gateway,gopher://sipb.mit.edu:70/1B%3aInternet%20whois%20servers +Item10=MENU,UserMenu4 +Item11=Archie Request Form,http://hoohoo.ncsa.uiuc.edu/archie.html + +[User Menu1] +Menu_Name=World Wide Web Info +Item0=Web Overview,http://www.w3.org/hypertext/WWW/LineMode/Defaults/default.html +Item1=Web Project,http://www.w3.org/hypertext/WWW/TheProject.html +Item2=Data Sources By Service,http://www.w3.org/hypertext/DataSources/ByAccess.html +Item3=Information By Subject,http://www.w3.org/hypertext/DataSources/bySubject/Overview.html +Item4=Web Servers Directory,http://www.w3.org/hypertext/DataSources/WWW/Servers.html +Item5=HTML Quick Reference,http://www.ncsa.uiuc.edu/General/Internet/WWW/HTMLQuickRef.html +Item6=Internet RFCs,http://www.cis.ohio-state.edu:80/hypertext/information/rfc.html + +[User Menu2] +Menu_Name=Home Pages +Item0=The University of Illinois at Urbana-Champaign,http://www.uiuc.edu +Item1=NCSA Home Page,http://www.ncsa.uiuc.edu/General/NCSAHome.html +Item2=CERN Home Page,http://info.cern.ch/ +Item3=UNC-Chapel Hill home page,http://sunsite.unc.edu +Item4=ANU Bioinformatics,http://life.anu.edu.au:80/ +Item5=Data Research Home Page,http://dranet.dra.com/ +Item6=British Columbia,http://www.cs.ubc.ca/ +Item7=BSDI Home Page,http://www.bsdi.com/ +Item8=Carnegie Mellon,http://www.cs.cmu.edu:8001/Web/FrontDoor.html +Item9=Cornell Law School,http://www.law.cornell.edu/lii.table.html +Item10=Cornell Theory Center,http://www.tc.cornell.edu:80/ctc.html +Item11=DESY Home Page,http://info.desy.de:80/ +Item12=ECE WWW Page,http://www.ece.uiuc.edu +Item13=Honolulu Home Page,http://www.hcc.hawaii.edu/ +Item14=Indiana Home Page,http://cs.indiana.edu/home-page.html +Item15=Lysator ACS Sweden,http://www.lysator.liu.se:80/ +Item16=National Center for Atmospheric Research,http://http.ucar.edu/metapage.html +Item17=Northwestern Home Page,http://www.acns.nwu.edu/ +Item18=CICA's WWW Server ,http://www.cica.indiana.edu +Item19=Ohio State Home Page,http://www.cis.ohio-state.edu:80/hypertext/information/information.html +Item20=SSC Home Page,http://www.ssc.gov/SSC.html + +[User Menu3] +Menu_Name=Gopher Servers +Item0=Gopherspace Overview,gopher://gopher.micro.umn.edu:70/11/Other%20Gopher%20and%20Information%20Servers +Item1=Veronica Search,gopher://veronica.scs.unr.edu:70/11/veronica +Item2=NCSA Gopher,gopher://gopher.ncsa.uiuc.edu:70/1 +Item3=PSC Gopher,gopher://gopher.psc.edu:70/1 +Item4=SDSC Gopher,gopher://gopher.sdsc.edu:70/1 +Item5=Original (UMN) Gopher,gopher://gopher.micro.umn.edu:70/1 +Item6=UIUC Gopher,gopher://gopher.uiuc.edu:70/1 +Item7=UIUC Weather Machine,gopher://wx.atmos.uiuc.edu:70/1 +Item8=SDSU Sounds,gopher://athena.sdsu.edu:71/11/sounds + +[User Menu4] +Menu_Name=Other Documents +Item0=Beginner's Guide to HTML,http://www.ncsa.uiuc.edu/demoweb/html-primer.html +Item1=InterNIC Info Source,gopher://is.internic.net:70/11/infosource +Item2=Internet Services List,http://slacvx.slac.stanford.edu:80/misc/internet-services.html +Item3=Internet Talk Radio,http://www.ncsa.uiuc.edu/radio/radio.html +Item4=Library of Congress Vatican Exhibit,http://www.ncsa.uiuc.edu/SDG/Experimental/vatican.exhibit/Vatican.exhibit.html +Item5=NCSA Access Magazine,http://www.ncsa.uiuc.edu/Pubs/access/accessDir.html +Item6=Doctor Fun,http://sunsite.unc.edu/Dave/drfun.html +Item7=Postmodern Culture,http://jefferson.village.virginia.edu/pmc/contents.all.html +Item8=Zippy The Pinhead,http://www.cis.ohio-state.edu:84/ +Item9=Britannica Online,http://www.eb.com/ +Item10=ANU Art History Exhibit,http://www.ncsa.uiuc.edu/SDG/Experimental/anu-art-history/home.html +Item11=Web/Net T-Shirts,http://sashimi.wwa.com/~notime/mdd/www_shirt.html +Item12=Census Information,gopher://bigcat.missouri.edu/11/reference/census/us/basictables/ +Item13=FTP Sites,http://hoohoo.ncsa.uiuc.edu:80/ftp-interface.html + diff --git a/HTML/tarski/ghostscr.htm b/HTML/tarski/ghostscr.htm new file mode 100644 index 0000000..1854bd8 --- /dev/null +++ b/HTML/tarski/ghostscr.htm @@ -0,0 +1,163 @@ + + + Ghostscript and GSview Information + + + +

    +Ghostscript, Ghostview & GSview Icon + Ghostscript and GSview

    + +

    "Copyright Software"

    +
    +

    Ghostscript v3.12

    +

    Copyright (C) 1989, 1992, 1993, 1994

    + This copy of Ghostscript is governed not by the GNU +License, but by a substantially different license in a similar spirit, the +Aladdin Ghostscript Free Public License; the file PUBLIC contains a copy of +this license. You can find this file in the gs312ini.zip file. +

    + +Aladdin Enterprises
    +P.O. box 60264
    +Palo Alto, CA 94306
    +voice (415)322-0103
    +fax (415)322-1734
    +ghost@aladdin.com
    +

    + +Ghostscript is software that provides: +

      +
    • An interpreter for the PostScript (TM) language, and +
    • A set of C procedures (the Ghostscript library) that implement +the graphics capabilities that appear as primitive operations in the +PostScript language. +
    +

    +More details are available from the + +Ghostscript, Ghostview and GSview home page. +


    + +

    GSview Icon + GSview v3.12

    +

    GSview is copyright by Russell Lang.

    +
    +GSview is distributed with the GSview Free Public Licence. +This licence is contained in the LICENCE file that is contained in the gsvw113b.zip file. +The GSview Free Public Licence does not require any payment to the author; +however the author would welcome any donations to cover costs and time +involved in developing and maintaining GSview. These may be sent to: + +

    +Russell Lang
    +12 Princetown Road
    +MOUNT WAVERLEY, VIC 3149
    +AUSTRALIA
    +
    +

    +GSview for Windows is a Graphical User Interface (GUI) for MS-Windows +Ghostscript. GSview is dependent on the Ghostscript. GSview allows selected +pages to be viewed or printed. Ghostscript 3.12 or later is required. +

    +More details are available from the + + Ghostscript, Ghostview and GSview home page. +


    + +

    Installing Ghostscript and GSview

    +
      + +
    1. Download the following files: +
      +
      + +gs312w32.zip (369,810) +
      Ghostscript for Win32s Systems +

      +

      + +gs312ini.zip (426,513) +
      Necessary files to support Ghostscript +

      +

      +gs312fn1.zip (1,365,916) +
      Font package number 1 +

      +

      +gs312fn2.zip (741,137) +
      Font package number 2 +

      +

      +gsview12.zip (570,034) +
      GSview - A Graphical User Interface for Ghostscript. +
      +

      +

    2. Download the files to the root directory. ie. c:\ +

      +

    3. Use the "pkunzip -d" command when you unzip the files. +

      +

    4. Unzip gs312ini.zip and gs312w32.zip. These files will create a subdirectory called "GS3.12". +

      +

    5. Move gs312f1.zip, gs312fn2.zip and gsvw113b.zip to the c:\gs3.12 directory. +

      +

    6. Unzip gs312fn1.zip and gs312fn2.zip. These files will a subdirectory called "FONTS" +

      +

    7. Unzip gsvw113b.zip. This file will create three subdirectories, ESPTOOLS, +GSGRAB & SRC, and put a couple files in the c:\gs3.12 directory. (This file +contains a Windows and an OS/2 version of GSview.) +

      +

    8. (Optional) Delete the following files from c:\gs3.12: gvpm.exe, +gvpm.hlp, gvpm.inf (the OS/2 version of GSview) and gsview.exe (the 16-bit +version of GSview) +

      +

    9. Create a program item (icon) within one of your program groups by +dragging and dropping gsview32.exe from File Manager into a Program Group. +

      +

    10. Start GSview then select "Options, Ghostscript Command", and enter the +correct executable path. Include path for Ghostscript and the path to the +directory that contains the fonts. For example: +

      +

      +
      C:\gs3.12\gswin32.exe -IC:\gs3.12;C:\gs3.12\fonts +
      + +

      +

    11. Read the PUBLIC, README, USE.DOC files (Ghostscript) and Readme.gv and LICENSE (GSView) for details about the products. +

      +

    +
    + +

    Mosaic Configuration:

    +
      +
    1. Open Options, Preferences..., Viewers +
    2. Edit or enter the following information: +
    + +
    +
    Associate Mime Type of: +
    application/postscript +
    Description of MIME Type (Optional): +
    Postscript File Format +

    +

    With this/these extensions: +
    .eps,.ai,.ps +

    +

    To This Application: +
    C:\gs3.12\gswin32 +
    + + +
    +
    +mosaic-w@ncsa.uiuc.edu
    + +National Center for Supercomputing Applications
    +University of Illinois at Urbana/Champaign
    +
    + + + + + + diff --git a/HTML/tarski/tarski1.htm b/HTML/tarski/tarski1.htm new file mode 100644 index 0000000..c2fc0b6 --- /dev/null +++ b/HTML/tarski/tarski1.htm @@ -0,0 +1,24 @@ + + + + + +Tarski's World: More Information (1) + + + + + + + +

    +[Back | Forward] +

    Tarski's World

    + +

    +Tarski's World is based on a simple premise: that languages +are best learned by using them. The program applies this premise +to the symbo + + + diff --git a/HTML/tarski/tarski10.gif b/HTML/tarski/tarski10.gif new file mode 100644 index 0000000000000000000000000000000000000000..4bdccdcfef926c6236e8d0b90a95d8e93ba6908b GIT binary patch literal 81478 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 b$&JVdJvN50DguTNWuBYkOBV?Ipw#~XYD;1+ literal 0 HcmV?d00001 diff --git a/HTML/tarski/tarski11.gif b/HTML/tarski/tarski11.gif new file mode 100644 index 0000000000000000000000000000000000000000..2fd9b9f2394153690e5af18d4a43f4b6a5138790 GIT binary patch literal 81478 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 literal 0 HcmV?d00001 diff --git a/HTML/tarski/tarski12.gif b/HTML/tarski/tarski12.gif new file mode 100644 index 0000000000000000000000000000000000000000..7e54089452db19a49ca11d734ff478ad7544f830 GIT binary patch literal 140270 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 literal 0 HcmV?d00001 diff --git a/HTML/tarski/tarski14.gif b/HTML/tarski/tarski14.gif new file mode 100644 index 0000000000000000000000000000000000000000..d29de1d7dbb24a71a273087cabe4b3fa594f58d7 GIT binary patch literal 110806 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 jV + + + + +Tarski's World: More Information (3e) + + + + + + + +

    +[Back] +

    +Here are the files Edgar's World and Edgar's Sentences: +

    + +

    +[Back] +

    + + + + diff --git a/HTML/tarski/tarski3e.url b/HTML/tarski/tarski3e.url new file mode 100644 index 0000000..03694df --- /dev/null +++ b/HTML/tarski/tarski3e.url @@ -0,0 +1,2 @@ +[URL] +URL= diff --git a/HTML/tarski/tarski5.gif b/HTML/tarski/tarski5.gif new file mode 100644 index 0000000000000000000000000000000000000000..346cd90c1b2cc30dfe6dd706c1b942dc8c8a590d GIT binary patch literal 5762 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 b$&JVdJvN50DguTNWuBYkOBV?Ipw#~XYD;1+ literal 0 HcmV?d00001 diff --git a/HTML/tarski/tarski7.gif b/HTML/tarski/tarski7.gif new file mode 100644 index 0000000000000000000000000000000000000000..2a94c25335309674c6db1f0bd783ea369b322ec6 GIT binary patch literal 227138 zcmeHQy^bWwaV|nKWXKR-;VhYVJAfX5I8TrvK*T-3?hGKvqX6D39R0=Z44@~t7Z4yq z{@`XDa(4+C;tS9?i=Mz~#cxJrRd#n}PyJ+dMQN)tGBPqU^84zm?jClZe(_Jg`1Y?l zJpSRYyYBCy{lA}e-G9URv+i%m|F{3nomhgzWOm+r^z4RmiI{~fgV&~|Si{@n}Ia|dhO zcW=Lc2V-~8e&7A;KmVqCxVh~f?rtFNuEXXl$aDXu>%M>cefRdux80xq^dErDQ}+ga z-@k=*A7B>{11o;jz3J}Yya(&y=BB%UzUw}~KJK6Iy9e0!)6F};3GjnL4lwU8P~i*W z^aN``?9&}!b^Fxa0e-iD9cH_QlK^^m57^&yw{U)-odJ4)>yL2W!Mr=b{Y$9t%eQYK z-wourfjvSC=RMd@cmkd;a6Un8Pq4WIv z=zt=E9w3Arzky1=f)=@a2R+2#1$xiWdx8A0&)W}>|EW7XJpl%AKLB`^0w=h;7dQtFN(e~-zwQO@)n~{D z_r%Q$v~V6E!QmO!hI|Le_X79K3yeR&*b|(1E8WAsU~2aQ?ae*hYfo_E-hr2&|NQ3w zz#Hh_z`gKg_p4w1WB2{Lw_W#lPzzmvM>Oev=(-<%_@VplZ-3kU@sEG(e){RB?%Qv_ z?Y{f&yYB0+zwUnd%U{xrFCZFjrS5B-*8LjJ@8pVo^n%L1g9h*2AK?5iIHA7of8qQI zPN;L>kZDv5q#T6nqMaI?Skq%h(0?5JL?F1|C-1oH4qidy*aZTIPuUUN?}BySWN^PD zvU^)a?jPSj^6}|Y=)Q-~HFuf&-_h|H++Q=*gS`d!14wq`2<~@7^h z19-05LEQiT_rHG(?ys8X(&mEu5-R)fCGOwD5%2T&LAvacxJTac6Mk^NJMQTZJN&2J z_}k8o*azMFgSr267yq{g0t?@FMeY}_A(mSQfx-V+9se8dIz+6n>fv*C#OwVE9IUnE zq5J5L&%ym#M69r`aR10RKybeT1*X{R$MUwj^?o z)HC_P{c1$4urP4X)D!u^{R$MUw&bD1zv!au;rJNbuSUcQ3&-pI3ZOT#r$d*M zaf5l?nX1WiM9&al?&-xI{=9Si^hm-=cq@zCVLfdm?eOm#e_#lht zVKvybM!TscL#IYtLV&nWf7Lz5J!as$Am!2@@M+7W2=c-W&KjQ1g(k*mOI^9JkA~SJ z^IVe#vkYmXB#NeoKn~C=xEJ1(2F?ptd{AQ}1Fr3vI+J5vnHYzMZ^4%7F2BW4sK(Re zxC{{>==>!?oX3jVF)|wv29OFJpq4vuMZ+5H_FNjREiGYH@rpdy&xl?)b*8rL<%w}E zBXIbPFZ1aHW*NPHv{J6Ej$^bxr7Lv6hz$A|b>S$U9Hf!b(*>-H)9}Dn=H!iz$P|sI zNpTq>aPZ83{CJFelY36SXfqLl3lQdb5Al5@Q!x_8a8OPd_8xUhf>bI-)1ih=x5O|^ zgEHcJGBuhK0(H7a0yFZN55A`KL_xYFH}hj%Z}|+~_BR6gZO|-AiH{e`z1$6<`@Jwd+-K;1 zh{;|&q5HisJ=|yLeu&9lJfZu&Fg@I7QTJ>7_B_`7^N^i+J)!$~@ohPKQTHtu9JNh` zK1Oj!sCj#=U`sGe-jW3K7X0YjXgeRTG z5fmnoWUJfd0aLu(WEo^c^F(_JfjZp-?0s|o3>vR_qCJ5?rS1{;ESs=_l;{ApsRJ|-UoZ=O(s4fYY6PWZql|Gm zhd{0Ffu#&z?D$i<?h8|oyGBxAVP+jqS{ku=WLdWq9KId`uhe}nTXeUCz%07o5&%1{HFUpU z@9NUvIwvUGdIC_g75rnXSd^{TYC+csO)_#pIsZTIl`^Kvz6m)P4LGejNlB zzRyDU3j^NJaz))YR9}=b9|EEK`LJz0bLhTxhUTj;bUz=qt!ED1x6aUf^@Z-|!?yLz zq5IYunyKE%F6#CZVL5ao=IZ~@Vb?a|IXhjXzR)b)69Q6o{)xEN^!(BvAJ%Y!;Y zLe(j`^Dgz&rESXO$_aBk0cT$)8E@Qgg3dKS+q z<642hYjuy{3k%AFbh!u_A2v9RXYiHNsIB*h%+n<>XEx2^dAYb&An;ntOy0^F6%!y{8hqyk*Wr!LL!xm0{)>F$4^7i;s zMN@J~zzfS22P7dIoPgrvQjNeXbZVeFpKV++-VfmM<8_HM`SxbE*X zbl*p0KmE}Cez@-MG<4rbWIz3)?$`PCd91qdZ5O&<81ROcE9$NZ`WN9`R*x$reokfw8)0w(-iArDDPo9Wan=jOGdA(vf~E+0d;A+dj|| zt2ek;v@UAvbYI|Je?+G(Gn7~nnp^{AVh^v{Qr8?Z$}v1fks7Wo46(^Eajit))w)*( zjRwaPlLHR)VZ+aUieM-Ex#*M%yBs4ExL24aE}kFPIs{&;djy{dFyf@kb;$Uz!D$pJ zS5CtooN8k-*IYJ~=JH~3twP|nx>sVfRo0lFM5qkAhG?UxUZ|AMUYWogr|4t^_f=%~ zf=B9J-fjXEn{; zBaGcSJ>*N2T11{gZW$vppD|pAJb932jCLFXBXxf)*^m>6WLiY&JhMlV@2btMTw!uy zzJ_8>vb}>BitBg;#_E22MuF8UinU>4nPX#aaI zHFUpU_CxnO=KkZy&mZlCkLvLTYA<&~=zcFu5BC|b_d`tf;tAdFh3VlwL-#{W_Tnk( zK7I+m4gw3`bfNo&0dHuzqV5~2FG`sYfzbVY*tVWIbl*Bd^VJu+pAXyCGl%Y5XK23q zLih7w+j{2Eed`R(S6}FUK5Sdh9J+6vq50}-MfdTof%!N-mU&&>JI0*}wdTEJ#fSe@ z2vq7`zBG@&#GymJMvq-_i3j=|D_02+rv&RXZ8gZUffdJG2vqAn(Vi*-=6d8|UtHFt zm}F=SwUSN;v5jM11S)k8#SF-2x|A$x;lf^}RlWwOgY2drnB2-fwVOHT#bB@5D|L_0 z>^>{hPfqP&3#a&Hk`A(4$8zk;-aICHQy@^Md!#VuUhV}|tB{TS@knBljC4r`PLLSh zj&?KW6g!O^eFW-sKja?r0ZT}fkcE_M*G9~8!8Ai-rLfec!G5*TpAv!B>Kj$^2q?{${GzGo)&>h-A}uCx+Ml_gZcp^(>q?N`{@gcjEf<# zuI?AxW-L@dAaq{b{}+qLld%2;I+zZR?ps_pLKDUwxtb`LJz0bLhTx zhUTj;bUz=qt!ED1x6aUf^@Z-|!?yLzlj~l;jCo|^h2eth$mDQOion#m$1ho)_@ZTD zxZs*}hmq_U0+Z|hH1}ABzcs{$#(R$y8~#ZVsMI|?pOGZ_l6|TKxl2Pjn0tg?i~}$n{~P${1%g5)8PVz8=XX{KIQ!Y`(T*jB|>cJEswx{SDZ%of}gR9 z4kT3?9H1^=BjxN*21` z6kU@R8@itq&P^o?-EWGnNsA5LPYUOzl7;R!Mc1UohVCbYb5qHd)_wmAotpyd%8FfB z_xO#>_*P~k_t4V1?{RPUfmw|pbNyx1>Rx_YrA*1U^0BKf#teEgCco#9VRT}!HV+U%!=UdUem3C6C?- z$~{xf+{gdN`#A|dk-J*=ee#p2MZ~t2Q#F{`n>!pr9|nspJ)0iZ+z3?bzM6Z~JyA@p zJ}1OS1MVi6d%Ka}AyB7#WNz?+PwI6k)ja0cacF&rw_Qk>vmsEg`>d4Gy`TXj$n+uJ z))djsi9nt1C$Gc^H*4}mB4HVUSL(i;G`yQYU}fEJ0;6j!GIW2f%%0y@=>9xL*BTMJ zzgA|??<;hF9;0iG2;E;Rv*-5}x<8N6wMK;Qua(*J`zq>wonN2Fs^{sNG$M3ADV&>1 zR@D8bb`Zs0ia_Z8QslNjFLb|s4lmt7=>AgVwm&a)zkLob-9hO7QslNjFLb|s4lmt7 z=>AgVwm&a)zkLob-9hO7QslNjZzbK^w{p$eKA0QZL8b2Hry1$@8S?#nBv43{2;J-u-E3naFa6MMO*-|YqTf>WX}=0>1W_x*BE)j4?s$KY0g9Da(o z`{|=UCjzy)pQsii+^mUGN1Cw+yi)gLmx;Ir5m-t04I;6>l0x_U<6L(fx>qFj*M{!* z$GPq}bgxM4uMOSrk8|B|=w6Z7UmLpLALqK`qVD6D@arI;q%72i?iT{O!DWiNZ?MiN zX?g@g_tRs#m5ibLtuQrxouT{bG2KeW(EV1Jn!e7^{q&e_C1dD*D@;vaXXt)f$+(p6?d!N^Z3Uxit+P`1^6mTdoqX&AnaF42R16wGzYhBLTH)N( zzUp*OJSUQ6qtI7c$;0F78ur+;DU`0W*h<|42ubq_2(xUA8rv8_J#}fTQ=?rIfjZq| zrA6-Ti7#wJ7(etK_Zq}^z?!>`wTa1(A3uMz6No*lkHvAxj!32?4_D0F}2 z1fSSm=>7yaS3XqK{W`xsk5w1G*FyIT1K!YbMcp@4Uz9Q*0-^i)ux&ka=)QG^=BqDs zKOeTOXAa%B&d_}Ih3@CWw)M=R`_>tnufEXzeAu?0IdtDTL-W-ax}Oi*)-yMtd;8+9 zS*^o%74_BY9>09=zkrW0FllyG66M?b*i9#Yp`RksB@JE$rd!!Wz3%(G<4%c0cjZ1i zz;@I+Q>J+j+Hov}K%MRfzq*k!i8K3|ZAKw8 zILg(a+n>_KV0~P`a2BDRhLs8l+i;l}DX0Oz^{a_|3(s-Hi?$F6v@eTJYJhZn=1KV#c}OBe5g;C@DC&!=9P`_TP)N*0S) znETNEV$7ajNVwP6sxrHCiz+T zZU!WQaCCD6CjY~}t^jIB^Z4t%1%|aK0**-`5$U57>QEP1LZ_R-0pRC<(pX=1;0fN`&nZF*e$TR`s#@!1Th6MPbnqtp|hMB`o@ z_o4eG$vv}{F{#`mcTA|rpIBsCjY&x>49h4t>8eXR?nCzqN&{`5dtn`Kgo328V4DFQ z2%-a{>5id!>E7W%$9?FYA!*{8m_+iF$-J_jH_gDP(YYPfU;&THWBdQ?8`)2uPuzQUMGnXG|=*T8G#_jd4q z4Z>NJfLCObyjckx$Kg0dPsxC>G&K#V14njx5FiZ8I0Se?{frC#u7^`R?^vMKD}_ka z7%Jn~%IQoS*Fni833k{JV1Uc$LopgXA+3OvRKMQ$xYsXvX{*&F9$_^{xHHX<78k|W zlw)tkV%xt!_sGQ&?i1I_m+k{vH05+=@=;cvhQm8P7TZ2^U#EL~wq)EWm%yzK=<^5S zBwT~2hrA-oKY1-9Pm5(LH) z#WDAFx@QipI?=dsYC~Y@RzTHY(t7wPz?gIy8d-{cbqI_lw#?jD{auf#cExeA$4XAT zx*1~Hke}@B;hgLDEVh52CrFRirZFGj?c%&EcP_U73v@pV^tNHM zW?88Hq>BMCh3?yjb5j)x_uS}>z@LGv*WVG2bBrG;do`jJ-D^G3%A4ad^-6vprn0~6 zO>;x{35r$>VT>EQdQ~4Iwd^l@dV2#9O~qu1xI>mA#?+9!xECJ-z&9O%<=YA1b;`Z`qsn7`jhTv|DDrYe7&D|>bJ@%Q-}5$(bVAl-JFb?gs1SRUUZ{X)y$6cz9D6BMl&i7{0> zQmeNB7MTJD6_-cKUdTg9FfFOHGSz@4^!ZL ze@fb2HjL#0TW9X8-sgMHwL-2}*;6m^sZME&O~yM$?D<%1{}yzG;DM-L{JjB?u>EUE`wnG*{q9n-zQ)ARC@DbX)AD%prefj z$ZeD-*;9`ITVlf(=pLugG_4Qy4M(C^{oK-4@IoQfP{YUD=zkWA3Xy z->11#8dkMgQ|8}LE&{+ku7&GFc{1Fd$}E??X&Q4M-`h!mtZxjtXOhw@ZGrqU%Vlrc zA*Wqm_o<*TgnNAA3+aT3W89enSDEFqHzCZ~L-z@g^$lbUY4NAH+(=$$ndP!K&1CLF z_X&{o4dosyVgBi9PwxQ8MV#ezy0-^zpzKWn%zfxS0kXa!YMsB3(Ea=vSFW%y_m9~D z_rqfASK_jV@Wrra-M{~xJ064kRd2E2epUEaU3>-Z-_rs57v0A%;nzW+{`Hog-SCkB zZyLVRy^DQ5kK9c>0iXFl(qY`MdhhRf@gqzfheSw6qWK?(lAXKq96S%X@9RE~i{4@g zT+BUJNQ|Oc!F}j{F?LTcbSd}rxX+&X&O$6QM(=3Jvzux!nvoqY&B>L>AKy$r#)ygp?j`EFUJ$6c|ikWpRI1l5M4Cc*|0{7<@SPC0APQ^m@h(Ui}Bo}9p z@p3w32DyjN_m7uxkJVDeDrM=48w+I9HRz)`axK)hQx~IB+B`8%Pj#{YLWo5f&23w!NXImG#lyS0Y~~L$PvRu6ltWAd%DkD zHmnK`=3Oe+4Pc8SG)^r$T(E|^jJr0=cqoMoB;%Q`h-n(&PJ&P;CPy-adwj9SXFeSD zulHPRUNZH}WfraMyWUP^?b#>;LfYyN9p^Ox$hSo5dPBIUS9|<}KD^?ef3N2gfXx;4 z>XQ3VLi>X*LvP59?9@C0NDe4tGlF}34LEWr_d-6t*{kOMNa|B=tH-QU@p~Fu43Wfr z&HMa4F|qt!SKuDVr;m7x=ze)bx3eNX+?P2J6MCNypYZY1{W8z|?J#lel?wMvedzw$ z>CX0-zrxUay=5Lcu}XUgbO-#r7svh(fcO4~_n+d}Ap+k7_d8^rx6Iu0w>dsN+Bf+= zWnb`UwbKS|t)i3FRUkLh{o{N58$TZJ+dy?>6^DZa;+rWj@ghEUK+nf$+I-MvQLIc! z-aHsHYMO1dLvnk%*KcmW-<0l^2IkCjPt3`Uz+BmF@kz|VEOubHi|A!?X*L4YqyD#c zK-m05=;_|L-^R_%RT5c974ju5+v3py8I`as(%mr>ty8eoQzlTB%?aOg&pWs>-SdOm zxDp1@EoR0UIcdx@Op$$WKU2#0X*0T~S9AE!>|B}dnF-{_pXo`UP7{fmN()VD1Hs72wQzg>m3S6HH%V zgN^k9239XHqwd7GT4>R*UciCgz}>DQS!5MiJmmT5+r0OlBll&Ir&vGV$0E<^9{=V) zKL7PE3|{~COJn{O+CM}01GK*|AK|e1mw$KnZ3jj8oK7e6+H8&a#}WR%Hh=oBznJZI zZ}$7W+1%ckPd@p?{3obxPaE_6>bcq9Y|S3Vcc8P~?agj;GMf{$W^YcL9mu!lW`ApT z(4L?@ns+ey+H64Y1-Jpxm`{&pcY89oyOX&-!M*E~`Tl6Yr!kxF!N%qm#^CdAXUsJW zzJr^$(1Ow}%-g{{@D8@Whx<2he`{Vqa}D-ypxr`iUV#4VBgAt9KDLm{#{B-be=@h5 zYtXqdS8v~%+nWvO-56{>1$)~U#=O0HYp$MOnYVARz}Kz$```Z?Fxr_HaPJ-Jfag!m z3v&aXEl9VUjoI#R%sa?qyWg5y$a}YW4LIGHJp^(B8~=bvkBHL_e1Y!n2C%x`nH#|G z8nCm#yoMaWDnti#F2f4#K0IW`c@#z}0ZjCtt7uVqD8vJaw(7prSA&wn<_JGA6 zFxx{8JHT%bVIJWF!{!K|Y`_`>qkx+^!us5UJy;8yBed{2fq~N=e1p9c*gL{nIl}#0 zxVM83E}<>t1yjut+RYZ$*bY9JJMi)G#~%X#FU&Q>cJ=mmFb?hW=jIQ8cxB%H?g|PB zVzPgLM-=UPFy`BDzct@|_nrCar=QHvKmTmL{`zb4=FJ=P*=L`bFTVJ~&iDkhVF{Vf zaGLoeeBSuK*vC<*vNzD++Wi(j{|g_8)BFuSKf?#&%?A858w{At)XAwK!5Jp=Xz^FD z0jyUi2ml|QM6!l~2p}Ja_38wHm5)w{@L{ZctbFu^Kwr_U^|A8N7Xp1nv)0GTM_&l^ z70p^7D<6F!&{s5TeXM-+g+O1?to5<-(H8=JMYGn&%12)a^cBroA1fbyA<$PeYkjPI z^o2lQ(X92c^3fLpeMPg@$I3@v2=o=rS|2MPeId|SG;4jVeDsAtU(u}fvGUOu0)0iZ z*2l_6UkLOS%~~HTAAKRvS2SyVtbFu^Kwr_U^|A8N7Xp1nv)0GTM_&l^70p^7XXfKB zUM-$hK3Y&})QQkXDNenMVp&@GC}T5xCqf>i%7o$D?(WJ*3rYcTCeXa5Wp9;RG*>gVoc{wkx_!#(zkOxUy?=-eJAxj#3XnX|3nc#q45|wclm-O5-9}My!(jr&dC1J7V zFJZ77J_6!V@R(l$7U#OvbE{s%iGC42BIHq07Ca5LrrWC50L!9$#3btxo}CXCOb|WL z_2@<_Ud&){98%;0t*b-BLRgj$9)*`gbOQirPTjA= z`%-!h3snTD<;r8{vRp|?uc|nfj~H3vNp`D#y?TdwF~cay!77YooQ ze-?WYa3)E#8~rw_)nOUWN8P5)Xt4;#5mI!^5D%h+UhNg_CEAU8RkaCxT!xTpCXu&* zHy0B88k1;MTTE{XAC1l%5o}Z|IOUL&oI@FdwU>>}NEpHKsbO7BaZ2d7a3|u={{f&AU}(!3Hr{ z;6jr%n9!(qCbf_Q6Id1%uT%MGOgiz-LX6_25Nu3gNG&E2C5F8wCWxdelld45(>jR} zMk)0k`jse2?~-aUizrcC*e(;>bUs)BF+e8ySeFTt62C8NEDsVXgi^aqXmj|WNQWaC zz8kV@Q)|;=OC{LX1ZORz!33dw4yVEa>&)PzwM5&}Y10~qG|SVA4Dul6TIonzY;9VV z3}*3Bu}x{U1=^<7=n~Ze;7p*9d^_3aM<4K#)+QU{X6EtHh)!FiZCbiZ26+&9nkBi- zXQK5HT$Yc7kwmTFb69I8A38c&B*QU~dYe|ux(ADG#@e)mF=Qj~AxdO|F-kqObNLXV z2CJFS7HX~)7CRR*>*_#mOj8@LCHdflwAmU)Y&IXm<^u#Rv2x749OiQ&xAoPRUw+9o zP|medjdm?&%+W#nl{`cST=LwsIB0A>AFzLrv7t6m;_;CT(-WMGBxDT*9W)B%#&ETZPk)c z{3{b#aBZR^Z-!ozmRBM|Xs5DmguUt6ugM>Rh0MRbu5O^cC_rnMGV)t2k0Ab;B z9X_1MHGnwYo)FFlw^lP{b(@tkLQ+235*+YXsE=0%Q4*rV(-m@bBlzI2up{H;z%$u- zb?$OL3NeXc*@=P6aoGc{S$wbr$_^Di0DPo_Q_{vq0Nc_LUztQ&g;02~Q5G|^jx*&5 zVf7*P5`Peyt=mB*d6RlzDdoeKhXBXAiwSUv>;r z@7?z=R%C662zCXZheKh~pz9L4ug2b;|A%J`i~L5FNw=wVG`) zhK^j;u{@GD*ic1cV%jN3%ru>nB_z}byX{0~N$@dp8+BMG1(F>fgKIyA#$t+tRuX)8 zHW(eAh-N%%e8&c`9r5gAFRv*Z>0{E$#WC_TMmhE-yGh?}XQj1Luf;aA#&TcSV|IvD+OuIQD0 zsP&O;SSg^wxa`=Z!xBOaF>0w3muxaFx-4jGl*)}OIh|M^{9cej36Xbn#8px(kT5Y7 z&>Il)Kk>>kYvZE~0OJEev%sMfd4i;Prh)Q4q#fwMp87PR0)+4zYNj6+@YFdpb& z8!3yMvCl>m(Gn8b07*fn#Zpm+@e$YnF3=58V#Oq|fo}4Rf~6ymx)>0%9CRcdfscs1 z=fe -5Q)(EW>S8F1y;EiS}2UgH=oRFq$gOVH;y`m1|!$k*F;Qm52;z$yK3&VMb zpLdYH<0CgvjEGtEI&Njtb_J~`!f9G1d!VzKi3mFOyFjADmI$WFE*TK|^d6ZGD_K4& zWoby>qh3*m@nI{1*udhj|Fc1hz{zH*m4uY|D5MtGe2^R+xb=mLySAxS_yA|H@8|m{ zx5ERHD}ZSgab!B&5FeI1skjq6kq^Y2v4J&$l`@kLPlrNiz*`70GAlv;fsV+CwB`tj zU$Q4AydC+VN_ES18P<}Iut9=0Q{r=lED~ZJu2ixU`Jie*2H3|EA_3rb6*+%G2OBIb zFE-|8e{u*b8!N;{#Qoab;=gAod?S(&0#;H(0V78T?N{PCEa=z(@~rF#53V3fJ5ed} z0hmiBs6OyUoX{X~LR{K~`K6$^k2@qJ?)%v<4yeoQSSbCz#?2h=>U@wLPeO0Z-{7^m0DJtwbnA#nqC1-x16eihS^WCgnq2ClC%| z?fHoNBd?H_kZ0&HKCmA6PKEViud#f<*+~nU3`qQ9FNs{+YN9b~RJ9n)I4IR~AL=87 zMaM_JjY4RVj_?S<)?;uLlgOkQI*boT2V-OgAMu?D@yh~^11xllgR<3d7zxN|z)9YW zhf?qnb{B;Y&5S&-@S#p-z#>kkhkk=jL51;QcO~@AJ|H5RLx_eTn83eM&|YDgYK)8X z!M7U02L=QeGvGup6LuQ5(ZE` z6&qCO;USqS_^^be^??)e^_Z9`b{isdDh^A6(edH8nh0ZQy8`!M#hM_*-P@xKy!KU~ zGsE41wT!xklnP+W$21i)!3RVi*qr8g!pxoH_?w>K)mZ^!AF9-jl}B7v=lP~Ln8V- zL_5OQb|56$jD+OiL@hWUI2{U*ZgJo~>Soc;SkVT;B>8Y21pt&$AsIZfNQGNYWL-t_ zfrLN+{sWD-L2Y8Pt;@sKXWWUc#uLJP@_h!w(=R}hRfo2)B~I*TELJ6!4`#^o!IL0a z55tY>Xp0%DO2P+Y16T>uqZEcl2&!W-Up~_yArf}J&y=6n!~;}~4`hSt!~NJxFv~Z2 z$A^e^`sx>ER9I3z+zg4vob%k;Q$35=d$L&Ukm$wx{~m$!pqSSes=di zzx!yp9gUA=2vJed`4Ct^C(SCoU+b%``6P}2t?blk)rj2r9gz8xF}n3^$og=cBqxYU z$Ajminn3joMHE#++;aDSxfvZvG!ocIHY{HxaG2B%EHx4gFd*EpwuWcM-H(sF5JwQ;^Ij9Csn!C z*hy6wqM1T@h~g;Khu^vEfu*Ne4MbTzB46xiMm!(7*Cj`@Xp#X|AX<62P_zt0kidsK z_Tev>5%;jew<;^kvPgT`{4hX~D7f39!y(B}>5`3L6oj+$p~RsMHSv)hA=$qHiF6<% zJX4f2I?@NMl#uXZQpP>?L47q#G5Aa&#Pjj2a*>nqt%zW#6A3A8HRznDfZwtBmq!*C zXt)w#V@}N3&>paIN|1}pSU!@d4CU(X4e^l}OS;dJ{)lcpEU&?K8g;AjJ|hnHD=*In z|9(Ddh%hxa+W1Jm;&N6CUZTr-;(hb+a(Jr=i3T7_e25wf`;1OUeZRtT3BI`y;^2c! ze(-$Q1l(4GyC+LciXI3-NBB2#0e>&h)B+t%e2@*1CE`~BVGDf9W zUnZ#r9c79!_WW+?pyLB}Ev~IWRUjlkEwT}AnaP?HcDv#E>e(VBXNQQnsU|lMIDukrVEbnW3K(#(D$VYJ%01`w;U_?IKDp=_SlEa^l zC``B^@}Vso7|ZcbM=E?2>H|?JB2x@D+(?6{_i4WxI79HKr}$eSmPq>YM_`3Gw3iR0 zD1|@mGXn+SnFbeI66N|%uGdG8eBd{^{I@{mr`bH!Nd>|=$W0E7%;uw1A3#WN^?^Tf zv+p0>7hV#a)&fcEA?Zt_V|ugs0MzsU4tCdg5PZlJM0*R-DkQ-_>5d^F(VfjlPKF)9 zQ>RBhc!AJ2EPQw2vWIFk9|^>xy0iIEsspL$k`L`SZuow_2AD!fQV_CRvo~~qHXl9K z2Vdk|mInxx#}GX3UQUQ4K=$hP1~lq?yi~TGhUcpb?pH$#o}K8Hj{#`ntx9&RcHH<>MipABYG4K3MrFP=_ol5W#@x=my$H=koEu z>VtlEvfl`|qm&XNDBzuTlLgJWd_1)JurMGS1w0DFjf50tj~JfI$Ahbn5!f)*2gApM ztPcistC$eN_oyhh8XM4C>tg^MeoGP(Ibaf3pDH)-kw5VE_x{1YZqLJ=ijA1}K=|n7 z{5U@!@}FU`stBT>Z)#_DeW;FSet%UDD%I$K4;6^fgK1)UU-^NM?^pJ_L&Tqdpfl(D z-8_ie$UX2O3M3Ro5Jn@fPpBpO@@0(=_iZj`!^)434^Bv+AqYCWqeqwELt_L2nSQX= zgGx2-qdo@t7!7=3LYi3Kuh&Px^rPd05faM63k3+q59j!&BP$;P)%eW2@{ukR*}s?l zihuDg2?>nN7Gzq``(=6!)CWgFktYY21yvp3-Y2_lm>4QV@X;`_RV76~@0a;#^)Xtn z3V){XX!tnf1f(PRx$NIRM&sN%A%nX*!1!o&GEI*PgxAM3ONCh}`gy;|2aidU3m)sk zRroW7d*g$iu~@$Ke8y>l@mpF`@By`f|HX^EJq11}*UPq?4@U>* z1DLVlJz74nK-}`XEDgas*2rm#D*7ShIaUozYcLE{z1j+R5mJg8gq1A`; zI49yV?!`Mq$nxoSZ&C0;CrGRhAO9Ra8h)0^i1CDUkKXbDNUeE1{XZ&(3`nS4woB=~2(x70DM^;bG}a$i1LCEH`WdzpzvYqgYLU_nfj16*Pe!e z#z$TcD<2wm=NMD@$l%Wg&JoIL6A)1O$dFn2$RIh>z{v zpEG%1&87%=KGNZ}e<1`MAE))|1_5Kt>96b62?DM@zWHIjxN zv_|4R9O~;LJ{)0CAO2W-|4kS5L3}tIBM-y}wE!wHgrb*`!60KN>A^s8pBBzFv(ttY119vDty?99sMCbx~~u1WF(%vkBC|Y3oXCHWjWufUZ@O; zZix>YT#xnPP$pCnbdq^1=n%V-)RH})bWaWO(Q$on3~@seeP1&)?4Z>&B(JDpui`?z z&<*0lhu7ozVX<>%VK*hmiNn{{3&ifnd={LKpm9PXgDv92&*-KhK02?D8eS4!!H1Y? z`G65>`+vTQ?}H+d3w5w8B-VN$QfCAoy1C1Zru9LugYVy8cIn&~A{RO)if)OI`^tay kGmOB>$1pzkeV6zM$HppL6amkNJvY}sJs|M^@cZCD0k+DZRsaA1 literal 0 HcmV?d00001 diff --git a/HTML/tarski/tarski9.gif b/HTML/tarski/tarski9.gif new file mode 100644 index 0000000000000000000000000000000000000000..fa8b086db4edc08bce815b05822616fd216fc540 GIT binary patch literal 90994 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

    vrrIq+_{F+}px{+ov+@pUva)iF1+e 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 kQ*GUwvv=|PuHXYc@6Ypnd&y_e + + + + + + + + + + +

    LOGLAN'82
    +

    + +

    USER'S GUIDE

    + +

    Institute of Informatics University of Warsaw January 1988 +

    + +
    revised October 1994 24/11/94 08:33 LITA Université +de Pau
    +
    + +

    TABLE of CONTENTS

    + +

    +PREFACE 3 1. +

    +USING LOGLAN-82 SYSTEM 3 1.1. +

    +COMPILATION 3 1.2. +

    +COMPILER SWITCHES 4 1.3. +

    +CODE GENERATION 4 1.4. +

    +PROGRAM execution 5 1.5. +

    +COMPILE TIME ERRORS 6 1.6. +

    +RUN-TIME ERRORS 6 2. +

    +COMPILER OPTIONS 7 2.1. +

    +OPTION FORMAT 7 2.2. +

    +OPTIONS LIST 7 2.3. +

    +FRAGMENTATION 8 3. +

    +CURRENT LOGLAN-82 IMPLEMENTATION SPECIFICATION 9 3.1. IMPLEMENTED +SUBSET OF LOGLAN 9 3.2. PREDEFINED LANGUAGE ELEMENTS 9 3.3. FILE +SYSTEM 9 3.4. FILE VARIABLES 9 3.4.1. FILE GENERATION 10 3.5. +FILE DEALLOCATION 10 3.6. GENERAL FILE OPERATIONS 10 3.7. TEXT +FILES 11 3.8. BINARY SEQUENTIAL FILES 11 3.9. DIRECT ACCESS BINARY +FILES 11 3.10. CONCURRENCY 12 3.10.1 INVOKING THE LOGLAN INTERPRETER +FOR CONCURRENT ROGRAMS 12 3.10.2 RESTRICTIONS AND DIFFERENCES +FROM THE REPORT 13 3.10.3 COMMUNICATION MECHANISM 14 3.11 SYSTEM +SIGNALS 16 3.12. IMPLEMENTATION RESTRICTIONS 16 4. APPENDIX A +: PREDEFINED CONSTANTS 17 5. APPENDIX B : PREDEFINED CLASSES 17 +5.1. MOUSE 19 6. APPENDIX ) : PREDEFINED PROCEDURES AND FUNCTIONS +21 7. APPENDIX D : ERROR CODES 23 8. APPENDIX E : LOGLAN RUNTIME +ERRORS 35 9. APPENDIX F : CHARACTER SET 37 10. BIBLIOGRAPHY 38 +10.0.1. LOGLAN'82 38 10.0.2. Algorithmic Logic 41 10.0.3. Related +literature 42 +

    PREFACE

    + +

    +This document provides information necessary to compile and execute +Loglan programs. +

    +This manual assumes basic knowledge of Loglan-82 language, described +in "Report on the Loglan Programming Language" (see +Bibliography). to ToC +

    1. USING LOGLAN-82 SYSTEM

    + +

    +The following three steps are required to execute a Loglan program: +

      +
    • Compilation (to intermediate code), +
    • Generation of the interpreted code (from intermediate code), +
    • Interpretation (i.e. execution of program). +
    + +

    +Compilation is accomplished by invoking Loglan compiler. This +step creates two destination files: the intermediate code file(.lcd) +and the listing file(.lst). The intermediate code file is the +input file for the second step: generation of the code accepted +by interpreter. In this step two files containing object code(.pcd +& .ccd) are produced. They are the input files for the third +step: interpretation. This step is equivalent to execution of +a program. to ToC +

    1.1. COMPILATION

    + +

    +To invoke the Loglan compiler without specifying any command line +parameters, type: +

    +LOGLAN +

    +Then the prompt appears on your terminal: +

    +File name: +

    +and the compiler waits for file specification.The default extension +is LOG. +

    +The compiler will produce (optionally) listing file with the same +file name and the extension LST and will produce, if no error +occurs, the code file with the extension LCD. Destination files +will be stored on the same drive and directory as the source file. +
    + +

    +Examples: +

    +$ LOGLAN +

    +File name: PROGRAM < ENTER>
    +
    + +

    +Loglan compiler compiles program from PROGRAM.LOG file and creates +PROGRAM.LCD. +

    +$ LOGLAN A:PROGRAM.DAT
    +
    + +

    +In this case the source file is A:PROGRAM.DAT. The file PROGRAM.LCD +will be created on drive A. +

    +$ LOGLAN /home/vous/PROGRAM2
    +
    + +

    +If any error occurs, the code file is not produced. At the end +of compilation the following message is printed: +

    +< number of errors> error(s) detected +

    1.2. COMPILER SWITCHES

    + +

    +There are two possibilities to specify compiler's options: by +compiler switches (i.e. external options) or by comments in the +source program (see chapter 2.). You may enter the compiler switches +in command line after file name in the following format: +

    +where swi consists of character that designates the name of the +option and either '+' or '-'. +

    +Examples: +

    +$ LOGLAN PROGRAM L- T+ +

    +$ LOGLAN PROGRAM The KBD directive +

    +In this case the default switches values are assumed. +

    +Scope of the switch is the entire program. All switches ,except +H, correspond to options. A switch has greater priority then options: +when you specify switch, all corresponding options inside source +program will be ignored. Full description of each option is given +in chapter 2.2. Switch L has additional significance. When this +switch is set off no listing file is produced. +

    1.3. CODE GENERATION

    + +

    +In this step information from the intermediate code file is read +and two destination files containing the code are produced. No +switch is permitted for this step. To generate code files, type: +

    +GEN < file name> +

    + (or HGEN The KBD directive < file +name> , if the switch H+ was specified for the compiler.(DOS/AT +only)) +

    +You type file name without extension (extension is ignored). +

    +Examples: +

    +$ GEN +

    +FILE_NAME: PROGRAM +

    +Information is read from file PROGRAM.LCD from default drive and +directory. Two destination files are produced: PROGRAM.CCD and +PROGRAM.PCD and stored in the same directory as the input file. +

    +$ GEN /home/vous/PROGRAM2 +

    +Files PROGRAM.CCD and PROGRAM.PCD are stored on drive A. +

    1.4. PROGRAM execution

    + +

    +To interprete (execute) the Loglan program you must invoke the +interpreter INT or HINT (if tNe switch H+ was specified). File +name must be specified in command line. The file extension is +ignored. The interpreter reads input files with the given name +and extensions CCD and PCD and executes the Loglan program. +

    +The syntax for calling the interpreter is +

    +INT < options> < file name> +

    +or +

    +HINT < options> < file name> (DOS/AT only) +

    +The following options are supported: +

    +/m < n > set memory size for Loglan program (in 16 bit words +for small and 32 bit words for huge memory). For concurrent programs +it means memory size for every process. +

    +/i information about garbage collection-compactification is printed. +

    +/r < n > used to invoke interpreter on nodes different from +console (see 3.4.). option parameter is console node number (as +defined by D-Link Network). +

    +/d causes trace to be printed to the file with .TRD extension +provided that the option or switch D+ was used during compiling. +

    +At the end of interpretation the following message is printed: +

    +End of LOGLAN-82 program execution +

    +Examples: +

    +$ LOGLAN \DAT\EXAMP.SRC, L+ +

    +The file \DAT\EXAMP.LCD and \DAT\EXAMP.LST are generated. +

    +$ GEN \DAT\EXAMP +

    +The files \DAT\EXAMP.CCD and \DAT\EXAMP.PCD are created. +

    +Then the program can be interpreted by:
    + +

    +$ INT \DAT\EXAMP +

    1.5. COMPILE TIME ERRORS

    + +

    +The errors detected during the compilation are printed on the +listing file, if this file is created. In the scope of option +L- or if the switch L is set off only the incorrect lines and +errors messages are printed . When the switch ( not option !) +L is set off then listing file is not produced and incorrect lines +and error messages are printed on the user's terminal. +

    +Error message has the following format: +

    +*** ln ERROR en txt id
    +
    +

    +where: +

    +ln - index of incorrect line, +

    +en - error's number (see Appendix B), +

    +txt- text that explain type of the error, +

    +id - identifier helpful to situate the error. +

    +Error messages are printed in the source listing after incorrect +lines. +

    +For syntax errors (numbered 101-147, 201-212), sign '?' indicates +the error's position in the line. +

    +Error may be detected beyond the line containing it. +

    +Identifier helpful to find an error is printed as soon as possible. +

    +For codes 331-338 error message is printed after first line of +virtual module declaration. +

    +Errors like "undeclared identifier" are printed in each +module once, after first reference to this identifier. Further +references are ignored. +

    +The errors related to case instruction may appear before the incorrect +line. +

    1.6. RUN-TIME ERRORS

    + +

    +Loglan run-time errors are detected by Loglan run-time system. +When any of these errors occurs, the appropriate system signal +is raised and error message is printed if handler is not found. +All of these error messages are described in Appendix C. moreover +the line number of the last executed statement is printed on the +user's terminal. +

    2. COMPILER OPTIONS

    + +

    +Options, like switches are used to pass some information to the +compiler. Options are placed in source program in comments. Scope +of options in source program is textual. Option may appear in +any place of source program, but it is active from the beginning +of the nearest instruction. Listing option L is active from the +next line after line containing setting this option on up to the +line containing setting this option off. Options overwrite defaults, +but are overwritten by switches (external options). Option definition +is not allowed before the keyword program. +

    2.1. OPTION FORMAT

    + +

    +Options may be placed in source program in comments in the following +format: +

    +(*$opt1,opt2,...*) +

    +where opti consists of character that designates the option and +either '+' or '-' e.g.: (*$L-,T+*). Options in one comment should +be separated by commas. Spaces in such comment are not allowed. +

    2.2. OPTIONS LIST

    + +

    +D - trace +

    +D+ - causes the line numbers of the executed instruction to be +printed, +

    +D- - default, +

    +L - listing +

    +L- - default, only incorrect lines are printed on the terminal +

    +L+ - all lines are printed on the listing file +

    +O - optimization +

    +O+ - optimization of some arithmetical and logical expressions +are included to generated code (default), +

    +O- - generate code without optimization, +

    +T - type conflict checking +

    +T+ - default, dynamic checking of type conflict in assignment +instructions and in parameter transmissions, +

    +T- - no dynamic checking +

    +H - memory model (switch only) APPLIES ONLY to PC/AT/XT !! +

    +H- - default, small memory +

    +H+ - huge memory +

    +PC/AT/XT When H- is specified all code and data must fit into +64K
    + +

    +bytes. When H+ is specified all memory available on IBM PC +

    +may be utilized, with the cost of increased execution time. +

    2.3. Fragmentation

    + +

    +It is possible to split one Loglan program into different files. +The preprocessor puts together the fragments of a program coming +from different files and enables in this way the a compilation +and, later, an execution of the entire Loglan source. +

    +In any place of Loglan text where it is possible to put semicolon +(;) you can put aside the following compiler directive +

    +#include < file> +

    +It means that any two declarations of instructions can be separated +by the directive. Do not forget however to end the preceding declaration +or instruction by the semicolon. +

    +Grammar +

    +#include "{path> }< file name> " < CR> +CR stands for end of line Carriage Return +

    +Remarks +

    +1. It may be a white space between the word 'include' and the +character ". +

    +2. You need not to specify the path to the included file if it +is stored in the current directory, i.e. the one from which you +began the compilation. +

    +3. The ortography of path should correspond to the plateform used +

    +(i.e. in DOS you use \ characters, in Unix it will be / character) +

    +Example +

    +program pr;
    +   var x: real;
    + #include c:\loglan\examples\simulation.log
    +
    +   unit c: class;
    +   end c;
    +begin
    +   read(x);
    +   ...
    +end
    +
    + +

    +The content of the file c:\loglan\examples\simulation.log replaces +the line include. +

    3. CURRENT LOGLAN-82 IMPLEMENTATION SPECIFICATION

    + +

    3.1. IMPLEMENTED SUBSET OF LOGLAN

    + +

    +The following constructions described in the report of Loglan-82 +have not been implemented: +

    +- local attributes, +

    +- separate compilation, +

    +File system is described in 3.3. +

    3.2. PREDEFINED LANGUAGE ELEMENTS

    + +

    +Predefined constants, procedures and functions are added to the +language (see Appendix A). Moreover keywords char (short form +of character) and bool (short form of boolean) are added. +

    +The character set, defined in the report of Loglan-82, is extended +by lower-case letters and the tabulation character (decimal code +9). It is possible to use operator '< > ' which stands for +'not equal'. +

    3.3. FILE SYSTEM

    + +

    +Loglan contains the predefined reference type file and a set of +statements and standard procedures to manipulate files. Both sequential +and direct access files are implemented. +

    3.4. FILE VARIABLES

    + +

    +Variables of the type file can be declared in the Loglan program +and can be used as any variables of a reference type. +

    +Example: +

    + var f:file, 
    +A:arrayof file; 
    +
    +unit p:procedure(f:file); ... end p; 
    +begin 
    +       ...... 
    +       f := A(i); 
    +       ...... 
    +end; 
    +
    + +

    3.4.1. FILE GENERATION

    + +

    +A file object is generated by open statement of the form: +

    +open(f,T) for internal files or
    +
    +open(f,T,A) for external files
    + +

    +where +

    +f is a file variable, +

    +T = text for text files, +

    +char for binary sequential files of character,
    +integer integer or +

    +real real values +

    +direct for direct access binary files. +

    +A is an expression of the type arrayof char designating external +file name. After execution of open statement the new file object +is created and it becomes a value of the file variable f. If the +file is opened as an external one, then it references to the file +A. +

    +Example: +

    +open(data,text) - new internal text file data is opened +

    +open(num ,integer) - new internal binary file num is opened +

    +(the file components are integer numbers) +

    +open(f,text,unpack("my.dat")) - external text file f +is opened; +

    +it references to the file my.dat stored on the default drive and +directory. +

    +open(f,direct,A) - an external direct access file with name in +array A is opened. +

    3.5. FILE DEALLOCATION

    + +

    +The file can be closed and deallocated by execution of the statement +kill. +

    3.6. GENERAL FILE OPERATIONS

    + +

    +There are three standard procedures associated with files: RESET, +REWRITE and UNLINK. +

    +call RESET(f) rewinds the file f. After execution of RESET on +sequential files only read/get operations are available. +

    +call REWRITE(f) creates a new empty file. After execution of REWRITE +on sequential files only write/put operations are available. +

    +call UNLINK(f) closes and deletes file f. File object is deallocated +and f is set to one. +

    +RESET or REWRITE must be performed on the file opening before +the first I/O operation on it. +

    3.7. TEXT FILES

    + +

    +The following operations are available to text files: read, readln, +eoln, write, writeln, eof. The first parameter of the operation +is a file variable. If it is omitted, then a standard input/output +file assigned to user's terminal is used. +

    +Example: +

    +   read(f,a,b); 
    +read(c); 
    +writeln(g," .... "); 
    +if eof(f) then .... 
    +
    + +

    +For more information see [1]. +

    3.8. BINARY SEQUENTIAL FILES

    + +

    +Any file created with the parameter T = integer, real or char +is a binary one. It is a sequence of components of the type T. +Only objects of type T can be read from or written to this file. +

    +The following operations are available to binary files: +

    +put(f, w1, ..., wn) +

    +get(f, x1, ..., xn) +

    +eof(f) +

    +where f is a file opened with the type T, wi is an expression +of the type T and xi is a variable of the type T. +

    +The statement put(f, w1, ..., wn) writes the components w1, ...,wn +to the file f. The statement get(f, x1, ..., xn) reads the next +n components from the file f and assigns them to the variables +x1, ..., xn. The statement eof is the same as for text files. +

    3.9. DIRECT ACCESS BINARY FILES

    + +

    +Direct access files are treated as a sequence of bytes without +any interpretation. Operations RESET and REWRITE prepare a file +for both reading and writing. RESET is used for existing files, +

    +REWRITE for the new ones. +

    +The following additional operations are available: +

    +call SEEK(f, offset, base) - moves the file pointer to the position +designated by offset relative to base. +

    +Offset is a signed integer specifying the number of bytes. +

    +Possible values for base are: +

    +0 - begining of file, +

    +1 - current position of file pointer, +

    +2 - end of the file. +

    +Examples: +

    +call SEEK(f, 0, 0) - rewinds file f, +

    +call SEEK(f, -3, 1) - backspaces file f by 3 bytes, +

    +call SEEK(f, 0, 2) - moves the file pointer to the first byte +after end of file +

    +POSITION(f) - returns current position of the file pointer associated +with f. +

    +PUTREC(f, A, n) - where A is an array of any primitive type and +n is an integer variable. Let k be the number of bytes occupied +by elements of array A. This operation writes min(k, n) bytes +from A to the file f and advances file pointer by the number of +written bytes. The number of bytes written to the file is returned +in the variable n. +

    +GETREC(f, A, n) - where A is an existing array of any primitive +type and n is an integer variable. Let k be the number of bytes +occupied by elements of array A This operation reads min(k,n) +bytes (or less, if end of file is encountered) from the file and +advances the file pointer by the number of read bytes. The number +of bytes read from the file is returned in the variable n. +

    3.10. CONCURRENCY

    + +

    +Implemented concurrency mechanisms differ much from those described +in the LOGLAN-82 report []. In particular, only distributed processes +are implemented, so they cannot communicate through shared variables. +For this reason semaphores had to be replaced by an entirely new +communication mechanism. Such a mechanism has been designed and +it is based on the rendez-vous schema. +

    3.10.1. INVOKING THE LOGLAN INTERPRETER FOR CONCURRENT PROGRAMS +

    + +

    +A concurrent LOGLAN program may run on a single computer with +concurrency simulated by time slicing. In this case LOGLAN interpreter +is invoked as usual. One must only remember that /m optional parameter +(see 1.4.) denotes memory size for each process rather than for +the whole program. +

    +To achieve true parallel (multiprocessor) execution, a network +of IBM PC computers may be used. For the time being, only D-Link +Network Version 3.21 is supported. In order to run a LOGLAN program +in the network environment take the following steps: +

    +1) make sure that every node is logged on, +

    +2) select arbitrarily one node as a console, +

    +3) invoke the LOGLAN interpreter on every node except the console, +giving it /r option with the console node number (see 1.4.). You +must give the same program file to all interpreters. Most conveniently +it may be achieved by accessing a file on a disk connected through +the network to each node. +

    +4) invoke the interpreter on the console without the /r option +(in the usual way). Give it the same program file as above. +

    +After the last step the main program process begins its execution +on the console node. Other processes may be created dynamically +on any node on which an interpreter is running. +

    +Regardless of the fact whether the network is used or not, +more than one process may be executed on the same computer. + +

    3.10.2. RESTRICTIONS AND DIFFERENCES FROM THE REPORT

    + +

    +All processes (even those executed on the same computer) are implemented +as distributed, i.e. without any shared memory. This fact implies +some restrictions on how processes may be used. Not all restrictions +are enforced by the present compiler, so it is the programmer's +responsibility to respect them. This is the list of restrictions: +

    +1) all process units must be declared as global, i.e. directly +inside the main program, +

    +2) a process cannot access global variables (except for the main +program process), +

    +3) any remote access to a process object other than a procedure +call is inhibited +

    +4) each parameter of +

    +a process, +

    +a procedure called by remote access to a process object, +

    +a procedure parameter of a process, +

    +must be one of the following: +

    +a value of the primitive type (INTEGER, REAL, CHAR, BOOLEAN, STRING) +

    +a procedure declared directly inside a process +

    +a procedure which is a formal parameter of a process +

    +any reference to a process object. +

    +This restriction implies that references to objKcts other than +processes have only local meaning (in a single process) and cannot +be passed among the processes. +

    +5) comparisons, IS, IN and QUA operations are not allowed for +the references to processes. +

    +6) operations which require dynamic type checking on the references +to processes are not allowed. +

    +7) a process may be attached only by a proper coroutine generated +by it. +

    +8) the variable MAIN is accesible only in the main program process. +

    +The following concurrent constructs described in the report are +not implemented at all: +

    +- semaphores and all operations on them +

    +- the WAIT expression. +

    +Semantics of the NEW generator is slightly modified when applied +to the processes. The first parameter of the first process unit +in the prefix sequence must be of type INTEGER. +This parameter denotes the node number of the computer on which +this process will be created. For a single computer operation +this parameter must be equal to 0. +

    +Example: +

    +unit A:class(msg:string);
    +...
    +end A;
    +unit P:A process(node:integer, pi:real);
    +...
    +end P;
    +...
    +var x:P;
    +...
    +begin...
    + (* Create process on node  4.  The  first  parameter  is  the  *) 
    + (* string required by the prefix A, the second is the node number *)
    + x := new P("Hello", 4, 3.141592653);
    +...
    +end
    +
    + +

    +. +

    +The following parallel constructs are implemented as defined in +the report: +

    +- KILL operation for a process +

    +- RESUME statement +

    +- STOP statement without parameter. +

    3.10.3. COMMUNICATION MECHANISM

    + +

    +Processes may communicate and synchronize by a mechanism based +on rendez-vous. It will be referred to as "alien call" +in the following description. +

    +An alien call is either: +

    +- a procedure (or function) call performed by a remote access +to a process object, or +

    +- a call of a procedure which is a formal parameter of a process, +or +

    +- a call of a procedure which is a formal parameter of an alien-called +procedure (this is a recursive definition). Every process object +has an enable mask. It is defined as a subset of all procedures +declared directly inside a process unit or any unit from its prefix +sequence (i.e. subset of all procedures that may be alien-called). +

    +A procedure is enabled in a process if it belongs to that process' +enable mask. A procedure is disabled if it does not belong to +the enable mask. +

    +Immediately after generation of a process object its enable mask +is empty (all procedures are disabled). +

    +Semantics of the alien call is different from the remote call +described in the report. Both the calling process and the process +in which the procedure is declared (i.e. the called process) are +involved in the alien call. This way the alien call may be used +as a synchronization mechanism. +

    +The calling process passes the input parameters and waits for +the call to be completed. +

    +The alien-called procedure is executed by the called process. +Execution of the procedure will not begin before certain conditions +are satisfied. First, the called process must not be suspended +in any way. The only exception is that it may be waiting during +the ACCEPT statement (see below). Second, the procedure must be +enabled in the called process. +

    +When the above two conditions are met the called process is interrupted +and forced to execute the alien-called procedure (with parameters +passed by the calling process). +

    +Upon entry to the alien-called procedure all procedures become +disabled in the called process. +

    +Upon exit the enable mask of the called process is restored to +that from before the call (regardless of how it has been changed +during the execution of the procedure). The called process is +resumed at the point of the interruption. The execution of the +ACCEPT statement is ended if the called process was waiting during +the ACCEPT (see below). +

    +At last the calling process reads back the output parameters and +resumes its execution after the call statement. +

    +The process executing an alien-called procedure can easily be +interrupted by another alien call if the enable mask is changed. +

    +There are some new language constructs associated with the alien +call mechanism. The following statements change the enable mask +of a process: +

    +ENABLE p1, ..., pn +

    +enables the procedures with identifiers p1, ..., pn. If there +are any processes waiting for an alien call of one of these procedures, +one of them is chosen and its request is processed. The scheduling +is done on a FIFO basis, so it is strongly fair. The statement: +

    +DISABLE p1, ..., pn +

    +disables the procedures with identifiers p1, ..., pn. +

    +In addition a special form of the RETURN statement: +

    +RETURN ENABLE p1, ..., pn DISABLE q1, ..., qn +

    +allows to enable the procedures p1, ..., pn and disable the procedures +q1,...,qn after the enable mask is restored on exit from the alien-called +procedure. It is legal only in the alien-called procedures (the +legality is not enforced by the compiler). +

    +A called process may avoid busy waiting for an alien call by means +of the ACCEPT statement: +

    +ACCEPT p1, ..., pn +

    +adds the procedures p1, ..., pn to the current mask, and waits +for an alien call of one of the currently enabled procedures. +After the procedure return the enable mask is restored to that +from before the ACCEPT statement. +

    +Note that the ACCEPT statement alone (i.e. without any ENABLE/DISABLE +statements or options) provides a sufficient communication mechanism. +In this case the called process may execute the alien-called procedure +only during the ACCEPT statement (because otherwise all procedures +are disabled). It means that the enable mask may be forgotten +altogether and the alien call may be used as a pure totally synchronous +rendez-vous. Other constructs are introduced to make partially +asynchronous communication patterns possible. +

    3.11. SYSTEM SIGNALS

    + +

    +System signals are connected to runtime errors (see APPENDIX C). +

    +These signals are the following: +

    +ACCERROR - reference to non existing object, CONERROR - array +index outside the range or lower bound is greater than upper bound +during array object generation, LOGERROR - errors related to control +transfer, MEMERROR - memory overflow, NUMERROR - errors related +to arithmentic operations like division by zero, floating point +overflow, TYPERROR - type conflict in assignment statement, during +parameter tran smission or headline conflict for actual parameter +function and procedure. SYSERROR - errors related to file system, +like reading after writing, too many files etc. +

    3.12. IMPLEMENTATION RESTRICTIONS

    + +

    +- Text line in source program can't be longer than 80 characters. +- Maximal length of identifier is 20 characters, but entire length +of all identifiers and keywords should be less than 3000 characters. +- String constant can't be longer than 260 characters. - For case +instructions: - up to 6 levels of nested case instructions are +allowed, - range of labels can't be greater than 160. - Number +of formal parameters can't be greater than 40, whereas up to 35 +output or input parameters are allowed. Total number of formal +parameters and variables declared in one module can't be greater +than 130. - Number of array indices (i.e. arrayof) can't be greater +than 63, - Standard type integer has the range (-32767,+32767) +for small memory (16 - bit word). For huge memory (32-bit word) +the range is (-2147483647,+2147483647), but values of constant +expressions in a program must lie within the range (-2767, 32767). +- Real numbers have the range (-8.43E-37, 3.37E+38) with 24-bit +mantissa and 8-bit exponenet for small memory , giving about 7 +digits of precision. For huge memory the range is (4.19E-307, +1.67E+308) with 53-bit mantissa and 11-bit exponent, giving about +15 digits of precision.Values of constant expression in a program +must lie in the range (-8.43E-37, 3.37E+38). Warning +

    +Compiler computes values of expressions built from constants without +range checking. It means, that integer overflow, floating point +overflow or underflow cause incorrect result without any message. +

    APPENDIX A : PREDEFINED CONSTANTS

    + +

    +INTSIZE +

    +The size in bytes of integer variables +

    +REALSIZE +

    +The size in bytes of real variables +

    APPENDIX B : PREDEFINED CLASSES

    + +

    +of GRAPHICS & MOUSE +

    +for PC486 for Unix for PC286 +

    APPENDIX C : PREDEFINED PROCEDURES AND FUNCTIONS

    + +

    +ENDRUN:procedure;
    +Terminates program execution (ABORT).
    +RANSET:procedure(x:real);
    +Initializes random generator (for RANDOM function)
    +RANDOM:function:real;
    +Generates uniformly distributed pseudo-random numbers in the interval +(0,1).
    +SQRT:function(x:real):real;
    +Computes square root of parameter x.
    +SIN:function(x:real):real;
    +Computes sinus of parameter x.
    +COS:function(x:real):real;
    +Computes cosinus of parameter x.
    +TAN:function(x:real):real;
    +Computes tangens of parameter x.
    +EXP:function(x:real):real;
    +Computes e**x.
    +LN:function(x:real):real;
    +Computes natural logarithmus of parameter x.
    +ATAN:function(x:real):real;
    +Computes arcus tangens of parameter x.
    +ENTIER:function(x:real):integer;
    +Computes entier part of parameter x.
    +ROUND:function(x:real):integer;
    +Computes rounded value of parameter x: ROUND(x)=ENTIER(x+0.5). +
    +IMIN:function(x, y:integer):integer;
    +Computes minimum of two parameters.
    +IMAX:function(x, y:integer):integer;
    +Computes maximum of two parameters.
    +IMIN3:function(x, y, z:integer):integer;
    +Returns the minimum of three parameters.
    +IMAX3:function(x, y, z:integer):integer;
    +Returns maximum of three parameters.
    +ISHFT:function(x, k:integer):integer;
    +Logically shifts x by k bits: left, when k is positive, right +otherwise.
    +IAND:function(n, k:integer):integer;
    +Returns logical product of parameters (on all bits).
    +IOR:function(n, k:integer):integer;
    +Returns logical sum of parameters (on all bits).
    +XOR:function(n, k:integer):integer;
    +Returns exlusive sum of parameters (on all bits).
    +INOT:function(n:integer):integer;
    +Returns logical complement of parameters (on all bits).
    +ORD:function(c:char):integer;
    +Returns number that represents character c (see APPENDIX F). +
    +The following equations are satisfied: CHR(ORD(c)) = c & ORD(CHR(n)) += n
    +CHR:function(n:integer):char;
    +Returns character represented by parameter n (see APPENDIX F). +
    +UNPACK:function(s:string):arrayof char;
    +Returns address of new array object containing characters of the +string s.
    +MEMAVAIL:function:integer;
    +Returns the size of available memory in the current process (in +words).
    +EXEC:function(cmd:arrayof char):integer;
    +Calls secondary command processor with cmd as a command string. +Exit code is returned as a value of EXEC. TIME:function: integer; +
    +Returns an integer value indicating the amount of central processor +
    +time in seconds used by current process.
    +RESET:procedure(f:file);
    +Positionnes file f at the first component and readies it to reading. +
    +REWRITE:procedure(f:file);
    +Positionnes file f at the first component and readies it for output. +
    +The file f becomes empty (eof(f) = true).
    +UNLINK:procedure(f:file);
    +Closes and deletes file f (see 3.3.4)
    +SEEK:procedure(f:file; offset, base:integer);
    +Positiones file pointer (see 3.3.7)
    +POSITION:function(f:file):real;
    +Reads position of file pointer (see 3.3.7) +

    appendix D: Error Codes APPENDIX E : LOGLAN RUNTIME ERRORS +

    + +

    +In the following list system signal name, raised after detection +of runtime error, is placed in brackets. +

    +ARRAY INDEX ERROR (CONERROR) +

    +Index outside range during reference to array variable. NEGATIVE +STEP VALUE (CONERROR) +

    +SL CHAIN CUT OFF (LOGERROR)
    + +

    +Control transfer to object that has SL link cut off earlier in +the consequence of kill operation. ILLEGAL ATTACH (LOGERROR) +

    +The value of parameter of attach instruction is none or object +differs from coroutine. ILLEGAL DETACH (LOGERROR) +

    +An attempt to return by detach to coroutine that has been dealocated +(by kill). ILLEGAL RESUME (LOGERROR) +

    +An attempt to resume an object which is not a process or a process +which is running. TOO MANY PROCESSES ON ONE MACHINE (SYSERROR) +

    +Number of processes existing on one computer is greater than 64. +INVALID NODE NUMBER (SYSERROR) +

    +An attempt to create a process on a computer which is not connected +to network. IMPROPER QUA (LOGERROR) +

    +Error during computing expression of the form: ...x qua a, when +'x' references to none or 'a' doesn't prefix dynamic type object, +which is value of 'x'. ILLEGAL ASSIGNMENT (TYPERROR) +

    +Type conflict between left and right side of assignment instruction. +FORMAL TYPE MISSING (LOGERROR) +

    +Formal type is not accessible because of SL cut off. ILLEGAL KILL +(LOGERROR) +

    +An attempt to deallocate object in SL chain of active object. +ILLEGAL COPY (LOGERROR) +

    +An attempt to copy non terminated object (i.e. class before execution +of return statement, coroutine before execution of end statement...). +REFERENCE TO NONE (ACCERROR) +

    +An attempt to remote access (by dot) to attributes of non existing +object: dealocated or not generated. MEMORY OVERFLOW (MEMERROR) +

    +INCOMPATIBLE HEADERS (TYPERROR)
    + +

    +Actual parameter list of generated object (procedure, function +or class) is incompatible with formal parameter list from module +declaration or formal function type is incompatible with actual +function type. INCORRECT ARRAY BOUNDS (CONERROR)
    + +

    +An attempt to generate dynamic array object, when lower bound +of index range is greater than upper bound. +

    +DIVISION BY ZERO (NUMERROR)
    + +

    +COROUTINE TERMINATED (LOGERROR) +

    +An attempt to transfer control to a terminated coroutine. COROUTINE +ACTIVE (LOGERROR) +

    +An attempt to transfer control to an active coroutine. HANDLER +NOT FOUND (LOGERROR) +

    +There is no handler for signal declared by user. ILLEGAL RETURN +(LOGERROR) +

    +An attempt to execute return instruction in handler serving system +signal. UNIMPLEMENTED STANDARD PRC. (LOGERROR) +

    +Standard procedure or function is not implemented. FORMAL LIST +TOO LONG (MEMERROR) +

    +Formal parameter list is greater than 40. ILLEGAL I/O OPERATION +(SYSERROR) +

    +Reading after writing, the type of the read/write parameter does +not match the type of the file etc. I/O ERROR (SYSERROR) +

    +System error during I/O. CANNOT OPEN FILE (SYSERROR) +

    +INPUT DATA FORMAT BAD (SYSERROR)
    + +

    +SYSTEM ERROR (SYSERROR)
    +Should not occur. UNRECOGNIZED ERROR +

    APPENDIX F : CHARACTER SET

    + +

    +At the top of the table are hexadecimal digits (0 to 7), and to +the left of the table are hexadecimal digits (0 to F). Hexadecimal +code of ASCII character is constructed by contatenation of column +label and row label. For example, the value of character representing +the plus sign is 2B. +

    +                   0     1     2     3     4     5     6     7 
    +                _________________________________________________ 
    +                !     !     !     !     !     !     !     !     ! 
    +          0     ! NUL ! DLE ! SP  !  0  !  @  !  P  !     !  p  ! 
    +                _________________________________________________ 
    +                !     !     !     !     !     !     !     !     ! 
    +          1     ! SOH ! DC1 !  !  !  1  !  A  !  Q  !  a  !  q  ! 
    +                _________________________________________________ 
    +                !     !     !     !     !     !     !     !     ! 
    +          2     ! STX ! DC2 !  "  !  2  !  B  !  R  !  b  !  r  ! 
    +                _________________________________________________ 
    +                !     !     !     !     !     !     !     !     ! 
    +          3     ! ETX ! DC3 !  #  !  3  !  C  !  S  !  c  !  s  ! 
    +                _________________________________________________ 
    +                !     !     !     !     !     !     !     !     ! 
    +          4     ! EOT ! DC4 !  $  !  4  !  D  !  T  !  d  !  t  ! 
    +                _________________________________________________ 
    +                !     !     !     !     !     !     !     !     ! 
    +          5     ! ENQ ! NAK !  %  !  5  !  E  !  U  !  e  !  u  ! 
    +                _________________________________________________ 
    +                !     !     !     !     !     !     !     !     ! 
    +          6     ! ACK ! SYN !  &   !  6  !  F  !  V  !  f  !  v  ! 
    +                _________________________________________________ 
    +                !     !     !     !     !     !     !     !     ! 
    +          7     ! BEL ! ETB !  '  !  7  !  G  !  W  !  g  !  w  ! 
    +                _________________________________________________ 
    +                !     !     !     !     !     !     !     !     ! 
    +          8     ! BS  ! CAN !  (  !  8  !  H  !  X  !  h  !  x  ! 
    +                _________________________________________________ 
    +                !     !     !     !     !     !     !     !     ! 
    +          9     ! HT  ! EM  !  )  !  9  !  I  !  Y  !  i  !  y  ! 
    +                _________________________________________________ 
    +                !     !     !     !     !     !     !     !     ! 
    +          A     ! LF  ! SUB !  *  !  :  !  J  !  Z  !  j  !  z  ! 
    +                _________________________________________________ 
    +                !     !     !     !     !     !     !     !     ! 
    +          B     ! VT  ! ESC !  +  !  ;  !  K  !  [  !  k  !  {  ! 
    +                _________________________________________________ 
    +                !     !     !     !     !     !     !     !     ! 
    +          C     ! FF  ! FS  !  ,  !  <   !  L  !  \  !  l  !  |  ! 
    +                _________________________________________________ 
    +                !     !     !     !     !     !     !     !     ! 
    +          D     ! CR  ! GS  !  -  !  =  !  M  !  ]  !  m  !  }  ! 
    +                _________________________________________________ 
    +                !     !     !     !     !     !     !     !     ! 
    +          E     ! SO  ! RS  !  .  !  >   !  N  !  ^  !  n  !  ~  ! 
    +                _________________________________________________ 
    +                !     !     !     !     !     !     !     !     ! 
    +          F     ! SI  ! US  !   / !  ?  !  O  !   _ !  o  ! DEL ! 
    +                _________________________________________________ 
    +
    + +

    +. where: +

    +     NUL  Null	DLE  Data Link Escape 
    +     SOH  Start of Heading	DC1  Device Control 1 
    +     STX  Start of Text	DC2  Device Control 2 
    +     ETX  End of Text	DC3  Device Control 3 
    +     EOT  End of Transmission	DC4  Device Control 4 
    +     ENQ  Enquiry	NAK  Negative Acknowledge 
    +     ACK  Acknowledge	SYN  Synchronous Idle 
    +     BEL  Bell	ETB  End of Transmission Block 
    +     BS   Backspace	CAN  Cancel 
    +     HT   Horizontal Tabulation	EM   End of Medium 
    +     LF   Line Feed	SUB  Substitute 
    +     VF   Vertical Tab	ESC  Escape 
    +     FF   Form Feed	FS   File Separator 
    +     CR   Carriage Return	GS   Group Separator 
    +     SO   Shift Out	RS   Record Separator 
    +     SI   Shift In	US   Unit Separator 
    +     SP   Space	DEL  Delete 
    +
    + +

    Bibliography

    + +

    +16 LITA, Pau Loglan'82 user's manual Loglan'82 users's manual +November 24, 1994 15 + + + diff --git a/HTML/whylog.htm b/HTML/whylog.htm new file mode 100644 index 0000000..efe425a --- /dev/null +++ b/HTML/whylog.htm @@ -0,0 +1,258 @@ + + + + +Why Loglan'82? + + + +

    Why Loglan'82?

    + +

    +We think that everybody should take acquaintance with certain +features of Loglan'82. Even if you will continue to use your favorite +XYZ language, you will be at least aware of what you are missing. +
    +Four features of Loglan'82 distinguish it from the other OO languages: +

    1. +multi-level inheritance,
      + the language offers both nesting and inheritance of modules +
      +
      nesting enables sharing of environments and inheritance +enables private copies of environments.
      +Both methods of module's construction are useful and important! + +
    2. multi-kind inheritance +
      + e.g. a procedure can inherit from a class,
      +
      making use of it one can enforce protocols, dynamically check +axioms of abstract data types etc. +
    3. SAFETY
      +- Loglan'82 signals a lot of programming errors that pass +unrecognized in other systems.
      +-
      There is no risk of dangling references, no confusion of +types ...
      + Safe deallocation statement and safe storage management +system +
    4. object-oriented concurrency +
      + objects of processes can be created dynamically and allocated +on a processor accessible by the network
      +
      The processes can communicate and synchronize through a new, +powerful mechanism: ALIEN CALL +
    + +

    +Other, standard methods of OO programming are present in Loglan'82: +

      +
    • classes and objects of classes, +
    • virtual methods, +
    • hierarchies of classes, +
    • exception handling, +
    • operators of structured programming, +
    • dynamic arrays, +
    • coroutines +
    • etc. +
    + +

    + +

    +Loglan'82 is accompanied by an original methodology of software +engineering which supports the most complicated and most expensive +phases of software creation: specification, analysis and verification. +There are good reasons for using Loglan'82 in: +

    + +

    Education.

    + +

    +The academic community has a need for one language which enables +to teach all elements of object programming: classes & objects, +coroutines, processes (in Loglan'82 processes are objects which +are able to act in parallel), inheritance, exception handling, +dynamic arrays etc. Loglan'82 offers the complete sets of programming +tools used in object and modular and structural programming. +

    +It is of importance to have compilers acting in different operating +environments: MS-DOS, Unix, Atari, etc. in order to assure the +exchange of sources between students and teachers, between users +of : personal computers, workstations and servers of university's +networks. We are working on the prolongation of the list of machines +and systems that support Loglan'82. +

    +Loglan'82 supports other styles of programming e.g. programming +by rules, functional programming etc. +

    +The teacher and the students can use different computers (see +"Machines" file) and still they can exchange the sources +and to follow the experiments of others. You can distribute the +files of Loglan'82 among the students which own PC/DOS, ATARI, +PS2, PC/Unix. You can install Loglan'82 in your computing centre +on Unix or Vax/VMS or Novell servers. You can install Loglan'82 +on your workstation (Sun, PC/Unix, Apollo etc.). On all machines +you can compile and execute the same program. Whether it will +be a student's program checked by a teacher, or an instructive +program transmitted to the students. And students can work at +home or in a computer room of your University. +

    +For the PC users Loglan'82 comes with an environment consisting +of - lotek - a text editor integrated with compiler and other +tools, - a structural editor which guides you when you do not +know the syntax of Loglan'82, - an electronic manual to be used +with Norton Guide or its clones, +

    +A set of instructive examples is added to the distribution package. +

    +We encourage you to experiment with the system since: +

      +
    • you can find it useful and interesting to teach the object +programming, +
    • you can find Loglan'82 useful in fast prototyping of software, +
    • you can apply and extend several predefined classes which +define and implement the problem- oriented languages extending +Loglan'82 in various directions. +
    + +

    Research.

    + +

    +Loglan'82 has been used as a tool with a success in research +in: +

      +
    • object oriented databases, +
    • symbolic computation (computer algebra, ...), +
    • formal proofs, +
    • proving the properties of programs.
      + +
    + +

    +this list is not the exhaustive one. +

    +Loglan'82 is a source of many problems of broader interest. +

      +
    1. The problem of giving one non-contradictory semantics to the +language admitting both nesting of modules and inheritance from +various levels. +
    2. Dangling reference problem. +
    3. Mathematical models of concurrent processes.
      +Loglan'82 is the result of a research on fundamental questions +like 1-3 . +
    4. Multiple inheritance and nesting. +
    5. Libraries of predefined classes - how to define the meaning +of separately compiled modules in the presence of nesting and +multiple inheritance. +
    6. The virtual Loglan'82 machine as a federation of co-processes. +
    7. Execution of processes of a Loglan'82 program in a LAN of +heterogeneous computers. +
    8. Execution of Loglan'82 programs on parallel computers e.g. +transputers. +
    9. to find a complete, axiomatic definition of the notions of +class and of inheritance, +
    10. is it possible to make efficiently the nesting of modules +and the multiple inheritance? +
    11. how to manage the libraries of predefined procedures and classes +in the presence of nesting? +
    12. how to install the language on a real multiprocessor system? +
    + +

    +The problem 1 was solved by the team lead by A.Kreczmar in co-operation +with the group of H. Langmaack. +

    +The problem 2 was solved by A.Kreczmar and was analyzed formally +by H. Oktaba. +

    +T.Müldner and A.Salwicki gave the Max model of parallel computations. +H.-D. Burkhard proved that it differs essentially from the interleaving +model. +

    +B. Ciesielski gave a new concept of objects of processes and a +communication mechanism of alien calls of procedures. This version +was implemented by him in 1988. +

    +The problems 4 - 12 are open. We would be happy to co-operate +on solving them together with you. +

    +We recommend Loglan'82 as a tool to be used in the research in: +object-oriented databases, development of CASE tools, VHDL, silicon +compilers, simulation, etc. +

    Production of new software

    + +

    +There are only a few languages which, like Loglan'82, enable both +ways of modules' developing: nesting (- a module can be declared +in other module) and inheritance (also called prefixing). The +modules of your software can share the environment (by means of +nesting) or they can inherit other modules as private copies of +the modules declared elsewhere. The inheritance in Loglan'82 permits +to inherit a module declared somewhere in the tree of nested modules. +Moreover, the inheritance is no longer restricted to classes. +Any module, whether it will be a class, a block, a procedure, +a function, a coroutine or a process can inherit from a class. +Coroutines and processes can be inherited in classes, coroutines +or processes. Another kind of module is a handler. Handlers serve +to handle signals (of exceptions). +

    +Altogether one can use 7 kinds of modules. +

    +The tools offered by Loglan'82 enable in various ways to create +generic modules whether they are to serve as generic procedures +or parameterized data types. In order to do so one can use either +the possibility to pass types as formal parameters or the inheritance +mechanisms. The language makes possible overloading the names +of operations via the mechanism of virtual functions or procedures. +

    +This and other programming tools offered by Loglan'82 permit to +quickly create a prototype of a program and to test it in a friendly +environment. The compiler gives a good diagnostic of the eventual +errors. For the time being we can not offer a code generator. +Instead you can use the Loglan_to_C crosscompiler. +

    +The language is especially well suited for the +

      +
    • reusability and +
    • proving the correctness. +
    + +

    +Loglan'82 supports various methods of programming: +

      +
    • imperative - since it is a descendant of Algol, Pascal, ... +
    • object-oriented - since it is a continuation, and extension +of the ingenious ideas of Simula-67, +
    • functional programming is easy, +
    • programming by rules is supported by a specialized class BACKTRACK +designed and developed in Loglan'82. +
    +
    + +
    +We would appreciate any news (comments, questions, suggestions, +objections, ...) from you. Please write to Andrzej.Salwicki@univ-pau.fr + +
    +
    + +

    + + + +


    + +
    +AS 08:03 +04/12/1994 +
    + +

    +Pau, le 26 Janvier 1994 + + + +p \ No newline at end of file diff --git a/HTML/whylog.htm~ b/HTML/whylog.htm~ new file mode 100644 index 0000000..2784f4c --- /dev/null +++ b/HTML/whylog.htm~ @@ -0,0 +1,258 @@ + + + + +Why Loglan'82? + + + +

    Why Loglan'82?

    + +

    +We think that everybody should take acquaintance with certain +features of Loglan'82. Even if you will continue to use your favorite +XYZ language, you will be at least aware of what you are missing. +
    +Four features of Loglan'82 distinguish it from the other OO languages: +

    +multi-level inheritance,
    + the language offers both nesting and inheritance of modules +
    +
    nesting enables sharing of environments and inheritance +enables private copies of environments.
    +Both methods of module's construction are useful and important! +

      +
    1. multi-kind inheritance +
      + e.g. a procedure can inherit from a class,
      +
      making use of it one can enforce protocols, dynamically check +axioms of abstract data types etc. +
    2. SAFETY
      +- Loglan'82 signals a lot of programming errors that pass +unrecognized in other systems.
      +-
      There is no risk of dangling references, no confusion of +types ...
      + Safe deallocation statement and safe storage management +system +
    3. object-oriented concurrency +
      + objects of processes can be created dynamically and allocated +on a processor accessible by the network
      +
      The processes can communicate and synchronize through a new, +powerful mechanism: ALIEN CALL +
    + +

    +Other, standard methods of OO programming are present in Loglan'82: +

      +
    • classes and objects of classes, +
    • virtual methods, +
    • hierarchies of classes, +
    • exception handling, +
    • operators of structured programming, +
    • dynamic arrays, +
    • coroutines +
    • etc. +
    + +

    + +

    +Loglan'82 is accompanied by an original methodology of software +engineering which supports the most complicated and most expensive +phases of software creation: specification, analysis and verification. +There are good reasons for using Loglan'82 in: +

    + +

    Education.

    + +

    +The academic community has a need for one language which enables +to teach all elements of object programming: classes & objects, +coroutines, processes (in Loglan'82 processes are objects which +are able to act in parallel), inheritance, exception handling, +dynamic arrays etc. Loglan'82 offers the complete sets of programming +tools used in object and modular and structural programming. +

    +It is of importance to have compilers acting in different operating +environments: MS-DOS, Unix, Atari, etc. in order to assure the +exchange of sources between students and teachers, between users +of : personal computers, workstations and servers of university's +networks. We are working on the prolongation of the list of machines +and systems that support Loglan'82. +

    +Loglan'82 supports other styles of programming e.g. programming +by rules, functional programming etc. +

    +The teacher and the students can use different computers (see +"Machines" file) and still they can exchange the sources +and to follow the experiments of others. You can distribute the +files of Loglan'82 among the students which own PC/DOS, ATARI, +PS2, PC/Unix. You can install Loglan'82 in your computing centre +on Unix or Vax/VMS or Novell servers. You can install Loglan'82 +on your workstation (Sun, PC/Unix, Apollo etc.). On all machines +you can compile and execute the same program. Whether it will +be a student's program checked by a teacher, or an instructive +program transmitted to the students. And students can work at +home or in a computer room of your University. +

    +For the PC users Loglan'82 comes with an environment consisting +of - lotek - a text editor integrated with compiler and other +tools, - a structural editor which guides you when you do not +know the syntax of Loglan'82, - an electronic manual to be used +with Norton Guide or its clones, +

    +A set of instructive examples is added to the distribution package. +

    +We encourage you to experiment with the system since: +

      +
    • you can find it useful and interesting to teach the object +programming, +
    • you can find Loglan'82 useful in fast prototyping of software, +
    • you can apply and extend several predefined classes which +define and implement the problem- oriented languages extending +Loglan'82 in various directions. +
    + +

    Research.

    + +

    +Loglan'82 has been used as a tool with a success in research +in: +

      +
    • object oriented databases, +
    • symbolic computation (computer algebra, ...), +
    • formal proofs, +
    • proving the properties of programs.
      + +
    + +

    +this list is not the exhaustive one. +

    +Loglan'82 is a source of many problems of broader interest. +

      +
    1. The problem of giving one non-contradictory semantics to the +language admitting both nesting of modules and inheritance from +various levels. +
    2. Dangling reference problem. +
    3. Mathematical models of concurrent processes.
      +Loglan'82 is the result of a research on fundamental questions +like 1-3 . +
    4. Multiple inheritance and nesting. +
    5. Libraries of predefined classes - how to define the meaning +of separately compiled modules in the presence of nesting and +multiple inheritance. +
    6. The virtual Loglan'82 machine as a federation of co-processes. +
    7. Execution of processes of a Loglan'82 program in a LAN of +heterogeneous computers. +
    8. Execution of Loglan'82 programs on parallel computers e.g. +transputers. +
    9. to find a complete, axiomatic definition of the notions of +class and of inheritance, +
    10. is it possible to make efficiently the nesting of modules +and the multiple inheritance? +
    11. how to manage the libraries of predefined procedures and classes +in the presence of nesting? +
    12. how to install the language on a real multiprocessor system? +
    + +

    +The problem 1 was solved by the team lead by A.Kreczmar in co-operation +with the group of H. Langmaack. +

    +The problem 2 was solved by A.Kreczmar and was analyzed formally +by H. Oktaba. +

    +T.Müldner and A.Salwicki gave the Max model of parallel computations. +H.-D. Burkhard proved that it differs essentially from the interleaving +model. +

    +B. Ciesielski gave a new concept of objects of processes and a +communication mechanism of alien calls of procedures. This version +was implemented by him in 1988. +

    +The problems 4 - 12 are open. We would be happy to co-operate +on solving them together with you. +

    +We recommend Loglan'82 as a tool to be used in the research in: +object-oriented databases, development of CASE tools, VHDL, silicon +compilers, simulation, etc. +

    Production of new software

    + +

    +There are only a few languages which, like Loglan'82, enable both +ways of modules' developing: nesting (- a module can be declared +in other module) and inheritance (also called prefixing). The +modules of your software can share the environment (by means of +nesting) or they can inherit other modules as private copies of +the modules declared elsewhere. The inheritance in Loglan'82 permits +to inherit a module declared somewhere in the tree of nested modules. +Moreover, the inheritance is no longer restricted to classes. +Any module, whether it will be a class, a block, a procedure, +a function, a coroutine or a process can inherit from a class. +Coroutines and processes can be inherited in classes, coroutines +or processes. Another kind of module is a handler. Handlers serve +to handle signals (of exceptions). +

    +Altogether one can use 7 kinds of modules. +

    +The tools offered by Loglan'82 enable in various ways to create +generic modules whether they are to serve as generic procedures +or parameterized data types. In order to do so one can use either +the possibility to pass types as formal parameters or the inheritance +mechanisms. The language makes possible overloading the names +of operations via the mechanism of virtual functions or procedures. +

    +This and other programming tools offered by Loglan'82 permit to +quickly create a prototype of a program and to test it in a friendly +environment. The compiler gives a good diagnostic of the eventual +errors. For the time being we can not offer a code generator. +Instead you can use the Loglan_to_C crosscompiler. +

    +The language is especially well suited for the +

      +
    • reusability and +
    • proving the correctness. +
    + +

    +Loglan'82 supports various methods of programming: +

      +
    • imperative - since it is a descendant of Algol, Pascal, ... +
    • object-oriented - since it is a continuation, and extension +of the ingenious ideas of Simula-67, +
    • functional programming is easy, +
    • programming by rules is supported by a specialized class BACKTRACK +designed and developed in Loglan'82. +
    +
    + +
    +We would appreciate any news (comments, questions, suggestions, +objections, ...) from you. Please write to Andrzej.Salwicki@univ-pau.fr + +
    +
    + +

    + + + +


    + +
    +AS 08:03 +04/12/1994 +
    + +

    +Pau, le 26 Janvier 1994 + + + +pp \ No newline at end of file diff --git a/HTML/xiiuwgr.htm b/HTML/xiiuwgr.htm new file mode 100644 index 0000000..73133e6 --- /dev/null +++ b/HTML/xiiuwgr.htm @@ -0,0 +1,430 @@ + + +Xiiuwgraf + + + + +

    XIIUWGRAF

    + +
    Une classe Loglan predefinie
    +pour la gestion de graphismes en multifenêtrage
    +sous XWindows.
    + +

    + + +

    Auteurs et realisateurs:

    +

    Eric BECOURT & + Jerôme LARRIEU

    + + + + + + + + + + + + + + + + + + + + + + + + + + +LITA Pau 1993

    +


    +Table de matières
    ou +tresc
    + + +

    +

    +1: +Différences essentielles entre XIIUWGRAF et IIUWGRAPH

    + + + Ce paragraphe a pour objet de donner certaines particularités de XIIUWGRAF, ceci afin de comprendre son fonctionnement général.

    + + Tout d'abord il est important de signaler qu'à la différence de IIUWGRAPH, XIIUWGRAF est un programme à part entièc;re (plus exactement un processus crée par l'interprêteur LOGLAN).C'est pour cela qu'il est déconseillé (sauf cas de force majeure) de faire CONTROL-C pour terminer un programme : en effet, ceci a pour effet de terminer l'exécution de l'interprêteur sans terminer XIIUWGRAF (création d'un processus zombie). Pour terminer une session graphique, il faudra donc automatiquement taper dans le programme en LOGLAN la commande GROFF car elle va terminer l'exécution de XIIUWGRAF.

    + + Certaines commandes de IIUWGRAPH n'ont pas été implémentées (par exemple HIDECURSOR, SHOWCURSOR, PALLET, ...), soit parce qu'elles seraient d'un intérêt trèc;s faible dans la gestion de XWindows, soit parce qu'elles seraient difficilement réalisables, soit parce que les programmeurs ont été atteints de fainéantise chronique.

    + + Enfin, dans vos programmes il faudra impérativement que vos unités gérant le graphisme héritent de la classe IIUWGRAPH sous peine d'erreurs à la compilation .

    + +ATTENTION: appelez Xint au lieu de int

    + +

    : vers Tableau de Matieres

    +

    2: Ouvrir et fermer une fenêtre avec XIIUWGRAF

    + + + XIIUWGRAF permet à l'utilisateur d'ouvrir jusqu'à seize fenêtres à l'écran. Ces fenêtres sont sélectionnables dans le programme en LOGLAN par la commande GRON décrite plus loin.

    + +

    2.1: La procédure HPAGE .

    + +
    unit HPAGE: procedure(numerofenetre,x,y: INTEGER);

    + + Cette procédure a pour rôle de donner la position à laquelle sera affichée la fenêtre dans l'écran, de donner la taille de cette fenêtre et de l'effacer quand le besoin s'en fait sentir. Cette procédure devra être appelée deux fois pour ouvrir une fenêtre.

    + + HPAGE reçoit trois paramêtres : le premier est le numéro de la fenêtre (un entier compris entre 0 et 15), les deux suivants sont soit les coordonnées de la fenêtre à l'écran, soit la taille de cette fenêtre. Un troisièc;me appel de HPAGE avec l'un des deux derniers paramêtres nuls aura pour effet de l'effacer.

    + + Exemple : +

    +	      CALL HPAGE(0, posx, posy);

    + CALL HPAGE(0, longueur, hauteur);

    +

    + Le coin en haut à gauche de la fenêtre 0 sera aux coordonnées (posx,posy) et la fenêtre aura une taille de longueur X hauteur.

    + + CALL HPAGE(0, 0, valeur)

    + ou CALL HPAGE(0, valeur, 0)

    + ou CALL HPAGE(0, 0, 0)

    + + La fenêtre 0 est effacée.

    + +

    : vers Tableau de Matieres

    + + + +

    2.2: La procédure GRON .

    + +
    unit GRON: procedure(numerofenetre: INTEGER);

    + + La procédure GRON affiche la fenêtre de numéro numerofenetre à l'écran. Ensuite pour sélectionner la fenêtre dans laquelle on veut travailler, on refait un deuxièc;me appel de cette commande.

    +Exemple : +

    +    		             CALL HPAGE(0,0,0);

    + CALL HPAGE(1,150,0);

    + CALL HPAGE(0,100,100);

    + CALL HPAGE(1,200,150);

    + CALL GRON(0); (* Affichage de la fenêtre 0 *)

    + CALL GRON(1); (* Affichage de la fenêtre 1 *)

    + ...

    + CALL GRON(0); (* Sélection de la fenêtre 1 *)

    + ...

    +

    +

    : vers Tableau de Matieres

    + +

    2.3 : La procédure GROFF .

    + +
    unit GROFF: procedure;

    + + L'appel à cette commande a pour conséquence l'effaçage de toutes les fenêtres et la fin d'exécution du processus XIIUWGRAF.

    +

    : vers Tableau de Matieres

    + + +

    3: Description . des différentes +commandes graphiques

    + + +

    3.1: Procédure COLOR .

    + +
    unit COLOR: procedure(couleur: INTEGER);

    + + Permet de déterminer la couleur d'avant plan (0 pour noir et une valeur supérieure ou égale à 1 pour blanc). Cette commande a une action locale à la fenêtre sélectionnée par GRON.

    +

    : vers Tableau de Matieres

    + +

    3.2: Procédure BORDER .

    + +
    unit BORDER: procedure(couleur: INTEGER);

    + + Commande qui sélectionne la couleur de fond.

    +

    : vers Tableau de Matieres

    + +

    3.3: Procédure MOVE .

    + +
    unit MOVE: procedure(posx, posy: INTEGER);

    + + posx et posy deviennent les coordonnées courantes dans la fenêtre. Comme COLOR, MOVE n'agit que sur la fenêtre sélectionnée.

    +

    : vers Tableau de Matieres

    + +

    3.4: Procédure CLS .

    + +
    unit CLS: procedure;

    + + Efface la fenêtre en blanc par défaut ou de la couleur spécifiée par la commande BORDER.

    +

    : vers Tableau de Matieres

    + +

    : Procédure POINT .

    + +
    unit POINT: procedure(x,y: INTEGER);

    + Affiche un point aux coordonnées (x,y) de la couleur spécifiée par la commande COLOR ou noir par défaut. La position courante dans la fenêtre devient (x,y).

    +

    : vers Tableau de Matieres

    + +

    : Procédure DRAW .

    + +
    unit DRAW: procedure(x,y: INTEGER);

    + + Affiche une ligne qui part de la position courante dans la fenêtre vers la position (x,y). La position courante dans la fenêtre devient (x,y). Elle est affichée avec la couleur courante (sélectionnée avec COLOR) et avec le style de tracé courant (sélectionnée par la commande STYLE décrite plus loin);

    +

    : vers Tableau de Matieres

    + +

    : Procédure CIRB .

    + +
    unit CIRB: procedure(posx,posy,rayon:INTEGER,alpha,beta:REAL,cbord,style,p,q:INTEGER);

    + + Si style a pour valeur 0, CIRB affiche un arc de centre (posx,posy), de rayon rayon. alpha et beta sont les angles de départ et d'arrivée de l'arc en question. Si alpha=beta alors un cercle (ou une ellipse) est dessiné. Si p=q alors on obtient un cercle, si p> q une ellipse allongée dans le sens vertical est obtenue, sinon si p> q on a pour résultat une ellipse allongée dans le sens horizontal. Cet affichage est fait avec la couleur d'avant plan courante et le style de tracé courant.

    + + Si style vaut 1, CIRB affiche un arc rempli ressemblant à une portion de camenbert avec la couleur d'avant plan courante.

    + + Si style vaut 2, l'intérieur de l'arc délimité par sa courbure et la corde joignant ses deux extrêmités est rempli avec la couleur d'avant plan courante.

    + + Si l'on choisi pour style une valeur < 0 ou > 3, la valeur 0 est prise.

    +

    : vers Tableau de Matieres

    + +

    : Procédure HFILL .

    + +
    unit HFILL: procedure(y: INTEGER);

    + + Trace une ligne horizontale de la position courante (posx,posy) vers les coordonnées (posx,y) avec la couleur d'avant plan courante et le style de tracé courant. La position courante dans la fenêtre devient (posx,y).

    +

    : vers Tableau de Matieres

    + +

    : Procédure VFILL .

    + +
    unit VFILL: procedure(y: INTEGER);

    + + Trace une ligne verticale de la position courante (posx,posy) vers les coordonnées (x,posy) avec la couleur d'avant plan courante et le style de tracé courant. La position courante dans la fenêtre devient (x,posy).

    + +

    : vers Tableau de Matieres

    + +

    : Fonction INXPOS .

    + +
    unit INXPOS: function: INTEGER;

    + + Retourne la position courante sur l'axe des abscisses de la fenêtre courante.

    + +

    : vers Tableau de Matieres

    +

    +

    : Fonction INYPOS .

    + +
    unit INYPOS: function: INTEGER;

    + + Retourne la position courante sur l'axe des ordonnées de la fenêtre courante.

    + +

    : vers Tableau de Matieres

    +

    +

    : Commandes de saisie . et de restitution d'une partie d'une fenêtre.

    + +

    : Fonction GETMAP .

    + +

    unit GETMAP: function(x,y: INTEGER): arrayof  INTEGER;

    + + Sauve dans le tableau tab une partie rectanguraire de la fenêtre courante, le coin en haut à gauche étant la position courante dans la fenêtre et le coin en bas à droite étant la position (x,y).

    + Le tableau devrait avoir une taille minimum de: 4 + (nbrelignes * (3 + nbrecol div 8)) octets

    + En sachant qu'en LOGLAN un entier tient sur 4 octets(en UNIX seulement), il ne vous reste plus qu' à faire votre cuisine.

    +

    : vers Tableau de Matieres

    + +

    : Procédure PUTMAP .

    + +
    unit PUTMAP: procedure(tab: arrayof INTEGER);

    + + Affiche la portion d'image sauvée dans tab à la position courante dans la fenêtre. Ce qu'il y avait à cette même position avant l'affichage est totalement effaçé.

    +

    : vers Tableau de Matieres

    + +

    : Procédure ORMAP .

    + + unit ORMAP: procedure(tab: arrayof INTEGER);

    + + Lors de l'affichage, une opération OR est faite avec la portion d'image sauvée dans tab et celle à la position courante dans la fenèc;tre: l'image est donc affichée en "transparence".

    +

    : vers Tableau de Matieres

    + +

    : Procédure XORMAP .

    + +
    unit XORMAP: procedure(tab: arrayof INTEGER);

    + + Même chose qu' avec ORMAP à la différence qu'une opération XOR est faite avec l'image sauvée dans tab et celle à la position courante dans la fenêtre.

    + +

    : vers Tableau de Matieres

    + +

    : Procédure STYLE .

    + +
    unit STYLE: procedure(styl: INTEGER);

    + + Définit le style de tracé dans la fenêtre courante.

    + + Si style vaut 0, le tracé sera fait avec la couleur de fond.

    + Si style vaut 1, le tracé sera fait avec la couleur d'avant plan.

    + Si style vaut 2,3,4 ou 5, le tracé sera fait avec les motif suivant :

    + +

    2 : ******...******...******

    + 3 : ****......****......****

    + 4 : **...**...**...**

    + 5 : **.........**.........**

    où * : couleur d'avant plan

    + . : couleur de fond

    +

    : vers Tableau de Matieres

    + +

    : Fonction INPIX .

    + +
    unit INPIX: function(x,y: INTEGER);

    + + Cette fonction met la postion courante dans la fenêtre à (x,y) et renvoie la couleur du point de la fenêtre à cette position(0 pour noir et 1 pour blanc).

    + +

    +

    : vers Tableau de Matieres

    + +

    : Commandes de saisie et d'affichage de caractèc;res .

    + +

    : Fonction INKEY .

    + +
    unit INKEY: function: INTEGER;

    + + Retourne le code ascii de la touche tapée au clavier ou la valeur 0 sinon. L'appui sur les touches spéciales (comme SHIFT, les touche F1, F2, ..., CONTROL, ...) renvoient des valeurs négatives. Vous verrez bien par vous-même quelles sont ces valeurs en faisant un petit programme test.

    +

    : vers Tableau de Matieres

    + +

    : Procédure HASCII .

    + +
    unit HASCII: procedure(code_char: INTEGER);

    + + Affiche le caractèc;re de code ascii code_char avec le coin en haut à gauche du caractèc;re à la position courante (posx,posy) dans la fenêtre. La position courante devient (posx+largeur,posy).

    + Si code_char=0, une partie rectangulaire de largeur*hauteur est affichée avec la couleur de fond de la fenêtre courante et position courante dans la fenêtre reste inchangée.

    + En général la fonte par défaut qui est utilisée sous XWindows a une hauteur de dix points et une largeur de six points.

    + +

    : vers Tableau de Matieres

    + +

    : Procédure OUTSTRING .

    + +
    unit OUTSTRING: procedure(tab: arrayof  CHAR);

    + + Affiche la chaine de caractèc;re tab à la position courante (posx,posy) de la fenêtre. La position courante devient (posx+largeur*longueur_chaine,posy) où largeur est la largeur de la fonte utilisée.

    + +

    +

    : vers Tableau de Matieres

    + +

    : Procédure PUSHXY .

    + +
    unit PUSHXY: procedure;

    + + Sauvegarde le contexte graphique dans une pile, c'est à dire la position courante dans la fenêtre,les couleurs de fond et d'avant plan et le style de tracé sélectionné pour cette fenêtre.

    + + Chaque Fenêtre est dotée de sa pile de sauvegarde qui lui est propre et chaque pile a une profondeur maximale de 16.

    + +

    : vers Tableau de Matieres

    + +

    : Procédure POPXY .

    + +
    unit POPXY: procedure;

    + + Restore dans la fenêtre courante le contexte graphique situé en haut de la pile de sauvegarde et ce contexte est enlevé de la pile.

    +

    : vers Tableau de Matieres

    + +

    : Description des commandes de gestion de la souris .

    + + + +

    : Procédure STATUS .

    + +

    unit STATUS: procedure(h, v: INTEGER, l, r, c: BOOLEAN);

    + + Cette procédure renvoie la position courante (h,v) du pointeur de la souris ainsi que l'état des boutons de la souris. l,r,c sont respectivement les boutons gauche, droit et du centre de la souris.

    + + Ces valeurs booléennes ont la valeur TRUE si le bouton correspondant est appuyé.

    +

    : vers Tableau de Matieres

    + +

    : Procédure GETPRESS .

    + +
    unit GETPRESS: procedure(b: INTEGER; OUTPUT h,v,p : INTEGER, l,r,c : BOOLEAN);

    + + Cette procédure renvoie le nombre p de fois où le bouton sélectionné a été appuyé depuis le dernier appel à cette commande, ainsi que la position (h,v) du curseur la dernièc;re fois que le bouton considéré a été appuyé.

    + + Le paramêtre b permet de sélectionner le bouton à tester :

    + - 0 : bouton gauche

    + - 1 : bouton droit

    + - 2 : bouton du milieu

    + + En sus, la procédure renvoie l'état courant des trois boutons l,r,c.

    + +

    : vers Tableau de Matieres

    + +

    : Procédure GETRELEASE .

    + +
    unit GETRELEASE: procedure(b: INTEGER; OUTPUT h,v,p : INTEGER, l,r,c : BOOLEAN);

    + + Cette procédure a la même fonction que GETPRESS à la différence qu'elle teste le nombre de relâchementss du bouton sélectionné et non l'appui.

    + +

    +

    : vers Tableau de Matieres

    + +

    : Procédure GETMOVEMENT .

    + +
    unit GETMOVEMENT: procedure(h,v: INTEGER);

    + + Cette procédure renvoie le mouvement relatif (h,v) du curseur de la souris depuis son dernier appel.

    + + + +

    + +

    : vers Tableau de Matieres

    + + + +
    + + +
    : GMyAS à Pau, le 25 Octobre 1993

    + + + + + diff --git a/HTML/zaproszenie.html b/HTML/zaproszenie.html new file mode 100644 index 0000000..0b8b5eb --- /dev/null +++ b/HTML/zaproszenie.html @@ -0,0 +1,188 @@ + + +Zaproszenie do wspolpracy + + +

    Zaproszenie do wspolpracy

    +

    w 3 nowych duzych projektach badawczych:

    + +
  • Loglan'96

    +
  • CASE Next Generation

    +
  • Algorytmy probabilistyczne

  • +
    + +Do wszystkich, ktorzy chca dzialac:
      + +
    • rozwijac nowe koncepcje programowania obiektowego, wspolbieznego, rownoleglego i rozproszonego +
    • podniesc(zdobyc) swoje kwalifikacje biorac udzial w badaniach, +
    • przyczynic sie do rozwoju systemu Loglan, +
    • stworzyc nowa jakosc w inzynierii oprogramowania, +
    • dolozyc swoja cegielke do budowy obrazu naszego srodowiska, jako srodowiska dynamicznego, wiedzacego czego chce, zamierzajacego rozwiazac wazne problemy i oferujacego spoleczenstwu wyniki badan +
    +

    kierujemy niniejsze + + +

    ZAPROSZENIE

    + +na spotkanie - dyskusje
    +
    +

    27 marca 1996 o godz. 12

    +

    w sali 12, Instytutu Informatyki +Politechnika Bialostocka

    +

    ul Wiejska 45a Bialystok

    + +

    Podczas spotkania przedstawimy trzy sporych rozmiarow projekty badawcze: +

      +
    • prof. dr hab. Wiktor DANKO - Algorytmy probabilistyczne

      +
    • prof. dr hab. Grazyna MIRKOWSKA - CASE NT, system CASE nastepnej +generacji

      +
    • prof. dr hab. Andrzej SALWICKI - Loglan'96

      +
    + +

    Wszystkie projekty rzucaja wyzwanie trudnosciom teoretycznym, zlozonosci projektow i +naszej ogolnej niemoznosci. Nie mamy zamiaru niczego ukrywac, chcemy te wyzwania +omowic i przedyskutowac. Wiemy, ze ich pokonanie jest mozliwe.
    +Projekty te sa ze soba scisle powiazane: w projekcie CASE NT chcemy wykorzystac +Loglan jako narzedzie pracy i jako zrodlo doswiadczen, w projekcie Loglan'96 +chcielibysmy by system CASE NT stanowil uzupelnienie systemu kompilator+interpreter. + +

    Czy mamy szanse?

    Jak najbardziej TAK! Swiadcza o tym rozne fakty +
      +
    • Loglan'82 - juz raz to zrobilismy z sukcesem, +
    • Linux - tu nie tylko sie powiodlo ale system rozprzestrzenia sie (miliony uzytkownikow) i +rozwija (nowi wspolpracownicy w sieci Internet wnosza coraz to nowe pomysly i +rozwiazania) +
    • Java - pojawienie sie Javy - mlodszego brata Loglanu, potwierdza:
      slusznosc naszych +koncepcji (np. interpreter pozwala uniezaleznic sie od platformy),
      przewage naszych +doswiadczen(np. alien call nie zostal dotad odkryty i zastosowany poza Loglanem),
      +dojrzalosc naszej bazy teoretycznej(np. rozwiazanie problemu 'wiszacych referencji", +mozliwosc zagniezdzania modulow i dziedziczenia z roznych poziomow zagniezdzania), +
    • systemy rozproszone - TU JEST NASZA SZANSA! i nisza ekologiczna, +
    • GNU - spokojna praca dla srodowiska informatykow daje rezultaty doceniane przez +wielu (no, moze poza Microsoftem) +
    + + +

    Czy bedziemy sami?

    +

    Mamy nadzieje, ze nie. Kazdy z proponowanych projektow moze przyciagnac wielu wspolpracownikow z Polski i z zewnatrz. Dla kazdego znajdzie sie praca odpowiednia do jego kwalifikacji i zamilowan. +Nasze zaproszenie jest zaadresowane do pracownikow naukowych, ambitnych studentow, placowek badawczych i firm software'owych. + +

    Co mozemy z tego miec?

    +
      +
    1. Kilka produktow o nowych cechach, nowej jakosci.
      Produkty te moga byc rozpowsechniane na zasadach jakie zostana przez nas ustalone. Nawet jesli ustalimy, ze "goly" produkt bedzie udostepniany za darmo, to jego odpowiednio "ubrana" wersja moze byc produktem komercyjnym. Osoby i firmy konfekcjonujace software moga zawsze pobierac za to oplaty.
      Dla przykladu przypominam, ze system TEX jest dystrybuowny za darmo a systemy TEXtures (dla Maca) i Scientific Word (dla Windows), kosztuja kilkaset zlotych/egz. Mozna znalezc inne przyklady (Mosaic i Netscape, Linux ktory mozna sciagnac za darmo lub kupic CD-ROM z Linuxem, etc.) +
    2. Najwazniejszym efektem naszych prac powinny sie stac publikacje i komunikaty na konferencjach. +
    3. Publikacje te powinny prowadzic do potwierdzenia zdobytych kwalifikacji w postaci stopni naukowych: magisteriow, doktoratow i habilitacji. + +
    +

    Co trzeba zrobic?

    +

    Zacznijmy od cytatu "apetyt rosnie w miare jedzenia". W naszym przypadku oznacza to, ze poczatkowa specyfikacja +projektu (projektow) bedzie ulegac zmianom, rozszerzeniom. +

    +

    Loglan'96

    +

    Tu jest wiele do zrobienia: +

      +
    • projekt nowego jezyka i jego realizacja,
      + +Nalezy wprowadzic troche niezbednych zmian i troche ulepszen.
      +Opracowac definicje semantyki jezyka (najlepiej podac aksjomatyczna definicje - to zadanie trudne ale mozliwe do zrealizowania),
      +Napisac kompilator w Loglanie. Dlaczego w Loglanie?
      +Zaprojektowac nowy interpreter - L-maszyne Dlaczego interpreter?
      + + +
    • rozwoj zastosowan obecnej wersji Loglanu i jej pielegnacja do czasu uruchomienia nowej wersji
      +Szczegolnie wazne jest dokonczenie prac nad wykonywaniem programow Loglanowskich w sieci maszyn w pelni heterogenicznej. Obecnie Loglan jest realizowany w sieci maszyn Unixowych (Sun, Apollo, Linux, SCO Unix etc). Dla uczelni wazne jest aby siec zawierala maszyny roznych platform (DOS, Windows, Unix...)
      +Ulepszenie predefiniowanych klas GRAFIKA i MYSZ. Szczegolnie dla X-windows. Obecne wersje nas nie zadowalaja. +
    • opracowanie programu pracowni programowania obiektowego,
      + +
    • opracowanie bardziej nowoczesnej wersji srodowiska Loglanu +
    +Idzie tu nie tylko o badania wdrozeniowe, ktorych cecha jest poszukiwanie odpowiedzi na pytanie: czy mozna zbudowac przedmiot (tu: software) o pozadanych (wyspecyfikowanych ) cechach. +W projekcie mieszcza sie tez badania o charakterze podstawowym - poszukiwanie odpowiedzi na zasadnicze pytania zob. otwarte problemy

    +

    Ponizej przedstawiamy zestawienie zadan w trzech wiekszych grupach tematycznych.

    I nieco komentarzy. + + + + + + + + + + + + + + + + + + + +

    Loglan'96

    Przedyskutowac i zatwierdzic raport jezykauwaga.1sza wersja powinna byc gotowa szybko. +Spodziewamy sie ze trzeba bedzie ja poprawic gdy beda pierwsze wyniki dot. implementacji
    Stworzyc opis jezyka Chcielibysmy by byl to opis formalny, aksjomatyczny, wykorzystujacy aparature logiki algorytmicznej. Ale wymagac to bedzie rozwiazania nowych problemow. W szczegolnosci dotyczacych dziedziczenia klas.
    Stworzyc opis L-maszyny virtualnej czyli interpreteraIstnieje cenne opracowanie A. Kreczmara. Do niego trzeba by dodac: procesy i obiekty trwale (persistent object).
    Podac specyfikacje i zaimplementowac kompilator Loglanu'96 w Loglanie Proponujemy by zastosowac metode zstepujacej rekursji. Zastanowic sie czy przy okazji nie da sie stworzyc modulu alternatywnego dla yacca i bisona. Mialoby to polegac na automatycznym tworzeniu klas i innych modulow (pierwszej czesci) kompilatora na podstawie gramatyki jezyka zapisanej w notacji EBNF.
    Zbadac i zaproponowac nowa koncepcje biblioteki modulow predefiniowanychKazdy program jest domyslnie prefiksowany klasa BIBLIOTEKA
    +pref BIBLIOTEKA programjego nazwa;
    +...
    end;
    +Dzieki temu moze dziedziczyc inne moduly zawarte w BIBLIOTECE. Ale tylko te z pierwszego poziomu zagniezdzenia.
    +Krotko mowiac, uwazamy ze nalezy pojecie biblioteki zorganizowac wokol pojec modul i klasa. +
    Zaimplementowac rozpraszanie procesow w sieci heterogenicznej. Obecnie potrafimy rozpraszac procesy w sieci maszyn Unixowych. Najblizsze zadania polegaja na przeniesieniu obecnych rozwiazan na siec zawierajaca maszyny DOS i Windows, a takze na Novella i inne platformy.
    Biblioteki uslug sieciowych dla programowania w Loglanie. Rozszerzyc zbior klas predefiniowanych o klase NETLIB umozliwiajaca korzystanie z protokolow sieciowych roznych warstw np. TCP/IP, FTP, HTTP, ...
    "Stary" Loglan
    Uporzadkowac dokumentacje Np. wydac nowa wersje raportu jezyka. To juz jest zaawansowane.
    Ulepszyc srodowisko Loglanu Np. poprawic edytor Lotek, lub napisac nowy
    +Rozwazyc ponowne wprowadzenie debuggera Teresy Przytyckiej.
    +Ujednolicic biblioteke graficzna: w tej chwili biblioteki dla DOSa i Xwindows bardzo sie roznia. Mozna napisac w Loglanie jedna wspolna "czapke".
    Uporzadkowac aplikacje i ich opisy
    1. Klasa simulation
    2. Opracowac pracownie programowania dla wybranych przedmiotow np. algorytmy i struktury danych , programowanie wspolbiezne i rozproszone, etc.
    Nowe aplikacje
    CASE NT zob. ponizej
    browser typu HotJava to moze byc i ciekawe i pozyteczne
    Obiektowa baza danych Tu jest sporo wynikow zespolu L. Banachowskiego trzeba to wykorzystac
    Nowa klasa simulation Jak powinna wygladac symulacja przeprowadzana na maszynie wieloprocesorowej? Nie wiemy, ale podejrzewamy ze powinien powstac nowy uniwersalny modul. Jego specyfikacja nie jest dla nas ozywista. Symulacja wieloprocesorowa powinna byc bardziej wydajna za wzgledu na przyspieszenie ale moze tez wnosic i inne aporty.
    +Jest oczywiste ze ta tabela to tylko proba zorganizowania roznych zadan zwiazanych z naszym projektem. Bedzie sie ja rozbudowywac i zaopatrywac w odnosniki wskazujace na stan zaawansowania i adres osoby(osob) pracujacych nad zagadnieniem. +

    CASE NT

    +

    Obecne systemy CASE sa drogie i nie dostarczaja zadnych narzedzi wpomagajacych analize poprawnosci +powstajacego oprogramowania wzgledem jego specyfikacji. Gorzej, bo nie dostarczane sa narzedzia wspomagajace tworzenie specyfikacji ani tym bardziej ich analizy. Dzis czesto przez specyfikacje rozumie sie liste metod (operacji) czyli funkcji i procedur wraz z wyliczeniem typow argumentow i wynikow. To jest uproszczenie idace zbyt daleko. Mozna dolaczyc postulaty dotyczace tych procedur. Zapisane w jezyku etnicznym nie nadaja sie one do dalszego formalnego przetwarzania.
    +My mozemy sie wesprzec na naszych wlasnych wynikach dotyczacych specyfikacji. Nasza metoda specyfikacji zostala sprawdzona w kilku eksperymentach i cieszy sie nastepujacymi (meta)wlasnosciami:
    +

      +
    • IDENTYFIKACJA - rozwiazujemy zadanie zidentyfikowania (specyfikacji) abstrakcyjnego typu danych, +
    • PELNOSC - zbior prawdziwych wlasnosci programow wykonywanych w modelach specyfikacji jest rowny zbiorowi wlasnosci dowodliwych z aksjomatow, +
    zatem +
      +
    • dostarcza KRYTERIUM AKCEPTOWALNOSCI modulow software'owych, +
    • stanowi dobra baze dla weryfikacki wlasnosci dowodow (BAZA DOWODOW) +
    +Nowy system CASE powienen stac sie asystentem zespolu tworzacego oprogramowanie. Powinien nie tylko pamietac o sygnaturze modulow jakie maja powstac, ale i o wlasnosciach jakie maja byc zagwarantowane.
    +

    Formalnym narzedziem powstajacego systemu CASE bedzie logika algorytmiczna. Rachunek ten w swiecie programowania ma do spelnienia role porownywalna z rola rachunku rozniczkowego i calkowego w tradycyjnej inzynierii mechanicznej czy elektrycznej.
    +Naszym zdaniem nowy system powinien przewyzszac dotychczas znane systemy i dostarczac narzedzi wspomagajacych dowodzenie wlasnosci programow z aksjomatow specyfikacji.
    +Zadania jakie sobie stawiamy to miedzy innymi opis abstrakcyjnego typu danych: SRODOWISKO DOWODOW FORMALNYCH Logiki Algorytmicznej i jego obiektowa realizacja. Nalezy wiec opisac typy danych np. formula, wezel drzewa dowodu, drzewo dowodu, etc.i operacje na nich. Zaprogramowac klasy i metody odpowiadajace opisanym typom i operacjom. Zaprogramowac przyjazne srodowisko asystujace dowodzeniu wlasnosci programow. +

    Algorytmy probabilistyczne

    Algorytmy probabilistyczne znajduja rozliczne zastosowania + (bardziej znane to np. symulacja i analiza procesow masowej + obslugi). +

    +
    wyznaczanie prawdopodobienstw zachowan algorytmow + probabilistycznych dzialajacych na zbiorach skonczonych,opracowanie oprogramowania (w Loglanie) umozliwiajacego wyznaczanie prawdopodobienstw zachowan algorytmow probabilistycznych (niezaleznie od symulacji ich dzialania)
    zastosowanie algorytmow do zagadnien analizy informacji + niepewnej (porownanie z metoda zbiorow przyblizonych - + Z.Pawlak, A.Skowron), w procesie analizy algorytmow probabilistycznych nasza uwaga skupiona jest wylacznie na stanach koncowych, np. proces wypracowania przyblizonych regul decyzyjnych (analogicznie: zasad wnioskowania statystycznego) dokonuje sie przy pomocy pewnego algorytmu probabilistycznego; poszczegolnym regulom odpowiadaja pewne stany koncowe,
    badanie zwiazkow miedzy algorytmami probabilistycznymi, + interpretowanymi w dziedzinach skonczonych, ze skonczenie + stanowymi lancuchami Markowa:nawet w przypadku bardzo prostych iteracyjnych + algorytmow probabilistycznych, interpretowanych + w skonczonym zbiorze, odpowiadajacy lancuch Markowa + nie musi byc ergodyczny,
    potrafimy juz wyznaczac prawdopodobienstwa przejsc + wylacznie do stanow koncowych, nawet w przypadku + lancuchow nieergodycznych.
    + + + + + + + + + +

    Czy trzeba biernie czekac na spotkanie?

    +

    Mamy nadzieje, ze nasza propozycja nie jest Ci obojetna. +

      +
    • Jesli jestes oponentem przyjdz na spotkanie lub napisz do nas. +
    • Jesli wydaje Ci sie ze plan jest do przyjecia to zglos sie do nas nie czekajac. +
    • Czekamy na wszelkie uwagi, propozycje, krytyke. +
    +

    Jesli nie jestes mieszkancem Bialegostoku to nie szkodzi.

    Mozemy pracowac razem na odleglosc. (Tak jak pracuja w projekcie Linux i in.). A moze zechcialbys przyjechac 27go? (czy mamy zalatwic nocleg?) +

    Jesli czytasz te strony po 27 marca to:

    +- przeczytaj sprawozdanie ze spotkania.
    +- napisz do nas
    +
    +
    Last update Fri 1 Mar 1996
    +Grazyna Mirkowska
    + Andrzej Salwicki +
    + + \ No newline at end of file diff --git a/at_work/case_al/index.html b/at_work/case_al/index.html new file mode 100644 index 0000000..f226885 --- /dev/null +++ b/at_work/case_al/index.html @@ -0,0 +1,17 @@ + + + + + + + + +

    + +Sorry, page under construction ! +

    + + + + +ÔÔ diff --git a/at_work/case_al/index.html~ b/at_work/case_al/index.html~ new file mode 100644 index 0000000..d1f5294 --- /dev/null +++ b/at_work/case_al/index.html~ @@ -0,0 +1,17 @@ + + + + + + + + +

    + +Sorry page under construction ! +

    + + + + +Ô \ No newline at end of file diff --git a/at_work/exe_old/486.inc/bank2.log b/at_work/exe_old/486.inc/bank2.log new file mode 100644 index 0000000..3e5b881 --- /dev/null +++ b/at_work/exe_old/486.inc/bank2.log @@ -0,0 +1,336 @@ +BLOCK +(* BANK DEPARTMENT SERVICE SIMULATION *) + + + +UNIT PRIORITYQUEUE: CLASS; + (* HEAP AS BINARY LINKED TREE WITH FATHER LINK*) + + + + UNIT QUEUEHEAD: CLASS; + (* HEAP ACCESING MODULE *) + VAR LAST,ROOT:NODE; + + UNIT MIN: FUNCTION: ELEM; + BEGIN + IF ROOT=/= NONE THEN RESULT:=ROOT.EL FI; + END MIN; + + UNIT INSERT: PROCEDURE(R:ELEM); + (* INSERTION INTO HEAP *) + VAR X,Z:NODE; + BEGIN + X:= R.LAB; + IF LAST=NONE THEN + ROOT:=X; + ROOT.LEFT,ROOT.RIGHT,LAST:=ROOT + ELSE + IF LAST.NS=0 THEN + LAST.NS:=1; + Z:=LAST.LEFT; + LAST.LEFT:=X; + X.UP:=LAST; + X.LEFT:=Z; + Z.RIGHT:=X; + ELSE + LAST.NS:=2; + Z:=LAST.RIGHT; + LAST.RIGHT:=X; + X.RIGHT:=Z; + X.UP:=LAST; + Z.LEFT:=X; + LAST.LEFT.RIGHT:=X; + X.LEFT:=LAST.LEFT; + LAST:=Z; + FI + FI; + CALL CORRECT(R,FALSE) + END INSERT; + +UNIT DELETE: PROCEDURE(R: ELEM); + VAR X,Y,Z:NODE; + BEGIN + X:=R.LAB; + Z:=LAST.LEFT; + IF LAST.NS =0 THEN + Y:= Z.UP; + Y.RIGHT:= LAST; + LAST.LEFT:=Y; + LAST:=Y; + ELSE + Y:= Z.LEFT; + Y.RIGHT:= LAST; + LAST.LEFT:= Y; + FI; + Z.EL.LAB:=X; + X.EL:= Z.EL; + LAST.NS:= LAST.NS-1; + R.LAB:=Z; + Z.EL:=R; + IF X.LESS(X.UP) THEN CALL CORRECT(X.EL,FALSE) + ELSE CALL CORRECT(X.EL,TRUE) FI; + END DELETE; + +UNIT CORRECT: PROCEDURE(R:ELEM,DOWN:BOOLEAN); + (* CORRECTION OF THE HEAP WITH STRUCTURE BROKEN BY R *) + VAR X,Z:NODE,T:ELEM,FIN,LOG:BOOLEAN; + BEGIN + Z:=R.LAB; + IF DOWN THEN + WHILE NOT FIN DO + IF Z.NS =0 THEN FIN:=TRUE ELSE + IF Z.NS=1 THEN X:=Z.LEFT ELSE + IF Z.LEFT.LESS(Z.RIGHT) THEN X:=Z.LEFT ELSE X:=Z.RIGHT + FI; FI; + IF Z.LESS(X) THEN FIN:=TRUE ELSE + T:=X.EL; + X.EL:=Z.EL; + Z.EL:=T; + Z.EL.LAB:=Z; + X.EL.LAB:=X + FI; FI; + Z:=X; + OD + ELSE + X:=Z.UP; + IF X=NONE THEN LOG:=TRUE ELSE LOG:=X.LESS(Z); FI; + WHILE NOT LOG DO + T:=Z.EL; + Z.EL:=X.EL; + X.EL:=T; + X.EL.LAB:=X; + Z.EL.LAB:=Z; + Z:=X; + X:=Z.UP; + IF X=NONE THEN LOG:=TRUE ELSE LOG:=X.LESS(Z); + FI; + OD + FI; + END CORRECT; + +END QUEUEHEAD; + + +UNIT NODE: CLASS (EL:ELEM); + (* ELEMENT OF THE HEAP *) + VAR LEFT,RIGHT,UP: NODE, NS:INTEGER; + UNIT LESS: FUNCTION(X:NODE): BOOLEAN; + BEGIN + IF X= NONE THEN RESULT:=FALSE + ELSE RESULT:=EL.LESS(X.EL) FI; + END LESS; + END NODE; + + +UNIT ELEM: CLASS(PRIOR:REAL); + (* PREFIX OF INFORMATION TO BE STORED IN NODE *) + VAR LAB: NODE; + UNIT VIRTUAL LESS: FUNCTION(X:ELEM):BOOLEAN; + BEGIN + IF X=NONE THEN RESULT:= FALSE ELSE + RESULT:= PRIOR< X.PRIOR FI; + END LESS; + BEGIN + LAB:= NEW NODE(THIS ELEM); + END ELEM; + + +END PRIORITYQUEUE; + +(********************************************************************* +*********************************************************************) + +#include "simula.inc" + +UNIT LISTS:SIMULATION CLASS; + (* WE WISH TO USE LISTS FOR QUEUEING PROCESSES DURING SIMULATION*) + + UNIT LINKAGE:CLASS; + (*WE WILL USE TWO WAY LISTS *) + VAR SUC1,PRED1:LINKAGE; + END LINKAGE; + UNIT HEAD:LINKAGE CLASS; + (* EACH LIST WILL HAVE ONE ELEMENT ESTABLISHED *) + UNIT FIRST:FUNCTION:LINK; + BEGIN + IF SUC1 IN LINK THEN RESULT:=SUC1 + ELSE RESULT:=NONE FI; + END; + UNIT EMPTY:FUNCTION:BOOLEAN; + BEGIN + RESULT:=SUC1=THIS LINKAGE; + END EMPTY; + BEGIN + SUC1,PRED1:=THIS LINKAGE; + END HEAD; + + UNIT LINK:LINKAGE CLASS; + (* ORDINARY LIST ELEMENT PREFIX *) + UNIT OUT : PROCEDURE; + BEGIN + IF SUC1=/=NONE THEN + SUC1.PRED1:=PRED1; + PRED1.SUC1:=SUC1; + SUC1,PRED1:=NONE FI; + END OUT; + UNIT INTO:PROCEDURE(S:HEAD); + BEGIN + + CALL OUT; + IF S=/= NONE THEN + IF S.SUC1=/=NONE THEN + SUC1:=S; + PRED1:=S.PRED1; + PRED1.SUC1:=THIS LINKAGE; + S.PRED1:=THIS LINKAGE; + FI FI; + END INTO; + END LINK; + + UNIT ELEM:LINK CLASS(SPROCESS:SIMPROCESS); + (* USER DEFINED PROCESS WILL BE JOINED INTO LISTS *) + END ELEM; + + END LISTS; + + + + + + (*BEGIN OF BANK DEPARTMENT SIMULATION *) + + + UNIT OFFICE:LISTS CLASS; (*AN OFFICE*) + + UNIT TILL:SIMPROCESS CLASS(QUEUE:HEAD); + (* TELLER WITH CUSTOMERS QUEUEING UP *) + UNIT VIRTUAL SERVICE:PROCEDURE; + (* SERVICE OF THIS TELLER WILL BE PRECISED LATER *) + END SERVICE; + VAR CSTM:CUSTOMER, (*THE CUSTOMER BEING SERVED*) + REST,PAUSE:REAL; + + BEGIN + PAUSE:=TIME; + DO + REST:=REST+TIME-PAUSE; + WHILE NOT QUEUE.EMPTY DO + (* SERVE ALL QUEUE *) + CSTM:=QUEUE.FIRST QUA ELEM.SPROCESS; + CALL SERVICE; + CALL SCHEDULE(CSTM,TIME); + OD; + PAUSE:=TIME; + CALL PASSIVATE + OD; + END TILL; + + UNIT CUSTOMER:SIMPROCESS CLASS; + + VAR ELLIST:ELEM, K:INTEGER; + UNIT ARRIVAL:PROCEDURE(S:TILL); + (* ATTACHING TELLER S *) + BEGIN + IF S=/=NONE THEN + ELLIST:=NEW ELEM(THIS CUSTOMER); + CALL ELLIST.INTO(S.QUEUE); + IF S.IDLE THEN CALL SCHEDULE(S,TIME) FI; + CALL PASSIVATE; FI; + END ARRIVAL; + END CUSTOMER; + + END OFFICE; + + + +UNIT BANKDEPARTMENT:OFFICE CLASS; + + + UNIT COUNTER:TILL CLASS; + VAR PAYTIME:REAL; (*RANDOM SERVICE TIME*) + UNIT VIRTUAL SERVICE:PROCEDURE; + BEGIN + WRITELN(" THE PAY DESK SERVES CUSTOMER NO",CSTM.K, + " AT",TIME:10:4); + CALL CSTM.ELLIST.OUT; + PAYTIME:=RANDOM*2+2; + CALL HOLD(PAYTIME); + END SERVICE; + END COUNTER; + + + UNIT TELLER:TILL CLASS(NUMBER:INTEGER); + VAR SERVICETIME:REAL; + UNIT VIRTUAL SERVICE:PROCEDURE; + VAR N:INTEGER; + BEGIN + WRITELN(" THE TELLER NO",NUMBER," WAS IDLE FOR",REST:10:4, + " SEC"); + CALL CSTM.ELLIST.OUT; + N:=CSTM QUA BANKCUSTOMER.NO; + WRITELN(" THE CUSTOMER NO",CSTM.K, + " BEGINS TO BE SERVED BY THE TELLER NO",NUMBER, + " AT",TIME:10:4); + ACCOUNT(N):=ACCOUNT(N)+CSTM QUA BANKCUSTOMER.AMOUNT; + IF ACCOUNT(N)<0 THEN CALL CSTM.ARRIVAL(CONTROL);FI; + SERVICETIME:=RANDOM*7+3; + CALL HOLD(SERVICETIME); + + END SERVICE; + END TELLER; + + + UNIT BANKCUSTOMER:CUSTOMER CLASS(NO:INTEGER,AMOUNT:REAL); + (* BANK CUSTOMER. AMOUNT- THE MONEY TO BE PAID AT THE BANK *) + VAR ARRIVALTIME,STAYTIME:REAL,CHOOSETELLER:INTEGER; + BEGIN + I:=I+1; + K:=I; + ARRIVALTIME:=TIME; + WRITELN(" THE CUSTOMER NO",K," ARRIVED AT",TIME:10:4); + CHOOSETELLER:=RANDOM*5+1; + CALL ARRIVAL(TELLERS(CHOOSETELLER)); + IF AMOUNT<0 THEN CALL ARRIVAL(CTR); FI; + STAYTIME:=TIME-ARRIVALTIME; + WRITELN(" THE CUSTOMER NO",K," STAYED AT THE BANK FOR", + STAYTIME:10:4," SEC; STATE OF ACCOUNT",ACCOUNT(NO):10:4); + END BANKCUSTOMER; + + VAR TELLERS:ARRAYOF TELLER,ACCOUNT:ARRAYOF REAL; + VAR CTR:COUNTER, CONTROL:TILL,I:INTEGER; + + BEGIN (* NEW BANK DEPARTMENT GENERATION *) + CTR:=NEW COUNTER(NEW HEAD); + ARRAY TELLERS DIM(1:5); (* WE DEAL WITH 5 TELLES *) + FOR I:=1 TO 5 DO TELLERS(I):=NEW TELLER(NEW HEAD,I); OD; + ARRAY ACCOUNT DIM(1:100); + (* WE DEAL WITH 100 ACOUNTS IN THIS BANK DEPARTMENT *) + FOR I:=1 TO 100 DO ACCOUNT(I):=RANDOM*901+100; OD; + (* AN ACCOUNT VALUE CAN FLUCTUATE FROM 100 TO 1000$ *) + I:=0; + END BANKDEPARTMENT; + + + + BEGIN (* OF PROGRAM *) + PREF BANKDEPARTMENT BLOCK + UNIT GENERATOR:SIMPROCESS CLASS; + (* CUSTOMERS GENERATION *) + BEGIN + DO + CALL SCHEDULE(NEW BANKCUSTOMER(RANDOM*100+1, + RANDOM*9996+5),TIME); + CALL HOLD(RANDOM*10); + CALL SCHEDULE(NEW BANKCUSTOMER(RANDOM*100+1, + -(RANDOM*900+5)),TIME); + CALL HOLD(RANDOM*10); + OD + END GENERATOR; + BEGIN + WRITELN(" BANK DEPARTMENT SERVICE SIMULATION"); + WRITELN; + CALL SCHEDULE(NEW GENERATOR,TIME); + CALL HOLD (40); + END +END diff --git a/at_work/exe_old/486.inc/cc.bat b/at_work/exe_old/486.inc/cc.bat new file mode 100644 index 0000000..f4c1dcc --- /dev/null +++ b/at_work/exe_old/486.inc/cc.bat @@ -0,0 +1,11 @@ +rem IF: +rem 1ø the programs: loglan.exe, gen.exe, int.exe are visible here +rem 2ø the first parameter %1 of this command is the file +rem containing what you believe a source of Loglan program +rem THEN it may be useful to use this command cc + +loglan %1 +pause +gen %1 +del %1.lcd +int %1 diff --git a/at_work/exe_old/486.inc/essai.log b/at_work/exe_old/486.inc/essai.log new file mode 100644 index 0000000..7d2081b --- /dev/null +++ b/at_work/exe_old/486.inc/essai.log @@ -0,0 +1,10 @@ +program essai; + +#include "var.inc"; + + +begin + writeln("give an integer"); + readln(i); + writeln(i); +end essai; diff --git a/at_work/exe_old/486.inc/exec.bat b/at_work/exe_old/486.inc/exec.bat new file mode 100644 index 0000000..fc25de7 --- /dev/null +++ b/at_work/exe_old/486.inc/exec.bat @@ -0,0 +1,6 @@ +@ECHO OFF +set COMPILER_PATH=c:/loglan/exe/svga +set TMPDIR=c:/tmp +set GO32TMP=c:/tmp +set GO32=driver c:/loglan/exe/386/ega16.grd gw 640 gh 348 + diff --git a/at_work/exe_old/486.inc/gen.exe b/at_work/exe_old/486.inc/gen.exe new file mode 100644 index 0000000000000000000000000000000000000000..635f73116017b9513a452a3e6d514e2a43cd3a75 GIT binary patch literal 70174 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 Y-jxQkmENb+<;60eMB|F&;&ikB2bSE0J^%m! literal 0 HcmV?d00001 diff --git a/at_work/exe_old/486.inc/int.exe b/at_work/exe_old/486.inc/int.exe new file mode 100644 index 0000000000000000000000000000000000000000..c0330e76b8b2dc8d163ae55fa15359ece56f61dc GIT binary patch literal 150360 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�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 bV0eM12SFGL7BD$LSquz=CilW!L?HtJhxBl0 literal 0 HcmV?d00001 diff --git a/at_work/exe_old/486.inc/loglan.exe b/at_work/exe_old/486.inc/loglan.exe new file mode 100644 index 0000000000000000000000000000000000000000..62821c2264d77aeae98cbade4dbed4f639432254 GIT binary patch literal 225368 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 z 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

    S!k(+$}xUTAy%U2A&3$1 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 Y2zW=pI|AMj@Q#3Y1iT~ge;k270kjAl;Q#;t literal 0 HcmV?d00001 diff --git a/at_work/exe_old/logpp.exe b/at_work/exe_old/logpp.exe new file mode 100644 index 0000000000000000000000000000000000000000..fcf7ce42d6dc5ab906cc099f38a3c94cee5b572f GIT binary patch literal 72704 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 literal 0 HcmV?d00001 diff --git a/at_work/exe_old/logsesja.bat b/at_work/exe_old/logsesja.bat new file mode 100644 index 0000000..94dcc2a --- /dev/null +++ b/at_work/exe_old/logsesja.bat @@ -0,0 +1,5 @@ +@ECHO OFF +set TMPDIR=c:/tmp +set GO32TMP=c:/tmp +set GO32=driver emu387 c:/loglan/exe/stdvga.grn gw 640 gh 480 +rem path f:\loglan\exe\386;f:\loglan\lotek;%path% \ No newline at end of file diff --git a/at_work/exe_old/old1.log b/at_work/exe_old/old1.log new file mode 100644 index 0000000..2184cc8 --- /dev/null +++ b/at_work/exe_old/old1.log @@ -0,0 +1,91 @@ +Program SystemedeFenetrage; +Begin +Pref iiuwgraph block + Begin + Pref mouse block + + + (*****************************************************************************) + (* P r o g r a m m e P r i n c i p a l *) + (*****************************************************************************) + var v,p,h,i : integer, + l,r,c : integer, + rep : arrayof char, + d : boolean, + xx,yy : arrayof integer, + status,code,x,y,flags,button : integer; + + Begin + + call gron(0); + call init(1,0); + + call showcursor; + call patern(5,5,635,475,2,0); + call outstring(10,10,"x=",2,0); + call outstring(100,10,"y=",2,0); + call outstring(10,30,"status = ",2,0); + call outstring(10,50,"code = ",2,0); + call outstring(10,70,"flags = ",2,0); + call outstring(10,90,"button = ",2,0); + call patern(100,210,300,320,3,1); + + array xx dim (1:6); + array yy dim (1:6); + xx(1):=410; yy(1):=10; + xx(2):=450; yy(2):=30; + xx(3):=460; yy(3):=50; + xx(4):=430; yy(4):=80; + xx(5):=420; yy(5):=40; + xx(6):=480; yy(6):=30; + call intens(6,xx,yy,8,1); + for i:=1 to 6 + do + yy(i):=yy(i)+100; + od; + call intens(6,xx,yy,15,0); + + call cirb(500,300,50,40,100,3500,10,0); + call cirb(400,400,40,40,600,4000,11,1); + + + i:=hfont(100,350,6,-9999999,9999999,500,9,0,15); + call hpage(100,400,10,unpack("Il fait beau dans ma verte campagne"),9,0); + rep:=hfont8(100,430,10,80,unpack("tototutu"),9,0,15); + + call getmovement(1,1); + + do + d:=getpress(v,p,h,l,r,c); + if (d) + then call outstring(10,400,"Event",2,0); + call patern(80,25,130,100,0,1); + call track(40,10,v,0,4); + call track(140,10,p,0,4); + call track(80,30,h,0,4); + call track(80,50,l,0,4); + call track(80,70,r,0,4); + call track(80,90,c,0,4); + if((h=164 and l=27) or (c=3)) + then exit; + fi; + fi; + od; + call groff; + writeln("i=",i); + for i:=lower(rep) to upper(rep) + do + write(rep(i)); + od; + writeln; + End + End +End. + + + + + + + + diff --git a/at_work/exe_old/readme b/at_work/exe_old/readme new file mode 100644 index 0000000..51d830f --- /dev/null +++ b/at_work/exe_old/readme @@ -0,0 +1,9 @@ +Make sure that the directory + + c:\tmp +exists. It is needed for the correct behaviour of programs. +Don't worry. You have nothing to do in it! + + + + diff --git a/at_work/exe_old/simula.inc b/at_work/exe_old/simula.inc new file mode 100644 index 0000000..082ccac --- /dev/null +++ b/at_work/exe_old/simula.inc @@ -0,0 +1,187 @@ +UNIT SIMULATION: PRIORITYQUEUE CLASS; +(* THE LANGUAGE FOR SIMULATION PURPOSES *) + + VAR CURR: SIMPROCESS, (*ACTIVE PROCESS *) + PQ:QUEUEHEAD, (* THE TIME AXIS *) + MAINPR: MAINPROGRAM; + + + UNIT SIMPROCESS : COROUTINE; + (* USER PROCESS PREFIX *) + VAR EVENT, (* ACTIVATION MOMENT NOTICE *) + EVENTAUX: EVENTNOTICE, + (* THIS IS FOR AVOIDING MANY NEW CALLS AS AN RESULT OF *) + (* SUBSEQUENT PASSIVATIONS AND ACTIVATIONS *) + FINISH: BOOLEAN; + + UNIT IDLE: FUNCTION: BOOLEAN; + BEGIN + RESULT:= EVENT= NONE; + END IDLE; + + UNIT TERMINATED: FUNCTION :BOOLEAN; + BEGIN + RESULT:= FINISH; + END TERMINATED; + + UNIT EVTIME: FUNCTION: REAL; + (* TIME OF ACTIVATION *) + BEGIN + IF IDLE THEN CALL ERROR1; + FI; + RESULT:= EVENT.EVENTTIME; + END EVTIME; + + UNIT ERROR1:PROCEDURE; + BEGIN + ATTACH(MAIN); + WRITELN(" AN ATTEMPT TO ACCESS AN IDLE PROCESS TIME"); + END ERROR1; + + UNIT ERROR2:PROCEDURE; + BEGIN + ATTACH(MAIN); + WRITELN(" AN ATTEMPT TO ACCESS A TERMINATED PROCESS TIME"); + END ERROR2; + BEGIN + + RETURN; + INNER; + FINISH:=TRUE; + CALL PASSIVATE; + CALL ERROR2; + END SIMPROCESS; + + +UNIT EVENTNOTICE: ELEM CLASS; + (* A PROCESS ACTIVATION NOTICE TO BE PLACED ONTO THE TIME AXIS PQ *) + VAR EVENTTIME: REAL, PROC: SIMPROCESS; + + UNIT VIRTUAL LESS: FUNCTION(X: EVENTNOTICE):BOOLEAN; + (* OVERWRITE THE FORMER VERSION CONSIDERING EVENTTIME *) + BEGIN + IF X=NONE THEN RESULT:= FALSE ELSE + RESULT:= EVENTTIME< X.EVENTTIME OR + (EVENTTIME=X.EVENTTIME AND PRIOR< X.PRIOR); FI; + + END LESS; + END EVENTNOTICE; + + +UNIT MAINPROGRAM: SIMPROCESS CLASS; + (* IMPLEMENTING MASTER PROGRAM AS A PROCESS *) + BEGIN + DO ATTACH(MAIN) OD; + END MAINPROGRAM; + +UNIT TIME:FUNCTION:REAL; + (* CURRENT VALUE OF SIMULATION TIME *) + BEGIN + RESULT:=CURRENT.EVTIME + END TIME; + +UNIT CURRENT: FUNCTION: SIMPROCESS; + (* THE FIRST PROCESS ON THE TIME AXIS *) + BEGIN + RESULT:=CURR; + END CURRENT; + +UNIT SCHEDULE: PROCEDURE(P:SIMPROCESS,T:REAL); + (* ACTIVATION OF PROCESS P AT TIME T AND DEFINITION OF "PRIOR"- PRIORITY *) + (* WITHIN TIME MOMENT T *) + BEGIN + IF T

    LOGLAN '96 PROJECT

    + +

    +This project consist of several research problems: + +

    + + + + + + + diff --git a/at_work/loglan96/index.html.bak b/at_work/loglan96/index.html.bak new file mode 100644 index 0000000..43958dd --- /dev/null +++ b/at_work/loglan96/index.html.bak @@ -0,0 +1,44 @@ + + + + +LOGLAN '96 Project + + + + + + + +intro + + + + + + + + + + + + + + +

    LOGLAN '96 PROJECT

    + +

    +This project consist of several research problems: + +

    + + + + + + + diff --git a/at_work/loglan96/index.html~ b/at_work/loglan96/index.html~ new file mode 100644 index 0000000..f8ace4f --- /dev/null +++ b/at_work/loglan96/index.html~ @@ -0,0 +1,28 @@ + + + + +LOGLAN '96 Project + + + + + +

    LOGLAN '96 PROJECT

    + +

    +This project consist of several research problems: + +

    + + + + + + + +p diff --git a/at_work/loglan96/index.map b/at_work/loglan96/index.map new file mode 100644 index 0000000..a770936 --- /dev/null +++ b/at_work/loglan96/index.map @@ -0,0 +1,2 @@ +/~swida/research.html + diff --git a/at_work/loglan96/intro.gif b/at_work/loglan96/intro.gif new file mode 100644 index 0000000000000000000000000000000000000000..fb58a32c1b9f5ea7754d51015aa6e3175295bf77 GIT binary patch literal 117569 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

    _65w&~KF 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%0DmO)> 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 *y;$l`uqEF**{Vf~W6R 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%0A5#$n%) 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 literal 0 HcmV?d00001 diff --git a/at_work/logpp/pass1/pass1.arj b/at_work/logpp/pass1/pass1.arj new file mode 100644 index 0000000000000000000000000000000000000000..e0f25e64736e054550bd1fba876568a1ba167ccc GIT binary patch literal 232203 zcmYhiQ;;r9u&&v*ZQHhO+qSjZ`r5X&+O}=mwr%(7`S;mpCZ-~)DsS?tGAruMC(G!P z8i)V_7zhanWNb{?hwy(U(ElBX|7TYcR#jzY5LS@^0`i@Ja03D|x}^JG7hs^VuVgd) zB2XY8KWHEzx4b+?ARwauoaBXN#U-TW#2G|{Wr2W}l2IUlfIt~-yB11!1gD`1eiy;j z(lq*wODoA9OH7H>gqyiJvguOf95Y;UwydA%vX9b#w%7ZUHr%xxG49nWb@x5)PjyJ` z+sOOAR;xFgKKZj>?Q@8L?XaLqau}a#%A0|I0rOHnL80VK%-x0PH_cZ)@-Hl{d`C%I z8CX5u_t20wB!g0AtCzOl(%e&YY1NDU@YjT+ZxevTDG8}i$#*oppI*B@UN_4{p06J1j4o>hj3nP{+}im)aDTlA@bS_-3<|qg;x@A4 zuFMo*fTNpP!@zf{(3u922%F4uMAZilDy!o)Lnt0H?8tVOl|%gV*}|j^`i>DB#Er;I zRAALe8Q<3{^>xf`no&yjZLDCA>iQ3AB`uscckxU&H=wGf=LE+5&!psM$*qb{lMvr6 zJw3Hb_U}Il>&+-Z(WfhN;CYC2?fhg=*yQ0T_TLA%_}VuMxy&wIpQ1pc?t*S*ZTq5$i?h*6({m$zjuL$DNb`g`& z6Qe)Y3rSp2#&~YTtt?QGLC@rQ_O3}Vi+qHMFhj{OQ$Dk-L^&4w(vKz4V&o~VI45k& zcYUPrtf)}EnB1r{f2in-1aQ|9{>&e8E_2SDsuzO04rq_~Y0CWaFeL2a<^ZHaP5>AR z_nksrs89X8zg#{=d@Q-H(tA3c&FBLLXQc9Q^z=Nm2KvpAU3Q@lDkFdeZi`(fX#sAg zFiw=Fv0?8#fw&fU-Km*zQpty6X4%OzRp0XY8XlV{;_6%&3!Y2t%F;-1ehOGy!gP@# zrFVo7m`~V_iFRh=&yjw@Bv;uOdq#SZn4$L0;;4LCApnzuXppkTc^Lrny3I(FsMf+Z zr0rR&#R3%h11YP%el-GhDO5z&T(uuFlU+AUIxqa3hy?Px9 zeIqc?8&a+drFcX}E}&A2MrGhlMdMXm8VDwSLuMtx=#ujPOKk9FIXwUWE`TByARzTm zLA3u(Y%y^Wbx8&ZARxY}C1W5Um{Fge^DX-q)9G`}yf#A%s-+ZWkXmk2^wE9$ z0k&N{7|LYdM6qgVZL>Z+|F7HITXKqG=?Su|E%72U}M~6>EPG}8NbX;Qz`QU#HD;vd69{}(qu|jWYON*v2j|70G{{y zr;{YoX&YVyBW~tda-<)DI7jAQz_?dI%&uPBkr>5^7-f=c7SLVzkf8A)`>V4F?I8+d ziI{e`N;nr3inf3$KJZ<}a4>noTwR$a)j^4gaSb?#$+Wc#)Q%HFQx+GM)k}U0bn|D# zctU5~gbVPp!**W`>m!q4z zi?dgUqZ{tj>G|W+^TP&nrvll-+MqA$KM<|{^h16m67K8lVR-F52CHXtbp+wY^ zLGb3%LSQ!6;KrOq;UXroC+T!72CM}VBwCtCtGQ%qI3RkP*^+#>ydUUT>Aq+?oQ0-gJPEf(0$eN^406FyS=Ay|5GK{ z=g}4Q_DerAJ{05BL5a+KkT`g80R+rhC2%8RgspQ_vcy;pqJO5(!llArTr>>n6iFP? zD(>k_&U45P5JnrzSsG)of-iWI&G>Oy3?r9ens*kHK41!miUwc1Em2Q0x0H~sgHinn zqy&Tcb~yyMT}RS{O34z#Ti+i7hC4GwG^$CO4sU!(fM_(NZFzA%HgM>^l>O8&bo8F@ z1%g2np-~XBhAT5E3MAB_eqy{uZl7X{{>+o=%I2*q`R!;544d~k7u3-;>FN|Om_KuH_7pP&gd1uRgCJWsZT+C8t# z;gn$4k%DVZ{Fi!~$pnE6b1^WC?5ME#|#gZ0P(p4Ol5Fd?*h$`4xlK8+&1%B z<5tx|pTBc_d~|x+J(7Q=W{Mnrk7XX0Y0@GEY+gc9@|V9tECH;YNx_>&Wv3eQZhw*b z^lA5#@y}Q%&?(CchB zOug@i4?X|+(w(w4uWGwRONqlP_&t;9vJ zaEeJD7DAg@1i3+?cy|1_Iys#+48ci$FkJ7MkV5ILt%~Bb8gy*P@VgiTT~D*q^XoV= z2r(q{V0d56*l4{d*opoIaxxib-7m$Qst|G;5l6qGm;V)zxM4n|uZe2bjle`3$afgO z$@NrqLkaV2fMRSH2!=YSFzu@{gDNJLt~MqFCXM~{G65Fwfdotb@c8h-_0bue&yY|7 z81pF`9rnCEG&Pp9N`(Oz(#)>%8S6$z)B;QN#r6_dd*h!I-=j!`l!FQfs>~ahQE4MF z=7%NDptnfN?e)W^OXp;{SXIWMR`f(`eQmqia~W9!{#LW|PlN-`CMa+=11$P+uO2Gx-mpTCMvWPCdf_Vq#!eJU-$2;FH|9P%ciLRZEtD6XY%c}7@QA^ z0N+@-IDvglUc%a90gQjy?#r5urGj0tmD_vJR@l}aGB5sL4fE&L3$!#7UvgNIF=GqZ zW{s#@GVT>)f=edlCZcu0Ys#OhMR1hsv+0zF)|rR$2-%d4 z;yj`-RfK|y2&R$JPDZ6uvll(8;_=`JG@(0S=f|$@!OML45^vQ_^DN`UaT>U#cv?Ca zJAE>tgs`A!l%Jp0gV6Z?2XFfsYc9ERG?%7Z{Wa)_Z(K&0Nz!P}cO1AYwrS6hCg z&Jh_3Xs*L7y;K024?1PN%$ifO3D|gX^*uSR`g+KtU2u|YcrM43m!>C$Sbdzda}gZY zQ>|oC5Iw7P<+%yq#ZE!D&O*Do?#iXd6-1$c(Z$Ee;@_MrHf~6NzzEr}XmhL3ZZI2C z>qmEX-P)RGboHtJ3Q1TEp20A!lC7zkH$>DyNM4HhyAf(>)1kkrD%m0e7#6!BU&?Vx zcV(1~)o5b_#D?H~$@cAVnDy zf=+0VCzF$AV&)6xxf$#ZDF!Zt5eiGT%2b4WnRzV!sZAWj!S!NQjDklYMG70*pp$`5 zHIoAdTCHp`?=;DIql#9zQ5s3rTZlBLfs}M|eiY(t!vI3}(AHcRv6sm!jo)x0I3k9a zu6-y)f^L_TLbwuolh$syG^MscXQp*yC1!hfP$hX5Q(+=5?hlu9W*dW79;~{~#0f_C zRjScLCCmBh>CFTGw2v>2V(y%`zJrWaos`P-qv1>?U|d^*YzP*~rVR3RWuiv(l=UbU z>4ZObepPa`=AMFVoz*XFXFb^1)so#C?B+4`s%{GFjzn(#@MA=D>0)c>r*tvBNtKDf zCP^v@Am<~T^2ii*uufIz!`0G8)>504o3@c~VCNn~W?=Rb1d4A~DiESN9Th9$3$9JJ z&!`9K9T;wK-TI?SZ{`w8@d=TVJ|(h)VOlt41wkyO8XMz`3*#>fx|DDOzHb02j&f;) zfj&F{I<^=jtufyQZj+@N657Z$kLXbSH%mL0C04|NHIHAQ%KeA`YvS&Cc=9wY!&VlQ zMF}N)*r~5~G0T@@(Fh~4!J~K8sc3oIJbGJMXLA^F%eq2U&X0Ye;lhrWFxtevI5bnH z#r$SVZ3tbMskWDy-l#=Q_5JOH`Z-Qe)}!aDm|}^qr-IOd9#B#6Wy=QT+?o<(Pg2F_ zACkh)j;NBIe68jiCC>dadk;;X7X26hQr2FzYtekuU5=Dl4$e|VT%nelbzsG`%DP>@ zkW{aC%4NgBg2tW{4Lw@E7+}%XgyVUoE_`4Q*3&d29U5T-ri`@!A>=i`>w*m6Q0_Lu zu~0I)qa;jV6eU-|$#Os5F|Rje3fOuCChU7uZylz;C#`N!$-dsQ53Kz>$Q1oKm(KTEiSxB?J;f)-c?ev^CxAzdGMx`1zrES48z# zvVnnD@u$^xJ5GUy(_o}cHGaBzVMS!;Q{0HD;Zksa0Zt>n@s&2A#12W=2A%$t0D~Vs z=}|1ZpA1w+PwLy~z}7dcBjHX@Byrw0#t0n4M~FEcM5BuTD8xr6C~9qCTHXxL5KSW{ z`u$^82Kw%IJ?cZg#k5DIwGxrQRv={6c%E+lgm!S=`gR%>$`WFr_pNN}0s~Y+9T7o? z#VUuM;(w0?Tc777G{gjXDpdsuL6gIIN%l*(sgdi8(cW3+eFu_lqSYXSH3)e>Fa|t2NVI(jEgtuEevrvS%U|OUT>kdJS|5TC}ky8g+UH#pfC(^1BBDP3U^yA zCyu$|kNl!5=Zn^mMhqzFako*G(F9nqZpl?+oX**df4tUZg_1e~xDhucPf*X>8|h!lz0-B{WBAj`nL7NwR(n1(x1cZo zvV9*r*Zk`S^)=&Kd+?PFRpoZh@D6>A5U~ASvmo+y+fv6_CXx&|OyVH(<6|7avt`ms zq8_1ramjb?ayfJtuE_n9vVuGG0VQJ8_m;tEAIk{pE%4N5H9H{x@BHTTGhZ|At^z~< zpKrJ$rXpO!EyR9vsWZ91wcs3VpC2ym9t?CE^7qoqW$AbM&hPK!`JOycwHQ>idZt6m zjA|#rNUZp*yaTaK4odV+y*xgCE`rgJiw7$5yK@P9lmdMZ`( zK0x@(96xnTDb`QxAbfUjy4e=@GuKNzZcG{rfP0_)vp01Xz$8+h4P$Qg+5~P1 z!^A7nX1*aMuz#f*g&XSN>i+2K_t)=@m6;3(bjN#Z^($W?zOqxXviGyMJ`H84vMkWr zkM3mqo|opIC&Yg-?sL}?JAUL^O%%W%pPUXs^Soe6$SFXe^%&sV-Z++=PiA^{@&N~@ z{`BQyeEf1E4hu(I6Ln+5-q4_oaCkly&ZwZZ5Fg|1d^9lwU?3m}Q})3i+#^tk;r1(0 z4}egJ!8agVMkY`Cs0`2T+@k6Llo-o?bzKe3$N6S_uo#^RJswTqS)GrKrB^{n{d4ni zel7}!ATx`PMwHOY@PwH#o{Yh2Z*e}BT!qf>yEw|f_2>4{pb%fG+@>xyo)8f=G*>m7j`p< z$zUe1r;D~9w{rltc+JI*>}Hsx=XHN0iNq)fg)cmE+VL1U%MQh46m@~hDGU+E);?bq zdpG^XK4lvDNA_i_*W4=n=5?q1A7A^eCp;`WK7k>J|>m&#iW= z9T8ziv~I`Meq33&NB$L4=NZ>w-F_eLTX%saMA%&)8GmyR0JxZGMa{SYAcpE^oE$8JBn|kwMj0 zDH%;ClF?7x3Wn+|z_t^lqLdB}&q5I4qR0SO>MOOx4Q>PYIh$;a4&Q1i} zd{_7DHAvLgOblpm>MrrslBKr?9KAkTxGks|Tr?;&EM4#8Ggq+bweDM+boBPQv9Lyo zsHn-lV*QnmdF7*r@rS+-=voi!YJD*^n3v!e|vD1I03Al@Um!pGE>BvDd zUlblMZs;bn4RPShT!9Kr)`28GLIstr(4ezuQoeP8T4*qC=SSlMIDepIHuTI53B6qA z7~BJnbNG@X3tQoFNV0a2$jm4Eqatcff~*kNqoHUco=_&{h(MM0}lAMwx zuAoH~P>nmQOZnp~Rqfc-64fn%&CEns8WNzv(Te3<_GP3zheI$jDmogwo>TA?&(cQi z=ZG4hamFolT+vLFwak`eB+(u)!RJb)qfV69-!Kn{hxc^4{Nbeq9#^t&Eb*?IHthk~ zn%x53*i25z@dUGcTHHl{>*!kyWPG?@%&RRo#@3S676!tT0cG*kdVW#*Dv}<`Qv?ih zy{&5K!Zp^~FE~)!@K=yXc`l@d2E{P;=HtfAuX{Qa@MAd+yOmYio`z}qn>{wUFy1Q} zW}fqF#u~=E&^3(Ax55XfShc<;X$)%JzZ$Z}5J@CvHQ64C!}>C1qjI49+G29wYj__kx$ zm%uQInzNGC0T>NHz2S#juQL6p6I~MpVMqjjFGJNmt~@xgSuM6I8bobmaVs7uX`+_E z4&`&|w-xC8E7W3B3Z+-}AAQ4LAO>7L$7a$VSvH(zE{Rs@@I5viz%$UpMMu9bh`8>l zQ%`sk)Q~xiO*==FFWt55kTS=mv^dimh2}u;TfDxY2O!P*vJP|C_FT}G`dl6ZRU-gn z?rU-X7(ta$Zw<9xoR!jz;tIi|gv~9R^9n-nlJEXF;iB=^t83O4Um!cGCCDbMOM@^L zKKxx*8&Lu?f(KHFXX@~Hbc`@+ko>BbKHR;EPlUo>iER6WA87_LSqgSou-BkT#3oj) z@SMdpa^Zp7mW};^{<@P$z!56{0kif75h59$exUW>*`3XS)hv%qLJ|QSE_+kOb~m29 zHb~ypDpGP}0`^`*N8S8gAAIGm_jff=|9wz?jp)*I5N4UU?8g*H4L6o z57wm4?QK+=6et_w9h^vhT@FfC<$Jg|l~>Y!wHKuBGw0>1#Olhsi{cAtBotwcEGrUd zGCVxCMT-(Er1e{B>?b(Su~cnFJH@#K;gPGP9`a{5X^J6a@`H>JX`BJl@VhVg0#}mH zK%8mJ7!S&Qo|kwpdRf>X7v5?^^bX{NHBd+w*n#>7T52$TKC(Ewn7PN>{3oP?u=Jx4 z(r%pnShCCM>gI$7Ydi|^;0Pu7qlhkKnnFj*@V4YaP~@f1RrgqMUSOK~NGu5E*7|5xKzsa(t!E&jyCB2g%y+4+a|&$t8im*{?8lH7}RSWOC{G)pFi7 zqasEC(GYaZDN%6k{htE8cFcz(g!K>Irjlznl52o`NCrMF(8g_nX{f|Dwc}U~4h$4+FLBEa#%U;WBQT$_BxalS~ma-PwtDqw|nqCnbfVyk;{ zX=pZiTUhC2LI{=?5LF93t`20;LcyIS0=jkyZJBFnKGCtUp=3r*F1L$Nl%<9&v=c0M zj0-bj;q`gul>`$ZEOY2CS|aIGiA!Vylf9Qo7IVTG#)k?=tYmn8qJO*v+4%;#d2?a` zifW$ie!T;MMKF=yOxw4>H24AX)vL>PcI@jd|ODI4TkZAWQ5{*Zjb}jk9 z9{$sy8%qcG{rI^8442;3cBdVk=sJAZR_xj-ineAUCQigB5|2x4&(n2U)){WnK}l@$ zTr#?G-f5ViU+f;3=Z@!gQ_#a)VB$*CjjKf2x*pn=uHHOUpUB zj{ljKl;^5dZ-$+{S8wlVR|<5y!Fe{*gnt!voNc{fysEhSMDn`O^ggMYi~X%Dgk8&k zpp3zCtR57^(#QR%Ck%O9_<3B|<%!)Z{3^$V0{)AQ0C6+YS#xvsgmOu;bFy1|u-s)@ zQkBLuj1Z&^10q-ohINn87^H;-C4^L3rlvxt;L7`;+Ur;l6$^BRmKATAnpkd_R5vRF zjRb64>@-=oipARqP0~QM+ph?@O{|0rJK!ZXKII0)ut9(iw~$QAhukE~ji)$5b%rF$ zhc15Dnd#{n9!KNBt;zAVB^G#q7pH;uMR<;aJxGLV3<43Nm~VH$c)-brpq3Hq3rS#* zji!>*$Yr4f6S&4%o(DWDhY0ITm>|g86$*z_H0sd6P!SS9Qv~i25*f`n1tUIK1rSrr z6|GE0*3a1A?UvS&0u=-Z?%rD4LUk9NA;G|c$SB@sAd8fVB_6(R3@cyE61n#iHJ|cP z&~^y~GVRQ)r~ojB1hJBa&Dw*=)F;C&9Z1!w*u$D^$T@6}&#ApGRcQOjiRq9eqe-V2 zk^U7Gt_dF2Ni8-o#xr9im$w^?WMD4IXy6D!*$jomFTF=dfGb?^6$%lHkAOB0ABHlX z8wM-V@D+;VojWp_6u}&ZI}90z(7M@#aPAf))k>7U2Zd5sXdCRdhe0Ck9hwEWL+^Js zGS^?WhE9XmkrAbHjEsKe!#o7ivU&@_4c!2-V^#S6WUsLoo>LLD|iy z0-YNzf380QpnqA{I!_P%<|m#GjsEMP*$Z~cQmNRn&Y6~<+7R2caYl6+AH-uZ;LAZ` zH|xbf;bX$v$Bkg>?ZyY^g1g#~Tq0~M+P?qA>^XSquo#Q_xg(Ui5)MqxQoBz){enj zcXIl&j6{Qb_989xRHnuXt#<~R&iE{nI%^Rv%99Sl@?thc*J76Z>jHbJ!I)|VlaLag z{++y_N3++%=UTkkQ6N5qSs|mXMW~UMXhqS%rKj~-j+eeTZ_Abigq)D&SthMQ;G4?( z51qGaYc9N~Y~A}9?%`8ezSz89?<-FL>Tz&yXYF#io1-WIeka#GYXcYQIc}%=ejdQR4Fgc_&WjkqiKjj7=FKhgD9r6gi zEgvaR^l4Vfw<>gePkGdb0rvJA8!S`g(h{h@5E@3}9;HlYtrnUQKhJ4w$Fs&TyBMVc z)-7xVt!6QC^tvyDn${B-?CbT8=yB#ZKbT@)FqRF@(+KJU0IIpniAwKJn*@#AK%>)E zoirhc=3-A}kPL4T;3iP?yD;sC8JHHFgF>rmUW^`uQ}Q8}vJoeBnNar!5rQU`PymBG ztTe+~bqIvNCF>FQ^l97lTjF3T8S2N)TrX8D|4EA&rg3AJ;Sw(N9S^#9psvA_g#q?A z{PKwmPDt2g7brw%bcgt&gerFu#hlT^p_OH^H%+SuWDGZ&2U-gCFvahWu?nQe+RG4x zo55^C@BQI}bkb5^?P{60Dg*bS5H~J!@emw97{$qWOc0HMo>zmw^Zg3bR&s*Iu)>mN zL@<`OG+0b_^Kq7H0RMz*cljZRd)~A#v%rHO((w|E*w$;!CNh9~hVaBWPXU zZtGD?e^bmg?|&?{Qbg+Eu>~JcW;v?i=BEN%wW3+GDn(H!yN>_%g zCo5Z|(cf&E+5X=6CjSevEfDoV1>HSk*?dOlpR@A(Rdp$EsM^_Ez4GEybtP}8+u5gM z^W$*&<5l(YRdqFEXxQ0jV)GMs`C4*V&b7jD4^awqH;hp+4ZIg2ua*H)oTDnaG&-6} z0nHN0P$ruUZ`%s490&y_7boc_BezmKV|S*bG19MulZnaZJJ2k^)&?+dUt#SROeiwThg*)W7pUtNfbs!UAvxcTD=E+ko6q*s zn}FazZZ^j+t>C)dzi%R_8aUts|E{CH`NtQu6bv?BXZKpmkYZ|uP!A(;8{Tdn7-j9XN+}y=MFJ1 z6OAYYa;gCgztIkT3O-U}bb-e(nskxM2LH=fZ@G`4?H!fooRx{H#Op;Rd(~ZVBwM?i zK)fLLL#t^2-Nqwp*>>QuwFPCdPT%bVD>LcB^QL+|(3+ltXepn1x>_jsfiQ2jV@KaF zUZA%~m;K7)q{b+$RQajJaMr~Ci<~}~K1I{WX61oK{^HDbS5+Q#X5+7VT4q(|Dt%V2 zL)f|oDM35nx!KI`F4pWBbfcry%Eo<~tCetpxA%{B+%>8+z zrziOq{rOm@ZL{>h>UBwu#r;-T*X2!i=4~)RvZWr_b90OWX?>QgO{h)7d{u5mdE9>I z@Sh5I6rOdt&@B+OD1VTXtaJqZhAJ4kmh4akx!6sI7x^aD-|T4`NSsNlr52F7Iwo~- z-1_(zF_hs--qDCc%|46`@<4h8;0JGBOZQ{&8drJmH$UnOBOs4C)wrPJ zky6%aJ4+1Tz31p^LWsBowwIIz_YrpMe)fWiL3OhD3oWofp$-w*NfA+CiJ8Aur`bR$ zF~*^@c$!vl1UC@rZ@@I_Dq^tR-Wo)*fRq?JY`OfCd9&8z1s}s}Bw%5jFb`vt$50yq zYOv3G!2R!~HZug(cpzrPp^%>(S^#zC{rxxhLzMS1?9U0@-BhrZc|Mh;fzoW>Td;Nh z0~uJ8=9B~l>)qr z85>1B*-S@}qA#b^nr95Sg%AgDm@{SAny`=V7E$T_Mwr-?;K(c6n)I-FZV=vhB!}Za z6(=L(4E{Bl*gIO_=C}c%87?JMq<^wo@a~{Ml*Z^GKJ96Zl0@u z0Blj6AM$b4EuGg**>V-KuDXGNIb8+s65EvI$7Aokla43|OlTtO<0q!#e1{~Vt<1H{bzPC0oHoGxu@TD_eI&8epo4SN=a zfUoWJggUeiKa|dmfIiyPoPjuDOe_-!MOpvB(ScD;TtI-UFO{kAGv2@=>_01TH`6nUXLptIcPs zP1weV$Z7?A9{rXJeqOV7b`fUZOTjRyNxB(xnT6PHcv#AGK9|h%GYp+GXxuUI{th1Y ziOvu6YA%O=76pjm3O^m(xihs=w7x%%}q2HNO3mGsllS0ly|WV=>MTASgZ z?8hOE8N#0JK#$F3$@yEYV*fSIiY<@4T;yCio2RbaxYx+mVK-L;j(3?NBwA|Rpp3#l zz@MnGF`Oid6=X0U3TgFjdco?W$>-7Svx>(Z-umMqs4;s*O z=OI(X#jNGGRrfVrJ&&8WPFfgyeWz5_S#H9C4^7Qt|N4bQ!iG)&)aZ_3RC-8N=A+WU z$z3PP=rfr;k~WE?X+*$Y6lKQ;GkKb(9{pe?atj0`8n@Oq0q+Pc%lr6#LxbNbRFC^1DPJCc^FO92gKuFw3VnPHBMnu%1$bo)Sx z-9u|~8dS55>SjUXgq)~&eK7jkIr_%lAm67BQNKvHwU2#!rikX3K%T7P zc@G|28Yz%TuA#~sab!H-pL4}@ZysdYAC6s`#)u#V_GO0EN0_uxe=J;P$ttu+4@PAl!=_(!* z5D>cVf2_KJn>7EzJP}*)tn;9tMM_;=2xP{h9Z4xw3teIbJW?+@c(KHTSDLK9r>pz@ ze_*xGZUGQVbK}ja#4W#1=e9(4T>F!+OcerMrnAp?P&tvT_(x%Mf?@3@N6T}u_7Q(EY^a-S(JIt(szqKcElZPWZA=ng zpQtxJ)4C|028*m8(FYP&%i0jrYi7x&wss3fBlwt$yRnt!c(w93^YpTv<;DKN{TL?0 z<7n__&G1Yt+cA7k$0z?Fr^w@^|OopZH94UL|vMPfp`kW zY05UR_kCm$EofG?(JM!N;4zrAqtWZ6J!tXsB4jD`&s89PC%?tBOte2Jrz7!I^k6#B z+OJ^D_1{Doj1u5AzxgK^h;^5OVA6mnCh`5yXK9me+S1^gea_%dqOh-T$I-}@w;$Fu zT@%_ilTbW7Eqa}O3~I(P?oGF{W-5|6cjY6OCrx6T8-I=N`z`d8*FErs&o@t`Z|BX9 z(UpO~tUw@qDXQ+gTooT>k+pnapbMwBec054w*E@Pi*50++u0)i5+(8WNSti~^y|^@ zSakHJ?>tW+p2JpIWC0YqsDLQF0BZZr-wTDq<*l(?umjpW=Hjp!^%GYo;ZmZ?J*E1P4w|< zUBwttObm)TmqVwMs7HaWAC!s?18EfYb`*ZVi>^t}^q==gpa@y>C(LqCsfcS#)dafX zLN`9A!35AZAh{;$nB+sqjgR_x@Wog)VP5(+7;wa1&Wt7`QZLJ&9@*+^Ouf1cC5yN(wD)8r6 zvL4*aMuWIPAr${=h;U;jbs=N`_}Vk+wBufX&XM2OB;j6U9{WunG*IA^7<@U*5M1L3d8z!7~J73p3 zO`|TwC-jLef>$cvpw-4A(LP%A&u*@+aHDM&^Al=i<+~{>E})%0?)7C54pi(9It(Ml znx6yI|AG7uB*LSactg`h4oRVO`jzI)kQP$+dy0yv6U28B`g>S{GlXWNTurU?*TTdX z5xIaR5Mx9}^<9lwh^b7m_&qC>Fe(KW#+_XWVjn22)VhsXvc5sGJ}VTKCIwc+K_6{^ zQ7!W1&^j?ZiVngi0WE=a@@D=PV%(| z_^@4zSP1G31_0td6#CUxmlXgesX!+r+<6iRt79_U;OwiMGprksB|V$EqUOno?8}l!8d%46w6qMv!>K9R9!D_;>a0+~ zel^cl*oNM^R5bsbILZ%?X2#M)4)E@QDt&q1B{)vHLzDssW!{x*l&sBp% z=CZ4Ql+vnpBqfF$Jt2jwyjGumEXou$SkSwcw^buL+_lCuqluc>krHo3>IUV*l3%Pf zXhgGFrULf$dd`2kEu=;$|M`?xCcXVSU-Jhk)cDYfHNS|l@3Tkms_ydU z<>(Ba_BCv&(>q<(g@HxsAsvUVchnPYwmVG+2Ups;g4Bvho&04T)R!wU{cpi8g+XcK zu`Po}}P9YcQ(L)3VIPP(A5 z+k5-8V7BZ`D{a`iu~G5h}{g^tr|2B zOH|iY)LXnNSg_!QZ(`kt3-Tb9Xqfg!y(7y%lu|??TiUp`q`uvb7?nne`iD`+5p}rd z5XzVZ4R+{qm~popba41PzB^##C0*Z75bE$|>GXS$7qB+g1!^T650K z7`et=Khyd9YSrgJOP-|}Wt(KR%}PAE&wpj^X)5fl=ORDQgn0v{PT-1lmp&IR@n# zvLpgzPNX~4x}6eO#jVA_T+ST+>IEurk&x6=@Y(7Z&n9{?6nsyzN=djv{zUhAs9{2_v;7acV+O5r?;uo3nC2FlWj zh-v_r=19Y+gCiED6EH}Dg^xX5K##^EjT0~DqjXlX4l-KkMt`prz|tgP9Y*W8FHcNn zO6TrrUmT z!P|Df7q_h!n&adCPa$|j_e*LB=Sgn!wL8m6p!?p#wkXeUQK#m9@C7>m{XM3&B0t4`z4aF4Uwjj6|lhGBc> zm|ITqb?a5!+&vOO-s&h~t9ViV%B-f+8q_R$L2}Z{$K(r+&z-kx{St3ot)HD=2PJ|4 zLC#X|Y63f!zStAECv2`#N5<#P=9= z&!r;84y|MSV1LQ2;MeiW-UBg$Q^zwg_vK9e916}E6#3!e6fuVhH5v;RhZk$*Qb`dd z?1+Y#%!Gk8Jgc77!%sZdz9el>5S4R`s7O(rnti9@a&fiRl{?I@ba2!6M~*{SF|yl+ z?b9Z0*kGDoF}Ql;HZx8XMDSm;u>3Yu2#|8h^{5^gMW^Lb=Gq^bEanE_7E_CJknW4d zUxyY9Dh04LKcwRL=kWxsf$m!l8wnGz)q9oAN|jBorHaeGG_+!-xr;)afQFLLc#;jSY>!$RE5E- zWUjyd-G;zj=?09Uzza)RhFTZoh-ja*kLgmpwaOI|Rm{$o|eV0s`ECEQdi5KR?`i;m5n)=rB$PM1zOCr!9nlyi$&Dqq3BfI zY*l_5RQ0*ELpG~(X6ZVP{M}4<2}E+h+CUKFP&-ki>idn|TO6LVIjvN6WxOzp0|u0A zn&SB?97M;>KX_x_XItn)o7_g5#73LcMw`sW|FQpehQ3!C#-ZBs^?^49u~(1Q$JRXA z25ug3v`5x*;?YiU$k30xJJY)-^qNE#MDpdqs4Us);$&qkxT@knz_<>hixZUv0I8<< zY?yuxs-?%{Kh&0XUK+5kVCoMY>8rc1_}aE>>b*_2zpUbN+iN^@NUybby%6F)VB1rh z>C__cs;}n9E=MENfN5+DVoRir&{!Po$#IG~#@o-}=5p_P;jWA<9dz2%7r~P&;#~Su z(bu?6476EZ>5~rTJxEz%1xZ#AP7d4k zkb&KXvA=!S6a%ubI+q>XkCtweYI1Y&794^EC%C)22Y1(H(ctb7++~sA z?(XjH?(XiAyWe~3-v6&Ub+%__r+cKw&h$L96YEW#yw!YAp7_ocxJe79UEL}zrQvFK zre!G)$vWVyadb6JRxaQ(>DVtqeAM}FD8 zES^;!x?bP$9=*-(78tme>%0*f=fI21E4pk~)*PgZ_7~yS4+*~(%U60A0L(D-vx9K> zXs~xGCpLQoV1oL`?<{Dn-I4vd@7RnVJ2dVLqiI1z|2+bHp z0_umh#rw9~&#P~ttC4T#AELjT$2`mLJwYdO#0C2zxss4GkE<|PtnG$@6`|W9GC~m}iP&i}Bq1=`r7cHIsd$5!WGu*^%2kqr}*`Yu!maNVW z>FU^4s3yumlO$zBT~@>Ic8#0QSpz)a+M=<8-<_KmgD=-kGRu=RlvHGFI=cD8&#!*O zsr5pW{=ARqQzU8r^g+|~qVR2JM-nOzTx-GgLykB5J7|>aeEe^j!`>L_1vA{Ol!s<} zFI1s{6Qt6_%4_+2>7!YqeU*pUe&)Dc}(a*qT{;Wggho`t(T2?h@TdVN)~2WL-!8;z{0>b`!@|kOgGl>wW8?fjS=QHyMph-?g`#3oNc&4;os5$%! z2ocf%Ew}BeS~C1`;wpfeJIEYSv8g$rldy4lZ_JfBaGr(wqgzz!7DHeC}yOI zY9}GjX)D(>cd@1TIae^crr}__C5eYws*7x{g~msG$6zn^Ia&HDf1Q5SYtHh+)IUsv zPN)T?S?deWG2e9>|2dSwiZ}FGPi84p zh8~{KoDGgWT_rR>)VzNuTIY5NS1VuJq%Wv9n{gUgxqes4?xO>*XmR2_m{j+~Q z`x`?=2&t^PzGCFG?N5nQ%7#&-mqYyb*n=KIL@T#EWsITRekH^3UU(OK>Wb#Q8iL`_ z3|{wrS|UFiiCaifaxW`Mr|b)LU^f*EU&+K>QSB2yc{NvKuaiEu4#UQnqh>9fK#8w& zE~*gio4n63{i(;mGdLnsYq?>1EyPM~twd@OJ7#>YMXlLP|GN*&jeL@()FRJFmSYIC zftyoWz+&z1K-=|=eaji)@U*_W&0()qLa^x)Cf4OCrfjwTx00qRv_C?)*wzMs$bfXu)mx~WfHZE zVw1lT2?3o&f>o(rw)f;$CG1~5f->DH_Ff->8+&LCR8+T6k()?%8R7D*-`4baEb){m z~DtE@#bhPnMIG<+yd%|sAGyIUexpOkZ7KhfCEewY^gJN28_`8tH|y8GejVEky)^hU!; zQ=0mO^UoZnVFNxOG6h}oazg?d#L=DQ$H?u)^%{6{KV+Vc7I=7x?d~+Xdcic8rvKv1 z@iEcg((y%q8^x<2419HW&z#gWNHb zAuO=p{1tWf73!tl2wO#wj1v<-?{hF(I@c2_t2@qgAGmlZkV@@peC5)NGa1_sU>4Dg zZKkPDsnmCoNh2#YSOCaZ!wH@e9eSt8X3ZxAv)dK9>t-iJ1{^eGgBQ=asR>_5XHuR zy=9hB_@WIjF$I%R#PGPKJzr@hXxJ2RNB5SO^SjS}?#+%*%)smQUz^|j4f@q#kjcCw zL4W(sXHilfmx$p!tr~lUL1;OuAh;BN>L{##SDcm!R&9#96+BGRc>1g0Or^ojx2y`j zJNeR;_@Y?(hJRZb?utqzi#}1s(!Rs{W+#QcTv?7KAEAG1WD{2Ksy1V7g>9mW`R;io zS{idS+s5;UYd8E4+^ovoXFj-Rcz%_=-SQs3DSPHxl8xV>ERSDfpA|e|$UB;uanPvQF04?o>(+DH43#8Bd-MsD zv+8A{cc!C#V0AG_le0z7DgL(!O-~h0-5WM71A~5vUYPO{W6``y<%z4E)ThvwEDX^Y zY&_qo8>z;-r##%Mh}I{x1lu37X+|naUTJ+!n1m}O0V!8<%C)1sxm}sunUhZOd#>@1 z%7imD{?TiSiDHGglwY!8esSMc=VoE6{n9@D8CJGMtXFhz9e40(az<9c8N{b8D%Z`k zv+@|C8&za?c@NT6=}hij`p`!)e)i;x-oJVf_`jSV{ND#}p4|Wad*gEld3b+^7$zRh zx$~;dIqRw|!Exj(@T{J=Fgia3nUTXqX5&$^ya8RLNETRUDnp6y;c;)h3B_MY%Q}`F zoDYBd17khYUChfwWPXpv^ZB`Wx&zm4oI-RX%ag@gVxq3E4ZYpwJ^c?O5x4u6e<7F) zNqLGNt6*!yA(bfzboo&5Dzy_ZA5&x8H?XQwc0Kdyf5I$jCU%st{)Z}Sj4dItAA1AJouaf6oHa$5u z9|^`D8GST5I>M9{iF5EHy|veP`qntTzPcWd-MJb@m=b$A`Y<|wJ`nBGr?>xb{97?Y z4HO?JZ^3x@joT(H=T7t~`&X@GdP4`+yWjt0J;P3i}mn zUI|~A*6;&_@cnuozV7Yxkegdgm?LVU9}2l5w)9AO(eKaP%)75L+mH1V!4x?S$%~U> znrr9rGa^XwM^?2;m)pF@gY)y6Y^yI{@GK&!{BV9LBZn;Bk&4A>F?zn^uH_0ZfVY`% zWRhvRG=qK_TVU_Dktw^xlp(embiiz7y*?O4<_jqxJ&BRTD)$d}`?^FCI_xwUR^dW_ zt^KOJHDMRaP6bwSr~8T$2zO<()~xpYLt*p-RV(1LqY(KgKiJ7ymoqunrO2P3p0g2& z6^m(*2vCmec5-sQX&s+pN@r3i3VdZM`En6w=MeJ_ zhtQ)ojy;eu6%=VAWw%PS8FPJzRq}7WU_n!eB8e8w>6j9b5d9|1xpZ0ydCYueaRUzn z>d6?Yy1z)IY62Ji=MoZXhdXA`0Mx$Zhj;_A(e(C4x z;9Kvwb1_b)>}=#PAIw@ZmQb#=z$>&_)ZQ*Ce<+DQ53r3R50r*>24v=T=>`V8T3B?T z78_O&nt#vjfcl%!(kqVx46(2({n}M-YXCaWu6q;ne)ho{LBGSgAow^-MasN$bUWbp z^epr{?Lsl-ICAc|_RdY%FczTJ9meP}s zT8_W@0KBIhf}A(waM<0i@xU~H-5s{ZSswp5P=_()xKqwK;oE=uCDSF~WS~s#TyY6- z^0W;TBx~`v_RrI0;+v(G5WL|f%*>=wy72g(e-q)=pt+erLiMqy2M-W9w>>C`klr9y zs!c#4{k2dYA#d_e3~BXW^^Sv$fW14Wyc)O9bv0=QClvo5+}kj5qbz|Y1qAM`@6#uf zk+%B(cTZkYNLliKXm33}yV##T;p&FBEHA7k9Ur7_;Z|-0Tz50{qXqIcpp_=qY(}5thdvuM+IaTqd-medF1L;tL6B<@#aY>}Hev$l>z( z`09punx07LUf7!)lm!WWXee?Mh;t?`9>Z0D;_|eMq!Pm*K38m}3@h`gZ;d!~y(B#?f zt>FSh$ko>P+rvleSMlrdTdOyRcgFkXW#{ViIz#gA=JK-3VC(g>_r}J@qD?oJ^_QTYK6EorJFZQ)RqqV_? zEB{GmI4-taYzB|!-dwzsr*u+lJ4|FX+IDWbY%aT;UZ1`B==&rkv6f&v9Ub4@-v3?) zE7V-Ht<;;%&YpeT6nS>i9|O+*Rg76*Y);-iK8&m%;{2;`OaC8X2%ebF z`tr@g!|R8@!lh_j?T1M)Z}Z*AXd=)w{6paVow@t%U(#gI%1hfyp4gq`q)Qfuyy+Bw zw7zI%Bq4{z>}=NQWXUCk?eRxPu>rD!d?YvbZ?ogcipxg!a@@B6o&TD3Q7Giwu(4k8 zQg^t0dG~yAR=%!df^vCS;(3*2__vnquz7mJadI;TFF?NX))x0a_3z0=a11yw7*LYWs(?l|)e>eosa?1i!OBxbk0x6K!L#zwZwA?;zTc zr59nR4hCl>&qohtYP2HDfx%z`u2Ha_yZWkcruEAGuKTSNYS2G!TLFn$Q=cqoV9@B{ zWX)xU{~5wXv>q4q0rR{cI}PM!miyB0@jzgUWT!8pTa^V$*8`k4&RFC@qOW#iz3> zMp@mY!}t8l9O0u@hbO1wScT+4*w`h3N+UJtu%qchJjz`0a)TT%SH#14e~@nNuAf8i zZfVwHB!vaqw#V7;?Z3{g^C=a5SPQ}QR}SNnXK6$>99tIh?-z*2L0vv(|&mO z1F)Cpa@#C8~!kuCR?BJQI1Fv8){WGOoWCPTy= zurf;p@`BjE<52c>Fi+t*!4|naQ!G|8`>Ti8d>Ug(el{(D64f_!dh2*^&899TMHbCkXt~#GG)bD$2?%O#ce|d| z2Irzg^^}$h(9;;_>QVh5aeoK1(Ioe25#qxbS5#!E%m~PrD>I}yDQJQ?ZF{RqWOgT5 zwf}J<9?egVhGwQ(F+~q(Y@RP)#}!*G>ldVOd#)`Rge~DUGeXTrHMu*!yl^{H-o+9T zX#S3|WygUASXTA5ec09tP*J`-)88E|9^VMRUcR(7x)1E&IlA9IWBT$jFDE^ zv}?Yny@mIbGJ5GG{~nHRw~E!fDb7+kEB9R#^h|cET=r|*5H1IvCne}r_^3V|-7`dW zC%XsVezYOK#l#Z?g>`Iakch&Me33W< zW1C5&)}7fxoW{&f4v zz_zGBU@$R3Qv7;*yHjCO%5`cYb2oQ^i8#t?QXa_GV%7tbvdcg5q8^oDK?7`cBqc)i1GY?m^DbuD zer--THJ04s%dA(gC#bPjxZZ(88*o<8YnSCjbeq+N2HMo7K(?+p%NzS}XJ*q8qs~>#c!-)d)N~HT+UvRL!84Cx`&dnSr#$ODkM7#6 zQ)?+sRm-nyF0DtY`>m#2fE@F($y0r?0E)7Kpnx9(#v15sNFX*p?d+!7mb|jR#zM5t zr|W$H0#plD^NQ6_^!8P?ArPWw1Ki(!ol4g9xTFZ^Ia?k;LV(U2O2C5BQl`R5$uk7Qr!M?VPSK8HC>dIxv=3w6+_wV7Hcp;bs0pwLYuptant*lwxB>9VDr? zWh~NtEo%;`sO;pW@7atXL>+avNR+YyC5!g)ZX6hOzjJMPwFYB-t>ul&96;YaV%$og zI`=vbW+G^Sl`QoH123+2%8WR%Yo$2U1dC$mr`gcYY!iH7wJW(kSYE(wWo&f>bT+&vNSFaPMk{43~oa`4?W0G>L5xtAuAgdv2 zoS6np)YJ7=k7hvhtb^(X$8x)bN4dUui3yuggG-Zv%9i(#1v!xA3m%B#@5a~YA#2zg z({vkYyLnUiD%AN@K$-c|cTD^M@J$UKiwAn6T=&HFEtlVp}pax`v9*ii49&P zUPBfF#o%L{B-!!Q_jDs2#_Tk18<|@zv`-ax(_@S|kC~XrR3p2PjIo@O{7o!~BSp@< zI|u93_~Jqj*rFS4rKpgMSjiI~f*m0(NPFfndPeE3K-^#LwkHQU-IfiB!ixYHGZjK+ z79shAvz-|a!IHd2$F7XZP)TWoeZU9>v}eL9sn4}tgNM2o`PEQZZ7GdAY~`mr0EWYx zg(26384neNE{|!?`k)MEsG+7RdKT`KULt|CS7N1fUrj*X=hoTZoGqi?Bwm{sB-Ide zFv_h>408Ku7$?<}7p_5)zrp=*A=yg-z*eL&OFP|p#PySQxMkrvlA)sI#e~8MJjr5V z^7F$4ha^%rQ5m$v0b?LSK7$8q7M&h!jR~6$CpoR6Wxe>URne?3J%-WTa=I^Xkv{#}U)(L4-P)i=UHL`f-vX!Y$7_S*|OL3UT z)i%u#j!*;nC93oo2oEIxX$?|`;Vl~|B9Lk*ERrsn(?V~q$LCCLs#mo-BG{%ZV= zzg{Gaq$~&5tIBho5<2MCEMLgHG{*L;kQ}te(W!C&DcW-M{x|1nND#`ARiQTvSe1vK1@CWb z5i5EftI4P__ZT00^_+;?0tE{aTv}I5;IGgM!Nkj+>g~@_ZGLR{8YcwF^{n@ZzAJSb zbSk)aDIO5j$l2@}e=cGh$y-{$@;q0}^)}}`ciQvI6=#FIYEB|umYF9lK@NBb*0RBi zi5TvNiXw7lPH@#bp_Lk;h1Df}qN@0|K!9-;bOXeu2duFhy8Dx67hj!o%3^;7j7!^5 zt#Zj!g<01i{--g++TLc)mbIeXAx>@Z8^Ii%Rl^_1*_E=DeXWu~Zh-58=fs!rC>EG< zsUTycNzG!jCA^a*+-`hbd}yl7fzn(9AJ%w)U)d_OZsFySg_u+RrCQg_>KfKTAlY2}pE%Y*7OfQ(w?!O*r@W*+;U-t5P4)m2 zR@7N5IwxxY%8@m|MyO%^-LQ%ctOU$8@L22Dum)J>6j=jsBK35Be`^5!(6vQAy&P}~ z<2OxbhpV-svyFz|R~PRZCIOep{gXtbrD3V4n_6Rsi+x_eht|ST!lqk2bvhm_U_qz= zO9VG7WI&MMB3(VqJ$h<;6+~PCxjTu~pTEUD?v?@EqmT0XHMb-YHZ)--gwD!jfGsbJvvRuWNY&HNA2H(@dT+OGCv%^&{f!G(* zx?ZuC)vzRqjSkHAYmhb|_Y4iF zlGfE4qVypm?A%OivrSj-SCT}LTEE+oZB78|Ok)1qI?lGBs7!RyE7i-uDjz(sz&?Do zgI8=s_)`B1gj2=#tJg)&pAMLo+J@ekZ^N#I)}_v`m$t0;xy5n;FIF+zYfT5&TeNdY<7wd*R&)hL=K!%njQmp5nnQXsr?F3~N{O_o`T6hYUCj$$1SN=74C?`L^>p&+oh%^+5X!f>oKssr#Ty8x> z2g|$1uX7{4hb`JVF=fk!hlSPTf@w^-LQJ_jD~1EjL8$q18S_60QP8DwwGY=;`Pn5& zIp*^v2|ssez{*ktX@fjwk;WwmF1;E@C#xbF=MIKiLtyD8F&Fa7-p1gTN5Yl85%$nO zQ}Z%L0m1}eRk~5%3JV9kVk^R{d8vEUg$+8f#b&cvqw>m%+X5dEC6FAP^n`t#7+c$t zlEnp2Kbsgpr7o_47niz@0>VVDBq<7N;sI9T(|&Phv-oOUmoT-M1i-i()tW78MyPD- z0sntN1=fVd5??G1(uo@OG5bb2|Ln9ssR+{Y!-k8hW2NgQ%~vRIo7J(6%mNdu>)6zS zo3+9y^)al%R`oOxyWTDKed~7a8rTk7E<}>yx>i7bE%$cO6I)C8a#b7%)yJdtcGiG_ zCH&H@2bW!rKPvzPM+X25>q1a>g*v`Yg*wVNB9h$350FE%?5@Xjlnca9xoKl7xR@@J zj8)9uf$(07U#4`klf7A|gRD%<-oE@bX@aAP+^i?O=Bnk`I+$xMWirIztB6E^h?b$Y z934bo28(0@HEyqS9q_8blT=l#6rRiKU#n;%iyE2M>{G-XO})nG(F=4&NLvjOo34`4 zx3TF4t6EDJepmqzDnMDy4XbqBwU7Ab7q*0CT51xC%Se$m*z6M&%{}BNc+HNun#?#P*i+9xL%`TqEdWUGGHN64Jd%X;l!wtCIlS%MM9i-WKo2><&##QnjA^e(a=7V2`_?CKjgZA}N zM=Ru~x#okw9qKhZ+~XbU2Z?&7d{9lVD*Ye8_Rji#pIv1r!w-B*Pp4~Q>RJ2IK3}ks zZJEaV2G)THaBuh5ay8&PxvhImyYx0u#tEQ(BfxqDsZW(7vx;GaCN)J>JLKl2F4LAg z`WsPaUbw|c8cCDrYNSnVJ56n@#_dYSn0AfEf&42 z^U|4y2>@jq8}@Aju-}I*03cTOqR8OYWNix&yIk;kQ$rRjm*TvnA*^WdwIT7S%>WIc&sK4>XW$Nt$*#H z;zK$2RCFhTOi((AgTbn7w~!;*)*=MQ#k`LYXIaI1CvGB9kG3C6vq%%&QL+^cjG=9TfoKdj#Z%+E!g z2#~&I#AsRB#)MaOGzXgL=|{8q&8sj<=3^=UGttQQBtsetb==`nfx3qSZG zC0#l0X3NUQr-@fil{prZtvqRN02Q(1)_lQp?cKC;7pGfN(=m#x%lNjYNPNK%Ua_kq znA^x17eCMwP(hydQZdtA=koTN5@ECiUuXE?Eg?i@79#t`NCzw?E;y9jVu()LgI#^w z)nIIn{+o@Nu03SMEj-s4Vn6Ze=QTRs*>00lYCAZgS`l3pS0_8Dp<0p z{Bk8Nmy7ciQQB2<3GTqO`Z=<)(2X~z)Ny`WU;ZYrqI|5KITB3|JKtvA)AcK&EFcKS z{yL@#Ft*tS@(g?(gEWNEGic}IzH;BKgl@|O;G`4tM5}E5=p=Gx6{Bg6U{AYc-N?^I zUq@dXlUN>2Tf|9yp2xQ7D0txG!OP#}B=_gdTF?c7Co;hEa{0vv7f`px3AeEYYVU5i zwz)#9n4ESTB5b3Og|@Y`GR3ziaJZd6Y?LMJR~pn_KrEqi-zY?&|ID@qXinjRbj##s zBgljnl#FN<{TVPyB1F8tS73U|~CgzV^dA2y81wQDtKs zdBEu!kL;!`7p1-s5zOLVX@7?F61mx&4(FB9mYPQ}=2k+M@3?Oy4-6-{E%Pjb8o~-d z9X@+I`L8nXCY+{sulegz&DD3vPrrMtxyLP)5CuH zxu*jT7WYS_iCm@A8g29=M0Bd#>C&zU z)r>9rtmTrILMM-o-bBqG#AuC$;y0X0S>EJX-c&6|nb5K}+&2cJ;etsjR2-vdYWdztE0Nb6o zos0>31BFuE_odL;YQ6{H@tfXVxxX4HW-#1@2@uoIh6so$Scgz~IXH_cTH$c`B=S>l z+WnZlCe#S@^o<#>p$G7Vklxn%D@9kCuDOEIR$0Lkfv%dKZx>dXexF9ldpRk%&?3U#=cDPKj0ft8Kd!%QZRBvo3Fo`OJ*Ois2GQym5 z$Q~_b$69qTI>J13tGk@z5#Z3zMoH@szQYw%%_Yj@UskkTp#j#Z4xlT0gGo!!;MC5n zL|yzTSE13fmfRHFYy|Qfh;-QAk8=T_g&Eo18tWNpVcFv(QCE(E);B{Vq%%4AnHp2` zLk~pyaThD$LcAdh5m43uFNuE5%K-U0B0(vC#9l+9c~AP11IF@_oyi`%NhQ*^f%*F+ zoJGhqrlN`?W%|HU&8;KC@$EW;OQT80j7@Few{d!uC$*X<^&P{Ig82ty5lNZMMwv;z z&F2OaR*_SI?E|Fyhjw5t1FREqmwP^$8B|u>FFp3uCqPL+J87>=#99v$c~o-wg?rw zVlLNWE`jP+YP}{L-&tHCyY9fJoYo%NcIN1B>aOIrGG^@K_cztHyqju5${aCbUJs*m z+0CETBq3{-Jw#1hT6(gw;Kn?YirVE_#gxx#;?jM>E)=O%Fl7;my zhzZgwT#Hi@%}nXm0rp7n&?MEnjj}?tej7Wa)X&Q37&A&kaTqg_hk1$Sd6)B1B$`GR zj^8mtBo%0-viB$xV<%~8CTY1mP5vW)7A9WY?2u6=ZjDn%5^A;2vJNTG{>W4lcGG+C zvgED&vWzpYkyjdEzDF4xI|(4+Wg{Mr$;6Z3WevQVyKW$t+HO)C3*KA8O;NqtjZLI< z*|yGPfea(5fI?r~A6vAE<}O+J9#n8c@-A+O>;G6fszl^!(0JLnjQ1#A3N`Qk;zRp2 zz<;Il3tQjw_5uPuGGz%@}z!abpEI93~6J>it9=9I2v zp@U#qA4RG8c25Z~PCsQXJLTJBdy@oq1NaUNJ}|yZLzSfPF?fFu3Jg5{BDhLQLa)wFh)jW`>GmNj`->yckmrm3A2 zm`bsmC1o>POwwD$#9Yo(tW zh??#HG`EY(p8ivuoC#XEA0+7z3EBdhIZaoD=KoWs^$X?y7)vSuAOp83dn?x8MQx7Y zMR`|CHCND3RCz8HlN_1DK6V-aBExoCb&V(L2J&&f;ej%-5GF71riN?Zl%S>Ff)yPy zHr9?jmT-bDC{~v;)!RF{6=;`X-v$;eEn}wEh9_yMI;I@^{)>=s(^!C6iScvDB0>fO zbf!R?44J2bE~ra!X;$%qH+CR{d3$y@pgsLAZp2+0b!JCI1X##N7I>GH3h*TBonDQnDY2@J-3PD1XLR!PhDOMZytS#053;*= zapRy{6+L>d^7C)v4#mk|RhU{d#!}vI=&PNNj;(04#nOM1XA0}26acNDNyIR<)lAMX zpzXhI&IWCo4CNhvGr>*0jC`0ezfv0ol_A2BRpnG@v$dJx7~XcIdWd&TnVzE5ufiSk zd1knQ^WuTv!#=+X6Tqq@-htqv2KF3!3)<#4cwGeiw*UFuL{|&35S!NHFEYae<{1Uw zr2jxXj|CNFEo?j$&*O>RY^jAfW4I)TuZPc4p+~hw5L2NY-emOX%!UaYieD)N*EZ1? z!!>H807b&XG0ed$>6FUqf1qnv>AX4NvC7>rn-x~&pdZ$r>b1$y&BK5|D)To*etOvB*yO{ zeCK!x( zqkoR!0QK7DK%dJjj`_7(0zHTDA2K+468W0>|6uz>DNx7owq+$km?o{GjzEgb8JmVm z+tY4Y*00klC}D_z{pdoO*v$>;3nc%oHf#IL@X29Rf74L;id+yOQAJf@W(D8pxnh`C zYz)QWAI_5DW(s%Xw{VEAiR~ce7Nsi0x}3l(r zl^C=_5r|@$6^VfVuy$wQ14O+}g$`cl*cC%scZ8&}$tLt`=NrY%6U}psh3h_D0F_?{ zkMkKWGcG*2Sz7c{#(MyTXiXeX%y6vwQw>LzDMB}KPj;j1Br{(E##^v#OzWWV8k}5S zki?+ucmS28hFd0xl7>2U4z=&vdPPM=@*0GvPEkOYN)mxy%gPrJk2Mw3&BBLoEES~DI-FKBUQ~%f5+5^S3*B*>O5%>I25YJrkxD{F``gOY<$q#VD}%ce z)HE^<*^AnEjrBw*Bz1C!m927n`!n~LO@bs_S*%)n`+XpE@E#dmHi;a}(R}+fYa<8| zX;K!C&3$ifevXW~a0v)Nye*P62%yg6wz4`w$H_NK6UmX2D`!A~*N^F`H!}$V_Ts}S z#uO|&0zG=WQ}>wDMA{}iSN5*1n3|DuJFHkmz`8P<&9A+i1^KqwB=(7o!4M3`shD;q z5XZS(o^)UkDjC}c_#qMT3-A{{Y&!#298M0*bX8+P3X3&QZ#`|y2*fy(>(*Mix2`f~ z=-*eNEoM-pt23bk4hcb;_IM4-*I|AUNb<fWbJ#mo-^Af_bsmW7M_Spv5o`jgL)3x)rWAsQP590m=7|H8ce>63(}bjtsKkqPtv z4AH)+-GBb{iNH57d4+v9`rTSrx%0i~_zLh@-pt_Br*x(TR7T7+!7&EL&uFVG#jq`w z3DSXy!#DXE9Z>taC)A2dpZazEjdoE)9jDp@%c(nKIZIh>1D~7yOF)_;ilRc!l#l4xkZCyiYau=mAIxBa0aDI6EI4}HdEo&Bn z_ZeS$NTl|aKPppz9}EF0ogo@$)p5T~i0vLcP^H#y-Q=K@=4~hV#~?uz3w3jSXV?>! z=|iNR6`hN6Br!R8AQ2LsN{HjBlfkD;kVU*rFP~?B>)P=Ag0^>f?cn<1q-l6~>*!i_ z_oMWn$9F7KKDJNfZo~V9qw3c1Xm?)%9=x}|ca?KU8G^zg|II$=jsJTV7$uB|^sKsM zl>i&vPK)j~s0j~oa{L7?B!=%DfezvDKt#HE*6No8_kC~(k>Z|SpyRW6qbSqjM3f$X z(dnvg3*~qB>mTtc717|V5!~IP4G(oER2;fM9%nqqCV zy;h5c+X;uDb?tFv)_U*875@O9-XZVH^9u; zg2t!sz|v6r)4%p{dE*pt{XzQlqj3D@H=OT{qoFv~$fi@Bbq=<5ciZbGel;mzGi;S3 z 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 + + + + + + +

    + +Sorry page under construction ! +

    + + + + +ÔÔ \ No newline at end of file diff --git a/at_work/random_alg/index.html~ b/at_work/random_alg/index.html~ new file mode 100644 index 0000000..d1f5294 --- /dev/null +++ b/at_work/random_alg/index.html~ @@ -0,0 +1,17 @@ + + + + + + + + +

    + +Sorry page under construction ! +

    + + + + +Ô \ No newline at end of file diff --git a/bin/atari/atari.doc b/bin/atari/atari.doc new file mode 100644 index 0000000000000000000000000000000000000000..db0a779a26e40c10238494871a6ed109acda280f GIT binary patch literal 11257 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 J!j8k|{{ZG?LD2vJ literal 0 HcmV?d00001 diff --git a/bin/atari/atari.ps b/bin/atari/atari.ps new file mode 100644 index 0000000..4445fbd --- /dev/null +++ b/bin/atari/atari.ps @@ -0,0 +1,1147 @@ +%!PS-Adobe-3.0 +%%Creator: Windows PSCRIPT +%%Title: Microsoft Word - ATARI.DOC +%%BoundingBox: 9 15 584 830 +%%DocumentNeededResources: (atend) +%%DocumentSuppliedResources: (atend) +%%Pages: (atend) +%%BeginResource: procset Win35Dict 3 1 +/Win35Dict 290 dict def Win35Dict begin/bd{bind def}bind def/in{72 +mul}bd/ed{exch def}bd/ld{load def}bd/tr/translate ld/gs/gsave ld/gr +/grestore ld/M/moveto ld/L/lineto ld/rmt/rmoveto ld/rlt/rlineto ld +/rct/rcurveto ld/st/stroke ld/n/newpath ld/sm/setmatrix ld/cm/currentmatrix +ld/cp/closepath ld/ARC/arcn ld/TR{65536 div}bd/lj/setlinejoin ld/lc +/setlinecap ld/ml/setmiterlimit ld/sl/setlinewidth ld/scignore false +def/sc{scignore{pop pop pop}{0 index 2 index eq 2 index 4 index eq +and{pop pop 255 div setgray}{3{255 div 3 1 roll}repeat setrgbcolor}ifelse}ifelse}bd +/FC{bR bG bB sc}bd/fC{/bB ed/bG ed/bR ed}bd/HC{hR hG hB sc}bd/hC{ +/hB ed/hG ed/hR ed}bd/PC{pR pG pB sc}bd/pC{/pB ed/pG ed/pR ed}bd/sM +matrix def/PenW 1 def/iPen 5 def/mxF matrix def/mxE matrix def/mxUE +matrix def/mxUF matrix def/fBE false def/iDevRes 72 0 matrix defaultmatrix +dtransform dup mul exch dup mul add sqrt def/fPP false def/SS{fPP{ +/SV save def}{gs}ifelse}bd/RS{fPP{SV restore}{gr}ifelse}bd/EJ{gsave +showpage grestore}bd/#C{userdict begin/#copies ed end}bd/FEbuf 2 string +def/FEglyph(G )def/FE{1 exch{dup 16 FEbuf cvrs FEglyph exch 1 exch +putinterval 1 index exch FEglyph cvn put}for}bd/SM{/iRes ed/cyP ed +/cxPg ed/cyM ed/cxM ed 72 100 div dup scale dup 0 ne{90 eq{cyM exch +0 eq{cxM exch tr -90 rotate -1 1 scale}{cxM cxPg add exch tr +90 rotate}ifelse}{cyP +cyM sub exch 0 ne{cxM exch tr -90 rotate}{cxM cxPg add exch tr -90 +rotate 1 -1 scale}ifelse}ifelse}{pop cyP cyM sub exch 0 ne{cxM cxPg +add exch tr 180 rotate}{cxM exch tr 1 -1 scale}ifelse}ifelse 100 iRes +div dup scale 0 0 transform .25 add round .25 sub exch .25 add round +.25 sub exch itransform translate}bd/SJ{1 index 0 eq{pop pop/fBE false +def}{1 index/Break ed div/dxBreak ed/fBE true def}ifelse}bd/ANSIVec[ +16#0/grave 16#1/acute 16#2/circumflex 16#3/tilde 16#4/macron 16#5/breve +16#6/dotaccent 16#7/dieresis 16#8/ring 16#9/cedilla 16#A/hungarumlaut +16#B/ogonek 16#C/caron 16#D/dotlessi 16#27/quotesingle 16#60/grave +16#7C/bar 16#82/quotesinglbase 16#83/florin 16#84/quotedblbase 16#85 +/ellipsis 16#86/dagger 16#87/daggerdbl 16#89/perthousand 16#8A/Scaron +16#8B/guilsinglleft 16#8C/OE 16#91/quoteleft 16#92/quoteright 16#93 +/quotedblleft 16#94/quotedblright 16#95/bullet 16#96/endash 16#97 +/emdash 16#99/trademark 16#9A/scaron 16#9B/guilsinglright 16#9C/oe +16#9F/Ydieresis 16#A0/space 16#A4/currency 16#A6/brokenbar 16#A7/section +16#A8/dieresis 16#A9/copyright 16#AA/ordfeminine 16#AB/guillemotleft +16#AC/logicalnot 16#AD/hyphen 16#AE/registered 16#AF/macron 16#B0/degree +16#B1/plusminus 16#B2/twosuperior 16#B3/threesuperior 16#B4/acute 16#B5 +/mu 16#B6/paragraph 16#B7/periodcentered 16#B8/cedilla 16#B9/onesuperior +16#BA/ordmasculine 16#BB/guillemotright 16#BC/onequarter 16#BD/onehalf +16#BE/threequarters 16#BF/questiondown 16#C0/Agrave 16#C1/Aacute 16#C2 +/Acircumflex 16#C3/Atilde 16#C4/Adieresis 16#C5/Aring 16#C6/AE 16#C7 +/Ccedilla 16#C8/Egrave 16#C9/Eacute 16#CA/Ecircumflex 16#CB/Edieresis +16#CC/Igrave 16#CD/Iacute 16#CE/Icircumflex 16#CF/Idieresis 16#D0/Eth +16#D1/Ntilde 16#D2/Ograve 16#D3/Oacute 16#D4/Ocircumflex 16#D5/Otilde +16#D6/Odieresis 16#D7/multiply 16#D8/Oslash 16#D9/Ugrave 16#DA/Uacute +16#DB/Ucircumflex 16#DC/Udieresis 16#DD/Yacute 16#DE/Thorn 16#DF/germandbls +16#E0/agrave 16#E1/aacute 16#E2/acircumflex 16#E3/atilde 16#E4/adieresis +16#E5/aring 16#E6/ae 16#E7/ccedilla 16#E8/egrave 16#E9/eacute 16#EA +/ecircumflex 16#EB/edieresis 16#EC/igrave 16#ED/iacute 16#EE/icircumflex +16#EF/idieresis 16#F0/eth 16#F1/ntilde 16#F2/ograve 16#F3/oacute 16#F4 +/ocircumflex 16#F5/otilde 16#F6/odieresis 16#F7/divide 16#F8/oslash +16#F9/ugrave 16#FA/uacute 16#FB/ucircumflex 16#FC/udieresis 16#FD/yacute +16#FE/thorn 16#FF/ydieresis ] def/reencdict 12 dict def/IsChar{basefontdict +/CharStrings get exch known}bd/MapCh{dup IsChar not{pop/bullet}if +newfont/Encoding get 3 1 roll put}bd/MapDegree{16#b0/degree IsChar{ +/degree}{/ring}ifelse MapCh}bd/MapBB{16#a6/brokenbar IsChar{/brokenbar}{ +/bar}ifelse MapCh}bd/ANSIFont{reencdict begin/newfontname ed/basefontname +ed FontDirectory newfontname known not{/basefontdict basefontname findfont +def/newfont basefontdict maxlength dict def basefontdict{exch dup/FID +ne{dup/Encoding eq{exch dup length array copy newfont 3 1 roll put}{exch +newfont 3 1 roll put}ifelse}{pop pop}ifelse}forall newfont/FontName +newfontname put 127 1 159{newfont/Encoding get exch/bullet put}for +ANSIVec aload pop ANSIVec length 2 idiv{MapCh}repeat MapDegree MapBB +newfontname newfont definefont pop}if newfontname end}bd/SB{FC/ULlen +ed/str ed str length fBE not{dup 1 gt{1 sub}if}if/cbStr ed/dxGdi ed +/y0 ed/x0 ed str stringwidth dup 0 ne{/y1 ed/x1 ed y1 y1 mul x1 x1 +mul add sqrt dxGdi exch div 1 sub dup x1 mul cbStr div exch y1 mul +cbStr div}{exch abs neg dxGdi add cbStr div exch}ifelse/dyExtra ed +/dxExtra ed x0 y0 M fBE{dxBreak 0 BCh dxExtra dyExtra str awidthshow}{dxExtra +dyExtra str ashow}ifelse fUL{x0 y0 M dxUL dyUL rmt ULlen fBE{Break +add}if 0 mxUE transform gs rlt cyUL sl [] 0 setdash st gr}if fSO{x0 +y0 M dxSO dySO rmt ULlen fBE{Break add}if 0 mxUE transform gs rlt cyUL +sl [] 0 setdash st gr}if n/fBE false def}bd/font{/name ed/Ascent ed +0 ne/fT3 ed 0 ne/fSO ed 0 ne/fUL ed/Sy ed/Sx ed 10.0 div/ori ed -10.0 +div/esc ed/BCh ed name findfont/xAscent 0 def/yAscent Ascent def/ULesc +esc def ULesc mxUE rotate pop fT3{/esc 0 def xAscent yAscent mxUE transform +/yAscent ed/xAscent ed}if [Sx 0 0 Sy neg xAscent yAscent] esc mxE +rotate mxF concatmatrix makefont setfont [Sx 0 0 Sy neg 0 Ascent] mxUE +mxUF concatmatrix pop fUL{currentfont dup/FontInfo get/UnderlinePosition +known not{pop/Courier findfont}if/FontInfo get/UnderlinePosition get +1000 div 0 exch mxUF transform/dyUL ed/dxUL ed}if fSO{0 .3 mxUF transform +/dySO ed/dxSO ed}if fUL fSO or{currentfont dup/FontInfo get/UnderlineThickness +known not{pop/Courier findfont}if/FontInfo get/UnderlineThickness get +1000 div Sy mul/cyUL ed}if}bd/min{2 copy gt{exch}if pop}bd/max{2 copy +lt{exch}if pop}bd/CP{/ft ed{{ft 0 eq{clip}{eoclip}ifelse}stopped{currentflat +1 add setflat}{exit}ifelse}loop}bd/patfont 10 dict def patfont begin +/FontType 3 def/FontMatrix [1 0 0 -1 0 0] def/FontBBox [0 0 16 16] +def/Encoding StandardEncoding def/BuildChar{pop pop 16 0 0 0 16 16 +setcachedevice 16 16 false [1 0 0 1 .25 .25]{pat}imagemask}bd end/p{ +/pat 32 string def{}forall 0 1 7{dup 2 mul pat exch 3 index put dup +2 mul 1 add pat exch 3 index put dup 2 mul 16 add pat exch 3 index +put 2 mul 17 add pat exch 2 index put pop}for}bd/pfill{/PatFont patfont +definefont setfont/ch(AAAA)def X0 64 X1{Y1 -16 Y0{1 index exch M ch +show}for pop}for}bd/vert{X0 w X1{dup Y0 M Y1 L st}for}bd/horz{Y0 w +Y1{dup X0 exch M X1 exch L st}for}bd/fdiag{X0 w X1{Y0 M X1 X0 sub dup +rlt st}for Y0 w Y1{X0 exch M Y1 Y0 sub dup rlt st}for}bd/bdiag{X0 w +X1{Y1 M X1 X0 sub dup neg rlt st}for Y0 w Y1{X0 exch M Y1 Y0 sub dup +neg rlt st}for}bd/AU{1 add cvi 15 or}bd/AD{1 sub cvi -16 and}bd/SHR{pathbbox +AU/Y1 ed AU/X1 ed AD/Y0 ed AD/X0 ed}bd/hfill{/w iRes 37.5 div round +def 0.1 sl [] 0 setdash n dup 0 eq{horz}if dup 1 eq{vert}if dup 2 eq{fdiag}if +dup 3 eq{bdiag}if dup 4 eq{horz vert}if 5 eq{fdiag bdiag}if}bd/F{/ft +ed fm 256 and 0 ne{gs FC ft 0 eq{fill}{eofill}ifelse gr}if fm 1536 +and 0 ne{SHR gs HC ft CP fm 1024 and 0 ne{/Tmp save def pfill Tmp restore}{fm +15 and hfill}ifelse gr}if}bd/S{PenW sl PC st}bd/m matrix def/GW{iRes +12 div PenW add cvi}bd/DoW{iRes 50 div PenW add cvi}bd/DW{iRes 8 div +PenW add cvi}bd/SP{/PenW ed/iPen ed iPen 0 eq iPen 6 eq or{[] 0 setdash}if +iPen 1 eq{[DW GW] 0 setdash}if iPen 2 eq{[DoW GW] 0 setdash}if iPen +3 eq{[DW GW DoW GW] 0 setdash}if iPen 4 eq{[DW GW DoW GW DoW GW] 0 +setdash}if}bd/E{m cm pop tr scale 1 0 moveto 0 0 1 0 360 arc cp m sm}bd +/AG{/sy ed/sx ed sx div 4 1 roll sy div 4 1 roll sx div 4 1 roll sy +div 4 1 roll atan/a2 ed atan/a1 ed sx sy scale a1 a2 ARC}def/A{m cm +pop tr AG m sm}def/P{m cm pop tr 0 0 M AG cp m sm}def/RRect{n 4 copy +M 3 1 roll exch L 4 2 roll L L cp}bd/RRCC{/r ed/y1 ed/x1 ed/y0 ed/x0 +ed x0 x1 add 2 div y0 M x1 y0 x1 y1 r arcto 4{pop}repeat x1 y1 x0 y1 +r arcto 4{pop}repeat x0 y1 x0 y0 r arcto 4{pop}repeat x0 y0 x1 y0 r +arcto 4{pop}repeat cp}bd/RR{2 copy 0 eq exch 0 eq or{pop pop RRect}{2 +copy eq{pop RRCC}{m cm pop/y2 ed/x2 ed/ys y2 x2 div 1 max def/xs x2 +y2 div 1 max def/y1 exch ys div def/x1 exch xs div def/y0 exch ys div +def/x0 exch xs div def/r2 x2 y2 min def xs ys scale x0 x1 add 2 div +y0 M x1 y0 x1 y1 r2 arcto 4{pop}repeat x1 y1 x0 y1 r2 arcto 4{pop}repeat +x0 y1 x0 y0 r2 arcto 4{pop}repeat x0 y0 x1 y0 r2 arcto 4{pop}repeat +m sm cp}ifelse}ifelse}bd/PP{{rlt}repeat}bd/OB{gs 0 ne{7 3 roll/y ed +/x ed x y translate ULesc rotate x neg y neg translate x y 7 -3 roll}if +sc B fill gr}bd/B{M/dy ed/dx ed dx 0 rlt 0 dy rlt dx neg 0 rlt cp}bd +/CB{B clip n}bd/ErrHandler{errordict dup maxlength exch length gt +dup{errordict begin}if/errhelpdict 12 dict def errhelpdict begin/stackunderflow(operand stack underflow)def +/undefined(this name is not defined in a dictionary)def/VMerror(you have used up all the printer's memory)def +/typecheck(operator was expecting a different type of operand)def +/ioerror(input/output error occured)def end{end}if errordict begin +/handleerror{$error begin newerror{/newerror false def showpage 72 +72 scale/x .25 def/y 9.6 def/Helvetica findfont .2 scalefont setfont +x y moveto(Offending Command = )show/command load{dup type/stringtype +ne{(max err string)cvs}if show}exec/y y .2 sub def x y moveto(Error = )show +errorname{dup type dup( max err string )cvs show( : )show/stringtype +ne{( max err string )cvs}if show}exec errordict begin errhelpdict errorname +known{x 1 add y .2 sub moveto errhelpdict errorname get show}if end +/y y .4 sub def x y moveto(Stack =)show ostack{/y y .2 sub def x 1 +add y moveto dup type/stringtype ne{( max err string )cvs}if show}forall +showpage}if end}def end}bd end +%%EndResource +/SVDoc save def +%%EndProlog +%%BeginSetup +Win35Dict begin +ErrHandler +statusdict begin 0 setjobtimeout end +statusdict begin statusdict /jobname (Microsoft Word - ATARI.DOC) put end +/oldDictCnt countdictstack def {statusdict begin 0 setpapertray end +}stopped +{ countdictstack oldDictCnt lt { Win35Dict begin } +{1 1 countdictstack oldDictCnt sub {pop end } for } ifelse } if +/oldDictCnt countdictstack def {a4 +}stopped +{ countdictstack oldDictCnt lt { Win35Dict begin } +{1 1 countdictstack oldDictCnt sub {pop end } for } ifelse } if +[{ } +/exec load currenttransfer /exec load] cvx settransfer +/setresolution where { pop 300 300 setresolution } if +%%EndSetup +%%Page: 1 1 +%%PageResources: (atend) +SS +0 0 12 16 799 1169 300 SM +32 0 0 92 92 0 0 0 90 /NewCenturySchlbk-Roman /font23 ANSIFont font +0 0 0 fC +623 362 1162 (LOGLAN pour ATARI STE) 1162 SB +32 0 0 58 58 0 0 0 57 /NewCenturySchlbk-Roman /font23 ANSIFont font +860 582 687 (par Sebastien BERNARD) 687 SB +32 0 0 50 50 0 0 0 49 /NewCenturySchlbk-Roman /font23 ANSIFont font +339 831 72 (Le ) 86 SB +425 831 196 (langage ) 210 SB +635 831 308 (LOGLAN-82 ) 322 SB +957 831 81 (est ) 96 SB +1053 831 286 (maintenant ) 301 SB +1354 831 252 (disponible ) 267 SB +1621 831 116 (sous ) 131 SB +1752 831 189 (ATARI. ) 204 SB +1956 831 50 (Il ) 65 SB +2021 831 48 (se) 48 SB +339 891 1204 (pr\351sente sous la forme de trois fichiers ex\351cutables :) 1204 SB +339 951 1267 ( * LOGLAN.TTP : premi\350re partie du compilateur.) 1267 SB +339 1011 1688 ( * GEN.TTP : g\351n\351rateur de code \( 2\350me partie du compilateur\).) 1688 SB +339 1071 1020 ( * INTGEM.PRG : interpr\350teur du code.) 1020 SB +339 1191 98 (Ces ) 117 SB +456 1191 119 (trois ) 138 SB +594 1191 186 (fichiers ) 205 SB +799 1191 112 (sont ) 131 SB +930 1191 42 (\340 ) 62 SB +992 1191 168 (mettre ) 188 SB +1180 1191 70 (en ) 90 SB +1270 1191 373 (correspondance ) 393 SB +1663 1191 116 (avec ) 136 SB +1799 1191 78 (les ) 98 SB +1897 1191 172 (fichiers) 172 SB +339 1251 370 (LOGLAN.EXE, ) 381 SB +720 1251 251 (GEN.EXE ) 262 SB +982 1251 58 (et ) 69 SB +1051 1251 229 (INT.EXE ) 240 SB +1291 1251 91 (des ) 103 SB +1394 1251 117 (IBM ) 129 SB +1523 1251 97 (PC. ) 109 SB +1632 1251 73 (Ils ) 85 SB +1717 1251 89 (ont ) 101 SB +1818 1251 78 (les ) 90 SB +1908 1251 161 (memes) 161 SB +339 1311 349 (fonctionnalit\351. ) 352 SB +691 1311 125 (Pour ) 128 SB +819 1311 280 (l'utilisation ) 283 SB +1102 1311 74 (du ) 77 SB +1179 1311 291 (compilateur ) 294 SB +1473 1311 62 (se ) 65 SB +1538 1311 203 (reporter ) 207 SB +1745 1311 73 (au ) 77 SB +1822 1311 189 (manuel ) 193 SB +2015 1311 54 (de) 54 SB +339 1371 286 (l'utilisateur ) 304 SB +643 1371 121 (pour ) 139 SB +782 1371 235 (LOGLAN ) 253 SB +1035 1371 116 (sous ) 134 SB +1169 1371 138 (DOS. ) 156 SB +1325 1371 94 (Cet ) 112 SB +1437 1371 168 (additif ) 187 SB +1624 1371 70 (ne ) 89 SB +1713 1371 143 (traite ) 162 SB +1875 1371 98 (que ) 117 SB +1992 1371 77 (des) 77 SB +339 1431 1349 (diff\351rences entre la version ATARI ST\(E\) et la version PC.) 1349 SB +339 1551 75 (La ) 75 SB +32 0 0 50 50 0 0 0 48 /NewCenturySchlbk-Italic /font22 ANSIFont font +414 1552 561 (configuration minimale ) 561 SB +32 0 0 50 50 0 0 0 49 /NewCenturySchlbk-Roman /font23 ANSIFont font +975 1551 1057 (pour utiliser ces programmes est la suivante :) 1057 SB +339 1612 388 ( - 1 Mo de RAM.) 388 SB +339 1672 586 ( - un lecteur double-face.) 586 SB +339 1792 1596 (Il est conseill\351 pour se servir plus facilement du compilateur d'avoir :) 1596 SB +339 1852 619 ( - 2 Mo de RAM \( ou plus \)) 619 SB +339 1912 1126 ( - un disque dur \( ou deux lecteurs \340 la rigueur \)) 1126 SB +32 0 0 50 50 0 0 0 50 /NewCenturySchlbk-Bold /font20 ANSIFont font +339 2032 909 (Comment compiler un programme ) 909 SB +32 0 0 50 50 0 0 0 49 /NewCenturySchlbk-Roman /font23 ANSIFont font +1248 2033 14 (:) 14 SB +339 2093 78 ( A ) 81 SB +420 2093 58 (la ) 61 SB +481 2093 243 (diff\351rence ) 247 SB +728 2093 140 (d'une ) 144 SB +872 2093 211 (machine ) 215 SB +1087 2093 116 (sous ) 120 SB +1207 2093 138 (DOS, ) 142 SB +1349 2093 161 (l'Atari ) 165 SB +1514 2093 70 (ne ) 74 SB +1588 2093 193 (poss\350de ) 197 SB +1785 2093 157 (aucun ) 161 SB +1946 2093 123 (mode) 123 SB +339 2153 129 (ligne ) 147 SB +486 2153 89 (qui ) 107 SB +593 2153 282 (permettrait ) 301 SB +894 2153 197 (d'entrer ) 216 SB +1110 2153 291 (directement ) 310 SB +1420 2153 78 (les ) 97 SB +1517 2153 285 (commandes ) 304 SB +1821 2153 175 (suivies ) 194 SB +2015 2153 54 (de) 54 SB +339 2213 279 (param\350tres.) 279 SB +339 2273 50 (A ) 54 SB +393 2273 58 (la ) 63 SB +456 2273 148 (place, ) 153 SB +609 2273 55 (le ) 60 SB +669 2273 179 (bureau ) 184 SB +853 2273 192 (propose ) 197 SB +1050 2273 91 (des ) 96 SB +1146 2273 303 (programmes ) 308 SB +1454 2273 101 (dits ) 106 SB +1560 2273 118 (TOS ) 123 SB +1683 2273 58 (et ) 63 SB +1746 2273 113 (TTP ) 118 SB +1864 2273 98 (\(tos ) 103 SB +1967 2273 102 (avec) 102 SB +339 2333 296 (param\350tres\) ) 307 SB +646 2333 61 (ce ) 72 SB +718 2333 112 (sont ) 123 SB +841 2333 91 (des ) 102 SB +943 2333 303 (programmes ) 314 SB +1257 2333 291 (exploitables ) 302 SB +1559 2333 295 (uniquement ) 306 SB +1865 2333 70 (en ) 81 SB +1946 2333 123 (mode) 123 SB +339 2393 143 (texte. ) 145 SB +484 2393 95 (Les ) 98 SB +582 2393 220 (premiers ) 223 SB +805 2393 130 (n'ont ) 133 SB +938 2393 94 (pas ) 97 SB +1035 2393 162 (besoin ) 165 SB +1200 2393 68 (de ) 71 SB +1271 2393 279 (param\350tres ) 282 SB +1553 2393 191 (\(comme ) 194 SB +1747 2393 115 (CLS ) 118 SB +1865 2393 74 (du ) 77 SB +1942 2393 127 (DOS\)) 127 SB +339 2453 201 (d'autres ) 206 SB +545 2453 89 (ont ) 94 SB +639 2453 162 (besoin ) 168 SB +807 2453 98 (que ) 104 SB +911 2453 96 (l'on ) 102 SB +1013 2453 187 (sp\351cifie ) 193 SB +1206 2453 76 (un ) 82 SB +1288 2453 70 (ou ) 76 SB +1364 2453 230 (plusieurs ) 236 SB +1600 2453 279 (param\350tres ) 285 SB +1885 2453 93 (\(un ) 99 SB +1984 2453 85 (peu) 85 SB +339 2513 493 (comme FORMAT A:\).) 493 SB +339 2573 109 ( En ) 114 SB +453 2573 108 (fait, ) 113 SB +566 2573 58 (la ) 63 SB +629 2573 243 (diff\351rence ) 249 SB +878 2573 136 (entre ) 142 SB +1020 2573 78 (les ) 84 SB +1104 2573 126 (deux ) 132 SB +1236 2573 303 (programmes ) 309 SB +1545 2573 62 (se ) 68 SB +1613 2573 178 (situent ) 184 SB +1797 2573 272 (simplement) 272 SB +339 2633 73 (au ) 81 SB +420 2633 172 (niveau ) 180 SB +600 2633 68 (de ) 76 SB +676 2633 108 (leur ) 116 SB +792 2633 250 (extension. ) 258 SB +1050 2633 95 (Les ) 104 SB +1154 2633 220 (premiers ) 229 SB +1383 2633 62 (se ) 71 SB +1454 2633 246 (terminent ) 255 SB +1709 2633 93 (par ) 102 SB +1811 2633 118 (TOS ) 127 SB +1938 2633 58 (et ) 67 SB +2005 2633 64 (les) 64 SB +339 2693 192 (seconds ) 197 SB +536 2693 93 (par ) 99 SB +635 2693 113 (TTP ) 119 SB +754 2693 87 (\(on ) 93 SB +847 2693 232 (appellera ) 238 SB +1085 2693 76 (un ) 82 SB +1167 2693 118 (TOS ) 124 SB +1291 2693 70 (ou ) 76 SB +1367 2693 76 (un ) 82 SB +1449 2693 113 (TTP ) 119 SB +1568 2693 76 (un ) 82 SB +1650 2693 280 (programme ) 286 SB +1936 2693 133 (ayant) 133 SB +339 2753 649 (l'extension correspondante\).) 649 SB +339 2813 1025 ( La diff\351rence entre un programme texte et ) 1026 SB +1365 2813 76 (un ) 77 SB +1442 2813 280 (programme ) 281 SB +1723 2813 78 (dit ) 79 SB +1802 2813 150 (GEM, ) 151 SB +1953 2813 116 (c'est-) 116 SB +339 2873 151 (\340-dire ) 163 SB +502 2873 213 (utilisant ) 225 SB +727 2873 78 (les ) 90 SB +817 2873 325 (biblioth\350ques ) 337 SB +1154 2873 274 (graphiques ) 287 SB +1441 2873 151 (situ\351s ) 164 SB +1605 2873 125 (dans ) 138 SB +1743 2873 78 (les ) 91 SB +1834 2873 168 (ROMS ) 181 SB +2015 2873 54 (de) 54 SB +339 2933 626 (votre ATARI \(VDI et AES\).) 626 SB +339 2993 1717 ( LOGLAN.TTP et GEN.TTP sont des programmes utilisant le mode texte.) 1717 SB +1 #C +statusdict begin /manualfeed false store end +EJ RS +%%PageTrailer +%%PageResources: font NewCenturySchlbk-Bold +%%+ font NewCenturySchlbk-Italic +%%+ font NewCenturySchlbk-Roman +%%Page: 2 2 +%%PageResources: (atend) +SS +0 0 12 16 799 1169 300 SM +32 0 0 50 50 0 0 0 49 /NewCenturySchlbk-Roman /font23 ANSIFont font +0 0 0 fC +339 252 380 ( INTGEM.PRG ) 384 SB +723 252 81 (est ) 85 SB +808 252 76 (un ) 80 SB +888 252 280 (programme ) 284 SB +1172 252 213 (utilisant ) 217 SB +1389 252 55 (le ) 59 SB +1448 252 137 (mode ) 142 SB +1590 252 336 (GRAPHIQUE ) 341 SB +1931 252 138 (meme) 138 SB +339 312 53 (si ) 60 SB +399 312 42 (\340 ) 49 SB +448 312 261 (l'ex\351cution ) 268 SB +716 312 68 (de ) 75 SB +791 312 303 (programmes ) 310 SB +1101 312 254 (n'utilisant ) 261 SB +1362 312 94 (pas ) 102 SB +1464 312 78 (les ) 86 SB +1550 312 251 (primitives ) 259 SB +1809 312 260 (graphiques) 260 SB +339 372 74 (du ) 83 SB +422 372 235 (LOGLAN ) 244 SB +666 372 46 (il ) 55 SB +721 372 70 (ne ) 79 SB +800 372 213 (pr\351sente ) 222 SB +1022 372 94 (pas ) 103 SB +1125 372 68 (de ) 77 SB +1202 372 243 (diff\351rence ) 252 SB +1454 372 116 (avec ) 126 SB +1580 372 78 (les ) 88 SB +1668 372 126 (deux ) 136 SB +1804 372 162 (autres ) 172 SB +1976 372 93 (pro-) 93 SB +339 432 241 (grammes, ) 243 SB +582 432 46 (il ) 48 SB +630 432 169 (r\351alise ) 171 SB +801 432 70 (en ) 73 SB +874 432 94 (fait ) 97 SB +971 432 91 (des ) 94 SB +1065 432 337 (initialisations ) 340 SB +1405 432 98 (que ) 101 SB +1506 432 55 (le ) 58 SB +1564 432 179 (bureau ) 182 SB +1746 432 94 (fait ) 97 SB +1843 432 42 (\340 ) 45 SB +1888 432 58 (la ) 61 SB +1949 432 120 (place) 120 SB +339 492 683 (des programmes TOS et TTP.) 683 SB +339 552 161 ( Cela ) 166 SB +505 552 81 (est ) 86 SB +591 552 74 (du ) 79 SB +670 552 73 (au ) 78 SB +748 552 94 (fait ) 99 SB +847 552 98 (que ) 104 SB +951 552 61 (ce ) 67 SB +1018 552 280 (programme ) 286 SB +1304 552 118 (peut ) 124 SB +1428 552 42 (\340 ) 48 SB +1476 552 108 (tout ) 114 SB +1590 552 202 (moment ) 208 SB +1798 552 209 (basculer ) 215 SB +2013 552 56 (en) 56 SB +339 612 1045 (mode graphique, revenir au mode texte, etc...) 1045 SB +339 732 200 ( Quand ) 209 SB +548 732 70 (on ) 79 SB +627 732 136 (lance ) 145 SB +772 732 76 (un ) 85 SB +857 732 280 (programme ) 289 SB +1146 732 132 (TOS, ) 141 SB +1287 732 55 (le ) 64 SB +1351 732 179 (bureau ) 188 SB +1539 732 142 (cache ) 151 SB +1690 732 58 (la ) 67 SB +1757 732 168 (souris, ) 178 SB +1935 732 134 (efface) 134 SB +339 792 1091 (l'\351cran et donne la main au programme appel\351.) 1091 SB +339 852 200 ( Quand ) 203 SB +542 852 70 (on ) 73 SB +615 852 136 (lance ) 140 SB +755 852 76 (un ) 80 SB +835 852 280 (programme ) 284 SB +1119 852 127 (TTP, ) 131 SB +1250 852 55 (le ) 59 SB +1309 852 179 (bureau ) 183 SB +1492 852 199 (suppose ) 203 SB +1695 852 98 (que ) 102 SB +1797 852 272 (l'utilisateur) 272 SB +339 912 116 (veut ) 123 SB +462 912 164 (passer ) 171 SB +633 912 91 (des ) 98 SB +731 912 279 (param\350tres ) 287 SB +1018 912 73 (au ) 81 SB +1099 912 280 (programme ) 288 SB +1387 912 196 (appell\351. ) 204 SB +1591 912 127 (C'est ) 135 SB +1726 912 121 (pour ) 129 SB +1855 912 105 (cela ) 113 SB +1968 912 101 (qu'il) 101 SB +339 972 144 (ouvre ) 147 SB +486 972 101 (une ) 104 SB +590 972 127 (boite ) 130 SB +720 972 68 (de ) 71 SB +791 972 211 (dialogue ) 215 SB +1006 972 116 (avec ) 120 SB +1126 972 101 (une ) 105 SB +1231 972 129 (ligne ) 133 SB +1364 972 111 (vide ) 115 SB +1479 972 121 (pour ) 125 SB +1604 972 98 (que ) 102 SB +1706 972 286 (l'utilisateur ) 290 SB +1996 972 73 (en-) 73 SB +339 1032 937 (tre ce qu'il veut indiquer au programme.) 937 SB +32 0 0 50 50 0 0 0 50 /NewCenturySchlbk-Bold /font20 ANSIFont font +339 1152 360 (LOGLAN.TTP) 360 SB +32 0 0 50 50 0 0 0 49 /NewCenturySchlbk-Roman /font23 ANSIFont font +699 1153 1340 ( : Indiquez simplement ce que vous mettriez apr\350s la com-) 1340 SB +339 1213 646 (mande LOGLAN sous DOS.) 646 SB +32 0 0 42 42 1 0 0 41 /NewCenturySchlbk-Roman /font23 ANSIFont font +398 1333 160 (exemple) 160 SB +32 0 0 42 42 0 0 0 41 /NewCenturySchlbk-Roman /font23 ANSIFont font +558 1333 1240 ( : pour compiler un programme sous DOS vous pourriez entrer :) 1240 SB +398 1433 935 ( LOGLAN MONPROG.LOG L+ O-) 935 SB +398 1533 1593 (pour r\351aliser la meme chose sous ATARI, double-cliquez sur l'icone LOGLAN.TTP) 1593 SB +398 1583 687 (et entrez dans la boite de dialogue :) 687 SB +398 1683 737 ( MONPROG.LOG L+ O-) 737 SB +398 1783 1585 (et cliquez enfin sur le bouton OK et le bureau lancera l'application LOGLAN.TTP) 1585 SB +398 1833 882 (avec 'MONPROG.LOG L+ O-' en param\350tres.) 882 SB +32 0 0 50 50 0 0 0 49 /NewCenturySchlbk-Roman /font23 ANSIFont font +339 1943 62 (Si ) 70 SB +409 1943 120 (vous ) 128 SB +537 1943 160 (lancez ) 168 SB +705 1943 348 (LOGLAN.TTP ) 356 SB +1061 1943 119 (sans ) 127 SB +1188 1943 157 (aucun ) 165 SB +1353 1943 293 (param\350tres, ) 302 SB +1655 1943 299 (l'application ) 308 SB +1963 1943 106 (vous) 106 SB +339 2003 275 (demandera ) 282 SB +621 2003 55 (le ) 62 SB +683 2003 114 (nom ) 121 SB +804 2003 74 (du ) 81 SB +885 2003 163 (fichier ) 170 SB +1055 2003 42 (\340 ) 49 SB +1104 2003 227 (compiler. ) 234 SB +1338 2003 171 (Entrez ) 178 SB +1516 2003 42 (\340 ) 50 SB +1566 2003 61 (ce ) 69 SB +1635 2003 263 (moment-l\340 ) 271 SB +1906 2003 55 (le ) 63 SB +1969 2003 100 (nom) 100 SB +339 2063 194 (complet ) 207 SB +546 2063 133 (\(avec ) 146 SB +692 2063 262 (l'extension ) 275 SB +967 2063 139 (.LOG ) 152 SB +1119 2063 31 (\) ) 44 SB +1163 2063 68 (de ) 81 SB +1244 2063 132 (votre ) 145 SB +1389 2063 177 (fichier. ) 190 SB +1579 2063 72 (Le ) 85 SB +1664 2063 291 (compilateur ) 305 SB +1969 2063 100 (sup-) 100 SB +339 2123 1682 (posera que vous voulez compiler ce fichier \340 l'aide des options standards.) 1682 SB +32 0 0 50 50 0 0 0 50 /NewCenturySchlbk-Bold /font20 ANSIFont font +339 2243 246 (GEN.TTP) 246 SB +32 0 0 50 50 0 0 0 49 /NewCenturySchlbk-Roman /font23 ANSIFont font +585 2244 1261 (: L'utilisation de fichier est identique \340 LOGLAN.TTP.) 1261 SB +339 2304 243 (GEN.TTP ) 245 SB +584 2304 70 (ne ) 72 SB +656 2304 150 (prend ) 152 SB +808 2304 94 (pas ) 96 SB +904 2304 68 (de ) 70 SB +974 2304 293 (param\350tres, ) 295 SB +1269 2304 46 (il ) 48 SB +1317 2304 210 (convient ) 212 SB +1529 2304 286 (simplement ) 288 SB +1817 2304 68 (de ) 70 SB +1887 2304 77 (lui ) 80 SB +1967 2304 102 (don-) 102 SB +339 2364 1333 (ner le nom de votre application \( sans aucune extension \).) 1333 SB +32 0 0 50 50 0 0 0 50 /NewCenturySchlbk-Bold /font20 ANSIFont font +339 2484 364 (INTGEM.PRG) 364 SB +32 0 0 50 50 0 0 0 49 /NewCenturySchlbk-Roman /font23 ANSIFont font +703 2485 14 ( ) 15 SB +718 2485 28 (: ) 29 SB +747 2485 188 (Comme ) 189 SB +936 2485 93 (son ) 94 SB +1030 2485 236 (extension ) 237 SB +1267 2485 230 (l'indique, ) 232 SB +1499 2485 46 (il ) 48 SB +1547 2485 137 (s'agit ) 139 SB +1686 2485 115 (d'un ) 117 SB +1803 2485 266 (programme) 266 SB +339 2545 213 (utilisant ) 219 SB +558 2545 78 (les ) 84 SB +642 2545 288 (graphiques. ) 294 SB +936 2545 72 (Le ) 78 SB +1014 2545 179 (bureau ) 185 SB +1199 2545 232 (consid\350re ) 238 SB +1437 2545 98 (que ) 104 SB +1541 2545 61 (ce ) 67 SB +1608 2545 114 (type ) 120 SB +1728 2545 68 (de ) 75 SB +1803 2545 266 (programme) 266 SB +339 2605 1091 (n'utilise pas de param\350tres pour son ex\351cution.) 1091 SB +339 2665 81 (En ) 87 SB +426 2665 108 (fait, ) 114 SB +540 2665 230 (INTGEM ) 236 SB +776 2665 160 (utilise ) 166 SB +942 2665 78 (les ) 84 SB +1026 2665 175 (memes ) 181 SB +1207 2665 279 (param\350tres ) 285 SB +1492 2665 98 (que ) 105 SB +1597 2665 93 (son ) 100 SB +1697 2665 263 (homologue ) 270 SB +1967 2665 102 (sous) 102 SB +339 2725 124 (DOS.) 124 SB +339 2785 957 (Pour utiliser ce programme vous pouvez :) 957 SB +339 2845 83 ( le ) 85 SB +424 2845 158 (lancer ) 160 SB +584 2845 291 (directement ) 293 SB +877 2845 28 (: ) 30 SB +907 2845 188 (Comme ) 190 SB +1097 2845 362 (LOGLAN.TTP, ) 364 SB +1461 2845 46 (il ) 49 SB +1510 2845 120 (vous ) 123 SB +1633 2845 275 (demandera ) 278 SB +1911 2845 55 (le ) 58 SB +1969 2845 100 (nom) 100 SB +339 2905 74 (du ) 77 SB +416 2905 253 (proramme ) 256 SB +672 2905 42 (\340 ) 45 SB +717 2905 210 (ex\351cuter ) 213 SB +930 2905 58 (et ) 61 SB +991 2905 259 (demarrera ) 262 SB +1253 2905 70 (en ) 73 SB +1326 2905 252 (supposant ) 255 SB +1581 2905 98 (que ) 101 SB +1682 2905 120 (vous ) 123 SB +1805 2905 162 (voulez ) 165 SB +1970 2905 99 (util-) 99 SB +339 2965 100 (iser ) 106 SB +445 2965 78 (les ) 84 SB +529 2965 182 (options ) 188 SB +717 2965 93 (par ) 99 SB +816 2965 163 (d\351faut ) 169 SB +985 2965 74 (du ) 80 SB +1065 2965 305 (compilateur. ) 311 SB +1376 2965 138 (Cette ) 144 SB +1520 2965 254 (utilisation ) 260 SB +1780 2965 70 (ne ) 77 SB +1857 2965 212 (provoque) 212 SB +339 3025 459 (aucune restrictions.) 459 SB +32 0 0 42 42 0 0 0 38 /Times-Roman /font32 ANSIFont font +1193 3265 21 (2) 21 SB +1 #C +statusdict begin /manualfeed false store end +EJ RS +%%PageTrailer +%%PageResources: font NewCenturySchlbk-Bold +%%+ font NewCenturySchlbk-Roman +%%+ font Times-Roman +%%Page: 3 3 +%%PageResources: (atend) +SS +0 0 12 16 799 1169 300 SM +32 0 0 50 50 0 0 0 49 /NewCenturySchlbk-Roman /font23 ANSIFont font +0 0 0 fC +339 252 281 (Cependant, ) 286 SB +625 252 121 (pour ) 126 SB +751 252 58 (la ) 64 SB +815 252 374 (programmation ) 380 SB +1195 252 91 (des ) 97 SB +1292 252 251 (processus, ) 257 SB +1549 252 78 (les ) 84 SB +1633 252 182 (options ) 188 SB +1821 252 93 (par ) 99 SB +1920 252 149 (d\351faut) 149 SB +339 312 850 (doivent etre modifiees dans certains.) 850 SB +339 372 100 ( Le ) 102 SB +441 372 280 (programme ) 282 SB +723 372 318 (GSORT.LOG ) 320 SB +1043 372 93 (par ) 95 SB +1138 372 219 (exemple, ) 221 SB +1359 372 160 (utilise ) 162 SB +1521 372 78 (les ) 80 SB +1601 372 237 (processus ) 240 SB +1841 372 121 (pour ) 124 SB +1965 372 104 (trier) 104 SB +339 432 76 (un ) 80 SB +419 432 231 (ensemble ) 235 SB +654 432 68 (de ) 72 SB +726 432 186 (valeurs ) 190 SB +916 432 58 (et ) 62 SB +978 432 118 (peut ) 122 SB +1100 432 130 (cr\351er ) 135 SB +1235 432 113 (plus ) 118 SB +1353 432 68 (de ) 73 SB +1426 432 70 (30 ) 75 SB +1501 432 251 (processus. ) 256 SB +1757 432 124 (Avec ) 129 SB +1886 432 58 (la ) 63 SB +1949 432 120 (taille) 120 SB +339 492 215 (m\351moire ) 218 SB +557 492 223 (standard ) 226 SB +783 492 89 (qui ) 92 SB +875 492 81 (est ) 84 SB +959 492 68 (de ) 71 SB +1030 492 154 (30000 ) 157 SB +1187 492 125 (mots ) 128 SB +1315 492 238 (m\351moires ) 241 SB +1556 492 93 (par ) 97 SB +1653 492 251 (processus, ) 255 SB +1908 492 161 (c'est-\340-) 161 SB +339 552 106 (dire ) 107 SB +446 552 154 (60000 ) 155 SB +601 552 147 (octets ) 149 SB +750 552 46 (il ) 48 SB +798 552 169 (faudra ) 171 SB +969 552 154 (60000 ) 156 SB +1125 552 39 (* ) 41 SB +1166 552 70 (30 ) 72 SB +1238 552 44 (= ) 46 SB +1284 552 210 (1800000 ) 212 SB +1496 552 147 (octets ) 149 SB +1645 552 101 (\(1.6 ) 103 SB +1748 552 86 (Mo ) 88 SB +1836 552 31 (\) ) 33 SB +1869 552 68 (de ) 70 SB +1939 552 130 (mem-) 130 SB +339 612 354 (oire disponible.) 354 SB +339 672 143 (Aussi ) 153 SB +492 672 280 (l'utilisation ) 290 SB +782 672 68 (de ) 78 SB +860 672 193 (GSORT ) 203 SB +1063 672 62 (se ) 72 SB +1135 672 193 (fait-elle ) 203 SB +1338 672 116 (avec ) 127 SB +1465 672 185 (l'option ) 196 SB +1661 672 75 (-m ) 86 SB +1747 672 154 (10000 ) 165 SB +1912 672 31 (\( ) 42 SB +1954 672 115 (voire) 115 SB +339 732 703 (7000 \) pour pouvoir l'ex\351cuter.) 703 SB +339 852 1083 ( Pour rem\351dier \340 ce probl\350me, deux solutions :) 1083 SB +339 912 1379 ( Soit vous renommez INTGEM.PRG en INTGEM.TTP : Il ) 1380 SB +1719 912 186 (devient ) 187 SB +1906 912 121 (pour ) 122 SB +2028 912 41 (le) 41 SB +339 972 179 (bureau ) 189 SB +528 972 76 (un ) 86 SB +614 972 280 (programme ) 290 SB +904 972 129 (texte ) 139 SB +1043 972 237 (acceptant ) 247 SB +1290 972 91 (des ) 101 SB +1391 972 293 (param\350tres. ) 304 SB +1695 972 135 (Dans ) 146 SB +1841 972 61 (ce ) 72 SB +1913 972 101 (cas, ) 112 SB +2025 972 44 (la) 44 SB +339 1032 1044 (souris sera inutilisable dans les applications.) 1044 SB +339 1092 162 ( Soit ) 183 SB +522 1092 120 (vous ) 141 SB +663 1092 184 (utilisez ) 205 SB +868 1092 76 (un ) 97 SB +965 1092 179 (bureau ) 200 SB +1165 1092 235 (alternatif ) 256 SB +1421 1092 174 (comme ) 195 SB +1616 1092 276 (NEODESK ) 297 SB +1913 1092 70 (ou ) 92 SB +2005 1092 64 (les) 64 SB +339 1152 232 (derni\350res ) 234 SB +573 1152 183 (version ) 185 SB +758 1152 74 (du ) 76 SB +834 1152 179 (bureau ) 181 SB +1015 1152 175 (ATARI ) 177 SB +1192 1152 31 (\( ) 33 SB +1225 1152 42 (\340 ) 45 SB +1270 1152 150 (partir ) 153 SB +1423 1152 91 (des ) 94 SB +1517 1152 118 (TOS ) 121 SB +1638 1152 84 (2.0 ) 87 SB +1725 1152 31 (- ) 34 SB +1759 1152 172 (MEGA ) 175 SB +1934 1152 115 (STE ) 118 SB +2052 1152 17 (\)) 17 SB +339 1212 89 (qui ) 92 SB +431 1212 119 (elles ) 122 SB +553 1212 288 (connaissent ) 291 SB +844 1212 78 (les ) 81 SB +925 1212 303 (programmes ) 306 SB +1231 1212 136 (GEM ) 140 SB +1371 1212 89 (qui ) 93 SB +1464 1212 227 (prennent ) 231 SB +1695 1212 91 (des ) 95 SB +1790 1212 279 (param\350tres.) 279 SB +339 1272 72 (Le ) 73 SB +412 1272 228 (probl\350me ) 229 SB +641 1272 81 (est ) 82 SB +723 1272 98 (que ) 99 SB +822 1272 97 (soit ) 98 SB +920 1272 46 (il ) 48 SB +968 1272 186 (coutent ) 188 SB +1156 1272 128 (cher, ) 130 SB +1286 1272 97 (soit ) 99 SB +1385 1272 46 (il ) 48 SB +1433 1272 303 (consomment ) 305 SB +1738 1272 68 (de ) 70 SB +1808 1272 58 (la ) 60 SB +1868 1272 201 (m\351moire) 201 SB +339 1332 109 (vive.) 109 SB +339 1392 153 ( Pour ) 161 SB +500 1392 101 (une ) 109 SB +609 1392 254 (utilisation ) 263 SB +872 1392 219 (normale, ) 228 SB +1100 1392 280 (l'utilisation ) 289 SB +1389 1392 68 (de ) 77 SB +1466 1392 352 (INTGEM.PRG ) 361 SB +1827 1392 189 (suivant ) 198 SB +2025 1392 44 (la) 44 SB +339 1452 1034 (premi\350re m\351thode est amplement suffisante.) 1034 SB +32 0 0 54 54 0 0 0 53 /NewCenturySchlbk-Roman /font23 ANSIFont font +339 1632 385 (PROBLEMES :) 385 SB +32 0 0 50 50 0 0 0 49 /NewCenturySchlbk-Roman /font23 ANSIFont font +339 1697 75 (La ) 79 SB +418 1697 81 (est ) 85 SB +503 1697 55 (le ) 59 SB +562 1697 113 (plus ) 117 SB +679 1697 169 (d\351licat ) 173 SB +852 1697 58 (et ) 62 SB +914 1697 113 (c'est ) 117 SB +1031 1697 221 (pourquoi ) 225 SB +1256 1697 54 (je ) 58 SB +1314 1697 213 (conseille ) 218 SB +1532 1697 101 (une ) 106 SB +1638 1697 324 (configuration ) 329 SB +1967 1697 102 (avec) 102 SB +339 1757 902 (deux lecteurs ou mieux, un disque dur.) 902 SB +339 1817 129 (Voici ) 138 SB +477 1817 55 (le ) 64 SB +541 1817 228 (probl\350me ) 237 SB +778 1817 28 (: ) 37 SB +815 1817 348 (LOGLAN.TTP ) 357 SB +1172 1817 121 (pour ) 130 SB +1302 1817 130 (cr\351er ) 139 SB +1441 1817 76 (un ) 85 SB +1526 1817 163 (fichier ) 173 SB +1699 1817 122 (LCD ) 132 SB +1831 1817 238 (commence) 238 SB +339 1877 93 (par ) 105 SB +444 1877 130 (cr\351er ) 142 SB +586 1877 126 (deux ) 138 SB +724 1877 70 (ou ) 82 SB +806 1877 119 (trois ) 131 SB +937 1877 186 (fichiers ) 198 SB +1135 1877 292 (temporaires ) 304 SB +1439 1877 115 (qu'il ) 127 SB +1566 1877 148 (efface ) 161 SB +1727 1877 42 (\340 ) 55 SB +1782 1877 58 (la ) 71 SB +1853 1877 78 (fin ) 91 SB +1944 1877 68 (de ) 81 SB +2025 1877 44 (la) 44 SB +339 1937 285 (compilation.) 285 SB +339 1997 284 (Ces fichiers ) 285 SB +624 1997 112 (sont ) 113 SB +737 1997 332 (g\351n\351ralement ) 333 SB +1070 1997 352 (proportionnels ) 353 SB +1423 1997 42 (\340 ) 43 SB +1466 1997 58 (la ) 59 SB +1525 1997 262 (complexit\351 ) 263 SB +1788 1997 58 (et ) 59 SB +1847 1997 42 (\340 ) 43 SB +1890 1997 58 (la ) 59 SB +1949 1997 120 (taille) 120 SB +339 2057 68 (de ) 72 SB +411 2057 89 (vos ) 93 SB +504 2057 317 (programmes. ) 321 SB +825 2057 50 (Il ) 54 SB +879 2057 201 (peuvent ) 206 SB +1085 2057 121 (aller ) 126 SB +1211 2057 68 (de ) 73 SB +1284 2057 70 (30 ) 75 SB +1359 2057 78 (Ko ) 83 SB +1442 2057 180 (jusqu'\340 ) 185 SB +1627 2057 98 (100 ) 103 SB +1730 2057 92 (Ko. ) 97 SB +1827 2057 128 (Sans ) 133 SB +1960 2057 109 (indi-) 109 SB +339 2117 178 (cations ) 187 SB +526 2117 238 (contraire, ) 247 SB +773 2117 46 (il ) 55 SB +828 2117 78 (les ) 87 SB +915 2117 108 (cr\351e ) 117 SB +1032 2117 125 (dans ) 134 SB +1166 2117 55 (le ) 64 SB +1230 2117 244 (r\351pertoire ) 253 SB +1483 2117 192 (courant ) 201 SB +1684 2117 75 (\(l\340 ) 84 SB +1768 2117 70 (o\371 ) 80 SB +1848 2117 62 (se ) 72 SB +1920 2117 149 (trouve) 149 SB +339 2177 132 (votre ) 142 SB +481 2177 280 (programme ) 290 SB +771 2177 162 (source ) 172 SB +943 2177 45 (\), ) 55 SB +998 2177 76 (un ) 86 SB +1084 2177 163 (rapide ) 174 SB +1258 2177 149 (calcul ) 160 SB +1418 2177 178 (permet ) 189 SB +1607 2177 68 (de ) 79 SB +1686 2177 288 (s'apercevoir ) 299 SB +1985 2177 84 (que) 84 SB +339 2237 257 (l'ensemble ) 266 SB +605 2237 91 (des ) 100 SB +705 2237 186 (fichiers ) 195 SB +900 2237 283 (ex\351cutables ) 292 SB +1192 2237 185 (sources ) 194 SB +1386 2237 58 (et ) 67 SB +1453 2237 186 (fichiers ) 195 SB +1648 2237 355 (interm\351diaires ) 365 SB +2013 2237 56 (ne) 56 SB +339 2297 1207 (tiennent pas sur une disquette double-face normale.) 1207 SB +339 2357 1716 (Il arrive que pour les fichiers importants, le compilateur vous r\351ponde par) 1716 SB +339 2417 611 ( 'I/O Trap 29') 611 SB +339 2477 105 (cela ) 114 SB +453 2477 185 (signifie ) 194 SB +647 2477 115 (qu'il ) 124 SB +771 2477 82 (n'y ) 91 SB +862 2477 42 (a ) 51 SB +913 2477 113 (plus ) 122 SB +1035 2477 68 (de ) 77 SB +1112 2477 134 (place ) 143 SB +1255 2477 90 (sur ) 100 SB +1355 2477 58 (la ) 68 SB +1423 2477 229 (disquette ) 239 SB +1662 2477 58 (et ) 68 SB +1730 2477 58 (la ) 68 SB +1798 2477 271 (compilation) 271 SB +339 2537 252 (s'arretera. ) 255 SB +594 2537 50 (Il ) 54 SB +648 2537 120 (vous ) 124 SB +772 2537 169 (faudra ) 173 SB +945 2537 122 (faire ) 126 SB +1071 2537 68 (de ) 72 SB +1143 2537 58 (la ) 62 SB +1205 2537 134 (place ) 138 SB +1343 2537 90 (sur ) 94 SB +1437 2537 58 (la ) 62 SB +1499 2537 229 (disquette ) 233 SB +1732 2537 106 (afin ) 110 SB +1842 2537 115 (qu'il ) 119 SB +1961 2537 41 (y ) 45 SB +2006 2537 63 (ait) 63 SB +339 2597 339 (assez de place.) 339 SB +339 2657 139 ( Pour ) 149 SB +488 2657 302 (information, ) 312 SB +800 2657 58 (la ) 68 SB +868 2657 285 (compilation ) 295 SB +1163 2657 74 (du ) 84 SB +1247 2657 280 (programme ) 291 SB +1538 2657 176 (TEST1 ) 187 SB +1725 2657 160 (utilise ) 171 SB +1896 2657 98 (150 ) 109 SB +2005 2657 64 (Ko) 64 SB +339 2717 205 (d'espace ) 216 SB +555 2717 166 (disque ) 177 SB +732 2717 31 (\( ) 42 SB +774 2717 42 (\340 ) 53 SB +827 2717 99 (peu ) 110 SB +937 2717 113 (pr\350s ) 124 SB +1061 2717 31 (\) ) 42 SB +1103 2717 128 (alors ) 139 SB +1242 2717 98 (que ) 109 SB +1351 2717 58 (la ) 69 SB +1420 2717 285 (compilation ) 297 SB +1717 2717 74 (du ) 86 SB +1803 2717 266 (programme) 266 SB +339 2777 763 (LOGDEB utilise environ 600 Ko.) 763 SB +339 2897 1339 (Pour \351viter ce genre de d\351sagr\351ment, plusieurs solutions :) 1339 SB +339 2957 59 ( - ) 65 SB +404 2957 264 (ACHETEZ ) 270 SB +674 2957 96 (UN ) 103 SB +777 2957 221 (DISQUE ) 228 SB +1005 2957 130 (DUR ) 137 SB +1142 2957 28 (: ) 35 SB +1177 2957 46 (il ) 53 SB +1230 2957 89 (ont ) 96 SB +1326 2957 233 (beaucoup ) 240 SB +1566 2957 157 (baiss\351 ) 164 SB +1730 2957 128 (alors ) 135 SB +1865 2957 204 (n'h\351sitez) 204 SB +339 3017 141 (plus...) 141 SB +32 0 0 42 42 0 0 0 38 /Times-Roman /font32 ANSIFont font +1193 3265 21 (3) 21 SB +1 #C +statusdict begin /manualfeed false store end +EJ RS +%%PageTrailer +%%PageResources: font NewCenturySchlbk-Roman +%%+ font Times-Roman +%%Page: 4 4 +%%PageResources: (atend) +SS +0 0 12 16 799 1169 300 SM +32 0 0 50 50 0 0 0 49 /NewCenturySchlbk-Roman /font23 ANSIFont font +0 0 0 fC +339 252 59 ( - ) 77 SB +416 252 218 (Indiquez ) 236 SB +652 252 42 (\340 ) 60 SB +712 252 348 (LOGLAN.TTP ) 366 SB +1078 252 115 (qu'il ) 133 SB +1211 252 103 (doit ) 122 SB +1333 252 130 (cr\351er ) 149 SB +1482 252 85 (ses ) 104 SB +1586 252 186 (fichiers ) 205 SB +1791 252 278 (temporaires) 278 SB +339 312 1703 (ailleurs \( sur le lecteur B: par exemple ou mieux dans un RAM disque \).) 1703 SB +339 372 181 ( Pour ) 216 SB +555 372 119 (cela, ) 155 SB +710 372 174 (comme ) 210 SB +920 372 116 (sous ) 152 SB +1072 372 138 (DOS, ) 174 SB +1246 372 46 (il ) 82 SB +1328 372 109 (faut ) 145 SB +1473 372 276 (positionner ) 312 SB +1785 372 58 (la ) 94 SB +1879 372 190 (variable) 190 SB +339 432 1652 (d'environnement TEMP sur le chemin o\371 cr\351er les fichiers temporaires.) 1652 SB +339 552 1641 (Voil\340, vous savez \340 peu pr\350s tout sur comment compiler un programme) 1641 SB +339 612 688 (\351crit en LOGLAN sur ATARI.) 688 SB +339 672 231 (J'aimerai ) 242 SB +581 672 165 (attirer ) 176 SB +757 672 253 (l'attention ) 264 SB +1021 672 90 (sur ) 101 SB +1122 672 76 (un ) 87 SB +1209 672 184 (dernier ) 195 SB +1404 672 147 (d\351tail ) 158 SB +1562 672 28 (: ) 40 SB +1602 672 55 (le ) 67 SB +1669 672 311 (param\351trage ) 323 SB +1992 672 77 (des) 77 SB +339 732 296 (applications.) 296 SB +339 792 166 ( Cette ) 174 SB +513 792 159 (option ) 168 SB +681 792 178 (permet ) 187 SB +868 792 68 (de ) 77 SB +945 792 231 (d\351marrer ) 240 SB +1185 792 101 (une ) 110 SB +1295 792 273 (application ) 282 SB +1577 792 427 (automatiquement ) 436 SB +2013 792 56 (en) 56 SB +339 852 1624 (double cliquant simplement sur un fichier ayant l'extension ad\351quate.) 1624 SB +339 912 114 ( Un ) 122 SB +461 912 163 (fichier ) 171 SB +632 912 373 (DESKTOP.INF ) 381 SB +1013 912 81 (est ) 89 SB +1102 912 195 (compris ) 203 SB +1305 912 125 (dans ) 133 SB +1438 912 78 (les ) 86 SB +1524 912 186 (fichiers ) 194 SB +1718 912 89 (qui ) 97 SB +1815 912 112 (sont ) 120 SB +1935 912 97 (mis ) 106 SB +2041 912 28 (\340) 28 SB +339 972 132 (votre ) 133 SB +472 972 280 (disposition. ) 281 SB +753 972 50 (Il ) 52 SB +805 972 202 (contient ) 204 SB +1009 972 58 (la ) 60 SB +1069 972 324 (configuration ) 326 SB +1395 972 121 (pour ) 123 SB +1518 972 78 (les ) 80 SB +1598 972 296 (applications ) 298 SB +1896 972 173 (suivan-) 173 SB +339 1032 81 (tes:) 81 SB +339 1152 1065 ( APPLICATION EXTENSION) 1065 SB +339 1212 992 ( =========== =========) 992 SB +339 1272 893 ( LOGLAN.TTP .LOG) 893 SB +339 1332 897 ( INTGEM.PRG .CCD) 897 SB +32 0 0 50 50 0 0 0 48 /NewCenturySchlbk-Italic /font22 ANSIFont font +339 1453 264 (Autre chose) 264 SB +32 0 0 50 50 0 0 0 49 /NewCenturySchlbk-Roman /font23 ANSIFont font +603 1452 1381 (, il est fournis dans la distribution deux autres application :) 1381 SB +339 1513 465 (ME.TTP et MS.TOS) 465 SB +339 1633 210 (ME.TTP ) 221 SB +560 1633 81 (est ) 92 SB +652 1633 207 (l'\351diteur ) 218 SB +870 1633 68 (de ) 79 SB +949 1633 129 (texte ) 141 SB +1090 1633 302 (micro-emacs ) 314 SB +1404 1633 155 (donn\351 ) 167 SB +1571 1633 121 (pour ) 133 SB +1704 1633 98 (que ) 110 SB +1814 1633 96 (l'on ) 108 SB +1922 1633 147 (puisse) 147 SB +339 1693 1439 (\351diter des ourt et ne n\351c\351ssite pas un apprentissage tr\350s ardu.) 1439 SB +339 1813 211 (MS.TOS ) 214 SB +553 1813 81 (est ) 84 SB +637 1813 76 (un ) 80 SB +717 1813 271 (micro-shell ) 275 SB +992 1813 89 (qui ) 93 SB +1085 1813 120 (vous ) 124 SB +1209 1813 247 (permettra ) 251 SB +1460 1813 68 (de ) 72 SB +1532 1813 158 (lancer ) 162 SB +1694 1813 89 (vos ) 93 SB +1787 1813 282 (applications) 282 SB +339 1873 113 (plus ) 118 SB +457 1873 257 (facilement ) 262 SB +719 1873 185 (qu'avec ) 190 SB +909 1873 55 (le ) 60 SB +969 1873 193 (bureau. ) 198 SB +1167 1873 50 (Il ) 55 SB +1222 1873 81 (est ) 86 SB +1308 1873 182 (destin\351 ) 187 SB +1495 1873 42 (\340 ) 47 SB +1542 1873 195 (faciliter ) 201 SB +1743 1873 55 (le ) 61 SB +1804 1873 265 (cyclecompi-) 265 SB +339 1933 1536 (lation -> erreur -> correction\(s\) des erreurs -> compilation -> etc...) 1536 SB +339 1993 1653 (Il ne permet pas de modifier les variables d'environnement mais il peut) 1653 SB +339 2053 904 (rendre quelque services quand meme...) 904 SB +339 2233 1028 ( BONNE PROGRAMMATION !!!) 1028 SB + +%%BeginResource: font Koala-Normal +%!PS-AdobeFont-1.0: Koala-Normal 001.003 %CreationDate: Wed Feb 05 07:32:32 1992 %%Creator: Corel's Wfnboss %BasedOn: KOALA.WFN 1 %%DesignSize: 720 %%VMusage: 38000 40000 %% CopyRight (c) 1991, Corel Systems Corporation. All rights reserved. 11 dict begin /FontInfo 8 dict dup begin /version (001.003) readonly def /FullName (Koala Normal) readonly def /FamilyName (Koala) readonly def /Weight (normal) readonly def /ItalicAngle 0 def /isFixedPitch false def /UnderlinePosition -100 def /UnderlineThickness 50 def end readonly def /FontName /Koala-Normal def /PaintType 0 def /FontType 1 def /FontMatrix [0.001000 0 0 0.001000 0 0] readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 32 /space put dup 33 /exclam put dup 34 /quotedbl put dup 35 /numbersign put dup 36 /dollar put dup 37 /percent put dup 38 /ampersand put dup 39 /quotesingle put dup 40 /parenleft put dup 41 /parenright put dup 42 /asterisk put dup 43 /plus put dup 44 /comma put dup 45 /hyphen put dup 46 /period put dup 47 /slash put dup 48 /zero put dup 49 /one put dup 50 /two put dup 51 /three put dup 52 /four put dup 53 /five put dup 54 /six put dup 55 /seven put dup 56 /eight put dup 57 /nine put dup 58 /colon put dup 59 /semicolon put dup 60 /less put dup 61 /equal put dup 62 /greater put dup 63 /question put dup 64 /at put dup 65 /A put dup 66 /B put dup 67 /C put dup 68 /D put dup 69 /E put dup 70 /F put dup 71 /G put dup 72 /H put dup 73 /I put dup 74 /J put dup 75 /K put dup 76 /L put dup 77 /M put dup 78 /N put dup 79 /O put dup 80 /P put dup 81 /Q put dup 82 /R put dup 83 /S put dup 84 /T put dup 85 /U put dup 86 /V put dup 87 /W put dup 88 /X put dup 89 /Y put dup 90 /Z put dup 91 /bracketleft put dup 92 /backslash put dup 93 /bracketright put dup 94 /asciicircum put dup 95 /underscore put dup 96 /grave put dup 97 /a put dup 98 /b put dup 99 /c put dup 100 /d put dup 101 /e put dup 102 /f put dup 103 /g put dup 104 /h put dup 105 /i put dup 106 /j put dup 107 /k put dup 108 /l put dup 109 /m put dup 110 /n put dup 111 /o put dup 112 /p put dup 113 /q put dup 114 /r put dup 115 /s put dup 116 /t put dup 117 /u put dup 118 /v put dup 119 /w put dup 120 /x put dup 121 /y put dup 122 /z put dup 123 /braceleft put dup 124 /bar put dup 125 /braceright put dup 126 /tilde put dup 127 / put dup 128 / put dup 129 / put dup 130 /quotesinglebase put dup 131 / put dup 132 /quotedblbase put dup 133 /ellipsis put dup 134 /dagger put dup 135 /daggerdbl put dup 136 / put dup 137 /perthousand put dup 138 / put dup 139 /guilsinglleft put dup 140 /ydieresis put dup 141 / put dup 142 / put dup 143 /aacute put dup 144 / put dup 145 /quoteleft put dup 146 /quoteright put dup 147 /quotedblleft put dup 148 /quotedblright put dup 149 /bullet put dup 150 /endash put dup 151 /emdash put dup 152 /circumflex put dup 153 /trademark put dup 154 / put dup 155 /guilsinglright put dup 156 /yen put dup 157 / put dup 158 / put dup 159 /ordfeminine put dup 160 / put dup 161 /caron put dup 162 /breve put dup 163 /sterling put dup 164 /currency put dup 165 /Aring put dup 166 /brokenbar put dup 167 /section put dup 168 /dieresis put dup 169 /copyright put dup 170 / put dup 171 /guillemotleft put dup 172 /logicalnot put dup 173 /hyphen put dup 174 /registered put dup 175 /iacute put dup 176 /ring put dup 177 /plusminus put dup 178 /ogonek put dup 179 /AE put dup 180 /acute put dup 181 /mu put dup 182 /paragraph put dup 183 /periodcentered put dup 184 /cedilla put dup 185 /aring put dup 186 / put dup 187 /guillemotright put dup 188 / put dup 189 /hungarumlaut put dup 190 / put dup 191 /ordmasculine put dup 192 / put dup 193 / put dup 194 / put dup 195 / put dup 196 / put dup 197 / put dup 198 /ograve put dup 199 / put dup 200 / put dup 201 / put dup 202 /Eacute put dup 203 / put dup 204 / put dup 205 / put dup 206 / put dup 207 / put dup 208 /Eth put dup 209 /Ntilde put dup 210 / put dup 211 /Oacute put dup 212 / put dup 213 / put dup 214 / put dup 215 /multiply put dup 216 / put dup 217 / put dup 218 / put dup 219 / put dup 220 / put dup 221 / put dup 222 / put dup 223 /germandbls put dup 224 / put dup 225 / put dup 226 / put dup 227 / put dup 228 / put dup 229 / put dup 230 /igrave put dup 231 / put dup 232 / put dup 233 / put dup 234 /ae put dup 235 / put dup 236 / put dup 237 / put dup 238 / put dup 239 / put dup 240 /eth put dup 241 /ntilde put dup 242 / put dup 243 /oacute put dup 244 / put dup 245 / put dup 246 / put dup 247 /divide put dup 248 / put dup 249 / put dup 250 / put dup 251 / put dup 252 / put dup 253 / put dup 254 / put dup 255 / put readonly def /FontBBox {-141 -288 1107 855} readonly def /UniqueID 4629487 def currentdict end currentfile eexec +AEB025D4E421B631215B98625E538C86E5E73D2D0EC7019C550CD18A7CC7141CD1D898198532012A5DBAEA1C82707B837246D685E5591898ACE5B2D28D57678BDF4721E43B859E329E444290A494570272FBE4CE35D1B58151AC44A85B18C509ED56E981A08C59ADAE5476343B879F33BC3808A25300B80739A72E73A7D64B5A7897951915686AB2FE6DF18C67FDC839AA91983C4AE828235167766B346BA78685087544C3AFE4152BA2BCC907D0D188969D57DB0CEEEB7DCE55EF19011D00248C44678A3A53FD5D65DD68BCAF3022757783E4EBDE15F5836C9252AFCAA5197CDECF715DF48986D2F891638F2BFEBEF7D6443404F852F3179662CF3ABB958F5397B9FBEEE8AAE83C880CFC671F0E11F060B08169616FB0020106C43AE31DB2F49452E0607F30685C7A504B951DFE26B3294B006D7AFCCEAC871356A2115FEB4A5660580D79148DC1119524182A774180F6AC9EFE86833EEBFCF0A21A704F5108CE1FB952FAACD920C137D67CD54BE09084576319AE8FD7A004886B16736A27628AF1C09F770E20B76134CC2F8D289622DFCDFAA5E8609BFF1E8AF07B1DD0F86BFE79DE21D33B6DF9519F76672DE261A4A78894F1579F840D11FC2DAF1A75BF6E4EBD11990BF07435645DF821E538D9645973E2A844B8DF62A61393F948FE8EC9E079CB7DFFD123C04A585A473693AEA493A0A3EF313FC44C208C934EBADD98026D7E8CBC10A61DA3DBF4179EFB26B3CD8BCEB6E991168960F6EEA2558B1B30DC834C85C16EDCC63B5E39D66C80CA5CAD63D28667473C39D3371E22853E591CCC831A8F8A8F7BECD27E2526E21C499AF1D348D28CA827F1680F84165C491AF348473DCEE621C9A0840B3B7DD45FBF812877E65EE8173132443B83727724F6FF353812D02427D2C5C7726C82061CBD416A0DD5B943AC0D05A2C002887D58EA80C853F77379CBD444DBD4F86FE02366819BE71AA58A0D105FF511BDA502CA831756EA1889034EC81F01699D9EF33A372ECFAEEA4C98815EB6B202E8B87CEDB16FF7F56299AC0D99C88BFD4F5A633D88B61D22D7F56E3C7D28EDBE24BDC0C5398DE7ABE7F1CDFBF36B61E4FF924F7FFD1E1DF417AFEB3F6F28C0729A24B2C83A1B74967DD7E00DA4C5228820480DF4CF3EADA1A3DA204F3A25299B24E172406CBFA015AD07AC3A9BCD4F393E5301DC0D14E9F1400448D2B25C69C8C06BE70537C965657F4527010D0E051B70462A6536F9F2585865F13940680B1093B58E3D747B725E229D1E5E71497043B5253F13060DCA848D25F09DA79BF6DB92BEFBCC910352E50CB90317FFC071BC50F99195D052021A36821EABF2B9E3635BAF9E654BA77AB044EB29530FA09EF29EF7FA0EE0C86B8A2270A4F4D00C61C963563A54BB6B4181CF040250B6160FE11D121475C536D65629A90D8542493DF35A0238779A367A812E9CDE5F035569C5CEC80A618CC385436604F77AECF12C38ED57F86677653112688E8365F8C64F43DCA259C2E5D727366A77B75B9F6799D297DE2009C2961BC31571C4A69CC3FF27C75DF0385C4949D3455341392B45EC58F5FFBBF4A6DD3059F5A05EB664440D828052B114600CD11F7704E4ECE3A82FAA6F62331CFF9B10D57BA75362B2E4A854B86C918A807BA638C98921B76F6432E26FAA6BCB59E966BAC1EAB6DDA401CE0E06A73BEEEDD8EF4DE240390A1D55160521217661BB33876824ED7117A97A0F6A04971F735939F3BA1AB7704A61DE39FBC544315FB6392CB0882C242801BA1D42208BD5BEE50BA38F1281A9D62863787D51DA98A53A2AD4874F8B5DB4FC97C0F3EFFF7EF2A63A36D869A16F7AA2EE6A5D19A64F68F1DEEAF9FF9E65273513380D90A8C8305ACCDE1EAB1D5481D32AC23548A1A8BC7380A41C089BB9A11079E64EA3699C7E72E9E52973544A957332DF7EA08CC9550710B6DFB122A457ED440B272CF1D40B8A0F515E6F1D9A72FBA515CA8CE1E6E86F48BA37A4AE8FC3155BD143BEDC06FCA1B6C11706EEC5A9C65D7480BD0D989A8EDB8293BB4F33872F8042AABA3ADCA70BD9CCB980260A896E559A585CAB2CD73DFCCF9C0EAB3B12C213DFC832F37880BA14DF0DFE2E57C98F4D33372114A04E26D17FDCD043F308A675288AB5F1E4908A9BBD26EAE9AC291065C83EEDEA3F3F6680D155638DFB09464D49CD552E06B460013BC7E084CE4BC908962AB417B22D7DE1D596952479B3B8032E5650DECC87953DAB69D9D82DB2EF767B26542D904259DE5B9598D7E8ECDAF09B9F792C35B82D5A4367760DE65D9B2A9D26A446F6C94C473D1A19204FBA24780EA6CA281796C454FF0C1CDEFA1B92161D689921C190885153D70756DFC2D014728AB0F13CCFE91AF8796059D0E7E7EEBC451CC47425A7384441E1E7ED1DB2164DC6CD2ED06EEE1674B1E57F89DFFF76BA4581EAD57A581B5B3EAF965DF638FEC39BF81BE450085DF69CADA750FD480503DBF9EE12643F6032DDC0E2547346D088883B01873C33D4D618F48C8C735DDCD11A4D932D1FD07D3CEFEE4D44C0C22438B4EE6D21064DE7B493B049C39DB4F0C5C8EBBB88263BD74BFAD407561A9648A9DC0A4238F12AFFD26B05D04A2C093B14352DFBBF860010CFB7580A49BBE4D1FD747A7461B97FA68CD3F3B6DBA8527F33DB2043DB11B694ADB8B735C2E0106E11163C77FE4645F466A08168BE35EE79679813548A77D6E9B2FFA5A2208A2E48F8B7BDF24A3F932CA8CC291B0EA2439149B8F7629F1577BEA7E85D5316DA030EF737FE5E94CB0D5FB09E1234F88FBED834D7C9A96A5C6C51DECE4D7994C199D02F5640EAE402D5ABE81DDFE9B5C134BB2F6FCED5DB2FDC593CF8950E558CB901408B1BB741B774731D6C9707A9E679C7881E79349592E3CA4EEE14D59BC0E0DFABC4E42C5CB7E791BF569FD2EC45BD32B2A9074087CD05BA13E5EEED007F47E55BBB12F85D80188FBCFBEAC565AC8263EE827FF31ED87EB6FB075B6C9DF5F90EF3D8D8BE56245CCCB662DBD1A8DD77A47981D521F1AB0E7F6A5CC402659D56D6651FC4B67A8D1BDF88FA97C0E34CF999163C99F8C65340534DDDA2D77F3716FE295E5D1762C2EF5FDAF17D24B3A10EAE4552F5ADB7D4D539F7C4BA7612021EA6ACE4A46A21FAE7AACDC60AD19B96100C6410F7379D86010C216E989D563650962679C4D3741A7DB9DC5AC38D2D3DA9E2DD394A940382A906E5B26599C0964F557C1E517B8D615546A73C6BFAFB6C97D419024C4AA0838153B7B29803A79C343A20A1C0039B5246E09584353B19EF54A9C5C64DA9FD99065EB2C5546F7B04C9B17C9C6709A2913BFE1DCCB3318EEBC6ACA6C25FCD0B5B46562FBAFFA3FE45DA3DB5E662F852A06A5DB832509E28623002A1C3E9B49608B57BD6AD5429543DCC1430713B448A895D722F2B241219A1F12543A93EA92C2C015294E6EFD997FD14AC4D7D224917EFC3F81125AF387C0F9570EE8632898E339B53EE44364736194712F35EF0A845E86F3DAED7B135FF18DC4A4C485B89899EE027C26458ABD1490F963D9447617BE892539DE20A970B934E0BAAA4BE3D5D406231EA371788A54EB1686BB336560B223561250652093E833C4FA49E48E3128DFCA29BF3397B3346F5CDE63BD0605198562A17C3982C57C84CC936E6A35998DA3EB9E57803C0F310D0767832A904E407CEE752329138A5E981AD3989E4914737D68F0C0CC76A835BFBA7A67F91BB70F8A77DD520338A3BBBB3A178B2526232D8EE7F057AC2DD00B2AB210AE367E3E293C1C701F646E71C414D17ADD0E2211ECCFAAD3E5F81E2FED7DF80AC623B8CE431C0819BB4D49F3F75F055BFB81265B553A39A8DAF0A45DB1E87EE18653BFC161AD04FF29947EAC4816EC94BA83CD180495BB5812D139E47C63454C394CDF6D5BC10FCD6E2EA2B6B299343D77CC7470EB5104C14AEA664458ECBF68CC4C4E6CC91AFC7C67A1E6D70E59C6E147BB6EF34F104025D8C303CC664A74625076876445FE1C1C496BFEB3CAC0ABC0FDBB8AF8E85E03CEC075B37D0D1F0F5D5CE4F3D972489A094A746C530D3124F784D7D850F172D62A975ECEEEBBC192652730BDE03D227C92E90A76BD9CA1BB316F1080E6A31C5B097D523C48433181B86840CAB932B20D6B44EF274955DF709190E96A93DFC79A6C144256B865B7D095CCAA7BDD81754043157121B0277C83EF0DD20C343CE934CD6F67203B378E63B57272FF2983C68F3DCFA12BACE7346E16CE8E52B2DCAD9D15F48EAB9CDCE29B384A71301BF8DFAEDE45DF1213967D8FAFBD47F506DD79F2E4F227141D1F7E0FCA80786CEFDDA18432ED613292981294505F0571B990AAB88185A84CB7E21BC41554000265B43E156A4FDEFA5295AD7382CDAE30B424594C8F25BDBC582B1439796A8DFA6C85D2A3C097EFCAF6186AD497FF9853447DB9F1FE7A01EDBE526702399BE6BA2A2A0F679F094D820EC77593CBBA5EF96D26DCEFD1C257AE80415E950891FBD71B430DBA67B67E86F8783CA1202E564A44B45423340E4A44DB1F3D9E472AEE86AD9CFE193ED26A8D2CE70CCE7A3FD2163893858B8182E059AC9FF290F3DFC95C9A0874992C431D3A349A5327BDCB9E22935810B2404E09E8841E71A4AD9834A51FC38F4226B785B32BCDAE7ADB00FFC9749D252EFFC06E22CE2E7ACC619E201C95BDB2E946AAA321030FDC9E5F2D5B5FE3C6F470C2594D4D397E637FF595C3DCB00EE568A4AA296A31EB6C86944C96477CFCB3CA9FD930C4856201BAD08BCB06FA30C7759F8FD0E933DF4E77EC6C28E339487117B4155B51E16653056499F4F3002CA5B527B823EA7F7675AEED60F14209DBE7FED4A13E4CD1965C29E48446D79441FAF35AD0889611BCA99C054F5F0310E83E6671951041ADE2CB792A2D76D16270212273B755819F8EE93C3A5489E6F8FDA6450B3E8185883E7720F7B7846A307BB45D21BD0626F7532C643738F7F33301AC6C530945520379666F6CBBB10BC1CBFD3FB10A8755F64AC6DE5F5259A8D71152A9C44657AF9A766946E0ABEB1923655F9EA29065A182AAA78ACD3BA6D1A4583A38E1B3FBFA0B89DC953627DD64EE8E8A8B0B7FB579F32508F29C087C3ADD88B07C93CE52763E2F6B54B2DE988C325A430BF716C48C7C061B292F8FD2C61505898338A38990B60650576BE2D74D8C74886220E884943D39013F56D3C3B3C99F98125538341B9AD1F3A6BA95F018B3D8EB1DD25903377180ECC02B10DA2F50C2ED5F9D4F8297EB17F0C3D83D3F56BCFEEDDC762AF984B1F72643A466BAEFFBE418C2EABF2741C8D8CFA433C87C28C01F43DFA9E1DDFFEE9768BB0A792CB41AE2C70DDAF6AEEF2301CAC0E316BA0D078AA1C90BC3EE6F62005762231F00024BC6550B2DC3D5C21380E23A40A1F8F52866B6BA536BB0B699DF8BFE26E8ACCFC66505C7EB138A76A46DADC53A8C68415141AC1AC0EE0D5D71D250556876DCB49551BF6FCA02DD7AE1BD0D91277F71ED81139742A057F58AF5B5E2BBC598D789DEA497C4B55688A5FF3E9467DFF48801EEFC81699FD0B66F1322725B3B2B3EED4E319BE7D33D6BDA7F4A2DA8B2A552DFA836B3705E835EBC971E7EC1D7AB5DEE98F53348FE1164F286E1981B8C4E5292DCD7B04DD08EE20A15E2042BA611A3A94F6BC25EA965DC6BCB782A9109797FAE5CD41868ECDB8437B8BD9F8FAEDB1C4D7CA4B8822C655F3A9A95884F159ED5C91954F0F2E7DD3FE6F31233AA4EEC303BCAA8CA5428726ADCB1CC61EFF574ED55C55FCE3349244E7C3FF31A7FCC8ACFDDEF9A3FCA0F3397597D9456560E6F5966CAC0B8F254ED1F196CD59C0FC165F66282AAF51CC3794002A32344067BF57CC14FBFE8027FC795B8E7024B01E04FBD3B2AD1BDFF2413C1D85D598E5037C15AD3A80930BEC66AA2D175E94385EF1BC00C7ADAFBB5A17D551C5BBBBDA0DA6E66A686FDD9F172EA2BD0DA152240FE70D29C39E24654EB8C231D20AFC26575837281C743BE6DE6C1F8CD4873CE18800DDD36EBB3003C9316D7BCA4E521D461A1F863A5AA57FAF57E552F6094C2FE918D2A58C3051C9C8473215D1DEEE6D05C27BD50D99AC93E60CAB307829A3352392D5A99A5D4F8B6BAF50A80E3AEF45BC85AD5AF7114C9FA07AA50A142296E237B735AF93AF8F16EEE3484D46E59F2E179B8CC2B3B048054A7A2F0C5EE9116F736297C1F9E2FC375987E7A531FD1EE95903754BDFDC59A071154A817B5A367D11903A50FCBB54F2D0FBC9AFA37AAFD876583E601A1153421CD94D25C03D293B2684670BB6C4C0609D85F8987B3BAB78AD47D96EE1880ACDF470598D5AA19C334DB66096B4BA1EDD25A690EB17AE0162EC9601BC414C64285985C3CF279E139F8FBC10674411F26295FB894CAE4F5EC945F163552DAA0B648E8F96A37D10560B1296676BE6C6412E479B7695276C6DAC40027A807E9C1EE1DE2CAD505B0ED9554F25E20711C5D50F5036667FBE19C0DF6753B272E2439917BF2BAEC22846D6925F995D4D32FF06343E24641A3A9A86D0919CAFDF6FCDD3C67C978ABC2E4B2433583511DF003DE2AE960BF4EEF5E888BE4EBE92EDD7A78F4FB01CCAA44BF5C9DE62A6DAD33DB9F51AEFF659A4AB7E0414A94B42E40F622244267C7B564F88D3F4031D9DECBB64CBAF0F8FA6C21F91908CBA26FD9C84C331B770964A346E720ECEDC278AFD18887443152B053F21C1E3ACC9786D0AE28E7915A5D28934648A41B3AAEC657B52806320592CBD6BBC195EEE6B1E2DEEB3E2F782C4D14212B1A29AF27B4129334E92A7224E0E63789F7D2631AE27BE8DB7939B96380C0EB727B0865D664AC7CF387DC58CD85189F70AE6980078F66708BE44CD2F3B68D97AA6E10559DB53F18C709EEEE2957D434B87DBFC3E23A7571790028FC1C7BA4DF2EBCE9022DFFBB5DFE455F69A0321BA6B905D6078F45C7F7E8F82BE5CA1E159A1679544A569BDED5A587A53BC7428A081A3E8AA85AEB8A56992F18249B119A2B1D8392AF51AFD0217C5E93ACE578FD61994D7F534C0EA9C33AB6E123C862A7CAB938068A55D11D9D0B2717129569C6DAFDD8E942E411C39647C1CB42D29D3ED7E8CC3925436B0F5CC2DD1BCD9610336F5C9E03D6E7A9DEBE90EA2804301885DD9919FFFB85ED70EADC1D0218A9FAEA6A75C372284544ABC2FD57B5251B19FE55ED9D5020B0EA99C73C182EDFB4B48C126A622F1AB6F8CD509F89E559E7F41629FA73CC79F766534A8CE7427A13D83BD8A1F34B54D141EB238E97950BB0445CB733DC1CDA23793EDBAE8CE3D17E9FCDE7AEB16D01B328D7BBEE69FD4CA6C31C8B01AAAEDA747A4B58C80E7D671D2853D88415D70A5280F89D20DB11F9A8671A077D889F04DF3494A574A3F994D4E9FBC1120FBCC1CE16CE844B0DA510CFCF25D071F529F0348BF94CFE5740C6929C001FDAB89DB2D86BA716E7648F1268A0192ABF8E54CD443AD3BB3AE0DA4FE096BD270CE028770A660841C36199AD3BCE8F049A6DF640C79FC72EAB3F4DEEF2E3CDE3DE03AE3797FB8838C95955596E532D754D9D23DC5D28E4AD066F9DE0CB60D6AFF1F0953A00194010C44F733E37CBD7CA70B15D90AEF088DCE0E70EB91E7A1AB35C983695627EC50C45E00C5D97A5218FA8A580187CD95E4F82C4EF6BF9E398EF86BD577F4860EB0E7CA1ABD2609D66C814D8B8CDC0871EF1E4EB3143C792BD5CC48FF0CE9C94ED60A8F805D797488E7989AB818B334927182C7729ACC38FAE739605EF3DDCA8ADE10C18720A44D3C6EC2D034030F9D6ACF75230827776CCD6DBF17EA3F8A2F16E6B1E1AD2F8A6D9B6AF619151281EC01C9C59B8BD1C4E0280E83CA2778885E1B79824CB5383762BA8F18BDDC3D1D0A5DB4F032EBC98965D735F35EA2E2177AF5E18D0398732C3E485B78838596A36F3579B1BBF77CB7677C24BC13E2428236F73E5D377E41CB3A98F2A58D6661C57145DA9294C8C2A4A4F52DA8372F4D84EC78A0F6BFCBB3C331C5BA409A68A773A51FBA70FDD4A997D2919CF1B1643BF9AE4AC1B5043C94E5E2482515C960492BCD08F4101676A1C0AC77E17A846655F4A544A91313FB028EED5B041D4BD5BC130DBC80B73B206F13B04271B05DE8BA16FCE0B68F6E2BF72DC69364DFC0B5AE3E9CA384554696F48010EDBBD0F63147A848A319E0BC1FD377311B9F79C4B6DE46267CAB5BD5BC0DBDAC3655348FA255FDB46E6DD687596DCC0C0DBB909D1420ECBC5D2E966FFED386F07DFEC6ACC26FF1C4311CEE5A26163CC2D4FEBF388E7C88C6C5269585D48C8095804257E6DFA844EB0861BDEBC5ED3127F2638CF30285125ABF23D7E1B93CE708746CCD5EF202DDC38F6CE3446D6B66C9D573CA5AA978C52552B3CBD608CEC94F6A49EFEF101346A5A2EB1B4990383756797E6C1B9C687C7F5EAFB528A824F3A5DEE04ECE29BE7772E2CA5FDCA23C3D6744C546C4175C886FBC6B68F2E1D61BD3B0D61DD784D4DF20A47BF3ED8A6B3CD148984B488907C9532FF5EA2DDAE977688CF6F8E79026C58BACE60C3A87E75D8D9874C64F2686B886BF8C807E3B40B9F682D0955B682049E41901467AC11C852F9DEF1659DE541BD9AEAA0F404B8840F86743ABDF22BED9376668264C59EFF358E4D664A6C7457FBF719ED947A5910583415B319E0E2C647BEEF2AB0B2640E8F26C6DC35C44D9E25FB9CDEBC734F221D18A2692ED4FBDD078077D8BE78762DBEB9108922C6F26ED0234B7DF4EB47D80E71F08E4E5D93551D4FDE0325E12E52A688A83421ACEB216A2D91CCC219AEC4403C2105268E3EC009E1B7D78BF5B9A2D373234B5E369817C15DF5FA8F26E73223622D55E0DF2EC2AEE487F6DCC50D34C90297532857CBDC13891EDEB08C323A5EA8D3997FBEB5D6895A30EDE4DD162F66F9EC51E50CF54F85C27BCC0008E4458BE744037A94EBC841BC134E20413A26A871579894E40848E0BCA258E5D1EC261303826FF8FC1E3D2AC9C68A51C52388D1295DC53C4A667AD589E3227E75A19CFFD9E48105CDA8736989AFFACD81D4B33292162E803925AAFE68AFC2ACDEA1DDA5440F7676D2CC7216B7D5944F86B993CEDF0F498DFA73D91D69A68F0795127EFFE2173D4B27D0CC3D49F336FF04496C8D77748D930D56A5830DF727FDFBB310532141A229218D935CF9653FA8250D268C4FA5737026D36304D4450113197F901D0598DE2C546135254F0B4B382C2A17FF198F7DCFBF820616C4595736CFF08E8C725754D41ED3057885386FDD6C6759721F498CB3D1E54C5BF776040959E267D4C14EBFE891FB406CDC193D375633320204A55C71AFE2E8C6BA2E1EF29342279EB7505D40A2CC01B83863364608F3887EFCDE4F277BF4DCEF5694957ED69231948F2A7AA9C1EE23AB0605834B9A18B2C6A434BF79B432192CA0A11E5D8BE397A41B0D964DFA36148253DFCC8CA79EB4D1E95E5271A96E9C42A2DAF970A8BEBC25BE8FD259757BCD67B355453B8B7323676CBF6CBB36B139C324E4CC2D4C11DD0EB7111C338829C60830B5C3B8BBAE9DBBC7AF6F492ED1DF3876970A5A9B8C2021668112A3D98BEC5F96AF3CB5C184CC4AF4B4FE5FAEDB206F4C5054D2574A612F08A25D04B0CC5A9FAC53BA97B7E5AB7DED44683D09EBE469C0771DAC83BC6446E1984BB5625CCB42672F68AF4CE05D5B7903FC977D1D9578E22F01574E31F6645B51EA722D4A45D74478BAB5763C08F4AA3A06DE61E422A4B020196C8D62C1DDAE9984F1D8601B0C0C5F29333BCADE7BCCF93FBE391107B6CBE868A019F48790B59F75C4B35A9DB8CA923D7534C539371D7664222FFCD5CDD1F952D3F2D6A03A9E5F412249E7B614EE507B3F4EACCBA55F3F668D74BC3B7F1CDDD9290866057A05D1CF17E3E763131A1389F5E192F1BC329705D45B8C64E6E442C618D6C1A8FFA71F9E33108C2B739F5310986B90B76739415048B39B05A38664A3703CBE2C4EA7321FBEB609225F0861F0578FC7FD3BB66AD241A1CECCB245F13710798629E3AC5FF39885342186B7C130E2A5A27B537089915BBB41DFF764FC840E22403FDA7ED5432CC9B0B2A96E1E3F86C9F0FEEEF3BB90AF9CC4F6235169DD1CE77F17738430B7A397FE8EA75E288F7F3B26F42209E151154E7119AB3E71020D48CCD63A485DBB42DECD2AEED74D8AC867A8A6A03BF77E16DBC626EC5516935D374BD2A0AE4294DEC71BBD81DEA89FDA80DA13A292235A4230F673743F20C297FCB9462CCE2F36FF5FFB6870B3D0955F4B6EB91529216E448D4512A75A044142B3FEE8894BF1A50D71C3E3277D6BD579575DB226599CD12D9C314005EDA587EF6864A5BA005E0F40F249EF56A70244ABFA0EDD594B8841482822A7871C89E38FCC734422AF9AE04D6A10203C1EE2350729026757CB41EF0AE6DD05AB14EA1D453A70544B71CA7A22022A75D37C60A90AF27D1EBE04E3A42C0A1BCD09A50CD6456D7D5B5F83F25114BC77FEE784F31506959B7FBF73A00EDE1F2E90F5A0FFD77704BFFD9009FC1DA95A2D1C32C95E7A5ED16CFAEDBD203321025BCF5E3615622C40EEF41A7E8FCA42131C5D7F00DA2447E97D2B9750E51D64012D58F8A847545FC6E7E3F373B53A437B9BBFD23FD8371EB8D42948017FCB6587A9A88B6BDB35DCA2B8859C0C7E017ACF1B337E00C7C89653749D8A72BFA19428A99555BB6749AEAB4C69C5CD6DDBCDAE434DFAA9A465C8AD937987867318E86BDE0435FA4F8B7581CF66E720225757477603D8A6308B0E8E4C6C1F6C152A7F43811E7F71F8BAF37A4A01F2EDA2A68B4A5949AA97C42C7DBA9A666B0CCA0330BD04023045226610D86749E0660716642BD537C2DB1C7C44D44E099C7350A2049682E5C45D4DE95532710AE73AC650D1BF6DC2986F4E55347986CF93930A777283FB35ABBC93EEA8FAD0F55954EEAF203F6502B0D8D7C6CC8D3F1F25F3EA67BC37401A41F4408C042DF977217CD45B271CC9415128DAC0E05EE64BF9092B6564E837FD6BEE56676F76C8A6027E4959B4D8AC0BE3CA517551FA04952698D29C3BE115222F10AD39CA141E9BA9093DF0C7411B57EAC366C1B91D427AB23A85483C3CD388E1F111645898569891F22F954D3AE92DD852D51CC3D3D37C3A5318974357CF3145B41ECB9772198D8C1EDF1E38AAAF336A1D9F87F7D0F1C485ADEE172B3627CD24A5DD74F0C0ADA7A6487841052DC137C1DEBB197BFFD21CFA7571F33BC1D898067B96F1B7F7E6E34F647AE9197B1E0458C3E377866E134E76D78EDE4D186059FAA76AF7FCF8F4F11FD155E2E50C299D0EB4ACCB7433B7CB1963AFB159665FC50E44193B0FC21364B2E3B44D98CDAF86FD140CA9807C9425551F83C94C77B1F631EF97CC93C08994D82784E807497A2FED828846886EF3DDB41F1C4572742815BE6752DA1E44D3D81E1C500298071A8CFBBFFCC8AFF042DD4E19DABFE99C44776392FF00879FF732495C9BDC5308FDBD765A8874F7DC0A22E6ACA3465E848090D701D38713C4EE7D235C5E64AD47C3447258A7F594AFC1FD41A8D6BDD11A8A63531B9FC7DC98EB2C127F7CA583A0A174C3E6711069EBE91525629B64534FA3D4310ACF4AB2792BF4FADBBD1137D1F865DB057D6DC5F774E8C80314E41EC79680048BC06FA1801A9105F1B30BD69C59751749F40424306FC87D786786415B7B80FA115B7E234B1C30D035300AB000C028349C48AA4F16495E0C1FB75595D7E4DE4FC1C984FDE8DB1240023607B13983B45C4CCEB73ADECA7B9867034B301C32DD3C12C4AAD7466F53243D70F184C19E13F07B9CC6002A16E01C282FE8C39A082B56452218ADF6EB73FA8BD906365072BFDB805C50EC875E4CAEDFF396140B8DAFE9D8F0A7202F0E1AA5B405D613E8520997A24E576EBD01D52571086A129B0FB98AA45AA9B5188051C96F0921F857A02081CA85614EAF7B09E56BE086FA274498A542D065073786472CD5B1903E641EAC91B67370BC2BA8D9B20EF16E6309A58F835A14DCC949932E5E8EACEA47DBE1126D3C219AD698AEF632829DC13883481F36232B787F629CA01FC8E4FA32FF00AF9F4C2781ADEBB83AC799C43D95B2BF298FC009764881B3C65FB3DBC1719393A56F27A404729FAC49A5A979535F93474B77E0C4A11CAEDC375D79713E85D0999659779F6E1D5E6E433B1D17B0AECB9CCE321988B26BF49B341ACBB0347326E4D8734A83D70702EFF65ABDA6BFCE7E74E9424DBF04C18A355F7E1B9326DC9D037D2AEBB57DDAE60B57F0D866D6D7AA5E3FFFC8AB06FC4D5F1B19041C2281AFCE40D7FCDE1F9FF2A634106E33B46672BAD7D281A57BF4A5A1CAF68F07350B0C37C6AD225F8B48D9386B00A08586402AA3A4BED5614067CE1099056638FC1229F6E87DCC7971D8F7DACB38CE5B8B23DA0084B3D4863EF09AFDA1E20C4CE4E2D1B9406139848708B9CE713200BEC755D341F77A8240133C299EB39C7015FEE8A8C5FC1EB14F380B1698BBA27CF1FFC9B739A7F230AEAABCD4590C132980AB39FACA3E9290D488437010F6828868E2349BA2081A4655010E964DAAEC843188ACCCC26C8EFDB4AC6E0AA026C8A5737F0E1260F04FEFE50874497B8B15A6E8033FF9282121F6E37D00BA7387FDEA6DFDE11E0B3AB052830785F658C2D2CE12D9DC1D51AA0DF70D11A35A919D651668780EBC3C699F48652D44FC866FE6694EA74F24FB2FED212247EF7FB16781907D0A66409359BED6B780E55F9EF78F93EFAC31C1D21ACE4A9ACCEF597C761927452A6AEACD37840D96FF0919B884058D0ABE6BA4AFA3883E6CD9D8FBE34B8DFF5519106561F179E1BDF6B1811649868BF06B73B3F62D51D15DD5D084D3DDE715DFFCAD67136AC967E05600B72F7719E00826D2276C61004B363E843CB7A2FE41411A18E3C75A6E5460D2D4C7EED5E83CF095D8109499C07269A1756726708B84DCF12F23027A2F44264EE7EEEE820C7861D593021BF77263795CBBB12EBB8E1E3C7374C5C6F8F8EB349CD77D4F2E40018DFC9122D728CBEBA5F9206AB0DB06870F09548094E2B7E24B024DA5AB55520BB97A479027BE624FFBA8165AB67DA4EACA87E78226E1E0B4083207A17237A6DA519F674D7F8D5DD5DC8A304C6924F021377D71FD42B91E4E7902568B4BB37E9B1BB2DE689D090A13E8CB05709D45D10EA19A2A758C7C8891765E47283E53273585ED30656107C7A465A3BD4829FDD6FB87183B5124A7670EA72DA9AF2BA9E963C1BBA02884BCD84CE3123EAE9200109FD106074553195E520629F58B9F4BD8BCFBEF1F2912A4D83CD3F73626909FB9D2014CAE18BEA6F7334B03C3DF477A3C64F38062EE2B564121D861E737108054929B74E61450A2E3E2E6B131A6AEC88D81D4159A8402FDDDA7A496BCF3C06962C961126EEBA7FB59577C76169B9092BFEE0B422886E7BC8DDB5D0066631AEE61276D7072EE930447934D47E5E189870A45E51211ABEDCD413EA19F311023904F26A8D395682AD475FC975BCA71984CE9A6C1D25A3D9E9F420175CF92A51D3CC950E2AF0FA25CF34BA2FECD765C8D549E5A068501F966D7A18F86DF3E2B69F605EB4A762F6329BDF6A6614FE9A50814D1320BA0632F4D3D977E0E85FFAC051CEB6A695ECE254F6B43260516817CFB0EBCFB6A4E0064FE7723B036C40FBA4135C1B24D67AF18947BD391EABBFC44F70C012A9B25254FD382F6E53797BA3044FC723396BD5A34A92BC26B2FEBE5388CC90876D25869679FB665EFCAC516EE63C1F0CCF035B6FCE30B13C9BF3A16390BC6BAB312CA44756C3816A646BA4B844EC9C4F9805B718F48513189B2E1B78F74C589658EA4B2DD53D73779E172D3B4BE4E83A66ADD00DA88F01F725BC67CA695E075ECFB7FB537030B36F589A5E375FDA978895586710E036EFD7AD81339A245C1A6364373F9FB57DD49A98FB7AD9BB1B29A3E0E58F8AC7E0CDDE2D65074C3BFA55E50593D81A486BF68B0042A4219E7BFE23D0691E5A27A8D10B655D7A0725C5EDF1240923598FB1DA4B1F9A2F533EA19C148367E594FF1CF4CE75CA7D7EA662A4FD44521A5AFD23C3B42AE0D857023CE47E0074C535DF93A5047A92E91FB0A4B7D5D8F1682D725F4E8D55157AD082AD918FF2A6051AB00A26B19BD65CC3D287560CBD235B0F0F774FA38EBFDC580767BBC1CF16689C9C7347789F4E251166336B0759B5B5FFB79415480DF76C9E737BC09CA51D7FD729E7A5D4CAFC8F18CBA702B7E6F3C36FC31E4F3D04DE38B5D8A1E3975CD49CBA6033A877A5B15030923C3CBA1970D3F40B34D36A156CEDF9CA841F4332686768A8713B7E16195C9F009FE1C88D5F4AD0FBB5DD4D46FBAC0873D49A7F15ACB845DF908A2A08F24C2B66CC2691A2CB8A7D2D04823DEEBFAAF191D5B467670E9827056AF7254CBD5CC1517C96C55266CD97546F9B15E7065817F7E30658EBFFEAB6A9D02302B4B2477D6CE0CCDBC1D61A1EDB0AA3C3C1C31814357117EED6D77D31AAFBFAFB7938E2CFEB5D8B69C8BAC3A6FBCDF9F8347448DCA392B2CA5A50B2BD1C740D91760AD0A3EACBBF9ECB87BB42E15B86CDC71D2F51BDBB1868B9294F51ACA5873B8E093BD71F7F3684D2717F202CA4A38AF8ED31D0999E3AEAD5D56C7205C579B0FD0FF8563BE3D63459709DE35C435A15F82EC73716AC7C88A2E52B04BBC487CF405F95FC4A63516906BA62DF972BCE2BEDE6DE5C023F5B5124AAF336F9F020CF889D599F0D1D5709914FD66E0CD7E3B7C7B6CDE1BABCACCD45F6945DD2BD5B0572B09C34477136BC64350E962DF1C455AC3C49523715F8F346980210930694AF52723C183CDE8E94EFA252C44FEC452EF474827B104BDF72FE841EBEB7F0880D1211DBF10B07D9A4C37E9FB98D30329014C7DCE1082B8BF6A3C4F8E908FD31C997EE34A4662F4E7CB1E72C616953C67080611E4746B69339E7A3D4D1744687B12CA26A374FC3EC5C824AEA37ECA7070903A5A6409EE787322E766EA997CCFC56D0AC04BE6B929D0A42C3C0AB54C318512C7A9296F0BD27EFC72A6F1EC8BF8F6FBFDACADBDA41D5C6ECB6ACBD7033FB991108334AF12974D257BC641E3AF1CC7F62FEF22B6B1788850791A44A253A4F0D9E2408331373E525D1417118BF27A5484269E66F717429F27FF7F8EE9F71B9E9D20FCEB5E864CDBB1C06F35A251D3604F4671280371B27629D05789833534BFE4B2ED10B203D6D6D74F589B92C20EE8DF47D34A831E99102F03A4E428692980CBCFCCAA2E0D1EFCAD8806F9D0DEB7C7090081AFC5BBA1C9401EB13FFC2A8CD1E90B57D98A67AFCA910D7AA0A527C8F2F8A16FDC07556887CE9A808391C6242F232FEE155C67A44ACE5A7DE820EF8E25646BC07DE00CF409B7ECA876F8E6095DA2EED104686EA1C14016732C01AAFAF4369AD360B995E858E67C54711F63A19858A9DE03EE2048810257B4B0BD6EC686A88C08E9FAF92CD70D9B0E18A674A83A06E5AED916EC7C574A27CE860C75156441CF40F40AE88518EE992229DF687BF38C5DB914420A3ECE025B9098B63653325FA8C8EBDBAD682A0BBA32BF129ACC6A6C85B779F7E9EBEFE1F32D0520B5F1D3F21656F9CE77B9729E8CB43E468177852DF4DA67A22F32E6BCC36830005D1858A5C07AE8FD1F9172CB00B0FD56037D0D1D851254AB2F44414C4F61AE9BCD229C33F58D0C4B3EC34083431FF64A058CF55F23ED03E6542515D59E7A5280797DB5105DAB9F8836C35A64CD578686E3142593BE33F7441AC2A4E74573421BDC7714618C0FA00F59C512967043490A4DFF96AC8619A59F908D8CAA66A4041C3D1BA0584308B0E58A4E5A6C3D1258AA68B3A89782A2AD4D255BDD5B1667C23556D7C4931BCDE23D24CA262C057DC2FFFBFA4942074E543977F759C72898F99BD8C7508991D9A445BE08516ACC1BEEA931F91598EA4FDC5BB14C67A8938D0CBAE95294C5E622654AA3A8ED39DFFD28383E2531514A6F71C749CBC6248DDAD462CECAAB2CC7E938FDE69F6170F224A013E59C7FC605D5594CC6D5B41713D732EF6D9873461E3057C2EA559B7E161BA6BB657AED63DE07B66C6451CF77F5A5E6301947FA2C43ADD5AC5D2B1048CE65C6EF6383BF2607A80CE114D98E8319E990A7B0A1838F409A7F5F009B08B0FEDEF824CDD4ED913DA038855BF4287432BCE5770ABE796858B5431504B450F67C034C1650ED6392CB832A9A7E8C9CF402DFB028BF5B5CF7885B1B028B32E5900D1ADB58121517709EE992DC7FAC74197222C73F9AF8FF167256A35DD2571058CD835DF1710D319E9333197105CAAB3EFB697DF5D3F75BC370AE7C0A1122D162F79B3B83C0ED2920153246E233D22E32AC030FC526964360121D32B2F94B89FBDD137BCCC289052E5FD64B0AF62C82ECB5F964A9B8A81C21225969B7A7650CBDB9D99DAA6900B442B6E46916E0BE29679400960C5545669AFC607E87E445945590E45589852E79EF22B4C2C1D5CD6AC43E5143BD85D37FEC81D69C66237551329A7AAC385874B1337B2A1A2A5D9EE0A59FD6D49B67CCC6594AC97CFEBCBD7D7198BDBD488E9ADC5A79E16741CE87C89D76ACB57A0726C17EA6A56EE57DD169BE18F1E85B49E3785E3147DE1E0CF124088E25493788D2E61DCF8EAC2FAED15F84E95FE8311B29B9D4A6282EED67D2998FF60ED506864423DC56CD7845A830C6C9B47F26E2D100D42E0D963C13B1BC479148248CD9281AAA2B0CC74E7EA1DFEB3F74219BF1C301166F22AF9D1423DC41B0AAD7311F99F0DC93A26DC990E7FE60F5DBA5E2693DDD004F03EF8D94056A9649FDEBFA4EA21C245CF2B5E85C09C5BCCEABB3E3ADD26D7C5CF0DB3A468969E351C82795DA9002AC8FA0E8B3DC1C4E2E84AFA61DB060696BA115A686F32C3C3FE54F6344E5AC6CDBE565A5CC814F6B87C53830DFE9D4B29E0A7E58AE9F7E3C85E15493C3965A8A9711068664E062AB683A03C886CE897C039E76F0CEF6D1D86224C229007BC42DD26B255DDB541334B8E283410091B9B37DFB169EC2B88A89717FBC22AB4A74AF6FC36506379D5C67465A09110B30743B7C3C53C7177579648332595D98484281D1CCAFCC7617735574FC7BA17BAFD336DF35B87EE2460315972DF7CAF73A15F85219CE9D96C2A0EA93C735A841F87616602B341EF493792EC3C1845E6761722E1687CB73D8BD4E70A95EFCAE768199A825950AB709853E9DC125118DA52D931D321DD9EE397DB715C81732252AEF2BF829C10FEDF634E82E08006287AC4F1DB65362600340B34437B43B918D67A1F4D36CFD223F2F3FC0C95D81BB79A2CE0B580B3DE313502176432C070ED057DA6CEBF020D03089F29721BBF6F9E664A6CE97B3F5B9896AB09D1645DF622DEE21C452028D8FF99C5DB4055E38AEA8C6B18F3AB00E4EE305614CCB353689AC3259162DBF341EED39E9598F0486FCD4D1E96B14C52AD7C004CF0690B7F545C96E0AB3B76DEB3902E3033CF9C64EE4A48E5E3A95F82C3258C17AEB77B1C8EE9F3AB7474885A4E90C76ACD308D2946DD302CE649CC3901299DB80F581320D53399C8AA1C2A7B0F3C360F99DD9A0039EFFF20C504E6C16CC4D3262A763721561D83A661D2A6797284FD5A390F5636C6206840A72DFF02B3F071FA7C06B8E784C13CF523F82642FABDBD490C0ECDB5F6D0283A51336A651EE0631FE7B06392E7804FCE27A56319092D4D2F0C08047C1098B9F975916AADB8A6D5E43308638CDC1F1DBC45A2687452965F0F5BF6411C96BED7EE7224C6FF35E6ADD16A903EF801200F4DF5EB1209F6CF429A1372D3711C714696C11657FC4D23CD57D1BD20417D42C264BE22A4B1561FFA0B8C4643813536C32639CF02855C0D77DD7E07C3BB43AAC874283FC5474F86DD79E4EA41D0FB6519AB887A1F300FBD817C16E7A75525A5D3F200FA3918CCA6A9212D1298A377F6D5DD00EB97885906628E84B310D62D645425E6B888277EAD49E10BF745FC5C9997621DB426F5E9A9FFDB799366AEBD9917A971F319D81CF91D0FCCD512A147F66874874A7CE8AAADF46B2C594809C0C0783A26879C34083D09540258CEE979DF97EEDD3C8D1B6C178FE84ACA3F982FE1FC7B60773CBADE57EAFE26C7079E23A23B687BB81C687D274A85A4193B639DDD15302AB11A5622DC28B7FB696297F9A6F457CA745C7484C2F37154E27DAC57443FBE1305072163DE5CF930F981145AFD51469F2D7F405146A6D8F44E6733CBF134DF2AE6911705424D7D8C0F1347D72A0E3B53873BD017C952EC2A5C02D1E0866AF8FA5C558C09D457DFEB92606704DFA0A562A7C97BD0789E7233DBABF01F83CB6D0F37403140A145E3A8ABA61D7D34E2F3B899BB3445B64FC0F5B9B8D180EFE6171073F98A8DAC5A9EBD406ABA6411FD9948648C95A839D1CE88E78C3B9EFC41BB61E887CAC9573587B3C713F81DEC3152030F67C75B6DB2002118B43237FBA2B0F0F383DA0B10124EB20E93F85E0D0B433D3E47C2402DD5AAEC1DB20D60D10A51004EB0592337455B04D2D0C241F1CDF16136B59A92092587C300690E31CEBD0873C5B9F793E36E7F3C94F9B0F5A494189A1C852FD91B42B1D4B58BC16B5CC42591F0E25E34AB1DFE28B571E309D9872A1FEC094E345FE57EC80C37089B280F42E9B653DEF59AF90ADCA77C12E4F3B3263FCCE42C45E270DC6170DCBCD4FF8C6ACDFE5502FAB1D20B454BBDFAD227455043EC06662EAFB2019269F56765D93948D367E01393BEF9BDB61C9CB6DBEA7CD104809E709A9C9E1E629AF962E4B29844CD394A9B3D56594A279E99B09D0775399B46BE643089144A10EF96AF7119DE27BE8C3D8893CF14485E982CB0D7A1F42BCD08C323EC068B7DCC13B7965E7691DFF6C82958B4E74F2FA210FBA324AFF061CF166DB5A51056CCF25CFFB428413C540C9F71E14E6774039A771A38CCF3AC16812B9DB2C1CD178373D5E3D513623C178937019BDD528AFF8BA30F08273FB70ACAB143F6F2E93D73ABC6DFCEF8F4C4BEA297623AD2BC565FD59F87797CA31A942FAF1B65D84CC8EAF6B63CFBB808A96F271D88D75073541BF7D3F2A9962D953869C521D440AABA9F3BA262453AFC94E6EA4A1F097F74E40FB693D59665BF4EA09E6EC097283C67BFA5EE48C1A468B3F938780ADFEF091AF47D9F986585C5239801CE23B8B5AB182B30D78EF632AD110CFE0259AD20BD32EC64D1086BC54185A33708FF34BE79C693B6E6B778F67F484DC69EE4888381696CD6A4F52CF6CF25807228D0F036E77E9FA96DB9F92955AA4E2171CB6DF45D60BB17518469369F826A9868B7A7BBC6BBE5286C26C60CA36A5298DB3F2EFCEAF9140B2434790B3FCB2E3EAF173D9F43913223E35F46115EF494B2588C3F659A52F1CB6BE44AA1EFFC1F184024984D1B3C61325839C219D538B5859D70A6892B667FF2766F2CA1AFB9DF3E9CAF19746971BE8720C1A74F66CFDE0E676036703D8B4B77F25A05E89D11E176FB752C75003266F6E359714F451D10CA9FD67AF880DB7BE18C813FD9BA998A725E36697F6346083718C6AA54A9DD705EF5856D0EA9526EEA4CD6960408F1C70B91270EF8B0F3A526B9C13D656645DE13785D768E48A630180E221EE2A62104F8966A03943F7315CAAF9E1102516375CCDEA1DE9502177817A8354773BA4175B94BA9964D233DABAC1C51895C0A671C2B230DE3248B196EAD0FF5F0167183808E7D18CE15F082169029D878FD3CDCDEF65D2CF2C4B35D0AF54F27D68FF99BDFCC6C7A3BFF208108B2BF7B1C2708D0DA1E5A010AA485FF14595245EF572936233FAD349CB5849F3A67D031EFB6E357E1134198E9A4AA39E9A2F03A6AF9586038A92CB24C2FD9235168BF99A1273094561A908326D0D0E58C848B3BAFD0071BA9C72A274B4AE6528A5BEE972532EBD10D8AB19BC0A469AF9BE9D80FA245E124947939B237895C5C92656D49E60E12332572C1481105931E971D654EF0C4DC01E8A27F4DAFBF73D2F35DC78CA0A888F18933356134727F0AC7E153B8F904959C15D6B201B42FC0177DEC81E8FEE066467760BE3BAE6043F86094E35A329894B3C19BC434EEDCE57EA9A68BC6AAE20DDCD77C369F56D95181D8E4137E839E1D5E46AECF4388EE5E42C93D50099EC20FB23694AF46A2DE18C5F1E36AD3E1DBB675D061FC49E5BD21BF62E88B378788F965A50C44007F974D2FEB64CD9A7415643BE2BB253E4F8EF664D3C71933921607FA33F9E935AFA8E18AC26FF5BCC267BC06768B7016748BA915FF1D37BF52926C6FAE64BFB75945B9E7A589C5CBE051C288D31EC38BD7356560A52D57462E808C3C107293DF1C28C3793D3F47A4D4D2202571E91857016B90F40EFD8B02763E454F9808FCC5AD0EDB5D41036CE56F59C3D3FF0228175AD3FDC2F817929CF8587342AEAD1E31A4E41FCA00D20B1F94BFFEF5C449D5A1DC6D3AC2614B956C2F3D4E723D24AF817162E8F5CA0A0542ABB04EA5B0B6FC487D6915F54E674DF0C4D84F62B8BCD76D1FDDAAC219694B6536EB79B5D690A740C377B953DF0D8160D538A581093F4F96F38CE89D12D6F33C9A2AAC9C859E51058C78F6FDD833FA29CF894A984B3336F3A9EE20FF7DC21A0CE1A0827E1DE08534E3AD5D3FD715E0D0822BF1A905E4014F466C5043F7547C673CD0A8E5BA68710B361600E0E21A645D7D9596488F39775E19B1EE6B47DCE05DE7E6D04E9C105280DC768D4C534DF351AA0E39BF36B2488564C5A7BEC30416B3BAE5600EAFC035A003560C8625F4752060C093C70F934B02A5CC1A94B593A917B33BE0082B0746C6BDEFEFD683E6B79BA94B9EFBD288DC5607E750BCE65471116C4283040C6279929AFC4DEE4040F8522C6D7DD95FDDB3EEEF1EBFA09BF3B24982855F7B70785E6968918CDD860B9395CBE9AF5F5F3D4F56396416687DF8789DF196C397B39FC49EC60594E29B8C3D31572BA3972684A3ED441BD9911772963D6CA8200190B9A587B855AA1FC449B9087F3971BE48A4FE750E67E052A0C4B5A01F721B18A364A134CB36B89A7B22F8A501583D1BF8F7789CB2D8598A49614A24191B7D2778EBBD65304991A7D723B2BFD41B01EB945BD01671ABE79DF2D2C2DEBF8AC7A35383551C184F02D9C5039F796ECB6A7D12A193BAC68B1B766D3D8C03F1D281338E0DFCCC5AA308BBD91FE6E438155696290CB55D43B606891971AF0A188B7ACBE7A09FB7AE0CF5C101F845BC5E1E35FCCFAB011A6B65CC71A593AAE0939F0A6225CEEE385E89E30E8A00D4BDF3E60B72B3CEF884F8E41628D209B0651E5096F5E0991139889A17F31DC6A4137A3C8D64145E37FB6F69203383CFEF81B3E1E3D1CEE0C2BA5000D29907FBFEC3430F23FC4F7DB2CCB938A9DA022932EA14C417634C06AC95A06C0A82A315F8406CA2B935FE77184A1F570877E37E6A82F56F3E790261ED1B2DD3C2B9C4652E4F0E31ED2D81561A7730A1E623205504A70150777EA1205CA29C5F04F73DE02546586EB30D9707D93D9500EE04BDE5942E70B55B0253315945DC1119880CB839C7B4BCB54C103BAE94F78DCAA1778A7A83CDAF363ADE3A28A6EEB3DAB74046AE53C8640FEEC79B4CBE9B5A16802F1E2D1FF37410CF159CCF8BBBEED54DD64751D50F97D9D003EEF1609CE28071E3DA4653ACCCECF3AD251BA6A7C2E6CFDA7980C2A6B68B31B2C46DC2599D75EDED0A35E1069BBAA5D25E0FAAE5664DFF075ED20A8598B9366FD0C0C03AFA9D0CA0389051A500906A93B6A664A15307064FFA4DE328BD36D2A3348B3BBF9BB21A109CA4724CF1EEC32516612A8A2C11B09E847B333C22FE11B18468FF5C4581BA7A484AF5D742FBAA646BFE1F5AABEFCEF6EF5E15256F8C4AB79FE099642A4BEE687A9068E56149137023CFCB7072ED160BE480AEDB674275E97870D6F86576F653B5DD64463FC2F4B316A9BC6BA83209759BB482D08FB672ADF1BF124217B4E2DDDE00F1D89C2AC8E130F44FE80522005CE58D98C2BC6A729A2271B53253C62CB080D058C6EE1F0C719847A367BE06B5767EA8C73F516FD98A5801DC22B8C6CE49225087D8C341F296F2D697077232ED7B07CC740DB12040703AD9DD9DF45F3F3637F591FFA9F774188BFABDD2E486434AC7A3C1FA870D0C8ACD357DBFDA9A3BE18BD5BF62445DD3F4468A58FB274510D202FF8BFD6E8701B9655210D05AF25A626D5F772582D07AB0D93FC721A1DCC28AD45D3D7DFA66D3A49578B46CCB2EB62649BA0BA733C8DE88AE3B5716B38F9F1D6F19179E9F663A85A1237549FCBC7E93E0A584C67834C029B0BED6E4967328737A57A18BA1ECD6D0F45076ABC61706D94D0DEEB9A5AB9053587C48393C76766DA607048E7F145D6F9C53D3C4D9FBA7834836394AE179416C64A4BD1AF0E93E82F95487AF76D035714625989F2D05F1A136C9F5C093226ABCF6D910AFBE6FF4D6F41A49C396309B77120E3349F1647E0442077C6508B9A3CFE24A26A9377E7190187877F68DFDA1E4E531D2DE1CB8B884897F0A837852BE7AC6333D78AD453E726128AB0CA333E97206AB8B14B9B69862A98108330DEB988FD2E063281AB95448D2D3B1C1F1686F9E8C3F5600DE3827CAF007C3FB5E036A6A351177FA0745115F5A58FE688040CF0C6C9EC7CA6A77924D6DE6D99285FE2B6967FED219DBB98DDCDC4C23124F64E74F5566B09EB9200ADCC454A9445DEB9101069462257AE8DB62C517AC31D2E5752BAAF00208DF1458BE331C27FEE4236726023F0753EDD357271945F2CF65FF20CB8726DCD1AEA7FAEA4B6695B7AAB3FFEA21E882B41AD60163C784BE89540A03669A5C36DB2EAE917B166B0F47C1BE77E58130ECA71CEC54B910637771E7B807386E7CCAF502212E62D62E11BCA016B6714CC3E73E4E437ED4D3C5B15F1A73F7C25C39E74FDD2744479638D6A70039E8736F81DC6AAB84223FDDDC87D9D4C2CC894DF70F0E41A381986FEE96317CD06426E20E82723D42477D6AE9F1448A2A9E151C2C40A62CEAFDEBA54A46A652BCD351E3FDFF79531CBDC3E76881C5E4668DF1E2D71D2B6F090B47F79A8AA71CC0A9B3D5F03CCD74B04B370FBC640A4F02A91050CCC8ABBD68A150F056B2CE54B3D7BEBFE9BE5A979B0DC0F3D058805E1AC79DAEA3EB15E224B644ACAE461E5899907E3B628EA907373BECDDF4EE01E8306DD0291B59864B2512EE0307CCE9104ED87B9E27337BA6B8EEF6344AA15C5DFB6F505A7F38F2A13E78B90BB8D5591C603CC1A303633E948A6717B3310AFC319AC494A5E889B11FEA53E3D1F199AA1BF1187C062600977D313F57BD82C4E7ED6B6D9D4A8A5CFE035ACB9DC6C6AD51657111AA9951DD13324E865F683101BB7F010C13284CC23DB909681F93F9820C7FA696B20450C85FA890CA7345EB9E2183F2ACBAE45FF660C34EAB5399C4B4084A403D23EAFA5DB8DE5C2D8E5260FBF4260F739CB5AA7DB8B7FBA8E0B1606B7C031482D2F42E423DABACD2CDC916D29D5618AEF69F57688A3EE89746F73EB1F9CD05F2DDC96A7B9E964B06C5A1397A80C554F4B9BAA7FEC30EBB174BD2AC9E1DDB1D0420F8124D06046AACB824EEDDA0CD467B74FF953CB1607D60965E2D906703AF73DEDCBA3F50044ED9DE0F8E85D77CB4ADBCD5012543DC03CAF038832C93F0D8362AA42C6E57AB5D5574456E57FEB77190BAA005BAFB17996E1ED207719547319C325CB1CC46656FD1D85EF7E2964A45337BBBDA0E35A01951FD5E425BF89E7373A90D5D3351055F9AAD4EE58CC49530C05B270CEB08F7A444E0CB114680F1D954CD1E9B729C95DEA0D8D310AE25655C017CF57614635872924878C7500B71DD5A9CD8DAA22540D76C9D8B4F60A336B1805955F8F0649F3F60F1C7C7EEF55D39A296FC955C9C90D3641B45B8EE4DB325A5BC4FF7B82BE52023D30F85D16DBE4DEF643B6265C9BB024144FCDE1DA43B00124DE54AD592F6C017210E6E1A4168BCF9B12177B3057A00795DC67AC4C8FBB5005C4B4988E94777093C0DEE5FF18D7D01B39F8A18E5EE0F2BFA824DF7E8CC21F4500D9FBB8539C0EC4345C0547C8D9619DF36541CF06AEA610CB4DD5CDD5F07D180DC412B9EF1C4CC9045C2581E5A79185401A3DABBFE10364F0072CB63D25AF7DDBDF22A851A78ADA97F7EA2B35BCE0CDBA01C8A6418402D493D4EDC1AF9FC1A88A7C2E70FE428ED8002FB4F748C63C3C759B9C41287C4C1275AE065A1B169941AC925698EE38475D253AE48558ED638C8A53A716B3AC50C671AFC87E8F02A31BC2E4D30148A0247F293B17A71A55A07302577AE1DEC767139D0A3A1DE5C521F57D9ACE4146D7FF5C56CC51784B89D5253DFF9DC85CF1C9E153A6A76D295256A8E4DB4EFC521B37DAC4A5D7733EE406BFAE8724D80338527E6D96B3185609580CEC3220B48E0FF319C2D7E16CE51B90922DC8A9B1322483D7BB42CC20B31ABD4B2A519F57AA415D9792E7B9B7E8783AA65ABBD8A47FA7455644BB90CA692BDAB31C8C32F01C7EA587E67867A1ADC24367E3E3790F4D147F1B1B110B290402F669DB8F025DDC0A7CBADC62CB6430B4B8945D6E25E223375149ED9714166E8DB77F16772BDB91A6FBA1A3B0B69066CD755854EE4D7911AFFCDE5A29F3F6A6A0544835F627E4F0C34B00A0E933E6DE539844AA59A32B83B689DABA7F3736EB208672F6F5448DDAF1DF5A2B59B9A700E3A049780AE1B8DCD184F282932DCB109F9E6427FF8B8DDB512AE1A500C9902ECC3638D7D7A5714E8954FDDB5CECB67B69C214B0E4C096E36FDAE1C49393405DD9F15A6A29584FC9F243C7021CEB3E81110902BAB9BD809FCA8A1ABC75B8D1DE24C531E145DD6EDF5A2EA8B76A7ACDFC769CD982AAA3D3573BC0B21AAF103F1DF160FF878A2A3F0BAAD5286247EB80DA7EF0D22C4B31D0124B9A31F29A0C12FFAE27B4982881F9B65E9AB76DA26AB4CFF7FA7814AF0863A4406F9CE263145268F2721B203723A3618D9E9DDC73C97919C21A37F5E3E6EFA6953280AD50653B31FB88FC20C9C6A7FE1B814998CAD7876FBA28F07916EE1852ED8826888CCC9C7CDE6F464A77C0C114D27F4D1DEBCE88BF023A16B052A2DB1C95A7E320A0C3563CBBBC18E4953CE08B8B17B14691D3E5CE9CE3CB41B92CA0BC73D8149F8A9024346DF289E64531F6B2B97E774B46CCDFF41D2BEB81FBC22FA419ED5728A95A2A3165FBEEA994E9A7C56258170B69299352526DF1C7B22053E46AA87DCEA865E23CFACDD9DD01900E2A7493565078403B76ADFE882D5D2FB54C3525C0D20BEADB7FB27D0B3AB74E16D9EFE4600A414E399BB8738C90B6E33148AF1F6370C85C01F91CD826C2173CBAA86CD0B8FFE54F29514CCA99A3D93E7B46444FFDC64B859695A563B2A5DB60F369FB8C608D161C3DC60F0C42DE3FBAE10460C24EDE84D30920575945C36252371D67C52F98A8F25987D8B2AF56FE2F5A5BFB97E496CAB31E1C08ADC6DC7F08CAF580FC93A9A7A975F03213063C12968C1D378DB7D7B6AA1E78112AEF9F619F5EE244D0EADFF175C618545A823440214F2F768DD80AA75CB216AA80B903D6FC87AC20D24DE9784D60FD97ED2BF725A59AEC63819E0A79D32096981F6F24A879FB0504AEF39B28407FFB587777F6DCC6761B3FD8AB03C465BA07CF7353AFE7565EF2D8E8AB673010134EC64DA3F1AB1160A9752D228EA388D6189EB522800369F92B864E2202DC6814619BE05614181EC80858A71D366740B13ABC77D41020CE3A81A3793710E0869427257D30BF4691A953781D5A327E202A777DDFD9178CB4F7C9B2976CD4AA0B81030F6A5B7FFD4A65B4AD46C3FF4337F93E269D5E72A1A45AA99101BAED2E6EA813F6A05EF6310B497012AEF7A461760D95AFC1ADDE1881D8ADE9E01A02D8E54373F9703564CD83EF5CDDF855206ECBFB0D0D2AD5C3450CE496BA3BB5D7F521C98D9FED617027DCEE639AAF717A258A1272170B8D72AAEAD1EE3B0B2891F67302F031B77F94BCF19413B126CBE2E7E2D56F01E567ACC104DEDBA0B2BC44D2ECCCCA1FAF9F928AC6B734F953876C98DFAAE64514C1BFF8D2AFB4AA58CCADEDC009285B1F25C9B675D0E3F485E02552648737A7E33C74B6F58B823221FDCF6FAFC096729A1C4C16CC0BF96A522D31E40CFF70BC63B6BD2CC3FE8CB1C8B41713DE73F570A59304A0A42019F856880CF62806CD26F67A2645A58619EB0A2C0B9B01EE4E72D2D8ED1BD474B7AB77C727E724E644ABFBB6EDD40E25E50E2DBB59D607E722E83826A11FAB302AC478CF7364111B3F397944159FE5A9B5320DB661AF0A7A244A10DB1A9E5560A861476497B4DECB9DA01903AC6DCDC63A54BFD17AEFB706A2F4274E47C8B1A5F14565329398F0418B30A91C57AB96D205CE100968E00D592521B6DEC96563B25822385933F8D9D3BC93C3F0776359AE60CC34A4E1A1B6756268D96AE74F90C73472699DF4A2200502C8A04639823CC3187E352C9B6092ED22F13067B0F9D085AFCB2632AEC1D6D890757DA0CB3D7DAEB6C595698D79A832092E15CFF07B176658054FCD8FC81F68D7A379CA25AE7F43777B502883EC4D9BCA5F8F96C3D475CECAEB21CEB307FA29D9EC87B04046528488429811A9733B085A963A6D73FA16C7BA168672B311552475FFDCF251740D48806551E6225F6C90907DA23DC17CE187B02602F7254BE00995316C743FB8A2021D773C4AE6EF878C343ED4DD092B500365CFE3128D6EE890E866091BF4BFBAB672FA1C1A72CDE22CEF16FF5B545C02E32CE23AAAB6E4790A821E18BBEDF58DA55A4D1F43768ABF14C077B3B8F07E5BA7D9C31534FD80197D3960584631DD8029087E92C9783C1E4952FE3B0F3E7C832F52271392465DA30AA3CC783B4ED0DED23DC8836965E353BE7143CB82B8FCA84D1474CB29C6A655097CE0FBC9FF0599AF9864B8241E6638F5C80E086E62E1A1748E20EE8E2A3BFBFCC604CA1359507B0A1D987F873B4AB9B847E8D07B1A7D83A9A18878D0F7C8F1FA029DA26BB1178E640BF8E831887AA57A163A043B24D077001D097CA2E85A4DBB90573E73D6E8CD5FEF86CA8C48B4B8C093A7F94E3A007E9962FA1324902E9AA49BC73C95C11C24CBA83F4F19A7F2BCC864C6FD7136BAFEC279271CE92A604466CD136F223C67FEA2C95AFB4BD94EF040596C6E6DDE5E58275B4300532EB70D6B6AC9D3D62AD0B92E3235046AF157FEE79E9E5497492B1C4E43F9A27EC1E684506DC7F0ECB89A5830966E1C56D0EF3F7A0EF548BDEA28F20F0DE3C5EC57883EC065ACFBC70E62531144D773F8A561AA2084CD02F2C36D4DDAEF191FB0FF2DE3D9631DC8C3188D2A2DAB66D486C592930C2FC8B5B00BB67CE9385C3610823794B37E83D122D2F696E6C380A5C105F132E66E9723138539E0192F5F718BFC094A93920A46FD8C288241D1DF8B8311C8A3E9E92526CA9D1AF1717FC5DA43C2755FD168F2804289CE5780487B806E0D676E45D38FFAB4236B9F53009106258C49582B938283BC55015F6F818C442EFBC90C54122DC620AA3F51AA4975E78FF28B50FC7E1809769F0E71F3EE4CD61AE4B52A845B1409D48BDFC41B93EC912613796CD27113F8AE65CFD5238EFCAB94B4F9DEEC70BBF7720C8EF6CE6647651EBB9086477C631CD77B698B3034E99D35B2F4FF8598BF410E83B21F89F8A9ABA8EC6A64130A052B6F6E5DA72F106261989A8F0B34D36BBE68F7A6C59489FE8B98B5720DF7A303B4438D5C8712B1CE40E8C10FF30ED466B49DD5FCB1BBE4B460D8896C654FD669CFFCC13858949BA8C474DCD7EBFFEDCD69F188B88ADDD92D062EB5F9B2F4B18389745F7CEB6269272A060EEB72B4A222CB038A65DC1927A08D49FD2F684275B39BD47ED52CC4D91C03775C73FE5A3BDB0380B93C57D4F20E442840C1FDB9082943527C7E1D222696354C0AA966E4B305061BF46EE7D8AC07822471D64C7A6E2B1F60D287FC268F39FC15E3905D88A81FEAA3D5ED19DB8C52CE60377B82A640F6244B0587996D41AD899D9382A1FDEC1721FE108E4BB92BEBB6546DC85A06ACDD6895A1BE45843D5C87931D8C71FB6BC90F74DA8D1F5BA641317904E71EC7C9EF99B73B72ECAFB6A25EB9FAA42574C99945A65C8924A7752B0FA0BC2C04162F82B03B79C31EE3995A0E3880586D3BD506806A0FC68AE17B4B0D1C8C165ECD20B6502DC19C20A326D8C93E40A2C82644EED06D6EB64DB93CB3F9666A9277B289CB473AD410D2CCAE54230A3394FC88CFF5B9DBA89AA12A442220B0ABCC4A16C85D4228B8AFEE3BE6E47F8BDF9B912A6E64869F3AA46E3B8BC52CB5D3665E0A3F51584399132396049B5B4684E7CE849C882775CC96693F5114198BB511851E36A70DCE388B95239B332F28D7BC13563536376BC7CE193E8F94E183D562EE39E147B3B0F96C475113E2530054C1D830EBA63A5017ED8B68987EA51BBA77B7745519135C802AA00982C7913E9C4BFEDEB61843988C75B26158C6AB4999F69287D532CB30004F7A7E5E36E515A760DE1519EF745D2FAD4EA6118ADE643AEF0934795A4658C9DA915D71FB4CB3FECE927A105FF6C9148C065DE220E248D5A080060682F3FE57AB36AE9B769D961D0C27F089DC1730B2B954ED5C6DF5D9EFD51F820A06060F2FDCAF2168173CEA8FA39958CEDBB202357963A03EE975CBC33A2A4D783BC90BADA5F2F807F06561FD7E0F5D6A566314B011F0641D27DA4E6A30C5F866A9CEB54B2E26924506A521923F72836BB5215E62E0541DF65166D70A075F2C866574CB0B03D187E80DD590D69D55EE760EFDE98AD91D29E75994976E2C642BB2CFB7091E02127844C71CE91BC3AAAC848677800BC3A51D0569A7C5CC5ED0861058B0C2E121C53E97046C547D81763FEE1061A8735B17AC985689921B801BEA18D55CED895AA87CA69AC4E078F8498146ABE0C211F7ED0C5684D0DB199B3117579C890B1F1A394F01DBA478228D9AEEE477CCBBACD7CBAB5FCEF477997FF491F87B34728A54BB6B9939168BF7170C40489B626B26E8295B00344DDE0662ADA35411D3155CB84A1FA4BD2FDFF5D76686FE6A7F26E5FAB2CB12917AE7737B612D253E273E5DAEE3C392BDA770331BA7CF084A5467704DF031FE3977E305F6D8B5CFB19C69E41F012A9888BFC9B9D543B90CD3B71EF5D8C5DE1E637C8F849923DAAE493AD05CF13FD88C617272674BCEFB24C9610F5D4E877D29B7EB2E4390857A85D37A3BF93B70A54D6B30B75FC03A863D0DC3D6CA5CCCB0A80C04C7B9973285DDED6B7DF03CD40291BF98B4787CBE3CC51C97A9F8EE6A2C2E24E94E9E59C458E008EF21E33D0BF0BB7B9EA356952ADE79B720BF6B67D3605D1B9A435BFB7A56F79595F26BC41C12DF1D34511C79165606CD5ABA0F76A367100388A0FA6AFEFBCFC9550DF799AC550774C8111765CBFD3FE1D6023D5BD1DDD05BB7C2BFCE2B834B73762727AFC74A002CDAFBB858B401B6F5E71C6DCF33D281644B7FEC398A711E7F22685D619304F12A27FABEB3BFDBDD3FA7359434B0E494871545A66F0FCF773466B0C5373C69910773068972094246C398AADD2962E9A9FF5E612D03922CC0AE53468A8B9DC6A80B89DE08DFB51E90D4B3F5F9116FE760201E6F39E33913A543E62F342111BE74A2265DDC1E2C007352614779B78D0604122595AD1DC042983203813C59FA309E67AE7A571BFFBEE653B1F7AE1D7D2C8E160E7793BB356601CBD75D5F307C2B61EDD2679DF7D17AB769DEFF728C213ED3E6EA282769C91C140D3853ABE925FE89A72BE0928ED3D8A4E78273D3BAFDD9F0E6760BBBF6B437CB1C906CC34BC00B127A6ACC54EEBF600D7CAAAC6B359F5CDCD287F5D45C098A4A907EE659837D0D5452251B86B0E3C0D57358F8108BF37E3AC19D0CDFD736E836592204B4EC2FBB4F1EE2E6294D659CF8589CF4ED512A0349EBEC7490988314B6C7173049EF12E7EDC9A1EBF57E78FB283C0AE885C2309C34C8E586BAFF053DC81F4722B649F92DA9E34C22124ABC757E129CF90956FF64449EB3499183ED3336E37F2452E97D97F6BF27A18B2BF621901AEC2A8AFB64E108A8BF609A09181FE7E044FA24827ADB342A7E77530C901846A96DF12512ABBD78A9292E9D7A415E988159E16A4355FE1C21110A5D5CCA98C22EA5D32D2C92431D0C8E9A98A10AD43FF5A975F1F068C90367C6FF101BAE08AD8C06ED5865916F4228233270B19EBAD74F6E58F528385F7A99A4B1861A255D75544F1A9E5989218499460621F6011B62B3F410E17608FF53CBD7E558304C6FAFE3E6ED5FBC23E9F17005BDB169921B9C345EC1BFA11F9A5AFF4E80C8B39F5BF3313C4ADA86112A1048D958040B7A45E6CAEFFD098230D5052C022802A231AAD9ACBAED05591A420C97CE2D72826FB6DD76048DBBFD85E38AC924C042C3A82D5FAA13D048EDC987F013501D6F66E256F43E71B8506C80378A4205A0B0DA994AFA05FC06C669C5423945539022017271CE8ACD55C5C6B1FC518AFB081680A7F6FF1786F4C03BC610D6B3CD23571D92F843EBDB7836CA72CDB6EAC87C6C60C3B54610C35C3DC7DE0113358C98BD7EE9AC0DCBBC740CC944B107B465008BDD4F3C7D7200A3989C6E5F9BB0B1826076F056A4DAD6DE2C01F9FBD7F7E44C1FAE23BAB8D02E98D299BBBF1510BAF0A8CAF3BD200DC2700A8A316F2650C9A7307F9E9B1BCA889132B779B4D070F7AA8ACFA9AECB6E4038F50AB00B07B8BD19765FA334ED11D816DFAE477A7FF93C974F2FA59274C381952AACDE0EFC91653051D39DBA21F4792CBC30CC8A2E7E45003FFE31085C5BA4BDCE497E6CD11EDEE66DA3798608DF0B7DAEF3E93964467744FF5E62A806EB1E0939053C122C0ECDFC03F75DAD532437B721D251931C67DF7D01817519DEB92E57406C2D51EE1EC3F65731EBBA02417830629D2A21E5A27394F14DFDA1A4C6E4EA60753E7C4DB9AED3FA5E192FC066F00C015C95B1C1991884835C457525C556FF16978247472ACA75C09A9D364351959AAC2A5909EA46CBE9DC67C5D8A7369B3755519DDBB76EE32FCE6CF45EAE5714AB3EF5F54E1BC6FDDEC5A2FB8FD426A1A1F6543F4C6E088E16570181762863C14D916579013A0564B2E9A936156307421D696D7D6999B98957B0B9802F1FF635E4AB217D65F9B23F28DD6B5D230B242F2DD890C63F4E112ACEFD222008C33E94686BD6113535CE23B9376BC122BDDAC3B921207D62BA019266A89E2629BE57752BC8E228A309FB7F112B3604B229BF11CA3F303D2C4B37DC73FE6158BB02A12831B167AB0100BB30669862570DA5EE7869058EA2FFB62A61FFF5DAB64540F5873C9A8CEFEBEE8C3006AD2C1BF7E65BA8CEE8BF1FF5BE4A2D915D7822AE8FB18F9F8B5F7C51B0EE95CE2FCB0DA4EEAAF8678A69BE84332B8605DA06424EE9E0A943D8A30B9D46E8833C078DDB159C61BA75B0B0914AD49CD28E18A692C56D4FE92657E2BCC4FA2D86F1A1FFFB001255FA0EF90844FC4B052715012124D386AC363C79701F4D881A7DEE7CB58CCAA015A53903AECA710F063887E926457917865A394E3DB3EBA6031614B570D851518DF42C45A0528DE6E7D1FD55E1C452057A391D61D0AD3DAC7AF973A32416C3D88A453C2D12F6662B9828BC0C802870A396EC2EB211084F1B2EA5361FCFBDD11BA2F5FAF711A2A215F0C059E150C3712D6693C12920C9386E371B0A0E3077BC4311E3A9C55B0695B69BA0A001D55EC5214CFDFA6D3BB3F61372F858E9DCE313CD36798D3E577E27252275986DC86C001FA2A324D2A556EC4531951B4134B77CA59F054583035978AB2F6B078463B7369AA76F6AB2939BCF3EE59B89A1ADB1EF9C1F25D1D90AD2F8B399428E86793A933CF3C017427E9C16B1F99EC3A2A5109FA0BBB70C0B93EB36F9F1CCE796F9B713B11D92808F08CB66C6EB980FCBC906852293F30AC612013DD392FF36763C7E481204BE72D80AB81909BC3AB19EE2DBBA79A7C3404CD0A5CCAF598CCE4CD7507F6B32EA29014EB77FF9E91F0A34F7DABAA0362BEA8C6A1093338956C4E46A02359C61B0656456890700412DA55F301EF0C6CED3C9B6AAE28490C74558D606C977411A8FA88F6EBCB963A9915D57F099A134AD5D773022779A1A7D576DFE78203EB45FDECFCEAE85B09D518C3C62DCDBCBAC54CC1AE8CBE3D9152683399E2DAABC0CDEC0EE945C54258F3B94AD3D6380F4BEE04D43F19CB5FFEED5423F68C320C99BA08A4A933EC316BF663F7A8A73A69494DCCCF9462CE868C3342525D4BE804D8069229BF001B543C47C69593350FEA648A5D3E5A48104412985FE21A27714879DC3A3D3773C88E3D944083C383831C2E99DDDD77EB54904A7E2B68145940754A1EC787C1FDD36B320FF03E1AFA8452A59AEB933C0625A8A32E024DF5545453947BC475932C0BBA5D7DDD37CEECE92B648C58F790C016E560F015E252C9F6703CAF9651C9D621A8053C4638561F2ACD1B2A821887F68A8CA7B9D85490D236D133A42949950925412A6E583027DFD56F98D5E42D39FB9148AB363594EC1BAE84E44887372756B7EFC859B579EABA02DE6910ECF67913B40B1AD2792BDF750B6AEC2A39A5FA0F8EAAB4C7AAFA6E2A4098141B9E667E0B9A5CB12B87890C86A21CE6A87DCFD20AB39A3475152E0FCECF6A6E3650A5E187164F5C9C860CCA89A024F160F97D40CAEE13D987CF5D14FB42CDEBC206121D725B397A9B3D8B9254B6AE25BF1309E48339CA4081A8B96A9163CC73D66EA239AF672B8DDF6FC96556C4C5C7507D5CE8C5539996665B71586995F448B13D40ECABB8B5C3ECE53419119D0224E55A3EA47D87FCE63D107618203BB02C0F9D3CE24181953CAE56926260068C6FF48C5C5ADB1E36EED6FAD7626E3391B0BCDC7897F20C605A6252CA12DA9839B54DD1CEF04C911142CBCCD14780C2A2BC6C1DF6EBEE8F12C4FB59EAE45195FC559066DC590D548519D853BD38F5DCF6A41BAFC070B800919354C26F21D3A76848FF4171C37446A6343BF608D6402B2CA3B0A0695E9598EB2A151B09E69B382811D7DBF4487B060EB94C3B05CFC47A78EECF84C8D72F66DB019EA36C72A7DE11E590ED191F594FDC343F2E1E1829B7BD436AD889DEF6FDC5F8620D04BF7E9F1A917F0DA478223377C7764180CA2AD89442D27487959C14642A40A55C875EEE5BCF3390F9F03390AC7E622F967FFDE0E30AC7F20F7C7684FC1936D2664D0D1C4E62E310939B539EAAFC46529A27EC0BC43C205922C62853495E791DEC2D0ADE7FF9998A955CA6D640B2AE67AFF3D1E079C9BA33F53409A4D7709F232D061568931C41B46F0B1FFC3999166B99AE0F6CB7F9D780BA697989B22AF32B984281EE9490D0A1033B3BF7AD94DB7CF6C0D614981CB21BCE0C0B70546E37FD9757EEC789015A4D8E1CA116C37FB26E43B035481528DA554DC36A445B1C61245D18183F5C3E9B47F8A18759A7BD7BAFCFB2BB7E0ACF149071038D003CDAECB3D285BE4A22A47BC88AE5E7E78B4BCE84B1E9FDF6EED3A7115E81927356C1FBD3FFE346A0D02CB1B837F5D660ACF63D84C70A08962C52A2C4D70DD4628E583F2FFFC244740D27C2BD2B4739985D4AFEECEB80653524C1E6A1733E84AC9D46DB61BE573EFEF87B52B7A51C3530086C69DD665BC875708521777DE2CAE8390F2DD56C4CF880EDDD48F90C2F739A53C10DFF9F49710F3193BD3819EE6DA109E72ECB44FB72D99D640E35483FE3CDB89EC0E591C6ACE2C694D6537D6F364481E58032CE4AC437412BB057743E7A2E6783CE24468F813B2E0BECC864B7A8494943EE0464B49467D600182EFAD1E8437C5F394F4BC16D36CCDE645B873ABA8F8857B4AC5052B280E70F7B835A46FE5683BA6206C1A5516AE2C9DC86A06BECE6D4C959684BE9BA8CF4024ED1C427882EB9BEEFD72EE6D1789600E5ED42596179BEB209D1A72085566C5D692F63BDA5C183D1C1A621EC87667C750DDBED8EBD1A9BCB9151EC58E099EF076A3DE473EA66B49A54342F5ECFCC5E549B51FF00AFF1A11A81651487661284E7BFA4BF6634637DCCE0D9EF916F0E4F192351E17AD14C604AB76E4DC05C00B7AF5DBB9990F839D08C1E2BAA9B613677F0C2FEA6B2346D5D2E8C9688BB393A7A25D7E3F2118D8B173309B0A208407F0E58F72A66924881355AEC3BD528429FBB1D2AFD0A77133AFAD8C70BC7745820D72DCCC999D8800B15D10CB27CBA0D7CD42D1E0961167D68384BC89A28F98B6ECE5D8488FA6E1388495ED11A184DAF01426E21BC0AE01EBCC563AC89B4693EBD90B9194BDC5DD73E818344A491D5D17E77D9FFDC3386C689E47CDBF5D96122D7796736A61B3C4F814DB7996C942C72C0E088E6CC012C7CA44BAE349ABF5A2C630BADC7473904883E2BBA567965E03C8D944B24961135B35DA1229AE16B6518E51630A4980C3A97E2B36A9F24D4DAE17EDEA6024C55F9AFC646CCB8F0147FBB6DF5B6F5E4AC85C4952E137014122AB5813D41385F37ADED70B581FFB9423DEAD43B0022A20BFF0706DE8ED62967226370B128EAC1B4F4B07F9EF3F56AFED7D3D62A19004B51548C289C91D9125F2568660C894EE62E083851127E61F9285EEAA7F869544226A7FA49D82524E3420DD439970D5DB78385ADDB663B86B79309067546071A2A8D2004F0455E04C69BC5E735F0E6B7A9866EE9719688F9DAC494C06A30C22D5199314EC9AC919F0DD6597F7A418E62DBB43D11BDE0913875246688A081E28FB3539F83D78F0CE6032F98C75F0B211144EBC8E52ADF3553573D07318348733301F00FC5CECABD64219390CCF048FCC661E885916B7DFF39705CA99AD381CB9FEF410D1652BF41BF4320374456989E7548416DCAF36D091FAFBDBBD6712E2CAB69F04A766433EBAC600604E4FEB25A193CA88BBF2408C5012308835BAD887161134801FC2EC3177CE0BF7B441EDA836CABC41FDCB5AA05E5E7D393E2DE03B4EA9692EBF14F5E785430E4D416F2E2A5E46E97894D38C249E167F4643151BD841D927B8B6A5E0D3B1E390D90409E7CA9C35256C53463A8A9631F63E32EBA217F4B44FFD83C5B726794CBC5327A682FFF4D887AB42CB2836494F8B13C4ED6B33C10355D01F3472A43226BF692AE3091DBEF8301174C40DC6C115F413ADFEA78DCC02BF769D297B19DB0EEBF83BADBFB5D033C1C72BC928234E7D5A04680497E868AB72153910F6F24002E2B4263AA39237622C74F8F5B912FCD63138DF37F93774A85811C5530D510EC0A81FD0728E1113A7DD4C68C24525B3EB5737485958C5BAAF6B41768A849416EB9B07FD4D48A173E4515EFF79FC68D0A29280FB0357E0F6306ACD8776FE72CDCA8A7ED33879691DDE6F182489DCB7C30715708462B6339C78BB7D269EBB3EA207FEA4E8B76623CD664AE302DDF99AE51C4BAE100EC5E3EABD04C6A35F74F28BD91C7048006B0CF5166EBE8E6BCC18B59605BE634BFFA12895CF5C2BA90A2311F6E4424FD5BF1A78D744BB9321E85B9D8CF2B19200F79AE65C18E08ADCA6C2F72A0E3CE4A97EC10C36800A377ED19C439F5EB317E1E7CB57F34C1D10FDB2CEC8A0ED12354EE94F618F0F48535033616EC44F9EFACC6EB227FB99E29185A55E49DA7D898C1B8B74C03C582F485DB5FA3CF11EE6E383912591876336DF1D1B1A51DC4C460344A689254B9DBC13597D5A29A974C212505DED6E944B9CDF63FECB2E90DDB82B3C55078C4F51B8F08028995C8CDF9F11E8276D8F2EE59AEFEC8F36F7FA87C0AB810A6E21A09B95B6CD11B3B9E2F295B870B328ADBA3EFCB63FB0A83E0DD33EB4063569D870037E7BF1A087BBDF4CF8734882E31AF8726FC63638B12C92C8E7EB82F6A6ED5C77EBEFA8F43E3D535C73F16C5834C44E3550795EA2DB3F0C93237C51CE93BFDEB25BF26919F54258FD4A2254A2642E57B6CEB447D438EB91D933D793812FD17DC6C019014CB5F4FC28BD06976894A503B357FD5255A3847440E1E5A90A5721211B61A594C4BB4D771F13C41F14D16384AEAB895F4E93A9CFA345AD70E794C84F5DD3B7607F88CE74ACF35A284449F38E429AF2140D2510E84E87236790C738874E0DD38CDA227CB123DDFFAB50412132637D179A33B652E66BD38AA2B58ECEEE08ED2530FE20114A73A7264D850CF468BEA0A5B543226BCB3A68E5AD7975B58564C9F65CA3D537D8B570334D1B97930A29616C58CB549A34361CE2EBCF526D497C49108837DD0594CD41EA6B7F0046E55DEF4E5B4F5937619849469816B4D3DDF7F0235D87FDFBD344E7C1BB8839DC72ED3C1BB6F1168C7D3008ECC5C6D276BDC3F706815910E62C160AB958DF39C706F2D723F26237E4161CD1E0E3376E97AD9D4AD3783C05787047761D038357C9F60AB9D838ADD618E83EB47808B203382E82C83A46CC41CE25E49A8152E43DFC9EBB5361E91EF9A08D70F6C6B6347DF4E61295DE245B23D7956921FF54FB39B9669B2D8924DCE83F231F9CC5AF0238A369A327C7A6264993AD13BC779A683B1C07ABE13573EBDC1B2E433194D013736322F827B3C21486AEB05968FE8BF8643D3716E1663037660BFF0D1E37D5E79935DFF6F303931A4C577D42A82166241F928E141A7C9A49440BC7FE2BA9DA1300F88CFDEA9D5AF6CB8C2EA4A881E12320C9DCDC8F2E49258E0B624BADA824D8A8B939D8FC1FE45E4F1C14F048AADEBB63DD9F02A60A00DF102CBBC69BE50B9567F1C019712377111A7A7D0AB9BD3F2E38014202ABFD23CAF1167E13358FBB7AA4A7E3E7583FB50BF640486E3410ECFAB96C98DC12947D10966CD13899378C8971B16872D09DFCDACBFD3A3187600D754C8C63885DB0183A9947F76FA8223D8AE18BB0BD90981DBD7FF2D8BFB0421CAF6FDD945E70E33FD6B9BFAF84483D1C3A22FCA0D4D54CCC5E52CEBD9D6C5ECD1F503464450849CBF72EA53BF20887EEDE40E85C0922E8FAA9258B073A76B28CE5F18160B720B2B5ED07B3218A66BC9E44B4908E03E19328D2A512597C56F672D8AEC934ACEFB27149AEBD1DFFCFD45597836F5CB2D7E6F973E9E2419164F8FFF92B2BA404A47DAC994343F0D79FF2A656EA4CD414F84B41AFBBA1BEF165F0A22F1973AB3F0881EEC38ACFFECCB2D5BDE6FFBBFDBC3367C2DEB517D4F32090B1E250A4EB207D9630C7E3E981504A786568A4A265AECE15C3F93B76D29988EEED845D87030FE9E3E687BF7FCCCA54C1AA2BA5A882FF7823DFBADF96BF13180DFE4AB00C60B45FB74F25DF4268103858F73E580E03033A5F1CAEABA579E26631832418D4B0459B2FDDA52D2F911BB67F9A9DB178A91C530042B014281DA07D31DFF57308AEF6275F6B4A84277B41025654C11AED2673EE4E0CE4702DEFEF31A72C14EB260FC9FBB84EFD4728E472C66BA2F40D5A2940B8887E1F07F829015D24D73E9AF7B4A4AA3346B7732CAF3CC61B87E92D8D33026B8A9CBD60D7E6D1A8A48616A98FBDB10E3A5139759F95781B481FFD7FCF9FF5AD7D20013FDBDC0DE2C5A75FE5BF55B01283523214B4B6EC93C97E5F5FC37C4F7B88E4E0281782C2BF448F368DEDA9F87514176D318C8E9A3B340F5BB18A6E0169DDBAC23A6376804E54EBF0787C285644494A91ED8135C1267CDE4A048B68AB44B9C824C0E2A2A3B2FB7FCB001B75F62D1F35EC8BCC2DAC4696B2E55A72395711DB6B14D7FF2199EEAC4DC0BE341AB2611DE723CDDB5B8070EB134FF70901D501D02E4ABD8E2B6B2CFA313904F8194A9DD10441300818F317CF167BB0E24C3CC948ABF81E5F8BB80CEE111B912C7F37C1CCF9020774D4AA43877861F2EF2603307FB2BDD2CF54A8532E1D5F88A942EE8BD596C9AB1E68BACC6521F04C63CB48AE8D3616CE7E6BDE0E50C68757292A48701BE1F3AF2CFA3185D63978DC42FB0605110BD387C9CFEF051D69B540D0B089C9BA637DA5F00136C03DD533B43C29EBD924A3FDA56E06C41C95B92B8BEF22C87E5A36C72DAEEF236E276E28CB816B0E37D929AD305F3F3C79D33674682AFA45CCFE31B9B5DF3DF2B9F543D1114A539FD8E79DA62E33F94567B4D304A4C14EA3FDE73C5DD2CA7444B9AA53B18875AC9F21AF4FCB50B0418C19DD4214F4670FFF98D762B467A96FAD7D3D30DA987A9645CE34C6A07CAF65B46A28251C927B9781A7E1C7D8C7AA9AB51073E5E23FAE788D583F732242A24D0AE6223936D445CDD4F9062FE53C525887E2E9CFE290FE816AFFDD1F4F415479254BC14293DAE114E32C21E16153D4D62DE8C7BBE2FA84FD8530B550CA64C607F9529F2550B12967FF265EA961105FD4596EA1578954603E51E1F65AEA090E0ABF9EC5F2586AF9D22A6274A3906800BF2C8AFB4FA062324FA8CE28F366C16D861BF3728CAEF71448D774FC785C6E191C5E4E5187A5F1419A15D026DDE1D99509DA3C33051063FC1040F9BAC9179FCB8295252D27068295F0C6E002575DC4B191341AE7DBE602E4B7E9A521D7587A55CFA8BEB1F0AC14BBE62FCD6E5A75495E6B435DCEDD62465079AD30A023ED1ECC7A05E49B982D0C5776FD6B716157C71B546BFD643AA1FB14B0DE2A8640BB3C28EF48C4AACFE0D3B9EE5FA18FF3FA80AD6AB3A3E19F3D8E35ED3DD1D86B90034D3BDE6F5A60F018CE5E90D04A10D6AF633C4B3E00CD88887EB1B5C927A54D8BB52DCA28868CFB933948D635F4E995E72AC3C31DCFE255E54BC620555D08801698DF5EEF1C4D1E6BD5A0A2C75E1848769029245BC0E3366BA60AB81F1D9DB9146F2FEF602534C7D97DBBACE7BF070331660E245EA57224F9F075819941987F0A2C82D7AF1CE7A91370EC5D3BB8ACA2193EAC8B23EBB6FCCC6F3ED879FEB33713C8B26FCD2DE8F795FBC74117F77D860B3A4F1117C32DCC01A8D3D12623DEBFEB99F0765F319A5D7C027E181431EA9AE0F6122E956B36ED4EFE48B4AF1212ED847E17718B46672D231D5B8131C50D65C633F2C968008098B68B0CCC99B5147F1B427E16F06C342CB451E7BF0D0BE671DC136FE6CB41C2CEDE6332CFACD7F6A1DF0ABD97A863D314ECBC6A5E3523A060DB11AFCE6550F8D67EDC126ACAF662A145CE83B47A2287EB410E1CF3074F37AD8D95BC48EEB27E717B5A7E333DFF46C41BA8F0C62AF1064C2247FEE5CFEC33C027A20DC70F0DDA4EC517BEE4A5183C2F892E60BF72439264DE8C5230492C1058F3C42C152773F5F1EFD2D0498376FE1FEED16B64B45CE3B41052932DB2CABFDF06BC11FE2C87805D5AA51FA5BCF5604DB4B0823B775F61A854619962DEFB7692935A18CFA94FCDB1EF39EE86743E3C17004D6E7E38E4C3BEBA899968C4790380FD0B2831FE5FDA6DFD8BA63F6A59460CB1CD88545449C6E6409C1DBD3CBC175B66C7B5EAF656B1465A65C66771B99ADD60E8A251B0E1C99B55DB874F73F80AF1C6551ABE954E5596D656BE06EACE4CABBA4C376FCE1969EAC174B5C104B68BDEDE470CC293DDA2CD5BF6F5B6DF0D0B9BD8499533ED9FA416404C8598D0B5C486A6072B6BB38C96AF8716BE503118F404CEB4E28E245ECF9B1E5AFD4095BA229212081E634071862D157AEDA7EEA4F8D3CE1BE3AF1630F84D910A354EA41F500C2B2ECB026D38A42274C4F0AAF3D8EB0713FE722B7041FE0A08D606427EB4D132BBFADA42E8F478BDBA3CF96B2374A74954A85FDC6CB788BFFF987A76546EFBF6FE5159DEE98C2B9B2ADA3BBE9225921FB27EFCF0BD2549599A23F798B76BCED10E4366D6F647FDF4C3D3F8A0A7E074B7C6F23E35D98EB3F3F3D8A147B57A29E2541D450AA85846376A7A053E2AD7FDB1A928379CCB7A71A48C9730E725362907AF172DC47E4654D0CB99DAA5A7CD3E44973ECE64FA52E80E4FDAE2C4EC629A9DC4ABB699A26F002C9A439B08AC1518068585B07220FB0A31968BAA22464D4B6715F5DED66B99B9C8961F9A7A357430083FCCB322A506CEEE6D3F134A1A87AA705C3BDAF7D17290598B2C964FFAFA0F23FA1FCEDB5C22F5D561A615F257BA5F7A41C161D8FDB3601D6B615114158BA07B9211836D26F9907F161DCDBBB382FA0CEB81C95151B3BFCDFC875798D7AA4EE0DDBF694B243C494A223C10561F4DEE9850E0918408F4D236231D854F44670CCBEAB370EB06B0BD7E65447D4AD219D10DAA7F0E707D36E5F4A6E69DB9D062E8F0A8090DBBDF047C8CEC55703DC363E30A3F51FE980C5B1B258E1F9EAE7368E0BAA1C267AC91594845FE68868C3FEEA28811964DD9BFDD4DD6749B6C2D98A81B083697DF6411EC18474CE9A7C2D17B8001A2604BA0155C7F90B67C9C4D84CDD22FB5D265E4D58710C233AE2F564E36D1FF97E1C1C054DFD4A44C5A4C895F0AA74E49AAE0282B8E20E122BE6FA292D64BEA12F002A64B6C042552C708D53C3A833698B147F0EB5EE91EE8EF1E5E44E7B1C19DAA2A4E5496F367903D5FA7ED3DA55615F0BB76E770E25EF217412D3057E1EC668F2936FAEC70721953C6B1C5BF2590CB590443051820F0E2CACDF8AC79722BF1F18C9E32FEC5B83262625730E663494904E6DD50B897056A79ED0596E36BC1865F2A24B90F30DAF420C045B5BEFCBB4FD46FD07463E30ABCCDBAB01FFB13BF8416A40E21560AF4CE0BDB82B914ECFCD33AF98FF4BC897312E54118E8EF3D3F63C6B0A953E54869B6C0D50E7C2AF7126646095EC1513129FA080728E323710257639B65960ACDCD8598AD9E4AE83A01D7FC40F37624E1B03537C886F07CE84A723DE9C6823C0388A0D2D9276CA8DF57F7C5360D4AC59AEAA9191BD60317822B726EAE4BB4966E963D2B3F259D4D3083E08B143287AA7ECA83F688609595FE5C7938BF9C72B1ED33F98608A49721B1829283443F51DCF9016B222859BDBE1D61253774B9E14551D7731633FA49D1F67506C4F8FFBBEA025A2C6D4529FD95D8CF79C2C0CBBD233902A30239F8A21FC7301C034206DBEFC32789C0B0EC2C6057FAF42DED1D2C51619713729C585F5D5914064A2F341B746A3D5F787C886B9D69E17FDB6C1DF6A2C00E2EF1F03EF6E058720D50A476940F4715CCD008BEFFBB7F6D6B32037513F67644AC8E2CB4214D194ABFF82411FCB59891F1AC3ADE10311849826168EEBD141C20B5A09F7866B7301FC46F41CD29086D2A81FC5143E4E6F33527668B0130C1561C2AC0D5946A3B1A5C079ED2D7C8E8C62CAFA4DDD0EA36DD3C27B6A5348FB4267F54BA53AB0A35F4266F7D7D598FAE9AD3CD60D3F9F69A501F295589B5873896FF70664D206C37D2AC423213166F3B4F8321C75BB21266C14DAE49669EAFC8413305DA01D0FDEE4A83A1BBC9D21027DAA5D2C033D8A6772181B9EA40AB4D58D1F46CA9594D3A8DFD7C521A40FB134511B2E5DFE346B44E0DB1C31B42BF01AE3502A867FCF61FE225E1342E8DB295C32AA69A45C7D2CFF0FB2211E1F086D7255821E0674127C0C9454AAE2AC9CFAFDF2B8F501318D5A7985ECC78B86050F4FBA27BBCD2FB0B498165F904EA15C17751ACF27CEBC00A1580DA2958E9058F7B5B9BCA03BF96CAF0EFC46AAECC4BF20C6F74E84414EC993B4D0AA6FB359D7F3927C800EC93C7249C417B2171CC10F14D044C3B10EC2F8D3677B49A2BA9E96DA098D2C3999A83DD62C00BF3A4A0C3DE6CB960283ADE9D5EAEA743EDEF25394041D68A1144B202692981035016C4E3834CE3900DC65B30EB8BE0186976ECB22823FDB614E3169F68D5903CD65CEAAAEF0F945307123AD614BE21ECCFC512A12A44C66D9DF73D051D00D55B473B02A507D75EA05D20AF626C276456BDB03D2D241351B465DAF10D9EE4A457BA885C1909D50EAFEAB25B13E80A8C8D6493D9C1F0A5F5775EF703F7B55796808474AE811285876F64CAEC10351AA044219657322CC850BA292C2D74ABD6B9CB17426177AD79F10F7529028ADD80F4F8532E5882B2E5C903D508BE07F6C39D045085FF79EF444F5BC0CC53B9F244AF72CDB9982EA838BA3181626F6114FDDF85E566F7F8C8891A97D1370A25D83BFDC774BE14F5120EB959BC969A42A561B88A7DBC0DB3655C8BD4FC75ABDD2D2F6A002532B3BFB55202AE30066ED48CE6A86EA8B65E3E77D44540D6FFDACB9336F3E2D49C8F0C30E934A1CFBD48D9C8F3DDA066BE7D5B75FF73F786AEB0BFD87626D38CE72F9168A4E202BC35FA5D76FD73332B926514C19AF5CCA67E37DA7F6B490570413B799A03A2CF91B0C635D1A5DFF5194C24E64031C216882FA9303A3F70578A65985804B06E82E4B04D68FE7F457479AE204E85504093D0432193E8EDB1F64378AB9E57ABDE8CDCB2D3778913FB88974045DDFE21E3DB50FBFCBAD90682788587FC9AA934A478389955756EAE2783BF0CC99FED274C4D66DE8E0859CB7B3482A5B4C2363E2863940131C1C4308CF6B4EF34417E28EBF6DEA5B48938EDA1737D41848EE35DFE1585A32BCA3D97F28503429081A74D4C2D83E61A5ECF8DC20E723899073F1F470F1540CCBDB7EA1E25165D6B21AA16D7E6AE7DA5B53F3648915DB760DE0D61C28649632C7EAE8C95EB98C736FE4F0D532EEF4FE4F45940E005582B53BF31C9B8BA27C6594D7B91942F99239ED97D54E1800B5A20D099E9D43F8EEB2AA6D98B9FFA28523B373E6732EA75D3B39C259E5F62F7FB5298E302248314D8D40CDCBF4253527514B079BE6B4D3962354EF2EE5CFFD9A343B64AF959E4E177412F89F726606F140328D29F38D37F2FEA9709E3076B0FB9D1208EDAFD113777AF1F1290B2DCF4CBA831565900BD63A68EFCB311FEDB1744AD8E0514FF25F0A8290001FE82E532276C756903A709E7547BACB2EC5617B5AB578DB09A332A4D4E16997BF058A1EAE1B05F53C182D2B69F547BE3C214A5580B25A178E9A845752E5D751F617D40DD553D783977EF314FDFBCD1A45B0952D222D7925673EC533EE32F084C508B52F94C38C1B08638EA1C3BAF56B23D2A9092F15B24977CB00897067AB0D056F2EEAC19A064AE71F9FFCC0CB26F7EDEAD575075BD07565705018B4B546C38DF95AE0EBF05E680337ECDC504AA18698B6C0A25937B1BA045A9E3982D2C09CF51388E4F9896D0F74C327EB85D1ED1E4E40F673CF04A4254E5E70D03E9482610A1695CADF823B55686CFA8CBE71702FC3DA80690F6EB1269431A351426D597764E64ED6688510231A6E22DA148AF7D04A340BB806B4E73F4173A2D1DDEA8E88E82BBF5A5BB8694F200435E9FE0F2995B483E9FDCB5ECE6C90D0D4690680DBAA5EF8208F4883D040BCB1E69F71F440341A6E179E6BAC97BF967FBB9C55A4D66586FD07C2E787D06415272C6136F8A68FB23755963D92F366A1C967BACCC125834E96A9EB5E84128C8B608DD2113BCDC615217D7967E0C8F386CD47DDE5A84BA61F2EAFB8C88B5650D93616F1D2924ED207634C8E506DFDBC8BC34E174F74E21F38A912F4306B07C01DC45C77F39422F2CFA5B8C3B45813F0858DD012C9221CDEEDD3CF5180707FA12EC0CCE9FFE45A06E48C4A873E3AF9396A91D0679C91390BB43E003F97F016C84C09F4C7E0013F39E4780600DF655E98D93CC2BF3E3D7AFDD60ED40635FBB56D3D43EA32ADB5BA1E80214BCDC213AFA39F688957139131418C299C0D20AB295B5B970E594A8FF9378AAD8170CC748A9B80CF949E57BB7EA66A02835EF3FFBAF20C3DEDF00555F8E01F41A71FFB8AAEFDAD7E1344117EE21F51D87E0D839CCB8CC64C1BBAE81637F11F44219642AD33FE34FD3130AB96A65E682DFADF2C7CD8DCD72212F3EBB59E810F08C9FF1003016293968F590D0C5D3285229F1DCD8413F78ADA997A43B2868AC2824939982F2F4C33B501438BA74546EEE76988E1756F5922054DB33BC37F0A74CBEE5F0F556E0E70818C0F7BF8EE0450363143161F4ED09115D2E3BCB15031A453B56A7666FA8DCF342F3B70933BB840913A95741B19B8A8F71EE0BB587367B5BD2E011A8D1EAA7FCADB97157A364BA676E87BE4CD7B8AB61DFC8890CDC8EA60DD316EA0A72A3316DBBD15F169306A491FD81E3A9E3AFA013D8618A9BAE0DF65C7C1657E2412AE6253850A2E8670F1F34BC1CC15F009E1F70F9CEFAD69AA6A4421DCB94918E872A9BF60255D236DE51C83FD8A086CCF705811E7B33886CB2F73D3C90F8607F8350880B539E58F4FF67D96A9F852A57E247E88D16315B6F1EED1B923098C0026C172808F73EDEE867B8E48C6ED232C582CDBF836D7C8870D814AFD55BA8B8F7BD2D44BA32DD82EDE244816CE32492669B5A76E2CCEC686CA7F85C76AB04E0FB20C4C9A252DB613CC5F815D513DBE3849428812BC201F2E0839668828ED9DF7D0B4525D5C308875B5AB6D072CB8ED44D4F3ED568130C149EDAD780FD4C055DDC41523CE06C5521FA10A3090E4C10D6EAD5BB9D96C889C356E0B436FC7D8CE26E10ECA58AA9134D000A47C44BF3F823776DDAF0F2C8BD0ADFD3745D6A6A106424C366E22257FA55A86FE183E03B04805E64B8C9AC0AC0BCDC6F2231C930AD0B3BAD3C7B445F8C2F0D7F5786F47EA6C8CF039243BFB28BD1C74748A2F12E0B383830D5ABE5ADC492378CE68B57E77726FE865C1F644D0DC278DDAA8D7D5F103158C93A77E8FEAEF761E2E0DB03AD2EFD60189690F84D8CF39966D856F68A2DC809C61DE351D35B9E5675477C5E3840BDCA0B759EE871272323E36E6ABA0E29765D01EE914A257BCE5B94B2716CF22644D5A0C41FC18A35D2BBC5777D34F1B76A4D141D6911ADC184CA81BC4CF6FF053F1EC8F02FD16B67D983CB19F3692A9AFA140BDDCD172B430F4810E209C67F7EDC4823A43663984D767A7745523A7A8519CCA7370F20FCD9FA8967FCFFCBB1528A99716984CA45C1DF8C8434E44999E05FB5152A5F7247F0BCB3B3C4D55BFD16625CB91004BC9DFE8B52274E3EF64E7185A489B02C4B39A8E6E8CEA8C143D8B85FC0459995DBE5087D9488A70311FBAFE1901C35EFEFE3105A30CD1CDCF70E1D298CF5298DD7FC7720657AC1068D617B1454A44764841E38CD9858E929D047B0C836E8AF052581951848B632AE9B9A583647AC376567D8BEBBD6C061591FC8942EF5307ABB5C5AA10C54E1DCE6BB274F42977435A25EFCD64D5293A365DFCD8194185E46E601D29CD93ABCD07439668DA8553BCFC0D8595726A1EF9BD971EB3038B30495158069873D0DFF9DFFD548AE67FBADADED3FAEE79E02FDDE49CA8E31A82AA9848902FF84C4EF30C5E2BDD8757D3D4011B8BF6E4EF941F0FC484D8CC1AA667473DDF23B5A33FFBEAEDEAAE4D434E3915A664C058ED6259A4D3F4730D6945CCADF55150C100935E35C399C30A9F66015D66839249D6AF398A678DDC7B8B89A57E +00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 cleartomark +%%EndResource + +32 0 0 50 50 0 0 0 34 /Koala-Normal font +789 2361 347 (Sebastien BERNARD) 347 SB +32 0 0 50 50 0 0 0 49 /NewCenturySchlbk-Roman /font23 ANSIFont font +339 2651 650 (\340 Pau, le 12 Novembre 1992) 650 SB +32 0 0 42 42 0 0 0 38 /Times-Roman /font32 ANSIFont font +1193 3265 21 (4) 21 SB +1 #C +statusdict begin /manualfeed false store end +EJ RS +%%PageTrailer +%%PageResources: font Koala-Normal +%%+ font NewCenturySchlbk-Italic +%%+ font NewCenturySchlbk-Roman +%%+ font Times-Roman +%%Trailer +SVDoc restore +end +%%Pages: 4 +% TrueType font name key: +% MSTT31c15d = 23d7DTimes New RomanF0000002a000001900000 +%%DocumentSuppliedResources: procset Win35Dict 3 1 +%%+ font Koala-Normal + +%%DocumentNeededResources: font NewCenturySchlbk-Bold +%%+ font NewCenturySchlbk-Italic +%%+ font NewCenturySchlbk-Roman +%%+ font Times-Roman + +%%EOF + \ No newline at end of file diff --git a/bin/atari/atari.use b/bin/atari/atari.use new file mode 100644 index 0000000..fa8999a --- /dev/null +++ b/bin/atari/atari.use @@ -0,0 +1,15 @@ +******************************************************************************* +* * +* LOGLAN-82 pour ATARI ST * +* un language objet * +* * +******************************************************************************* +Le loglan est un langage objet developpe a l'universite de varsovie. +Il se compose de trois parties : + - un compilateur qui convertit un programme source en code-intermediaire + - un generateur de code qui convertit le code intermediaire en un code objet + destine a une machine virtuelle. + - un interpreteur servant a interpreter le code objet. +Environnement necessaire pour pouvoir utiliser ce langage: +L'ensemble des trois programmes necessitent que l'atari soit pourvu d'un Mo de +RAM diff --git a/bin/atari/atari.usr b/bin/atari/atari.usr new file mode 100644 index 0000000000000000000000000000000000000000..16756ff90e8dbbc9190a4a3174eef73bf81ce93f GIT binary patch literal 11161 zcmeI2U2GiJb;qwLDYh8Xb|gEN?bN(-5s-37#!{Ws78)ZIwU$})D$6h)DyHP8kDnxGGT=|d2-Xdjvu=$G4~Kwn%3b=1O5wSFiA2ZT{4 zsrvh$JF`1W$tjRmccinNow;-Gx##15K4!oD^;x(3$zyjqj#+&a$4iHtn|Rc@mp@Wo z8UFoMAI|R{Ub^+{G3Q=z&OTq@lW({EyxZ+^{pZ{_?C!zOyWF31ecb&WpZ6AHUgP{} zchdOM=Lg-Ko&VpTWA1Sq`QttxaVv~@!hMd<2kgA$JZw>SU2)yH@clV^RLcYP~L(r%naY1cQB zyq%@VRx|c_*2}{zbAGYu^VqjL{XAx5xYdmOcGhXdz7hLwCrfg_ozyQUaVPijZol5^ zM$D4?bF5w*j}`0AZEmjlb4(Yvk{cc7jXK?gd3wH{wc1HD>c+j!T=lt&wH14)oavmu z)KB{z8>sc`86VUB>t4Gah$2XOuJ)PQjMpwW@p0F~ft@xOyLf)t zuPsQ(x!3%9z7@ALOP1EVNtUKjGwJr{{F)Tooa%LxW|Bv`b3ka)QYUU_9k%479-2*i zaZ?f+KBaA%g%s9edcLr_G3OUxENV28ZnEuDDK$z^_LZJgoMRf>+xJs3i%=Jee%- zB|DgB9IR>9pYh9?cC|jgY>J)ry%f3CgATJEmN&Z{)q@@}UQNUDd7Lzx{jegE%Hz&X zf-ssGI-`>&LYEJW*r9JsMLQY8%#dgO+2PVyT-FPZpO&>67kH3K3@O{~M%>#iSb~)nNKafSn8k5Eh-+LqqYyQ4jUBBD{^irT%8nany}EiFDV_^85w@ zih6bCYso#D$t7-F=_S4$SZp|C6=FbBtPRt76?CBj}$NAC;Vj&d@E|*K=(Of zH@4bM#LUvM-|BT@Ob*^zJebU2AF`fq?l)IAWF2z<>28(>cNxxk8tt=%|cq;Jgs zv=rUb*31cuhos6TGx@yTuP57}6yhwDo}fe69EikEKeM{NJiqDZ&jq-trI=OHMLHwu zE1bt9ifvT(DVt2XJ()wEwAzI|BGfe5k!+Dv7tFNSQqOU;$Aln+g-ZNE=Q&@HOT-* zu3{M=3@x{_yDAq|OOvx#Vu;XXWJ|X`cX54w?b*do zJzq0qhi@SP@>HBO7{@q=sF#)yZ)yx%Yj=_s$hfUxsKIK7y#A#vnEs zA{D02qLT&I&UmKi^a(YX5uPQ}Wr~~t$-261z@1w_82Y;nGgvbyuqP^88M?dyH8BQf zkig&^i?*lbWO)AIDFCXcFx$=e)5^@%x1zk>!&JqY`TW2NW{7w@aSB2+-w+OF(0P4s z&VrBkpXz~SI5w`RI6a~*SgZnA9bC282C#OLoO!ktN>Eq7-icC~QiG6eLzFpb*&*xZ zQhnR&k6m+ft-5C3Ya3_=xGBuXg4vElfij6zL9|1-xpmzpIl_XxD1^AWWPPPKg63+lsEAZKp20b$v zilrj;rUb;!;j=lF0K{bqE)<#=$E1v-YXy=;x6u;m$1o#4!0K&zWYTion8b?^rqyKt zy)KTh`kX9z=*Q+5L;{kCcDtF>LzY(2py9{VElW+wBZooIRI`x;dE1=V3hf!-=0fU_ zlnkH26Gj#_b7;h-dT|u{G;0YkimV!FD78K3Yf440=@KcCVa03{I10~bSd(o|2k@%| zFw-Y7zl;^d)C#D@tSxLON_7FBsMAo= zG%;QToO6DuMENoTl#|GTnIrAWYS`IO2~1GND@=$23Q#MMzA8=}9vdTRBYsp83D|0q z{()YTDehXzwG=^B@6&#$DWXA{Z+Jz}iSbJ8JLeZHks^FnhGFEv+byW%Q_&?$HAi4~ z5F{1h2WXy~28vu#DSOgTi6}uJ=I+(DVb=g=Nb|xxNFzkNp&SA(1jdRu3-^PhENsG; zkBf^?bya52vYOy>*2)4{mVm-cYl5BPaTP9=C}3s+NbF!HRyQE);9w(pb}77}f=yoU zYX5B8>LP3+qz;OQ3ev5JbPN;46+Bq7_;gB
  • HlJUW8qZzROxQ)-K$#?>fMnw%&94f`7VF?eeM>0wJ4a`MD%V0lA3lA{!C@YN$ zSO!D%e#m)Yao1#71(ZciDzg+9*jC)2@?5E{UZ`z6r;_`s(?m+H!3}#j(%1`v8hA!X)UrEz7c#AsIs9ny5@?aoNy!v+vsd^$_&xSN4g z5GZkfSbv($27KYkGX5_uTnI*@QbkA>M%bDxb)Y9n&xVFygioq8Q?g$aELM~$@k3Au zFQh95!Z5bL=wdzWT&7JeZdR)rk}jsZjF&`y`UAWp8j_5HDxJE#N`UXQo1U~hAm5SU2_U_wAl2- zbvy{YvYCKy6*g!Qp(FNhadeGUjv& zt=ARIDV@6N@jZ1(HJKWIp_Wj;N6k*{fbEakn50Qk0_sI(4aQLs!w52HhsosAx1TSP z;fD2D9h6ZCOnp=^fOJA|Nm9LpFsnA?u2{M9nV|)2);2cJlOmP^tt$#iHw5PaZ1O5TR3XL^9i>McR0$#GmaX^m6yw9p zOR>#xF}N-WN58%lb?C(vDT2(7^rxsKFfvcWtsx zLpyl0w!BtyM0}zTDo_af5sD1_v$7x44=CNdJ`9tf zFyx(`qVz3U2d`{!z9L5peSP^zqaP{)gPF=hB<z#izqYotxG=xDxVkdZN2z^gv$nFq)my;w6T@TV ziNWPto~Xq5kte)Yd2-9}O1g7!_`<>kLCCybO^|ibiZI7e=Ce&iNC#3iG^U{0B9+3b zs$JfSaFhux*Q^%bkw^qPkV> zLh@f=8)7E+sDc}3}+ACs7iDGtv=K8>8ra-(qQIUguX=R%%{t zO#qoUR`P^Xr%uTZjvYI;5z}m!zxngE^_BT`vp?ON7{Bh;Ju>fBnwqx1mRlIQKE=iKEV~ zL-*e0+(S?c>O$}1$37pv$GI8k2J{y68y|G;_n=>zbZ#5^(JANt2O8sdLx-Uw&{639 zkbX;a68gd0-+z0LfBo;;pMU4;b*F!CzxosXe&)UQ(B0wJM)!q%AK}}Wy94#OBkm#8 zHs+3u>jzV4(mC($IAnKD-Z57E4I@t$Pt3T7OZ~r$4g4>JQGq5p*X(32C+{W26mpNGB($p-I)ej3}8EjFO6l9>iY10R1{t+VAlPoclv)^+99+{RQ;S{{H?RwBO%-+t^ z{k>QB|9Sr(%Hyy1U)_IWZ~t3+`>*bCbN_XH{Mp{?-~6L}bbu%hwY@)d^st@3uRKR& zTz?X2A9Y7=wtalK7%|rN-*X@M(4peVaDK$b)X)R-9VzGF{BU_5=KHYC=Z=i5c;i0zzgVap&vkx z;rG7)2?PEB`V;6+p?UAz0(9yWa)y2r`V#al=r5svfxZp>EA$=c-yq?~9gjM93@S0> z9Tc&*x3~Z1-kwy#@gGvmJ8y?KZ z^!$_qey*_c_~lH%I>I=1u2b*WWLC z{f<+yK*v|Xg}-6>C$Tr(xpV9$0}r_!_}AH(J9{WxJM4a?xK{2Rh~U?k&b`Eb6<3bi znXFl}pMcw^-S~00*~_y&Kx)aCUO8nUc^4nhL z>PG!?bL&NBHt7jlZJiUR?z?%vE^5Kz;ND9wmtXAfqwswAFxztfGzM1M(2q7=Ir`{} iuY7&8@yf4_N!so(Zh5~qJ@F0Tv14p^m;c2V=l&Owt0^)7 literal 0 HcmV?d00001 diff --git a/bin/atari/atariusr.txt b/bin/atari/atariusr.txt new file mode 100644 index 0000000..27a6356 --- /dev/null +++ b/bin/atari/atariusr.txt @@ -0,0 +1,104 @@ +LOGLAN pour ATARI STE + + + +Le langage LOGLAN-82 est maintenant disponible sous ATARI. Il se présente sous la forme de trois fichiers exécutables : + * LOGLAN.TTP : première partie du compilateur. + * GEN.TTP : générateur de code ( 2ème partie du compilateur). + * INTGEM.PRG : interprèteur du code. + +Ces trois fichiers sont à mettre en correspondance avec les fichiers LOGLAN.EXE, GEN.EXE et INT.EXE des IBM PC. Ils ont les memes fonctionnalité. Pour l'utilisation du compilateur se reporter au manuel de l'utilisateur pour LOGLAN sous DOS. Cet additif ne traite que des différences entre la version ATARI ST(E) et la version PC. + +La configuration minimale pour utiliser ces programmes est la suivante : + - 1 Mo de RAM. + - un lecteur double-face. + +Il est conseillé pour se servir plus facilement du compilateur d'avoir : + - 2 Mo de RAM ( ou plus ) + - un disque dur ( ou deux lecteurs à la rigueur ) + +Comment compiler un programme : + A la différence d'une machine sous DOS, l'atari ne possède aucun mode ligne qui permettrait d'entrer directement les commandes suivies de paramètres. +A la place, le bureau propose des programmes dits TOS et TTP (tos avec paramètres) ce sont des programmes exploitables uniquement en mode texte. Les premiers n'ont pas besoin de paramètres (comme CLS du DOS) d'autres ont besoin que l'on spécifie un ou plusieurs paramètres (FORMAT A:). + En fait, la différence entre les deux programmes se situent simplement au niveau de leur extension. Les premiers se terminent par TOS et les seconds par TTP (on appellera un TOS ou un TTP un programme ayant l'extension correspondante). + La différence entre un programme texte et un programme dit GEM, c'est-à-direutilisant les bibliothèques graphiques situés dans les ROMS de votre ATARI (VDI et AES). + LOGLAN.TTP et GEN.TTP sont des programmes utilisant le mode texte. + INTGEM.PRG est un programme utilisant le mode GRAPHIQUE meme si à l'exécution de programmes n'utilisant pas les primitives graphiques du LOGLAN il ne présente pas de différence avec les deux autres programmes, il réalise en fait des initialisations que le bureau fait à la place des programmes TOS et TTP. + Cela est du au fait que ce programme peut à tout moment basculer en mode graphique, revenir au mode texte, etc... + + Quand on lance un programme TOS, le bureau cache la souris, efface l'écran et donne la main au programme appelé. + Quand on lance un programme TTP, le bureau suppose que l'utilisateur veut passer des paramètres au programme appellé. C'est pour cela qu'il ouvre une boite de dialogue avec une ligne vide pour que l'utilisateur entre ce qu'il veut indiquer au programme. + +LOGLAN.TTP : Indiquez simplement ce que vous mettriez après la commande LOGLAN sous DOS. + +exemple : pour compiler un programme sous DOS vous pourriez entrer : + + LOGLAN MONPROG.LOG L+ O- + +pour réaliser la meme chose sous ATARI, double-cliquez sur l'icone LOGLAN.TTP +et entrez dans la boite de dialogue : + + MONPROG.LOG L+ O- + +et cliquez enfin sur le bouton OK et le bureau lancera l'application LOGLAN.TTP avec 'MONPROG.LOG L+ O-' en paramètres. + +Si vous lancez LOGLAN.TTP sans aucun paramètres, l'application vous demandera le nom du fichier à compiler. Entrez à ce moment-là le nom complet (avec l'extension .LOG ) de votre fichier. Le compilateur supposera que vous voulez compiler ce fichier à l'aide des options standards. + +GEN.TTP: L'utilisation de fichier est identique à LOGLAN.TTP. +GEN.TTP ne prend pas de paramètres, il convient simplement de lui donner le nom de votre application ( sans aucune extension ). + +INTGEM.PRG : Comme son extension l'indique, il s'agit d'un programme utilisantles graphiques. Le bureau considère que ce type de programme n'utilise pas de paramètres pour son exécution. +En fait, INTGEM utilise les memes paramètres que son homologue sous DOS. +Pour utiliser ce programme vous pouvez : + le lancer directement : Comme LOGLAN.TTP, il vous demandera le nom du proramme à exécuter et demarrera en supposant que vous voulez utiliser les options par défaut du compilateur. Cette utilisation ne provoque aucune restrictions. +Cependant, pour la programmation des processus, les options par défaut doivent etre modifiees dans certains. + Le programme GSORT.LOG par exemple,utilise les processus pour trier un ensemble de valeurs et peut créer plus de 30 processus. Avec la taille mémoire standard qui est de 30000 mots mémoires par processus, c'est-à-dire 60000 octets il faudra 60000 * 30 = 1800000 octets (1.6 Mo ) de memoire disponible. +Aussi l'utilisation de GSORT se fait-elle avec l'option -m 10000 ( voire 7000 ) pour pouvoir l'exécuter. + + Pour remédier à ce problème, deux solutions : + Soit vous renommez INTGEM.PRG en INTGEM.TTP : Il devient pour le bureau un programme texte acceptant des paramètres. Dans ce cas, la souris sera inutilisable dans les applications. + Soit vous utilisez un bureau alternatif comme NEODESK ou les dernières version du bureau ATARI ( à partir des TOS 2.0 - MEGA STE ) qui elles connaissent les programmes GEM qui prennent des paramètres. Le problème est que soit il coutent cher, soit il consomment de la mémoire vive. + Pour une utilisation normale, l'utilisation de INTGEM.PRG suivant la première méthode est amplement suffisante. + + +PROBLEMES : +La est le plus délicat et c'est pourquoi je conseille une configuration avec deux lecteurs ou mieux, un disque dur. +Voici le problème : LOGLAN.TTP pour créer un fichier LCD commence par créer deux ou trois fichiers temporaires qu'il efface à la fin de la compilation. +Ces fichiers sont généralement proportionnels à la complexité et à la taille de vos programmes. Il peuvent aller de 30 Ko jusqu'à 100 Ko. Sans indications contraire, il les crée dans le répertoire courant (là où se trouve votre programme source ), un rapide calcul permet de s'apercevoir que l'ensemble des fichiers exécutables sources et fichiers intermédiaires ne tiennent pas sur une disquette double-face normale. +Il arrive que pour les fichiers importants, le compilateur vous réponde par + 'I/O Trap 29' +cela signifie qu'il n'y a plus de place sur la disquette et la compilation s'arretera. Il vous faudra faire de la place sur la disquette afin qu'il y ait assez de place. + Pour information, la compilation du programme TEST1 utilise 150 Ko d'espace disque ( à peu près ) alors que la compilation du programme LOGDEB utilise environ 600 Ko. + +Pour éviter ce genre de désagrément, plusieurs solutions : + - ACHETEZ UN DISQUE DUR : il ont beaucoup baissé alors n'hésitez plus... + - Indiquez à LOGLAN.TTP qu'il doit créer ses fichiers temporaires ailleurs ( sur le lecteur B: par exemple ou mieux dans un RAM disque ). + Pour cela, comme sous DOS, il faut positionner la variable d'environnement TEMP sur le chemin où créer les fichiers temporaires. + +Voilà, vous savez à peu près tout sur comment compiler un programme écrit en LOGLAN sur ATARI. +J'aimerai attirer l'attention sur un dernier détail : le paramétrage des applications. + Cette option permet de démarrer une application automatiquement en double cliquant simplement sur un fichier ayant l'extension adéquate. + Un fichier DESKTOP.INF est compris dans les fichiers qui sont mis à votre disposition. Il contient la configuration pour les applications suivantes: + + APPLICATION EXTENSION + =========== ========= + LOGLAN.TTP .LOG + INTGEM.PRG .CCD + +Autre chose, il est fournis dans la distribution deux autres application : +ME.TTP et MS.TOS + +ME.TTP est l'éditeur de texte micro-emacs donné pour que l'on puisse éditer des ourt et ne nécéssite pas un apprentissage très ardu. + +MS.TOS est un micro-shell qui vous permettra de lancer vos applications plus facilement qu'avec le bureau. Il est destiné à faciliter le cyclecompilation -> erreur -> correction(s) des erreurs -> compilation -> etc... +Il ne permet pas de modifier les variables d'environnement mais il peut rendre quelque services quand meme... + + + BONNE PROGRAMMATION !!! + + Sebastien BERNARD + + + + +à Pau, le 12 Novembre 1992 diff --git a/bin/atari/desktop.inf b/bin/atari/desktop.inf new file mode 100644 index 0000000..eaeb134 --- /dev/null +++ b/bin/atari/desktop.inf @@ -0,0 +1,18 @@ +#a000000 +#b000000 +#c???000?000<000?00;;400;0;;;4440??0;;?0?;0;;;0??03111103 +#d +#E 18 13 +#W 00 00 12 0E 35 0B 00 @ +#W 00 00 0E 01 34 09 00 @ +#M 00 00 00 FF A DISQUE@ @ +#M 00 01 00 FF B DISQUE@ @ +#T 00 07 02 FF CORBEILLE@ @ +#F FF 04 @ *.*@ +#D FF 01 @ *.*@ +#G 03 FF *.APP@ @ +#G 03 FF *.PRG@ @ +#P 03 FF *.TTP@ @ +#F 03 04 *.TOS@ @ +#P 03 04 A:\LOGLAN.TTP@ *.LOG@ +#G 03 04 A:\INTGEM.PRG@ *.PCD@ diff --git a/bin/atari/emacs.rc b/bin/atari/emacs.rc new file mode 100644 index 0000000..6403c11 --- /dev/null +++ b/bin/atari/emacs.rc @@ -0,0 +1,266 @@ +; EMACS.RC: Startup file for MicroEMACS 3.9cs +; +; This file is executed every time the +; editor is entered, but only if it can +; be found on '.' or '$(PATH)'. +; + +; if you want the 40 lines mode, then uncomment this line: +; set $sres DENSE + +set $discmd FALSE +write-message "[Setting up....]" + +; Micro emacs now simulates tabs with blanks in some files (.c, .asm etc.) +; If you don't like this, then press "M-0 TAB" when inside the desired buffer. + +; have fun with the Help and Keypad keys. They are all harmless functions. + +; ***** Rebind the Function keys +; +; Since this are the standard settings on Atari, they need not be set ! +; They just give an impression on the syntax needed. +; +; The bind-fn-key command is new by CS. +; Non-cs versions must use bind-to-key. +; +;bind-fn-key kill-to-end-of-line f1 ; non-shift f1 +;bind-fn-key yank f2 +;bind-fn-key search-forward f3 +;bind-fn-key query-replace-string f4 +;bind-fn-key search-reverse f5 +;bind-fn-key execute-file f6 +;bind-fn-key next-buffer f7 +;bind-fn-key find-file f8 +;bind-fn-key save-file f9 +;bind-fn-key quick-exit f10 +;bind-fn-key help S-F1 ; Shift-F1 + +; Cursor-Block: +;bind-fn-key help help +;bind-fn-key exit-emacs undo ; undo +;bind-fn-key previous-page pgup ; insert key on Atari +;bind-fn-key next-page pgdown ; clr/home key on Atari + +; Mouse +;bind-fn-key set-mark leftmouse +;bind-fn-key copy-region rightmouse + +; Keypad +;bind-fn-key move-window-up K( +;bind-fn-key move-window-down K) +;bind-fn-key split-current-window K/ +;bind-fn-key delete-other-windows K* +;bind-fn-key previous-window K- +;bind-fn-key next-window K+ +;bind-fn-key beginning-of-file K7 +;bind-fn-key end-of-file K9 +;bind-fn-key previous-word K4 +;bind-fn-key redraw-display K5 +;bind-fn-key next-word K6 +;bind-fn-key beginning-of-line K1 +;bind-fn-key end-of-line K3 +;bind-fn-key execute-macro K0 +;bind-fn-key goto-line K. + +;; >>>> note: you get the name of a key by pressing help c + +; These are not standard: + +bind-to-key apropos FNV ; S-F3 +bind-to-key help FNW ; S-F4 +bind-to-key fill-paragraph FNX ; S-F5 + +; set screen colors +add-global-mode "White" ; foreground +add-global-mode "blue" ; background +add-mode "White" ; foreground +add-mode "blue" ; background + +; toggle function key window off +1 store-macro + save-window + 1 next-window + !if &sequal "Function Keys" $cbufname + delete-window + !endif + bind-to-key execute-macro-14 FNT ; S-F1 +!force restore-window + write-message "[Function key window OFF]" +!endm + +; toggle function key window back on +14 store-macro + 1 next-window + !if &sequal $cbufname "emacs.hlp" + execute-macro-11 + !endif + !if ¬ &sequal $cbufname "Function Keys" + 1 split-current-window + select-buffer "Function Keys" + add-mode "red" +!force 6 resize-window + beginning-of-file + !endif + bind-to-key execute-macro-1 FNT + 2 next-window + write-message "[Function key window ON]" +!endm + +; Enter Help +2 store-macro + 1 next-window ;Make sure the function key window isn't up! + !if &sequal $cbufname "Function Keys" + delete-window + bind-to-key execute-macro-14 FNT + !endif + help + 8 resize-window + bind-to-key execute-macro-12 FNh + bind-to-key execute-macro-13 FNn + bind-to-key execute-macro-11 FNU + bind-to-key execute-macro-15 ^XO + bind-to-key execute-macro-15 ^XP + bind-to-key execute-macro-15 FNu + add-mode "red" + beginning-of-file + 2 forward-character + clear-message-line +!endm + +; Exit Help +11 store-macro + bind-to-key previous-page FNh + bind-to-key next-page FNn + bind-to-key execute-macro-2 FNU + bind-to-key next-window ^XO + bind-to-key previous-window ^XP + bind-to-key next-window FNu + delete-window + clear-message-line +!endm + +; don't allow these commands from within the HELP screen +15 store-macro + write-message "[Use S-F2 to exit HELP (with SHIFT)]!!" +!endm + +; last help page +12 store-macro + beginning-of-line + search-reverse "=>" + 1 redraw-display +!endm + +; next help page +13 store-macro + beginning-of-line + 2 forward-character + search-forward "=>" + 1 redraw-display +!endm + +; reformat indented paragraph + +6 store-macro + write-message " [Fixing paragraph]" + kill-region + 2 split-current-window + select-buffer "[temp]" + yank + beginning-of-file + replace-string "~n " "~n" + write-message " [Fixing paragraph]" + 66 set-fill-column + write-message " [Fixing paragraph]" + fill-paragraph + 77 set-fill-column + beginning-of-file + handle-tab + replace-string ~n "~n " + write-message " [Fixing paragraph]" + end-of-file + 2 delete-previous-character + beginning-of-file + set-mark + write-message " [Fixing paragraph]" + end-of-file + kill-region + unmark-buffer + delete-window + yank + delete-buffer "[temp]" + write-message " [Fixed paragraph]" +!endm + +; indent region + +7 store-macro + write-message " [Indenting region]" + kill-region + 2 split-current-window + select-buffer "[temp]" + yank + beginning-of-file + handle-tab + replace-string "~n" "~n " + end-of-file + 4 delete-previous-character + beginning-of-file + set-mark + write-message " [Indenting region]" + end-of-file + kill-region + unmark-buffer + delete-window + yank + delete-buffer "[temp]" + write-message " [Region Indented]" +!endm + +; undent region + +8 store-macro + write-message " [Undenting region]" + kill-region + 2 split-current-window + select-buffer "[temp]" + yank + beginning-of-file + delete-next-character + replace-string "~n " "~n" + end-of-file + 2 delete-previous-character + beginning-of-file + set-mark + write-message " [Undenting region]" + end-of-file + kill-region + unmark-buffer + delete-window + yank + delete-buffer "[temp]" + write-message " [Region undented]" +!endm + +; +; bring up the function key window + + 1 split-current-window + select-buffer "Function Keys" + add-mode "red" + 6 resize-window + insert-string "f1 kill line f6 exec file | F1 toggle function list F7 indent region~n" + insert-string "f2 yank f7 select buf | F2 toggle help file F8 undent region~n" + insert-string "f3 search f8 find file | F3 find command/apropos ^X= where am I~n" + insert-string "f4 replace f9 save file | F4 general HELP ! M-G goto line (ESC-G)~n" + insert-string "f5 search back f10 exit emacs | F5 reformat paragraph M-< start of file~n" + insert-string "^G cancel command (Control+G) | F6 ref undented region M-O toggle OVER mode~n" + beginning-of-file + unmark-buffer + add-mode "view" + next-window + +set $discmd TRUE + +; -eof- diff --git a/bin/atari/gen.ttp b/bin/atari/gen.ttp new file mode 100644 index 0000000000000000000000000000000000000000..bf13570d74630ee235a360b5254a5e9a07a60212 GIT binary patch literal 39297 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�&?aWUA84|^Y`HY1e0#t0`?gH7>K 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 literal 0 HcmV?d00001 diff --git a/bin/atari/intgem.prg b/bin/atari/intgem.prg new file mode 100644 index 0000000000000000000000000000000000000000..35f694f4b62f14b4a8fb23d199d08b187a6a34a6 GIT binary patch literal 79502 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 literal 0 HcmV?d00001 diff --git a/bin/atari/loglan.ttp b/bin/atari/loglan.ttp new file mode 100644 index 0000000000000000000000000000000000000000..eb840c7398175596f40f3e98b15ab6f033d85e2c GIT binary patch literal 237302 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 Soga!;}_kW)pnv! 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

    G+KkdDTLA@e|0+UD?5bJc2c4 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%0Av5_7QLHs>x|x|!CX9qc{DzSD?L{eQ+BOi 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�Ak{L$Up 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�JZU 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 z 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 c0000000000000000000000000000000Hi?xOaK4? literal 0 HcmV?d00001 diff --git a/bin/dos/286/cga/cgaint1.exe b/bin/dos/286/cga/cgaint1.exe new file mode 100644 index 0000000000000000000000000000000000000000..0642b6641e56b3429c63fb704cfef1c08dadd3e1 GIT binary patch literal 101203 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 C)+MJ(d* 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 z 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 G+WrTSuV?lE literal 0 HcmV?d00001 diff --git a/bin/dos/286/dirinfo b/bin/dos/286/dirinfo new file mode 100644 index 0000000..28120a3 --- /dev/null +++ b/bin/dos/286/dirinfo @@ -0,0 +1,9 @@ +As you can guess this are executables +files for DOS.AT i.e. 16 bit word. +Use: loglan ... h+ + hgen + *hint for big sources. +Use: ega(h)int for colour cards, + hgc(h)int for Hercules mono +CGA directory is for unlucky guys in +possession of CGA cards. \ No newline at end of file diff --git a/bin/dos/286/egahint.exe b/bin/dos/286/egahint.exe new file mode 100644 index 0000000000000000000000000000000000000000..5ec6fbc0b6865aa89a3015332c96b76af693a6d0 GIT binary patch literal 134410 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 literal 0 HcmV?d00001 diff --git a/bin/dos/286/egahint.old b/bin/dos/286/egahint.old new file mode 100644 index 0000000000000000000000000000000000000000..78049c8809589b86e35253360f25adf7b57bc5a4 GIT binary patch literal 152057 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 literal 0 HcmV?d00001 diff --git a/bin/dos/286/egaint.exe b/bin/dos/286/egaint.exe new file mode 100644 index 0000000000000000000000000000000000000000..52516ce5303a8a114cfef9c6439dd4b7562aa56d GIT binary patch literal 93444 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 z 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 J+WzOi{|{f`hXVir literal 0 HcmV?d00001 diff --git a/bin/dos/286/egaint.old b/bin/dos/286/egaint.old new file mode 100644 index 0000000000000000000000000000000000000000..f5cc63e93aeaafcd5189fbf3bbf72932a91e969e GIT binary patch literal 83883 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

    r2vB6IqnP( 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 V00000000000000000000001D3D);~Z literal 0 HcmV?d00001 diff --git a/bin/dos/286/gen.exe b/bin/dos/286/gen.exe new file mode 100644 index 0000000000000000000000000000000000000000..c9f01328e8ea2c1767e56283d5f964aa24eab610 GIT binary patch literal 48840 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 literal 0 HcmV?d00001 diff --git a/bin/dos/286/hgchint.exe b/bin/dos/286/hgchint.exe new file mode 100644 index 0000000000000000000000000000000000000000..60c6981d821a148b6850a6b95a6830f7172adfdf GIT binary patch literal 133290 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 X#p{=@m#qJAeVT5$&Rl)}```Zu<`lAj literal 0 HcmV?d00001 diff --git a/bin/dos/286/hgen.exe b/bin/dos/286/hgen.exe new file mode 100644 index 0000000000000000000000000000000000000000..4c04ca74fbba8f48c8c2ce4f30c231f2595c10c1 GIT binary patch literal 51404 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�kNE#>$8pD~lZYyS zt%)XNF|XF0vBFm8YX)2M7}zazfRK*l<<^B6tKqKT)Mur|KV`dcgm9sTsQDpwn7HR0 z?{gqlMX&?5R(^qsF0I_G?SO`)^*Io2uha|2YFQA(g~NC3kT4(7^{iritkzx7DIybv zQqkcG>WO4-Uh!?-X^B|aAro4)aoV9Caa+X9SwfpFeI6pMgrgE^Kh7BBsm@z&>axeR ztx+bP<|Ni|e)eN2GN_ja&cVpW>ke+;&n%@&niR1XvDWBYnHJ$zCfMX|9^sB?b^Y+U z&YyKL6s*WnTgnNONr&O}C)*#fEZ79$Kn#$UR!vMXurcl6#k2m5?#+ zX#}Hl)R5sz4Dpy9Vkz7O2kI$Ptf!7XT;#!h$LuRp-%SgK!w=V!37464^-{~;81aSl zhyc%?tc7xmq(dlzJhQjekoJN4n0F%&R}?DmMHw<&ey{1JEI9mv5-U#}19LN~CU0iS z>0u{)zC*SjhvX;ELPnu@0Se){V=a41C(!kwn>(QibQ--f&%D=CnX|3Y_e;%q>tqix z9<~VZ>5i6~y7;q)qCmVd!4u3qFw?W)cL|D)RXo)x8l?-2gpUWsXsH!`Ft94-Ffz8? zvwU@M`6&#ADprbLAIj}Luvn7x^5<%-=(-eX*pkGBX?$`rue%@;q0+}o{b&e%`ylb!JE@EVP z8P^jKmz3XV*#G26pi7 zxl3h~JcIDVd&re;sp%LH{{fRTo5kNlsqEm@Fnn8RN#`K^vV&fI@JmT<_*9k$idKF1 z8~@W2wxd;Z4x9DScydlg+Bl*v$`t0q6oM#yuog&~>Iizk6qAM@05tigH3zq#xr>2v z zJo6^YBHMGPfBbGQA^H;g51WB!(YrRaX6NTLVeBscbeOy7j`mnxJPBInAhUD0fa=Om znOmm#vQ8sSpA>H;Tf!@rB~_y>+z+Q$b#w%<3(6ZLp3UU3eTJ5r~;>O6XXf+muYuBql>#-$+hYq)IjM z$I|R;nCF|Psa{$(J=g4&*702PDYTzB{vamTul{OJuKkH8WUNVDQF%^XadL=niE$4Q z;xA~5S^llg(EETypvEY>VNaRmJEqLNUeNq`+%hgNks;=L$m)?@PG9L5rYjL0v32A- z<$&1NC%%Be%3%i70A2*;P{ZdT0-a$Y;%%)r3iN!Bz7NaEtGPOY_B1d__6AH0PS&NE z6t?<884UYU%(UY_zoV`>=|$Cl2jzHlq)QF})OD%hxfu%EaRLniI_8A%q%$PCcA3246iur4Y%BqsRGeL71=Tj=Cc4eg$#3h&`-@?*w}MiRH z$00|H`CtjV*6A^_Xdeojb#)+!xk^_%SP7ZQ2UwRgFA+->^N4cqB`amVujhB#9k6CF zQd$fx*BerSVbU2$x2IN`8X3KBBgBm6gQQ>liylZAU3U=v>*QdE#3 z40^@}foA-AC4aP58f^$H+rI-4MD%nlCD%L`r4#)RL*H8*vhFX-N%T?{-Yku^3$7ei z5QyZ(0>R`7k)n2BD*>rmEOLYI&P<64Sv__$ZGKBeBDshwD_c4C3)ea+4i3~0$WrO>^o zCo;gOp;3KvJrIora=6+1t!68J_9iFb9kU>g&*GJy_MmF}VE*)haj($X?R6$Dk9V zj_DZv8B|Q(@5G1(Q0uOI+)pi1T?;{*?IdNSD3C)s5s;Y5%;G>!tr5-#PXjr;eMBT7 z5NoShtXU(>Dtz4*hRot}hNFZfE{U}wWYXT0+nvm9lS8s+wTR12mBdJkYat6q7SOL8 zC9D=*0^?0y>}b(V14lvqp`8$?0yOak2xWt&@w-ITp0f3ft{A;q*{vR4T#X*$kdh3V zvYHz}mOG7PxH_ zD-AHEweVLmjCIBvJXZ0O3(d$w_sD4DI4JnS6%cNc=O>BOatpsVQ7xT}nx(lN+rUtD z_42-yRf-B-bZ<}~))^y6Ax03!&*w)KAN(FuMfo2ujdtcu$XX`sA(aLX_y$@g93Nn~ z$y37fe7IqQvAdO@%cw^Nx8moV#M}Z0xEQ#PH`TmwcGp^C;4o|c^D0&s)T|wXwFJMa zt#8wz4r&b#-*PdRztj3wi%rNiwEjwb?+!{j5QSH11)iAwva%eR3-32lBp#;OGPV zvO`R7;Fk(E1Lkx1rGq-Y#3T6C%7RjbUpBq&!7rOa*CK?YDda+OTaF-^Zy~8k=PLH5 zDwfF8ebLiO6blFn;riyiZ^BX8RAatP>5DiQLA@?8;6lf`29t$&8#9P|y!>Zik5#g+ zq-Hm)tJNZFX7L%pl#Nq+07hWwcuhAjQ!fw?N5x3d8J4R9w(zVCQgjZ@bMR^=lEfDZ zM1d-7ZN0h!^#!^;W0-)=0D3Axo4xepVGqhCZqd^(0&lK|EJ^kDiUoNX60ltI9p_5x z_R?`auPx$YeWRfo5Rd81uf^;2dp&Ip&V zfhp^pNVwy6L$syk=@TYaw3h=)4^s|pb4A9YSoqRe63I$*m2jt!!I$W9$ef`ub$eq~p)I0rwF=k} z+9(LG0s>Awojqm+V*Z>fNo05?$ z{WU~Q<)hJ*|A8%6zNaw;l**gl`XnU8t9R9?~<{qo*|4(e3Sc1N6Cv*UtErDdo0w&f^U0g1bP$;Virl>qgsi5!g`paSSegczj8*rhH1R7$!`y?r(&0w zHq*YuY4~LiwY#zUpody4U11p3BPu;mXK^On!+}Fz-A1HHx(Wq{^O-xfAjr3f+Be*_=&eWcOHy_3@#eeMLHNKrTVSt}q`>^hQHE$GP0YQx6^Kq&*;*Md&(e?M&@#aPIC%w65hzM&BA* z#!+FN(-<>;Bn~Dcrwlaw7jJW@otR%c(a-w16O1l6V-~12EP` ziryjX;Bw#82zE!ImrFIci{gW zf8HnKLg%F1{kiZdjgRV2YJtESyMWYp^(WW*oV7p0e2PEI5hbso^A^;fX{e|a_zV`RwY=SnG4v-Ymy^dfb~f)SDYrZQdK0I1 zb5nZrPYWh>=Kw!JQA0qz}|nUVNg+SgI~>*KU6DU#g80kYCyq9ntF zd)M-!6zJr57nkR+_Fok|(@0*D@>OA0enGN(>X*^nZg~esqXesMIp{@V&CUu}BA!$L zKBBdXLr(g2WcroF1_k2?Q|{~Bzclh|q-YQ=>^<~2T#pOCW!loy1IHPYI?9EieLsF? zBG3G}+j7WABZB+Bj@uyq^rv3Keja#0O6& zz?+Q^c6^Hs5Qbx#MA5BY{sF;qdfBL+K}z;ymp8qb3e__n-gkgxl7!X6`xgK)I<^!- zRa!cwMIbt!{@Jf|3b|KXlzkeu9tyX_$MRH*av)bf-UHp%Ge2;7u>JBt9Xw|97b&nB z1#n)W7C;>3qL;JVnHVpHoGtDtkroG{#m%b4`k$c1KItva-BAK}#X1xqd+HgleVr$i z`oN%SMB^&+68`MS>?ny|#mHdaHXQ(wuIwnG0M9u_VjXl3G!eqhD28H}Lv4q%+9sRP zx9AuTF#+g)tkCTObXBe4rG_GI1rDRte5gu%p-WU055w+EKpa}SZ(ATX6n++QU_@!) zbpOy&X|LfUfv^3;OCJerFB(;P-y_K;Ql<<9ZE_V58HF%^lhIPMqIhVjF=g;{U!qD- z0N~2f{g|!N^uu3^bVBRsAk01XPiabU9@*}Hw#y@dZH1%k2DT?J1+MEAu7f{pI)ff)Kwi9WFSfyTo?EhOjyB}6+UBakF6@K^w_ zDSovdLa*pbkBET@;9+cdX`+QLN42<0EdU4|`_gZlmSvzNR?3E#epGK-E}3kp3f@N6 zY}~nVr|*6I2N5E;0sxU6h6zsi%Ss>FRtU=NKndauLBk_P7A`|e6Mq&2z=2eNLrat8 zj2v|td>PF@qWwXU0j0?yApTlK{QEY7_!seKVQojUc^$(cvTkjO68(irL^IU;NY(rK zW7Ip2v4N^VuBbdsBW){xBrCNW$5tFxs;Lruqn3b zl}+z$`gqe9n||7~e^Y34-_4^o&)fXK=Gf*pHme>If{FJvU)UO~hBfdQ%rjCn^Z^@2 z9Wqh1&H z!gBHG07zB;Ql-I!09+8#F&y;8F*!y6x5QE&ixNHN1b}3b0x_(Ah&m=(d8Mnq#O(-x zp;j&0rx8S+(6KMRuD7Mxmcd(Y-ZFQ~BU|3vvULj;jt+nfVz3FW=&<5VpRsvA{X<$o z?wk3>z5{(=2+&#-ij9&u(r?4YbLkF6pCEVZl!0*MLgJRD=R(vTPtS#n&sVuv3?woMTxDD6-EN(kYb1vY z29C@;gHC!siQ&ePiHJQe8A-|X8_CvbnRs-lo@5di@GHQ-NG@5L@{Ll19a}65`Y$gn z6<>MR9tsYLvs~}WvczWZYX1<7P3%amhFb+o@V5M_^)I6_lWs-Cq*Y(}VZQyDVjZ8S zoKcQb1t^2n`!nzdS5N3T6BRXP(-AFev#!q(vHI9dFQ!tD+XEd$lf0FaQ!4n-4+_*EhkvH;d#VRkt z-*C7NDmal<;^Y7lX?bJ^(`wa)wE%^KlHn#5#Y2LZPxU50pbr2Ph%NULZ}Ij-*I8noUzT_YrUcv=j|m2Zx*Xf6 z-tqS9<)7ezqc)XBm{cLZ1@f4}lp_lHQ`?V%DL>?=JD)MVmlZLgGozzu%cL^W| zfLiqm0M~huqBu=e7t5YzV2DRtBcY|ijo(v=szpP+gbdB@8w0mkJXo~|MJZx{qMtMQ zD|&m%iy}p+^G~iruwbi*OZIIO`f5G}z)f_pVzsw4xu7!iR*=Q`p2LtxwnehG zLc6|Jh?WY`1CcAeu@%9}CM#9EptBeA>DcmMvJ1>v&@m!Hww z#lwwa%Dre(gMPPWQ=F}FhqTmPb4^)SK;;Z-uLBi+Cui^2p3No&-wZXc} z!(DK`f3<&&nr^QNPAH15fz%$H(j@Y$)}R2kx8XH~S!;vIFVVRMMszJkfAp0*8DGcX zdEr5UN3>?&fr^8k^7dR@8D=05DMC${k9Kq+RfqTW%FQO!TkT)hU1B`}9@!g){gjo% z_(lrXb>DX&@_vUEvGv^*cSH?mV6Z^XeE#*_AC}TgL!bZl(vm>z_EP3T z63N90VL8f^Sf%##_Tr2KM&fl<o`Rk8bGR6Zn*Slb!L;*rx8u<&mNd zj&=}yBf*5y)u#emx+fO{t9E*)e$EI_Zr)irInb}%yc0J_dYnpEej>k@sq_YwUaQi> zs@%U+`jSeYE!CO+e!Xu@`vyj0{fd5otU_>5k_+YOL(+r^R|H;_`FaqCAO2j3@UYGJY zDqXTfelJw%{Y&Y$&*;3;i#ND@#^dPk(rbK1gXcZQ8?WZ(otxw5?>)i8XD8?8t^I_4 z=jPq4(iR)!w{N4Quk&xv`vi~C3-a;Ma~`AkRiDuna6rz$`5TKPUsrI)F+ zr%FE^F5gG0^fZ-zcb(*~8z$-JH%Qu9rO6TUdz4ChsI>Na$q(KrX+xDB8Y#a|xk*xU zl%zdX`nxK(OQkQW^yHhR-0IPi{zuh+K&5Alk^HxAk@O;!)>G+B^?jU5uU6?zyQkDKbLw+w->6t41akk{QQR%!{^1GQzKUVEk&y)P$=SupOO5amy zsY-vJBj2A>>18T?F(UZ~=1Y2QwWL2(N!m=Mn^boG}xd{WZ&D(&`^{H}RU(zz;K^n&~jtMt(q z<#$k}|55oTy)5~UzohEFCTY_pl6F`v=_9KooublfRQk~elK-MgBP#uUrR0CE(ynXe z_x2AZeM_YyR9Z)+Kdq7P_p7v*N}H?ncZJU_DjlHG=N0^jO6PqnaK@_i?)CEfg)NdU z`a;saDy{fhelH!=n8y`UrPrynkxCyMDBpuuNP6oyN$Z3qZ8urcaSJ5v@)t?(SSabL zKU3;64&CoD`mONhocfUD*FGufR+SdNEWe+9Nzyx3N_yuuNtb>m>2)eSNu{H zea2~*!iRa%XS9ZY@#$cnu?T+2=kWQyU*|D~0B(!VJjNG*@ebf#dlUR6z}*SI;PwR` zV;5jP4d3yy9zLTX>W_qv^#J_9?;87zZ74tLFFxaSq&MFP|7w887>Duyz+{i{%ggXb zk^gTKJ{kPDp@lx<6TtngKT!Ms|7Xa7GB3hiHJIzXN|SJ+%9UmBd5vXbyiYwf?7C|I zk}jBt!gnqS=e+DmdfP9r_Al)cc!K8Y_=Gha`0Hw41AgP6DQ4qxE^&a0dUW-6s)I!h zY{SRyT&xt}3>UUvW3^$G|8lRqAp-OwbGBTWNkv zvA>F6yx1Osk3EaKdNBdpQdzvMJI+2xToA}f03lap#B~N@>u>3Q=kdp6fh4{}t%O@> zPMmBQAMaHyt@QGy)?cisu>Z=kt3-dEaYgeN9;fn7PXE zUVGK5&4aV^ef-EsV`<{AoPGiqLi*$oV&1j2So#am!VF)2=fNbphbY(v$+379* z>TI#EO@kS_MLDZ5NG-NVi+!CfE*H?)8tcmb%tFMKy%p-3k#nu^K{#D%V{uP*Qr(a8 z7ODE#Rc2|#`>}`#;;i|SG1wcu-(BQ#_fMR&K)et*rW5Pm&Nc_wZO+jU2DsW3J`8XY zi*>Q|kUvduM`Egv<8!h0Aqnb{y*k@lwMekxcsQ?iQLvntKNBil!_l~9WCURvIT}}k zXk4VIeTX79ByK~z(VFh6Kk1EbSB-W)rbctXr<6wX(P-z4jh>L!Q`imzL0sYWK#Pdf zDUZQR7mG)57ny06z*CS~pPYgG<7c&hxmYAGNmP387J@27(lfC9Oyq<`C^`d3^5Yk% z9|_^t_ioZg=V|Vz!&^m&16~^kwa&@HqUikWaN6VvoOTX4*;pN2kR8q#1tFSr`M5g*0aFS*)NS$3Y;U5eX@eHD`Pja z3f2)Y`&dEjYGKApbW+1c%t=F=vKdwJ1T3JC>U?kEnBBTXAIwg(K1!u?EX+u)v(W6J z>~LOE`1mb2b_b4tnW-U?#c?|x2|$b$IKW|`KO;nDiU<~M!~X#Paudy4R0~4zzU&!S0KAxbOO+vEfshkxfdqZDR z@sr#Q*@#CAv)62b&Bd{1?wTE~F58_;_wTNtnnmuK(j%5jCby7@2j5g$-%Hh7xvST+ z8~#xbmFW#{p_*;oH3N1{-S6Sv=q?Q;oi&AsqsMkyI>1`x03w)VRG_=5=C|&ex=o0e zpD~GqzGXuOB)(V12%;k2sutmBUXDU|lrE4_AU}ta#eUA(mIm#RMrk4=#jhp3@Mfc% z@=Vex)dP|L*d8|yU2Sp;%h6yuqwc1f``tAiG}c73gd|-d-zNwM-4Jv&>;iDe7^z~` zF03Y&9dd(lAYxgB?gi0CAvi=>Bg1wQBE^1kk@wct+VdKSWU)~1u9*FeHD#DrIi!+0~Qen69gzh4Pc>YRVg6YdzeyS(Uv%d^`5{AVjGbI z#^Gav;cLkFbfWi>Z9EPg6O0Q5Mhn2$Pjtav8+3?Xbfs=LW&-FArSt_8Lg~vwfpJ=4NDMS`Bd_tCb0xFd(=O_}l;T9~id?ld%;g2>>2UR~aC^xq(P_2(+>Rg7`SRFm1 z$9Sn{1@4}?(Xo1VqrmtCx8XQo=D5EvJGV4{@v*vd?gwu3CG+T#`z zOXM3PR*NoeCv?c>iZY*|&}rlr6E_S?Os*3co9kpkhhB9*dURp}>Jv9QO^ykjUj)X# zj7;bpI3`oq^8}{OYdM*0OQU1zSr@V1uTjqks1Ta|#Sx=D^sn75GJ;frH@?kzH(OBb z0m9(&Ib*l`LV(;u)^jhxZ~!j?G%7EKi>qhg#6Zz~vt1KL;XHyy(v%8~o`)uAMJyA4 z1nmxicB!J=9>60M1v`357@*Vz)f%Uiu>!Yz%2@HffO-H{IU{0ij|s7QSY!aDyVr@f zBHghNBkT^+E4&#H)8_F<#FKfP7Q_Y#sMXj5g{Kg759=y)TDj;Hcf%l;fd}=+1jfe% zBNGn?Drjw8&{CCK^YCYZwmBQLOO6TJ*(WinPRj;u&@n-qC(t?&v`q4Kse-njiTp?M zwN9Y@kf&+SvVXaPamWQD?jEWw+CRrbZQ%7l<-;r|z*Z zFhX?Ho0Mjc8zHwLwGeutDHHsXBEXp=sGxo8f|gAf4hXbf1dU94Dzv{UXg?nn zvE?oDIinW zX}jHQWucT}TW@Vnm3E)+5&r3HS!h^+g$4?XBhVSeY+^SyR_-Q#?V)+QwjbuylO?*+ z&@s)j16^4oKsv;=n*!Z#i2DIC_N#mDl6?wf1v=#2gh=RDo`zzUsq4tqPgRTLzNe~1 zW7V{2H!;}VbPY|L_Wn`R(S|%31UarC2$>8TUFAR;A+AL>H8Jr-W

    Ddojk1EmsMP}N-T`4CLP^5lahTCNPD9Rh%@p;#(4ls}*%M_yiPNL0ne zVYlMquqbzQ9q~FQz1ETzXYSDL#yNB{!baVv?p!xIs}Vdh(j=3fKgKI zqZY(gjs8{N?56E#et{eF<8p$uNA}{(X2A6oQ?~SLDO-BlDQt^A<|LN^efo^CO)M~8 zC*=GoN!l7Z_HyJ5#V}CY{BpXiQ;}xvQTZeU=qZo`oo6Y(#>eh#TkXALcT)&b-FkQ? zW5=lF0N-7+*BNw3>23fr??1=^=R^2SHqh!8{UBj*zNDn|KS_YU?F79EvvaEJY{XYlFp(xz` zG^kfJn-)TJ31rrVVHz$c838T z%aNljdO?@lzfZqtOF>>5I(hwww@d z%jv*vIYDUWZ!_JDpeS2*(_(#AGQD|@-aK!96Q?(O;DTq4RN2F_3!*xsj9b8{*IOpd znp`78XDtaJ*fuJ24P0-Vz5!}0n26w!ts!9jaP$C$7j;m05w2?!JawuexYB@YevM&s z*v5S5Xzm}T43|~^Xn&R&f?*A+pi+IaA@hYxh?yukf@fu!m1;ysq&eDf-SOeE%wv^@ zvx}h{Z}`>R7W$ict)P?eeU_ngPmdO(og|}P?uwSZ#cZmb73%{yiPKkCkQO5N!kLm_ zkIolJfzi1GZGdv_@TY0+@EvdmS|i!H1Kk(MH*Mz*bam?yC3w`v9l#ghHag05Vq`L_I2$h{*#z1m&2*)u4+*2K{3HCCP*o%GlBHOOD;UK2W-6rSbJ}5}mv~D?&kjYU%7J}JPz?}-2 zF=cY%vHJqjxpu6b$PB<3iB}2w5^7(w$#XnSkH63p3l3xF%fyw2xjytTy3>%G@1!p^ z{#Rf+x0S&UiPP#DaAlChPOl8Q4;pj|b5cdlE&2G_&}LF)%&^yT0# zxyG3jH5yupSS=553!3*wQgr!`q_N?WHvA-`mdrDrhXkQc zB<15vj90$c{PFE2vDJ=>iAkN;9EN0=W&E`;OJrYx2j49kr{xSu$w#;qe zr6ILPd84T?Zc2A#=c|JeS#-sCeWSY&S1_lyHtaC6^Je{^tR4w!ESACA=e7J@KRypq zLt-9FCxnJG%DB=sDEklx>!t}!UaooBYk$-TYU~4o2q6?pJZczO&UDHp_QB+ciad^r zW_$JQxZqnA*x7=gU?7D!a|f`z*$G>Nyt1_>Vp-PV>hCa}!}=plsL(tr+do>!1n518 z$7XH(#9{2(89mKBDnqv*7G>1PHa4T4Mb02z1`HHO2vaOx2D}wnO2It~<6|-}@mzXG zEViOp3SW#<6%&aqW6&>vKQqq!qLlbY{O9c>@j9%*dY&CioXzl*RsOE!bhkWXHYRi!79WojL)Je! z8Ro;5uc;Jd9^D|6zR7_C*Zf^SCGK^@uT;5M4NgFq8&xc{Rur}xas^D-lPi z4B^qFhXcRSI=@u2ER&DhP!g8F^HwAbC!S*Ra(FwJCI5T`{7i?}k0WM{IMX@e1kod7 zt_H(Wbj285eCIQ+#-a&ZLlel9RI5$ucD6a|&q>Bokcf|1JOSl_om_$RcP%7>M>84N zceX&v-hk^G_WKS88>7y%NM-kT%>c%W8PA$vu<#M-;-)SR!`vheGz`VL zh$+rQt6UX^=1jiKmU(oDFuDOZgN9NtSGj{Hg`JaDQq*5EY0k)F*^fbwHBe&kU?egt z1e3VSiRlB+20OMC8@ky~L+0RfTb!Io`OXMrN9WZB_*4 z4vV6^{atbz*0(e>5)!Y{8FG>nnD{W}kgleBo(9U)iWJA+*f2(hD3rW5xd#Wu|7hqV z8^8yQ6zx5%9Vjk<4JD?>N%I60FJ^BR;Eju}TJY;61_k?_>2K8s-^M+6% zu?sH+a%WV`mLi4mB4fq!9)W*XmkxzJ@*cTl@)6seZMop|2;97;kqmYW({yxi1PalY zSTy2NRX(DcTh6tw$WI7Sq=z2b9Z9**M28YQoZ((Qesa81HBWIa-Q(N#T@(OHhf%jl z6?y!2A`9zcK|tFY8d9ZI;77=2d{~QgXpy5@w$Pv8Ww8XtHRb}c7 zk6WSq$8;HoziXmimZ!JFv3)Iq1k0!C2>O+ZE(WHLW%MHKD4lp%L-1Z4Fy-e1=#BoV8cE>*4+C zbzqlMcB{`frVgGscw*bVWt!4(OKR&wx2CopQW|bfDG#kr8DE=HN<#==Z%U~sr8GqF zFA^FzT%T&)aZAdy?aKGYTxhoBp{=Ifo?PaZZh7_MX+{{315n6W+@zK-ElL7IFXgE`tJzg1vMmIB(^v~Gu;J5GpBK@7Je6s z-(d0GMWFESIN2vx;(DivsPlW7fAy z_4(1gAO=kPJWnG4v43xOnBM>JXxuNx2H600v2jg>Rw>szYhM_wkR!+4Zy-iVCH%(4L&*t zMl~KIY~8T|SYfi54FlCxRDTJVs+ymhTP@PZ%9R+Wao&t zp%KQwtW55DTp`DpoG_-IzYomnUK~`lvaXBi5;@|9Q7mgr(#`Z&i2jPuU)R%LAet!V z3drasRS7@q{h%mMUpYP@7ixU!W>d;sv zj$eJbPw*h(q12-Xd(jFv)^@h-J42Nqj>7Ix9ODpoC`yiPawnt;yAUTm3?F(Q*EE(m zpF|CW4u0!Bjmn*_Xz&z|(08TSs~dgo6^Zt7rXGPly!g*8$R_5K zBDmDcXY_zNi(Rbz#6#mOpz_+6c-Ma_deWyJX)mANUV)75pkjxV*kCFr)-Z=ggGGjj z{MsU<4_jL4i};{bQgpbrHF#;Nixac6L8*VWwuPYFzMt~Lr%{n(i+r<@S7ZHBD~r&Z z;-$gUwPWj%!nZpD-xXwBw*?cE(6`Bnt^O?S)fXWH8TBna!a>@r|6%Q4qrKZ7qU`nQ zaj^N@gZWETq-<|n=0zfOD3s){dv-hn~Ukz5+@5oPke1`b6moG z2r+lTxZ=dadCg3r+$MLCYKfa}aM=#A0-rRl7_8PFZIMlY8LWu3IVADQhl=S8e*r%6 zd0ZJ~?efExuEb1ilZeyaj45(oQ{o?xZ`^b$H1P9su8s+4iv0FUP(rCe399^d!i76**|@qfF5o2bUTPR^ijnORu;vtUSeJb` z5?F)Rbq<7KG4}7f5^gP^UKY^u0!@|9K%*PTO{KET8M~+zD&+ukMivp>8N(@FTMRy? zEnZ$0+s!uN3l;gT3J1A-ZqEmP6R(`l(vo|izH=P1mXL7&LEGqscob^_6gJ@ajTH%k z+Kw65iD6=+{I&@p_X8oxqGlowE%LU0C&^0a&OaHGSZb%ber*o}QwzP|1#jAEs~_YX zF!Mw<%nZ2pbVT5G7CRosGd!3tGqJ4`J~OeW3dIra#Do;P>BYM{KhcZ~oc6n261VwA z)0zNj}Rsdh&Anh;xx1g4VC&(tugVM|+{CCl2@OR7M%DN9{bVxFDC5 zZo}H(Dpx-v&*bPcD`nzf!0W0RM0SU_+4|vFN_3MHeKM*=u6ZpGYq$_rpYg}=1VKc&n z66)D3bzm&9I^XqjA*<$0z%w*1`?U3PB7!w!W0B0-#3o9c7CD~`C=`)6t09d zX_=Xt5d3bpYtL^=2U>36dxZC^V-x%|9Yu+kPmiRXg&|3suxXPFb{s-4fWZ-<>TTvxhYbWL#2aj$eg;C|A5$lc|B z&uy>Q=g#-+_U!eX^UU(z@7?Zw%X{2ABX3jQk-S6BX}*~6jE`z88S~-^L~?NFk|ZG(ZS%<`Qabo~R#{@rdhQZ6JTlti$sW+~Bu`9|$VD;3i z$0!de!M9ZTkQ#jJC(e65AT@Wq#IL#JPcA9(-&$slf%I%9e{NPl*%$`EnGWA^y4YDr zef4{W+duL#>F(vp-w`m=<2Un7Cj029=);eTL$o@>8wO@{-lvm21O5a7$L)pev~O16 z*|248VrTk7j$!mxx2xGqQ}+To+DUQ@1EAiw#NU6LV<764%N&7d>6$W05Gk%Z6tf|d zEM9}7+!-6n?xN(nDFQ={({87-QN;e731bg4c9t`*I}Us;p`A?yfXD=5J1_Mo4!VnmmB-n#%yhq zJJOV#eaf9mb9zZl~|`k8GsnU`#|W2h*!Jtl4x$M$?oc%>>NvhXSpK}x#p2pdYwLCThH%FlKhs98b}l*EM| z=9(X-Nr@>EPi6e?8c${1snHQcS7NW0pftu5gOR;UImYpOT$E}FZiCs#x;i?{$F$xP zg_8NaU*eVE{{)I?_#aIXBTWEee#};JiA>h>8ake&nR}y=x3-BPX)7U2CPe zLDunLf1QI3oU!qp{j^RzQpU#PD0Q89-PKkMj9i6Jn;V=DXK{!Pl@GJv z2jatpg=CG3_#j;nU*O38-Bng(50l)u-hTFtvxi21<*XXbF6!4eeWWHQ`5m)*BnDZ% zAL;UX@9Sd5N9a;C9fcUk4jc{t!06Lb&sr97c*{sxVHzCic%rYv)|uB;vG`4s zf(T2&rsEv{niV4>VgNi=j$*hG!8u06fF{O@A0oxc=+Ekm(Hz4^*2}xD94V%^)%B{~ zrFnW(X*;g&M$F)SB4+RviW&Un4#d3YN%Tql)4r&4q;y2v_lRmlsA%G+UmfWn1hBl( z?boM9rC;gQH(H*v{!DTLoMqf{K`i`eILlmecL}m{A!23Us5*Xr^+#f+#Rg8mw8=9< zCP9uw4t#W#Uao}bKAN%ioEuJyBPb2l_Q;bn?gTQs#H5bmmhA6^wLgRBHz}%PsGe;-)+hs zW5Lxx9${!j>BwD)HrLEZU5OUYr?szxaNn#b;0|%!q3T$kGo9w@`!w+>F=NB_zUyh{ zMzE(^z6gGeF%ruIK|elnZS0?x{cpf%F~cZB?MIH$8DKeWp?G4Ob6qs^@6S)DD z5K>w7kbCucL86&6F1TF3kxqD!QH~9=kc7N0uXY0FRD$jU@6AItiE&cgYa9=l; zhIAnLC*V9}c8_#6Wfj_;=`35qeW{fMMx=|GWavmOJsxx^`j&mvnU&|X+BA9Yg*j4g zJB;Q?7t9gRMy4Q|PgUwCLWfBnV)OjgBu|^{RgsR+CwU_1!Ci%hjk8m zp)7*S#MF)kogDnMl}R2mUD7e2Jg>k=cX-p_cwPbI#jwX@!|DB3dfE&m8?d^= zrwhMwxqJpxI9@6b_Ix}Wa(4~frH`lauTTF!3Uun3E&jk1SZbj_A5kDE_G55fWT3#0 zr}6fwRtg-RT{MbX&P6;iun6-1c$VQSQ!Z#Ed_0u!i^&%>5DQcpU7{U35Vs;p6eE|5NE`AYt^wXTG>7@Ws&$DtUP#AE~z3OSuN!o|s#@FQ3wl z|5$v{t+!FM5%D4Zvj}McU&}+eS8Y65vDVKkwU?nC>vyGv1EC z3wiQ+Uu}y`Dwt~XY;n@qg+rhUvUnzbIx0T9 zKy-x$6DA;0ekl5trPURq)9UDNc)6uzPMj7^?C@LH#xQ4L^gB4;!#j9>thIv|wzL*~ zO-C(^bmKlPWj=xgFru%*?L3Nj{YdhfB2Nv!8dASOjoZmpGDdT_85T_b>WqeLzps zEokhTh%~$>)31zyi447oyYpiWGnP3MVI59d^SqFSC|5N*r}8OyVT>5?C{Mx7d7MZ6 z@ff=2;-hKfHb1pdn0Ox-uYc5S{6J3uHM)2bh!N=+c%CvWs?5-@uI)8^vlNm%NXKlrd7Mz7azbW}Kzd+Z< zDZXQCmWSC7)_9J&4{hzt^$H|@f;h=uUwa8L^FQ^lOAq!q>Cu_E$s>lMGuLLbv{>cY zi>#C1*U>t9=}1J-QpcEziRhHh&b7sx=#H?BWw8Zr`rwn*1LAgyrMOiA;jG0(W%*KI zsn_j+`xUn+d|Oi@ZzJ0!ABF*8O&$ZCsCWN?hR`_VAtc^(>7&p+K1+Oj6fdN|=oot4 z%f7_cJ1Qn7V(HJKqL|dt<$^Jtlg|~+8U82A0<6lfs=?O=S#6nFm40YQPZ5^|P_8^f zk;#X{CFw(cLI0z1#H~Y5u8X5PQ%z@tikN z)g@~$U$S)OvhfwJ(}ZuT!r3!F4Oww_bPb zx<33{`puQ=BlwU0{Pj0~{muVizaP2&gX?d&Vc!jxh5ADo{LN=?`t41pZz}rMo8PLx z`H`FBH-Glq1DF5pxB0y?xK$>4vdDfzk@dddT-FCm1aG_FH}~bxs|3$!ks>YPXE}`Z zcn5Z4*%_%dr;ZMa@ia9lm~q^lcIHAcHyDVb~WUHZ4^;v;q0St z4dD`Cc5&H&P$uOHrC9d}{_cifnUfBycxLnDt`2IEQY|up-FzL-V|QLX>L3SpVQUDN ztM;kElmKEvl{?oC;IdxsKWq&lCmFj^Y$#yb^4`}daki!nSU;;y)0XEFiMKIJQjHfU z%#*HW+~^8$P&`kIE~)RBI#oFM*boW+selr84%ne=)2qrpHE2xj04SL-c$`Id0ED&t0CpJ^aju@hb43ggk!QiX>Sj^{ZNe<8)ULgMu6Xf}-L*VxQtm$CX3nU-%qDA|z3 zZsw+(^;i-GathwW#mIPV8KWzal#=f?$D2N~UM8xw_yZpq^z00324^Qh%I*ZE*)7OK7Ez*pTgdRTEx7E(J7IkKt zk?Y&w<;t8V;Y<(AXda>y)X}V-QITrUc`%G7^ z1B6eDc&lOyS%1CJx|A07p(i1NHn)ZS)66urkwMMR1hqQd+3^8&Mfyf`4?0_D?yK4z zP36~kqUhi2COzNH^~NU|LTD(lLfqsH<&k80VSJK-JOfF5Jh%h97nhzroxLWd8Q#

    $t0ZxL>EC3cM^3jYi3-zl#CeQ{&smCRIOM=iq$T%^UY<6>iA2e0v zUe#Q0P-BQwaB?;ueQT&sll$1M;OX1kZFpekIinlSIHI8*so+rU@_Jg0OH?^u4HiZ> zY>>K21A9j6TflYo~)29r?;(fdKz8 zaT{-cHgH-Eo*4?pjI#5f&mWeS1`BJ))_a!9`4Q-Bg&38B{|5`_wkUE6xKd?mfnWT> z=O++?Qi23>}1SwmmK#@-=!EWC9xU`b-5LG^<2D>v%>bfc| z279x%9;_o@s*!nDXh{IE_TFaclOp$sPVw%rzL@!?X->{}`E+Z@2mKyo+!`umKYCzXvLC&SHrQYBFM?b2fdRwY4g<}n+pg#qRa3-8 z-o1E&St*`Q8=Rmlh{oovmn!Zcx6{@6-0hTK(5$-}=|*_mVup)sZ=K%eeM)jjiAxHa zV_y)D@c&LIh_&D;QJCH#6m^UX)_vqPUf@8X|H`*Rwv~E}O6|*5s>O>^f77p2tl5e8 z(f;ojxbXh}@BhA&I(~Kk_s#iuzqH?bYhUTfLwCosACuS^sh+D}y;viSDmlhJ_SpC7 z{hR&YZ>0A>AA{TGU(+wSG%jj3bA!JG@w}!6UpLln27+a=B#7ydYQI{a7udW)nz3n> zy{cz0Gk#r_zw5H|%pD&~jk$F?r}R8SSaC`R?I%x)ak4Am)k-k$PO$qiL_U%Pc^<9n zbcDT}nrw8&q>q7S!fxy)w3c{=Z4bs~0Kt|UsToNpnticOLfQSk*b*XvdwA(LFzv}V z;Jc`*ignQMR{IPXO)(m6Mj;FMO01gd;=}@9+(&L628p1W3#sD*>K)FxuS_`|-RFzG zEd{S)_Z2Df2_@K-Zrf7h>sZ=%A}3;WX4{iTh8~bW z2XHw=6HR~sAtP6EDukZ~wRv4|GP;O;s)r)%L>yw8fUIL4G7&8NkQ2cST7wtmWv9{P z`60LQ`Z?alO&&pL*<1OGp|^6YXr;xSb1Tz_-ilMSG9%rJjpnWM0Zv;vBk_`lQ*9?` zEiv}ItwyZbhu44O$wJL7v?RiMDO!zbj|>Nh4FvuQ?zKv>OHE{QwfYNAS8P$Nr1dvn z>;&>P&76`tr-7nY0!58eXI4hE4kGr18tgI(4yu!Zimz}^osoFP&AUwPL#M5r)V?Tm zs=cDAB|w9qH#6|&UG}Em5Y%5VKD|voMTh*}Ev>?f*;rNhX953b3IAs$Ej6z+y)>~L zTKXGQ`mKHp7)#pUbxm)y)&B^;l(=BO$xF(y!q5bqf_vmAPP+_P{MuqD8vd^F1S0Wk z7ie2=iGOuU$xc4n^a7`eSjQwWFXAEqZ=3~y9=XF&;~^)l6Fyo?>x_5dyVL%iP=*(uMSRVEo3cL3P0m z8{+UBd#zI$ad}Jy!DXYc-!qMIHpVaq-!qMI0lqI(_X#>u zVtt)*wu+nvEnnf zTOcJ~%vNTcl-PbAH$xVQ-EXmUp|bK$Fe*?hVU6`#UO---v%HuDm307>6DDKgB8Qy^ zu@%FKv_wi=biNs~DDlqOJyM5sLOLZ)a9r-V$#JKn+3}>K#nJ01a?W1h zIREl|-nUTxz3kWVe3RbqY@PPJM0VuC-uvZLboq0*4%GKp*YqWDiC^0&rylQ`o^<=W zBt427SG^W^ol?z7tatd1wZ)PYo9fgiKqT_zy^Ah`Ep>vzVlj!mC*{m9p+K7#&?Q5^ z=UfvyKDIdm<=%~D;ru{(>83LH!S?C-JVo4w&N>k4p;X?4WpT5h)gm&)i#<*Iz-njW zM|Zz_wwCeJX+K)Ok6<@QhUDTr&q_i=YV+)?@(N&xvnf0Nm3wyE@1_hZ)DX z+vL>ZncO{MV3Eszct!%Q%0k-KD3snj7I0PjIUY?nHK|)_fQ*MDWs3Z+5%yJ7=Ok$_nAlmVS(T5f!A?`xv+keR_is6}1}2&4it*ub zY;Q5_L(@Hw=>r}zbr7NbO8`{ObH%WI}ZMq2N|ea9+05DkW(#Mcg#(LKh6e! z%o7F*j!R)L_%_@3Rl9dPA(wlrVy`1@jVe!or>Ow0N?`6U9LbxS3wmm%@+o!6CrW}{ zWP>oT)pPkQN=u6%sGwJioWYI5=5huW2bg-WwpUyc#Q(zW)a#H>N9DtgXz&Pv5Z(pd zPI_c%@CY1DD;)K{rSf5%uUzEdUnbBcUM~4?N$`jPe=wZuO34Y>Y8(V8ta|ZqKpa)f zq>)RbL~Hr^W{%+@ z;FeED;%`z)T?aYPZcO{0ipU>i-4f3pw_sYK;=;+vz~NNk=yD$HJa{Pe%W&_Y7_q~M z)-QC`+{8U&FE}NFaqL_M2z>c(4Rya9IUPOVzCCYihes-E>WIpHAexk3&y;RZ0OtjuB-FWGzg&((fC2{6+Qh2 zf-MU@fbC_yZ)H9&d(e8NEOQW=$NjVmh9Qw_M)`;z>888Y>b@In^S=@gr+Xk5=9yU zTS;)Id#(L!AsypDGumSMwRnL?=Yli|YGpB4Hbr81uO=o-Y&G_b>nN~XC;)YXBUHr; zB*B7(^ndOt0DJC953l0yS`Wjsh<|IlZ;prVf+tv_bXw=kQCCQF4!bAgi0yUTeY4QNK=kQ=#}SA=I@=?K^e8O02?y^YSWW&>wsH=Qvk05b{g7?Nhrs>P%W+`F#OTcwV6V!P%a0K;0LJzBtF@s2K;6x|&eu?`m*> zB=}yXzw0v^)N0dua0dy;{;vOk(I>}5I$pL3I9#mci4PZCwx0%BJl zejGBBz_@`YFMt08z5fwb!j@*zXdf_Xv;&A@lQwHf-kOdc*7^{?-PD0K>*^M0C3RDtVA7z1sFUh&VF22nY1rl6*nWE@guf7 z?9G*eIN_>TD&STFk`verkV+JVUomj1a}KbqAJ7k14Mh1lcX*LbP;1YCM3RBD-8`s? zXJ3=T-dig7gaKQ2aja0H(^Qy8po6_3QVr-?vSEy8mWnO}#2Vtp=ab*Hb60!5ATbGmT+4$O5QU+qGe6%#u1vBlzLuQ5yUDstnWoxfXBJGO0cON@O8?OLeE zJ9kSfA9w6s$sy`9!d(n4y}MjK!J=W91JY5aCZJP5{L)<2MX5W znLD2`2K@|p!x`YdsKQ5Em>V5@3)5W!4t~bpHK7lENo<9AK!q~$QvR6;R% z{3|B2{8}>0^@W!BtkxXgkLVBmOoPA=x;gr`Pg#s zbL?9xG90i%{fJRambF*WlYX+%sJR0Eg>ei1lUwv;j#ygW8an-Qq%WD@tVDXZhR(fQ zgAP-OO1T^H_}4gVW^CO80I=$t}ga`=}v1eRY;9L>>4+RH9E8`f+ zxmZo)Z}4|rLCP2OD@!1ozw4Xynp1)R_`2XVzTnP15>6$6*OWPSz95!b?=wYE&F^;-m-ZR{N0i|4GvCv z*^8I%W%I&5&AUfR{2M$+_+qV=-%@jI+2u8pw?kR?gCoXXEoEvUCl<8DlUiZRZr7z{ zfn9UT;wyNFTQkCvXddoaae26k;I~q%_pFe@m+;}#9ZMh)jqc zZ=k%gFpR&e{WX5?)l8-@A4{jTybugFK0zmD>=B4uh{E}#MY^rBllO~^Dmpi#n^gX; z`E>3aUaqh4N`!0eXV20>`rT4&0IP@!C|h=uR*h27s61hr^ZVF(c97CdEX52A`vKa| zo*M+%a|G;p=E&z#)MR7)90ni7nPJbsDT#=_3GlOW{{~M5p!Zhji<~bESi<7OWl}#q zlzuITp;1E{Anu}@qT;qNWKZR#(`WAQ$M%F++y^8ILnz{xTjiq1=?DH?a(7Aa^gK9O z4@36TX+73BzpQ}M8gcqm!Oa__Jb>?OuI@aZ4^rVw5+4P2k`nQ*QtR6Oq zm%!Z0OA#md$QSp|-T#71db5{)P}CzG2T48hf)6UI`s!}Sq0ZJ&ap3+u1G-OlB#8YC z?Puf~_!(RS7HVcuwA{$&rJXCnMa`Lp!voR4m6V%;iUft=VY&}A5v!fnP&4{?@0^e|KR(z~L%`)u&yIgG}jPWXQ;yKM$i($q;Vx=e)x zyGiS(zOL9ipfHt}=Ks`ezvMch$gXV+jV9;?U{?OM|}fHYFmW zH%uM+4(XOQuJ7-o&1%%_rx%ds!!1XW=tKv!xVSzYARJ&AuEfn6)+Sp6*frJX2YxM|ba#56 z5X_!l)Q;imebO(q|Fa#~(>;4wDB#$Ev~0zwl?%`=E%XXa3wxsHw3_QVKDh_tMqj@Q zv*DANU0pq{mjIb6e9Kahu6#lCW#rvF0+B;gcyT z9HaJ%SvI^yO{U8p!Y=3MabU?BLO&<~u4eINbp}pJwyctf6Sl$_p!X&ZoH5El+X|@m zO)IvwwuxgiqpRtRU<-^sxuVZ?F)~Wc>YQl2ZZIDNmo)MJa#f|BoXppUI2h^Cs;jSB zH_gl4NH`ADQ58Rp6*-TbRnu0{($AZI-5-DR8$bM&L>ojM%nSdjQv&}9R!>9Ju!LAZ zFu~gRC7;{pvwh?$Y*8tD*e+KYySSY#`*je;ohe zz5g=$al@-#!Wg>WxYm2me~#L}`ji1Ob{{4dtNqnk)cWR=Wsd4#`%>B8Ugp2T(Y|O$Zwe=D?5{lxa9qCHv2IJ)$)9rId$KDe_P&4X5zCoBx)1 z4zVIuW~Qb*G)v=UB>Z-Y-*2J(+o`sOH5!on{2J}xiMD$uYm(H~Fo)jYz52?*PS?JJ zoodq@?cjg9_PJhG8s124edtiCb;lbi9QJ?KC5c~ME=fbZ=-xS+v+frfDo6LO(Oh*u zYHKJ3w6=yxnx8LeTn;($*V8B=Kci`F4KrBb@3Oyd!{2b~G|bkN z26!Exe>W=Od0^ScRO{+C! zhs=s74M%X0Xou1eL5p2bNZaJM^l|eMxDuP)>hl=&iRhkNHHtYYL*Rp(4PeoZWi*mf zOvOq}g+Lc8eDH*N?-EUY;BxeM0eZGjYhQ#PrupBEkwdysAQasNfY{+z?M0rl7uj*8 z#^%3#$7`7X2F(AW1`tYF6W*6K>Ax1queO)1eYJf_6H2kaF5hQrc#{q4R zI#LBKwUmbmOJCFY=#^DR_z$(ABc-frM9ZK--ZChb)jZpw;Nw7bo1=R>Qc|s#D#QJT zzt48)aPLWz3%p=0IOP9;($I;29#rJFRs2%0ha^a~XP-e;TXzat>gIvasQNTUSVUy1+yMPl1q_67u!lYT;l<<) zDD1)l=tOrFdAGStk0`?`v?RaC>6cNh8fm}^T6GGb`L8oh{TC@Q{M}ya_IKGLyDh!c zbdoDRFG%jLMya+y;C)qN()dZJo}ZqYM!m>AN<*P|+jj5GfUBZZIo{Qk@gi;aUPnX5 z+k>5i9sYJMN+|dGMNRrjZ;}g*Is~cER%gDYP9f?rsH>h3y#aV-)iIjg#AkHSXhdnq zPe0v^r*+~KvDl`bf?QmF_cwHoY(xB;ydr=4yy?@XsJ++f>RAv7IpxJc=4ai&wtv}4zC zrcQ_I3<6=1S}bU*sI6Mu60cf{HbKPX`#gtw_B_?Y^jRaMjd681x>rQ@`^x8t;=6xJ&hx*TYM z5jiT*6I9n)ZE%zC04(m`BUsq`b+dut&TwBnRPJwH3c2L z79;jEHe%Tbr@lVou^rIRa$q#m*H4<7p732f1zXDR8;FOf60Um_=fci(&64LvgzD_ zC_IvZCNtIBU>Sv1vcIg!;vqk*gkj%?bvajOIsx_`%d`RTuL5`~7{_e>h}3}-_Z0kK zBU{#Qul>eH^ujB=y>Lm(K{!Yb@#hi|A;5dT9x11t2k|uWwHpve5aWU%)Ci71uo{G81PI3<2)X3y>PSc_A!V>o$GRSnju(Bf zJinPN&x>v(DvIZ7RHQcG|MVj0v>qQb9lScrVBtL|^rG+T!l~t~Lk0*m)?4V$pLyH| zKpqTj&>%3SCBee3?iA{c4A6V-35v?;=TnEC1(fG))7xUxRE4Uxn4SGoBlr|ojbh&U;WOS7WbW~DZcGZT7MPA}r(o$Y--E1?mI&w?A?j zPpzqL$zB-X#_U|^8`Wi(Quq@NCk@Voz_>-Q$2v%t?gzfOb5ycV_ z6iSj^l{}LIRG_CHhvq3KK2p<BNi$PRnNszEm{>Od=+GxeO*JcM7UsXBBkng23AZ@V}V>{~z^ z6na!;v&tJ8CkuKM?3eY7E*Fj@%t|E#!q2>D)=-Fu84rCJ9N$e8XOy6>Pb|Qks;n3a z5TuqN{QO9$?Nagh(<`Sx#=j$>e@-uRsQ}KP5jIXxU1p6SsSn1(X#HQ-wZY!^Jl`$w z)|C=s$u~xHKrR(;*Ybrzd}*c%I@}FXC*`l$-EikW!FAPr+#8)1e@`GOse~6h-Ea+*mT*R6{?+S-J(9wNqR8u{|!8Fb4 ziRVW|ST2%r%dvPqlgv-DdiX3M7{# zp=wC~PoYZMMuahR&`Xv+DW^Zd;u)XQ3${S{?MEX6qyHc4TI+twuhK54AU!HT7 zSg&eoEEHjaoab@>Ed~a?0a4=^20nESGwbcn3O-W(0ur46kC=IiF!SL6;=s2JR?PpZ5gUxBJRdGw z;5~=7iYQ2Ns(!Kt(`t*If#L#dFhmJTz~CZmxj3*VFcntX?L@7z)oDrP2Ks1{vJ0w2 zUA%3PK1O!25Iph<<_9^6-KEXlf^G6;Wm=5zXn3n$Sn9Hq+%wzRo(aJp({3}=m5d`jm8~(dYAZzYLcA_h4{jyc!0ttUmU|IY z>23>pK_Yiw)CTNaIW?RryJ{cv@TF?ZhoT&6ob?|2^}t08#@Qa}@WlHlE)S8=ab-fW8aVBqQFz#HquYCZTByDJ@j(44&c% zIal>~O)@P$P^RmbHt>cBtTe7$gZEPPE%Qz zDnmR<>4X4L$;cWw0Yf@T3oRHd0R7;6UY~vKk%KC~Xds}3S^)y^TBsQy2x)FeMI^Lg zsHb?BBOkq(I1HuGi-t^{Rfoy^Dd|2_O4I|E6HufRtYHuc>R<$JFVS$;U6^^4$qzM7 z|A_d;Xhu}9E&?i30U6ftVU4rB&@E`B=7D*NikH_JoMH&7@8btHXjM)w==(W8_zR=# z>HD>y1zl4hcCFs8#fic?+BJp~LtM|oUj$L!qh=8bt5&haZAUkkk}nkN(0zB59{2ej z`M#t&Na8juGB1W5YE^9t!*`Ms-!3&gAK9s`KBP?*j^JL2>LXg1Pli++s)pu0bXPl* z>hQF1p(E1>@*76;)hcd7CSR@RLQGt>z?FAKJIgzv&z>bD9j=Hvq;-99qhW7(eZ@iL zRH0X>3|%%=l1Vw3eB9gM_lwZeeS_6kD(cM%u2Ta9`WPiA(|5?5!z!$-+={yK;3}SL zKdW!Hc-qie>n+~2DWX0tUKE-wy}M;&v!!o$v*pr!yv;AqxwwIJYI~xZ&@~~_N|ki4 zMp`aNAhOr$qnG>hdsg;GXXgay55nS@>}-@n6xl(WRpcSf%&mpzrg}b-lSNP#%1RF{61LhAiaaYm zf>gY9G)`Ja!l|(u-l89wV{EaQ$+V2Nw%`#g03HWU$_^DCQha5e0?!7QD5wEo^6gO3 z2&>(ns0LQsKwhIYW*9~)rwAjR;ap9ZX!nXDwZMTDskEhA@PueYvZ&@c+my=?0K456NbG?F^`P0xHsj%k-X1JT(A8kR`X>2?q-XU;ug^yy!voqFZUeVR zQMsa#s#1{=csKe$FXbDVKrgG$k&hEFS&3>m@d-LCTOU{QfDNT|!oa0CRgC2}F_IMM|h(s4A9I^Yig z%)dgJhBp5y!iBP3O|^ho{fyro%Ca^_L$g|M<+BJ5j;XX_HfLcyA16a`abWLOHwQQG z8&_*^>R_7&n^|Lmc2*kb%FvDlSx%rzkb4axV|Q=@C^{pCy=(PA{WlayR1%{mrVne2 zg8LKLRzrBnRANcZBcXo$J|!oM3v5F@1Vb%8F6DQ#4i*Jic$jmMZn2I zRu61I%JW@KMQ6ZkLRZ|LSzcFuDAi}}PHnKBt;lyd5D$-#Sv}A(F*cvj-I6=d53pEfab*I9Q(#RuqZfCaxx%w@ZT^m5Ouw zvQ$_cEE+lx@Gi;JxrwS$+9YM254PYU4(|V<5$EMu45t*O-hok}B8H+7(Pe`*#60n% zx|Z{A+-T_?o70C5ctdUJjmYU6f(enti#dzoEzjv2IOdW%GWb37umg~bmH-hHL?$9| zN^nvEg45)~3LE6mbW=v=FZZUpAx>!5hsfbLYfp0VKxT|m5 zLNF~8uxq#Xf5wHS9xPNzyF0$4Pm&*;+z(zuXu`oF<7?%0Y8b1@-vW}d(UGPHbeFf? z1g_&DN0x6Jv|47IC~M9xtIsZL%Fd>U)I)h^|wjzu~tOXXOkcjOu?4oR-0y4_5z20D0r z22x8UDrvPwLfW&^BAp|PlaMq^CEZ-H%D6i!uW|uu5e2^oXUEk1N(-UN3|3*9N!VgA z5@bvh2fSF~FFIe94+afW@wA3w6>^tym6eqVb@DTnl{F&Vj`o!2UsTXRVeFArPd|>Z zKyrhnTf8O69A^wsW?FHcFzziz?tq7L7W_GTdOfca!Id}*TcDcNfO;NY8iwV>ahT<+ zor~I>Q%NVISKiA`fKg33!nWJN^>x1(!g@DnX%YlH&_`Sw?mZyo2;NTbp@|$gS~^D# ziZBKv^aBw_M~)s{7fE}SMVGYK`-6nLAO!sElhZ5ljPM+A-GmOg;~=oB({R{&5wYD# zdr1kBZFfZXLHl#Hwg8?+gd(;5JfE~zYBu;qt@jWV2oG^9*xdSD$5Aa&4z@)@CorFx zX94%2WCUGzngb~MQKOpu9#?lL5y-PN_dhl)3^!n0-K=p#n#CH`khB;6Y%=A0{&mx? z*)Rh&Oh~Zk$HTX;MHru>1DIgzR;?JQCpHU4s_DQ*f*LUO41$2cxfr&f4j34dTAVec zEM1ii2sSiH?anUkXL|0!JFD^os=jSATia$IY)dKjwaqDe)IWv0y~EXh zLVxT{Kn^6y9-83IynzVg(#1KsZ8Iq+hz{EqM&N1N%qRNWQj0I*7u3r|DaW%a|2}HT z?(GFS_p6EYou9bUr{sq}JO%#A6?VH0lm{pH$!Bj_BCJ zTR)e1WHgBh$Z$Pkw<{UWUX|hSK!&~Y>ygop^b@@LKxW5jh~*F1x_k*;Qe*WgzC6kW zYdiJjNNuuXZgP39%I?%OC7{IieW-adRb5sm)xAHY{-73~D@cJB{sjz*Tl*Hg zo-x@cUFkU4aZ=qB8J)W`lyf~ceUz%C_uW%)I>J1R=A zxpY>02xtk0�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 literal 0 HcmV?d00001 diff --git a/bin/dos/286/old/int.exe b/bin/dos/286/old/int.exe new file mode 100644 index 0000000000000000000000000000000000000000..77080bfb7cf18d2da8a2796ce249de304744fa78 GIT binary patch literal 82779 zcmeFa4R}=5wLg4j&diy~%rF@u1cW#w2&odJ3KEbZ2}L@gl+y6gfM3DdR;|~o7G{FI z7n0Cv!O2Mwt(VfM)EH~M*6RgJb--Q-5EFsM^3iHUOOX$qaVR3vB!oEU{jGhzCkbNj z|9zkLdEOTum~-~W+H0@9_S$Q&z4kiay7e~8vmD3eaXc?czF{?Z&f?ZzF&e)X?xJtm zeR%l)|NMW30vESGnKdDrz09)p`u03=f|V2fCU$I-s`FPDO`Q_HGGF|TwWg;i?5p|kZxV{tq;3h@=;7SUCuZK9Kh++7 zyQaOS>)ojLhuk(RclbnPk8kyfvr^RmubfxPe#l#QsNiF<_|Jn@OPpo7V<%^c;$@5N z@F%5#PnPqE*EsQS{E?{t$3SKk*Z3e;(6O$0>zu{yc}ov}wC<4jQNunP$2GiZ=eSAD z6V?gKEIaQUvhDlR3;y)ki+~^UN`?1uQsEEq?|b<7UHn_hHB52b&y_XUxhFCwtn)9k zG!$Dn!e*IQJiT>pZP3=9x6R9~-~LrDS>lgzliTy6{@Xy2JGdA(wr=0LBipaEwC9c5 zgS@eCWZ%Z&c|XyJTNf<}w1hL- z2amOK;YrCG-#gJ3OmW=1RjF-5xZ^1?m>OG>SyaNuI4(R4S(5ZuC95l#+8GP;F$*W2 zx?>MFp4+lmXvpO`E_UPOZ7y!-E}%9cdewxwuUjK+wi(AijTNHgVp*jbqW? z8|A(2c{7e*j1`Z4qrAI4uYC&jWFp@_`GFJ=9JRk80Nng2{Q52n%1?M>SbJV%4-oqY zs<5|F`!CL4u<$$Oi-n!{ICeO=7cAik%9AxbX6J*B9anKL*uo=r);o4&a4$H+zMa2t z>~L`}_`<@@*Bv`XaE$2NvbpVLj`lqEvi7aD@3iMJs?#tpaV)L4_$iTZyS#RZ*e6vwiV#vtSc#F)t>k9tr+$#eA2bWniRHJlGaIk z(O2=b7<7r{9*bnxwi?*u+y=3Ze7e74M9@Y%@EXB_|N7Ssvx z8^m`yciBP?f*Co&fd>1WT=|B_f7TqbcAa<(Kenz9`8PLoo!}2v?04^7HK^-w*TKjh zOXMJzyly?eXSr?lZq8Sm*kU_$%KDGm_~AHzp!SWinH&}N7z+QnfXaT1vKLVHqlxbo z95$AoUmM4qW|eDC98TWC@2`CyP*$JFrQY<_XwU)P>n z`>wc0JaBXTN^XT?+01wrx8lO|+>mqnppb2PMmRpPIeF6E9CFNj(bXKb+`Q)4#O4bp zhQ9QT@uNeTw$amX4?Ak6j}BX3`i8r64;%7Z_!ynSWoEhlbWMJE*i8>kS6T5QC}uWf>ijgT!WX} z>Wj2k#STZ)54dRdJ)D2t5%=z}owYTod7C6fOX^Ckm|EvvCb|1*)DbPUj@qw@oC)Rr z#X`1240^?K9~+I`(cn4%8_Gs_wdAPY`p5UXMqsdh3EI2spn$ zq<^DQ*jdAEtLA!N`e}2>{^IfO&D@KQQQz^`SDahte~{Z=0}=VnLaA^9hySkUCe&qn zg$dDoj{p(0j-Ew47d|Rn&*8rb+^9R2JIfk4Zj&!*+xo5cJjc>e6*QU37b|kf%9S;4 zu+J!KaB{_zSd!Bp+pHxy ztP*NFqvbu(V7L1KRsNk`xlNdv!*OEq279SnqP%^29@eGYO8X8jH)$2Sq{<$tvb#J+ zSk25icue$`<%s@yIef?bg$;Le<1s)U@vNnAW==uM-5GvGF5lqhULxF4#ePvbc&vrh z$QK<=3vwu}7ilsSN~>gPpPSMiW@#x?+Db~BZLC?GkHD8U$_}Xp13T-6!SIJ}IxI zrNpu_w%;Z!C~KI?Ib0Zrrqww`DJguFKlZ2el0I~u){9xQBE_q7xRuT}VQs*|B|Y?u zbx}Yf7PF5m;59GUZ87-rZd;_qC7u;qizF$`CqCiu^sgMA)^XLIq7p9TE&3rB@+IFa zTE>M2CwDch1b-&Cw+S2Vfc#3N7?6qS{;ty}yFS=}o{zDXNriV0kqW;*q+vSuUxUG2 zL`yq^5UFb5R{B;~HAvj53^CXc0B!{4D^`7&f(=defi~e;G?bVv0qO=oopoub8@ZLk zs)b0^2CgzQQiZqdYRBrT4QHz>0erR*_=ctp_Qa>D#$(n%+e#TJJYz{Z)>7f&JMyI! z)_iFST78NJa4*nzvKMcBR4;}>9&a|!X=^OL0g7ll~Y=>YSW)v^X&1qVcBLP;T zg-g$SNXvVH@@A-LprT=JiP=E#IGdzL@_7fqCBtS&hQdl?$t5VEKF>9mR+A^EHOULp zNvx;>qHnW|A}tlYAcZxZ6jSX-?Q`sR+kax;Y(IqOf7tsa#hgo!Ldp9wq?mI_Qpf;h zQYg>qq)?K-Bq`>|%psG4-&o`zuDGCb#m&M;!b0IeK@_$L@8LNmnCZ`W;(<#LLdp9w zgm~bRgpdKsgixN-385r^NkTjz6M|Mv%q6UUQl(R>6uj}RJ>sbbp4;sZPx)izIb{tV zu68hzIPNwyWfe~)k7CJ1ZL!iRw(3(LQo^mA%@TBud|R6a;;@<8bHEWA zCAMmu+vdP>N`RDl^nM3qd;d)o8fuCTy_V<@_12<}{s1a!0#s>z-j?uHE+iP?M1wsL z&Y{er&!vzHvOi=m`iB(Gi&XWbLVUtv5i4DhRz8_gE>(CS`dh7mu9cr95}a7kLrYxC zukIZpi=}+AG={7kpZwJfnLwfq!+@5kSVu}kWq4OBPBB@6M)bIC0H*ty2p zInX_lqw!*;{B9|ktv+9nk}mbRM-nT0l7ne+71z$R^KE4esd9;ObkjA|z`U3}NPP(v#txPHH7YACammBM^E|IFkS?O$^{058x;@g;OteGSEQAgx~l-1Z!iGdL5lSU^| zbV}rmHL+SUjkO>nQ#}=w#Vk=!n;vLe#V3-m^=O?FLCcibrq8NK$=VqRHrP|;yb~Gj4OkI zw(uB~$&Z!>(+aT?(bC!A)j1GA!5-+T2C~KOVM7b8(;IKOh{5HndciT4U{6AjPd2K&n?e2WjbgE-|c`R7Af9n=R)}^PHff}2zL$nvmo6#c0I~$TV;oAA~jL<(7&U@*~x`e0U{7Z=H|+vnQmqq$inKJhEp6NW>-S5%x_uh-|+H8>i46@9TQeK90osxLBV16-)o{q@R*9gxziI#P(m?76^D5k2BC9W0=7-Fgmm5i`71?L|ItIsy%X+6>O5c#>mBK!#%H*M%EJAkF9B&IzQNk zK@clF*dbmHeo=6`QKk|_dua7eTh|4?wdtW8U`%K=PS4?kJsP#5QyPPEfE zZi;Ot6f*H{Sdt+?=jPD<)CG2LxLF_#kik%;808yyOdANp2%5{23}V&{jsHM4LYMYU zD%2^Iz)y*^_EJCPrAc9>DC;_?ZC=_my3L&{R(Tk2MXFq!j`yrtz{5x^h-Ef7Sc5cF zWU}?4Drl)tH49V~yJU1p$uuB^9;741v@R8R2~_OGDyK&oN&}N-ND?hdwtz8{3GGWad!m}hP_@WqmF%ZmJ`5H_9j-A!j z1=`%XCLW!_gC{V-jq?4TX%|L+E9|ZxOx+L=)e-}@`iNUirHnf%zEwP{kB6?ZfIVP!=)|n+)mcJD z+Ch7)-v0XXeWdHS!~7E2-K_~uQctOtHm@oBf;roet366n%4Lz|jZcO&bs8os5mwpN zG3lUAH{hNE?ivWAEq02L4N7?MT(@cWMcSQVn@Z{)=0J}Tak446nf@*hH8gP};f&i? zahTRY-a(s$o-%Lz0a`Fj-LR1|YFu%3xuY76R%8XbLX*VS*^qo0G#^O&y_(r*N___P zPOqsHGBq@$aaPXkqEE=!`LmIV4Jw!8ti{%P>o)8A)~80M|NSxNybShD3)P9CGE*?+#r*v@gu3Ms6B;+1Y>}z3l2~q5!5gt9HB9pCIr_;* z)RFkgm9(2z5jsuhp!&v_G#KFbB)btP6>`!0rL;&$K*w zz8Z`sl#tTl;HkF^izJ!(6iEbdw=;@(#o%c%dy&3hC6RSTWIbR_(<+zv!Eo9y2fV#C?MeEArtq!Y3US^Y$ooN!)b4p4(p5=)@gmWi77pt7YwApo`@l=k5}uk#yQw^ zn|jd*5+TJjuA7D-l^wSE@52E!?XJv~5-Zb7EVfc9KR};YP_~dLvV`wga%+AR86eEu zVbtk9P>t-BmYKd$N@Ni78eM7IaYZAVQ%8zc@x-a@v@)yG%1BaTS2nAr@JpKm=a(;M zi-jPJnNzyWDkNk-_~W!ZRT|oDWZrUOUFQ?GL#sQDVNoE8j_W>`pbD-~W$5?qKf>Sp z>}|m_FjvwK*@{k^t;u$t`(;-Z7>Wi*AF(0Xu`EpmNC^Kto}t$+jbw(9jlY?~C6N@% zPix5W4#IbKI>O%@3MzFHmCiGPVjK@lrunvUaH;SZW`H(%`p$r1Loat&&MU+6M;lFj z=jDNq4KX4oI=T*|cV;j30M4h&j?0w!W3w)6vv6=1Ud7x=-=Py!{~D zuX3R1(Yn+HhnI9Sy+#%N4zc`9WVcnru7HLRoA8xaKm=>@MRWv$r>ng&L0|gaP(aT> z+N95e&jy+MZh!&EtZhwxQT6iE=H}C9LQ@(%6D?ui9B5eo<K=s5+*IPMIy@k+qEEDNOH&wX3P)lYUB)pN+jOqJ%2bPVeLgY8VysJ= zl0M6Sncr2C-txOHW6Ls(&$xj}Lof_0M}BlzVuQ<2oR%WPFwtxKv|WZ8%3AZ?FRYa4 zTWS0kR@&RQQdb7ltVXM$n=(=+jVtVpU7?GSmW(gz(S^S4JeqM?Jgn}vHF-nUv3_>j zefCfxa^z&fv)8Dy4gz}zf@cO4Io;&)*{9lo#rI-ca2Yf4|8y^$axVrHfD`-e#el_m zXWDQZCPjavKagB{UFKzZU80JYhBF{O%fB3)}=}mstOaZbl3tT5HoMBxjfJ^Smh8gF~4smS#%p9n@%zm$*yOY zS`!{KZi=-Dq=c&lvp3ym)~DaMeMusyyN{+XTXDO*154Z|Z#xv~VY$JUyWEDshb=zw zt+Y%DnK#*z9~cSVXKm!UZ(3+TeWuENijA|%#S;8wby*dH1}WWFnY~;g2%~Xj3fD2D z%1){Be8aPBQ|w7p@C`qAtgO}ZAg3uYT7vltyUW?0lAnQI*OYb}$cm0d{NQi1#s5-;El&I+=_L&No!DUQT{umYDgY{~n+1Yz7x zMwn!wap)j3R*jA2Xv$i0xIgwdF2#7bzu|(CEjC2UF&*1MV9l_n*`NCAU9vj@c-N$2 z-A@h#qQf-ICGb%Qw1t$T;h|ciN>Ll9jSab&d0^dFa_pQ54wKO>6+@IGfTY`C$(B0+ zce}ZBrAl1y$^v4kvRDQhJHXL01~2=R>}h4>P?l0^ZK=ot(t1Xl;~$coW<;RP!E=!+ z0e6}d%NQ#%EV7$7_z#FdrV9VhU0PDF?7?Q|j%91)MQIahXBXM%BzCiU?WD(IvtGyk-fQ*8Ub50bm0ceT z`9f5Kb`6j2)+N8t#Zo` z#EtB+4n$x1TF3uG1ip>`0l$v@-OKx9zrUQ$6MzLW`JgC#U8Un=#$ zo!awF+#1}3;{#^}hp$ ztD`OmLqe++_%L5*8(R?ku~s4jUG0K!x`}QY(_K(^Y`8`-Olp#MtP*WlyFt5sUsS36 zCOLcotCfoe{IR#JbW(S$Oe1$tfaRVgDZYpDbzBegm@-I5wQ+#)!GY5s`->S8In>Ma zM=un3w6G}Gdwu=DQ!awr#Nvl@=w6rZ1})+$GNe+_{R!Ttpd$|ulVSzlRUo^=7UwCHJ>Q3G#3 z08^pG(&9gkDSn(T_&yT6SW|WJt06c3zYfZPJR?CXKJhL`1M zgF`~&ScOq}8X&iDwZV%UL3g^L4b7|-GDC>UH`%G>=Q!{IIbPM2ObdUT>MAX8;jidD zsp3o>Xc<+9UPT$oa)mnK?jceC_lLA0ovwx-$Nx#(qG8B#VIKiD=Cz?bmHR&aCj^t@ zjk%NFTenArNV-s_v3RV6g1u;(OobD717Dj*Vj?sh449(H*;@u?D_4DQBE<-45E`Y( zO=Xu#Lo8nfy%|?QL6k@_ZoA_?`3;=Y-6r6flY|BC#szN7m#ob$NvLqQ_$%Ds%xAO2 z$L`{9c9p5q1BzKu4k{>3hwG5_mS-)mS^jAGz|v`P zTXU_Gt#hnPts!gFy2<)G>zi;{J8QM^!};-8&p$NZHF74FK#S^5PrMn4BY1Sg5Evja z0g2<%6R$+#wDd$963fyPKe6~@ccmvDL1H*P@eL%_rzdVk;*;r#Pa^TZ(-YSqu_Zn6 zM@T%Bo_ISFkEJJ;BC#_)aUv2kY-t3!3W+1q6P-xBK0Wa>1T>hDo_G|A3)2(#BJl_5 ziCdAlJU#JONUTjytVQB~q$MUR{juMqr`?4$KRs<8)}{2cX^3}`o|f;A33f9rl3D)P z$h0(O>xfhra;wNUxv;AvKU!L-C58~!sZfBUMrqKA11(*+v1D4!ygLB4|QX$zib z*K+h7Pd^UYo$wLGCE!W8ZP;xnsQE%@zM|QFn3sc}?7WNQ$K9znjDyr} za;^fYST~%6GoLuCUWpAFin77rOM~|F@L@)frB3FS%McY?-DvevSzBVLF66vw% zf6uI0{kEg-Tj5-+bVwXVZS&aq!lPR2Bt}i%`J#JTVmgu~tR^f1MsMpJ7;V-_CdwLwEYYEa(c|WMTkqa$!mjF}T0tc7uEkL!(jh$;&nWQJk8~ z#~&W+27+BaKHhjoifLH=G(~rh6pKZqq`2A>8%zxM*Dl0z$VM-Wigp9pEJ=MJU9D;e z?HSZvmUv3x-x;*)Azya`mmxvDJ3FJ{Zs7z}5S7~@FsK5%xX99Qf0;or8GN)T0Mq#( zE>QRk46vN>2Ehsprw4+a)hJe4jE5>d@m)(qvWCB^bYm758iPE*RcNRK)0&x;D1}1J zZpb5iLMPiNuqYHtA_6INhQ1c5N^#+UNhZ^b$q-u$+Taem(t&!=y>X?#6QbH^RUkj6 zPDCpr08lG?p>cMC&Gd^)xU%##u6OtnJF(bw8Zm_Uh9-|Y`<)D+!nRCo8~t3Oj^q%v zj6y1Ev?o&4jrd3qV5}#&YEH#)wZGf!Qh};6eF9xoMMT#g>XdoWz}5eTD&AtBH7hwn zp$oAXQI)C_`J$!MWxmwLD+&P%1MHMw(q~waX&ng4CHXc)ayUsNP9trcM5?S)c1h;_ zEAjAqD7HGxN|1cK> z;WS!{pfz0-*4ZaIWpzrb4t+%#E{qoPjWm`kC}TInXdu9CTREfy=5aVfY@1Dkn{4u0b z%#E`IUQu;1kzLn)pDS8HJHMNq%Fgfi+^;RKTlQKGTK;ayu#Uw(@9Wm@Sbt!B%-U$( zV%=pO$3MWY=A-;${B!(kh=#bzw%6vcf8G9Fd&vG%`!n`7dzbwa=l>i2-Y%>c{!7>= zT<=(fzwbK;r!mfND!4u9{5g9%;FJpQhyU??bR9?DJ>!x>iNmm$PTb&VXhvS*T7=w? z%Zl0e=QQ4zgHr^Yr9Naq-k|>Tj#1vHa5U(r9_K*bU$nf216I7hp}#-G978D!9$+0)iVO6n#T*ZXSQG3jx89WmQ?Bw@= zrO^hq#%=`R`pAfp^kA=I2@CXQ!Rerk23xVz&Qd2Ep2+~jIy)KZ8tw#i1`HQrer#{Z zC7S-o-taK}{!lLBv*|_3<)q<;q?_$(OKKx*ln-DuWWc4)#3%(}2N`S18VI6zU`fGl z5dC#0E|*-S%baqLKOYz-l|x8Q6@<%4sLo@Mm_l z3W1ONvQGa5{uQoJ6M^p((AQODZtidF5W=b7;rXso`x!fGm)Hykh>05pg!OL!u!btI zID+*VKM*EQ_FwxQ+?Zzl0L>D=hf6|V0${Fw za>Nd|!czicL>d4h-XQ!mwX~4RiF@RkT|+689PEpf;8bu$ec$o@yk%)h83znZ5DlEc1Fe zcIX0c0ZB_40HR@gWkf7ZGF-7b+z@ya!6NO zUnFti`YdSaN%#lC6;jO`FJf&eogw+F%43;oPAYRH>(AS`Y$5lVkXDxzMqxT#^TyA0 zQMdnFD@N>V7yv{(^2Xm{Wf1V7fATRK#*3`XJ&0KMz7L8h$tFO9(iX}u44*Eg&|N}jhM0vEB*U>5yLE3e-H-;VZ<^lL zLz#TBRLp_u_5dkX2Dis2E@rh zcQ=d=A(2K+urh$_;vko)+$b2u+eKIVNA+mgqW;2EE&A(rf5*gcqp4-gAA1|hN{`V8|p0UioxzWK;SRT zA>~Fg;in)2tFh*4hD|BOLIYjQ#AZRgOvf7_oZ1->?mX;SV-S8acwVO`P7FHv^796( zwS;?YXjheR@Vz`=y^qWvp*vt1(gEV=q!U4P2p1Tzj924XQu>8>Q(Z(g=`?aTDUdRc zu=TFR|Gb@IT_5azBq&9SpR;q}jM|_yO{mHVeH{EC18zYKgdGjL5ri;#Rw@(& zQeiaE@VO<6;yFdL#XwUu0A+6j#}djK{sqx~DH0LDX=lhdw+#r@Iglqmrx1T^6r-g# z!pxi>EiG$A6ufBZ0u*Yh&e?u1*L7U%SiNU$ULC%?QYZWj-$G$l#v5?}1o>BnKs@+a zK(X@>#;{H(%ZcLRB*BdA@ze?TlmP>#-9Zgg;Nmy4`5jRtKs?{ZYg^e-1l7X6h#8KsM+hMwUXRKd?#)mDI9|SpzDX zE4{bDGtmlsr-LF=vKWo*F@bu-u#t$=UFS*kaiI}~=mnD>7*`Lio^nJRsYdKM8@!oEAfk^x%vv#+5TSqcGCnZM6@*>Z1^@ztSs|Ii zRR;5(tYBON1;g^i3I^2XD>Xq3K(cubkupb%tqLDUcCO9i!ie#v^7YPWo~0%%1S6># zE8oR`>WUm20Z6$HiVCR}7S}$S=U)3*Uid)@P^Eu_Lp+5|k_vIjtfxUQ&@xu{7Zg4w@ z+PYf!O4WEmR75 zXcwbL|4NbX@O$9`^RdAA$TI}<0w;T*jZyc8m`4!b{xooNFX8Q^O_BjSC4$Tv&E=6G zT}}x9AR<{pcSaWM-_8I$(*L`F(jb=Y%mxQP6 zjZfK&GPzZb2F~JevC)?2bz^l7O|)Zfd?JM?4i!|^N7xn(Dt(|3-%c6Y;APchM)b!2 z9kVAnM*cjDJ2q00wHS2f>{;HB!%D;Id`6jmk<-pd@l$pVZjet}7_i1oGWw)Ip$DWu zF--yK8tR+uVnsJ5iBtZt$wZ5?jApy8aZPn?a6RvO)z#{H2hr9#G5P8HL*DpQGKnX~ zLeoIafk&sCc$cIG)gr?zJ_>=*bqH#&2qY#}pfzmelrmURuxF<-iD#5FZ~WJ=)7kJP zKDG7ZWTj2~Mth&Y-hZLI!1<&28`lMacyWw~OD!LCNaLi@&)`q3lf znLd50jc%Jjrook!HiLpY=nRjPebMD~0rJi!cGLx((Fy^spqRwsV*D$G7^Ql0KF;d) zP?q+N+s8~c5wprr-P%1O5)lGvxQYj@;@%CdhBdDjB(DQjP*za%T1xwd_Q-iYQ0@$S z1AD^w?1Ym(S0TWPE&JGKaBLGVmK)HDoJQxV!4USlIE5r_m#N)w6R5z(?7V_qpxhI- z2ZAo#t10iqIilQ3P{8Rc1DB|R{63#vKeI7U6DaQt55{gR3=ccFJ~QtQ z?B_J_z5u|x!Af$!lNk&_`h<{j-%;z2dS_r@GAo0nZXc+>*UBQt8~-lUO6;o$8i@e; z6D!M*7%hh(R7n0wJ0Hbmr7v7F83AEDqM|fMeGn=O+0hBD>tI?EeqYFwR7kzs$sEuX zt(YND?Sl67Jvpc^+%LW+7o<5St*F4i+Z$*LMS-|z52f)bQNIFwd^?m;n>{?OykRhl zai6^22;eRNxN~3tcLBhi@_NRu>%Gh_?*R)tyRxUABs-ZHR?$(mtnyKZDTlUgkQnlI zPR5Rb-Gbf`-$Tu=c467;k&i;un~Sqy@?NZm1~j;4ojolmIa5)X z_9@?^?P0BJ9|<7os(QDjO(NaP06US(;0yNYD~i9UZa4d=N9wl;)NzriEGw`ut2!0Q zF8-=MPc^~i7p%Z8MLu6tPWF{Iao=XkA?(3?aPXEFU94f4=?W0(HASt}hNcHzK_Ijw zA2+Gfphkki1`7q4i^pI%NrjYU>puZ(k^-#rfC4V}e+BL&R0;&}W{A}~MhB&hOfis+ zabT4vjf|-A(@LV1FwDG;2)t-uzZL0^xf>=jEZ-A!^i9<{7q4T5Gg#`aAYb z(9KOOLZ)$baW)O%WnqN9H8H3LLBl{9KgcgdLJU+;M^(k552j2Pmv2)J$R>2Lu`d?N zG)~(-%4Fy>Z{!^fu_JwxN@=O(S0ClctB1J99qfVT(yA&M8jDifG%Qf7p&+!8ssX`s zU!NW;JG}mTddH445=WO>jc7WT~;wc!zXqPt|yI*3!cjVVLtVv8hk9rwPuGDqZeQM4ggv3BeBK?p$dTTa);Q_=jiZ z?^4o7yRa_!Dde`|roB`@MWi^a2D{7@X0C!_+|_~ae6|`|BMTC~HKNU2olqpJ$wZ`y zYIdeitS4`6>8d!NSdWt$+IMNmWHzQ#KqcWwJ_2^#&uq_zBIX*pRf&D*W)iU3rtW8$ z4O)Xm#&vxGV~8lbyN`I)Xm9GA029`Y8W$+`3Y96^V2h9>L+)d+X0*ZB!*Qh%X~xPn zvZ~byFaY@<&5NCv#O#$hGYfV%g%GV)ewv+wg)z&a?1CHG>C3Fe&*IJzpExD!a#&5+ z%_W$uVd;T7(gw>kZc<#z^c-wjmIMAYnx4f{vPT;%&W+3T_ylx*xeT_<9@WxJPwWdx zZNk6hz_eVrEQc@rH#JD|Y_nZo-YU*92T6tprO}ix$vaATgOI-w0u;zfQz94ly{dEY zO{4+4qwYxbqecXgQx_$j+0I8R&f$y*AN>x(HLp~F;|V^&1gjigropa;pQ#|pRQ%4w z?@Wy?>7!&VRJT69`96O#a8`-4pqar`-rA<+w@v1y@|6b_Ce0%Cgab^!hYJz_DUg&RLt zfHfivzd9FrnP|2+njF~(QEvK*9;n~B>c6q4PQR?>!6|SkV89HAo9A^O5qz1Gee+5E zs)q3cYSEyJzI>-It@s{;IN%qJj2+cDY?P^srq9>X@h0OLcs}c-Wgn_D5jIn~fTmKG zeI&!jj+T^RD@ok1Vo3^8rMz#9t|-I@Z6-*>*3yU0`!X6b2DyT+b*}$(N!q__ z+z+`$_p9zt+=D$!Jui9=cx;2l4JsP6W6*H#GVj#Pf&QNJa+#_tm{0L4BPTTG^(C!9 zl!Yl!*=(wVX=0pL@dx9DhjSq9j~Wib!0jKpn_&t4KG~~JmZ@;b4UJq?rOFSPc|&nl zjRa5fV(_TSCW?+9{7{-FL)kfq6iOV9i{&RFyNEAHB1=IW|D8Dq z1~pu5-J3z_O325RgMbJ^uziht6<43J^E=Nf!QJ<+K}sp(xnGFWI#Rt&<BvG{+&r>I&Ygbi|NIQ_wd2{aroB# z5A7Yix|Nc{h06@#NNgh`S1;LKj?sTd%h)$;TpX2$)_BZ(&=2=a+K$l`qpOwe^}wJj zTru6bD^aGP;t&`ri5ck)PiiJ>Icqmkb<_fkJBT2uomD#N+uDt3EYRF<&sb2 zTN1-@8J=37Eq79FebJX`U4fnkVsM5Gd6f=X5kg%Qm&G`Om+G1Vyf2h3mxe+ zc=IG@T%}M4kwW?>jv-VCxhfj@O5tq>w+(9q%tl~__w0$YpG!iqyRle{KQaf>VvZsH zNU^)j02I+s|5==I{gaI}>xU^85WX--1IzMFk$@mIrrHzVGN3q20U`+|JcsyWz%va% zqF0XN1cX)Ljmhx^LR5ya!bTD4e#eA~GqKfX0B_FvWIt25lH3F2?tWYxirfUPssTWgGx^y^{$E7P~Ay73f-p^G(Bi2n6AVfVPtMVDh+ncA%MwOfyHe2LUtn z3tq4p7%V~XkwqT-Llh4!*#@LcJc?{$vO7sryz%j{RIoD_y%IYM9ncmfADAE}gKmGK zR&A4-llfoV-2afbE1k6t2p|5R{eYgFhB`BosTLSmkX*3MDh4U`K@s_=MYDs*XW40{ zHT7=GAIN#tFdQ&A8_ZK|a9uR6c8oBT0tzUrTBp2vHJE|2!YKC-Oym2ww#rt9>db8ffDCy!wW@MOs=Qq2TAe_e5pN8g z`m4u9a8*JGU`KLX+PWg&{+GXJq^~xttbBP*8?H!6hRnzh${9MT$uF>n)IZ|r`H&De zD?E-vd9V=9=Y|=Bc<`{#5*}vuAw(@KC*77yWo7FnhD#n2nc!HDF?t3ZG;3|XSPBPx zr-nB%g5Zts#W=EAtHy6O*!%|aAXiCQ4KW0Bd)K`FWsqYY(?wG$DK8ECFWYTSbBA~giFBik@QB_+=@*r>QnwaiDC~B za3D}7y&6QR7t~VHt7Ve(>OA~gfPZt5RRAH1k8Fm9Bps0*Ws=jxxeC#|0T9%bLEv?s z5*@RnXjdsc8ZTwi4s1$yT1a%&uen{~I|^}>3A)ac*s+*;qC;aRqBJF{LtY{iMtucg z7T^?H&vyinV8SM{V}Xo-tFu5GBHNGP%I;;m+kfZU*36VJ6}}>Fnki|0f;Yg1S&~r*Le6_66czC= z&{}m+`87^t1p>nh0C4hX)r{g;t)ccBXJq2XYSUl+f{MmA3@GeH_ZBhEn8`RpVVwV< z>-)qw(yNQ`Zzle!EHND1;-su#;MF-2P64Kpnxb5^fbsSkGTu7VjJL}MQKI}I!L!L5 zS&7NVly}9mgN}2cu=X;AwS8&@%=P+rD_4*Y2#@GPWQ<r66+tifGXO(!0m-zPTwfskBFawIUXiE-ePeq>2zz>EK(n3S3ZC2Zev;PB#ddm z>QNX_6}+$fnT(62F(0IEE6JrzPey=V$U@#MwdPXyNrO zED*}>?Z1WNe;E?s;eYTLf}ljRM+@#ltAy3UXrZXGag6Z#W~JmytmGIfx&3N9v%+JP z!efN*RW{}eufL)cevuWgE%n;e1Gf_L3M+7g5~m%3?N{*ieC1CXjbM?y-YBYa;-e_rA%&-Ph81* zc`iTsrO#yS;$(j%v?~t(x4Pm%q9?wfuqbty_n+uPWk)hUW{T zsDAV7JA|#)SETk;2>e_$p;Z{iS$cO&@a=p;*fx&)>^X*q-{Bp#gX4Bi@Ub-3E)>G1 zY`E<^n}$1TcTYT-^x_iYxbV4xxj^7)k5dHhvP}>;bV8~ zvr(~@ihLG#b2R(k5B*4HKQJZ6Lq4JdbGKBC&`o})={;M2KS}R;_)b~P>dGJCfbR_L zdb{#-9A&YyB`i)+Swl6V%iOVV495iT>eFK^?UMyR$eqPnUel41=hC#j?UOeh!wV*d zt9|Ocad?f>>*O`@6q_v3HPa;ahHIt$)IEv9fZBC;)-R(Q1gKs%2{HvfT|`nm$3bsNP7#s0U4V2EJ7`e)T_La+I1IGyGThnp8{$K-d+gxa>LP7bj|xI49@#0 z#zUL_jKRS12Rp#UK%SKc(v+*7xlZ16nvGoAm`+}UO4Ih52UMPzyTA~&$ zPn3wKXG>ij^%b#xs=TSCQ56~VF+3&bseG$6x@jDnN6l<9pf}2UD|^QbSKd3)@{cO{ z^%cbD96CdM&gLOLGQfzw2BXJNXyLQFBfOq4;mxvBiN4MdDbR8 zfshhFovN?P>1P$(AdtGAFJlxhP%CYCNae9Ii4wP?%yCw&{28{{NZxD&!f_190tJYQ zmj+}3fRyzGLJTJZZD2qZKI=-gtr;P~dw0!n{4YYr{!(0*C5fASs!;Qzp&UtsXW5&SRT(^^xEc1V`g z%R>;iF@6iH80GB_1*5 zlQlqYUxpIAMEj<8(mRp7f$eqyj**DaBHA#VH?^TVm?MlERm_u*uy=X4jPFxp48m!h zQ`q5Ozz(!}C9bm>moJbL<1^G|Sfc8Ke_*|iLL``ycPPo@(b;jh7(Iw)c67}IX(!e{ zw+I=*UNCQ8MfR((i!1BoE39JurU!^+A}L$Q8A;jE?6nqg(*z~~6js5=4pr0S8LSMy zQtTxLNU5}eNpO7ISkBzQ#4t9)x2ny`%QFc{Rm3aoMO;h7x>2ff%Fjs~=7Zk=+iYMx6fv@PMIE;|?0w2L~ue-(ZvZrhjbN>`TK{k()}YjwzK@@x&DY zTH)@Lhye&whaw4n!nz$@Qz%dKH42pInyC^xwrYrs48~KI4nZlgoFn5`eNY~864Qu~ zlj31dH|SEz5RjThd~&^nPqwd`M*f-gLAl8QnykWNTqq^I;->2vuj$AH(Echbjr~-x zE^yfqgbcYx4Bp7&jUiCJP98u?0``Pc`4cRO&T4Kf&=R$B1zJ_PoCpq52=i%59dL#2 zUC$Rwd~jlP%?v40mCc2w*H>&nS1{>kV!eGFkFbl8wF`zJ{8l5DA|AP2 zoP|dU2+JavVv{}`fjyApkBxR913^xaw%%MPxIwOhoX690HY&g<3@WLmMDGAre2gpZ zR_~ZDk@!to>MOcQ6o-bAB0&!xQa)vA(hhSr!YJ{H9!}ga0uY8vJQVONHb4=_dlc`H z9r+ShJ$@xLoG}u&{AzJSKFW2*oLZwG~6zPdNfbyeA4%R@QG;#wJa=gpy zm)t}F@UlUj(bdgz*y^Yk9;gQ@SVonV6RTyaR9>s%qvFY9cXGuB z>{1k}u;HkhpL~8GGOGYovJM1@ke#6{>4|`hyS%_Bt|Pm}(u#fKJ2PM5T-;_@zxLVe z95V#ah90K0XtvY0o!cDEKA*XLC%@TpX0x@v(B*rb&+q;LdE$ ztuM^>y`JmXcEGVcmy6q3h5de^d@Kd<;yv49DJ5g>#Rq z;{%gpNO_Qh0(sukdW{6B!%^z2lI11OBu0o$DjQH8XE0oI9JK=nQ?&{x(f|? z4fv|<{5{1A8UUd_Ft9hhH{G9YQ&ce@!h_IC%1uz;71#Sc;T)=H= z_KJW@!veTXJMh!t1=&TwZ5oZAquwUa7;r&V5pbJk;OC?l1Qr3e3E*|O3Sozeg}c2p zwg*2He_HG#>WamH>}~cI9GtoO0|!K2a^iYiryloiZ8C7A$|@cyI9$8`^=dA)_t3@K z_CtH}bFb<=JbF*Q(_Y(B8tI`5*RB`$9lSt)Lyq3hUR-_L!674*^}A|uA63(<$OC3u zZFz;uR0g~@`)Xh9xz4v4od=2j-QI%zUsDlVeS+r>oG>H((*wiJJ^<@%NQBz!IQm8bkH=GKTWY3^l2F(xLpH=7g-NW`&a;ml*^jJLwQ6 zF@~1?0??#G6HlgE+Oxxmjh)O{KdHGr+XV+?nA$SeuQ@jHWKj*b%HGuxIYNQx_St4? zoCXXkg$Z>+H=Su(MqPyA1o6#BLE}%VlH7NViCc zFCyd?3F4azUzfPUCy0Pos07TrDxYELOvZ_Z<6<>jEwO4h(XZ%{{F*}LT`1%0aw)~nn?Rh*nM z<8Y%Cgg^@gSb`oNig0{~3p&J$1>J4Jn_dgI#gZJlzUw`6vLtPBMvM1(m#+Q@lI){e z;6!wz`7?iu^AYd=c;g4TTV_8zF|vpIv7JAX^sVRp`@G$U{<>T^^jE&{O)vlZ?#$BC z)gL*y11LSema1&xZb|On;*4+L_As1)58?Ijl{i~HP_RerF1Xkxw0dD?0A{dGUAexi z!<^-0St-eYo4dHxYs3%m3%PGTd>yWG0khrc953u+=> zWXAd!rqVG?4ufDx?So|b6IB=lc`1Tykv-1%@-AggKpEgXY)+7sz0J{h1)12%hDCzX zIUG|)Rw2q4lS;*(X`zXutjzMFF!AJpH^l=7kIR2o@0Jy?$VDzxv@#!B7r#3Iy)4W_ zL4zhnY7h@qCw^Zi@*R{4(yvOhdv$Av>|}9Y6^WSqG=;Spsq(thIIPOLDLff=Bo1v zKJd9du)27C;C*}5dxnN+kJz{|V9%hy_;A>YZ3y_wZ`#8jk6#Fg+K^zpiNy7LTU_B9dE)9p+6NC-b1V=PJ9>~85E*^>NaM7H- zMI8)Ug`zw&?h(?t=P8AI@GZQj829XK2-H6$`TfEu$8)1%xw$V^7>1nMiZ!UMDh#$a zimIkotg6odixo(8mRYvx8EOJ&d`-^=V$T3f>{*qbv3v*mawk}dnRyYMUmfmE#9<#7 zZIi+ty-@P$Nb#n?78nWMf#82GVCU$atHP&QopTgSEmRF|HK_J`x!R54s|?i$ z{4)XE7t58d#Y5ssR`hpp=|PP`*edcQL+NLfMkZ>FBvPyq)cjjYFUW-TwYFEdKXIEa z%~nWl2#){dgH*zCYmW;utP)-Unrq3mK&q~HB7GdU`5tT78nKGjpIe`{{>J)S>-+`c zAL|Zzhy9__GJnCs?_k^P7uM|-FBFRTvn&@2TZK6muD9;J{5Qh3dE#5IaQ`*_#_7&w z-(KPAY{?Df=SRb~#1zZ)417*!*5~WjC*HIaM!nN4g?0Yv7F$PQ(@aYuWO>C>+cKs( zG<14%$TPhrWUJeg%&2=WX)hH0-?zN9=GYiVVbnj{P?PGt?r0wU{^;JvYNY06gQ%Ul z1M9GDhdrmDxkj3?Vt6R4=AsbJ`Y+1M9<@%m+mc-R(#E7kNqCJrctZM3rG*zB!oT}1 ztU$5+cAxxqJ^u#fB(I_0`z*;^tz0&}vl<@$jii%m(c6Za9z^n8C(O1)3yUpv!VF92 zE=$;*7{foEaVlfHYl5rh^XBDzVu-!-ja)GDzu8|GxY6%QziGEVeRbp2zrH#;=EE`P z#-zp+js3>hZ;h=v`M25@Ys<#zz7_7D%iWWHbH@66OB~UdtJjy!_h*lKrqELBoocE1 zprq#064x8G$3}lJ@mObzGi3GT{&ZI;(^K0>AB%Sqp-@1sm3ck#H{d(09hwu zEQA{^h0n~f^!(xb7RRXRmT=aRTW`7Jwu+_e-WESvS}{SIFwwFE9u3gN*Buf+xb+s6 zvbwjKt8}mK&9$tsPl$pUv-S&X3#`d`FIooTtnYIUqa6>MPjE_7!^8Cot zw)br(ZE;(0BfmDX+m>k`WuI(cY`?+&L;KCP^2K6r-P?@w7MCyl&U`qf2r}38 zW{)Div()a|_;cwOExe(1BjSJBBc87bc`SQwgY&@o@<^+vygZ(=iytQ6qLkkHu%~=+ zc|1-je=wGLn^ImhrW84lve8)U&rYPQF_zhll*DrBwso!bt6V#VSmKCO^H#whLxbSB za>lyTZ~6RS;j1y_G#usH%-bCp(@%@DeKC>|Xbx)*a zI7&Y917~8SNFr6@r+c*)f9kP@WgRc-Jnz zUtj7G5A5)8$(+re&J%pg&&8I`T{iJR$cnv7XXh?_0t30(j@75Qsau4@Z*2R4AU*$q zy=>uv`3c|u#n`vNMOmf)pLb@M8HNEyK*SqPUdWmx%4>p(0)r?HgovVvcgn)c4l`hd zFf6+%ylSTVvy%O_+qSi>)^D-ZGTjVCAuS7ZGts=HX*0cENR2_odH>(%yaS@O`}q&d zyyrdl^PF>@^PJ~A=Xo^zQ5t~G$1dM<&9ISs+)&fg9ja4b^bEh#QK1FB!h59m{VPe=%aR>a7t16ym-$T7cZzZdo_r_|UqSZi9{#j@G`FAV7%zt+4{E7~m}tW;ir& zjS_Y+&%*YZycJoVLESoBOM^OGc_A+C3)*?Q2JHvhCb&M)x<6pa!_H z)8(eig+Ucp3_+Kj*QIVvmw7AP?+3%H>9YN*xPKMWWWs2H=dAC|QNq?bUgvGb)}IFI zwyBT6+S&-gb)muFeq}2rA1dSCWZGwBigQ{}r}MR7I3=__PWQR)&$?r}w{^9;Pqb`+ zhY;gKtp`j_Q|kdeEL78Qmp47Dl^zk>S9zb5H`%qh2yyhq*p;HtDg6%wxhcL@-gHtc zX;*pWP2cG}b8oNE?}BcNa{XRB_u}s>Jdbf*7rXecGMF~)j$-{!xxUjHn%h6tGWl=g z^t{OHZ%d0lMHMycKV_`k7a=%|t9(1K~*@6%9u58$P>3?wQ@tTV|9V!T6bf zOBy7$ivg=NTLFc0tx}KH13KqLnEmvLH;}nrc>-g6c&kwNfd+dr|JFvM(QEZujfxrc z8jZ%F(WC|10!94Qb@OziXJACH2unml#FU7r~=Jm7Dk zV&L?i^CBs}%V7}e>XQwu4%iM{X)U`B#?&hBT8F+oL8vVaEl-fgtu)F;_v6L}=$x99 zSBFP!LyA6_)u-rO(v=;8=arjvHG%sBKMLF(cqp(raCbjIt?Ffueg{@j@uvLtD@sp6 zBKd|i0NqX9CiNox^7T!QY2{Y~p^V??slWT`*>%%(p`YuH+G)Ws6x#{B8x3o5QRk}a zPQ|6UAIG7l2x-uc5ZL$z?I>ZKTI%MyqjKu%$x8|VpxfF!g*TVKmDh{SQ!Eo zH036k8>(%zxm=rn3yTYM0hVg3_CB6scs$v#8rzX%y*OJRU$;{K_!Ps&RbEM5m2OyV zyDg^cD{bv#0HfgY+kltOQa2`%L4Z;N#3-f{PV}5*u(Kfsh_hAV6pc7dTMzxRuBEcR zq~~g@uWEnQ`KmKjH>(a;{aAJELmsg52UotVbC{ZbY-(;g*>t=y&*!tr&K8U8Dg~3b zuUZrSlqx)36P~RtT-bD?GZKmCX1j`R3l>f9r&PVuHN6obiafkWyiMMt-p1BE-_PL< z;b+3X3jbzLA~UqE7-(}uHs<@98k>$bHH9B}zNO+yqEOT>8P}63;@W!aZ6=u!p(9mc zK+_47Q(oGRHuuK^jUL!8mTI%YU~9^le`Dt6NI+r6P9BcF2ATcTzYjKAg zrkLcBmfB3}Je+kq_0TL{?n8e)Ouh9m^;{2F)CKae)OYsZVD#UDpZB2uj63v_YKO)> z?dLsR`f$@$Xx`uI*&~3NQI%@I^jmGcV>w7#n4Q}AYsG5IvGGu-<8AFOu&~3cZSCL` zWb&zXzMD8r^N_WrXWq4*IX8M1wVu0{=e<~Iy|Q7W_aZe&Owqvc8M=AHChsDxx*je| zUQ2J=wcgeny>p;nx~0-~jqH#(wcgfOysefaH^cXZAA&e|PFqjgEmvMU1n_AV`-{5L zGq0s*&b6LJH+WJ1y__q(Z7sd6*LvqbzuuKfTMP6)+*c0RA%d-~Th1+0PWvWtnreeM zTXR0>A*;Wbb3c18-Yr6lrtIYnxYFC&(mUrG{nmx=lq5PISu0-ug_F<}222{>gRZh`VI<=M4^i|e7t5Xaelb_ES%xD@6qi7He zB`VU<4XAncbzFEWf}kFs zgjUE-gR(B%#p1wbV4JSgTT1jRqol0$snVE?l3Pvr?M-JDRBG@2{FV4@ZE=MChxl|& zaj^Yt{8Or8t-U#3WB(c`vaL|Ew<2PZvvD{djc-u&VF1ts`79 zBZYr`s>AGUca{1Cr^! zr)Z&&K3Nl=qH%_U4vtU3g*s6aAAsA?EK%xNYykD|H0)%86ilvG%xcKKvy>65QGLRe z8it7FC3*~uNch7=m;wnfKm-S(G9IbB0CK)6S%38G z5%<@IPfZVcf7rOzp>_XFR@a3c6Hnk(JmmdB{aM&CY}VZC;SKB>b}Wa2UJ8i>SO=Y&WGFh+m@=l=9?=zpQS-4HJ zq4iqTzyEDG^1b2g2L9Mzb#W^;^1Pw#=sU3wPCG%2hz=;*WF@19B(RcxWkbtv1)a9{ zD7KXQMn7i{Egn#Qb6k;KSKPbec1v;OcJ_!yV=6OM{UA1rUy9c(N2C_%X=&*rrj;R> zdmK?Te(S3(xu*KwzlI*8_H3ed69xs=ap%dFBZ?EhZU~ni#gm*Vve<;jSoz<8J}SO{ z3jkAG9M<@mnA?0*`(X(&XX$o_XLeCqfVM7;zEO=-0hp-TvKX^JW>s zqdUh(NDsaD{8vrh9`tD7EEnWB%W zPceX`X(uvdPTh9~w@BH5vek%!4=XCMIn@P;ou$!})+jIEu2TPm&w z$>(N>U(-b?+_55lsayng2jHMG@kjY=E(KLt4KG)ZIW>u~9$ZY##vR!c3lOS+7eot-OaBe3kP*dm2~AoOoEobYobR=iF) zh0tkCWq>ko{58=B9pv@sgL=GkX(yU#019kvcI`DCb$28Zr|7A|rQOSK5^U6aX~~Nu zIO#AxXh35eKZDfcK)IUSd6xiK_r5#Q1>me0FFzhNr_g9+M8c0qOe3Lhbq6l~eSUv$d5en#yUa%I*r-`jrg}I=FHSuSvu|0fp!% z1l3ap*KMdXaoyHCv=$g6k$PEvpv9%vaVO|}-<&AdI1m5l~4Q-2MZfdovA<+5b9To%7pfGM7GMgg2hQHigm5PuMB$wvgr!_c~4i= zLl|4<)NW^0D(FB5&JcYWC0ax8)$x*dm&_p6cJxQ_R_cI8r^ay7VMor7dWP=n0)r@m zK{T%qbdeDZw1yMT0aEH}m8%qDQ{y~yWW!0P@%If*z4}P}H$^{4T6)^gR9w-O1gaZW zPtdh~D}|~XDknfxsZ8t2(lNWYP&AF0NTwLH@I1w)Wm5lth=xsj=6&^3itp;#tL6cSuh}62Phn}9I2=`S<8$a z44tMk(oao4fO*)#Rq;<38*M(9Un?txZuck$tjiEz1-8(~0va2P7{G?g}*(UqkJ+8{Mp zjSTESzBePX0xZ*f{SYHNPy~hq_@2b%Ylo2R^}mYXUg<$C;kRVb+9HGdRIB?RSKtB2 ziG9T>D(u{`X{|~zjD~WXVU|2qZ=0rfj<$D^zA(ajjAQkaKNGnOymgEX6Dspml{QUf z4%KG0)i_&vTgX#&vuV2JXuB2ZXG@!A<<88TF~cI`xT;%c2E_9U_exN}xjC}n$?h=?WWkU^#)q;)tb;>dBNzuVUYhld?eRUUo2=8!H+@E(()>w0X z{~nceacOhEPXcdwD9+j!hkr8bcc)q@PTAMPRVQ7AUr-#3wzc^_Vsq!Xqb?H@_S0ki zu!mL`hUH9mpJ>6p$f@^PePG{9Zur9htviKDV|+Frjcs4R!{%3MRPV(`}zVtYl3UhV$-ZS;ks z-_D|b=!-wLQ<{JO$a|tL_>Ka61=K8&n(%jJ6!PJ*qO(&Niy6R2Bt>C;EXRL4`|%?e6VvVq24Jy?;~Ub+7vg$@_F9-{{Wax;T99N<>w} z@Rg_-aJYD@9PA0#0x9iaXxEuQ0N;G0-# zTw7|SBbyy9o-M528p+m{GIwrE#S*=0Z4pk(+@+TW>Q-CZtMYuV+ZsorDz6=48&~~>P{KPG z{0SRx@q{XzY*}%zk7jy!TGx32Qyr(okLSs&^CHm}PvjZ@5tX~>D)BC{hl{7(++*8t zdu?Kg&YjsJp4lddmv*q1mKmOO|IcmCh%>rhxGGQ4Q>m*iz((2XWCITH4xSc4y&2qj zS6@yxfS)NzB(q0-z4WRS)!`1lDgma7f67&fxi4RJt;BJAZ$C3GlqwM-{_LI!^==;L z=^YyI&IR|CQvk7e$DMgqa(5*E{)*I1yo6f|{_N_mNLUW0Pjf$a5u>ACn>z@sL;aW_ zRyJu&tz4Sze)=lTP*e1-m?wnmE*#!#M6dhv>-;s7cPVN;EoYkhgYRcFwG~<#G{0Zi zkgPg=vmseC^m;?GRckV>KD`5>e?#%Up?IUeReI z4mf`X@}qhky+FS+zITny9R&FpSCK(L8(%ra5q4%yG|o^|4&nBJB9)jdll)Mj5j?hX z&6jUg7OA8G#WNsFAm!v?5g(Nt&olvGO0LFz^Vag9(AffylN&v%XsTgS0C~ctm(y7$uAq zl7$Vz+rlIvQ`jZEBfJmO3oXL8!g=9G;cH>9@R{(H(8#=kS{0!hr!uMHRA%9}>*gcQ zi0aeLnVG;c)u&2Tv#V#kF$2m;ra~Rf^^aIpbFBR8IyO6R)>pH{OVP3N$k?hms*lzm zDAHG4(SXc(SyTCxs$X44pg2b*op&FVtDDcd56ji3_qrSK>v8YJ?|1Iq_&w;}f!~|% zf8h5g_umooiu*16y6e^}pX%nl)u;B=t*>t0SAD9Eo^{oy_S18J^{E5&JWzeAo}Ts9 zryA(lT32<71f$C9as>G(wIeU2uFn0eTpfE#=UyOJkHBM`T#erxxjF`q3<~Puo=8DG z+yfER!yQjSJ>0`6sGoZX1@&_WBB-C+OhNr%?d(!@vz0-CNF5o)!b={jo-va+fRL`0q9N1 zgj{+2Q_ZbVHRp6yH(w(@)%Bb7M(Bksyf?v z$@RVP_yz8TWXSg?NsTaCP=49SSL_;RA1U22>BWh>X(wZIRMK$XE^3JMFtw@KU46W% zvmK7_3YEHCFEmnfb5y9h>t|K#0bo_sLn-L8WFVjgR5xFe0GNX`4Vo{29_!4}3R#)BZfs>tAidXup9r?8@K2`a5-q>h2Ib)Cy ze0ZC_pWZ9YqbH_KGs2qhxNLVq ztDBd?+3w1}bDcZSR|O5tCEId zw>GF8T3#A&ET9CPDcZvc1Neos25lk6EBWkfDH~ulj!8@^3^<(dfMh=W#Br#D;~!kE zCDmFZpfe``Dg^`B!`!Y6vg(pt=E+}5EJWT9N>Ae|fm{r`D27&Ru**4g%!F9`56BWG zmUiPZoTA1DDt)L3fA*u1y}C1dY0wzU0Q>e|)`FrzYkp@fc3v&xR#`GL#cvNM%+`^v z9=)PNt+RIEYJ=o*=%A)8VW9K`G9`OmP~>(TWR|~5hliiNzg7k`dZ0d2tnVyMQD;U1 z#uei<&Tga*PJcMz)SSq}W5BYLpy3h9Qvny`q!f;YF{pMWSisJJ!^7RuGh<|-c+nmm z8_+`cI1Ug0U7VioWYQntJ}e|t?|6bcM}=e~q)>l&Wb9MWHh0kP&hO%0-o^a_xm&Fe zzCkWy=0|W=5C+wgMcSQ%!LbXg$}zgm zopIf=I)l8&OHIVc3zGt2T8AsJ(IUVhB*ITFij<2YFb?v3QzO?F{W}MGV#7l>;!Xt} zNaDIj&5$iTuQ`+?)O9PxVXL@(rz9;tFRU!N;`ZROaX}}`j636Ew>q>naa)p{?IYg9 z^}WC?lbx+Kv0J2{COg7iP)zECLMx+a3t4prx{g=fjxP;y&Om%=>WKHZ)WjOTcl6y- zwSNnxb>6%$e!Fkg?HY4`tI?RUrN%OOrKVzcSNFYSNr zpN7`!0da98Iie_dJru$^OfZ2ba1EsEb#OXv&9by=_u==ZN{Dql zp72DmB_YoK;3ILbrIrm_ZEb@p1GKHld!`)nLXLwrslH~B=Vhu1thE$)eh<+z=5m%< zTA`V3tLT;fRv`xzhi`<~p*O#cPA;jIIk%*jp`W$5O7X`P5g(6$nzv_h7n*TPaUl_s zKm=iCx14r-eV(Z@O2h6AS^{8Gg|{+O&VwZyt!%q-c=#31HK=y=IZp7Js6=mNX-j3% z6);{>9GZkh&Kzp$y!)Ek35e?ynsi_26UDtAiL*z%_UbM)G(=-8*B4@ym% zIG^o$iOPHC{)&isEkP$&V$NQX7KpYh;$C&bm|?<7)0i)PWe>m?Z2$(DxSmfYMP(lM z0w!&P?vuKT+hIlO-C<0<*Ydgg=HYlK&1)c;96|+|n>B2I$c!Kv`H#LSsWEe1rPnab zfr9pzMu{*QqCEbs7ySNkI-HXi4 zzlO{=V3z+!WDezfK$ih_wExzxCEnBpMF2l^4DXNz>oo(@?k~k<&J?ZXAhxJYbTO(j zxXJAZ9n(@~AF@j>t9e2K(mB3MU^Q`~EeuCtYH#!SikpLr)E^IK?P%ZiEtou>AYoUN zW=P98WQV2(cz?th4vxC5VL`QrhksY5^&VI6EBSCt7%Npn1G;$JvQKQe7r?D$odBMy z!2IyA=EF~v0wcCse@<~kOh`gM6+?S3G8uAsbkViR(1lSq(ceK`Bae3mPnyi*Axqn} zq{GA855uY*DyzOdy@uV{vbLxdm#hwt!Re8HMAaj%p9QJ+h$@Y>>gsET0wWag#2NC7o+)*Fo7HS6>i9 zT&Idl&`PX@l_Y5ATVuUgnfE=qEXWGo;y~+{^%7}f1kmtCCa1cDUE*OTe;5$IXzhjh zD_Wy4c_F^VuSwzfmn>zU%f#s37eWZgIS#Do$zU3vmp_6oxsU#cQ)D_zj^24jk0m1u zCMUG)VHkZeLCv_@0f=ff5ZvfbA{q~{w+e~EAoUA;aU?CXJT>|x36zA`0-gELb6PL; z@>-25=FobfPL%814x}L+z(7kV=I$!Sw(8A_e*8XS4xLep(XD!_SLLf);wx9Z8!u~H z^|T5ri!dS#Jp%c%p$8S+dfcFK1tcErChGP!GyxYV>xQ0`U_PP^>fpAUa>=H=qMi~0 zF+ots9#I2L!bOP7tudiCXeXHR02-_p^OB;sC*c5Hv>6ZNXb(To&#rz&f*MK2-Y_XG zhA1M;{6eX8L`e{&yOkhps-beGVbw09Eaz-iv5BF%ooY4p+sBHh4?kdsnNuYKZl!nR z=vNS%o(@GI39tyFT!h-pHJ46ExYv_(gH-0=sNQg|KaZUJ-y*lI?#!8ILSw{-34J!e z%HB#(z{{>30nh=~hK#$!rHqvV_l)ZA)utz?p+TUcJ_^PR<8zE9fn@>EOOH+VgD~nI zMM_Q8Z8BnsSeC5@GD`irUrQIb=6MEb7e{r&E5_;rnIo3Wxt0ue>dH$EVL|qO^jg-l zgkJacE;LnG4MIhZ5qGt+5B_W{XD?e5}v7f7hXTbXE^0jE@C>vFe_ zs#qCmOX$el-z3;vMpeSfFop~X(1gDfMdv|$o7c(NlYE`w4cbYlNP~7_LSMFXLc*F8 z(q!_2+){s~y<+sFgsjY}Rc-p$?rAn`@+4505<+nM%1Lmue?}FYn7}jR*noyPrV|mQ z5T1m_%nC^f${!iwWq=v6zXSp`3{J@0Jc0eS zn|J}vH79t@6d{xlcdjg6$jS_H{|?XDpLY<>Aj!p?Fi`A@r4F1q4ueA2C>T+!utLj% z($3AH?DKB9xryo)GOj4n9*!8r^Ccv5b0T9K*GNqi(S!e#GD)r-@cM?MmFBevwhd z^CaD@JAbL+OQBvfa%b24X*Ul?M#|t8b8suUO}wXs?j4?8N+{Cf@;l`_ zXg^?}tWJu-8h4!!Wp)H>?=DNU4TVSzjb9k{jkoF@0b)HwC&;6sObZoV+yz7L*nH7i zj!oCcSdGzV6md0==uK5=py`ET%Eb^sE7or&13BUa@^O`ESV=c>Ri$d6ZA;BkLUTn- zNKh@Q;L$1$STyAhXat~VeX54nsiF+BiT!E&Prh=o2^;zzVKB=R$OeZg`8TARAP!sa zUlb`CHKYz#T>s3l|7IoAV^BXmb3)u{I+P0F-j>Z!Q5O*3gebpdJm!m?h2I~?IWNA> zIh*G?9b%rTG|fS(rW&P*+_P94qaJCEd1xerh3<`zmFaJ=ian32#@9O{DFy1nAhQ}% zo}n@k#lpD(+(<8W*&sxMta{*;fhuJHL27z;yWC|c?2rD@sC29}L$vwCy!I!j5(W^b z1Ba(-X65qnSNy1dbnqC8*DTR?OU!Hg)#&3Wi~Vyneu73BZgu~i&5)h!lz^5X!B#w4u5}hlmIQ@t&sq|&SrM; zS4vTeCQQtWR;sI%iUCaNXnCV#9VNnGI>*=K*I62Q^3oLZyr8`}C@2Si0FQouOCbP$ z=*g)xN;jWluZHI4`n$o2u4(i47R>v00kKji-eq0udh*w6<2O20&GSamHQGzYN(==5 zdQ8VR%D_=pt876TJWzFjtufBpV!$@IhIt%VbjckbdC7=+YJW63RZ>qRQhJS2 zceczkKvuA>zh{&c6R9v7`#ZFZ*~WC>{pwYW;{D<7qTn@;yaGGDphe0 z1L8R%Yq5S%yBv(tTPT(AshS}hhf`brB}>_KLVbghc=c9*W2>wshR^pD)uLiuNHz zstVZtA#xHfUpYddFZ|0vJgcLP4u!5x)fj45_8_N%zl{op=Tru)CK>$*F_67!!fw$4 zdeBICkg0Yu6%f2pL5`hfaJb%eKV7C}uh7k3q=NNIPN@a4_b}6V-r*9~7b=Waf*jZo zFmj@%vteuUe1P7=SlVG!f|jEm$^r)9 z-li^zm-sq}b27+P66_v+w@@XEzEzmbXb*s{6i(XCIk!(7INZZ8*8dL^FPrg_bLe@z@_Eq918-nQ83a=hgS+~JXxKSR zwQB~T0V+Ncl;7Ry%vbV}BGi@e^*NC_h|MsFUiZ)OFSp!+g(DOo2OW;RgTX1JN`XXR*CI?LB3~GN72fkR?R_O6#Yni&!kWm zl>G%=0qfr3+S#Hw+0(1Pi-%Toxft~qtt ze00{Eme-E4p6CE+`h((#WmD~fnAhmk~@E~m|G2xJ+qcb48tdN4Rq6vSc7lN4{ zLyO)kF^NhsUNqF7XP|9U8ZO1rD@K76#0-_K8dT;BHuJK8WeJOExKb>h%1{6j4Wb4Y1k1dr7*)447#x$8`q zFhOa!(55>#*K>h+&Owt+V=!}O!Eo%F6QB*8pnp3Cj31#p`34`YmG3ABomUYM(5-q2qi7*f=Ww4X%k`UAq!EN%a;sx`*fzS+0weuC8V{5?Kj|Bf4XcluU`=3p} zLnASa?1s3<`*L$>5^jI^@B>tVO5S52g*b}e4y!2l`F2nlU>mQg4Qg915Qx$;Yt#hN#IxmRL zF|H@ZI8Q|%C^B4sr{Aj2okvo|hBXSa`174?1x>!rh&?$B$B;VCz5uaNVW;nukQMwYB0->zbS!_14yD^;Yj;u%vLX)L^|i`}2fB z_U;KW#og+yH%CCD)5}`iV~47x*`FT(svm|cN(YLJT_pO%5`*Z__tVLF*Z%m&oM?nb zysUXS8Bf#8$@-U*LtaicmM=64tg^&Fm(EZ8A`n|c4KAmE9r8#{YxJYQ%ka#$UBj>7={|!vsJKHBzS&h6722i`;l&B==ttKw; z>zyl7f1Hk(L>zbB9$5U8>$b{19XF~)TO_VVgt@>|bb!JN7?SF3#$iV@TU&Jcyy+Fo z5%2X^yw^vpj%FSO^UY zSDtVIj~Jpv^p~>P$lQDt=i_M22~2$(%l>PbggJPu-@FRQGk zsUX(PK4F~E~2u_@I%|bAd5BvINvfBYRTrAq;4Nt zi|K-+DLQ%q=2ZV=Q{T++7t`&pX_gjC8!68z3{bbI+y2_#ud_f9sD$JcxP-Vjbt#jE zA@1mJPw*cCs5*z8a@8M#_qZc_WP2iJ;69Z?M8TS7X^6LhfrI0x@Z0bv0ExZ9-fS^G zfNg@+^mmuw3?%Hy#}WXnl+I62z`Moq4Uq-mUaQFkFacqx5gEQxB=XWYLUv~QlX?z8 zL_tdNHncFuKqV98M%N}m?m{6zi3_PsBovfRh*RUfiWI)Tq3BHO#51VbKS2^xInc z+l+?2+s6<-=z-cqT4pek{X2@pOC4dkMW9 zaS1R_yX71%5S+WJol4ye8ZDC61)v*Fp3Ty=1E5>tZ-W`LPU=4u<0sSG+`Bdt7Lg4& zSNRLE33%PgU#8QASz?2wuFKL)XUF_(6l-EXEQ)tmV?}J};Rfq*l7>0Km=;=FBG*}? zVn}>vNx~pU!E3L|))V&%!#oruuNdw6Br{lW4&7)txuTEjQ*w8|KVsQAPm@|nI<-T> z&rfWf`T{TfZ^Iy!TpVQRJ&Za*4I-e=~zWVq)Ex2v(%_ zl&Z-rN38s}FWGJW*T#HIBWTshkm9uov8rexN*E{nNi|vhn2-itg9C+!1 zo|E@LU2yOo1C#W7OjyQnd%)XZ29ZO_F%7>Z`uYUSN1q-fmt{h1%?~#}7lIFx;p}OU z+))*!-?Gx)l(92RwjOsg=Gm{>ig%4ewPCAgg%7$o-cxyAQBla}IDVqNdZ(PuiSqo@ zav24kP-P{IcJ#!C$aH_4nNX?NkK%l&nuYL)tf}|Mm^G7EAebUqRj3BtJM^^QLD_LC zPj}U?H4c}h2Ut)4TFXAfsS4!Pc*`E)AX7@SjFNN}FAkU?Ci}cAaA!Lm&I=xbf zfE%;N2~rTd`Lye|JBYC=Kt@eU9&xNRGB#X_Ms$Bzn-DC23ht-kU0SCc1sN?_kMe zRc_biIQzq{I|h3X*X3?@v+Iu5Zg5>T+auvB?B+UPP}EvCol|`+eSmw~5VqDTh2%o{ zqJk!;x}-S!0N3rnBIpo(xH!Ni=_IvFdXRjKqnitHXGYcb5wye2x+&f2khX-vtc2`d~k6J|JaJY`f7Y{>&SZFt{gZ@1LG?)iv$ z{>l>K8my6!#e9(Rx_WP32+=cSs7aUs(~#CkV7VTs%0~CMzK!;GH%W#~-uy_qI_iw0 z)EI?b8_Z*V;M-W(EX8i}e)sCCLlF1#hVOkf?3go);t&3n_`gN`BllNU{AQD@6bi_7 z-V@yD14b1N+qt{qJ5T{P=&%iHe}7$s zc=rAGGx?wBeqU^Re_ieS>-vCTuKVh4lA;K)6eq!SRtnCV0p{&tBTEZ?TxDRyf*%?z zC`4(PpC~mz2e0->F!ozL6b_Tg&tbwAv_ad50LqNW;qF9rVABAs&ey1HmcWmg4aCw> z&Y$V*`QGzq1JSnEK_)`$d@2r^mHlHt0ME4&th~xp5LkF9tUOfK@oZ3QQGSCqI%pG) zP5K1k&X6@E$ZB#vkkcXl0W~Kf5I6xL-;>=ftSLLf~hW0&Sn zr-vLt=avza9vy2CE66XqBCrpM$8P03UO`79EA=``0-_InN-^=iGnB14l%+_=D}cf3 z-pSzqZ}I$R5XwmaA}Sn4X$54<3=IsmM1T#i1?W#Gs8p@r#z|OL@nL8ij zRf3p4)vS}-jznDvQKb5BQE?iM82luvjq?KiP#G_LM+ZR&16NALRx4bo_RP&axEp&w zrG7XRMVuQXZ%~09rV_vBUAGdbVU(L+&Ia=Vr|%Ava^}OCa{P$+UTF!XpSYlqasrZw z0jY@H@J*7x+ql9oHHjtgcJmQS(n#V3iqBb~ig1#0s;WNzBnTfKOV9pA{munQ{GbLW zR5#jca1eh}wraWPl5z~Bm%i(W$r&OLj13XJkJo}*NX)|MHMQ%GW9DD~Yrp$ACnQ1Z zk0$Q*HcsR-7*(yfWQyK-EI1Pl{5{~-dDO*aELF^N1iJ~|PJiuND(VBueJ)nkt#f)n zmt6}E$9M`ogBS*^AJX2gg~lt628CeAF4VhfamLZY4~<%|hgfUse2dB5JwmI2m}A~4wv*M!1?N(^}H>%CHqo5qyRRi;*za$M$x^+czp!s?5H zIOpp_5AHUF{GxI^UmOuqa027O+-r{dBZyUsbvWZ9MGxw{Tj5Zhi2uA>N=uY=5aUi6 z#bSsyP>j|Dme&D(O<#u5;gVl+0X46O>`bSGDxX3mNJ<5*PF3FAwF`+lVuPy)n@iDny54n0-z8fv(;CBbHZ+XobjEpw)#vJsM;7=H>Ad-F%^ZD7{u zo!9P*u0-`4pjVJ{#n^cXbchOCjrgR3c3#4p^Af<)DfV|KXRvZO3v2|K*2G-h--(K8 zK;s52ZeVj8DV*B_R#+)iwo=pN3?rQ^1Nni?Gg5k-{3^x?&H?w4CtT7@NwPXM0C9sP z4m~*(C`(ydqPLItbCQXt+sQQHGfMNZCUmzP++J0G#Qn{ds`~y1@Vk$@_mR7k!CZc6 z1E})%pgqL;k4$a*+R~cJJxgT~-~B})oXgT3T$YFts{>MfwttjercLQ|jdZ~it*QL* z1sOZWL5_2j#B#85-3qxL22aha*A>Hnyd5e=8eVeXS5kplA~tSxNoLpWxrHfJe+mr& zwa{&43p~a||CsvIE7~t#x2z0A-(Cu6pSc#_WP4_QkXrCk*n~^* zKWxC|Da0%8zC*PNF|n!oH@`=c4wEAQ7RT^f ziYXYh&k;anfbFwqr98c=;kC>vB+Q(;*?_4KsS`J$N=INT<~s8zWgwTedrJ6{B9BZ; zf^YWjlisu#aIfcW0LvyeMZdw&D~qS{EcsL41R5(9l7sGay>`X&dJQeJsSU zb3i|#h+nB_{oO*y1E*waNb_o^KN-39jg|7$EKK13Xhr7c4~VH_HRzQ(P;q)kq__$F zb)+Jt52BVm*zgjPLEzujz5+ebKEv6ax+AedQc;Ggm0F6xm>QFY zYNK+7N`WKhFXiypTALv4Kzz34f1TLcnVhf^rPqh=5ammXP9Si^b4 zRr-(2l~fMQLxT14o@84;9i(Xu<0sj3W&l0QXZ`gl)he%0j-Xv@t+CMMqMA$`9w}_J zNWx7*>3cv>CoKs5UZK8Xvs4B^X9_E zFDx=UmMt?E%(Fke$UN9txXAqI67#a<6!{?oi%m*OX7>3kY2MPM%N+1uwA4&~=KRG4 ziwx}kTnbTa!LQ_!`761=??2@7AL`<-gMHDwh3441sngP?O*f}!q^6Iz4H@;g8PHm~ zz-hNHTIw*TtXQJA?*-m+M)@Nw!2NmSAL4yV@L`CQk3s*jAHKUJtYPvaT;`lV1IcZw9 zIm2oN@N8*QGSgG0q}Z}klFd`I$J>&}XC<36voexWlBZ>*pbqKjDXHVr&EvDP$0tp^ z`<|SlyeDO3WlYOXv!$4`Q?jO{*~TLyX1?o7EzLnb3RasHV(p&B&U9I%Vf(rkJOsA;6Y; zH{xVe`R-d%MrJPFP!yn^oi-so#XK=(d~!+_3Yv)KrlTBNMmDlU;mkZGWlBa?t~nzo zCCi$gF}<^>^t7qj=Io3NjOngrWu;_K%d# zkZYcql9d7Q=T6N|nbO&MKVZ`y%`j7IQMnA{M6Z7MB#pOG%@AlaThr31Gi;gYx#aQL z;}sBOnYAKl zwoRKdAq5>`Lr+t0VIZVrnh{|dVotN6i!xGeX)`fGl$seZ8qDd)XEcpmjA<2=K4N%zO&0 zfF+{N{^_t}QDNb{r!kk=|1YY;%p8FkVKAfsI|EDHMNA#oco9cRKt_}+ea?<6Qnab* zpaN;g7_uiv7DcJx(Pn%W1Cz}f^628(^t;52*-luSzu7yG!)!k)O`#Wx$C`pEfUFMwR314)RQ1wq)MorLk-(f}B9&geV6C`z~Bu zWS;-L`GrOHWe>%&4B)@~f@Q_AK%5IZoY~8O_{;^%3JVEn%YmB~6TXgRne*(9#lIf( zN7z2B4qJD;VyqMT$L|EKJO1ZULRHKNA*7!pyj&ZiuX`(J&jelbu<9yJ)k0NXYh(ZY z??OT7;gRPKkNNQ*xWF}|UkD7?$I7u|bzc=Md-@x+jx;EaV?ZK|eKvuy7m`_GA1lkO zOJxHcX|7FClgQs8Xc*0P_Bs2&43IrQp8&YSFhK?OK_YCgt6;t{QTash4>W^n zB0Bt{_{YdT(EGj2NY2Vx&2l>iY`%H486&Xk5LTA?Laeb4a{<=tMGJ!sg$w2_{r`-L zne&IxjxWu)K-IG-Foe}S9K@JGCFt-5%i3e{rc$Z=Z&`RtQmOrK`FNY4()izAz#DWY z`rp>w^Y)i}-afqN?a)1Mr|)^YcF&vE*tLXS_q@g4^ETn0H{3w)QnP38d4qswm#_`@ zyuD)-%qsk8{;c{ldPa^`u+BMSbr^loSZpU*xJso7(CYR2i0%R5a%4a^$i#mj19Sla zu&*hbSWT!bt7QDhayVS7fKU}VBN2#U5iXNrS)fo{o5Wbb2OY1XaRacc)byjFABf9; z5P%^>!$@a{Fa!mvR7O>JFb~tKRNYjnQ2fzHt1}q<;ilj)l`2G~g!4dZE;C`ppPHGH z#1@zt>pK0ir)09&fddDE6kF;nD0qm)J@)v}VZ%p^9QDNb2}#K*Ru&#EghzzqqhjGO zQKeslYGK5O0}X{lhUh3Hyt{#Y5DrfW3V#re`i2IEgoNk^t;X&3EQV0&So?QsBsV;;}!nXwP%69@rBQOO~&Z$}Btyp7@5As^6(+Cx>>5})3GOF^D?tS zdun_3R0Rha1sAO+)UUF9<;w2eUwkoi=$0+hrmbGxzkfQqi<@XeSlPIKup1~~OklmP zDJ_4y{FB$qOH1XGa@`MdX@Sq@D;Z^CrcovQIjUq7d6bwGj}peB5)z`QlppF4UuFsU z6DH&*FuCsaPd<6QP7c+DuKePQFIFVv=jSIxl}3#lIxa45dCS?d1!W5sJbkhD^_dAj z{E#s7b*y&2wzDp#3K{Dg3;XC%38hg{r3q0;mY>h^S=q^xFZS-;n~hyCs-R%h7b~b` zrKP1j9-_%SepD1A%!7AS%jh%W!Q$rn=EhO%+S*zl9s~2`e2fT6$Va>^BYGr&}+Uu(;)M__VVXUl>Qt z{X%&f(b7H%1z-4#(X73;%}DQ~=GL|WqOAQ3WPp5D;Dz4tQ(}x-PNjDJ&ZSbQb|{?x z!%ZbqIZ@QwlKRu9PuH$samb+ki!WGvett=Qemi;+AVXKS6`%_WAci*onHA5>_bJc0 zEj;|o{ILw(i)3Fgzz&}kEZT@_qCOY%3sw~5Ut}!+&is5ItH0v&9jmWr^%q-De~IU) zg8KUUf>FG@xyTR2fAQ^#KKz~1t@z^X@;=ng?Ml7~#;2XiL-uhDsgL=tAU|Y+yvQF_ zSiyYtYoZ=Uc`H!v+_@_lHQuOIu@y8nqE=ui7u1)*bU7xu9LM289kjw&f*w6PcP`rg zExmtHi?aI|;SGO!ZwHJ<70g9*TJT;(&~7_Bx1cB=b&X@odE1RlY5du_)cA|sm+HjW z7u0w>+o<+DKY|fs-vZi{At!v5mg5VRh}GCyBaw+6bB z$ae9kq3mO<81nW1BNKIX@FcHoxFY9mJnD7?t~p_8Tz8`4%NDW0@39Xa`zpR_d9SL` z_P+R;wQAo$UqX#j`yR~d=+-BE;Cv1WboW8okF^gyf|%#S#eHhnh=Fhk zv@$rlL6qj)^>QFjM`ZavhM!Vz>TC4X z`bzyQeX>4I-xFpsU(proth$GF;X0U1NJzhss1RewOA$E{4@LBecp&P9$Yqh^ zBZo(ZL_XJjPWLI@Cv>0EXGEU?eY*9z*85`bC{BFQM9{SVZ#KAQW7C)$e(D}%$N0J^nZ&_~% zwAddV^yr-7gNKI=e|^~eVd=v@9-8_1#wQA%2z#P=lx5VvM^=w~dZcTNV@&>-)G^^> zeoQ!@@O8qc3I9yknBYoqBuq^hlMtIA#y=JRSbSjoH>1B8{pZookA80SQ=?NxKQ{WI z(b1z9jemH&Fn&kk+ldnrHHinu{drvWxa4v3$BrNS^Oyr;o=?e6NlMw5{6X@@WP9@b z3E!lXe--IGpCsGYE7!YdOhCO9YLPDq+#nfqqGKJ<i)K!lIclby z`(fVdyf^1RKR<82ZN7QFX@2QE-`ulv*UUMWcX;8#g%cNCpa1Xq-#_!OXEr_4>*)*m z!TFl}>x;f$^v05xmJ}}OwuCK-FR&C`c<#mL7Cblkxv=LBKl|~s8=sx|?8s*?FFv!l z&u_fT*Do(y{?f9im*p;dVwq~$cT3-18oxAX>7^zAT=G=mqlF=bW9>iv=Cj{q{N{<@ z{J#K91he~LcT0EfcAs`qcIS28b%S+vb!T-Bb?J1`bhmV!bdq#wbWe0BbPII)bK`T( zbG>u1dXRcvdKP*Idg6J8d0}}idG&a^c$j#3csqC;coKN?cinf8cNu(Wep-I6eT03t ze42cYd`yEvgFAyHgB^nwg9U>Xf{}oJfNp?ZfJBEGhXIGxhOUN(hLnYCg+zrOg$ISK zgkXd!k9LpWm41~} zl{l3Um9vzJlU0*Blb@P~nh~16nNgW{m=c)%m&}*2mq3?4oC%!Un=PAFpdz6DpN*fY zo|T?}o@<_0o=l!ao+_Rpo*AA4p2wYxopzm3oz9%ToO+;rpoyTIprfF(pxmGWp%kG` zp;Dn~p=PBXrTV0iq;sTSqeY_}qXMJ8qIsfRs5Gehtv9b%u2QZ@t~jnPt{$!wt_rRN zt_iwYzEHjZzT~~yy|TTky_>yOy+^$`y&b&-z4E-!yt}-eyn?)4yhXe-yd=CCyb8R+ zznQ;lzcjxLztz6KzOcTgzJ0WktX0!#u}0%8J=0w?Qa>xS#C>kb3=>l^In><;aU z?KJRd@bvI8@yhYt@e1-i^AhuM^Ck2F^xgAM^nCPc^r7@v_xJVU^+WX+_5bwh^wRXb z^p69m_+D`e^zz`XBnp`Gxy_`#<|7`~Uhd{CWOX{wDq%{to`C z{h$3b{UrSg{qFqE{IdL?{B!)b|5E>h1=a=c1+fO70E#h`F(^1NI5apoIASthGFmcL zGEy>5G6XXKGyF36GW0U=GVC(wGUPJgGTbuQGSo8AGR!i_GQ={#GQ2V@I6OE&I7B$s zG}1KAG@Le=HcJAB0d)aE0S*DM0L22W0t5q<1HuEl1G59+1ib{81Rw-%1xN*l2XO~R z2NDMz2CxP72oMRZ3ET-)3R?@^3sVfC46h8_39kCsQ9c>*{9U2`69p@auAgCZ?AWI+&AnhO3AH5%? zAB-O(9|Rv~9!ee%BFrJWA)O(gBE=-TCABD7D8(lNDJm&eDUvAw000000000000000 S0000000000000000001%EN0>W literal 0 HcmV?d00001 diff --git a/bin/dos/286/old/l2c1.exe b/bin/dos/286/old/l2c1.exe new file mode 100644 index 0000000000000000000000000000000000000000..dcea37116ccc2084b8ed09993f658be27ed83485 GIT binary patch literal 104360 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

    d&C~aq0A_h`B*9w+#{*XaetXLRHgxKii)N` z2PLjPg}8%y@(RwT1}E&}t9dtnih_77q56G@hys>c}e_{lImoyjY~2tQY|rxxNv?JKZp!b954Ta-UPQ5 zog~Z)LzL1PwMeykrIK&*uWT(Qd;|bJnxTzVq{wY^$u|5cht7oHP25iGJl~!LzfJIo zJHPuT+1zOjCDd4X$LtiaDD3h81>6SGa<4APqXFc}hJ1aVs*;6xMtRLzX17kGt$*ua z40BVZY%==s3$Iy+MJ+zm(Db!vpBz!iqON!nG0{WXkw=a^{-iKI)5lvnD;c6Z%`{4x z+9I=V3t>^wsjqA9`7(?p2z)xTYwO^D+oz8$mO#I_E7Y;yBw!;$clr@>Y=Pu>H|()! zwoJmIt|iJXA)X9rM?9Tcc$H4AmgHzV`HR?5+I#x;En)T)tqo+w88zjmiM7_DDTCo{ zp`hHOTBXW3b&jt$?dIUAb{8)@3>Qs!)2#!=qi){axSKZQd5b{x<{jRw z^^C4F3oH;(4U1zCC@-@{L%;b+4;O>IK+sy%o5Rpx&uaQrN-?$*o}GDp(JctalJ+d@ z8O;%2)h<0FKBvIAGcFn1|GHJLJ!8Agp7uw*A}=gu*pjf6m^{^H6_!jXee>m;`|kK$ ze{5~VZ}l}rwH_~g)!Y-RygQRPaQARkILm5khN!rTkModx(|+u6)$q;4-E;CHVq2%- z0PQP$+!HEU)Dx;2zTQ3H3mRRCsh;lRxXPC6BpOJ@l+<97W_*t}PFPidO$#l*7j6>v zHnZCz-exeA+Bi23dnn0wf??uf725hOsWeoP^al+?yw!|uBd%aq+~LAYeD!dqN@Xfr z2%YV#WPLoYI`cJ|NO3w^sI+Hxrni|p(^2Frc;B>dGr2YTZ3Pyh3H#_^vAdp8Nvf%m zO+huD-;^Rhoi=%wy^RVLxB^ld5n^=jasPl}xcXxx2HV1Mj9wA~385%Aq5v!|MN=5K z&9w=-OxK2K*`|h!5mNiNKB{s{3Uy53zQ^}caPoL+5;kbice9j_2$0u|OxI+#D99uB zdBW}cWMZ>r)a<++)Jxl>?vC))7&c1e#S~ zX1+#bnth%x%YUc$Hr`g9ux|sXfK<|4mh2Ci`#zFgc;N%mrG{`_aXYWk5XV?Up$Vw- z;BJp3P|N9{tyv4MO@Q4;>Y@`yXa|4Mxv-rCGH0_EM@45C@MT_EE)D`kr*2^Rzaa7b zayyf!j*u@=Y_~Jarl0d2QEHUf1i{iJU$qX}c~m8#m*ExK7V$ z7yKiqauxui=U1LAoTL8p;jCFR3|usS$n@Fi2(+9AJx?z)`!Is)=(+Rf@EtYL@cM|F zAhsmOCo!xZIsm?O`=r4(MY~4_Ju=jTMJ~?Db@B__#Twi%bfQhz2vzabZbv65uOZ|( z_A25!i9LWXC1jy|3(Qp!(`O>4TCfEcbL22H>?zPf<#fJ;3A(T2iq?kh(+?(SjiT>7bZdlW^GkBi{@H;Bmw=0k4P_Cv{Av$FcR^9D2fb8Huglg}N6Z zw%)UfraWD;MYB|$$0eJ&d|76~;Wg7CPc3jCw6OW2DT+-#v<>)i7A>?H)~_v;>NpL~ zMiQQTDY#Il5TBv}UVs5fF?b|)O3{^S%GBscBQUh0r{p|-m_ zq0}ADWY!L`=uBpAh($B~$w0Rj%2QQ^wv*7chd=xg8M+hOFu)wobC!N z*$F3ji@uJthRa+d7(H2XzIKVqzAxPw*0l?VY=_}8c5zIK62Hs>9UNC4%je!tPiXVp zj&0pto%%~}ln@nmcIut9I2?xuIB)gjfu#K6%k#r|!?N(AxYBT7riyBuhR4HQ zR=Jakqnd`hxcu;jq+57|J-gkMKWWd2poh3+cDwTHhA?7r0u5 zq7?0pBMc$y=bo1m_Br*r;q~02@C$-#4z3ikH`rZKvT^$oPPlfxyPDd zPs8w77o?crJ{)7q&h*6E)AA4#WprNrmSYUX$nTwe->`{YUw z=Q<+T_hGfVIGi!F>!R$xvRsX_wmov2R>VO{KOJ3`dr!3Oky*p+->pbE;WR8l{}zYy zR~2cC!WC(Y!`t>m*p#NUC&CMbiTJxRyC%vCg|~c9D|Wr*bNzKcQ4`+=g{$*{O+#O} z-T7_9U2)HaH%z2Y)m{Yg+ql)?ciVYaDqDf%v~b;UaiXkLQI{=k2OqYCw|r(}6aSTuzQ`bFWMA6>tbWx1xZIf_P5 z)`7p-e2n?3?N=i6&bnsEmRz-e=c`Oh4;7Y$PIHZCo;G`fETPJRZxxn@uYTvHcV2mC z%{!~#$w6zEhu37!p2hEmRpkn0ipDv8o9Fa(&FS0TbgJnHK8HJ20~Sg5j3!1I_fL>) zFox^jW|SwHpHZG=c^`vOo@RO5v-o`P&>L1RMNQLb`oL$|Y0sG&d_!Rk0gtG_BZ^F&P?LG3#)bW; zE2HD{E~kVPaHIR=omXlnLcE?nGww`{IWwUORJu~rwr7Oxk{!}v_xwN%@PoY}0!(82 z+7-*JU!}xZ&jG{Xl#rzdw`eGx6Tr$_VzlRRF>E*xB_}QnUvk?fd)gB4Y6O<(7qF&1 zhiUyR*0rZnewoLmJhfCFyP#%Vm3Wq57DsN4dbJE^Nz~oCilT8k0{hTXq*B!T(DGV( znFV!&O*i-{{K;G(S^U_{Kw3K|Vvj{f({(~sH0f9!7O=tp9+-8{0~792X@9eDXieFMzHApnbRlSl^UjvGE`cyqd4g9 ztqMbBKfGN{#~T*Pc_nrF=mY`ZC8aX!ukoisb|x_YH#6h#&5ZSXPZmC(*&K5ThjNPg zYY$r|(7Brx{5LqIW4emv^VKZAc8843;<9H%WtB}p1yWeQYXZy0M=Z1avGb$rIBe{B zR+L85J!Q-``NZiN+xoFnzPUK}HHRHfo5TF!LgO4ZDZCI7lN7edueuY`z1$qOtI~=i zC9f-)C(MwmWQ!EIeBumxW5=JTX4V)9xz<&D+me2jKH*Buq6j^%t~TTjV`UL&os_O} zEn}W2v4|~vky@X7A=HqIzjr`6AbyqO`nsBxXqR{h?KLG^TO*Z=aIL~O^i+}R#A#Rd zZ8bt7{%YJEC{-gx%TJsx*E9SPsf4PD=&x0={=}&Y9mB!48X$8<$yv>|P*yqq&Rqu9 zaBI5rmg0Nlj(X*(OWPxLJJ*NqDhQSEglsQT@0_jP^^DqpucO8f-=?ALr>^ox@!*fa zxR&q?2Oh(o{s^ZNn#(nI{QxGHa475th$UY?R|`YQ6XDN=OlbMlS%yk56Hew8ndRezwtAUOi(@>T{g4a}p$+th zR<6j}>XkO#27G>CKcsY>mV1u3)oYMVL)kR$Pvk`g_}2GV*-v-29T`@G;?X#8ud$y| zr*_C}syRBl2Ue$M_yk2Nlg+Wo$IDRh`s0gP2&ZAu^BuKAAAVcdWs}dT$(qG~nTW3w z60y}je-50K?qhPxtQj+L;8MwF%DqR58tmUrXmmHakL+)&ud>d7?NNB~q^xasl`RHK zU72lC+wKUPrfs*z7UfAOwRc2X_4bZ_))0@e)Vn)EW{b9eKZ(apJ;}5!pm2TQbJXda z2(Lfhb|S?sleN|08bQy!rQL|FA!0!VcF=IXh;x0yJflh_6gWkxaBoM~73+_CPmJ!4 zbS?5ZE{J&BYIL>-_)CtnxHG~!@I=~ujJ!6krR+o;UZEOM*wahIr3TCZiOut$6K5B zH|+;@Zw=O>mul<>u;7)W^9$L6d2{FIxF7e$`dl)Z6!`I)U9VyC8GNRu@Y@Lr#}y4W zPp(9O4Ze+cT#2{Mq9GXClc2x67EDl-oKg5KQx;Y$WzI~E>mSUO#pXJ`onQwpjUBjR z?LTS?_f>P0>SUfVQeCpbE417OnOwLfW}y8*IymO|zUHRm`@U*k|5aKPTd&2XM{{GZ zx$nPrq9AfTpE=lDEv&E_+RTIOwtn9%j-*&e!C;0j>fLGSvdqCJ7Dv{=&dH2)X7+Pt zMmaMFIx`1*+{CHFt7P`eveYUzXNkgvKgZSH*;bowdkEFSTQp-9>MlMeY6q*5PqSbV zrQwg;zf;>An(e2n?3b#nA>c~;J|&JIK8KrV`aNF|P zG{-xE4X7vqw$df-cdLw{Y__YR-@`9(u!X|nK%oH){P2zS_>1mW zd{@_J%{Ey0^Lz3&MM}G_Dl^lWuW5AAPg`T`K%Mcq+Rf{o%2}A?JTb^znfkhiqvyDX z0_DUaBbBofPCPg#xz;v=fex&C?{Xu^(p&LP|9a{pR^8mXk_w6{8d-R)_D(IeYPy7jPP%I@=%j^ zK;HX=Q^7v})4b-ihkpBlirLv+4;&la-uU@ZvJsDbIbh+19owIYMEw32=j8CuasPse zg%aOA7bBCap8QJ)Qhv4Y(5fdsNZN-57F*L{uJ`FaKGU~X2_+jhUvp^R8(D8%LyZTU zKKtSq8(JIb@1p&e({yUX%=`YL!uzi$XU#t3{-G3ihO*LMyc>J=yD4u_yn;nICRnu7 zA8jRKf4{}>`_dU%7bqn;_V@E+O0zcgE+J=Y2dXZ2a@LEKOY`ox{T@tRe;!{_vVSb7 zsJXAX^&0g<&i=6UPZRivzqe=+df4@+_0PPocnwEuSb-zt`+n_XK90h>f+?4-+kGng zkL!tYf0;hE?arJRzs8r{tmqf#p8Ds$BOl6dC(`E2HJcY3KJF&Q~-&4>pBZGgy#~*L3X{>R;wNn!({QafS5;G1;6rU)m@hFRrl+<94 z$&<|=DLP)|kvmRvR07%ZLpuW~qkxd^ivd19%uz45SC3e72%k3}fj;Vy2b(-y6$6Xi zJ-%^ICCyOEzEpbOY*| z_c?yhVat?xGEhFDY8MR5Z%XR%cUg9cTHn?DbB<-tgTvURZ`iu z8hik1za(#~mRpA)SCl4bCJ6nPeI0FA@|I7e4%ri1AXD+^S{Afxg-QNY1w6elWGDv;8^tM&Cz(PaWw$W>h^K}t`FWd z*4V-y6>@L2g0uB0yrL|$s_W4T#%jdr<#**e_%tJHu;~zC)!{c?<9sB-y*XXN!@7-8F$fsb_HDKSU5<@JI951&WRa!riF<4cno{o zo83R)BG43mm^BQ0tU9{r?#(y-k!@TkXtQVB(Ph=1=fJby(49zsUy2j;9-hDCS!t?X zu371Q?xJEZe8J7BQ&_GnWkL-qtrE$`G&(Bc8(+7%5)%{Y#0S0qIsKqfvs+s=wKZG&H`RUb zdE9gU^PT^kd(MCEJ(vdSwf==VcR%MoM!?wSK26}?k}WHIHtWb6va(I~!OlqAH3cN&OUUQewU)u~e7XsCSI*J`Hh?(YOv8K2QGAzd<`A zDLG%0T&hck826b614jdgU_+>bfs@w~k0c&QJe3IVTKN9}jl4wqMk?^Xu36?8%DP&p z-94{h%5^Zvs!%5SG*W_mFTBB}5A?~3+_j8(jg^;>Vv(Zdcn*EYu^xa42wDJ zTVmQx?U6JQxB`~K*%dvB{qFAY6)_1#ylL#=ghIY0CT{^qM1%N%Rj*YNyTH5_$}}eB zh<7-{h=>tyeN?=#&*7#E!MP=-y#?lh!cbx?^+=I!lRM(AzrFC!LK$)H_?z`mOSyz`87B6@2)4MzMpv^8Ph+ee4vG| zf~{~Xp^d;C{HjIbLs|9brPS5p$OWH3J``>@M{gyGlU^r@`Zq}8_&14Tz`JAy_$7m1GWcmnL)at; z>yXE9CD+vb+ja0F-DGH8L!W>;-jI*Mg!Zs`K=nhXLc4~NRsQ`q0-Xf5`+;`#n&*tC z({saf(&P6W@LYXui{~$%Gg-T~Km^HEwK&@3j#3Zj6?LiUu&IlOwh518=F(nB@F`+4 ze8<2PRH}PG{2`b`oKw`K64;DPyiZMlpwPKSO^`Y{u<<%{JBhRa$Q+itJjdY8@wZF_ zVy*Hij(4{3d-x8|MKFa(7r)&Cea4xQdE9~#%>!cU;68)%hv7UXvpjyl^3$mIm8%Z}TEe^D13)p1x$2 zbY9wQbgn_UDLF$sS24@GI z56&h|^X5uEb>r6NT*GFkX>(D0b0gfmHs|W#<(X!k7Xn+!yd4_py5u?m%F-hp;M7Cl zOFa_6!_dm@qJBH6TpCDd-qYQedR?~GNiTBsV4SG4}y&j+2%iT*z zmaoAm`?~uic)4%Kbai-5qU7l~Gi_&H%pEbDoQR)0f zxJRbq1;jBF{W#s342DoT!A#L1;vIXBLeAMf+C z&basXU4#DKDLq`~$@QIq~zH`nwRbkXC&~waR8_ zg6?6%>84xU%@F z8hUJ2s!<-%z&i0nXdwLg1|7WOtuuGj8_Pit zyyk;yXjDvx+ymhT@vUjEGY1Aahgv7cik%b@Cr0c9cOdA#7Ig2Ww;m_}6j|^8N6!Cb zP`+gzNP{;{HgUy@fzZrorxBHQK9e?!NjrI?Iab<6&NSe9FeGh)`|F_lY7p)dpfhG~ zy&fc%d%dP!=OC>at_>cGJ?ITL;+|poOIKs+(+$&gmqtC#$^-Xq^*oG^55ow#_gZw}mgO4CX@d}(Qvs~| zm^w{+S$X53yvhXPWf~HrG5bIgU zyUXo|T~QY{TAVZ7-_6^w5^U=)B$^JH4m&jooP0F2-V9Gh!!DUD1&7Ax>$@6p`Thcf zu4%L^0-Y4;To2QO!IjB(OgZDb>@Y$4aMSNeR1&}SZs)SjN7k>^&QQeu!Ccrd=a|~Z zjwjU5NA%t=Ux@bJzl1$_e%0}-9y$VzoKM^4z5)}iNZ$m2QwPsujDDdH3Eox4~kU><-z*v2r~^y&q=HZ_^%-5T7;Uu+3A zTV@!(2{S6T+5#+Lt-h5=EqBD}iN+c1)VTf_>d9jh`S)mq$SvLw7n~dFefW!>MiU=& z?V;JXz%VncU+&>+pi_`4`Hf6(BeG8mIvnkyv^2aZjnqcg}Z?Uj+v+4gAKCb*6p+zpFt9v*FV)QpwIUG~TyyGR!bS zQw=)L5RG;40M00Q4|E;# z@Shz3OT@l}Y{+b*LD_M|-I<_XVK%Cr9|!&fHKvmvXlcHG!Gb=p z8MQF~e;SC%wIPx#y>L@Nv0QZpH$}?A>amE69wl4x?8I_h=y37Ne z`gdT~1~Pt;Am6CgOt49YU^Au(ONu7J)ZSTzga^I}P#%9_B{{@?Q6ao2K-4h-ca; zBAvehYfW*|`CBSoP5x&X<-pA1LFxQX>YfKHP}D6*=ZC19+YFbO2mIAn-x>w0!}PjP zJnDok7iqK;5KTQw$D8mrE0rn^*3{H1Ug!*&u_HM8Ez*4f9uA_#=7=|HtH{;oF@;c4 ziPv|+A^3daI2ho-!dJ3tq>E(zz7yhDc?j%9$`Pp2Cg}5;K!x9H9CGCd%Ul=``hL`gZsvisQpfzS=j2@9ys^sp5@wphxX6#?DHYm zlINOM>4w3BygP91yTs@zSV;oc;O6m(dpDPOicY!V!7;YeH<-;k!K^I@%4tO^`!BaY zLzF|8gJ2R1c$e?=jL^n*4=MM~8c>UWx&K$kWHw-$CNJZqK516BD^Fj%96A64JTn@< zDX^(ay1+>nxmnj-)A@nAF1Qgj?GDa`=!T|_;N0vk*FE9Z`<^TQJ(uo17e}oH@ocM{ zoi7mOAbnJFr$|L&l1;x{mcH$ka^-i-`D}4J1SMTAgGN!T6bBXIa@lize)&{c@lxfM zO1&ZW%H{G6rRFk=%o4e-mOb|@y@XzUL@g^;l7q?x@PtbP<)NyZMA-N!JoI0B8luzX zb*k%S%IwSDwjrakDhM_`@C!iAK`RU|@`V}~>(5h9M;ZysS5&u?_Lq#xz9GlsU;+We zU#rFKuNsv%hFJJd)b^hlm46sga?~=|MTCaD7z%k>Ed$T(T!9>DTg@xyL%vhg5*SDu z+ut<8ds|A18j>6|vF#wQ>>66WDZrAw(jTeUulj>|v_}7Hsn?&1NKGH=T0xXWsytM- zd}kF=o>JvihR!@#cWD0?qcU_0{@2kW!&6JC*gdycW-mf!E6bO{J7Ozgd~w`4Q}#9J zK7gmXU_YCM-RB%PmUkbAl;G}0=M%f>zzDKvuVOujvM?%YasPiKrSD`!%H@>g`~Ai3 zJB&(UNQ#O5Wy+{fVcRB|ln+C`S84S!DbM=7&{5s>Lmy(%upNItNcpAy!<3K5O>Nb{ z2DYsaG0z>~*_!h4^_13!*sivd3JM`Oeed`WQa*cdMag7uLE$9D9|Vsb;V3Ig(u3(c zQeI9!IcIyyvwzak=ZMk=_1jb6@p@&}$c&{dOGRK3nBFT47zc8oVD(rTNShc%Ce* zsdYJpDu_KxAUr9sI2?kr&JH2zHk%E8Dk_P%nt-rtg`cgiwu>%ds)G-?Yc1=ltrgWm zjYY6k*ek6(v6FO?UMo6DUFf7LbmCm=Aa$#$7bI8>=Y$vXf3hT(CsWOp0-5?a`*G1T zNFKg|u#gs&(4X)7fVA+(3kwStCdE@QrtR3IdsC7A*F*sL{c zoX>-h)+)F#QwU#1gQy>nb%H-VfVd;lyd!wV?ZS>sI}}=7;|!;^aup=}bD*16nM$c| zh@?)7|GcH95|pj{d8>u$C@47E!b`*sEA+W2CXzTvnz-Aq>MI zl~zYZ2oP`#IjE?2lrkK|>KS4VSHti%cN2^X&SKmx5ZYXI?YeOL6Rno;nZ34xo((sk zC3kB*JRxKCA8FqqA8CKeeWXo=<7_xuXJlk#g!}G{%#5rIbH<|?k7Ycb@kGXx88b68 zGBY!?;ubxgSzrHG>EPosA6h(rG5juEyny}Y(qyv|iBy$Bq%%)6c;`PA%_umUklqPV z=U?HZHtt`ie5AeoOB3d}Abhqbk!UA1oqnRO=*iP#M}B@0{e=CS*oV8zClujD_R-ws zL&Jr?LMbr`B!C2v01`j~|8oN8_4J-gf4P{8H8Bp2W;oy%+TnAJZutEF&KVRerab?9 za(^ZLyqP{-5cf#m%)B{NMIpq+GodX3t){Xz7pV%(+Eo35(_zJw1v~6RK=>i?h0BO?w5|c8#>jFQS%jH1 zLX90b)Yx5Xo);XomI|u?1_AJZxud;iowbI_dy~o=BqCU6oYXqQunEw@sRUWET!j!< fnkJC0WTod=v`m&4w3kp6kO*uk)oUVIfad)t#VYN7 literal 0 HcmV?d00001 diff --git a/bin/dos/286/old/l2c2.exe b/bin/dos/286/old/l2c2.exe new file mode 100644 index 0000000000000000000000000000000000000000..822d1d226e39354e2615cba5f6fa2d45e99cb0fe GIT binary patch literal 114748 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�kNE#>$8pD~lZYyS zt%)XNF|XF0vBFm8YX)2M7}zazfRK*l<<^B6tKqKT)Mur|KV`dcgm9sTsQDpwn7HR0 z?{gqlMX&?5R(^qsF0I_G?SO`)^*Io2uha|2YFQA(g~NC3kT4(7^{iritkzx7DIybv zQqkcG>WO4-Uh!?-X^B|aAro4)aoV9Caa+X9SwfpFeI6pMgrgE^Kh7BBsm@z&>axeR ztx+bP<|Ni|e)eN2GN_ja&cVpW>ke+;&n%@&niR1XvDWBYnHJ$zCfMX|9^sB?b^Y+U z&YyKL6s*WnTgnNONr&O}C)*#fEZ79$Kn#$UR!vMXurcl6#k2m5?#+ zX#}Hl)R5sz4Dpy9Vkz7O2kI$Ptf!7XT;#!h$LuRp-%SgK!w=V!37464^-{~;81aSl zhyc%?tc7xmq(dlzJhQjekoJN4n0F%&R}?DmMHw<&ey{1JEI9mv5-U#}19LN~CU0iS z>0u{)zC*SjhvX;ELPnu@0Se){V=a41C(!kwn>(QibQ--f&%D=CnX|3Y_e;%q>tqix z9<~VZ>5i6~y7;q)qCmVd!4u3qFw?W)cL|D)RXo)x8l?-2gpUWsXsH!`Ft94-Ffz8? zvwU@M`6&#ADprbLAIj}Luvn7x^5<%-=(-eX*pkGBX?$`rue%@;q0+}o{b&e%`ylb!JE@EVP z8P^jKmz3XV*#G26pi7 zxl3h~JcIDVd&re;sp%LH{{fRTo5kNlsqEm@Fnn8RN#`K^vV&fI@JmT<_*9k$idKF1 z8~@W2wxd;Z4x9DScydlg+Bl*v$`t0q6oM#yuog&~>Iizk6qAM@05tigH3zq#xr>2v z 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 literal 0 HcmV?d00001 diff --git a/bin/dos/286/old/ne2lotek.exe b/bin/dos/286/old/ne2lotek.exe new file mode 100644 index 0000000000000000000000000000000000000000..decc26a610e795e4bc3138875bcf9864b3045bfb GIT binary patch literal 10064 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 bgbd_nh`8DHb65s{>dWZ=;ewyIsek_s!fSKB literal 0 HcmV?d00001 diff --git a/bin/dos/286/old/pkzip.exe b/bin/dos/286/old/pkzip.exe new file mode 100644 index 0000000000000000000000000000000000000000..13cd83b51e15af5c7c871d997d69dc7a8ba36e8d GIT binary patch literal 32880 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 literal 0 HcmV?d00001 diff --git a/bin/dos/286/old/prep.exe b/bin/dos/286/old/prep.exe new file mode 100644 index 0000000000000000000000000000000000000000..09ff075ba694e6d9325b0a80abbb669f9e1c4d2d GIT binary patch literal 18644 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 literal 0 HcmV?d00001 diff --git a/bin/dos/286/readme b/bin/dos/286/readme new file mode 100644 index 0000000..034c0f1 --- /dev/null +++ b/bin/dos/286/readme @@ -0,0 +1,21 @@ +What you should know? + +IF you have pc386 or 486 you may prefer the more appropriate versions. + +You need to install + +1. LOGLAN.EXE - the compiler of Loglan'82 programs. +2. GEN.EXE or HGEN.EXE depending of the size of + your Loglan programs +3. a version of INT.EXE + depending on the size of your programs + the name should contain H for huge + basically you can choose between + egaint (egahint) or hgcint (hgchint) for Hercules card + Choose egaint if you have EGA or VGA card. + +Enclosed you will find versions for CGA card - if you are unlucky. + +Choose correctly. + + ENJOY \ No newline at end of file diff --git a/bin/dos/386/cc.bat b/bin/dos/386/cc.bat new file mode 100644 index 0000000..0a9bad7 --- /dev/null +++ b/bin/dos/386/cc.bat @@ -0,0 +1,12 @@ +rem IF +rem 1ø the programs loglan.exe, gen.exe, int.exe are visible (PATH ?) +rem 2ø a file, say, sourc.log contains supposedly Loglan program +rem THEN +rem you may find it useful to call +rem cc sourc + +loglan %1 +pause +gen %1 +del %1.lcd +int %1 diff --git a/bin/dos/386/dirinfo b/bin/dos/386/dirinfo new file mode 100644 index 0000000..ca442d1 --- /dev/null +++ b/bin/dos/386/dirinfo @@ -0,0 +1,2 @@ +This directory contains the executa- +bles for 386 based DOS systems. diff --git a/bin/dos/386/gen.exe b/bin/dos/386/gen.exe new file mode 100644 index 0000000000000000000000000000000000000000..3d5c77e0fec0ad376f92be508d9a575c13d30379 GIT binary patch literal 69598 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

    WN95lr=U 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 literal 0 HcmV?d00001 diff --git a/bin/dos/386/int.exe b/bin/dos/386/int.exe new file mode 100644 index 0000000000000000000000000000000000000000..ef7ae5ad6724a8b0b82ed567fbadf856c02608ed GIT binary patch literal 149912 zcmeFa3w%`7wFi9Wl?-7*5(o%1;GkkfF!EF*4-;U*LlQz@z@R}9f&qCMX21st!2#uP z7)-5J>lG`aE!R@DmReNA@F+n6FDTanf~83HjFZ}kQ6dgG-+%3WUNe~t(W~G6e)spm z?@Z3wXYaMwUa!6O+K*E(T@X457Qroa6%^%hOSQoNU4}mv;X8N5Jd2w0|Nr^FNP#zQ zwPcH3zOroXf3TO7Z55=R{e<<$H$5t>OR5pXp6diLdy7z)^eYI5+~2Zi#9BeBla9Ww zthjRJ@Efl8ce_&ZTC2|w_or8X`gaA{s+&vvcDgzH(kC-VU3r7U|6%pP>T}1$4r_(i zEy4$%1a>))3?`)*Ke_WGo+EN?$=ef?2e-~amR#STiBXRY!Qt9+|%t8lQp*yTwr-odDX(`E zYTme3kU^OGtrOPfTMzbny#tcQ3ZaLDp4)^W2YZP3|%g>4S@upAFn z!nP##P>qKNg>6Fbb?>e}{>Bu`!Csf{28iB&?cx(~-*cNCxA*c}2X2@1+a%mp)9r3z zlpyTin){{|&%0mm2}Gs}ycr>7n@uQ^uT})XE7eaO^i8=@Y7MQRX%P@q}y518lL_Ag7(JgdCR z7TA+S8RcP)5>^6uUtE9k;j<4PlXgpoM#JwSLQ}hfWQw{q~d2TgLUf%$H`rY}jr7Vwf|;! z=*w^K4?zRl+FSM^d9y-#1+Gsq{}V`yt_z4&qWF@K@_~TT*IIo%b~isulBv zY~{*wn*@cQB#*I_NKL5hik>}_*Tb3&`X=(#^Os6ZNy>HW1-XwUu*WJLP2RLd0O4$* z!V80HUsn|Iroe9N*_X(8G>XYY>A;9NR=3}Q)`vSw`F2ir@!{vKO41xCW>_d?yqqRg z*(FcXrcbRy>-^5Tq))Aa5Kfo;DDbIOTxQ>h-_c38L!gQCEO&lVABQx=c23Gq$`$S6 za_h!3R5(ez?u<3;l$vc-Nuu8>?RD6Nu%ML$3WMJ7ttcx`3qo;`{H;(@A~ld8+JQ?~ zKoCb;k%s^R44zqOwc41%+oKA17O#`7REQT>>opv6hVELDyy+PMmA0=-dQ5O~O<;7SJX4cwNzVv@ z_XTO+%AJA*H|^i|rwl!?BXQ^ELRk~Sev}&p$C*WFrU0}z(ir}+_L`8!m)wQo( znr%S4#suvW6SQ`Krb2SymKY)ZlM_jAzSEb!%_9>TFisa7UX{077oJw0quFX#|7qf8p{AOuJv$(=K zRsQU|5>CRY8)fUzq%&53M+GV--*=&8Q0=BO)=jcCJXGolgobs!`;Lejag zW2$UbO7M6t89CZ1OPi;nQ!Y`_)Vn0VHGBz_GonZhLs5_4ArDii>?2AEHwRmXN>lCN zHdz9&c;L6hx2@d{_8NF5%(|zo9oA9?dSnt5sJBm@_O?X;(V1}=EPb4xAGk^I^$qu+ zTjhE=xw#})%#TQQw*1KO6~a<$IL%fS2@HetC1q9LB>4X}W}3X@yAlu>)@7npXD31{ z`ORyRQ)+$J0CIjlxfRWOlif(=P|-s9Y)T0gGC?}da-~wP{AMUlQkWXT0Mb{N}WkbDA3zX(_MhDl~yrLzv&dF=yBcz}8eJZvsoCx-UbXI`9*2PqKNNi75n)pCHrvg?4c`gD$A1AI zc6v!g-$Bay$G;S$7rugv4XY=ueng=BSBhP%!j)o&enPgi`XBH*vd;<3^L;%{81(+Z zUfZk_4)%h#%Vo(mwdb^?ZNhM-G!Vrlw$Ps~iu9Bk^*+r_GH*5x-rJYTm9 zAIM_<`P@Fxz@_#M$-xnst}W!GoreHPqra;@;O=ng+ky7OvuF9!!ZT}%wvNDygS~DE zg@vs*z1|fh`vllke75qfPlST$+u95M6VmF>K#a9V*22p>eCqJ~w$=Znej0Th{`~OK z)8}*ht_};f)&CNHNn~}T3zpU2;`&nfW%%lC){%qWAxav#SuPP->Ql=-Cy zeu*0{2#zko(EP|Yr?Au(xMtz)HQXh)azwS$zuF8#*#4*mb?g>^f@<5RBW+b^9_B#&%V zJI1ZuS+BRXkoA8ii|B4t4Ikw|`qqhtwX|#R$O}w@;| zPQizJC%aE!_bKe&#qM3W4=#NvY*XNb&9GPB9AuU*KW zhV-fOFC1u+?Hm#YDJt5@!kd?*6WYmyc4#{k>8=ifaJ7)laK8!IFHGN?J}A8=eK!8q zq_b5-OT|#*a!+8MKe~c-M9a&PQLZXV~B9^5Zosp}0*p2>n z3@p0I)Nm?F5j+eJtOyG9R_J}V>Z+G{HR*tn6wH6Qh}()-h|Rl9ysg z$ERP?D9`BGtL#0KfqM5>gtfh)$I#+)hsXKaOCvCDQN*fde|vOY{mAZ1Rn5|HWc~MA z2Rg*iji>w}=~#8naQ|tD%U8dBc)$PH7^%)wJL{Bzo|NxOCG2jqi1|qv3^6y`%G~S) zAd)#r!VKXa|hTXr++RshKr~%zRWh>of z=a#h}>5xlW+M#+l{2BRybN0M7j=E8>8MqT=6m*32_&F_S^kxXW7 zyT(?u?Rs3FTZ^_0vayK9%t&BQ3Md8Y^mYit?WhMXMQ01Iv&*^sX6UFrFvs4ETVO%A z7w{4htCVdu)*|^Y7ce>uofM`KL|TZNEY(dC*823m*lIs!is zDjxq}W-goh;V#MODc2oG(~}V7lWn`i{Ik$NacSea8Q-9n4OYD`RyD25KcA0ooE}e$ zRgrc1==OC%YTLKTMG{MqV7fQTBc$+100hv z2=yh0Q+CYH45#ln@s&*Ma80u)ReqC7cQz;FcVoT7Tr}bbAcP#7tCEa(>Hg~!qk+u zdUKE3=zm*t|KG_s+2_A=+`>7F3TEClcUG@n!e}(@u0?|enp7e@vnl%{_Uhv|XcrYV$7T>R{j*_O&Kd>kD6E@WP5J$2*P`o_t2h|H!RM|Z})5$K^Q%8^60!NdG5(2lih?k z|3~k~wtEf~nlLeM^w@E3Hz2sRx4itsc8Bg3gvnE`89j1>+dcJ`(J}AmwwpZxQR#7` zi}MQNyMJ`@$G47&j9$sV{j{maFD_MJG%zt7ku;QtP9OqcXUq9KHtnTDP?GCbswt$ zzl!~Rn;rr?ZGnG8#I!)2J+R9j2-(XdD@OmgMMB8#Z`imBxi%5ljce$RKyQ4E?x@<0 zPtqNs5gs7+pseCGluaDI4!?Dd8vGK)#38H*<*sv3y;(qCuC22O1HKuc4EWc8kHk-; zQO=@GL>6UpL@yN`^((E zMT^|?XI9)*=Dy0mq|ANo0{5cDWTpG02-&k{%@!)|)U3v$#bpcKl;)l@cYaxl5DR4q z?EU;WP!8^s?{{EdVu0TB-eGlK+4JZwuPEGNkmfmdKpI#u2%l{Q*>P(IxBp-LJBj7_ZJ zUjT~y)IrMF8ld2$dhxK-P3&tOtd3=fTH1RxlB+3&}@j;&Q z4A76!{$-eJ@X4UP@JC8UK;M?Bk9-KX7K#JfVKXajfCKPtyfPV1Fat0yk zs!@GR&f2(zOMG*EeqWh;(HuBxbIAAd&7HNx?Oix`DZ%pHM{lOhtXML0nW^;rvN=BY zgmLIjjhtm}xN$`@{V76<(0l%DVcf!{Gw08p?OtFq8cP_vdWtB z%h83EABB;UA7&!zET62W_|=p-dde&{<#|12lA5w#Pq|4=VL)$qm+_;{v9$(N#lJd7 zt$L>vI0GJ+Jy7WsRwRY~g?BZiGd_p>yZ$6IE-9rt=bE(Df5IE~lqc?6n_hi>t}hEe zE816|pY7`zlBitu`31h8SD&x&bq`n7IgWz$P;DW6f1QKGfZZ>YCjn~st{SS7sz$XG zQb%IY8!0Y72>eltGElyT;qT&N=8(H12icV>*Gl{fxxxxtxI<0(VdR(l(K~2$X+&hk zCG3>L*P<3nO}LZVmXGjE*ms9{QCl2p2Um)>wFAtHeB!*K07^KiM*aikE^WZXG}%o1 z)X6c5E)5~OWBE|@N2DQSYs4Y*@vAT+CwU`jJ5thK`%)Y-h3rTH9w%7>=bdQ}{|hvb zG9N#iEC|Z!F7PUHaV^I6EUxpou4^XM#p z1oIofR^@a}CPs53a4p3346Y_zgWJOo#8rXoJzO#PaoRFE+y>mZw6%@}kYCq*Q~p75@<;2*_t6jnta1NX z>v|er_f1%lS*g)1uPJ?X>o7_8jhx{bG1QH2)A!eXQ_J9M3c<3*Td}UG2K|SewA}*t z$pyb#PHv(u#wja>=(RroJG%UIP()tC+%S9CRuk?hA49Ud>RT-H`$r}Eu+M7-U^e!h z-Ln=gSUhus-ynINQh`&lh&zM!AP6UjJGnm{%(II-rDA(dhOZMc z)iIBOZbq`O3GMkJqWL&L^wTIq@pZ=U1z#F|n|s|O*!5O{EFT+xYcXZKu(fMUCIaW5CWbiYxw<|&>xs?cpId_%taRc z^-@8-G%0s{;C%A32Vm-tr;)Os$8SoyAautyLB0CnFI~fM)p;6-`l=@wF2*y30`LrJ zQNknf3@1mBh75zOi2lZKf20skkON|(gxxXE>Bci$8Z4Bnk^Bv4ANlxbT@G4@afQb8 zUAE4wdoE~_?7^$xr|I%w*;TAHSt)1=*P>i2JUA=)8@V^+ttYlrxD0Yy!&h9KnjZjm zy;PCTxCt^wY~wS7_b57)Dk~OKvD#HpHLw=<1zn`~!ba8%ms3x$yc>o8pKF3;XEd!0 z)Tc|G_rL{~QrU0uy?rP7f+Lkp6#I}EMG%k>4`Yywe`?kT*Wh0CG)P{I0o6gMYHYzX zdj`fZTCyfI!ATILXdtT?5I#t@g@@Kio=C3fA?edgt3UzK1L=-Uud`=tAiln(p;gTx zs*eScobmJhw(wkn48Uw?XAR#dd74m9BZhVH>OuXn=~_KIxV%IUx`UG-3oss@NcdsR zPv!`$+_et)6w7PAWB#;?)yVm%JYqu8hf(O*_>e*OK+XnVdif046&g;SW1yVo+&YOY zz+m$`yIWYrf?It9`wl1_KD>W?lNhJK(wT`0u(3ebc!sFdY0JtGOA{EPZamzf_`1U8 zT<~=y%j0w5_iJBL=q-?o*`l=7TW~9tIs?0HVyR}29HC!Ps!0qq;hH3;e4!h3ShR9z zQLL~8hGhu;5$1HQG;`epIf75M1 z)4C1p!E9jZ53+$2TH-d)5&A7^0ZlMsv}HZcj9zIyERe1k8jU8&o9kmKY~UHz%Mh8Q z&=Y82lr(5KO_Dzh$F}H)%S@RrGr6zw7Ny6us3{}^6-{PtLz5)0EKN^W5$Be^MA31t zN(#Lki@U1ps+zUJDCKjbS=MlwnVa92Ps?;Z&HE#7)s1g4KEZ*2CL~Fo`f%qOl}jGt z5+?OwkS#S*>6tjDXmLf^(%Wa24>itfM=+^G7cjPb?h zmqv?kU@;!2+Ts=n5MnU9Ez*HZRz`R{VWL?}tcMiJ_g?~C&VQN9NS8NBMp(Q_wWu(k zLV1MpT&CtZ3-yLYO$rq?lWv#R^D#o8-lcVui^oQHllNBH!sDRHfKRaBU46iTQV+f(q3|aYjauip7QG z3Hu}D0P`gB>h6VB?MpVm2WPZ&D5*h%GZ;0mBx(lB>J5K9OK<)7`FY~Im_`!OK^u+tRVIaILZRa60%3-3 z!C-4tqv1>XU6Q}v;*W&7a|lLX9o;s=ps4BC_%b*H-U*697#niDjTk{)Pd%%xrJ3+V zY@UX=v`{<^Z2S~ab@pnaGYim|`>80br2&{_WrGnXjr(G>-xJBPXZU|6b&mHEu!;OF z8p+bj-)ByBll)u*3r5h;jbshKO`&x#ODfI%O@(5Gk3VQGeIHf?(`QUdUnRRB`p?vP zsEbGZ{!Fo)9F@a=Mr4_SWhaQytk*J2c|Mo&z}{w)pf{1ATS-O@Zp2c?-^lFj#5gkM zX^P7MbIvGe>fj8F_D4wYLq3S6MuUi0aj$yM$B8S+a_S>wO?WKgt28u>&dI2w#a2u? zUm;p?$xpco%LR(^Mok%)Kh9I^#zZnEYcY|9Svw9HNEb1KTpFyG9*0jFj>o+4DJA7kBvE;vz*#v~^VS0a*&g)XEX)RWjs zTw)Ij0-7nWB3|004sqZy_n1He*<&{4q(|nH_pq~q@l+6OWF}CNZ}*@RXHu;&;g`3L zBB#w67*3N#f^S+B1^JkKyfUd}s+3CO^t?Xr7Ar%xV-#Qh^`+=)*;LmU=7?tUhg{b0 zssdX#ayclYa;fe?8i&)rDCi~g#iy!SVmaEQh5(rI_n;Xbk9~p^fE9>2Wi~*&q6((iqqbl&q z$fU8v#aKdiFK~aZEp7E~qcQN3o_fr9EHHv1;y#;$nid>u7xzhB#iyP`wz}1J2tCD= z%=N@d%mybi%@gLe4?bRxRuofElTly(>>#l*vu3{-&*r&|ykV)?FzUrEbk2fKM zT3jCR5lfzDlmB&q-GzDq1=v=@a2Y5x70W#k8AbSwqL*o_t_0~+&QW8ZC*0M}B0*y} z8`)Bs<lQgJ$BU1C-We6qmqW^uzQASyjhzdCbNy2DA_a0cnh>cn|uy{WgjIo(-w&%|G&(KNT#O>CX+ix}N9HG-Z(OdSN8XP2Me&k1^nwRbE@ zZcGQlH6Cp_uD>zr1p_1|>0&qe_j%A+zmxcwluJ;ZL?~9A3bE0u` z1twb&4KIYPwya2}+|%t`gTgn4hs3cmnI?&cv#&6(7Q$`uv85nrO!(y*X~PLnQteHg zF;4jM_Zh?PI_x%zFw*|^kwm|V$oU;n;*qogN0mlSWHSvWtA61^vEa= zm1a3vv^~)zKsRwZ)`7SYbD2t|Op_v~YrGAsuF_p0KsNw@*(j2}}(M-6k84S5JupBR&;SA1L>$?@hGmvJ92D?h}EU2LNxd#*4O+OXFbB2yCXk!mo@5d zRGHdkA?k}mBIdc&o`-vLsxxr>uar^mly3fjBWaR+qcI>6_rK>^WO)zE7@7(vfRn=N z_fUwzmt$5Nqp+!$B3A?vYHw3uR|I}ZL_Q2(3o8Oc?U+Zw`?69DUP0k2EEG8~RLuZL z*2Wvj$?%Vj`#!Hx+$9w>=~mQmrC?d5jydW6bdHC7I}bC3ySBh9hvUWDm+VX9H%XWU zxE&4+jVpEgVBmGCSnl;9BM$d{29xhYOmF(BnO^wcRISQ%+97LVI{F1=pvv=4;d`2R zK8@QXn*H6{has-!v!7y5YPg>bsMA+i!?&16XI#AypG5Fb&iRBDpnx3YO={#VJa(OXNS_waDQ4h z4AD9ox{r&?YRtSt#2Vv>7?4Xta(@gn!jOBmc#V$>5m}5v z)DSCfe$)|Q9?cEHQM2Mug~~>ouk$?gwIt7SBNJv<2)i!@$>UVLohX=`bh_6SJ(+1# zNCuHSDi$}yd~Q5hM_M3<_ws*ymkW!rbl98D7bD2a?QjKeh!4T=?|1`{OS1}Zvh^3~ zs`r#0D**lh0#V&7=IP<;fx}K_XQ<_f0vDSr##gOA-%$aU@XNFzjLo~Quaj30& z-c+ZKiqQa*ZInYps5@aH8#Oi%Pb^CtRs6rfTxFaXxJUC-T6wAV?5;S-s2w4niB6g4 zkcS`yg@KCM?=?`@`vfzwR3f9b%(o+HA3{WtD+Vzm5JMsZT9lBpvPPKWhmlov_5#Dn z<)e<+E|+1s7PZHS=V#J9v6Ldd8+1Jmy%EHB`7(>(c)R#6dE6ayCfR*19E#M3m&H*B zQ3d!K1Su;e#?Ojw898>)CdHSD-wVDD_-*!KQElXFY;H~g^!+ZC(t4-|2TNdxTUl@Q zrQ_G;qg*d&xeSfe32vcC()Sb|EG%l!Z5SVHbj-O zS;);FPc!@tv`Fc!4pv8R(oypM^mLWpYK%R0DF(u`3{0@1iAB1h-qDCtxhBO!K4iRC z7{tb*5MR5CHBS%%oBS+RphAeT6xy6w#j9mh)ozQ8vu0-4GHt~{FG4j>^FBjeaKqxh zu_JYZ5L`v0hS(#o-~;a*uhW-@?tMIN{2hRoHrx*PC0|Jz@3tYfr74-JGp-aVGguAf z)H18_Hq5e}^f-@w@$s?0pQ=9NX+BUL$z5_OB~>~yoa)jc#n4b>Di;+*16^rk@40tAe&+l^T1S%DY^zg@8vt z&5FY?zxpWM*+D@MZLq!3-Fpd-mxGGscjyH=u>!7nPI)CSpn3?dX;X>j*i}Ru1PV4V zU~Iaz5mWEd=CK}3ew|y;B<>VH5Z@F3E;bKP#4mS#n+msY=lM%9fz=n|h5h2uou}-W zqV0n<`)z1w_|?NqoF0ZQA*X9f_G6SfZCDdK&ve^Z25z&Rr2B*DEi( zdth5CpSyF`QdR{p>I)uWPmiZ@Qx-vD?LsrU^)6o9vKipK__!|j;po1QG2jVzIDd!P)vHA`^d>$ z`dj;?`uFLRxy)t^2K^=0Zqa+7&U5IyQN3Q5JO|D#IAo@{RB(W!nk;$`Nu>uEs)q>G zpuLpfik?H3fYAC?|;{Wrm} z;31W`prdl=Tu9t4ekdM=g+DalebIA9#OfCB84Knwfy$ws-zAItb~arK48&us8it0; zOW@FwKKnKiyufh!6)IC!I_PFNSSEEQCh=y6o|Cd$Hk$;^K}eIJ9U|Zf+Iwv0KX4)+ z>O-4QhOqM-3c5Umhppg%+L^HA1AROkNhYR!@lsuLiIS;=6k5+QYSH==qW6^KJ+bq= z1CYf1W=5!@9?J;A=_r%Oz;J@iXh1h4wo+#j6;6YHSTEVuk_JD3^}5z+sF;`$O&lh= zAP%(Pv>jLwo$LifG0K-pxPcTLu@xdBvmMMa2_Gc}9DS zJ%W4OgbAK8c@x}uQ>NsN8f!d{_VDLX6N@K$r;ID~xTkoE3&s`Z0g!;L)mkdeh)xBZ zyyD`#68E^m(Vkn}p5o$(#Q;@^Y{i~YQ`DCuCwdDMz11>LhQTQDNTX$>YWp z5~hMXe`0X~aGFw5h3@=u6NnjwMc^FU{Le@*#XT|)NNYSQ_DuE`ARFOXkXKm3`8av9XR;f3 z04t=98Vg<#q^Wrm#*GH9qdo3IZ^1|p7*YsM6Sp7;o+39gc#$)zX=5f#90|gsg&J)4 z#F68Ph559jpUKT+P}W-rzD^udh+X=l)#ju?gs{=F(1V_PzOiePh7nnh=R)wc@z1cJ zw~@J?6t;-S>4*;?45E(Fd_B>9(=w-rPqU!OJPY4<@yg@OPpDB+Y33M{(D)UWW3uK1 zZuVMJ6bIde)7V_{ycBu5c?>*8U_8kVA*rJWH{vSBH4oQ=xPFD} zMO-^@y^rftT;)#=(;T2t+d_`HOmbUp4(dSo#4yy_1?AVCg6H^zWEAt9QSeK9r?r>gj({(=TV~KiAX$Lrrhb(r?n!18VwL7Q(+kPrqAD z|A?i})YB)c>AP9_QaydBn*Mv1zDiHOTun!_0sm1wy}g?L088Jjr+@Ve#`qB1Jyrgu zp8k=VelyE|Ku_PTrVnE2r}gyTtLZ;u>1XxyU#jUgmhQmx4qv|TfSQgKyTJ1jJ$;s% zj?g;Nd+X^ptLbmD^kI7XAT@mxOCO`B|4dDnSbB+`ZsY0UrR9tDw13wy8iemGuh!E( zQqu~{H|c40YTAwE+w`RFs!@(ZP&nU|jJ37rw?uIL2PyEUcN0ptbNVqGD>%qtOJRzb17G ztP~@FdIrd}Zz39sF|~6BE}=BNpL*tj4~vsqL>?%tNTYWe@%BexM(|^M0FF^e0`6?B zj#0v>1=fdVn9$d=aR;$Y{>w{%QTDJQM1AQILk2t40VS^t-;u_ zgWQ>g4-g+Tf)@Iymev$tH2`BGqY%cC)OvLs8Jds90ouA!b{Xk5F2Q1E#Nxo4LdBoS!qxS1 z1?#&IA;^>pGEEb*Dg|gVS;y6Yeny)~3#~-M&@tt7UXK3JpRI()ARhe}T z%7KL}3St4zvCuf8KN=cga0636-yaQHqTP*(wHEy>ZKT*+{ML21Wm&i)v}|Ku69x3- zn7|^B{~1v)og{gY=r(o!!P881~bcyzm!2?5gD7STpBI_eT0Qt0HG*7shp^?&hZ8c5ya z0;X68VvE>`R*F$Z3r*%L3gbY`t0%s-re03$Qe?5cTdoqj;}BC?kruNGR%6K|F8V8X zJr9j2miwI|I>HF@xqY1L@FUaFw1P$D2v$eNX9sU%Yg0Z^ZIqobXowE+sB>J->l1JB z_8-D91ad~KNS&71Tdp_7$6nNYr4)yLp^iEot7b5;I*RNHi4=wn7Z z5~_W{Ocrh8c4H&cja!z}!Y^G@*2NY+K*FJa|C3k8cK-EI9AZd;MJK|Q{27l7%J)_YDYTbCB9b#iUUQgB1xb<-PXC4X$ z4qC`pJw%Od6jZm0k#K2}M~$bpw&v{v5_9;%{jkrUw&h{?5D#0*N27+&VdkG3Gv)AR zq9(qhXUcJ26C?za#@PO3Ph0(GU;;siE)hLd-ukRNMnBzgcobZQ75GE~t2A1Y;^>_d zNKapGZj#oubB8E6UfnB_Gv4P<(*&mJW~g@#hiR8m(rnh?W4*G!j0d6(vp)#Z+xqPXf5BhK>BRlK^0g4G!s2Y9T2# z(p%Jm10dpKp>j477S(E}F9!;2Xa;?b#a^$E@IH=tC-l*LwG!JCL0%cgK{U}x9O8?U zlzW`=ZEU?0h9hQ!5-lqbRpucOpUF_fow(%gHdZxj9u@7QRT1YLS$WanBAqeF1l<^u ztIhJb)a9?xf_N{r<*()eAkH@AW3Gt2>>KW)CK^1kMrKOgEu5n(&aC!1-pZlsm6roy}E5^JZ1r;%n#IoWdG7bj^PvR?z8t=} z$BxzoA7`6fu)PIzQ@6JKjAeE4SH<##-*KO*o_tv{lq(^;PV86PjiE#l%!8e0LF$pGF{84a*gB7nTe^GjF}YTloC@Fw)I z>VxR}#wf5w`)6n+r&C_1X1fE~SdS3T;myimJ%O}i?X)DI9A6ezI5i@F=Va}C@m1FW8r(86efR=U$xDv52V()}1c8=^ckluh!`tahk_U*l(C-l0)HFWb{De;Ve&12ruj{@>S-(bs0|~i4HDZyrjDy=Z*v<8 zV_@RaPTO*+r)`DyLu5e^bJZ$RgHy0&Ro#3WUs%bb#Ti&kFVa>)6G`|lq^;V(@0!zA z{gU5(owkZj&VvJBI?Re~N3i&opb9c?<|8<;v_LCGLoU2K})aTJf~R2PJcltk)ftd+X%|VZ1RaVpaaAT$W)8IKeI)Mj8^P{drhs7*3*Pl;_6=WMz*>t zIy_B#&ExNM#!jN}OErN?8Kd*{jBf_*HNI)93Bk9xgmERJnoD9-GxIbWuFeF5)i51= zaG`Dm=i{`llhHe}NCxEcCY)~Y65-2Yf0=A)3YJeC#>y3ow!-g?S4y$yLfvh4(R`yb zXj`jtae$*U(ou06YF?GGhceKwGonf^(sbVmV$ zxCDBW2xQqW_Mjm~&|6=O4I6?S1Y8nfu2p;yc#p-vMN4@akhNWNY;f|_vn+*ea^$6^ z&sI0NG0=hCnPLwYgFtX}j;n&efK%)fJvMC-Z*|9bons1$Q`00~rUyO8osr?AvnSUP zVzgf_&ZLc+rG{rQt85o#f$q+ znh)jbJIT57yaN1IxY<(I^zypfabV1^5QimtvUt#_kGWmvCE<_XGvBt@Ne4_&UGs4e z1lS3v#_W!S9ofi-OoI_Dihfm*9?a~(m(qhA1EC~Lg3x;vH0F$VVlC5Uya+8~HEr>( zvtx}j>24#=Z)7>@&95cDtW{=8H!9QmX3#`dPkaDkpbtAw2k`11B+;XP1e`LFVzG*v z@MycoCBFJBOJR={PG)}5wlfAAYIR59uLCl=o4Bt}i0>NM#3|lH@4;A{wiS`arw4Xo z+X0s$)uNEk#SeqGv9;7xi!GJu={_5VO!~nUOhkY)quM*1YRJhBeTXJ4udYd|a8r*= z%xJKUzk(g($X&b!oMm(mhhVUUk55a_a3diNb_QKN4QfCL45q{@M0mt2R1Z#K3wijV znxOXthIMd&Bk~`g;dU@SO&f^hCt4*rEr<4>5(mnaU?Ih=BjPW%f-dp`<9QoBmm1I8 z@l4KUKRyZqGwMc`BMmaa=>)=n@h<;O=3LwVkTscR?N>wb zfg46m(GH4nC}O-}6#M~LVN)r?K$BM(yL7_M<|EF)*pNigadAcrCdbe!4*eNGOeTvv5g+O6xp@FF)s0rn6&Xy~&NUp@Pw;6>#LVz&*5Z zM^ybP?r>q%W5NuO2Kh)ra4JB&S43HLA0bgT&YS^1S}W8{bis!sgx=TTiwr~?)!{+6 zJHA}|I>lJpOJ6loahyRn8W>K$ss0{y?2+`S{I0oPL~=;=#wia00XO%?jy1&tA)ReX2hx7jxnzZZPB;`eKx zmkg42m?xQScAf`Z5GY*4Mn`&3_YY~n*rZQfuDWP@t8*LqE9m=a+U7lWhBc4!5)Uxu zyNJPo)OVEAxC7Br>Y=k4$l;X#_1~&jVd#Y+K(Hh1;6qcmj1QcZ!71`FNCxeOp_8x) z(k2dxjn~_RA8+5x8k{8FLMs`5NjSHAWH{ISwvD(A*KpH!5VZj#KkT?c1>Lq~P*eq& zObt&VAT5GwE+Zu-pn)Ae>cPs|3^-?bD^eM@N4bCfF(S+R1P6-27`Lc-MhoHKhU;c4jqo zpn35I@+8Afj7!-m+@uZa4(Um`Io<|{T|0Rx2NNEHQFaqaVmoe|WIsHL>1Hi(nsO=kc*@>gV<)IHx_T^^-B3Qzr*1(*+-5NKr!>0M-7)$P2S9Uu=9EcrzEWX{E?Dki4$9qpJ4%GLC zPH=+}7?#q`m(DakL>`~EN-BP&oi_Lmq{HN3VErirYT1Ikns5~zTmVDu)wEkG=qh=- zV!r68x=TttsvgaCi&H!*^~Ztg1Jr1JR5tD~53mjHs*p!YG@>q-3|*QQi?&wpuV0&0V(Ckzp3 z78EE|-mJgVh1?{Ts3S98I!sF>jb<4l9Wl#*F>b1SI|l@tkjCsvM`oi^FsEf`EmgV_KhPcO*nRg#VFjDmNO-Z{-XKL(J%+&0?sCNaBOUNj1so>fPp1=c zBdPu?=uiptMOo|}>^P2?z$%ueRHUiCf+N~XSXp0p{ zXj_3Rc9U>|E(b=E9QQMU$}?ACVlG{N=%6Y+fYmh)tkQZLfjfj9hVeuNkqskV$CP{i zM!cg%FH1doi*W}V(O`|VAb)v4MJf(#w$cMlfb}&_W(O^d4%Q^$M?oWuG?VH#Y5ey$FHF11pe`-YN!N%IuYkkHX<@i)6rI5fvN^NCPE&G zGXnJ-fj7*WlDD7nD^Pi)9j&ZKT(nVqnxVxW8t_0^h4O$h{E8#(=_>(8T=bQIBk4FF zh^;TuIfAG{BN6-IKk1-4|MPtKAk!B9| zQhq8*TnfIc${59RT7^Jp=aAQuD&NKngjY~ppR9%oOg%IA;!xm>r^;P86hi0ip!blz zuZzjxXKdb%%b?;v#7<{mB9_Etk9`DkA4VOabC|}LHY^8nG$sNr_;>0i7J0n|`-#7Iv4Jcgi;S!c(Ul=YrsdU0cu3PZF23P+| zuEstzTzhdL@pu-wQh;q^f6ty6m| z_xPBkJ2Nyf6NH2~ki3RQ;z2K$%0A%f-E2z<-e(ajBW(9Q!PXYfdFes@YSMiX4w*s| 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 literal 0 HcmV?d00001 diff --git a/bin/dos/386/loglan.exe b/bin/dos/386/loglan.exe new file mode 100644 index 0000000000000000000000000000000000000000..e2cda0f2276db9b70c0345050a0ac8f47001bb14 GIT binary patch literal 219928 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
    Q;*5spH;tPKWaFP-H7>@Jpqk=M9FzrQ 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�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 Gf&UA>>$0u@ literal 0 HcmV?d00001 diff --git a/bin/dos/386/old1.log b/bin/dos/386/old1.log new file mode 100644 index 0000000..2184cc8 --- /dev/null +++ b/bin/dos/386/old1.log @@ -0,0 +1,91 @@ +Program SystemedeFenetrage; +Begin +Pref iiuwgraph block + Begin + Pref mouse block + + + (*****************************************************************************) + (* P r o g r a m m e P r i n c i p a l *) + (*****************************************************************************) + var v,p,h,i : integer, + l,r,c : integer, + rep : arrayof char, + d : boolean, + xx,yy : arrayof integer, + status,code,x,y,flags,button : integer; + + Begin + + call gron(0); + call init(1,0); + + call showcursor; + call patern(5,5,635,475,2,0); + call outstring(10,10,"x=",2,0); + call outstring(100,10,"y=",2,0); + call outstring(10,30,"status = ",2,0); + call outstring(10,50,"code = ",2,0); + call outstring(10,70,"flags = ",2,0); + call outstring(10,90,"button = ",2,0); + call patern(100,210,300,320,3,1); + + array xx dim (1:6); + array yy dim (1:6); + xx(1):=410; yy(1):=10; + xx(2):=450; yy(2):=30; + xx(3):=460; yy(3):=50; + xx(4):=430; yy(4):=80; + xx(5):=420; yy(5):=40; + xx(6):=480; yy(6):=30; + call intens(6,xx,yy,8,1); + for i:=1 to 6 + do + yy(i):=yy(i)+100; + od; + call intens(6,xx,yy,15,0); + + call cirb(500,300,50,40,100,3500,10,0); + call cirb(400,400,40,40,600,4000,11,1); + + + i:=hfont(100,350,6,-9999999,9999999,500,9,0,15); + call hpage(100,400,10,unpack("Il fait beau dans ma verte campagne"),9,0); + rep:=hfont8(100,430,10,80,unpack("tototutu"),9,0,15); + + call getmovement(1,1); + + do + d:=getpress(v,p,h,l,r,c); + if (d) + then call outstring(10,400,"Event",2,0); + call patern(80,25,130,100,0,1); + call track(40,10,v,0,4); + call track(140,10,p,0,4); + call track(80,30,h,0,4); + call track(80,50,l,0,4); + call track(80,70,r,0,4); + call track(80,90,c,0,4); + if((h=164 and l=27) or (c=3)) + then exit; + fi; + fi; + od; + call groff; + writeln("i=",i); + for i:=lower(rep) to upper(rep) + do + write(rep(i)); + od; + writeln; + End + End +End. + + + + + + + + diff --git a/bin/dos/386/readme b/bin/dos/386/readme new file mode 100644 index 0000000..d96830e --- /dev/null +++ b/bin/dos/386/readme @@ -0,0 +1,26 @@ +1. You may find it useful to rename the programs + + logla386.exe --> loglan.exe + gen386.exe --> gen.exe + int386.exe --> int.exe + If you are going to use \lotek\LOTEK.exe it strongly advised! + +1a. Put go32.exe, emu387 and a chosen driver for your graphic card in a visible +(PATH ?) directory. + +2. Make sure to execute + exec.bat +before compiling your loglan sources. Once for the whole session. +Adapt the file exec.bat to your environment. + +3. Make sure that the directory + + c:\tmp +exists. It is needed for the correct behaviour of programs. +Don't worry. You have almost nothing to do in it! Just clean it of garbage +once a month, week... It will depend of the number of broken sessions. + +(October 1993) +(DEcember 1994) + + diff --git a/bin/dos/486/cc.bat b/bin/dos/486/cc.bat new file mode 100644 index 0000000..f4c1dcc --- /dev/null +++ b/bin/dos/486/cc.bat @@ -0,0 +1,11 @@ +rem IF: +rem 1ø the programs: loglan.exe, gen.exe, int.exe are visible here +rem 2ø the first parameter %1 of this command is the file +rem containing what you believe a source of Loglan program +rem THEN it may be useful to use this command cc + +loglan %1 +pause +gen %1 +del %1.lcd +int %1 diff --git a/bin/dos/486/gen.exe b/bin/dos/486/gen.exe new file mode 100644 index 0000000000000000000000000000000000000000..635f73116017b9513a452a3e6d514e2a43cd3a75 GIT binary patch literal 70174 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 Y-jxQkmENb+<;60eMB|F&;&ikB2bSE0J^%m! literal 0 HcmV?d00001 diff --git a/bin/dos/486/go32.exe b/bin/dos/486/go32.exe new file mode 100644 index 0000000000000000000000000000000000000000..dc3a2934d1e630a4b835da5414fb243605fee2f6 GIT binary patch literal 78666 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 literal 0 HcmV?d00001 diff --git a/bin/dos/486/int.exe b/bin/dos/486/int.exe new file mode 100644 index 0000000000000000000000000000000000000000..c0330e76b8b2dc8d163ae55fa15359ece56f61dc GIT binary patch literal 150360 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�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 bV0eM12SFGL7BD$LSquz=CilW!L?HtJhxBl0 literal 0 HcmV?d00001 diff --git a/bin/dos/486/logcomp.bat b/bin/dos/486/logcomp.bat new file mode 100644 index 0000000..1ebb7f7 --- /dev/null +++ b/bin/dos/486/logcomp.bat @@ -0,0 +1,5 @@ +c:\loglan\exe\loglan %1 +pause +c:\loglan\exe\gen %1 +del %1.lcd +c:\loglan\exe\int %1 diff --git a/bin/dos/486/loglan.exe b/bin/dos/486/loglan.exe new file mode 100644 index 0000000000000000000000000000000000000000..62821c2264d77aeae98cbade4dbed4f639432254 GIT binary patch literal 225368 zcmeFadwf*Yxjw!#w}g;kB4iMeU{FvLM39R_G6)I*6eK1PL;*zsw-iBP2C&6koJ84d z0;x)?t!<^z*7i{4w48HdYikIU&{kS+$AVI|fV#(_N)aJIV1Cc@uDy3A0sB4Y-}CuR zK6_^Eb$Qpj-rIWDyVl;Bc88{Q(=xOIt(TTcZOW+9)aO$CWN4=gmM_k*bN>II|BDp( z^_>|*jGkX+Y#X|#pE<;%nSBRq8{TVpLR%lG*NndFHDkyYttIds2!}N^W9Qg)n%QFR zeI-?Sd39v;b+L;sH)ndPPDNt5RiAvALba;1vtvFcj=pqo{!N#U_Q&3>+EaC6pV4id z_DY8K_QCj$toXrJqwfZ7{d7fxJO*!Cp71Uo=pDN^WBH~3?tA-- zNn^fPeo-6+S~N3`TrJk^H7$3{7ppSOGf8ivPloxS_dTQU^T72*ZF9XgXzzxmZ8y)_ z)9W|UZcJVQ40{W8N^qoKu*J;R&KBd=Ve)wg+kRqtrU2U@SbE?6JU ze&r&q{@2%N76@~A+thW%o<03u>4vPyTH-OSZ=*JHPd}q?6y#i~HTvXcHEzDCHTvad z4Q?v5#(>;Z;pS1TQ5&%Sj~m|m^^A-?{Vv%75CeYSGpZrox6y~>YL)aOxke=eNLDeq zgN)L&KW!WL8xQVxywVqllxu1jiBzLkE3vLhY1&NlaQX1#$=>EXU-iL|w(jx$8Ncyr zgFf)i3#`rDUg7f<$ItrK{N0=v*fq(g&6~Sp_cl!{pJk4%*XoM*m!wwutly+&&#o&z zP_lk+iS@FiE#wER21$P|`QMfFv69B8K+Sb>bE;&PRmId}Q&a2Ta=*)$o+om`Wu?;_8e2UFjD-m`g; zC)I6{r)yIznd*7BC)M*FTnjuTRpXi2b9X4)F=S&v_YPU#cd@r^1N7^6Rob+4L z+Xl5RzuWwDeba`$>)+VWbla3KpTD;0=Nta^_|eDrnLErkZn7@YR%I?9XLZ+Boh&Md zW)%gazM?KM>)NK|p{`BQ%o~56-4x5X>9LQlZ8~`{yk*MZOQRv*rA2dMnN>xX#ynf5 zbUnT!@tZTVy?=xNE%q9HYqXoZ@0-WW!-JB`KQTWxhCHSn>}IUg;=lKd+LGP$(W&T> z;Y~)dHY9bq?lqzCw^@@iW}B_(tbgCWnHykDh97VH^7%{5)e#JDNdAD-w z^|P~6KGj3684ZjRxbCrvl=<$UH>yunX=}#H z-Pu8{vzQQr_bv8gJhn15rX_lD{C6u;z>DS}h;9a<8!w6mwIrvryZG-`r?jXyVWb>5 zW=q$ml|$O0U7ZH)!Zc`I0L_NvN0N*%KUPF?ho2SAZS-g*!<$M3v4NWT@wRcGj(KYq z7_q0{@=%G;s(K@6m3w z8fsPsl%hiApo#%eS6?#QfMgm`pAmIb7lshh0l0wf%kWcWcR^*xLS=)d&%4VgK5Nc9 zYgBs5txr$SRwOLnYFenS*U( z%yJ*NO-le4Uwe{#+jh~Oe%BsK%Jj6Y+d5X@tw>P(u&;d9YZ)4dF2-Sm`9X1U{01#L zD4EY>>N+d)?CfzyahuuVEpCfcYAZd-khh{OUIgdM>{E4v7W?a@S=Nfvvq4~3m+5AU zkAzMYpIw`o-4wkVkc*4yR-E0HS%6#x6(h8cX3u7$G)V7BtsrX^pM~NCk{pPVcg(Le z`lPDhn52v;%MCYBEJ*H@SM#>Qu`F0lvR_xw%hnTLk;|2TvhyU#&l|UYW?mFaN9S$QTM_|?Y7cJ?=5vdIIY!f z`Zj#nJ7zB*G(5Fo(?2!yg)iY^!|Iu}8#UIy-011iE;qUj)`pn1e}~sGv-&ui1Eh0(-QC#6o{6_|zup#RM-E%JAJXkY|kG)m}?Fei! z-~IXUKdjq5{>$eZGp;m`zBUJl4Egbb9NfLOMA8d$w%z=jRBBH@@zqxNs*_b7V_q9f zcGsr$@5M5nG52p*7ieL$ldB3r2K!Q=9T?PELupc#pm`1vYi>T}H+6^~J3a z&sTif+m=y$YTT93z?HsknRR3Ha<U_4}2_y?@}}moKc}4jzA$lX=%A z^Gd86kJ%IBw%#)9ZM#+GzchlV7hQu;%z193+UFOpu(r@kx4H=Ue z4cv6offLDoLsIu;Y1%c~_1YY5RcKXc8Lp}|XSJv&DW0s@J6TMKv71potEG60rimRx zw}D-mNM~tLq_ZTQE$M7Y=SVsS>AICKCA}#)Ve@=dHxxv_qEmE3E8K3gB~qeQcwZ~g zcKNj8S;#N9zU{}5yeE(`JY}Pusr}}{T%w&xv=gsFk?!lJX;*1O1os<&{nFfBxx;ho za~I&ZKDTQsmQ%F`b623;`sys)`&6v=iQ+BrKYLW)il5ZVobpB=tnH7^qMyVvEb6w7 z*#&oKp$6}@Z?X9SW|F8Mb+b@6tGsbM>aJkjTa)7fZ0Mx4Dn3-nE{8;wSS3=W3X@Sz zRnhgaE&>+QWH1>-E5gI_z=NQ`fE3Fws;YQdb(0Gifx6nulVeYFcjKmH=T)zCt<9~|nn`E}6^)8b#&@+p3g2Zl4hEW{AVo2O< zkGR%|kZ>8oDG zrRl74PEO@My0gV+Q!Cr7bth(*TeT-60 z$v%x&drKOx!}Xb`q;a@cA{z7C;ybfJDNtvCUyJzA4_u0HhU&BDiQ==+QD1zK?<|tQ zg2^)|M8qn)vEEZ+{nr_+4ikUVW)Y%5W)J9zn))goDQ}`#Q{aj^R@&r|O5atLe$WZT z_f+Y_s|KG+Jacvhk{&HlkaFc(2?j=o^*RDS z5Gob_5HmM~^Kj2h%#`cj!_Wf=@>$+yqxdK^&{%nF{k-FtW$P;5GAdfv7oRG|G|t-t zMn&8DV$5{`PT3Gl%+#+`YHeF;nxg)nA86gG{XBDK-@186H}tL7eqDta+AX6}qlRes z8j2ad=i#SVqu{@}YaGkT@`Fb? ztrTOO;#Qlr9{vm#Te6;lxi|lG^rb=ju)KNvPgqm^>C2zH>neIyGh)l{S$6eJ1y>i` zwCur$m*0P%9xWJn@0A6^3P+DFxN+I?CG(dqD44P|x@3rUYi!Aqf(Mt~zcjjVdBOY@ zEAGE<=>rRwMuXWC?q7NTf`tVOmoHzoJeWQHo~6r{KQJFvmoK|-`TPe8Q2l}Xm(Gvg zzieqR`+w@qJ>liw|Fri1oqA=_*gaF0E?PEi{(bk~+pnKC0YkfQ+3;)AN0_lF2OBBA z^eiW>HdqR@+@Zs+9X?{@sOv@-&cEm01q&BxH_czVbXl}u;p&C=7HHr@Kd@)@!)({X z4=X=icoL%K>eoDsAn5+%CY5Fv6$i&+xYTBPO{*3WdkAAREahKxle@AAesG_7pL)e~-(Erqocz1 z(Lxzr0e9=$h@Dnxnst?5dr{Nm(mwKNL!t{;N9}v&vmSrbKLxlMvS5C6J~Poqt}0Et z{T-y!KI4!ca?gqtl65!mz{UPLf2xqtkOx4P~_qDvO7Pb^x$ zcTwT)==_Cd_L!hv;?>|+$?t2tiEsDD|K4VV;w`>-voD_TEi^q?{UeEtgfDhv^Agl* zAlS_hGDXmv*D%FyH&-!5G?K%Nd{#BCW;G)c#dnK;HNLf64M<88)^72$-#$R!vQ~Pu zVaJE1hW%sM`^G`@rmT_%k|njmml|%xS9vsR<#G&UXHJRr1Kc%gknKJFk|%c5*VoT9 zJ}ztVTc2hMVOso$ks@uaKh@&P^O&ZY`MWoJwdx&hXAwQmAG*n_nPJIkUebn~aQ#z2 z#G{wd0X0;HgCi>b*c+>u5EycKYIxfxuFWcGvl< z_hHc(Daz6dc=Jc6-cZ(y-QZA<^ehaMp3%$ofvBknU6=O*_E_EA>xW*gRPRp^*S(6! z&(0jntkE=;GxIkYc4`??)*=*`;dekZQ;0bzUkKZ0Q!jAE46@+Y^%%mSFd6Z%H{R^s ze#&Fy)#ahwnv4aP_4Wi{Ft^P(Ja~$JY$Lx49F9ls#;&CraAZTe_bsGHeVYVEm)RLZSw3f1<;SmP0*qDAw} zu;5U%sQ~S?P|X>T*Ug)(@&=%RnYU>IQ4VLJoe^#X(R3#DIrSjYs^1cNmNS(57ia44 zyF+;w$m&HLiZqY`Jc_)&+mmn|vzX%PQ5g7+QDa|({w3yS4A~Bg}OWeE%?NqXBy>;=O5Z2F$waE0%@l$g{k3WhQss5YhU;=<#z0(C# zKd#$h+85wz!s4H@x>NzlYEz+_2)%_<@#d59Q=V00&4}2kqB@z6!fX*Q+SG@d6sqZt zsyfT-@+7O&dU7e1FDuasPXWAc@%I5#EQYnjW{|tyS}_^P_odJbQ;GqM-D}Y`rUP8v zFR@E9qCIt1)OD)r``;4y$y;Ghq&*B5kukzV-wevP0CEcQ>Nt6{_+-M=@KODsm@_C0 z9tURKdpqzND|lJo1)~!$BiIQ#U52zGL0#T&*}A%!=#}bAfK8$aB3iFM$mEJVsed8p znm7*c3T-Dr2oj%3+Qn5!Ex5vN*X%)I{8VOTZv2!#dZBe=F&ezW2G*BTko=W`^WjRQ zf2!aJH{vbF6}zk&5LNhU70+@;216&)W&2QV77C%%=uwBm=Es%-MZdgFv<$X);Z~(P zzz=+;#3h19i=Tv69vS)1Phy3b`Fd+mnFBShWDAmForZr|Bs@^4o6=!nnD#ML^9K~8 zvfxxX1l}8<)6AG*robzrRVYoO%TiJtkFY3Ev0r9oE3h1^fx)aShSKF0g#+_53iK!i z=zAchJ1}yC?xHOc5mtkBXB$l4iQ&M?k>MXvhX2-s{9a8sFReneh#1ZY4JT>imHO5f z5C!Wqe)TJLU^`+S3p)xWOiH|QO7z4=ph(H2j7;=u`vFhgI&$+iouh?o$>CUk*n+_h zZHN3srQ4{N!-lIco61uU>}b z+DMtvtjRMo6p=~7)D*dGv6nJ za%!7meVu7X=$9wP@WgwVcu4u=T{hx^Cdew8H$%={k}`*eM9kv(`nSGnU|(6aO;!l^C#eSHl~snf{d+I*uzRRC5EWB#Mw#UvKlWBBa#d7cBW345=$wVYUoHHzwFp0Vv~sP;~HAF7*|*v(3GgLdiiCFD?@KoCe~cVv!; z*(l_R#e@%Mgr9}EgBu=Lbs1dn{g}X7)2?xtrQUhaEIJ!;z(=rC_2&WiQv)uJGIa$2iD7rumnQ*fuv>lp_BM<=%xBo z1W*f|itp@|xQ2Ku-s}QzTw1&Z|1Z%Uh1PX9qbu7vJ7~yItWU8}(YZ#{pC+)W108Ir zV9M5J;B=H!u5S4*sBJugpa@K~<4#L(#1bTO63-oV4Tm)G+H>|PMgZa{w0<}Z=y-r2 z=sy`?v}l1TiRzXYkxS@w1qAA;tsGibi=P!?&w#y()Yx8bl~6%e+E>7*SF?|yq6CRO zs9$eoVtnb7mvtQEh({z?7OI{2PjH@=_$U*RV~kTqF{{#QVDuv>V2D1Xxln52nkg#? zpDFX9@=g#EWHc|4yr$iZZ^O-F+=REU~Nylh5ghBgi$?CD&;T&&<+G6w08q|;}-4k~z~T9`opDu+S~ z{j2&x3m06-Nt1*%I(1tmb?MleAbu9ru zbSr9JkDAt)(T>jsx$8*Kj95P?hcGHsmxapuHV$v|Hx$Q@{{wiP*R(dGT4DgyA2G&P znce{V1KId5=(sZ64^MXb>fqq1m0q6(PN6*yC|H@q56OgHKdp!DUiBl7eW_@Vv3 ziepi0DMlQvueiK{ndmP01@uXm!r_Mmnql6>Pi2H^jvR*FJLL)097e)=6cHR1Qd7p3 zfwXwb^@$7A*iYQ#DEMN~gsv*l-vG@Z8iIUffeQ0?h@M#cZ?+@IU7|sKHz6&)U+AZ%)(N57UnU_?LhQl! z*h7|E)wv+_I@=vs2!uGvT8%>qp;zJ&v~2McZ`edFF%(`R=EDgXf+u>R8q^zX+4?iq z&q_=~eP{glVU83+{RM=gK^cld*e(4Xv`B1JysAWKsKq}O0I3sd24yJ3`X&wO+0Q5| zA`{CIo#`kO`%x$|u@?zzDJG?MnRx9gz!(&vVAxpbLgN=fa^m>{nkcxBp7-qaX zRJ$6*qO$s45J;`6MNV#kl3Lv+5(RrD4VauAGGn993y<;e=wLgfFw_nyj8OeVN5@Zn z5xqg*PqvL$oJl^|;wL6#K@t%orm3*WOI4Z-N%mA}YFrY51J;2iX*v_ukqHh;6??Om@QVVzr*C?xJxb&fIbsFII>zLYR?O;GVdFdak!} z+<|(%jbr@vuW4m`iAAhduWNr-wDIv5b+YhlRs2}hnIv_r;S^}btgU_EmCJ38Sb1_* zAqhi9S#OVbYd8y4)}yYT{UnvDTX^Kod3VW{7x%od$Eu751kg4blwCWl;|SDHG9U+t z=}cKiCaRrMdQ4)M8j#UITW0!dccYr5#lorvag@{gVrwq1#m|ZXw>x&Mx&xO6I@6o7 zj1>c2L{`gKX+LY<;@X)hy8#hS+p6n!Pujj&b%c?r6lz5KrTl7JQ@+!;HPtQ~*TY*W zZ$a6ql`q*P-GeA=+NS9pxWy>|)MUrWm*vcZ^?H#*cH5+A-1Ag)?l^H)u5nGx2-20a zJ|e1i2;Z7D0kmX+(Hw7X1>54Md@HBKTRqVUHse)f#t5>K-C0H~WCms9Z2K8ipbP9= z3e%ap9fEMq$Ya(M=`@NT&a#3)9}n4eT3=|SDl7f72xT4)22FuG zuF=2@TW$EZO=mybWL~8AV)s4JJzE7eay7_`aX$}m%=O6tWU zESypCPA47%zYtLAiJ}DpxxiX(Z7c1yvC&4Uy8`E0rX112fjKPX}A5wkV z+%!2*L=D73%J(Q>g*BUr4vC%423Q#8C|)Tl*@7+hqgR>r6n0-+2~bneRP@TdBs}$k z#W(LVqPcp1_R{li`XgYa9dl7^a-=Iy_Wh#$O_eANQ$#{FJgBD+Wb?mbj!L}7=1zNO zuZ_Lf!19?c>{CZ(Rb(0}(W#7FdxT}eK9Lo4%9}xX(y;o}kHDXbVb}tqT|(%Y0;mrr z7PkQl#a7!0!Oo`=0|l*mQ@U@wZ_%PfCz8e+!`?C`TE@)7=1gn*serL>`^ihL{G&1R zNS*JA?H~EC++j%dhqJ5w#QHh(X@;5F{@Ep7l{l5*6(+=+{YH2KhpFVJVKUQ-KY1do zSIU}qGdY&>)lwFfe@b{(8)AsY#AC22h(8X|hhiW)Ay@}dpmKBc5gguf%&y6~DqO)D z$s3gUm)idnFm2MF)1&pgG|xo1ri=`0GUpz0=OK3x zEK*F57Fd@FExu0t>K*$ka@eQL4f6OQbP6D;?h}=5m;*E*WF(0Z)^Vdt&cwrYzFM-k zM3>AW4*#+{902j=nMU|-HqB@C4m>?%%(TpzhthcpU=B}N9X6)+{YSu9-jJ~^{t~1p zD`uE^!eU9B$^df}myPi4C<3lZl@{PeF_9Im>&Du=ianGPXo@qeWz9kvV~FIea3&iW z4Kq+gOq$@V3VVoyHAw1;ozPjsIvSD2W!C+7!VCmS4fvPw2ouo2CxO1*p$Lw2_;a+e z;Zvr@rosP{fNK@lG)C4F3cffDf%9|`9g*_Oz-9P_LiJc?T=KS>=h7r`M$Qk3^ke=s zW*(|;CL>GL(VI;0kTUkszmze*^%|xR+Za}^RI|{(Ip&Wi3$ecoWvVQ-XQAknv{~j? zScs@;$em?+eb1d`hM~0m$e%M^{gek8#M(IGTb~Nj=BiuDa)hfmJh5Q?8)$C9U4#jh zm14!j^ZP?X+~ZOcM7(V`=|Z(E9Y>LF#ZdyNcycm*0J(7+~U zWgj!2RCSM$aW*ftz5!6lv6x%rTw30y4vy!Zj>rgR@JIhs5qbg%y%C*I?&Rd7_=f7t zR}V5k*cgZg6v=QD6(f_;pSQOjZf}aM62wr#5zSEqGlI;tk(D%D6xMc_0-nI^VwfPH z?*Kd)!P)vd_Cr*Dyt$2mp~rs;JoL#N!Tmxe+qE!)QHX=_$9VG#sJ3c}^;5J|@sK{T z{nj(wcM)@cQ$4(r)u^lU%UX?SZo`9Y3ODvEvIVWNUqfhfV&F}C)sy99i!b@SK9$`c zSKTK!)vE=~dnmSsp&w^R^+Ii{8Tl$p>^~lYl=E?ObJW5^qBO;Ykmq{hlhvOxMlY4P zs1qO=p-s)z2e>#e!cUKSZrEPoHUUtpm_O9)LBXSctBbXZ~am3|LRl9Zw|Hu!C%LVEOTd1KJ=7KN11Z*+8GcVPyigK9p)xjflRp zmB6EXwyPH*BrKu1x^%LLfxX9wU>9!q;Vgm^1{dmNg!EuNb{+V_a?w{c&TV9-2?(|J?=$r99%Y%)lH1lw}48#2#(PWuNtp^cEZdglX#$kNAqy}@O zJy1{Ga%}qTq(chZ`Ur2RmZR8`=&I2zmC@nIwqVFpAVgvgb1`7dUA#Rj@}dhwHdP~R z!mgykQ1a%mtEbS_u%`AEx{~WOab7hFWZME5_Ly_ju0im5W;x5kXL;l78f;~Uq6*)_ zo=3xTyd?mgO|0Zd`Vx6O;rtGeZt=f}+=r0T2a?oMr$y>ucIWU|K7i%yL>J%!lKIv@ zN>Csal{}H6?HHyRJ{j<9{GQ0=ww#ZKgNIEj2D<@p6Gg)Iz4VrMZQ zs%ZfTo9s^HQRXGFr_PD7AET19Wcd!#%EE7So4Tv%d59pOPnrfZsNnFvFh|amMdu?{ zf!lb5-+_t)YR1lIMR&SVGxk6=6vhX@A5I2O5N19tom*9H1+maN0wxV>N@nW|NaA&% zmpfH)?AC5zn6JI+58uFQT-?zZ><35RQK* zQX&;$lEDt2j8!!tmB?X?J33h93`LF^WE(@i?Fe-@T_<<9fY-?xjB9ZSR|eUOE?*MD z{}{$hXItwo?DaLUKNSp6Rd_4$-Y_hOE~OIhU3Zf+a*nyhOKjU69`G6S@Z2n`5?eUt zNV*2b$kzcY9^tnZ9b!F#z^|I4zCawu3^N~#!gugvJ#;nK9#S73!Jn}Iw&Kb(f|1Es zi_ApN3c@b{q2Ud*v}x+@5?~u(3yI_CszQPM(kky2o~Om!4i0tsJ;@e+>;Nqx4fW~5 zw=^jjNh%m4DFy8UV2uV!wiL90BK6i4$WUWbObOLc+H8gv7KUYO;eLC|qGl6G=_itO z_jM+$e}F#;zS2?^;ALxC5{mJvWcTu3wOSr~E`$ z*#+!JL+~o)_d1=c?T2H~*M|KvhOA^B)+t4tls{7dGH+hq)m>rzHxQDqU7sXS4KcW)u3DIwsTE7x@kTko8wmXPWh5pv%( zRUZMEW0WcptmeHPz36Wn7ForYT2(_F5sPN)t2y{?P^)(T)!ujSg7r2qz$4tY;ndfl zt|>OhHFe6I%ltYYW5APpXaebQjIHt;L<>h=PSz{2A8m~x55);qR;*oq+vVF@ib}R5 zf2jD|P8Gbqfa?aKfumW6NYG9}>?f|aN82S-vkpKyS-fwWVYafBp}@9jIkxrcle~lH zn^|Kd+H${)=}}B$j$;~&3)=wT9Uc<$5C*eI{0G_Xn~VK=ompy|>o|-Y=DjM?{t5Eh zwOr~6Aoc7bOqWBiBI^Ve4OW0r@&6am3Q@@>+NIzG@pmN2$|nG48lnX=f)=oHP19kb z*olC*4Q?mk_Hzgr+V~5}V@sQeIPWYI!xc6Wdn8DA;=xMSB279n4R2oP$n-Fzm3uhn zCg|P~WYKuv}digdP8^!y3QD`b~EwpH`R$Hgd+TbVEJz!m}MUPHR~rntIv zx0lG`b8*U8dl|_6T?CVDp=a~+3H_2us5j{fJaEm^JnfT@?PJ*6ngQY`u5Z8qSu>H)8SSj)y&1yxrW|-eLQ+q2vGkPh7-1;^TRaVprfF?#?yWiZ}+)(E!&G_7)P^J3RmWRwMGV#k4LSJ1Y1?Z^S^AWF<0 z5Cx!2^tH<7wBadUPQxRCVk7z}mo8tMkB)4&E7l#)*y7%{lfl9ZqFuoKGV2W3>Vg8k zR?#7x2w2h2;e$;hEUX;cD90GrQm|@WyClnd8Dd6su|4rLA4K$F<%3EZmSX@7;&O{p zcO0Gy(F)5U zvV68S^5qPf9JjTPkcmbtjyXLGBLxr+2gyQ3^=_LLUD0gp4WJp1x6nFBSS`L|m@&6a zjas6wN1PL9tR}(d-@~M+3LOZ@ar<86DT*Ze`)+Ko1gj}q?1EEyJ98NIk78?1}=kDv5Kui58k;a<^$ zZUVkjVNdrgTz3kOG=i# zQG0#nkB)ViASR)giV6Sn60{@@V5bt?y|H7(%L&oR|CsrT*0#Y-vyZS$q?GW$ek8PB zNze7yw`1k9J9E`lss44(O(47LoAASHm;HMfzoRjW@EVT`aVDZBya2; zleiiPs#@8rrkWDf=MH~p?Q@W{P|ch8HU;H)^H}W8gJkXMpcMRO*il4+6G>GNL19cA< zQcHAgzlU3|B~FV>&pj;8kn*wc?uY`6hac;X3rRBCGqaD1ndZwR>G&t-oV0cf{)R1p zV13bx8ZI7<4Mb+l(93<)9_@Ry-q}7pDNSJ;yj%&yny1XZh5wT|CmkxM!>LcAX}I zW6r5z8@#gbWTFc`&E$UoAKVPH6M2;2Qannq6`maM+l`+Zc;WozwG*u3Wrk&ffa5s; zRt4dJML6RW#n~TrF-SzC^nG7{>hK#Ft1BBaK#^7Tq6jmeIZ9XEXyhD;M$%78hJb@2 z*?lA#wquCpOd&hj;OL;ZM0a9+DQ45mXDzRIIdE~>H8fEN$}1S(1Ppf+p_&u8t>}i4 zglc?X97pqW+nS2@?o&q|_VyRC*_YoR9qjYV_vd@xR6a&G^`t1RW3*c`?{9nmwpV0= z=O(#A;r=Uw>&pFd-SsGjTWVd}7aIdq9obJ|0x$H#2_z(-D3}PT2^1+aU)Cx4lq#K> z)^|}Ck8D~rMnZ^EEV^w%kc#mgQ%D6-VZxJz#%G1p_1xrE+rD;(9J%&&3w2SMnp2P@ zXC_TNrRE)n_g5?4UrTBgremmjZL?>VuXTEp^dA( zH7$CJEUZm&pscDD1#383CwA@li=+tk{%7cx zC-tzx=&nD<`Xk`?Q+PL`MCquFPeyb>yXq@yAHs6H1GPudt?n4U=W3wT%;&(|F;D?Z zb(bLzAtHjEoJ1eepq-d_mk(ATN|cpDaT;?=+B;8h_OHCmN(LYqV&9yd(O9G-;<2mY zDzMMOJn^_6$u~y|p?94yVrtLkc@F(eOp+iKo|d%*PK9X$*n7iD)Evp|TaB1~>;&T6 z9u_t8>)GoGVS=G%5@%!HnneI*4aXYUWBA3 zeu7$*p^+>@_drC&7XAYTcz#_7ERN(JMBy7)3ny8hf@(=xXNFY{)G!7Wf~2ODsW9Sk z=!@`Dg+(?BC)8VctN;Qp3dD;*M%5xP6)1U?E#;QjSi=wvwYUG=Gb<9ro6{4NnT4-1 z>#MLc-n1|U_L`%UZ7KvQ692DQ1+^b_IBeAnz|J45kpB0hQxzpydA{!d7d>BWs2TU1 zUfm2nh{ul`2ms&Id~SEsQT^OlfO>Wxk3s(ijg{@ibmUugF{Yy;1kw-LR|$S!x6>{} zHJgnfW5fhbAL=Njh!%7i5+^5BqJxw`XI!m>fo(*DNp^iJCGHbwv|8xv0#Qn~v1A)I z-0cuRy#jM7W819YWY??RqNCJ>g?S)5BUVL?E0F4i79nZhkU>g;H==BI<|W0L#}^TZ^nxfZ7-Ag^fsA-hdk*d9&CYQy71|G z_EV*yTE=LlALaV4gj|3miSHnr^BLjUbKC-Zj&uAuC6BDo2?utX;7$x|Jk$Jia7@(+ z7O!&_ART9a{N&kacL(1d@NfaYlbgUSP8o^)GMBc$8>_|7X`4kI1Sx}F21`iO4q}sm ze}Sb+TsgJg=?WRBOs^?H)XE;}RXUB-k$UI|9XACmrA|1g8#{{RBLF#4(2+RmC1D-W ziv?9vI}~JV8Fa?tyP7)GJ?Ff>yU8;SM1deHT*u(06}Y#9m$`PBEK9{PV);%f7p1Y6 zm6F#&ACnD`ZT(e_u%~MufJd42WDbWzt#JZ+c(M-UG{ZcZgQz~fLv>}$$&vRE7{SRv z0FP1Nn;+H5^NCcdp#)h<5sds9NW*YJ-I#Fo@D0lP*RO&4sI`PR)|l}b2v>1Ko7PTC ziBmeOCt2TgSaOIJy$!DaxQ3|;k9e!M0%5c^K5!kX9W5HiA{gnws>@-d50%Lr9hiwB z&A@xKaMj@2g6nl$dvU3ej&eDNafqhmbKJ^E)3w6`VtYv!=337oAeFoxw3jKiH(240 z$as06`InSt3@__2qCQNhKc7OJ?Twk?whbzSa>Jzz&S{CkN2vmj(^X<1akmN z)+IXGV!ecH?2Slz)TO9GrlN|@stPP~^qquVhdGBqE{;nzNnIu;Me*2;<&dm6LC$YM zc2FOAnWgcbA+lhL)cOPP1g#90AS!#!KiYjQcM7)W7`$B#F!`}b=uE}86CoX6)+f`+ z@-;}39T67LG`9LewXcBjW|&37a=!QB9q{^_cqri%ey3u6y5{Z4i99>?cUou);B z@>g7>5;@UaYXsN@^#;)k5O9pZ3;Jj zgoV}Hsou9)e;5xYJO~(OKH=MZu3IOiwxejh*dLYVpqS4zMOfR7p+1AyqYRz79w)Ne z0Kyr%9Hp%VH(5(ihfNkP7 zKj^B)=Lv1N33smkj>3%@7_juj~Unm5<>|<|*0pT#md23isrN`W7@*1qoJG z1zBn}&k^d((YLaL5m&K;+{6lWpy<97P1@Or2j#_j@a?!xuR6ueDj%TSK%ycTi!UfZ zKfID4@)9qD;-D|~gV7&9ico{XytnBjv)Q1a%=NW$(*MAmsiNdhra0&kin zDS?e`YgEpx_>t-$rFIu>0aM!1M+|ym9L9+Q^{8#{@pf0*^jB&V-jA>B9EV)@KTw(P zaLTQNotm=Z>z9E63-g}gc&B_ z?FW2bK^LdLsX9(|0t5*Jg1D#g9cPVvYKWQ7*6|$(A`pNAgHsetcc5lU@=~@0OQYsv zh0<%~AL4#ye3ig|N&pB&FM0pq;!Xy|wj{P)>0nT-TO5u<8{73B;wEcUk*gOk0tIcY z!z&knBs$a*Z-O1LYr+TTCBD*=zKyc2ffACkYS0G&+V(b7b1RxFa_=QaFA_L5{$DXp z(epPSB5zRs8gyldp-UWdCDS%W%4#S>q6`z?H$;+uK%hHOU*~+#0l~U;qyb(&q44BT ztW#Llw)l@hn)q=olZdofCjG&K7>?Av1F!RjQN@{1_?2vet~9-o!PlpYDP|DoEQx?)=5|{WQOtnVz}c4sR@5aX(C*|4+C7fQdQ_CvCo2Ku(RNrjU+Ty; zR|eLdhyjbz>#exeMc|uQ?>KA#o(=+->K)GkGNWbeOR5Nxufj6n2ys%qD~iz4Y+~iN zmB~4c@PY%T!3IOz6fE{Bu-2kCn3Z@$=HlogeJ64FVL#wX6wbR0Vu8M!^{xdbjzwTD zw1+aO#wFEWXSJ@V*5YTM{NSz0@yHs~#v8}($II8O*J1tX9HgC_K^)0B=DU_?I4c=) zS&kZ1A-DFe$}DH0Ylc}5eyPMAqP=zATGv7oR0+0HSt3T5Z8Ktc5X5dGEAdcG6LE{M z&>Py=h8qRrEn4XsH&K`tsZ(Qb#%nUNq4biY++Wxpp zAG@m}x2xlbrJ}2jVCVP8{QXnNu_8ov6zdaWj`7?Ltuo|BP}P}j4ZFfY!|oHKa)S@n zvVeOdJ|B2W>w||(2vW>B0J}VW3b`G5%6e%$<*hZ3f*ocuou_OoJhhv2;3*3oo(hb! zj3Ymd+=l1y)y`Ai2~U}@p615Z^GHGb`0cnqyb+!f?zudbV#QPGY{11fPkDD9p0Wqw zX&baojm!)()8#1}o|mVpE8(ehbt&ZC;i(I@4u;3(DG?T)GJ)|_2~T;Wv%SugHJ1iR z2z)-Cejk&4`??o;%8(w80R`ptkaiHThrK||h~0}`)HJn)U54e`arCz$t8}02%)A$F z1TM05QPq|aUHx8on{yxihS_7^BW>oiw*Sb%lgRrXXnkLqnSBqmB{o9dlzsh-dMe;M z9Wm0GslP!(^e8C|T$$rgw?`UflQ;csZ<+oMtImQZm_Z_8NOhjzAijcP43A3@Uscoz zB2C#bMqKT6j!hpf;hi9q`WB!ZJ-a_4Pd-%(o;nt<0*(ar3FPN}On?jNpK zKEr<8ui?O+`Y zW&WK>;5ph5btCrVN*oU6032JV=#D)^z=21q-uaD_9vJU!R5bk~qP-H6IF^Wblp zLH>?cPk`ca3=(inZ$om;QO1Z`W|;YGlI%|ZL42`8MDV{Mtj6BDg~yy1Y}n%h*UlYU zm>7D)uR&j6yH=N3Y4u=NRHUP8tHw%r7|vUgm$q zO!^k=1W^$6-o5>cxZpa5?-FcNzldwJedXa-jpTQjLmLjE75>!-zJZ69*p4r*E15xz z@c%lH0>1}hc!u00Hb@;rq=A$c4Iv)nB9a^dpMjL{#I90JF$b*1z2>|!6!$VK(|IE5 z{3uYKC@4cq;8cm`C_La8%GqM#gn7qapY+cI_CyYYSCsl3n^`g*<_L31Hk~8X+1A>O z3EvireCFCLak7Yxz48;bbIZ7Yw5xS1`h>Z=k^T@_kQ2ir31lG<9f7fBME55@L~NP3 zV;bS``EfJ2l;kJ5CCxT+&a~bc-(eLacFaDgX^Y2?+-FITphN5o*AC4D!PF_utWXU% zrmSCpk!qdX6_FSG-9<34I-x;wm0B;Hf!%91 z!mXq;p4rBpcoE1LkB|;pw8B}8V{LvIImXOZ{4)q72o=x4AXRw>c*3%Hb5}zW(0?u= zjr=U)?#MJ_E+17r9)l@r-%ZKXdJtd&cnXL+P#ZPg7`uv@SHh#wgEM<+~Rn330 zQXw8<4Dr5G8v9a9;{a_FCyw8*+8E~a0SB?D*k?l<*Sx4kT#>lQ$)xeMLy|C}5G&Rv zZFpx8OBCK=SjnFB6%=XkAUDv$w2c1oe@*b69$M#1vE7R8u{b=Xjy*r1Y5f^gbD~&g zn9bc7y#5V|{p?tR*gKMqxDMm$h5Ng4Eyty#Y)B8lpycTyM3NGR?M+$5@*bzj@SVs4 zI;zd7?&r1k$|9HT1ig)-|*S+AZHj0^ookcHTG8_73D zIDue4ZE!)T=05;U-CP!`dC|QY9IEvJ71{k%#gn3$x&~Jud8t*ljc1e?*L(&IlCxwz zOL&>l%XA;=SbwLCIA)u};wSM-2p8&FJ<#4I8AssE*o)Dn0?c(sC+nq*D0{Wu19z;i z@Q#7RU7|jmA8caaDG7`n?g791$SiV;y{nKXAqxC|r+YvlHc_%L5oW)EyR+b~8DzV{ zpbG2{0y;LH_Srx?da2lLKLqeKMJI&eXRE4>@%A%I+huED(T zKp;KrNxVI>gn599iw}0;9}{NU^_@pxs8X=a{LYj2_!x47s6#hvE*hZStsUEutJ@EF z6|ecP;%NTWBv2@1t{A5?%Ub?A&m^^)Qo%LeDsagTCD4+`apb|E#QkiPMN0irDR?gy zZ5HZfB|hLkIdE|&4tU2hpk$O7)#8t|YM~9sxW{f);#CDH0d6BXv-OeB z5_@I;-LV3M=YXrY@*GeVJ*~p?L4n(g4&9-t+4_q8&=uvrD4DiNt)4tc+=Y(q<*<5| z#}-ZdL7rY15;&m{%H>Vi&Ke9H@vi)E9x~x=(ObX+0AUOlucb$x7QMrI634(4kx+wj zjFTUK0X@_Nu@44O^ya*JN&zzS3Edq~6n&Ih^I((}(6qpS%?dg5*1>l~9kQ4oyG~FB za6Wy^Q4eE$%|R)*Plmktfh=-AlD;R=%!t+5Jt%tdF?tRH|7>1l#ikp%V#q09MJG=b zdx|6&wy_7GrZo@mz*gs#gY9`G@Srh4cP+~6C^b9IW91%M^D zoQRBYAKdEl#R6Hyi`(&95E6)n?PqKVG#;T-uf>L_k?+DrwpvlPKcGk5D^(tRADWhB%@PJK~4tA$t9UvUnZDJP64sqEnZJ<+5?9IT-@rzoF3arqQ;WtzSqYb zYyabpPTTPpVb$3%7|1n@z!xT6JK)bd=%c1HVSNkyrMVBYCNyU+388Mfa;9^hFyl;J z`B1g`=PBH@#(Sb7Y!h!O!y9NR|&X+Y)h5kvh;5X4?+bKTB<~cW)|sms>|5 zwGHeM2h;F9lf`h7FA_LxqwrCsINfNkJU_;c1I4dfCs`vT5gG!so`jM?rAOD|W zR9znZOy^%u2_0X;J)|e`J^b3Zig#N%S}ldYiLL}gcW9WdW~%)Zb|*_YD;M;IpPnd# z>6MD2#WUL!;#exAQAQ{%Z=RL2!xyP%TktlWnoH1H^sCG&QzL{}%5#qLb{}=Tm-6kr zvx-M}2P%zxi{d;E2$hxV{Lu%J@Ac4Agg$X^^yDF7=dA=1>m%uwA?Il8{STyFKjvVze7_BqBVp+WV6`$gVxD-N~s!9?kwrS6b-;P^dzF1%}5a&D##W?V^ocQ%x<&FHG zhiGM=S{%(3&jCk=FeUE~=+BhAo1`~Wa*nZUBmI0Ow2chwwac%)pQH%c3lye_ZD+vU zL^3FZ+CBs$)tTXvlfv>_=1DVmjoW?)ug4_7zv_o$OP`?Yxf z8}mTBb#(SH96#$-G)09pcVZkddKluE?lLGDO7qWZR6Ez-=;%Ah(8L`Z+6j>COTZrk ztFG_7eG`rXWt3EAoyceM#KmPg_pbB_MCs3j6lA{9wUb{4Jv?_WsMYLJy?r;)q$RMO zf+<32RPM0Zby_J5)lb=d`bLi7S8uDvhAUhd3Ui^nQxd`aJb8U_VGq0`+$S$KhK?rw z6CG~e4c#|$WJ@c~7l*F~(q@<&V1<7SZLB6vs?-d#=tfMJ>K`)UJ$vlJ9D~F_CglGS z6I=dgR7ns)Zi--_3;o-@wG#lI-|yVeFa9 z(^p1*jr728bzb%noc!kY=b9c)4c=iTNK1?3BCOs=9pB5Z!j17Bk163i$>aDR>4*#Q zjCZK+UZmrvVZpY8I`Pvu#JP`&BKf!1IIqd5m`+&MS0}kRLaL!2Uo?E`a0~AM1dr*k z)<&w}TBPtG48I+3mp8`S@f~G6qa^SO@y|4AvSncI!rJ!Y;d2s*Oi#H)ac3`_mLb4= z=DX`^W~Hya&jZZbf=4Z!Gt{cfscuDS)AmUkK~%+plWqDD$iewdu05moEzZ*)eiW=Mp-{el6#sl+22ucB zrm`M(vdY!{{kWGmRHD`_l~wLkF{kC-rm}8gmVkWWpRC^}?kC2e1FZnw0$V5;t?^rb z1I_4wrSD_68ya`0T`{n)A7==q9H%p?+d7QuI8cyL*+cq?b8ipnJAxu!y4gOYII9T$ zA0Hw9xe9;px%lUw2Y=U2DzbkK?hdl!J0Ls7LC!|@B>ET3Y-AIHPk)8nWV!JvUA>(z+{Vd`dnmn1XmD2JDc;&!_sY`YPRwy1 zH3`^pTl<~*GEP2}?BY`}v9xr0Dc6_8iyCAHDV~*%7_hM2GcCFV=bV`9Jel$wZX7C2 zTpZBft#$O~DbPZ{8zZo(G=cXNC!K8+y@m?CY{qT;oW%19B%dF23e{cy!`l#b33&@#2qs$Bz ztcM{Ea(Xqx^2#TkpW)k7)hQaqC>%Ki6{px@W!tnF6U$~yxph*(4Fv@Sv#+`JdaYo3 z$&4w}Z!IghzTl>Us|)U3wqRkw;DRzFS48LE`wgTgBdyP05>>VjFSAEK{NQjqO_!t= zxGCLD-EP;jXIG5Foo73x(*~iOLvrjv08(yn1x`o7S*VWCM=99>cR#3(K-bFJ+ov;M zr}U}%x1xTF-*>M@i^)E&d5FQB3V%Zu<4HNo6yoX&?*eVrr;t{D3y~YePfgn7q z$(PjSff{SDgOvj;`qT9B;eB5;pRx)wC+3+Ye6eUqm~g~jbeCg{B}<6sVwQ!$tvJT zUPK68XUe+x197nREy$4>|IdHpCO6AqY>j3_k}_9aiAd6VgYlIu_~zAQ|L(VcoqV0+ z(zgPbH6Vhmx+U<6@xLMg4Z4r`b=t6e(QA{vRT)L7LzzEXt{`nAr1y*Hgk&+Et7zrc zU{fpl#}6l)7Mph9M!St(RZSP z@Z@@FpR3xlJGLM879M_P*L(<7aESW(7Ewq7vu#NzlIa-#qZBNFSkU9Z$vxh5;6*Hu z3aVTY7N=DXD@MpZuR2L%oI+?Dw><6fB07sl*a{N*eca%UO|0)o+Jl0HfN-*+k|hOB zRxdOWQs_)s=KE=5=OMJQ$QakaGBYgAorZaCL#C|Kw1#C?mb794j<#U43JFMZmsQt5 zl4q>fw4QZPfBe2sb&9ZG zPjs#s(MWE!R#Lec(MieSvW8}zLID;Xkt|T9{)!9Btt+9~;;6Et!Z7RM42S5|8^mKz zp$JpTPhzM1q_5&#DoD=Q9O28$cngEF5c9Vw5^IR`!q}pqQ1}>KS&38r)OM^sUW4$c zn?P)8g73G&TEBxm>0~@UzKc!4Bf~WwI5HSrhJW52U97NwhuDXJeR4MT%B0We zkL>=U-}%=)MLYL&MdzNr&z`&vUxu{g7d>@FcF;%I&Do9iYHR$207w_oxoTON&vw=16A}BWX7JD$bcf;Gt4lLh` zu+Lx++pfZPovKV{m7%C2k6#cb9-q5PG>!P;hJG$yk%20imDuyhth^?91NcN(&g8HU z5h*8!Xy89sA}7&|FOfawIdy-LR+r)mRhFFeItFs!Iikxzbc*Ub5USCUtFxMn-wKZu zxvXsp)pipICC~~?VYZE)h&=TU(8Tpf0uLKdw5y$cS?5+->lV@K` zho9gOA8?8W6b(9H1x)`8AU1V&Ac-Ahz;<{~6?YJ*m7_8p#OMhr781oOZ17);M_=M0 z}hf7P}WtRSF*dca0kBG0dmYo(^7e*S#>@%G~T(`d+9~GONCRmcF0X z7erp za~OK$av@MCHZnR5`&87BP^}y$68%RIPSxP78XaWM)1lf3xT-5hK`NA5e;r2h@l1B8 z_L4MFpi0IrQX-9mEEJ6O&2V=TT`)~h*4z2X1H8oFuC|enfFus!OLWb~?J?Xd+td-a zdtKZXphidB#-!m^%=W^%4xWf`gZu!Te^#2=w&i3~WyQkg)w~Nq?>?RUNsMlOj z8UMmV-INH)+i8jSJE4*zqslJwm05U?2EgDSu>YIr1`)>159Nj>FpEEPOK>wI4GN)0 zZ%(tA2d}Ytj{h-t8phA|=gzCjFfbPamaWP;NP=Ez78d0v+ChYBKEsV&`9ra*>6WD$ zIf>o)f(_;n0k!+ z?QpkH&C?)^7)Y6e6h4Zw5!6?dh4vg0R&+q2Ou5!0mB!dxz>2k}-w+z&V8W1pjb}xe z6~%nlRHF+U)n+8m!RHs}NCVwl8^h=oj#!9P)>KK6kTF!V05^$C@zt(#E^TKayCctH zAAkM8E_Dai^sfi@0*>2(0kLNi$3b8jOS&BYJxv^I*W$*(UXi|8ik0Zr{scFQF8{jA zYuTke6;=z#4(xj9>qj*e=e}U(z^s!aPDjAv zobcNrYEE#r#@+ZVUKUXT2?f=)Vei|^>u5HD^e<3*D4#agkc!P8{Qq!SQb(qu zy&05m`}uKoqY8?CE3RT>LV7K67lY%N<*cG+;Kp`@V0S2dw*SXko&7&d*fI~u`+JE$ zKRQ9^tgf>&YkM~bRke%B5y0BWgsp-GSQT$VLsO75RJc;&#w4@OtdzJ>p&=mBhAS0)yM3d=Z+Db7P;6$3+XbCA+-SoM8{F8U z4OiM|#X=|w$sUo7V=Yq1jx_S{sj?L<3iZ{JGbO`&X|$z> z*;MC&V$D_?e!jMNYWMT?x!&nKU6Bm*LeK0JNJ=&yj%yfB>hca6os+6X%EWL+mMoFj zawH{j*PhDMA!rbgZU@JWOB@OQZGHA3M=X|6L;F{Emb z-aDge9uOt{MDNz!|C_3LWz!3*=A`0>H~=AqN1>his8Ux~Na)8U4gHL$2yY%#mH7ZN zQfAs?)J50LgCEk4Mmg%!YL5D}n*Y4i>4SrjjMZGN+G>@jYEEPuR`dHuWtr>wTXO7u zy6Y|6KtnmPb~TNfF5XMlGh>CAM(JVnSZv{U=$##l$;@fnR1HJ*w9o37>X^&TyuPkY!JNkiNvEz0=c^r|jw&VXPBBNdyQjX55DQc3PB?qpDwahm9lH>5 zUu3TLVwrt9ig-B>+;jj7iw#XTzk$Vuo$Kvue*3wanqxryzidPN-Fa91oyYK@0ovQ( z*$CEO@#}v%uMC~qbW&?3N}uR60s61B^mk=KQ<&093s{fBe4|;yF@+hqAHh`DX0KR&DxB!(^Zl@h;T#|n4k5gaY>;CD< zgM(`RSvmDKbTRn?Nv^k-u+*+p#$3;{hd3t2LZl@G_ zYQREsy%$0mTq5ofodSE#8Ye^vOvEdOEjeiC;{;ZC3 zrsIf%1nP$q=sF{f*Q4)z>)>ueD86cx(7hicO}fWN`Q!6GgWq%}+n8z84Bls~j?|eH ze-L177Yj`>i0-)^mL&16&ifTBDMeTP{aT&<;}!M{+f~T~a%QA*YOyiw=&<_y*F<8c zrWZ>eQRlzom5QWqw@~s^`K-0iA3NwCf=c_6-7onM_L%rA9M!6S1NEB|^x{6@;YVoj z1rknJRGp*T#s;x0fu-6fyp}9drS!g%hjL!2WIkcv2G?EPJ=_g{clYR+!RsI#qwgH?rNIj=iP! z9PR$UT#D*;{|i&XH$=PtK9pDr6JMqN0#{A%j@%k~?x@M5@(5qx5m^UnPo^A$Y&zC} z>s_YEK?l)tJz8WLTv^S_SCT06SjHHgD*V_k7CjU%q01CSKRws;CZfedWA2W4Em0xN z)wB{8Aq<$>vj<+xSjWR)bL5xm!~TI0XeIFz>TPnpAAob9mY+;-(nHtSIAABK5FHbH zp|N#e#)_3bUX-d=8EE(+Rz<4LIM@48Wn@cLSh&*6clqERFY!hl_-Xt=E%IlH=#XEo zN3*M;mrCE^ghR*T&-I*7Sh5<_yH5IUhTyu9UZc*Asi9qWfon4r&o$KhQ({Dm6VKq| zJZ5pTs`v)fG@8}t&;BK!PVBuvnQC?=`N9UOW{q{l*9eLpKNTq=TO}#sEw||}3QNF={0w%Wq$K&p%c_a>TMQZ1g?9^ggI>ecfmO=G_ zW3=~keSP74*H_eF&Cl?kQ`0n5{E=StuY)-XKGKWcK+y13wB}aqYqI3l)j;pjr1~t4 z^(IN>5^4`|d%47kPK5mz*+Pu{8UA@bb+(UIYvNvF#ZR*@LZ<35zlBN|4$Ut`#@H1S zs&qYwFR$Jan*?EczrwsldFsu7%3xy3KR8cKV;As$5&sMP*Yi^TFH5kVSMuNENjgOL zu0!YbxyRy-TX*c-zwUmY``4rIvbdb$nJ#hTx`*NOu-<2AC||FwhHN8O?RoSZ^N{SI zUSnYbxs!orQ>deMDo>B6BPmjz2qiFyo9ZsVj6gO?^qXvfwZyFyoVoF*>^Xqf*sJ*r zQ?{wSK5dkq3ukkfc<#muLX`?#d%uwSEmn^&>OOjEaenvZHC-%Yihjy1Gkl1sLBjpz z%Os7YV+*y<^hVL&kkOglY1PhRhgHP!C*Hzoj8Zns1|O?hx=rWl9Obj#%ANZ$;_iWC ze9@Sk63so-z@9me9O>hC`D_mJDKI(fcvkVu_9g`sFYT^ZKpk%sv4?9GOEjiAdz5NQ zd|W#T^(KxF)n_N3(mSVBoxD_WeanE0#N-fDRfQd|UkDmqf!-c`Dcb}6tCVr447=13 zmD42B>q||d4OcBgmh#!@D*QW1c{s_)Oo|M>X>YCa0E_ERd^m}!#^PL~IsJLMCmD~P z_QiRv=##uMQ&5D;gAb^^vZ>tl#wcdAH;2`KV^n+F26KN8(Hui7l=KsLTaivzhbMuP zCasfjHp7sClVg`7mF>|KY(;I}2LkloibCGZ;dp7SWsMvKWwR2?jSuLNdyVZR8XxH3 zDGo1K%)dga5&Ms4NK6Ikd?c3uD@`sFRc(;*im zs>DeF>g+vFB;Rtri8l0qtNpB7n*``tfK`{zf2vQuDD z-0>>zJH6%AP+_&HMkiZ2jX3;$`;Z6ImL7(iNXVR=3zZhC&&1HKk_o0d-QuZq6iYnd zxL?-L-KnV@BeD6=cqcC&-o%4lGEt$l=S9!;TnIT5qlgnw7FP|q)cQ?yp3B{Fy4c!Q zl3S^53K98!0l%fTsm4l*y$OCRf2uKWTZaiwsBOA&pA!{5Ia$rJf#iL-X18WCJSc8WMz?j+*_^``B&i_S0>$h zNz|tJNs&APe6g5+Srv1wV&)aU{WrPZ!zApF#9}|)oimhGu2=nbOn0obQ5z}uGLG@; zB)e4FJVcvSVrXFbVq$#H^$_Zn07-_$)2Kts)3x}2U#5>$C8jb}B__4B|E7y?SStWy z;kWBl8}CqEtSO}n#k9S|(euhAUh2$D_Kid;ofAffo7Q7jlhYXdgR8Z#u$1<}^>2iX zni1Z zCX#pEl(0)dqu5U$W}lsKDW_3fKjU49#Fl$*q{W6f8B?RZzQnJ5mhFz-9l4&jz*W5{ zNf}~1Tz1`-ns&j>4ed#z9jLcXC^}zqCPe=R>bHSVD`LGE4V{bh_L1T)16G^!{jWqU72$5iW zUeR(rS2+n4s@)mIH^|aZEu^Ih=6XIyTJD*%>vJAtooYnqT!i4^<|)Nucc=7F({*-1 zLKl=rWh#5P6qGLM{e1e}!7nXHstC@f!OXv9m-!G(zOy*7P^3L(S)b;d*i6se%G6r* zA&p0jtdT4FV5=)$u;eBfJZblFYfD-{T}-Pw98M=y0}GXz8j8zDs^A-2N2%aO2#E@= zNy~V4RT(ciGgZNx)AFe;k1pSzIGMD3va(^hMwV}ORr%CwCBEU?#Ys9oXiM$l;}AAf z9nP?wX6FbM9^E&Wx>-j`!@3T_D0}@I772&#HFs-H_Id)%$!d#BGu@(!7h1zB&q!7A z##9x`e6%WFMwV_JuIfLcilL9DWspXz4ZVvmB&RJk<*Cw@d;46EuI>2$r!$T1e6C$% z9lnc>0@K}#^U_rtuP?nOSzmf(%m|9-B@=5$i5dI^4adG0Dv8aBQqw*s=(X1_5{zY? zKc1kX#3F$c{AiNkS-hRJjC}y@9}a5C8{e!IuTs-Sb?JGD&Y4(#ySVo;XnIQI9h-7! zIY4)AdRf46hu6ST9>tbTY~ru1c6cF{3-X+%IC4F>K2{1t78NRF8BVV{UdShj)5YP5 z(pP`8Z6i(B;qQ#%JG`6lp=(Bz^^c|h!lk;9H>GPqStZH__gVkIu$N=tXl8hbv7e%r z^ZIQ+I~`kmN~P^%FCpm>6gsMfP1%x|`Z1?&Gh&Qz z!_R(2Nigf@mZfsjh&xWW_Q&wxr20jZWmc5+EgnXrOltP7MBRykO-?iyJZMMJv1=b-2&AA z2?!b*ClG6-t_B*Hw@O^gf_g1vcElg2yen|yn#kpHa z4Yelsq!gx#;n8Y_>K9>SJmTex`IRp)rSZmad#lojYk8~r5iXC^fLeX;-Pc=sU5mK*PqQI(o1ddQoU&PWd_TRvv-=P{$#V`Vk+ zjIh?rAtcs%c0q|0lt!h&n?)Kcydg_C~zD4IgiDN zBmC9>$>0Y5i6mNudHM7RaM=>9{feu z6=te{8_|*1kgD#@n1x2>TvushS$c2}&Z@iPF0b1aZ%h!|6Z>g1$x~hN|8PK?I5nJR z*EJwZjV~=d(f#0A=@ka!$-DoERiM>h-aPgyWP8h9lcj&Y*6roVF-7hRS*kp}NZeE& z@9;sLo8^4xEQ$PU-}piEb)H=pzKHlY;d%OxDaS;(v5CC3x!Zq_^aFKKDqzx#8Y8b~ zpm6VxqW+}@w?Ph7v(=6&lP>LYFNS3U%HMsF3|${`c2OVqq%@mnLl<|UD&2RH?$Aq9 z!OoapSs`_*$hqEA8I4_65Le}tktKcOiTadIs1veT^MZ@dgrhk}L+ndHuas^p_B7LW(E zv2<0`azc~P?y91F<;o6t?ujJGEq{LHBb!FG`qx0Ht(S`W8(fnTA$gmhs9x2Mje((4 znPW#ItMYK3v$})u6*luLI9R(5X?8-|j&7Zk`h#0;PHp)^Lrb{VWuc1yCj1AohtYa@ zBdafanE4g0_mm#y^)5;YtQqPg?jpr)inwX2_rF+UE$yQK^9zfKGj#j#%{S?sJ6tq7 z2Y*^>%RJ?r%3ByRj_{Iy_=nU>4hzG}+O3VKjh0)`-^$yhg9p`0AJx~EM2p^|__}O9 zC1NC@LEg|K^y|UbOcAw(tD@>(Y1hz6$su*`5JjI7@*?aw($SlMvRyve%CFMn9VO`L zlqj}0NBW=}DTqqu;g;Tvnh1ds$g#AOL=69&{HRsCOOu$|N|;-D_8v!L{Fmz)L%hhj zHm{DP`=L|0%1;8OowOeK05`w*E>>vuTvMD}ZVImC$_Z6K@rqKD`1sO}jnEuJkFihc zLP|4{6=^S{)VxUrw=PWnYf?_Wk9fC}o$3yx)aK@GMP;=h5*Ou39^S>xJHwD=YGgY# z*=bPXRfRI+RIkLB63%F&LoY9n)R_%9T>M9o`9yV@Z1;6Fc0a;x_4wa98TL4oiC1Ae z&V#EFJ&#-Sb(Jq~j5<_J_|3jW5T^H!x7t2NL~CyR$JAak2Ojp5?nyOvKYT3l4L6KV z?M$aOiPX@!RK&k>U3dRPFzuI?~Z6rs5rHp zH&;aN2wkVUI?A!!@u^ZmZv2$b?^W-(PzD+RTYdJqwR}KP{x-LIHyZBl97mYK zxzMi*l=UHDl2p5BZxXt7GObN9YV&$5<)`plwa37RgCPX(E#EJ`}TGxd^5FROOgo&ItY%z1Pd%q0{=9EsRb4Ix(k0$YSTmTXU-$b_PWZ=V)#cPmCK=( z9`?zySZn9J>1?ss#iduhsm0H!Tq-#clKoq;WIjX>oO|WBh7XW9EE&ShNH`nsTq%t= z&5CHt^$=;KDJh3ie!9ZrH!7+9oUS@Lp>vKq>hb!>O3Bo8Jv`zqB=<=J^;0=Po_kd~ z=)SgLPUU=RVxYbU+Zdx-tzQZ{rSdW+RFyB@HYOSVMBCs31pG;IJ;R?3)a#xGMH;AI znY>0{DBxuZ)1X)GVFbgL8&LlS>KA|*?aOYC*H^fgj6oEnQqw#aO1Ru4@ie&5gZ5~Z zl8y@8*&&b@E0xLDA_1km;@s9Ltk>smx$wBN8_tR$ARO0{X+a?5dJws!nRJUK-Q(A0 zy7pMEi&ts?<9Tj(Ss>Baua13kwT$VmhlQdy>9|4GVJ#0uWoIQDf)1ck3G<<<`CY@)b7t+8@r{@o5x^kJDq;e3t5= z$-n7kLPe3xbx~dka247TNMoMF8Lp!fUhhs?TrBc;cM3EV$D%m(YE-^>%B_l0`r()# z^70#q{AMb&WzBj*kJnoy|8gri=~Zf3U8yPrx~w!JZsn9|y3ZpW|dx-f0u0? zr^st08TD5jt`5)nx~ zq*V69QWjS77$SZCWM|F?xgg~@S;q{4%Z7O9eu%FJj>&y22PK04GuLyHf}5lzcF>C| zYDm<0=T=FsqE?PO2?>fGBq(q8>%q~+JPA?NNxk(v%fesYskA9a+H{a4Eo^EeQJm1g zE%*xVDkImKw6Rr+-KLaFzZvrz*kuN!x*B?6l?1s-lGjVvv3lRcMI2jfFXxl=V>q{z z^a}c^oJacoN>C%}9mVF5t@Oy%2)4FLRz-)@X91LasjY`!u5Ra-Jk=s3Wo?wZ%`DYr zivXr@Gz0jMJ$$*8#Thw%8LNimwT0Cx%9rX?Eee6zqb)xm=+Ji=^A!5Tq?aU*yS&hk zTN>WYBTi$qh+zRk1^){%ay`Fh8pP3W<=o`_r^W?gNqMH)*P#tpM`PUB)?}S7BTgu` z)6(l%M#Va(>}nwib7%`9cJ)`;12*`E?4iE+>R>rF?rn(VZqkZ@MZym5RDDz4!Pi*O zL`9ytTDgU_sHPw_S3dR`+qz~R7tx@TQn`Ab`*(_9%Tc?m=;&>tZU;a3^IF1{XjpN% zO>#3L4|`Q{(|2*FhGC{}j;Ljpen9eV5&=1*u_nu@S0_s&e_;W`%5{`iI_gw}lYD3x zaOy1#_?1sKNz&+ZPUZhH;h))`r7ctAazyx&@Q@*R*9Co z{cRMruwIqEP3>V3g4xFu)Kyll(W6j7t-kUG9!CtHG=9=b^qFJw;<~L}$bCmDKS`;)-ZWD7U1-`p~lwXI#cfmp15n#H7n!%q3RyREOZ-LQc&ER(f zt7XQGA_KKJzM8>*2|5;3Gx){8RMkP)eTC#8;%@~bH|*ZWsWMWeoGMxRYXXrfy(YHv!-_2}N;D*pGSAtU&&O{uxw ze;dhvSsFq!8czQeDV0>VX1V54YOZI)$W(sUm)g#&t5W$v?6)I(ms?af_h+^w*S>eW+CA3BTvn^B~K zn)G|i&f!Uv^UgWroF| zie84STrBh#>`gE`(0YZ2TfSH!OVnLg<>GU1EcOLQanVG6O`n5 zC3)=-Q_>xE{T88VC!^QoCgg#-*u$ih1+y!Yg4ilA;hQ4lAkmw&Ek~vrQAS|HSsFel zkl}+yDY}l#l|FLAq|m7BufBj1t#wL{60dUl3b;b8qua_+(prjk^&2G2&Hy6 zyzMBrQi(=I8};4%`3-Po?P{YQS~v0A{qSj}*3Ej%>oMclfYA-quj5z$3Mx=Rw8}Tj zb|+j)i7eXX5|5OWB@mPUt)v$9<7lhWXopA%CqA6u2hxyZgvd)cQ=JG?68gtMTnlKa zlj&c}ni;n15h2=eW1V8=3q!o%(XwUEx$x7cRSQEt`Ks1>`feIjw0#aRVqP?^tr zO-$O@vn=NmDW)s0yvoKW6<<*{LVKDKuobXcwF)fEKueX2eyN2m_8jB~^e-u7t~bYX z<-qx9SXL2LGD?`M5vE`HkV1TNFW0+|2A*hTeC)imii0c0z4P6=Nn$;n>nX!m`nOsO zhgFNr(w|qnn>Okp@85I^v;~p{sk#{J@e3{rMH_mM{;Zr=q~wEmSdt#n z?L38`oL82c%#&9j@6kxaTo1PuOBOwhX|nLC3gs0^L%K>nP=R_At*dIQ)jLz_-OVR6 zkS;SoIk~8sf%^62sec55baA~kRcciU+P{~(L)WaSR(Z^fe>)EaHP$LU46KTsx>@At zox0yZ=-&ya{4d8^U*CPSmT`#lQUYw<$^vR`ofLH&C8|oXO9>>J9lFT6{9~p3`7c~b zzKYo0sccUwUds2U0hzr>V{>fPl_u7G`?py*P6gNLM5~@K2Y;7WSb8b93XN%%mZDPq z#Z)OHcl$3i@S9C>3;K{mfYv#zZ@$1JIs&T&+mktqaEpmgPj8G;gr`VGF zv4Pka94-uF?xY*3s#d-e%mx+Tf6(CLgnjK#J}M`Fw6IX^ln+Q$n!2$mThl}OUhvwOiHRsoxsDovXi*3bF;CwS@^p#?5lPGU0H63syMXfaxgPnsSB_o@7JN&p4 zYxnOh-{4b3q@aK7TxY04Ed9&W8GVlxm8f%S*<~Hs?kYcJT`bdXc+6D0kI=VwcRJ;+ zbD1%dMObRm#5ySV&}aMph+V#UWhlUd?p)73tf_JDg@o>Ub5=(ciJc6UlbW(d*$yOw zQ6Z{BZa`{TBQW@7qN>fSVlK){v+N^F{Hkhv^M0x^Do0HaZ{=kF7d7Q-8Cg@Vy#H-Y zC5^*c$9qX)Hrgda^2&9hN4cs&9q#m4O5&#ds9@67B>l9K7-bxvxJC8HF!AKBYh%ddDc@HhbAnI9$+ATp z741EQkH|r3bZVA!Qn4xe)$RBN`qfOzaCa)Z_D%jX>ur;f&Phd1M%y)>lIzuX$}&5j zN2*ch1NAC_+gw=oH#P~9gaKel%gib9yi|t zVY*MLM+yGp2P^>5QAv?HuZ~Oktt>gMAk|G_vC?xbolA7}XDrz1d|h&Cv}=hc(ZORpa6tnh2_0@nz?H`&HTB=! zspnJp%%8#OU8fL6#$>4!k}npDXjiLGSgK>JDW-g0^|C=;Nb1Q4qq5J#rB^)u?5|zD z>6f6=v&PBsy7VKf9Fcv$JcWPbc7Hyw04Zr}4fK-u>VlSwvf=+tB;9`$S+jUErGQQ^ zaHbzQKc+(0AK^DEw@6HYK20Cs22>ECa`Z`zLws%p-NeAhiz#bd zbqE=aOQ`aV4<~ioby2h@Q#Ym5;`wQFOVVE^Te~6hS}x3W4oUi9+kP-9IfVCTuG{QA ziW^C~-$FR2e`Ya_VGqZ6UKWY2Q~?grLMhg;9=M~YptY}Zr_vwwZH@CXXme^Ft}oyrN4q)z3H0`annO3yzE&C+tFutr$t6r`F;Kc%sK zX^Jm)x2;Ysa-WF3IGSC{579|lv@DMN!ko&xZ^jl>Y_fJ*J{Yx7Gz?~*tg%T#V+tvtylT?$oz!(r`9w-E=cnK-c&S$@R#x5=-Qi)m0{Z<*H-u4^IBw{YzN#o! zB~gx~QD(m|O7ro0t?(E8<9yF0-=s*LUi|OyL1QOYMy}1{h8_*8BYyQk@r? z%boIPStZSIC9QXi2D)EgfEKYXjaY*}L!lmfDJ|ND>a}F!cC8m=e3e@wg=Ed*yjTf# z$l^3aE5Ud;RgYRy^t9i8f~FMhOv$I`MAJqri)K!{l0UM_stlW=kda|=Mz}kd_PH?7 z!C$iT=P|mfsD^%RWXa{q<`jD5ir%r;Ex>E~qqssp%ZrHz&Gq~{a>URz=?2DhT~g4} ze)&Y!{~jWau!Fb+FJ>ur7qM>59feNUeNDP(Wn+yQd))TSUBWVliSk3~dee_TMEhDT zvMupX=#lJeb3MP1!Zc-wkj=YeM3%HgjmW+QM>6uv_44{_)Coz)DCc7&ZO4%7{j35t zT;pRm)#ek7*QbnKH}Qs9SV{C0dhnp5s^7mj`G(s(sJhl={Kf1LpkQ8va`z1*;Qng;nqIC(t_n^ zi#&ZHg*_&2@Md6lhCgaL=BCrS+v|(<-R-Az#d`_WYZeU}JNaxo-xYu8w_5O|Gm!{x zw%V90UzRzYIy}Lg%Hxk=kXIfZu83`$wbOT2`KqI}tNXM7q0il(Ri4*(4AJFv*p`Tz zvT=D=m-^BRlg(t%^$}F1a&}IjbOZI1Rwq4QUeB51n#e;z>-`0x%9tCYPQ8dL*S&SA zw4w{sT6h@-mUib_Y(4H2gGOp$;9}@~vg@-d_OB@RP2*W>FFn;gP)~2B-K277on(ru z<_RlzdY;|k)4Em5bzB)*T+w}5LvdO6W#@2_IO+Wd-@UF@qYA2?vH03@r#AO8eM&cT z=2!lcp`hkml1c6MNv>U5ag?kjYWHO=x3-4kl>lA`yK;{X;Hj4MZ^YMklQA)0C6%{f z!Or>JCBEAp3a9v<4)5Svdms@b-y@!$1r>2;I*1XvJT{`DYZ_Q%uV|3e(((LnbKq4 zj}M(z%B$9R_dsQe(ry(TA5Xu;G*q6T}IY}Gg;TMYBa+Paw64FEDjyYqA(_gd=m}P|XlgwFh_2H^FO-A+ z$FCpp-sGCOb$G+gkD%Jw!OT#2%KSo~+FsYUHG&pBalUArBGxGF>@w3cNjpxHIH_m9 zb^Lhtwo{sy=NR)V*FKDw;YtSHtIqYTRa)s=>+{GXhNVK4Y5zAZ=Y>&DQ(vA^ix;G` z@R!antd+;$dsy=e>m>7oH0Pmr%eLY@?-)O%mwVJk63NheMqG9=zp!30KdzXUkj@4@ zeVC^($foE&)~N8ws>uAx$rN+=s*LpIF53wA3S8O9Yk!!@o7?lV_`~<+Tc`84`{6&7 zT16=5XX^2xKP2I-;rRGc@pWw#cI0!eGa#$dawdSEcor*S3?f3x1I2Qj@4Darl5xb!g!3 z2minuhQrLr<9l*ENKfYj^l!{>ebV5BOKo!t(Q#=E5^JXrJb*ksxAvjiexkMRQhp`5 zunnf)@oQ$wI$M|W;O(vdX^_4n1UX-nDaiemo%Kq0QqNwb_tnnLb zrplu1_z^QJq@4TU*(%X+#a3rAg0W=P4AyFCH+cuT)VctnMh(5~g(^2ZghP~W`p7yTKLkx^mwxEKYKkA7muO=Dn(k z%@*br$>x2*6}M9jQIn5YQ#Eb2yj+vui2Y^x4!lvbDkeQN=gNv%Q%2KhndylBL>`TU z>QIzkx?wb%3{Tkd+ZL;#PoyneUNzCX6>7HGpmeg~l*jdzO9>y50ls3`IMRb}uZU&Q z6CHf}$-9&-O|a|C%E@RX+gse>I@e&CYL@0pt;(PF9JRZM2aVTxg(*>^D3!B!U`S!k zdM;hh@~2w1T5G!Yso+|-ch)|a@DM7mZ4x7EpG!p=wf1T6;5fAA5$`E=2Uv%tx=}x}N2P>mR4Rxtp!cO}9HUiA%XV)Wl2-#y`qHGar<1%9ed*k+q#;QU zsqkhMzxu}~uQRkNLEN||lFf1FdU=cTwfv+VG=imJR#j{iW<8$kvAR1UJlnT}hsv4}nCsMA%RO60dFqLnsY z)^_!FhP5;6N==)gbNs>HGg)X+BEucQsob)jc-QLi@Xx2I#Y7T&orLSWs#vl;_v9x! zU?Z6-9YLnM6TEep={ww*i|u@-lTW`g zDZ9+sVF0Tv`Fcfi7{G~5(OD$tllu1LKrcy*^3p5*imKc>fmOU*@14|Pm4p9#f-(oM zbVo&MIZY4-)QN8Z@@)Q{F;Ibw^`NsS+#*y*{2I=D~(AL z$8*)9x*p9OB>pJug=tfGqp7i=)wWNOr^borw!J)Xi8>2u1u~DdTRAd%X}tB!%BdQu zG^4Z1#aNfdEO%5}SvY#d9=aF*P^Go*PHCd4_>KU%;)1H?_xQFLyM&57cA0AbU1jYG ztNcCfv|x0E5me%TtP6A4+EBDrnMT@Rc+st(a71 zAws`OT6(1Wk&}l0G>!9obsV;Vk~muwXIyoh`cmW~hp+VGa2G(T=VTWsJ=vvfIN8N7 z-TzMhl=CVRC%gD%kg!Xnq`$~cc0uE07r(cBgSR-u5w;Z88mgcdmXGkIwOgo!%FCst zHd$Eqmaj)rw#~}ge;H|(aSK(V)wo)uWXaf^2!rS#bq>*xyE?Wef%4SoLfTa5C_1u_ zhq2vpi)S#namQu$p-0tkIASWlBr3Z((U53bWt)Df%|j2HeyL5(pzP*RYLj^lkNUzH z{OmauG#Xb}ktB{P2?a!hvBR(>=6WusW)f@6_2?6}ncYuwG51lRP}Etx@zn3~H7W7Y z&eB>*2FFulkG4&DltvLY)J2@ms0{qk_!DG`^5l4exIp#_SlfFz<^cH(MjL*Z0&;l%7z{{m}I zZkQR~??_aZT=?f3cUX{cAKO%s3R0(-=%1rZBEmGAx>r5@0uekvF6K5loXLeAty z&Ae#YT9h=Fbnc`2c-GFTXZ>TBBSDz~uXZ&~gq*CtH^v$GrU@cdzi<~DT}@)m#u{!Y zl`Yp<|8Zhg8(mLB=x_Oe#HI@4)ZwT&%d6tdt$a}tnu&md*$@M?Kg5VlG8DGTjXX;; z)BvMXOm)SJxpU6ol~FkPkC?PcyvkE};NeoM8Rp$FBsU>89g^bGX-kc=b-E{YoqW7W zkLA1-lCmGJX0J25ayPpkY5M%u=7n=T@ohg*+Jn*?pLPo#WsUoaToj=;ujC;)r6xCn zP`8f_rl4NECosiJThyW~w{9IKAe zs2H6}*X(-a=nKD`pW&B_bnK}_;l@T$l8;;mk8(%hk&A-aB@U8PYEt;fVwIc3Fp^ez z6PffMfquMRF^<=Z$Ht~dzGX+s%Rf?f+9Ae@{-O6VE(lqJbnDodi8raVLygIqrlu3r z#+&CQ)y#F~ZW!CtF!tW(h7n2TzT(nq;a=~p4>$MY^|FNH^|oYN1xK+Y-tsVr#8TI+ zVumnO2zw4%CZAfwuzYGxqtx-mxufLUF8QXW@+mvyla))pLkx*tIKI@r@Cw~|7VDw8 zQCYl^EVPL?iw{oSJC&JA4O66u04>xl$*CK+hrZ&4f z?H@I{66qR9p=v!<-uusqsui*Oq33xG;3k%>^>nJfEu*9p@|9eyC~}cE!-M+|dTF37 zW%ARje7{{Ja8lPxBFahnR-C2iI%WQKl_r|;=zAaM>QmXQub)9Pme=RvI`S$vXOFY= zs8BnT{FF2_9w+P3#P+v2@fe*Yi)F^ zH6u-jR1m$O>? zP_F{$*7L+()LuPf{%-){nA#Klx^a7a&Hv#Tts)KaaQ?Q5`+G z$oJv~D=wAu$@P9g+V@)|rKW}AyPPkWaYZanKM1}iD5_-v;oRQMZ+l+6#g1gZ(d#;M zDxbQ_I@Q~;Z{z|>I5MXmCag%6tG>jS;&Oho znhL1&+`|aH0IIqS;<#VOFE=@%wgnO=E^>3KQ)SJ`tLtqW71*{&StK*FWyV`gUt%0f zAWOlec(aF#sueGterM|(ill#)PiY~lO(~_bJLOPvZY*gVD^>0?Ggicr_npMO>xo*T z;NulRYMJTg=w%)~&hq015@N#1um17&q)@Ks_t14a@a#OE)Xg$~f2aci)%7#fPWuR*>_#VpdjC6~%dWqXc@`u_ z?x7AZjMme#iyPD<|dSp36a@qVw zwV^PkXPH6s$rci0At%b?jMA2%2OS)Kvg>o@yw%(2^NZcS6Z;P#aQ7ppmfBXs88zU? z^*n~3KsL&v;9A!{hZw|K-F!4s_=VXNE!cQLzLf9bF$y+KRexW<3ML{2laBg@6O)Ph z;N!*({3bwRvH_V2<$xh549BQu9Wev6<5v*p$U&g|CLSX`zqSyELVh8ROC<4h*adiV;n0UKA)YH)V1#lWc8Y`WSV)D_|P(XkdMptz6;vm z%lOgwS!vf4&x(!^Q$IH;=+GHKqCLEBWH(jGU6FKlU8i4HI4o)J`h2!fdxKYMy}#vi z>0J#mLHP5L2c|3Ee#58^{C6U7fO@ACLLdJ7+T0yukPQnjPQ3*SuPweloYWCzIrekx zpDs8lIhCHihr9*fg4PE$>kj5EV*c^pi@AO%*|nY`+GD1jB$uQH9|pOb%p;yq zKo8vb!7sO4gARh|E|Pgwr-DbR?vB?>bw^{}Mpr8QD}?_2Fna7$ck8S8GC|RYj~4Ww$x&4$*MY{2DdAm8xth0O+iPz*F3`_A=eKM`eP%DL{fu*Ho#0W2GKTl`2C{ zm3nOXboR%0qd4Q^FgXbf!_5x?3+Ucen_p&fyY6ve3!vg&mHNT7cS# z?W*N2+f}DWLLGN$X6*90!Nkd1KPQ>$&j~B#3%WuNiV zzC5={P(U?dN+-xE2W6~(eE0#vZJqj^&IM+-Ji~W;`nj^*J0vZjAF`)3P`?N?&a?vP zGzRSh^-Dl2ey7l7pmQC%9CSYWhy(Q-Kxde5Bj{H1Z33NX+GfzbrX2>IYuXXe$Ah*J zuj2HMfIel~xO-UtFl{{OEax!=G{>~5pvO6m!O=0$+e}*m%9(E;Xo2(C4|x%DCcY_OLK}E9z5xPy*3uu|Ovz0<0=my}7ks(4<~q|Bffg7o2K_2x z{1fGf7@%L9*8G*)n%hll0S#KxDWJbGZ7S%Vs8x_Y0?5TKpx;K^duwaH8*xFuGi?!Q zU+{sRGp!Hw@20HDZZJ4$gbh&GK8R+e%EeD+y>4E+#(gQv1xGVpK7D)fW z{i&cw&9@4)+O*Z6(r$Xt~=35VXm-+U9zHi!I(0fd)fOOFxH>-l) zXWC)Vx1HV*&|OZi=IfN)e088#SXa%U@0za#bfNhcf%ciU7&K_wvVWz;<1Uz%fx4W> z7SI`{Z3TVAv~8d>P1_E7)OqXyJFJf<4ijQ`lM+!_w$_udhmhzI?#tgKG0ax zT0pP2ER#TIm^K;oJ-5p#pfgRI3i^!sW`gpj%>uo{^|loBQqzi{ADeF#sMWO9pf{Pe z1@v;$wt`-5%U-q}`?Ji;LEj4-0=>nw9?-j8zw1C(o3O2O3!wwh0@DtG z=DIB$2EEz&9sylzS!y1@p3PSW%7;6ZEvT zwhI&%wj1!vLLecI(%2zr;}7C@gdZ3*aorY+k+>v7!WpoblI8|X>Xwu3IP zUMiq{rX2zenC~#?+fMHYsLSb%dk{ZqzVV<(Lq5=x=9>z-*?iML;j=qH?bg+F(9>>> zGeDP`HWL(HbT%kzW*+FZ4qX7c+A$V_E-`HpC{kGry4bV=C{kGpidI$xUF6VZpop;? zbfIZ0K@npU=p5&<1r!#x74$OmZ39JX+zx6rZ3iek^-j>artJbf=2Z58!oTbVo#W7b zpy+Y-gYu>w0Nv$2v;qo`c?fidLl1+-GNKu%KMD#zc?{I#(3*$H!y2yxoo-qKDB5Ks z=v331L07w18wZLWVmzqcp%Xx1lM_L;rcDA}?{Z85jde{=1s!)=od$|Nr33WercDQZ z*KKA7=u_uO=9!?-+APq2nQu1ePPeFepyy0m0E!m15cE6K7J;JVi$Rw#ilhGp^;=g< zK)*KMQc$$+BIsA9Ed#~)WjW|s(^i7Cfy)<*K;a`+g9aVi2TFQV&@W6|2Z|W$L8n@R z4WNj-5%g2@Z34x}ax>`1rfmW3wZ^xB<```UJ>$?FplG!_K~I~u3$)hq?FQwY+a6F@ z@m|nV=GzBqHQ#>Ff4TM#fI@!4|q828C9yV0pf}pWW`iQ`JkZz7w*VAz7lOWO+9Ht7ieovTu-GM_dmXwI z6y+#_zGB)k&}VF&D?vZ7^gW<2Idl~$M%=4G|7cnt=q1i$9Vo`E>p}N8bOR{-%SKSY zX`4Wi$7Y4PL|Z`ft(UE!&zWxWrv<6V#F`7Ylx?gAkz0slLK#$vA#)GajZ2~BK$wW}MrJ4i^9ZUwj z-h5L)E!Ox{(5uWh4HV_=0Ck#gIw<`34A5n!%>;$6W`WvFn+>|&sVo2`HUzrFp^HG_ z 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

    d&C~aq0A_h`B*9w+#{*XaetXLRHgxKii)N` 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 literal 0 HcmV?d00001 diff --git a/bin/l2c/l2c2.exe b/bin/l2c/l2c2.exe new file mode 100644 index 0000000000000000000000000000000000000000..822d1d226e39354e2615cba5f6fa2d45e99cb0fe GIT binary patch literal 114748 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 C +croscompiler part1 and part2. Written by Marek Wojtylak, Silesian University. + +They do not cover the whole Loglan (processes are not implemented). + +If I remember correctly one should use it as follows + + 1. compile your loglan source file using "loglan" + 2. crosscompile using "l2c1" and then "l2c2" on .lcd file + 3. compile using your C compiler + (It was verified with Turbo C) + + + ENJOY! + + +Please report your problems. +No guarantee however. diff --git a/bin/readme b/bin/readme new file mode 100644 index 0000000..3e4a312 --- /dev/null +++ b/bin/readme @@ -0,0 +1,19 @@ +What you should know? + +You need to install + +1. LOGLAN.EXE - the compiler of Loglan'82 programs. +2. GEN.EXE or HGEN.EXE depending of the size of + your Loglan programs +3. a version of INT.EXE + depending on the size of your programs + the name should contain H for huge + basically you can choose between + egaint (egahint) or hgcint (hgchint) for Hercules card + Choose egaint if you have EGA or VGA card. + +Enclosed you will find versions for CGA card - if you are unlucky. + +Choose carefully. + + ENJOY! \ No newline at end of file diff --git a/bin/unix/linux/loglan b/bin/unix/linux/loglan new file mode 100644 index 0000000000000000000000000000000000000000..6e806b66516082e6874f6223e34d78f27cc37fbf GIT binary patch literal 200704 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

    3)gkSV#ufOT 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

    ~sC>fie&)L2X=Zrd`w?a(W&HwZ<_JD~4a zZxkUDX#~$bvmhH{-_Ceow-2G7Odmn&4ZCMGrI$9X?GRHj(MLRtLooCqy z^o;#{6#9wdR=kt_64zEGG|hU|P{gf)&bF)$iq%a$^qAu|La|z!3Y}%WCWy^V}TRexgD>AN4}|)FSOF(^~`m(R%&R6t|(Z z&`tK~Iw)2s>!IhYw?Q)NZGvL&e>3zuhi-x58r3#voy)r&`i(;ep~zzw6#aKMbkLzg zP@L!Ofqvui?uBA4un+pB_4Y$i9|xeHTULT%raKJ9NH_wW>2`G#db883cvsqnDxn`b zZZ#AufEwrrmeoOVHqi*hF3D8rdk$@a;ws*B=)0E9fTDHIg2F>BP|W*tp<8T08x*}~ z9`uakwnI_V9Z-w{3!yVyTZ^FB!B`9}aLp`%k{u=JYfdEx#kp=L6ulx3J?YTpP|PIV z(7#!>5{j#gz0j8}TMfne!W!suThI?hPgx5+VZC+G24AmO4}HP14N&B<5qjLRO;Gq{ zGxVU>Ia{FUja#9oU7~GJ^rP+2=N)$t3SaGj{>idkP_oMeea^BW=wqG(_CUv?unA6VW-y*MNeJ}-DTN2D0y1Fs!YXb_ui{lgH#+5NDEwRlJ>nR3P_&JD z=#RFv5jxdvd@6Lk<2FG!66c9(t{18=xEQ zzm3p09Cs5GaW_M+w%!&f;%|W5jmoS;rmB^mafOS#K8<*G+dr-?iQl1TbUo zfqv^!?uBBm*atmgAMA%>J$?W>-|3a0SeYM!US`>0C|2f2pz|ynfufF%LO*f774N3) zI=4z_n)Rxo`&_>@(Ak#NL6Jv2^kT~zp~zz@be3gJ(EW}(9XjYdWth z&neB&X^z_hMSGbG)mqjDJ#72tL6^Gkw?j8rHXl00dL2;G{-6cX{-Ee(i=h*(w*=ZB z?GLK5EChsX=Z1Zv`?CXY(`MT~(C{_=>(64RPYG|+9&>HBE*6WA9 zY1vxnM3;OW)Z{wf0L5x)BlJs`auXD@+Ggm!m`$M=ueL%Tw^iGqSPKk7VapC^wnKM8 zah+*5bkMd8L6PzvXxOs7P>h)SpcmV|{ZQ|M8IrmE z&4kYPuIVg@+kog>&Cs*fYk^`nYA*C;d%O*b73e(Z8SAw}yIpVdp>J5$0fl{wplEeV zpvBf(3VqFbIVi@1WzchOlbuj9u0c;)Z#fh`?S}r%vXxMrL-aylwrn*NGtL_5a{Hwp zifec4plCzup=qxD4bZ8stxZte1+oP?%jMk)J?fOVDbya?4t?ITK?wKZwH?sKjLD6ETL+`cT3@COH zXF{K}-Yh8gk(!}e+uQ<0dFMj+Tdxg@vdx1owGY~%xY{=#Dp;=rihaz5P@iRsq-UQl zhVHU0OQ5*7Y$>$LdO0Xs;xgz?>vclWn)1-S)>{rmE9r*rv1}z2<>-a(wrn*N?WG@z zJ2cipcR6$&6eG=gsL#1=fEw)GjZj?i+yupSy3Np?j=Kel^~+Z1e#hMg#Wj}g(CyY6 zgd)8i(EBXg1;wt_5EQe}9_TiQ?u8=d{m|(?|2+WR;?NQl*If=n|Lj(L1iIOwBT$?V z9))hQtm3xRFO|@ZmQ_PhzctYBT$goFwC8&02J1CKG1Ez&1T@@DZHAt;UJDd)=R)7ItPMKPaoeGYF(3Md zLpz`;9%&XrPg}MKiYrcwp`Dg3fg+Wq&?UAY2Ss|zps!l56N>YwJoKbx%b`fG8~QiP zRzlGZdZAZ4z12{pw+8x>_4=VG(OT#U%ho|*%X;Vv$K3!$+>OxV*4qR{+|AHqmTiF| z?pEkB$K3|$=IotS+o8`}ZxD)d?128svRzP=V>k3U%Z8vxZx3|6)7uM0di$WyT5mrT zem(#_Vp$1_^bSD-mL1MyN1&UW-Ut-;LL7x|wya_+dAL?9p@$u}8j3t>poc80gCdW5 z=+l-pLgD+V&|95e6BIU2haRxr3@H3J6Z)iOv!Djgt1VEB7IUHd9oh!{z-Q(2p!+Oq zhhp6AfMUJ25bAU2A}G##7DIn)*%IiRo+Xz;7udcWw9ff1gLKqa_A-~&XYGo_u9TKP~6k8 z75aenwn1UvcIbA?2BEl1bQcsmMZ2N*I&=t1S`&1;Q{D?DtqHo-di$ZXJhGOc*mpbx zz00A8q1Zndfxd1}9))glXvO1ci7KHREvts&46O!wyJdAy?ASCyQ6E#G>mAwzeaz#= zbm&^kWm$IsmzD2w5$U<)v|@q6_zc6 zu5yc53_W3AErAx7nPr{O+pU*}F12hqbffd=hTdS=N+|N}g<36J z4K;bRSOa~{`SwGxURw*zvEDi;)=lf7*IKp#TH-u5LbEN~1VtX3p;ueB1-j4P-3oon zd2EBOcAMM|z0!JvP+W=I0bOL-E-2F54P9v25EN^vy-=*j_dyppbUzeVRS!VtTULV3 zb#8~CmsxfgihH+?K<8OD0>wGWQRrODD*jKp3aW(qY<)G<=#tkc)OvMLoa@#@FSe`^ z+U=50h0e0935p&%9cr*_29&G>q3=15Sx~GunxWII*8;^TFc+$|tPP5C%!8&_)((Z& z=0m4g){)5;LO*jJi=Y_w7DFdmZwd5(ZC(mhS(bxhmv|X8*|JV3e3geLS+*RS8m&$; zpC7G+V%+G3{^UFCS3_}*y$1TDW&Kd3w-)+CJRt+c>T5mpoNe9!#nUhwq2F6?6BOqz zo1x!XwgrmS@K)%zmTiL~-|f(EEE|NvS396zTeb^|zP}s#u=5>)VqbX=G;F=SP>lEc zpkG?HABuUQ1jTOcA?RlgJq(>=?;e4EV%Z23E#fHjW6LVOz`2n7bS3md%c`MBxeiM9 zfuZj^v=NGwr$XPetO<&1uG69KS~dd;U(JG|Pd7u)IbO`EjDuq6jv1Mp+U!OguZ0GsZfXeTNCsx%ceusPI(42$E|55)MVK#=vvE~ zp*qKCf#O-WxzHc1*9OJxG7sA3eA}V#I_`X^-}ZGtXL$x&2sJwHBIuPdt4Yssmq4$z zY$>$JvK(}YWy_!?j@t>n-LgEi&a&mu!GK^I%L9cr{s2cb(W z+W`&QSG%CgEZYsuvfdDMgJpZ58Mb9F^sr_7pk2;mKlF%Y2cS;tm7qs0I|Q{jy~EIB zmK}liT5kmUl4VDsl5MGYf-@V-Dxo&Vt%km3Sq*fB+f^O(UCZjBcI!1lKeKEqblB-N zK^MADPls08<{8i{Et?6&+50SLj%Cfza@*GeU1r%_DCf9s&{dYrgYL4d9g215e5l>_ zbwCeTZy_{dTNXi&Shg5i?L3x1k6N}A;$b-YTMl~6vSm=od2~Wwwk!`Vvfgs&tCn>` zyPU^LD0YN#sVO=&mOVZ9+Jt_JOasw~?J#g&?U zP|k7pLvdB+0Mukz35qKrhoB{v9fslx#}TN~>5V{fMdB#*0m~}Bm|iWYgl5=()lls2 z*FYy(RtLpSd3`2pgyOl+sZgEMYl312d^+?$md$`-*Lfy%f@QOy*g0;7Ml5TAVn=u` zG|S~^gW@^ddC-3AwL`H(Iv*OctOJVY?iNCyiuMP^p5D3ptysD|`+N-Zv)O6YH@9Vs6*)4a>Y`X52JMO&g_V+iv z>Mt*@XnM=d@9(<#j=P#Jo;9=S;yH6(UC}h-vR7Pod*@wu+;(d&-_&%)`|r%(mhZ~n z(scW~Ie7Q&cf9ZB{B7^Lb7n=;weP>}gGwrYm%^^U`Hnkp{!kWu*)8uTcGLVT7G654 zcuUjLTbep-hHRlPccx^4!W5lXz>F z1jRE_`htQ^%Y8Nr`UpY1T{QGQtzP{WKF?FTwe_kxcL=$Da}LZy-MJ zAzjJ%>4w`3-Da9~Qu1lo9hF7#Q!9U2U0u<1tV#zxt@?e_ik}xw-C1??T)GEw=1dXY za}M8`5PY=qC9D7D$0t_v`T-qA=!%~eUNo?ugjNl9y`JZ1A^p9lCU?#~X^9_EnI`29 z;fLIQ;)kWRn9Zw5i0~#N^z4{gn4*J7BeGX&_iW|;2ZEK`ly_6t>BpSQoGB8nIB;;S zzS}D6^;fQ$e^W%6nQslaB+n=5qa>f7RM4>1c^Zo}3<}~Pc z#ZL=U6z$T!Dbx8^RAK`&_zCe9eN(1#F!s&e&cBApuZ;Ymu%sTMkUa9<$L+U82o~R$8-gAh8{*F0pPJ_fNep*yc1KTNXu}(B7QceRqpwf@) zl-P_X(-+H(CYz<321dF)tx|c@il5L_h$RzvaRtN(3>|`G#?Gq45bI~?NJb+NYf)rJ z$vom_Ii}@MLG>5;-Rt}`r|Uf%yNISgo*&O>{#R1jP$pZP$rfg`EThhh@)<49s5_&j z8CARnUy%*Zc9Vy?3^jo4GE+5lx~T?=v$#5lX$QS}Xo0B_iYt9np=&K`f>=hOHyxrj zplUq)X44F0*O_KQ*PCWRaZb?;U2a(mbhT+N6fSOqZm?_~6lc8c&|g_LA9}s11L`m> zgx+pi1jTij#n58QmOyVXErsGNI0xNm*)k}aKqth4nR4Wzn@r20Hd8kgEqEoQfpTY6 zFBGf0)zGi(=QYq99oi3FYFZ1;Gp&PeHm!%=Y1#n2%d`=SJ(W$+EtYMD=9{)a8n1X8 z3shs;21R4t4!zs5K`5>X?SO8zY!}pO+6}$MGz8^LBhav|-vh%4I%5(&JwW*)h-ey_@^_o^gCz#e|R5O^$vaXwr6=_)cSaFiZ3aP5vnXl7+E?o@) z<+?AE?mPmbGS)--+gY_Cqm59wXA=|+Z8H>&ehZ|0sN9UULDA5*Ls8*_S?CTZI;w1x z^TyezWG zn1wFNXmLhMps-*m6m2R8Mf+Kn$vQK=d?s6-QFlfwp|GGA3JX?ep=&bg&uA?a7OaE9 z2kW6|)f+Osjald>D2DRQP{iGm>1~C=f^AS(ussVM%xFhOyP!yAHx&JE2#TR{Po}pw z)7zKn?a$~yMkOdLI0S_ShqKTl8I5Fg6bcI}wx3OEOvt zg#|e%Mwn$#w8YLVG@peo&!{`2l^OLyVZmxBELf9;_Gh#Pyx zDWlC9ZOLeBM%$pUU^^5R3}&G_GTN0W0}nDZX>vGLCBeO|`n{iHtsP55 zOsXDfzatjQ;wh{=-ufh7)0b0or2O#n;%Vhq9`7HLcsb%le#@YkvO1yYw0S71ZFv^j z4aH!#GNWE7sTe3$nQNd(xj)leo6$Nb)(Y#P7?d|a5o2RUo1m~@b0*sYMFnonXd9GN z3=|d&LXqB%Om9~v+YKf68)dRRQ21bPCff(a1hyZFrh5Pi3rZOsg2IBsP*`vT3JXRu zy`vdb{A+4KB@}wqP*_j{MT4z_!Uy$Gbl*lOESQ>66BHIqhr)sxP^3IF)0>r1GZa2( z$@JzzF{!mdF-XmW!h-fJbUqZrRYyh(p|D^P6c#Lo!h$7G*t|5O926ET%k(;-@IgM4 zEr-H_ZYYNFl~APDo6%}0ELa1D1^rN1ur||Mm(hACEZC6gZG^%Ho1pN)W+*J!l7()C z!Ux+j+75*UgHTwo0}2avL1FXmjE11FU{9vE7YZNjgTjLSP*`vv3oSvB-l2>RLt()Y zC@dI(!h)ljUd6wqaVw#)pc)Fj8YnENgQ6wYL(%sev(TwfSkRQwbSNyC0fhxKp-6dF zrq`TN3ltX2&Gg!!uwY&$Ylp%I^Rv(nC@ff*(IO};SPX>)OQ5h|X{MLUXc-h1XawzH zd`!pPrAaR?A3rxGNc1Z(iDTduLu-k{31IcI*3ZzvGsr z6>JmUd1upG-+xPN4<_GHSilK3nd`4?f2nrOMVQ^ws=Y7vn3^~!G-zv!k2`Q;RFs@I zqV`!f=PR}M|C#uOYmb)ibakDR?1@=v#ew1fKt~&s$sZp!BjZW=*M=j^t+c7j>cRnef>ooz7R+p@B0W;3O;EKr7wS$ zdPnZCwp;(3FJKQ$CDkPA4&M8#!>0W1fSLKPuHu!*pOCwcm&l_^M0+-6iRjRY2rkUe z?r9ZVl%L5S?O%K{-SK?vPx@Me40-yf_BQK=UqMD`b?{zm+45H_PVA`??2qGl`PT-_ z&tDzz*8D923-a9o3;Dzn<&J~)u8$7?57!7tFRVE+cZ56-uJFI%hfs_xN5e-H{*Ijg ztthi6jek_(uh044J0=LP_%q?>vsQ4g0w z`nHL$P;fqb%=@ow?XG0_?K-vmY*+6c*XHbr_neT3eg6CWJ@s6*N^7g$tzs->FPSd{ zzAhSV=}fh)2JOBUWiRc2K3wpAY|oR=^-a+(Ej^N7wdJCAaqY3ucL}3U35{?f*TfebZ{x;jc>d3Z8tPsI&a?P^D6L1u1;mI z;ivSb|Dg)b%$>wt8Xi4!v)9*n3`e+@Je$S!G>lknsQRLXyTMW%0eVhy72xuu3^GFVg z>xIjpc&@4w!lmftp%$nxTb0EZX!~ZXD*XoQWLsXl=Eq!@xv45yqdYV7Qd-4KGz$%z zCeZ@o-OptTr$}Lz6*f<(@T)cynys*9LWQTL&@x`3hs#N$W;`OD?f9wCuyuSQO|r8W zg`U9^2j)7RZKFCxNho2CfBK7BldyDn9^d+%uA=(zCmd$EI?-1qiMBb>?PZBdLZS=# zry7q$B`iIpL}w^bAFj#r@ZsI%dDy|*blsf#v@{a_tzIygZ@w{! zyW|DDS!h^28aL}Jjy^ewzUc*{uNjSAX7Ykbk%{6??73@_xP#-(pSb_>J)uz(#yaA}B&9vJqD-x<`;YfZ>aDV>9DH3kVxyBe zo)zmyttgAzo5bDhxX0@?8zzj~p2Xezf9r^iqse5B&^%K5^Be~AeKtYem%7l9$D9=h z8VbYaW@!&ed%v~S=@M=JNsoVd$5n^oK;ufpbxvy)_kiP$$tlqu%}G;H>D|&USzB#A z$!Vy%kjXxJSQMpJbD_0m3UZS~qDMHUI;wLQuGq6O_E)=m`U7b2CFw5)Jn zkot(#)v&X~)zOkjne9&hBZ_d;5!8#a2uVSd3tv2n5P7vMuPYU``T0?kj7N*@QEr;F zTdY0CNoqQYWrZnfzkN0FwVbH9Lc``z=vJ|7R;|oza6{PnT2h_+{8XLL7$+4PlAP2W zG9S1`{zi!`bRuOwNQ^2g@Lx%<&3b#nsA!`T*W65L&l{gAAGMCC&#OO|=egGqsojyv zyp)*2KUD$$o?nK4RmAzv&#lb1!tDKoYXRGJG`CQGoJ$MONh7BrBbH+Fh(48^Yf=CmN!rdV^v#cGOJ^N$;=U9l!l9BbimV|6IjGhAs`b-F-{ zC(u=aatBn%Mbdv5{laXGG*O}?=1ggAmDa4x6&e5*C1g);I@7tfh)| zak*{P(jAwBZIdmzWzwHiuAiSE?a{JyO8;5z=E%z4eLQ`QHM!-|FP7`~N?$`%PLu9v z<>wAbwo>{ZDA!*j{o~rdTKbok>#u!5{eJ16R<6JP1@+fS|0mq5kd=4i3+iu>zV6S; z^f$kt{wC?)Tdu$L1@*T`{~Gkmdq>iiwkzhiRuR2pn_`_^p3AHWbeknpU(F3l{~&vp z6XddMf|!xZ4#j$$SXtSJCeR(tWw-QKO`OZ#31UVrdlc)fj`h5Lv44VCGmtIF?Nh85 zm)lm7ZvF9o4oH8P-Pf!vhbK@~+Bx^5L(+euTz_N&eU%`0L>@jO{XX;yv!7RrieqSv ztH&tCQN>zNo=dfK$CY9ysZ-1yvc>(-MTuN$6zkXQaA#$2oIrQF z%A!Hmp6_pH2a(jQj?F0W>~++68DgMK=*P4*m>^uqQD;)Y-6Dc%F+`E*R6>wMaj&wT0M zQm(&9`s4gsqk3qO{zB=`F4tc&fqt{}=SqLE^sCDCa}(%~wx*@h|1Nu1nV&i*(6{{y zmHsm6KT@v0d;j@Fvw|lQRm(RyOi`)6+$I1wf<$Cf(#)Zb4sVB z1xps~o{TxEnfR3Mzb|4P(@7fHLh1SI-DCm8KQ9XF%NB(zW$3>sjqd+1X~>Z-N}Y;w zhvKjN{}LZlv@qpgZ~R*w|JLv?TiN$>5V=|{3|Q(gn32s zYAL0Eno07DkCS|%LDfVOqf2_*v|N!^A16|x&OcdGn6f2IJFZQI290W{%L|!@T|;%s zXN~fivLsS*E!X(0hHorKJTG>~ls(GlB%ZmDB>KlEk)5lQEw9JAFOuk0JNc-RSgRz` zMfv|_Tcb>6^_)|m$gLs8@k4@#T2JJwmETLbxZSg(CG^)$pg-CL`=$S1+z=qYIsNr7 zsJ~A7Un$q$IDx*01lzMg`kyG*-~595o238Fa{a9@sJ}(}uPWEyK7szIf3`{ggmV2I zFQ`8#{cm&2M&_U0FQ~su`hQ=pzvl(@hopZ;x&FQh^gZNv(tvV%rT@lq{R0!|tKsI< zW^?K~T=zo1{3t*Jgv`m(r3j}v!6Zbb3^x;&rC z3d|jCm?lp}Zby2Ww)7U~qvM{Z(ka+&wnlNsP2VvES1aD><@wZ0cU(TBhjr5bDL3n6 zWtjSc`i;{67xc$34Q$tR#huWuCdK>fL(EmhnJYio((?dBS8md`TjPT+$$oytjH&)H}C z`3ch28X&i_iG(_(zpPxpTl%h_(Z#xE&YULA+;Zv9E!Xdr{y2MFZcToFccovfmpX{gV6#DGcn$7G~R|>eYwu(MFTH3a)6U0>=F34?By!qw% zY@a}Pbk^M_{i)^pJEX6g$TiDtE`sVICp&V3Q0Wj?`?7NHR@ia%cS(PHx&9vMk2=QG ztoGX8M8MGhL)^Q7M^#<@!xNH$fQf@b6cy~qMe%}Sy%8mr5C#$rNlb!ZtAdJnv{X@N zDpm;KBrW3*P3w)eSQ*E*_TS5^)wXzP4Z2BKdy5we~*e z%w(|k`M&@2&GXF6zO23WT5GSp_S%=T58>AZ;a@ER?_2v_gugfl|8^00zuk5d{-hxM zJ4N6Fqa5M)VYk`icW)7RpZ-0B=j|^Z{JtXaKK_2fZ!qxEeAv zcSN=`ind_~wr^H?hch0G+Pl;9xqV0H)7ineMV5VG}JBW(R9=c;>-9%P+%q zO;d*S6MwN{JRsqQ{9@G0e^(WcQn=3_?U6^@`0vW_ScSXZFY^=__!#8ztcH7;Uu^ov zsEVgL+$nw;ZYKXb@_7Ek{pUE3C9^?D^Y>BGyBPWIGk!51J@|K3jTOD{%fx+29I%z5 zEc0o<%yPes98AeZl~DiO&u^e%r}lPVx%V@d4tfTAJ|1Aki`x?w=}SgRm5$5?uYt&B zWJAY5v|E&#U7cb^;!>6M{$-n5_Sj6@7M3yae; zI(^BQbYf!q%;d8pQfHK-Sn`}uyjJOxdHQqUKiM13Rv<4ucWn9);9Wo>4@ZD4A!Kvm z0aMWu+;<@FuU7;#vTjNc3{eDC+W~@tM1PnE&5Vn=wO=e}IdTumbf@G=# z#YPaB6we(g=^PhL+mZ0Rj+vfYet~=cQIO3@(k<0|lt6Hv$v$81zcF5!m*xSZL^&AR*<1MUNcvBZo?$3m#YEKAj>33a8A-{_VNBJza+0oU#4j?r zsNx@p^PaNy4-+B;`PdUA6uWn#Bv~fw6lH3uS&f{_5+dC%!HLSAE_5&lysRStQ_K%d z^W+k+axp=tl0G;qGJrDT{x3`VcorEm+NMe}G4Ed2tWa>DT zx%=P`WM?3kyKCaMiO~P|NC6>8z7?N(VU~RHs+cy%Xf+*XaxCbT+pS>W~u^lA)13 zKTl$8EuTJLCVprJ={q@(zCim{S}xgI#Sr;TJd23_2sg@Sv{14>>EB0%d0Zy9P7PFh z&zL;nib8sYb-pRWt!JIr=hgX2^MN`y9RBe*Z(*G`6|b{chnh|yeQeGTD?-KTG#tXd&v`qkco$=K z5zc)oypryZN$|&}qUW%|vM4711*GD$#i{VSwJ(3(vz0G@(QL2Z7fwYkCjNs8@K4q5 zaKJ)~Sm?K~^S)^QO^L-U@nBvFs*!KzR#)Z8L#p;<8|W1d5q-uYD$*gmLhdAT_0bKY zXO{K6GF`AsD$6N3Mi)HYkElh6$VXvZAB~}LfmqyEgkAv|64t|Ej?5tzZ<>u|f zz$u-t6!yFwx`iQ{P7w4o)W);)?y0anfb%??%r4YmjDLo;AxwjpsRu%Y=|5zM9N~g7 zKRwL&3mhFO(Da$s+qny+TEyFVm*%8 z;_?ox3)fE`f+lH4R!V_WyTto078|<>^v9I6!|YI}1}AKK^nRxXdt;oGyj%0MbVAy)8Tq zY5Z&pPxnGIOh{)J7lSM9%UqmtYe8tX5fIrH{A>%?8(?=gut37e8Yv#1=&phix+h?) zut|rwyp^@D&v)tC+%Ld6$gqm+M9`b#GcSI2kC1F1f*|zBTs(Xo=w5oM>9Ug#inBy!hLFaxJ{YXn?C~~8!Qm1jQL7Y5Hvd>IgwEyC90|!W` zIG{DdFyZmX4_sk{k~RD-?|3th1;V7Y$EKoMi-O8Fxbjjn;z@l5uo=477mi9g1}QA8?Vo6$M19oLz~f`79D7X_*4@dZN=634 zRG8$}G3hFn%1D{AyGdV0MI_xXdlxdP%KJgFvc?p5^TD8#aKc(*Wq^fy$hDxTB4{29 zQuc^K79RSc&w>>E4_VO4#j`zvm5VUOkuBH->A2eJ6*8NINZ5gm-laz0$N5meD&$y{}qMdKq7C0~6zdolzweF>y0Zp4|*Pk_8! zrAMA>jgeO&d1&U0u>{0oEnL@K`}k0kdG5;!4gFOVF1wyQRmyK!w{W%rDW)3?B+$*e zMSM)PHb%l#7o!r0hpY#T!nU$*%LASz5mdr+C~;_p77=Yq`vt3oX?a$1BlDWdJ!_lVBV*{8FQp){@+#_zx?x`~V@r^~uY zNu)C)LQsX>gd8hz6YimKXsfFQ!-_R~`-_+xmYZi7^|q-GlA1BsWbrLx4x3^8O$ zLP|!43~9&~A~NkED#1L+NSZ0}dx5u2#jT$aO*KsEJDZ8&1DhGHn z)#AQ$DiC>TT5ITB)>>YtrB*$kzC^s9rPp1xG<4I6mxtn4es0-yH}Dot5q+WDgW~bz z?@V|RH$q|`6ZECFIFk`;bKghhY>JU+io=|fkmg=|mb63-a-=0Z`LwyIa{@f$U_UsL zxeWOk2s7%nk>7}DAKs11-b{u=@k)>Ncc-FuJn`xSBNTww#vr_kB}dYW!OPvQ*M!oT z_YCo{f0n!zLJR&jb6M*pBhy|xq)S__DQR^NW1&(b?`Xp*&3dO~^xDMdF2C}I=p@zY zAio4}ZR%M_6y^6^}(U*)#gK3wbwS}mchxvbUQhcal0>eBdd zap4}MS=C3UgVj+!h4_vhgb$p2uK-{B$HzA=4__PQa;d?#%TPDe$2RHAlh0i2tDMru zX*G8?!0lLKE49s^s1WX+-H$oe*0S`_7U%JuCCInZa95mS`VZS~($v#WK7F~5T=heq zGxqQwRSf?UAAi+v^6-xh;#YjqI9LVXh)W$!&n&B+S$g*QoM{YQGCN`$1U{t@v_YljZ*fJQ&(R%`?rA2fX_L zl9F3Tr(^xq0v@m27VD>O&Ub%@tnMq{Il#Ju>5hk{>|Mkj^V&Yh$9%lSeFQ`YNfoes zeLE1jzeQ1p)uk9bmynT|m95Oy9hTGu{_uy*!B8-Zm$Q>&wLw$5I z>%#6iyJ_}x9Bpym`zAbRCMSFQVZf99WuI?O)-Yj6d^WBa0V=o$i#fmw)N~nmOA?WE z|Hc-14_wF|ysY=ChnL6|tn+p2b*V^2d0EjN-e(BTruUU(m2F4~@ z-J20}7;*3XU_Ty!Bgy=6+wVv89U=AaLTbrPqa~;BM?vxTIPb8&dp7SM=*uv}*~9n} zt!&LXZ$ci45zbyFULd3zO%H{lwZDA+`5KE%+X?gait!L6KDhAIgpxIK`D(m5v)~y> zhS!TEYj~II>`3PyaX2xvh{;UY7Pi;4=KhKETNby_)jtFzd<&Nc4TSgLWycUjhX2*! ze*CTqyRQ(_hDxS1mX>1GDkbD2!}uJ(>R5l-AmzYElbukqUPZp2W#M< z_`$hp=yAy!=6@>wr40Xpf;XXL`w^~B_J<>1;(TymV%P4MOAML6Mpmddzdba{B5P<(e9u#V$aMdD78(6PMAlIoSwFag4lZoS` zBA8?1IX5u|7xjYXQvupH-_pYWe0qpGF{|$kAEJPsiwQ6Ru0Ls+n5ak!38n5_5Mdfb zDjKE{6C8E)) z?x-`AyAmcB>uEq+9p+W5t0rVvd3AUlBTJlpL$LgI41oflfiMf;D4o^OKV@XmCq0g3 z?HPc5XThhG5q2%I(^bralgeZ`7dh_f7@W9p6?vp*AWSHQ%~1VKfgEmWve3|nBJ}dk z=2f$uGSHN}J_w9DlwQTkDG@+1jPSPEQc(m{!n7RUKS7cXKo6DEfO67z0-!}$n5VJ$ zbjq`eD17-RYsADPDl@$2Sz5DiOiyMJsFa9Pj*z=TP63zUq7eY`6KJ5VXhx@kP!}px zvWAyOmn4S1KaRKdq{s2z=;I}9Ym2-hm|h;Y8d-e@^<);~Kg)>T1Qc2^SML$Z5Ceu% z+=dO_*Z|3u`$8Qzy&T@L3+niCm}PeTToK{gcK~JhQyts4@(+DYruljV&HKCLuB5@( zj(<74lh}Ix4ZhcQsobD!p$sd|l5AfTxRe}mezt{4w}yO?+559|Uj`$VH2GJ&*w95u z_Ml@WM3XOl;Icw^u?SgW&c&FwEo^ZQNXW{0zLhfxT~osX&p-cs#j1l6qtwI=>p)+m z2CyDm>KM_5?y}V-y{dj%(<=ZmRIB)RRTAy*MMGa6$8hc^3ZwK<2DxuCMdTkuC|S38 z2vu^Vp>H{>$TXs8wgo?Z4&%;9=vQCieNLejxQ~iDe^Pv=TIPwsur18O{P?ZljHZ76 zSWf$v^;Pvq&lPRZa)kakR+e|M*?ppA@Lh)QYJ7X} z-H7jd_&$tpFTTITcQ?K>{!kKX!FM&j8}WS@-(Gxo<4eBn$LA?`47yvO|6?Nq+){Ev zf8SIoqV|FI)z43lqdhUU`1oCZ+rly^eqzaO#xL+whAf|Z#E)YWB$UheaX1wr)n$d} zj!bTipU+mvUGK-)Z*rG0?u=o39E$~i_zYT@%AcFXOnj0x;_f7l(>!D;dt#Du*HQ#| zAKaq^dWk|cZxLdCQFVlXI+S}0KPahr+;7Oez?5S0!iC(^tR7Jscn~0z%LdCMj9NI7 z31>GM;ywH@hoQbW3C&QIv&7Q3m~pKiE)~izMJgtU1AXT)M?XP(z*78VLb%{O%iH~> zH)VOdzpvprzB zL}7zv=oTn10!3bO%|29sS1(^JBPEgJzIA|l(C5j<{W7#N$M*~c0sMT2X3BjYswzb0 z;8X(A&-Z1Ud)jZ$^f;1{-116FuHsAWf*?)*7YXh8Bl9vg72~- zFg-|n7~dWE=Fz_g0t(o_4CA>pWT8+R|9XDB?_>`}hF92&y!EXR)TrDW9(Ye-zV!5` z51cPO=l%odOMh5(;C%MfzRNxG2GvhX(l;}ZFIqs|?>mX9!T!P2*?{+ZIZorDwV38@ ztW1T|?xQp7LcD*icf49pyh#9)8?<03w-G-9SOy2edy(tN&sdtS>|ZcNjv^#C0lMY) zayF0KtrAsukIbq6QxfVM6-0r=(~#&$*`NF`fh(MeD1J>z_ay^u?s}BJrld{t??t{d zSu)$)4#7Op%lv{V%n6Be5=n7LibSU}dfz>mRWk~DlKt4Um;nor>>m>8ybs(B2*c?! z$hJKL!RcI!;u;HF#WDqR9Wdi;ElR@2WFf5~erU3WiESMZq^dZ5>^rzeaWtjQV0@79 zmXJYTc)z&Y3U7=RUj8alPfwowZhA-LmmzL=w&a!VmadcpuSKgXN!6-jl;qo#sC;xvTlV@sd`@9~^d<~gt;dypSM4a3|Z`F7x zLWZP(R!S`jT9p8m+q{l9lQQkbWscs_=O|ty5>Oy--6m0)di}i&Np84v}2we*HZxR+0QHMWn?jz<{VJ1ISm_-Lu=l zS+f5N9S3jv6gc(P&oWHMESpG}2zaxPQW=N)l&X9l`Kj$+eZPkDEL@Ds=#CPMgbZQ* zKo-g(U7bX_B~>BEdUD@Fdua>c=2*am5?5vTGNWYg{w)7*u5_lMLU;d%WUx&046ej) zQd=@ox1JG7SM3A_0pSb~>thm@`g1j2MOq!!M_3*#LMtj#TXJ0%k7Q+8P@L$`Bm$GeKdtWiK+c@-JCKfY6G=1yGsVj#X<5l9u}3|GlyxHKMiH7C4YX z9wVKXKub8aMnoG$MIPy14Lrh6LH#dV|XtLZ1uhw@iQf7MzvfIy6VMr)kGkeSzR?5e=8>F zaVnNgNrr!#Yn;?jf%(~V>gk1Ca>fC&{=&yMbiA$Lcx&HDWo~tibYTSw6HjrqBc0gY z#951H&_skwSIUaa_LA-F5qrr26V^=c;u6gOSY0)Appxm%4Ak#Phz8Gn?2oh&$dHvK z31DSu4-zo&VriuFhbWwi?ZwNukVc_ZODJ;3R}t<`?CZYd1BZiNx{?6hW!*@|TL~~B zXmQWEL)MZmghg`SK=`)U2W!J`1I(FqfD%^+N_^jz_@huW*{LV#Qd~%H0O=rdKf_-`CPr>z8|3(W8gtR#tItUsvKX zX$oh5*Hlk{+mHOA$SN{FTvL6b=I>$orXuA}B^_fn?Is;37s(%m=^ygnWd6ZL@_!DO z75RK&YVI!pvXtrnn(9+Ee;D(BRV4o?%^ykpKPZxajOHK0{M(D<4=DX(n15}N{C{fx z5zKEYk{?$5QRbgqB>yLv5`e#Q<{vyL|4Ed_P_Pe;kGxQZ9VHu@fDX%dcAr?X{OCwm z7c&TvEkj0*9nBL``V0c6_LS^_+2%qiiY!PRkzuNU_kGTTWkB$hhNaLmoBxd7z?Ea- zE$Q_!43D4HH&4n5JQkk;kQfEa-JFLF_?VL=aeWUmD}4qNgr2coG|PR@<&{u)R-d~b z{Sx-rw|U@;_fN~d^CjhYLpk=7(CQ&~)k^pxuD?N666qR^4A9H7TG`RSRvkVG!T8wf z@KpYft`48h|BCAHH2g=p_CmT2QMfmns zRKZ~;TaHABKW^KtpoJl1?EyYn6dj2;n~(cATxC5Iegb#lPOM^%kbYvAK@^fvUWd~G zNy{*U%dWq0mvs0$gk~r3AmBwQGHQ67pgcyp*d>)-*6pxDcke3Mp3}%n7b&YwKC8VC z>>qIZ)|jd+i;;<}79W)CaNGCnz1JI?I^26gcss zPb`EYDHNaT#F=^_i;g9bKuTyiGp0b=8Ab&$rb7xKEF7~Qn}Ej}t#MWmyyKfll6j%C zn(=E9caH}L?nL~Y+S@nHDw)%Xe9WWlN8!%}JlZCAbingb2z&McdbcgiH>%zwLbW%- zyR#6r7pjNd*_eL2*Q3kIweMNEpZUel1R>gCE!>;1DdIlBjT7%+i0E}WhH<%@ow8jE zLUj&YwwA+3d6(Sq%zQQ{ZjXm}80yI|lq&1mhh;2WM2-mF`hee0b%16L=u}u|9R-tk z70$n0p)b)h-{Ahc+yYOK9)h$Ida z3c-)g{4bCYXM!4o*bX2foMFE|7zOb3luir`HqOzz$s%O4eW<99gq) zV}FBkZt0Hox435`$PLCViKDbKsb2T9SA5@|#gjx#$E0}tU=vyv>Dmnu*-S1dv`QvJ zH$=L&1Twi}+bo$3T^H%%B+iz65J__+lcB33U8z9kLr7Az3<2%ZK<4+5R4XMJx-8Pw z9LRhaNpmHWq0iwoXCU)2B$dQZFjB(d3MRC;C%o&4<`W2tXd+$osFc{=@+{?PHvA** zpRuU&v1I6tRd9^wZLMuhZosHDsJD|aZX}2)#A?AJu3YB%>zdGMz^lLVn z77nltuZtoSB0sPb8M0O_3cc#E%ow{`pWB3NLlJB+S1S{h&cj4H35pJb?pD4I|Cu?} zVHS&Y(pU0ZqgvjN8^5tS%r~XRKZ_GX{J#PtDE~iG9d6-&TXmT4a*dyl^&tM&ffoLs zQ!TF&j<2r{^DV9M6EOnwe}YmorsGIMR;23&I5W;;B<(g?XT*69>DM^4vWcm2q;gGl zuNe~5&)F8<0NVN47T$;uy_6^Tvn_lQM1lbM&oGQNFgtV%NM>~vlkpB_TDxag(~d1R zVVcM*1Lo;+YXE5?m)ttYL|XIo6e&IQH}-70rwj;yUY`E}zZjoF@r%-xq#W<|Fl1I& zGPLRwFuwRtmtysRknyRo^hnTbJR8GO)xv8>)qrr1Sw7Oze4LFXC?xyvO@IK@@AQH^ zhwhUjgbx3mCA46Tn#EMUZNU{(84)M$LOW53b?8m4rXF$m`Ctg)H~X;sj7d2@i2V*R z9aTStnmCMXWx3E${0OdHzXdK1<7O?oVvR1gN#;RPW}>rQ^4r|Mq9(4yN#>p*BPLflNV zdfF*Q*Y7a#O6PeH=>A4lAj_Pwl#TzMJsfj_)pfU3~lTE%!<)3F#`z63b|8xhxw9 zVYX+M6(Y>PEMc(7a>wUkP26fMUV7&PRi85~C|eTH%}~do$^Ozv=OdU3;Rs-)(?MEc zlSzC)n^3|Sx!Ig09btC|`htbGYGmOVx9|)Teq#W>!l;BXzUyEX6IB)&GbvT~T9#04 z>nB9Dvx8k|G8OE+=1}NyLY-L2C9BljeUd4sicUtJdnyW}Z|2?wP>;dVj?Ne9`n9we zOO^1YC=AePlj?CXKcdNJ4lS)BFi!QCgBtg3bVq}OFRxB4wv0;dv&eOJk~A6V7;?`> z2ha}04(2t4(I|t<1+MrgXBP{6`A?*`tZz6$+#89K++raNjb`01R@ai_`=bmZ^XI&p zU;9%nwsy{d3v0)ipi<@TWKbSMR((Do15i=9qv8%ogN^;WbY$ChdaB; z&t|;%DzNOhwalSpouzEN?ztSe%iV5Z?mG>5RKGKXfFT#5UXMKIZD7jbk}z+<+0wfQ0c!3_}TkFXYHH=P1&;oyw673o@p*JDlVL#(T<$9D|AHjn>8Ou)3- zI3>rAjTiJY?p`P6C2J_>vQ=k`ykQUGGglpqS$q5(GkReiu)j1u*&-oQ_O!qmbH`;9 zzb*@xW$v>(jd(y&o+U8Wg0B{Pz``I+V32k@(^M0MvZIx9lD(w%;?(Thwov}PO9NmXy zG=F*l{7Ho040!7DW)$(vG&w9SyPLX#KMD|kY>Y@J?`?42q4@59YhWPv2dTkGL2OH# z`+1@WU5eXiozak%F~`ix=sf~?z}u3Ve%Kiq|u#S#QzhecWFIR#h1J) z2AM4PtrtPkUiKm(iJ_e1_e7D21cu4qmjT*Pz>I1 zz)bS&E+h@4RB7lZ4Re$RL6ok%7<`phbP+!Wgn{6ga3shQD6|z+P-=`%3CJyel(PpI z-Qj;wJA8;oJOb`pFZdQfjmmg6_79QgpTaw^yx1;>dbGajGK7>Q#w*!UU|pbq?X!Ub z+Ci!?sbr|dkunQV#=-HeI^|jx>i2Yfy`!(U6W~^D823t|U;Asj$!#!v6Wr$oXhpv82!&jSo*bdL`$cS}}vy3PsSf1iCpYN7hahd-AHrx6I zoNsY={#xxr59%V2(W6e_k7I##E$jJ=6DPH&v(N?>x*vsdty`EH%V2e3^sAmt#2v`rmLcT3OdHw6JAf*FRfV2O05hi zIw(N@^QK}f@vuMFgPN}16(^&;M4@+~avW99`)JMvlJy91&`fDVb3}`D{nA!zcqxh8 z@dV`~_|~!1Ev&f%HLJ`zMX4#XzoGe+OUw|xe(kmqREkez@#!co`q8&l=rXnMWFL6R zL|jIWbk-8<46usiSzi*qM&x-*T&7`@0Ht9_3Z6v{my?|56s1tRNRpjT`e zmlXTFM~s9%_fFO&CT$&A6_Ym1W3@EEs=zC&>q*uHAj_ApaQKMf;~jEXsl96EE5f0B z0xB}ur;8={GH|=2{Z#QeBJL2R;DEOII6aio{@)7@5p1r_=iak-6lr3V`|NWl>-8m~ zP$~b+lrIO}&I}TNSFLSLP~o*E;H8uJqS%M_R2f5d0XUC7X?o&yYm1@u+r#$%F91~(gfsTRj>txCGUAMu>RI|rJnjaC8n z@`m6*N5gzqx?l$L^W12NO7JCt&ssYXe|)@l4{?1i0S!R`1HJTtJo8xKE*-CQ+hXEU zp;)j@kGJkpG=H=bcj=tK@S^iA7%$P3LVxLLefO}f$Py{}H%N z3SXu>M-2&09y=sdKMwzZnfwXN^Ck}oZ8{$FzT=RNFK=0^KXyoHExyhK;J|kmz6&NI z9eEE$kvAUmLZod!4Dk4lIT7Vg0^AAcYY5llyL<}b_>RHx6x&SBMk@U4SnEdDcc1-l z{L2o*#K;{($3izH5?VDz;Bpt@)or$<{^ROhjO?5j|KS{rT-*|MR?wQ=h-byDb%$Ig zM81?!xvYgmd>muI^Ll(;$ff>B(1)*!Z$G|cAR8Co1(45jeAnZ<3E%BUBMdoB1K$fM z3&>y-WaHvH2C|!m?*e>@yB~5K0~yrgyByz#@OAlxJT^f-F23cE$#TeKJHF0CkVkIn z5tdKW%Ui*8TecnPGQMNd1iL&=>Hd#fkQb`e+7iyLhF$=NXLZzf%#(D3VVIjbw|vu^=EL!VH z*Ka?u!jaCOQnGZ3tw-zLQi$go;KA~(p>vTm$hYtkNIVzKMry`h9G#ED+y>UQD^M4M z&L+z9TrLN~1tZmo^83_Jpdi|(%E7+vBAklB z;|S$;1vm=GBYqmzheR%a0#tsT(&nP|xmIkb9EhJlfBSB4@t(7qg8AZE2d==q8ku4n z9G{~DMKhDXw!=PBLm5V9Jh^O+q~f;A}QcK(c(&rTZY9Yne|0zN~BqEw7zJx|@y?HA*B zzEoB2o{xg2vAJpz=_-@@5Y#o13B-PE9(I{BJ==GurG@`W&n(cByEy_fHNKqjs~NYQ zhmw#1st-*SK;UlqsjlPK@(pqToolv+Q1H}|sB zgDoz^zfc{P$?Os8NzXS(y{Afm?=(w~nQ>!*O>xo-bSo97rqCPA)!_Y;0h-+Ro;n~u zlrv9AK2PPtpw30FNY^^p17{~0H~|c3Z_)LX&AW$|hQ~mZ!3NAdpJzXU@|8}IhDHYH z3Fgyy1-5zxDwt1G5ZLM+luu=MN0C2u(4~EvR2IA0;-}`3Cgt6?p3H|g?fEKZ%|+Yu zQ6HW@d!+NvsMXm;`HUFpjW5!QW`ooiZ6*6(m!>Fm6(=2#Va~chD71Vzyn)bf}kM4Z;XfR^1(eaDFEIwEf z;@o#m^4&VI`>&iLV$Mz0S`X+CK3Y&PcO(vG82>Nrjh<8s)ow{zv-ttgY(`bfiukRT z6 z>CpJ$8YoRXsSs1C@_epG)^koG#g_>p-AhVWh%vwx7o~$OF7dmg1Up;7+_Ooz8n)du z)RWAttMhnF6P!Jy^f*vTPJ`n`spS_B`4D#o@=YA?>?QpB&l*{nRzMb5D+?}ZYGW3q zPCSDRQ+%BydW`i>KV{{6C&Qub#k~_5a8D3DvTdB-zS?I*PftTdz9Yf*jdY%Zm7MDE z280uH)UrHAiIoG?J?O`f%D#L`RzXLKQ!)&k=QdVa1JzD6o1yW=$PvCDM5gZ%wF^1B z4?_9SFlg;12q{Ny@<*VfjEQ~2k*H)Ymi8AER%2x*eTY*|$fLdDJ#HP#S1|P@jDM!Q z!}7=Em4Av-nBa~k_(+03NN@xHD&gNfF(|+YcrwT7AB;{N4?pa{gtK3JUW+;`bH__!}U3i`)_{(uJ0u}Y49!dVs_ z4PTFPj^A8G{cBN}8&S0~yNJv#Ml_F5rO**wpED>kFnF9GJVf&bk0qd92amTfBlH@N z{FIWPDBI(+P;$GUIfJb}%9+UYhl54jmwxD(8S$SE7XLPvHbBaP>{n!tM{_?2aAz{n z@Nk0Fx4X#V8sz&uR&3TGVyANF`Zc;&5Wz`A@E)XU^mQZ4*XEViv415>>e&A;a^tTL z+0A)(Q~~`>O8+ku+|y?}=(uk^lF#qa4&7#FFDS^B_;gyCx{m_hnM!(};?QLEpZdj5 zz(ObLBol)*Gi^s;c*v^D+|Lrv>A(}vvp3MRs#h|PABk2irXzbOoe7hJ(v|hM&V?8W z%nagimD0|F;nVAn!avSWi9beW-4~A&gqk8#hk8(9`D6cv8x+d@VsGA>w#~Qv`zJ+n zy8({*&%>U4bsjezB$+Y2RfXbOp@DYQ+ZGVv2*C->qqf~b539b0J71{R#*5E$+U%)0(+sR5c z94k`GYbI-RD6tu?7rB|WLOJT`%*fY;m(adOOx$%gi=C<+us85ZrD;E+ z;x(w)R>LZ@tls?vQX$yfG?j&IKhlaWf>G*kMcdc2?~nclKL?|(5!|doi(7!nFUF>pOLA3SuULque0rQHPdu9p4E?ZUJgLF z3e@$viduff;Pm~zXXCu=2g}*>QpTmz-A@etPwl1j^c`jMj^RuTzJVx>&sW21jO#`?Oe>Y!J2dSiZ z%(}M30wlzQ3BD4Lb-c=AqTVx=MO(LZBb19zH*EqUItJ%i6|W8 z+%JGIK#{YUG|uo+4!90jC*{lCI*@CKkoBpVdJ1AXRt2a$av7M1&H5kQnRH8l!7W2^ ze;gr(#6*A2=DrpM%*R+(|sH;Kw;*Oj{?}x^D3}KI)8`5p1OB|3xU9_ zS!D0LRl+*C|CWSlr{b6DgeB7X2T9|8ZlrT)3CroE<~d2%8O7}qmS>aj1oJMI$NJn< z{$qWvpY?a0hx+lZMG!g}s{q=HC}!?q3)q46*2#OE0wQZWYMhw7anrVO^OnmKco3Da%1To4`*Q#=SqA@U9% zpbGyy2sXz43bxI8sKt<|;KKbWv<gD{|f9(WRk_ImmwT=%Dc%jrPJRq?^Bu?Yzcus9I<7I&5tR zEqWk=i^LLge;2jg5e}%#kV{?r|S;-A4iJruwH;xF$!aNVg2#CVs$T|JU*Xa_f?4cikjD?PMow} zipe{Ackc6kMW#Nqck&%PZpH^*(Bdm$uhLZ_&nk9{NasPYUDZ|WGJ4->brri!r1M60 zv8o=*sdF1jRaf05;Tt5(CW>?}k+8PQrx8y63s*p2fIw;o?n_Db9~Svyoq(|C<2=@K z()vTpxcy8v0PCo2tlcc9&p7I&}AM=gf!&g!tt#17Y)SQ)A?lGQ)= zr3cZf_g`85>zzMn znNGIMU6_7DJJNFVj}->JaTpUmvS>2cC6U5cyI3H0$7FAr$V{OyU7)-G*GV`EGhN9l zxo^oF!)HH~Ile>}F%y^SLS$Kdl3AKeGzz&8{&Ex<3Ayzh={Hy~59@Z8J~LBWjS}u7 z4?wT&lS)dhn!)otJ4#|;4`5Ll8i;>x^X?(}t@<|hLWKjP1W+lC(|vV5DH1A#$v4Li zu$vTPvT2|LYxEyt<2X;Z!jyfBuH^1UrdmW<&v=2+r8L4j`NOj$?%boSrK%{dU|PO{ zM()cf@4Fh>RaU}dG7lSLz!uBWwF(NamKVni*vk3+qT>kjQo($IJ&H}-A~w^Vfa@fR z==X`JgaS0G`9TrY{HIK@%WR8N8?oSETRfnVMn{bfP;2sabYFHl+W~J#!(Xau8Y6jn zX%H|2%DV!8?$V7O*(#~i#HgrCwfSF^8mDK8%M=se59v+v|0=BLIaxH;iWZH&h~%L2cD=+5!F;|JqM>pQR5GF?9A?B{M?;$S z)m4zKNPrPXANQZ8B6cKW{(HYC)_oLT)ZjO5M~mvd`wdJt>@Ai$Q~~Ev2uz$=q%(jlqwoJK`VKkMQo__@Ngn9@{J#eC$*;Z9uUL6_ z6d~J79t1vqa+L<3`f^k!oR_}mK8WZYUpkQQgWy1)DL-STn7FRqNY`u(yU8$3_q!r? zaK&eSN8lO*;rLQ40#KfWFify{CGL$c4^cL!8%WtvmQI)4JQTwLH9}BZ|F?>(NOD~x z^sEPXarGHf%vLmoiVO}wx$D5N<>5f`$hQfUN)h7j#ax_hunw>&TAG;Rd=G?cSGG^T zvV4oXa|X6!WuOElOk&6W|A?`>fG(e7YNX-Vef{g6Vv5z7rq!w#lba9XhMf8^YIUBi zDzrNAkH1PJMx10-mi53ktzucEYk&=?+9DmQ%5_kn?l3%5&O>@4t}AEy4sO^(P-9WeDG*URjprr3 z#6SfcH`6ip=MSvXCpXG^LYZ)2+J8uVgb58x;D$wU-P9$Npy$|$11L$w22i710V>QW z=QAahLS>e*A$*PF&;b?w$9hlCx6;UVeF~y;cl)Vqnn>sSenB>Pr0XRn&=}z&up$iq z*F&PN`8I(Rn3Tc3glM3?)(~whE`=m{T(3oGcaBdOorJ_p_Y9=uE`zIJIo1wm4Bz2- zhEK*(y2g~3`@y}?$i;SjR#b3?s^Ghrm!q@w;q7?FUZ*Qbj5SW{KuU{y)^r*trh{N6 z!8p0!0#ehpPNFm7}*zd3tuireYf4-oF^?HHHrAA|Giy{vhtVfAV&J}ZxR*d^Pn#yVh+ceSzI99hu# z5x2&-k^`B~e~Z!Wj1t7X7g3yNah_)#4`7)fx3J$dk+TD7#pL;?vj@u)udmA!)URs~QxP;V4tmf;MvUnGq=+AZg{yowwM( z-bEIl=FENtV6k72y&K_W5*GattM&~5^i7bs_*b_xuJ_cvN(3E8u}Z?!J zBcD9=p`q~%6z}e$u^kranvV{qfU-qk*3R5bcX{Gsjfv9&&Lt#7vl;2?L%TS;$>dit z^9Fypmyu#>_x49r+;4!xk1#6>6v4+aD@v_*OhraM+;Mx5-l8Iw7KWYd6*o7`ad+M6 z@kjd*=^VR{^AMSzbWH%Q?vDYHs}7hSw7*|SnHu3URj?o+gF_PQ1(3=CnKFaw3J`Q) z>#3^+oQ((DGud15pYUtZ>i|e|4cT-Or*Ddro6BH8ndd(7l>+JPmsy%hCk#c)?E&Yi z5@up+Js`CwV~fsfc`5;>R4ik_M()Idj#@<6mOw}UkMZB4_}ve_?2&&Gj41}goS!1i z-IW1D?n_9`-HVW_Y+(K;PaAIlHD-xA|d*rnc{) zg7YfOHg^SVQMu(k>;aLe)t}7ujtn3QF6!ZsAk*?Ld_V<^F^v9AS0KAZn8x!G15R5_rt{f zBKFg5S=)R*?z@P4d@x^dfAbFDKF;7K{=!))^ruaHOkX8l$82zbm7eTpB8((>=N z0;OSy8$$6Z*zl3j{{@tDTw2yoVU{1PD2JsgV`AM=esS8P_`%LQZ0TQ+ID9_BZOwfn zXqn7n4INT76f<>Y$F44m#r)Ro9<8#fjPqn-4>}XDkusIZH3zLF#>*R7L|sXpgy+v^ z7YB(*J~J#;HJuiTDrANsqtIiKY!o_O#Yl#LNFiamh9W8GoJ`?H3f^!}IOC1>AZ$_$ zubd-FO?E!O@lipL67afp=~YLYROMY0tcYyk0I13iFO{cZ1$83Napb=)HC7T04S@|N zlM>j33V32C!UyEBR;Umc_@NV?3R#U;i$TXrEyh}CwyI0vb`o{?)ZW}S{Hc2Mq{mUz z_I-ZD*rG1qqo^|A^6_+`uf*)-+6Q$H^YiMWKyBkkTX*z)q&a&)RBk##raG@bs&S}v z_ENtWZV*ijb`9xmXRXUqw@BBc9Cp4FK-W`vNg(?lUqpfT>&nF`sj3ZZu26P8{y3kO zsG0vUED10^T#qS_FEXJ@nZGe@c;fkF4GWiGiNBxJK7v^|M)c%4d=u$DrrghYc_Ct` z5XIT&``*$Y35H5|{aa;xj0p{syGfaLM5OB?^q_%CR;d-^HL$ahGN^)5yhf^2_%ixi zC=1pHd8F~a>bVuV$2mkdHcOnHlc_EEaZgAAH}Cl6^$^%}MkpR}n4tO3tu^^sW(~-7 z!2U(Sh2s(GvoB)~)bT8Ev?;n<5Det(`;wP)8FJF4QcHShmi>bl-}~2siwXgM@|}up z;f)Xv`@$3aIkAe-)I2>!{S?fgJM9!)vWj;FW8GNhG48gL@lN2f7-fqWLkhfJ?C*S! zqrq07!IWk|a*{R7FYkC@TeuxL0l+{Gh2nUByuHnfN@1mj-M#+_?Q6VR8$8xa|h-wcE3*c^sJ@xBZP ztF+{-+5GxzXm#DZ8wfLFpmMZiPsA^-8dD^2kbgi{V`%q^$K zo}?FKlen8qZY=vcGbKQ^E3=fHrHeAA)MjP@o3R zxB@aq(aST3LiRMxS|B|PQJPM@?^K7l!q>Z4^`kw6eKPMu&$5YdV*-9aAt}F1wwH_Rb zbbeC8x~_1ngk>$T^GFHnIu<6FfR_VCokJw70$7Q@2p>rt;ktj_WcpaVO4^wy(h{a>rkad{`7LBA^Z zcppy%1w0y8Dx>ng{|T1Bdoc|`rpjpq9U<4!h{Z6;%bAS#z;pS5n*wUNwE4(BiZDx! zOpV}#9g)SYN3bveS*bTjV=dy5J>k?Al{ZtX$59fIJ02Igm?=Q96_U#opIM$@bD~2p z0~dC|LRUY;lh!qKB8JaH=>l{)Kr`%0cDq>ZtKCR0OI1py79}Sr!=)61o-#xV{dLt2 zL-_3tXePXb9qH(dr(tQx{Wh#%UQ2!h?PcyS2z1fMK0rZURhC0h1MgC%0hs%2mpC5* zU6;NHs{zzOud6?8@$3U0_XNLk(a(w68WRdjrEIBZS-Z}>_7z#g|Fg{2y*)r59Mt3h;^_eG0t5fR!m#tiC#rd!Vu<%-b*DwT z14!NdtGwDNt4QZwSQM4ldzdfhN%-C{oZ8nyG3MwtrGDcsQiB>{rw%_pG}{gfgdAd?sP^v&w+(Z*07hA#mB4e zMmmS!6od{nk^^V zD&f*}ZFXdnV!HNPq?nGJh-jl-Z1*eNmsWc8vX6p)2*@x%&5d;a5sUq~V@&}uG}&3e zI1r{;QSSjF!}&iSlMbFUM5?NQ?Go03^i)}9=7|V60Q#GI6t;$ON z;8C)VmPPLPHV8`Umfw)v*AVf=kM$^a366pp5-A>z`_~oVk<a8 z7!~NM22Ly!>;aZQhmcFt1O4Hv#OjY2wm-~)+4Kqe2m^FAX7}ic|JORfKX38q)0W*0 zo~_0=A)LDxKR&4vDx7etzlha@M0xVrecQrMq2ut=XKs}pkQBGuuZvnAca2~;%*Jog zBQAX11eJlWm)OYk!~I*e)i%vfi$u1CA44rs)RL@``r`F|#m*S|D^nD*?-U)S39tK4 zI?zj8_MZYHJQLlwzW_)3sBPg*h)_$a$1$Y0IGVO9I6L+b{r{id7HlgPNtb=`-wo5O z(2UQfk;x5GRzL^s+8NhKxQ@ZTs!$l&sjGlnO*qN$_KBG@Ak-VmZ=Vf)E3!~v+7<1m z@2k)^ER1yPu;37Q!-CsZjRgodffsHSed7emYNd1f^07s+7{cl z6q1y6@V|?ku#Cct#0~P|RCGF4J|%vd37r_PbjGq3ufoy`dVm~|(KADv$AP-Q@ywn; z-hU%6`xF$2tJI_?*NlOxKz~8Z=PWUfHkuL>=~{#Ie1bk%NYHPw1Ve(NpiT*zN`eA6 zLI$$V2+*U+vi7lmEXZU?>%yaF524FgGC|*UmcH%E{(nH>XIEq#;!WBTraa#4PA06^&5b5sF+e%9ZS<skW5gzAZZ}Iv_ogw)#m?2fk`)pzK1H~zHeUZs|a+?aepl?@LdKMJW zGttxX^DN3i^h7**#>#b@j$h~uTZnW>ve2>rh(bCZ0s#T}EV1-#SJrI%WsvSn_GtPo z@laX?G@Tef(UaC%wIiRvx&@lG$m0_|0fbjtgqkMAUQj^nNTB9xxlT$Pmz4Lpm*zqr z1P4h?{ZQ-uHYV$4VKjQ>4L4kO!{i%}k1oD4e&rSMD;I~NvoDKZwlo@J#@W$m+jWT> zuDCL~?1t;Ey5X|VMK8PjvTGM#cP-#VG-_w@jyk-ib2sj168)2DY}rC zU4U?g>uV><%2a8X3CZ5!*%b=Z$O6kWOeZRPv4$^ZcoD)&KvxKIlL4QFkp@=(U1z>J@mX+=(J_@W)O}1tdgl%Mcj!$EXoZ?F{~pY zTGsKLvkU(YBkrHr0m65US3x>UDJ;qO+Tm0fyzVGIQ}em$9(aLN@Ev2*Q@IC|p+- z9uQas>UiB@9WKwgpk!BXr0Zs2$*?*+FoHsf=}r&Z`71n^K-etF(^9{JMxc#Yst%=8 zORol?_i8*L9`~J+-*tD8yc!k{#Sc?p-ok)-O={xP{~@!6(+MAgPoMVOaDOVOy!{v* z)z1e#j?Memj`UyWDSuH#D9e6{vhI2 z_h3UD@?gW|Zosq;HU;$&Q9Q1+9SPb*LR#?fLej30Hixw>BrTw7Yd#Q+XB?2MzKzBa zu+1|zW4-FpZ=Qm<*_KSriSIVBYD-_jG*Y9W{2(0#D2gjizal5MxL9ys4Oi^S7agj$ke?vhm5Ji-QEE7v2)!qZT(hi`HvgYpy#c>bNqctneSz>d7;bYf#mcT&o%rFKqzlkO zh+OPX&=B1y_7BfDR)>jw#VFO$f1)Ii<5Sto-p#T1B0YW3Qq|IoZl*YdPA1F}q?R>?mk@iS+$70!?wQsUhTyPr$o+PM!HE zJ|X_#&*}&1omW1{yhPUV7N_Ldaz6omcfIF8G%-7s;_bhIFH&Lf20&heS4%E~!zH$4 z*?0_P>(N{eO|+(sMcOq(ont(p^O2C;$~PwyheJhI$QxK%@YEke8v}(a7`%-dm)^{S zGMoE{WJP5~aq(VNU<3DfBPl~>3}>)#3}>1Gb-Zp*f#6)*`6!zk?X_<-+R!j>J|x!I zJg2d?Y09)uhN97VO$`g8b=Q4v+0{$0ydgRzdf}BfoE&YwA|9PKE!0vwC+3Tn_EX(w zY#a3e^?=NO@XR>)C7H_UrBNH|M2Oz&^;Vb@AcSkiIahcIha!Pqlz9Cjr`0SIcGh?x ze$<%1WL|nf*B=CVT%5 zXYYv%=gph<{-4vaeVh9~ar`r-lAqF3=2aXm*2pXD=-Wr`SdQOnfrxZ=hR~)D15bT+ zI)1sacsl;!Jz>d`p;cG*=uiwz2cGWHt?5dpFTvTnb^M2s=eS{=h$ZRK-93^%S}b@l z{VtPE&oC+Vlxig%8?=+Lpu71Bo>3sfIHZVQI%F?KI)4kQbv6UqLaCROP$U{cBX>N8 zi1QdqID%(5@L=;4adHDJgZN}Ktr?SfPOPA?zZce593AhpXl?v{AfT*CTj>)*0I@X!M{Vh<{tew zp0x>Jn*?l;pM?cO?~d#uK>GD2w~ofzfm9aeINYKXyt~j)fI3%iVn#_k60CE1$Iqou zww{FbFJCndz9z%Zt|l~mP06U??{dC_p7xZCYSlv!!ni}~jSa;irs3G<7@DdgWU#8E zJAQj=Z?cATJ(gXabyiz0Axm!%y}0Rd}Ilx{BfMvQ|2#v_sWWV8uaMmP=JF#_vE_;4Ast z@hiM6f+Z>%N`4-B`Vnz?&tOhkU}4`%UR;vCmFY`TYveD(>?J8lLlN<-r3l~{0i66< zI7R?RE0?lxi~vslEF2@)-2`&O^X>413ien|IN^loq%#*sW38>ttrD7aV|3EAlc(J{ zLJSJz%lQjDxRuyD8=0OvIz4a9lWT_#UzD5{iVshR(qp^a65RTcE@^Rpjk^xuS+=By zwxox(I5U{2#Q(b#QbJHm;t<80@S@T+hIBM(K=b>~P@S_HX3vhb#+urrP4ni?1Oy9y1pK_F)>vaL>WtPk z*0!~o%0MfL9E`pQVF!YR+Y+7M+T1iJdVWLGtU@|GSx)h|s%vhV-PlmarfHuai!}ww z_QkA>M;qFrY{gn3ICS9b)|iN+PQ@6S-P}4?o6F!Kn{d6F=EPbLkl6;^fvC|Y7dEs> zgEY*7d>dvr#9E`Zvyl}YfAaWHQ*+al_S*A7wx1oUZN2lsRt)Tdia^r@ zgi_bo3~S)GV<5|#3#rgH0h%9Xtu+SCvLbGa&VnkVHEUZhiZ)*uYn|OZpFog*dyGnms$eg!bMd1$;>aG7bL08s1vl(1wB1wti^5Ns!*( zG{+;}Hn~+Sv14;$?S9+&${=|VA#G%IR&9H26oxC>a7uGj3=8b@N25i*nsq?D^IIF* zW5|V}fJ88Oh=p&LI!&I?8er8jXM1&RYisRA&9ldcd}hqx!iZw?kq4Q13XGqbt5F@|OfXsTC* z=tR*R-}V+Or{i7Gg0mao%M~j_&!M5IJq8yfkS`8}O@?B$w>CF=T!h*hFh<0@cz~p|^!7&YrnvJ;69*H}9<*4P&1Sc-Nx#-ga_ zLW@5LqBYhM6L(YaNH-OjDc-;+9Ztr>widLGk40;ywxL!Z9wQ&@FgpRPODxvXc#-L8 z1vP}~E~VcD9McY=aHE1P1DMskR zn9M@#yue5A_ohN0JkPuGoOGh}M#rL+266`vB-ALK#0<`(S1LZTb&Lmrh%q#-+2G8e zHzcM4Drr4Ax=I>`pVBOo2iRUXUdFr0W7gB=1Iq8f;HPrJ5GxRO9(bN8i-P;Dqm553 zr>+cc`wJUdIl+Y6FxVAFq2k#d0g{cv28_xyugO<*DCznBto9V^PpRJfW}AK8=D`)c zh;wIyF=YCZuVgay$ZO<5AfW)X-z&6CAPdB@d1Qt*NOOwAg$l>|LFEbnLct!|2F1m+ z4xTp^NJpr7ZJ57=bYdrzOt;60qQbVg*39+XR>|lpow6 zI34gNv|Ztv*rAbT3-dH%{k(>=^JwW$SoGk0O>8MmaImFlUnNaO7@5+*;elT2$mJ!d z<7<pUzFaiZyuZ(5-pH)2h*Lh5aBr1KmW z8E;I}g~p=?%COwria+>S3oz3|-#~-PItXZNucsF%%K&~&3EdEl+EIj z!CPjlGvRAsElgK93WjVrqxEpl0y=M%)U3jdpNr*+@kSXuA&M_Bt2r?C7lkOSjFwa9 z2EGnNYulsaA$qtt(s=`8hChH=qTo8V*JHh{p-yLUn6!n)w>QI0n$BYl09~93CW0q0d(ci(o_O;X3O)aJfnD4*Jrdb#=+iS6BG zuc3J83Bp%D%-_W5^sFIedb^nJ#qxL4C+-*$+~1gF*5NIL(sK#V2I9Kh;fvg(;vX)= zIdFsyL8#5yjq)15+RJ(W#t#=_53lPV@sZbHSKd8t<%bL1L$CjEAzs3A_ zaS(^~M}rii{F-;xLDJl{NR+!1u`%T=1Nb%N?$i|!RS&~M-H8l8%y6kY2H{lKa#RN) zJya5}xTXZDLy(G1U1tY@hPdzDB2kk)#C=QS&K_n*+?|L%8(STEl3PqDR{h?}iQOw# z_c*0r9uk`G&I7V^tRh{uzGc2!FPKNxRlm1lcXw>HRz3B_^iN5`+8z5I$KSx;evo?Z z{TI(m-Ms>lv{2X5-Ngv*H2hya<h)HvmMGfb=7 zcmsHb@G6Y(4h%m-;Kv&H(4-S?H0{Jqp}7^ss#u01*bj29m!fY%(OA`_6U-TLQi=Lx zS7~kqPQ?|$f#T`X7U#Qy;eKE+m!eEM;bbAemd6uabBmR4yWj$6j}*S#FYJrw-`0Nt zYHu+ZqD3&|*FQb%?}w?FxgXZ%{$QC$c%W{>|1}}^VB~8C@jbZ#d!xx3{^I^8>^+ty zx0DU+-~}~%3-5#>d}jAZ?(YsHj^G~b+lWZ9o*6hrC9%ZcQ(L-TiAPXHy6iqe59~NU zvDevtC%Vt4KNqA8_>wgb5=A0{TTu|8BD;4(!`OBrFWGxdUsC?d)i@ee@&2yt!vNa^ zh=D@tw0$>S2o(PTJhUl2Z{#K%q5SuyME-LtHht#b0H3n->dXJ1_RciAs_G2GCl?TL z3N9y5=d2)YABOdq!__4 zD2M@Rs|dxatZK_pTxy+=^m$KmLTj=1N0+X)-@%vXoPE!*_qX43?%jCr{-W|TyB3dg zqDqR3qH=rQ*gG;mx3FZ=-@Ve;pOID=Ho?!cFVmknxiGCDH^a|PWBImE*qQzOh2x6+ z-+Gp?^PD!t6L@%Lq~+&NZah4*`L*|DPqoIc_~qwBs9=3_!JQQ?DyKbL8=&;m3#3GLK3>UJKiik_KVr{`;qQ_!BUDtp77$5JywWMIYzh~Fp+9gJ(0NGH4=qHSDSroP z{t^A_hrSD5g&w1fG*Zqpa4U*q{c-pNszzaKcSg4&eLX)3C8BrGAJDt#bK12T{+|68 zq8C}$%x+a^5n6!s9n_yeeH*wItwGPD_t9a>_reOK-zhIam1qU!8pCUXWQ}b2nUu4P z_5G~B2y4;LQ8?wH=rz{$&kYCRA+!$h!QR;bJ3tZ&I%`;e6fI)?X~e3#kNU*x7xj&f zQ%t$kbWrvZf7KxM&z2@>UFFZBtxaWHn%12dR{Y2#tGbrAoNe95i(a{?ZPi2dQ9mkn zs-wK5*R-zvynR%zIPrO2;dc0(-=KDCAGKAB=fR$=>%0+2AENuBCG6M_cH-naVL03l z)xWyFu6Y?cjJC7y%Q|se$LS69<0tt^zKTNfqI`8bQlGM$ThAl#QY25+q0c$Ta;SSm z?ep##wWSLe90v8vfvp_9eSEFS=%%rY%wJ^tPLd&kDud zlg_90i;&tOoozXfLU~xy&lDt;x%>NBiJ|{GHujfd?MdgCv>lEzQ5Kqj6kDkr^+JXG znarOIr#+u z{Px9}hQ=YaMfru5czHC+MVf0P4~;?m2h0QJ0rP-)z&v0cFb|jq%md~D^MHB4JYXI$510qc1LgtqfO)_? zU>-0Jm2h0QJ0rP-)z&v0cFb|jq%md~D^MHB4JYXI$510qc z1LgtqfO)_?U>-0Jm2h0QJ0rP-);D`5sX1Vj`hYe!#*dXSW z4Z03p!<@Q)$csTt${WOFvO(7)CfV)Aej)7Fjr~H{?{d!Jm1$jbY_HR?OhT)9jziFo z5YzWI(<{@w(^~ha`HyvsN6lsH&1WlW&Ra?I*HQ&{o?B6`dDPsuTKBg974;g;ardRE z&9Rul`rRlN4M%B6b2y)E(Q#fKzxnz;;?{#ncuQ!Y_S53d-wZV;GSl`tBX~h|)*QU5 zi{>EKT*195FG8o7!%y=f-^zL%(mcLeRQGOdN23_j6WxLaphy&jV$lt#7rGh!81+Ei z(e0=|%0-$h_$P1}x(%hERCE_gLwQJZ31`4el#a4cHX4I+kYb=^5Yi;uYKz*(OKy8~ zyxOex>v~#Lrum392eI0tebrX=ua57Wr0K91XofrW4-90ymx@o*{B{j&fT!F{M09j7f5 z;B3lEU^$!!$=~FZ!csU1-VGum3W?cr{C8GH@4fqP&Od>z&k+j@8$z5(Bd`{A4L zP52pn3vP!8;X#a^!8L-3_my-;Kek)5zMD#1M%^w%A?&x3vN-lz4X2}7r~*}?r6`hP zN5KIcAIY&x%Brur2B|&buQY{&@jBLp&<>)Pid0MkY2Bn%FvcZkDSYX z+$OF!TeD9qw2p1}y@3N%<{jUH^^od@2Jba?`~O>bX6PAo2r18layDpr59yxx4WfHp zf5=0xB6&>ylDG7n((xA}#rz z4`o|r|0(JE5#P9m%C1K}Q7?1@3PY-UXVeL)JzCUOwG)fG{>Ad{dj@uQPf#dNRwKnjaZn5t7cGj3;-h05 zm$K-WSa}f5Mv75P$HsnA+w?rfite*xEbF>X0aAb6i}ak&LSDc5{cIOz`p0Ga$EOt) zD{E`yw=Ep@Z!i7XGXce*zDSGe;MGTUEMmJQQrlD?)tASs`<~|2Rldqbx<}<1z0Zt6 zb5I5HJdneBKFUS%px4jktSheajbdMd^qw{gc|MxKy5gv~cz)CSm*+Y4hu+sbUwU3u ztUdqEW1Vhry>|`tBi*y1NcYbIbT=B0?nCp@bhI7mJ$EOPr-z^$Q6Hp!Q(a4uuA_bA z1;s;g(|x3P-j5VR#Z=c&dll<4r1$AbNU>A<6{ERGZ7xI)A^AydQjB&W^@HkFi5@^& zTA_20>U9&+^;#pZ+@s3WSBk%+<*(E$8tNLVzv`z&ZIHhe`v#;s>R6pyp9gh4o$vcz z{4BaAxuE|km3YF)Kw^AC>_D=$4D6_b=7jc? zB_|}08WvDm>Bf_jNdC+@9FoEhA_@G^WPf~M=-}ibNy?B;25WzJ(tbDRtxxjD$0aF& zHhIu*BU60bE%5<2Gx$I39v>JPpc=7>v1B?ABqn)rY)9s3_00vOdF}$Wodv(1>vO&J z7dVFP!%+9tD^T~<3os8p1Lcur(Df6PS0_VxDi4l>cR=~QH6c`H!LXCMNpvF1DP-EmH5BS{i@^esQxWzCY zPJ$ZW2H;S5In>zlgZq8%*mn-~9M1M8m;RQ#?0C7)&3{%0mCLFcJ_7HD%9EB0mHR6ZE`vA0 zT^apTnR_RCt-J}9BkLZRqzt{3wUaV&v_ai zg37P95!S$JxEhwiU&2JV2KI$(VHjKoTfz14qcWeH!|Whb`rq|XInfruO>h!ap0p8g zGwcsvgnn2HPfzzbTi^+}6>f(w!&R^j&V$=vDO4`4(NOucV&P8M87jA0JNR4ZgTI4+ zzSrlx3HQOb;3jwgE{AW!a;RKvneY%C2sL)-1P{aW;XCj%l1C|L)7!8UZ^S!b7+e86 z!$Q~v_J`r{3aA`Wy5E#Hs)58*KZQr2@=0xj%0IORj)rsLU9bSAz&Mx+yTUZ6#8&CB zp5#~=a5Kz=i(nS)BOf<$44g`N4$OeLP0WMQY>$PJFdw#q1@H@!XcfYPP&u+{q4H)e zgvy;Y5h^#=V5mG?S3%|9Izb{X<=}b=DmT|WsQg@6Q2D%uK>l-|dmQ4lXM;;Rf8s@& zAX7f)C#=zt=G|!wpau#0u}*_fJML}U=gqgSOhEr76FTZMc}_X0)GQve%m|% literal 0 HcmV?d00001 diff --git a/bin/unix/linux/readme b/bin/unix/linux/readme new file mode 100644 index 0000000..3484fc3 --- /dev/null +++ b/bin/unix/linux/readme @@ -0,0 +1,9 @@ + +This is an incomplete version of loglan. + +The classes IIUWGRAPH and MOUSE are not working here. +We shall recompile the system soon. + + Remark. Graphics for UNIX differs from those of DOS. + + diff --git a/biuletyn/biul1.html b/biuletyn/biul1.html new file mode 100644 index 0000000..4e3bd25 --- /dev/null +++ b/biuletyn/biul1.html @@ -0,0 +1,61 @@ + + + Loglan'82 + + +

    + + Biuletyn Loglanu +

    +
    ukazuje sie od czasu do czasu
    +

    nr 1/96

    + +
    + +
    Last update
    + + diff --git a/biuletyn/biul2.html b/biuletyn/biul2.html new file mode 100644 index 0000000..5ef45b8 --- /dev/null +++ b/biuletyn/biul2.html @@ -0,0 +1,32 @@ + + + + Loglan Biuletyn nr 2 + + + +

    + + Biuletyn Loglanu +

    +
    ukazuje sie od czasu do czasu
    +

    nr 2/96

    + +

    Loglan dziala w sieci maszyn DOSowych

    + +

    +Milo nam doniesc, ze Loglan alokuje procesy w sieci maszyn DOSowych.
    +Na razie wykorzystujemy biblioteke operacji sieciowych LanWorkPlace.
    +W tej eksperymentalnej wersji nie dziala grafika.
    +Z tych i innych powodow pracujemy nad wersja, ktora bedzie wykorzystywac +platforme DJGPP, czyli 32 bitowa maszyne z dobra grafika etc. + + +


    +
    +Andrzej Salwicki +
    +
    +Poprzedni biuletyn + + diff --git a/biuletyn/index.html b/biuletyn/index.html new file mode 100644 index 0000000..2ad0e0e --- /dev/null +++ b/biuletyn/index.html @@ -0,0 +1,38 @@ + + + + Loglan Biuletyn nr 2 + + + +

    + + Loglan's Bulletin +

    +
    appears from time to time
    +

    nr 2/96

    + +

    Loglan operates in a network of DOS machines

    + + + +

    +We are pleased to inform that a version of Loglan able to allocate processes on +a network of DOS machines is running.
    +It is an experimental version for it uses an older version of Loglan's compiler +, a private property library LanWorkPlace of networking and has no graphic library.
    +For these and other reasons we (Oskar Swida) are working on putting Loglan on the plateform of DJGPP + then you will have a 32 bit machine and a good library of graphic operations.
    +

    + + + +


    +
    +Andrzej Salwicki +Last update Tue 4 June 1996 +
    +
    +Poprzedni biuletyn + + diff --git a/biuletyn/index.html.bak b/biuletyn/index.html.bak new file mode 100644 index 0000000..e755d7d --- /dev/null +++ b/biuletyn/index.html.bak @@ -0,0 +1,38 @@ + + + + Loglan Biuletyn nr 2 + + + +

    + + Loglan's Bulletin +

    +
    appears from time to time
    +

    nr 2/96

    + +

    Loglan operates in a network of DOS machines

    + + + +

    +We are pleased to inform that a version of Loglan able to allocate processes on +a network of DOS machines is running.
    +It is an experimental version for it uses an older version of Loglan's compiler +, a private property library LanWorkPlace of networking and has no graphic library.
    +For these and other reasons we (Oskar Swida) are working on putting Loglan on the plateform of DJGPP + then you will have a 32 bit machine and a good library of graphic operations.
    +

    + + + +


    +
    +Andrzej Salwicki +Last update Tue 4 June 1996 +
    +
    +Poprzedni biuletyn + + diff --git a/biuletyn/index.html~ b/biuletyn/index.html~ new file mode 100644 index 0000000..4feaeac --- /dev/null +++ b/biuletyn/index.html~ @@ -0,0 +1,61 @@ + + + Loglan'82 + + +

    + + Biuletyn Loglanu +

    +
    ukazuje sie od czasu do czasu
    +

    nr 1/96

    + +
      +
    • Polskie repozytorium Loglanu wreszcie dziala

      +

      Z przyjemnoscia ogloszamy, ze Loglan jest wreszcie dostepny z polskiego servera, a nawet dwu. +

    • Slowo wstepne

      +

      Biuletyn ma sluzyc jako forum dyskusyjne programowania obiektowego i inzynierii oprogramowania, takze jako zrodlo ciekawych wiadomosci. +Z przyjemnoscia zamiescimy komentarze krytykujace Loglan. Informowac bedziemy o nowosciach. +

    • Zapraszamy do wspolpracy

      +
      +

      Spotkanie - dyskusja zainteresowanych praca w projekcie badawczym
      +LOGLAN'96
      27 marca 1996 godz. 12.00
      +sala 12 Instytutu Informatyki Politechniki Bialostockiej
      +ul. Wiejska 45 A

      +
    • Zapraszamy do dyskusji

      + +Ja jestem przekonany, ze niewiele jezykow programowania dorownuje Loglanowi. Przez to moge sie wydawac smieszny. Ale nie jestem slepy ani gluchy. Uczciwie zaakceptuje argumenty przekonujace o wyzszosci innych rozwiazan, o przewadze innego jezyka programowania. O ile takie argumenty zostana mi przedstawione! W naszym wspolnym interesie jest dyskusja, scieranie sie pogladow i wyrabianie wlasnych pogladow na problemy informatyki.
      +UWAGA OSOBISTA.
      +Podczas blisko 40 lat pracy z "maszynami matematycznymi" wiele razy odkrywalem nowe zjawiska, nowe narzedzia i nowe pytania. Jest to zrodlo wielkich radosci i czasami zawstydzen. Np. na poczatku lat 70 przez pare miesiecy nieufnie podchodzilem do problematyki zlozonosci obliczeniowej.
      +KONIEC UWAGI
      + +A przeciez nie idzie tu o mnie tylko. Kazdy profesjonalista powinien posiadac swoj poglad na sprawy programowania obiektowego i swoj warsztat pracy. +Inni moga uwazac ze tylko Smalltalk jest jezykiem prawdziwie obiektowym. Wiekszosc zna C++. Od niedawna modna jest Java. Co wybrac? Dlaczego? W natloku ofert pojawil sie Loglan. Dlaczego drogi czytelniku zaprzatamy Ci glowe tym narzedziem? +Zapraszam wiec do dyskusji. + Dlaczego tak mysle? +Czy jestem slepy i gluchy na racjonalne argumenty? Oczywiscie, ze nie. +

      Czym jest Loglan?. Loglan'82 jest uniwersalnym, kompletnym jezykiem programowania obiektowego. +

        +
      • Jesli interesujesz sie programowaniem obiektowym i chcesz zglebic jego wszelkie tajniki to zapoznaj sie z Loglanem. Nie wyobrazaj sobie ze znajac jeden tylko z jezykow programowania obiektowego np. Simula67, C++, Turbo Pascal z obiektami, Objective C, Modula3, Smalltalk, Eiffel, Beta czy Java, wiesz juz wszystko o obiektach. +Znalazlem u Wergilego taki zwrot: "Felix qui potuit rerum cognoscere causas" co oznacza: "szczesliwy kto mogl poznac istote rzeczy". Dopiero poznanie Loglanu uczyni z Ciebie znawce spraw obiektowych. +
      • Potem mozesz nadal programowac w swoim ulubionym jezyku XYZ, ale bedziesz przynajmniej wiedzial co tracisz. (A mowiac powazniej bedziesz wiedziec na co zwracac uwage.) +
      • Bo tracisz! Loglan zawiera w sobie wiele oryginalnych idei. Myslalem, ze zostana one ponownie odkryte w Ameryce za lat 20. Ale pojawienie sie Javy dowodzi ze sie mylilem. Java zawiera czesc pomyslow jakie Loglan oferowal w 1988, a mianowicie procesy-obiekty +rozproszone w sieci i (jeden tylko!) dodatkowy poziom zagniezdzenia modulow. Nie zawiera natomiast naszego pomyslu na komunikacje, synchronizacje procesow tzw. obce wywolywanie procedur (metod) jednego procesu przez inny proces. +Mechanizm obcego wywolywania procedur (ang. alien call) umozliwia potraktowanie kazdego procesu jako servera - swiadczy on uslugi polegajace na wykonaniu swoich metod tzn. funkcji i procedur zadeklarowanych wewnatrz niego. Oczywiscie proces wywolujacy procedure obcego procesy jest jego klientem. +
      • Inne rozwiazania znane w Loglanie i nadal czekajace na ponowne odkrycie to np.
        +- bezpieczna dealokacja,
        +- zagniezdzanie modulow (jak w Pascalu) i dziedziczenie,
        +- dziedziczyc moga nie tylko klasy, procedury, funkcje, wspolprogramy, procesy i bloki takze,
        +- dziedziczenie nie ogranicza sie tylko do modulow-braci w drzewie zagniezdzania modulow. +
        (Te mechanizmy znane sa tez w Becie). +- +
      • +
      +Jest to wynik prac naukowych prowadzonych przez prof. Antoniego Kreczmara, prof. Andrzeja Salwickiego i wielu innych, kiedys pracownikow Instytutu Informatyki Uniwersytetu Warszawskiego. +

      Od 6 lat domem dla Loglanu stalo sie laboratorium LITA w Uniwersytecie w Pau (Francja). Od 1993 LITA dystrybuuje Loglan w sieci Internet. +

      W listopadzie 1995 w Instytucie Informatyki Politechniki Bialostockiej uruchomiono w pelni sieciowa wersje Loglanu. +

    + +
    Last update
    + +ÔÔ \ No newline at end of file diff --git a/biuletyn/marble2.jpg b/biuletyn/marble2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d51410b3ae2d55e5bb273b414696f087498e1d04 GIT binary patch literal 2257 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 QkB$HXSZ@pVrxXAHJJ{n%LI3~& literal 0 HcmV?d00001 diff --git a/biuletyn/nieprzeg.gif b/biuletyn/nieprzeg.gif new file mode 100644 index 0000000000000000000000000000000000000000..8cb438fb341676fb0115c2bf28cb80955aa27ec9 GIT binary patch literal 4661 zcmbW3`#;nF`^VSWp~Gh6lyZn1Q!O!~x1?+;DGH@?L#2{Rqa2HEj+^6aj*^M~DTm*?|(T=&Q0+HN;TaEDEdFFCE$UonsP-*H4B zxCjJ{&_p0K9TA#bgeHuzK_G0v-@(Bk5CjAQLLh|VH=x2`5Eudi10gU%1O^sg5-PfD&MVJ1`h%18JZInqjdaaSaYcAP5NrSnLms z1r-DlARz&Q#dZM&xD-MJp^zYifqMW2-V$Jl01F8)um|!0n4lZP0sI39;1Ey)F#ruH z!BfBi1_Ny%4YXi!a^h=HgCm3>SR5qq2gZU*D1?MC$Q9TH6yOqqg%AvK1WAJc02g=; zf(C9ulpqg)3A#ZXfC(4|4goa~1JIxoU;z#=7-$1&SiB-`s{nDJja;%)ykEJpt4LA?BbSYikNCIM;ibpTre z;Q>!z6bgk>S64rD=#ZnMqmPddiA3UZxs{cbeSLk?)6@U^694}`^~G)C-vUAcM$}4f zu_?@W6(WJwJy&1Is0~AE;8SdhGT($NV6OMp7cuLiRjnvnaK)^KSnX5Xa}C8=O^Lg% zG^XH6vfm|}cu({;l;pIe{}&>qf-hyiXWGQ-x;B<_+H+1Y@u~PS?#EoGlIwkqWx1Wt zF4j_1Y|HbyOWfPJu1)3nJr#F`8&hp73i>J^&Q0_+RXiJb5x7cv>rq~zsFsA*J1^uF z4cEnJ*rpxj7mqY0VQ%yb`6Z(*8CKz2j|oc0+u5gb&%YCtO?DPuX-Yd*Sw7Xn^PcQ~ zS6MML@G?Yt+wm&i>~MXo-i78W{@iFQ(>DG1bHUHau96!A&Ce_6X9jD-;ca%+Rf}_D z?YS3Ps-G{+$){;*~ijZWD@WWCZ))5Pu`!EH&Qzy#`x7lNeB4vpkNkC1FYD5{DI%UP4OCTfT z?Eh*bp&R}lUy@I6W)B=R7bv>X@7x+!Pxef3cZ(+_;O3V@Z0rECAOMPMRreSv(qAXb)+isZUuPCJpbgwMe)FZpXx+$z zo(s9D6+=iB|JdQ6#Mh(QM{$ucBht7?zE!gE2fhv7N(F2C#BD0BCx)5-aAGadKz5QD z=CIUzbVa|Q>B?|_`82w_-)KgEacd=>L3nC9?D{OK%1Wblnl@L9!Ezkvh6hfxcZ5{W zjvA4-KDL$bRPp*HnWge*=u+%$T4!r?^`5?dm;1)wMuvC(wwxPyVf<&gW#9npZu{wP zht|tG3o|~|W`px=mL_G)_K}Onz{;5+jKtD7!CBP5dU)vB4lFX{EOl`0yUd;ZW2>K_ zRu4*y2k#(yLXX`l)BJ>IMjHb=4zReWpik6WkzYalN}R?BJo}+zvSl z)uCPF+FALEyKAhM^@~pMxS4WflJ%zRyZ0NeN2lH~!uXT#>_4#IKA}+It>J^52<$oL z#y*L|kFU8$c(a&3H?s|F)u>m$4$~)h-mNOZHpg_BT~*gCH$JR%hsv?KI#-`#6LCm} z7*fj8(7bH%ad9NnqE^Gn^a%cq$2T>r+H<-ejg5lXwD|QzO-sB-=@fM)?kH2qpw`}e z%KBL1%io`$ZN6t+{<0u8AY?=%=@G2i4hbv1nhR!hq`0d9EI)(!=JsMky;Ch1ue z>E-?&(T~SbUEhAcRaTW^UIq#!cPL zzU5hywG(cU=x%b{gVI{HF}%ImW~T3(vghqOH#luw!SKEN&|e47?^WFTVWYdAJFR=S z@8EyRF?GEEx^L=?S!L7t^LF_t&k<)&Mc3#1_7)QJNzS6BbCVAe%LHqthO_b1p5X0O zXRl4%#`>LF6ZJXU=>F}lUh=7hw!P`af6n@Q+73XsHb3uQKYe%k@JB>$1#2O1%ADbQ z5m7f?s?vSS**Y2Z)#G)|EtQ+0?NXvii+c=Jg5gtpdVjoX$?G?7JSi>fT7L?hN`6`6 zBCee6|6AZ){r8WnnO7B6ac)ET!8lf6zLeu*T^=ivSxB_cyS&C3*#Mflx*l|3ol?ILW?V)Mi1lC*i@ zsKxSPOIu3u-KkJV%T-JJWL0JvA%c6 zdbVhnqeD!01uoC}hxt}+!L+>1ub$zo(WqZJ-_>!#e>TX?HObCTNwAHBc_un}9ecp2 zbCuTjLOZmBQ~Sg2aQ*}}+V$hrPH#@@z9y#~%e`mPh=S&kX}Uex@site@7VDQL8q(j zt&-)wZ&4LhqsL}^dzSkbnk%a3-_7_hFApF#@m{Vw{w-Mf_n?FwuSUN4Td3J@5i;6@ zVzH}c)5XA{jYYh-hW@j)H>=cDIveXEYi1X2_6}`;MGFnPFDgWYtr|h<@Xs9Fh>oxO z{du0Tc;jAyQd-5jFWzgHsvl2#hsc^69SMtXeY%lKHBKFo^z!|1?G`Hg#g+;EB2(*9 zi=R1e=SCc!Np_;I%>`}$qjBwknJsDh`%|{L)-|{Ko`K`Y)OK@crvRHCz0BF5AFirb z4%D~JMa8`EaaFyvqkb^AdG4ih|F^R(euHww_xKfmzCIYJwA^`s7~bpp4Vx|@(xEL1 zZk$)k@>w32vs+;1q|NLNt9n1*PppvNKD&|lSR}3P_h!!jhvX~sBiA=AE$8{G)y)eA zG&lY3_3{6n{=$4#=eBoUwEt2`OZB160S`OmtA94YkKqMFnLmOnw(}##eluk=R9^a% zsXgz_mp?|w{79~T*Sqe~+>2)9*V_TG+NJw{jnON+9<5>roVXgWF35k_C*Vhp?-sRy z&z*tNHbGh<|DQR;0=J;HdBUR4{l>7s`gMWoPQfomALG0N^%%jrNjeuR{54($8jl9D zjr|RsLiU;jVR$H+u}8)VAq_c!@+9xCv%x+`f_)Po1cU`~JH2*2ynpgcP>q}KaqTDe zV<84MPwlz_4lDTU)jid&dqS$XyNexoz$EyBw%2|}&=z)Ra*?miSm<50v$IK9idX1^ zq%dDz*rTp6|AnwujP)Oi0x4r1ff)ViQWt7%G!T%5p-MC54Ml zgs-+IS1UwR)}v}okT2`QD|pB{ZDb8ELW&w8L5=tz5xMSt#IT66h7s8-5w6XMlvxoa zsTQ@?GD>tYDrGEEUPK=2q7;%SU)fPp+Q>cQ#%ByhM9# z68XkS7Jf+6(?NB0#Ry3;J9o$I@jz+AP>iluY}0$Px+3jAEUjlD>cApemXEZ+p@zDs zBTjMpm!gi6qYo`ol~%+bcUIYli+#b4-w%$Gq|np<20>V(oIf;jZD836ZR{n3ltz-Z1_2kj3@krnEKSS9_gEFsHb$| zR=-alBSUJwX;Y+hn3H_60ZAlAZJR*vpl436WXR(g`|ug2l1W&lg!QHgZ5-4pmsoS( zj18|Cn`$5}U7ET}W>EuO-XqO{L*I;I;&qt%rt~w48M=+EOy?}AlB8(oR4FXWbRt3y z&oZ@SqI|P4SjHSSmFmH&9b%lF$SlMqo{-9XFhK?X@UGjPY_G(&@}Ms2ur*d^8wr?X z3d#T;&nDnyrf}KD6YOgg<}S&c2plC=$;?(aD_|)l2b-vUooy#2W3UvNLC-Se=8RrW zaOY<1gko#D*$Gm)o!uF?m9irmv!5v?$x+zRE}Yv#tTUf7?=5l4iBOtvPM<<_36aYt zvtFCBl_c4DTzW%eRuM5Pn4aIdm_MjgFl1Wr*`?r%Z^0P7U_wxES}o^}sDSyAdffDx ze`9`@R0f|z?!nO>anpY4Zl^ABzxn2xF&Kw;7b*u8%I)D=GqP+&h1=<9p;73k)bo1&F(Y~ALUv!y7lPO133uZ+VI%SN|kS7qMma4x=5!}x42 zwlcf;Q_02TY!&6agOzN8Un#-1{2;9q6Q1(`;yNmqoa7g)DW@5P=Q){X`E!enq_>?l zE3Kr2Cn;rHa+!PhsaKMjKd>2ee5rI}$r@eFo5~fCbH1N+h35^(zA622WsY-hK4hEk zP?^bAEYkj7;bDfl&J~0-39eUi_7(A}8p}B0g#>c>;BI~+1(oWOr8UWqmlm+_=zG#t zaXqCca#@CY8j)wquW=GeOtX1QiRCvKR(`xTU5301PkN$C5=!DJRUUlPRPY|+C84UT V_Em?^R<4~dVFgtaQAmW@{{ePhBU}Ig literal 0 HcmV?d00001 diff --git a/biuletyn/nieprzeg.jpg b/biuletyn/nieprzeg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a71f515f0dc9de869d575efe0adec3f4ad7094ec GIT binary patch literal 4172 zcmc(icTm$?o5z14p@ep+N@!9-Z_fC3WQ6$Bv&hy_HNfRxZdiWDOvot29LfhYk3 z7lDLO6pYdYqy|ALp?4`tQ{lz;-PxVlnfva$`^WBc=6hz&JkOk&&z$c$^PHoPM^gZg z1=<`9fIt8MIv&8$Az*53Yhq|;ZHtt+jFG^&2L^fh`$=f3s-KpSuyqeXN~mk7sh?3p zXh}%eU~k;^3J#ahm(bBxmbm2W?;q^x<>zs{KFxmg2`~oOSXfwDnAuoaS)ouic1{5< zP7V%E7$5&{0%F3a#KnX~MJ3>>auQO?(xRgBItt3C)wQ&=PRSwkbv00`npzsaHUUAQ zP)-g`AucW<4M|Z+jsI~RwE(KK?A^!EV%JwQxg2r~;S z8 zz%^Y16zKN`Gv)$<;|__uitid_x2Bdae)BvKd_GHe}MfLF5Y70qva3!DXZ59Etu+5fMkC{j@osT5k@SdU}l7b(qoqc}Tt6OT-n zuWO(*Q!F1?raX_^CYu!?$=uv*Gi6da!>bO;)Ns;MZMy{f!OAL`8p`Xs{AK0+^mdJ! zXWZO&qN(CaxXs=QqHMJXqcg|Bf}StWH_c@0`5`~vq}S|5?aX@I_HJv>S|np4FPiWs zAEoY=u zT*>KToILQ~D`|OoqHBCzbzLeR(zYaX2S?R~$)%ODvt;>okf~2gV+FRo zNOV_!%^mA5A*RnvR+?$wE=|h}(eX^frExoY=<2N47zZpy^q_)wkM36*E=nhgU2Gi= zOS!Qu2Qw#>`-J)?uUtj;)tVG`H#k2oy8g1&R|<9#o|c$orWDU&)&U3g1gl$$Zj|FG{;S%$DA!q>Jx06MR~KIY(wcCqOnNUNq6x3em>aF8E|) z#kL+dvHj-YkGpSaX6ePVg%iew*_AVytZuPqvcHw3&Ogg0M~d0ssSjt&Ay3XH>{g8~ z-OU;gZcw54O9#5N6-_B7j%v(pN4 z)M{U8TK+an8H3rk83Bi1Ib3r_pxm-s$26VsdUXwllYQE<{eN5@^v$=!)8$cZ%tKsn zgX#m)PXkJw`$M!D5iZ-NtN})zy+)t0kxA1I@=PU%gn2a%0qOS|{Hcq`e3Q-6L-qguF-? z5lexGwgn~NX0@z^!y4ZT2OqfSKH?cxA=3h)wTjg__|Q8ksk6)oFzQj`5A8+z36h%| zSA~mpu&c`}ER7{2+4n6d>yvKhm#m(^*Bke*U5+|`1l&uuh_tJrK5}2>{^WT7`@3^S z$a^tVWo|PTas@Os4)bgu4}RrqQHzfe=!@d}Ycz6Zj)pk|Uj{m=)?fo+x1Rd-t(>fxp&E>=D4{ z^-8$L`HA`5`KXjP=RY*Z_I{3wwZ5H!kLFS^H*v|gB_L}qKC7HO?}M>=J?)}KJL3~T z{2U&+CG`-!kRDec|0Br?=;(x%#|Xa~!ID&+$1U`n3|qs4J4G?tik4aV9AETBW!WFR zQxv-I6HF5Go5XjjHtvV&HFG#pHd!9}mpj3UkniLdMJythiM>!U!!K7H(!OyBMY#~# ztJV+SlF5;^_s*|VLSc&1x_ahdRy;ytV|Y013|+*Ud9lCc4_=aVdTQ3T?&tPGjO$%t z;>yQYd=a?Y+F_T6cS+u_Hn*=OJr`)hy z@RK7zXAnzlTkd(WH!!UqI6?akwyu6y>f(gK)}Nlrv{Qo%+>QmoIKf*%i)5WM2JnsL z`W%1db%tkYu<8Aqq9s%ORJ7rj!kBL#t}ewO>7+vI=GXnoFXl1kvo$z#_)SH_D`$le ztA^sukL(FcGI{!WL|rz;dH8#mD;$C z?`Sx=Dsm@e(j+Lex*z3Rw4dvAl|YzS%3%1SOHXy*XNkE|v;b>|ZaSIOJs6WV~(8nY<94ASu9g1h{k?g6`fzzX_(FqKFHCmO{4pDg|YoWK18okw-s~i}CMNM%|dBATyvl9t%R(Z0sFKpW* zE$mlX_!>Tl!(AD3cD!a!8hhEeuT3=(aB!Sr7O*+@PbC-^Ipfc@bdWx{jt%3RB@dJ+ zmjzKcTLf*{7T|8pekRI6Z?cS~It6erF>d>~SsqgxTf&Le$0Q3uFM`6m(wzqH!-SO_ zI?5@At`!aLD7>Ph1U3v2*G}>E(BL_z{Pg11^Lo@Qc-R3SHa~L6dwfTh474efiF7lG zS9ZT=rm`o`h^{G9Z>`MXdYcGB<554kyDM`PhxcVGSN9!ERqyZXQ;fe|aCmnWnlI90 zwS*mqjbf(l$d}zIs5GX6>$8D@P@(-m=+Y0v;?Xb)?WLnum+KRZnW{8s2VcIjY>=F8 z*3olguc{3%ZovI&OIugCvcV2c2 zW3{iR4xBO_QhD{hZ1KB_`vd$%wT{Dr*a-dtkEenUH?jVHUrA~gYW~E}J*Rr<7$v62 zCv(Ii;F_n3PtpE7e$gWOqil`NcvJcUcPz^;J+?u=ILK)g|03MQmnLzq8EC7}yAyH*@CfN@3o0rG z%;&aa_@S3hI*i&<&NMdO4v8T2yvxlC!g~4aP#LKWt@Xq#(R4P*0<5K74xCoUomfGu z@(hV61$$pHt*?@ElNZH2*R}t#K1juR#m>Z`>O7#o2z^gC_;l(wtx0%W^7-d z4HmVJ*6Z51mMUU;RyB{*F>=CV)+9b)cc!JaRfOpXXt4u#zW7=0YpzFX))Tusy8RF_ zKx7quFmY|da@w+lyz9chrG?e2_>I#ib0wm(?yeZ=v#ZdWDT9gmgK`Uk1(%2G!E>W{8c zVpq1hwc{n9d}I{Tk<=`HQ1^L$?b`#y4}&NL1{e6d7wS*d%3G=Lz*HdbcDkXSGt9l! zrnZ263B`5_?emCpa>X*5=vX_-T37 zZt69^{)E4k!GmY*0>n$XXAkHjNl}^s1eXc#2Ga86%E|J0FS?+~xpJ1_mZf&N)U~T1 z!5n$($7kw(@NMaBeoWOXvE|JVh#>hZSgbg@I4WITaxNZPI__;R``=!ut-r8gEn+G) z`>=}!xf#?qH00p5ZC<Ybka%p4Ysjv4~VpEc{9{D~bjd17O?M#it%kqmH z^Ubz6C8XWYf^eJBM{Ou~e_xqf1Ft9}6)siH#||ZNOBDYLJ>`qDCp=ZARk%pk3s-kD z%xcE0smXbYUlFYOP}l;j7s^DDCuZB_JSGU&l-SrM)HoGHCsrnJf=!ZEFayI?zMnc8 zFle0FGn;K$!*PnT8B9NXHlW+*HMjPPl0X7&tZDbm#qOGS9;m1AB$LH{3Ol#U#~FYB zrT~{Gg~{u+A4IM$=c1Vhu|js^Mpkrw)jP{ff%<_onUCACN~JIK?|GX}I_>J;T|?Ge z5E+CBzaEq2yqpHdaTmvrL_$w^0O6BmnR9ghW{G%|BSdMp4J!0O8h_6tpLhhYeJkE8 zIpkw2%~c{NtZo%Upo$9!|2zaE91`7!3~(C4{2&ryk~1qTG_sNkMljBfUyuJbWgUOr O&HS@Y=l>^nH2OD%lVGv{ literal 0 HcmV?d00001 diff --git a/doc/comptble.doc b/doc/comptble.doc new file mode 100644 index 0000000000000000000000000000000000000000..e852ad712ca56f9915bacf1c9f9675249884f843 GIT binary patch literal 7756 zcmeI%e{dAl0l@KhmmiyCx$sMVm7ohMPQ}DQ1*IKoV+_=q7$l@EgTFSHO>(k#8}Bwi z(6;`nKdJ#+ZK*#xhA9QBq!wefic}r3{wT!^lR6ZG%>cEGFp4G`Cpf0x_ii`2goDvP z9OF!P=d=5E-@dnR-+TLZZ||+&7m8Ki&CL-^g>vCdHwJ{*#@@1%{XK*0E3$?7_uyvw zP=OE|giy;3EGLR*S)L@iSc;TozIcy4 zgBgz`oS5O%8cy}KR@g0c;t?z6S~Z4k#_Af)Ix7*%Gme?c{7AzXU%9mWqKYzO_W9=- zSJWCaDx0F!jy+?7uIn;c$-qh2!x0) z&(+TlX^vj4U#l1Ci`bRW!z^t*5z7Arkaa45KWkzPBND5(;t|)3g{_oSDMtOG-*bmRTFnOL~`83#8x?GaSs*LaH;38Q5}iZcy$>wqsP>wEW@zWvVM*?m)K?^L1&w3RH#m#+A#j*_-mQ17d~!w zPTXmvsRxRcS`EUv%_tGmjG6j?=v z8ZKgvQN!3`%f>h2R;?AcxFt?h8hMSXFYD^IGz_oQ z?nIME79KNl8D^}8XOn-Aoh381VrI4K6RtBb%$P=4-q&*MG)&oeVXKB`%2{mGHpWyt z%CL$^BxG&PP^-}`!c8TLQGgV$Z2jx8Vj)1sp*V%XP zo8O$Rt;yEbZpyqTmYJ}MT&rl>BkEyXR+bHnU{w-%hK z3Gr1w|K)q$7VN|u_z&K}sGtxboQl&h6IJ*jYEX;E(2A{iBSVOG9Ki>;E>nn`@d92) zPL>d3@e6FiYj_<8@Gc5?r#u;lkwv}iK_~WNHZNG`pc!kh74qHmUpU&^{eE}vA?E+? zXYSqKyO(*tH~S&6SIy#|gH7XKMjoL^H%>wa#QMf`i)` zqCg9%?E)$@xnBs{M0`V>?YF;d-+5RB*~YScn{XSN@oPMY7WnPHjqr=uj=$kmypA2% ziFWKl2M*zVbfXtX(T@!JiiWR$h)t9)TomD)nm4dJ9yG5lYTIzdFu9Q zM^6!g9~f%>5<}E{)>VN}AS-av5sD<(4i4MS9JZZ3Y+DNtO`kC=ULUrdo4TDPGW%Qf ztZcvbUY>q>VB#tU)7*vG{$2RreF@{VLpmcic3(A%Ta};ScWTc zHB5wIp|7v4wXd&l6OI#H-?l#O0qf;NAEPg-$*@kjg#PvA*Bg}>lgJcqyH1?)gOIQuoS=9(i?{+T!U(qJ_y0;*Ui4kLmwv2cwi8J44p{0UX3(9Kna^ z!N>RnefSigL3Z~bGLa4WTpy1~n2J+yD$c+xoQ-pFKIWkcOK~MkSdcB;);cg*SF@dL z`?g9MOpf=*8~gq7egxO@2<)?7KQ(0iM-atzXhajP$B*$-+=N^3Gu)0laTl7g7XCZk zV}u_^8=l5iJdc;~3U**8+OZ2AcoVy^2eKce?+C44_mDRd2M&4m|G)je=-Z2|L9hL1 z$a?R@+vvhR$anI?cn?SLA$ssJK0zNo#b@AsQp~|T%ttXwaS6(CIjXP>S3)*%>JVS) zkM`x<=0hej=MBk!$CGa_-w(=X>;mtok?~$fDTnmN!4eDJR+Dd{BY0$*D%&K6I96aa zeuA5E8-9*8xEH^|<7mUv*ox=z5?;aI(T)zhiQU+PPP~mS?85=PgM)Y%@;6^!PfyQ# z=;_&%5>)S4YBAV5MsRI@t@@_Av!?sMw>3?OT<8d4G{#~)CSVe#U@pFe3sHiFxD*vw zf*;`uT!kBOBW}U%xC?7>FV^8fJdE{t3eRF2Uc`31iXCW22X@2%E+D@N$nOEq!2ceQ z+HnTE)B3c*ht{oI_sfTd3^>Q#kgq+-Df6R&5cmDd)8AoJjsX6<$pSC>Ycn>TlP@Ou zm*lUrmNdDIc9G~$nbe1cpeX3iPY%GzuMoL8?3cB3+P8-sJ@&I?URoe0Frh0ju|CjG z)2V4JBe} imagemask + } + 65 /G41 MSTT31c1b9 AddChar +/G20 [14.0 0.0 0.0 0.0 0.0 0.0] +/G20 { +} + 32 /G20 MSTT31c1b9 AddChar +/G73 [21.0 0.0 3.0 -1.0 19.0 25.0] +/G73 { + 16 26 true [1 0 0 -1 -3.0 25.0] {<0fc41ffc387c701ce00ce00ce004f004f800fe007f007fe03ff00ffc03fe00fe007f001f801f800f +c00fe00ef01efc3cfff88fe0>} imagemask + } + 115 /G73 MSTT31c1b9 AddChar +/G68 [27.0 0.0 0.0 0.0 27.0 38.0] +/G68 { + 27 38 true [1 0 0 -1 0.0 38.0] {<038000000f8000007f800000ff8000000f8000000f8000000f8000000f8000000f8000000f800000 +0f8000000f8000000f8000000f81e0000f87f8000f9ffc000fb8fc000fe07c000fc03e000f803e00 +0f803e000f803e000f803e000f803e000f803e000f803e000f803e000f803e000f803e000f803e00 +0f803e000f803e000f803e000f803e000f803e000f803e001fc07f00fff9ffe0>} imagemask + } + 104 /G68 MSTT31c1b9 AddChar +/G6f [27.0 0.0 2.0 -1.0 25.0 25.0] +/G6f { + 23 26 true [1 0 0 -1 -2.0 25.0] {<00fe0003ff800787e00e03f01c01f03c00f83c00fc78007c78007c78007ef8003ef8003ef8003ef8 +003ef8003ef8003efc003c7c003c7c003c7e00783e00781f00701f80e00fc1c003ff8000fe00>} imagemask + } + 111 /G6f MSTT31c1b9 AddChar +/G72 [18.0 0.0 0.0 0.0 18.0 25.0] +/G72 { + 18 25 true [1 0 0 -1 0.0 25.0] {<0187800f8fc07f9fc0ffa7c00fe1800fc0000f80000f80000f80000f80000f80000f80000f80000f +80000f80000f80000f80000f80000f80000f80000f80000f80000f80001fe000fff800>} imagemask + } + 114 /G72 MSTT31c1b9 AddChar +/G74 [15.0 0.0 0.0 -1.0 15.0 32.0] +/G74 { + 15 33 true [1 0 0 -1 0.0 32.0] {<0080018001800380078007800f801f807ffefffe0f800f800f800f800f800f800f800f800f800f80 +0f800f800f800f800f800f800f800f800f820fc407fc07f801e0>} imagemask + } + 116 /G74 MSTT31c1b9 AddChar +/G63 [24.0 0.0 2.0 -1.0 22.0 25.0] +/G63 { + 20 26 true [1 0 0 -1 -2.0 25.0] {<00fc0003ff000f0f801c07c01c03e03803e07803e07001c0700000f00000f00000f00000f00000f0 +0000f80000f80010f800307c00307e00607f00603f81c03fffc01fff800fff0007fe0001f800>} imagemask + } + 99 /G63 MSTT31c1b9 AddChar +/G6d [41.0 0.0 0.0 0.0 41.0 25.0] +/G6d { + 41 25 true [1 0 0 -1 0.0 25.0] {<0381e00f80000f87f83fe0007f9ffc7ff000ffb0fce3f0000fe07f81f0000fc03f00f8000f803e00 +f8000f803e00f8000f803e00f8000f803e00f8000f803e00f8000f803e00f8000f803e00f8000f80 +3e00f8000f803e00f8000f803e00f8000f803e00f8000f803e00f8000f803e00f8000f803e00f800 +0f803e00f8000f803e00f8000f803e00f8001fc07f01fc00fff9ffe7ff80>} imagemask + } + 109 /G6d MSTT31c1b9 AddChar +/G70 [27.0 0.0 0.0 -12.0 25.0 25.0] +/G70 { + 25 37 true [1 0 0 -1 0.0 25.0] {<0183e0000f8ff8007f9ffc00ffb0fe000fe07e000fc03f000f801f000f801f000f801f800f800f80 +0f800f800f800f800f800f800f800f800f800f800f800f800f800f800f800f000f800f000f801f00 +0f801e000fc03c000fe03c000ff0f8000fbff0000f8fc0000f8000000f8000000f8000000f800000 +0f8000000f8000000f8000000f8000000f8000001fc00000fff80000>} imagemask + } + 112 /G70 MSTT31c1b9 AddChar +/G61 [24.0 0.0 2.0 -1.0 24.0 25.0] +/G61 { + 22 26 true [1 0 0 -1 -2.0 25.0] {<03fc000fff001e1f803c0f807c07c07c07c07c07c07c07c03807c0000fc0007fc001f7c007c7c00f +07c03e07c07c07c07807c0f807c0f807c0f807c0f807c0fc0fc47e37cc7fe7f83fc7f01f03c0>} imagemask + } + 97 /G61 MSTT31c1b9 AddChar +/G69 [15.0 0.0 1.0 0.0 14.0 38.0] +/G69 { + 13 38 true [1 0 0 -1 -1.0 38.0] {<07000f800f800f8007000000000000000000000000000000000003800f807f80ff800f800f800f80 +0f800f800f800f800f800f800f800f800f800f800f800f800f800f800f800f801fc0fff8>} imagemask + } + 105 /G69 MSTT31c1b9 AddChar +/G6e [27.0 0.0 0.0 0.0 27.0 25.0] +/G6e { + 27 25 true [1 0 0 -1 0.0 25.0] {<0381e0000f87f8007f9ffc00ffb8fc000fe07c000fc03e000f803e000f803e000f803e000f803e00 +0f803e000f803e000f803e000f803e000f803e000f803e000f803e000f803e000f803e000f803e00 +0f803e000f803e000f803e001fc07f00fff9ffe0>} imagemask + } + 110 /G6e MSTT31c1b9 AddChar +/G66 [18.0 0.0 1.0 0.0 23.0 38.0] +/G66 { + 22 38 true [1 0 0 -1 -1.0 38.0] {<000fc0003ff00071f800e0fc01c07c03c03c03c01803c00007c00007c00007c00007c00007c00007 +c000ffff00ffff0007c00007c00007c00007c00007c00007c00007c00007c00007c00007c00007c0 +0007c00007c00007c00007c00007c00007c00007c00007c0000fe0001ff000ffff00>} imagemask + } + 102 /G66 MSTT31c1b9 AddChar +/G62 [27.0 0.0 0.0 -1.0 25.0 38.0] +/G62 { + 25 39 true [1 0 0 -1 0.0 38.0] {<038000000f8000007f800000ff8000000f8000000f8000000f8000000f8000000f8000000f800000 +0f8000000f8000000f8000000f83e0000f8ff8000f9ffc000fb0fe000fc07e000f803f000f801f00 +0f801f000f801f800f800f800f800f800f800f800f800f800f800f800f800f800f800f800f800f00 +0f800f000f801f000f801e000f801e000f803c000fc0780007f0f00001ffc000007f0000>} imagemask + } + 98 /G62 MSTT31c1b9 AddChar +/G6a [15.0 0.0 -5.0 -12.0 11.0 38.0] +/G6a { + 16 50 true [1 0 0 -1 5.0 38.0] {<000e001f001f001f000e000000000000000000000000000000000007001f00ff01ff001f001f001f +001f001f001f001f001f001f001f001f001f001f001f001f001f001f001f001f001f001f001f001f +001f001f001e001e001e781cfc38fe307fe03f80>} imagemask + } + 106 /G6a MSTT31c1b9 AddChar +/G65 [24.0 0.0 2.0 -1.0 22.0 25.0] +/G65 { + 20 26 true [1 0 0 -1 -2.0 25.0] {<00fc0007ff000f0f801c07c03803e03801e07001f07001f07ffff0fffff0f00000f00000f00000f0 +0000f80000f80000f80000fc00107c00307e00203f00603fe3c01fffc00fff8007ff0001f800>} imagemask + } + 101 /G65 MSTT31c1b9 AddChar +/G2d [18.0 0.0 2.0 10.0 16.0 15.0] +/G2d { + 14 5 true [1 0 0 -1 -2.0 15.0] {} imagemask + } + 45 /G2d MSTT31c1b9 AddChar +/G64 [27.0 0.0 2.0 -1.0 27.0 38.0] +/G64 { + 25 39 true [1 0 0 -1 -2.0 38.0] {<000038000000f8000007f800000ff8000000f8000000f8000000f8000000f8000000f8000000f800 +0000f8000000f8000000f80000f8f80003fef8000787f8000f03f8001e01f8003c01f8003c00f800 +7c00f8007800f8007800f800f800f800f800f800f800f800f800f800f800f800f800f800f800f800 +fc00f8007c00f8007e00f8007e00f8003f01f8001fc7ff800ffeff0007fcf80001f0e000>} imagemask + } + 100 /G64 MSTT31c1b9 AddChar +/G6c [15.0 0.0 1.0 0.0 14.0 38.0] +/G6c { + 13 38 true [1 0 0 -1 -1.0 38.0] {<03800f807f80ff800f800f800f800f800f800f800f800f800f800f800f800f800f800f800f800f80 +0f800f800f800f800f800f800f800f800f800f800f800f800f800f800f800f801fc0fff8>} imagemask + } + 108 /G6c MSTT31c1b9 AddChar +/G67 [26.0 0.0 1.0 -12.0 25.0 25.0] +/G67 { + 24 37 true [1 0 0 -1 -1.0 25.0] {<00fe000387800703ff0f01ff1e01f01e00f03e00f83e00f83e00f83e00f83e00f83e00f81f00f01f +01e00f81e007c38003fe000600000c00001c00003e00003ffff03ffffc1ffffe07ffff0c000f1800 +03380003300003700002f00006f8000cfc001c7f00783fffe00fffc003fe00>} imagemask + } + 103 /G67 MSTT31c1b9 AddChar +/G75 [27.0 0.0 0.0 -1.0 27.0 24.0] +/G75 { + 27 25 true [1 0 0 -1 0.0 24.0] {} imagemask + } + 117 /G75 MSTT31c1b9 AddChar +%%EndResource + +0 0 0 fC +327 200 1053 (A short comparison of object-oriented languages) 1053 SB +32 0 0 50 50 0 0 0 46 /Palatino-Roman /font27 ANSIFont font +gs 660 82 307 286 CB +327 305 501 ( Languages ) 501 SB +gr +32 0 0 58 58 0 0 0 59 /Symbol font +gs 580 82 307 286 CB +829 292 58 (\256) 58 SB +gr +gs 580 82 307 286 CB +828 292 58 (\256) 58 SB +gr +32 0 0 50 50 0 0 0 46 /Palatino-Roman /font27 ANSIFont font +gs 660 66 307 482 CB +327 488 325 ( Comparison) 325 SB +gr +gs 660 71 307 542 CB +327 553 412 ( of main features ) 412 SB +gr +32 0 0 50 50 0 0 0 51 /Symbol font +gs 462 71 307 542 CB +739 548 30 (\257) 30 SB +gr +32 0 0 50 50 0 0 0 41 /Courier-Bold /font9 ANSIFont font +gs 112 62 973 286 CB +1013 292 30 (S) 30 SB +gr +gs 112 62 973 342 CB +1013 348 30 (i) 30 SB +gr +gs 112 62 973 398 CB +1013 404 30 (m) 30 SB +gr +gs 112 62 973 454 CB +1013 460 30 (u) 30 SB +gr +gs 112 62 973 510 CB +1013 516 30 (l) 30 SB +gr +gs 112 62 973 566 CB +1013 572 30 (a) 30 SB +gr +gs 112 62 973 622 CB +1013 628 30 (-) 30 SB +gr +gs 112 62 973 678 CB +1013 684 30 (6) 30 SB +gr +gs 112 62 973 734 CB +1013 740 30 (7) 30 SB +gr +gs 112 62 1091 286 CB +1131 292 30 (o) 30 SB +gr +gs 112 62 1091 342 CB +1131 348 30 (b) 30 SB +gr +gs 112 62 1091 398 CB +1131 404 30 (j) 30 SB +gr +gs 112 62 1091 454 CB +1131 460 30 (.) 30 SB +gr +gs 112 62 1091 510 CB +1131 516 30 (P) 30 SB +gr +gs 112 62 1091 566 CB +1131 572 30 (a) 30 SB +gr +gs 112 62 1091 622 CB +1131 628 30 (s) 30 SB +gr +gs 112 62 1091 678 CB +1131 684 30 (c) 30 SB +gr +gs 112 62 1091 734 CB +1131 740 30 (a) 30 SB +gr +gs 112 62 1091 790 CB +1131 796 30 (l) 30 SB +gr +gs 112 62 1091 846 CB +1131 852 30 (s) 30 SB +gr +gs 112 62 1209 286 CB +1249 292 30 (C) 30 SB +gr +gs 112 62 1209 342 CB +1249 348 30 (+) 30 SB +gr +gs 112 62 1209 398 CB +1249 404 30 (+) 30 SB +gr +gs 112 62 1327 286 CB +1368 292 30 (M) 30 SB +gr +gs 112 62 1327 342 CB +1368 348 30 (o) 30 SB +gr +gs 112 62 1327 398 CB +1368 404 30 (d) 30 SB +gr +gs 112 62 1327 454 CB +1368 460 30 (u) 30 SB +gr +gs 112 62 1327 510 CB +1368 516 30 (l) 30 SB +gr +gs 112 62 1327 566 CB +1368 572 30 (a) 30 SB +gr +gs 112 62 1327 622 CB +1368 628 30 (3) 30 SB +gr +gs 112 62 1445 286 CB +1486 292 30 (S) 30 SB +gr +gs 112 62 1445 342 CB +1486 348 30 (m) 30 SB +gr +gs 112 62 1445 398 CB +1486 404 30 (a) 30 SB +gr +gs 112 62 1445 454 CB +1486 460 30 (l) 30 SB +gr +gs 112 62 1445 510 CB +1486 516 30 (l) 30 SB +gr +gs 112 62 1445 566 CB +1486 572 30 (t) 30 SB +gr +gs 112 62 1445 622 CB +1486 628 30 (a) 30 SB +gr +gs 112 62 1445 678 CB +1486 684 30 (l) 30 SB +gr +gs 112 62 1445 734 CB +1486 740 30 (k) 30 SB +gr +gs 112 62 1563 286 CB +1604 292 30 (E) 30 SB +gr +gs 112 62 1563 342 CB +1604 348 30 (i) 30 SB +gr +gs 112 62 1563 398 CB +1604 404 30 (f) 30 SB +gr +gs 112 62 1563 454 CB +1604 460 30 (f) 30 SB +gr +gs 112 62 1563 510 CB +1604 516 30 (e) 30 SB +gr +gs 112 62 1563 566 CB +1604 572 30 (l) 30 SB +gr +gs 112 62 1681 286 CB +1722 292 30 (A) 30 SB +gr +gs 112 62 1681 342 CB +1722 348 30 (d) 30 SB +gr +gs 112 62 1681 398 CB +1722 404 30 (a) 30 SB +gr +gs 113 62 1799 286 CB +1840 292 30 (B) 30 SB +gr +gs 113 62 1799 342 CB +1840 348 30 (e) 30 SB +gr +gs 113 62 1799 398 CB +1840 404 30 (t) 30 SB +gr +gs 113 62 1799 454 CB +1840 460 30 (a) 30 SB +gr +gs 112 62 1918 286 CB +1958 292 30 (L) 30 SB +gr +gs 112 62 1918 342 CB +1958 348 30 (o) 30 SB +gr +gs 112 62 1918 398 CB +1958 404 30 (g) 30 SB +gr +gs 112 62 1918 454 CB +1958 460 30 (l) 30 SB +gr +gs 112 62 1918 510 CB +1958 516 30 (a) 30 SB +gr +gs 112 62 1918 566 CB +1958 572 30 (n) 30 SB +gr +gs 112 62 1918 622 CB +1958 628 30 (') 30 SB +gr +gs 112 62 1918 678 CB +1958 684 30 (8) 30 SB +gr +gs 112 62 1918 734 CB +1958 740 30 (2) 30 SB +gr +0 0 0 fC +/fm 256 def +5 5 301 286 B +1 F +n +5 5 301 286 B +1 F +n +659 5 307 286 B +1 F +n +5 5 967 286 B +1 F +n +111 5 973 286 B +1 F +n +5 5 1085 286 B +1 F +n +111 5 1091 286 B +1 F +n +5 5 1203 286 B +1 F +n +111 5 1209 286 B +1 F +n +5 5 1321 286 B +1 F +n +111 5 1327 286 B +1 F +n +5 5 1439 286 B +1 F +n +111 5 1445 286 B +1 F +n +5 5 1557 286 B +1 F +n +111 5 1563 286 B +1 F +n +5 5 1675 286 B +1 F +n +111 5 1681 286 B +1 F +n +5 5 1793 286 B +1 F +n +112 5 1799 286 B +1 F +n +5 5 1912 286 B +1 F +n +111 5 1918 286 B +1 F +n +5 5 2030 286 B +1 F +n +5 5 2030 286 B +1 F +n +5 615 301 292 B +1 F +n +5 615 967 292 B +1 F +n +5 615 1085 292 B +1 F +n +5 615 1203 292 B +1 F +n +5 615 1321 292 B +1 F +n +5 615 1439 292 B +1 F +n +5 615 1557 292 B +1 F +n +5 615 1675 292 B +1 F +n +5 615 1793 292 B +1 F +n +5 615 1912 292 B +1 F +n +5 615 2030 292 B +1 F +n +32 0 0 50 50 0 0 0 48 /Palatino-Bold /font24 ANSIFont font +gs 660 68 307 908 CB +327 914 358 (Modularisation) 358 SB +gr +5 5 301 908 B +1 F +n +659 5 307 908 B +1 F +n +5 5 967 908 B +1 F +n +111 5 973 908 B +1 F +n +5 5 1085 908 B +1 F +n +111 5 1091 908 B +1 F +n +5 5 1203 908 B +1 F +n +111 5 1209 908 B +1 F +n +5 5 1321 908 B +1 F +n +111 5 1327 908 B +1 F +n +5 5 1439 908 B +1 F +n +111 5 1445 908 B +1 F +n +5 5 1557 908 B +1 F +n +111 5 1563 908 B +1 F +n +5 5 1675 908 B +1 F +n +111 5 1681 908 B +1 F +n +5 5 1793 908 B +1 F +n +112 5 1799 908 B +1 F +n +5 5 1912 908 B +1 F +n +111 5 1918 908 B +1 F +n +5 5 2030 908 B +1 F +n +5 61 301 914 B +1 F +n +5 61 967 914 B +1 F +n +5 61 1085 914 B +1 F +n +5 61 1203 914 B +1 F +n +5 61 1321 914 B +1 F +n +5 61 1439 914 B +1 F +n +5 61 1557 914 B +1 F +n +5 61 1675 914 B +1 F +n +5 61 1793 914 B +1 F +n +5 61 1912 914 B +1 F +n +5 61 2030 914 B +1 F +n +32 0 0 50 50 0 0 0 46 /Palatino-Roman /font27 ANSIFont font +gs 660 66 307 976 CB +327 982 463 ( nesting of modules) 463 SB +gr +gs 112 66 973 976 CB +992 982 43 ( +) 43 SB +gr +gs 112 66 1091 976 CB +1110 982 43 ( +) 43 SB +gr +gs 112 66 1209 976 CB +1228 982 30 ( -) 30 SB +gr +gs 112 66 1327 976 CB +1346 982 30 ( -) 30 SB +gr +gs 112 66 1445 976 CB +1465 982 30 ( -) 30 SB +gr +gs 112 66 1563 976 CB +1583 982 30 ( -) 30 SB +gr +gs 112 66 1681 976 CB +1701 982 43 ( +) 43 SB +gr +gs 113 66 1799 976 CB +1819 982 43 ( +) 43 SB +gr +gs 112 66 1918 976 CB +1937 982 43 ( +) 43 SB +gr +5 5 301 976 B +1 F +n +659 5 307 976 B +1 F +n +5 5 967 976 B +1 F +n +111 5 973 976 B +1 F +n +5 5 1085 976 B +1 F +n +111 5 1091 976 B +1 F +n +5 5 1203 976 B +1 F +n +111 5 1209 976 B +1 F +n +5 5 1321 976 B +1 F +n +111 5 1327 976 B +1 F +n +5 5 1439 976 B +1 F +n +111 5 1445 976 B +1 F +n +5 5 1557 976 B +1 F +n +111 5 1563 976 B +1 F +n +5 5 1675 976 B +1 F +n +111 5 1681 976 B +1 F +n +5 5 1793 976 B +1 F +n +112 5 1799 976 B +1 F +n +5 5 1912 976 B +1 F +n +111 5 1918 976 B +1 F +n +5 5 2030 976 B +1 F +n +5 59 301 982 B +1 F +n +5 59 967 982 B +1 F +n +5 59 1085 982 B +1 F +n +5 59 1203 982 B +1 F +n +5 59 1321 982 B +1 F +n +5 59 1439 982 B +1 F +n +5 59 1557 982 B +1 F +n +5 59 1675 982 B +1 F +n +5 59 1793 982 B +1 F +n +5 59 1912 982 B +1 F +n +5 59 2030 982 B +1 F +n +gs 660 66 307 1042 CB +327 1048 287 ( inheritance) 287 SB +gr +gs 112 66 973 1042 CB +992 1048 43 ( +) 43 SB +gr +gs 112 66 1091 1042 CB +1110 1048 43 ( +) 43 SB +gr +gs 112 66 1209 1042 CB +1228 1048 43 ( +) 43 SB +gr +gs 112 66 1327 1042 CB +1346 1048 43 ( +) 43 SB +gr +gs 112 66 1445 1042 CB +1465 1048 43 ( +) 43 SB +gr +gs 112 66 1563 1042 CB +1583 1048 43 ( +) 43 SB +gr +gs 112 66 1681 1042 CB +1701 1048 30 ( -) 30 SB +gr +gs 113 66 1799 1042 CB +1819 1048 43 ( +) 43 SB +gr +gs 112 66 1918 1042 CB +1937 1048 43 ( +) 43 SB +gr +5 5 301 1042 B +1 F +n +659 5 307 1042 B +1 F +n +5 5 967 1042 B +1 F +n +111 5 973 1042 B +1 F +n +5 5 1085 1042 B +1 F +n +111 5 1091 1042 B +1 F +n +5 5 1203 1042 B +1 F +n +111 5 1209 1042 B +1 F +n +5 5 1321 1042 B +1 F +n +111 5 1327 1042 B +1 F +n +5 5 1439 1042 B +1 F +n +111 5 1445 1042 B +1 F +n +5 5 1557 1042 B +1 F +n +111 5 1563 1042 B +1 F +n +5 5 1675 1042 B +1 F +n +111 5 1681 1042 B +1 F +n +5 5 1793 1042 B +1 F +n +112 5 1799 1042 B +1 F +n +5 5 1912 1042 B +1 F +n +111 5 1918 1042 B +1 F +n +5 5 2030 1042 B +1 F +n +5 59 301 1048 B +1 F +n +5 59 967 1048 B +1 F +n +5 59 1085 1048 B +1 F +n +5 59 1203 1048 B +1 F +n +5 59 1321 1048 B +1 F +n +5 59 1439 1048 B +1 F +n +5 59 1557 1048 B +1 F +n +5 59 1675 1048 B +1 F +n +5 59 1793 1048 B +1 F +n +5 59 1912 1048 B +1 F +n +5 59 2030 1048 B +1 F +n +gs 660 66 307 1108 CB +327 1114 595 ( - multilevel inheritance) 595 SB +gr +gs 112 66 973 1108 CB +992 1114 30 ( -) 30 SB +gr +gs 112 66 1091 1108 CB +1110 1114 30 ( -) 30 SB +gr +gs 112 66 1209 1108 CB +1228 1114 30 ( -) 30 SB +gr +gs 112 66 1327 1108 CB +1346 1114 30 ( -) 30 SB +gr +gs 112 66 1445 1108 CB +1465 1114 30 ( -) 30 SB +gr +gs 112 66 1563 1108 CB +1583 1114 30 ( -) 30 SB +gr +gs 112 66 1681 1108 CB +1701 1114 30 ( -) 30 SB +gr +gs 113 66 1799 1108 CB +1819 1114 65 ( +?) 65 SB +gr +gs 112 66 1918 1108 CB +1937 1114 43 ( +) 43 SB +gr +5 5 301 1108 B +1 F +n +659 5 307 1108 B +1 F +n +5 5 967 1108 B +1 F +n +111 5 973 1108 B +1 F +n +5 5 1085 1108 B +1 F +n +111 5 1091 1108 B +1 F +n +5 5 1203 1108 B +1 F +n +111 5 1209 1108 B +1 F +n +5 5 1321 1108 B +1 F +n +111 5 1327 1108 B +1 F +n +5 5 1439 1108 B +1 F +n +111 5 1445 1108 B +1 F +n +5 5 1557 1108 B +1 F +n +111 5 1563 1108 B +1 F +n +5 5 1675 1108 B +1 F +n +111 5 1681 1108 B +1 F +n +5 5 1793 1108 B +1 F +n +112 5 1799 1108 B +1 F +n +5 5 1912 1108 B +1 F +n +111 5 1918 1108 B +1 F +n +5 5 2030 1108 B +1 F +n +5 59 301 1114 B +1 F +n +5 59 967 1114 B +1 F +n +5 59 1085 1114 B +1 F +n +5 59 1203 1114 B +1 F +n +5 59 1321 1114 B +1 F +n +5 59 1439 1114 B +1 F +n +5 59 1557 1114 B +1 F +n +5 59 1675 1114 B +1 F +n +5 59 1793 1114 B +1 F +n +5 59 1912 1114 B +1 F +n +5 59 2030 1114 B +1 F +n +gs 660 66 307 1174 CB +327 1180 558 ( - multiple inheritance) 558 SB +gr +gs 112 66 973 1174 CB +992 1180 30 ( -) 30 SB +gr +gs 112 66 1091 1174 CB +1110 1180 30 ( -) 30 SB +gr +gs 112 66 1209 1174 CB +1228 1180 43 ( +) 43 SB +gr +gs 112 66 1327 1174 CB +1346 1180 30 ( -) 30 SB +gr +gs 112 66 1445 1174 CB +1465 1180 43 ( +) 43 SB +gr +gs 112 66 1563 1174 CB +1583 1180 43 ( +) 43 SB +gr +gs 112 66 1681 1174 CB +1701 1180 30 ( -) 30 SB +gr +gs 113 66 1799 1174 CB +1819 1180 30 ( -) 30 SB +gr +gs 112 66 1918 1174 CB +1937 1180 43 ( +) 43 SB +gr + +%%BeginResource: font MSTT31c1d2 +/MSTT31c1d2 [33.0 0 0 0 0 0] 60 -120 [-33.0 -33.0 33.0 33.0] [1 33 div 0 0 1 33 div 0 0] /MSTT31c1d2 GreNewFont +%%EndResource + +32 0 0 33 33 0 0 1 29 /MSTT31c1d2 font + +%%BeginResource: font MSTT31c1d2 +/G31 [17.0 0.0 4.0 0.0 13.0 22.0] +/G31 { + 9 22 true [1 0 0 -1 -4.0 22.0] {<0c007c00fc001c001c001c001c001c001c001c001c001c001c001c001c001c001c001c001c001c00 +1c00ff80>} imagemask + } + 49 /G31 MSTT31c1d2 AddChar +%%EndResource + +gs 112 66 1918 1174 CB +1980 1184 17 (1) 17 SB +gr +5 5 301 1174 B +1 F +n +659 5 307 1174 B +1 F +n +5 5 967 1174 B +1 F +n +111 5 973 1174 B +1 F +n +5 5 1085 1174 B +1 F +n +111 5 1091 1174 B +1 F +n +5 5 1203 1174 B +1 F +n +111 5 1209 1174 B +1 F +n +5 5 1321 1174 B +1 F +n +111 5 1327 1174 B +1 F +n +5 5 1439 1174 B +1 F +n +111 5 1445 1174 B +1 F +n +5 5 1557 1174 B +1 F +n +111 5 1563 1174 B +1 F +n +5 5 1675 1174 B +1 F +n +111 5 1681 1174 B +1 F +n +5 5 1793 1174 B +1 F +n +112 5 1799 1174 B +1 F +n +5 5 1912 1174 B +1 F +n +111 5 1918 1174 B +1 F +n +5 5 2030 1174 B +1 F +n +5 59 301 1180 B +1 F +n +5 59 967 1180 B +1 F +n +5 59 1085 1180 B +1 F +n +5 59 1203 1180 B +1 F +n +5 59 1321 1180 B +1 F +n +5 59 1439 1180 B +1 F +n +5 59 1557 1180 B +1 F +n +5 59 1675 1180 B +1 F +n +5 59 1793 1180 B +1 F +n +5 59 1912 1180 B +1 F +n +5 59 2030 1180 B +1 F +n +32 0 0 50 50 0 0 0 46 /Palatino-Roman /font27 ANSIFont font +gs 660 66 307 1240 CB +327 1246 591 ( inherit in other modules) 591 SB +gr +32 0 0 33 33 0 0 1 29 /MSTT31c1d2 font + +%%BeginResource: font MSTT31c1d2 +/G32 [17.0 0.0 1.0 0.0 15.0 22.0] +/G32 { + 14 22 true [1 0 0 -1 -1.0 22.0] {<0f801fe03ff060f84078803880380038003000300060006000c001800180030006000c04180c3ff8 +7ff8fff8>} imagemask + } + 50 /G32 MSTT31c1d2 AddChar +%%EndResource + +gs 660 66 307 1240 CB +918 1250 17 (2) 17 SB +gr +32 0 0 50 50 0 0 0 46 /Palatino-Roman /font27 ANSIFont font +gs 112 66 973 1240 CB +992 1246 30 ( -) 30 SB +gr +gs 112 66 1091 1240 CB +1110 1246 30 ( -) 30 SB +gr +gs 112 66 1209 1240 CB +1228 1246 30 ( -) 30 SB +gr +gs 112 66 1327 1240 CB +1346 1246 30 ( -) 30 SB +gr +gs 112 66 1445 1240 CB +1465 1246 30 ( -) 30 SB +gr +gs 112 66 1563 1240 CB +1583 1246 30 ( -) 30 SB +gr +gs 112 66 1681 1240 CB +1701 1246 30 ( -) 30 SB +gr +gs 113 66 1799 1240 CB +1819 1246 43 ( +) 43 SB +gr +gs 112 66 1918 1240 CB +1937 1246 43 ( +) 43 SB +gr +5 5 301 1240 B +1 F +n +659 5 307 1240 B +1 F +n +5 5 967 1240 B +1 F +n +111 5 973 1240 B +1 F +n +5 5 1085 1240 B +1 F +n +111 5 1091 1240 B +1 F +n +5 5 1203 1240 B +1 F +n +111 5 1209 1240 B +1 F +n +5 5 1321 1240 B +1 F +n +111 5 1327 1240 B +1 F +n +5 5 1439 1240 B +1 F +n +111 5 1445 1240 B +1 F +n +5 5 1557 1240 B +1 F +n +111 5 1563 1240 B +1 F +n +5 5 1675 1240 B +1 F +n +111 5 1681 1240 B +1 F +n +5 5 1793 1240 B +1 F +n +112 5 1799 1240 B +1 F +n +5 5 1912 1240 B +1 F +n +111 5 1918 1240 B +1 F +n +5 5 2030 1240 B +1 F +n +5 59 301 1246 B +1 F +n +5 59 967 1246 B +1 F +n +5 59 1085 1246 B +1 F +n +5 59 1203 1246 B +1 F +n +5 59 1321 1246 B +1 F +n +5 59 1439 1246 B +1 F +n +5 59 1557 1246 B +1 F +n +5 59 1675 1246 B +1 F +n +5 59 1793 1246 B +1 F +n +5 59 1912 1246 B +1 F +n +5 59 2030 1246 B +1 F +n +gs 660 66 307 1306 CB +327 1312 555 ( static binding of names) 555 SB +gr +gs 112 66 973 1306 CB +992 1312 43 ( +) 43 SB +gr +gs 112 66 1091 1306 CB +1110 1312 43 ( +) 43 SB +gr +gs 112 66 1209 1306 CB +1228 1312 30 ( -) 30 SB +gr +gs 112 66 1327 1306 CB +1346 1312 43 ( +) 43 SB +gr +gs 112 66 1445 1306 CB +1465 1312 30 ( -) 30 SB +gr +gs 112 66 1563 1306 CB +1583 1312 30 ( -) 30 SB +gr +gs 112 66 1681 1306 CB +1701 1312 43 ( +) 43 SB +gr +gs 113 66 1799 1306 CB +1819 1312 43 ( +) 43 SB +gr +gs 112 66 1918 1306 CB +1937 1312 43 ( +) 43 SB +gr +5 5 301 1306 B +1 F +n +659 5 307 1306 B +1 F +n +5 5 967 1306 B +1 F +n +111 5 973 1306 B +1 F +n +5 5 1085 1306 B +1 F +n +111 5 1091 1306 B +1 F +n +5 5 1203 1306 B +1 F +n +111 5 1209 1306 B +1 F +n +5 5 1321 1306 B +1 F +n +111 5 1327 1306 B +1 F +n +5 5 1439 1306 B +1 F +n +111 5 1445 1306 B +1 F +n +5 5 1557 1306 B +1 F +n +111 5 1563 1306 B +1 F +n +5 5 1675 1306 B +1 F +n +111 5 1681 1306 B +1 F +n +5 5 1793 1306 B +1 F +n +112 5 1799 1306 B +1 F +n +5 5 1912 1306 B +1 F +n +111 5 1918 1306 B +1 F +n +5 5 2030 1306 B +1 F +n +5 59 301 1312 B +1 F +n +5 59 967 1312 B +1 F +n +5 59 1085 1312 B +1 F +n +5 59 1203 1312 B +1 F +n +5 59 1321 1312 B +1 F +n +5 59 1439 1312 B +1 F +n +5 59 1557 1312 B +1 F +n +5 59 1675 1312 B +1 F +n +5 59 1793 1312 B +1 F +n +5 59 1912 1312 B +1 F +n +5 59 2030 1312 B +1 F +n +5 5 301 1372 B +1 F +n +659 5 307 1372 B +1 F +n +5 5 967 1372 B +1 F +n +111 5 973 1372 B +1 F +n +5 5 1085 1372 B +1 F +n +111 5 1091 1372 B +1 F +n +5 5 1203 1372 B +1 F +n +111 5 1209 1372 B +1 F +n +5 5 1321 1372 B +1 F +n +111 5 1327 1372 B +1 F +n +5 5 1439 1372 B +1 F +n +111 5 1445 1372 B +1 F +n +5 5 1557 1372 B +1 F +n +111 5 1563 1372 B +1 F +n +5 5 1675 1372 B +1 F +n +111 5 1681 1372 B +1 F +n +5 5 1793 1372 B +1 F +n +112 5 1799 1372 B +1 F +n +5 5 1912 1372 B +1 F +n +111 5 1918 1372 B +1 F +n +5 5 2030 1372 B +1 F +n +5 43 301 1378 B +1 F +n +5 43 967 1378 B +1 F +n +5 43 1085 1378 B +1 F +n +5 43 1203 1378 B +1 F +n +5 43 1321 1378 B +1 F +n +5 43 1439 1378 B +1 F +n +5 43 1557 1378 B +1 F +n +5 43 1675 1378 B +1 F +n +5 43 1793 1378 B +1 F +n +5 43 1912 1378 B +1 F +n +5 43 2030 1378 B +1 F +n +32 0 0 50 50 0 0 0 48 /Palatino-Bold /font24 ANSIFont font +gs 660 68 307 1422 CB +327 1428 413 (Classes & Objects) 413 SB +gr +32 0 0 50 50 0 0 0 46 /Palatino-Roman /font27 ANSIFont font +gs 112 66 973 1422 CB +992 1428 43 ( +) 43 SB +gr +gs 112 66 1091 1422 CB +1110 1428 43 ( +) 43 SB +gr +gs 112 66 1209 1422 CB +1228 1428 43 ( +) 43 SB +gr +gs 112 66 1327 1422 CB +1346 1428 43 ( +) 43 SB +gr +gs 112 66 1445 1422 CB +1465 1428 43 ( +) 43 SB +gr +gs 112 66 1563 1422 CB +1583 1428 43 ( +) 43 SB +gr +gs 112 66 1681 1422 CB +1701 1428 30 ( -) 30 SB +gr +gs 113 66 1799 1422 CB +1819 1428 43 ( +) 43 SB +gr +gs 112 66 1918 1422 CB +1937 1428 43 ( +) 43 SB +gr +5 5 301 1422 B +1 F +n +659 5 307 1422 B +1 F +n +5 5 967 1422 B +1 F +n +111 5 973 1422 B +1 F +n +5 5 1085 1422 B +1 F +n +111 5 1091 1422 B +1 F +n +5 5 1203 1422 B +1 F +n +111 5 1209 1422 B +1 F +n +5 5 1321 1422 B +1 F +n +111 5 1327 1422 B +1 F +n +5 5 1439 1422 B +1 F +n +111 5 1445 1422 B +1 F +n +5 5 1557 1422 B +1 F +n +111 5 1563 1422 B +1 F +n +5 5 1675 1422 B +1 F +n +111 5 1681 1422 B +1 F +n +5 5 1793 1422 B +1 F +n +112 5 1799 1422 B +1 F +n +5 5 1912 1422 B +1 F +n +111 5 1918 1422 B +1 F +n +5 5 2030 1422 B +1 F +n +5 61 301 1428 B +1 F +n +5 61 967 1428 B +1 F +n +5 61 1085 1428 B +1 F +n +5 61 1203 1428 B +1 F +n +5 61 1321 1428 B +1 F +n +5 61 1439 1428 B +1 F +n +5 61 1557 1428 B +1 F +n +5 61 1675 1428 B +1 F +n +5 61 1793 1428 B +1 F +n +5 61 1912 1428 B +1 F +n +5 61 2030 1428 B +1 F +n +5 5 301 1490 B +1 F +n +659 5 307 1490 B +1 F +n +5 5 967 1490 B +1 F +n +111 5 973 1490 B +1 F +n +5 5 1085 1490 B +1 F +n +111 5 1091 1490 B +1 F +n +5 5 1203 1490 B +1 F +n +111 5 1209 1490 B +1 F +n +5 5 1321 1490 B +1 F +n +111 5 1327 1490 B +1 F +n +5 5 1439 1490 B +1 F +n +111 5 1445 1490 B +1 F +n +5 5 1557 1490 B +1 F +n +111 5 1563 1490 B +1 F +n +5 5 1675 1490 B +1 F +n +111 5 1681 1490 B +1 F +n +5 5 1793 1490 B +1 F +n +112 5 1799 1490 B +1 F +n +5 5 1912 1490 B +1 F +n +111 5 1918 1490 B +1 F +n +5 5 2030 1490 B +1 F +n +5 43 301 1496 B +1 F +n +5 43 967 1496 B +1 F +n +5 43 1085 1496 B +1 F +n +5 43 1203 1496 B +1 F +n +5 43 1321 1496 B +1 F +n +5 43 1439 1496 B +1 F +n +5 43 1557 1496 B +1 F +n +5 43 1675 1496 B +1 F +n +5 43 1793 1496 B +1 F +n +5 43 1912 1496 B +1 F +n +5 43 2030 1496 B +1 F +n +32 0 0 50 50 0 0 0 48 /Palatino-Bold /font24 ANSIFont font +gs 660 68 307 1540 CB +327 1546 254 (Coroutines) 254 SB +gr +32 0 0 50 50 0 0 0 46 /Palatino-Roman /font27 ANSIFont font +gs 112 66 973 1540 CB +992 1546 43 ( +) 43 SB +gr +gs 112 66 1091 1540 CB +1110 1546 30 ( -) 30 SB +gr +gs 112 66 1209 1540 CB +1228 1546 30 ( -) 30 SB +gr +gs 112 66 1327 1540 CB +1346 1546 43 ( +) 43 SB +gr +gs 112 66 1445 1540 CB +1465 1546 30 ( -) 30 SB +gr +gs 112 66 1563 1540 CB +1583 1546 30 ( -) 30 SB +gr +gs 112 66 1681 1540 CB +1701 1546 30 ( -) 30 SB +gr +gs 113 66 1799 1540 CB +1819 1546 43 ( +) 43 SB +gr +gs 112 66 1918 1540 CB +1937 1546 43 ( +) 43 SB +gr +5 5 301 1540 B +1 F +n +659 5 307 1540 B +1 F +n +5 5 967 1540 B +1 F +n +111 5 973 1540 B +1 F +n +5 5 1085 1540 B +1 F +n +111 5 1091 1540 B +1 F +n +5 5 1203 1540 B +1 F +n +111 5 1209 1540 B +1 F +n +5 5 1321 1540 B +1 F +n +111 5 1327 1540 B +1 F +n +5 5 1439 1540 B +1 F +n +111 5 1445 1540 B +1 F +n +5 5 1557 1540 B +1 F +n +111 5 1563 1540 B +1 F +n +5 5 1675 1540 B +1 F +n +111 5 1681 1540 B +1 F +n +5 5 1793 1540 B +1 F +n +112 5 1799 1540 B +1 F +n +5 5 1912 1540 B +1 F +n +111 5 1918 1540 B +1 F +n +5 5 2030 1540 B +1 F +n +5 61 301 1546 B +1 F +n +5 61 967 1546 B +1 F +n +5 61 1085 1546 B +1 F +n +5 61 1203 1546 B +1 F +n +5 61 1321 1546 B +1 F +n +5 61 1439 1546 B +1 F +n +5 61 1557 1546 B +1 F +n +5 61 1675 1546 B +1 F +n +5 61 1793 1546 B +1 F +n +5 61 1912 1546 B +1 F +n +5 61 2030 1546 B +1 F +n +5 5 301 1608 B +1 F +n +659 5 307 1608 B +1 F +n +5 5 967 1608 B +1 F +n +111 5 973 1608 B +1 F +n +5 5 1085 1608 B +1 F +n +111 5 1091 1608 B +1 F +n +5 5 1203 1608 B +1 F +n +111 5 1209 1608 B +1 F +n +5 5 1321 1608 B +1 F +n +111 5 1327 1608 B +1 F +n +5 5 1439 1608 B +1 F +n +111 5 1445 1608 B +1 F +n +5 5 1557 1608 B +1 F +n +111 5 1563 1608 B +1 F +n +5 5 1675 1608 B +1 F +n +111 5 1681 1608 B +1 F +n +5 5 1793 1608 B +1 F +n +112 5 1799 1608 B +1 F +n +5 5 1912 1608 B +1 F +n +111 5 1918 1608 B +1 F +n +5 5 2030 1608 B +1 F +n +5 43 301 1614 B +1 F +n +5 43 967 1614 B +1 F +n +5 43 1085 1614 B +1 F +n +5 43 1203 1614 B +1 F +n +5 43 1321 1614 B +1 F +n +5 43 1439 1614 B +1 F +n +5 43 1557 1614 B +1 F +n +5 43 1675 1614 B +1 F +n +5 43 1793 1614 B +1 F +n +5 43 1912 1614 B +1 F +n +5 43 2030 1614 B +1 F +n +32 0 0 50 50 0 0 0 48 /Palatino-Bold /font24 ANSIFont font +gs 660 68 307 1658 CB +327 1664 216 (Processes) 216 SB +gr +32 0 0 50 50 0 0 0 46 /Palatino-Roman /font27 ANSIFont font +gs 112 66 973 1658 CB +992 1664 30 ( -) 30 SB +gr +gs 112 66 1091 1658 CB +1110 1664 30 ( -) 30 SB +gr +gs 112 66 1209 1658 CB +1228 1664 30 ( -) 30 SB +gr +gs 112 66 1327 1658 CB +1346 1664 43 ( +) 43 SB +gr +gs 112 66 1445 1658 CB +1465 1664 30 ( -) 30 SB +gr +gs 112 66 1563 1658 CB +1583 1664 30 ( -) 30 SB +gr +gs 112 66 1681 1658 CB +1701 1664 43 ( +) 43 SB +gr +gs 113 66 1799 1658 CB +1819 1664 43 ( +) 43 SB +gr +gs 112 66 1918 1658 CB +1937 1664 43 ( +) 43 SB +gr +5 5 301 1658 B +1 F +n +659 5 307 1658 B +1 F +n +5 5 967 1658 B +1 F +n +111 5 973 1658 B +1 F +n +5 5 1085 1658 B +1 F +n +111 5 1091 1658 B +1 F +n +5 5 1203 1658 B +1 F +n +111 5 1209 1658 B +1 F +n +5 5 1321 1658 B +1 F +n +111 5 1327 1658 B +1 F +n +5 5 1439 1658 B +1 F +n +111 5 1445 1658 B +1 F +n +5 5 1557 1658 B +1 F +n +111 5 1563 1658 B +1 F +n +5 5 1675 1658 B +1 F +n +111 5 1681 1658 B +1 F +n +5 5 1793 1658 B +1 F +n +112 5 1799 1658 B +1 F +n +5 5 1912 1658 B +1 F +n +111 5 1918 1658 B +1 F +n +5 5 2030 1658 B +1 F +n +5 61 301 1664 B +1 F +n +5 61 967 1664 B +1 F +n +5 61 1085 1664 B +1 F +n +5 61 1203 1664 B +1 F +n +5 61 1321 1664 B +1 F +n +5 61 1439 1664 B +1 F +n +5 61 1557 1664 B +1 F +n +5 61 1675 1664 B +1 F +n +5 61 1793 1664 B +1 F +n +5 61 1912 1664 B +1 F +n +5 61 2030 1664 B +1 F +n +gs 660 66 307 1726 CB +327 1732 525 ( alien call of methods) 525 SB +gr +gs 112 66 973 1726 CB +992 1732 30 ( -) 30 SB +gr +gs 112 66 1091 1726 CB +1110 1732 30 ( -) 30 SB +gr +gs 112 66 1209 1726 CB +1228 1732 30 ( -) 30 SB +gr +gs 112 66 1327 1726 CB +1346 1732 30 ( -) 30 SB +gr +gs 112 66 1445 1726 CB +1465 1732 30 ( -) 30 SB +gr +gs 112 66 1563 1726 CB +1583 1732 30 ( -) 30 SB +gr +gs 112 66 1681 1726 CB +1701 1732 30 ( -) 30 SB +gr +gs 113 66 1799 1726 CB +1819 1732 30 ( -) 30 SB +gr +gs 112 66 1918 1726 CB +1937 1732 43 ( +) 43 SB +gr +5 5 301 1726 B +1 F +n +659 5 307 1726 B +1 F +n +5 5 967 1726 B +1 F +n +111 5 973 1726 B +1 F +n +5 5 1085 1726 B +1 F +n +111 5 1091 1726 B +1 F +n +5 5 1203 1726 B +1 F +n +111 5 1209 1726 B +1 F +n +5 5 1321 1726 B +1 F +n +111 5 1327 1726 B +1 F +n +5 5 1439 1726 B +1 F +n +111 5 1445 1726 B +1 F +n +5 5 1557 1726 B +1 F +n +111 5 1563 1726 B +1 F +n +5 5 1675 1726 B +1 F +n +111 5 1681 1726 B +1 F +n +5 5 1793 1726 B +1 F +n +112 5 1799 1726 B +1 F +n +5 5 1912 1726 B +1 F +n +111 5 1918 1726 B +1 F +n +5 5 2030 1726 B +1 F +n +5 59 301 1732 B +1 F +n +5 59 967 1732 B +1 F +n +5 59 1085 1732 B +1 F +n +5 59 1203 1732 B +1 F +n +5 59 1321 1732 B +1 F +n +5 59 1439 1732 B +1 F +n +5 59 1557 1732 B +1 F +n +5 59 1675 1732 B +1 F +n +5 59 1793 1732 B +1 F +n +5 59 1912 1732 B +1 F +n +5 59 2030 1732 B +1 F +n +5 5 301 1792 B +1 F +n +659 5 307 1792 B +1 F +n +5 5 967 1792 B +1 F +n +111 5 973 1792 B +1 F +n +5 5 1085 1792 B +1 F +n +111 5 1091 1792 B +1 F +n +5 5 1203 1792 B +1 F +n +111 5 1209 1792 B +1 F +n +5 5 1321 1792 B +1 F +n +111 5 1327 1792 B +1 F +n +5 5 1439 1792 B +1 F +n +111 5 1445 1792 B +1 F +n +5 5 1557 1792 B +1 F +n +111 5 1563 1792 B +1 F +n +5 5 1675 1792 B +1 F +n +111 5 1681 1792 B +1 F +n +5 5 1793 1792 B +1 F +n +112 5 1799 1792 B +1 F +n +5 5 1912 1792 B +1 F +n +111 5 1918 1792 B +1 F +n +5 5 2030 1792 B +1 F +n +5 43 301 1798 B +1 F +n +5 43 967 1798 B +1 F +n +5 43 1085 1798 B +1 F +n +5 43 1203 1798 B +1 F +n +5 43 1321 1798 B +1 F +n +5 43 1439 1798 B +1 F +n +5 43 1557 1798 B +1 F +n +5 43 1675 1798 B +1 F +n +5 43 1793 1798 B +1 F +n +5 43 1912 1798 B +1 F +n +5 43 2030 1798 B +1 F +n +32 0 0 50 50 0 0 0 48 /Palatino-Bold /font24 ANSIFont font +gs 660 68 307 1842 CB +327 1848 488 (Signals & Exceptions) 488 SB +gr +32 0 0 50 50 0 0 0 46 /Palatino-Roman /font27 ANSIFont font +gs 112 66 973 1842 CB +992 1848 30 ( -) 30 SB +gr +gs 112 66 1091 1842 CB +1110 1848 30 ( -) 30 SB +gr +gs 112 66 1209 1842 CB +1228 1848 30 ( -) 30 SB +gr +gs 112 66 1327 1842 CB +1346 1848 30 ( -) 30 SB +gr +gs 112 66 1445 1842 CB +1465 1848 30 ( -) 30 SB +gr +gs 112 66 1563 1842 CB +1583 1848 30 ( -) 30 SB +gr +gs 112 66 1681 1842 CB +1701 1848 43 ( +) 43 SB +gr +gs 113 66 1799 1842 CB +1819 1848 43 ( +) 43 SB +gr +gs 112 66 1918 1842 CB +1937 1848 43 ( +) 43 SB +gr +32 0 0 33 33 0 0 1 29 /MSTT31c1d2 font + +%%BeginResource: font MSTT31c1d2 +/G33 [17.0 0.0 1.0 0.0 14.0 22.0] +/G33 { + 13 22 true [1 0 0 -1 -1.0 22.0] {<0f803fe061e040f080700070006000e000c003c00fe001f000f8007800380038003800300030e060 +f0c07f00>} imagemask + } + 51 /G33 MSTT31c1d2 AddChar +%%EndResource + +gs 112 66 1918 1842 CB +1980 1852 17 (3) 17 SB +gr +5 5 301 1842 B +1 F +n +659 5 307 1842 B +1 F +n +5 5 967 1842 B +1 F +n +111 5 973 1842 B +1 F +n +5 5 1085 1842 B +1 F +n +111 5 1091 1842 B +1 F +n +5 5 1203 1842 B +1 F +n +111 5 1209 1842 B +1 F +n +5 5 1321 1842 B +1 F +n +111 5 1327 1842 B +1 F +n +5 5 1439 1842 B +1 F +n +111 5 1445 1842 B +1 F +n +5 5 1557 1842 B +1 F +n +111 5 1563 1842 B +1 F +n +5 5 1675 1842 B +1 F +n +111 5 1681 1842 B +1 F +n +5 5 1793 1842 B +1 F +n +112 5 1799 1842 B +1 F +n +5 5 1912 1842 B +1 F +n +111 5 1918 1842 B +1 F +n +5 5 2030 1842 B +1 F +n +5 61 301 1848 B +1 F +n +5 61 967 1848 B +1 F +n +5 61 1085 1848 B +1 F +n +5 61 1203 1848 B +1 F +n +5 61 1321 1848 B +1 F +n +5 61 1439 1848 B +1 F +n +5 61 1557 1848 B +1 F +n +5 61 1675 1848 B +1 F +n +5 61 1793 1848 B +1 F +n +5 61 1912 1848 B +1 F +n +5 61 2030 1848 B +1 F +n +5 5 301 1910 B +1 F +n +659 5 307 1910 B +1 F +n +5 5 967 1910 B +1 F +n +111 5 973 1910 B +1 F +n +5 5 1085 1910 B +1 F +n +111 5 1091 1910 B +1 F +n +5 5 1203 1910 B +1 F +n +111 5 1209 1910 B +1 F +n +5 5 1321 1910 B +1 F +n +111 5 1327 1910 B +1 F +n +5 5 1439 1910 B +1 F +n +111 5 1445 1910 B +1 F +n +5 5 1557 1910 B +1 F +n +111 5 1563 1910 B +1 F +n +5 5 1675 1910 B +1 F +n +111 5 1681 1910 B +1 F +n +5 5 1793 1910 B +1 F +n +112 5 1799 1910 B +1 F +n +5 5 1912 1910 B +1 F +n +111 5 1918 1910 B +1 F +n +5 5 2030 1910 B +1 F +n +5 43 301 1916 B +1 F +n +5 43 967 1916 B +1 F +n +5 43 1085 1916 B +1 F +n +5 43 1203 1916 B +1 F +n +5 43 1321 1916 B +1 F +n +5 43 1439 1916 B +1 F +n +5 43 1557 1916 B +1 F +n +5 43 1675 1916 B +1 F +n +5 43 1793 1916 B +1 F +n +5 43 1912 1916 B +1 F +n +5 43 2030 1916 B +1 F +n +32 0 0 50 50 0 0 0 48 /Palatino-Bold /font24 ANSIFont font +gs 660 68 307 1960 CB +327 1966 145 (Safety) 145 SB +gr +5 5 301 1960 B +1 F +n +659 5 307 1960 B +1 F +n +5 5 967 1960 B +1 F +n +111 5 973 1960 B +1 F +n +5 5 1085 1960 B +1 F +n +111 5 1091 1960 B +1 F +n +5 5 1203 1960 B +1 F +n +111 5 1209 1960 B +1 F +n +5 5 1321 1960 B +1 F +n +111 5 1327 1960 B +1 F +n +5 5 1439 1960 B +1 F +n +111 5 1445 1960 B +1 F +n +5 5 1557 1960 B +1 F +n +111 5 1563 1960 B +1 F +n +5 5 1675 1960 B +1 F +n +111 5 1681 1960 B +1 F +n +5 5 1793 1960 B +1 F +n +112 5 1799 1960 B +1 F +n +5 5 1912 1960 B +1 F +n +111 5 1918 1960 B +1 F +n +5 5 2030 1960 B +1 F +n +5 61 301 1966 B +1 F +n +5 61 967 1966 B +1 F +n +5 61 1085 1966 B +1 F +n +5 61 1203 1966 B +1 F +n +5 61 1321 1966 B +1 F +n +5 61 1439 1966 B +1 F +n +5 61 1557 1966 B +1 F +n +5 61 1675 1966 B +1 F +n +5 61 1793 1966 B +1 F +n +5 61 1912 1966 B +1 F +n +5 61 2030 1966 B +1 F +n +32 0 0 50 50 0 0 0 46 /Palatino-Roman /font27 ANSIFont font +gs 660 66 307 2028 CB +327 2034 449 (safe deallocation i.e.) 449 SB +gr +gs 660 68 307 2088 CB +327 2096 52 ( ) 52 SB +gr +32 0 0 50 50 0 0 0 48 /Palatino-Bold /font24 ANSIFont font +gs 660 68 307 2088 CB +379 2094 59 (no) 59 SB +gr +32 0 0 50 50 0 0 0 46 /Palatino-Roman /font27 ANSIFont font +gs 660 68 307 2088 CB +438 2096 464 ( dangling references) 464 SB +gr +gs 112 66 973 2028 CB +992 2034 30 ( -) 30 SB +gr +gs 112 66 1091 2028 CB +1110 2034 30 ( -) 30 SB +gr +gs 112 66 1209 2028 CB +1228 2034 30 ( -) 30 SB +gr +gs 112 66 1327 2028 CB +1346 2034 30 ( -) 30 SB +gr +gs 112 66 1445 2028 CB +1465 2034 30 ( -) 30 SB +gr +gs 112 66 1563 2028 CB +1583 2034 30 ( -) 30 SB +gr +gs 112 66 1681 2028 CB +1701 2034 30 ( -) 30 SB +gr +gs 113 66 1799 2028 CB +1819 2034 35 ( ?) 35 SB +gr +gs 112 66 1918 2028 CB +1937 2034 43 ( +) 43 SB +gr +5 5 301 2028 B +1 F +n +659 5 307 2028 B +1 F +n +5 5 967 2028 B +1 F +n +111 5 973 2028 B +1 F +n +5 5 1085 2028 B +1 F +n +111 5 1091 2028 B +1 F +n +5 5 1203 2028 B +1 F +n +111 5 1209 2028 B +1 F +n +5 5 1321 2028 B +1 F +n +111 5 1327 2028 B +1 F +n +5 5 1439 2028 B +1 F +n +111 5 1445 2028 B +1 F +n +5 5 1557 2028 B +1 F +n +111 5 1563 2028 B +1 F +n +5 5 1675 2028 B +1 F +n +111 5 1681 2028 B +1 F +n +5 5 1793 2028 B +1 F +n +112 5 1799 2028 B +1 F +n +5 5 1912 2028 B +1 F +n +111 5 1918 2028 B +1 F +n +5 5 2030 2028 B +1 F +n +5 121 301 2034 B +1 F +n +5 121 967 2034 B +1 F +n +5 121 1085 2034 B +1 F +n +5 121 1203 2034 B +1 F +n +5 121 1321 2034 B +1 F +n +5 121 1439 2034 B +1 F +n +5 121 1557 2034 B +1 F +n +5 121 1675 2034 B +1 F +n +5 121 1793 2034 B +1 F +n +5 121 1912 2034 B +1 F +n +5 121 2030 2034 B +1 F +n +gs 660 66 307 2156 CB +327 2162 334 ( type checking) 334 SB +gr +gs 112 66 973 2156 CB +992 2162 43 ( +) 43 SB +gr +gs 112 66 1091 2156 CB +1110 2162 43 ( +) 43 SB +gr +gs 112 66 1209 2156 CB +1228 2162 30 ( -) 30 SB +gr +gs 112 66 1327 2156 CB +1346 2162 30 ( -) 30 SB +gr +gs 112 66 1445 2156 CB +1465 2162 30 ( -) 30 SB +gr +gs 112 66 1563 2156 CB +1583 2162 30 ( -) 30 SB +gr +gs 112 66 1681 2156 CB +1701 2162 43 ( +) 43 SB +gr +gs 113 66 1799 2156 CB +1819 2162 43 ( +) 43 SB +gr +gs 112 66 1918 2156 CB +1937 2162 43 ( +) 43 SB +gr +5 5 301 2156 B +1 F +n +659 5 307 2156 B +1 F +n +5 5 967 2156 B +1 F +n +111 5 973 2156 B +1 F +n +5 5 1085 2156 B +1 F +n +111 5 1091 2156 B +1 F +n +5 5 1203 2156 B +1 F +n +111 5 1209 2156 B +1 F +n +5 5 1321 2156 B +1 F +n +111 5 1327 2156 B +1 F +n +5 5 1439 2156 B +1 F +n +111 5 1445 2156 B +1 F +n +5 5 1557 2156 B +1 F +n +111 5 1563 2156 B +1 F +n +5 5 1675 2156 B +1 F +n +111 5 1681 2156 B +1 F +n +5 5 1793 2156 B +1 F +n +112 5 1799 2156 B +1 F +n +5 5 1912 2156 B +1 F +n +111 5 1918 2156 B +1 F +n +5 5 2030 2156 B +1 F +n +5 59 301 2162 B +1 F +n +5 59 967 2162 B +1 F +n +5 59 1085 2162 B +1 F +n +5 59 1203 2162 B +1 F +n +5 59 1321 2162 B +1 F +n +5 59 1439 2162 B +1 F +n +5 59 1557 2162 B +1 F +n +5 59 1675 2162 B +1 F +n +5 59 1793 2162 B +1 F +n +5 59 1912 2162 B +1 F +n +5 59 2030 2162 B +1 F +n +gs 660 66 307 2222 CB +327 2228 493 ( protection of private) 493 SB +gr +gs 112 66 973 2222 CB +992 2228 43 ( +) 43 SB +gr +gs 112 66 1091 2222 CB +1110 2228 30 ( -) 30 SB +gr +gs 112 66 1209 2222 CB +1228 2228 30 ( -) 30 SB +gr +gs 112 66 1327 2222 CB +1346 2228 43 ( +) 43 SB +gr +gs 112 66 1445 2222 CB +1465 2228 30 ( -) 30 SB +gr +gs 112 66 1563 2222 CB +1583 2228 30 ( -) 30 SB +gr +gs 112 66 1681 2222 CB +1701 2228 43 ( +) 43 SB +gr +gs 113 66 1799 2222 CB +1819 2228 43 ( +) 43 SB +gr +gs 112 66 1918 2222 CB +1937 2228 43 ( +) 43 SB +gr +5 5 301 2222 B +1 F +n +659 5 307 2222 B +1 F +n +5 5 967 2222 B +1 F +n +111 5 973 2222 B +1 F +n +5 5 1085 2222 B +1 F +n +111 5 1091 2222 B +1 F +n +5 5 1203 2222 B +1 F +n +111 5 1209 2222 B +1 F +n +5 5 1321 2222 B +1 F +n +111 5 1327 2222 B +1 F +n +5 5 1439 2222 B +1 F +n +111 5 1445 2222 B +1 F +n +5 5 1557 2222 B +1 F +n +111 5 1563 2222 B +1 F +n +5 5 1675 2222 B +1 F +n +111 5 1681 2222 B +1 F +n +5 5 1793 2222 B +1 F +n +112 5 1799 2222 B +1 F +n +5 5 1912 2222 B +1 F +n +111 5 1918 2222 B +1 F +n +5 5 2030 2222 B +1 F +n +5 59 301 2228 B +1 F +n +5 59 967 2228 B +1 F +n +5 59 1085 2228 B +1 F +n +5 59 1203 2228 B +1 F +n +5 59 1321 2228 B +1 F +n +5 59 1439 2228 B +1 F +n +5 59 1557 2228 B +1 F +n +5 59 1675 2228 B +1 F +n +5 59 1793 2228 B +1 F +n +5 59 1912 2228 B +1 F +n +5 59 2030 2228 B +1 F +n +5 5 301 2288 B +1 F +n +659 5 307 2288 B +1 F +n +5 5 967 2288 B +1 F +n +111 5 973 2288 B +1 F +n +5 5 1085 2288 B +1 F +n +111 5 1091 2288 B +1 F +n +5 5 1203 2288 B +1 F +n +111 5 1209 2288 B +1 F +n +5 5 1321 2288 B +1 F +n +111 5 1327 2288 B +1 F +n +5 5 1439 2288 B +1 F +n +111 5 1445 2288 B +1 F +n +5 5 1557 2288 B +1 F +n +111 5 1563 2288 B +1 F +n +5 5 1675 2288 B +1 F +n +111 5 1681 2288 B +1 F +n +5 5 1793 2288 B +1 F +n +112 5 1799 2288 B +1 F +n +5 5 1912 2288 B +1 F +n +111 5 1918 2288 B +1 F +n +5 5 2030 2288 B +1 F +n +5 43 301 2294 B +1 F +n +5 43 967 2294 B +1 F +n +5 43 1085 2294 B +1 F +n +5 43 1203 2294 B +1 F +n +5 43 1321 2294 B +1 F +n +5 43 1439 2294 B +1 F +n +5 43 1557 2294 B +1 F +n +5 43 1675 2294 B +1 F +n +5 43 1793 2294 B +1 F +n +5 43 1912 2294 B +1 F +n +5 43 2030 2294 B +1 F +n +32 0 0 50 50 0 0 0 48 /Palatino-Bold /font24 ANSIFont font +gs 660 68 307 2338 CB +327 2344 614 (Genericity&Polimorphism) 614 SB +gr +5 5 301 2338 B +1 F +n +659 5 307 2338 B +1 F +n +5 5 967 2338 B +1 F +n +111 5 973 2338 B +1 F +n +5 5 1085 2338 B +1 F +n +111 5 1091 2338 B +1 F +n +5 5 1203 2338 B +1 F +n +111 5 1209 2338 B +1 F +n +5 5 1321 2338 B +1 F +n +111 5 1327 2338 B +1 F +n +5 5 1439 2338 B +1 F +n +111 5 1445 2338 B +1 F +n +5 5 1557 2338 B +1 F +n +111 5 1563 2338 B +1 F +n +5 5 1675 2338 B +1 F +n +111 5 1681 2338 B +1 F +n +5 5 1793 2338 B +1 F +n +112 5 1799 2338 B +1 F +n +5 5 1912 2338 B +1 F +n +111 5 1918 2338 B +1 F +n +5 5 2030 2338 B +1 F +n +5 61 301 2344 B +1 F +n +5 61 967 2344 B +1 F +n +5 61 1085 2344 B +1 F +n +5 61 1203 2344 B +1 F +n +5 61 1321 2344 B +1 F +n +5 61 1439 2344 B +1 F +n +5 61 1557 2344 B +1 F +n +5 61 1675 2344 B +1 F +n +5 61 1793 2344 B +1 F +n +5 61 1912 2344 B +1 F +n +5 61 2030 2344 B +1 F +n +32 0 0 50 50 0 0 0 46 /Palatino-Roman /font27 ANSIFont font +gs 660 66 307 2406 CB +327 2412 582 ( types as formal params.) 582 SB +gr +gs 112 66 973 2406 CB +992 2412 30 ( -) 30 SB +gr +gs 112 66 1091 2406 CB +1110 2412 43 ( -) 43 SB +gr +gs 112 66 1209 2406 CB +1228 2412 30 ( -) 30 SB +gr +gs 112 66 1327 2406 CB +1346 2412 30 ( -) 30 SB +gr +gs 112 66 1445 2406 CB +1465 2412 30 ( -) 30 SB +gr +gs 112 66 1563 2406 CB +1583 2412 30 ( -) 30 SB +gr +gs 112 66 1681 2406 CB +1701 2412 60 ( -+) 60 SB +gr +gs 113 66 1799 2406 CB +1819 2412 30 ( -) 30 SB +gr +gs 112 66 1918 2406 CB +1937 2412 43 ( +) 43 SB +gr +5 5 301 2406 B +1 F +n +659 5 307 2406 B +1 F +n +5 5 967 2406 B +1 F +n +111 5 973 2406 B +1 F +n +5 5 1085 2406 B +1 F +n +111 5 1091 2406 B +1 F +n +5 5 1203 2406 B +1 F +n +111 5 1209 2406 B +1 F +n +5 5 1321 2406 B +1 F +n +111 5 1327 2406 B +1 F +n +5 5 1439 2406 B +1 F +n +111 5 1445 2406 B +1 F +n +5 5 1557 2406 B +1 F +n +111 5 1563 2406 B +1 F +n +5 5 1675 2406 B +1 F +n +111 5 1681 2406 B +1 F +n +5 5 1793 2406 B +1 F +n +112 5 1799 2406 B +1 F +n +5 5 1912 2406 B +1 F +n +111 5 1918 2406 B +1 F +n +5 5 2030 2406 B +1 F +n +5 59 301 2412 B +1 F +n +5 59 967 2412 B +1 F +n +5 59 1085 2412 B +1 F +n +5 59 1203 2412 B +1 F +n +5 59 1321 2412 B +1 F +n +5 59 1439 2412 B +1 F +n +5 59 1557 2412 B +1 F +n +5 59 1675 2412 B +1 F +n +5 59 1793 2412 B +1 F +n +5 59 1912 2412 B +1 F +n +5 59 2030 2412 B +1 F +n +gs 660 66 307 2472 CB +327 2478 601 ( overloading of operators) 601 SB +gr +gs 112 66 973 2472 CB +992 2478 30 ( -) 30 SB +gr +gs 112 66 1209 2472 CB +1228 2478 43 ( +) 43 SB +gr +gs 112 66 1327 2472 CB +1346 2478 43 ( +) 43 SB +gr +gs 112 66 1445 2472 CB +1465 2478 35 ( ?) 35 SB +gr +gs 112 66 1563 2472 CB +1583 2478 43 ( +) 43 SB +gr +gs 112 66 1681 2472 CB +1701 2478 43 ( +) 43 SB +gr +gs 113 66 1799 2472 CB +1819 2478 35 ( ?) 35 SB +gr +gs 112 66 1918 2472 CB +1937 2478 30 ( -) 30 SB +gr +5 5 301 2472 B +1 F +n +659 5 307 2472 B +1 F +n +5 5 967 2472 B +1 F +n +111 5 973 2472 B +1 F +n +5 5 1085 2472 B +1 F +n +111 5 1091 2472 B +1 F +n +5 5 1203 2472 B +1 F +n +111 5 1209 2472 B +1 F +n +5 5 1321 2472 B +1 F +n +111 5 1327 2472 B +1 F +n +5 5 1439 2472 B +1 F +n +111 5 1445 2472 B +1 F +n +5 5 1557 2472 B +1 F +n +111 5 1563 2472 B +1 F +n +5 5 1675 2472 B +1 F +n +111 5 1681 2472 B +1 F +n +5 5 1793 2472 B +1 F +n +112 5 1799 2472 B +1 F +n +5 5 1912 2472 B +1 F +n +111 5 1918 2472 B +1 F +n +5 5 2030 2472 B +1 F +n +5 59 301 2478 B +1 F +n +5 59 967 2478 B +1 F +n +5 59 1085 2478 B +1 F +n +5 59 1203 2478 B +1 F +n +5 59 1321 2478 B +1 F +n +5 59 1439 2478 B +1 F +n +5 59 1557 2478 B +1 F +n +5 59 1675 2478 B +1 F +n +5 59 1793 2478 B +1 F +n +5 59 1912 2478 B +1 F +n +5 59 2030 2478 B +1 F +n +gs 660 66 307 2538 CB +327 2544 406 ( virtual methods) 406 SB +gr +gs 112 66 973 2538 CB +992 2544 30 ( -) 30 SB +gr +gs 112 66 1209 2538 CB +1228 2544 43 ( +) 43 SB +gr +gs 112 66 1445 2538 CB +1465 2544 43 ( +) 43 SB +gr +gs 112 66 1563 2538 CB +1583 2544 43 ( +) 43 SB +gr +gs 112 66 1681 2538 CB +1701 2544 30 ( -) 30 SB +gr +gs 113 66 1799 2538 CB +1819 2544 43 ( +) 43 SB +gr +gs 112 66 1918 2538 CB +1937 2544 43 ( +) 43 SB +gr +5 5 301 2538 B +1 F +n +659 5 307 2538 B +1 F +n +5 5 967 2538 B +1 F +n +111 5 973 2538 B +1 F +n +5 5 1085 2538 B +1 F +n +111 5 1091 2538 B +1 F +n +5 5 1203 2538 B +1 F +n +111 5 1209 2538 B +1 F +n +5 5 1321 2538 B +1 F +n +111 5 1327 2538 B +1 F +n +5 5 1439 2538 B +1 F +n +111 5 1445 2538 B +1 F +n +5 5 1557 2538 B +1 F +n +111 5 1563 2538 B +1 F +n +5 5 1675 2538 B +1 F +n +111 5 1681 2538 B +1 F +n +5 5 1793 2538 B +1 F +n +112 5 1799 2538 B +1 F +n +5 5 1912 2538 B +1 F +n +111 5 1918 2538 B +1 F +n +5 5 2030 2538 B +1 F +n +5 59 301 2544 B +1 F +n +5 5 301 2604 B +1 F +n +5 5 301 2604 B +1 F +n +659 5 307 2604 B +1 F +n +5 59 967 2544 B +1 F +n +5 5 967 2604 B +1 F +n +111 5 973 2604 B +1 F +n +5 59 1085 2544 B +1 F +n +5 5 1085 2604 B +1 F +n +111 5 1091 2604 B +1 F +n +5 59 1203 2544 B +1 F +n +5 5 1203 2604 B +1 F +n +111 5 1209 2604 B +1 F +n +5 59 1321 2544 B +1 F +n +5 5 1321 2604 B +1 F +n +111 5 1327 2604 B +1 F +n +5 59 1439 2544 B +1 F +n +5 5 1439 2604 B +1 F +n +111 5 1445 2604 B +1 F +n +5 59 1557 2544 B +1 F +n +5 5 1557 2604 B +1 F +n +111 5 1563 2604 B +1 F +n +5 59 1675 2544 B +1 F +n +5 5 1675 2604 B +1 F +n +111 5 1681 2604 B +1 F +n +5 59 1793 2544 B +1 F +n +5 5 1793 2604 B +1 F +n +112 5 1799 2604 B +1 F +n +5 59 1912 2544 B +1 F +n +5 5 1912 2604 B +1 F +n +111 5 1918 2604 B +1 F +n +5 59 2030 2544 B +1 F +n +5 5 2030 2604 B +1 F +n +5 5 2030 2604 B +1 F +n + +%%BeginResource: font MSTT31c1df +/MSTT31c1df [42.0 0 0 0 0 0] 47 -115 [-42.0 -42.0 42.0 42.0] [1 42 div 0 0 1 42 div 0 0] /MSTT31c1df GreNewFont +%%EndResource + +32 0 0 42 42 0 1 1 38 /MSTT31c1df font + +%%BeginResource: font MSTT31c1df +/G20 [11.0 0.0 0.0 0.0 0.0 0.0] +/G20 { +} + 32 /G20 MSTT31c1df AddChar +%%EndResource + +327 2824 220 ( ) 220 SB +547 2824 220 ( ) 220 SB +767 2824 165 ( ) 165 SB +32 0 0 33 33 0 0 1 29 /MSTT31c1d2 font +327 2868 17 (1) 17 SB +32 0 0 42 42 0 0 1 38 /MSTT31c1df font + +%%BeginResource: font MSTT31c1df +/G6d [33.0 0.0 1.0 0.0 33.0 20.0] +/G6d { + 32 20 true [1 0 0 -1 -1.0 20.0] {<061f03c03e7f8fe0fec798f01f07e0781e03c0781e03c0781e03c0781e03c0781e03c0781e03c078 +1e03c0781e03c0781e03c0781e03c0781e03c0781e03c0781e03c0781e03c0783f03e07cffcff9ff +>} imagemask + } + 109 /G6d MSTT31c1df AddChar +/G75 [21.0 0.0 0.0 -1.0 21.0 19.0] +/G75 { + 21 20 true [1 0 0 -1 0.0 19.0] {} imagemask + } + 117 /G75 MSTT31c1df AddChar +/G6c [12.0 0.0 1.0 0.0 11.0 29.0] +/G6c { + 10 29 true [1 0 0 -1 -1.0 29.0] {<06003e00fe001e001e001e001e001e001e001e001e001e001e001e001e001e001e001e001e001e00 +1e001e001e001e001e001e001e003f00ffc0>} imagemask + } + 108 /G6c MSTT31c1df AddChar +/G74 [12.0 0.0 0.0 -1.0 12.0 25.0] +/G74 { + 12 26 true [1 0 0 -1 0.0 25.0] {<0200060006000e001e003e00ffe01e001e001e001e001e001e001e001e001e001e001e001e001e00 +1e001e001e001f300fe00780>} imagemask + } + 116 /G74 MSTT31c1df AddChar +/G69 [12.0 0.0 1.0 0.0 11.0 29.0] +/G69 { + 10 29 true [1 0 0 -1 -1.0 29.0] {<0c001e001e000c000000000000000000000006003e00fe001e001e001e001e001e001e001e001e00 +1e001e001e001e001e001e001e003f00ffc0>} imagemask + } + 105 /G69 MSTT31c1df AddChar +/G70 [21.0 0.0 0.0 -9.0 20.0 20.0] +/G70 { + 20 29 true [1 0 0 -1 0.0 20.0] {<061e003e7f80feffc01e87c01f03e01e01e01e01f01e00f01e00f01e00f01e00f01e00f01e00f01e +00f01e00e01e01e01e01c01f03c01f87801eff001e7c001e00001e00001e00001e00001e00001e00 +003f0000ffc000>} imagemask + } + 112 /G70 MSTT31c1df AddChar +/G65 [18.0 0.0 1.0 -1.0 17.0 20.0] +/G65 { + 16 21 true [1 0 0 -1 -1.0 20.0] {<03e00ff81c3c301e700e600f600fffffe000e000e000e000f000f00178017c037e063ffe1ffc0ff8 +03e0>} imagemask + } + 101 /G65 MSTT31c1df AddChar +/G6e [22.0 0.0 1.0 0.0 22.0 20.0] +/G6e { + 21 20 true [1 0 0 -1 -1.0 20.0] {<061e003e7f00fec7801f07c01e03c01e03c01e03c01e03c01e03c01e03c01e03c01e03c01e03c01e +03c01e03c01e03c01e03c01e03c03f03e0ffcff8>} imagemask + } + 110 /G6e MSTT31c1df AddChar +/G68 [22.0 0.0 1.0 0.0 22.0 29.0] +/G68 { + 21 29 true [1 0 0 -1 -1.0 29.0] {<0e00007e0000fe00001e00001e00001e00001e00001e00001e00001e1e001e7f001ec7801f07801e +03c01e03c01e03c01e03c01e03c01e03c01e03c01e03c01e03c01e03c01e03c01e03c01e03c01e03 +c03f03e0ffcff8>} imagemask + } + 104 /G68 MSTT31c1df AddChar +/G72 [15.0 0.0 1.0 0.0 15.0 20.0] +/G72 { + 14 20 true [1 0 0 -1 -1.0 20.0] {<06383e7cfefc1f981f001e001e001e001e001e001e001e001e001e001e001e001e001e003f00ffc0 +>} imagemask + } + 114 /G72 MSTT31c1df AddChar +/G61 [19.0 0.0 1.0 -1.0 19.0 20.0] +/G61 { + 18 21 true [1 0 0 -1 -1.0 20.0] {<07f0001e7800383c00781e00781e00781e00301e00001e00003e0001de00071e001c1e00381e0070 +1e00f01e00f01e00f01e00f03e00787e407f9f801e0e00>} imagemask + } + 97 /G61 MSTT31c1df AddChar +/G63 [18.0 0.0 1.0 -1.0 17.0 20.0] +/G63 { + 16 21 true [1 0 0 -1 -1.0 20.0] {<01f00ffc1c1e380f300f70076000e000e000e000e000e000f000f00178037c027e0e3ffc1ffc0ff8 +03e0>} imagemask + } + 99 /G63 MSTT31c1df AddChar +/G79 [19.0 0.0 -1.0 -9.0 19.0 19.0] +/G79 { + 20 28 true [1 0 0 -1 1.0 19.0] {} imagemask + } + 121 /G79 MSTT31c1df AddChar +/G62 [20.0 0.0 -1.0 -1.0 19.0 29.0] +/G62 { + 20 30 true [1 0 0 -1 1.0 29.0] {<0600003e0000fe00001e00001e00001e00001e00001e00001e00001e1e001e7f801effc01f87c01f +03e01e01e01e01f01e00f01e00f01e00f01e00f01e00f01e00f01e00e01e00e01e01e01e01c01f03 +800f870007fe0001f800>} imagemask + } + 98 /G62 MSTT31c1df AddChar +/G6f [20.0 0.0 1.0 -1.0 19.0 20.0] +/G6f { + 18 21 true [1 0 0 -1 -1.0 20.0] {<03f0000ffc001e3e00380f00380f80700780700780f003c0f003c0f003c0f003c0f003c0f003c0f8 +03c07803807803803c07003e07001f0e000ffc0003f000>} imagemask + } + 111 /G6f MSTT31c1df AddChar +/G64 [21.0 0.0 1.0 -1.0 21.0 29.0] +/G64 { + 20 30 true [1 0 0 -1 -1.0 29.0] {<000180000f80003f8000078000078000078000078000078000078003e7800ff7801e1f801c0f8038 +0f80780780700780700780f00780f00780f00780f00780f00780f00780f807807807807c0f803e1f +803ff7f01fe7e007c700>} imagemask + } + 100 /G64 MSTT31c1df AddChar +/G66 [13.0 0.0 0.0 0.0 17.0 29.0] +/G66 { + 17 29 true [1 0 0 -1 0.0 29.0] {<007c0001ff00038f800707800703000f00000f00000f00000f00000f0000fff8000f00000f00000f +00000f00000f00000f00000f00000f00000f00000f00000f00000f00000f00000f00000f00000f00 +001f8000fff000>} imagemask + } + 102 /G66 MSTT31c1df AddChar +/G2d [14.0 0.0 2.0 8.0 13.0 12.0] +/G2d { + 11 4 true [1 0 0 -1 -2.0 12.0] {} imagemask + } + 45 /G2d MSTT31c1df AddChar +/G76 [20.0 0.0 -1.0 -1.0 20.0 19.0] +/G76 { + 21 20 true [1 0 0 -1 1.0 19.0] {} imagemask + } + 118 /G76 MSTT31c1df AddChar +/G73 [16.0 0.0 2.0 -1.0 15.0 20.0] +/G73 { + 13 21 true [1 0 0 -1 -2.0 20.0] {<0f903ff07070e030e010e010f000f8007e007f803fe00ff003f000f880788038c038c030f070ffe0 +8f80>} imagemask + } + 115 /G73 MSTT31c1df AddChar +/G2c [11.0 0.0 2.0 -7.0 8.0 3.0] +/G2c { + 6 10 true [1 0 0 -1 -2.0 3.0] {<70f8fc740404081020c0>} imagemask + } + 44 /G2c MSTT31c1df AddChar +%%EndResource + +344 2872 1396 ( multiple inheritance may be obtained from multi-level inheritance and coroutines,) 1396 SB +32 0 0 33 33 0 0 1 29 /MSTT31c1d2 font +327 2916 17 (2) 17 SB +32 0 0 42 42 0 0 1 38 /MSTT31c1df font + +%%BeginResource: font MSTT31c1df +/G67 [21.0 0.0 1.0 -9.0 21.0 20.0] +/G67 { + 20 29 true [1 0 0 -1 -1.0 20.0] {<01f800071ff00e0f001c0f803c07803c07803c07803c07803c07801e07001e0e000f1c0007f8000c +00001800001800003c00003fff801fffc00fffe01800e0300060600060600060e000c0f001807c0f +003ffe000ff000>} imagemask + } + 103 /G67 MSTT31c1df AddChar +/G6b [21.0 0.0 0.0 0.0 21.0 29.0] +/G6b { + 21 29 true [1 0 0 -1 0.0 29.0] {<0e00007e0000fe00001e00001e00001e00001e00001e00001e00001e00001e0ff01e07801e06001e +0c001e18001e30001e60001ee0001ff0001ef0001e78001e3c001e1e001e1f001e0f001e07801e03 +c03f03e0ffcff8>} imagemask + } + 107 /G6b MSTT31c1df AddChar +%%EndResource + +344 2920 1431 ( enabling to inherit a class in a procedure, a function, a process, a coroutine, a block) 1431 SB +32 0 0 33 33 0 0 1 29 /MSTT31c1d2 font +327 2964 17 (3) 17 SB +32 0 0 42 42 0 0 1 38 /MSTT31c1df font + +%%BeginResource: font MSTT31c1df +/G77 [29.0 0.0 0.0 -1.0 29.0 19.0] +/G77 { + 29 20 true [1 0 0 -1 0.0 19.0] {} imagemask + } + 119 /G77 MSTT31c1df AddChar +%%EndResource + +344 2968 674 ( with continuations and last will actions) 674 SB +1 #C +statusdict begin /manualfeed false store end +EJ RS +%%PageTrailer +%%PageResources: font Courier-Bold +%%+ font MSTT31c1b9 +%%+ font MSTT31c1d2 +%%+ font MSTT31c1df +%%+ font Palatino-Bold +%%+ font Palatino-Roman +%%+ font Symbol +%%Trailer +SVDoc restore +end +%%Pages: 1 +% TrueType font name key: +% MSTT310000 = +% MSTT310000 = +% MSTT310000 = +% MSTT310000 = +% MSTT310000 = +% MSTT310000 = +% MSTT310000 = +% MSTT310000 = +% MSTT310000 = +% MSTT31c1b9 = 2207DTimes New RomanF00000036000001900000 +% MSTT31c1c6 = 2207DCourier NewF00000032000002bc0000 +% MSTT31c1d2 = 2207DTimes New RomanF00000021000001900000 +% MSTT31c1df = 2207DTimes New RomanF0000002a000001900000 +%%DocumentSuppliedResources: procset Win35Dict 3 1 +%%+ font MSTT31c1b9 +%%+ font MSTT31c1d2 +%%+ font MSTT31c1df + +%%DocumentNeededResources: font Courier-Bold +%%+ font Palatino-Bold +%%+ font Palatino-Roman +%%+ font Symbol + +%%EOF + \ No newline at end of file diff --git a/doc/credits.doc b/doc/credits.doc new file mode 100644 index 0000000000000000000000000000000000000000..34c38828c43586d94eef8ab4433fd8150b45bcc3 GIT binary patch literal 37577 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 (ix,0) + | + | + | + V + (0,iy) + + + + 5 + + + + Procedury ustawiania trybu + + GRON(i) + + Procedura GRON ustawia monitor w graficznym trybie + pracy, czyszczac zawartosc jego ekranu, ktory jednoczesnie + staje sie buforem roboczym. Parametr i ma znaczenie jedynie + dla karty IBM w trybie 320*200: wartosc 1 wybiera normalne + kolory, wartosc 0 - kolory zmodyfikowane do pracy na + monitorach monochromatycznych. Dla kart Hercules, EGA oraz + karty IBM w trybie 640*200 wartosc parametru i jest + ignorowana. Przy przelaczaniu karty Hercules z trybu + tekstowego na graficzny i odwrotnie stosowane jest + programowo opoznienie ok. 3 sekund. Tryb karty IBM ustawiany + jest wprost, bez pomocy przerwania 10H, tak aby mozliwa byla + jednoczesna praca na monitorze kolorowym w trybie graficznym + z praca na monitorze monochromatycznym w trybie tekstowym. + Konsekwencja tego rozwiazania jest to, ze nie mozna + korzystac z komendy GRAPHICS. Natomiast tryb karty EGA jest + ustawiany wprost, za pomoca przerwania 10H. + + + + NOCARD(ple) + + Funkcja NOCARD zwraca liczbe calkowita + identyfikujaca rodzaj monitora obslugiwanego przez biezaco + uzywana biblioteke: + + 1 dla karty Hercules + 2 dla karty IBM w trybie kolor + 3 dla karty IBM w trybie mono 640*200 + 4 dla karty IBM w trybie mono 320*200 + 5 dla karty EGA + + Funkcja NOCARD moze byc wywolana dopiero po + zainicjowaniu trybu graficznego za pomoca procedury GRON. + Parametr ple jest ignorowany. + + + + GROFF + + Procedura GROFF przelacza monitor w tryb tekstowy, + wypelniajac zawartosc jego ekranu spacjami. Przed + zakonczeniem dzialania programu monitor, z ktorego byl + wywolany, nalezy zawsze ustawic z powrotem w tryb tekstowy. + + + CLS + + Procedura CLS czysci ekran, wypelniajac go kolorem + 0. Czyszczenie odbywa sie bez wylaczania ekranu. + + + 6 + + + + HPAGE(nr, tryb, zeruj) + + Procedura HPAGE ma zastosowanie jedynie dla kart + Hercules oraz EGA. Pozwala na dostep do drugiej strony + graficznej monitora. Wywolanie HPAGE wybiera strone o + numerze nr (0 lub 1), zeruje jej zawartosc, o ile parametr + zeruj ma wartosc <> 0, oraz ustawia jej tryb: + + tryb = 0 wyswietla zawartosc strony alfanumerycznie + tryb = 1 wyswietla zawartosc strony graficznie + tryb =-1 przypisuje do tej strony bufor roboczy + + + Przypisanie bufora roboczego trybem -1 nie zmienia + numeru ani sposobu wyswietlania biezacej strony. Tryb 0 + wiaze bufor roboczy z wybrana wlasnie strona. Przelaczanie + stron odbywa sie bez opoznien, o ile nie ulega zmianie tryb + wyswietlania (alfanumeryka/grafika). Poza tym, wywolanie + HPAGE(0,1,1) jest ( tylko dla karty Hercules ) rownowazne + GRON(), a HPAGE(0,0,1) - wywolaniu GROFF. + + Typowa petla animacyjna moze byc zatem rozwiazana na + przyklad tak: + + VAR NR: INTEGER; + BEGIN + GRON(0); + NR := 1; + (* NARYSUJ PIERWOTNY OBRAZ *) + DRAW(... + ... + WHILE JESZCZE DO + HPAGE(1-NR,1,0); (* WYSWIETLANIE *) + HPAGE(NR,-1,1); (* BUFOROWANIE *) + (* NARYSUJ ZMODYFIKOWANY OBRAZ *) + DRAW(... + ... + NR := 1-NR + OD + + + VIDEO(tablica) + + Procedura VIDEO przelacza bufor roboczy tak, aby + miescil sie on w tablicy podanej jako parametr jej + wywolania. + Samo wywolanie VIDEO nie zmienia zawartosci bufora. Obraz + wyswietlany na monitorze nie bedzie ulegal teraz zmianom + mimo wywolywania procedur modyfikujacych zawartosc ekranu. + Wszelkie odwolania do ekranu beda teraz dokonywane w + tablicy. Gotowy obraz moze byc przeniesiony na rzeczywisty + ekran za pomoca procedur GETMAP/PUTMAP lub zapisany binarnie + na dysku w celu pozniejszego odtworzenia. Tablica powinna + miec 16K bajtow przy wspolpracy z karta IBM i 32K bajtow + przy wspolpracy z karta Hercules. + Procedury VIDEO nie mozna stosowac dla karty EGA. + + + 7 + + + Przyklad: + + VAR BOK: ARRAY[1..32K] OF BYTE; + FRAGM: ARRAY[1..MAX] OF BYTE; + BEGIN + GRON(1); + (* NARYSUJ STRONE TYTULOWA *) + DRAW(... + ... + (* SKONSTRUUJ RYSUNEK "NA BOKU" *) + VIDEO(BOK); + DRAW(... + ... + (* ZAPAMIETAJ FRAGMENT GOTOWEGO RYSUNKU *) + MOVE(MINX,MINY); + GETMAP(MAXX,MAXY,FRAGM); + (* PRZYPISZ Z POWROTEM EKRAN DO MONITORA *) + GRON(1); (* NIESTETY, CZYSCI EKRAN *) + MOVE(MINX,MINY); + PUTMAP(FRAGM); + ... + + Uwaga: + W przypadku wywolania VIDEO(tablica(adres)), wartosc + wyrazenia adres musi byc postaci 1+k*16, gdzie k=0,1,2,... + + + + 8 + + + + Procedury sterujace kolorami + + + COLOR(kolor) + + Procedura COLOR ustawia biezacy kolor. W tym + kolorze beda odtad dokonywane zmiany zawartosci ekranu. Na + monitorach monochromatycznych kolor 0 oznacza czarny (pixel + wygaszony), kolor <> 0 oznacza bialy (pixel zapalony). + Na monitorach kolorowych, dla karty IBM color/graphics, + kolory maja nastepujace numery: + + 0 - tlo (czarny lub ustalony wywolaniem BORDER) + 1 - zielony lub turkusowy - cyan ( zaleznie od wyboru + palety) + 2 - czerwony lub purpurowy - magenta + 3 - zolty lub bialy + + Kolorem ustawionym poczatkowo jest 1. + + + Dla karty EGA kolor moze przyjmowac wartosci od 0 + do 15. Znaczenie tego parametru jest okreslone poprzez wybor + palety ( przyporzadkowanie kazdemu z 16 identyfikatorow + koloru dowolnego koloru z 64 istniejacych ), dokonywany za + pomoca procedury PALLET. + Kolorem ustawionym poczatkowo jest 7. + + + STYLE(styl) + + Procedura STYLE ustawia biezacy styl, czyli + kombinacje kolorow uzywana do rysowania odcinkow (DRAW) i + wypelniania obszarow (HFILL,VFILL). Styl wybiera jeden z + szesciu nastepujacych sposobow mieszania tla (.) i biezacego + koloru (*): + + 0 - .... + 1 - **** + 2 - ***. + 3 - **.. + 4 - *.*. + 5 - *... + + Przy rysowaniu odcinkow kolejne pixle beda mialy + kolor wyznaczony cyklicznie wzorcem stylu. Pierwszy i + ostatni pixel odcinka bedzie zawsze mial biezacy kolor. + Przy wypelnianiu, podany wzorzec dotyczy linii poziomych + (pionowych) ekranu o parzystej wspolrzednej y (x). Wzorzec + dla linii o wspolrzednych nieparzystych dobierany jest + automatycznie. + Inne sposoby mieszania, dopuszczajace uzycie wiekszej liczby + kolorow sa dostepne za pomoca procedury PATERN. + + + 9 + + + PATERN(par,par1,par2,par3) + + Procedura PATERN pozwala rysowac odcinki i + wypelniac obszary dowolna kombinacja kolorow. Przy rysowaniu + odcinkow brany jest pod uwage tylko par. Przy wypelnianiu, + par oraz par2 dotycza linii poziomych (pionowych) o + wspolrzednych y (x) parzystych, par1 oraz par3 - linii o + wspolrzednych nieparzystych ( na zmiane kolejno par/par2 + oraz par1/par3 ). Wartosci par,...,par3 przedstawione jako + czterocyfrowe liczby szesnastkowe daja wzorce mieszania + numerow kolorow. 0 oznacza tlo, inne cyfry - zob. opis + procedury COLOR. + + Przyklad: + + PATERN(#1100,#0011,#1100,#0011); + ODPOWIADA: COLOR(1); STYLE(3); + + natomiast efekt: + + PATERN(#1212,#0303,#2121,#3030); + NIE MOzE BYC UZYSKANY INACZEJ + + + BORDER(kolor) + + Procedura BORDER ustawia biezacy kolor tla. + + kolor kolor + + 0 czarny + 1 niebieski + 2 zielony + 3 turkusowy - cyan (niebiesko-zielony) + 4 czerwony + 5 karmazynowy - magenta (czerwono-niebieski) + 6 zolty + 7 jasno szary + + Kolory 8 - 15 to jasniejsze odcienie kolorow 0 - 7, przy + czym kolor bialy ma numer 15. + + Przedstawione powyzej kolory dotycza tylko karty IBM, dla + karty EGA natomiast parametr kolor moze przyjmowac wartosci + od 0 do 63. + + + PALLET(nr) + + Dla karty IBM color/graphics : + + procedura PALLET wybiera biezaca palete z dwu + mozliwych + + + nr kolory + + 0 turkusowy,karmazynowy,bialy + 1 zielony,czerwony,zolty + + + + 10 + + + Domyslna paleta jest paleta nr 0. + + Dla karty EGA natomiast procedura PALLET sluzy do + wyboru dowolnych 16 kolorow z 64 ogolnie dostepnych. + Parametr nr powinien byc postaci + kolor16 * 256 + kolor64, + gdzie + kolor16 oznacza identyfikator koloru ( uzywany + przez procedure COLOR ), mogacy przyjmowac wartosci 0 - 15, + kolor64 oznacza wybrany kolor. + + + Standardowa paleta ( przyjmowana domyslnie ) + zawiera nastepujace kolory : + + identyfikator kolor numer koloru + + 0 czarny 0 + 1 niebieski 1 + 2 zielony 2 + 3 turkusowy 3 + 4 czerwony 4 + 5 karmazynowy 5 + 6 zolty 6 + 7 bialy 7 + 8 szary 56 + 9 jasno-niebieski 57 + 10 jasno-zielony 58 + 11 jasno-turkusowy 59 + 12 jasno-czerwony 60 + 13 jasno-karmazynowy 61 + 14 jasno-zolty 62 + 15 intensywny bialy 63 + + + Wszystkie dostepne kolory mozna obejrzec oraz + poznac ich numery za pomoca programu demonstracyjnego + EGADEMO.EXE. + + Procedura PALLET nie ma zastosowania dla karty + Hercules. + + + + INTENS(i) + + Procedura INTENS wybiera intensywnosc kolorow. + Dla i rownego 0 intensywnosc jest wieksza, dla i rownego 1 + mniejsza. + Domyslnie intensywnosc jest ustawiona na poziomie 0. + + Procedura INTENS ma zastosowanie tylko dla karty IBM. + + + 11 + + + + Procedury ustawiania pozycji + + + MOVE(x,y) + + Procedura MOVE ustawia biezaca pozycje na ekranie + na pixel o wspolrzednych (x {kolumna}, y {wiersz}). + + + INXPOS(ple), INYPOS(ple) + + Funkcje calkowite INXPOS i INYPOS zwracaja + odpowiednio wspolrzedne x i y biezacej pozycji. Parametr ple + jest ignorowany. + + + PUSHXY + + Procedura PUSHXY powoduje przechowanie biezacej + pozycji, koloru i stylu na wierzcholku wewnetrznego stosu + IIUWGRAFu. Parametry te nie ulegaja przy tym zmianie. + Maksymalna glebokosc stosu wynosi 16. + + + POPXY + + Procedura POPXY odtwarza biezacy styl, kolor i + pozycje z wierzcholka wewnetrznego stosu IIUWGRAFu. + Glebokosc stosu zmniejsza sie o 1. + + + + Przyklad: + + + PROCEDURE SKOS; + VAR IX,IY:INTEGER; + BEGIN + PUSHXY; + IX := INXPOS(0); + IY := INYPOS(0); + DRAW(IX+10,IY+10); + POPXY; + END; + + + 12 + + + + TRACK(x,y) + + Procedura TRACK wyswietla na ekranie wskaznik w + ksztalcie malej (8*8 pixli) strzalki, skierowanej na punkt o + wspolrzednych (x,y). Wskaznik ten moze byc przesuwany po + ekranie za pomoca klawiszy kierunkowych. Nacisniecie + klawisza powoduje przesuniecie wskaznika o 5 pixli. + Nacisniecie odpowiedniego klawisza w trybie numerycznym + przesuwa wskaznik o 1 pixel. Klawisz "home" powoduje powrot + wskaznika do pozycji (x,y). Klawisz "End" usuwa wskaznik z + ekranu i powoduje powrot z procedury, pozostawiajac biezaca + pozycje w tym miejscu. Moze byc ona teraz odczytana za + pomoca funkcji INXPOS i INYPOS. + + + + + + + + Procedury obslugujace punkty + + + POINT(x,y) + + Procedura POINT ustawia biezaca pozycje w punkcie + (x,y) i zmienia jego kolor na biezacy. + + + INPIX(x,y) + + Funkcja INPIX ustawia biezaca pozycje w punkcie + (x,y) i zwraca jego kolor. + + + 13 + + + + Procedury rysowania linii + + + DRAW(x,y) + + Procedura DRAW rysuje odcinek od biezacej pozycji + do pozycji o wspolrzednych (x,y). Rysowanie polega na + zmianie koloru pixli nalezacych, wedlug algorytmu + Bresenhama, do odcinka. Pixle te przyjmuja nowy stan + zaleznie od biezacego koloru i stylu. + + + + CIRB(x,y,r,alfa,beta,kolb,wwyp,p,q) + + Procedura CIRB rysuje na ekranie wycinek okregu + lub elipsy, zaleznie od podanych wartosci p i q, + okreslajacych aspekt. Aspekt wyznaczony jest stosunkiem p/q. + Dla wartosci aspektu rownej 1 zostanie narysowany idealny + okrag. Srodek bedzie umieszczony w punkcie (x,y), promien + poziomy bedzie mial wielkosc r pixli, alfa i beta okreslaja, + odpowiednio kat poczatkowy i koncowy rysowanego wycinka. Dla + alfa = beta zostanie narysowany pelny okrag (lub elipsa). + Wartosci alfa i beta sa wyrazane w radianach, w zwyklym + ukladzie. Brzeg wycinka i jego promienie zostana narysowane + kolorem kolb, niezaleznie od stylu. Jesli wwyp <> 0, wnetrze + wycinka zostanie wypelnione biezacym kolorem i stylem. + + + HFILL(x) + + Procedura HFILL rysuje, w biezacym kolorze i stylu, + odcinek poziomy od biezacej pozycji do punktu o + wspolrzednych + + (x,inypos(0)) + + OSTROZNIE: HFILL nie zmienia biezacej pozycji. + + Uzycie HFILL jest zalecane przy wypelnianiu + obszarow, gdyz dziala znacznie szybciej niz odpowiedni DRAW. + Rowniez mieszajac kolory w danym stylu, HFILL, w + przeciwienstwie do DRAW nie bierze pod uwage poczatkowego + punktu odcinka, co pozwala na uzyskanie substytutu + dodatkowych kolorow. + + + + + 14 + + + VFILL(y) + + + Procedura VFILL rysuje, w biezacym kolorze i stylu, + odcinek pionowy od biezacej pozycji do punktu o + wspolrzednych + + (inxpos(0),y) + + OSTROZNIE: VFILL nie zmienia biezacej pozycji. + + + 15 + + + + Procedury operujace na fragmentach ekranu + + + GETMAP(x,y,tablica) + + Procedura GETMAP zapamietuje prostokatny obszar + ekranu pomiedzy biezaca pozycja jako lewym gornym rogiem a + punktem (x,y) jako prawym dolnym rogiem w tablicy. GETMAP + nie zmienia przy tym biezacej pozycji. Tablica powinna miec + co najmniej 4 + w*sufit(k/8)*kol bajtow, gdzie w i k sa, + odpowiednio, liczba wierszy i kolumn zapamietywanego + obszaru, natomiast wartosc wspolczynnika kol zalezy od + rodzaju karty graficznej i wynosi 1 dla karty Hercules, + 2 dla karty IBM oraz 4 dla karty EGA. + + Przyklad: zapamietanie obszaru 101*101 polozonego w lewym + gornym rogu ekranu. + + VAR OKNO: ARRAY[1..700] OF INTEGER; + + ... + MOVE(0,0); + GETMAP(100,100,OKNO); + ... + + + + PUTMAP(tablica) + + Procedura PUTMAP ustawia prostokatny obszar ekranu + o lewym gornym rogu znajdujacym sie w biezacej pozycji + zgodnie z zawartoscia tablicy, w ktorej uprzednio + zapamietano fragment ekranu za pomoca procedury GETMAP. + Biezaca pozycja nie ulega zmianie. Odtworzeniu podlega caly + zapamietany obszar, ktory jest kopiowany w nowe miejsce. + + + ORMAP(tablica) + + Procedura ORMAP dziala podobnie jak PUTMAP, lecz o + nowej zawartosci ekranu decyduje wynik zastosowania funkcji + or do elementow tablicy i ekranu. + + + XORMAP(tablica) + + Procedura XORMAP dziala podobnie jak PUTMAP, lecz o + nowej zawartosci ekranu decyduje wynik zastosowania funkcji + xor do elementow tablicy i ekranu. + + + 16 + + + + Procedury wejscia/wyjscia dla pojedynczych znakow + + + INKEY(ple) + + Funkcja calkowita INKEY podaje i usuwa nastepny + znak z bufora klawiatury. Czytanie odbywa sie bez echa. + Jesli bufor jest pusty, wynikiem jest 0. Klawisze specjalne + kodowane sa jako liczby ujemne wedlug zalaczonej tablicy. + Metoda ALT-NUM moze byc uzyta do wprowadzenia z klawiatury + kodow powyzej 127 jako zwyklych znakow. Uniemozliwia to, + niestety, korzystanie ze znakow specjalnych o kodach od 128 + do 132. + + Przyklad: zaczekaj na klawisz End. + + PROCEDURE WAIT_FOR_END; + BEGIN + WHILE INKEY(0)<>-79 DO; + END; + + Wartosci kodow klawiszy specjalnych podane sa w Dodatku F. + + + HASCII(kod) + + Procedura HASCII rysuje na ekranie znak + alfanumeryczny. Znak wpisany jest w raster 8*8. Gorny lewy + rog rastra umieszczony bedzie w biezacej pozycji, ktora + jednoczesnie przesunie sie o 8 pixli w prawo. Uzyta funkcja + rysujaca jest xor. Kroj znakow pobierany jest z tablicy + znajdujacej sie w ROM BIOS standardowo pod adresem + F000:FA6E. W przypadku niestandardowego ROM BIOSu obraz + znaku alfanumerycznego bedzie zly. Uzycie procedur HFONT i + HFONT8 pozwala uniezaleznic sie od wersji BIOSu a takze + korzystac z innych, rowniez wlasnorecznie zaprojektowanych + krojow znakow. Kod znaku 0 powoduje tylko wyczyszczenie + miejsca przeznaczonego na znak, bez zmiany biezacej pozycji. + Wszystkie kody maja tylko interpretacje graficzna, bez + funkcji sterujacych (NL, CR etc.). + + Przyklad: napisanie slowa "oh" na gwarantowanie czystym tle. + + + HASCII(0); HASCII('o'); HASCII(0); HASCII('h'); + + Uwaga: + Parametr procedury HASCII moze byc typu integer lub + znakowego ( character w Fortranie, char w Pascalu i C ). + + + + 17 + + + + HFONT(segment,offset) + + Wywolanie procedury HFONT przelacza adres wzorca + znakow alfanumerycznych na segment:offset. Bez uzycia HFONT + uzywa sie adresu F000:FA6E. + + + HFONT8(segment,offset) + + Uzycie procedury HFONT8 dolacza do programu + uzytkowego kopie tablicy kroju znakow z ROM BIOS i zwraca + adres tej kopii jako segment:offset (parametry wyjsciowe). + + + + + 18 + + + + Procedury wejscia/wyjscia dla linii + + + OUTHLINE(dlugosc,bufor) + + Procedura OUTHLINE wywoluje HASCII dlugosc razy, + wypisujac na ekran znaki, ktorych kody zawarte sa w buforze. + Przed narysowaniem kazdego znaku wywolywane jest HASCII(0). + + + INHLINE(dlugosc,bufor) + + Procedura INHLINE wczytuje z klawiatury linie + zlozona z co najwyzej dlugosci znakow i umieszcza je w + buforze. Do wczytywania uzyta jest procedura INKEY. + Wyswietlane jest echo. Migajacy wskaznik oznacza oczekiwanie + na nacisniecie klawisza. Klawisz BACKSPACE dziala tak, jak + mozna tego oczekiwac. Linia moze byc zakonczona klawiszem CR + albo wyczerpaniem jej dlugosci. Znak CR konczacy linie nie + jest umieszczany w buforze. Przed rozpoczeciem czytania + bufor jest wypelniany spacjami. Po zakonczeniu czytania + parametr dlugosc zwraca liczbe wczytanych znakow. + Migajacy wskaznik jest zawsze rysowany kolorem numer 1, + wyswietlane znaki natomiast biezacym kolorem. + + + Przyklad: echo wczytanej linii. + + VAR LINIA: ARRAY[1:40] OF INTEGER; + N: INTEGER; + BEGIN + N:=80; + INHLINE(N,LINIA); + IF N=0 THEN MOVE(INXPOS(0),INYPOS(0)+10) + ELSE OUTHLINE(N,LINIA); + ... + + + + + 19 + + + + Procedury wejscia/wyjscia dla okienek + + + MKWNDW(x,y,kolumn,wierszy,okienko,rozmiar,ramka) + + Procedura MKWNDW urzadza na ekranie prostokatne + okienko do konwersacji. Lewy gorny rog okienka znajdzie sie + w punkcie (x,y). Zmiesci ono zadana liczbe kolumn i wierszy + tekstu alfanumerycznego. Opis okienka bedzie przechowany w + dostarczonej przez uzytkownika tablicy okienko. Parametr + rozmiar jest na razie ignorowany, a tablica powinna miec co + najmniej 20 bajtow, lub duzo wiecej, jesli okienko ma byc + zaslaniane i odslaniane ( patrz opis procedury BURY ). Jesli + parametr ramka ma wartosc rozna od 0, obszar okienka bedzie + obwiedziony ramka, co uczyni je nieco wiekszym. + + + BURY(okienko) + + Wywolanie BURY usuwa okienko z ekranu, przechowujac + jego obraz w dalszej czesci tablicy okienko tak, aby moc + odtworzyc je pozniej za pomoca EXPOSE. Tablica okienko musi + miec odpowiednia wielkosc, aby GETMAP obszaru okienka + pozostawilo w niej jeszcze co najmniej 20 bajtow. + + + EXPOSE(okienko,x,y) + + Wywolanie EXPOSE odtwarza okienko przechowane za + pomoca BURY umieszczajac jego gorny lewy rog w punkcie + (x,y). + + + OUTWLINE(okienko,dlugosc,bufor) + + Procedura OUTWLINE dziala podobnie jak OUTHLINE, + wyswietlajac linie w ramach podanego okienka. Bufor o + dlugosci wiekszej niz rozmiar okienka wyswietli sie w kilku + liniach. + + + INWLINE(okienko,dlugosc,bufor) + + Procedura INWLINE, podobnie jak INHLINE, wczytuje z + klawiatury linie tekstu. W przypadku INWLINE okienko + wskazuje na obszar ekranu, w ktorym ma pojawiac sie echo. + Jesli dlugosc bufora jest wieksza niz rozmiar okienka echo + moze zajac w nim kilka linii. Poprawianie wprowadzanego + tekstu przy uzyciu BACKSPACE jest mozliwe tylko w ostatniej + czesci linii. Dlugosc jako parametr wyjsciowy zwraca liczbe + wczytanych znakow, bez konczacego CR. + + + 20 + + + + Procedury poziomu 2 + + + Procedury te operuja wspolrzednymi wyrazonymi + liczbami rzeczywistymi odnoszacymi sie do abstrakcyjnego + okna o dowolnych rozmiarach. + + + + Definiowanie okna + + + SWINDOW(rxy,ixy,skalowanie) + + Procedura SWINDOW urzadza na ekranie prostokatne + okno umieszczone pomiedzy punktami naroznikowymi podanymi w + tablicy ixy jako calkowite wspolrzedne prawdziwych pixli. + Program uzytkowy tworzacy rysunek w tym obszarze bedzie + okreslal polozenie punktow w sposob abstrakcyjny we + wspolrzednych rzeczywistych. Tablica rxy podaje zakresy tych + wspolrzednych. Jesli parametr skalowanie ma wartosc 0, + abstrakcyjny prostokat bedzie po prostu odwzorowany na + wskazana czesc ekranu bez zachowania proporcji miedzy + skalowaniem w pionie i w poziomie. Jesli natomiast parametr + skalowanie bedzie rozny od zera, wykorzystana zostanie + jedynie srodkowa czesc obszaru ekranu tak, aby zachowac + rzeczywiste proporcje rysunku, niezaleznie od aspektu danego + monitora. + Odwzorowanie stosowane przez IIUWGRAF odwraca tez kierunek + wzrastania wspolrzednej y do naturalnego ukladu: + + + (ixy(1),ixy(3)) + / + (rxy(1),rxy(4)) + ^ + | + | + | + | (ixy(1),ixy(4)) (ixy(2),ixy(4)) + | / / + (rxy(1),rxy(3))--------------------->(rxy(2),rxy(3)) + + + Przyklad: przygotowanie rysunku sinusoidy w gornej polowie + ekranu Herculesa. + + + VAR RW:ARRAY [1:4] OF REAL INIT (0.,6.29,-1.,1.); + IW:ARRAY [1:4] OF INTEGER INIT (0,719,0,173); + BEGIN + SWINDOW(RW,IW,0); + + + + 21 + + + RWINDOW(rxy,skalowanie) + + Procedura RWINDOW jest skrotem wywolania SWINDOW + dla odwzorowania obejmujacego caly ekran. + + + + RINXPOS(ple),RINYPOS(ple) + + Funkcje rzeczywiste RINXPOS i RINYPOS zwracaja, + odpowiednio wspolrzedne x i y biezacej pozycji w + abstrakcyjnym oknie urzadzonym przez ostatnie wywolanie + RWINDOW lub SWINDOW. Biezaca pozycja jest zawsze zaokraglana + do najblizszego pixla. + + + + RMOVE(rx,ry) + + Wywolanie procedury RMOVE ustawia biezaca pozycje w + punkcie (rx,ry) w ostatnio urzadzonym oknie. Pozycja ta jest + zaokraglona do najblizszego pixla. + + + + RDRAW(rx,ry) + + Wywolanie procedury RDRAW powoduje narysowanie w + biezacym kolorze i stylu odcinka od biezacej pozycji do + pixla najblizszego punktowi (rx,ry) w ostatnio urzadzonym + oknie. + + + + RCIRB(rx,ry,rr,alfa,beta,kolb,wwyp,p,q) + + Procedura RCIRB odpowiada procedurze CIRB z poziomu + 1, z tym, ze wspolrzedne srodka (rx,ry) i promien rr + wyrazane sa, jako liczby rzeczywiste, w oknie urzadzonym + przez ostatnie wywolanie RWINDOW lub SWINDOW. Pozostale + parametry maja znaczenie takie, jak w CIRB. + + + 22 + + + + Informacje dodatkowe + + + Pakiet IIUWGRAF zawiera dodatkowo dwa programy + HGCPRINT.EXE oraz MGCPRINT.EXE. Umozliwiaja one drukowanie + tworzonych obrazow graficznych na powszechnie dostepnych + drukarkach ( np. typu STAR GEMINI, EPSON ). W przypadku + uzywania karty Hercules nalezy stosowac program HGCPRINT, a + dla karty IBM color/graphics program MGCPRINT. + + Programow tych powinno uzywac sie w nastepujacy + sposob : + przed zaladowaniem wlasnego programu nalezy wykonac + program HGCPRINT lub MGCPRINT, w zaleznosci od rodzaju + uzywanej karty graficznej. Kazdy z tych programow ustawia + znaczenie klawisza PrtSc. Kazdorazowe pozniejsze nacisniecie + klawisza PrtSc powoduje wydrukowanie graficznej zawartosci + ekranu. + + Uwaga. W przypadku karty Hercules drukowana jest + zawartosc pierwszej strony graficznej, niezaleznie od tego, + ktora strona jest aktualnie wyswietlana. + W przypadku karty IBM color/graphics klawisz PrtSc + zaklada, ze jest ustawiony tryb kolor 320*200. Wydruk obrazu + graficznego utworzonego w trybie mono 640*200 jest mozliwe + poprzez uzycie procedury PRTSCR. + + Mozliwosc drukowania obrazu graficznego nie + istnieje dla karty EGA. + + Autorem programow HGCPRINT oraz MGCPRINT jest + Krzysztof Studzinski. + + + + + Procedury dodatkowe + + + PRTSCR(nr) + + Procedura PRTSCR umozliwia drukowanie obrazow + graficznych tworzonych na ekranie monitora pod kontrola + programu. Parametr nr okresla numer strony graficznej + (0 lub 1), ktorej zawartosc ma byc wydrukowana. + + Wywolanie procedury PRTSCR z parametrem nr rownym + zeru jest rownowazne nacisnieciu klawisza PrtSc. + + W celu poprawnego dzialania tej procedury nalezy, + analogicznie jak w przypadku klawisza PrtSc, uprzednio + wykonac dolaczony program : + - HGCPRINT.EXE w przypadku uzywania karty + Hercules lub + - MGCPRINT.EXE dla karty IBM. + + Procedura PRTSCR nie dziala dla karty EGA. + + + + + 23 + + + + + DODATEK A + + Uzycie IIUWGRAFu z FORTRANem 77. + + + 1) Procedury IN?LINE i OUT?LINE dokonuja jedynie + transmisji tekstu, bez zadnej konwersji pomiedzy postacia + binarna i tekstowa. Aby takiej konwersji dokonac, mozna + posluzyc sie instrukcjami formatowanego wejscia/wyjscia + w polaczeniu z tzw. plikami wewnetrznymi (internal file). + + Przyklad: + + + INTEGER*2 I,J,SUM,W(10) + CHARACTER*20 LINE + CHARACTER LINEL(20) + EQUIVALENCE (LINE,LINEL(1)) + + ... + CALL MKWNDW(10,10,21,4,W,20,1) + CALL OUTWLINE(W,20,'PODAJ 2 LICZBY (2I3)') + CALL INWLINE(W,20,LINEL) + READ (LINE,'(2I3)') I,J + SUM=I+J + WRITE (LINE,'(8H SUMA = I4)') SUM + CALL OUTWLINE(W,12,LINEL) + + + 24 + + + + + + DODATEK B + + Uzycie IIUWGRAFu z PASCALem. + + + 1) Microsoft Pascal dopuszcza jedynie 6 znakow w nazwie + podprogramu, zatem nazwy: INHLIN(E), INWLIN(E), OUTHLI(NE), + OUTWLI(NE), RWINDO(W), SWINDO(W), RINXPO(S), RINYPO(S) musza + byc uzywane w skroconej postaci. + + 2) Niektore procedury IIUWGRAFu sa napisane w FORTRANie. + Przy linkowaniu LINK moze domagac sie dostarczenia + biblioteki FORTRAN.LIB. Zadanie to nalezy zignorowac. + + 3) Do linkowania nalezy uzywac LINK w wersji co najmniej + 3.04, do kompilacji Pascal w wersji co najmniej 3.31. + + + 25 + + + + + DODATEK C + + Uzycie IIUWGRAFu z Lattice C. + + + 1) Nalezy unikac konfliktow z nazwami globalnych zmiennych + roboczych IIUWGRAFu. Zmienne te maja nazwy rozpoczynajace + sie od liter WIR... i PQASP... + + 2) W przypadku procedur majacych parametry wyjsciowe ( w + dodatku E sa one zaznaczone jako vars ) nalezy przy ich + wywolaniu przekazywac adres odpowiedniego parametru + aktualnego. + + Przyklad: + + + CHAR LENGTH; + CHAR *TEXT; + ... + INHLINE(&LENGTH,TEXT) + + + + 3) Adresy parametrow aktualnych nalezy przekazywac rowniez + w przypadku parametrow bedacych tablicami znakowymi. + + + Przyklad: + + + INT LENGTH; + CHAR *TEXT; /* LUB NP. CHAR TEXT[40]; */ + ... + OUTHLINE(LENGTH, &TEXT[3]); + /* WYPISZ ZNAKI Z TABLICY 'TEXT', ROZPOCZYNAJAC OD + CZWARTEGO */ + + + + 26 + + + + + DODATEK D + + Uzycie IIUWGRAFu z LOGLANem. + + + 1) W biezacej wersji LOGLANu dostepnych jest jedynie 7 + podstawowych procedur: GRON, GROFF, MOVE, DRAW, HASCII, + HPAGE, INKEY obslugujacych wylacznie karte Hercules. + + 2) System okienek do konwersacji nie bedzie w LOGLANie + dostepny w postaci procedur standardowych. Podobnie okienka + o wspolrzednych rzeczywistych. + + 3) Niektore podprogramy dostepne jako funkcje standardowe + LOGLANu musza miec zmienione specyfikacje parametrow w + stosunku do oryginalnego IIUWGRAFu: + + IIUWGRAF LOGLAN + + GETMAP GETMAP:function:array of ? + INKEY INKEY:integer function; (* bez parametrow *) + INXPOS INXPOS:integer function;(* bez parametrow *) + INYPOS INYPOS:integer function;(* bez parametrow *) + + + + 27 + + + + + DODATEK E + + Wykaz specyfikacji procedur IIUWGRAFu. + + + proc BORDER(consts b: integer); + L proc BURY(window: buffer); + proc CIRB(consts ix,iy,ir: integer; + consts alfa, beta: real; + consts cbord, bcint, p, q: integer); + proc CLS; + proc COLOR(consts c: integer); + proc DRAW(consts ix,iy: integer); + L proc EXPOSE(window: buffer; consts x,y: integer); + L proc GETMAP(consts x,y: integer; ekran: buffer); + L proc GROFF; + proc GRON(consts imode: integer); + proc HASCII(consts ic: integer); + proc HFILL(consts maxx: integer); + proc HFONT(consts seg, offs: integer); + proc HFONT8(vars seg, offs: integer); + proc HPAGE(consts page, mode, clear: integer); + P proc INHLINE(vars n:integer; line: tekst); + L func INKEY(consts idummy: integer): integer; + func INPIX(consts x,y: integer): integer; + proc INTENS(consts i: integer); + PL proc INWLINE(window: buffer; vars n: integer; + line: tekst); + L func INXPOS(consts idummy: integer): integer; + L func INYPOS(consts idummy: integer): integer; + L proc MKWNDW(consts x,y,icols,ilines: integer; + window: buffer; + consts iwndwsize,iborder: integer); + proc MOVE(consts ix,iy: integer); + L func NOCARD(consts idummy: integer): integer; + proc ORMAP(ekran: buffer); + PL proc OUTHLINE(consts n:integer; line: tekst); + PL proc OUTWLINE(window: buffer; consts n: integer; + line: tekst); + proc PALLET(consts p: integer); + proc PATERN(consts p1, p2, p3, p4: integer); + proc POINT(consts ix,iy: integer); + proc POPXY; + proc PRTSCR(consts nr: integer); + proc PUSHXY; + proc PUTMAP(ekran: buffer); + L proc RCIRB(consts ix,iy,ir: real; + consts alfa, beta: real; + consts cbord, bcint, p, q: integer); + L proc RDRAW(consts rx,ry: real); + PL func RINXPOS(consts dummy: real): real; + PL func RINYPOS(consts dummy: real): real; + L proc RMOVE(consts rx,ry: real); + PL proc RWINDOW(rw: array [1:4] of real; + consts s: integer); + proc STYLE(consts s: integer); + + + 28 + + + PL proc SWINDOW(rw: array [1:4] of real; + iw: array [1:4] of integer; + consts s: integer); + proc TRACK(consts x,y: integer); + proc VFILL(consts maxy: integer); + proc VIDEO(ekran: buffer); + proc XORMAP(ekran: buffer); + + Uzyto notacji semi-pascalowej. + Specyfikacja consts oznacza parametr przekazywany przez + wartosc (tylko wejsciowy), vars - przez zmienna (wejsciowo- + wyjsciowy). + Typ buffer oznacza tablice bajtowa sluzaca do przechowania + zawartosci okreslonego obszaru ekranu ( rozmiar jej zalezy + od wielkosci tego obszaru ), typ tekst natomiast oznacza + tablice znakowa. + Litery w pierwszej kolumnie sugeruja dodatkowe wazne + informacje (roznice) w kontekscie konkretnych jezykow + (Fortran, Pascal, C, Loglan). + + + 29 + + + + DODATEK F + + Wartosci kodow klawiszy specjalnych: + + + 3 - ctrl-2 + 15 - back tab (shift-tab) + 16-25 - ALT-Q az do ALT-P + 30-38 - ALT-A az do ALT-L + 44-50 - ALT-Z az do ALT-M + 59-68 - F1 az do F10 + 71 - Home + 72 - Cursor-Up + 73 - PgUp + 75 - Cursor-Left + 77 - Cursor-Right + 79 - End + 80 - Cursor-Down + 81 - PgDn + 82 - Ins + 83 - Del + 84-93 - Shift-F1 az do Shift-F10 + 94-103 - Ctrl-F1 az do Ctrl-F10 + 104-113 - Alt-F1 az do Alt-F10 + 114 - Ctrl-PrtSc + 115 - Ctrl-Cursor-Left + 116 - Ctrl-Cursor-Right + 117 - Ctrl-End + 118 - Ctrl-PgDn + 119 - Ctrl-Home + 120-131 - Alt-1 az do Alt-= + 132 - Ctrl-PgUp + + + 30 + + + + + DODATEK G + + FEDIT + + Prosty program do edycji kroju znakow. + Dodatek do biblioteki graficznej IIUWGRAF. + + FEDIT pozwala komponowac i modyfikowac uklady pixli o + wymiarze 8*8. Takie uklady moga byc wyswietlane razem z + grafika za pomoca procedury HASCII. + + FEDIT produkuje opisy tablic kroju znakow w dwoch + postaciach: + + - jako podprogram dostarczajacy adres tablicy kroju + w postaci odpowiedniej do przekazania procedurze HFONT, + + - jako niezalezny program umieszczajacy wskaznik do + tablicy kroju w wektorze przerwania 14H. + + Pierwszy format moze byc uzyty do zastapienia standardowego + zestawu znakow zwykle znajdujacego sie w ROM BIOS pod + adresem F000:FA6E. Jest on uzywany przez procedure HASCII do + rysowania znakow o kodach od 0 do 127. Stad jego nazwa : + "format 0". + + Podprogram wygenerowany przez FEDIT ma nazwe HFONT8. Po + przetlumaczeniu przez MACROASSEMBLER musi byc on linkowany + razem z programem uzytkowym. Jesli zajdzie potrzeba zmiany + nazwy (np. w celu dynamicznego przelaczania pomiedzy kilkoma + krojami znakow), nazwa moze byc zmieniona recznie w tekscie + zrodlowym. + + Drugi format jest uzywany do rysowania znakow z + rozszerzonego zakresu znakow o kodach od 128 do 255. Stad + nazwa: + "format 128". + + Opis zestawu znakow w tym formacie musi byc zaladowany do + pamieci przed rozpoczeciem wykonania programu, ktory z niego + korzysta. Wskaznik do tablicy kroju musi byc wpisany w + wektor przerwania 14H. Robi to program wygenerowany przez + FEDIT, ktory nastepnie zawiesza sie za pomoca przerwania 27H + (terminate but stay resident). W tym przypadku tekst + zrodlowy po przetlumaczeniu przez MACROASSEMBLER musi byc + zlinkowany (bez zadnych bibliotek) do postaci .EXE. + IIUWGRAF i FEDIT nie daja mozliwosci dynamicznego + przelaczania tablic znakow rozszerzonego zakresu. + + + + 31 + + + Przyklad: + + VAR ISEG, IOFFS: INTEGER; + BEGIN + HFONT8(ISEG,IOFFS); (* ADRES TABLICY FORMATU 0 *) + ... + HASCII(45); (* UZYWA ROM BIOS *) + HASCII(145); (* UZYWA ROZSZERZONEGO ZESTAWU *) + ... + HFONT(ISEG,IOFFS); + HASCII(45); (* UZYWA TABLICY FORMATU 0 *) + HASCII(145); (* TEN SAM ROZSZERZONY ZESTAW *) + ... + HFONT(16#F000,16#FA6E); + HASCII(45); (* ZNOWU ROM BIOS *) + HASCII(145); (* TEN SAM ROZSZERZONY ZESTAW *) + + + FEDIT jest prostym programem konwersacyjnym o kilku + zaledwie rozkazach. Tablica kroju znakow zawiera wzorce + ukladow pixli rozmiaru 8*8. Wzorzec pojedynczego znaku moze + byc wyjety z tej tablicy w celu jego edycji i zapamietany z + powrotem, byc moze w innym miejscu tablicy. Sa dwie tablice + znakow: jedna dla kodow od 0 do 127, druga dla kodow od 128 + do 255. Pierwsza z nich nie moze byc modyfikowana. Druga z + nich moze poczatkowo zawierac zaladowany wczesniej + rozszerzony zestaw lub zostac wyczyszczona. Mozna tez + wczytac do niej zestaw zawarty w pliku wygenerowanym + wczesniej przez FEDIT. Po dokonaniu modyfikacji, zawartosc + tej drugiej tablicy moze byc uzyta do generacji badz + "formatu 0" badz "128". + + + Rozkazy FEDITu. + + + Rozkazy FEDITu sa wprowadzane jako pojedyncze litery + wybierajace czynnosci wymienione w jadlospisie wyswietlonym + u gory ekranu. Dodatkowe parametry podaje sie po + przynagleniu przez FEDIT. + + Komendy FEDITu: + + < low odswieza tablice "0 do 127" + + > high odswieza tablice "128 do 255" + + i init inicjalizuje zerami tablice "128 do 255" + + l load laduje tablice "128 do 255" z pliku + dodatkowy parametr: + - nazwa pliku (musi istniec) + + + 32 + + + + d dump wypisuje zawartosc tablicy "128 do 255" + na plik; dodatkowe parametry: + - nazwa pliku (bedzie zapisany) + - baza ( 0 albo 128), + zaleznie od formatu + - jezyk: + f - MS Fortran, MS Pascal + s - Lattice C, model S + p - Lattice C, model P + d - Lattice C, model D + l - Lattice C, model L + + e edit wyjmuje z tablicy pojedynczy znak + i umieszcza go w obszarze roboczym. + dodatkowy parametr: + - kod znaku (dziesietnie) + Po obszarze roboczym mozna poruszac sie + za pomoca klawiszy kierunkowych. Pixel + zapala klawisz Ins, gasi klawisz Del. + Klawisz End powoduje wyjscie z tego trybu. + + t text wyswietla tekst pomocny przy ocenie + jakosci ksztaltu znakow. Tekst, nie dluzszy + niz 40 znakow jest wprowadzany przez uzytkow- + nika. Dodatkowe parametry: + - vspace, + - hspace - odpowiednio, pionowy i poziomy + odstep w pixlach pomiedzy znakami. Normalnie, + vspace wynosi 2, hspace - 0. + + p put przechowuje wzorzec z obszaru roboczego pod + wskazanym kodem. Dodatkowy parametr: + - kod pozycji (dziesietnie), + powinien byc miedzy 128 a 255 + + q quit konczy dzialanie FEDIT + + + Z FEDITem nalezy obchodzic sie ostroznie. Posiada on jedynie + minimalne wbudowane zabezpieczenia i np. bez ostrzezenia + zapisze nowa, nie wykonczona jeszcze wersje kroju znakow na + pliku zawierajacym jedyny egzemplarz poprzedniej, bardzo + potrzebnej wersji. + + + 33 + + + + DODATEK H + + Zmiany IIUWGRAFu w stosunku do poprzednich wersji + + + + Zmiany IIUWGRAFu w stosunku do wersji 1.1 + + + 1) Rozszerzenie zestawu obslugiwanych kart graficznych o + karte EGA ( IBM Enhanced Graphics Adapter ). + + 2) Niewielkie modyfikacje procedur IIUWGRAFu : + + - dodanie procedury PRTSCR, + - modyfikacja procedury PATERN polegajaca na : + zwiekszeniu liczby parametrow ( wzorcow ) z + dwoch do czterech oraz + zmianie postaci tych parametrow ( zamiast + liczb dziesietnych liczby szesnastkowe ), + ( rozszerzenie wzorcow oczywiscie oznacza rownoczesnie + modyfikacje procedur HFILL oraz VFILL ), + - zmiany nazw procedur GRAPH, TEXT, SCREEN + odpowiednio na GRON, GROFF, NOCARD. + + + + + Zmiany IIUWGRAFu w stosunku do wersji 2.1 + + + 1) Udostepnienie procedur CIRB oraz RCIRB dla C. + \ No newline at end of file diff --git a/doc/iuwgraf.doc b/doc/iuwgraf.doc new file mode 100644 index 0000000000000000000000000000000000000000..62164bdad51ffd98d0006417ce2ba067fc619373 GIT binary patch literal 24880 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 literal 0 HcmV?d00001 diff --git a/doc/iuwgraf.txt b/doc/iuwgraf.txt new file mode 100644 index 0000000..9df2ca7 --- /dev/null +++ b/doc/iuwgraf.txt @@ -0,0 +1,423 @@ + +unit IIUWGRAPH: class; + +{ this predefined class enables basic graphic operations } + +{ the early versions of library IIUWGRAPH have been elaborated by + Piotr Carlsson, Miroslawa Milkowska, Janina Jankowska, + Michal Jankowski at Institute of Informatics, + University of Warsaw 1987, + and added to Loglan system by Danuta Szczepanska 1987, + the recent versions were done at LITA, Pau, + by + Pawel Susicki (1991) for Unix + Sebastien Bernard (1992) for ATARI + + +fait à Pau, le {TIME \@ "d MMMM, yyyy"|6 August, 1993} A.S.} + +{ the predefined class IIUWGRAPH is included in all versions of interpreter of Loglan, with the exception of the present version of interpreter for VAX/VMS. + Each interpreter is equipped with one version of graphic library which corresponds to one of the following possibilities: +- EGA card, (use egaint if you have a VGA card) + +- Hercules mono card, + +- IBM CGA card + several variants are offered + CGA colour, + CGA mono 320 x 200 + CGA mono 640 x 200 + all above versions were tested in DOS 3.3 environment + +- an emulation of Hercules in a Xwindow for UNIX environment, + +- an emulation of IIUWGRAPH in ATARI STE environment. + +NEW (october 1993) +MM. Becourt et Larrieu did a multiwindow graphic co-process for the int Loglan interpreter in Unix & Xwindows environment. See the separate document on it. + +M. Larrieu did an experimental version of vgaint Loglan executor for the machines 386/486. } + +hidden MaxX, MaxY, current_X, current_Y, is_graphic_On, + current_Colour, current_Background_Colour, current_Style, + current_Palette, current_Pattern ; + + + { Hercules EGA/VGA CGA + Unix } + +const MaxX = 719 ; { 639 319 } + MaxY = 347 ; { 349 199 } + +{ the screen's coordinates are + + (0,0) ----------------------> (MaxX,0) + ¦ + ¦ + ¦ + V + (0, MaxY) (MaxX,MaxY) + +} + + +var currentDriver : integer, { see NOCARD below } + current_X, current_Y: integer { it is the current position } + is_graphic_On: Boolean, { evidently tells whether we are in graphics mode } + current_Colour : integer, { } + current_Background_Colour : integer, + current_Style : integer, { } + current_Palette : integer, + current_Pattern + +unit GRON : procedure (i: integer); + { procedure sets the monitor in graphic mode and clears the buffer of screen. The parameter is meaningless, the only exception is made for the IBM CGA card in this case if you have chosen the mode 320x200 pixels the the value 1 of the parameter means colours, the value 0 means a mono screen is connected to the card + } + +unit GROFF : procedure; + { the procedure sets the monitor in the text mode filling it with spaces. + DO NOT FORGET to set the monitor in the text mode before you terminate your program + } + +unit NOCARD : function : integer; + { the value given by this function determines the type of the currently used monitor and it is equal to + 1 for Hercules mono card, + 2 for IBM CGA color + 3 for IBM CGA mono 320 x 200 + 4 for IBM CGA mono 640 x 200 + 5 for EGA/VGA card + ?? 6 for ATARI STE + ?? 7 for Unix versions equipped with XWindows + You can not call the function nocard before GRON sets the graphic mode + } + +unit CLS : procedure; + { the screen will be cleared and filled with colour 0 } + +unit HPAGE : procedure(nr, : integer, clear : boolean); + { the procedure is applicable to the cards EGA/VGA and Hercules only! + it selects a page of video memory with the number = nr, + clears its contents if clear is set <>0, + and sets the mode + mode = 0 the content of the page is shown as text, + mode = 1 the content of the page is shown graphically, + mode = -1 a worktime buffer is associated with the page. + Mode -1 does not change the number not the way it is shown. Mode 0 links the buffer with the selected page. For card Hercules only call HPAGE(0, 1, 1) is equivalent to call GRON(99) and call HPAGE(0, 0, 1) is equivalent to call GROFF. + +Example of an animating loop + +var nr: integer; +begin + call GRON(0); + nr := 1; + (* draw first image *) + call DRAW(...) + ... + while more + do + call HPAGE(1-nr, 1,0); (* displaying *) + call HPAGE(nr, -1,1); (* buffering *) + (* draw modified image *) + call DRAW( ...) + ... + nr := 1-nr + od +end example + + +unit VIDEO : procedure( A: array of integer); + { this procedure can not be applied for the EGA/VGA card } + { the worktime buffer will be associated with the array A. + A call of VIDEO does not change the contents of the buffer. + All subsequent calls of the procedures modifying the screen will + concern the array A. The screen does not change. + A ready image can be moved to the screen with the help of GETMAP/PUTMAP procedures or it can be stored on disk. + The array should have 16 kBytes for IBM CGA card or + 32 kBytes for Hercules card.} + +{ PROCEDURES CONTROLLING THE COLOURS } + +unit COLOR : procedure(co : integer); +{ sets current color to co + for monochrome displays, 0 means black, non-0 - white + for color displays, 0 means background + see PALLET +} + + +unit STYLE : procedure(styl : integer); +{ sets style of lines and fill shades to a combination + of current color and background color (for mono - + white and black, respectively) according to 5 predefined + patterns: + + 0 .... + 1 **** + 2 ***. + 3 **.. + 4 *.*. + 5 *... + + where '*' means current color, '.' background colour +When drawing the segments the subsequent pixels will have colour determined by cyclic application of style pattern. The first and the last pixels of a segment will have always current colour. +When filling contours the given style will be applied to horizontal lines with even coordinate. The style for odd lines is determined automatically. +The same applies for perpendicular lines. +There are other possibilities of mixing colours, cf procedure PATERN. +} + + +unit PATERN : procedure (par, par1, par2, par3 : integer); + { sets style of lines and fill shades to an explicitly specified + combination of colours. When drawing lines the only parameter of importance will be par. When filling the parameters par and par2 concern the horiwontal (resp. perpendicular) lines with the coordinate x (resp: y) even. lines + combination of colors : "iv" for even scan lines, "io" for odd. + Color encoding is decimal, allowing 4 pixels. + Lines are drawn always according to "iv". + + Examples: + + call patern(1100,0011) + is equivalent to + call color(1), call style(3) + + + call patern(1212,2121) + produces a shade that cannot be otherwise achieved + ( a dotted line consisting of pixels in colors 1 and 2 ) + + + +unit BORDER : procedure (background_Colour: integer); + [ IBM color mode only ] + + sets actual background color to i ( i = 0,1,...,15 ) + + +unit PALLET : procedure (nr : integer); + { + +the codes of colors are as follows + 0 black + 1 blue dark + 2 green dark + 3 turquoise dark + 4 red dark + 5 violet + 6 brown + 7 grey light + 8 grey dark + 9 blue + 10 green + 11 turquoise + 12 red light + 13 rose + 14 yellow + 15 white + + the procedure does not applies for Hercules card} + + +unit INTENS : procedure (i : integer); + +{ changes current intensity, 1 means more intensity, 0 less; + default intensity is 1 + Applies to IBM CGA only +} + +{ PROCEDURES CONTROLLING POSITION } + +unit MOVE : procedure (x,y :integer); + { procedure MOVE sets the current position on the screen on the pixel with coordinates + x - column, + y - line } + { precondition of MOVE: + 0{SYMBOL 163 \f "Symbol"}x{SYMBOL 163 \f "Symbol"}MaxX & 0{SYMBOL 163 \f "Symbol"}y{SYMBOL 163 \f "Symbol"}MaxY + } + +unit INXPOS : function: integer; + { function INXPOS returns the x coordinate of the current position } + + +unit INYPOS : function : integer; + { function INYPOS returns the y coordinate of the current position } + + +unit PUSHXY : procedure; +{ pushes current position, color & style onto the stack. + The stack is kept internally, max depth is 16 +} + + +unit POPXY: procedure; + +{ restores position, color & style from internal stack } + +{ Example +unit DIAGONAL : procedure; + var ix, iy : integer; +begin + call PUSHXY; + ix := INXPOS; + iy := INYPOS; + call DRAW(ix+10, iy+10); + call POPXY +end DIAGONAL; +} + + +unit TRACK : procedure (x,y : integer); +{ displays a small (8*8) arrow-shaped cursor which can be moved around with cursor keys; a single keystroke moves + it by 5 pixels, in NUM mode step size is 1 pixel; + "home" key returns the cursor to the initial (x,y); + "end" removes cursor from screen, and returns - the new current + position can be read with "INXPOS" and "INYPOS" above. + +ATTENTION: if you have a mouse then read on the predefined class Mouse, which permits to control the mouse +} + +{ PROCEDURES SERVING POINTS } + +unit POINT : procedure(x,y: integer); +{ moves current position to pixel (x,y) and sets it to current color + } + +unit INPIX : function (x,y : integer) : integer; + { + moves to pixel (x,y) and returns its color setting; + } + + +unit DRAW : procedure( x,y : integer); + { + draws a line from current screen position to (x,y); + sets current position to (x,y); + line is drawn in current color, with both terminal pixels + always turned white ( non-background) for non-black + ( non-background ) line color. + Bresenham's algorithm is used, pixels belonging to the segment change their state depending on current colour and style. + } + +unit CIRB : procedure (xi, yi, ri : integer, alfa, beta : real, + cbord, fill, p, q : integer); + + { + draws a circle (or ellipse, depending on aspect value, see below), + optionally filling its interior; + does not preserve position; + (xi,yi) - are center coordinates + ri - radius in pixels (horizontally) + alfa, beta - starting & ending angles; if alfa=beta a full + circle is drawn; values should be given in radians; + cbord - border color, + fill - if fill <>0, interior is filled in current style&color + p,q - aspect ratio; if p/q=1, a perfect circle is drawn, + if p/q<1, the horizontal axis is longer, + if p/q>1 - the vertical axis is longer; + } + +unit HFILL : procedure(x: integer); + +{ fills current row (horizontally) from current position + (INXPOS, INYPOS) up to (x,INYPOS) with bit pattern depending + on current color, style and/or pattern and position on + the screen in such a way that adjacent "hfill"ed" rows + will produce a shade simulating color; + + ATTENTION hfill does not change current position; + +It is advised to use hfill when filling contours since it works faster then DRAW. Procedure hfill is capable to similate additional colours. +} + +unit VFILL : procedure(y: integer); + +{ fills current column ( vertically ) from current + position (INXPOS, INYPOS) up to (INXPOS, y) in a similiar way + that "hfill" does; + rectangular area "vfill'ed" is not distinguishable + on the screen from same shape "hfill'ed", except that + it will take much longer to fill. + + ATTENTION hfill does not change current position; + +{ Procedures operating on bitmaps } + +unit GETMAP : function (x,y : integer) : arrayof integer; + {saves rectangular area between current position as + top left corner and (ix,iy) as bottom right corner, + including border lines; + position remains unchanged. + array of integer should have + 4+(rows{SYMBOL 215 \f "Symbol"}{SYMBOL 233 \f "Symbol"}columns/8{SYMBOL 249 \f "Symbol"} {SYMBOL 215 \f "Symbol"}coeff) + bytes. The coefficient coeff is 1 for Hercules, 2 for CGA, 4 for EGA card. + ATTENTION: in DOS environment the size of the array may necessitate the use of loglan with the option H+, see also memavail + } + + +unit PUTMAP : procedure ( a: array of integer); + {sets rectangular area of screen pixels to that saved + by "getmap" in "iarray"; + same size is restored, with top left corner in current + position; + position remains unchanged. + } +unit ORMAP : procedure ( a : arrayof integer); + {same as putmap, but saved bitmap is or'ed into screen + rather than just set. + } + +unit XORMAP : procedure ( a: arrayof integer); + {same as putmap, but saved bitmap is xor'ed into screen + rather than just set. + } + +unit INKEY : function : integer; + + {returns next character from keyboard buffer; + 0 is returned if buffer is empty; + special keys are returned as negative numbers; + ALT-NUM method may be used for entering character codes + above 127 (this makes entering special keys 128-132 + impossible); + if a character is returned, it is also removed + from the buffer, so MS-DOS will not see it (CTRL-C!); + typeahead is allowed, echo is suppressed. + } + +unit HASCII : procedure + {'xor's the character in a 8*8 box with top left corner + in the current position; + moves current position by (8,0); + character code 0 sets complete box to black ( background ), + with no change in position. + BIOS ROM font for IBM color card is used. If the font + table is not at F000:FA6E, the character will probably + be unrecognizable, and most certainly wrong. + For codes >127, table pointed to by interrupt vector 31 + is used. } + +unit HFONT + {sets 8*8 horizontal font table address to iseg:ioffs.} + + +unit HFONT8 +{includes a copy of IBM ROM 8*8 font and returns address suitable for passing to "hfont"; +Use of "hfont8" makes program larger but quarantees BIOS ROM independence.} + + +unit INHLINE : procedure (a: arrayof char; output n : integer); +{ reads a line of at most "n" characters from the keyboard, storing them in the "a" array; characters are echoed at current position with "hascii" as they are typed in; a blinking cursor prompts for the next character; +BACKSPACE works as expected, RETURN completes the reading; +typing "n"-th character also completes the line; +"l" is blank filled up to "n" bytes; +on return "n" is the total number of characters read. } + + +unit OUTHLINE : procedure (a : arrayof char; n : integer); +{ calls "hascii" "n" times with subsequent bytes from "a" array as arguments; before each character is written, "hascii(0)" is called. } + + +end IIUWGRAPH; +à Pau, le {DATE|06/08/93} {PAGE|4} + +Predefined class IIUWGRAPH {PAGE|3} + + diff --git a/doc/iuwgraf3.doc b/doc/iuwgraf3.doc new file mode 100644 index 0000000000000000000000000000000000000000..489d4c180b112e990c330c311943e6d485c9d530 GIT binary patch literal 25453 zcmeI53zS?{nWztW5Go;n@>E`%h@?7Hn(j__9vvF#B%P$OleFms5BU}d+MqTPKIx}8%Mjh{{+kYT@jWl+ZQ$KYy&vOU!j)xSk@u{-{x*&W zya#wMc$-TzJy0}pa>!!bd_hnml_6~0CHu<7otF2$Ucc|P)=Z@u6oQek6cp@j z6O{bnVo)=~el5(K(W+k=(+Ie;c2s3N>wG_gMQs_6wCu0G{|{66M+f* zYH>PBp(aTb!{Mr5olYe+=1&A>I0#B6DEh-?DuF_hLR1ZAFf7-rW+PEi&Qi{73#;W? z(Vz4=D(){&*7o~3bBSLHOTK(WSK{Zlh50eR7~cww@$1I)mumH}-lzv!@Di0hPPOD~ zxg_D;C2Ee!sZUFo%lvB1pQHlTuF1u5`=x^M3k7mqFPnk#Xwfg3+H|cRj7t$V`K3nP zH$&IvuMH}GiHzFEC5bo+X_#t|mzHu(Q8SZ4H86#8DUhrV^zZ7;N%bbl4o}CA5Bifq z(F`?^rTr8wO9QpHsO*saspOHN0C}s2RP%UjwMVF5BIGD%Sjrb0(tL=xUo0jqK!b;+dQjzY-lhF*>*ma4SRYeu3a0Ww zMKo6Kx}<8UW|Yh6I7FW>?cH<1rQ3#D$spyFzp)VUDN(`O{HZ+%w?DO)qU9UaDpBp@ zN_5EOu(r>ci+wv#1bxMV;Myn(zOh`SnUcph`1$>#)pDa$*caW3qaLbH7lTApX2mq< z7lV2|NaYHhr&3BrE#2%4P_8^y3>A|SnI0FLe58X)L1*2JttOT#U&SIUubF(gTrHs4 zbxfFF4dNK$gKS%_t%bN(&iT3sjnIm1Yl)wboV@?}o?RLTBq41bN$go)HZdt1=`CHX za=3Ky1cDk>_NJ;B71OPvF&fZ9bG>F%7q{=&*t>HR#<5tQG_OvoFKXkobab02#yGwi zg9ahwBAf0JQz>K5L}o<-?W;+uh-O2%TnzkDF2n5^6HJ82XB{(M4~j)h(^x=!RZNt$ z2Wgs&zMNpz%y^j|BZ)oAs};IbxiguWIf5M_rl}|597l1g+@=D|9i@}sRJbD|iUeBP zO#AdLJ9lj70qtE24a%7f;}&Z{>}}1_$tNLdLETpMcp0w%U8icI&Ry$7%we9IrK^?} zF~g0Kk)TRk84QIL_*Sz^Ocv&MT+L2F-p94`mq)5Wtz2wq^GRfKsni&kZkZS|dDZw@ z>k^5hQR8ZDtlTKlLDgzfg!&kr$*gGdV`WTM6fj@L>eMP_iMwpWPvV=5A&hnD&&Cl8 z?Zxxu@o{pnbn#H%E;CwQ)nN)M)-^Lz@#|x+zR;ewj)cYFB6HznSg4QjITnPYWA%$J zES0S^)Gk^QjJ7UaEYUZ`lJCBip(~OSc3$>Y2 z-gI=W)?TU?H)1Nt+e%UcT&q_bd9Aa&Sa@t;DI2z!@dhRe>z>Dtp{LR=UMeSQGFQZ! zDFn1lI4n+y=pos~!1*;13AHIRA`NW_%j(XyDRMK_zFMxdr>>AWxzxd>wQX%vtHB0Z zmAc{rb#h6{HnnE;S{JG-eaQt|E!R3EH3@5DThnyS1zal^HAM}r8ClnK%?3;~R*hDq z1)Db$HWu=<WXlQlHKa8N6Myea9}d zdB@Hz$Q2?ef+4Y_RH`}B;ecK>Fw^A*DT$_t-y)|~$s27s9!Iama_YTtU}(-_Vece< ztBhn5c^Srbiqg{lqH|IT4z&bU;b?p7^@?E3n8BSpHui1Wy|Zt~n2kHO@7lRzV4#2d z7PD(>ALj!*cJCar!L^3v%Fc9FviUNn;x^DXh^3jy;4)FSkpY)Pt5P=v#7h^ag4!wP z$Esyqu|im@6#Z%3tv08v!$ms&oGFz{E8EOU%y(F)7uDx%RC7EMy9%!I#4jA|9T@1_ zMVDq$BHI<--H!-^mS_HYF?ly8D-MOnytPg_>q^FGYiP{ZIE7C=gOBA@d z-15wDoIOHIWn`mDFe`aROQ?~%qKiojumBT5ak|C$d8`~B#i*p$B^JPq&Uh5tC4Nn< zTS}M7v}Ia($x(Y|1ur@3kR!deiX(fsGqa-AUhCpWt`U-c62UZP`HJPPC7Mb?x4*n~ z`RuYZ=ngI$!yp%`K8`ba6ln}bWgKVKtJWB<1=lph&8&n|fpo|sr8b7&DbNZsD$rb{lEdRh(wZ8mQKj%&fJobM z1?y;|&Ag06>16qdqlk;9i4rtzDK_lbxv8&7LrpdjK<7#~ zDQt$u$1zZe_w)4zrAZ!e5=&uatj1f9Y0I_e5SknV99+wE+E(S#x@EGZl2?V&M1X?%k=ydvq-PSq=Lw^YJ?oNbJ)OK_|^S#+L0L*e>*;3m8mzX*EGr@ z-CPu=Gb1)II_t_zgt&=yd3tqbxLTep$>AD_XquX&pO^Es_FSIIh`GwF(}d-yz0D@7 z$L&didfuUl#nH5{$}r{^yOnA0%uM5mmM8V3%c{HBsmRc~8k}W|)24WE$58*SejGdv zs&;tWj!T=2n8{A%rcHOs4o98TOsdn8H|yS`vqrLqDT{+d2W=+~?cKIv#{ho8 zDs$zCSvE91K3py?J9+BaZsF{#_Ft+) z&)&2elh#b8(x{E0u(R{ah+R9i^PHU&`)S3fPQQnB%BUri6B*m>X9_~y1?F@xbU7yM zrZ9sQ<|w!;excI`74yLzgM0Qi`*V^NdPoK=WG1S#*_jx@xrkFCW0JUQ${Eu)<&Rg2 zD5oZ|slRv2j_thzv&t(?FT-G_q)dorMJ^6iF&vDBVm#D6x0S`!OgLq_dt9sQIZw&C zG>DvQ@J%~=FUy8g=eILB52yK1n`mQ_vMybWc{fp>c+AztEbB1TxARhQ(gt_*Z{Ib9 zpyRUj4JD$g*V82u^AMN8xoP7}PaWBw(y>{cmuK)l$d8%~{9xCzkqFp^M`4qM`?nAF z?;+t>3#?s=YOkfKA~Q46_hf87=14Y@;!xa46*4kX$IX!HOpA%sYEx;ATEjS12`>}e ze2Ak$Ut=wjib+%&XZ9kIlEP{Y$irFzQNTGvsD+aro%l;69P5c@+|9xbmt`u>`u#=c z4-va_OvFxzt1ccdeXV%FNk?p_DfOB-$UHSW1ii6lLK76dOIk&`1-!(hC&&(k*9LKS zvEEE=lxeHnw0?9mJ?c;ESX90GoX(hRqydUdz{!R6PKkuXT)RCBv-cUe1p^ygD$2WWN>81O}2<`PQw-@zURhK;mC-w zRdC@&ZLLd^D&E+?b3-Y3r;& z3%zuvth2#lhBYC1LR3wpr5cv2>s4RMv`ML~Qx8nhu=Ej$zvzV&a+=ABm8?-PdXPl{ zrg0MIwazj)no*#Cv9#lUtIZlI9B5(T%U3TI6s_Cq4G{cl#IOv*%VboLZgGuc$5 zxLy)@6OFZv*3v3cIo#7Gt!G7IxIBeSN+iK}g~dWfP|5cwyk%NlK&PDU{?QM* z7rC@mHSSNFOo^H68f!T+;VHN1c_oycHczzG_DN>z`ECKWSSvFfHSSONVUfCZVksYq zCJyd)GM7y6W{ux%Q&0RDb+u>Il{-Sd2o?E%c9u$AUDh8&9>rd=ny_p%5NTf~HLxty zqAe3?(OH_Blp4izLlgRLYk+1+CXYH1=D|qJo?GOSvhLVv)vKwfsM{=^a%I)|BZf&0 z$v8eo!xf0Ok}Hzoa&JqeBf!D`rKN!*AeU1C^B?i2X|XE)l)h)6g=@vSV81!_t1H z?NYr=oNtuLmRWmR^wCbglw@5emJ2(kAd2C#>@2Y>o1%toR)^hCOgc_o^pvaGSE|0t zt|Z(N9=EfWHVw3hzNQq6GHH#QY!^D!Y3v=?wQ~FJZP>B;Sh>KA$FwxB4n1U2SDj|* zhLY^*+$h;$e-Tl&cdU_ao;-~E`>DYA0o@-J<%HF>mF=rKc#0uc8B@!qEj0t;2B+dC znkd5vm-hO;SXufy5))ge11@O+TX>YAY_<)pl)YU#R1)VxmRNW=yK&dfft4H2(S+*L zmB1ehe9Q?IBXgbsb}(SgRxZ>U6=wWu47hB^lE~!N-l2{C{j_Fm)Ux@wJ*_2MF80Cd zNK#8Zl&YG|w}^`PX6=f#bmUWW+FhxXx!qxD&}W$l!Q^MxvRQ*5C>G^m)uNUU!)#j% zqYho;D$C#&<&bnmX=P~6(7h)aw;LU>XkSob4b1w{Ow0bp7I+T!Nw$lomKTL zj^x6ze$@Yu|{z2l}2*scyI1MtF_e%$pM;HJnCN!-Lom(O@6BR6S0bESZGb1n~47#%_(Z!Ys>j-TDMfsd`qFenE{nL+0p zQ7GGe=$usSI*6Mg`_&{FsWjK`VI+#>(rBwjhSY@Pjq&EnR*kUcT=!YJwugU)0ka86S)k_9QY6%CnkV~~s+ATlXkT(2~mdJYoGNu&BLk+YCV87FsN zuC&U?Wt+cWs@3`Cwuh4y(JG5_azmQIwbhIaxR~9NK^40_M|b024vuarVa+lUj5z4` zX$8DWp4LY-hs_f|Q4?BeX=S7-qXd^!rcdXSq^n2K?QRL%3B)z&miMt`qF^$49`Bb_ zOLwem&}}<*5A`J*p2hgdN&=!>H!F4hk!>}_<#JBn9@gy2vs}Y6GE*2bSfZLM0bX3; z0NbNO)?aDA0}}^IfnDytrV*M6D$B4F6y>QN@JA&O6HjHkUSt?RXcxGiM`ihIJfx1; zGQwFQXiSAaX1P~4Q~kIu5d@X$0okC*KTe`e0Xo`>bLAdq^Ya9e(N%{GR)fenW4;(i z1cPW;F_8_rr32!fjyI*_Yw@GJxqSO@rAN3rW)XT?tua;t_*eB2Ai-9vdgb6qd8+Dr#sPp`un%^tQVS%!}5fVporisLXCcF$2^vT(ngT?Ficwv`ae zvdD+{BGSS+NjZN&_wxDEJ`x}mIR5B3@3Dx`nKC@hi~PtP#&XoYRFzglEOsK)wgI(H zWYd8Rj%GE9%D1bNIi)s7#G#l>Dwb+(lyG~>#RC+SE+~}tA(IqPg*H!a8d6ZUf0Q^W zB(h|(vxS*5+0g{bT_y9#!w5cUz}!{8ZI@vLncBkhB;VIGmdmV6=oGQJu(2GMmW#|+ zWd5gE*4zcHW}vzH$h$2MfaJap{9IbNKq)y}>*whrNXOA{$_x#rX~;a==|N&PH(5BAcYW6Wh^>=oAPOv)*hOKaOn1z8ZQGhW9JrRSk@ zunH{ulBGf93sEV1FG^M@>%6^qUlLO^gD!J)+8fvzcwIAOT>U)6j%XM)s9#UERCo7c zmC=d)Qu#6%wR=zPSAfn*l^hY2l8Zwnxz*7N=PHn?Z2#_ZnfWgflSvj8tMuFdS0W~2 zm6D=(P9hR7^^#MQAanPs-O*P+q zW@ZRoXB_przi%fztKBs_+T+TEpX3%bMb&kd%;h%S^Gfcu^KG!8MNj5J{wMlfu`}a* zqf7c5A?hLd5Zt?HCn(6*6e+_-U=O@HFV zPJ}u`sl#x$=Tog->ARz^mHk6l%&!uHheLS?@`E{%kxM*WaUcJPeq(Wpb<+! zb=0V5QqVrWe5bouWcxltK$-Yp@rN!!%(LCRzjX1SJv2l5waQ?Nd|#F*r0#fSS4ami z>)WWg=C7-+z%SZhH<=Aq1J>>Amkldp;>qexHjO7N(NEHmNad2aek(WWGb9qe`>0#h zWK=!EwtMMWG>Qz_NI!0GH9zc{HY+>H|6ni4lxAKlqv>tXusPa{^3HUU;h*dnm5ZTa zILUj38z{@{mljmw{6oHMK4k--H9cW6yNVfcS(xSJCpYkL2p=uU>D*BKP=Px#W{_{J z#TTcTU6SRD=n*&7l?1T%hl$=okdv7x^~G~eWn;h3ikZe5wY+52C8JZ=`gJ1aw9~bS zFyP(bqNF8BXC__UVs&J0SR4Tc{zpEYIG9d_)i>pf8dX+9u$~fc>=#*g$+@mN!)&F` zxlwVF>0GCDJ|nU#=aE5)AJ9D7T^ZS~Tvu-Os;*q;nyy?&Q;vCBR#A|p5&6~{RW9E# z)hxOd;N}S9wZbfWHu<+~s%M#vGM&M6C>w10xq{_Z5t-{(ddzdgnd>63b`ml^d#=E1 z2&@wFd;+f{uoI*?V|F##-qx1up!}=&T-5IO5LKRJOgPyQj0gZM~VE)?*G`gxu_qn_c#%9Ir~>TqQSG z+naJsxa7%Bxk+$|R*u)EZ+6Me4trCN(>GVkO@hmla-5{;bVjybW>@D_#dB-5))E<( z30&PX>2`?4vL_3JVRuiv`04r`IH{RJ+2t5FXPU3`b@%88+lb>F@%@shSaYS{-X+SA zN}s-7minVy*bPB(E?jaN6I%_3vt82qfH-!FoO33ZkPC?xDX@FD_)??pEUJVuDTVc5 z3kP5Otg8S>NvuK9C_8!HB2n_qKRF{xnPId77DpRxqmyW@D7g$$Q#$%aM>R*e)wz}H z>?;?2NTal3U5j|bntA1wvTS|njjl_b@6=}dT>0{w+6z*?IGrhz2ZCaKiR{59$g8yw#@W+SLVWy3pzMeTKT z<=V9>5l@k(SbJg#)ZGwS73JInfjV7AnKxoSFcOTop;D>XC)@3#75nJ3#ZOkq#@KTP zLaU0;83^NEea=7__52)x!jWuttfzf-r@Gz6o{lvwqMzA(&#IOdTe#Fa!WvBBVA3!F zJ4D4nm}HUL4L(%1ULj)m`u5?YSHY*=vJ0uDZ4DBcMfBLaK=_PEL54CuIRpUwkx=^ zs96&!*9FKxf?|c^Xi~P*4<{_~yf)~B9_WWlVDMPayArN~5UOw& zEMMw*U9b)=hJJVpycOOKpMX!pXW>imO}PFz&$|(Bfj@(NFYvrPjKc)n3-`kT_yxS^ zM9(`1E{4r;3G9R`VBJZc*A0X43fKul5W>|^gF3tc4nKMD=La7<_~au`KJw6${2e^} zWb}9NzJuT8j-1-}d)#Lf;A{7MExPpOC!;@akvH#XZ@zchqN5hrPtSeM=Le_eduJ^6 zyyN84^NhD>o?bg`k-f(=HjKM|292T5xXg;THI7_#3z#J`H!lS7GJJ zp4SfRVI#a3-VYyzPr%AkJg)=R!3GFUrJkS)Gw=g=5FUeru+XGiY2)Duif^WjN zq5dMzn}R=vH$cyeX#=5Eak$`9W`}vbU*L(6g`#3s}o_)-Pk?W7}`(trCM{*F!g_VcX;`Vp4?J%01F##egaUjX?uKu|eee)G3a>a98w5APP4G7OEBHP<04KlH^G<ufYo+I{g-x&(3J}0F z{1LnZ{tAX$xek+X9ozsn!Rz5I@K(4L&S|H<;2+^L@aLWMQScY=0r0v!?>y*$HP8c_ z;r7+^1CUwcc}w91a0VDy0XM>X;KT57_$1r~_rMR}%ysB96rlojcn#bDx4XSo2T!d-ig{hmJ8coczYy&r>sZ5p$k?+A8dwy zhA+Z5;C^@v{sS($kTCEHcokd?lkj$U7kmW%0Um}-zvrC}XM+5mWCwJ@YIyor`giE* z^xrRj_VmxZpFRAv6z;!Xzf%nyM^p1U$v(6o>J8%F{z$p-&bt06&wDM15BQfLexUe$ zC&4R0e7;-Z9q<5{`Pfsq4(@=@z(M#8oVS4I;rs9dICCLw4xfg!uej)FWCw19*TGF7 zzT?N>tMGOBCHw~3=&~+?0k|AS;ob0FcprQK#NYe{Tzm}j2cLsqz-bx$71#yhi_X9o z;D*J>HB8}qUJEzE>)|ipBXB2t10IH_;J9Nw?;ZF}u>z2+Tt_qnIUch}QS++A?@xyfAfP&V;jJ6UZ1~9KHevU;)~+9R3de3B)h{KD3}+w zLkF~pk&D#phxf~gUTeOQ3d5rk>U%bv1UrN{(6+SRTHB(?g=^*c_6SALwtd0aQ78WS zZ=%pit0$7cbC*g!&%2hSN^P_km7W1M6Tt z^gteD9B?yy2fhz74mbh-{$v<{LD&g09=Hx}fKR}^aO#UZZyS`L3Nj|R=f&37Kl60j z3pT?g@Fw^ed<_o4)-%XEd=|b3FUFTY3&hXg3~z+5z@zX>5P$zn{Q7J$3II=n;4A!NZ5WsD+(8(Dtsakqq0`VllpqSXjAfYX7~Gw~foN#~}Xs4e&|$ z799T)^aIvG4~U;$hQEb7;a@>~^h3~gE_DtAupI{BwIDwFx8ZpF>Irx?h#!6%Ty!37 z2;y&#!PW3y_&hub?aQ(EFaaNc`(a5IzYfGFUkBI0t#CX13QldIJ>U#D3&c0S3Elwj z#CLrLjyj*Vf~#_*2Y&T=&lAzPEhFY9lGbMTs^=ip}utB(C27FJUI;P-RC~+;mb)&xfe%HuQ_Vc z^`vb-d34ma&04<5S%TvidPjZg*gIYOTWcXQK|irg%5o>Xrk$}ie7%D)5&Rm?Ugde$ z!+YTq@Oe0?lXioPp`{By9a>==ZiTyG{c7YM&RT;Ez+c1P!>8aguy8H52Hpk7t|MLe z5r|(cKJ{5}CA=0s2n*IDUvM$p4C0rHPkIl08zP@{=t9PiFafv1hd_MM+u;uQG~5Y4 z1o2IO4Y?lrKez^_;Un--xDAfJh<+YE0$+p&;Wu#N%dmG)fDmeMEqolF`uC@P_Eh}( z@l#Jd7@a&A9mWT8K~CiFzVFEE8*{yo1lk_GemFjI7N2V(1xOA@kE!G=RR7?(`65MW ziQ*W4z)F`5ug61@=a!49U$`9p4!#Ee0Wa;vHp6S+LvZv4`e0ZF7s6hcfVaX&;mhzS zEZ>L>Kp*UbtKq}&KVi`(Yz+*-ZnzCj>SNplWAGKY2YvuA+Du$<8QcJ$f`{OkE%Z~c z6DHvxEZ&OV!%N`;cs0BYZijz`d*NaDCHxxZ_uH|_5DG?(aIU;(QZMi9rqgGhISva=7@QtnnPX0y zb$gLsrv|-Wcn3NDrT0wJpWJ?i29?jZ(o!etI8e@(9nG8{{`F7r1Gk@yyq->fungOr zB^GS)W$69|$df#E%)DoaO#f+8~>l0+iYvu6^N%cy&1tbSf1Fas~cPWIvD2R9cQS>rYlFX>dtcr}R zMPgp+o#!p*e=lg!5aMr(&n5k?*j~{;3AMsI-^=koFtmCX@V^`2>Fx^Ik>zDhnP-1k z%{z9Pw>2nE1oHD6;sx^y%lrBLTyM$Fc^j%67pF_!3s13+neF^0|4x3ou;hK>g^a1- z>u>EBqAj-Wr<;s62@fOfZULe(oC@heP0$vOL0fQ@_ccQfN`EUBU zV1Y~`aJoPgR1Rczi^Lhr1fk3ZsqrXp|u2Pu{IM*si- literal 0 HcmV?d00001 diff --git a/doc/iuwgraf3.ps b/doc/iuwgraf3.ps new file mode 100644 index 0000000..2ee6a48 --- /dev/null +++ b/doc/iuwgraf3.ps @@ -0,0 +1,2815 @@ +%!PS-Adobe-3.0 +%%Creator: Windows PSCRIPT +%%Title: Microsoft Word - IUWGRAF3.DOC +%%BoundingBox: 9 15 584 830 +%%DocumentNeededResources: (atend) +%%DocumentSuppliedResources: (atend) +%%Pages: (atend) +%%BeginResource: procset Win35Dict 3 1 +/Win35Dict 290 dict def Win35Dict begin/bd{bind def}bind def/in{72 +mul}bd/ed{exch def}bd/ld{load def}bd/tr/translate ld/gs/gsave ld/gr +/grestore ld/M/moveto ld/L/lineto ld/rmt/rmoveto ld/rlt/rlineto ld +/rct/rcurveto ld/st/stroke ld/n/newpath ld/sm/setmatrix ld/cm/currentmatrix +ld/cp/closepath ld/ARC/arcn ld/TR{65536 div}bd/lj/setlinejoin ld/lc +/setlinecap ld/ml/setmiterlimit ld/sl/setlinewidth ld/scignore false +def/sc{scignore{pop pop pop}{0 index 2 index eq 2 index 4 index eq +and{pop pop 255 div setgray}{3{255 div 3 1 roll}repeat setrgbcolor}ifelse}ifelse}bd +/FC{bR bG bB sc}bd/fC{/bB ed/bG ed/bR ed}bd/HC{hR hG hB sc}bd/hC{ +/hB ed/hG ed/hR ed}bd/PC{pR pG pB sc}bd/pC{/pB ed/pG ed/pR ed}bd/sM +matrix def/PenW 1 def/iPen 5 def/mxF matrix def/mxE matrix def/mxUE +matrix def/mxUF matrix def/fBE false def/iDevRes 72 0 matrix defaultmatrix +dtransform dup mul exch dup mul add sqrt def/fPP false def/SS{fPP{ +/SV save def}{gs}ifelse}bd/RS{fPP{SV restore}{gr}ifelse}bd/EJ{gsave +showpage grestore}bd/#C{userdict begin/#copies ed end}bd/FEbuf 2 string +def/FEglyph(G )def/FE{1 exch{dup 16 FEbuf cvrs FEglyph exch 1 exch +putinterval 1 index exch FEglyph cvn put}for}bd/SM{/iRes ed/cyP ed +/cxPg ed/cyM ed/cxM ed 72 100 div dup scale dup 0 ne{90 eq{cyM exch +0 eq{cxM exch tr -90 rotate -1 1 scale}{cxM cxPg add exch tr +90 rotate}ifelse}{cyP +cyM sub exch 0 ne{cxM exch tr -90 rotate}{cxM cxPg add exch tr -90 +rotate 1 -1 scale}ifelse}ifelse}{pop cyP cyM sub exch 0 ne{cxM cxPg +add exch tr 180 rotate}{cxM exch tr 1 -1 scale}ifelse}ifelse 100 iRes +div dup scale 0 0 transform .25 add round .25 sub exch .25 add round +.25 sub exch itransform translate}bd/SJ{1 index 0 eq{pop pop/fBE false +def}{1 index/Break ed div/dxBreak ed/fBE true def}ifelse}bd/ANSIVec[ +16#0/grave 16#1/acute 16#2/circumflex 16#3/tilde 16#4/macron 16#5/breve +16#6/dotaccent 16#7/dieresis 16#8/ring 16#9/cedilla 16#A/hungarumlaut +16#B/ogonek 16#C/caron 16#D/dotlessi 16#27/quotesingle 16#60/grave +16#7C/bar 16#82/quotesinglbase 16#83/florin 16#84/quotedblbase 16#85 +/ellipsis 16#86/dagger 16#87/daggerdbl 16#89/perthousand 16#8A/Scaron +16#8B/guilsinglleft 16#8C/OE 16#91/quoteleft 16#92/quoteright 16#93 +/quotedblleft 16#94/quotedblright 16#95/bullet 16#96/endash 16#97 +/emdash 16#99/trademark 16#9A/scaron 16#9B/guilsinglright 16#9C/oe +16#9F/Ydieresis 16#A0/space 16#A4/currency 16#A6/brokenbar 16#A7/section +16#A8/dieresis 16#A9/copyright 16#AA/ordfeminine 16#AB/guillemotleft +16#AC/logicalnot 16#AD/hyphen 16#AE/registered 16#AF/macron 16#B0/degree +16#B1/plusminus 16#B2/twosuperior 16#B3/threesuperior 16#B4/acute 16#B5 +/mu 16#B6/paragraph 16#B7/periodcentered 16#B8/cedilla 16#B9/onesuperior +16#BA/ordmasculine 16#BB/guillemotright 16#BC/onequarter 16#BD/onehalf +16#BE/threequarters 16#BF/questiondown 16#C0/Agrave 16#C1/Aacute 16#C2 +/Acircumflex 16#C3/Atilde 16#C4/Adieresis 16#C5/Aring 16#C6/AE 16#C7 +/Ccedilla 16#C8/Egrave 16#C9/Eacute 16#CA/Ecircumflex 16#CB/Edieresis +16#CC/Igrave 16#CD/Iacute 16#CE/Icircumflex 16#CF/Idieresis 16#D0/Eth +16#D1/Ntilde 16#D2/Ograve 16#D3/Oacute 16#D4/Ocircumflex 16#D5/Otilde +16#D6/Odieresis 16#D7/multiply 16#D8/Oslash 16#D9/Ugrave 16#DA/Uacute +16#DB/Ucircumflex 16#DC/Udieresis 16#DD/Yacute 16#DE/Thorn 16#DF/germandbls +16#E0/agrave 16#E1/aacute 16#E2/acircumflex 16#E3/atilde 16#E4/adieresis +16#E5/aring 16#E6/ae 16#E7/ccedilla 16#E8/egrave 16#E9/eacute 16#EA +/ecircumflex 16#EB/edieresis 16#EC/igrave 16#ED/iacute 16#EE/icircumflex +16#EF/idieresis 16#F0/eth 16#F1/ntilde 16#F2/ograve 16#F3/oacute 16#F4 +/ocircumflex 16#F5/otilde 16#F6/odieresis 16#F7/divide 16#F8/oslash +16#F9/ugrave 16#FA/uacute 16#FB/ucircumflex 16#FC/udieresis 16#FD/yacute +16#FE/thorn 16#FF/ydieresis ] def/reencdict 12 dict def/IsChar{basefontdict +/CharStrings get exch known}bd/MapCh{dup IsChar not{pop/bullet}if +newfont/Encoding get 3 1 roll put}bd/MapDegree{16#b0/degree IsChar{ +/degree}{/ring}ifelse MapCh}bd/MapBB{16#a6/brokenbar IsChar{/brokenbar}{ +/bar}ifelse MapCh}bd/ANSIFont{reencdict begin/newfontname ed/basefontname +ed FontDirectory newfontname known not{/basefontdict basefontname findfont +def/newfont basefontdict maxlength dict def basefontdict{exch dup/FID +ne{dup/Encoding eq{exch dup length array copy newfont 3 1 roll put}{exch +newfont 3 1 roll put}ifelse}{pop pop}ifelse}forall newfont/FontName +newfontname put 127 1 159{newfont/Encoding get exch/bullet put}for +ANSIVec aload pop ANSIVec length 2 idiv{MapCh}repeat MapDegree MapBB +newfontname newfont definefont pop}if newfontname end}bd/SB{FC/ULlen +ed/str ed str length fBE not{dup 1 gt{1 sub}if}if/cbStr ed/dxGdi ed +/y0 ed/x0 ed str stringwidth dup 0 ne{/y1 ed/x1 ed y1 y1 mul x1 x1 +mul add sqrt dxGdi exch div 1 sub dup x1 mul cbStr div exch y1 mul +cbStr div}{exch abs neg dxGdi add cbStr div exch}ifelse/dyExtra ed +/dxExtra ed x0 y0 M fBE{dxBreak 0 BCh dxExtra dyExtra str awidthshow}{dxExtra +dyExtra str ashow}ifelse fUL{x0 y0 M dxUL dyUL rmt ULlen fBE{Break +add}if 0 mxUE transform gs rlt cyUL sl [] 0 setdash st gr}if fSO{x0 +y0 M dxSO dySO rmt ULlen fBE{Break add}if 0 mxUE transform gs rlt cyUL +sl [] 0 setdash st gr}if n/fBE false def}bd/font{/name ed/Ascent ed +0 ne/fT3 ed 0 ne/fSO ed 0 ne/fUL ed/Sy ed/Sx ed 10.0 div/ori ed -10.0 +div/esc ed/BCh ed name findfont/xAscent 0 def/yAscent Ascent def/ULesc +esc def ULesc mxUE rotate pop fT3{/esc 0 def xAscent yAscent mxUE transform +/yAscent ed/xAscent ed}if [Sx 0 0 Sy neg xAscent yAscent] esc mxE +rotate mxF concatmatrix makefont setfont [Sx 0 0 Sy neg 0 Ascent] mxUE +mxUF concatmatrix pop fUL{currentfont dup/FontInfo get/UnderlinePosition +known not{pop/Courier findfont}if/FontInfo get/UnderlinePosition get +1000 div 0 exch mxUF transform/dyUL ed/dxUL ed}if fSO{0 .3 mxUF transform +/dySO ed/dxSO ed}if fUL fSO or{currentfont dup/FontInfo get/UnderlineThickness +known not{pop/Courier findfont}if/FontInfo get/UnderlineThickness get +1000 div Sy mul/cyUL ed}if}bd/min{2 copy gt{exch}if pop}bd/max{2 copy +lt{exch}if pop}bd/CP{/ft ed{{ft 0 eq{clip}{eoclip}ifelse}stopped{currentflat +1 add setflat}{exit}ifelse}loop}bd/patfont 10 dict def patfont begin +/FontType 3 def/FontMatrix [1 0 0 -1 0 0] def/FontBBox [0 0 16 16] +def/Encoding StandardEncoding def/BuildChar{pop pop 16 0 0 0 16 16 +setcachedevice 16 16 false [1 0 0 1 .25 .25]{pat}imagemask}bd end/p{ +/pat 32 string def{}forall 0 1 7{dup 2 mul pat exch 3 index put dup +2 mul 1 add pat exch 3 index put dup 2 mul 16 add pat exch 3 index +put 2 mul 17 add pat exch 2 index put pop}for}bd/pfill{/PatFont patfont +definefont setfont/ch(AAAA)def X0 64 X1{Y1 -16 Y0{1 index exch M ch +show}for pop}for}bd/vert{X0 w X1{dup Y0 M Y1 L st}for}bd/horz{Y0 w +Y1{dup X0 exch M X1 exch L st}for}bd/fdiag{X0 w X1{Y0 M X1 X0 sub dup +rlt st}for Y0 w Y1{X0 exch M Y1 Y0 sub dup rlt st}for}bd/bdiag{X0 w +X1{Y1 M X1 X0 sub dup neg rlt st}for Y0 w Y1{X0 exch M Y1 Y0 sub dup +neg rlt st}for}bd/AU{1 add cvi 15 or}bd/AD{1 sub cvi -16 and}bd/SHR{pathbbox +AU/Y1 ed AU/X1 ed AD/Y0 ed AD/X0 ed}bd/hfill{/w iRes 37.5 div round +def 0.1 sl [] 0 setdash n dup 0 eq{horz}if dup 1 eq{vert}if dup 2 eq{fdiag}if +dup 3 eq{bdiag}if dup 4 eq{horz vert}if 5 eq{fdiag bdiag}if}bd/F{/ft +ed fm 256 and 0 ne{gs FC ft 0 eq{fill}{eofill}ifelse gr}if fm 1536 +and 0 ne{SHR gs HC ft CP fm 1024 and 0 ne{/Tmp save def pfill Tmp restore}{fm +15 and hfill}ifelse gr}if}bd/S{PenW sl PC st}bd/m matrix def/GW{iRes +12 div PenW add cvi}bd/DoW{iRes 50 div PenW add cvi}bd/DW{iRes 8 div +PenW add cvi}bd/SP{/PenW ed/iPen ed iPen 0 eq iPen 6 eq or{[] 0 setdash}if +iPen 1 eq{[DW GW] 0 setdash}if iPen 2 eq{[DoW GW] 0 setdash}if iPen +3 eq{[DW GW DoW GW] 0 setdash}if iPen 4 eq{[DW GW DoW GW DoW GW] 0 +setdash}if}bd/E{m cm pop tr scale 1 0 moveto 0 0 1 0 360 arc cp m sm}bd +/AG{/sy ed/sx ed sx div 4 1 roll sy div 4 1 roll sx div 4 1 roll sy +div 4 1 roll atan/a2 ed atan/a1 ed sx sy scale a1 a2 ARC}def/A{m cm +pop tr AG m sm}def/P{m cm pop tr 0 0 M AG cp m sm}def/RRect{n 4 copy +M 3 1 roll exch L 4 2 roll L L cp}bd/RRCC{/r ed/y1 ed/x1 ed/y0 ed/x0 +ed x0 x1 add 2 div y0 M x1 y0 x1 y1 r arcto 4{pop}repeat x1 y1 x0 y1 +r arcto 4{pop}repeat x0 y1 x0 y0 r arcto 4{pop}repeat x0 y0 x1 y0 r +arcto 4{pop}repeat cp}bd/RR{2 copy 0 eq exch 0 eq or{pop pop RRect}{2 +copy eq{pop RRCC}{m cm pop/y2 ed/x2 ed/ys y2 x2 div 1 max def/xs x2 +y2 div 1 max def/y1 exch ys div def/x1 exch xs div def/y0 exch ys div +def/x0 exch xs div def/r2 x2 y2 min def xs ys scale x0 x1 add 2 div +y0 M x1 y0 x1 y1 r2 arcto 4{pop}repeat x1 y1 x0 y1 r2 arcto 4{pop}repeat +x0 y1 x0 y0 r2 arcto 4{pop}repeat x0 y0 x1 y0 r2 arcto 4{pop}repeat +m sm cp}ifelse}ifelse}bd/PP{{rlt}repeat}bd/OB{gs 0 ne{7 3 roll/y ed +/x ed x y translate ULesc rotate x neg y neg translate x y 7 -3 roll}if +sc B fill gr}bd/B{M/dy ed/dx ed dx 0 rlt 0 dy rlt dx neg 0 rlt cp}bd +/CB{B clip n}bd/ErrHandler{errordict dup maxlength exch length gt +dup{errordict begin}if/errhelpdict 12 dict def errhelpdict begin/stackunderflow(operand stack underflow)def +/undefined(this name is not defined in a dictionary)def/VMerror(you have used up all the printer's memory)def +/typecheck(operator was expecting a different type of operand)def +/ioerror(input/output error occured)def end{end}if errordict begin +/handleerror{$error begin newerror{/newerror false def showpage 72 +72 scale/x .25 def/y 9.6 def/Helvetica findfont .2 scalefont setfont +x y moveto(Offending Command = )show/command load{dup type/stringtype +ne{(max err string)cvs}if show}exec/y y .2 sub def x y moveto(Error = )show +errorname{dup type dup( max err string )cvs show( : )show/stringtype +ne{( max err string )cvs}if show}exec errordict begin errhelpdict errorname +known{x 1 add y .2 sub moveto errhelpdict errorname get show}if end +/y y .4 sub def x y moveto(Stack =)show ostack{/y y .2 sub def x 1 +add y moveto dup type/stringtype ne{( max err string )cvs}if show}forall +showpage}if end}def end}bd end +%%EndResource +/SVDoc save def +%%EndProlog +%%BeginSetup +Win35Dict begin +ErrHandler +statusdict begin 0 setjobtimeout end +statusdict begin statusdict /jobname (Microsoft Word - IUWGRAF3.DOC) put end +/oldDictCnt countdictstack def {statusdict begin 0 setpapertray end +}stopped +{ countdictstack oldDictCnt lt { Win35Dict begin } +{1 1 countdictstack oldDictCnt sub {pop end } for } ifelse } if +/oldDictCnt countdictstack def {a4 +}stopped +{ countdictstack oldDictCnt lt { Win35Dict begin } +{1 1 countdictstack oldDictCnt sub {pop end } for } ifelse } if +[{ } +/exec load currenttransfer /exec load] cvx settransfer +/setresolution where { pop 300 300 setresolution } if +%%EndSetup +%%Page: 1 1 +%%PageResources: (atend) +SS +0 0 12 16 799 1169 300 SM +32 0 0 50 50 0 0 0 47 /Bookman-Demi /font5 ANSIFont font +0 0 0 fC +248 283 615 (unit IIUWGRAPH: class;) 615 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +248 401 1399 ({ this predefined class enables basic graphic operations) 1399 SB +32 0 0 58 58 0 0 0 54 /Bookman-Light /font7 ANSIFont font +248 460 95 ( ) 95 SB +32 0 0 58 58 0 0 0 52 /Bookman-LightItalic /font8 ANSIFont font +343 462 17 ( ) 17 SB +32 0 0 58 58 0 0 0 54 /Bookman-Light /font7 ANSIFont font +360 460 810 (for DOS machines based on ) 810 SB +32 0 0 58 58 0 0 0 54 /Bookman-Demi /font5 ANSIFont font +1170 460 114 (486) 114 SB +32 0 0 58 58 0 0 0 54 /Bookman-Light /font7 ANSIFont font +1284 460 560 ( or 386 processors }) 560 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +248 587 1726 ({ this document gives the specification of new version of IIUWGRAPH) 1726 SB +398 647 773 (class made in October 1994 by ) 773 SB +32 0 0 50 50 0 0 0 47 /Bookman-DemiItalic /font6 ANSIFont font +1171 646 444 (Frederic Pataud ) 444 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +1615 647 139 (\340 Pau) 139 SB +32 0 0 50 50 0 0 0 45 /Bookman-LightItalic /font8 ANSIFont font +248 707 15 ( ) 15 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +263 706 14 (}) 14 SB +248 824 1672 ({ the early versions of library IIUWGRAPH have been elaborated by) 1672 SB +248 883 1525 ( Piotr Carlsson, Miroslawa Milkowska, Janina Jankowska,) 1525 SB +248 942 1244 ( Michal Jankowski at Institute of Informatics,) 1244 SB +248 1001 785 ( University of Warsaw 1987,) 785 SB +248 1060 1555 ( and added to Loglan system by Danuta Szczepanska 1987,) 1555 SB +248 1178 1173 ( the recent versions were done at LITA, Pau,) 1173 SB +248 1237 170 ( by) 170 SB +248 1296 863 ( Pawel Susicki \(1991\) for Unix,) 863 SB +248 1355 1641 ( Sebastien Bernard \(1992\) for ATARI, see a separate document,) 1641 SB +248 1414 1795 ( Eric Becourt et Jer\364me Larrieu \(1993\) for Unix and Xwindows, see a ) 1795 SB +398 1473 826 (separate document on Xiiuwgraf ,) 826 SB +248 1709 1492 (fait \340 Pau, le 15 Novembre 1994, par Andrzej Salwicki, LITA}) 1492 SB +248 1827 1875 ({ the predefined class IIUWGRAPH is included in all versions of interpreter of) 1875 SB +248 1887 410 (Loglan, with the ) 410 SB +32 0 0 50 50 0 0 0 45 /Bookman-LightItalic /font8 ANSIFont font +658 1888 224 (exception) 224 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +882 1887 1259 ( of the present version of interpreter for VAX/VMS.}) 1259 SB +32 0 0 50 50 0 0 0 47 /Bookman-Demi /font5 ANSIFont font +248 2131 179 (hidden) 179 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +427 2132 1311 ( MaxX, MaxY, current_X, current_Y, is_graphic_On,) 1311 SB +248 2191 1712 ( current_Colour, current_Background_Colour, current_Style,) 1712 SB +248 2250 1062 ( current_Palette, current_Pattern ;) 1062 SB +32 0 0 50 50 0 0 0 47 /Bookman-Demi /font5 ANSIFont font +248 2486 143 (const) 143 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +391 2487 217 ( MaxX =) 217 SB +248 2546 341 ( MaxY =) 341 SB +248 2664 760 ({ the screen's coordinates are) 760 SB +248 2782 986 ( \(0,0\) ----------------------> \(MaxX,0\)) 986 SB +248 2841 206 ( \246) 206 SB +248 2900 206 ( \246) 206 SB +248 2959 206 ( \246) 206 SB +248 3018 195 ( V) 195 SB +248 3077 1108 ( \(0, MaxY\) \(MaxX,MaxY\)) 1108 SB +1 #C +statusdict begin /manualfeed false store end +EJ RS +%%PageTrailer +%%PageResources: font Bookman-Demi +%%+ font Bookman-DemiItalic +%%+ font Bookman-Light +%%+ font Bookman-LightItalic +%%Page: 2 2 +%%PageResources: (atend) +SS +0 0 12 16 799 1169 300 SM +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +0 0 0 fC +248 224 14 (}) 14 SB +32 0 0 50 50 0 0 0 47 /Bookman-Demi /font5 ANSIFont font +248 401 82 (var) 82 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +330 402 1466 ( currentDriver : integer, { see NOCARD below }) 1466 SB +248 461 1640 ( current_X, current_Y: integer { it is the current position }) 1640 SB +248 520 719 ( is_graphic_On: Boolean,) 719 SB +998 520 881 ( { evidently tells whether we are in ) 881 SB +698 579 387 (graphics mode }) 387 SB +248 638 715 ( current_Colour : integer,) 715 SB +1148 638 44 ({ }) 44 SB +248 697 1038 ( current_Background_Colour : integer,) 1038 SB +248 756 671 ( current_Style : integer,) 671 SB +1148 756 44 ({ }) 44 SB +248 815 716 ( current_Palette : integer,) 716 SB +248 874 498 ( current_Pattern) 498 SB +32 0 0 50 50 0 0 0 47 /Bookman-Demi /font5 ANSIFont font +248 992 108 (unit) 108 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +356 993 217 ( GRON : ) 217 SB +32 0 0 50 50 0 0 0 47 /Bookman-Demi /font5 ANSIFont font +573 992 261 (procedure) 261 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +834 993 277 ( \(i: integer\);) 277 SB +248 1052 1754 ( { procedure sets the monitor in graphic mode and clears the buffer) 1754 SB +248 1111 16 ( ) 16 SB +398 1111 1739 (of screen. The parameter determines the resolution and the number of ) 1739 SB +398 1170 195 (colours.) 195 SB +248 1229 1887 (The user should assure that the resolution chosen should correspond to that) 1887 SB +248 1288 801 (which set by means of command) 801 SB +248 1347 1616 (SET go32 drivers {path} ) 1616 SB +248 1406 69 (eg.) 69 SB +248 1465 1785 (set go32 drivers c:\\loglan\\svga\\drivers\\vesa.grn gw 1024 gh 480 nc 256) 1785 SB +32 0 0 58 58 0 0 0 54 /Bookman-Light /font7 ANSIFont font +248 1525 861 ( An execution of instruction ) 861 SB +32 0 0 58 58 1 0 0 54 /Bookman-Light /font7 ANSIFont font +1109 1525 98 (call) 98 SB +32 0 0 58 58 0 0 0 54 /Bookman-Light /font7 ANSIFont font +1207 1525 216 ( gron\(i\) ) 216 SB +32 0 0 58 58 0 0 0 55 /Bookman-DemiItalic /font6 ANSIFont font +1423 1524 406 (must precede) 406 SB +32 0 0 58 58 0 0 0 54 /Bookman-Demi /font5 ANSIFont font +1829 1525 20 ( ) 20 SB +32 0 0 58 58 0 0 0 54 /Bookman-Light /font7 ANSIFont font +1849 1525 282 (any of the) 282 SB +248 1593 1029 (graphic commands described below.) 1029 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +248 1661 126 ( }) 126 SB +32 0 0 50 50 0 0 0 47 /Bookman-Demi /font5 ANSIFont font +248 1779 108 (unit) 108 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +356 1780 244 ( GROFF : ) 244 SB +32 0 0 50 50 0 0 0 47 /Bookman-Demi /font5 ANSIFont font +600 1779 261 (procedure) 261 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +861 1780 16 (;) 16 SB +248 1839 1651 ( { the procedure sets the monitor in the text mode filling it with ) 1651 SB +398 1898 180 (spaces.) 180 SB +32 0 0 58 58 0 0 0 54 /Bookman-Light /font7 ANSIFont font +248 1957 1871 ( DO NOT FORGET to set the monitor in the text mode before) 1871 SB +248 2025 820 (you terminate your program) 820 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +248 2093 126 ( }) 126 SB +32 0 0 50 50 0 1 0 46 /Bookman-Light /font7 ANSIFont font +248 2211 825 (unit NOCARD : function : integer;) 825 SB +248 2270 1923 ( { the value given by this function determines the type of the currently used) 1923 SB +248 2329 620 (monitor and it is equal to) 620 SB +248 2388 223 ( 1) 223 SB +32 0 0 50 50 0 1 0 46 /Bookman-Light /font7 ANSIFont font +471 2388 80 ( ) 80 SB +548 2388 589 (for Hercules mono card,) 589 SB +248 2447 160 ( ) 160 SB +398 2447 31 (2) 31 SB +429 2447 128 ( ) 128 SB +548 2447 444 (for IBM CGA color) 444 SB +248 2506 160 ( ) 160 SB +398 2506 31 (3) 31 SB +429 2506 128 ( ) 128 SB +548 2506 723 (for IBM CGA mono 320 x 200) 723 SB +248 2565 160 ( ) 160 SB +398 2565 31 (4) 31 SB +429 2565 128 ( ) 128 SB +548 2565 723 (for IBM CGA mono 640 x 200) 723 SB +248 2624 160 ( ) 160 SB +398 2624 31 (5) 31 SB +429 2624 128 ( ) 128 SB +548 2624 455 (for EGA/VGA card) 455 SB +32 0 0 50 50 0 1 0 46 /Bookman-Light /font7 ANSIFont font +248 2683 717 ( 6 for ATARI STE) 717 SB +248 2742 1431 ( 7 for Unix versions equipped with XWindows) 1431 SB +32 0 0 50 50 0 1 0 45 /Bookman-LightItalic /font8 ANSIFont font +248 2803 1888 ( You can not call the function nocard before GRON sets the graphic mode) 1888 SB +32 0 0 50 50 0 1 0 46 /Bookman-Light /font7 ANSIFont font +248 2859 126 ( }) 126 SB +32 0 0 50 50 0 0 0 47 /Bookman-Demi /font5 ANSIFont font +248 2977 108 (unit) 108 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +356 2978 164 ( CLS : ) 164 SB +32 0 0 50 50 0 0 0 47 /Bookman-Demi /font5 ANSIFont font +520 2977 261 (procedure) 261 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +781 2978 16 (;) 16 SB +248 3037 1386 ( { the screen will be cleared and filled with colour 0 }) 1386 SB +1 #C +statusdict begin /manualfeed false store end +EJ RS +%%PageTrailer +%%PageResources: font Bookman-Demi +%%+ font Bookman-DemiItalic +%%+ font Bookman-Light +%%+ font Bookman-LightItalic +%%Page: 3 3 +%%PageResources: (atend) +SS +0 0 12 16 799 1169 300 SM +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +0 0 0 fC +248 224 1080 (unit VIDEO : procedure\( A: array of integer\);) 1080 SB +248 283 80 ( ) 80 SB +32 0 0 50 50 0 1 0 46 /Bookman-Light /font7 ANSIFont font +328 283 1636 ( { this procedure can not be applied with egaint = EGA/VGA card }) 1636 SB +32 0 0 50 50 0 1 0 46 /Bookman-Light /font7 ANSIFont font +248 342 160 ( ) 160 SB +398 342 1383 ({ the worktime buffer will be associated with the array A.) 1383 SB +248 401 160 ( ) 160 SB +398 401 1507 ( A call of VIDEO does not change the contents of the buffer.) 1507 SB +248 460 160 ( ) 160 SB +398 460 1621 ( All subsequent calls of the procedures modifying the screen will) 1621 SB +248 519 160 ( ) 160 SB +398 519 1273 ( concern the array A. The screen does not change.) 1273 SB +248 578 160 ( ) 160 SB +398 578 1505 ( A ready image can be moved to the screen with the help of ) 1505 SB +1903 578 160 ( ) 160 SB +2048 578 160 ( ) 160 SB +248 637 160 ( ) 160 SB +398 637 1421 (GETMAP/PUTMAP procedures or it can be stored on disk.) 1421 SB +248 696 160 ( ) 160 SB +398 696 1387 ( The array should have 16 kBytes for IBM CGA card or) 1387 SB +248 755 160 ( ) 160 SB +398 755 743 ( 32 kBytes for Hercules card.}) 743 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +248 881 30 ({ ) 30 SB +32 0 0 58 58 0 0 0 54 /Bookman-Light /font7 ANSIFont font +278 873 1371 (PROCEDURES CONTROLLING THE COLOURS ) 1371 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +1649 881 14 (}) 14 SB +32 0 0 50 50 0 0 0 47 /Bookman-Demi /font5 ANSIFont font +248 1000 108 (unit) 108 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +356 1001 247 ( COLOR : ) 247 SB +32 0 0 50 50 0 0 0 47 /Bookman-Demi /font5 ANSIFont font +603 1000 261 (procedure) 261 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +864 1001 316 (\(co : integer\);) 316 SB +248 1060 14 ({) 14 SB +398 1060 563 (sets current color to co) 563 SB +398 1119 1365 (for monochrome displays, 0 means black, non-0 - white) 1365 SB +398 1178 965 (for color displays, 0 means background) 965 SB +248 1237 366 ( see PALLET) 366 SB +248 1296 14 (}) 14 SB +32 0 0 50 50 0 0 0 47 /Bookman-Demi /font5 ANSIFont font +248 1414 108 (unit) 108 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +356 1415 226 ( STYLE : ) 226 SB +32 0 0 50 50 0 0 0 47 /Bookman-Demi /font5 ANSIFont font +582 1414 261 (procedure) 261 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +843 1415 349 (\(styl : integer\);) 349 SB +248 1474 14 ({) 14 SB +398 1474 1218 (sets style of lines and fill shades to a combination) 1218 SB +398 1533 1214 (of current color and background color \(for mono -) 1214 SB +398 1592 1357 (white and black, respectively\) according to 5 predefined) 1357 SB +398 1651 221 (patterns:) 221 SB +548 1769 31 (0) 31 SB +698 1769 64 (....) 64 SB +548 1828 31 (1) 31 SB +698 1828 88 (****) 88 SB +548 1887 31 (2) 31 SB +698 1887 82 (***.) 82 SB +548 1946 31 (3) 31 SB +698 1946 76 (**..) 76 SB +548 2005 31 (4) 31 SB +698 2005 76 (*.*.) 76 SB +548 2064 31 (5) 31 SB +698 2064 70 (*...) 70 SB +398 2182 1311 (where '*' means current color, '.' background colour) 1311 SB +248 2241 1934 (When drawing the segments the subsequent pixels will have colour determined) 1934 SB +248 2300 1906 (by cyclic application of style pattern. The first and the last pixels of a segment) 1906 SB +248 2359 778 (will have always current colour.) 778 SB +248 2418 1962 (When filling contours the given style will be applied to horizontal lines with even) 1962 SB +248 2477 1540 (coordinate. The style for odd lines is determined automatically.) 1540 SB +248 2536 1009 (The same applies for perpendicular lines.) 1009 SB +248 2595 14 (}) 14 SB +32 0 0 50 50 0 0 0 47 /Bookman-Demi /font5 ANSIFont font +248 2772 108 (unit) 108 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +356 2773 289 ( BORDER : ) 289 SB +32 0 0 50 50 0 0 0 47 /Bookman-Demi /font5 ANSIFont font +645 2772 261 (procedure) 261 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +906 2773 743 ( \(background_Colour: integer\);) 743 SB +398 2891 1285 ({ sets actual background color to i \( i = 0,1,...,15 \) }) 1285 SB +32 0 0 50 50 0 0 0 47 /Bookman-Demi /font5 ANSIFont font +248 3068 108 (unit) 108 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +356 3069 256 ( PALLET : ) 256 SB +32 0 0 50 50 0 0 0 47 /Bookman-Demi /font5 ANSIFont font +612 3068 261 (procedure) 261 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +873 3069 333 ( \(nr : integer\);) 333 SB +398 3128 14 ({) 14 SB +1 #C +statusdict begin /manualfeed false store end +EJ RS +%%PageTrailer +%%PageResources: font Bookman-Demi +%%+ font Bookman-Light +%%Page: 4 4 +%%PageResources: (atend) +SS +0 0 12 16 799 1169 300 SM +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +0 0 0 fC +248 283 799 (the codes of colors are as follows) 799 SB +548 342 31 (0) 31 SB +698 342 132 (black) 132 SB +548 401 31 (1) 31 SB +698 401 235 (blue dark) 235 SB +548 460 31 (2) 31 SB +698 460 263 (green dark) 263 SB +548 519 31 (3) 31 SB +698 519 362 (turquoise dark) 362 SB +548 578 31 (4) 31 SB +698 578 208 (red dark) 208 SB +548 637 31 (5) 31 SB +698 637 129 (violet) 129 SB +548 696 31 (6) 31 SB +698 696 153 (brown) 153 SB +548 755 31 (7) 31 SB +698 755 227 (grey light) 227 SB +548 814 31 (8) 31 SB +698 814 231 (grey dark) 231 SB +548 873 31 (9) 31 SB +698 873 106 (blue) 106 SB +548 932 62 (10) 62 SB +698 932 134 (green) 134 SB +548 991 62 (11) 62 SB +698 991 233 (turquoise) 233 SB +548 1050 62 (12) 62 SB +698 1050 204 (red light) 204 SB +548 1109 62 (13) 62 SB +698 1109 102 (rose) 102 SB +548 1168 62 (14) 62 SB +698 1168 150 (yellow) 150 SB +548 1227 62 (15) 62 SB +698 1227 132 (white) 132 SB +248 1345 110 ( }) 110 SB +248 1589 30 ({ ) 30 SB +32 0 0 58 58 0 0 0 54 /Bookman-Light /font7 ANSIFont font +278 1581 1180 (PROCEDURES CONTROLLING POSITION) 1180 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +1458 1589 30 ( }) 30 SB +32 0 0 50 50 0 0 0 47 /Bookman-Demi /font5 ANSIFont font +248 1708 108 (unit) 108 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +356 1709 221 ( MOVE : ) 221 SB +32 0 0 50 50 0 0 0 47 /Bookman-Demi /font5 ANSIFont font +577 1708 261 (procedure) 261 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +838 1709 333 ( \(x,y :integer\);) 333 SB +248 1768 1857 ( { procedure MOVE sets the current position on the screen on the pixel ) 1857 SB +398 1827 405 (with coordinates) 405 SB +248 1886 503 ( x - column,) 503 SB +248 1945 438 ( y - line }) 438 SB +248 2004 746 ( { precondition of MOVE:) 746 SB +248 2068 303 ( 0) 303 SB +32 0 0 50 50 0 0 0 51 /Symbol font +gs 578 3396 0 0 CB +551 2063 27 (\243) 27 SB +gr +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +578 2068 28 (x) 28 SB +32 0 0 50 50 0 0 0 51 /Symbol font +gs 633 3396 0 0 CB +606 2063 27 (\243) 27 SB +gr +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +633 2068 258 (MaxX & 0) 258 SB +32 0 0 50 50 0 0 0 51 /Symbol font +gs 918 3396 0 0 CB +891 2063 27 (\243) 27 SB +gr +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +918 2068 27 (y) 27 SB +32 0 0 50 50 0 0 0 51 /Symbol font +gs 972 3396 0 0 CB +945 2063 27 (\243) 27 SB +gr +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +972 2068 135 (MaxY) 135 SB +248 2128 174 ( }) 174 SB +32 0 0 50 50 0 0 0 47 /Bookman-Demi /font5 ANSIFont font +248 2246 108 (unit) 108 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +356 2247 258 ( INXPOS : ) 258 SB +32 0 0 50 50 0 0 0 47 /Bookman-Demi /font5 ANSIFont font +614 2246 221 (function) 221 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +835 2247 216 (: integer;) 216 SB +248 2306 1758 ( { function INXPOS returns the x coordinate of the current position }) 1758 SB +32 0 0 50 50 0 0 0 47 /Bookman-Demi /font5 ANSIFont font +248 2483 108 (unit) 108 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +356 2484 254 ( INYPOS : ) 254 SB +32 0 0 50 50 0 0 0 47 /Bookman-Demi /font5 ANSIFont font +610 2483 221 (function) 221 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +831 2484 232 ( : integer;) 232 SB +248 2543 1769 ( { function INYPOS returns the y coordinate of the current position }) 1769 SB +32 0 0 50 50 0 0 0 47 /Bookman-Demi /font5 ANSIFont font +248 2720 108 (unit) 108 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +356 2721 275 ( PUSHXY : ) 275 SB +32 0 0 50 50 0 0 0 47 /Bookman-Demi /font5 ANSIFont font +631 2720 261 (procedure) 261 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +892 2721 16 (;) 16 SB +248 2780 14 ({) 14 SB +398 2780 1302 (pushes current position, color & style onto the stack.) 1302 SB +398 2839 1094 (The stack is kept internally, max depth is 16) 1094 SB +248 2898 14 (}) 14 SB +32 0 0 50 50 0 0 0 47 /Bookman-Demi /font5 ANSIFont font +248 3075 125 (unit ) 125 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +373 3076 202 (POPXY: ) 202 SB +32 0 0 50 50 0 0 0 47 /Bookman-Demi /font5 ANSIFont font +575 3075 261 (procedure) 261 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +836 3076 16 (;) 16 SB +1 #C +statusdict begin /manualfeed false store end +EJ RS +%%PageTrailer +%%PageResources: font Bookman-Demi +%%+ font Bookman-Light +%%+ font Symbol +%%Page: 5 5 +%%PageResources: (atend) +SS +0 0 12 16 799 1169 300 SM +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +0 0 0 fC +248 224 14 ({) 14 SB +398 224 1288 (restores position, color & style from internal stack }) 1288 SB +248 342 242 ({ Example) 242 SB +248 401 699 (unit DIAGONAL : procedure;) 699 SB +248 460 506 ( var ix, iy : integer;) 506 SB +248 519 132 (begin) 132 SB +398 578 328 (call PUSHXY;) 328 SB +398 637 331 (ix := INXPOS;) 331 SB +398 696 326 (iy := INYPOS;) 326 SB +398 755 606 (call DRAW\(ix+10, iy+10\);) 606 SB +398 814 271 (call POPXY) 271 SB +248 873 394 (end DIAGONAL;) 394 SB +248 932 14 (}) 14 SB +248 1168 1088 ({ PROCEDURES SERVING POINTS & LINES}) 1088 SB +32 0 0 50 50 0 0 0 47 /Bookman-Demi /font5 ANSIFont font +248 1286 108 (unit) 108 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +356 1287 220 ( POINT : ) 220 SB +32 0 0 50 50 0 0 0 47 /Bookman-Demi /font5 ANSIFont font +576 1286 261 (procedure) 261 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +837 1287 317 (\(x,y: integer\);) 317 SB +248 1346 14 ({) 14 SB +548 1346 1635 (moves current position to pixel \(x,y\) and sets it to the current color) 1635 SB +248 1405 30 ( }) 30 SB +32 0 0 50 50 0 0 0 47 /Bookman-Demi /font5 ANSIFont font +248 1523 108 (unit) 108 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +356 1524 202 ( INPIX : ) 202 SB +32 0 0 50 50 0 0 0 47 /Bookman-Demi /font5 ANSIFont font +558 1523 221 (function) 221 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +779 1524 565 ( \(x,y : integer\) : integer;) 565 SB +398 1583 14 ({) 14 SB +548 1642 1179 (moves to pixel \(x,y\) and returns its color setting;) 1179 SB +398 1701 14 (}) 14 SB +32 0 0 50 50 0 0 0 47 /Bookman-Demi /font5 ANSIFont font +248 1878 108 (unit) 108 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +356 1879 222 ( DRAW : ) 222 SB +32 0 0 50 50 0 0 0 47 /Bookman-Demi /font5 ANSIFont font +578 1878 261 (procedure) 261 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +839 1879 349 (\( x,y : integer\);) 349 SB +398 1938 14 ({) 14 SB +398 1998 1104 (draws a line from current screen position to \() 1104 SB +32 0 0 50 50 0 0 0 45 /Bookman-LightItalic /font8 ANSIFont font +1502 1999 72 (x,y) 72 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +1574 1998 31 (\);) 31 SB +398 2058 600 (sets current position to \() 600 SB +32 0 0 50 50 0 0 0 45 /Bookman-LightItalic /font8 ANSIFont font +998 2059 72 (x,y) 72 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +1070 2058 31 (\);) 31 SB +398 2117 1357 (line is drawn in current color, with both terminal pixels) 1357 SB +398 2176 1306 (always turned white \( non-background\) for non-black) 1306 SB +398 2235 724 (\( non-background \) line color.) 724 SB +32 0 0 50 50 0 1 0 46 /Bookman-Light /font7 ANSIFont font +248 2294 160 ( ) 160 SB +398 2294 1558 (Bresenham's algorithm is used, pixels belonging to the segment) 1558 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +398 2353 1407 (change their state depending on current colour and style.) 1407 SB +398 2412 14 (}) 14 SB +32 0 0 50 50 0 0 0 47 /Bookman-Demi /font5 ANSIFont font +248 2530 108 (unit) 108 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +356 2531 200 ( intens: ) 200 SB +32 0 0 50 50 0 0 0 47 /Bookman-Demi /font5 ANSIFont font +556 2530 261 (procedure) 261 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +817 2531 1113 (\(Size :integer; xCoord,yCoord:arrayof integer, ) 1113 SB +548 2590 545 (Colour,Filled :integer\);) 545 SB +248 2649 491 (/* draw a polygon*/) 491 SB +248 2708 1924 ({ draw a simple, closed polygon of Size points, the edges of the polygon go from) 1924 SB +248 2768 15 (\() 15 SB +32 0 0 50 50 0 0 0 45 /Bookman-LightItalic /font8 ANSIFont font +263 2769 451 (xCoord[i], yCoord[i]) 451 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +714 2768 109 (\) to \() 109 SB +32 0 0 50 50 0 0 0 45 /Bookman-LightItalic /font8 ANSIFont font +823 2769 573 (xCoord[i+1], yCoord[i+1]) 573 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +1396 2768 482 (\) for i = 1, ..., Size-1) 482 SB +248 2828 581 (The colour used will be ) 581 SB +32 0 0 50 50 0 0 0 45 /Bookman-LightItalic /font8 ANSIFont font +829 2829 155 (Colour) 155 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +984 2828 713 (. The polygon will be filled iff ) 713 SB +32 0 0 50 50 0 0 0 45 /Bookman-LightItalic /font8 ANSIFont font +1697 2829 132 (Filled) 132 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +1829 2828 107 (<>0.) 107 SB +248 2887 14 (}) 14 SB +32 0 0 50 50 0 0 0 47 /Bookman-Demi /font5 ANSIFont font +248 3005 108 (unit) 108 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +356 3006 191 ( CIRB : ) 191 SB +32 0 0 50 50 0 0 0 47 /Bookman-Demi /font5 ANSIFont font +547 3005 261 (procedure) 261 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +808 3006 925 ( \(xi, yi, rx,ry : integer, alfa, beta : real,) 925 SB +998 3065 622 ( cbord, fill : integer\);) 622 SB +1 #C +statusdict begin /manualfeed false store end +EJ RS +%%PageTrailer +%%PageResources: font Bookman-Demi +%%+ font Bookman-Light +%%+ font Bookman-LightItalic +%%Page: 6 6 +%%PageResources: (atend) +SS +0 0 12 16 799 1169 300 SM +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +0 0 0 fC +398 224 14 ({) 14 SB +398 283 1566 (draws a circle \(or ellipse, depending on aspect value, see below\),) 1566 SB +398 342 680 (optionally filling its interior;) 680 SB +398 401 655 (does not preserve position;) 655 SB +398 461 15 (\() 15 SB +32 0 0 50 50 0 0 0 45 /Bookman-LightItalic /font8 ANSIFont font +413 462 100 (xi,yi) 100 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +513 461 643 (\) - are center coordinates,) 643 SB +32 0 0 50 50 0 0 0 45 /Bookman-LightItalic /font8 ANSIFont font +398 522 47 (rx) 47 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +445 521 780 ( - radius in pixels \(horizontally\),) 780 SB +32 0 0 50 50 0 0 0 45 /Bookman-LightItalic /font8 ANSIFont font +398 582 50 (ry) 50 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +448 581 875 ( - radius in pixels \(perpendicularly\),) 875 SB +32 0 0 50 50 0 0 0 45 /Bookman-LightItalic /font8 ANSIFont font +398 642 228 (alfa, beta) 228 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +626 641 1095 ( - starting & ending angles; if alfa=beta a full) 1095 SB +398 700 1337 ( circle is drawn; values should be given in radians;) 1337 SB +32 0 0 50 50 0 0 0 45 /Bookman-LightItalic /font8 ANSIFont font +398 761 133 (cbord) 133 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +531 760 363 ( - border color,) 363 SB +32 0 0 50 50 0 0 0 45 /Bookman-LightItalic /font8 ANSIFont font +398 821 59 (fill) 59 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +457 820 1220 ( - if fill <>0, interior is filled in current style&color) 1220 SB +398 879 14 (}) 14 SB +32 0 0 50 50 0 0 0 47 /Bookman-Demi /font5 ANSIFont font +248 997 108 (unit) 108 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +356 998 142 ( hfill: ) 142 SB +32 0 0 50 50 0 0 0 47 /Bookman-Demi /font5 ANSIFont font +498 997 261 (procedure) 261 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +759 998 306 (\( x : integer\);) 306 SB +248 1057 1568 ( { draw an horizontal line between the current position and) 1568 SB +398 1116 1513 (\(x,currentY\) with the current color, after it change the current) 1513 SB +398 1175 578 (position to \(x, currentY\)) 578 SB +248 1234 142 ( }) 142 SB +32 0 0 50 50 0 0 0 47 /Bookman-Demi /font5 ANSIFont font +248 1352 125 (unit ) 125 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +373 1353 119 (vfill: ) 119 SB +32 0 0 50 50 0 0 0 47 /Bookman-Demi /font5 ANSIFont font +492 1352 261 (procedure) 261 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +753 1353 305 (\( y : integer\);) 305 SB +248 1412 1467 ( { draw a vertical line between the current position and) 1467 SB +398 1471 1516 (\(currentX,y\) with the current color, after it change the current) 1516 SB +398 1530 565 (position to \(currentX,y\)) 565 SB +248 1589 126 ( }) 126 SB +32 0 0 50 50 0 0 0 47 /Bookman-Demi /font5 ANSIFont font +248 1707 108 (unit) 108 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +356 1708 208 ( patern: ) 208 SB +32 0 0 50 50 0 0 0 47 /Bookman-Demi /font5 ANSIFont font +564 1707 261 (procedure) 261 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +825 1708 649 (\( x1,y1,x2,y2,c,b : integer\);) 649 SB +248 1768 356 ( { draw a ) 356 SB +32 0 0 50 50 0 0 0 47 /Bookman-DemiItalic /font6 ANSIFont font +604 1767 249 (rectangle) 249 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +853 1768 509 ( between the points \() 509 SB +32 0 0 50 50 0 0 0 45 /Bookman-LightItalic /font8 ANSIFont font +1362 1769 134 (x1,y1) 134 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +1496 1768 155 (\) and \() 155 SB +32 0 0 50 50 0 0 0 45 /Bookman-LightItalic /font8 ANSIFont font +1651 1769 58 (x2) 58 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +1709 1768 16 (,) 16 SB +32 0 0 50 50 0 0 0 45 /Bookman-LightItalic /font8 ANSIFont font +1725 1769 61 (y2) 61 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +1786 1768 231 (\) with the) 231 SB +248 1828 16 ( ) 16 SB +398 1828 135 (color ) 135 SB +32 0 0 50 50 0 0 0 45 /Bookman-LightItalic /font8 ANSIFont font +533 1829 24 (c) 24 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +557 1828 879 ( \(the current color is not change\). if ) 879 SB +32 0 0 50 50 0 0 0 45 /Bookman-LightItalic /font8 ANSIFont font +1436 1829 30 (b) 30 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +1466 1828 442 (=0 then the box is) 442 SB +248 1887 16 ( ) 16 SB +398 1887 516 (empty else it is filled.) 516 SB +248 1946 126 ( }) 126 SB +248 2072 30 ({ ) 30 SB +32 0 0 58 58 0 0 0 54 /Bookman-Light /font7 ANSIFont font +278 2064 938 (Procedures operating on bitmaps) 938 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +1216 2072 30 ( }) 30 SB +32 0 0 50 50 0 0 0 47 /Bookman-Demi /font5 ANSIFont font +248 2191 108 (unit) 108 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +356 2192 282 ( GETMAP : ) 282 SB +32 0 0 50 50 0 0 0 47 /Bookman-Demi /font5 ANSIFont font +638 2191 221 (function) 221 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +859 2192 381 ( \(x,y : integer\) : ) 381 SB +32 0 0 50 50 0 0 0 47 /Bookman-Demi /font5 ANSIFont font +1240 2191 185 (arrayof) 185 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +1425 2192 200 ( integer;) 200 SB +248 2251 128 ( ) 128 SB +398 2251 1263 ({saves rectangular area between current position as) 1263 SB +398 2310 1179 (top left corner and \(ix,iy\) as bottom right corner,) 1179 SB +398 2369 552 (including border lines;) 552 SB +398 2428 713 (position remains unchanged.) 713 SB +398 2487 686 (array of integer should have) 686 SB +548 2551 191 (4+\(rows) 191 SB +32 0 0 50 50 0 0 0 51 /Symbol font +gs 752 3396 0 0 CB +739 2546 13 (\327) 13 SB +gr +gs 771 3396 0 0 CB +752 2546 19 (\351) 19 SB +gr +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +771 2551 270 (columns/8) 270 SB +32 0 0 50 50 0 0 0 51 /Symbol font +gs 1060 3396 0 0 CB +1041 2546 19 (\371) 19 SB +gr +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +1060 2551 16 ( ) 16 SB +32 0 0 50 50 0 0 0 51 /Symbol font +gs 1089 3396 0 0 CB +1076 2546 13 (\327) 13 SB +gr +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +1089 2551 127 (coeff\)) 127 SB +398 2611 1601 (bytes. The coefficient coeff is 1 for Hercules, 2 for CGA, 4 for EGA) 1601 SB +248 2670 16 ( ) 16 SB +398 2670 124 (card.) 124 SB +248 2729 1830 ( ATTENTION: in DOS 286 environment a bigger size of the array may ) 1830 SB +398 2789 543 (necessitate the use of ) 543 SB +32 0 0 50 50 0 0 0 45 /Bookman-LightItalic /font8 ANSIFont font +941 2790 145 (loglan) 145 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +1086 2789 122 ( with) 122 SB +32 0 0 50 50 0 0 0 45 /Bookman-LightItalic /font8 ANSIFont font +1208 2790 336 ( the option H+) 336 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +1544 2789 474 (, see also memavail) 474 SB +248 2848 190 ( }) 190 SB +32 0 0 50 50 0 0 0 47 /Bookman-Demi /font5 ANSIFont font +248 2966 108 (unit) 108 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +356 2967 276 ( PUTMAP : ) 276 SB +32 0 0 50 50 0 0 0 47 /Bookman-Demi /font5 ANSIFont font +632 2966 261 (procedure) 261 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +893 2967 108 ( \( a: ) 108 SB +32 0 0 50 50 0 0 0 47 /Bookman-Demi /font5 ANSIFont font +1001 2966 185 (arrayof) 185 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +1186 2967 215 ( integer\);) 215 SB +398 3026 1256 ({sets rectangular area of screen pixels to that saved) 1256 SB +398 3085 569 (by "getmap" in "iarray";) 569 SB +398 3144 1267 (same size is restored, with top left corner in current) 1267 SB +1 #C +statusdict begin /manualfeed false store end +EJ RS +%%PageTrailer +%%PageResources: font Bookman-Demi +%%+ font Bookman-DemiItalic +%%+ font Bookman-Light +%%+ font Bookman-LightItalic +%%+ font Symbol +%%Page: 7 7 +%%PageResources: (atend) +SS +0 0 12 16 799 1169 300 SM +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +0 0 0 fC +398 224 211 (position;) 211 SB +398 283 713 (position remains unchanged.) 713 SB +398 342 14 (}) 14 SB +32 0 0 50 50 0 0 0 47 /Bookman-Demi /font5 ANSIFont font +248 460 108 (unit) 108 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +356 461 251 ( ORMAP : ) 251 SB +32 0 0 50 50 0 0 0 47 /Bookman-Demi /font5 ANSIFont font +607 460 261 (procedure) 261 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +868 461 124 ( \( a : ) 124 SB +32 0 0 50 50 0 0 0 47 /Bookman-Demi /font5 ANSIFont font +992 460 202 (arrayof ) 202 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +1194 461 199 (integer\);) 199 SB +398 520 1355 ({same as putmap, but saved bitmap is or'ed into screen) 1355 SB +398 579 494 (rather than just set.) 494 SB +398 638 14 (}) 14 SB +32 0 0 50 50 0 0 0 47 /Bookman-Demi /font5 ANSIFont font +248 756 108 (unit) 108 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +356 757 287 ( XORMAP : ) 287 SB +32 0 0 50 50 0 0 0 47 /Bookman-Demi /font5 ANSIFont font +643 756 261 (procedure) 261 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +904 757 108 ( \( a: ) 108 SB +32 0 0 50 50 0 0 0 47 /Bookman-Demi /font5 ANSIFont font +1012 756 185 (arrayof) 185 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +1197 757 215 ( integer\);) 215 SB +398 816 1383 ({same as putmap, but saved bitmap is xor'ed into screen) 1383 SB +398 875 494 (rather than just set.) 494 SB +398 934 14 (}) 14 SB +248 1119 14 ({) 14 SB +32 0 0 58 58 0 0 0 54 /Bookman-Light /font7 ANSIFont font +262 1111 1348 (Procedures operating on characters and strings) 1348 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +1610 1119 14 (}) 14 SB +32 0 0 50 50 0 0 0 47 /Bookman-Demi /font5 ANSIFont font +248 1238 108 (unit) 108 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +356 1239 271 ( outstring: ) 271 SB +32 0 0 50 50 0 0 0 47 /Bookman-Demi /font5 ANSIFont font +627 1238 261 (procedure) 261 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +888 1239 1236 (\(x,y: integer, s: string, back_col, front_col: integer\);) 1236 SB +248 1299 78 ( { ) 78 SB +32 0 0 50 50 0 0 0 45 /Bookman-LightItalic /font8 ANSIFont font +326 1300 87 (x, y) 87 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +413 1299 1079 ( are the coordinates where to put the string,) 1079 SB +248 1359 96 ( ) 96 SB +32 0 0 50 50 0 0 0 45 /Bookman-LightItalic /font8 ANSIFont font +344 1360 27 (s) 27 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +371 1359 780 ( is the string to be shown, in ) 780 SB +32 0 0 50 50 0 0 0 45 /Bookman-LightItalic /font8 ANSIFont font +1151 1360 202 (front_col) 202 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +1353 1359 525 ( colour letters on the ) 525 SB +32 0 0 50 50 0 0 0 45 /Bookman-LightItalic /font8 ANSIFont font +1878 1360 205 (back_col) 205 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +398 1418 461 (colour background) 461 SB +248 1477 78 ( }) 78 SB +32 0 0 50 50 0 0 0 47 /Bookman-Demi /font5 ANSIFont font +248 1595 125 (unit ) 125 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +373 1596 175 ( track: ) 175 SB +32 0 0 50 50 0 0 0 47 /Bookman-Demi /font5 ANSIFont font +548 1595 261 (procedure) 261 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +809 1596 559 (\( x,y,c,valeur : integer\);) 559 SB +248 1715 62 ( {) 62 SB +398 1715 545 (write an integer value ) 545 SB +32 0 0 50 50 0 0 0 45 /Bookman-LightItalic /font8 ANSIFont font +943 1716 150 (valeur) 150 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +1093 1715 400 ( at the position \() 400 SB +32 0 0 50 50 0 0 0 45 /Bookman-LightItalic /font8 ANSIFont font +1493 1716 72 (x,y) 72 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +1565 1715 382 (\) with the color ) 382 SB +32 0 0 50 50 0 0 0 45 /Bookman-LightItalic /font8 ANSIFont font +1947 1716 24 (c) 24 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +1971 1715 16 (.) 16 SB +398 1774 1494 ( It does not change the current position nor the current color) 1494 SB +248 1833 62 ( }) 62 SB +32 0 0 50 50 0 0 0 47 /Bookman-Demi /font5 ANSIFont font +248 1951 108 (unit) 108 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +356 1952 196 ( inkey : ) 196 SB +32 0 0 50 50 0 0 0 47 /Bookman-Demi /font5 ANSIFont font +552 1951 221 (function) 221 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +773 1952 232 ( : integer;) 232 SB +248 2070 1257 ( { returns next character from keyboard buffer;) 1257 SB +398 2129 764 (0 is returned if buffer is empty;) 764 SB +398 2188 1155 (special keys are returned as negative numbers;) 1155 SB +398 2247 1462 (ALT-NUM method may be used for entering character codes) 1462 SB +398 2306 1297 (above 127 \(this makes entering special keys 128-132) 1297 SB +398 2365 291 (impossible\);) 291 SB +398 2424 1069 (if a character is returned, it is also removed) 1069 SB +398 2483 1290 (from the buffer, so MS-DOS will not see it \(CTRL-C!\);) 1290 SB +398 2542 1020 (typeahead is allowed, echo is suppressed.) 1020 SB +248 2601 62 ( }) 62 SB +32 0 0 50 50 0 0 0 47 /Bookman-Demi /font5 ANSIFont font +248 2719 108 (unit) 108 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +356 2720 242 ( HASCII : ) 242 SB +32 0 0 50 50 0 0 0 47 /Bookman-Demi /font5 ANSIFont font +598 2719 261 (procedure) 261 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +859 2720 272 (\(c: integer\);) 272 SB +398 2779 806 ({'xor's the character = chr\(c\) in a ) 806 SB +32 0 0 50 50 0 1 0 46 /Bookman-Light /font7 ANSIFont font +1204 2779 84 (8*8) 84 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +1288 2779 584 ( box with top left corner) 584 SB +398 2838 567 (in the current position;) 567 SB +398 2897 652 (moves current position by ) 652 SB +32 0 0 50 50 0 1 0 46 /Bookman-Light /font7 ANSIFont font +1050 2897 108 (\(8,0\)) 108 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +1158 2897 16 (;) 16 SB +248 2956 16 ( ) 16 SB +398 2956 1403 (call hascii\(0\)- sets complete box to black \( =background \),) 1403 SB +398 3015 664 (with no change in position.) 664 SB +32 0 0 50 50 0 1 0 46 /Bookman-Light /font7 ANSIFont font +248 3074 160 ( ) 160 SB +398 3074 1295 (BIOS ROM font for IBM color card is used. If the font) 1295 SB +248 3133 160 ( ) 160 SB +398 3133 1315 (table is not at F000:FA6E, the character will probably) 1315 SB +1 #C +statusdict begin /manualfeed false store end +EJ RS +%%PageTrailer +%%PageResources: font Bookman-Demi +%%+ font Bookman-Light +%%+ font Bookman-LightItalic +%%Page: 8 8 +%%PageResources: (atend) +SS +0 0 12 16 799 1169 300 SM +32 0 0 50 50 0 1 0 46 /Bookman-Light /font7 ANSIFont font +0 0 0 fC +248 224 160 ( ) 160 SB +398 224 1112 (be unrecognizable, and most certainly wrong.) 1112 SB +248 283 160 ( ) 160 SB +398 283 1340 (For codes >127, table pointed to by interrupt vector 31) 1340 SB +248 342 160 ( ) 160 SB +398 342 190 (is used.) 190 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +588 342 30 ( }) 30 SB +32 0 0 50 50 0 0 0 47 /Bookman-Demi /font5 ANSIFont font +248 578 125 (unit ) 125 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +373 579 161 (hfont: ) 161 SB +32 0 0 50 50 0 0 0 47 /Bookman-Demi /font5 ANSIFont font +534 578 221 (function) 221 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +755 579 1238 (\( x,y,lg,min,max,default,col_f,col_e,col_c : integer\): ) 1238 SB +1298 638 344 ( integer;) 344 SB +248 757 142 ( {) 142 SB +398 757 832 (arrange a small 1 line window for ) 832 SB +32 0 0 50 50 0 0 0 47 /Bookman-DemiItalic /font6 ANSIFont font +1230 756 205 (reading) 205 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +1435 757 646 ( an integer value from this) 646 SB +248 816 201 (window,) 201 SB +248 876 905 (the position of the window corner is \() 905 SB +32 0 0 50 50 0 0 0 45 /Bookman-LightItalic /font8 ANSIFont font +1153 877 87 (x, y) 87 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +1240 876 31 (\),) 31 SB +248 936 675 (the length of the window is ) 675 SB +32 0 0 50 50 0 0 0 45 /Bookman-LightItalic /font8 ANSIFont font +923 937 42 (lg) 42 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +965 936 290 ( characters,) 290 SB +248 996 855 (the value v should be greater than ) 855 SB +32 0 0 50 50 0 0 0 45 /Bookman-LightItalic /font8 ANSIFont font +1103 997 89 (min) 89 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +1192 996 451 ( and smaller than ) 451 SB +32 0 0 50 50 0 0 0 45 /Bookman-LightItalic /font8 ANSIFont font +1643 997 102 (max) 102 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +1745 996 16 (,) 16 SB +248 1056 607 (the default value read is ) 607 SB +32 0 0 50 50 0 0 0 45 /Bookman-LightItalic /font8 ANSIFont font +855 1057 169 (default) 169 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +1024 1056 16 (,) 16 SB +248 1116 675 (the colour of the window is ) 675 SB +32 0 0 50 50 0 0 0 45 /Bookman-LightItalic /font8 ANSIFont font +923 1117 107 (col_f) 107 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +1030 1116 16 (,) 16 SB +248 1176 623 (the colour of the digits is ) 623 SB +32 0 0 50 50 0 0 0 45 /Bookman-LightItalic /font8 ANSIFont font +871 1177 132 (col_e,) 132 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +248 1236 554 (the colour of cursor is ) 554 SB +32 0 0 50 50 0 0 0 45 /Bookman-LightItalic /font8 ANSIFont font +802 1237 114 (col_c) 114 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +248 1354 1793 ( reads in graphic mode an integer in the window which begins at the \(x,y\)) 1793 SB +398 1413 1609 (position, window is lg caracteres long. the maximum length of the) 1609 SB +398 1472 1653 (integer that is read is 10. there is a default value, a minimum value) 1653 SB +398 1531 1704 (and a maximum value. the window is drawn with the col_f color, the ) 1704 SB +398 1590 1568 (cursor is in the col_c color and the integer is writing in the col_e) 1568 SB +398 1649 1542 (color. you can use 0..9,+,-,backspace,escape and return keys. }) 1542 SB +32 0 0 50 50 0 0 0 47 /Bookman-Demi /font5 ANSIFont font +248 1826 108 (unit) 108 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +356 1827 245 ( HPAGE : ) 245 SB +32 0 0 50 50 0 0 0 47 /Bookman-Demi /font5 ANSIFont font +601 1826 261 (procedure) 261 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +862 1827 1332 (\(x,y,long: integer, A: arrayof char, back, front: integer\);) 1332 SB +398 1887 1432 ({ this procedure arranges a 1-line high window in position ) 1432 SB +32 0 0 50 50 0 0 0 45 /Bookman-LightItalic /font8 ANSIFont font +1830 1888 72 (x,y) 72 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +1902 1887 245 ( of length ) 245 SB +32 0 0 50 50 0 0 0 45 /Bookman-LightItalic /font8 ANSIFont font +398 1948 100 (long) 100 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +498 1947 647 ( in which a portion of text ) 647 SB +32 0 0 50 50 0 0 0 45 /Bookman-LightItalic /font8 ANSIFont font +1145 1948 35 (A) 35 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +1180 1947 481 ( is shown in colour ) 481 SB +32 0 0 50 50 0 0 0 45 /Bookman-LightItalic /font8 ANSIFont font +1661 1948 112 (front) 112 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +1773 1947 187 ( on the ) 187 SB +398 2007 477 (background colour ) 477 SB +32 0 0 50 50 0 0 0 45 /Bookman-LightItalic /font8 ANSIFont font +875 2008 115 (back) 115 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +990 2007 16 (.) 16 SB +398 2066 1621 (Making use of keys controlling the cursor {left, right, PgUp, PgDn}) 1621 SB +398 2125 1697 (the user can scroll the text \(horizontally\) in the window. Pressing the ) 1697 SB +398 2184 884 (Enter key terminates the procedure}) 884 SB +32 0 0 50 50 0 0 0 47 /Bookman-Demi /font5 ANSIFont font +248 2302 95 (end) 95 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +343 2303 334 ( IIUWGRAPH;) 334 SB +1 #C +statusdict begin /manualfeed false store end +EJ RS +%%PageTrailer +%%PageResources: font Bookman-Demi +%%+ font Bookman-DemiItalic +%%+ font Bookman-Light +%%+ font Bookman-LightItalic +%%Page: 9 9 +%%PageResources: (atend) +SS +0 0 12 16 799 1169 300 SM +32 0 0 50 50 0 0 0 47 /Bookman-Demi /font5 ANSIFont font +0 0 0 fC +248 283 125 (unit ) 125 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +373 284 226 (MOUSE: ) 226 SB +32 0 0 50 50 0 0 0 47 /Bookman-Demi /font5 ANSIFont font +599 283 127 (class) 127 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +726 284 16 (;) 16 SB + +%%BeginResource: font MSTT31c2a0 +/GreNewFont{10 dict dup 3 1 roll def dup begin 6 1 roll/FontType 3 +def/FontMatrix exch def/FontBBox exch def/FontInfo 2 dict def FontInfo +/UnderlinePosition 3 -1 roll put FontInfo/UnderlineThickness 3 -1 +roll put/Encoding 256 array def 0 1 255{Encoding exch/.notdef put}for +/CharProcs 256 dict def CharProcs/.notdef{}put/Metrics 256 dict def +Metrics/.notdef 3 -1 roll put/BuildChar{/char exch def/fontdict exch +def/charname fontdict/Encoding get char get def fontdict/Metrics get +charname get aload pop setcachedevice fontdict begin Encoding char +get CharProcs exch get end exec}def end definefont pop}def/AddChar{begin +Encoding 3 1 roll put CharProcs 3 1 roll put Metrics 3 1 roll put end}def +/MSTT31c2a0 [42.0 0 0 0 0 0] 47 -115 [-42.0 -42.0 42.0 42.0] [1 42 div 0 0 1 42 div 0 0] /MSTT31c2a0 GreNewFont +%%EndResource + +32 0 0 42 42 0 0 1 38 /MSTT31c2a0 font + +%%BeginResource: font MSTT31c2a0 +/G7b [20.0 0.0 3.0 -8.0 16.0 28.0] +/G7b { + 13 36 true [1 0 0 -1 -3.0 28.0] {<003800e00180038007000f000f000f000f800f80078007800780070006000c003000c00070000c00 +0e0007000780078007800f800f800f000f000f000f000700038001c000e00018>} imagemask + } + 123 /G7b MSTT31c2a0 AddChar +%%EndResource + +248 402 20 ({) 20 SB + +%%BeginResource: font MSTT31c282 +/MSTT31c282 [42.0 0 0 0 0 0] 47 -115 [-42.0 -42.0 42.0 42.0] [1 42 div 0 0 1 42 div 0 0] /MSTT31c282 GreNewFont +%%EndResource + +32 0 0 42 42 0 0 1 38 /MSTT31c282 font + +%%BeginResource: font MSTT31c282 +/G69 [12.0 0.0 1.0 0.0 10.0 26.0] +/G69 { + 9 26 true [1 0 0 -1 -1.0 26.0] {<038003800380000000000000000007003f0007000e000e000e000e001c001c001c00380038003800 +7800700072007400f8007000>} imagemask + } + 105 /G69 MSTT31c282 AddChar +/G6e [21.0 0.0 0.0 0.0 19.0 19.0] +/G6e { + 19 19 true [1 0 0 -1 0.0 19.0] {<0703c03f0fc00719e00e31e00e61c00e41c00c81c01d03c01e03801e03803c07803c070038070038 +0f00700e00700e40700e80e01f00e00e00>} imagemask + } + 110 /G6e MSTT31c282 AddChar +/G74 [12.0 0.0 1.0 0.0 13.0 25.0] +/G74 { + 12 25 true [1 0 0 -1 -1.0 25.0] {<004000800180018003800f003ff00f000f000e000e001e001c001c001c003c003800380038007800 +700073007200fc007000>} imagemask + } + 116 /G74 MSTT31c282 AddChar +%%EndResource + +398 402 57 (init) 57 SB +32 0 0 42 42 0 0 1 38 /MSTT31c2a0 font + +%%BeginResource: font MSTT31c2a0 +/G20 [11.0 0.0 0.0 0.0 0.0 0.0] +/G20 { +} + 32 /G20 MSTT31c2a0 AddChar +/G2d [14.0 0.0 2.0 8.0 13.0 12.0] +/G2d { + 11 4 true [1 0 0 -1 -2.0 12.0] {} imagemask + } + 45 /G2d MSTT31c2a0 AddChar +/G6c [12.0 0.0 1.0 0.0 11.0 29.0] +/G6c { + 10 29 true [1 0 0 -1 -1.0 29.0] {<06003e00fe001e001e001e001e001e001e001e001e001e001e001e001e001e001e001e001e001e00 +1e001e001e001e001e001e001e003f00ffc0>} imagemask + } + 108 /G6c MSTT31c2a0 AddChar +/G6f [20.0 0.0 1.0 -1.0 19.0 20.0] +/G6f { + 18 21 true [1 0 0 -1 -1.0 20.0] {<03f0000ffc001e3e00380f00380f80700780700780f003c0f003c0f003c0f003c0f003c0f003c0f8 +03c07803807803803c07003e07001f0e000ffc0003f000>} imagemask + } + 111 /G6f MSTT31c2a0 AddChar +/G72 [15.0 0.0 1.0 0.0 15.0 20.0] +/G72 { + 14 20 true [1 0 0 -1 -1.0 20.0] {<06383e7cfefc1f981f001e001e001e001e001e001e001e001e001e001e001e001e001e003f00ffc0 +>} imagemask + } + 114 /G72 MSTT31c2a0 AddChar +/G73 [16.0 0.0 2.0 -1.0 15.0 20.0] +/G73 { + 13 21 true [1 0 0 -1 -2.0 20.0] {<0f903ff07070e030e010e010f000f8007e007f803fe00ff003f000f880788038c038c030f070ffe0 +8f80>} imagemask + } + 115 /G73 MSTT31c2a0 AddChar +/G64 [21.0 0.0 1.0 -1.0 21.0 29.0] +/G64 { + 20 30 true [1 0 0 -1 -1.0 29.0] {<000180000f80003f8000078000078000078000078000078000078003e7800ff7801e1f801c0f8038 +0f80780780700780700780f00780f00780f00780f00780f00780f00780f807807807807c0f803e1f +803ff7f01fe7e007c700>} imagemask + } + 100 /G64 MSTT31c2a0 AddChar +/G65 [18.0 0.0 1.0 -1.0 17.0 20.0] +/G65 { + 16 21 true [1 0 0 -1 -1.0 20.0] {<03e00ff81c3c301e700e600f600fffffe000e000e000e000f000f00178017c037e063ffe1ffc0ff8 +03e0>} imagemask + } + 101 /G65 MSTT31c2a0 AddChar +/G27 [8.0 0.0 2.0 17.0 6.0 29.0] +/G27 { + 4 12 true [1 0 0 -1 -2.0 29.0] {<60f0f0f0f0f0f0f060606060>} imagemask + } + 39 /G27 MSTT31c2a0 AddChar +/G69 [12.0 0.0 1.0 0.0 11.0 29.0] +/G69 { + 10 29 true [1 0 0 -1 -1.0 29.0] {<0c001e001e000c000000000000000000000006003e00fe001e001e001e001e001e001e001e001e00 +1e001e001e001e001e001e001e003f00ffc0>} imagemask + } + 105 /G69 MSTT31c2a0 AddChar +/G6e [22.0 0.0 1.0 0.0 22.0 20.0] +/G6e { + 21 20 true [1 0 0 -1 -1.0 20.0] {<061e003e7f00fec7801f07c01e03c01e03c01e03c01e03c01e03c01e03c01e03c01e03c01e03c01e +03c01e03c01e03c01e03c01e03c03f03e0ffcff8>} imagemask + } + 110 /G6e MSTT31c2a0 AddChar +/G74 [12.0 0.0 0.0 -1.0 12.0 25.0] +/G74 { + 12 26 true [1 0 0 -1 0.0 25.0] {<0200060006000e001e003e00ffe01e001e001e001e001e001e001e001e001e001e001e001e001e00 +1e001e001e001f300fe00780>} imagemask + } + 116 /G74 MSTT31c2a0 AddChar +/G61 [19.0 0.0 1.0 -1.0 19.0 20.0] +/G61 { + 18 21 true [1 0 0 -1 -1.0 20.0] {<07f0001e7800383c00781e00781e00781e00301e00001e00003e0001de00071e001c1e00381e0070 +1e00f01e00f01e00f01e00f03e00787e407f9f801e0e00>} imagemask + } + 97 /G61 MSTT31c2a0 AddChar +/G75 [21.0 0.0 0.0 -1.0 21.0 19.0] +/G75 { + 21 20 true [1 0 0 -1 0.0 19.0] {} imagemask + } + 117 /G75 MSTT31c2a0 AddChar +/G2c [11.0 0.0 2.0 -7.0 8.0 3.0] +/G2c { + 6 10 true [1 0 0 -1 -2.0 3.0] {<70f8fc740404081020c0>} imagemask + } + 44 /G2c MSTT31c2a0 AddChar +/G70 [21.0 0.0 0.0 -9.0 20.0 20.0] +/G70 { + 20 29 true [1 0 0 -1 0.0 20.0] {<061e003e7f80feffc01e87c01f03e01e01e01e01f01e00f01e00f01e00f01e00f01e00f01e00f01e +00f01e00e01e01e01e01c01f03c01f87801eff001e7c001e00001e00001e00001e00001e00001e00 +003f0000ffc000>} imagemask + } + 112 /G70 MSTT31c2a0 AddChar +/Ge9 [18.0 0.0 1.0 -1.0 17.0 29.0] +/Ge9 { + 16 30 true [1 0 0 -1 -1.0 29.0] {<003c003800700060006000c000800000000003e00ff81c3c301e700e600f600fffffe000e000e000 +e000f000f00178017c037e063ffe1ffc0ff803e0>} imagemask + } + 233 /Ge9 MSTT31c2a0 AddChar +/G66 [13.0 0.0 0.0 0.0 17.0 29.0] +/G66 { + 17 29 true [1 0 0 -1 0.0 29.0] {<007c0001ff00038f800707800703000f00000f00000f00000f00000f0000fff8000f00000f00000f +00000f00000f00000f00000f00000f00000f00000f00000f00000f00000f00000f00000f00000f00 +001f8000fff000>} imagemask + } + 102 /G66 MSTT31c2a0 AddChar +/G76 [20.0 0.0 -1.0 -1.0 20.0 19.0] +/G76 { + 21 20 true [1 0 0 -1 1.0 19.0] {} imagemask + } + 118 /G76 MSTT31c2a0 AddChar +/G6d [33.0 0.0 1.0 0.0 33.0 20.0] +/G6d { + 32 20 true [1 0 0 -1 -1.0 20.0] {<061f03c03e7f8fe0fec798f01f07e0781e03c0781e03c0781e03c0781e03c0781e03c0781e03c078 +1e03c0781e03c0781e03c0781e03c0781e03c0781e03c0781e03c0781e03c0783f03e07cffcff9ff +>} imagemask + } + 109 /G6d MSTT31c2a0 AddChar +/G71 [21.0 0.0 1.0 -9.0 21.0 20.0] +/G71 { + 20 29 true [1 0 0 -1 -1.0 20.0] {<01e18007fb801e1f803c0f80380780780780700780700780f00780f00780f00780f00780f00780f0 +0780f807807807807c07803c0f803f37801fe7800787800007800007800007800007800007800007 +80000fc0003ff0>} imagemask + } + 113 /G71 MSTT31c2a0 AddChar +/G67 [21.0 0.0 1.0 -9.0 21.0 20.0] +/G67 { + 20 29 true [1 0 0 -1 -1.0 20.0] {<01f800071ff00e0f001c0f803c07803c07803c07803c07803c07801e07001e0e000f1c0007f8000c +00001800001800003c00003fff801fffc00fffe01800e0300060600060600060e000c0f001807c0f +003ffe000ff000>} imagemask + } + 103 /G67 MSTT31c2a0 AddChar +/G63 [18.0 0.0 1.0 -1.0 17.0 20.0] +/G63 { + 16 21 true [1 0 0 -1 -1.0 20.0] {<01f00ffc1c1e380f300f70076000e000e000e000e000e000f000f00178037c027e0e3ffc1ffc0ff8 +03e0>} imagemask + } + 99 /G63 MSTT31c2a0 AddChar +%%EndResource + +455 402 11 ( ) 16 SB +471 402 88 (-lors ) 93 SB +564 402 50 (de ) 55 SB +619 402 245 (l'initialisation ) 250 SB +869 402 50 (de ) 55 SB +924 402 42 (la ) 47 SB +971 402 122 (souris, ) 127 SB +1098 402 53 (on ) 58 SB +1156 402 83 (peut ) 88 SB +1244 402 124 (d\351finir ) 129 SB +1373 402 57 (les ) 63 SB +1436 402 208 (\351v\351nements ) 214 SB +1650 402 65 (qui ) 71 SB +1721 402 85 (vont ) 91 SB +1812 402 88 (faire ) 94 SB +1906 402 111 (r\351agir ) 117 SB +2023 402 42 (la ) 48 SB +2071 402 139 (fonction) 139 SB + +%%BeginResource: font MSTT31c2a0 +/G3b [12.0 0.0 3.0 -7.0 9.0 20.0] +/G3b { + 6 27 true [1 0 0 -1 -3.0 20.0] {<60f0f0600000000000000000000000000070f8fc7c0404081020c0>} imagemask + } + 59 /G3b MSTT31c2a0 AddChar +/G78 [21.0 0.0 1.0 0.0 21.0 19.0] +/G78 { + 20 19 true [1 0 0 -1 -1.0 19.0] {} imagemask + } + 120 /G78 MSTT31c2a0 AddChar +/Ge8 [18.0 0.0 1.0 -1.0 17.0 29.0] +/Ge8 { + 16 30 true [1 0 0 -1 -1.0 29.0] {<0f00070003800180018000c000400000000003e00ff81c3c301e700e600f600fffffe000e000e000 +e000f000f00178017c037e063ffe1ffc0ff803e0>} imagemask + } + 232 /Ge8 MSTT31c2a0 AddChar +%%EndResource + +248 450 160 (getpress; ) 162 SB +410 450 41 (le ) 43 SB +453 450 143 (premier ) 145 SB +598 450 41 (et ) 43 SB +641 450 41 (le ) 43 SB +684 450 173 (deuxi\350me ) 175 SB +859 450 181 (param\350tre ) 183 SB +1042 450 218 (repr\351sentent ) 220 SB +1262 450 264 (respectivement ) 266 SB +1528 450 42 (la ) 44 SB +1572 450 111 (souris ) 113 SB +1685 450 41 (et ) 43 SB +1728 450 41 (le ) 43 SB +1771 450 136 (clavier, ) 139 SB +1910 450 39 (si ) 42 SB +1952 450 72 (une ) 75 SB +2027 450 116 (valeur ) 119 SB +2146 450 64 (non) 64 SB + +%%BeginResource: font MSTT31c2a0 +/Ge0 [19.0 0.0 1.0 -1.0 19.0 29.0] +/Ge0 { + 18 30 true [1 0 0 -1 -1.0 29.0] {<07800003800001c00000c00000c00000600000200000000000000007f0001e7800383c00781e0078 +1e00781e00301e00001e00003e0001de00071e001c1e00381e00701e00f01e00f01e00f01e00f03e +00787e407f9f801e0e00>} imagemask + } + 224 /Ge0 MSTT31c2a0 AddChar +/G2e [11.0 0.0 3.0 -1.0 7.0 3.0] +/G2e { + 4 4 true [1 0 0 -1 -3.0 3.0] {<60f0f060>} imagemask + } + 46 /G2e MSTT31c2a0 AddChar +%%EndResource + +248 498 1212 (nulle est donn\351e comme param\350tre alors getpress r\351agira \340 l'\351v\351nement.) 1212 SB + +%%BeginResource: font MSTT31c2a0 +/G55 [29.0 0.0 0.0 -1.0 29.0 28.0] +/G55 { + 29 29 true [1 0 0 -1 0.0 28.0] {} imagemask + } + 85 /G55 MSTT31c2a0 AddChar +/G28 [14.0 0.0 2.0 -8.0 13.0 28.0] +/G28 { + 11 36 true [1 0 0 -1 -2.0 28.0] {<002000c00180030006000c001c001c00380038007800780070007000f000f000f000f000f000f000 +f000f0007000700078007800380038001c001c000e0006000300018000c00020>} imagemask + } + 40 /G28 MSTT31c2a0 AddChar +/G31 [21.0 0.0 5.0 0.0 17.0 28.0] +/G31 { + 12 28 true [1 0 0 -1 -5.0 28.0] {<07003f00df000f000f000f000f000f000f000f000f000f000f000f000f000f000f000f000f000f00 +0f000f000f000f000f000f001f80fff0>} imagemask + } + 49 /G31 MSTT31c2a0 AddChar +/G29 [14.0 0.0 1.0 -8.0 12.0 28.0] +/G29 { + 11 36 true [1 0 0 -1 -1.0 28.0] {<80006000300018000c000e00070007000380038003c003c001c001e001e001e001e001e001e001e0 +01e001e001c001c003c003c0038003800700070006000c001800300060008000>} imagemask + } + 41 /G29 MSTT31c2a0 AddChar +%%EndResource + +398 594 80 (Une ) 81 SB +479 594 96 (paire ) 97 SB +576 594 92 (\(1,1\) ) 93 SB +669 594 50 (va ) 51 SB +720 594 173 (permettre ) 174 SB +894 594 50 (de ) 51 SB +945 594 141 (prendre ) 142 SB +1087 594 51 (en ) 52 SB +1139 594 133 (compte ) 134 SB +1273 594 30 (\340 ) 31 SB +1304 594 42 (la ) 43 SB +1347 594 72 (fois ) 73 SB +1420 594 57 (les ) 58 SB +1478 594 208 (\351v\351nements ) 209 SB +1687 594 50 (de ) 51 SB +1738 594 42 (la ) 44 SB +1782 594 111 (souris ) 113 SB +1895 594 41 (et ) 43 SB +1938 594 89 (ceux ) 91 SB +2029 594 53 (du ) 55 SB +2084 594 126 (clavier;) 126 SB + +%%BeginResource: font MSTT31c2a0 +/G30 [21.0 0.0 1.0 0.0 19.0 28.0] +/G30 { + 18 28 true [1 0 0 -1 -1.0 28.0] {<01e0000618000c0c001c0e00380700380700780780780380700380f003c0f003c0f003c0f003c0f0 +03c0f003c0f003c0f003c0f003c0f003c07003807003807807803807003807001c0e000c0c000618 +0003e000>} imagemask + } + 48 /G30 MSTT31c2a0 AddChar +/G50 [23.0 0.0 0.0 0.0 22.0 28.0] +/G50 { + 22 28 true [1 0 0 -1 0.0 28.0] {} imagemask + } + 80 /G50 MSTT31c2a0 AddChar +%%EndResource + +248 642 72 (une ) 73 SB +321 642 96 (paire ) 97 SB +418 642 92 (\(1,0\) ) 93 SB +511 642 115 (quand ) 116 SB +627 642 30 (\340 ) 31 SB +658 642 71 (elle ) 72 SB +730 642 51 (ne ) 52 SB +782 642 142 (prendra ) 144 SB +926 642 51 (en ) 53 SB +979 642 133 (compte ) 135 SB +1114 642 71 (que ) 73 SB +1187 642 42 (la ) 44 SB +1231 642 122 (souris. ) 124 SB +1355 642 90 (Pour ) 92 SB +1447 642 72 (une ) 74 SB +1521 642 81 (plus ) 83 SB +1604 642 127 (grande ) 129 SB +1733 642 169 (souplesse ) 171 SB +1904 642 221 (d'utilisation, ) 223 SB +2127 642 35 (il ) 37 SB +2164 642 46 (est) 46 SB + +%%BeginResource: font MSTT31c2a0 +/G62 [20.0 0.0 -1.0 -1.0 19.0 29.0] +/G62 { + 20 30 true [1 0 0 -1 1.0 29.0] {<0600003e0000fe00001e00001e00001e00001e00001e00001e00001e1e001e7f801effc01f87c01f +03e01e01e01e01f01e00f01e00f01e00f01e00f01e00f01e00f01e00e01e00e01e01e01e01c01f03 +800f870007fe0001f800>} imagemask + } + 98 /G62 MSTT31c2a0 AddChar +/G68 [22.0 0.0 1.0 0.0 22.0 29.0] +/G68 { + 21 29 true [1 0 0 -1 -1.0 29.0] {<0e00007e0000fe00001e00001e00001e00001e00001e00001e00001e1e001e7f001ec7801f07801e +03c01e03c01e03c01e03c01e03c01e03c01e03c01e03c01e03c01e03c01e03c01e03c01e03c01e03 +c03f03e0ffcff8>} imagemask + } + 104 /G68 MSTT31c2a0 AddChar +%%EndResource + +248 690 146 (possible ) 150 SB +398 690 74 (lors ) 78 SB +476 690 53 (du ) 57 SB +533 690 217 (programme, ) 222 SB +755 690 100 (apr\350s ) 105 SB +860 690 244 (l'initalisation, ) 249 SB +1109 690 50 (de ) 55 SB +1164 690 146 (changer ) 151 SB +1315 690 89 (cette ) 94 SB +1409 690 93 (prise ) 98 SB +1507 690 51 (en ) 56 SB +1563 690 144 (compte, ) 149 SB +1712 690 78 (cela ) 83 SB +1795 690 45 (se ) 50 SB +1845 690 76 (fera ) 81 SB +1926 690 66 (par ) 71 SB +1997 690 122 (l'appel ) 127 SB +2124 690 50 (de ) 55 SB +2179 690 31 (la) 31 SB +248 738 178 (procedure ) 178 SB +32 0 0 42 42 0 0 1 38 /MSTT31c282 font + +%%BeginResource: font MSTT31c282 +/G67 [21.0 0.0 -2.0 -9.0 22.0 19.0] +/G67 { + 24 28 true [1 0 0 -1 2.0 19.0] {<003f8000e1fe01c0fe0380700700700f00700f00f00e00f00e00e00e01c00703c003870001fc0000 +c00003000007000007c00007fc0003ff800c7fc03007e07000e0e00060e00060e000407000803c07 +0007f800>} imagemask + } + 103 /G67 MSTT31c282 AddChar +/G65 [19.0 0.0 1.0 0.0 17.0 19.0] +/G65 { + 16 19 true [1 0 0 -1 -1.0 19.0] {<007c018f07070e071c07180e381e7038707073c0fc00e000e000e000f00470187c303fe01f00>} imagemask + } + 101 /G65 MSTT31c282 AddChar +/G6d [30.0 0.0 0.0 0.0 28.0 19.0] +/G6d { + 28 19 true [1 0 0 -1 0.0 19.0] {<070781e03f0f83e00713c4f00e23c8f00e4390e00e83a0e00d03a1e01d0741e01e0781c01e0781c0 +3c0f03c03c0f0380380e0380380e0780701c0710701c0720701c0740e0380f80e0380700>} imagemask + } + 109 /G6d MSTT31c282 AddChar +/G6f [21.0 0.0 1.0 0.0 19.0 19.0] +/G6f { + 18 19 true [1 0 0 -1 -1.0 19.0] {<007c000187000703800e01801c01c03c01c03801c07803c07003c0f003c0f00380f00780e00700e0 +0f00e00e00601c007038003860000f8000>} imagemask + } + 111 /G6f MSTT31c282 AddChar +/G76 [19.0 0.0 0.0 0.0 18.0 19.0] +/G76 { + 18 19 true [1 0 0 -1 0.0 19.0] {<1c0180fc03c01c03c01e01c00e00c00e00800e01800e01000e02000f06000f0c0007080007100007 +200007400007c000078000070000060000>} imagemask + } + 118 /G76 MSTT31c282 AddChar +%%EndResource + +426 738 223 (getmovement) 223 SB +32 0 0 42 42 0 0 1 38 /MSTT31c2a0 font + +%%BeginResource: font MSTT31c2a0 +/G79 [19.0 0.0 -1.0 -9.0 19.0 19.0] +/G79 { + 20 28 true [1 0 0 -1 1.0 19.0] {} imagemask + } + 121 /G79 MSTT31c2a0 AddChar +/Gea [18.0 0.0 1.0 -1.0 17.0 29.0] +/Gea { + 16 30 true [1 0 0 -1 -1.0 29.0] {<03e003e0077006300c18080810040000000003e00ff81c3c301e700e600f600fffffe000e000e000 +e000f000f00178017c037e063ffe1ffc0ff803e0>} imagemask + } + 234 /Gea MSTT31c2a0 AddChar +%%EndResource + +649 738 1385 (, proc\351dure ayant les m\352mes param\350tres \(avec le m\352me ordre\) que la fonction init.) 1385 SB +398 834 869 (Pour detecter les \351v\351nements, on utilisa la fonction ) 870 SB +32 0 0 42 42 0 0 1 38 /MSTT31c282 font + +%%BeginResource: font MSTT31c282 +/G70 [21.0 0.0 -4.0 -9.0 20.0 19.0] +/G70 { + 24 28 true [1 0 0 -1 4.0 19.0] {<00387c01f9fe007b1e00760f007c0700780700700700f00700e00e00e00e01c00e01c01c01c01c01 +c0380380300380600380c007c38007fe000700000700000e00000e00000e00001c00001c00003e00 +00ff8000>} imagemask + } + 112 /G70 MSTT31c282 AddChar +/G72 [16.0 0.0 0.0 0.0 16.0 19.0] +/G72 { + 16 19 true [1 0 0 -1 0.0 19.0] {<07073f0f0f1f0e3f0e660e460e801d001d001e003c003c0038003800700070007000e000e000>} imagemask + } + 114 /G72 MSTT31c282 AddChar +/G73 [16.0 0.0 0.0 0.0 16.0 19.0] +/G73 { + 16 19 true [1 0 0 -1 0.0 19.0] {<01f1070f06070e020e020f020f8007c003e001e001f000f8407840384038e038e030f0608f80>} imagemask + } + 115 /G73 MSTT31c282 AddChar +%%EndResource + +1268 834 140 (getpress) 140 SB +32 0 0 42 42 0 0 1 38 /MSTT31c2a0 font +1408 834 22 (, ) 23 SB +1431 834 65 (qui ) 66 SB +1497 834 152 (retourne ) 153 SB +1650 834 54 (un ) 55 SB +1705 834 141 (bool\351en ) 142 SB +1847 834 173 (indiquant ) 174 SB +2021 834 42 (la ) 43 SB +2064 834 146 (pr\351sence) 146 SB + +%%BeginResource: font MSTT31c2a0 +/G49 [14.0 0.0 1.0 0.0 13.0 28.0] +/G49 { + 12 28 true [1 0 0 -1 -1.0 28.0] {} imagemask + } + 73 /G49 MSTT31c2a0 AddChar +%%EndResource + +248 882 52 (ou ) 55 SB +303 882 162 (l'absence ) 165 SB +468 882 221 (d'\351v\351nement ) 224 SB +692 882 278 (\(respectivement ) 281 SB +973 882 57 (les ) 60 SB +1033 882 132 (valeurs ) 136 SB +1169 882 77 (true ) 81 SB +1250 882 41 (et ) 45 SB +1295 882 114 (false\). ) 118 SB +1413 882 37 (Il ) 41 SB +1454 882 57 (est ) 61 SB +1515 882 73 (bon ) 77 SB +1592 882 50 (de ) 54 SB +1646 882 98 (noter ) 102 SB +1748 882 142 (qu'ainsi ) 146 SB +1894 882 127 (d\351finie ) 131 SB +2025 882 42 (la ) 46 SB +2071 882 139 (fonction) 139 SB + +%%BeginResource: font MSTT31c2a0 +/G4c [25.0 0.0 0.0 0.0 24.0 28.0] +/G4c { + 24 28 true [1 0 0 -1 0.0 28.0] {} imagemask + } + 76 /G4c MSTT31c2a0 AddChar +/G3a [12.0 0.0 4.0 -1.0 8.0 20.0] +/G3a { + 4 21 true [1 0 0 -1 -4.0 20.0] {<60f0f0600000000000000000000000000060f0f060>} imagemask + } + 58 /G3a MSTT31c2a0 AddChar +%%EndResource + +248 930 1790 (getpress n'est pas bloquante. Les param\350tres en retour sont soit nuls \(pas d'\351v\351nement\) soit correspondent:) 1790 SB + +%%BeginResource: font MSTT31c2a0 +/G3d [24.0 0.0 1.0 10.0 23.0 19.0] +/G3d { + 22 9 true [1 0 0 -1 -1.0 19.0] {} imagemask + } + 61 /G3d MSTT31c2a0 AddChar +%%EndResource + +398 1026 600 (bool:=getpress\(v,p,h,l,r,c : integer\);) 600 SB +548 1074 485 (v = position en y de la souris) 485 SB + +%%BeginResource: font MSTT31c2a0 +/G6b [21.0 0.0 0.0 0.0 21.0 29.0] +/G6b { + 21 29 true [1 0 0 -1 0.0 29.0] {<0e00007e0000fe00001e00001e00001e00001e00001e00001e00001e00001e0ff01e07801e06001e +0c001e18001e30001e60001ee0001ff0001ef0001e78001e3c001e1e001e1f001e0f001e07801e03 +c03f03e0ffcff8>} imagemask + } + 107 /G6b MSTT31c2a0 AddChar +/G54 [26.0 0.0 1.0 0.0 25.0 28.0] +/G54 { + 24 28 true [1 0 0 -1 -1.0 28.0] {} imagemask + } + 84 /G54 MSTT31c2a0 AddChar +/G5f [21.0 0.0 0.0 -9.0 21.0 -7.0] +/G5f { + 21 2 true [1 0 0 -1 0.0 -7.0] {} imagemask + } + 95 /G5f MSTT31c2a0 AddChar +%%EndResource + +548 1122 1490 (p = keyboard status \(Touche control_left,control_right, alt, alt_gr, shift_left, shift_right\)) 1490 SB +548 1170 489 (h = position en x de la souris) 489 SB +548 1218 305 (l = touche clavier) 305 SB +548 1266 142 (r = flags) 142 SB + +%%BeginResource: font MSTT31c2a0 +/G32 [21.0 0.0 1.0 0.0 19.0 28.0] +/G32 { + 18 28 true [1 0 0 -1 -1.0 28.0] {<03e0000ff8001ffc00387e00303f00201f00400f00400f00000f00000f00000f00000e00000e0000 +1c00001c0000380000300000600000e00000c0000180000300000600000c00c01801803fff807fff +00ffff00>} imagemask + } + 50 /G32 MSTT31c2a0 AddChar +/G33 [21.0 0.0 2.0 0.0 17.0 28.0] +/G33 { + 15 28 true [1 0 0 -1 -2.0 28.0] {<07c01ff03ff8707c403c801c001c001c001800300020004001f007f800fc007c003e001e001e000e +000e000e000c000c0018e030f8607f80>} imagemask + } + 51 /G33 MSTT31c2a0 AddChar +%%EndResource + +548 1314 1270 (c = boutons de la souris \(0=aucun, 1=gauche, 2=droite, 3=gauche et droite\)) 1270 SB + +%%BeginResource: font MSTT31c2a0 +/G4e [30.0 0.0 0.0 0.0 30.0 28.0] +/G4e { + 30 28 true [1 0 0 -1 0.0 28.0] {} imagemask + } + 78 /G4e MSTT31c2a0 AddChar +%%EndResource + +698 1362 604 (Nb: le bouton central n'est pas g\351r\351.) 604 SB + +%%BeginResource: font MSTT31c2a0 +/G4f [30.0 0.0 1.0 -1.0 29.0 29.0] +/G4f { + 28 30 true [1 0 0 -1 -1.0 29.0] {<003fc00000fff00003e07c0007801e000f000f001e0007803e0007c03c0003c07c0003e07c0003e0 +780001e0f80001f0f80001f0f80001f0f80001f0f80001f0f80001f0f80001f0f80001f0780001e0 +7c0003e07c0003e03c0003c03e0007c01e0007800f000f0007801e0003e07c0000fff000003fc000 +>} imagemask + } + 79 /G4f MSTT31c2a0 AddChar +/G45 [26.0 0.0 0.0 0.0 25.0 28.0] +/G45 { + 25 28 true [1 0 0 -1 0.0 28.0] {} imagemask + } + 69 /G45 MSTT31c2a0 AddChar +/G5a [25.0 0.0 0.0 0.0 24.0 28.0] +/G5a { + 24 28 true [1 0 0 -1 0.0 28.0] {<0fffff0ffffe0c003c08007c1800f81000f01001f00003e00007c0000780000f80001f00001e0000 +3e00007c0000f80000f00001f00003e00007c0000780010f80011f00031e00023e00067c000effff +fefffffe>} imagemask + } + 90 /G5a MSTT31c2a0 AddChar +/G42 [27.0 0.0 0.0 0.0 25.0 28.0] +/G42 { + 25 28 true [1 0 0 -1 0.0 28.0] {} imagemask + } + 66 /G42 MSTT31c2a0 AddChar +/G21 [14.0 0.0 5.0 -1.0 9.0 29.0] +/G21 { + 4 30 true [1 0 0 -1 -5.0 29.0] {<60f0f0f0f0f0f0f0f0f0f0f0f06060606060606060606000000060f0f060>} imagemask + } + 33 /G21 MSTT31c2a0 AddChar +%%EndResource + +248 1459 148 (NOTEZ ) 150 SB +398 1459 122 (BIEN! ) 124 SB +522 1459 147 (Lorsque ) 149 SB +671 1459 57 (les ) 59 SB +730 1459 208 (\351v\351nements ) 210 SB +940 1459 53 (du ) 55 SB +995 1459 125 (clavier ) 127 SB +1122 1459 81 (sont ) 83 SB +1205 1459 75 (pris ) 77 SB +1282 1459 51 (en ) 53 SB +1335 1459 133 (compte ) 136 SB +1471 1459 89 (dans ) 92 SB +1563 1459 41 (le ) 44 SB +1607 1459 229 (gestionnaire, ) 232 SB + +%%BeginResource: font MSTT31c2c7 +/MSTT31c2c7 [42.0 0 0 0 0 0] 95 -115 [-42.0 -42.0 42.0 42.0] [1 42 div 0 0 1 42 div 0 0] /MSTT31c2c7 GreNewFont +%%EndResource + +32 0 0 42 42 0 0 1 39 /MSTT31c2c7 font + +%%BeginResource: font MSTT31c2c7 +/G69 [12.0 0.0 1.0 0.0 11.0 29.0] +/G69 { + 10 29 true [1 0 0 -1 -1.0 29.0] {<1e003f003f003f003f001e000000000000000000ff003f003f003f003f003f003f003f003f003f00 +3f003f003f003f003f003f003f003f00ffc0>} imagemask + } + 105 /G69 MSTT31c2c7 AddChar +/G6c [12.0 0.0 1.0 0.0 11.0 28.0] +/G6c { + 10 28 true [1 0 0 -1 -1.0 28.0] {} imagemask + } + 108 /G6c MSTT31c2c7 AddChar +%%EndResource + +1839 1458 24 (il) 24 SB +32 0 0 42 42 0 0 1 38 /MSTT31c2a0 font +1863 1459 11 ( ) 14 SB +32 0 0 42 42 0 0 1 39 /MSTT31c2c7 font + +%%BeginResource: font MSTT31c2c7 +/G6e [23.0 0.0 1.0 0.0 22.0 20.0] +/G6e { + 21 20 true [1 0 0 -1 -1.0 20.0] {<000f00ff3f803f7fc03fcfe03f87e03f87e03f07e03f07e03f07e03f07e03f07e03f07e03f07e03f +07e03f07e03f07e03f07e03f07e03f07e0ffdff8>} imagemask + } + 110 /G6e MSTT31c2c7 AddChar +/G65 [19.0 0.0 1.0 -1.0 18.0 20.0] +/G65 { + 17 21 true [1 0 0 -1 -1.0 20.0] {<03f0000f3c001e3e003c1f003c1f007c1f007c1f80fc1f80ffff80fc0000fc0000fc0000fe0000fe +0000fe00007f00807f01803fc7001ffe000ffc0003f000>} imagemask + } + 101 /G65 MSTT31c2c7 AddChar +/G20 [11.0 0.0 0.0 0.0 0.0 0.0] +/G20 { +} + 32 /G20 MSTT31c2c7 AddChar +/G66 [14.0 0.0 0.0 0.0 16.0 29.0] +/G66 { + 16 29 true [1 0 0 -1 0.0 29.0] {<00fc039e079f0f9f0f9f1f8e1f801f801f801f80fff0fff01f801f801f801f801f801f801f801f80 +1f801f801f801f801f801f801f801f807fe0>} imagemask + } + 102 /G66 MSTT31c2c7 AddChar +/G61 [21.0 0.0 2.0 -1.0 21.0 20.0] +/G61 { + 19 21 true [1 0 0 -1 -2.0 20.0] {<03f0000c7c00383e00383f007c3f007c3f007c3f00383f00007f0001bf00073f000e3f003e3f007c +3f007c3f00fc3f00fc3f00fe7f00ffbfe07f1fc03c0f00>} imagemask + } + 97 /G61 MSTT31c2c7 AddChar +/G75 [22.0 0.0 0.0 -1.0 21.0 19.0] +/G75 { + 21 20 true [1 0 0 -1 0.0 19.0] {} imagemask + } + 117 /G75 MSTT31c2c7 AddChar +/G74 [14.0 0.0 0.0 -1.0 13.0 26.0] +/G74 { + 13 27 true [1 0 0 -1 0.0 26.0] {<008001800180038007800f801f807ff8fff81f801f801f801f801f801f801f801f801f801f801f80 +1f801f801f881f980ff00fe003c0>} imagemask + } + 116 /G74 MSTT31c2c7 AddChar +/G70 [23.0 0.0 1.0 -9.0 21.0 20.0] +/G70 { + 20 29 true [1 0 0 -1 -1.0 20.0] {<001e00ff3f803f4fc03f87c03f07e03f03e03f03f03f03f03f03f03f03f03f03f03f03f03f03f03f +03f03f03f03f03e03f03e03f07c03f87c03f4f803f3e003f00003f00003f00003f00003f00003f00 +003f0000ffc000>} imagemask + } + 112 /G70 MSTT31c2c7 AddChar +/G73 [16.0 0.0 2.0 -1.0 15.0 20.0] +/G73 { + 13 21 true [1 0 0 -1 -2.0 20.0] {<1f1038f070707070f830fc30fe10ff00ffc07fe03ff01ff00ff807f881f8c0f8c078e070f070f8e0 +8f80>} imagemask + } + 115 /G73 MSTT31c2c7 AddChar +%%EndResource + +1877 1458 53 (ne ) 56 SB +1933 1458 82 (faut ) 85 SB +2018 1458 71 (pas ) 74 SB +32 0 0 42 42 0 0 1 38 /MSTT31c2a0 font +2092 1459 118 (utiliser) 118 SB + +%%BeginResource: font MSTT31c2a0 +/G38 [21.0 0.0 2.0 0.0 19.0 28.0] +/G38 { + 17 28 true [1 0 0 -1 -2.0 28.0] {<07e0001c3800381e00700e00f00f00f00f00f00f00f80f00fc1e007e1c003f38001fb0000fc00007 +e00007f8000cfc00187e00383f00701f00f00f80f00f80f00780f00780f00780780700380e001e1c +0007f000>} imagemask + } + 56 /G38 MSTT31c2a0 AddChar +%%EndResource + +248 1514 57 (les ) 69 SB +317 1514 166 (fonctions ) 178 SB +495 1514 159 (d'entr\351es ) 171 SB +666 1514 125 (clavier ) 137 SB +803 1514 107 (readl, ) 119 SB +922 1514 129 (readln, ) 141 SB +1063 1514 111 (hfont, ) 123 SB +1186 1514 132 (hfont8, ) 145 SB +1331 1514 123 (hpage, ) 136 SB +1467 1514 161 (inkey,...\) ) 174 SB + +%%BeginResource: font MSTT31c2d4 +/MSTT31c2d4 [50.0 0 0 0 0 0] 40 -100 [-50.0 -50.0 50.0 50.0] [1 50 div 0 0 1 50 div 0 0] /MSTT31c2d4 GreNewFont +%%EndResource + +32 0 0 50 50 0 0 1 45 /MSTT31c2d4 font + +%%BeginResource: font MSTT31c2d4 +/G73 [19.0 0.0 0.0 0.0 19.0 23.0] +/G73 { + 19 23 true [1 0 0 -1 0.0 23.0] {<007c2001c3e00380e00780e007804007804007c04007e00003f00003f80001f80000fc00007e0000 +3e00003f00401f00400f00400f00600f00e00e00f01c00f8380087e000>} imagemask + } + 115 /G73 MSTT31c2d4 AddChar +/G6f [25.0 0.0 1.0 0.0 24.0 23.0] +/G6f { + 23 23 true [1 0 0 -1 -1.0 23.0] {<000fc00070f001e03803c03c07801c0f001e1e001e3e001e3c003e7c003e7c003e78003cf8007cf8 +007cf80078f000f8f000f0f001e07803c0780780380f001e1c0007e000>} imagemask + } + 111 /G6f MSTT31c2d4 AddChar +/G75 [25.0 0.0 1.0 0.0 24.0 23.0] +/G75 { + 23 23 true [1 0 0 -1 -1.0 23.0] {<0380000fc03e1fc03c23c03c43c07cc7c0780780780780f80f80f00f01f00f01f01f03e01e03e01e +05e03e05e03c0bc03c13c07c13c07827887847907887a07f07c03c0780>} imagemask + } + 117 /G75 MSTT31c2d4 AddChar +/G20 [13.0 0.0 0.0 0.0 0.0 0.0] +/G20 { +} + 32 /G20 MSTT31c2d4 AddChar +/G70 [25.0 0.0 -7.0 -11.0 24.0 23.0] +/G70 { + 31 34 true [1 0 0 -1 7.0 23.0] {<0003c1f0007fc7f800078c7c0007b03c0007e03e000f401e000f801e000f801e001f003e001f003e +001e003c003e003c003c007c003c0078003c0070007800f0007800e0007801c000f8038000f00700 +00f80e0001fc3c0001efe00001e0000001e0000003c0000003c0000003c000000780000007800000 +078000000f8000001fc000007ff80000>} imagemask + } + 112 /G70 MSTT31c2d4 AddChar +/G65 [22.0 0.0 1.0 0.0 20.0 23.0] +/G65 { + 19 23 true [1 0 0 -1 -1.0 23.0] {<001f800063c00181e00301e00701e00e01e01c03c01c07803c0700781e00783c0079e000ff0000f0 +0000f00000f00000f80080f80100fc06007e1c003ff8003ff0000fc000>} imagemask + } + 101 /G65 MSTT31c2d4 AddChar +/G69 [14.0 0.0 1.0 0.0 13.0 32.0] +/G69 { + 12 32 true [1 0 0 -1 -1.0 32.0] {<006000f000f000600000000000000000000001e03fe003c003c003c00780078007800f000f000f00 +1f001e001e003e003c003c007c00788079007a00fc007800>} imagemask + } + 105 /G69 MSTT31c2d4 AddChar +/G6e [25.0 0.0 0.0 0.0 24.0 23.0] +/G6e { + 24 23 true [1 0 0 -1 0.0 23.0] {<03e03c3fc0fe03c19f03c20f03c41f07881f07901e07b03e0f603e0f403e0f803c1f807c1f00781f +00781e00f83e00f03c00f03c01f07801e27801e47801e8f803f0f001c0>} imagemask + } + 110 /G6e MSTT31c2d4 AddChar +/G64 [25.0 0.0 0.0 0.0 29.0 35.0] +/G64 { + 29 35 true [1 0 0 -1 0.0 35.0] {<000000f800000ff0000001f0000001f0000001e0000001e0000001e0000003c0000003c0000003c0 +00000780000007800007c7800018778000603f0001c01f0003801f0007801e000f003e000e003e00 +1e003c003c003c003c007c007800f8007800f8007801f800f8037800f002f000f006f000f80cf000 +f819e100fc71e2007fe1e4003fc1f8001f01e000>} imagemask + } + 100 /G64 MSTT31c2d4 AddChar +/G6c [14.0 0.0 1.0 0.0 16.0 35.0] +/G6c { + 15 35 true [1 0 0 -1 -1.0 35.0] {<003e03fc007c003c00780078007800f000f000f001f001e001e003e003c003c003c0078007800780 +0f000f000f001f001e001e003e003c003c007c40788078807900fe007800>} imagemask + } + 108 /G6c MSTT31c2d4 AddChar +/G61 [25.0 0.0 0.0 0.0 25.0 23.0] +/G61 { + 25 23 true [1 0 0 -1 0.0 23.0] {<000f8180003ccf8000606f0001c02f0003803f0007803e000f003e000e003e001e003c003c003c00 +3c007c0078007c00780078007800f800f801f800f001f000f002f000f004f000f819e200fc31e400 +7fe1ec003fc1f8001f01e000>} imagemask + } + 97 /G61 MSTT31c2d4 AddChar +/G74 [14.0 0.0 2.0 0.0 15.0 29.0] +/G74 { + 13 29 true [1 0 0 -1 -2.0 29.0] {<00300020006000e001c003c00fc07ff8078007800f800f000f001f001e001e003e003e003c003c00 +7c0078007800f800f180f100f200fc00f000>} imagemask + } + 116 /G74 MSTT31c2d4 AddChar +/G67 [25.0 0.0 -2.0 -11.0 27.0 23.0] +/G67 { + 29 34 true [1 0 0 -1 2.0 23.0] {<000ff000003c3ff800f01ff001e01ff003e00f0003c00f0007c00f0007c01f0007801f0007801e00 +07803e0003c03c0003c0780001e1e000007f80000030000000e0000001c0000003c0000003f80000 +03ff000001ffe00003fff0000e0ff8003c01fc0078003c0070001c00f0001c00f0001800f0001800 +780030007c0060001f01800003fe0000>} imagemask + } + 103 /G67 MSTT31c2d4 AddChar +%%EndResource + +1641 1507 101 (sous ) 114 SB +1755 1507 121 (peine ) 134 SB +1889 1507 60 (de ) 73 SB +1962 1507 188 (plantage ) 201 SB +2163 1507 47 (de) 47 SB + +%%BeginResource: font MSTT31c2d4 +/G27 [11.0 0.0 6.0 21.0 13.0 35.0] +/G27 { + 7 14 true [1 0 0 -1 -6.0 35.0] {<1c3e3e7c7c7c78707060e0c0c080>} imagemask + } + 39 /G27 MSTT31c2d4 AddChar +/G72 [19.0 0.0 0.0 0.0 19.0 23.0] +/G72 { + 19 23 true [1 0 0 -1 0.0 23.0] {<03e0e03fe1e007c3e003c7e007c9c00798c007900007a0000f40000f40000f80001f00001f00001e +00001e00003e00003c00003c0000780000780000780000f80000f00000>} imagemask + } + 114 /G72 MSTT31c2d4 AddChar +%%EndResource + +248 1564 238 (l'ordinateur) 238 SB +32 0 0 42 42 0 0 1 38 /MSTT31c2a0 font +486 1571 11 (.) 11 SB + +%%BeginResource: font MSTT31c2a0 +/G7d [20.0 0.0 4.0 -8.0 17.0 28.0] +/G7d { + 13 36 true [1 0 0 -1 -4.0 28.0] {} imagemask + } + 125 /G7d MSTT31c2a0 AddChar +%%EndResource + +248 1621 20 (}) 20 SB +248 1718 44 ( ) 44 SB +32 0 0 42 42 0 0 1 39 /MSTT31c2c7 font +292 1717 82 (unit ) 82 SB +32 0 0 42 42 0 0 1 38 /MSTT31c2a0 font +374 1718 81 (init: ) 81 SB +32 0 0 42 42 0 0 1 39 /MSTT31c2c7 font + +%%BeginResource: font MSTT31c2c7 +/G72 [19.0 0.0 2.0 0.0 19.0 20.0] +/G72 { + 17 20 true [1 0 0 -1 -2.0 20.0] {<000f00ff1f803f3f803f7f803f4f803f87003f80003f00003f00003f00003f00003f00003f00003f +00003f00003f00003f00003f00003f8000ffc000>} imagemask + } + 114 /G72 MSTT31c2c7 AddChar +/G6f [20.0 0.0 1.0 -1.0 19.0 20.0] +/G6f { + 18 21 true [1 0 0 -1 -1.0 20.0] {<03f0000f3c001e1e003e0f003c0f807c0f807c0f80fc0fc0fc0fc0fc0fc0fc0fc0fc0fc0fc0fc0fc +0fc07c0f807c0f807c0f803c0f001e1e000f3c0003f000>} imagemask + } + 111 /G6f MSTT31c2c7 AddChar +/G63 [19.0 0.0 1.0 -1.0 18.0 20.0] +/G63 { + 17 21 true [1 0 0 -1 -1.0 20.0] {<03f0000f3c001e3e003c3f003c1f007c1f007c0e00fc0000fc0000fc0000fc0000fe0000fe0000fe +00007e00007f00007f81803fc3001ffe000ffc0003f000>} imagemask + } + 99 /G63 MSTT31c2c7 AddChar +/G64 [23.0 0.0 2.0 -1.0 22.0 28.0] +/G64 { + 20 29 true [1 0 0 -1 -2.0 28.0] {<003fc0000fc0000fc0000fc0000fc0000fc0000fc0000fc007cfc00f2fc01e1fc03e1fc07c0fc07c +0fc07c0fc0fc0fc0fc0fc0fc0fc0fc0fc0fc0fc0fc0fc0fc0fc0fc0fc07c0fc07e0fc03e1fc03f3f +c01feff0078f00>} imagemask + } + 100 /G64 MSTT31c2c7 AddChar +%%EndResource + +455 1717 183 (procedure) 183 SB +32 0 0 42 42 0 0 1 38 /MSTT31c2a0 font + +%%BeginResource: font MSTT31c2a0 +/G4d [37.0 0.0 0.0 0.0 37.0 28.0] +/G4d { + 37 28 true [1 0 0 -1 0.0 28.0] {} imagemask + } + 77 /G4d MSTT31c2a0 AddChar +/G4b [30.0 0.0 0.0 0.0 30.0 28.0] +/G4b { + 30 28 true [1 0 0 -1 0.0 28.0] {} imagemask + } + 75 /G4b MSTT31c2a0 AddChar +%%EndResource + +638 1718 671 (\(checkMouse, checkKeyboard: integer\);) 671 SB + +%%BeginResource: font MSTT31c2a0 +/G7a [19.0 0.0 1.0 0.0 18.0 19.0] +/G7a { + 17 19 true [1 0 0 -1 -1.0 19.0] {<7fff80600f00401e00401e00003c0000780000780000f00001e00003c00003c0000780000f00000f +00001e00803c0080780180780380ffff80>} imagemask + } + 122 /G7a MSTT31c2a0 AddChar +%%EndResource + +248 1766 605 ( { initializes the Mouse driver.) 605 SB + +%%BeginResource: font MSTT31c2a0 +/G77 [29.0 0.0 0.0 -1.0 29.0 19.0] +/G77 { + 29 20 true [1 0 0 -1 0.0 19.0] {} imagemask + } + 119 /G77 MSTT31c2a0 AddChar +%%EndResource + +248 1814 717 ( tells which events will be checked:) 717 SB + +%%BeginResource: font MSTT31c2a0 +/G3c [24.0 0.0 1.0 4.0 23.0 25.0] +/G3c { + 22 21 true [1 0 0 -1 -1.0 25.0] {<00000400001c0000780003e0000f80003c0000f00003c0000f00007c0000e000007c00000f000003 +c00000f000003c00000f800003e000007800001c000004>} imagemask + } + 60 /G3c MSTT31c2a0 AddChar +/G3e [24.0 0.0 1.0 4.0 23.0 25.0] +/G3e { + 22 21 true [1 0 0 -1 -1.0 25.0] {<800000e000007800001f000007c00000f000003c00000f000003c00000f800001c0000f80003c000 +0f00003c0000f00007c0001f0000780000e00000800000>} imagemask + } + 62 /G3e MSTT31c2a0 AddChar +%%EndResource + +248 1862 1865 ( if checkMouse <>0 then the events of Mouse will be reported to getpress, see below otherwise ignored;) 1865 SB +248 1910 1780 ( if checkKeyboard <>0 then the events of Keyboard will be reported to getpress, otherwise ignored) 1780 SB +248 1958 187 ( ) 187 SB + +%%BeginResource: font MSTT31c2e1 +/MSTT31c2e1 [42.0 0 0 0 0 0] 95 -115 [-42.0 -42.0 42.0 42.0] [1 42 div 0 0 1 42 div 0 0] /MSTT31c2e1 GreNewFont +%%EndResource + +32 0 0 42 42 0 0 1 38 /MSTT31c2e1 font + +%%BeginResource: font MSTT31c2e1 +/G41 [28.0 0.0 -3.0 0.0 25.0 29.0] +/G41 { + 28 29 true [1 0 0 -1 3.0 29.0] {<00000040000000c0000001c0000003c0000007c000000fc000000fc000001fc000003fc000006fc0 +0000efc00001cfc000018fc000030fc000060fc0000c0fc0001c0fc000380fc0003fffc0007fffc0 +00c00fc001800fc003800fc007000fc006000fc00c000fc01c000fc07c001fe0ff00fff0>} imagemask + } + 65 /G41 MSTT31c2e1 AddChar +/G74 [12.0 0.0 0.0 0.0 13.0 25.0] +/G74 { + 13 25 true [1 0 0 -1 0.0 25.0] {<0030006000e001e003e00fc07ff87ff80f800f801f801f001f003f003e003e003e007e007c007c00 +fc40fcc0f980fe007c00>} imagemask + } + 116 /G74 MSTT31c2e1 AddChar +/G65 [19.0 0.0 1.0 0.0 19.0 19.0] +/G65 { + 18 19 true [1 0 0 -1 -1.0 19.0] {<001f8000e7c00187c00787c00f0fc01e0f801e1f003c1e007c3c007cf000ff8000f80000f80000f8 +0000f80300fc0e007ffc007ff0001fc000>} imagemask + } + 101 /G65 MSTT31c2e1 AddChar +/G6e [23.0 0.0 0.0 0.0 21.0 19.0] +/G6e { + 21 19 true [1 0 0 -1 0.0 19.0] {<03c0f03fc3f00fc7f80fcff80f99f80fb1f00fa1f01f43f01fc3e01f83e03f07e03f07c03e07c03e +0fc07c0f887c0f907c0fa0fc0fc0f80780>} imagemask + } + 110 /G6e MSTT31c2e1 AddChar +/G69 [12.0 0.0 1.0 0.0 12.0 29.0] +/G69 { + 11 29 true [1 0 0 -1 -1.0 29.0] {<03c007e007e007e007e003c0000000000000000007807f801f800f801f001f001f003e003e003e00 +7e007c007c00fc40f880f980ff00fe007800>} imagemask + } + 105 /G69 MSTT31c2e1 AddChar +/G6f [21.0 0.0 1.0 0.0 20.0 19.0] +/G6f { + 19 19 true [1 0 0 -1 -1.0 19.0] {<003e0000e78003c3c00783e00f03e01f03e03e03e03e07e07e07e07c07c0fc07c0fc0f80f80f80f8 +1f00f81e00f83c007878003c60001f8000>} imagemask + } + 111 /G6f MSTT31c2e1 AddChar +/G20 [11.0 0.0 0.0 0.0 0.0 0.0] +/G20 { +} + 32 /G20 MSTT31c2e1 AddChar +/G70 [21.0 0.0 -5.0 -9.0 20.0 19.0] +/G70 { + 25 28 true [1 0 0 -1 5.0 19.0] {<001e1e0001fe7f00007eff80007f1f80007e0f80007c0f80007c0f8000f80f8000f80f8000f80f00 +01f81f0001f01e0001f01e0001f03c0003e0780003e0780003e0e00007f1c00007df000007c00000 +07c000000f8000000f8000000f8000001f8000001f8000003f800000ffe00000>} imagemask + } + 112 /G70 MSTT31c2e1 AddChar +/G6c [12.0 0.0 1.0 0.0 13.0 29.0] +/G6c { + 12 29 true [1 0 0 -1 -1.0 29.0] {<00f00ff003f003e003e003e007e007c007c007c00f800f800f801f801f001f003f003e003e003e00 +7c007c007c00fc00f840f880fb00fe007800>} imagemask + } + 108 /G6c MSTT31c2e1 AddChar +/G61 [21.0 0.0 1.0 0.0 21.0 19.0] +/G61 { + 20 19 true [1 0 0 -1 -1.0 19.0] {<0073e001cbe00387e00707e00f07c01e07c03e0fc03c0f807c0f807c1f80781f80f83f00f83f00f8 +5f00f8fe20f9be40ff3f807e3f003c3e00>} imagemask + } + 97 /G61 MSTT31c2e1 AddChar +/G73 [16.0 0.0 0.0 0.0 16.0 19.0] +/G73 { + 16 19 true [1 0 0 -1 0.0 19.0] {<03fb078f0f071f061f821f821fc00fe00ff007f803f801fc40fc40fc607ce078f078f8f08fc0>} imagemask + } + 115 /G73 MSTT31c2e1 AddChar +/G21 [16.0 0.0 2.0 0.0 14.0 29.0] +/G21 { + 12 29 true [1 0 0 -1 -2.0 29.0] {<00e001f001f003f003f003e003e003c007c007c007800780070007000600060004000c000c000800 +0800000000007800fc00fc00fc00fc007800>} imagemask + } + 33 /G21 MSTT31c2e1 AddChar +%%EndResource + +435 1958 297 (Attention please!) 297 SB +32 0 0 42 42 0 0 1 38 /MSTT31c2a0 font + +%%BeginResource: font MSTT31c2a0 +/G57 [39.0 0.0 1.0 -1.0 39.0 28.0] +/G57 { + 38 29 true [1 0 0 -1 -1.0 28.0] {} imagemask + } + 87 /G57 MSTT31c2a0 AddChar +%%EndResource + +732 1958 1041 ( While the events of the keyboard are taken under control by ) 1041 SB +32 0 0 42 42 0 0 1 38 /MSTT31c282 font +1773 1958 57 (init) 57 SB +32 0 0 42 42 0 0 1 38 /MSTT31c2a0 font +1830 1958 57 ( or ) 57 SB +32 0 0 42 42 0 0 1 38 /MSTT31c282 font +1887 1958 223 (getmovement) 223 SB +32 0 0 42 42 0 0 1 38 /MSTT31c2e1 font + +%%BeginResource: font MSTT31c2e1 +/G64 [21.0 0.0 1.0 0.0 24.0 29.0] +/G64 { + 23 29 true [1 0 0 -1 -1.0 29.0] {<00003c0003fc0000fc0000fc0000f80000f80000f80001f00001f00001f0007bf001c7e00387e007 +87e00f07c01e07c03e07c03e0fc07c0f807c0f807c1f80f81f00f83f00f85f00f87f20f8be40ff3f +c07e3f003c1e00>} imagemask + } + 100 /G64 MSTT31c2e1 AddChar +/G75 [23.0 0.0 1.0 0.0 21.0 19.0] +/G75 { + 20 19 true [1 0 0 -1 -1.0 19.0] {<0781f03f81f01f83f01f83e01f03e01f03e01f07e03e07c03e0fc03e1fc07e1f807c3f807c6f80fc +df80f99f10ff1f20fe1fc0fc1f80701f00>} imagemask + } + 117 /G75 MSTT31c2e1 AddChar +%%EndResource + +548 2006 178 (do not use) 178 SB +32 0 0 42 42 0 0 1 38 /MSTT31c2a0 font +726 2006 1420 ( the functions or procedures: read, readln, hfont, hfont8, hpage, inkey that read keys) 1420 SB + +%%BeginResource: font MSTT31c2a0 +/G59 [30.0 0.0 0.0 0.0 30.0 28.0] +/G59 { + 30 28 true [1 0 0 -1 0.0 28.0] {} imagemask + } + 89 /G59 MSTT31c2a0 AddChar +%%EndResource + +548 2054 30 (Y) 30 SB + +%%BeginResource: font MSTT31c2ee +/MSTT31c2ee [33.0 0 0 0 0 0] 60 -120 [-33.0 -33.0 33.0 33.0] [1 33 div 0 0 1 33 div 0 0] /MSTT31c2ee GreNewFont +%%EndResource + +32 0 0 33 33 0 0 1 29 /MSTT31c2ee font + +%%BeginResource: font MSTT31c2ee +/G4f [24.0 0.0 1.0 0.0 23.0 22.0] +/G4f { + 22 22 true [1 0 0 -1 -1.0 22.0] {<00fc000703800e01c01c00e0380070780078780078f00038f0003cf0003cf0003cf0003cf0003cf0 +003cf000387800387800783800701c00e00e01c007078000fc00>} imagemask + } + 79 /G4f MSTT31c2ee AddChar +/G55 [23.0 0.0 0.0 0.0 23.0 22.0] +/G55 { + 23 22 true [1 0 0 -1 0.0 22.0] {} imagemask + } + 85 /G55 MSTT31c2ee AddChar +/G20 [8.0 0.0 0.0 0.0 0.0 0.0] +/G20 { +} + 32 /G20 MSTT31c2ee AddChar +/G52 [22.0 0.0 1.0 0.0 22.0 22.0] +/G52 { + 21 22 true [1 0 0 -1 -1.0 22.0] {} imagemask + } + 82 /G52 MSTT31c2ee AddChar +/G49 [11.0 0.0 1.0 0.0 10.0 22.0] +/G49 { + 9 22 true [1 0 0 -1 -1.0 22.0] {} imagemask + } + 73 /G49 MSTT31c2ee AddChar +/G53 [18.0 0.0 2.0 0.0 16.0 22.0] +/G53 { + 14 22 true [1 0 0 -1 -2.0 22.0] {<0f8838f87038e018e018e008f008f8087e003f001fc00fe003f001f8807c803cc01cc01cc018e038 +f8708fc0>} imagemask + } + 83 /G53 MSTT31c2ee AddChar +/G4b [23.0 0.0 1.0 0.0 23.0 22.0] +/G4b { + 22 22 true [1 0 0 -1 -1.0 22.0] {} imagemask + } + 75 /G4b MSTT31c2ee AddChar +/G54 [21.0 0.0 1.0 0.0 20.0 22.0] +/G54 { + 19 22 true [1 0 0 -1 -1.0 22.0] {} imagemask + } + 84 /G54 MSTT31c2ee AddChar +/G48 [24.0 0.0 1.0 0.0 23.0 22.0] +/G48 { + 22 22 true [1 0 0 -1 -1.0 22.0] {} imagemask + } + 72 /G48 MSTT31c2ee AddChar +/G41 [23.0 0.0 1.0 0.0 24.0 22.0] +/G41 { + 23 22 true [1 0 0 -1 -1.0 22.0] {<001000003800003800003c00005c00005c00008e00008e00010e0001070002070002038004038004 +038007ffc00801c00801c01000e01000e03000707000f8fc03fe>} imagemask + } + 65 /G41 MSTT31c2ee AddChar +/G4e [24.0 0.0 0.0 0.0 23.0 22.0] +/G4e { + 23 22 true [1 0 0 -1 0.0 22.0] {} imagemask + } + 78 /G4e MSTT31c2ee AddChar +/G47 [24.0 0.0 1.0 0.0 24.0 22.0] +/G47 { + 23 22 true [1 0 0 -1 -1.0 22.0] {<00fe200381e00e00e01c00703c0030380030780010700000f00000f00000f003fef000f8f00070f0 +00707000707800707800703c00701e00700f007007c1e000ff80>} imagemask + } + 71 /G47 MSTT31c2ee AddChar +/G59 [24.0 0.0 1.0 0.0 23.0 22.0] +/G59 { + 22 22 true [1 0 0 -1 -1.0 22.0] {} imagemask + } + 89 /G59 MSTT31c2ee AddChar +/G45 [20.0 0.0 1.0 0.0 19.0 22.0] +/G45 { + 18 22 true [1 0 0 -1 -1.0 22.0] {} imagemask + } + 69 /G45 MSTT31c2ee AddChar +/G4d [29.0 0.0 1.0 0.0 28.0 22.0] +/G4d { + 27 22 true [1 0 0 -1 -1.0 22.0] {} imagemask + } + 77 /G4d MSTT31c2ee AddChar +%%EndResource + +578 2063 524 (OU RISK TO HANG YOUR SYSTEM) 524 SB +32 0 0 42 42 0 0 1 38 /MSTT31c2a0 font +1102 2054 14 (!) 14 SB +248 2102 119 ( }) 119 SB +32 0 0 42 42 0 0 1 39 /MSTT31c2c7 font +248 2150 109 ( end) 109 SB +32 0 0 42 42 0 0 1 38 /MSTT31c2a0 font +357 2151 69 ( init) 69 SB +32 0 0 42 42 0 0 1 39 /MSTT31c2c7 font +248 2247 126 ( unit ) 126 SB +32 0 0 42 42 0 0 1 38 /MSTT31c2a0 font +374 2248 250 (getmovement: ) 250 SB +32 0 0 42 42 0 0 1 39 /MSTT31c2c7 font +624 2247 183 (procedure) 183 SB +32 0 0 42 42 0 0 1 38 /MSTT31c2a0 font +807 2248 671 (\(checkMouse, checkKeyboard: integer\);) 671 SB +398 2296 585 (tells which events will be checked:) 585 SB +248 2344 1865 ( if checkMouse <>0 then the events of Mouse will be reported to getpress, see below otherwise ignored;) 1865 SB +248 2392 1780 ( if checkKeyboard <>0 then the events of Keyboard will be reported to getpress, otherwise ignored) 1780 SB +248 2440 187 ( ) 187 SB +32 0 0 42 42 0 0 1 38 /MSTT31c2e1 font +435 2440 297 (Attention please!) 297 SB +32 0 0 42 42 0 0 1 38 /MSTT31c2a0 font +732 2440 1041 ( While the events of the keyboard are taken under control by ) 1041 SB +32 0 0 42 42 0 0 1 38 /MSTT31c282 font +1773 2440 57 (init) 57 SB +32 0 0 42 42 0 0 1 38 /MSTT31c2a0 font +1830 2440 57 ( or ) 57 SB +32 0 0 42 42 0 0 1 38 /MSTT31c282 font +1887 2440 223 (getmovement) 223 SB +32 0 0 42 42 0 0 1 38 /MSTT31c2e1 font +548 2488 178 (do not use) 178 SB +32 0 0 42 42 0 0 1 38 /MSTT31c2a0 font +726 2488 1420 ( the functions or procedures: read, readln, hfont, hfont8, hpage, inkey that read keys) 1420 SB +548 2536 30 (Y) 30 SB +32 0 0 33 33 0 0 1 29 /MSTT31c2ee font +578 2545 524 (OU RISK TO HANG YOUR SYSTEM) 524 SB +32 0 0 42 42 0 0 1 38 /MSTT31c2a0 font +1102 2536 14 (!) 14 SB +32 0 0 42 42 0 0 1 39 /MSTT31c2c7 font +248 2584 109 ( end) 109 SB +32 0 0 42 42 0 0 1 38 /MSTT31c2a0 font +357 2585 250 ( getmovement;) 250 SB +32 0 0 42 42 0 0 1 39 /MSTT31c2c7 font +248 2681 115 ( unit) 115 SB +32 0 0 42 42 0 0 1 38 /MSTT31c2a0 font +363 2682 171 ( getpress: ) 171 SB +32 0 0 42 42 0 0 1 39 /MSTT31c2c7 font +534 2681 147 (function) 147 SB +32 0 0 42 42 0 0 1 38 /MSTT31c2a0 font +681 2682 516 (\(v,p,h,l,r,c : integer\): Boolean;) 516 SB +398 2730 42 ({ ) 42 SB +32 0 0 42 42 0 0 1 38 /MSTT31c282 font +440 2730 19 (v) 19 SB +32 0 0 42 42 0 0 1 38 /MSTT31c2a0 font +459 2730 498 ( = y coordinate of the cursor,) 498 SB +398 2778 44 ( ) 44 SB +32 0 0 42 42 0 0 1 38 /MSTT31c282 font + +%%BeginResource: font MSTT31c282 +/G68 [21.0 0.0 0.0 0.0 19.0 29.0] +/G68 { + 19 29 true [1 0 0 -1 0.0 29.0] {<00e00007e00001e00001c00001c00001c0000380000380000380000380000703c0070fc00719e00e +31e00e61c00e41c00e81c01d03c01f03801e03803c07803c0700380700380f00700e00700e40700e +80e01f00e00e00>} imagemask + } + 104 /G68 MSTT31c282 AddChar +%%EndResource + +442 2778 21 (h) 21 SB +32 0 0 42 42 0 0 1 38 /MSTT31c2a0 font +463 2778 500 ( = x coordinate of the cursor,) 500 SB +398 2826 44 ( ) 44 SB +32 0 0 42 42 0 0 1 38 /MSTT31c282 font +442 2826 21 (p) 21 SB +32 0 0 42 42 0 0 1 38 /MSTT31c2a0 font +463 2826 1297 ( = keybord status control_left,control_right, alt, alt_gr, shift_left, shift_right) 1297 SB +248 2874 143 ( ) 143 SB +398 2874 44 ( ) 44 SB +32 0 0 42 42 0 0 1 38 /MSTT31c282 font + +%%BeginResource: font MSTT31c282 +/G6c [12.0 0.0 1.0 0.0 12.0 29.0] +/G6c { + 11 29 true [1 0 0 -1 -1.0 29.0] {<00e007e000e001c001c001c003c00380038003800700070007000e000e000e001e001c001c001c00 +3800380038007800710072007400f8007000>} imagemask + } + 108 /G6c MSTT31c282 AddChar +%%EndResource + +442 2874 12 (l) 12 SB +32 0 0 42 42 0 0 1 38 /MSTT31c2a0 font +454 2874 383 ( = code of key pressed) 383 SB +398 2922 44 ( ) 44 SB +32 0 0 42 42 0 0 1 38 /MSTT31c282 font +442 2922 16 (r) 16 SB +32 0 0 42 42 0 0 1 38 /MSTT31c2a0 font +458 2922 127 ( = flags) 127 SB +398 2970 44 ( ) 44 SB +32 0 0 42 42 0 0 1 38 /MSTT31c282 font + +%%BeginResource: font MSTT31c282 +/G63 [19.0 0.0 1.0 0.0 18.0 19.0] +/G63 { + 17 19 true [1 0 0 -1 -1.0 19.0] {<007e0001e1000381800f03801e03801c0300380000700000700000700000f00000e00000e00000e0 +0200f00600f00c007c38003fe0001f8000>} imagemask + } + 99 /G63 MSTT31c282 AddChar +%%EndResource + +442 2970 19 (c) 19 SB +32 0 0 42 42 0 0 1 38 /MSTT31c2a0 font +461 2970 1177 ( = buttons pressed \(0=aucun, 1=gauche, 2=droite, 3=gauche et droite\)) 1177 SB +698 3018 807 (Nb: the middle button is not taken into account.) 807 SB +32 0 0 42 42 0 0 1 39 /MSTT31c2c7 font +248 3066 120 ( end ) 120 SB +32 0 0 42 42 0 0 1 38 /MSTT31c2a0 font +368 3067 137 (getpress) 137 SB +1 #C +statusdict begin /manualfeed false store end +EJ RS +%%PageTrailer +%%PageResources: font Bookman-Demi +%%+ font Bookman-Light +%%+ font MSTT31c282 +%%+ font MSTT31c2a0 +%%+ font MSTT31c2c7 +%%+ font MSTT31c2d4 +%%+ font MSTT31c2e1 +%%+ font MSTT31c2ee +%%Page: 10 10 +%%PageResources: (atend) +SS +0 0 12 16 799 1169 300 SM +32 0 0 42 42 0 0 1 39 /MSTT31c2c7 font +0 0 0 fC +248 224 115 ( unit) 115 SB +32 0 0 42 42 0 0 1 38 /MSTT31c2a0 font +363 225 215 ( showcursor:) 215 SB +32 0 0 42 42 0 0 1 39 /MSTT31c2c7 font + +%%BeginResource: font MSTT31c2c7 +/G3b [14.0 0.0 3.0 -7.0 11.0 20.0] +/G3b { + 8 27 true [1 0 0 -1 -3.0 20.0] {<387cfefefe7c380000000000003c7efeffff7f7f07060e0c183040>} imagemask + } + 59 /G3b MSTT31c2c7 AddChar +%%EndResource + +578 224 208 ( procedure;) 208 SB +32 0 0 42 42 0 0 1 38 /MSTT31c2a0 font +398 273 1181 ({the cursor becomes visible and follows the movements of the mouse}) 1181 SB +32 0 0 42 42 0 0 1 39 /MSTT31c2c7 font +248 321 109 ( end) 109 SB +32 0 0 42 42 0 0 1 38 /MSTT31c2a0 font +357 322 215 ( showcursor;) 215 SB +32 0 0 42 42 0 0 1 39 /MSTT31c2c7 font +248 418 126 ( unit ) 126 SB +32 0 0 42 42 0 0 1 38 /MSTT31c2a0 font +374 419 201 (hidecursor: ) 201 SB +32 0 0 42 42 0 0 1 39 /MSTT31c2c7 font +575 418 197 (procedure;) 197 SB +32 0 0 42 42 0 0 1 38 /MSTT31c2a0 font +398 467 517 ({the cursor becomes invisible}) 517 SB +32 0 0 42 42 0 0 1 39 /MSTT31c2c7 font +248 515 109 ( end) 109 SB +32 0 0 42 42 0 0 1 38 /MSTT31c2a0 font +357 516 201 ( hidecursor;) 201 SB +32 0 0 50 50 0 0 0 47 /Bookman-Demi /font5 ANSIFont font +248 612 95 (end) 95 SB +32 0 0 50 50 0 0 0 46 /Bookman-Light /font7 ANSIFont font +343 613 226 ( MOUSE;) 226 SB +248 849 894 (Enclosed you find a sample program) 894 SB +32 0 0 42 42 0 0 1 38 /MSTT31c2a0 font + +%%BeginResource: font MSTT31c2a0 +/G53 [23.0 0.0 3.0 -1.0 21.0 29.0] +/G53 { + 18 30 true [1 0 0 -1 -3.0 29.0] {<07e1001fff00383f00700f00600700e00300e00100e00100f00100f800007c00007f00003fc0003f +f0000ff80007fe0001ff00007f80001f80000fc08003c08003c0c001c0c001c0c001c0e00380f003 +80fc0f008ffe0083f800>} imagemask + } + 83 /G53 MSTT31c2a0 AddChar +/G47 [30.0 0.0 2.0 -1.0 30.0 29.0] +/G47 { + 28 30 true [1 0 0 -1 -2.0 29.0] {<003fc10000fff10003f03f0007c00f000f8007801f0003801e0001803e0001807c0000807c000000 +78000000f8000000f8000000f8000000f8007ff0f8000fc0f8000780f8000780f80007807c000780 +7c0007807c0007803e0007803f0007801f0007800f80078007c0078003f81f8000fffe00001ff000 +>} imagemask + } + 71 /G47 MSTT31c2a0 AddChar +%%EndResource + +248 967 415 (Program SystemeGraph;) 415 SB + +%%BeginResource: font MSTT31c2a0 +/G2a [21.0 0.0 3.0 11.0 18.0 29.0] +/G2a { + 15 18 true [1 0 0 -1 -3.0 29.0] {<0180038003800380e38ef19ef93e3d7807c007c03d78f93ef39ee38e0380038003800180>} imagemask + } + 42 /G2a MSTT31c2a0 AddChar +/G46 [23.0 0.0 0.0 0.0 22.0 28.0] +/G46 { + 22 28 true [1 0 0 -1 0.0 28.0] {} imagemask + } + 70 /G46 MSTT31c2a0 AddChar +/G39 [21.0 0.0 2.0 0.0 19.0 28.0] +/G39 { + 17 28 true [1 0 0 -1 -2.0 28.0] {<03e0000c3800181c00380e00700e00700f00f00700f00780f00780f00780f00780f0078078078078 +07803c07801e1f000fef00000f00000e00001e00001c00003c0000780000f00001e0000380000f00 +00780000>} imagemask + } + 57 /G39 MSTT31c2a0 AddChar +/G34 [21.0 0.0 1.0 0.0 19.0 28.0] +/G34 { + 18 28 true [1 0 0 -1 -1.0 28.0] {<001c00003c00003c00007c00007c0000bc00013c00013c00023c00023c00043c00083c00083c0010 +3c00103c00203c00403c00403c00ffffc0ffffc0ffffc0003c00003c00003c00003c00003c00003c +00003c00>} imagemask + } + 52 /G34 MSTT31c2a0 AddChar +%%EndResource + +248 1015 735 ( \(* by Frederic Pataud, October 1994 *\)) 735 SB +248 1063 100 (Begin) 100 SB +248 1111 983 (Pref iiuwgraph block \(* inherit the graphic functions *\)) 983 SB +248 1159 111 ( Begin) 111 SB +248 1207 301 ( Pref mouse block) 301 SB +698 1207 554 (\(* inherit the mouse functions *\)) 554 SB +248 1351 1678 ( \(*****************************************************************************\)) 1678 SB +248 1399 1081 ( \(* P r o g r a m m e P r i n c i p a l *\)) 1081 SB +248 1447 1678 ( \(*****************************************************************************\)) 1678 SB +248 1495 369 ( var v,p,h,i : integer,) 369 SB +248 1543 307 ( l,r,c : integer,) 307 SB +248 1591 381 ( rep : arrayof char,) 381 SB +248 1639 274 ( d : boolean,) 274 SB +248 1687 462 ( xx,yy : arrayof integer,) 462 SB +248 1735 697 ( status,code,x,y,flags,button : integer;) 697 SB +248 1831 133 ( Begin) 133 SB +248 1927 880 ( call gron\(0\); \(* enter the graphic mode *\)) 880 SB +248 1975 1772 ( call init\(1,0\); \(* initialize the mouse, disregard the keyboard events, check for mouse events *\)) 1772 SB +248 2071 331 ( call showcursor;) 331 SB +848 2071 295 (\(* show cursor *\)) 295 SB + +%%BeginResource: font MSTT31c2a0 +/G35 [21.0 0.0 2.0 0.0 18.0 28.0] +/G35 { + 16 28 true [1 0 0 -1 -2.0 28.0] {<03ff07fe07fe07fe0800080010001e003fc03ff07ff807fc00fe003e001e000f000f000700070007 +000700060006000c6018f830ffc03f00>} imagemask + } + 53 /G35 MSTT31c2a0 AddChar +/G36 [21.0 0.0 1.0 0.0 19.0 28.0] +/G36 { + 18 28 true [1 0 0 -1 -1.0 28.0] {<000f80003c0000f00001c0000380000700000e00001c00003c000038000078000079f8007e3e00f0 +0f00f00780f00780f007c0f003c0f003c0f003c0f003c07803c07803803803803c07001c0e000f1c +0003f000>} imagemask + } + 54 /G36 MSTT31c2a0 AddChar +/G37 [21.0 0.0 1.0 0.0 19.0 28.0] +/G37 { + 18 28 true [1 0 0 -1 -1.0 28.0] {<1fffc01fffc03fffc03fff80600180400380800300000300000700000600000600000e00000c0000 +0c00001c0000180000180000380000300000300000700000600000600000e00000c00000c00001c0 +00018000>} imagemask + } + 55 /G37 MSTT31c2a0 AddChar +%%EndResource + +248 2119 1270 ( call patern\(5,5,635,475,2,0\); \(* make a frame around the screen *\)) 1270 SB + +%%BeginResource: font MSTT31c2a0 +/G22 [17.0 0.0 3.0 17.0 14.0 29.0] +/G22 { + 11 12 true [1 0 0 -1 -3.0 29.0] {<60c0f1e0f1e0f1e0f1e0f1e0f1e0f1e060c060c060c060c0>} imagemask + } + 34 /G22 MSTT31c2a0 AddChar +%%EndResource + +248 2167 567 ( call outstring\(10,10,"x=",2,0\);) 567 SB +248 2215 586 ( call outstring\(100,10,"y=",2,0\);) 586 SB +248 2263 664 ( call outstring\(10,30,"status = ",2,0\);) 664 SB +248 2311 667 ( call outstring\(10,50,"code = ",2,0\);) 667 SB +248 2359 660 ( call outstring\(10,70,"flags = ",2,0\);) 660 SB +248 2407 675 ( call outstring\(10,90,"button = ",2,0\);) 675 SB +248 2455 1394 ( call patern\(100,210,300,320,3,1\); \(* make a rectangle filled in colour 3 *\)) 1394 SB +248 2551 377 ( array xx dim \(1:6\);) 377 SB +248 2599 373 ( array yy dim \(1:6\);) 373 SB +248 2647 445 ( xx\(1\):=410; yy\(1\):=10;) 445 SB +248 2695 445 ( xx\(2\):=450; yy\(2\):=30;) 445 SB +248 2743 445 ( xx\(3\):=460; yy\(3\):=50;) 445 SB +248 2791 445 ( xx\(4\):=430; yy\(4\):=80;) 445 SB +248 2839 445 ( xx\(5\):=420; yy\(5\):=40;) 445 SB +248 2887 445 ( xx\(6\):=480; yy\(6\):=30;) 445 SB +248 2935 467 ( call intens\(6,xx,yy,8,1\); ) 467 SB +998 2935 443 (\(* show a polygon filled*\)) 443 SB +248 2983 258 ( for i:=1 to 6) 258 SB +248 3031 107 ( do) 107 SB + +%%BeginResource: font MSTT31c2a0 +/G2b [24.0 0.0 1.0 3.0 23.0 25.0] +/G2b { + 22 22 true [1 0 0 -1 -1.0 25.0] {<003000003000003000003000003000003000003000003000003000003000fffffcfffffc00300000 +3000003000003000003000003000003000003000003000003000>} imagemask + } + 43 /G2b MSTT31c2a0 AddChar +%%EndResource + +248 3079 368 ( yy\(i\):=yy\(i\)+100;) 368 SB +248 3127 119 ( od;) 119 SB +248 3175 477 ( call intens\(6,xx,yy,15,0\);) 477 SB +998 3175 578 (\(* show another polygon empty *\)) 578 SB +1 #C +statusdict begin /manualfeed false store end +EJ RS +%%PageTrailer +%%PageResources: font Bookman-Demi +%%+ font Bookman-Light +%%+ font MSTT31c2a0 +%%+ font MSTT31c2c7 +%%Page: 11 11 +%%PageResources: (atend) +SS +0 0 12 16 799 1169 300 SM +32 0 0 42 42 0 0 1 38 /MSTT31c2a0 font +0 0 0 fC +248 272 729 ( call cirb\(500,300,50,40,100,3500,10,0\);) 729 SB +998 272 647 (\(* draw an empty pie or camembert *\)) 647 SB +248 320 1151 ( call cirb\(400,400,40,40,600,4000,11,1\); \(* draw a filled pie *\)) 1151 SB +248 464 1548 ( i:=hfont\(100,350,6,-9999999,9999999,500,9,0,15\); \(* read integer from a window *\)) 1548 SB +248 512 1613 ( call hpage\(100,400,10,unpack\("Il fait beau dans ma verte campagne"\),9,0\); \(* show text *\)) 1613 SB +248 560 980 ( rep:=hfont8\(100,430,10,80,unpack\("tototutu"\),9,0,15\);) 980 SB +1448 560 239 (\(* read text *\)) 239 SB +248 656 1625 ( call getmovement\(1,1\); \(* take into consideration both key events and mouse events *\)) 1625 SB +248 752 96 ( do) 96 SB +248 800 463 ( d:=getpress\(v,p,h,l,r,c\);) 463 SB +998 800 404 (\(* ask about an event *\)) 404 SB +248 848 151 ( if \(d\)) 151 SB +248 896 737 ( then call outstring\(10,400,"Event",2,0\);) 737 SB +248 944 647 ( call patern\(80,25,130,100,0,1\);) 647 SB +248 992 508 ( call track\(40,10,v,0,4\);) 508 SB +998 992 303 (\(* print integer *\)) 303 SB +248 1040 530 ( call track\(140,10,p,0,4\);) 530 SB +248 1088 510 ( call track\(80,30,h,0,4\);) 510 SB +248 1136 500 ( call track\(80,50,l,0,4\);) 500 SB +248 1184 503 ( call track\(80,70,r,0,4\);) 503 SB +248 1232 506 ( call track\(80,90,c,0,4\);) 506 SB + +%%BeginResource: font MSTT31c2a0 +/G43 [28.0 0.0 2.0 -1.0 27.0 29.0] +/G43 { + 25 30 true [1 0 0 -1 -2.0 29.0] {<003f820000ffe60003e07e0007801e000f000e001e0007003e0003003c0003007c0003007c000100 +78000000f8000000f8000000f8000000f8000000f8000000f8000000f8000000f8000000f8000000 +7c0000007c0000007c0000003e0000801e0001001f0002000fc00c0003f0380001fff000003f8000 +>} imagemask + } + 67 /G43 MSTT31c2a0 AddChar +%%EndResource + +248 1280 1891 ( if\(\(h=164 and l=27\) or \(c=3\)\) \(* exit if either two buttons were pressed c=3 or Ctrl+Esc key *\)) 1891 SB +248 1328 281 ( then exit;) 281 SB +248 1376 158 ( fi;) 158 SB +248 1424 103 ( fi;) 103 SB +248 1472 108 ( od;) 108 SB +248 1520 221 ( call groff;) 221 SB +998 1520 954 (\(* leave the graphic mode and return to the text mode *\)) 954 SB +248 1568 308 ( writeln\("i=",i\);) 308 SB +248 1616 570 ( for i:=lower\(rep\) to upper\(rep\)) 570 SB +248 1664 107 ( do) 107 SB +248 1712 297 ( write\(rep\(i\)\);) 297 SB +248 1760 119 ( od;) 119 SB +248 1808 187 ( writeln;) 187 SB +248 1856 102 ( End) 102 SB +248 1904 80 ( End) 80 SB +248 1952 80 (End.) 80 SB +1 #C +statusdict begin /manualfeed false store end +EJ RS +%%PageTrailer +%%PageResources: font MSTT31c2a0 +%%Trailer +SVDoc restore +end +%%Pages: 11 +% TrueType font name key: +% MSTT310000 = +% MSTT310000 = +% MSTT310000 = +% MSTT310000 = +% MSTT310000 = +% MSTT310000 = +% MSTT310000 = +% MSTT310000 = +% MSTT310000 = +% MSTT310000 = +% MSTT310000 = +% MSTT310000 = +% MSTT310000 = +% MSTT310000 = +% MSTT31c293 = 2fafDTimes New RomanF00000064000002bc0000 +% MSTT31c2a0 = 2fafDTimes New RomanF0000002a000001900000 +% MSTT31c2ad = 2fafDTimes New RomanF0000003a000001900000 +% MSTT31c2ba = 2fafDTimes New RomanF0000004b000001900000 +% MSTT31c282 = 2fafDTimes New RomanF0000002a000001900001 +% MSTT31c2c7 = 2fafDTimes New RomanF0000002a000002bc0000 +% MSTT31c2d4 = 2fafDTimes New RomanF00000032000001900001 +% MSTT31c2e1 = 2fafDTimes New RomanF0000002a000002bc0001 +% MSTT31c2ee = 2fafDTimes New RomanF00000021000001900000 +%%DocumentSuppliedResources: procset Win35Dict 3 1 +%%+ font MSTT31c282 +%%+ font MSTT31c2a0 +%%+ font MSTT31c2c7 +%%+ font MSTT31c2d4 +%%+ font MSTT31c2e1 +%%+ font MSTT31c2ee + +%%DocumentNeededResources: font Bookman-Demi +%%+ font Bookman-DemiItalic +%%+ font Bookman-Light +%%+ font Bookman-LightItalic +%%+ font Symbol + +%%EOF + \ No newline at end of file diff --git a/doc/iuwgraf3.txt b/doc/iuwgraf3.txt new file mode 100644 index 0000000..53cbae6 --- /dev/null +++ b/doc/iuwgraf3.txt @@ -0,0 +1,558 @@ + +unit IIUWGRAPH: class; + +{ this predefined class enables basic graphic operations + for DOS machines based on 486 or 386 processors } + +{ this document gives the specification of new version of IIUWGRAPH + class made in October 1994 by Frederic Pataud à Pau + } + +{ the early versions of library IIUWGRAPH have been elaborated by + Piotr Carlsson, Miroslawa Milkowska, Janina Jankowska, + Michal Jankowski at Institute of Informatics, + University of Warsaw 1987, + and added to Loglan system by Danuta Szczepanska 1987, + + the recent versions were done at LITA, Pau, + by + Pawel Susicki (1991) for Unix, + Sebastien Bernard (1992) for ATARI, see a separate document, + Eric Becourt et Jerôme Larrieu (1993) for Unix and Xwindows, see a + separate document on Xiiuwgraf , + + + +fait à Pau, le 15 Novembre 1994, par Andrzej Salwicki, LITA} + +{ the predefined class IIUWGRAPH is included in all versions of interpreter of +Loglan, with the exception of the present version of interpreter for VAX/VMS.} + + + +hidden MaxX, MaxY, current_X, current_Y, is_graphic_On, + current_Colour, current_Background_Colour, current_Style, + current_Palette, current_Pattern ; + + + +const MaxX = + MaxY = + +{ the screen's coordinates are + + (0,0) ----------------------> (MaxX,0) + ¦ + ¦ + ¦ + V + (0, MaxY) (MaxX,MaxY) + +} + + +var currentDriver : integer, { see NOCARD below } + current_X, current_Y: integer { it is the current position } + is_graphic_On: Boolean, { evidently tells whether we are in + graphics mode } + current_Colour : integer, { } + current_Background_Colour : integer, + current_Style : integer, { } + current_Palette : integer, + current_Pattern + +unit GRON : procedure (i: integer); + { procedure sets the monitor in graphic mode and clears the buffer + of screen. The parameter determines the resolution and the number of + colours. +The user should assure that the resolution chosen should correspond to that +which set by means of command +SET go32 drivers {path} +eg. +set go32 drivers c:\loglan\svga\drivers\vesa.grn gw 1024 gh 480 nc 256 + An execution of instruction call gron(i) must precede any of the +graphic commands described below. + } + +unit GROFF : procedure; + { the procedure sets the monitor in the text mode filling it with + spaces. + DO NOT FORGET to set the monitor in the text mode before +you terminate your program + } + +unit NOCARD : function : integer; + { the value given by this function determines the type of the currently used +monitor and it is equal to + 1 for Hercules mono card, + 2 for IBM CGA color + 3 for IBM CGA mono 320 x 200 + 4 for IBM CGA mono 640 x 200 + 5 for EGA/VGA card + 6 for ATARI STE + 7 for Unix versions equipped with XWindows + You can not call the function nocard before GRON sets the graphic mode + } + +unit CLS : procedure; + { the screen will be cleared and filled with colour 0 } + + +unit VIDEO : procedure( A: array of integer); + { this procedure can not be applied with egaint = EGA/VGA card } + { the worktime buffer will be associated with the array A. + A call of VIDEO does not change the contents of the buffer. + All subsequent calls of the procedures modifying the screen will + concern the array A. The screen does not change. + A ready image can be moved to the screen with the help of + GETMAP/PUTMAP procedures or it can be stored on disk. + The array should have 16 kBytes for IBM CGA card or + 32 kBytes for Hercules card.} + +{ PROCEDURES CONTROLLING THE COLOURS } + +unit COLOR : procedure(co : integer); +{ sets current color to co + for monochrome displays, 0 means black, non-0 - white + for color displays, 0 means background + see PALLET +} + +unit STYLE : procedure(styl : integer); +{ sets style of lines and fill shades to a combination + of current color and background color (for mono - + white and black, respectively) according to 5 predefined + patterns: + + 0 .... + 1 **** + 2 ***. + 3 **.. + 4 *.*. + 5 *... + + where '*' means current color, '.' background colour +When drawing the segments the subsequent pixels will have colour determined +by cyclic application of style pattern. The first and the last pixels of a segment +will have always current colour. +When filling contours the given style will be applied to horizontal lines with even +coordinate. The style for odd lines is determined automatically. +The same applies for perpendicular lines. +} + + +unit BORDER : procedure (background_Colour: integer); + + { sets actual background color to i ( i = 0,1,...,15 ) } + + +unit PALLET : procedure (nr : integer); + { + +the codes of colors are as follows + 0 black + 1 blue dark + 2 green dark + 3 turquoise dark + 4 red dark + 5 violet + 6 brown + 7 grey light + 8 grey dark + 9 blue + 10 green + 11 turquoise + 12 red light + 13 rose + 14 yellow + 15 white + + } + + + +{ PROCEDURES CONTROLLING POSITION } + +unit MOVE : procedure (x,y :integer); + { procedure MOVE sets the current position on the screen on the pixel + with coordinates + x - column, + y - line } + { precondition of MOVE: + 0*x*MaxX & 0*y*MaxY + } + +unit INXPOS : function: integer; + { function INXPOS returns the x coordinate of the current position } + + +unit INYPOS : function : integer; + { function INYPOS returns the y coordinate of the current position } + + +unit PUSHXY : procedure; +{ pushes current position, color & style onto the stack. + The stack is kept internally, max depth is 16 +} + + +unit POPXY: procedure; + +{ restores position, color & style from internal stack } + +{ Example +unit DIAGONAL : procedure; + var ix, iy : integer; +begin + call PUSHXY; + ix := INXPOS; + iy := INYPOS; + call DRAW(ix+10, iy+10); + call POPXY +end DIAGONAL; +} + + + +{ PROCEDURES SERVING POINTS & LINES} + +unit POINT : procedure(x,y: integer); +{ moves current position to pixel (x,y) and sets it to the current color + } + +unit INPIX : function (x,y : integer) : integer; + { + moves to pixel (x,y) and returns its color setting; + } + + +unit DRAW : procedure( x,y : integer); + { + draws a line from current screen position to (x,y); + sets current position to (x,y); + line is drawn in current color, with both terminal pixels + always turned white ( non-background) for non-black + ( non-background ) line color. + Bresenham's algorithm is used, pixels belonging to the segment + change their state depending on current colour and style. + } + +unit intens: procedure(Size :integer; xCoord,yCoord:arrayof integer, + Colour,Filled :integer); +/* draw a polygon*/ +{ draw a simple, closed polygon of Size points, the edges of the polygon go from +(xCoord[i], yCoord[i]) to (xCoord[i+1], yCoord[i+1]) for i = 1, ..., Size-1 +The colour used will be Colour. The polygon will be filled iff Filled<>0. +} + +unit CIRB : procedure (xi, yi, rx,ry : integer, alfa, beta : real, + cbord, fill : integer); + + { + draws a circle (or ellipse, depending on aspect value, see below), + optionally filling its interior; + does not preserve position; + (xi,yi) - are center coordinates, + rx - radius in pixels (horizontally), + ry - radius in pixels (perpendicularly), + alfa, beta - starting & ending angles; if alfa=beta a full + circle is drawn; values should be given in radians; + cbord - border color, + fill - if fill <>0, interior is filled in current style&color + } + +unit hfill: procedure( x : integer); + { draw an horizontal line between the current position and + (x,currentY) with the current color, after it change the current + position to (x, currentY) + } + +unit vfill: procedure( y : integer); + { draw a vertical line between the current position and + (currentX,y) with the current color, after it change the current + position to (currentX,y) + } + +unit patern: procedure( x1,y1,x2,y2,c,b : integer); + { draw a rectangle between the points (x1,y1) and (x2,y2) with the + color c (the current color is not change). if b=0 then the box is + empty else it is filled. + } + +{ Procedures operating on bitmaps } + +unit GETMAP : function (x,y : integer) : arrayof integer; + {saves rectangular area between current position as + top left corner and (ix,iy) as bottom right corner, + including border lines; + position remains unchanged. + array of integer should have + 4+(rows**columns/8* *coeff) + bytes. The coefficient coeff is 1 for Hercules, 2 for CGA, 4 for EGA + card. + ATTENTION: in DOS 286 environment a bigger size of the array may + necessitate the use of loglan with the option H+, see also memavail + } + +unit PUTMAP : procedure ( a: arrayof integer); + {sets rectangular area of screen pixels to that saved + by "getmap" in "iarray"; + same size is restored, with top left corner in current + position; + position remains unchanged. + } + +unit ORMAP : procedure ( a : arrayof integer); + {same as putmap, but saved bitmap is or'ed into screen + rather than just set. + } + +unit XORMAP : procedure ( a: arrayof integer); + {same as putmap, but saved bitmap is xor'ed into screen + rather than just set. + } + + +{Procedures operating on characters and strings} + +unit outstring: procedure(x,y: integer, s: string, back_col, front_col: integer); + { x, y are the coordinates where to put the string, + s is the string to be shown, in front_col colour letters on the back_col + colour background + } + +unit track: procedure( x,y,c,valeur : integer); + + { write an integer value valeur at the position (x,y) with the color c. + It does not change the current position nor the current color + } + +unit inkey : function : integer; + + { returns next character from keyboard buffer; + 0 is returned if buffer is empty; + special keys are returned as negative numbers; + ALT-NUM method may be used for entering character codes + above 127 (this makes entering special keys 128-132 + impossible); + if a character is returned, it is also removed + from the buffer, so MS-DOS will not see it (CTRL-C!); + typeahead is allowed, echo is suppressed. + } + +unit HASCII : procedure(c: integer); + {'xor's the character = chr(c) in a 8*8 box with top left corner + in the current position; + moves current position by (8,0); + call hascii(0)- sets complete box to black ( =background ), + with no change in position. + BIOS ROM font for IBM color card is used. If the font + table is not at F000:FA6E, the character will probably + be unrecognizable, and most certainly wrong. + For codes >127, table pointed to by interrupt vector 31 + is used. } + + + +unit hfont: function( x,y,lg,min,max,default,col_f,col_e,col_c : integer): + integer; + + { arrange a small 1 line window for reading an integer value from this +window, +the position of the window corner is (x, y), +the length of the window is lg characters, +the value v should be greater than min and smaller than max, +the default value read is default, +the colour of the window is col_f, +the colour of the digits is col_e, +the colour of cursor is col_c + + reads in graphic mode an integer in the window which begins at the (x,y) + position, window is lg caracteres long. the maximum length of the + integer that is read is 10. there is a default value, a minimum value + and a maximum value. the window is drawn with the col_f color, the + cursor is in the col_c color and the integer is writing in the col_e + color. you can use 0..9,+,-,backspace,escape and return keys. } + + +unit HPAGE : procedure(x,y,long: integer, A: arrayof char, back, front: integer); + { this procedure arranges a 1-line high window in position x,y of length + long in which a portion of text A is shown in colour front on the + background colour back. + Making use of keys controlling the cursor {left, right, PgUp, PgDn} + the user can scroll the text (horizontally) in the window. Pressing the + Enter key terminates the procedure} + +end IIUWGRAPH; + + + + +unit MOUSE: class; + +{ init -lors de l'initialisation de la souris, on peut définir les événements qui vont faire réagir la fonction +getpress; le premier et le deuxième paramètre représentent respectivement la souris et le clavier, si une valeur non +nulle est donnée comme paramètre alors getpress réagira à l'événement. + + Une paire (1,1) va permettre de prendre en compte à la fois les événements de la souris et ceux du clavier; +une paire (1,0) quand à elle ne prendra en compte que la souris. Pour une plus grande souplesse d'utilisation, il est +possible lors du programme, après l'initalisation, de changer cette prise en compte, cela se fera par l'appel de la +procedure getmovement, procédure ayant les mêmes paramètres (avec le même ordre) que la fonction init. + + Pour detecter les événements, on utilisa la fonction getpress, qui retourne un booléen indiquant la présence +ou l'absence d'événement (respectivement les valeurs true et false). Il est bon de noter qu'ainsi définie la fonction +getpress n'est pas bloquante. Les paramètres en retour sont soit nuls (pas d'événement) soit correspondent: + + bool:=getpress(v,p,h,l,r,c : integer); + v = position en y de la souris + p = keyboard status (Touche control_left,control_right, alt, alt_gr, shift_left, shift_right) + h = position en x de la souris + l = touche clavier + r = flags + c = boutons de la souris (0=aucun, 1=gauche, 2=droite, 3=gauche et droite) + Nb: le bouton central n'est pas géré. + +NOTEZ BIEN! Lorsque les événements du clavier sont pris en compte dans le gestionnaire, il ne faut pas utiliser +les fonctions d'entrées clavier readl, readln, hfont, hfont8, hpage, inkey,...) sous peine de plantage de +l'ordinateur. +} + + unit init: procedure(checkMouse, checkKeyboard: integer); + { initializes the Mouse driver. + tells which events will be checked: + if checkMouse <>0 then the events of Mouse will be reported to getpress, see below otherwise ignored; + if checkKeyboard <>0 then the events of Keyboard will be reported to getpress, otherwise ignored + Attention please! While the events of the keyboard are taken under control by init or getmovement + do not use the functions or procedures: read, readln, hfont, hfont8, hpage, inkey that read keys + YOU RISK TO HANG YOUR SYSTEM! + } + end init + + unit getmovement: procedure(checkMouse, checkKeyboard: integer); + tells which events will be checked: + if checkMouse <>0 then the events of Mouse will be reported to getpress, see below otherwise ignored; + if checkKeyboard <>0 then the events of Keyboard will be reported to getpress, otherwise ignored + Attention please! While the events of the keyboard are taken under control by init or getmovement + do not use the functions or procedures: read, readln, hfont, hfont8, hpage, inkey that read keys + YOU RISK TO HANG YOUR SYSTEM! + end getmovement; + + unit getpress: function(v,p,h,l,r,c : integer): Boolean; + { v = y coordinate of the cursor, + h = x coordinate of the cursor, + p = keybord status control_left,control_right, alt, alt_gr, shift_left, shift_right + l = code of key pressed + r = flags + c = buttons pressed (0=aucun, 1=gauche, 2=droite, 3=gauche et droite) + Nb: the middle button is not taken into account. + end getpress + + + unit showcursor: procedure; + {the cursor becomes visible and follows the movements of the mouse} + end showcursor; + + unit hidecursor: procedure; + {the cursor becomes invisible} + end hidecursor; + +end MOUSE; + + + +Enclosed you find a sample program + +Program SystemeGraph; + (* by Frederic Pataud, October 1994 *) +Begin +Pref iiuwgraph block (* inherit the graphic functions *) + Begin + Pref mouse block (* inherit the mouse functions *) + + + (*****************************************************************************) + (* P r o g r a m m e P r i n c i p a l *) + (*****************************************************************************) + var v,p,h,i : integer, + l,r,c : integer, + rep : arrayof char, + d : boolean, + xx,yy : arrayof integer, + status,code,x,y,flags,button : integer; + + Begin + + call gron(0); (* enter the graphic mode *) + call init(1,0); (* initialize the mouse, disregard the keyboard events, check for mouse events *) + + call showcursor; (* show cursor *) + call patern(5,5,635,475,2,0); (* make a frame around the screen *) + call outstring(10,10,"x=",2,0); + call outstring(100,10,"y=",2,0); + call outstring(10,30,"status = ",2,0); + call outstring(10,50,"code = ",2,0); + call outstring(10,70,"flags = ",2,0); + call outstring(10,90,"button = ",2,0); + call patern(100,210,300,320,3,1); (* make a rectangle filled in colour 3 *) + + array xx dim (1:6); + array yy dim (1:6); + xx(1):=410; yy(1):=10; + xx(2):=450; yy(2):=30; + xx(3):=460; yy(3):=50; + xx(4):=430; yy(4):=80; + xx(5):=420; yy(5):=40; + xx(6):=480; yy(6):=30; + call intens(6,xx,yy,8,1); (* show a polygon filled*) + for i:=1 to 6 + do + yy(i):=yy(i)+100; + od; + call intens(6,xx,yy,15,0); (* show another polygon empty *) + + call cirb(500,300,50,40,100,3500,10,0); (* draw an empty pie or camembert *) + call cirb(400,400,40,40,600,4000,11,1); (* draw a filled pie *) + + + i:=hfont(100,350,6,-9999999,9999999,500,9,0,15); (* read integer from a window *) + call hpage(100,400,10,unpack("Il fait beau dans ma verte campagne"),9,0); (* show text *) + rep:=hfont8(100,430,10,80,unpack("tototutu"),9,0,15); (* read text *) + + call getmovement(1,1); (* take into consideration both key events and mouse events *) + + do + d:=getpress(v,p,h,l,r,c); (* ask about an event *) + if (d) + then call outstring(10,400,"Event",2,0); + call patern(80,25,130,100,0,1); + call track(40,10,v,0,4); (* print integer *) + call track(140,10,p,0,4); + call track(80,30,h,0,4); + call track(80,50,l,0,4); + call track(80,70,r,0,4); + call track(80,90,c,0,4); + if((h=164 and l=27) or (c=3)) (* exit if either two buttons were pressed c=3 or Ctrl+Esc key *) + then exit; + fi; + fi; + od; + call groff; (* leave the graphic mode and return to the text mode *) + writeln("i=",i); + for i:=lower(rep) to upper(rep) + do + write(rep(i)); + od; + writeln; + End + End +End. + + + + + + + + + + diff --git a/doc/leaflet.doc b/doc/leaflet.doc new file mode 100644 index 0000000000000000000000000000000000000000..2267c34f356cf7b909f545c0fd814e8b9364553a GIT binary patch literal 2855 zcmds(U1%It6vxlb?z%g>Ni1m^L(zC^V`E_xlcq(h6kSa!TVq|D#EODA*_~{r-JRLa z%qFh&BNibPtCoUDkv#Yy6ro57LZ7PEC-Y$Y;ERYxP-D7Pio}wKV%Ptf*-5g=TBIO? zXXbbAz2}}ebHC=^`S!yOdhua7Ow>djv@8=oqO_l=J-Tf3a-XA)*xY35&Fi_uKh>kd#G6^3eZOAX6k~bf1oAW=6EjaJLpMR zexQ3J9D#K!eFnXq{($bGC!noL%h`h*i>HYs@{U!&0L=5shOhwihg87->t4qpb>>Ju;%2LN~@eKUHVHxL(ycW!Na#PX9&< zcEPk&kygjltdY;5y`A2;L|OV1gYlT?Rr3nmxLTy!6W%x-DyT6rq-$fUX=(N)L=j1) z5KZWot=R>HHAcjebIMxbTjZ+!ifJk1(I}pYi9H2f72P{`Zm*Bj@lZJlddaPEdoQm~ z#vkiz>fRs=NYN;mmBI5G+%zG*d9?G``S@E;1>e>K@3aJu>jAg2o0I=?{`ot91H22~ z2PLoot^r9Rx&_D}0rr9c@H99C#=v3lD)a1!vE_zheEzk}<5U)&FDa2k9J z&VXqU!yNViZw>HVzW}`XK8(CK-&aesv$LgA>FZMI%hI`X)5xBhnmTc8a`ME~%ad-u z{wlHul`pK0R7Z$VpghyoAlI@s z2WnaWtZBU{)$;YP@#U7K*0v1RIa(coeZ$qht@X5ysJudO0H0o zYq8KAX}~v2bd}0g7gv>uzUOov3#Zlj`OOZx;#4rwWEjNq1RtGQuPU!WUn#voH@5|$i6n)A5j{A0Wby0tEu=@c@ z4m`RqksMrI3HNG=_=o(xbcF7Fj@u~H$>@%78hz)kxZUwn3&oJV?sLohynKVJI{uAH z&q(Ke&sH3~pB67YzVtF5|F-?D_<4XUaw~?~%e$$RchWQP@urOb6~6)(z)xTf@aR&= zjT8v+3BcuUCk=#ncOVLe_ypmUClOy}h))klh<6iCc}L-YMr?ZiQ^;M!?&B_r*MFT; nhho3}N z_my*bFEF}_rs=k-oHVy+C;pwjovrQ1=W3lmr{FuD-l*g`?H@k<6o=s)=4g{~$9ebdZ|D!>ztI(DlyVt;GgpvTG`(*yVh?S= zu!fpS8nZn4s^eW|Nh~)x>(XSm$meUck7d-TzFFG zAKgnk6oZi>7H!HK#DeFkNHL$ut*1AzmvRJ}DL>e$NJ*AO`iVc$r#t_Ny(4mJH(;d6 znL#TqZ%e~)EfM#Jh5S?ZasMQs4{jzRa6KVOl3016AWSD>(35|z4F4tnwn(3Z&^oR& z*QSCBa8C)tT}6^&AS)|D5%R;V5``HN@(r*IV{l(ti9k4yd52gP!YdenMP&>Y1jsK| z9y61?In+55FF~VWT2<7DRdq>~$^$F|Bt>WY&KvNi@WRlO5ORnpuyJM} z5MIMI+AcHE4V(a^JqtRq4N}Jz<@Pqgq?}9y2RZ{PPHPfGGnnC=aa37_+5oEPxiB0Q zdTlraS;YrSA~FgG12ixxx=#BFm&DuaT8`PENP9=HFG~JZh^eS<5l#$;ah($ literal 0 HcmV?d00001 diff --git a/doc/loglan.inf b/doc/loglan.inf new file mode 100644 index 0000000..919210b --- /dev/null +++ b/doc/loglan.inf @@ -0,0 +1,49 @@ +Bonjour, + +LITA a le plaisir d'annoncer que vous pouvez acceder et utiliser +les programmes suivants + + loglan, gen, int, Xint + == le compilateur et l'interpretateur du Loglan'82 + le langage de programmation par objets, avec les processus. + (le produit des LITA et l'Institut d'Informatique a Varsovie). + + f2c + == le compilateur de Fortran vers C et C++ + (le produit de GNU) + + g++ + == le compilateur de C++ + (le produit de GNU) + + et d'autres utilitaires de GNU + +Inserez + /home/r/lita/salwicki/bin +dans votre ligne de PATH. + +Vous pouvez egalement recuperer un complet des fichiers Loglan'82: + - les executables, + - les sources, + - la documentation, + - les exemples, + - l'environnement DOS (editeurs etc.) + +par ftp + + server: infpc1.univ-pau.fr (192.70.116.32) + user: anonymous + password: "votre adresse internet" + +N'hesitez pas nous consulter. + +Bonne programmation! + + + salwicki@infpc1.univ-pau.fr + mirkowsk@infpc1.univ-pau.fr + bernard@infpc1.univ-pau.fr + + + Pau, le 23 Septembre 1993 + diff --git a/doc/loglan.txt b/doc/loglan.txt new file mode 100644 index 0000000..93179c6 --- /dev/null +++ b/doc/loglan.txt @@ -0,0 +1,2010 @@ + + + + + + + + + + + + + + + + + + + + A micro-manual + + of + + the programming language + + + L O G L A N - 82 + ================ + + + + Basic constructs and facilities + + + Author: Antoni Kreczmar + Institute of Informatics, Warsaw University + September 1982 + + + LOGLAN-82 is a universal programming language designed at the +Institute of Informatics, University of Warsaw. Its syntax is +patterned upon Pascal's. Its rich semantics includes the classical +constructs and facilities offered by the Algol-family programming +languages as well as more modern facilities, such as concurrency and +exception handling. + The basic constructs and facilities of the LOGLAN-82 programming +language include: + +1) A convenient set of structured statements, + +2) Modularity (with the possibility of module nesting and extending), + +3) Procedures and functions (fully recursive; procedures and functions + can be used also as formal parameters), + +4) Classes (as a generalization of records) which enable to define + complex structured types, data structures, packages, etc., + +5) Adjustable arrays whose bounds are determined at run-time in such a + way that multidimensional arrays may be of various shapes, e.g. + triangular, k-diagonal, streaked, etc., + +6) Coroutines and semi-coroutines, + +7) Prefixing - the facility borrowed from Simula-67, substantially + generalized in LOGLAN-82 - which enables to build up hierarchies of + types and data structures, problem-oriented languages, etc., + +8) Formal types treated as a method of module parametrization, + +9) Module protection and encapsulation techniques, + +10) Programmed deallocator - a tool for efficient and secure garbage + collection, which allows the user to implement the optimal + strategy of storage management, + +11) Exception handling which provides facilities for dealing with + run-time errors and other exceptional situations raised by the + user, + +12) Separate compilation techniques, + +13) Concurrency easily adaptable to any operating system kernel and + allowing parallel programming in a natural and efficient way. + + The language covers system programming, data processing, and +numerical computations. Its constructs represent the state-of-art and +are efficiently implementable. Large systems consisting of many +cooperating modules are easily decomposed and assembled, due to the +class concept and prefixing. + LOGLAN-82 constructs and facilities have appeared and evolved +simultaneously with the experiments on the first pilot compiler +(implemented on Mera-400 Polish minicomputer). The research on +LOGLAN-82 implementation engendered with new algorithms for static +semantics, context analysis, code generation, data structures for +storage management etc. + The LOGLAN-82 compiler provides a keen analysis of syntactic and +semantic errors at compilation as well as at run time. The object code +is very efficient with respect to time and space. The completeness of +error checking guarantees full security and ease of program debugging. + +1. Compound statements +###################### + + Compound statements in LOGLAN-82 are built up from simple statements +(like assignment statement e.g. x:=y+0.5, call statement e.g. callP(7,x+5) e + The syntax of conditional statement is as follows: + + if boolean expression + then + sequence of statements + else + sequence of statements + fi + +where "else part" may be omitted: + + if boolean expression + then + sequence of statements + fi + + The semantics of conditional statement is standard. The keyword fi +allows to nest conditional statements without appearence of "dangling +else" ambiguity. + +Example: +-------- + + if delta>0 if + then + x2:=sqrt(delta)/a/2; + if b=0 + then + x1:=x2 + else + x1:=-b/a/2+x2; x2:=x1-2*x2 + fi + else + if delta=0 + then + x1:=-b/a/2; x2:=x1 + else + write(" no real roots") + fi + fi + + The statements in a sequence of statements are separated with +semicolons (semicolon may end a sequence , and then, the last +statement in the sequence is the empty statement). + + The short circuit control forms are realized in LOGLAN-82 by the +conditional statements with orif (or andif) list. A conditional +statement with orif list has the form: orif + + if wb1 orif wb2 ... orif wbk + then + sequence of statements + else + sequence of statements + fi + +and corresponds somehow to a conditional statement: + + if wb1 or wb2 ... or wbk + then + sequence of statements + else + sequence of statements + fi + + The above conditional statement (without orif list) selects for +execution one of two sequences of statements, depending on the truth +value of the boolean expression: + + wb1 or wb2 or ... wbk + +which is always evaluated till the end. For the execution of the +conditional statement with orif list the specified conditons +wb1,...,wbk are evaluated in succession, until the first one evaluates +to true. Then the rest of the sequence wb1,...,wbk is abandoned and +"then part" is executed. If none of the conditions wb1,...,wbk +evaluates to true "else part" is executed (if any). + Conditional statements with orif list facilitate to program those +conditions, which evaluation to the end may raise a run-time error. + +Example: +-------- + The execution of the statement: + + if i>n or A(i)=0 then i:=i-1 else A(i):=1 fi + +where the value of i is greater than n, and A is an array with upper +bound n, will raise the run-time error. Then the user can write: + + if i>n orif A(i)=0 then i:=i-1 else A(i):=1 fi + +what allows to avoid this run-time error and probably agrees with his +intension. + + Conditional statement with andif list has the form: + + if wb1 andif wb2 ... andif wbk + then + sequence of statements + else + sequence of statements + fi + + For the execution of this kind of statements, the conditions +wb1,...,wbk are evaluated in succession, until the first one evaluates +to false; then "else part" (if any) is executed. Otherwise "then part" +is executed. + + Iteration statement in LOGLAN-82 has the form: + + do sequence of statements od + An iteration statement specifies repeated execution of the sequence +of statements and terminates with the execution of the simple +statement exit + +Example: +-------- + + s:=1; t:=1; i:=1; + do + i:=i+1; t:=t*x/i; + if abs(t) < 1.0E-10 then exit fi; + s:=s+t + od; + + If two iteration statements are nested, then double exit in the +inner one terminates both of them. + +Example: +-------- + + r,x:=0; + do + s,t:=1; i:=1; x:=x+0.2; + do + i:=i+1; t:=t*x/i; + if i > n then exit exit fi; (* termination of both loops *) + if t < 1 then exit fi; (* termination of the inner loop *) + s:=s+t + od + od + + In the example above simultaneous assignment statements are +illustrated (e.g. r,x:=0) and comments, which begin with a left +parenthesis immediately followed by an asterisk and end with an +asterisk immediately followed by a right parenthesis. + + Triple exit terminates three nested iteration statements, four exit +terminates four nested iteration statements etc. + + The iteration statement with while condition: w + + while boolean expression + do + sequence of statements + od + +is equivalent to: + + do + if not boolean expression then exit fi; + sequence of statements + od + + The iteration statements with controlled variables (for statements) +have the forms: + + for j:=wa1 step wa2 to wa3 + do + sequence of statements + od + +or + + for j:=wa1 step wa2 downto wa3 + do + sequence of statements + od + + The type of the controlled variable j must be discrete. The value of +this variable in the case of the for statement with to is increased, +and in the case of the for statement with downto is decreased. The +discrete range begins with the value of wa1 and changes with the step +equal to the value of wa2. The execution of the for statement with to +terminates when the value of j for the first time becomes greater than +the value of wa3 (with downto when the value of j for the first time +becomes less than the value of wa3). After the for statement +termination the value of its controlled variable is determined and +equal to the first value exceeding the specified discrete range. The +values of expressions wa1, wa2 and wa3 are evaluated once, upon entry +to the iteration statement. Default value of wa2 is equal 1 (when the +keyword step and expression wa2 are omitted). + for or while statements may be combined with exit statement. + +Example: +-------- + + for j:=1 to n + do + if x=A(j) then exit fi; + od + + The above iteration statement terminates either for the least j, +1<=j<=n, such that x=A(j) or for j=n+1 when x=/=A(j), j=1,...,n. + + To enhance the user's comfort, the simple statement repeat is +provided. It may appear in an iteration statement and causes the +current iteration to be finished and the next one to be continued +(something like jump to CONTINUE in Fortran's DO statements). + +Example: +-------- + + i:=0; s:=0; + do + i:=i+1; + if A(i) < 0 then repeat fi; (* jump to od, iterations are continued *) + if i > m then exit fi; (* iteration statement is terminated *) + s:=s+sqrt(A(i)); + od; + + Just as exit, repeat may appear in for statement or while statement. +Then the next iteration begins with either the evaluation of a new +value of the controlled variable (for statement) or with the +evaluation of the condition (while statement). + + Case statement in LOGLAN-82 has the form: + + case WA + when L1 : I1 + when L2 : I2 + ... + when Lk : Ik + otherwise I + esac + +where WA is an expression , L1,...,Lk are constants and I1,..., Ik,I +are sequences of statements. + A case statement selects for execution a sequence of statements Ij, +1<=j<=k, where the value of WA equals Lj. The choice otherwise covers +all values (possibly none) not given in the previous choices. The +execution of a case statement chooses one and only one alternative +(since the choices are to be exhaustive and mutually exclusive). + +2. Modularity +############# + + Modular structure of the language is gained due to the large set of +means for module nesting and extending. Program modules (units) are +blocks, procedures, functions, classes, coroutines and processes. +Block is the simplest kind of unit. Its syntax is the following: + + block + lists of declarations + begin + sequence of statements + end + + The sequence of statements commences with the keyword begin (it may +be omitted when this sequence is empty). The lists of declarations +define the syntactic entities (variables, constants, other units), +whose scope is that block. The syntactic entities are identified in +the sequence of statements by means of names (identifiers). + +Example: +-------- + + block + const n=250; + var x,y:real, i,j,k: integer, b: boolean; + const m=n+1; + begin + read(i,j); (* read two integers *) + x,y:=n/(i+j); (* simultaneous assignment *) + read(c) ; (* read a character *) + b:= c = 'a'; (* 'a' a character *) + for k:= 1 to m + do + write(x+y/k:10:4); (* print the value of x+y/k + in the field of 10 characters, 4 digits after the point *) + od + end + + In the lists of declarations semicolons terminate the whole lists, +not the lists elements. Any declaration list must begin with the +pertinent keyword (var for variables, const for constants etc.). The +value of an expression defining a constant must be determinable +statically (at compilation time). + Program in LOGLAN-82 may be a block or alternatively may be of the +following form: + + program name; + lists of declarations + begin + sequence of statements + end + +Then the whole program can be identified by that name (the source as +well as the object code). + + A block can appear in the sequence of statements (of any unit), thus +it is a statement. (Main block is assumed to appear as a statement of +the given job control language.) + For the execution of a block statement the object of block is +created in a computer memory, and then, the sequence of statements is +performed. The syntactic entities declared in the block are allocated +in its object. After a block's termination its object is automatically +deallocated (and the corresponding space may be immediately reused). + The modular structure of the language works "in full steam" when not +only blocks, but the other kinds of units are also used. They will be +described closer in the following points. + Unit nesting allows to build up hierarchies of units and supports +security of programming. It follows from the general visibility rules; +namely, a syntactic entity declared in an outer unit is visible in an +inner one (unless hidden by an inner declaration). On the other hand, +a syntactic entity declared in an inner unit is not visible from an +outer one. + +Example: +-------- + + program test; + var a,b,c:real, i,j,k:integer; + begin + read(a,b,c,i); + block + var j,k:real; + begin + j:=a; k:=j+b; write(" this is the inner block ",j,k) + end; + write(" this is the outer block ",i,a:20) + end; + + In this program, first the main block statement is executed (with +variables a,b,c,i,j,k). Next, after the read statement, the inner +block statement is executed (with variables j,k). In the inner block +the global variables j,k are hidden by the local ones. + + +3. Procedures and functions +########################### + + Procedures and functions are well-known kinds of units. Their syntax +is modelled on Pascal's, though with some slight modifications. +Procedure (function) declaration consists of a specification part and +a body. + + Example: + -------- + unit Euclid: function(i,j:integer):integer; + var k:integer; + begin + do + if j=0 then exit fi; + k:=i mod j; i:=j; j:=k + od; + result:=i + end; + + Procedure or function specification begins with its identifier +preceded by the keyword unit. (The same syntax concerns any other module +named unit.) Then follows its kind declaration, its formal parameters +(if any), and the type of the returned value (only for functions). A +body consists of declaration lists for local entities and a sequence +of statements. The keyword begin commences the sequence of statements +, and is omitted , if this sequence is empty. The value returned by a +function equals to the most recent value of the standard variable +"result", implicitly declared in any function. This variable can be +used as a local auxiliary variable as well. + + Example: + -------- + unit Newton: function(n,m:integer):integer; + var i:integer; + begin + if m > n then return fi; + result:=n; + for i:=2 to m do result:=result*(n-i+1) div i od + end Newton; + The optional identifier at the end of a unit must repeat the +identifier of a unit. It is suggested that the compilers check the +order of unit nesting, so these optional occurrences of identifiers +would facilitate program debugging. + All the local variables of a unit are initialized (real with 0.0, +integer with 0, boolean with false etc.). Thus , for instance, the +value of function Newton is 0 for m>n, since "result" is also +initialized, as any other local variable. + + The return statement (return) completes the execution of a procedure +(function) body,i.e. return is made to the caller. If return does not +appear explicitly, return is made with the execution of the final end +of a unit. Upon return to the caller the procedure (function) object +is deallocated. + Functions are invoked in expressions with the corresponding list of +actual parameters. Procedures are invoked by call statement (also with +the corresponding list of actual parameters). + + Example: + -------- + i:=i*Euclid(k,105)-Newton(n,m+1); + call P(x,y+3); + + Formal parameters are of four categories: variable parameters, +procedure parameters, function parameters and type parameters (cf +p.8). Variable parameters are considered local variables to the unit. +A variable parameter has one of three transmission modes: input, +output or inout. If no mode is explicitly given the input mode is +assumed. For instance in the unit declaration: + + unit P: procedure(x,y:real,b:boolean;output c:char,i:integer;inout j:integer); + +x,y,b are input parameters , c,i are output parameters , and j is +inout parameter. + + Input parameter acts as a local variable whose value is initialized +by the value of the corresponding actual parameter. Output parameter +acts as a local variable initialized in the standard manner (real with +0.0, integer with 0, boolean with false etc.). Upon return its value +is assigned to the corresponding actual parameter, in which case it +must be a variable. However the address of such an actual parameter is +determined upon entry to the body. Inout parameter acts as an input +parameter and output parameter together. + + Example: + -------- + unit squareeq: procedure(a,b,c:real;output xr,xi,yr,yi:real); + (* given a,b,c the procedure solves square equation : ax*x+bx+c=0. + xr,xi- real and imaginary part of the first root + yr,yi- real and imaginary part of the second root *) + var delta: real; + begin (*a=/=0*) + a:=2*a; c:=2*c; delta:=b*b-a*c; + if delta <= 0 + then + xr,yr:=-b/a; + if delta=0 then return fi; (*xi=yi=0 by default*) + delta:=sqrt(-delta); + xi:=delta/a; yi:=-xi; + return + fi; + delta:=sqrt(delta); + if b=0 + then + xr:=delta/a; yr:=-xr; + return + fi; + if b>0 then b:=b+delta else b:=b-delta fi; + xr:=-b/a; yr:=-c/b; + end squareeq; + + A procedure call to the above unit may be the following: + + call squareeq(3.75*H,b+7,3.14,g,gi,h,hi); +where g,h,gi,hi are real variables. + + + No restriction is imposed on the order of declarations. In +particular, recursive procedures and functions can be declared without +additional announcements (in contrast to Pascal). + + Example: + -------- + + For two recursive sequences defined as: + + a(n)=b(n-1)+n+2 n>0 + b(n)=a(n-1)+(n-1)*n n>0 + a(0)=b(0)=0 + +one can declare two functions: + + unit a: function(n:integer):integer; + begin + if n>0 then result:=b(n-1)+n+2 fi + end a; + unit b: function(n:integer):integer; + begin + if n>0 then result:=a(n-1)+(n-1)*n fi + end b; + +and invoke them: + + k:=a(100)*b(50)+a(15); + + Functions and procedures can be formal parameters as well. + + Example: + -------- + +unit Bisec: procedure(a,b,eps:real;output x:real;function f(x:real):real); +(*this procedures searches for zero of continous function f in segment (a,b) *) +var h:real,s:integer; +begin + s:=sign(f(a)); + if sign(f(b))=s then return fi; (* wrong segment *) + h:=b-a; + do + h:=h/2; x:=a+h; + if h < eps then return fi; + if sign(f(x))=s then a:=x else b:=x fi + od +end Bisec; + + In the above declaration, after the input variable parameters +a,b,eps and the output variable parameter x, a function parameter f +appears. Note that its specification part is complete. Thus the check +of actual-formal parameter compatibility is possible at compilation +time. Making use of this syntactic facility is not possible in +general, if a formal procedure (function) is again a formal parameter +of a formal procedure (function). The second degree of formal +procedures (functions) nesting is rather scarce, but LOGLAN-82 admits +such a construct. Then formal procedure (function) has no +specification part and the full check of actual-formal parameter +compatibility is left to be done at run time. + + Example: + -------- + + unit P: procedure(j:integer;procedure G(i:integer;procedure H)); + ... + begin + ... + call G(j,P); + end P; + + Procedure G is a first degree parameter, therefore it occurs with +complete specification part. Procedure H is a second degree parameter +and has no specification part. In this case a procedure call can be +strongly recursive: + + call P(i+10,P); + +4. Classes +########## + + Class is a facility which covers such programming constructs as +structured type, package, access type, data structure etc. To begin +with the presentation of this construct, let us consider a structured +type assembled from primitive ones: + + unit bill: class; + var dollars :real, + not_paid :boolean, + year,month,day :integer; + end bill; + + The above class declaration has the attributes : dollars (real), +not_paid (boolean), and year,month,day (integer). Wherever class bill +is visibile one can declare variables of type bill: + + var x,y,z:bill; + + The values of variables x, y, z can be the addresses of objects of +class bill. These variables are called reference variables. With +reference variable one can create and operate the objects of reference +variable type. + + An object of a class is created by the class generation statement +(new), and thereafter, its attributes are accessed through dot +notation. + + x:=new bill; (* a new object of class bill is created *) + x.dollars:=500.5; (* define amount *) + x.year:=1982; (* define year *) + x.month:=3; (* define month *) + x.day:=8; (* define day *) + y:=new bill; (* create a new object *) + y.not_paid:=true; (* bill not_paid *) + z:=y; (* variable z points the same object as variable y *) + + If an object of class bill has been created (new bill) and its +address has been assigned to variable x (x:=new bill), then the +attributes of that object are accessible through dot notation (remote +access). The expression x.dollars gives , for instance, the remote +access to attribute dollars of the object referenced by x. + All attributes of class objects are initialized as usual. For the +above example the object referenced by x, after the execution of the +specified sequence of statements, has the following structure: + + --------------- + | 500.5 | dollars + --------------- + | false | not_paid + --------------- + | 1982 | year + --------------- + | 3 | month + --------------- + | 8 | day + --------------- + + The object referenced by y and z has the following structure: + + --------------- + | 0 | dollars + --------------- + | true | not_paid + --------------- + | 0 | year + --------------- + | 0 | month + --------------- + | 0 | day + --------------- + + The value none is the default initial value of any reference +variable and denotes no object. A remote access to an attribute of +none raises a run time error. + Class may have also formal parameters (as procedures and functions). +Kinds and transmission modes of formal parameters are the same as in +the case of procedures. + + Example: + -------- + + unit node: class (a:integer); + var left,right:node; + end node; + + Let , for instance, variables z1, z2, z3 be of type node. Then the +sequence of statements: + + z1:=new node(5); + z2:=new node(3); + z3:=new node(7); + z1.left:=z2; z1.right:=z3; + + creates the structure: + + ----------- + z1----> | 5 | + ----------- + <---- | left | + | ----------- + | | right | -------> + | ----------- | + | | + ------------ ------------ +z2---->| 3 | | 7 | <----z3 + ------------ ------------ + | none | | none | + ------------ ------------ + | none | | none | + ------------ ------------ + + +where arrows denote the values of the reference variables. + + Class may also have a sequence of statements (as any other unit). +That sequence can initialize the attributes of the class objects. + + Example: + -------- + + unit complex:class(re,im:real); + var module:real; + begin + module:=sqrt(re*re+im*im) + end complex; + + Attribute module is evaluated for any object generation of class +complex: + + z1:=new complex(0,1); (* z1.module equals 1 *) + z2:=new complex(2,0); (* z2.module equals 2 *) + + For the execution of a class generator, first a class object is +created, then the input parameters are transmitted , and finally, the +sequence of statements (if any) is performed. Return is made with the +execution of return statement or the final end of a unit. Upon return +the output parameters are transmitted. + Procedure object is automatically deallocated when return is made to +the caller. Class object is not deallocated , its address can be +assigned to a reference variable, and its attributes can be thereafter +accessed via this variable. + + The classes presented so far had only variable attributes. In +general, class attributes may be also other syntactic entities, such +as constants, procedures, functions, classes etc. Classes with +procedure and function attributes provide a good facility to define +data structures. + + Example: + -------- + + A push_down memory of integers may be implemented in the following +way: + + unit push_down :class; + unit elem:class(value:integer,next:elem); + (* elem - stack element *) + end elem; + var top:elem; + unit pop: function :integer; + begin + if top=/= none + then + result:=top.value; top:=top.next + fi; + end pop; + unit push:procedure(x:integer); (* x - pushed integer *) + + begin + top:=new elem(x,top); + end push; + end push_down; + + Assume that somewhere in a program reference variables of type +push_down are declared (of course, in place where push_down is +visibile): + + var s,t,z:push_down; + + Three different push_down memories may be now generated: + + s:=new push_down(100); t:=new push_down(911); z:=new push_down(5); + + One can use these push_down memories as follows: + + call s.push(7); (* push 7 to s *) + call t.push(1); (* push 1 to t *) + i:=z.pop; (* pop an element from z *) + etc. + +5. Adjustable arrays +#################### + + In LOGLAN-82 arrays are adjustable at run time. They may be treated +as objects of specified standard type with index instead of identifier +selecting an attribute. An adjustable array should be declare +somewhere among the lists of declarations and then may be generated in +the sequence of statements. + + Example: + -------- + + block + var n,j:integer; + var A:arrayof integer; (* here is the declaration of A *) + begin + read(n); + new_array A dim (1:n); (* here is the generation of A *) + for i:=1 to n + do + read(A(i)); + od; + (* etc.*) + end + + A variable A is an array variable. Its value should be the reference +to an integer array, i.e. a composite object consisting of integer +components each one defined by an integer index. Array generation +statement: + + new_array A dim (1:n); + +allocates a one-dimensional integer array with the index bounds 1,n , +and assigns its address to variable A. The figure below illustrates +this situation: + + ---------- ----------- + | | | A(1) | + | | ----------- + | ... | | A(2) | + ---------- ----------- + | n | | | + ---------- ... + | j | | | + ---------- ----------- + | A | ---------> | A(n) | + ---------- ----------- + Block object Array object + + A general case of array generation statement has the form: + + new_array A dim (lower:upper) + +where lower and upper are arithmetic expressions which define the +range of the array index. + + Example: + -------- + + Two-dimensional array declaration : + + var A: arrayof arrayof integer; + +and generation: + + new_array A dim (1:n) + for i:=1 to n do new_array A(i) dim (1:m) od; + +create the structure: + + ---------- + | A(1,1) | + ---------- + | | + ... + | | + ------------ ---------- + | A(1) | ---------> | A(1,m) | + ------------ ---------- + | | + ... + | | + ------------ ---------- + | A(n) | ---------> | A(n,1) | + ------------ ---------- + | | + ... + | | + ---------- + | A(n,m) | + ---------- + + Example: + -------- + + block + var i,j:integer, A,B: arrayof arrayof real, n:integer; + begin + read(n); + new_array A dim (1:n); + for i:=1 to n do new_array A(i) dim (1:n) od; + (* A is square array *) + new_array B dim (1:n); + for i:=1 to n do new_array B(i) dim(1:i) od; + (* B is lower triangular array *) + A(n,n):=B(n,n); + B(1):=A(1); + B(1):=copy(A(1)); + end + + Array A is the square array n by n. Each element A(i) , 1<=i<=n +contains the address of row A(i,j), 1<=j<=n. Array B is the +lower-triangular array. Each element B(i), 1<=i<=n, contains the +address of row B(i,j), 1<=j<=i. Thus an assignment statement +A(n,n):=B(n,n) transmits real value B(n,n) to real variable A(n,n). +Assignment B(1):=A(1) transmits the address of the first row of A to +variable B(1). Finally assignment B(1):=copy (A(1)) creates a copy of +the first row of A and assigns its address to B(1). + + Upper and lower bounds of an adjustable array A are determined by +standard operators lower(A) and upper(A). + + Example: + -------- + + unit sort: procedure(A:arrayof integer); (* insertion sort *) + var n,i,j:integer; var x:integer; + begin + n:=upper(A); (* assume lower bound is 1 *) + for i:=2 to n + do + x:=A(i); j:=i-1; + do + if x >= A(j) then exit fi; + A(j+1):=A(j); j:=j-1; + if j=0 then exit fi; + od; + A(j+1):=x + od; + end sort; + + If an array variable A refers to no array its value is equal none +(the standard default value of any array variable). An attempt to +access an array element (e.g. A(i)) or a bound (e.g. lower(A)), where +A is none, raises a run time error. - 24 - + + +6. Coroutines and semicoroutines +################################ + + Coroutine is a generalization of class. A coroutine object is an +object such that the execution of its sequence of statements can be +suspended and reactivated in a programmed manner. Consider first a +simple class with a sequence of statements such that after return some +non-executed statements remain. The generation of its object +terminates with the execution of return statement, although the object +can be later reactivated. If such a class is declared as a coroutine, +then its objects may be reactivated. This can be realized by attach +statement: + + attach(X) + +where X is a reference variable designating the activating coroutine +object. + In general, since the moment of generation a coroutine object is +either active or suspended. Any reactivation of a suspended coroutine +object X (by attach(X)) causes the active coroutine object to be +suspended and continues the execution of X from the statement +following the last executed one. + Main program is also a coroutine. It is accessed through the +standard variable main and may be reactivated (if suspended) by the +statement attach(main). + + Example: + -------- + + In the example below the cooperation of two coroutines is presented. +One reads the real values from an input device, another prints these +values in columns on a line-printer, n numbers in a line. The input +stream ends with 0. + +program prodcons; + var prod:producer,cons:consumer,n:integer,mag:real,last:bool; + unit producer: coroutine; + begin + return; + do + read(mag); (* mag- nonlocal variable, common store *) + if mag=0 + then (* end of data *) + last:=true; + exit + fi; + attach(cons); + od; + attach(cons) + end producer; + + unit consumer: coroutine(n:integer); + var Buf:arrayof real; + var i,j:integer; + begin + new_array Buf dim(1:n); + return; + do + for i:=1 to n + do + Buf(i):=mag; + attach(prod); + if last then exit exit fi; + od; + for i:=1 to n + do (* print Buf *) + write(' ',Buf(i):10:2) + od; + writeln; + od; + (* print the rest of Buf *) + for j:=1 to i do write(' ',Buf(j):10:2) od; + writeln; + attach(main); + end consumer; + + begin + prod:=new producer; + read(n); + cons:=new consumer(n); + attach(prod); + writeln; + end prodcons; + + The above task could be programmed without coroutines at all. The +presented solution is, however, strictly modular, i.e. one unit +realizes the input process, another realizes the output process, and +both are ready to cooperate with each other. + + LOGLAN-82 provides also a facility for the semi-coroutine +operations. This is gained by the simple statement detach. If X is the +active coroutine object, then detach reactivates that coroutine object +at where the last attach(X) was executed. This statement meets the +need for the asymetric coroutine cooperations. (by so it is called +semi-coroutine operation). Operation attach requires a reactivated +coroutine to be defined explicitly by the user as an actual parameter. +Operation detach corresponds in some manner to return in procedures. +It gives the control back to a coroutine object where the last +attach(X) was executed, and that coroutine object need not be known +explicitly in X. This mechanism is, however, not so secure as the +normal control transfers during procedure calls and returns. + + In fact, the user is able to loop two coroutines traces by : + + attach(Y) in X + attach(X) in Y + + +Then detach in X reactivates Y, detach in Y reactivates X. + + In the example below the application of detach statement is +illustrated. + + Example: + -------- + + program reader_writers; + (* In this example a single input stream consisting of blocks of + numbers, each ending with 0, is printed on two printers of + different width. The choice of the printer is determined by the + block header which indicates the desired number of print + columns. The input stream ends with a double 0. m1 - the width + of printer_1, m2 - the width of printer_2 *) + const m1=10,m2=20; + var reader:reading,printer_1,printer_2:writing; + var n:integer,new_sequence:boolean,mag:real; + + unit writing:coroutine(n:integer); + var Buf: arrayof real, i,j:integer; + begin + new_array Buf dim (1:n); (* array generation *) + return; (* return terminates coroutine initialization *) + do + attach(reader); (* reactivates coroutine reader *) + if new_sequence + then (* a new sequence causes buffer Buf to be cleared up *) + for j:=1 to i do write(' ',Buf(j):10:2) od; writeln; + i:=0; new_sequence:=false; attach(main) + else + i:=i+1; Buf(i):=mag; + if i=n + then + for j:=1 to n do write(' ',Buf(j):10:2) od; writeln; + i:=0; + fi + fi + od + end writing; + + unit reading: coroutine; + begin + return; + do + read(mag); + if mag=0 then new_sequence:=true; fi; + detach; (* detach returns control to printer_1 or + od + end reading; + + + begin + reader:=new reading; + printer_1:=new writing(m1); printer_2:=new writing(m2); + do + read(n); + case n + when 0: exit + when m1: attach(printer_1) + when m2: attach(printer_2) + otherwise write(" wrong data"); exit + esac + od + end; + + Coroutines play the substantial role in process simulation. Class +Simulation provided in Simula-67 makes use of coroutines at most +degree. LOGLAN-82 provides for easy simulation as well. The LOGLAN-82 +class Simulation is implemented on a heap what gives lg(n) time cost +(in contrast with O(n) cost of the original implementation). It covers +also various simulation problems of large size and degree of +complexity. + + +7. Prefixing +############ + + Classes and prefixing are ingenius inventions of Simula-67 (cf [1]). +Unfortunately they are hardly ever known and, perhaps, by this have +not been introduced into any other programming language. Moreover, +implementation constraints of Simula-67 bind prefixing and classes +workableness to such a degree that both facilities cannot be used in +all respects. We hope that LOGLAN-82, adopting merits and rooting up +deficiencies of these constructs, will smooth their variations and +vivify theirs usefulness. + What is prefixing ? First of all it is a method for unit extending. +Consider the simplest example: + + unit bill: class; + var dollars :real, + not_paid :boolean, + year,month,day :integer; + end bill; + +Assume the user desires to extend this class with new attributes. +Instead of writing a completely new class, he may enlarge the existing +one: + + unit gas_bill:bill class; + var cube_meters: real; + end gas_bill; + + Class gas_bill is prefixed by class bill. This new declaration may +appear anywhere within the scope of declaration of class bill. (In +Simula-67 such a prefixing is forbidden in nested units.) Class +gas_bill has all the attributes of class bill and additionally its own +attributes (in this case the only one: cube_meters). The generation +statement of this class has the form: + + z:=new gas_bill; +where z is a reference variable of type gas_bill. Remote access to the +attributes of prefixed class is standard: + + z.dollars:=500.5; z.year:=1982; z.month:=3; z.day:=8; + z.cube_meters:=100000; + + Consider now the example of a class with parameters. + + Assume that in a program a class: + + unit id_card: class(name:string,age:integer); + end id_card; + +and its extension: + + unit idf_card:id card class(first name:string); + end idf_card; + + + +are declared. + + + Then for variable z of type id_card and variable t of type idf_card +the corresponding generation statement may be the following: + + z:=new id_card("kreczmar",37); + t:=new idf_card("Kreczmar",37,"Qntoni"); + +Thus the formal parameters of a class are concatenated with the formal +parameters of its prefix. + One can still extend class idf_card. For instance: + + unit idr_card:idf_card class; + var children_number:integer; + var birth_place:string; + end idr_card; + + Prefixing allows to build up hierarchies of classes. Each one +hierarchy has a tree structure. A root of such a tree is a class +without prefix. One class is a successor of another class iff the +first is prefixed by the latter one. + + Consider the prefix structure: + + A + . . . + . . . + . . . + B. .C .D + . + . + .E + . + . + .F + . . + . . + G. .H + + Class H has a prefix sequence A, B, E, F, H. Let a, b, ... , h +denote the corresponding unique attributes of classes A, B, ... , H, +respectively. The objects of these classes have the following forms: + + ------------ ------------ ------------ ------------ + | a | | a | | a | | a | + ------------ ------------ ------------ ------------ + object A | b | | c | | d | + ------------ ------------ ------------ + object B object C object D + + + + ------------ ------------ ------------ ------------ + | a | | a | | a | | a | + ------------ ------------ ------------ ------------ + | b | | b | | b | | b | + ------------ ------------ ------------ ------------ + | e | | e | | e | | e | + ------------ ------------ ------------ ------------ + object E | f | | f | | f | + ------------ ------------ ------------ + object F | g | | h | + ------------ ------------ + object G object H + + Let Ra, Rb,..., Rh denote reference variables of types A, B,..., H, +respectively. Then the following expressions are correct: + + Ra.a, Rb.b, Rb.a, Rg.g, Rg.f, Rh.h, Rh.f, Rh.e, Rh.b, Rh.a etc. + + Variable Ra may designate the object of class B (or C,..., H), i.e. +the statement: + + Ra:=new B + +is legal. But then attribute b is not accessible through dot via Ra, +i.e. Ra.b is incorrect. This follows from insecurity of such a remote +access. In fact, variable Ra may point any object of a class prefixed +by A, in particular, Ra may point the object of A itself, which has no +attribute b. If Ra.b had been correct, a compiler should have +distiguish the cases Ra points to the object of A or not. But this, of +course, is undistinguishable at compilation time. + To allow, however, the user's access to attribute b (after instruc tion Ra:= n + + Ra qua B + + The correctness of this expression is checked at run time. If Ra +designates an object of B or prefixed ba B, the type of the expression +is B. Otherwise the expression is erroneous. Thus, for instance, the +expressions: + + Ra qua G.b, Ra qua G.e etc. +enable remote access to the attributes b, c, ... via Ra. + + So far the question of attribute concatenation was merely discussed. +However the sequences of statements can be also concatenated. + Consider class B prefixed with class A. In the sequence of +statements of class A the keyword inner may occur anywhere, but only +once. The sequence of statements of class B consists of the sequence +of statements of class A with inner replaced by the sequence of +statements of class B. + + unit A :class unit B:A class + ... ... + begin begin + ... |---... + | + | + ... |---... + end A; end B; + + + In this case inner in class B is equivalent to the empty statement. +If class B prefixes another class, say C, then inner in B is replaced +by the sequence of statements of class C, and so on. + If inner does not occur explicitly, an implicit occurrence of inner +before the final end of a class is assumed. + + Example + ------- + + Let class complex be declared as usual: + + unit complex: class(re,im:real); + end complex; + +and assume one desires to declare a class mcomplex with the additional +attribute module. In order the generation of class mcomplex define the +value of attribute module, one can declare a class: + + unit mcomplex:complex class; + var module:real; + begin + module:=sqrt(re*re+im*im) + end mcomplex; + + Class mcomplex may be still extended: + + unit pcomplex:mcomplex class; + var alfa:real; + begin + alfa:=arccos(re/module) + end pcomplex; + + For these declarations each generation of class mcomplex defines the +value of attribute module, each generation of class pcomplex defines +the values of attributes module and alfa. + For reference variables z1, z2 z3 of type complex, the following +sequence of statements illustrates the presented constructs: + + z1:=new complex(0,1); + z2:=new mcomplex(4,7); + z3:=new pcomplex(-10,12); + if z2 qua mcomplex.module > 1 + then + z1:=z2; + fi; + if z3 qua pcomplex.alfa < 3.14 + then + z3.re:=-z3.re; z3.alfa:=z3.alfa+3.14; + fi; + z1 qua mcomplex.module:= 0; + z1.re,z1.im:=0; + + + Example: + -------- + Binary search tree (Bst) is a binary tree where for each node x the +nodes in the left subtree are less than x, the nodes in the right +subtree are greater than x. It is the well-known exercise to program +the algorithms for the following operations on Bst: + member(x) = true iff x belongs to Bst + insert(x), enlarge Bst with x, if x does not yet belong to Bst + + We define both these operations in a class: + + unit Bst: class; + unit node: class(value:integer); (* tree node *) + var left,right:node; + end node; + var root:node; + unit help: class(x:integer); (* auxiliary class *) + var p,q:node; + begin + q:=root; + while q=/= none + do + if x < q.value + then + p:=q; q:=q.left; + repeat (* jump to the beginning of a loop *) + fi; + if q.value < x + then + p:=q; q:=q.right; repeat + fi; + exit + od; + inner (* virtual instruction to be + end help; + unit member:help function:boolean; + (* x is a formal parameter derived from the prefix help *) + begin + result:=q=/=none + end member; + unit insert:help procedure; + (* x is a formal parameter derived from the prefix help *) + begin + if q=/=none then return fi; + q:=new node(x); + if p=none then root:=q; return fi; + if p.value < x then p.right:=q else p.left:=q fi; + end insert; + begin + inner; + end Bst; + + In the example the common actions of member and insert are +programmed in class help. Then it suffices to use class help as a +prefix of function member and procedure insert, instead of redundant +occurrences of the corresponding sequence of statements in both units. + + + Class Bst may be applied as follows: + + var X,Y:Bst; + begin + X:=new Bst; Y:=new Bst; + call X.insert(5); + if Y.member(-17) then .... + end + + As shown in the declaration of Bst, class may prefix not only other +classes but also procedures and functions. Class may prefix blocks as +well. + + Example: + -------- + Let class push_down (p. 5) prefix a block: + + pref push_down(1000) block + var ... + begin + ... + call push(50); ... + i:=pop; + ... + end + + In the above block prefixed with class push_down one can use pop and +push as local attributes. (They are local since the block is embedded +in the prefix push down.) + + Example: + -------- + pref push down(1000) block + begin + ... + pref Bst block + begin + (* in this block both structures push down and Bst are visible *) + call push(50); + call insert(13); + if member(10) then ... + i:=pop; + ... + end + end + + In place where classes push_down and Bst are visible together a +block prefixed with Bst may be nested in a block prefixed with +push_down (or vice versa). In the inner block both data structures are +directly accessible. Note that this construct is illegal in Simula 67. + + +8. Formal types +############### + + Formal types serve for unit parametrization with respect to any +non-primitive type. + + Example: + -------- + + unit Gsort:procedure(type T; A:arrayof T; function less(x,y:T):boolean); + var n,i,j:integer; var x:T; + begin + n:=upper(A); + for i:=2 to n + do + x:=A(i); j:=i-1; + do + if less(A(j),x) then exit fi; exit fi + A(j+1):=A(j); j:=j-1; + if j=0 then exit fi; + od; + A(j+1):=x; + od + end Gsort; + + Procedure Gsort (the generalization of procedure sort from p.4) has +type parameter T. A corresponding actual parameter may be an arbitrary +non-primitive type. An actual parameter corresponding to A should be +an array of elements of the actual type T. Function less should define +the linear ordering on the domain T. + For instance, the array A of type bill (cf p.7) may be sorted with +respect to attribute dollars , if the function: + + unit less: function(t,u:bill):boolean; + begin + result:=t.dollars <= u.dollars + end less; + +is used as an actual parameter: + + call Gsort(bill,A,less); + + If the user desires to sort A with respect to date, it is sufficient +to declare : + + unit earlier:function(t,u:bill):boolean; + begin + if t.year < u.year then result:= true; return fi; + if t.year=u.year + then + if t.month < u.month then result:=true; return fi; + if t.month=u.month then result:=t.day<=u.day fi + fi; + end earlier; + +and to call: call Gsort(bill,A,earlier); + + +9. Protection techniques +######################## + + Protection techniques ease secure programming. If a program is +large, uses some system classes, is designed by a team etc., this is +important (and non-trivial) to impose some restrictions on access to +non-local attributes. + Let us consider a data structure declared as a class. Some of its +attributes should be accessible for the class users , the others +should not. For instance, in class Bst (p.7) the attributes member and +insert are to be accessible. On the other hand the attributes root, +node and help should not be accessible, even for a meddlesome user. An +improper use of them may jeopardize the data structure invariants. + To forbid the access to some class attributes the three following +protection mechanisms are provided: + + close, hidden, and taken. + + The protection close defined in a class forbids remote access to the +specified attributes. For example, consider the class declaration: + + unit A: class; + close x,y,z; + var x: integer, y,z:real; + .... + end + + Remote access to the attributes x,y,z from outside of A is +forbidden. + + The protection hidden (with akin syntax) does not allow to use the +specified attributes form outside of A neither by the remote access +nor in the units prefixed by A. The only way to use a hidden attribute +is to use it within the body of class A. + Protection taken defines these attributes derived from prefix, which +the user wishes to use in the prefixed unit. Consider a unit B +prefixed by a class A. In unit B one may specify the attributes of A +which are used in B. This protects the user against an unconscious use +of an attribute of class A in unit B (because of identifier conflict). +When taken list does not occur , then by default, all non-hidden +attributes of class A are accessible in unit B. + + +10. Programmed deallocation +########################### + + The classical methods implemented to deallocate class objects are +based on reference counters or garbage collection. Sometimes the both +methods may be combined. A reference counter is a system attribute +holding the number of references pointing to the given object. Hence +any change of the value of a reference variable X is followed by a +corresponding increase or decrease of the value of its reference +counter. When the reference counter becomes equals 0, the object can +be deallocated. + The deallocation of class objects may also occur during the process +of garbage collection. During this process all unreferenced objects +are found and removed (while memory may be compactified). In order to +keep the garbage collector able to collect all the garbage, the user +should clear all reference variables , i.e. set to None, whenever +possible. This system has many disadvantages. First of all, the +programmer is forced to clear all reference variables, even those +which are of auxiliary character. Moreover, garbage collector is a +very expensive mechanism and thus it can be used only in emergency +cases. + In LOGLAN a dual operation to the object generator, the so-called +object deallocator is provided. Its syntactic form is as follows: + + kill(X) + +where X is a reference expression. If the value of X points to no +object (none) then kill(X) is equivalent to an empty statement. If the +value of X points to an object O, then after the execution of kill(X), +the object O is deallocated. Moreover all reference variables which +pointed to O are set to none. This deallocator provides full security, +i.e. the attempt to access the deallocated object O is checked and +results in a run-time error. + For example: + + Y:=X; kill(X); Y.W:=Z; + +causes the same run-time error as: + + X:=none; X.W:=Z; + + The system of storage management is arranged in such a way that the +frames of killed objects may be immediately reused without the +necessity of calling the garbage collector, i.e. the relocation is +performed automatically. There is nothing for it but to remember not +to use remote access to a killed object. (Note that the same problem +appears when remote access X.W is used and X=none). + + Example: + -------- + + Below a practical example of the programmed deallocation is +presented. Consider class Bst (p.7). Let us define a procedure that +deallocates the whole tree and is called with the termination of the +class Bst. + + unit Bst:class; + (* standard declarations list of Bst *) + unit kill_all:procedure(p:node); + (* procedure kill_all deallocates a tree with root p *) + begin + if p= none then return fi; + call kill_all(p.left); + call kill_all(p.right); + kill(p) + end kill_all; + begin + inner; + call kill_all(root) + end Bst; + + Bst may be applied as a prefix: + + pref Bst block + ... + end + +and automatically will cause the deallocation of the whole tree after +return to call kill_all(root) from the prefixed block. + + To use properly this structure by remote accessing one must call +kill_all by himself: + + unit var X,Y:Bst; + ... + begin + X:=new Bst; Y:=new Bst; + ... + (* after the structures' application *) + call X.kill_all(X.root); + kill(X); + call Y.kill_all(Y.root); + kill(Y); + ... + end + + Finally note that deallocator kill enables deallocation of array +objects, and suspended coroutines and processes as well (cf p.13). + + +11. Exception handling +####################### + + Exceptions are events that cause interruption of normal program +execution. One kind of exceptions are those which are raised as a +result of some run time errors. For instance, when an attempt is made +to access a killed object, when the result of numeric operation does +not lie within the range, when the dynamic storage allocated to a +program is exceeded etc. + Another kind of exceptions are those which are raised explicitly by +a user (with the execution of the raise statement). + The response to exceptions (one or more) is defined by an exception +handler. A handler may appear at the end of declarations of any unit. +The corresponding actions are defined as sequences of statements +preceded by keyword when and an exception identifier. + + Example: + -------- + + In procedure squareeq (p.3) we wish to include the case when a=0. It +may be treated as an exception (division by zero). + + unit squareeq(a,b,c:real;output xr,xi,yr,yi:real); + var delta:real; + handlers + when division_by_zero: + if b =/= 0 + then + xi,yr,yi:=0; xr:=-c/b; terminate + else + raise Wrong_data(" no roots") + fi; + end + begin + ... + end squareeq; + + The handler declared in that procedure handles the only one +exception (division_by_zero). + When an exception is raised, the corresponding handler is searched +for, starting from the active object and going through return traces. +If there is no object containing the declaration of the handler, then +the program (or the corresponding process) is terminated. Otherwise +the control is transferred to the first found handler. + + + + In our example the handler is declared within the unit itself, so +control is passed to a sequence: + + if b=/=0 + ... + + Therefore, when b=/=0, the unique root of square equation will be +determined and the procedure will be normally terminated (terminate). + In general, terminate causes that all the objects are terminated, +starting from that one where the exception was raised and ending on +that one where the handler was found. Then the computation is +continued in a normal way. + In our example, when b=0, a new exception is raised by the user. For +this kind of exceptions , the exception itself should be declared +(because it is not predefined as a run time error). Its declaration +may have parameters which are transmitted to a handler. The exception +declaration need not be visible by the exception handler. However the +way the handler is searched for does not differ from the standard one. + Consider an example: + + block + signal Wrong_data(t:string); + unit squareeq: + ... + end squareeq; + ... + begin + ... + end + + Exception Wrong_data may be raised wherever its declaration (signal +Wrong_data) is visible. When its handler is found the specified +sequence of actions is performed. In the example above different +handlers may be defined in inner units to the main block where +squereeq is called. + The case a=0 could be included , of course, in a normal way, i.e. by +a corresponding conditional statement occurring in the procedure body. +But the case a=0 was assumed to be exceptional (happens scarcely). +Thus the evaluation of condition a=0 would be mostly unnecessary. As +can be noticed thanks to exceptions the above problem can be solved +with the minimal waste of run time. + + + +12. Separate compilation (this section does not apply to PC version) +######################## + + + +13. Processes +############# + + The implementation of processes is different (May 1988) c.f. user's manual. + + Process in LOGLAN-82 is a natural generalization of coroutine (cf +p.6). Coroutines are units which once generated may operate +independently, each one treated as a separate process. For coroutines, +however, an essential assumption is established; namely, when one +coroutine object is reactivated, the active one must be suspended +(i.e. there which is onle one control is switched between coroutine +objects). When processes are used, the activation of a new process +does not require the active one to be suspended. So many objects may +be simultaneously active. + The statement that reactivates a suspended process X (without +suspention of the active one) has the form: + + resume(X) + + The main problem of parallel programming is, of course, +synchronization. Elementary synchronization in LOGLAN-82 is achieved +by two-valued semaphores and some number of simple statements +operating on them. + A semaphore variable controls the entry to a critical region, i.e. a +sequence of statements that may be executed by the one process only. +When a semaphore is open, the corresponding critical region is free. +When a semaphore is closed, it means the corresponding critical region +is just executed by a certain process. + + These are the simple indivisible statements that operate on +semaphores: + + lock(S) - If semaphore S is open, the given process enters + the critical region guarded by S , and + simultaneously, semaphore S becomes closed. If + semaphore S is already closed, the given process + waits until the critical region is open (by another + process). + unlock(S)- If semaphore S is closed, then it becomes open. + Otherwise the statement is empty. + stop(S) - The statement causes semaphore S to be open, and + simultaneously, it stops the given process + execution. The statement may be used without a + parameter, and then, it stops the given process + execution. + Moreover, only those three above statements may change the values of +semaphore variables. + In general, several processes may wait for an entry to the same +critical region. When the process executing this critical region opens +the semaphore (by unlock or stop), one of the waiting processes is +reactivated and enters the region. The way such a process is selected +is not defined by the language. The user must assume that this +selection is performed arbitrarily. + + + + Example: + -------- + + In the example an input stream of real numbers is copied. The +copying process is parallelized in such a way that when process get +reads the next number, the process put writes simultaneously the +number read in the preceding step. The input stream ends with 0. + + block + var in_buf,out_buf:real, completed:boolean, sem:semaphore; + var counter:integer,get:get_type,put:put_type; + unit cobegin:procedure; (* called by the main program *) + begin + lock(sem); (* critical region *) + resume(get); (* activate reading *) + resume(put); (* activate writing *) + stop(sem); (* exit from critical region *) + end cobegin; + unit coend: procedure; + begin (* called by get and put *) + lock(sem); (* entry to critical region *) + if counter=0 + then (* one process entered *) + counter:=1 + else (* two processes entered *) + counter:=0; + resume(main) (* reactivate main program *) + fi; + stop(sem) (* exit from critical region *) + end coend; + + unit get_type:process; + begin + return; + do + read(in_buf); + if in_buf=0 + then (* end of data *) + completed:=true + fi; + call coend + od + end get_type; + + unit put_type:process; + begin + return; + do + write(out_buf); + call coend; + od + end put_type; + + begin (* main process *) + read(in_buf); + get:=new get_type; + put:=new put_type; + do + out_buf:=in_buf; + call cobegin; + if completed then exit fi; + od; + kill(get); + kill(put); + end; + + Two procedures cobegin and coend synchronize the execution of the +main loop. Procedure cobegin implements fork operator, procedure coend +called from processes put and get implements the end of fork operator. +Variable count defines the number of processes that called procedure +coend. By an easy modification one can generalize these procedures in +order to implement the general k-fork and end of k-fork operators (if +count can assume the values 0,1,...,k-1). + + Finally, let us present an example of a class that realizes Hoare's +monitors (cf. [2]). Monitor is a structure that synchronizes the +access to a common pool of data. The number and kinds of these data +are defined by the user. Monitor task is only to give non-conflict +access to it. The access to a monitor is realized by the so-called +entry procedures. Entry procedure has a prefix entry which guarantees +that only one such a procedure may enter the monitor. + In order to allow scheduling of processes that entered the monitor, +two specialized procedures operating on the inner monitor queues are +provided. + + delay(Q) - stops the execution of the process and puts it + into a queue Q, the entry to the monitor is free, + continue(Q) - resumes the execution of the first process from a + queue Q (if Q is non-empty, otherwise the entry to + the monitor is free). + + As can be easily seen, the correct use of these constructs is +achieved when continue is called as the last statement of an entry +procedure. + + The declaration of the class Monitor is as follows: + + +unit Monitor : queue class; + hidden sem,queue; (* hidden protects attributes sem and queue *) + var sem:semaphore; (* sem is the semaphore guarding the monitor entry *) + + unit entry: class; (* all entry procedures must have prefix entry + which realized non-conflict access to Monitor *) + var busy:boolean; (* busy is true iff continue(Q) was executed + hidden busy; + unit delay: procedure(Q:queue); + begin + call Q.into(this process); + (* put the active process into queue Q *) + stop(sem) + (* free the monitor access, halt the active process *) + end delay; + unit continue:procedure(Q:queue); + (* continue can be called as the last statement of an entry procedure *) + begin + if not Q.empty + then + busy:=true + resume(Q.out); (* resume the next process from queue Q *) + fi; + end continue; + begin (* beginning of the prefix entry *) + lock(sem); (* entry to the critical region *) + inner; (* the virtual body of an entry procedure *) + if not busy + then + unlock(sem) (* free the monitor access, unless continue + fi; + end entry; +end Monitor; + + + The mail-box structure which receives and sends the items of type T +may be implemented as the following class prefixed by Monitor: + + unit Buffering:Monitor class(type T;size:integer); + var Pool:arrayof T,count,in_index,out_index:integer; + var readers_queue,writers_queue:queue; + unit writer:entry procedure(r:T); + begin + if count=size then call delay(writers_queue) fi; in_index + Pool(in_index):=r; call continue(readers_queue); + end writer; + unit reader:entry procedure(output r:T); + begin + if count=0 then call delay(readers_queue) fi; + out_index:=out_index mod size +1; count:=count-1; + r:=Pool(out_index); call continue(writers_queue); + end reader; + begin + new_array Pool dim (1:size); + readers_queue:=new queue; writers_queue:=new queue; + end Buffering; + + +References. +########### + + [1] Dahl O-J.,Myhrhaug B,Nygaard K.: Common Base Language . NCC +S-22, October 1970 + [2] Hoare C.A.R.: Monitors, an operating system structuring concept. +CACM,vol.17,N.10,October 1974,pp.549-57 + [3] LOGLAN-82 Report , Warsaw, 1982 + \ No newline at end of file diff --git a/doc/loglanmi.doc b/doc/loglanmi.doc new file mode 100644 index 0000000000000000000000000000000000000000..8c605e0491f6bff05a0372328f8e517ba50ab326 GIT binary patch literal 89346 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 y0 \line {\b then} \line x2:=sqrt(delta)/a/2;\line {\b if} b=0 \line {\b then} \line + x1:=x2\line {\b else} \line x1:=-b/a/2+x2; x2:=x1-2*x2\line {\b fi} \line {\b else} \line {\b if} delta=0 \line {\b then} \line x1:=-b/a/2; x2:=x1\line {\b else} \line write(" no real roots")\line {\b fi} + \line {\b fi} +\par \pard\plain \s4\qj \f5\lang1033 The statements in a sequence of statements are separated with semicolons (semicolon may end a sequence , and then, the last statement in the sequence is the empty statement). +\par The short circuit control forms are realized in LOGLAN-82 by the conditional statements with orif (or andif) list. A conditional statement with orif list has the form: orif +\par \pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 {\b if} wb1 {\b orif} wb2 ... {\b orif} wbk \line {\b then} \line sequence of statements\line {\b else}\line + sequence of statements\line {\b fi} +\par \pard\plain \fs20\lang1036 {\plain \f5\lang1036 and corresponds somehow to a conditi}{\plain \f5\lang1036 onal statement: +\par }\pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 {\b if} wb1 {\b or} wb2 ... {\b or} wbk \line {\b then} \line sequence of statements\line {\b else} \line + sequence of statements\line {\b fi} +\par \pard\plain \s4\qj \f5\lang1033 The above conditional statement (without orif list) selects for execution one of two sequences of statements, depending on the truth value of the boolean expression: +\par \pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 wb1 {\b or} wb2 {\b or} ... wbk +\par \pard\plain \s4\qj \f5\lang1033 which is always evaluated till the end. For the execution of the conditional statement with orif list the specified conditons wb1,...,wbk are evaluated in succession, until the fir +st one evaluates to true. Then the rest of the sequence wb1,...,wbk is abandoned and "then part" is executed. If none of the conditions wb1,...,wbk evaluates to true "else part" is executed (if any). +\par \pard \s4\qj Conditional statements with orif list facilitate to program those con_ditions, which evaluation to the end may raise a run-time error. +\par \pard\plain \fs20\lang1036 {\plain \f5\lang1036 Example: +\par }{\plain \f5\lang1036 The execution of the statement: +\par }\pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 {\b if} i>n {\b or} A(i)=0 {\b then} i:=i-1 {\b else} A(i):=1 {\b fi} +\par \pard\plain \s4\qj \f5\lang1033 where the value of i is greater than n, and A is an array with upper bound n, will raise the run-time error. Then the user can write: +\par \pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 {\b if} i>n {\b orif} A(i)=0 {\b then} i:=i-1 {\b else} A(i):=1 {\b fi} +\par \pard\plain \s4\qj \f5\lang1033 what allows to avoid this run-time error and probably agrees with his intension. +\par \pard\plain \fs20\lang1036 {\plain \f5\lang1036 Conditional statement with andif list has the form: +\par }\pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 {\b if} wb1 {\b andif} wb2 ... {\b andif} wbk\line {\b then} \line sequence of statements\line {\b else} \line + sequence of statements\line {\b fi} +\par \pard\plain \s4\qj \f5\lang1033 For the execution of this kind of statements, the conditions wb1,...,wbk are evaluated in succession, until the first one evaluates to false; then "else part" (if any) is executed. Otherwise "then part" is executed. +\par \pard\plain \fs20\lang1036 {\plain \f5\lang1036 Iteration statement in LOGLAN-82 has the form: +\par }\pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 {\b do} sequence of statements {\b od} +\par \pard\plain \s4\qj \f5\lang1033 An iteration statement specifies repeated execution of the sequence of statements and terminates with the execution of the simple statement exit +\par \pard\plain \fs20\lang1036 {\plain \f5\lang1036 \line Example: +\par }\pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 s:=1; t:=1; i:=1;\line {\b do} \line i:=i+1; t:=t*x/i;\line {\b if} abs(t) < 1.0E-10 {\b then exit fi}; \line + s:=s+t\line {\b od}; +\par \pard\plain \s4\qj \f5\lang1033 If two iteration statements are nested, then double exit in the inner one terminates both of them. +\par \pard\plain \fs20\lang1036 {\plain \f5\lang1036 Example: +\par }\pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 r,x:=0;\line {\b do} \line s,t:=1; i:=1; x:=x+0.2;\line {\b do} \line i:=i+1; t:=t*x/i;\line {\b if} i > n {\b +then exit exit fi}; (* termination of both loops *) \line {\b if} t < 1 {\b then exit fi}; (* termination of the inner loop *)\line s:=s+t\line {\b od \line od} +\par \pard\plain \s4\qj \f5\lang1033 In the example above simultaneous assignment statements are illustrated (e.g. r,x:=0) and comments, which begin with a left parenthesis immedi\-ately followed by an asterisk and end with an asterisk immediately fol\- +lowed by a right parenthesis. +\par \pard \s4\qj Triple exit terminates three nested iteration statements, four exit termi\-nates four nested iteration statements etc. +\par \pard\plain \fs20\lang1036 {\plain \f5\lang1036 The iteration statement with while condition: while +\par }\pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 {\b while} boolean expression \line {\b do} \line sequence of statements\line {\b od} +\par \pard\plain \fs20\lang1036 {\plain \f5\lang1036 is equivalent to: +\par }\pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 {\b do} \line {\b if not} boolean expression {\b then exit fi}; \line sequence of statements\line {\b od} + +\par \pard\plain \s4\qj \f5\lang1033 The iteration statements with controlled variables (for statements) have the forms: +\par \pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 {\b for} j:=wa1 {\b step} wa2 {\b to} wa3 \line {\b do} \line sequence of statements\line {\b od } +\par \pard\plain \fs20\lang1036 {\plain \f5\lang1036 or +\par }\pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 {\b for} j:=wa1 {\b step} wa2 {\b downto} wa3 \line {\b do} \line sequence of statements\line {\b od} +\par \pard\plain \s4\qj \f5\lang1033 The type of the controlled variable j must be discrete. The value of this variable in the case of the for statement with to is increased, and in the case of the for statement with downto is decreased. The + discrete range begins with the value of wa1 and changes with the step equal to the value of wa2. The execution of the for statement with to terminates when the value of j for the first time becomes g +reater than the value of wa3 (with downto when the value of j for the first time becomes less than the value of wa3). After the for statement termination the value of its controlled vari\-able is determined and equal to the first value exceeding the spec +ified dis\-crete range. The values of expressions wa1, wa2 and wa3 are evaluated once, upon entry to the iteration statement. Default value of wa2 is equal 1 (when the keyword step and expression wa2 are omitted). +\par \pard \s4\qj For or while statements may be combined with exit statement. +\par \pard\plain \fs20\lang1036 {\plain \f5\lang1036 \line Example: +\par }\pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 {\b for} j:=1 {\b to} n\line {\b do} \line {\b if} x=A(j) {\b then exit fi}; \line {\b od} +\par \pard\plain \s4\qj \f5\lang1033 The above iteration statement terminates either for the least j, 1<=j<=n, such that x=A(j) or for j=n+1 when x=/=A(j), j=1,...,n. +\par \pard \s4\qj + To enhance the user's comfort, the simple statement repeat is provided. It may appear in an iteration statement and causes the current iteration to be finished and the next one to be continued (something like jump to CONTINUE in Fortran's DO statements). + +\par \pard\plain \fs20\lang1036 {\plain \f5\lang1036 Example: +\par }\pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 i:=0; s:=0;\line {\b do} \line i:=i+1;\line {\b if} A(i)<0 {\b then repeat fi} +; (* jump to od,iterations are contd.*)\line {\b if} i > m {\b then exit fi}; (* iteration statement is terminated*) \line s:=s+sqrt(A(i));\line {\b od}; +\par \pard\plain \s4\qj \f5\lang1033 Just as exit, repeat may appear in for statement or while statement. Then the next iteration begins with either the evaluation of a new value of the controlled variable (for statement) or with the + evaluation of the condition (while statement). +\par \pard \s4\qj Case statement in LOGLAN-82 has the form: +\par \pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 {\b case} WA \line {\b when} L1 : I1 \line {\b when} L2 : I2 \line {\b .}..\line {\b when} Lk : Ik + \line {\b otherwise} I \line {\b esac} +\par \pard\plain \s4\qj \f5\lang1033 where WA is an expression , L1,...,Lk are constants and I1,..., Ik,I are se\-quences of statements. +\par \pard \s4\qj A case statement selects for execution a sequence of statements Ij, 1{\field{\*\fldinst SYMBOL 163 \\f "Symbol"}{\fldrslt }}j{\field{\*\fldinst SYMBOL 163 \\f "Symbol"}{\fldrslt }} +k, where the value of WA equals Lj. The choice otherwise covers all values (possibly none) not given in the previous choices. The execution of a case statement chooses one and only one al +ternative (since the choices are to be exhaustive and mutually exclusive). +\par \pard\plain \s254\sb840\sa480\keepn \b\f5\fs28\lang1036 2. Modularity +\par \pard\plain \s4\qj \f5\lang1033 + Modular structure of the language is gained due to the large set of means for module nesting and extending. Program modules (units) are blocks, procedures, functions, classes, coroutines and processes. Block is the simplest kind of unit. Its syntax is th +e following: +\par \pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 {\b block} \line lists of declarations\line {\b begin} \line sequence of statements\line {\b end} +\par \pard\plain \s4\qj \f5\lang1033 The sequence of statements commences with the keyword begin (it may + be omitted when this sequence is empty). The lists of declarations define the syntactic entities (variables, constants, other units), whose scope is that block. The syntactic entities are identified in the sequence of state\-ments by means of names +(identifiers). +\par \pard\plain \fs20\lang1036 {\plain \f5\lang1036 \line Example: +\par }\pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 {\b block} \line {\b const} n=250; \line {\b var} x,y:real, i,j,k: integer, b: boolean; \line {\b const} + m=n+1; \line {\b begin} \line read(i,j); (* read two integers *)\line x,y:=n/(i+j); (* simultaneous assignment *)\line read(c) ; (* read a character *)\line b:= c = 'a'; (* 'a' a character *) +\line {\b for} k:= 1 {\b to} m \line {\b do}\line write(x+y/k:10:4); (* print the value of x+y/k in the\line field of 10 characters, 4 digits after the point *)\line {\b od\line end } +\par \pard\plain \s4\qj \f5\lang1033 In the lists of declarations semicolons terminate the whole lists, not the lists elements. Any declaration list must begin with the pertinent keyword (var for variables, const for constants etc.). The + value of an expression de\-fining a constant must be determinable statically (at compilation time). +\par \pard \s4\qj Program in LOGLAN-82 may be a block or alternatively may be of the following form: +\par \pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 {\b program} name; \line lists of declarations\line {\b begin} \line sequence of statements\line {\b end} + +\par \pard\plain \s4\qj \f5\lang1033 Then the whole program can be identified by that name (the source as well as the object code). +\par \pard \s4\qj A block can appear in the sequence of statements (of any unit), thus it is a statement. (Main block is assumed to appear as a statement of the given job control language.) +\par \pard \s4\qj + For the execution of a block statement the object of block is created in a computer memory, and then, the sequence of statements is performed. The syntactic entities declared in the block are allocated in its object. After a block's termination its objec +t is automatically deallocated (and the corre\-sponding space may be immediately reused). +\par \pard \s4\qj The modular structure of the language works "in full steam" when not only blocks, but the other kinds of units are also used. They will be de\-scribed closer in the following points. +\par \pard \s4\qj Unit nesting allows to build up hierarchies of units and supports security of programming. It follows from the general visibility rules; namely, a syn\- +tactic entity declared in an outer unit is visible in an inner one (unless hidden by an inner declaration). On the other hand, a syntactic entity de\-clared in an inner unit is not visible from an outer one.\line +\par \pard\plain \fs20\lang1036 {\plain \f5\lang1036 Example: +\par }\pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 {\b program} test; \line {\b var} a,b,c:real, i,j,k:integer; \line {\b begin} \line read(a,b,c,i);\line {\b +block} \line {\b var} j,k:real; \line {\b begin} \line j:=a; k:=j+b; write(" this is the inner block ",j,k)\line {\b end}; \line write(" this is the outer block ",i,a:20)\line {\b end}; +\par \pard\plain \s4\qj \f5\lang1033 + In this program, first the main block statement is executed (with variables a,b,c,i,j,k). Next, after the read statement, the inner block statement is executed (with variables j,k). In the inner block the global variables j,k are hidden by the local ones +. +\par \pard\plain \s254\sb840\sa480\keepn \b\f5\fs28\lang1036 3. Procedures and functions +\par \pard\plain \s4\qj \f5\lang1033 Procedures and functions are well-known kinds of units. Their syntax is mo\-del\-led on Pascal's, though with some slight modifications. Procedure (function) declaration consists of a specification part and a body.\tab +\line +\par \pard\plain \fs20\lang1036 {\plain \f5\lang1036 Example: +\par }\pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 {\b unit} Euclid: {\b function}(i,j:integer):integer; \line {\b var} k:integer;\line {\b begin} \line {\b +do} \line {\b if} j=0 {\b then exit fi}; \line k:=i {\b mod} j; i:=j; j:=k \line {\b od}; \line result:=i\line {\b end}; +\par \pard\plain \s4\qj \f5\lang1033 Procedure or function specification begins with its identifier preceded by the keyword unit. (The same syntax concerns any other mod\-ul +e named unit.) Then follows its kind declaration, its formal parameters (if any), and the type of the returned value (only for functions). A body con\-sists of decla\-ration lists for local entities and a sequence of statements. The keyword {\b begin} + commences the sequence of statements, and is omit\-ted, if this se\-quence is empty. The value returned by a function equals to the most re\- +cent value of the standard variable "result", implicitly declared in any function. This variable can be used as a local auxiliary variable as well. +\par \pard\plain \fs20\lang1036 {\plain \f5\lang1036 \line Example: +\par }\pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 {\b unit} Newton: {\b function}(n,m:integer):integer; \line \tab \tab {\b var} i:integer; \line {\b begin} +\line {\b if} m > n {\b then return fi}; \line result:=n;\line {\b for} i:=2 {\b to} m {\b do} result:=result*(n-i+1) {\b div} i {\b od} \line {\b end} Newton; +\par \pard\plain \s4\qj \f5\lang1033 + The optional identifier at the end of a unit must repeat the identifier of a unit. It is suggested that the compilers check the order of unit nesting, so these optional occurrences of identifiers would facilitate program debug\-ging. +\par \pard \s4\qj All the local variables of a unit are initialized (real with 0.0, integer with 0, boolean with false etc.). Thus , for instance, the value of function Newton is 0 for m>n, since "result" is also initialized, as any other local variable. + +\par \pard \s4\qj The return statement (return) completes the execution of a procedure (function) body,i.e. return is made to the caller. If return does not appear explicitly, return is made with the execution of the final end + of a unit. Upon return to the caller the procedure (function) object is deallocated. +\par \pard \s4\qj Functions are invoked in expressions with the corresponding list of actual parameters. Procedures are invoked by call statement (also with the corre\-sponding list of actual parameters). +\par \pard\plain \fs20\lang1036 {\plain \f5\lang1036 \line Example: +\par }\pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 i:=i*Euclid(k,105)-Newton(n,m+1);\line {\b call} P(x,y+3); +\par \pard\plain \s4\qj \f5\lang1033 Formal parameters are of four categories: variable parameters, procedure parameters, function parameters and type parameters (cf p.8). Variable pa\- +rameters are considered local variables to the unit. A variable parameter has one of three transmission modes: input, output or inout. If no mode is explicitly given the input mode is assumed. For instance in the unit decla\-ration: +\par \pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 {\b unit} P: {\b procedure}(x,y:real,b:boolean;\line {\b output} c:char,i:integer;{\b inout} :integer); +\par \pard\plain \s4\qj \f5\lang1033 x,y,b are input parameters , c,i are output parameters , and j is inout pa\-rameter. +\par \pard \s4\qj Input parameter acts as a local variable whose value is initialized by the value of the corresponding actual parameter. Output parameter acts as a local variable initialized in the standard manner ( +real with 0.0, integer with 0, boolean with false etc.). Upon return its value is assigned to the corre\- +sponding actual parameter, in which case it must be a variable. However the address of such an actual parameter is determined upon entry to the body. Inout parameter acts as an input parameter and output parameter together. +\par \pard\plain \fs20\lang1036 {\plain \f5\lang1036 \line Example: +\par }\pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 {\b unit} squareeq: {\b procedure}(a,b,c:real;{\b output} xr,xi,yr,yi:real); \line + (* given a,b,c the procedure solves square equation :\line ax*x+bx+c=0.\line xr,xi- real and imaginary part of the first root\line yr,yi- real and imaginary part of the second root *)\line {\b var} delta: real; \line {\b begin +} (*a=/=0*) \line a:=2*a; c:=2*c; delta:=b*b-a*c;\line {\b if} delta <= 0 \line {\b then} \line xr,yr:=-b/a;\line {\b if} delta=0 {\b then return fi}; (*xi=yi=0 by default*) \line delta:=sqrt(-delta);\line + xi:=delta/a; yi:=-xi;\line {\b return \line fi}; \line delta:=sqrt(delta);\line {\b if} b=0 \line {\b then} \line xr:=delta/a; yr:=-xr;\line {\b return \line fi}; \line {\b if} b>0 {\b +then} b:=b+delta {\b else} b:=b-delta {\b fi};\line xr:=-b/a; yr:=-c/b;\line {\b end} squareeq; +\par \pard\plain \fs20\lang1036 {\plain \f5\lang1036 A procedure call to the above unit may be the following: +\par }\pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 {\b call} squareeq(3.75*H,b+7,3.14,g,gi,h,hi); +\par \pard\plain \s4\qj \f5\lang1033 where g,h,gi,hi are real variables. +\par \pard \s4\qj No restriction is imposed on the order of declarations. In particular, re\-cursive procedures and functions can be declared without additional an\-nouncements (in contrast to Pascal). +\par \pard \s4\qj Example: +\par For two recursive sequences defined as: +\par \tab a(n)=b(n-1)+n+2 n>0 +\par \pard\plain \li567 \fs20\lang1036 {\plain \f5\lang1036 b(n)=a(n-1)+(n-1)*n }{\plain \f5\lang1036 n>0 +\par }{\plain \f5\lang1036 a(0)=b(0)=0 +\par }\pard {\plain \f5\lang1036 one can declare two functions: +\par }\pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 {\b unit} a: {\b function}(n:integer):integer;\line {\b begin} \line {\b if} n>0 {\b then} result:=b(n-1)+n+2 {\b fi} +\line {\b end} a; \line {\b unit} b: {\b function}(n:integer):integer; \line {\b begin} \line {\b if} n>0 {\b then} result:=a(n-1)+(n-1)*n {\b fi} \line {\b end} b; +\par \pard\plain \fs20\lang1036 {\plain \f5\lang1036 and invoke them: +\par }\pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 k:=a(100)*b(50)+a(15); +\par \pard\plain \fs20\lang1036 {\plain \f5\lang1036 Functions and procedures can be formal parameters as well. +\par }\pard {\plain \f5\lang1036 \line Example: +\par }\pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 {\b unit} Bisec: {\b procedure}(a,b,eps:real;{\b output} x:real;{\b function} \tab \tab \tab \tab \tab \tab \tab \tab \tab \tab +\tab \tab \tab f(x:real):real);\line (*this procedures searches for zero of the continous function f in \tab \tab \tab \tab \tab \tab \tab \tab \tab \tab \tab \tab the segment (a,b) *)\line {\b var} h:real,s:integer;\line {\b begin}\line s:=sign(f(a)); +\line {\b if} sign(f(b))=s {\b then return fi}; (* wrong segment *) \line h:=b-a;\line {\b do} \line h:=h/2; x:=a+h;\line {\b if} h < eps {\b then return fi};\line {\b if} sign(f(x))=s {\b then} a:=x {\b else} b:=x {\b fi}\line { +\b od} \line {\b end} Bisec; +\par \pard\plain \s4\qj \f5\lang1033 In the above declaration, after the input variable parameters a,b,eps and the output variable parameter x, a function parameter f appears. Note that its specification part is complete. Thus the check of actual-formal parame +\-ter compatibility is possible at compilation time. Making use of this syn\-tactic facility is not possible in general, if a formal procedure (function) is again a formal parameter of a formal procedure (function). The second de\-gree of formal + procedures (functions) nesting is rather scarce, but LOGLAN-82 admits such a construct. Then formal procedure (function) has no specification part and the full check of actual-formal parameter compatibility is left to be done at run time. +\par \pard\plain \fs20\lang1036 {\plain \f5\lang1036 \line Example:}{\plain \f5\lang1036 +\par }\pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 {\b unit} P: {\b procedure}(j:integer; {\b procedure} G (i:integer;\line {\b +procedure} H));\line ...\line {\b begin} \line ...\line {\b call} G(j,P);\line {\b end} P; +\par \pard\plain \s4\qj \f5\lang1033 + Procedure G is a first degree parameter, therefore it occurs with complete specification part. Procedure H is a second degree parameter and has no specification part. In this case a procedure call can be strongly recursive: +\par \pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 {\b call} P(i+10,P); +\par \pard\plain \s254\sb840\sa480\keepn \b\f5\fs28\lang1036 4. Classes +\par \pard\plain \s4\qj \f5\lang1033 Class is a facility which covers such programming constructs as struc\-tu\-red type, package, access type, data structure etc. To begin with the pre\-s\- +entation of this construct, let us consider a structured type assembled from primitive ones: +\par \pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 {\b unit} bill: {\b class};\line {\b var} dollars :real, \line not_paid :boolean,\line + year,month,day :integer;\line {\b end} bill; +\par \pard\plain \qj \fs20\lang1036 {\plain \f5\lang1036 The above class declaration has the attributes : dollars (real), not_paid (boolean), and year,month,day (integer). Wherever class bill is visibile one can declare variables of type bill: +\par }\pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 {\b var} x,y,z: bill; +\par \pard\plain \qj \fs20\lang1036 {\plain \f5\lang1036 + The values of variables x, y, z can be the addresses of objects of class bill. These variables are called reference variables. With reference variable one can create and operate the objects of reference variable type. +\par }\pard \qj {\plain \f5\lang1036 An object of a class is created by the class generation statement (new), and thereafter, its attributes are accessed through dot notation. +\par }\pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 x:={\b new} bill; (* a new object of class bill is created *)\line x.dollars:=500.5; (* define amount *)\line + x.year:=1982; (* define year *)\line x.month:=3; (* define month *)\line x.day:=8; (* define day *)\line y:={\b new} bill; (* create a new object *) \line y.not_paid:=true; (* bill not_paid *)\line + z:=y; (* variable z points the same object as y *) +\par \pard\plain \qj \fs20\lang1036 {\plain \f5\lang1036 If an object of class bill has been created (new bill) and its address has been assigned to variable x (x:=new bill), then the + attributes of that object are accessible through dot notation (remote access). The expression x.dollars gives , for instance,}{\plain \f5\lang1036 }{\plain \f5\lang1036 +the remote access to attribute dollars of the object referenced by x. All attributes of class objects are initialized as usual. For the above example the object referenced by x, after the execu\- +tion of the specified sequence of statements, has the followi}{\plain \f5\lang1036 ng structure: +\par }\pard \keep {\plain \f7\lang1036 \line }{\plain \f6\lang1036 \'da\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'bf}{\plain \f7\lang1036 \line }{\plain \f6\lang1036 \'b3}{\plain \f7\lang1036 500.5 }{\plain \f6\lang1036 \'b3} +{\plain \f7\lang1036 dollars\line }{\plain \f6\lang1036 \'c3\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'b4}{\plain \f7\lang1036 \line }{\plain \f6\lang1036 \'b3}{\plain \f7\lang1036 false }{\plain \f6\lang1036 \'b3} +{\plain \f7\lang1036 not_paid\line }{\plain \f6\lang1036 \'c3\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'b4}{\plain \f7\lang1036 \line }{\plain \f6\lang1036 \'b3}{\plain \f7\lang1036 1982 }{\plain \f6\lang1036 \'b3} +{\plain \f7\lang1036 year\line }{\plain \f6\lang1036 \'c3\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'b4}{\plain \f7\lang1036 \line }{\plain \f6\lang1036 \'b3}{\plain \f7\lang1036 3 }{\plain \f6\lang1036 \'b3}{\plain +\f7\lang1036 month\line }{\plain \f6\lang1036 \'c3\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4}{\plain \f6\lang1036 \'b4}{\plain \f7\lang1036 \line }{\plain \f6\lang1036 \'b3}{\plain \f7\lang1036 8 }{\plain +\f6\lang1036 \'b3}{\plain \f7\lang1036 day\line }{\plain \f6\lang1036 \'c0\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'d9}{\plain \f7\lang1036 +\par }\pard {\plain \f5\lang1036 \line The object referenced by y and z has the following structure: +\par }\pard \keep {\plain \f6\lang1036 \line \'da\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'bf\line }{\plain \f7\lang1036 }{\plain \f6\lang1036 \'b3}{\plain \f7\lang1036 0 }{\plain \f6\lang1036 \'b3}{\plain \f7\lang1036 + dollars}{\plain \f6\lang1036 \line }{\plain \f7\lang1036 }{\plain \f6\lang1036 \'c3\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'b4\line }{\plain \f7\lang1036 }{\plain \f6\lang1036 \'b3}{\plain \f7\lang1036 true }{\plain +\f6\lang1036 \'b3}{\plain \f7\lang1036 not_paid}{\plain \f6\lang1036 \line }{\plain \f7\lang1036 }{\plain \f6\lang1036 \'c3\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'b4\line }{\plain \f7\lang1036 }{\plain \f6\lang1036 \'b3} +{\plain \f7\lang1036 0 }{\plain \f6\lang1036 \'b3}{\plain \f7\lang1036 year}{\plain \f6\lang1036 \line }{\plain \f7\lang1036 }{\plain \f6\lang1036 \'c3\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'b4\line }{\plain +\f7\lang1036 }{\plain \f6\lang1036 \'b3}{\plain \f7\lang1036 0 }{\plain \f6\lang1036 \'b3}{\plain \f7\lang1036 month}{\plain \f6\lang1036 \line }{\plain \f7\lang1036 }{\plain \f6\lang1036 \'c3\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4 +\'c4\'c4\'c4\'c4\'c4\'b4\line }{\plain \f7\lang1036 }{\plain \f6\lang1036 \'b3}{\plain \f7\lang1036 0 }{\plain \f6\lang1036 \'b3}{\plain \f7\lang1036 day}{\plain \f6\lang1036 \line }{\plain \f7\lang1036 }{\plain \f6\lang1036 +\'c0\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'d9 +\par }\pard \qj {\plain \f5\lang1036 The value none is the default initial value of any reference variable and denotes no objec}{\plain \f5\lang1036 t. A remote access to an attribute of none raises a run time error. +\par }{\plain \f5\lang1036 Class may have also formal parameters (as procedures and functions). Kinds and transmission modes of formal parameters are the same as in the case of procedures. +\par }\pard {\plain \f5\lang1036 \line +\par }\pard {\plain \f5\lang1036 +\par }{\plain \f5\lang1036 Example: +\par }\pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 {\b unit} node: {\b class} (a:integer);\line var left,right:node; \line {\b end} node; +\par \pard\plain \qj \fs20\lang1036 {\plain \f5\lang1036 Let, for instance, variables z1, z2, z3 be of type node. Then the sequence of statements: +\par }\pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 z1:={\b new} node(5);\line z2:={\b new} node(3); \line z3:={\b new} node(7); \line z1.left:=z2 +; z1.right:=z3; +\par \pard\plain \sa120 \fs20\lang1036 {\plain \f5\lang1036 creates the structure: +\par }\pard \keep\box\brdrs\brdrw15\brsp20 \dxfrtext180 {\plain \f6\lang1036 \line \'da\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'bf\line }{\plain \f7\lang1036 z1}{\plain \f6\lang1036 \'c4\'c4\'c4\'c4\'c4\'c4\'b4}{\plain \f7\lang1036 + 5 }{\plain \f6\lang1036 \'b3\line \'c3\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'b4\line \'da\'c4\'c4\'c4\'c4\'c4\'c4\'b4}{\plain \f7\lang1036 left }{\plain \f6\lang1036 \'b3\line \'b3 \'c3\'c4\'c4\'c4 +\'c4\'c4\'c4\'c4\'c4\'c4\'b4\line \'b3 \'b3 }{\plain \f7\lang1036 right}{\plain \f6\lang1036 \'c3\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'bf\line \'b3 \'c0\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'d9 \'b3\line +\'b3 \'b3\line \'da\'c4\'c4\'c4\'c4\'c1\'c4\'c4\'c4\'c4\'c4\'bf \'da\'c4\'c4\'c4\'c4\'c4\'c1\'c4\'c4\'c4\'c4\'bf\line }{\plain \f7\lang1036 z2}{\plain \f6\lang1036 \'c4\'c4\'c4\'c4\'c4\'b4 }{\plain \f7\lang1036 + 3 }{\plain \f6\lang1036 \'b3 \'b3 }{\plain \f7\lang1036 7 }{\plain \f6\lang1036 \'c3\'c4\'c4\'c4\'c4\'c4\'c4}{\plain \f7\lang1036 z3\line }{\plain \f6\lang1036 \'c3\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'b4 +\'c3\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'b4\line \'b3 }{\plain \f7\lang1036 none }{\plain \f6\lang1036 \'b3 \'b3 }{\plain \f7\lang1036 none }{\plain \f6\lang1036 \'b3 \line }{\plain \f6\lang1036 \'c3\'c4\'c4\'c4\'c4 +\'c4\'c4\'c4\'c4\'c4\'c4\'b4 \'c3\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'b4\line \'b3 }{\plain \f7\lang1036 none }{\plain \f6\lang1036 \'b3 \'b3 }{\plain \f7\lang1036 none }{\plain \f6\lang1036 \'b3 \line +\'c0\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'d9 \'c0\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'d9 +\par }\pard {\plain \f5\lang1036 \line where arrows denote the values of the reference variables. +\par }\pard \qj {\plain \f5\lang1036 Class may also have a sequence of statements (as any other unit). That sequence can initialize the attributes of the class objects. +\par }\pard {\plain \f5\lang1036 \line Example: +\par }\pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 {\b unit} complex:{\b class}(re,im:real); \line {\b var} module:real; \line {\b begin} \line + module:=sqrt(re*re+im*im)\line {\b end} complex; +\par \pard\plain \fs20\lang1036 {\plain \f5\lang1036 Attribute module is evaluated for any object gen}{\plain \f5\lang1036 eration of class complex: +\par }\pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 z1:={\b new} complex(0,1); (* z1.module equals 1 *) \line z2:={\b new} complex(2,0); (* z2.module equals 2 *) +\par \pard\plain \qj \fs20\lang1036 {\plain \f5\lang1036 + For the execution of a class generator, first a class object is created, then the input parameters are transmitted , and finally, the sequence of statements (if any) is performed. Return is made with the execution of return statement or the final end of +}{\plain \f5\lang1036 a unit. Upon return the output parameters are transmitted. +\par }\pard \qj {\plain \f5\lang1036 Procedure object is automatically deallocated when return is ma}{\plain \f5\lang1036 +de to the caller. Class object is not deallocated , its address can be assigned to a reference variable, and its attributes can be thereafter accessed via this variable. +\par }{\plain \f5\lang1036 The classes presented so far had only variable attributes. In general, class attributes may be also other syntactic entities, such as constants, proce\-dures, functions, classes etc. Classes with procedure and function attribu\- +tes provide a good facility}{\plain \f5\lang1036 to define data structures. +\par }\pard {\plain \f5\lang1036 \line Example: +\par }\pard \qj {\plain \f5\lang1036 A push_down memory of integers may be impl}{\plain \f5\lang1036 emented in the following way: +\par }\pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 {\b unit} push_down :{\b class}; \line {\b unit} elem:{\b class}(value:integer,next:elem);\line + (* elem - stack element *)\line {\b end} elem; \line {\b var} top:elem; \line {\b unit} pop: {\b function} :integer; \line {\b begin} \line {\b if} top=/= {\b none} \line {\b then} \line + result:=top.value; top:=top.next\line {\b fi}; \line {\b end} pop; \line {\b unit} push:{\b procedure}(x:integer); (* x - pushed integer *)\line {\b begin} \line top:={\b new} elem(x,top);\line {\b end} push; + \line {\b end} push_down; +\par \pard\plain \qj \fs20\lang1036 {\plain \f5\lang1036 Assume that somewhere}{\plain \f5\lang1036 in a program reference variables of type push_down are declared (of course, in place where push_down is visibile): +\par }\pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 {\b var} s,t,z:push_down; +\par \pard\plain \fs20\lang1036 {\plain \f5\lang1036 Three different push_down memories may be now generated: +\par }\pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 s:={\b new} push_down(100); t:={\b new} push_down(911); z:={\b new} push_down(5); +\par \pard\plain \fs20\lang1036 {\plain \f5\lang1036 One can use these push_down memories as follows: +\par }\pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 {\b call} s.push(7); (* push 7 to s *) \line {\b call} t.push(1); (* push 1 to t *) \line + i:=z.pop; (* pop an element from z *) +\par \pard\plain \fs20\lang1036 {\plain \f5\lang1036 etc. +\par }\pard\plain \s254\sb840\sa480\keepn \b\f5\fs28\lang1036 5. Adjustable arrays +\par \pard\plain \qj \fs20\lang1036 {\plain \f5\lang1036 In LOGLAN-82 arrays}{\plain \f5\lang1036 + are adjustable at run time. They may be treated as objects of specified standard type with index instead of identifier selecting an attribute. An adjustable array should be declare somewhere among the lists of declarations and then may be generated in th +}{\plain \f5\lang1036 e sequence of state\-ments. +\par }\pard {\plain \f5\lang1036 \line Example: +\par }\pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 {\b block} \line {\b var} n,j:integer; \line {\b var} A:{\b arrayof} integer; (* here is the declaration of A *) \line { +\b begin \line } read(n);\line {\b array} A {\b dim} (1:n); (* here is the generation of A *) \line {\b for} i:=1 {\b to} n \line {\b do} \line read(A(i));\line {\b o}{\b d}; \line (* etc.*)\line {\b end} +\par \pard\plain \qj \fs20\lang1036 {\plain \f5\lang1036 A variable A is an array variable. Its value should be the reference to an integer array, i.e. a composite object consisting of integer components each one defined by an integer index. \tab \line +Array generation statement: +\par }\pard \qj {\plain \f5\lang1036 \tab array A dim (1:n); +\par }\pard \qj {\plain \f5\lang1036 allocates a one-dimensional integer array with the index bounds 1,n , and assigns its address to variable A. \tab \line The figure below illustrates this situation: +\par }\pard \keep\box\brdrs\brdrw15\brsp20 \dxfrtext180 {\plain \f6\lang1036 \line \'da\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'bf \'da\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'bf +\par }\pard \keep\box\brdrs\brdrw15\brsp20 \dxfrtext180 {\plain \f6\lang1036 \'b3 \'b3 \'b3 }{\plain \f7\lang1036 A(}{\plain \f7\lang1036 1) }{\plain \f6\lang1036 \'b3 +\par }\pard \keep\box\brdrs\brdrw15\brsp20 \dxfrtext180 {\plain \f6\lang1036 \'b3 \'b3 \'c3\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'b4 +\par }\pard \keep\box\brdrs\brdrw15\brsp20 \dxfrtext180 {\plain \f6\lang1036 \'b3 }{\plain \f7\lang1036 ... }{\plain \f6\lang1036 \'b3 \'b3 }{\plain \f7\lang1036 A(2)}{\plain \f6\lang1036 \'b3 +\par }\pard \keep\box\brdrs\brdrw15\brsp20 \dxfrtext180 {\plain \f6\lang1036 \'c3\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'b4 \'c3\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'b4 +\par }\pard \keep\box\brdrs\brdrw15\brsp20 \dxfrtext180 {\plain \f6\lang1036 \'b3 }{\plain \f7\lang1036 n }{\plain \f6\lang1036 \'b3 \'b3 \'b3 +\par }{\plain \f6\lang1036 \'c3\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'b4 \'b3 }{\plain \f7\lang1036 ... }{\plain \f6\lang1036 \'b3 +\par }{\plain \f6\lang1036 \'b3 }{\plain \f7\lang1036 j }{\plain \f6\lang1036 \'b3 \'b3 \'b3 +\par }\pard \keep\box\brdrs\brdrw15\brsp20 \dxfrtext180 {\plain \f6\lang1036 \'c3\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'b4 \'c3\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'b4 +\par }\pard \keep\box\brdrs\brdrw15\brsp20 \dxfrtext180 {\plain \f6\lang1036 \'b3 }{\plain \f7\lang1036 A}{\plain \f6\lang1036 \'c3\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'b4 }{\plain \f7\lang1036 A(n)}{\plain \f6\lang1036 +\'b3 +\par }\pard \keep\box\brdrs\brdrw15\brsp20 \dxfrtext180 {\plain \f6\lang1036 \'c0\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'d9 \'c0\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'d9 +\par }\pard \keep\box\brdrs\brdrw15\brsp20 \dxfrtext180 {\plain \f5\lang1036 }{\plain \f7\lang1036 Block object Array object +\par }\pard {\plain \f5\lang1036 \line A general case of array generation statement has}{\plain \f5\lang1036 the form:}{\plain \f7\lang1036 +\par }\pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 {\b array} A {\b dim} (lower:upper) +\par \pard\plain \qj \fs20\lang1036 {\plain \f5\lang1036 where lower and upper are arithmetic expressions which define the range of the array index. +\par }\pard {\plain \f5\lang1036 Example: +\par }{\plain \f5\lang1036 Two-dimensional array declaration : +\par }\pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 {\b var} A: {\b arrayof arrayof} integer; +\par \pard\plain \fs20\lang1036 {\plain \f5\lang1036 and generation: +\par }\pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 {\b array} A {\b dim }(1:n)\line {\b for} i:=1 {\b to} n {\b do array} A(i) {\b dim} (1:m) {\b od}; +\par \pard\plain \fs20\lang1036 {\plain \f5\lang1036 create the structure: +\par }\pard {\plain \f6\lang1036 \'da\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'bf\line \'b3 }{\plain \f7\lang1036 A(1,1)}{\plain \f6\lang1036 \'b3\line \'c3 +\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'b4\line }{\plain \f6\lang1036 \'b3 \'b3\line \'b3 }{\plain \f7\lang1036 ...}{\plain \f6\lang1036 \'b3\line + \'b3 \'b3\line \'da\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'bf \'c3\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'b3\line \'b3 }{\plain \f7\lang1036 A(1) }{\plain \f6\lang1036 \'c3\'c4\'c4 +\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'b4 }{\plain \f7\lang1036 A(1,m) }{\plain \f6\lang1036 \'b3\line \'b3\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'b4 \'c0\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'d9\line \'b3 + \'b3\line \'b3 }{\plain \f7\lang1036 ... }{\plain \f6\lang1036 \'b3\line \'b3 \'b3\line \'c3\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'b4 \'da\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'bf\line + \'b3 }{\plain \f7\lang1036 A(n) }{\plain \f6\lang1036 \'c3\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'b4 }{\plain \f7\lang1036 A(n,1) }{\plain \f6\lang1036 \'b3\line \'c0\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'d9 + \'c3\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'b4\line \'b3 \'b3\line }{\plain \f6\lang1036 \'b3 }{\plain \f7\lang1036 ...}{\plain \f6\lang1036 \'b3\line + \'b3 \'b3\line \'c3\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'b4\line \'b3 }{\plain \f7\lang1036 A(n,m) }{\plain \f6\lang1036 \'b3\line + \'c0\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'d9\line }{\plain \f5\lang1036 +\par }\pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 {\b block} \line {\b var} i,j:integer, A,B: {\b arrayof arrayof} real, n:integer; \line {\b begin} \line read(n); +\line {\b array} A {\b dim} (1:n); \line {\b for} i:=1 {\b to} n {\b do} {\b array} A(i) {\b dim} (1:n) {\b od}; \line (* A is square array *)\line {\b array} B {\b dim} (1:n); \line {\b for} i:=1 {\b to} n {\b do array} B(i) {\b +dim}(1:i) {\b od}; \line (* B is lower triangular array *)\line A(n,n):=B(n,n);\line B(1):=A(1);\line B(1):={\b copy}(A(1)); \line {\b end} +\par \pard\plain \qj \fs20\lang1036 {\plain \f5\lang1036 Array A is the square array n by n. Each element A(i) , 1}{\field{\*\fldinst {\plain \f5\lang1036 SYMBOL 163 \\f "Symbol"}}{\fldrslt }}{\plain \f5\lang1036 i}{\field{\*\fldinst {\plain \f5\lang1036 +SYMBOL 163 \\f "Symbol"}}{\fldrslt }}{\plain \f5\lang1036 n contains the address of row A(i,j), 1}{\field{\*\fldinst {\plain \f5\lang1036 SYMBOL 163 \\f "Symbol"}}{\fldrslt }}{\plain \f5\lang1036 j}{\field{\*\fldinst {\plain \f5\lang1036 SYMBOL 163 \\ +f "Symbol"}}{\fldrslt }}{\plain \f5\lang1036 n. Array B is the lower-triangular array. Each element B(i), 1}{\field{\*\fldinst {\plain \f5\lang1036 SYMBOL 163 \\f "Symbol"}}{\fldrslt }}{\plain \f5\lang1036 i}{\field{\*\fldinst {\plain \f5\lang1036 +SYMBOL 163 \\f "Symbol"}}{\fldrslt }}{\plain \f5\lang1036 n, contains the address of row B(i,j), 1}{\field{\*\fldinst {\plain \f5\lang1036 SYMBOL 163 \\f "Symbol"}}{\fldrslt }}{\plain \f5\lang1036 j}{\field{\*\fldinst {\plain \f5\lang1036 SYMBOL 163 \\ +f "Symbol"}}{\fldrslt }}{\plain \f5\lang1036 i. Thus an ass}{\plain \f5\lang1036 i\-gnment statement A(n,n):=B(n,n) transmits real value B(n,n) to real varia\- +ble A(n,n). Assignment B(1):=A(1) transmits the address of the first row of A to variable B(1). Finally assignment B(1):=copy (A(1)) creates a copy of the first row of A and assi}{\plain \f5\lang1036 gns its address to B(1). +\par }\pard \qj {\plain \f5\lang1036 Upper and lower bounds of an adjustable array A are determined by stan\-dard operators lower(A) and upper(A). +\par }\pard {\plain \f5\lang1036 \line Example: +\par }\pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 {\b unit} sort: {\b procedure}(A:{\b arrayof} integer);\line (* insertion sort *) \line {\b var} + n,i,j:integer; var x:integer; \line {\b begin} \line n:=upper(A); (* assume lower bound is 1 *)\line {\b for} i:=2 {\b to} n \line {\b do} \line x:=A(i); j:=i-1;\line {\b do} \line {\b if} + x >= A(j) {\b then exit fi}; \line A(j+1):=A(j); j:=j-1;\line {\b if} j=0 {\b then exit fi};\line {\b od}; \line A(j+1):=x\line {\b od}; \line {\b end} sort; +\par \pard\plain \qj \fs20\lang1036 {\plain \f5\lang1036 If an array variable A refers to no array its value is equal none (the stan\- +dard default value of any array variable). An attempt to access an array element (e.g. A(i)) or a bound (e.g. lower(A)), wher}{\plain \f5\lang1036 e A is none, raises a run time error. +\par }\pard\plain \s254\sb840\sa480\keepn \b\f5\fs28\lang1036 6. Coroutines and semicoroutines +\par \pard\plain \qj \fs20\lang1036 {\plain \f5\lang1036 + Coroutine is a generalization of class. A coroutine object is an object such that the execution of its sequence of statements can be suspended and reactivated in a programmed manner. Consider first a simple class with a sequence of statements such that a +}{\plain \f5\lang1036 fter return some non-executed state\-ments remain. The generation of its object terminates with the execution of return statement, although the object can be later reactivated. If}{\plain \f5\lang1036 + such a class is declared as a coroutine, then its objects may be reactivated. This can be realized by attach statement: +\par }\pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 attach(X) +\par \pard\plain \fs20\lang1036 {\plain \f5\lang1036 where X is a reference variable designating the activating coroutine object. +\par }\pard \qj {\plain \f5\lang1036 In general, since the moment of generation a coroutine object is either ac\-tive or suspended. Any reactivation of a suspended coroutine object X (by attach(X)) causes the active coroutine object to be suspended and conti +\-nues the execution of X from th}{\plain \f5\lang1036 e statement following the last execut}{\plain \f5\lang1036 ed one. +\par }\pard \qj {\plain \f5\lang1036 Main program is also a coroutine. It is accessed through the standard va\-riable main and may be reactivated (if suspended) by the statement atta\-ch(main). +\par }\pard {\plain \f5\lang1036 \line Example: +\par }\pard \qj {\plain \f5\lang1036 +In the example below the cooperation of two coroutines is presented. One reads the real values from an input device, another prints these values in columns on a line-printer, n numbers in a line. The input stream ends with 0. +\par }\pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 {\b program} prodcons;\line {\b var} prod:producer,cons:consumer,n:integer,mag:real,last:bool; \line {\b unit} producer: { +\b coroutine}; \line {\b begin} \line {\b return}; \line {\b do} \line read(mag); (* mag- nonlocal variable, common store *)\line {\b if} mag=0 \line {\b then} (* end of data *) \line last:={ +\b true};\line {\b exit} \line {\b fi}; \line attach(cons); \line {\b od}; \line attach(cons) \line {\b end} producer; \line {\b unit} consumer: {\b coroutine}(n:integer); \line {\b var} Buf:{\b +arrayof} real; \line {\b var} i,j:integer; \line {\b begin} \line {\b array} Buf {\b dim}(1:n); \line {\b return}; \line {\b do} \line {\b for} i:=1 {\b to} n \line {\b do} \line Buf(i):=mag;\line + attach(prod); \line {\b if }last{\b then exit exit fi}; \line {\b od}; \line {\b for} i:=1 {\b to} n \line {\b do} (* print Buf *) \line write(' ',Buf(i):10:2)\line {\b od}; \line + writeln;\line {\b od}; \line (* print the rest of Buf *)\line {\b for} j:=1 {\b to} i {\b do} write(' ',Buf(j):10:2) {\b od}; \line writeln;\line attach(main); \line {\b end} consumer; \line {\b begin} \line prod:= +{\b new} producer; \line read(n);\line cons:={\b new} consumer(n); \line attach(prod); \line writeln;\line {\b end} prodcons; +\par \pard\plain \qj \fs20\lang1036 {\plain \f5\lang1036 The above task could be programmed without coroutines at all. The pre\-sented solution is, however, strictly modular, i.e. one unit realizes the in\- +put process, another realizes the output process, and both are ready to cooperate with each other. +\par }\pard \qj {\plain \f5\lang1036 LOGLAN-82 provides also a facility for the semi-coroutine operations. This is gained by the simple statement detach. If X is the active coroutine object, then detach reactivates that coroutine object + at where the last at\-tach(X) was executed. This }{\plain \f5\lang1036 statement meets the need for the asymetric co\-routine cooperations. (by so it is called semi-coroutine operation). Opera\- +tion attach requires a reactivated coroutine to be defined explicitly by the user as an actual parameter. Operation detach correspond}{\plain \f5\lang1036 s in some man\- +ner to return in procedures. It gives the control back to a coroutine object where the last attach(X) was executed, and that coroutine object need not be known explicitly in X. This mechanism is, however, not so secure as the normal control }{\plain +\f5\lang1036 tr}{\plain \f5\lang1036 ansfers during procedure calls and returns. +\par }\pard \qj {\plain \f5\lang1036 In fact, the user is able to loop two coroutines traces by : +\par }\pard \qj {\plain \f5\lang1036 }{\plain \b\f5\lang1036 attach}{\plain \f5\lang1036 (Y) in X }{\plain \b\f5\lang1036 attach}{\plain \f5\lang1036 (X) in Y +\par }{\plain \f5\lang1036 Then }{\plain \b\f5\lang1036 detach}{\plain \f5\lang1036 in X reactivates Y, }{\plain \b\f5\lang1036 detach}{\plain \f5\lang1036 in Y reactivates X. +\par }\pard \qj {\plain \f5\lang1036 In the example below the application of detach statement is illustrated. +\par }\pard {\plain \f5\lang1036 Example: +\par }\pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 {\b program} reader_writers; \line +(* In this example a single input stream consisting of blocks of numbers, each ending with 0, is printed on two printers of different width. The choice of the printer is determined b +y the block header which indicates the desired number of print columns. The input stream ends with a double 0. m1 - the width of printer_1, m2 - the width of printer_2 *)\line {\b const} m1=10,m2=20; \line {\b var} + reader:reading,printer_1,printer_2:writing; \line {\b var} n:integer,new_sequence:boolean,mag:real; \line \line {\b unit} writing:{\b coroutine}(n:integer); \line + {\b var} Buf: {\b arrayof} real, i,j:integer; \line {\b begin} \line {\b array} Buf {\b dim} (1:n); (* array generation *) \line {\b return};(* return terminates coroutine initialization *) \line {\b do} \line + attach(reader); (* reactivates coroutine reader *)\line {\b if} new_sequence \line {\b then} \line (* a new sequence causes buffer Buf to be cleared up *)\line {\b for} j:=1 {\b to} i {\b do} + write(' ',Buf(j):10:2) {\b od};\line writeln;\line i:=0; new_sequence:=false; attach(main) \line {\b else} \line i:=i+1; Buf(i):=mag;\line {\b if} i=n \line {\b then} \line {\b for} j:=1 +{\b to} n {\b do} write(' ',Buf(j):10:2) {\b od};\line writeln;\line i:=0;\line {\b fi} \line {\b fi} \line {\b od} \line {\b end} writing; \line {\b unit} reading: {\b coroutine}; \line {\b begin} +\line {\b return}; \line {\b do} \line read(mag);\line {\b if} mag=0 {\b then} new_sequence:={\b true}; {\b fi}; \line detach;\line (* detach returns control to printer_1 or printer_2 \tab \tab \tab \tab \tab +\tab \tab depending which one reactivated the reader *)\line {\b od} \line {\b end} reading; \line {\b begin} \line reader:={\b new} reading; \line printer_1:={\b new} writing(m1); printer_2:={\b new} writing(m2);\line {\b do} +\line read(n);\line {\b case} n \line {\b when} 0: exit \line {\b when} m1: attach(printer_1) \line {\b when} m2: attach(printer_2) \line {\b otherwise} write(" wrong data"); exit \line {\b esac + \line od \line end}; +\par \pard\plain \fs20\lang1036 {\plain \f5\lang1036 +\par }\pard \qj {\plain \f5\lang1036 Coroutines play the substantial role in process simulation. Class Simula\-tion provided in Simula-67 makes use of coroutines at most degree. LO\-GLAN-82 provides for easy simulation as well. The LOGLAN-82 class Simu\- +lation is implemented on a heap what giv}{\plain \f5\lang1036 es lg(n) time cost}{\plain \f5\lang1036 (in contrast with O(n) cost of the original implementation). It covers also various simu\-lation problems of large size and degree of complexity. + +\par }\pard\plain \s254\sb840\sa480\keepn \b\f5\fs28\lang1036 7. Prefixing +\par \pard\plain \qj \fs20\lang1036 {\plain \f5\lang1036 Classes and prefixing are ingenius inventions of Simula-67(cf [1]). Unfor\- +tunately they were hardly ever known and, perhaps, by this have not been introduced into many programming language that gained certain popularity. Moreover, implementa\-tion constra}{\plain \f5\lang1036 +ints of Simula-67 bind prefixing and classes workableness to such a degree that both faciliti}{\plain \f5\lang1036 +es cannot be used in all respects. We hope that LOGLAN-82, adopting merits and rooting up deficiencies of these constructs, will smooth their variations and vivify theirs usefulness. +\par }\pard \qj {\plain \f5\lang1036 What is prefixing ? First of all it is a method for unit extending. Consider the simplest example: +\par }\pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 {\b unit} bill: {\b class}; \line {\b var} dollars :real,\line not_paid :boolean,\line + year,month,day :integer;\line {\b end} bill; +\par \pard\plain \qj \fs20\lang1036 {\plain \f5\lang1036 Assume the user desires to extend this class with new attributes. Instea}{\plain \f5\lang1036 d of writing a completely new class, he may enlarge the existing one: +\par }\pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 {\b unit} gas_bill:bill {\b class}; \line {\b var} cube_meters: real; \line {\b end} gas_bill; +\par \pard\plain \qj \fs20\lang1036 {\plain \f5\lang1036 + Class gas_bill is prefixed by class bill. This new declaration may appear anywhere within the scope of declaration of class bill. (In Simula-67 such a prefixing is forbidden in nested units.) Class gas_bill has all the attributes of class bill and additi +}{\plain \f5\lang1036 onally its own attributes (in this case the only one: cube_meters). The generation statement of this class}{\plain \f5\lang1036 has the form: +\par }\pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 z:={\b new} gas_bill; +\par \pard\plain \qj \fs20\lang1036 {\plain \f5\lang1036 where z is a reference variable of type gas_bill. Remote access to the attri\-butes of prefixed class is standard: +\par }\pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 z.dollars:=500.5; z.year:=1982; z.month:=3; z.day:=8;\line z.cube_meters:=100000; +\par \pard\plain \fs20\lang1036 {\plain \f5\lang1036 \line Consider now the example of a class with parameters. +\par }\pard {\plain \f5\lang1036 Assume that in a program a class: +\par }\pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 {\b unit} id_card: {\b class}(name:string,age:integer); \line {\b end} id_card; +\par \pard\plain \fs20\lang1036 {\plain \f5\lang1036 and its extension: +\par }\pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 {\b unit} idf_card:id card {\b class}(first name:string); \line {\b end} idf_card; +\par \pard\plain \fs20\lang1036 {\plain \f5\lang1036 are declared. +\par }\pard \qj {\plain \f5\lang1036 Then for variabl}{\plain \f5\lang1036 e z of type id_card and variable t of type idf_card the cor\-responding generation statement may be the following: +\par }\pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 z:={\b new} id_card("kreczmar",37); \line t:={\b new} idf_card("Kreczmar",37,"Antoni"); +\par \pard\plain \qj \fs20\lang1036 {\plain \f5\lang1036 Thus the formal parameters of a class are concatenated with the formal parameters of its prefix. +\par }\pard \qj {\plain \f5\lang1036 One can still extend class idf_card. For instance: +\par }\pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 {\b unit} idr_card:idf_card {\b class}; \line {\b var} children_number:integer; \line {\b var} birth_place:string; +\line {\b end} idr_card; +\par \pard\plain \qj \fs20\lang1036 {\plain \f5\lang1036 Prefixing allows to build up hierarchies}{\plain \f5\lang1036 + of classes. Each one hierarchy has a tree structure. A root of such a tree is a class without prefix. One class is a successor of another class iff the first is prefixed by the latter one. +\par }\pard {\plain \f5\lang1036 +\par }{\plain \f5\lang1036 Consider the prefix structure: +\par }\pard \keep {\plain \f7\lang1036 A +\par }{\plain \f7\lang1036 . . . +\par }{\plain \f7\lang1036 . . . +\par }{\plain \f7\lang1036 . . . +\par }{\plain \f7\lang1036 B. .C .D +\par }{\plain \f7\lang1036 . +\par }{\plain \f7\lang1036 . +\par }{\plain \f7\lang1036 .E +\par }{\plain \f7\lang1036 . +\par }{\plain \f7\lang1036 . +\par }{\plain \f7\lang1036 .F +\par }{\plain \f7\lang1036 . . +\par }{\plain \f7\lang1036 }{\plain \f7\lang1036 . . +\par }{\plain \f7\lang1036 G. .H +\par }\pard \qj {\plain \f5\lang1036 Class H has a prefix sequence A, B, E, F, H. Let a, b, ... , h denote the cor\-responding unique attributes of classes A, B, ... , H, respectively. The ob\-jects of these classes have the following forms: +\par }\pard {\plain \f5\lang1036 +\par }\pard \keep {\plain \f6\lang1036 \'da\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'bf \'da\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'bf \'da\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'bf \'da\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'bf\line \'b3 + }{\plain \f7\lang1036 a}{\plain \f6\lang1036 \'b3 \'b3 }{\plain \f7\lang1036 a}{\plain \f6\lang1036 \'b3 \'b3 }{\plain \f7\lang1036 a}{\plain \f6\lang1036 \'b3 \'b3 }{\plain \f7\lang1036 a}{\plain \f6\lang1036 \'b3 +\line \'c0\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'d9 \'c3\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'b4 \'c3\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'b4 \'c3\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'b4\line }{\plain \f7\lang1036 object A } +{\plain \f6\lang1036 \'b3 }{\plain \f7\lang1036 b}{\plain \f6\lang1036 \'b3 \'b3 }{\plain \f7\lang1036 c}{\plain \f6\lang1036 \'b3 \'b3 }{\plain \f7\lang1036 d}{\plain \f6\lang1036 \'b3\line }{\plain +\f6\lang1036 \'c0\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'d9 \'c0\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'d9 \'c0\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'d9\line }{\plain \f7\lang1036 object B}{\plain \f6\lang1036 } +{\plain \f7\lang1036 object C}{\plain \f6\lang1036 }{\plain \f7\lang1036 object D}{\plain \f6\lang1036 \line \'da\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'bf \'da\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'bf \'da\'c4\'c4\'c4\'c4\'c4\'c4\'c4 +\'c4\'c4\'c4\'bf \'da\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'bf\line \'b3 }{\plain \f7\lang1036 a}{\plain \f6\lang1036 \'b3 \'b3 }{\plain \f7\lang1036 a}{\plain \f6\lang1036 \'b3 \'b3 }{\plain \f7\lang1036 a}{\plain +\f6\lang1036 \'b3 \'b3 }{\plain \f7\lang1036 a}{\plain \f6\lang1036 \'b3\line \'c3\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'b4 \'c3\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'b4 \'c3\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'b4 \'c3\'c4 +\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'b4\line \'b3 }{\plain \f7\lang1036 b}{\plain \f6\lang1036 \'b3 \'b3 }{\plain \f7\lang1036 b }{\plain \f6\lang1036 \'b3 \'b3 }{\plain \f7\lang1036 b }{\plain \f6\lang1036 \'b3 \'b3 } +{\plain \f7\lang1036 b}{\plain \f6\lang1036 \'b3\line \'c3\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'b4 \'c3\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'b4 \'c3\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'b4 \'c3\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4 +\'c4\'b4\line \'b3 }{\plain \f7\lang1036 e}{\plain \f6\lang1036 \'b3 \'b3 }{\plain \f7\lang1036 e}{\plain \f6\lang1036 \'b3 \'b3 }{\plain \f7\lang1036 e }{\plain \f6\lang1036 \'b3 \'b3 }{\plain \f7\lang1036 e}{\plain +\f6\lang1036 \'b3\line \'c0\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'d9 \'b3\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'b4 \'c3\'c4\'c4\'c4\'c4\'c4}{\plain \f6\lang1036 \'c4\'c4\'c4\'c4\'c4\'b4 \'c3\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'b4 +\line }{\plain \f7\lang1036 object E}{\plain \f6\lang1036 \'b3 }{\plain \f7\lang1036 f }{\plain \f6\lang1036 \'b3 \'b3 }{\plain \f7\lang1036 f}{\plain \f6\lang1036 \'b3 \'b3 }{\plain \f7\lang1036 f}{\plain \f6\lang1036 + \'b3\line \'c0\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'d9 \'c3\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'b4 \'c3\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'b4\line }{\plain \f7\lang1036 object F}{\plain +\f6\lang1036 \'b3 }{\plain \f7\lang1036 g }{\plain \f6\lang1036 \'b3 \'b3 }{\plain \f7\lang1036 h}{\plain \f6\lang1036 \'b3\line \'c0\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'d9 \'c0\'c4\'c4\'c4\'c4 +\'c4\'c4\'c4\'c4\'c4\'c4\'d9\line }{\plain \f5\lang1036 \tab \tab \tab \tab }{\plain \f7\lang1036 object G object H}{\plain \f5\lang1036 +\par }\pard {\plain \f5\lang1036 +\par }\pard \qj {\plain \f5\lang1036 Let Ra, Rb,..., Rh denote reference variables of types A, B,..., H, respecti\-vely. Then the following expressions are correct: +\par }\pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 Ra.a, Rb.b, Rb.a, Rg.g, Rg.f, Rh.h, Rh.f, Rh.e, Rh.b, Rh.a etc. +\par \pard\plain \qj \fs20\lang1036 {\plain \f5\lang1036 Variable Ra may designate the object of class B (or C,..., H), i.e. the state\-ment: +\par }\pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 Ra:={\b new} B +\par \pard\plain \qj \fs20\lang1036 {\plain \f5\lang1036 +is legal. But then attribute b is not accessible through dot via Ra, i.e. Ra.b is incorrect. This follows from insecurity of such a remote access. In fact, variable Ra may point any object of a class prefixed by A, in particular, Ra may point the object o +}{\plain \f5\lang1036 f A itself, which has no attribute b. If Ra.b had been correct, a compiler should have distiguish the cases Ra points to the object }{\plain \f5\lang1036 of A or not. But this, of course, is undistinguishable at compilation time. + +\par }\pard \qj {\plain \f5\lang1036 To allow, however, the user's access to attribute b (after instruction }{\f7 Ra:=}{\b\f7 new}{\f7 B}{\plain \f5\lang1036 ), the instantaneous type modification is provided within the lan\-guage: +\par }\pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 Ra {\b qua} B +\par \pard\plain \qj \fs20\lang1036 {\plain \f5\lang1036 + The correctness of this expression is checked at run time. If Ra designates an object of B or prefixed ba B, the type of the expression is B. Otherwise the expression is erroneous. Thus, for instance, the expressions: +\par }\pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 Ra {\b qua} G.b, Ra {\b qua} G.e etc. +\par \pard\plain \qj \fs20\lang1036 {\plain \f5\lang1036 enable remote access to the attributes b, c, ... via Ra. +\par }\pard \qj {\plain \f5\lang1036 So far the question of attribute concatenation was merely discussed. Ho\-wever the sequences of statements can be also concatenated. +\par }\pard \qj {\plain \f5\lang1036 Consider class B prefixed with class A. In the sequence of statements of class A the keyword inner may occur anywhere, but only once. The se\- +quence of statements of class B consists of the sequence of statements of class A with inner replaced by the sequ}{\plain \f5\lang1036 ence of statements of class B. +\par }\pard \keep {\plain \f6\lang1036 \line }{\plain \b\f7\lang1036 unit}{\plain \f7\lang1036 A :}{\plain \b\f7\lang1036 class}{\plain \f7\lang1036 }{\plain \f7\lang1036 }{\plain \b\f7\lang1036 unit}{\plain \f7\lang1036 B:A }{\plain +\b\f7\lang1036 class}{\plain \f7\lang1036 +\par }\pard \keep {\plain \f7\lang1036 ... ... +\par }\pard \keep {\plain \f7\lang1036 }{\plain \b\f7\lang1036 begin}{\plain \f7\lang1036 }{\plain \b\f7\lang1036 begin}{\plain \f7\lang1036 +\par }\pard \keep {\plain \f7\lang1036 ... }{\plain \f6\lang1036 \'da\'c4\'c4\'c4}{\plain \f7\lang1036 ...}{\plain \f6\lang1036 +\par }\pard \keep {\plain \f6\lang1036 \'b3 }{\plain \f7\lang1036 \tab }{\plain \b\f7\lang1036 inner}{\plain \f6\lang1036 }{\f6\fs18 }{\plain \f6\lang1036 \'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4 +\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4\'c4}{\f6\fs22 \'c4}{\plain \f6\lang1036 \'c4\'c4\'c4\'b4 }{\plain \b\f7\lang1036 inner}{\plain \f6\lang1036 +\par }\pard \keep {\plain \f6\lang1036 \'b3 +\par }\pard \keep {\plain \f6\lang1036 }{\plain \f7\lang1036 ...}{\plain \f6\lang1036 \'c0\'c4\'c4\'c4... +\par }\pard \keep {\plain \f6\lang1036 }{\plain \b\f7\lang1036 end}{\plain \f7\lang1036 A;}{\plain \f6\lang1036 }{\plain \b\f7\lang1036 end}{\plain \f7\lang1036 B; }{\plain \f6\lang1036 +\par }\pard {\plain \f5\lang1036 +\par }{\plain \f5\lang1036 +\par }\pard \qj {\plain \f5\lang1036 In this case inner in class B is equivalent to the empty statement}{\plain \f5\lang1036 . If class B prefixes another class, say C, then inner in B is replaced by the se\- +quence of statements of class C, and so on. If inner does not occur expli\-citly, an implicit occurrence of inner before the final end of a class is as\-sumed. +\par }\pard {\plain \f5\lang1036 \line Example +\par }\pard {\plain \f5\lang1036 Let class complex be declared as usual: +\par }\pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 {\b unit} complex:{\b class}(re,im:real); \line {\b end} complex; +\par \pard\plain \qj \fs20\lang1036 {\plain \f5\lang1036 and assume one desires to declare a class mcomplex with the additional attribute module. In order the generation of class mcomplex define the value of at}{\plain \f5\lang1036 +tribute module, one can declare a class: +\par }\pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 {\b unit} mcomplex:complex {\b class}; \line {\b var} module:real; \line {\b begin} \line module:=sqrt(re*re+im*im) +\line {\b end} mcomplex; +\par \pard\plain \fs20\lang1036 {\plain \f5\lang1036 Class mcomplex may be still extended: +\par }\pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 {\b unit} pcomplex:mcomplex {\b class}; \line {\b var} alfa:real; \line {\b begin} \line alfa:=arccos(re/module) +\line {\b end} pcomplex; +\par \pard\plain \qj \fs20\lang1036 {\plain \f5\lang1036 For these declarations each generation of class mcomplex defines the va\-lue of attribute module, each generation of class pcomplex defines the va\-lues of attributes module and alfa. +\par }\pard \qj {\plain \f5\lang1036 For reference v}{\plain \f5\lang1036 ariables z1, z2 z3 of type complex, the following sequence of statements illustrates the presented constructs: +\par }\pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 z1:={\b new} complex(0,1); \line z2:={\b new} mcomplex(4,7); \line z3:={\b new} pcomplex(-10,12); \line {\b if} z2 +{\b qua} mcomplex.module > 1 \line {\b then} \line z1:=z2;\line {\b fi}; \line {\b if} z3 {\b qua} pcomplex.alfa < 3.14 \line {\b then} \line z3.re:=-z3.re; z3.alfa:=z3.alfa+3.14;\line {\b fi}; \line z1 {\b qua} + mcomplex.module:= 0; \line z1.re,z1.im:=0; +\par \pard\plain \fs20\lang1036 {\plain \f5\lang1036 Example: +\par }\pard \qj {\plain \f5\lang1036 Binary search tree (Bst) is a bina}{\plain \f5\lang1036 ry tree where for each node x the nodes in the left subtree are less than x, the nodes in the right subtree are grea\- +ter than x. It is the well-known exercise to program the algorithms for the following operations on Bst: \tab +\par }\pard {\plain \f5\lang1036 \tab member(x) = true iff x belongs to Bst +\par }{\plain \f5\lang1036 \tab insert(x), enlarge Bst with x, if x does not yet belong to Bst +\par }{\plain \f5\lang1036 We define both these operations in a class: +\par }\pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 {\b unit} Bst: {\b class}; \line {\b unit} node: {\b class}(value:integer); (* tree node *) \line {\b var} + left,right:node; \line {\b end} node; \line {\b var} root:node; \line {\b unit} help: {\b class}(x:integer); (* auxiliary class *) \line {\b var} p,q:node; \line {\b begin} \line q:=root;\line {\b while} + q=/= none \line {\b do} \line {\b if} x < q.value \line {\b then} \line p:=q; q:=q.left;\line {\b repeat} (* jump to the beginning of a loop *) \line {\b fi}; \line {\b if} + q.value < x \line {\b then} \line p:=q; q:=q.right; {\b repeat} \line {\b fi}; \line {\b exit} \line {\b od}; \line {\b inner}\line (* virtual instruction to be\'ffreplaced by the body of\line + a module prefixed by help *)\line {\b end} help; \line {\b unit} member:help {\b function}:boolean; \line (* x is a formal parameter derived from the prefix help *)\line {\b begin} \line {\b result}:=q=/=none \line {\b +end} member; \line {\b unit} insert:help {\b procedure}; \line (* x is a formal parameter derived from the prefix help *)\line {\b begin} \line {\b if} q=/=none {\b then return fi}; \line q:={\b new} node(x); \line {\b if +} p=none {\b then} root:=q; {\b return fi}; \line {\b if} p.value < x {\b then} p.right:=q {\b else} p.left:=q {\b fi}; \line {\b end} insert; \line {\b begin} \line {\b inner}; \line {\b end} Bst; +\par \pard\plain \qj \fs20\lang1036 {\plain \f5\lang1036 In the example the common actions of member and insert are program\- +med in class help. Then it suffices to use class help as a prefix of function member and procedure insert, instead of redundant occurrences of the corresponding sequence of statements in }{\plain \f5\lang1036 both units. +\par }\pard {\plain \f5\lang1036 Class Bst may be applied as follows: +\par }\pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 {\b var} X,Y:Bst; \line {\b begin} \line X:={\b new} Bst; Y:={\b new} Bst; \line {\b call} X.insert(5); +\line {\b if} Y.member(-17) {\b then} .... \line {\b end} +\par \pard\plain \qj \fs20\lang1036 {\plain \f5\lang1036 As shown in the declaration of Bst, c}{\plain \f5\lang1036 lass may prefix not only other classes but also procedures and functions. Class may prefix blocks as well. +\par }\pard {\plain \f5\lang1036 \line Example: +\par }\pard {\plain \f5\lang1036 Let class push_down (p. 5) prefix a block: +\par }\pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 {\b pref} push_down(1000) {\b block} \line {\b var} ... \line {\b begin} \line ...\line {\b call} + push(50); ... \line i:=pop;\line ...\line {\b end} +\par \pard\plain \qj \fs20\lang1036 {\plain \f5\lang1036 In the above block prefixed with class push_down one can use pop and push as local attributes. (They are local since the block is embedded in the prefix push down.) +\par }\pard {\plain \f5\lang1036 \line Example: +\par }\pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 {\b pref} push down(1000) {\b block} \line {\b begin} \line ...\line {\b pref} Bst {\b block} \line {\b +begin} \line (* in this block both structures\line push down and Bst are visible *)\line {\b call} push(50); \line {\b call} insert(13); \line {\b if} member(10) {\b then} ... \line i:=pop;\line + ...\line {\b end \line end +\par }\pard\plain \qj \fs20\lang1036 {\plain \f5\lang1036 + In place where classes push_down and Bst are visible together a block prefixed with Bst may be nested in a block prefixed with push_down (or vice versa). In the inner block both data structures are directly accessible. Note that this}{\plain +\f5\lang1036 construct is illegal in Simula 67. +\par }\pard\plain \s254\sb840\sa480\keepn \b\f5\fs28\lang1036 8. Formal types +\par \pard\plain \qj \fs20\lang1036 {\plain \f5\lang1036 Formal types serve for unit parametrization with respect to any non-pri\-mitive type. +\par }\pard {\plain \f5\lang1036 Example: +\par }\pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 {\b unit} Gsort:{\b procedure}({\b type} T; A:{\b arrayof} T; {\b function} less\line \tab \tab \tab \tab \tab \tab \tab + (x, y: T): boolean);\line {\b var} n,i,j:integer; var x:T; \line {\b begin } \line n:=upper(A);\line {\b for} i:=2 {\b to} n \line {\b do} \line x:=A(i); j:=i-1;\line {\b do} \line {\b if} less(A(j),x) {\b +then exit fi}; \line A(j+1):=A(j); j:=j-1;\line {\b if} j=0 {\b then exit fi};\line {\b od}; \line A(j+1):=x;\line {\b od} \line {\b end} Gsort; +\par \pard\plain \qj \fs20\lang1036 {\plain \f5\lang1036 +Procedure Gsort (the generalization of procedure sort from p.4) has type parameter T. A corresponding actual parameter may be an arbitrary non-primitive type. An actual parameter corresponding to A should be an array of elements of the actual type T. Func +}{\plain \f5\lang1036 tion less should define the linear or\-dering on the domain T. +\par }\pard \qj {\plain \f5\lang1036 For instance, the array A of type bill (cf p.7) may be sorted with respect to attribute dollars , if the function: +\par }\pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 {\b unit} less: {\b function}(t,u:bill):boolean; \line {\b begin} \line {\b result}:=t.dollars <= u.dollars\line {\b + end} less; +\par \pard\plain \fs20\lang1036 {\plain \f5\lang1036 is used as an actual parameter: +\par }\pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 {\b call} Gsort(bill,A,less); +\par \pard\plain \fs20\lang1036 {\plain \f5\lang1036 If the user desires to sort A with respect to date, it is sufficient to declare : +\par }\pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 {\b unit} earlier:{\b function}(t,u:bill):boolean; \line {\b begin} \line {\b if} t.year < u.year {\b then result} +:= true; {\b return fi}; \line {\b if} t.year=u.year \line {\b then} \line {\b if} t.month < u.month {\b then result}:=true; {\b return fi}; \line {\b if} t.month=u.month {\b then result}:=t.day<=u.day {\b fi} \line {\b fi}; +\line {\b end} earlier; +\par \pard\plain \fs20\lang1036 {\plain \f5\lang1036 and to call: call Gsort(bill,A,ea}{\plain \f5\lang1036 rlier); +\par }\pard\plain \s254\sb840\sa480\keepn \b\f5\fs28\lang1036 9. Protection techniques +\par \pard\plain \qj \fs20\lang1036 {\plain \f5\lang1036 + Protection techniques ease secure programming. If a program is large, uses some system classes, is designed by a team etc., this is important (and non-trivial) to impose some restrictions on access to non-local attri\-butes. +\par }\pard \qj {\plain \f5\lang1036 Let us consider a data structure declared as a class. Some of its attributes should be accessible for the class users, the others should not. For ins\- +tance, in class Bst (p.7) the attributes member and insert are to be acces\-sible. On the other }{\plain \f5\lang1036 hand the attributes root, node and help should not be accessible, even for a meddlesome user. An improper use of them may jeo\- +pardize the data structure invariants. +\par }\pard \qj {\plain \f5\lang1036 To forbid the access to some class attributes the three following protection mechanisms are provided: +\par }\pard {\plain \b\f7\lang1036 close, hidden, }{\plain \f5\lang1036 and}{\plain \b\f7\lang1036 taken. +\par }\pard \qj {\plain \f5\lang1036 The protection close defined in a class forbids remote access to the speci\-fied attributes. For example, consider the class declaration: +\par }\pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 {\b unit} A: {\b class}; \line {\b close} x,y,z; \line {\b var} x: integer, y,z:real; \line ....\line {\b end} + A +\par \pard\plain \fs20\lang1036 {\plain \f5\lang1036 Remote access to the attributes x,y,z from outside of A is forbidden. +\par }\pard \qj {\plain \f5\lang1036 The protection hidden (with akin syntax) does not allow to use the speci\-fied attributes form outside of A neither by the remote access nor in the units prefixed by A. The only way to use a hidden attribute is to use it wi +\-thin the body of class A.Prote}{\plain \f5\lang1036 ction taken defines these attributes derived from prefix, which the user wishes to use in the prefixed unit. Consider a unit B prefixed by a class A. In unit}{\plain \f5\lang1036 + B one may specify the attributes of A which are used in B. This protects the user against an unconscious use of an attribute of class A in unit B (because of identifier conflict). When taken list does not occur, then by default, all non-hidden attributes +}{\plain \f5\lang1036 of class A are accessible in unit B. +\par }\pard\plain \s254\sb840\sa480\keepn \b\f5\fs28\lang1036 10. Programmed deallocation +\par \pard\plain \qj \fs20\lang1036 {\plain \f5\lang1036 The classical methods implemented to deallocate class objects are based on reference counters or garbage collection. Sometimes the both methods may be combined. A reference counter is }{\plain +\f5\lang1036 +a system attribute holding the number of references pointing to the given object. Hence any change of the value of a reference variable X is followed by a corresponding increase or decrease of the value of its reference counter. When the reference counter +}{\plain \f5\lang1036 becomes equal 0, the object can be deallocated. +\par }\pard \qj {\plain \f5\lang1036 The deallocation of class objects may also occur during the process of garbage collection. During this process all unreferenced objects are found and removed (while memory may be compactified). In order to}{\plain +\f5\lang1036 keep the garbage collector able to collect all the garbage, the user should clear all reference variables , i.e. set to None, whenever possible. This system has many disadvantages. First of all, the programmer is forced to clear all refe\- +rence variables,}{\plain \f5\lang1036 even those which are of auxiliary character. Moreover, garbage collector is a very expensive mechanism and thus it can be used only in emergency cases. +\par }\pard \qj {\plain \f5\lang1036 In LOGLAN a dual operation to the object generator, the so-called object deallocator is provided. Its}{\plain \f5\lang1036 syntactic form is as follows: +\par }\pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 kill(X) +\par \pard\plain \qj \fs20\lang1036 {\plain \f5\lang1036 where X is a reference expression. If the value of X points to no object (none) then kill(X) is equivalent to an empty statement. If the + value of X points to an object O, then after the execution of kill(X), the object O is deallocated. Moreover all ref}{\plain \f5\lang1036 erence variables which pointed to O are set to none. This deallocator provides full }{\plain \i\f5\lang1036 security +}{\plain \f5\lang1036 , i.e. the attempt to access the deallocated object O is checked and results in a run-time error. +\par }\pard {\plain \f5\lang1036 For e}{\plain \f5\lang1036 xample: +\par }\pard\plain \s3\qj\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 Y:=X; kill(X); Y.W:=Z; +\par \pard\plain \fs20\lang1036 {\plain \f5\lang1036 causes the same run-time error as: +\par }\pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 X:=none; X.W:=Z; +\par \pard\plain \qj \fs20\lang1036 {\plain \f5\lang1036 + The system of storage management is arranged in such a way that the frames of killed objects may be immediately reused without the necessity of calling the garbage collector, i.e. the relocation is performed automati\- +cally. There is nothing for it but to}{\plain \f5\lang1036 remember not to use remote access to a killed object. (Note that the same problem appears when remote access X.W is used and X=none). +\par }\pard {\plain \f5\lang1036 \line +\par }\pard {\plain \f5\lang1036 +\par }{\plain \f5\lang1036 E}{\plain \f5\lang1036 xample: +\par }\pard \qj {\plain \f5\lang1036 Below a practical example of the programmed deallocation is presented. Consider class Bst (p.7). Let us define a procedure that deallocates the whole tree and is called with the termination of the class Bst. +\par }\pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 {\b unit} Bst:{\b class}; \line (* standard declarations list of Bst *)\line {\b unit} kill_all:{\b procedure} +(p:node); \line (* procedure kill_all deallocates a tree with root p *)\line {\b begin} \line {\b if} p= none {\b then return fi}; \line {\b call} kill_all(p.left); \line {\b call} kill_all(p.right); \line kill(p) \line {\b +end} kill_all; \line {\b begin \line inner}; \line {\b call} kill_all(root) \line {\b end} Bst; +\par \pard\plain \fs20\lang1036 {\plain \f5\lang1036 Bst may be applied as a prefix: +\par }\pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 {\b pref} Bst {\b block} \line ...\line {\b end} +\par \pard\plain \qj \fs20\lang1036 {\plain \f5\lang1036 and automatically will cause the deallocation of the whole tree after return to call kill_all(root) from the prefixed block. +\par }{\plain \f5\lang1036 To use properly this structure by remote accessing one must call kill_all by himself: +\par }\pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 {\b unit} var X,Y:Bst; \line ...\line {\b begin} \line X:={\b new} Bst; Y:={\b new} Bst; \line ...\line + (* after the structures' application *)\line {\b cal}{\b l} X.kill_all(X.root); \line kill(X); \line {\b call} Y.kill_all(Y.root); \line kill(Y); \line ...\line {\b end} +\par \pard\plain \qj \fs20\lang1036 {\plain \f5\lang1036 Finally note that deallocator kill enables deallocation of array objects, and suspended coroutines and processes as well (cf p.13). +\par }\pard\plain \s254\sb840\sa480\keepn \b\f5\fs28\lang1036 11. Exception handling +\par \pard\plain \qj \fs20\lang1036 {\plain \f5\lang1036 Exceptions are events that cause interruption of normal program execu\- +tion. One kind of exceptions are those which are raised as a result of some run time errors. For instance, when an attempt is made to access a killed object, when the res}{\plain \f5\lang1036 +ult of numeric operation does not lie within the range, when the dynamic storage allocated to a program is exceeded etc. +\par }\pard \qj {\plain \f5\lang1036 Another kind of exceptions are those which are raised explicitly by a user (with the execution of the raise statement). +\par }\pard \qj {\plain \f5\lang1036 The response to exceptions (one or more) is defined by an exception han\-dler. A handler may appear at the end of declarations of any unit. The cor\- +responding actions are defined as sequences of statements preceded by keyword when and an exception identif}{\plain \f5\lang1036 ier. +\par }\pard {\plain \f5\lang1036 Ex}{\plain \f5\lang1036 ample: +\par }\pard \qj {\plain \f5\lang1036 In procedure squareeq (p.3) we wish to include the case when a=0. It may be treated as an exception (division by zero). +\par }\pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 {\b unit} squareeq(a,b,c:real;{\b output} xr,xi,yr,yi:real); \line {\b var} delta:real; \line {\b handlers} \line + {\b when} division_by_zero: \line {\b if} b =/= 0 \line {\b then} \line xi,yr,yi:=0; xr:=-c/b; {\b terminate} \line {\b else} \line {\b raise} Wrong_data(" no roots") \line {\b fi}; \line {\b +end} \line {\b begin} \line ...\line {\b end} squareeq; +\par \pard\plain \qj \fs20\lang1036 {\plain \f5\lang1036 The handler declared in that procedure handles the only }{\plain \f5\lang1036 one exception (division_by_zero). +\par }\pard \qj {\plain \f5\lang1036 + When an exception is raised, the corresponding handler is searched for, starting from the active object and going through return traces. If there is no object containing the declaration of the handler, then the program (or the corresponding process) is t +}{\plain \f5\lang1036 erminated. Otherwise the control is trans\-ferred to the first found handler. +\par }\pard \qj {\plain \f5\lang1036 In our example the handler is declared within the unit itself, so control is passed to a sequence: +\par }\pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 {\b if} b=/=0 ... +\par \pard\plain \qj \fs20\lang1036 {\plain \f5\lang1036 Therefore, when b}{\plain \f5\lang1036 =/=0, the unique root of square equation will be deter\-mined and the procedure will be normally terminated (terminate). In ge\- +neral, terminate causes that all the objects are terminated, starting from that one where the exception was raised and ending}{\plain \f5\lang1036 on that one where the handler was found. Then the computation is continued in a normal way. +\par }\pard \qj {\plain \f5\lang1036 In our example, when b=0, a new exception is raised by the user. For this kind of exceptions , the exception itself should be declared (because it is not predefi}{\plain \f5\lang1036 +ned as a run time error). Its declaration may have parameters which are transmitted to a handler. The exception declaration need not be visible by the exception handler. However the way the handler is searched for does not differ from the standard one. C +}{\plain \f5\lang1036 onsider an example: +\par }\pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 {\b block}\line {\b signal} Wrong_data(t:string); \line {\b unit} squareeq: \line ... +\line {\b end} squareeq;\line ...\line {\b begin} \line ...\line {\b end} +\par \pard\plain \qj \fs20\lang1036 {\plain \f5\lang1036 Exception Wrong_data may be raised wherever its declaration (signal Wrong_data) is v}{\plain \f5\lang1036 +isible. When its handler is found the specified sequence of actions is performed. In the example above different handlers may be defi\-ned in inner units to the main block where squereeq is called. +\par }\pard \qj {\plain \f5\lang1036 The case a=0 could be included}{\plain \f5\lang1036 , of course, in a normal way, i.e. by a cor\- +responding conditional statement occurring in the procedure body. But the case a=0 was assumed to be exceptional (happens scarcely). Thus the eva\-luation of condition a=0 would be mostly unnecessary. As can be n}{\plain \f5\lang1036 +oticed thanks to exception}{\plain \f5\lang1036 s the above problem can be solved with the minimal waste of run time. +\par }\pard\plain \s254\sb840\sa480\keepn \b\f5\fs28\lang1036 12. Concurrent processes. +\par \pard\plain \qj \fs20\lang1036 {\plain \f5\lang1036 Loglan allows to create and execute objects-processes. They can operate simultaneously on different computers linked into a LAN network or a few processes can share one processor (its time-slices). + +\par }\pard \qj {\plain \f5\lang1036 Process modules are different from the classes and coroutines for, they use the keyword process. The syntax of process modules is otherwise the same. In a process one can use a few more instructions: resum}{\plain +\f5\lang1036 e (resume a process which is passive), stop - make the current process passive, etc. +\par }\pard \qj {\plain \f5\lang1036 All processes (even those executed on the same computer) are implemen\-ted as distributed, i.e. without any shared memory. This fact implies some restrictions on how processes may be used. Not all restrictions are enfor\- +ced by the present compiler, so it }{\plain \f5\lang1036 is the programmer's responsibility to respect them. For the details see the User's Manual. +\par }\pard \qj {\plain \f5\lang1036 Semantics of the generator }{\plain \b\f5\lang1036 new}{\plain \f5\lang1036 is slightly modified when applied to the p}{\plain \f5\lang1036 rocesses. The first parameter of the first process unit in the prefix se\- +quence must be of type INTEGER. This parameter denotes the node num\-ber of the computer on which this process will be created. For a single computer operation this parameter must be }{\plain \f5\lang1036 equal to 0. +\par }\pard {\plain \f5\lang1036 \line Example: +\par }\pard\plain \s3\li567\sb120\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 {\b unit} A:{\b class}(msg:string);\line ...\line {\b end} A;\line {\b unit} P:A {\b process}(node:integer, pi:real);\line ... +\line {\b end} P;\line ...\line {\b var} x:P;\line ...\line {\b begin}\line ...\line (* Create process on node 4. The first parameter is the *) \line (*string required by the prefix A, the second is the node number *)\line x := {\b new} + P("Hello", 4, 3.141592653);\line ...\line {\b end} +\par \pard\plain \fs20\lang1036 {\plain \f5\lang1036 +\par }{\plain \f5\lang1036 +\par }{\plain \f5\lang1036 +\par }{\plain \f5\lang1036 COMMUNICATION MECHANISM +\par }{\plain \f5\lang1036 +\par }\pard \qj {\plain \f5\lang1036 Processes may communicate and synchronize by a mechanism based on rendez-vous. It will be referred to as "alien call" in the following descrip\-tion. +\par }\pard {\plain \f5\lang1036 \tab An alien call is either:\tab +\par }{\plain \f5\lang1036 - a procedure call performed by a remote access to a process object, or\tab +\par }{\plain \f5\lang1036 - a call of a procedure which is a formal parameter of a process, or\tab +\par }\pard \ri-232 {\plain \f5\lang1036 - a call of a procedure which is a formal parameter of an alien-called pro}{\plain \f5\lang1036 \-ce\-du\-re (this is a recursive definition). +\par }\pard \qj {\plain \f5\lang1036 Every process object has an enable mask. It is defined as a subset of all procedures declared directly inside a process unit or any unit from its pre\-fix sequence (i.e. subset of all procedures that may be alien-called). + +\par }\pard \qj {\plain \f5\lang1036 A procedure is enabled in a process if it belongs to that process' enable mask. A procedure is disabled if it does not belong to the enable mask. +\par }{\plain \f5\lang1036 Immediately after generation of a process object its enable mask is empty (all procedures are }{\plain \f5\lang1036 disabled). +\par }\pard \qj {\plain \f5\lang1036 Semantics of the alien call is different from the remote call described in the report. Both the calling process and the process in which the proce\- +dure is declared (i.e. the called process) are involved in the alien call. This way the alien call may be us}{\plain \f5\lang1036 ed as a synchronization mechanism. +\par }\pard \qj {\plain \f5\lang1036 The calling process passes the input parameters and waits for the call to be completed. +\par }\pard \qj {\plain \f5\lang1036 The alien-called procedure is executed by the called process. Execution of the procedure will not begin before certai}{\plain \f5\lang1036 +n conditions are satisfied. First, the called process must not be suspended in any way. The only exception is that it may be waiting during the ACCEPT statement (see below). Se\-cond, the procedure must be enabled in the called process. +\par }\pard \qj {\plain \f5\lang1036 When the above two conditions are met the called process is interrupted and forced to execute the alien-called procedure (with parameters passed by the calling process). +\par }\pard \qj {\plain \f5\lang1036 Upon entry to the alien-called procedure all procedures become disabled in the called process. +\par }\pard \qj {\plain \f5\lang1036 Upo}{\plain \f5\lang1036 +n exit the enable mask of the called process is restored to that from before the call (regardless of how it has been changed during the execution of the procedure). The called process is resumed at the point of the inter\- +ruption. The execution of the ACCE}{\plain \f5\lang1036 PT statement is ended if the called pro\- +cess was waiting during the ACCEPT (see below). At last the calling process reads back the output parameters and resumes its execution after the call statement. +\par }\pard \qj {\plain \f5\lang1036 The process executing an alien-called procedure can }{\plain \f5\lang1036 easily be interrupted by another alien call if the enable mask is changed. +\par }\pard \qj {\plain \f5\lang1036 There are some new language constructs associated with the alien call mechanism. The following statements change the enable mask of a pro\-cess:\tab +\par }\pard \sb120\sa120 {\plain \f5\lang1036 \tab ENABLE p1, ..., pn\tab +\par }\pard \qj {\plain \f5\lang1036 enables the procedures with identifiers p1, ..., pn. If there are any proces\-ses waiting for an alien call of one of these procedures, one of them is cho\- +sen and its request is processed. The scheduling is done on a FIFO basis, so it is strongly fair. The}{\plain \f5\lang1036 statement}{\plain \f5\lang1036 :\tab +\par }\pard \sb120\sa120 {\plain \f5\lang1036 DISABLE p1, ..., pn \tab +\par }\pard {\plain \f5\lang1036 disables the procedures with identifiers p1, ..., pn. +\par }{\plain \f5\lang1036 In addition a special form of the RETURN statement:\tab +\par }\pard \sb120\sa120 {\plain \f5\lang1036 RETURN ENABLE p1, ..., pn DISABLE q1, ..., qn \tab +\par }\pard \qj {\plain \f5\lang1036 +allows to enable the procedures p1, ..., pn and disable the procedures q1,...,qn after the enable mask is restored on exit from the alien-called procedure. It is legal only in the alien-called procedures (the legality is not enforced by the compiler).} +{\plain \f5\lang1036 +\par }\pard \qj {\plain \f5\lang1036 A called process may avoid busy waiting for an alien call b}{\plain \f5\lang1036 y means of the ACCEPT statement:\tab +\par }\pard \sb120\sa120 {\plain \f5\lang1036 \tab ACCEPT p1, ..., pn \tab +\par }\pard \qj {\plain \f5\lang1036 adds the procedures p1, ..., pn to the current mask, and waits for an alien call of one of the currently enabled procedures. After the procedure return the enable mask is restored to that from before the ACCEPT statement. + +\par }\pard \qj {\plain \f5\lang1036 Note that the ACCEPT statement alone (i.e. without any ENABLE/DISABLE statements or options) provides a sufficient communi\- +cation mechanism. In this case the called process may execute the alien-called procedure only during the A}{\plain \f5\lang1036 +CCEPT statement (because otherwise all procedures are disabled). It means that the enable mask may be forgotten altogether and the alien call may be used as a pure totally synchronous rendez-vous. Other constructs are introduced to make partially asynchro +}{\plain \f5\lang1036 \-nous communication patterns possible. +\par }\pard \qj {\plain \f5\lang1036 +\par }{\plain \f5\lang1036 Below find a complete listing of a simple example - monitors. +\par }\pard {\plain \f5\lang1036 +\par }\pard\plain \s3\li567\sb240\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 \f7\fs20\lang1033 {\b program} monitors;\line \line +(* this an example showing 5 processes: two of them are in fact monitors, one controls the screen=ekran *)\line \line {\b unit} ANSI: {\b class}; \line (* CHECK whether config.sys contains a line\line device=ansi.sys\line + the class ANSI enables operations on cursor,\line and bold, blink, underscore etc. *) \line \line {\b unit} Bold : {\b procedure};\line {\b begin}\line write( chr(27), "[1m")\line {\b +end} Bold;\line \line {\b unit} Blink : {\b procedure};\line {\b begin}\line write( chr(27), "[5m")\line {\b end} Blink;\line \line {\b unit} Reverse : {\b procedure};\line {\b begin}\line write( chr(27), "[7m")\line {\b end} + Reverse;\line \line {\b unit} Normal : {\b procedure};\line {\b begin}\line write( chr(27), "[0m")\line {\b en}{\b d} Normal;\line \line {\b unit} Underscore : {\b procedure};\line {\b begin}\line write( chr(27), "[4m")\line {\b end +} Underscore;\line \line {\b unit} inchar : IIUWgraph {\b function} : integer;\line (*podaj nr znaku przeslanego z klawiatury *)\line {\b var} i : integer;\line {\b begin}\line {\b do}\line i := inkey;\line {\b if} i <> 0 {\b +then exit fi};\line {\b od};\line {\b result} := i;\line {\b end} inchar;\line \line {\b unit }NewPage : {\b procedure};\line {\b begin}\line write( chr(27), "[2J")\line {\b end} NewPage;\line \line {\b unit} SetCursor : {\b +procedure}(row, column : integer);\line {\b var} c,d,e,f : char,\line i,j : integer;\line {\b begin}\line i := row {\b div} 10;\line j := row {\b mod} 10;\line c := chr(48+i);\line d := chr(48+j);\line i := column {\b +div} 10;\line j := column {\b mod} 10;\line e := chr(48+i);\line f := chr(48+j);\line write( chr(27), "[", c, d, ";", e, f, "H")\line {\b end} SetCursor; \line {\b end} ANSI;\line \line \line {\b unit} monitor: {\b process} +(node:integer, size:integer,e: ekran);\line \line {\b var} buf: {\b arrayof} integer,\line nr,i,j,k1,k2,n1,n2: integer;\line \line \tab \line {\b unit }lire: {\b procedure}({\b output} k: integer);\line {\b begin}\line {\b +call} e.druk(13,2+nr*30+k1,0,k2);\line {\b call} e.druk(13,2+nr*30+(i-1)*6,1,buf(i));\line k1:=(i-1)*6;\line k:=buf(i);\line k2:=k;\line i:= (i {\b mod} size)+1;\line {\b if} i=j\line {\b then}\line {\b +call} e.printtext("i equal j")\line {\b fi}; \line {\b end} lire;\line \line {\b unit} ecrire: {\b procedure}(n:integer);\line {\b begin\line } {\b call} e.druk(13,2+nr*30+n1,0,n2);\line {\b call} + e.druk(13,2+nr*30+(j-1)*6,2,n);\line n1:=(j-1)*6;\line buf(j) := n;\line n2:=buf(j);\line j := (j{\b mod} size)+1;\line {\b if} i=j\line {\b then}\line {\b call} e.printtext("j equal i")\line {\b fi}; +\line {\b end} ecrire;\line {\b begin}\line {\b arra}{\b y} buf {\b dim}(1:size);\line nr := size - 4;\line {\b for} i := 1 {\b to} size\line {\b do}\line buf(i) := i+nr*4;\line {\b call} + e.druk(13,2+nr*30+(i-1)*6,0,buf(i));\line {\b od};\line i:=1; \line j := size;\line k1:=0;\line k2:=buf(1);\line n1:=(size-1)*6;\line n2:=buf(size);\line (* end initialize buffer *)\line {\b return};\line \line + {\b do}\line {\b accept} lire, ecrire\line {\b od}\line {\b end} monitor;\line \line {\b unit} prcs: {\b process}(node,nr:integer, mleft,mright:\line \tab \tab \tab \tab \tab \tab \tab monitor, e: ekran);\line {\b var} + l,o: integer;\line \line {\b begin}\line {\b call} e.SetCursor(8+(nr-1)*10,29);\line {\b if} nr = 1\line {\b then}\line {\b call} e.printtext("<-- p1 <--");\line {\b else}\line {\b call} e.printtext("--> p2 -->");\line { +\b fi; \line return;\line do}\line {\b call} mleft.lire(l) ;\line {\b call} e.druk(11+(nr-1)*4,31-(nr-1)*8,1,l);\line l:= l+1;\line {\b call} mright.ecrire(l) ; \line {\b call} e.druk(10+(nr-1)*6,23+(nr-1)*8,2,l); +\line {\b if} l {\b mod} 15 = 0 \line {\b then}\line o:= e.inchar;\line \tab {\b if} o = -79 {\b then call endrun fi};\line {\b fi};\tab \line {\b od};\line {\b end }prcs;\line +\par \pard \s3\li567\sb240\sa120\tx851\tx1134\tx1418\tx1701\tx1985\tx2268\tx2552\tqdec\tx2835\tqdec\tx3119 {\b unit} ekran : ANSI {\b process}(nrprocesora: integer);\line {\b unit }printtext{\b : procedure}(s:string);\line {\b begin}\line + write(s);\line {\b call} Normal;\line {\b end} printtext;\line \line {\b unit }druk: {\b procedure}(gdzieW,gdzieK,jak,co:integer);\line {\b begin}\line {\b call} SetCursor(gdzieW,gdzieK);\line write(" ");\line +{\b if} jak=0 {\b then call} Normal {\b else}\line {\b if} jak=1 {\b then call} Reverse{\b else}\line {\b if} jak=2 {\b then call} Bold \line {\b fi}\line {\b fi}\line {\b fi};\line write(co:3);\line +{\b call} Normal;\line {\b end} druk;\line \line {\b unit} print: {\b procedure} (i:integer);\line {\b begin}\line write(i:4)\line {\b end} print;\line {\b begin\line return};\line \line {\b do accept} inchar, \line + Normal,NewPage, SetCursor, Bold, Underscore,\line \tab Reverse, Blink, print, printtext, druk\line {\b od}\line {\b end} ekran;\line \line {\b var} m1,m2:monitor,\line e:ekran,\line p1,p2:prcs;\line \line {\b begin +} (* ----- HERE IS THE MAIN PROGRAM ----- *)\line (* create a configuration *)\line e:= {\b new} ekran(0);\line {\b resume}(e);\line {\b call} e.Normal;\line {\b call} e.NewPage;\line m1 := {\b new} monitor(0,4,e);\line m2 := {\b new} + monitor(0,5,e);\line \line p1 := {\b new} prcs(0,1,m2,m1,e);\line p2 := {\b new} prcs(0,2,m1,m2,e);\line \line {\b resume}(m1);\line {\b resume}(m2);\line {\b resume}(p1);\line {\b resume}(p2);\line {\b end} monitors; +\par \pard\plain \s254\sb840\sa480\keepn \b\f5\fs28\lang1036 {\plain \b\f5\lang1036 \page }References. +\par \pard\plain \fs20\lang1036 {\plain \f5\lang1036 +\par }\pard Bartol,W.M., et al.{\plain \f5\lang1036 +\par }{\i Report on the Loglan 82 programming Language,}{\plain \f5\lang1036 +\par }Warszawa-Lodz, PWN, 1984 +\par \pard {\f5 +\par }\pard O.-J. Dahl, B. Myhrhaug, K. Nygaard, \line {\i Simula 67 Common Base Language, \line }Norwegian Computing Center, Oslo, 1970 {\plain \lang1036 the mother of object languages!!} +\par \pard {\f5 +\par }\pard {\f5 Hoare C.A.R.\line }{\i\f5 Monitors, an operating system structuring concept. +\par }\pard {\f5 CACM,vol.17,N.10,October 1974,pp.549-57} +\par \pard +\par {\i Loglan'82 } +\par {\i User's guide} +\par Institute of Informatics, University of Warsaw 1983, 1988 +\par LITA, Universit\'e9 de Pau, 1993 +\par (distributed together with this package) +\par +\par A.Kreczmar, A.Salwicki, M. Warpechowski, +\par {\i Loglan'88 - Report on the Programming Language,} +\par Lecture Notes on Computer Science vol. 414, Springer Vlg, 1990, +\par ISBN 3-540-52325-1 +\par +\par /* if you can read polish, there is a good manual of Loglan */ +\par A.Szalas, J.Warpechowska, +\par {\i LOGLAN, } +\par Wydawnictwa Naukowo-Techniczne, Warszawa, 1991 ISBN 82-204-1295-1 +\par +\par \pard {\plain \lang1036 see also the Readings file of this distribution. +\par }{\plain \lang1036 +\par }} \ No newline at end of file diff --git a/doc/loglanmi.txt b/doc/loglanmi.txt new file mode 100644 index 0000000..12cc019 --- /dev/null +++ b/doc/loglanmi.txt @@ -0,0 +1,1374 @@ + + + + + + +A micro-manual + +of + +the programming language + + + + +L O G L A N - 82 + +Basic constructs and facilities + + + + + + + + + +Author: Antoni Kreczmar + + + + + + + + + + + + +Institute of Informatics, Warsaw University +March 1990 +edited by A.Salwicki LITA Pau November 1990 + +Table of contents + + +{TOC \o|1. Compound statements 4 +2. Modularity 8 +3. Procedures and functions 10 +4. Classes 13 +5. Adjustable arrays 16 +6. Coroutines and semicoroutines 19 +7. Prefixing 22 +8. Formal types 28 +9. Protection techniques 29 +10. Programmed deallocation 30 +11. Exception handling 32 +12. Concurrent processes. 33 +References. 40 +} +LOGLAN-82 is a universal programming language designed at the Institute of Informatics, University of Warsaw. Its syntax is patterned upon Pascal's. Its rich semantics includes the classical constructs and facilities offered by the Algol-family programming languages as well as more modern facilities, such as concurrency and exception handling. +The basic constructs and facilities of the LOGLAN-82 programming language include: +1) A convenient set of structured statements, +2) Modularity (with the possibility of module nesting and extending), +4) Classes (as a generalization of records) which enable to define complex structured types, data structures, packages, etc., +5) Adjustable arrays whose bounds are determined at run-time in such a way that multidimensional arrays may be of various shapes, e.g. triangular, k-diagonal, streaked, etc., +6) Coroutines and semi-coroutines, +7) Prefixing - the facility borrowed from Simula-67, substantially generalized in LOGLAN-82 - which enables to build up hierarchies of types and data structures, problem-oriented languages, etc., +8) Formal types treated as a method of module parametrization, +9) Module protection and encapsulation techniques, +10) Programmed deallocator - a tool for efficient and secure garbage collection, which allows the user to implement the optimal strategy of storage management, +11) Exception handling which provides facilities for dealing with run-time errors and other exceptional situations raised by the user, +12) Concurrency easily adaptable to any operating system kernel and allowing parallel programming in a natural and efficient way. + The language covers system programming, data processing, and numerical computations. Its constructs represent the state-of-art and are efficiently implementable. Large systems consisting of many cooperating modules are easily decomposed and assembled, due to the class concept and prefixing. + LOGLAN-82 constructs and facilities have appeared and evolved simultaneously with the experiments on the first pilot compiler (implemented on Mera-400 Polish minicomputer). The research on LOGLAN-82 implementation engendered with new algorithms for static semantics, context analysis, code generation, data structures for storage management etc. +The LOGLAN-82 compiler provides a keen analysis of syntactic and semantic errors at compilation as well as at run time. The object code is very efficient with respect to time and space. The completeness of error checking guarantees full security and ease of program debugging. +1. Compound statements + Compound statements in LOGLAN-82 are built up from simple statements (like assignment statement e.g. x:=y+0.5, call statement e.g. call P(7,x+5) etc.) by means of conditional, iteration and case statements. + The syntax of conditional statement is as follows: + if boolean expression + then + sequence of statements + else + sequence of statements + fi +where "else part" may be omitted: + if boolean expression + then + sequence of statements + fi + The semantics of conditional statement is standard. The keyword fi allows to nest conditional statements without appearence of "dangling else" ambiguity. + +Example: + if delta>0 + then + x2:=sqrt(delta)/a/2; + if b=0 + then + x1:=x2 + else + x1:=-b/a/2+x2; x2:=x1-2*x2 + fi + else + if delta=0 + then + x1:=-b/a/2; x2:=x1 + else + write(" no real roots") + fi + fi + The statements in a sequence of statements are separated with semicolons (semicolon may end a sequence , and then, the last statement in the sequence is the empty statement). + The short circuit control forms are realized in LOGLAN-82 by the conditional statements with orif (or andif) list. A conditional statement with orif list has the form: orif + if wb1 orif wb2 ... orif wbk + then + sequence of statements + else + sequence of statements + fi +and corresponds somehow to a conditional statement: + if wb1 or wb2 ... or wbk + then + sequence of statements + else + sequence of statements + fi + The above conditional statement (without orif list) selects for execution one of two sequences of statements, depending on the truth value of the boolean expression: +wb1 or wb2 or ... wbk +which is always evaluated till the end. For the execution of the conditional statement with orif list the specified conditons wb1,...,wbk are evaluated in succession, until the first one evaluates to true. Then the rest of the sequence wb1,...,wbk is abandoned and "then part" is executed. If none of the conditions wb1,...,wbk evaluates to true "else part" is executed (if any). + Conditional statements with orif list facilitate to program those con_ditions, which evaluation to the end may raise a run-time error. +Example: + The execution of the statement: +if i>n or A(i)=0 then i:=i-1 else A(i):=1 fi +where the value of i is greater than n, and A is an array with upper bound n, will raise the run-time error. Then the user can write: +if i>n orif A(i)=0 then i:=i-1 else A(i):=1 fi +what allows to avoid this run-time error and probably agrees with his intension. + Conditional statement with andif list has the form: + if wb1 andif wb2 ... andif wbk + then + sequence of statements + else + sequence of statements + fi + For the execution of this kind of statements, the conditions wb1,...,wbk are evaluated in succession, until the first one evaluates to false; then "else part" (if any) is executed. Otherwise "then part" is executed. +Iteration statement in LOGLAN-82 has the form: +do sequence of statements od +An iteration statement specifies repeated execution of the sequence of statements and terminates with the execution of the simple statement exit + +Example: + s:=1; t:=1; i:=1; + do + i:=i+1; t:=t*x/i; + if abs(t) < 1.0E-10 then exit fi; + s:=s+t + od; + If two iteration statements are nested, then double exit in the inner one terminates both of them. +Example: +r,x:=0; +do + s,t:=1; i:=1; x:=x+0.2; + do + i:=i+1; t:=t*x/i; + if i > n then exit exit fi; (* termination of both loops *) + if t < 1 then exit fi; (* termination of the inner loop *) + s:=s+t + od +od + In the example above simultaneous assignment statements are illustrated (e.g. r,x:=0) and comments, which begin with a left parenthesis immediately followed by an asterisk and end with an asterisk immediately followed by a right parenthesis. + Triple exit terminates three nested iteration statements, four exit terminates four nested iteration statements etc. +The iteration statement with while condition: while + while boolean expression + do + sequence of statements + od +is equivalent to: + do + if not boolean expression then exit fi; + sequence of statements + od + The iteration statements with controlled variables (for statements) have the forms: + for j:=wa1 step wa2 to wa3 + do + sequence of statements + od +or + for j:=wa1 step wa2 downto wa3 + do + sequence of statements + od + The type of the controlled variable j must be discrete. The value of this variable in the case of the for statement with to is increased, and in the case of the for statement with downto is decreased. The discrete range begins with the value of wa1 and changes with the step equal to the value of wa2. The execution of the for statement with to terminates when the value of j for the first time becomes greater than the value of wa3 (with downto when the value of j for the first time becomes less than the value of wa3). After the for statement termination the value of its controlled variable is determined and equal to the first value exceeding the specified discrete range. The values of expressions wa1, wa2 and wa3 are evaluated once, upon entry to the iteration statement. Default value of wa2 is equal 1 (when the keyword step and expression wa2 are omitted). + For or while statements may be combined with exit statement. + +Example: + for j:=1 to n + do + if x=A(j) then exit fi; + od + The above iteration statement terminates either for the least j, 1<=j<=n, such that x=A(j) or for j=n+1 when x=/=A(j), j=1,...,n. + To enhance the user's comfort, the simple statement repeat is provided. It may appear in an iteration statement and causes the current iteration to be finished and the next one to be continued (something like jump to CONTINUE in Fortran's DO statements). +Example: + i:=0; s:=0; + do + i:=i+1; + if A(i)<0 then repeat fi; (* jump to od,iterations are contd.*) + if i > m then exit fi; (* iteration statement is terminated*) + s:=s+sqrt(A(i)); + od; + Just as exit, repeat may appear in for statement or while statement. Then the next iteration begins with either the evaluation of a new value of the controlled variable (for statement) or with the evaluation of the condition (while statement). + Case statement in LOGLAN-82 has the form: + case WA + when L1 : I1 + when L2 : I2 + ... + when Lk : Ik + otherwise I + esac +where WA is an expression , L1,...,Lk are constants and I1,..., Ik,I are sequences of statements. + A case statement selects for execution a sequence of statements Ij, 1{SYMBOL 163 \f "Symbol"}j{SYMBOL 163 \f "Symbol"}k, where the value of WA equals Lj. The choice otherwise covers all values (possibly none) not given in the previous choices. The execution of a case statement chooses one and only one alternative (since the choices are to be exhaustive and mutually exclusive). +2. Modularity + Modular structure of the language is gained due to the large set of means for module nesting and extending. Program modules (units) are blocks, procedures, functions, classes, coroutines and processes. Block is the simplest kind of unit. Its syntax is the following: + block + lists of declarations + begin + sequence of statements + end + The sequence of statements commences with the keyword begin (it may be omitted when this sequence is empty). The lists of declarations define the syntactic entities (variables, constants, other units), whose scope is that block. The syntactic entities are identified in the sequence of statements by means of names (identifiers). + +Example: + block + const n=250; + var x,y:real, i,j,k: integer, b: boolean; + const m=n+1; + begin + read(i,j); (* read two integers *) + x,y:=n/(i+j); (* simultaneous assignment *) + read(c) ; (* read a character *) + b:= c = 'a'; (* 'a' a character *) + for k:= 1 to m + do + write(x+y/k:10:4); (* print the value of x+y/k in the + field of 10 characters, 4 digits after the point *) + od + end + In the lists of declarations semicolons terminate the whole lists, not the lists elements. Any declaration list must begin with the pertinent keyword (var for variables, const for constants etc.). The value of an expression defining a constant must be determinable statically (at compilation time). + Program in LOGLAN-82 may be a block or alternatively may be of the following form: + program name; + lists of declarations + begin + sequence of statements + end + Then the whole program can be identified by that name (the source as well as the object code). + A block can appear in the sequence of statements (of any unit), thus it is a statement. (Main block is assumed to appear as a statement of the given job control language.) + For the execution of a block statement the object of block is created in a computer memory, and then, the sequence of statements is performed. The syntactic entities declared in the block are allocated in its object. After a block's termination its object is automatically deallocated (and the corresponding space may be immediately reused). + The modular structure of the language works "in full steam" when not only blocks, but the other kinds of units are also used. They will be described closer in the following points. + Unit nesting allows to build up hierarchies of units and supports security of programming. It follows from the general visibility rules; namely, a syntactic entity declared in an outer unit is visible in an inner one (unless hidden by an inner declaration). On the other hand, a syntactic entity declared in an inner unit is not visible from an outer one. + +Example: + program test; + var a,b,c:real, i,j,k:integer; + begin + read(a,b,c,i); + block + var j,k:real; + begin + j:=a; k:=j+b; write(" this is the inner block ",j,k) + end; + write(" this is the outer block ",i,a:20) + end; + In this program, first the main block statement is executed (with variables a,b,c,i,j,k). Next, after the read statement, the inner block statement is executed (with variables j,k). In the inner block the global variables j,k are hidden by the local ones. +3. Procedures and functions + Procedures and functions are well-known kinds of units. Their syntax is modelled on Pascal's, though with some slight modifications. Procedure (function) declaration consists of a specification part and a body. + +Example: + unit Euclid: function(i,j:integer):integer; + var k:integer; + begin + do + if j=0 then exit fi; + k:=i mod j; i:=j; j:=k + od; + result:=i + end; + Procedure or function specification begins with its identifier preceded by the keyword unit. (The same syntax concerns any other module named unit.) Then follows its kind declaration, its formal parameters (if any), and the type of the returned value (only for functions). A body consists of declaration lists for local entities and a sequence of statements. The keyword begin commences the sequence of statements, and is omitted, if this sequence is empty. The value returned by a function equals to the most recent value of the standard variable "result", implicitly declared in any function. This variable can be used as a local auxiliary variable as well. + +Example: + unit Newton: function(n,m:integer):integer; + var i:integer; + begin + if m > n then return fi; + result:=n; + for i:=2 to m do result:=result*(n-i+1) div i od + end Newton; + The optional identifier at the end of a unit must repeat the identifier of a unit. It is suggested that the compilers check the order of unit nesting, so these optional occurrences of identifiers would facilitate program debugging. + All the local variables of a unit are initialized (real with 0.0, integer with 0, boolean with false etc.). Thus , for instance, the value of function Newton is 0 for m>n, since "result" is also initialized, as any other local variable. + The return statement (return) completes the execution of a procedure (function) body,i.e. return is made to the caller. If return does not appear explicitly, return is made with the execution of the final end of a unit. Upon return to the caller the procedure (function) object is deallocated. + Functions are invoked in expressions with the corresponding list of actual parameters. Procedures are invoked by call statement (also with the corresponding list of actual parameters). + +Example: + i:=i*Euclid(k,105)-Newton(n,m+1); + call P(x,y+3); + Formal parameters are of four categories: variable parameters, procedure parameters, function parameters and type parameters (cf p.8). Variable parameters are considered local variables to the unit. A variable parameter has one of three transmission modes: input, output or inout. If no mode is explicitly given the input mode is assumed. For instance in the unit declaration: + unit P: procedure(x,y:real,b:boolean; + output c:char,i:integer;inout :integer); +x,y,b are input parameters , c,i are output parameters , and j is inout parameter. + Input parameter acts as a local variable whose value is initialized by the value of the corresponding actual parameter. Output parameter acts as a local variable initialized in the standard manner (real with 0.0, integer with 0, boolean with false etc.). Upon return its value is assigned to the corresponding actual parameter, in which case it must be a variable. However the address of such an actual parameter is determined upon entry to the body. Inout parameter acts as an input parameter and output parameter together. + +Example: + unit squareeq: procedure(a,b,c:real;output xr,xi,yr,yi:real); + (* given a,b,c the procedure solves square equation : + ax*x+bx+c=0. + xr,xi- real and imaginary part of the first root + yr,yi- real and imaginary part of the second root *) + var delta: real; + begin (*a=/=0*) + a:=2*a; c:=2*c; delta:=b*b-a*c; + if delta <= 0 + then + xr,yr:=-b/a; + if delta=0 then return fi; (*xi=yi=0 by default*) + delta:=sqrt(-delta); + xi:=delta/a; yi:=-xi; + return + fi; + delta:=sqrt(delta); + if b=0 + then + xr:=delta/a; yr:=-xr; + return + fi; + if b>0 then b:=b+delta else b:=b-delta fi; + xr:=-b/a; yr:=-c/b; + end squareeq; + A procedure call to the above unit may be the following: + call squareeq(3.75*H,b+7,3.14,g,gi,h,hi); +where g,h,gi,hi are real variables. + No restriction is imposed on the order of declarations. In particular, recursive procedures and functions can be declared without additional announcements (in contrast to Pascal). +Example: + For two recursive sequences defined as: + a(n)=b(n-1)+n+2 n>0 + b(n)=a(n-1)+(n-1)*n n>0 + a(0)=b(0)=0 +one can declare two functions: + unit a: function(n:integer):integer; + begin + if n>0 then result:=b(n-1)+n+2 fi + end a; + unit b: function(n:integer):integer; + begin + if n>0 then result:=a(n-1)+(n-1)*n fi + end b; +and invoke them: + k:=a(100)*b(50)+a(15); + Functions and procedures can be formal parameters as well. + +Example: +unit Bisec: procedure(a,b,eps:real;output x:real;function f(x:real):real); +(*this procedures searches for zero of the continous function f in the segment (a,b) *) +var h:real,s:integer; +begin + s:=sign(f(a)); + if sign(f(b))=s then return fi; (* wrong segment *) + h:=b-a; + do + h:=h/2; x:=a+h; + if h < eps then return fi; + if sign(f(x))=s then a:=x else b:=x fi + od +end Bisec; +In the above declaration, after the input variable parameters a,b,eps and the output variable parameter x, a function parameter f appears. Note that its specification part is complete. Thus the check of actual-formal parameter compatibility is possible at compilation time. Making use of this syntactic facility is not possible in general, if a formal procedure (function) is again a formal parameter of a formal procedure (function). The second degree of formal procedures (functions) nesting is rather scarce, but LOGLAN-82 admits such a construct. Then formal procedure (function) has no specification part and the full check of actual-formal parameter compatibility is left to be done at run time. + +Example: + unit P: procedure(j:integer; procedure G (i:integer; + procedure H)); + ... + begin + ... + call G(j,P); + end P; + Procedure G is a first degree parameter, therefore it occurs with complete specification part. Procedure H is a second degree parameter and has no specification part. In this case a procedure call can be strongly recursive: + call P(i+10,P); +4. Classes + Class is a facility which covers such programming constructs as structured type, package, access type, data structure etc. To begin with the presentation of this construct, let us consider a structured type assembled from primitive ones: + unit bill: class; + var dollars :real, + not_paid :boolean, + year,month,day :integer; + end bill; + The above class declaration has the attributes : dollars (real), not_paid (boolean), and year,month,day (integer). Wherever class bill is visibile one can declare variables of type bill: + var x,y,z: bill; + The values of variables x, y, z can be the addresses of objects of class bill. These variables are called reference variables. With reference variable one can create and operate the objects of reference variable type. + An object of a class is created by the class generation statement (new), and thereafter, its attributes are accessed through dot notation. + x:=new bill; (* a new object of class bill is created *) + x.dollars:=500.5; (* define amount *) + x.year:=1982; (* define year *) + x.month:=3; (* define month *) + x.day:=8; (* define day *) + y:=new bill; (* create a new object *) + y.not_paid:=true; (* bill not_paid *) + z:=y; (* variable z points the same object as y *) + If an object of class bill has been created (new bill) and its address has been assigned to variable x (x:=new bill), then the attributes of that object are accessible through dot notation (remote access). The expression x.dollars gives , for instance, the remote access to attribute dollars of the object referenced by x. All attributes of class objects are initialized as usual. For the above example the object referenced by x, after the execution of the specified sequence of statements, has the following structure: + + ÚÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ + ³ 500.5 ³ dollars + ÃÄÄÄÄÄÄÄÄÄÄÄÄÄ´ + ³ false ³ not_paid + ÃÄÄÄÄÄÄÄÄÄÄÄÄÄ´ + ³ 1982 ³ year + ÃÄÄÄÄÄÄÄÄÄÄÄÄÄ´ + ³ 3 ³ month + ÃÄÄÄÄÄÄÄÄÄÄÄÄÄ´ + ³ 8 ³ day + ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÙ + + The object referenced by y and z has the following structure: + + ÚÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ + ³ 0 ³ dollars + ÃÄÄÄÄÄÄÄÄÄÄÄÄÄ´ + ³ true ³ not_paid + ÃÄÄÄÄÄÄÄÄÄÄÄÄÄ´ + ³ 0 ³ year + ÃÄÄÄÄÄÄÄÄÄÄÄÄÄ´ + ³ 0 ³ month + ÃÄÄÄÄÄÄÄÄÄÄÄÄÄ´ + ³ 0 ³ day + ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÙ + The value none is the default initial value of any reference variable and denotes no object. A remote access to an attribute of none raises a run time error. + Class may have also formal parameters (as procedures and functions). Kinds and transmission modes of formal parameters are the same as in the case of procedures. + + + +Example: + unit node: class (a:integer); + var left,right:node; + end node; + Let, for instance, variables z1, z2, z3 be of type node. Then the sequence of statements: + z1:=new node(5); + z2:=new node(3); + z3:=new node(7); + z1.left:=z2; z1.right:=z3; + creates the structure: + + ÚÄÄÄÄÄÄÄÄÄ¿ + z1ÄÄÄÄÄÄ´ 5 ³ + ÃÄÄÄÄÄÄÄÄÄ´ + ÚÄÄÄÄÄÄ´ left ³ + ³ ÃÄÄÄÄÄÄÄÄÄ´ + ³ ³ right ÃÄÄÄÄÄÄÄÄ¿ + ³ ÀÄÄÄÄÄÄÄÄÄÙ ³ + ³ ³ + ÚÄÄÄÄÁÄÄÄÄÄ¿ ÚÄÄÄÄÄÁÄÄÄÄ¿ +z2ÄÄÄÄÄ´ 3 ³ ³ 7 ÃÄÄÄÄÄÄz3 + ÃÄÄÄÄÄÄÄÄÄÄ´ ÃÄÄÄÄÄÄÄÄÄÄ´ + ³ none ³ ³ none ³ + ÃÄÄÄÄÄÄÄÄÄÄ´ ÃÄÄÄÄÄÄÄÄÄÄ´ + ³ none ³ ³ none ³ + ÀÄÄÄÄÄÄÄÄÄÄÙ ÀÄÄÄÄÄÄÄÄÄÄÙ + +where arrows denote the values of the reference variables. + Class may also have a sequence of statements (as any other unit). That sequence can initialize the attributes of the class objects. + +Example: + unit complex:class(re,im:real); + var module:real; + begin + module:=sqrt(re*re+im*im) + end complex; + Attribute module is evaluated for any object generation of class complex: + z1:=new complex(0,1); (* z1.module equals 1 *) + z2:=new complex(2,0); (* z2.module equals 2 *) + For the execution of a class generator, first a class object is created, then the input parameters are transmitted , and finally, the sequence of statements (if any) is performed. Return is made with the execution of return statement or the final end of a unit. Upon return the output parameters are transmitted. + Procedure object is automatically deallocated when return is made to the caller. Class object is not deallocated , its address can be assigned to a reference variable, and its attributes can be thereafter accessed via this variable. + The classes presented so far had only variable attributes. In general, class attributes may be also other syntactic entities, such as constants, procedures, functions, classes etc. Classes with procedure and function attributes provide a good facility to define data structures. + +Example: +A push_down memory of integers may be implemented in the following way: + unit push_down :class; + unit elem:class(value:integer,next:elem); + (* elem - stack element *) + end elem; + var top:elem; + unit pop: function :integer; + begin + if top=/= none + then + result:=top.value; top:=top.next + fi; + end pop; + unit push:procedure(x:integer); (* x - pushed integer *) + begin + top:=new elem(x,top); + end push; + end push_down; + Assume that somewhere in a program reference variables of type push_down are declared (of course, in place where push_down is visibile): + var s,t,z:push_down; + Three different push_down memories may be now generated: + s:=new push_down(100); t:=new push_down(911); z:=new push_down(5); + One can use these push_down memories as follows: + call s.push(7); (* push 7 to s *) + call t.push(1); (* push 1 to t *) + i:=z.pop; (* pop an element from z *) + etc. +5. Adjustable arrays + In LOGLAN-82 arrays are adjustable at run time. They may be treated as objects of specified standard type with index instead of identifier selecting an attribute. An adjustable array should be declare somewhere among the lists of declarations and then may be generated in the sequence of statements. + +Example: + block + var n,j:integer; + var A:arrayof integer; (* here is the declaration of A *) + begin + read(n); + array A dim (1:n); (* here is the generation of A *) + for i:=1 to n + do + read(A(i)); + od; + (* etc.*) + end + A variable A is an array variable. Its value should be the reference to an integer array, i.e. a composite object consisting of integer components each one defined by an integer index. +Array generation statement: + array A dim (1:n); +allocates a one-dimensional integer array with the index bounds 1,n , and assigns its address to variable A. +The figure below illustrates this situation: + + ÚÄÄÄÄÄÄÄÄ¿ ÚÄÄÄÄÄÄÄÄÄ¿ + ³ ³ ³ A(1) ³ + ³ ³ ÃÄÄÄÄÄÄÄÄÄ´ + ³ ... ³ ³ A(2) ³ + ÃÄÄÄÄÄÄÄÄ´ ÃÄÄÄÄÄÄÄÄÄ´ + ³ n ³ ³ ³ + ÃÄÄÄÄÄÄÄÄ´ ³ ... ³ + ³ j ³ ³ ³ + ÃÄÄÄÄÄÄÄÄ´ ÃÄÄÄÄÄÄÄÄÄ´ + ³ A ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ A(n) ³ + ÀÄÄÄÄÄÄÄÄÙ ÀÄÄÄÄÄÄÄÄÄÙ + Block object Array object + +A general case of array generation statement has the form: + array A dim (lower:upper) +where lower and upper are arithmetic expressions which define the range of the array index. +Example: + Two-dimensional array declaration : + var A: arrayof arrayof integer; +and generation: + array A dim (1:n) + for i:=1 to n do array A(i) dim (1:m) od; +create the structure: + ÚÄÄÄÄÄÄÄÄ¿ + ³ A(1,1) ³ + ÃÄÄÄÄÄÄÄÄ´ + ³ ³ + ³ ... ³ + ³ ³ + ÚÄÄÄÄÄÄÄÄÄÄ¿ ÃÄÄÄÄÄÄÄij + ³ A(1) ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ A(1,m) ³ + ³ÄÄÄÄÄÄÄÄÄÄ´ ÀÄÄÄÄÄÄÄÄÙ + ³ ³ + ³ ... ³ + ³ ³ + ÃÄÄÄÄÄÄÄÄÄÄ´ ÚÄÄÄÄÄÄÄÄ¿ + ³ A(n) ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ A(n,1) ³ + ÀÄÄÄÄÄÄÄÄÄÄÙ ÃÄÄÄÄÄÄÄÄ´ + ³ ³ + ³ ... ³ + ³ ³ + ÃÄÄÄÄÄÄÄÄ´ + ³ A(n,m) ³ + ÀÄÄÄÄÄÄÄÄÙ + + block + var i,j:integer, A,B: arrayof arrayof real, n:integer; + begin + read(n); + array A dim (1:n); + for i:=1 to n do array A(i) dim (1:n) od; + (* A is square array *) + array B dim (1:n); + for i:=1 to n do array B(i) dim(1:i) od; + (* B is lower triangular array *) + A(n,n):=B(n,n); + B(1):=A(1); + B(1):=copy(A(1)); + end + Array A is the square array n by n. Each element A(i) , 1{SYMBOL 163 \f "Symbol"}i{SYMBOL 163 \f "Symbol"}n contains the address of row A(i,j), 1{SYMBOL 163 \f "Symbol"}j{SYMBOL 163 \f "Symbol"}n. Array B is the lower-triangular array. Each element B(i), 1{SYMBOL 163 \f "Symbol"}i{SYMBOL 163 \f "Symbol"}n, contains the address of row B(i,j), 1{SYMBOL 163 \f "Symbol"}j{SYMBOL 163 \f "Symbol"}i. Thus an assignment statement A(n,n):=B(n,n) transmits real value B(n,n) to real variable A(n,n). Assignment B(1):=A(1) transmits the address of the first row of A to variable B(1). Finally assignment B(1):=copy (A(1)) creates a copy of the first row of A and assigns its address to B(1). + Upper and lower bounds of an adjustable array A are determined by standard operators lower(A) and upper(A). + +Example: + unit sort: procedure(A:arrayof integer); + (* insertion sort *) + var n,i,j:integer; var x:integer; + begin + n:=upper(A); (* assume lower bound is 1 *) + for i:=2 to n + do + x:=A(i); j:=i-1; + do + if x >= A(j) then exit fi; + A(j+1):=A(j); j:=j-1; + if j=0 then exit fi; + od; + A(j+1):=x + od; + end sort; + If an array variable A refers to no array its value is equal none (the standard default value of any array variable). An attempt to access an array element (e.g. A(i)) or a bound (e.g. lower(A)), where A is none, raises a run time error. +6. Coroutines and semicoroutines + Coroutine is a generalization of class. A coroutine object is an object such that the execution of its sequence of statements can be suspended and reactivated in a programmed manner. Consider first a simple class with a sequence of statements such that after return some non-executed statements remain. The generation of its object terminates with the execution of return statement, although the object can be later reactivated. If such a class is declared as a coroutine, then its objects may be reactivated. This can be realized by attach statement: + attach(X) +where X is a reference variable designating the activating coroutine object. + In general, since the moment of generation a coroutine object is either active or suspended. Any reactivation of a suspended coroutine object X (by attach(X)) causes the active coroutine object to be suspended and continues the execution of X from the statement following the last executed one. +Main program is also a coroutine. It is accessed through the standard variable main and may be reactivated (if suspended) by the statement attach(main). + +Example: +In the example below the cooperation of two coroutines is presented. One reads the real values from an input device, another prints these values in columns on a line-printer, n numbers in a line. The input stream ends with 0. +program prodcons; + var prod:producer,cons:consumer,n:integer,mag:real,last:bool; + unit producer: coroutine; + begin + return; + do + read(mag); (* mag- nonlocal variable, common store *) + if mag=0 + then (* end of data *) + last:=true; + exit + fi; + attach(cons); + od; + attach(cons) + end producer; + unit consumer: coroutine(n:integer); + var Buf:arrayof real; + var i,j:integer; + begin + array Buf dim(1:n); + return; + do + for i:=1 to n + do + Buf(i):=mag; + attach(prod); + if last then exit exit fi; + od; + for i:=1 to n + do (* print Buf *) + write(' ',Buf(i):10:2) + od; + writeln; + od; + (* print the rest of Buf *) + for j:=1 to i do write(' ',Buf(j):10:2) od; + writeln; + attach(main); + end consumer; + begin + prod:=new producer; + read(n); + cons:=new consumer(n); + attach(prod); + writeln; + end prodcons; + The above task could be programmed without coroutines at all. The presented solution is, however, strictly modular, i.e. one unit realizes the input process, another realizes the output process, and both are ready to cooperate with each other. + LOGLAN-82 provides also a facility for the semi-coroutine operations. This is gained by the simple statement detach. If X is the active coroutine object, then detach reactivates that coroutine object at where the last attach(X) was executed. This statement meets the need for the asymetric coroutine cooperations. (by so it is called semi-coroutine operation). Operation attach requires a reactivated coroutine to be defined explicitly by the user as an actual parameter. Operation detach corresponds in some manner to return in procedures. It gives the control back to a coroutine object where the last attach(X) was executed, and that coroutine object need not be known explicitly in X. This mechanism is, however, not so secure as the normal control transfers during procedure calls and returns. + In fact, the user is able to loop two coroutines traces by : + attach(Y) in X attach(X) in Y +Then detach in X reactivates Y, detach in Y reactivates X. + In the example below the application of detach statement is illustrated. +Example: +program reader_writers; +(* In this example a single input stream consisting of blocks of numbers, each ending with 0, is printed on two printers of different width. The choice of the printer is determined by the block header which indicates the desired number of print columns. The input stream ends with a double 0. m1 - the width of printer_1, m2 - the width of printer_2 *) + const m1=10,m2=20; + var reader:reading,printer_1,printer_2:writing; + var n:integer,new_sequence:boolean,mag:real; + + unit writing:coroutine(n:integer); + var Buf: arrayof real, i,j:integer; + begin + array Buf dim (1:n); (* array generation *) + return;(* return terminates coroutine initialization *) + do + attach(reader); (* reactivates coroutine reader *) + if new_sequence + then + (* a new sequence causes buffer Buf to be cleared up *) + for j:=1 to i do write(' ',Buf(j):10:2) od; + writeln; + i:=0; new_sequence:=false; attach(main) + else + i:=i+1; Buf(i):=mag; + if i=n + then + for j:=1 to n do write(' ',Buf(j):10:2) od; + writeln; + i:=0; + fi + fi + od + end writing; + unit reading: coroutine; + begin + return; + do + read(mag); + if mag=0 then new_sequence:=true; fi; + detach; + (* detach returns control to printer_1 or printer_2 depending which one reactivated the reader *) + od + end reading; + begin + reader:=new reading; + printer_1:=new writing(m1); printer_2:=new writing(m2); + do + read(n); + case n + when 0: exit + when m1: attach(printer_1) + when m2: attach(printer_2) + otherwise write(" wrong data"); exit + esac + od + end; + + Coroutines play the substantial role in process simulation. Class Simulation provided in Simula-67 makes use of coroutines at most degree. LOGLAN-82 provides for easy simulation as well. The LOGLAN-82 class Simulation is implemented on a heap what gives lg(n) time cost (in contrast with O(n) cost of the original implementation). It covers also various simulation problems of large size and degree of complexity. +7. Prefixing + Classes and prefixing are ingenius inventions of Simula-67(cf [1]). Unfortunately they were hardly ever known and, perhaps, by this have not been introduced into many programming language that gained certain popularity. Moreover, implementation constraints of Simula-67 bind prefixing and classes workableness to such a degree that both facilities cannot be used in all respects. We hope that LOGLAN-82, adopting merits and rooting up deficiencies of these constructs, will smooth their variations and vivify theirs usefulness. + What is prefixing ? First of all it is a method for unit extending. Consider the simplest example: + unit bill: class; + var dollars :real, + not_paid :boolean, + year,month,day :integer; + end bill; +Assume the user desires to extend this class with new attributes. Instead of writing a completely new class, he may enlarge the existing one: + unit gas_bill:bill class; + var cube_meters: real; + end gas_bill; + Class gas_bill is prefixed by class bill. This new declaration may appear anywhere within the scope of declaration of class bill. (In Simula-67 such a prefixing is forbidden in nested units.) Class gas_bill has all the attributes of class bill and additionally its own attributes (in this case the only one: cube_meters). The generation statement of this class has the form: +z:=new gas_bill; +where z is a reference variable of type gas_bill. Remote access to the attributes of prefixed class is standard: +z.dollars:=500.5; z.year:=1982; z.month:=3; z.day:=8; +z.cube_meters:=100000; + +Consider now the example of a class with parameters. +Assume that in a program a class: +unit id_card: class(name:string,age:integer); +end id_card; +and its extension: +unit idf_card:id card class(first name:string); +end idf_card; +are declared. + Then for variable z of type id_card and variable t of type idf_card the corresponding generation statement may be the following: + z:=new id_card("kreczmar",37); + t:=new idf_card("Kreczmar",37,"Antoni"); +Thus the formal parameters of a class are concatenated with the formal parameters of its prefix. +One can still extend class idf_card. For instance: + unit idr_card:idf_card class; + var children_number:integer; + var birth_place:string; + end idr_card; + Prefixing allows to build up hierarchies of classes. Each one hierarchy has a tree structure. A root of such a tree is a class without prefix. One class is a successor of another class iff the first is prefixed by the latter one. + + Consider the prefix structure: + A + . . . + . . . + . . . + B. .C .D + . + . + .E + . + . + .F + . . + . . + G. .H + Class H has a prefix sequence A, B, E, F, H. Let a, b, ... , h denote the corresponding unique attributes of classes A, B, ... , H, respectively. The objects of these classes have the following forms: + + ÚÄÄÄÄÄÄÄÄÄÄ¿ ÚÄÄÄÄÄÄÄÄÄÄ¿ ÚÄÄÄÄÄÄÄÄÄÄ¿ ÚÄÄÄÄÄÄÄÄÄÄ¿ + ³ a ³ ³ a ³ ³ a ³ ³ a ³ + ÀÄÄÄÄÄÄÄÄÄÄÙ ÃÄÄÄÄÄÄÄÄÄÄ´ ÃÄÄÄÄÄÄÄÄÄÄ´ ÃÄÄÄÄÄÄÄÄÄÄ´ + object A ³ b ³ ³ c ³ ³ d ³ + ÀÄÄÄÄÄÄÄÄÄÄÙ ÀÄÄÄÄÄÄÄÄÄÄÙ ÀÄÄÄÄÄÄÄÄÄÄÙ + object B object C object D + ÚÄÄÄÄÄÄÄÄÄÄ¿ ÚÄÄÄÄÄÄÄÄÄÄ¿ ÚÄÄÄÄÄÄÄÄÄÄ¿ ÚÄÄÄÄÄÄÄÄÄÄ¿ + ³ a ³ ³ a ³ ³ a ³ ³ a ³ + ÃÄÄÄÄÄÄÄÄÄÄ´ ÃÄÄÄÄÄÄÄÄÄÄ´ ÃÄÄÄÄÄÄÄÄÄÄ´ ÃÄÄÄÄÄÄÄÄÄÄ´ + ³ b ³ ³ b ³ ³ b ³ ³ b ³ + ÃÄÄÄÄÄÄÄÄÄÄ´ ÃÄÄÄÄÄÄÄÄÄÄ´ ÃÄÄÄÄÄÄÄÄÄÄ´ ÃÄÄÄÄÄÄÄÄÄÄ´ + ³ e ³ ³ e ³ ³ e ³ ³ e ³ + ÀÄÄÄÄÄÄÄÄÄÄÙ ³ÄÄÄÄÄÄÄÄÄÄ´ ÃÄÄÄÄÄÄÄÄÄÄ´ ÃÄÄÄÄÄÄÄÄÄÄ´ + object E ³ f ³ ³ f ³ ³ f ³ + ÀÄÄÄÄÄÄÄÄÄÄÙ ÃÄÄÄÄÄÄÄÄÄÄ´ ÃÄÄÄÄÄÄÄÄÄÄ´ + object F ³ g ³ ³ h ³ + ÀÄÄÄÄÄÄÄÄÄÄÙ ÀÄÄÄÄÄÄÄÄÄÄÙ + object G object H + +Let Ra, Rb,..., Rh denote reference variables of types A, B,..., H, respectively. Then the following expressions are correct: + Ra.a, Rb.b, Rb.a, Rg.g, Rg.f, Rh.h, Rh.f, Rh.e, Rh.b, Rh.a etc. +Variable Ra may designate the object of class B (or C,..., H), i.e. the statement: + Ra:=new B +is legal. But then attribute b is not accessible through dot via Ra, i.e. Ra.b is incorrect. This follows from insecurity of such a remote access. In fact, variable Ra may point any object of a class prefixed by A, in particular, Ra may point the object of A itself, which has no attribute b. If Ra.b had been correct, a compiler should have distiguish the cases Ra points to the object of A or not. But this, of course, is undistinguishable at compilation time. + To allow, however, the user's access to attribute b (after instruction Ra:=new B), the instantaneous type modification is provided within the language: + Ra qua B + The correctness of this expression is checked at run time. If Ra designates an object of B or prefixed ba B, the type of the expression is B. Otherwise the expression is erroneous. Thus, for instance, the expressions: + Ra qua G.b, Ra qua G.e etc. +enable remote access to the attributes b, c, ... via Ra. + So far the question of attribute concatenation was merely discussed. However the sequences of statements can be also concatenated. + Consider class B prefixed with class A. In the sequence of statements of class A the keyword inner may occur anywhere, but only once. The sequence of statements of class B consists of the sequence of statements of class A with inner replaced by the sequence of statements of class B. + + unit A :class unit B:A class + ... ... + begin begin + ... ÚÄÄÄ... + ³ inner ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ inner + ³ + ... ÀÄÄÄ... + end A; end B; + + + In this case inner in class B is equivalent to the empty statement. If class B prefixes another class, say C, then inner in B is replaced by the sequence of statements of class C, and so on. If inner does not occur explicitly, an implicit occurrence of inner before the final end of a class is assumed. + +Example + Let class complex be declared as usual: + unit complex: class(re,im:real); + end complex; +and assume one desires to declare a class mcomplex with the additional attribute module. In order the generation of class mcomplex define the value of attribute module, one can declare a class: + unit mcomplex:complex class; + var module:real; + begin + module:=sqrt(re*re+im*im) + end mcomplex; + Class mcomplex may be still extended: + unit pcomplex:mcomplex class; + var alfa:real; + begin + alfa:=arccos(re/module) + end pcomplex; + For these declarations each generation of class mcomplex defines the value of attribute module, each generation of class pcomplex defines the values of attributes module and alfa. + For reference variables z1, z2 z3 of type complex, the following sequence of statements illustrates the presented constructs: + z1:=new complex(0,1); + z2:=new mcomplex(4,7); + z3:=new pcomplex(-10,12); + if z2 qua mcomplex.module > 1 + then + z1:=z2; + fi; + if z3 qua pcomplex.alfa < 3.14 + then + z3.re:=-z3.re; z3.alfa:=z3.alfa+3.14; + fi; + z1 qua mcomplex.module:= 0; + z1.re,z1.im:=0; +Example: + Binary search tree (Bst) is a binary tree where for each node x the nodes in the left subtree are less than x, the nodes in the right subtree are greater than x. It is the well-known exercise to program the algorithms for the following operations on Bst: + member(x) = true iff x belongs to Bst + insert(x), enlarge Bst with x, if x does not yet belong to Bst +We define both these operations in a class: + unit Bst: class; + unit node: class(value:integer); (* tree node *) + var left,right:node; + end node; + var root:node; + unit help: class(x:integer); (* auxiliary class *) + var p,q:node; + begin + q:=root; + while q=/= none + do + if x < q.value + then + p:=q; q:=q.left; + repeat (* jump to the beginning of a loop *) + fi; + if q.value < x + then + p:=q; q:=q.right; repeat + fi; + exit + od; + inner + (* virtual instruction to beÿreplaced by the body of + a module prefixed by help *) + end help; + unit member:help function:boolean; + (* x is a formal parameter derived from the prefix help *) + begin + result:=q=/=none + end member; + unit insert:help procedure; + (* x is a formal parameter derived from the prefix help *) + begin + if q=/=none then return fi; + q:=new node(x); + if p=none then root:=q; return fi; + if p.value < x then p.right:=q else p.left:=q fi; + end insert; + begin + inner; + end Bst; + In the example the common actions of member and insert are programmed in class help. Then it suffices to use class help as a prefix of function member and procedure insert, instead of redundant occurrences of the corresponding sequence of statements in both units. +Class Bst may be applied as follows: + var X,Y:Bst; + begin + X:=new Bst; Y:=new Bst; + call X.insert(5); + if Y.member(-17) then .... + end + As shown in the declaration of Bst, class may prefix not only other classes but also procedures and functions. Class may prefix blocks as well. + +Example: + Let class push_down (p. 5) prefix a block: + pref push_down(1000) block + var ... + begin + ... + call push(50); ... + i:=pop; + ... + end + In the above block prefixed with class push_down one can use pop and push as local attributes. (They are local since the block is embedded in the prefix push down.) + +Example: + pref push down(1000) block + begin + ... + pref Bst block + begin + (* in this block both structures + push down and Bst are visible *) + call push(50); + call insert(13); + if member(10) then ... + i:=pop; + ... + end + end + In place where classes push_down and Bst are visible together a block prefixed with Bst may be nested in a block prefixed with push_down (or vice versa). In the inner block both data structures are directly accessible. Note that this construct is illegal in Simula 67. +8. Formal types +Formal types serve for unit parametrization with respect to any non-primitive type. +Example: + unit Gsort:procedure(type T; A:arrayof T; function less + (x, y: T): boolean); + var n,i,j:integer; var x:T; + begin + n:=upper(A); + for i:=2 to n + do + x:=A(i); j:=i-1; + do + if less(A(j),x) then exit fi; + A(j+1):=A(j); j:=j-1; + if j=0 then exit fi; + od; + A(j+1):=x; + od + end Gsort; +Procedure Gsort (the generalization of procedure sort from p.4) has type parameter T. A corresponding actual parameter may be an arbitrary non-primitive type. An actual parameter corresponding to A should be an array of elements of the actual type T. Function less should define the linear ordering on the domain T. + For instance, the array A of type bill (cf p.7) may be sorted with respect to attribute dollars , if the function: + unit less: function(t,u:bill):boolean; + begin + result:=t.dollars <= u.dollars + end less; +is used as an actual parameter: + call Gsort(bill,A,less); +If the user desires to sort A with respect to date, it is sufficient to declare : + unit earlier:function(t,u:bill):boolean; + begin + if t.year < u.year then result:= true; return fi; + if t.year=u.year + then + if t.month < u.month then result:=true; return fi; + if t.month=u.month then result:=t.day<=u.day fi + fi; + end earlier; +and to call: call Gsort(bill,A,earlier); +9. Protection techniques + Protection techniques ease secure programming. If a program is large, uses some system classes, is designed by a team etc., this is important (and non-trivial) to impose some restrictions on access to non-local attributes. + Let us consider a data structure declared as a class. Some of its attributes should be accessible for the class users, the others should not. For instance, in class Bst (p.7) the attributes member and insert are to be accessible. On the other hand the attributes root, node and help should not be accessible, even for a meddlesome user. An improper use of them may jeopardize the data structure invariants. + To forbid the access to some class attributes the three following protection mechanisms are provided: + close, hidden, and taken. + The protection close defined in a class forbids remote access to the specified attributes. For example, consider the class declaration: + unit A: class; + close x,y,z; + var x: integer, y,z:real; + .... + end A +Remote access to the attributes x,y,z from outside of A is forbidden. +The protection hidden (with akin syntax) does not allow to use the specified attributes form outside of A neither by the remote access nor in the units prefixed by A. The only way to use a hidden attribute is to use it within the body of class A. Protection taken defines these attributes derived from prefix, which the user wishes to use in the prefixed unit. Consider a unit B prefixed by a class A. In unit B one may specify the attributes of A which are used in B. This protects the user against an unconscious use of an attribute of class A in unit B (because of identifier conflict). When taken list does not occur, then by default, all non-hidden attributes of class A are accessible in unit B. +10. Programmed deallocation + The classical methods implemented to deallocate class objects are based on reference counters or garbage collection. Sometimes the both methods may be combined. A reference counter is a system attribute holding the number of references pointing to the given object. Hence any change of the value of a reference variable X is followed by a corresponding increase or decrease of the value of its reference counter. When the reference counter becomes equal 0, the object can be deallocated. + The deallocation of class objects may also occur during the process of garbage collection. During this process all unreferenced objects are found and removed (while memory may be compactified). In order to keep the garbage collector able to collect all the garbage, the user should clear all reference variables , i.e. set to None, whenever possible. This system has many disadvantages. First of all, the programmer is forced to clear all reference variables, even those which are of auxiliary character. Moreover, garbage collector is a very expensive mechanism and thus it can be used only in emergency cases. + In LOGLAN a dual operation to the object generator, the so-called object deallocator is provided. Its syntactic form is as follows: + kill(X) +where X is a reference expression. If the value of X points to no object (none) then kill(X) is equivalent to an empty statement. If the value of X points to an object O, then after the execution of kill(X), the object O is deallocated. Moreover all reference variables which pointed to O are set to none. This deallocator provides full security, i.e. the attempt to access the deallocated object O is checked and results in a run-time error. + For example: + Y:=X; kill(X); Y.W:=Z; +causes the same run-time error as: + X:=none; X.W:=Z; + The system of storage management is arranged in such a way that the frames of killed objects may be immediately reused without the necessity of calling the garbage collector, i.e. the relocation is performed automatically. There is nothing for it but to remember not to use remote access to a killed object. (Note that the same problem appears when remote access X.W is used and X=none). + + + +Example: + Below a practical example of the programmed deallocation is presented. Consider class Bst (p.7). Let us define a procedure that deallocates the whole tree and is called with the termination of the class Bst. + unit Bst:class; + (* standard declarations list of Bst *) + unit kill_all:procedure(p:node); + (* procedure kill_all deallocates a tree with root p *) + begin + if p= none then return fi; + call kill_all(p.left); + call kill_all(p.right); + kill(p) + end kill_all; + begin + inner; + call kill_all(root) + end Bst; +Bst may be applied as a prefix: + pref Bst block + ... + end +and automatically will cause the deallocation of the whole tree after return to call kill_all(root) from the prefixed block. + To use properly this structure by remote accessing one must call kill_all by himself: + unit var X,Y:Bst; + ... + begin + X:=new Bst; Y:=new Bst; + ... + (* after the structures' application *) + call X.kill_all(X.root); + kill(X); + call Y.kill_all(Y.root); + kill(Y); + ... + end + Finally note that deallocator kill enables deallocation of array objects, and suspended coroutines and processes as well (cf p.13). +11. Exception handling + Exceptions are events that cause interruption of normal program execution. One kind of exceptions are those which are raised as a result of some run time errors. For instance, when an attempt is made to access a killed object, when the result of numeric operation does not lie within the range, when the dynamic storage allocated to a program is exceeded etc. + Another kind of exceptions are those which are raised explicitly by a user (with the execution of the raise statement). + The response to exceptions (one or more) is defined by an exception handler. A handler may appear at the end of declarations of any unit. The corresponding actions are defined as sequences of statements preceded by keyword when and an exception identifier. +Example: + In procedure squareeq (p.3) we wish to include the case when a=0. It may be treated as an exception (division by zero). + unit squareeq(a,b,c:real;output xr,xi,yr,yi:real); + var delta:real; + handlers + when division_by_zero: + if b =/= 0 + then + xi,yr,yi:=0; xr:=-c/b; terminate + else + raise Wrong_data(" no roots") + fi; + end + begin + ... + end squareeq; + The handler declared in that procedure handles the only one exception (division_by_zero). + When an exception is raised, the corresponding handler is searched for, starting from the active object and going through return traces. If there is no object containing the declaration of the handler, then the program (or the corresponding process) is terminated. Otherwise the control is transferred to the first found handler. + In our example the handler is declared within the unit itself, so control is passed to a sequence: + if b=/=0 ... + Therefore, when b=/=0, the unique root of square equation will be determined and the procedure will be normally terminated (terminate). In general, terminate causes that all the objects are terminated, starting from that one where the exception was raised and ending on that one where the handler was found. Then the computation is continued in a normal way. + In our example, when b=0, a new exception is raised by the user. For this kind of exceptions , the exception itself should be declared (because it is not predefined as a run time error). Its declaration may have parameters which are transmitted to a handler. The exception declaration need not be visible by the exception handler. However the way the handler is searched for does not differ from the standard one. Consider an example: + block + signal Wrong_data(t:string); + unit squareeq: + ... + end squareeq; + ... + begin + ... + end + Exception Wrong_data may be raised wherever its declaration (signal Wrong_data) is visible. When its handler is found the specified sequence of actions is performed. In the example above different handlers may be defined in inner units to the main block where squereeq is called. + The case a=0 could be included , of course, in a normal way, i.e. by a corresponding conditional statement occurring in the procedure body. But the case a=0 was assumed to be exceptional (happens scarcely). Thus the evaluation of condition a=0 would be mostly unnecessary. As can be noticed thanks to exceptions the above problem can be solved with the minimal waste of run time. +12. Concurrent processes. + Loglan allows to create and execute objects-processes. They can operate simultaneously on different computers linked into a LAN network or a few processes can share one processor (its time-slices). + Process modules are different from the classes and coroutines for, they use the keyword process. The syntax of process modules is otherwise the same. In a process one can use a few more instructions: resume (resume a process which is passive), stop - make the current process passive, etc. + All processes (even those executed on the same computer) are implemented as distributed, i.e. without any shared memory. This fact implies some restrictions on how processes may be used. Not all restrictions are enforced by the present compiler, so it is the programmer's responsibility to respect them. For the details see the User's Manual. + Semantics of the generator new is slightly modified when applied to the processes. The first parameter of the first process unit in the prefix sequence must be of type INTEGER. This parameter denotes the node number of the computer on which this process will be created. For a single computer operation this parameter must be equal to 0. + +Example: +unit A:class(msg:string); +... +end A; +unit P:A process(node:integer, pi:real); +... +end P; +... +var x:P; +... +begin +... + (* Create process on node 4. The first parameter is the *) + (*string required by the prefix A, the second is the node number *) + x := new P("Hello", 4, 3.141592653); +... +end + + + + COMMUNICATION MECHANISM + +Processes may communicate and synchronize by a mechanism based on rendez-vous. It will be referred to as "alien call" in the following description. + An alien call is either: + - a procedure call performed by a remote access to a process object, or + - a call of a procedure which is a formal parameter of a process, or + - a call of a procedure which is a formal parameter of an alien-called procedure (this is a recursive definition). +Every process object has an enable mask. It is defined as a subset of all procedures declared directly inside a process unit or any unit from its prefix sequence (i.e. subset of all procedures that may be alien-called). +A procedure is enabled in a process if it belongs to that process' enable mask. A procedure is disabled if it does not belong to the enable mask. +Immediately after generation of a process object its enable mask is empty (all procedures are disabled). +Semantics of the alien call is different from the remote call described in the report. Both the calling process and the process in which the procedure is declared (i.e. the called process) are involved in the alien call. This way the alien call may be used as a synchronization mechanism. +The calling process passes the input parameters and waits for the call to be completed. +The alien-called procedure is executed by the called process. Execution of the procedure will not begin before certain conditions are satisfied. First, the called process must not be suspended in any way. The only exception is that it may be waiting during the ACCEPT statement (see below). Second, the procedure must be enabled in the called process. +When the above two conditions are met the called process is interrupted and forced to execute the alien-called procedure (with parameters passed by the calling process). +Upon entry to the alien-called procedure all procedures become disabled in the called process. + Upon exit the enable mask of the called process is restored to that from before the call (regardless of how it has been changed during the execution of the procedure). The called process is resumed at the point of the interruption. The execution of the ACCEPT statement is ended if the called process was waiting during the ACCEPT (see below). At last the calling process reads back the output parameters and resumes its execution after the call statement. + The process executing an alien-called procedure can easily be interrupted by another alien call if the enable mask is changed. + There are some new language constructs associated with the alien call mechanism. The following statements change the enable mask of a process: + ENABLE p1, ..., pn +enables the procedures with identifiers p1, ..., pn. If there are any processes waiting for an alien call of one of these procedures, one of them is chosen and its request is processed. The scheduling is done on a FIFO basis, so it is strongly fair. The statement: + DISABLE p1, ..., pn +disables the procedures with identifiers p1, ..., pn. + In addition a special form of the RETURN statement: + RETURN ENABLE p1, ..., pn DISABLE q1, ..., qn +allows to enable the procedures p1, ..., pn and disable the procedures q1,...,qn after the enable mask is restored on exit from the alien-called procedure. It is legal only in the alien-called procedures (the legality is not enforced by the compiler). + A called process may avoid busy waiting for an alien call by means of the ACCEPT statement: + ACCEPT p1, ..., pn +adds the procedures p1, ..., pn to the current mask, and waits for an alien call of one of the currently enabled procedures. After the procedure return the enable mask is restored to that from before the ACCEPT statement. + Note that the ACCEPT statement alone (i.e. without any ENABLE/DISABLE statements or options) provides a sufficient communication mechanism. In this case the called process may execute the alien-called procedure only during the ACCEPT statement (because otherwise all procedures are disabled). It means that the enable mask may be forgotten altogether and the alien call may be used as a pure totally synchronous rendez-vous. Other constructs are introduced to make partially asynchronous communication patterns possible. + +Below find a complete listing of a simple example - monitors. + +program monitors; + +(* this an example showing 5 processes: two of them are in fact monitors, one controls the screen=ekran *) + + unit ANSI: class; + (* CHECK whether config.sys contains a line + device=ansi.sys + the class ANSI enables operations on cursor, + and bold, blink, underscore etc. *) + + unit Bold : procedure; + begin + write( chr(27), "[1m") + end Bold; + + unit Blink : procedure; + begin + write( chr(27), "[5m") + end Blink; + + unit Reverse : procedure; + begin + write( chr(27), "[7m") + end Reverse; + + unit Normal : procedure; + begin + write( chr(27), "[0m") + end Normal; + + unit Underscore : procedure; + begin + write( chr(27), "[4m") + end Underscore; + + unit inchar : IIUWgraph function : integer; + (*podaj nr znaku przeslanego z klawiatury *) + var i : integer; + begin + do + i := inkey; + if i <> 0 then exit fi; + od; + result := i; + end inchar; + + unit NewPage : procedure; + begin + write( chr(27), "[2J") + end NewPage; + + unit SetCursor : procedure(row, column : integer); + var c,d,e,f : char, + i,j : integer; + begin + i := row div 10; + j := row mod 10; + c := chr(48+i); + d := chr(48+j); + i := column div 10; + j := column mod 10; + e := chr(48+i); + f := chr(48+j); + write( chr(27), "[", c, d, ";", e, f, "H") + end SetCursor; +end ANSI; + + + unit monitor: process(node:integer, size:integer,e: ekran); + + var buf: arrayof integer, + nr,i,j,k1,k2,n1,n2: integer; + + + unit lire: procedure(output k: integer); + begin + call e.druk(13,2+nr*30+k1,0,k2); + call e.druk(13,2+nr*30+(i-1)*6,1,buf(i)); + k1:=(i-1)*6; + k:=buf(i); + k2:=k; + i:= (i mod size)+1; + if i=j + then + call e.printtext("i equal j") + fi; + end lire; + + unit ecrire: procedure(n:integer); + begin + call e.druk(13,2+nr*30+n1,0,n2); + call e.druk(13,2+nr*30+(j-1)*6,2,n); + n1:=(j-1)*6; + buf(j) := n; + n2:=buf(j); + j := (j mod size)+1; + if i=j + then + call e.printtext("j equal i") + fi; + end ecrire; + begin + array buf dim(1:size); + nr := size - 4; + for i := 1 to size + do + buf(i) := i+nr*4; + call e.druk(13,2+nr*30+(i-1)*6,0,buf(i)); + od; + i:=1; + j := size; + k1:=0; + k2:=buf(1); + n1:=(size-1)*6; + n2:=buf(size); + (* end initialize buffer *) + return; + + do + accept lire, ecrire + od + end monitor; + + unit prcs: process(node,nr:integer, mleft,mright: + monitor, e: ekran); + var l,o: integer; + + begin + call e.SetCursor(8+(nr-1)*10,29); + if nr = 1 + then + call e.printtext("<-- p1 <--"); + else + call e.printtext("--> p2 -->"); + fi; + return; + do + call mleft.lire(l) ; + call e.druk(11+(nr-1)*4,31-(nr-1)*8,1,l); + l:= l+1; + call mright.ecrire(l) ; + call e.druk(10+(nr-1)*6,23+(nr-1)*8,2,l); + if l mod 15 = 0 + then + o:= e.inchar; + if o = -79 then call endrun fi; + fi; + od; + end prcs; + +unit ekran : ANSI process(nrprocesora: integer); + unit printtext: procedure(s:string); + begin + write(s); + call Normal; + end printtext; + + unit druk: procedure(gdzieW,gdzieK,jak,co:integer); + begin + call SetCursor(gdzieW,gdzieK); + write(" "); + if jak=0 then call Normal else + if jak=1 then call Reverse else + if jak=2 then call Bold + fi + fi + fi; + write(co:3); + call Normal; + end druk; + + unit print: procedure (i:integer); + begin + write(i:4) + end print; + begin + return; + + do accept inchar, + Normal,NewPage, SetCursor, Bold, Underscore, + Reverse, Blink, print, printtext, druk + od + end ekran; + +var m1,m2:monitor, + e:ekran, + p1,p2:prcs; + +begin (* ----- HERE IS THE MAIN PROGRAM ----- *) + (* create a configuration *) + e:= new ekran(0); + resume(e); + call e.Normal; + call e.NewPage; + m1 := new monitor(0,4,e); + m2 := new monitor(0,5,e); + + p1 := new prcs(0,1,m2,m1,e); + p2 := new prcs(0,2,m1,m2,e); + + resume(m1); + resume(m2); + resume(p1); + resume(p2); +end monitors; + +References. + +Bartol,W.M., et al. +Report on the Loglan 82 programming Language, +Warszawa-Lodz, PWN, 1984 + +O.-J. Dahl, B. Myhrhaug, K. Nygaard, +Simula 67 Common Base Language, +Norwegian Computing Center, Oslo, 1970 the mother of object languages!! + +Hoare C.A.R. + Monitors, an operating system structuring concept. +CACM,vol.17,N.10,October 1974,pp.549-57 + +Loglan'82 +User's guide +Institute of Informatics, University of Warsaw 1983, 1988 +LITA, Université de Pau, 1993 +(distributed together with this package) + +A.Kreczmar, A.Salwicki, M. Warpechowski, +Loglan'88 - Report on the Programming Language, +Lecture Notes on Computer Science vol. 414, Springer Vlg, 1990, +ISBN 3-540-52325-1 + +/* if you can read polish, there is a good manual of Loglan */ +A.Szalas, J.Warpechowska, +LOGLAN, +Wydawnictwa Naukowo-Techniczne, Warszawa, 1991 ISBN 82-204-1295-1 + +see also the Readings file of this distribution. + +{PAGE|34} A.Kreczmar Nov.1990 + + Loglan'82 {PAGE|33} + + diff --git a/doc/loglgraf.doc b/doc/loglgraf.doc new file mode 100644 index 0000000000000000000000000000000000000000..7cd1ff9f40b677c4fd2fa38fb50f0431d519614c GIT binary patch literal 24554 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 z

    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.RUCHY KURSORA|O JEDNO SLOWO |F2.NAGRANIE PLIKU NA DYSK +PRZESUWANIE TEKSTU|^>.........W PRAWO|F3.ROZNE OPERACJE PLIKOWE + O LINIE : |^<..........W LEWO|F4....WYSZUKIWANIE BLEDOW +^U..........W GORE| WZGLEDEM WYZSZEJ|F8....PROGRAMY POMOCNICZE +^D...........W DOL| LINII|F9....KOMPILACJA PROGRAMU + O STRONE : |^N.........W PRAWO|F10..WLACZANIE/WYLACZANIE +PgDn........W GORE|^P..........W LEWO| WYSWIETLANIA MENU +PgUp.........W DOL|------------------+------+------------------ +ZMIANA LINII |^K.......OPERACJE BLOKOWE|Enter...NOWA LINIA +^PgDn.....POCZATEK|^Q.WYSZUKIWANIE I ZAMIANA|^Y.KASOWANIE LINII + TEKSTU|^J....SKAKANIE PO TEKSCIE|KASOWANIE ZNAKU +^PgUp.......KONIEC|^W.....OPERACJE NA OKNACH|BackSpace...W LEWO + TEKSTU|^V...........MAKROROZKAZY|Del........W PRAWO +^Home.....POCZATEK|-------------------------+------------------ + OKIENKA|^A....................KASOWANIE LINII W LEWO +^End........KONIEC|^S...................KASOWANIE LINII W PRAWO + OKIENKA|F1..........ZAWSZE WYJASNIA CO MOZEMY ZROBIC +------------------+-------------------------------------------- +Tab......PRZESTAWIA KURSOR POD NASTEPNE SLOWO,PRZESUWA TO CO ZA +^T.........................KASUJE SLOWO WSKAZYWANE PRZEZ KURSOR +===============REKORD 2=======================================|=============== ++ 11 + INFORMACJA O POSLUGIWANIU SIE HELPEM. + + W kazdej sytuacji po nacisnieciu klawisza F1 mozemy otrzymac +informacje o aktualnie dostepnych opcjach. Na wyswietlonym +czesto moze byc wspomniane o mozliwosci uzyskania dokladniej- +szych informacji na podany temat. Uzyskuje sie ja przez nacis- +niecie jednego z klawiszy {0,1,2,3,4,5,6,7,8,9},co jest przed- +stawione na ekranie przez wypisanie nazwy danego klawisza w na- +wiasach trujkatnych. + Esc opuszczenie helpa + F1 przejscie do glownego okienka helpa +===============REKORD 3=======================================|=============== ++ 8 4 + Nagrywanie pliku na dysk (F2,F3S) + +Moze sie zdarzyc, ze z jakiegos powodu nie mozna nagrac pliku +w katalogu, z ktorego go wgralismy. Wtedy nalezy przejsc (F3 L) +do katalogu,w ktorym mamy wszystkie prawa i tam zgrac nasz plik +opcja F3 W. + +Aby dowiedziec sie wiecej o operacjach plikowych nacisnij <0> +===============REKORD 4=======================================|=============== ++ 15 23 3 24 25 26 41 + Operacje plikowe (F3) + +Przy pomocy znajdujacych sie tu funkcji mozemy wybrac dowolny +plik do edycji. +Mamy do dyspozycji nastepujace funkcje: + + L Ladowanie pliku z dysku <0> + S Nagrywanie pliku na dysk <1> + N Rozpoczynanie edycji nowego pliku <2> + W Zmiana nazwy pliku <3> + P Ostatnio uzywane pliki <4> + O Rozne opcje <5> + G Informacje o edytowanych plikach i ilosci + wolnej pamieci. + Q Wyjscie z programu +===============REKORD 5=======================================|=============== ++ 16 + POPRAWIANIE BLEDOW + +Ta opcja ulatwia poprawianie bledow w programie. W najnizszej +linii pojawia sie numer linii, w ktorej wystapil blad, numer +bledu i krotki opis. Kursor automatycznie ustawia sie w miejscu +wystapinia. Dla niektorych bledow wskazuje dokladnie wiersz +i kolumne,dla innych tylko wiersz i wtedy ustawia sie w pierw- +szej kolumnie. Jesli ustawilismy opcje wyswietlania menu (F10) +to nad linia z opisem bledu pojawia sie sciagawka o sposobie +przegladania bledow.Dostepne sa nastepujace funkcje: + Ctrl F5 - Przejscie do pierwszego bledu + Ctrl F6 - Przejscie do ostatniego bledu + Ctrl F8 - Przejscie do nastepnego bledu + Ctrl F7 _ Przejscie do poprzedniego bledu + Ctrl F10 - Koniec poprawiania bledow +Ponowne wcisniecie F4 powoduje wyjscie z opcji. +===============REKORD 6=======================================|=============== ++ 8 + ZMIANA AKTUALNEGO OKNA + + Dzieki tej funkcji mozemy zmienic okienko robocze. +Mamy do wyboru nastepujace funkcje: + F Kasuje wszystkie inne okienka widoczne na ekranie. + H Przechodzimy do okienka z baza danych o Loglanie. + A Przechodzimy do okienka dodatkowego + M przechodzimy do okienka glownego. +===============REKORD 7=======================================|=============== ++ 17 + PRZECHODZENIE DO PROGRAMOW POMOCNICZYCH + +Ta opcja umozliwia wykonywanie pewnych programow, bez wycho- +dzenia z tego prograwu do systemu.To okienko mozemy zdefiniowac +sobie sami w czasie instalacji edytora.Umozliwia ono miedzy +innymi wykonywanie pewnych operacjii na edytowanym pliku(nazwa +pliku jest umieszczana w parametrach wywolanego programu). +Jako jedna z opcji mozna umiescic program LOTEKINS co pozwala +na zmiane tego okienka w trakcie pracy.Wywolanie opcji tego +okienka moze byc umieszczone w makroinstrukcji +(Przyklad: Jesli mamy komputer z dwoma monitorami i zdefiniuje- +my instrukcje:C COLOR (mode co80) i M MONO (mode mono) +to makroinstrukcja @8M@5H@5F spowoduje,ze bedziemy mogli +ogladac baze danych na moanitorze z karta Hercules. + @8C@5M@5F spowoduje,ze bedziemy mogli +edytowac plik glowny na ekranie kolorowy(ale baza danych nie +zniknie z ekranu monochromatycznego) +===============REKORD 8=======================================|=============== ++ 11 36 + KOMPILOWANIE PROGRAMU + +Tutaj mamy nastepujace opcje: + L: Pass 1 Pierwszy przebieg kompilacji (program Loglan) tu + sa miedzy innymi wykrywane popelnione przez nas bledy (F4) + G: Pass 2 Drugi lub pierwszy i drugi przebieg kompilacji + (program Gen) tu jest generowany gotowy do wykonania program + R: Run Wykonywanie programu (lub takze kompilacja). + D: Debuger Najpierw wykonujemy program,a potem mozemy prze- + sledzic instrukcja po instrukcji jak przebiegalo to wykonanie + O: Options<0> Tu ustawia sie rozne opcje zwiazane z kompilacja +===============REKORD 9=======================================|=============== ++ 17 27 28 29 30 31 32 33 34 35 + OPERACJE BLOKOWE + +Po nacisnieciu Ctrl_K wybieramy klawisz odpowiadajacy intere- +sujacej nas funkcji.Jesli przez 2 sek. tego nie zrobimy to +pojawi sie ramka z wypisanymi wszystkimi opcjami. + +Mamy do dyspozycji nastepujaca funkcje: + + K,B,T,L -zaznaczanie bloku <0> + Y -kasowanie bloku <1> + C,V -zwyczajne przenoszenie bloku <2> + S,M -przenoszenie z wyrownywaniem <3> + R,W -blok z dysku i na dysk <4> + U,I -przesuwanie bloku <5> + H -chowanie bloku <6> + F -blok w ramke <7> + O -opcje <8> +===============REKORD 10=======================================|=============== ++ 13 37 38 39 40 + OPERACJE KONTROLOWANEGO PRZEMIESZCZANIA SIE PO TEKSCIE + +Po nacisnieciu Ctrl_J wybieramy klawisz odpowiadajacy intere- +sujacej nas funkcji.Jesli przez 2 sek. tego nie z +pojawi sie ramka z wypisanymi wszystkimi opcjami. + +Mamy do dyspozycji nastepujace funkcje: + + S -ustawienie miejsca dla skoku <0> + R -powrot do ostatnio ustawionego miejsca <1> + J -skok do ostatnio ustawionego miejsca <2> + L -skok do podanej linii + B,K -skoki do poczatku i konca bloku <3> +===============REKORD 11=======================================|=============== ++ 17 15 16 17 18 19 20 + OPERACJE WYSZUKIWANIA I ZAMIANY SLOW + +Po nacisnieciu Ctrl_Q wybieramy klawisz odpowiadajacy intere- +sujacej nas funkcji.Jesli przez 2 sek. tego nie zrobimy to +pojawi sie ramka z wypisanymi wszystkimi opcjami. + +Mamy do dyspozycji nastepujace opcje: + + F -znajdz podane slowo <0> + A -znajdz slowo i zamien je na inne <1> + C -zamien znaki <2> + K -zamien slowa kluczowe <3> + T -znajdz slowo wskazywane przez kursor <4> + R -znajdz i zamien slowo wskazywane przez kursor <5> + +UWAGA:Naciskajac Ctrl L mozesz powtorzyc ostatnio wykonywana + funkcje wyszukiwania i zamiany. +===============REKORD 12=======================================|=============== ++ 13 14 + SPIS TRESCI WIADOMOSCI O LOGLANIE + + Kazda linia jaka widzisz na ekranie oznacza jakis tekst. +Podkreslenie oznacza linie,ktora mozna aktualnie wybrac. + + Enter -wybranie aktualnie wskazywanej linii + kursor w gore -poprzenia linia + kursor w dol -nastepna linia + Ctrl PgUp -do poczatku spisu + Ctrl PgDn -do konca spisu + PgUp,PgDn -o strone w gore lub w dol + Tab -wybieranie roznych innych rozdzialow <0> + Ctrl_Q_F -wyszukiwanie podanego slowa +===============REKORD 13=======================================|=============== ++ 11 12 14 + TRESC PODROZDZIALU + + Enter -powrot do spisu tresci <0> + Tab -wybieranie roznych innych rozdzialow <1> + Up,Down,Left,Right -przemieszczanie kursora + Home,End -do poczatku i konca linii + Ctrl PgUp -do poczatku tekstu + Ctrl PgDn -do konca tekstu + PgUp,PgDn -o strone w gore lub w dol + Ctrl_K_B,K,L,T -zaznaczanie bloku + Ctrl_Q_F -wyszukiwanie slowa +===============REKORD 14=======================================|=============== ++ 9 + WYBOR ROZDZIALU INFORMACJI O LOGLANIE + + Na ekranie widzimy okienko z wypisanymi nazwami rozdzialow +jakie z niego mozemy otrzymac.Kursorami w gore i w dol wedru- +jemy po okienku Home i End przenosi nas na poczatek lub koniec. +Enter pozwala wybrac wskazywany rozdzial i odrazu przechodzimy +do niego.Kursorami w lewo i w prawo przechodzimy do sasiednich +okienek z innymi rozdzialami.Esc powoduje powrot do ostatnio +ogladanego rozdzialu. +===============REKORD 15=======================================|=============== ++ 13 + (F) SZUKANIE SLOWA W TEKSCIE + +Najpierw podajemy tresc slowa, ktore chcemy znalezc (Find :?). +W nastepnej kolejnosci czytane sa opcje , a potem nastepuje +szukanie.Jesli znaleziono podane slowo to kursor ustawia sie na +nastepnej pozycji za nim. +Dzialaja nastepujace opcje : + G.........Szukanie rozpocznie sie na poczatku lub koncu tekstu. + B.........................................Przeszukiwanie w tyl. + n............................Szukanie az do n-tego wystapienie. + U...........................Utozsamianie duzych i malych liter. + W.........................................Szukanie calych slow. + L.........................Szukanie wewnatrz zaznaczonego bloku. +===============REKORD 16=======================================|=============== ++ 16 + (A) ZAMIANA WYSTAPIEN PODANEGO SLOWA W TEKSCIE + +Najpierw podajemy tresc slowa, ktore chcemy znalezc. (Find :?) +Potem podajemy na co chcemy zamienic to slowo. (Replace with :?) +W nastepnej kolejnosci czytane sa opcje , a potem nastepuje +szukanie.Jesli znaleziono podane slowo to kursor ustawia sie na +tym slowia a w najwyzszej linii ekranu pojawia sie pytanie, czy +zamienic to slowo,czy tez nie. +Dzialaja nastepujace opcje : + G.........Szukanie rozpocznie sie na poczatku lub koncu tekstu. + B.........................................Przeszukiwanie w tyl. + n...............................Zamiana pierwszych n wystapien. + U...........................Utozsamianie duzych i malych liter. + W.........................................Szukanie calych slow. + L.........................Szukanie wewnatrz zaznaczonego bloku. + N...........Zamiana bezwarunkowa (bez pytania za kazdym razem). +===============REKORD 17=======================================|=============== ++ 11 + (C) ZAMIANA ZNAKOW + +Ta funkcja umozliwia zamiane duzych liter na male lub odwrotnie +Dzialaja nastepujace opcje : + D.......................................Zamiana na duze litery. + S.......................................Zamiana na male litery. + G.........Szukanie rozpocznie sie na poczatku lub koncu tekstu. + B.........................................Przeszukiwanie w tyl. + L.........................Szukanie wewnatrz zaznaczonego bloku. + C............................Zamiana tylko wewnatrz komentarzy. + T......................................Zamiana tylko w tekscie. +===============REKORD 18=======================================|=============== ++ 10 + (K) ZAMIANA SLOW KLUCZOWYCH + +Ta funkcja umozliwia nam zamiane wszystkich slow kluczowych +jezyka Loglan. +Dzialaja nastepujace opcje : + D.......................................Zamiana na duze litery. + S.......................................Zamiana na male litery. + G.........Szukanie rozpocznie sie na poczatku lub koncu tekstu. + B.........................................Przeszukiwanie w tyl. + L.........................Szukanie wewnatrz zaznaczonego bloku. +===============REKORD 19=======================================|=============== ++ 12 + (T) SZUKANIE SLOWA WSKAZYWANEGO PRZEZ KURSOR + +Najpierw podajemy opcje , a potem nastepuje szukanie. +Jesli znaleziono podane slowo to kursor ustawia sie na +nastepnej pozycji za nim. +Dzialaja nastepujace opcje : + G.........Szukanie rozpocznie sie na poczatku lub koncu tekstu. + B.........................................Przeszukiwanie w tyl. + n............................Szukanie az do n-tego wystapienie. + U...........................Utozsamianie duzych i malych liter. + W.........................................Szukanie calych slow. + L.........................Szukanie wewnatrz zaznaczonego bloku. +===============REKORD 20=======================================|=============== ++ 15 + (R) SZUKANIE I ZAMIANA SLOWA WSKAZYWANEGO PRZEZ KURSOR + +Najpierw podajemy na co chcemy zamienic to slowo. +W nastepnej kolejnosci czytane sa opcje , a potem nastepuje +szukanie.Jesli znaleziono podane slowo to kursor ustawia sie na +tym slowia a w najwyzszej linii ekranu pojawia sie pytanie, czy +zamienic to slowo,czy tez nie. +Dzialaja nastepujace opcje : + G.........Szukanie rozpocznie sie na poczatku lub koncu tekstu. + B.........................................Przeszukiwanie w tyl. + n...............................Zamiana pierwszych n wystapien. + U...........................Utozsamianie duzych i malych liter. + W.........................................Szukanie calych slow. + L.........................Szukanie wewnatrz zaznaczonego bloku. + N...........Zamiana bezwarunkowa (bez pytania za kazdym razem). +===============REKORD 21=======================================|=============== ++ 13 29 30 + OPERACJE WYMIANY BLOKOW MIEDZY OKNAMI TEKSTOWYMI I INNE + +Po nacisnieciu Ctrl_W wybieramy klawisz odpowiadajacy intere- +sujacej nas funkcji.Jesli przez 2 sek. tego nie z +pojawi sie ramka z wypisanymi wszystkimi opcjami. + +Mamy do dyspozycji nastepujace funkcje: + C -przekopiowanie bloku z drugiego widocznego na ekranie okna + V -przeniesienie bloku z drugiego widocznego na ekranie okna + S -przekopiowanie z przesunieciem z drugiego okna + M -przeniesienie z przesunieciem z drugiego okna + +Patrz C,V <0> S,M <1> +===============REKORD 22=======================================|=============== ++ 19 + DEFINIOWANIE MAKROROZKAZOW + +Kazdemu klawiszowi odpowiadajacemu literze,cyfrze lub klawiszo- +wi funkcyjnemu mozemy przyporzadkowac makroinstrukcje. +Makroinstrukcje sa uruchamiane przez jednoczesne nacisniecie Alt +i odpowiedniego klawisza. +W definicji makrorozkazu moga wystapic oprucz zwyczajnych znakow +ASCII zastepujace symbole: + ^.............Oznacza Ctrl + nastepny klawisz (A..Z oraz 0..9) + &..............Oznacza Alt + nastepny klawisz (A..Z oraz 0..9) + @........Oznacza klawisz funkcyjny.Nastepnym znakiem moze byc: + 1..0 - F1..F10 ³ <>^v - kursor ³ H - Home ³ E - End ³ + U - PgUp ³ D - PgDn ³ I - Insert ³ L - Delete ³ + S - Esc ³ B - Backspace ³ ³ ³ + C - Enter ³ ³ ³ ³ + #..Nastepny znak po ty nie jest interpretowany np.## oznacza # +Nawiasy klamrowe oznaczaja powtorzenie ich zawartosci pewna +liczbe razy . Np. {^C(* *)}12 spowoduje utworzenie 12 nowych +linii zawierajacych napis "(* *)" +===============REKORD 23=======================================|=============== ++ 17 + (L) WGRYWANIE PLIKU Z DYSKU + +Pojawia sie okienko,w ktorym mozemy podac nazwe pliku,lub maske +opisujaca grupe plikow. Jezeli podamy nazwe to dany plik jest +wgrywany ( jesli nie istnieje to rozpoczynamy jego edycje ). +Jezeli podamy maske to pojawiaja sie wszystkie odpowiadajace +jej nazwy plikow oraz podkatalogow. +>>>Mamy dostepne nastepujace klawisze: + Esc.........Powrot,bez wczytania pliku.Zostajemy w aktualnie + ustawionym podkatalogu. +   < >......................Przemieszczanie sie po okienku. + Enter.........Jesli wskazywana jest nazwa pliku to dany plik + jest wczytywany i mozemy rozpoczac jego edycje. + Jezeli wskazywany jest podkatalog to jest on + dodawany do aktualnej sciezki. + PgUp,PgDn......Przejscie do poprzedniej lub nastepnej strony + (w okienku miesci sie tylko 20 nazw). +===============REKORD 24=======================================|=============== ++ 5 + (N) ROZPOCZECIE EDYCJI NOWEGO PLIKU + +Czysci bufor tekstu i rozpoczyna edycje pliku o domyslnej +nazwie NONAME.LOG .Przy nagrywaniu na dysk program bedzie pro- +ponowal zmiane tej nazwy na inna. +===============REKORD 25=======================================|=============== ++ 8 + (W) ZMIANA NAZWY AKTUALNEGO PLIKU + +Zmienia nazwe aktualnie edytowanego pliku i nagrywa go na dysk +w aktualnym katalogu (ustawianie aktualnego katalogu funkcja L) +Jesli byl juz plik o takiej nazwie to pyta, czy go skasowac +UWAGA: Mozemy podac od razu nazwe nowego pliku lub maske +i wtedy zastepujemy aktualnie edytowanym plikiem jakis juz +istiejacy na dysku (Wybieranie tak jak w opcji L). +===============REKORD 26=======================================|=============== ++ 4 + (P) OSTATNIO UZYWANE PLIKI + +Pojawia sie okienko z ostatnio wgrywanymi plikami ponumerowanymi +od 0 do 9 mozemy wybrac jakis plik lub przejsc do opcji Load (L) +===============REKORD 27=======================================|=============== ++ 6 + ZAZNACZANIE BLOKU + + B -zaznaczenie poczatku bloku + K -zaznaczenie konca bloku + T -zaznaczenie slowa,na ktorym stoi kursor jako bloku + L -zaznaczenie linii,na ktorej stoi kursor jako bloku +===============REKORD 28=======================================|=============== ++ 3 + KASOWANIE ZAZNACZONEGO BLOKU + + Jezeli zaznaczyles blok to mozesz go skasowac. +===============REKORD 29=======================================|=============== ++ 15 30 + (C,V) KOPIOWANIE LUB PRZENOSZENIE ZAZNACZONEGO BLOKU + + Funkcja.C.kopiuje zaznaczony przez nas blok (Ctrl K + B,K,T,L) +do miejsca w tekscie rozpoczynajacego sie pozycja kursora. +Pierwsza linia bloku bedzie przesunieta tak , aby jej poczatek +znajdowal sie w pozycji kursora natomiast pozostale linie nie +zostana przesuniete. +UWAGA:Mozna przenosic blok do wnetrza jego samego. + Funkcja.V.przenosi zaznaczony przez nas blok (Ctrl K+ B,K,T,L) +do miejsca w tekscie rozpoczynajacego sie pozycja kursora. +W poprzednim miejscu blok bedzie skasowany. +Pierwsza linia bloku bedzie przesunieta tak , aby jej poczatek +znajdowal sie w pozycji kursora natomiast pozostale linie nie +zostana przesuniete. + ----> Ctrl K S,M <0> +===============REKORD 30=======================================|=============== ++ 18 29 + (S) KOPIOWANIE LUB PRZENOSZENIE BLOKU Z WYROWNYWANIEM + + Funkcja.S. kopiuje zaznaczony przez nas blok (Ctrl K+ B,K,T,L) +do miejsca w tekscie rozpoczynajacego sie pozycja kursora. +Jest jednak inna niz funkcja Ctrl K C. +Wszystkie linie bloku zostana przesuniete tak,aby poczatek +pierwszej linii znajdowal sie w pozycji kursora. +UWAGA:Mozna przenosic blok do wnetrza jego samego. + Funkcja.M.przenosi zaznaczony przez nas blok (Ctrl K+ B,K,T,L) +do miejsca w tekscie rozpoczynajacego sie pozycja kursora. +W poprzednim miejscu blok bedzie skasowany. +Jest jednak inna niz funkcja Ctrl K M. +Wszystkie linie bloku zostana przesuniete tak,aby poczatek +pierwszej linii znajdowal sie w pozycji kursora. +UWAGA:Mozna przenosic blok do wnetrza jego samego. +W tym przypadku spowoduje to, ze blok nie przesunie sie w pionie +tylko w poziomie.Jego poczatek ustawi sie w kolumnie kursora. + -----> Ctrl K C,V <0> +===============REKORD 31=======================================|=============== ++ 10 23 + (R,W) WCZYTANIE I ZGRYWANIE BLOKU Z DYSKU + + Funkcja.R. umozliwia dolaczenie do naszego tekstu dowolnego +pliku z dysku.Plik jest dolaczany w miejscu wskazywanym przez +kursor,bez wyrownywania (tak jak Ctrl K C). +Pojawia sie okienko,w ktorym mozemy podac nazwe zbioru lub maske +i wtedy wybieramy odpowiedni plik tak jak w funkcji F3 L <0> + Funkcja.W. umozliwia zgranie zaznaczonego bloku na dysk. +Pojawia sie okienko,w ktorym mozemy podac nazwe zbioru lub maske +i wtedy wybieramy odpowiedni plik tak jak w funkcji F3 L <0> +===============REKORD 32=======================================|=============== ++ 8 + (I,U) PRZESUNIECIE BLOKU O JEDEN ZNAK W PRAWO LUB W LEWO + + Funkcja.I. przesuwa wszystkie linie zawierajace blok o jeden +znak w prawo.Przesuwane jest takze to co jest przed blokiem +w pierwszej linii bloku oraz za blokiem w ostatniej linii bloku + Funkcja.U. przesuwa wszystkie linie zawierajace blok o jeden +znak w lewo.Przesuwane jest takze to co jest przed blokiem +w pierwszej linii bloku oraz za blokiem w ostatniej linii bloku +===============REKORD 33=======================================|=============== ++ 5 + CHOWANIE ZAZNACZONEGO BLOKU + + Wybranie tej funkcji powoduje,ze blok staje sie niewidoczny. +Ponowne jej wybranie ustawia blok taki,jaki byl przed zaslo- +nieciem. +===============REKORD 34=======================================|=============== ++ 6 35 + (F) TWORZENIE RAMKI + + Dookola linii zawierajacych blok tworzona jest ramka. +W opcjach mozemy sobie ustawic wszelkie mozliwe parametry +ramki. + -----> Ctrl K O <0> +===============REKORD 35=======================================|=============== ++ 19 + (O) ROZNE CIEKAWE PARAMETRY + +Te opcje dotycza przede wszystkim ksztaltu ramki ale nie tylko + 3 nastepne linie to wzor ramki. + - lewy gorny , srodkowy gorny , prawy gorny + - lewy , srodkowy , prawy + - lewy dolny , srodkowy dolny , prawy dolny + F.......................................Pierwsza kolumna ramki. + - musi byc z przedzialu 0..255 + - musi byc mniejsza niz ostatnia kolumna ramki + - 0 ma specjalne znaczenie : ramka zacznie sie tam,gdzie + zaczyna sie zaznaczony tekst. + L.......................................Ostatnia kolumna ramki. + - musi byc z przedzialu 0..255 + - musi byc wieksza niz pierwsza kolumna ramki + - 0 ma specjalne znaczenie : ramka zkonczy sie tam,gdzie + zaczyna sie zaznaczony tekst. + T.....Wyrownywanie tekstu w ramce.Moze o n byc z lewej,z prawej + lub w srodku ramki. +===============REKORD 36=======================================|=============== ++ 14 + OPCJE DLA KOMPILACJI + +Tu mozna wplynac na pewne parametry kompilacji i wykonywania +programu. +D: Debug info on/off Wlaczenie powoduje,ze przy wykonywaniu + programu na specjalny plik sa wyprowadzane numery kolejno + wykonywanych instrukcji.Zwalnia to wykonywanie programu ale + umozliwia jego puzniejsze przesledzenie (patrz opcja DEBUGER) +M: Memory ______ Jest to podzielona przez 4 ilosc + pamieci zarezerwowana dla naszego programu.Moze ona przyjac + wartosc od 16384 do 100000. Korzystnie jest ustawiac 16384 + bo wtedy program szybciej sie wykonuje. +C: Cursor on/off Jest to opcja dla koneserow.Wlaczenie + jej powoduje,ze na czas wykonywania programu znika kursor +===============REKORD 37=======================================|=============== ++ 4 + (S) ZAZNACZANIE POZYCJI DLA SKOKOW + +Ta funkcja zapamietuje aktualna pozycje kursora i umozliwia +wykonanie w przyszlosci skoku do tego miejsca. +===============REKORD 38=======================================|=============== ++ 5 + (R) POWROT DO ZAZNACZONEGO WCZESNIEJ MIEJSCA + +Podobnie jak Ctrl J J skacze do zaznaczonego wczesniej miejsca +z ta roznica,ze zanim skoczy zaznacza aktualna pozycje tak , aby +potem mozna bylo do niej wrocic opcjami Ctrl J J/R. +===============REKORD 39=======================================|=============== ++ 4 + (J) SKOK DO ZAZNACZONEGO PRZEDTEM MIEJSCA W TEKSCIE + +Kursor jest przenoszony do miejsca,ktore wczesniej zaznaczylismy +opcja Ctrl J S +===============REKORD 40=======================================|=============== ++ 4 + SKOKI DO BLOKU + + B -skok do poczatku zaznaczonego bloku + K -skok do konca zaznaczonego bloku +===============REKORD 41=======================================|=============== ++ 20 + OPCJE PLIKOWE (F3O) + +Tutaj mozemy ustawiac rozne opcje wplywajace na dzialanie prog- +ramu. + S..Jest to numer linii bedacej granica miedzy okienkami + (np. miedzy plikiem glownym i dodatkowym lub plikiem glownym + i baza danych) + B..Czy maja byc robione kopie bezpiczenstwa plikow. + Jesli jest wlaczone,to przy kazdym nagraniu pliku na dysk + poprzednia wersja tego pliku nie jest kasowana tylko dosta- + je rozszerzenie BAK + D..Opuznienie odswierzania ekranu. + Jesli przez jakis czas (ustawiony w tym miejscu) nie zosta- + nie wcisniety zaden klawisz to na ekranie pojawia sie mru- + gajace niebo. + W..Opuznienie pojawiania sie okienek. + Po wybraniu funkcji edytora pojawia sie najpierw sam naglo- + a dopiero po pewnym czasie jesli nie wybierzemy zadnej + opcji okienko menu.Tutaj mamy mozliwosc ustawic czas,jaki + minie od pojawienia sie naglowka do wyswietlenia okienka. +=============KONIEC============================================|============== + + + + + + + + + + \ No newline at end of file diff --git a/doc/nguide/lisez.moi b/doc/nguide/lisez.moi new file mode 100644 index 0000000..bfbe55e --- /dev/null +++ b/doc/nguide/lisez.moi @@ -0,0 +1,14 @@ + +Voila un manuel electronique de Loglan. + + + +Pour l'installer il vous faut avoir soit NortonGuide + (les programmes ng.exe,ngc.exe,ngml.exe) +soit le "clone". +On peut se procurer d'une version de clone par reseau, voir readme. + +Si vous voulez contribuer a developpement de LOGLAN.NG +contactez moi. + A.Salwicki + diff --git a/doc/nguide/loglan.ng b/doc/nguide/loglan.ng new file mode 100644 index 0000000000000000000000000000000000000000..26c319a954adc53b300c49cda01d288b06e917f7 GIT binary patch literal 43980 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 Df4Y<2 literal 0 HcmV?d00001 diff --git a/doc/nguide/ng.exe b/doc/nguide/ng.exe new file mode 100644 index 0000000000000000000000000000000000000000..b8982e29ac91401d93c7e6b8a1f375519f7b4629 GIT binary patch literal 38160 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 literal 0 HcmV?d00001 diff --git a/doc/nguide/ngc.exe b/doc/nguide/ngc.exe new file mode 100644 index 0000000000000000000000000000000000000000..c276be7126e173935e0717e8f392516378e75a91 GIT binary patch literal 13057 zcmeHtdvsJ)n(wJPr%qKW4;}()giv9CsDUU%k%T}{=@WFgu?TjBmxT;Opc@jVaw@dl z5Q;7vs2q}x($ng6+lo=Ii_5i<$>>qLwV;?pbTTbqD-UH5(AnY8HU#mE7o0-U%S222{GnJYxR?!+{>WS}8+%>&phS~#qL&S) z2_KEV0l2zX@aoUuFRiV|noJ|UO(M+9C@8-T%0DDoIQ;w&jAjROXrlLEX&II*lH$#}k0~xgGQb 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 Zed39oPZQSD|Cq*l@x{MB?f$Pz^q)#aPE-H@ literal 0 HcmV?d00001 diff --git a/doc/nguide/ngdump/bufio.pas b/doc/nguide/ngdump/bufio.pas new file mode 100644 index 0000000..3c441ad --- /dev/null +++ b/doc/nguide/ngdump/bufio.pas @@ -0,0 +1,124 @@ +{$R+,I+} +{$M 45000,0,655360} +unit BufIO; + +interface + +procedure bread(var f:file; var buf; count:word; var result:word); +procedure bskip(var f:file; n:longint); +procedure bseek(var f:file; p:longint); +function bpos(var f:file):longint; + +implementation + +{$define Buffered} + +{$ifdef Buffered} + +const MaxFbuf = 1024; + +var fbuf : array [1..MaxFbuf] of byte; + inbuf : 0..MaxFbuf; + curbuf : 1..MaxFbuf+1; + +procedure bread( var f:file; var buf; count:word; var result:word); +type ByteArray = array [1..maxint] of byte; +var done,n:word; + abuf : ByteArray absolute buf; +begin + result := 0; + if (count > inbuf) or (inbuf = 0) then begin + if (inbuf > 0) + then move(fbuf[curbuf], buf, inbuf); + done := inbuf; + while (done < count) do begin + blockread(f, fbuf, MaxFbuf, result); + inbuf := result; + if (inbuf < 1) then begin +{ writeln('BufIO.bread: unexpected eof.'); } + FillChar(buf, count, 0); + result := 0; + exit; + end; + curbuf := 1; + n := count - done; + if (n > inbuf) then n := inbuf; + move(fbuf[curbuf], abuf[done+1], n); + inc(done, n); + dec(inbuf, n); + inc(curbuf, n); + end; + end + else begin + move(fbuf[curbuf], buf, count); + dec(inbuf, count); + inc(curbuf); + end; + result := count; +end; + +procedure bseek(var f:file; p:longint); +begin + seek(f, p); + inbuf := 0; curbuf := 1; { flush buffer } +end; + +function bpos(var f:file):longint; +begin + bpos := filepos(f) - inbuf; +end; + +procedure bskip(var f:file; n:longint); +begin + if (n < inbuf) then begin + dec(inbuf, n); + inc(curbuf, n); + end + else begin + bseek(f, bpos(f)+n); + end; +end; + +{$else} + +procedure bread( var f:file; var buf; count:word; var result:word); +begin + blockread(f, buf, count, result); + if (result < 1) then begin + writeln('BufIO.bread: unexpected eof.'); + end; +end; + +procedure bseek(var f:file; p:longint); +begin + seek(f, p); +end; + +function bpos(var f:file):longint; +begin + bpos := filepos(f); +end; + +procedure bskip(var f:file; n:longint); +begin + bseek(f, filepos(f)+n); +end; + +{$endif} + +(* +var SaveExitProc : Pointer; + +{$F+} procedure MyExitProc; {$F-} +begin + ExitProc := SaveExitProc; +end; +*) + +begin +{$ifdef Buffered} + inbuf := 0; + curbuf := 1; +{$endif} +end. + \ No newline at end of file diff --git a/doc/nguide/ngdump/ngdump.pas b/doc/nguide/ngdump/ngdump.pas new file mode 100644 index 0000000..6374ab0 --- /dev/null +++ b/doc/nguide/ngdump/ngdump.pas @@ -0,0 +1,545 @@ +{$R+,I+,V-} + +program ngdump; + +uses crt, dos, + BufIO; + +const progname = 'NGDUMP'; + version = 'V1.0'; + copyright = 'Copyright 1989 J.P.Pedersen, 1990 E.v.Asperen'; + + MaxNameLen = 40; + MaxLineLen = 160; + +type gentry = record {General entry type} + filptr:longint; + name:string[MaxNameLen]; + end; + line = string[MaxLineLen]; + +var + mennu:array[0..3,0..8] of gentry; {Buffer to hold variable part of guide menu structure} + itemlist:array[0..3] of byte; {Menu structure info} + errorinfo:array[3..6] of string[14]; {Buffer for error messages} + f:file; {The guide file} + propath,homedir,streng:string; {String variables, mostly for path and file use} + erro, + seealsonum, + menuantal, + menunr : byte; {Byte variables} + entrytype : (et_misc, et_short, et_long); + guidename : line; + +const MaxLevel = 10; + OutBufSize = 4096; + +type FileBuffer = array [1..OutBufSize] of byte; + +var outf : array [1..MaxLevel] of text; + flevel : 1..MaxLevel; + OutBuf : array [1..MaxLevel] of ^FileBuffer; + Nfiles : word; + numentries : longint; + + + +procedure threenitvars; {Initialize variables} +begin + menunr := 0; +end; + +procedure twonitvars; {Initialize variables} +begin + threenitvars; +end; + +procedure initvars; {Initialize variables} +var str5:string; +begin + twonitvars; + errorinfo[3] := 'File not found'; + errorinfo[4] := 'Not an NG file'; + errorinfo[5] := 'Unexpected EOF'; + errorinfo[6] := 'Corrupted file'; + str5 := '';propath := paramstr(0); + while (pos('\',propath) > 0) do begin + str5 := str5+copy(propath,1,pos('\',propath)); + propath := copy(propath,pos('\',propath)+1,length(propath)-(pos('\',propath)+1)); + end; + propath := str5; +end; + +var attr, startattr : byte; + +procedure WriteNgString(var outf:text; s:string); +var i,j:byte; + c:char; +begin + i := 1; + attr := startattr; + while (i <= length(s)) do begin + c := s[i]; + if c = #255 then begin + {Expand spaces} + inc(i); + c := s[i]; + for j := 1 to ord(c) do begin + write(outf, ' '); + end; + end + else begin + if (c = '!') and (i = 1) then write(outf, c); + write(outf, c); + end; + inc(i); + end; + + writeln(outf); +end; + +procedure WriteString(s:string); +begin + WriteNgString(outf[flevel], s); +end; + +const Fx = 10; Fy = 2; + Gx = 10; Gy = 3; + Mx = 10; My = 5; + Cx = 10; Cy = 7; + Lx = 10; Ly = 8; + Sx = 10; Sy = 10; + + +procedure ShowShort(s:string); +begin + gotoxy(Sx, Sy); ClrEol; + gotoxy(1, Sy+1); ClrEol; + gotoxy(Sx, Sy); WriteNgString(Output, s); +end; + +procedure ShowLong(n:longint); +begin + gotoxy(Lx, Ly); write(n:7); +end; + +procedure ShowEndLong; +begin + gotoxy(Lx, Ly); ClrEol; +end; + +procedure ShowFile(s:string); +begin + gotoxy(Fx, Fy); ClrEol; write(s); +end; + +procedure ShowGuide(s:string); +begin + gotoxy(Gx, Gy); ClrEol; write(s); +end; + +procedure ShowCount(n:longint); +begin + gotoxy(Cx, Cy); write(n:7); +end; + +procedure ShowMenu(s:string); +begin + gotoxy(Mx, My); ClrEol; WriteNgString(output, s); +end; + +procedure ScreenInit; +begin + ClrScr; + gotoxy(Fx-8, Fy); write(' file:'); + gotoxy(Gx-8, Gy); write('guide:'); + gotoxy(Mx-8, My); write(' menu:'); + gotoxy(Cx-8, Cy); write('count:'); + gotoxy(Lx-8, Ly); write('lines:'); + gotoxy(Sx-8, Sy); write('entry:'); +end; + +procedure ScreenExit; +begin + gotoxy(1, Sy+3); ClrScr; +end; + +procedure Usage; {Write usage info} +begin + writeln; + writeln('usage: ngdump filename'); + writeln; + Halt(1); +end; + +procedure slutlort(b:byte); {Exit on error and display relevant error message} +begin + if b > 3 then close(f); + if b > 2 then begin + writeln('NGDUMP ERROR #', b, ': '+errorinfo[b]+', cannot proceed'); + end; + if b < 3 then usage; + halt(0); +end; + +procedure sllut(b:byte); {Error handler without exit, just indicating the error type} +var sl:byte; +begin + sl := 0; + if b > 3 then close(f); + writeln(' ',errorinfo[b],' - Press any key'); + erro := 1; +end; + +function decrypt(b:byte):byte; {Decrypt byte from NG format} +begin +(* + if ((b mod 32)>=16) then b := b-16 else b := b+16; + if ((b mod 16)>=8) then b := b-8 else b := b+8; + if ((b mod 4)>=2) then b := b-2 else b := b+2; + decrypt := b; +*) + decrypt := b xor (16+8+2); { this is somewhat more efficient... EVAS} +end; + +function read_byte:byte; {Read and decrypt byte} +var tb:byte; + numread:word; +begin + bread(f, tb, 1, numread); + read_byte := tb xor 26; +end; + +function read_word:word; {Read and decrypt word} +var tb:byte; +begin + tb := read_byte; + read_word := word(tb) or (word(read_byte) shl 8); +end; + +function read_long:longint; {Read and decrypt longint} +var tw:word; +begin + tw := read_word; + read_long := longint(tw) or (longint(read_word) shl 16); +end; + +type BigStr = string[255]; + +procedure read_string(maxlen:byte; var s:BigStr); +var c,j:byte; +begin + j := 0; + repeat + c := read_byte; + inc(j); + s[j] := chr(c); + until (c = 0) or (j = maxlen); + s[0] := chr(j-1); +end; + +procedure read_menu; {Read a menu structure into the menu buffer} +var items,i,j:word; +begin + mennu[menunr,0].filptr := bpos(f)-2; + bskip(f, 2); + items := read_word; + itemlist[menunr] := items; + bskip(f, 20); + for i := 1 to items-1 do begin + mennu[menunr,i].filptr := read_long; + end; + bskip(f, items * 8); + for i := 0 to items-1 do begin + with mennu[menunr, i] do begin + read_string( 40, name ); + end; + end; + bskip(f, 1); +end; + +procedure skip_short_long; {Skip procedure for the initial menu bseek} +var length:word; +begin + length := read_word; + bskip(f, length + 22); +end; + +procedure read_header(modf:byte); {Read NG file header and enter the guide name in the screen template} +var buf : array[0..377] of byte; + i,numread : word; +begin + bread(f, buf, sizeof(buf), numread); + if ((buf[0]<>ord('N')) or (buf[1]<>ord('G'))) then begin + {If the two first characters in the file are not 'NG', the file is no guide} + if modf = 0 + then slutlort(4) + else sllut(4); + end; + + menuantal := buf[6]; + i := 0; + repeat + guidename[i+1] := chr(buf[i+8]); + inc(i); + until (buf[i+8] = 0); + guidename[0] := chr(i); + + ShowGuide( guidename ); + bseek(f, 378); +end; + +procedure read_menus(modf:boolean); {Initial menu bseek, indexing the whole file} +var id : word; +begin + repeat + id := read_word; + if (id < 2) then begin + skip_short_long + end + else if (id = 2) then begin + read_menu; + inc(menunr); + end + else if (id <> 5) then begin + if (filesize(f) <> bpos(f)) then begin + if (not modf) + then slutlort(5) + else sllut(5); {NG file error} + end + else id := 5; + end; + until (id = 5); + + if (menunr <> menuantal) then begin + if (not modf) + then slutlort(6) + else sllut(6); {Incomplete file} + end; +end; + +function MakeName:Dos.PathStr; +var fname:Dos.PathStr; +begin + inc(Nfiles); + str(Nfiles, fname); + MakeName := fname; +end; + +procedure OpenOutFile(n:word; s:Dos.PathStr); +begin + assign(outf[n], s); rewrite(outf[n]); + SetTextBuf(outf[n], OutBuf[n]^, OutBufSize); +end; + +procedure read_entry(level:byte; fp:longint); forward; + +procedure read_short_entry(level:byte); +{Read short entry from file and wring some information out of it} +var i, items: word; + subject : line; + entrypos, subj_pos, p0, p : longint; +begin + bskip(f, 2); + items := read_word; + bskip(f, 20); + p0 := bpos(f); + subj_pos := p0 + longint(items) * 6; + for i := 1 to items do begin + bskip(f, 2); + entrypos := read_long; + p := bpos(f); + bseek(f, subj_pos); + read_string( MaxLineLen, subject ); + subj_pos := bpos(f); + write(outf[flevel], '!short:'); WriteString(subject); +{} ShowShort(subject); + read_entry(level+1, entrypos); + bseek(f, p); + end; +end; + +procedure read_long_entry; +{Read long entry information} +const MaxSeeAlso = 20; +var i, linens, dlength, seealso_num : word; + s : line; +begin + bskip(f, 2); + linens := read_word; + dlength := read_word; +{} ShowLong(linens); + bskip(f, 18); { 10 + links to prev/next entry (long's) } + for i := 1 to linens do begin + read_string( MaxLineLen, s ); + WriteString(s); + end; + + if dlength <> 0 then begin {If there are seealso entries, read them} + seealso_num := read_word; + { skip the offsets for the SeeAlso-items; } + bskip(f, seealso_num * 4); + { read the items; } + for i := 1 to seealso_num do begin + if i <= MaxSeeAlso then begin + read_string( MaxLineLen, s ); + writeln(outf[flevel], '!seealso: "', s, '"'); + end; + end; + end; +{} ShowEndLong; +end; + +procedure read_entry(level:byte; fp:longint); {Read some kind of file entry} +var id:word; fname:dos.pathstr; +begin + inc(numentries); ShowCount(numentries); + bseek(f, fp); + id := read_word; + case id of + 0: begin + if (level > 0) then begin + fname := MakeName; + writeln(outf[flevel], '!file: ',fname+'.NGO'); + inc(flevel); +{$ifdef Debug} + assign(outf[flevel], 'CON'); rewrite(outf[flevel]); +{$else} + OpenOutFile(flevel, fname+'.DAT'); +{$endif} + read_short_entry(level); + close(outf[flevel]); + dec(flevel); + end + else begin + read_short_entry(level); + end; + end; + 1: begin +(* + if (level > 0) and (not odd(level)) then begin + fname := MakeName; + writeln(outf[flevel], '!long: ',fname+'.NGO'); + inc(flevel); +{$ifdef Debug} + assign(outf[flevel], 'CON'); rewrite(outf[flevel]); +{$else} + OpenOutFile(flevel, fname+'.DAT'); +{$endif} + read_long_entry; + close(outf[flevel]); + dec(flevel); + end + else begin + read_long_entry; + end; +*) + read_long_entry; + end; + end; +end; + + +procedure Main; +label Next; +var i,j,k:word; + linkf : text; + fname : Dos.PathStr; +begin + numentries := 0; + + { create Menu Link Control File; } + assign(linkf, 'GUIDE.LCF'); rewrite(linkf); + writeln(linkf, '!name:'^i, guidename); + writeln(linkf); + + for i := 0 to menuantal-1 do begin + writeln(linkf, '!menu:'^i, mennu[i,0].name); + ShowMenu(mennu[i,0].name); + for j := 1 to itemlist[i]-1 do begin + close(outf[flevel]); + fname := MakeName; + OpenOutFile(flevel, fname+'.dat'); + ShowMenu(mennu[i,j].name); + writeln(linkf, ^i, mennu[i,j].name, ^i, fname+'.ngo'); + read_entry( 0, mennu[i,j].filptr ); +Next: + end; + end; + + close(linkf); + + { write a makefile; } + assign(linkf, 'MAKEGUID'); rewrite(linkf); + writeln(linkf, '.dat.ngo:'); + writeln(linkf, ^i'ngc $<'); + writeln(linkf); + write(linkf, 'OBJECTS='); + j := 0; + for i := 1 to Nfiles do begin + str(i, fname); + fname := fname + '.ngo '; + write(linkf, fname); + inc(j, length(fname)); + if (j > 65) then begin + write(linkf, '\'^m^j^i); + j := 0; + end; + end; + writeln(linkf); + writeln(linkf); + writeln(linkf, 'guide.ng: $(OBJECTS)'); + writeln(linkf, ^i'ngml guide.lcf'); + close(linkf); +end; + +var i:byte; +begin {Main loop and command-line parser} + flevel := 1; + Nfiles := 0; + for i := 1 to MaxLevel do begin + new(OutBuf[i]); + end; + +{$ifndef Debug} + assign(outf[flevel], 'CON'); +{$else} + assign(outf[flevel], 'GUIDE.DAT'); +{$endif} + rewrite(outf[flevel]); + SetTextBuf(outf[flevel], OutBuf[flevel]^, OutBufSize); + + writeln(progname,' ',version,'. ',copyright,'.'); + initvars; {Initialize global variables} + + if ((paramstr(1)='/?') or (paramstr(1)='/h') or (paramstr(1)='/H')) then begin + Usage; + end; + + if (ParamCount <> 1) then begin + Usage; + end; + + streng := paramstr(1); + + if pos('.',streng)=0 + then streng := streng+'.NG'; {Expand file name} + + assign(f, streng); +{$I-} + reset(f, 1); + if ioresult<>0 then slutlort(3); {If file does not exist, terminate and write cause of death} +{$I+} + + ScreenInit; + ShowFile(streng); + ShowMenu('reading menu-info...'); + read_header(0); + read_menus(False); + Main; + + close(f); + close(outf[flevel]); + ScreenExit; +end. + \ No newline at end of file diff --git a/doc/nguide/ngdump/readme b/doc/nguide/ngdump/readme new file mode 100644 index 0000000..1dd5398 --- /dev/null +++ b/doc/nguide/ngdump/readme @@ -0,0 +1,18 @@ +21/06/1990 + + +This is the README for NGDUMP, a decompiler for Norton Guides Database +files. NGDUMP is based on NG_CLONE, a clone of the NG program I found +on SIMTEL (ng_clone.zip). I modified the program to emit +source code for the NG compiler. + +usage: ngdump databasefile[.ng] + +NGDUMP creates numbered data-files (1.dat, 2.dat, etc.) with the text, +a NG linker control file (GUIDE.LCF), and a makefile (MAKEGUID). + +Enjoy + +Eelco van Asperen +evas@cs.eur.nl (asperen@hroeur5.bitnet) +Erasmus University Rotterdam, The Netherlands diff --git a/doc/nguide/ngml.exe b/doc/nguide/ngml.exe new file mode 100644 index 0000000000000000000000000000000000000000..bff50a041043af775b1f2d22c7b418ad3feba425 GIT binary patch literal 14519 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 J3?Z!L{{l;W4BP+! literal 0 HcmV?d00001 diff --git a/doc/nguide/readme b/doc/nguide/readme new file mode 100644 index 0000000..1dd5398 --- /dev/null +++ b/doc/nguide/readme @@ -0,0 +1,18 @@ +21/06/1990 + + +This is the README for NGDUMP, a decompiler for Norton Guides Database +files. NGDUMP is based on NG_CLONE, a clone of the NG program I found +on SIMTEL (ng_clone.zip). I modified the program to emit +source code for the NG compiler. + +usage: ngdump databasefile[.ng] + +NGDUMP creates numbered data-files (1.dat, 2.dat, etc.) with the text, +a NG linker control file (GUIDE.LCF), and a makefile (MAKEGUID). + +Enjoy + +Eelco van Asperen +evas@cs.eur.nl (asperen@hroeur5.bitnet) +Erasmus University Rotterdam, The Netherlands diff --git a/doc/prototyp.doc b/doc/prototyp.doc new file mode 100644 index 0000000..a2cfcef --- /dev/null +++ b/doc/prototyp.doc @@ -0,0 +1,34 @@ +IIUWGRAPH: +procedure gron(mode :integer); +procedure groff; +procedure cls; +procedure point(x,y :integer); +procedure move(x,y :integer); +procedure draw(x,y,c :integer); /* lineto */ +procedure hfill(x :integer); /* Hline */ +procedure vfill(y :integer); /* Vline */ +procedure color(c :integer); /* setfgcolor */ +procedure patern(x1,y1,x2,y2,c,motif :integer); /* box */ +procedure intens(num :integer; x,y:arrayof integer; c,motif :integer); /* polygon*/ +procedure palett(x :integer); +procedure border(c :integer); /* setbgcolor */ +function inxpos : integer; +function inypos : integer; +procedure inpix( output x,y :integer); +function getmap(x,y :integer):arrayof integer; +procedure putmap(map :arrayof integer); +procedure ormap(map :arrayof integer); +procedure xormap(map :arrayof integer); +procedure track(x,y,c,val :integer); /* writint */ +function inkey : integer; +procedure hascii(car : integer); +function hfont(x,y,lg,min,max,defaut,col_f,col_e,col_c :integer):integer /* gscnum */ +function hfont8(x,y,lg,lgmax :integer;defaut :string; col_f,col_e,col_c :integer):arrayof char /* gschar */ +procedure outstring(x,y :integer;texte :string;col_e,col_f :integer); +procedure cirb(x,y,rx,ry,start,end,c,motif : integer); /* ellipse */ +MOUSE: +procedure init(mo,kb : integer); +procedure getmovement(mo,kb : integer); /* changevtype */ +function getpress(v,p,h,l,r,c : integer): boolean; +procedure showcursor; +procedure hidecursor; diff --git a/doc/quickref.doc b/doc/quickref.doc new file mode 100644 index 0000000000000000000000000000000000000000..3458034d39892c57418a2ebae3f4bc5cda2e7cdd GIT binary patch literal 15331 zcmd^`dz@8Oy}R^`Yqfd~dy}O9>WzNkU*EkcJG*zU6<1z%PBNpE<3#5?j>kLKa9n22!=6hUPH;ua$ZMoC&Kb`8-+wJS^VCJn zOOBmAGq$XdjIUP9y$&zuW#XP%;N}u_wXJ=byxXfz$>!2^RVtbHRoZhi$xNrJPi8u} z>ZYdFRdI`#&Sg7uZd%RFxM}aiIWf6rUUL&(Jmu!xd@`HyPc+xtz0PDNQX-l0^SMIY zmXJriOrox8X;5R*SFS2#lKDo}l2?4ocX=w8&E{3MgFE@0=gFCr@Ec<%7jn`;H>12> zFJ6#3<*qyvb}`>2mB?d!7JM(ETxlYnO{F~333))f`Mj6Q_=<5V>7dKJ_>HPLQ~YMz zmv*HhFG(9YY1pNbZZlq$^WxcDLe-m|(tg}a6ms5FMV%DPwqHPl_9k=W`%@cbI!}&F zSS%KkYCYvbN3xp(^X}WGBQx8i>Z&N)?dBR72;FTk6VjmkWM{@rHK;B(lSp|vUs2FV zjH0TyNwqbozJ`mM)QUNERgwCn0ZJs@_LS$VUiq5u(_T=#_;p24nVE#SQKy zV!cM-X@6>{219jVkP6Hlq5wv7n34SXJ;_w6NewO`s)LHC<~gyL*PTpwnS82G^<@hx z;~~uqs*%qkCMFKqbmX#W#GB403Mr4#?=#Bcoo3b3m5g_V&mnnvaDJnT$(U5y?NjY& zT1K?3NtDS7lld0W$+YLP=v&5Xus7vedny}WU7Y*|)ltY84U5?c61{O%D(M?twibov zF?Sxy=QqTbFI?Qb{EXJvG+Pr=^ckKK8&jbHiCuOibJUTdajI+z3X7KMoY$ci*bCGW zwr?uJc0{CzHs|?;R9?9qv^uE$X`$W(4XPG{R15Ythe^yA za+y%&!$LEgqLbmzoTGZsrm$32j2oLwX67j7KAp_Cc`sD&u-X00NubQ8gt)unw4yVn zXVSl!4a#)TNI+D^xQ%F0>3GB7{xu|VVE7u}yRaZjfq5ospRrijFXd|O;YH9%ajznM z6*VrY$#@}|MkbT@Qmfm!q;LHry0=37wkc7?sBC-roSX5}N#93N#Iq$cx&8F>{dMEKb&ewUQB%M)wf$MCE&XW@k51o5|}>GzXqjcc_d zm%$d5&3H-EIKF7eoQjub63r6KO-7!?vf{V~pRSiWE^RY^IC@%U2%!)1`~19T7ekzX z4)34u$>vr!sy12SyjpCOq(b#HGw&L~unFEsa9_ zuP;JCTt+rFtZ7uO*<8;0GqI^Kn6YZzoX@6{@j+&0Z{YfRRnt5*m#zl-dtzM`iwSGC zbRhbOJQ0?UXLX;dk3K~hCKpZQv){*M4U(>Be3?U}Clg@>EE5&A9&yNsKsB3TOS}>; z=XF)ZOSVYFF9iLwPOz>j<+0|ELho8?f<6?k?OahA*_i5I2 zp6m^0hjO<6rrTzkI148@TrH&MNnB_W<0&~+mzn87%C>KbK+-|Ys|l&t#nx)A`lEBl18;8s}gRelaQm6J_UJ$KPkpDeN%epU9?us zJJCEuODd>nN}s83%0;%?pgYM7B0#l#uaL+_deOw{;ivFMq0L6_SqCejxQX$k6B2^j z8W)6t*nWh^y-*z@k}Jh-p-q$`UY-a#N=D$uyUff5AwDvUJgRydjH^eQ86u3;+!evb z3ptXie57E!3%`UyV5x*4LG1}oYOkw8BeKDhW<|BF2Bnr3o%s~CAe*sO$NTE4a5;!O zFz9R!KPq-%tk3#>L|9Z%X_d9(18L?gkbc^uQ<dl#@l5nNEzW0igslaX2KDO ztRKW;Va-9`gRiri=81vWR@+zy>l+&zB^KMSiAb1Z@`h6RAguQN`nd=_ZK4JL#Hn)> z^#n~}H>|4l_L*5IaVQEp7tUxf?68xwf=97B%}hl^QY>ghAyym|^)iz9D3%dZM4TWk zC76bysYdU~LMAsBH@BW4)-UHl-3??a)Fm1kEYn31@(@x8gy2~(5qVOCVAp4AjJ6i^ z5mA^`F&sY zxRP&>|C@RDQhig6eY%7Vm|{5UqV|wo8U2}~VnGAeFmx8>mnp_H65d7Ay0ZnNVkS2a zrp_4Cfhv|2-c}v--#SK7(9*2Tu#-=izpSn*C=jHB(RNu$&}xL_cLkOg6{HwK$(H7b z*QRX-VET^`30spLeO&jg0@yBy#QiLJni-8~kPQR}t3#-8X2rGRp4Au?ws@*XT_OJN~FO7F+I94lXg(srX zLDDuz_exqC27|`WkOdTjXFE)*C!y;mWXj|V1Wh)C_vgfB+@~-TdKmHQCM`>QUf#BX zzY26FS_Wen(%EU$qWl8Md)y_!5lu7^v^zw-2p)o`8)7r*g3;QZq9VzZ#6q7;et*y-D5}oD|yXH{-~N`_*qx~k zYL~1yTK8bJrpn{Q&)8tUm@12np(VwXcF^4NOc*5Lyi2`4em}h??=(R>o=p~A*>ob! z3j+P(RLFG8ie-#8wt(y_E4zmg?JPwc$&QkZPTyxROmarGC@+QBPiOC@)Vmq`78Mg# z^RrpvX&Gl2sK;6wc=Dimy1F>1pDMD!mdn~;vL#Y(v9Yp*&N7XWL4+>OFLZX=_!?s% z@wQVf?k^HRyJ=A%QMt%fU(vtf)=((nt|b0Gl*5pb(x(;^y&tf|0q24#3b!jnMA44a z)v}MlZfpuo!=~$M6M$yCTk)8j1PRp^^9pfkNs_i^aS`(+>9E~S(r(`CWDN}WO&e5m z10}-CCF!wA({ivrTeo0bSvU2oj2h}> zeUY7k`h`qG=!)gH4t5ZzqFARGaM06Ie`ranSio)&bAV=-ZUsVbWfO&Q47zT%7ec)u z)s+(dB&jIYV$(HQSJV`>1m_}87k$DBGmL9Kn~Mo~X!2OvkIj^Qg9O``Oj|05`ONsm z6(8#}7V*Pmz}bw+ofor}ot&1!d8e2KlOLJ}wd}9jm0e;`I?YNiJB+3>ldyZyZG6sy zP=VP^cpYr6lSoJRpKKdUqYTrP+KY^Tf*2?yv?aM{>H_`88=UqZ*y zF9$<^Zm`?@W|OZmCev)%k`1|NOW0Q;Ya-)lTA|Vhm@G;8ZA8zIa$Z6bN;6N3vYiAX zjObL^IlCv#%xvRlZz*7l9xGu8fn&#alIMlWqXb>W!f#;R#GquW{* zFI4BAq$V%s#gAZplgBK{c6;e|kDt&^IDV|%u&%2e*Il-*`ijpte&O-vFD|RRGBfO| z@s(F+hMlihX;-)FxK3zKcj!*trIY#sy;`SqT4!`tYrS`GPWzfYYu&ATbg%By7wL=j z8ogFuqCctE=}+lP^{4e`^k?;d>d)!R^yl^E`U?F8{Y8DHzDi%Mzof6x*Xrx^_4)?= zW&IU>qyDPCNqtiP^r(cjRw>i^Q;)ZfzU^=06XBH@FqAFjx!t%hofK-EQT{74;R5Ycmke*P4GMT zJ-iIB!9QRRIKv#L2FAh%U@CkFX2V=K2~LJQ+yVE%Bd`a`Djnxza6ZJL3od{hY=m7< z#t-?Ga45`#xiBA2gY~ch9)aiKWq1YlKuwk7)WYGgXZNn%J9qCI*uHgO>%jJbt^5n# zTXyc=yq!zi2R554a%cNyDdcd4^7iHnn}QSjFh>SnRW4(9#?gTNtT3PBt19^8gK}qL zaDRMNS#aH!8_#vQFVD$m_EvSh(&S;no^WdY<0yn_d;XZf(o`ucu z7E~U>b1(+RLp_`cXTeHvAqzcl6MPG9g9qUI@E|+_kHSXyDf}E>f$i{T*ab(_InE?F z7LJFxkcW$54XlMrU>!UF--YMlx9|eI2)~2hgXjbAKkwSXamSurd(6r1ZM(L;vg;)- z?J>yp==&x4BF_a!Ik6>eb-P6;tn5XWq7xG%x?p6@Br_IgyyGY*C?oQhvPC^{&XzuI zhCjd`VLQAA1MoL^9sURY2^EK;Mi7HKm=B9!1;il>Ik*JY!9DPO_yPP7YDXY*7z@*( z1@;sa5$nKqF6}hz3{S$(ox2Cjv-UGMQg~p`&fVe|f>)JOKHMoouKW6j z&>w`l63RdD56(H#zva*hE8*i1hcsm23b+<-hws9Z@DxlQgZ;s5XofGr_3#_`1MC22 zEGh_fFb2lK`(X*31-HZZ;6Zo@o`z>&8&r;C4q+6GhNo z6gI&Ycp3fyyWwB(HViwQ`k@+XAqJCRGMoqJLjrQp4Qt^N_zZj(9)bb*JG=ogZ0r!g z)_3mMx@9Lq<}IJXW)7R>bj#)!w!AR(W6P$Uo4CrGlbz4~`Z;sXcfN{v%PPvsk#AtP z!DlGXK)$tN;uT`+!yW9tcs|7LOL}7T#aS->9tnrR7#IhK!!&4wJX`{wgzMo3_!`^{ z--ZX^VR!@{g&)J?uo0esU%=Dwz6q@Va5PMZ55sBD0n zoWFUjh8mazli?^h2E;6SfD)ncUxsifrEW-+@u{5v<=6 zk>hYYxBaY?PwZVjWqp_HcAY=6=-=)4QhX5VPhj_9oZu{#{!f8pVHqrkHaH8?umc95 z?EQ{&HmrsX@F+Y5&HRn%X|M#A!iA87Zs>tt=z}$|7OsM;;cIX+d=upFOdo-NzVWv| z@7VUrOMiRirQpEY6nQ(w9!j(G|L5#bf;V2`Q+W;JTlvs6-O4tM1t(TrYGS@nH^SI& zVvKlDVnHf;%b6UF|9?(QFERf_8XHTzEit>q>AfIv`ql6=kXXGNe^f#2EAjGJm<|#% ze*$iWZ-T_k5?8(kZ|vN$>FFo#zkB_am+i=j>_@$ zk5IjQ)aX%V;kiFzTyQ>Y@2Jst*V^k+URTRG%ZYi7FPl(yUCR0D1gHGEz5OG8brj~z zjhf<-Z;}Rt^|4e$pS$tpvhdM)lfp-(fUSflhkbTr*ehv$#jtm1-99Xj2fd(<%F@WB zj!&2oA7ljbY^^x`@KZ)mszXL&`&9e3Q~t}NzfxA^RMX?JFPDw$Dsv`?Y$U$_3;Y#c z2Z{9$1&Q}1&OZyz0g3O2)7vkoaC=`)v@$_iuCV5VMbiMwkwZ;X05QUt;@b zAdK(d?b)4=stJ^A@9YvlWuj#W2xtlH8cCmU%ZDzAgg zlFacSIZJ3PuTUqdi#lOzTp4OtL>^9MIG2=(YG6fazC~vBHF zav=GT^}{W5s%)&AFB?0@{#{(d=o^^wF-j5LTjjTX2{%0ej|C!Y2+@F(?||8oETs77|8*)N8P>B4Z{jXx~6;8n(ourbO)0+_u5DMwGiP^*`Cr z-+yiY`dhxZ{&Sy7b@V^6s(<~emFqbMatzn}lGhXa@<&+D{qN3VY2B9EqO&_{bf`Il zd_gf(Q>h+1C-3bj>9T!QzV4L$^62Wa zDf}llu5$iIZZPYSRokg3S>+&`8WvvPS2E9*+gR|q5kD@5k4k-SjAofOY=I6IgwYT+*(yLZdJ`l z=XGZnSKe^;4th(ey^hmwA2rV6qn?IxM;9NarwTlrx%vjy2^ZPL^0n)=Tl3VmFevj${7D zI}@BEocHnn1zG*tlJcKCmhc<+@+^PX#iCel|1iv{p5pKWy_<4kqnxF#{J@^cIwO{s zuXJ_C$^4+!?&f{xkm2RU-(Jl|<8w6lVWxXATmyH)pP&NipAX$|Iot|)I(7xz0QZ7y zc8x{8m(kfOwbglhX(j4ECQLh(UZpPr4}Ve!ZgjF^{a(T7ft)f ztm)I8MN8XeG&xIK7c6gC+P3daiVuF(R;;Kv*}2sDz{f>;HO`H(S=9;7M3P3DW?QR) z)3?j)cX?i1*n!@I>p$4HbIKntTNxCvElQiVm8*-5l{p?|YR_m{a_an+w#Cg$B@M2Y zuZtF*(l%mUnb8^18&q} imagemask + } + 76 /G4c MSTT31c4bd AddChar +/G4f [58.0 0.0 3.0 -1.0 55.0 51.0] +/G4f { + 52 52 true [1 0 0 -1 -3.0 51.0] {<00001fff0000000000fffff000000003fffffe0000000ffe03ff0000003ff800ffc000007fe0007f +e00000ffc0003ff00001ff80001ff80003ff80000ffc0007ff00000ffe0007ff000007ff000ffe00 +0007ff001ffe000007ff801ffc000003ff803ffc000003ffc03ffc000003ffc07ffc000003ffe07f +fc000003ffe07ff8000001ffe07ff8000001ffe0fff8000001fff0fff8000001fff0fff8000001ff +f0fff8000001fff0fff8000001fff0fff8000001fff0fff8000001fff0fff8000001fff0fff80000 +01fff0fff8000001fff0fff8000001fff07ff8000001ffe07ff8000001ffe07ff8000001ffe07ffc +000003ffe03ffc000003ffc03ffc000003ffc03ffc000003ff801ffc000003ff801ffe000007ff00 +0ffe000007ff0007ff000007fe0007ff00000ffc0003ff80001ffc0001ff80001ff80000ffc0003f +f000007fe0007fe000001ff000ff8000000ffe03ff00000003fffffc000000007ffff0000000000f +ff000000>} imagemask + } + 79 /G4f MSTT31c4bd AddChar +/G47 [58.0 0.0 3.0 -1.0 57.0 51.0] +/G47 { + 54 52 true [1 0 0 -1 -3.0 51.0] {<000003ffc0010000003ffffc03000001ffffff87000007ff807fff00000ffc000fff00003ff80003 +ff00007fe00000ff0000ffc000007f0001ffc000003f0003ff8000001f0007ff0000000f0007ff00 +00000f000ffe00000007001ffe00000007001ffe00000003003ffc00000003003ffc00000001003f +fc00000000007ffc00000000007ffc00000000007ff80000000000fff80000000000fff800000000 +00fff80000000000fff80000000000fff80000000000fff80000000000fff80000000000fff80000 +000000fff80000000000fff80007fffffcfff800007fffe07ff800001fff807ffc00000fff007ffc +00000fff007ffc00000fff003ffc00000fff003ffc00000fff001ffe00000fff001ffe00000fff00 +0ffe00000fff0007ff00000fff0003ff00000fff0003ff80000fff0000ffc0000fff00007fe0000f +ff00003ff0000fff00001ffc000fff000007ff807ffc000001ffffffe00000007fffff0000000007 +ffe00000>} imagemask + } + 71 /G47 MSTT31c4bd AddChar +/G41 [54.0 0.0 0.0 0.0 52.0 51.0] +/G41 { + 52 51 true [1 0 0 -1 0.0 51.0] {<000000200000000000006000000000000070000000000000f0000000000000f8000000000001f800 +0000000001fc000000000003fc000000000003fc000000000003fe000000000007fe000000000007 +ff00000000000fff00000000000fff80000000001fff80000000001fff80000000001fffc0000000 +003fffc0000000003bffe00000000073ffe00000000071fff000000000e1fff000000000e1fff000 +000000e0fff800000001c0fff800000001c07ffc00000003807ffc00000003803ffe00000007003f +fe00000007003ffe00000007001fff0000000e001fff0000000e000fff8000001c000fff8000001f +ffffffc000003fffffffc000003fffffffc00000380003ffe00000700003ffe00000700001fff000 +00e00001fff00000e00000fff80001c00000fff80001c00000fff80003c000007ffc0003c000007f +fc0007c000007ffe000fc000003fff001fe000007fff003ff80000ffffc0ffff000ffffff0>} imagemask + } + 65 /G41 MSTT31c4bd AddChar +/G4e [54.0 0.0 1.0 -1.0 53.0 50.0] +/G4e { + 52 51 true [1 0 0 -1 -1.0 50.0] {} imagemask + } + 78 /G4e MSTT31c4bd AddChar +/G27 [21.0 0.0 5.0 27.0 15.0 51.0] +/G27 { + 10 24 true [1 0 0 -1 -5.0 51.0] {<1e003f807f80ffc0ffc0ffc0ffc0ffc0ffc07f807f807f807f803f003f003f003f001e001e001e00 +1e000c000c000c00>} imagemask + } + 39 /G27 MSTT31c4bd AddChar +/G38 [38.0 0.0 2.0 -1.0 35.0 51.0] +/G38 { + 33 52 true [1 0 0 -1 -2.0 51.0] {<000ffc0000007fff800001ffffe00003fe0ff00007f807f8000ff003fc001fe001fe003fe001fe00 +3fe000ff007fe000ff007fe000ff007ff000ff007ff000ff007ff800ff007ffc00ff007ffe00fe00 +3fff01fe003fff81fc003fffc3f8001ffff3f8000fffffe0000fffffc00007ffff000003ffff8000 +00ffffc000007fffe000003ffff000007ffff80001fffffc0007f3fffe000fe0fffe001fc07fff00 +3fc03fff003f801fff007f800fff807f000fff80ff0007ff80ff0003ff80ff0003ff80ff0003ff80 +ff0001ff80ff0001ff00ff0001ff007f8001ff007f8001fe003f8003fc003fc003fc001fe00ff800 +0ff81ff00003ffffc00000ffff0000001ff80000>} imagemask + } + 56 /G38 MSTT31c4bd AddChar +/G32 [38.0 0.0 1.0 0.0 34.0 51.0] +/G32 { + 33 51 true [1 0 0 -1 -1.0 51.0] {<000ff00000003ffe000000ffff000001ffffc00003ffffe00007fffff0000ffffff0000ffffff800 +1ffffff8001f03fffc003c00fffc0038007ffc0070003ffc0060001ffc0000001ffc0000000ffc00 +00000ff80000000ff80000000ff80000000ff80000000ff00000000ff00000001fe00000001fe000 +00001fc00000003f800000003f800000003f000000007e000000007c00000000f800000001f80000 +0001f000000003e000000007c00000000f800000001f000180001e000180003c0003000078000700 +00f0000f0001ffffff0001ffffff0003fffffe0007fffffe000ffffffe001ffffffe003ffffffc00 +7ffffffc007ffffffc00fffffffc00>} imagemask + } + 50 /G32 MSTT31c4bd AddChar +%%EndResource + +0 0 0 fC +248 324 421 (LOGLAN'82) 421 SB + +%%BeginResource: font MSTT31c4bd +/G51 [59.0 0.0 3.0 -12.0 56.0 51.0] +/G51 { + 53 63 true [1 0 0 -1 -3.0 51.0] {<000007ff00000000007ffff000000001fffffe00000007fe03ff0000001ff800ffc000003fe0003f +e00000ffc0001ff80001ffc0000ffc0003ff80000ffe0003ff000007fe0007ff000007ff000ffe00 +0003ff801ffe000003ffc01ffe000001ffc03ffc000001ffe03ffc000001ffe03ffc000001ffe07f +fc000001fff07ff8000000fff07ff8000000fff0fff8000000fff8fff8000000fff8fff8000000ff +f8fff8000000fff8fff8000000fff8fff8000000fff8fff8000000fff8fff8000000fff8fff80000 +00fff8fff8000000fff8fff8000000fff87ff8000000fff07ff8000000fff07ff8000000fff07ffc +000001fff03ffc000001ffe03ffc000001ffe01ffc000001ffc01ffe000003ffc00ffe000003ff80 +0ffe000003ff8007ff000007ff0003ff000007fe0001ff80000ffc0000ff80000ff800007fc0001f +f000003fe0003fe000001ff800ffc0000007fe03ff00000001fffffc000000003fffe0000000000f +ff800000000007ffc00000000007ffc00000000003ffe00000000001fff00000000000fff8000000 +00007ffc00000000003fff00000000001fffe00000000007ffffc000000001ffffc0000000001fff +c0>} imagemask + } + 81 /G51 MSTT31c4bd AddChar +/G75 [41.0 0.0 3.0 -1.0 38.0 34.0] +/G75 { + 35 35 true [1 0 0 -1 -3.0 34.0] {} imagemask + } + 117 /G75 MSTT31c4bd AddChar +/G69 [21.0 0.0 3.0 0.0 19.0 51.0] +/G69 { + 16 51 true [1 0 0 -1 -3.0 51.0] {<03c00ff00ff01ff81ff81ff81ff80ff00ff003c00000000000000000000000000000fff83ff81ff8 +1ff81ff81ff81ff81ff81ff81ff81ff81ff81ff81ff81ff81ff81ff81ff81ff81ff81ff81ff81ff8 +1ff81ff81ff81ff81ff81ff81ff81ff81ff83ffcffff>} imagemask + } + 105 /G69 MSTT31c4bd AddChar +/G63 [33.0 0.0 3.0 -1.0 31.0 35.0] +/G63 { + 28 36 true [1 0 0 -1 -3.0 35.0] {<000ff000007ffc0001ffff0003f8ff8007f07fc00ff07fc00fe03fe01fe03fe03fc03fe03fc03fe0 +7fc03fe07fc01fc07fc00f807fc00000ffc00000ffc00000ffc00000ffc00000ffc00000ffe00000 +ffe00000ffe00000ffe000007ff000007ff000007ff800007ff800003ffc00303ffe00701fff00e0 +0fff83c007ffff8007ffff0001fffe0000fff800001fc000>} imagemask + } + 99 /G63 MSTT31c4bd AddChar +/G6b [40.0 0.0 3.0 0.0 42.0 50.0] +/G6b { + 39 50 true [1 0 0 -1 -3.0 50.0] {} imagemask + } + 107 /G6b MSTT31c4bd AddChar +/G20 [19.0 0.0 0.0 0.0 0.0 0.0] +/G20 { +} + 32 /G20 MSTT31c4bd AddChar +/G52 [54.0 0.0 1.0 0.0 54.0 50.0] +/G52 { + 53 50 true [1 0 0 -1 -1.0 50.0] {} imagemask + } + 82 /G52 MSTT31c4bd AddChar +/G65 [33.0 0.0 3.0 -1.0 31.0 35.0] +/G65 { + 28 36 true [1 0 0 -1 -3.0 35.0] {<000fc000007ff80001fffc0003f8fe0007f07f000fe07f801fe07fc01fe03fc03fc03fc03fc03fe0 +7fc03fe07fc03fe07fc03ff0ffc03ff0fffffff0fffffff0fffffff0ffc00000ffc00000ffc00000 +ffc00000ffe00000ffe00000ffe000007ff000207ff000307ff800603ffc00e03ffe01c01fff83c0 +1fffff800fffff0007fffe0003fffc0000fff000003fc000>} imagemask + } + 101 /G65 MSTT31c4bd AddChar +/G66 [25.0 0.0 3.0 0.0 31.0 51.0] +/G66 { + 28 51 true [1 0 0 -1 -3.0 51.0] {<0001fe00000fff80003fffe0007f1fe000fe1ff001fe1ff001fe1ff003fe1ff003fe0fe007fe07c0 +07fe000007fe000007fe000007fe000007fe000007fe000007fe0000fffff000fffff000fffff000 +fffff00007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe0000 +07fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe0000 +07fe000007fe000007fe000007fe000007fe000007fe000007fe000007fe00000fff00001fff8000 +fffff000>} imagemask + } + 102 /G66 MSTT31c4bd AddChar +/G72 [33.0 0.0 3.0 0.0 31.0 35.0] +/G72 { + 28 35 true [1 0 0 -1 -3.0 35.0] {<00000780fff81fe03ff83ff03ff87ff01ff8fff01ff9fff01ffbfff01ffb8fe01fff07e01ffe0380 +1ffe00001ffc00001ffc00001ffc00001ff800001ff800001ff800001ff800001ff800001ff80000 +1ff800001ff800001ff800001ff800001ff800001ff800001ff800001ff800001ff800001ff80000 +1ff800001ff800001ff800003ffc0000ffff0000>} imagemask + } + 114 /G72 MSTT31c4bd AddChar +/G6e [41.0 0.0 3.0 0.0 38.0 35.0] +/G6e { + 35 35 true [1 0 0 -1 -3.0 35.0] {<00000fc000fff83ff0003ff8fff8001ff9fffc001ffbfffe001fff8ffe001fff07fe001ffe03ff00 +1ffc03ff001ffc03ff001ff803ff001ff803ff001ff803ff001ff803ff001ff803ff001ff803ff00 +1ff803ff001ff803ff001ff803ff001ff803ff001ff803ff001ff803ff001ff803ff001ff803ff00 +1ff803ff001ff803ff001ff803ff001ff803ff001ff803ff001ff803ff001ff803ff001ff803ff00 +1ffc07ff003ffc0fff80ffff1fffe0>} imagemask + } + 110 /G6e MSTT31c4bd AddChar +/G43 [54.0 0.0 3.0 -1.0 50.0 51.0] +/G43 { + 47 52 true [1 0 0 -1 -3.0 51.0] {<000003ff800200001ffff8060000ffffff8e0003ffc03ffe000ffe0007fe001ff80003fe003ff000 +00fe00ffe000007e01ffc000003e01ff8000001e03ff8000001e07ff0000000e0fff0000000e0ffe +000000061ffe000000061ffc000000023ffc000000023ffc000000007ffc000000007ff800000000 +7ff8000000007ff800000000fff800000000fff800000000fff800000000fff800000000fff80000 +0000fff800000000fff800000000fff800000000fff800000000fff8000000007ffc000000007ffc +000000007ffc000000003ffc000000003ffc000000003ffe000000001ffe000000001ffe00000000 +0fff0000000407ff0000000c07ff8000001c03ffc000003c01ffc000007c00ffe00000f0007ff800 +03e0001ffc0007c0000fff803f000003fffffe0000007ffff000000007ff8000>} imagemask + } + 67 /G43 MSTT31c4bd AddChar +/G61 [37.0 0.0 3.0 -1.0 35.0 35.0] +/G61 { + 32 36 true [1 0 0 -1 -3.0 35.0] {<000ff80000fffe0003ffff0007e0ffc00f807fc01f803fe03f803fe03fc03ff07fe03ff07fe03ff0 +7fe03ff07fe03ff03fe03ff03fc03ff00f807ff00001fff00007fff0001fbff0007e3ff001fc3ff0 +03f83ff00ff03ff01fe03ff03fe03ff03fc03ff07fc03ff07fc03ff0ffc03ff0ffc07ff0ffe0fff0 +fff1bff0ffff3fff7ffe1ffe7ffc1ffc3ff00ff80fc007e0>} imagemask + } + 97 /G61 MSTT31c4bd AddChar +/G64 [41.0 0.0 3.0 -1.0 38.0 50.0] +/G64 { + 35 51 true [1 0 0 -1 -3.0 50.0] {<00007fff0000000fff00000007ff00000003ff00000003ff00000003ff00000003ff00000003ff00 +000003ff00000003ff00000003ff00000003ff00000003ff00000003ff00000003ff00003f83ff00 +00ffe3ff0001fff3ff0007fc7bff000ff01fff000ff00fff001fe00fff003fe007ff003fe007ff00 +3fe003ff007fc003ff007fc003ff007fc003ff00ffc003ff00ffc003ff00ffc003ff00ffc003ff00 +ffc003ff00ffc003ff00ffc003ff00ffc003ff00ffc003ff00ffc003ff00ffc003ff007fe003ff00 +7fe003ff007fe003ff003fe003ff003ff007ff001ff00fff001ff81fff000ffc3bff8007fff3ffe0 +03ffe3ff8001ffc3f800003f030000>} imagemask + } + 100 /G64 MSTT31c4bd AddChar +%%EndResource + +248 409 715 (Quick Reference Card) 715 SB +32 0 0 50 50 0 0 0 46 /Helvetica-Oblique /font19 ANSIFont font +gs 866 57 225 569 CB +248 569 284 (Syntax Form) 284 SB +gr +32 0 0 50 50 0 0 0 46 /Helvetica /font12 ANSIFont font +gs 1059 57 1097 569 CB +1117 569 14 ( ) 14 SB +gr +32 0 0 50 50 0 0 0 46 /Helvetica-Oblique /font19 ANSIFont font +gs 1059 57 1097 569 CB +1131 569 286 (its meaning \() 286 SB +gr +32 0 0 46 46 0 0 0 42 /Helvetica-Oblique /font19 ANSIFont font +gs 1059 57 1097 569 CB +1417 573 164 (informal) 164 SB +gr +32 0 0 50 50 0 0 0 46 /Helvetica-Oblique /font19 ANSIFont font +gs 1059 57 1097 569 CB +1581 569 17 (\)) 17 SB +gr +0 0 0 fC +/fm 256 def +5 56 1091 569 B +1 F +n + +%%BeginResource: font MSTT31c4a3 +/MSTT31c4a3 [50.0 0 0 0 0 0] 40 -100 [-50.0 -50.0 50.0 50.0] [1 50 div 0 0 1 50 div 0 0] /MSTT31c4a3 GreNewFont +%%EndResource + +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font + +%%BeginResource: font MSTT31c4a3 +/G20 [13.0 0.0 0.0 0.0 0.0 0.0] +/G20 { +} + 32 /G20 MSTT31c4a3 AddChar +%%EndResource + +gs 867 64 225 626 CB +248 633 52 ( ) 52 SB +gr + +%%BeginResource: font MSTT31c4eb +/MSTT31c4eb [50.0 0 0 0 0 0] 100 -100 [-50.0 -50.0 50.0 50.0] [1 50 div 0 0 1 50 div 0 0] /MSTT31c4eb GreNewFont +%%EndResource + +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font + +%%BeginResource: font MSTT31c4eb +/G70 [28.0 0.0 2.0 -11.0 26.0 23.0] +/G70 { + 24 34 true [1 0 0 -1 -2.0 23.0] {<0007c0ff9ff07fbff83fe1fc3fc0fc3fc0fe3f80fe3f807e3f807f3f807f3f807f3f807f3f807f3f +807f3f807f3f807f3f807e3f807e3f80fe3f80fc3fc0fc3ff1f83f9ff03f8fc03f80003f80003f80 +003f80003f80003f80003f80003f80007fc000ffe000>} imagemask + } + 112 /G70 MSTT31c4eb AddChar +/G72 [21.0 0.0 2.0 0.0 21.0 23.0] +/G72 { + 19 23 true [1 0 0 -1 -2.0 23.0] {<0003c0ff87e07f8fe03f9fe03fbfe03fe3e03fc1c03fc0003fc0003f80003f80003f80003f80003f +80003f80003f80003f80003f80003f80003f80003f80007fc000ffe000>} imagemask + } + 114 /G72 MSTT31c4eb AddChar +/G6f [25.0 0.0 2.0 -1.0 23.0 23.0] +/G6f { + 21 24 true [1 0 0 -1 -2.0 23.0] {<01fc0007ff000f8f801f07c03f07e03e03f07e03f07e03f0fe03f8fe03f8fe03f8fe03f8fe03f8fe +03f8fe03f8fe03f87e03f07e03f03e03f03f07e01f07c00f8f8007ff0001fc00>} imagemask + } + 111 /G6f MSTT31c4eb AddChar +/G67 [25.0 0.0 2.0 -11.0 24.0 23.0] +/G67 { + 22 34 true [1 0 0 -1 -2.0 23.0] {<03f8000ffffc1f8ffc3f0ffc7e07c0fe07e0fe07f0fe07f0fe07f0fe07f07e07f07e07e03f0fe01f +9fc007ff0003fc000e00001c00003c00007e00007fffc07ffff07ffff87ffff83ffffc1ffffc7000 +7ce0001ce0001ce00018f000307c01e03fffc007fe00>} imagemask + } + 103 /G67 MSTT31c4eb AddChar +/G61 [25.0 0.0 2.0 -1.0 24.0 23.0] +/G61 { + 22 24 true [1 0 0 -1 -2.0 23.0] {<00fc0007ff001e1f803c0fc03e0fe07e0fe07f0fe07f0fe03e0fe01c0fe0003fe000efe003cfe00f +8fe01f0fe03f0fe07e0fe0fe0fe0fe0fe0fe1fe0ff2fe0ffcffc7f87f83e03e0>} imagemask + } + 97 /G61 MSTT31c4eb AddChar +/G6d [41.0 0.0 2.0 0.0 39.0 23.0] +/G6d { + 37 23 true [1 0 0 -1 -2.0 23.0] {<0007c03f00ff9ff0ff807fbff9ffc03fe3fb1fc03fc1fe0fe03f81fc0fe03f81fc0fe03f81fc0fe0 +3f81fc0fe03f81fc0fe03f81fc0fe03f81fc0fe03f81fc0fe03f81fc0fe03f81fc0fe03f81fc0fe0 +3f81fc0fe03f81fc0fe03f81fc0fe03f81fc0fe03f81fc0fe07fc3fe1ff0ffe7ff3ff8>} imagemask + } + 109 /G6d MSTT31c4eb AddChar +/G20 [13.0 0.0 0.0 0.0 0.0 0.0] +/G20 { +} + 32 /G20 MSTT31c4eb AddChar +%%EndResource + +gs 867 64 225 626 CB +300 632 199 (program ) 199 SB +gr + +%%BeginResource: font MSTT31c4f8 +/MSTT31c4f8 [50.0 0 0 0 0 0] 40 -100 [-50.0 -50.0 50.0 50.0] [1 50 div 0 0 1 50 div 0 0] /MSTT31c4f8 GreNewFont +%%EndResource + +32 0 0 50 50 0 0 1 45 /MSTT31c4f8 font + +%%BeginResource: font MSTT31c4f8 +/G3c [34.0 0.0 3.0 5.0 30.0 30.0] +/G3c { + 27 25 true [1 0 0 -1 -3.0 30.0] {<00000020000000c000000700000018000000600000018000000e00000030000000c0000003000000 +1c0000006000000080000000600000001c0000000300000000c0000000300000000e000000018000 +000060000000180000000700000000c000000020>} imagemask + } + 60 /G3c MSTT31c4f8 AddChar +/G6e [25.0 0.0 0.0 0.0 24.0 23.0] +/G6e { + 24 23 true [1 0 0 -1 0.0 23.0] {<03e03c3fc0fe03c19f03c20f03c41f07881f07901e07b03e0f603e0f403e0f803c1f807c1f00781f +00781e00f83e00f03c00f03c01f07801e27801e47801e8f803f0f001c0>} imagemask + } + 110 /G6e MSTT31c4f8 AddChar +/G61 [25.0 0.0 0.0 0.0 25.0 23.0] +/G61 { + 25 23 true [1 0 0 -1 0.0 23.0] {<000f8180003ccf8000606f0001c02f0003803f0007803e000f003e000e003e001e003c003c003c00 +3c007c0078007c00780078007800f800f801f800f001f000f002f000f004f000f819e200fc31e400 +7fe1ec003fc1f8001f01e000>} imagemask + } + 97 /G61 MSTT31c4f8 AddChar +/G6d [36.0 0.0 0.0 0.0 34.0 23.0] +/G6d { + 34 23 true [1 0 0 -1 0.0 23.0] {<01e07007803fc1f81f8003c3fc3fc003c67c67c0038c7cc7c007987c87c007b079078007a07a0780 +0f40fa0f800fc0f40f800f80f80f001f00f81f001f01f01f001e01f01e001e01e03e003e03e03c00 +3c03c03c003c03c07c007c07c0788078078079007807807a00f80f80fc00f00f007000>} imagemask + } + 109 /G6d MSTT31c4f8 AddChar +/G65 [22.0 0.0 1.0 0.0 20.0 23.0] +/G65 { + 19 23 true [1 0 0 -1 -1.0 23.0] {<001f800063c00181e00301e00701e00e01e01c03c01c07803c0700781e00783c0079e000ff0000f0 +0000f00000f00000f80080f80100fc06007e1c003ff8003ff0000fc000>} imagemask + } + 101 /G65 MSTT31c4f8 AddChar +/G3e [34.0 0.0 3.0 5.0 30.0 30.0] +/G3e { + 27 25 true [1 0 0 -1 -3.0 30.0] {<80000000600000001c0000000300000000c0000000300000000e0000000180000000600000001800 +00000700000000c000000020000000c000000700000018000000600000018000000e000000300000 +00c00000030000001c0000006000000080000000>} imagemask + } + 62 /G3e MSTT31c4f8 AddChar +%%EndResource + +gs 867 64 225 626 CB +499 633 176 () 176 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font + +%%BeginResource: font MSTT31c4a3 +/G3b [13.0 0.0 3.0 -9.0 10.0 23.0] +/G3b { + 7 32 true [1 0 0 -1 -3.0 23.0] {<307878300000000000000000000000000000000078fcfe7e0606060c0c186080>} imagemask + } + 59 /G3b MSTT31c4a3 AddChar +%%EndResource + +gs 867 64 225 626 CB +675 633 13 (;) 13 SB +gr + +%%BeginResource: font MSTT31c4a3 +/G3c [28.0 0.0 1.0 5.0 27.0 30.0] +/G3c { + 26 25 true [1 0 0 -1 -1.0 30.0] {<00000040000001c00000078000003e000000f8000003c000000f0000003c000000f0000007c00000 +1f00000078000000e0000000780000001f00000007c0000000f00000003c0000000f00000003c000 +0000f80000003e0000000780000001c000000040>} imagemask + } + 60 /G3c MSTT31c4a3 AddChar +%%EndResource + +gs 867 63 225 684 CB +248 690 145 ( <) 145 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4f8 font + +%%BeginResource: font MSTT31c4f8 +/G64 [25.0 0.0 0.0 0.0 29.0 35.0] +/G64 { + 29 35 true [1 0 0 -1 0.0 35.0] {<000000f800000ff0000001f0000001f0000001e0000001e0000001e0000003c0000003c0000003c0 +00000780000007800007c7800018778000603f0001c01f0003801f0007801e000f003e000e003e00 +1e003c003c003c003c007c007800f8007800f8007801f800f8037800f002f000f006f000f80cf000 +f819e100fc71e2007fe1e4003fc1f8001f01e000>} imagemask + } + 100 /G64 MSTT31c4f8 AddChar +/G63 [22.0 0.0 1.0 0.0 21.0 23.0] +/G63 { + 20 23 true [1 0 0 -1 -1.0 23.0] {<000fc000706001c0700380700700f00e00f01e00e01c00003c0000780000780000780000f80000f0 +0000f00000f00000f800c0f80180fc03007e0e003ffc001ff0000fc000>} imagemask + } + 99 /G63 MSTT31c4f8 AddChar +/G6c [14.0 0.0 1.0 0.0 16.0 35.0] +/G6c { + 15 35 true [1 0 0 -1 -1.0 35.0] {<003e03fc007c003c00780078007800f000f000f001f001e001e003e003c003c003c0078007800780 +0f000f000f001f001e001e003e003c003c007c40788078807900fe007800>} imagemask + } + 108 /G6c MSTT31c4f8 AddChar +/G72 [19.0 0.0 0.0 0.0 19.0 23.0] +/G72 { + 19 23 true [1 0 0 -1 0.0 23.0] {<03e0e03fe1e007c3e003c7e007c9c00798c007900007a0000f40000f40000f80001f00001f00001e +00001e00003e00003c00003c0000780000780000780000f80000f00000>} imagemask + } + 114 /G72 MSTT31c4f8 AddChar +/G74 [14.0 0.0 2.0 0.0 15.0 29.0] +/G74 { + 13 29 true [1 0 0 -1 -2.0 29.0] {<00300020006000e001c003c00fc07ff8078007800f800f000f001f001e001e003e003e003c003c00 +7c0078007800f800f180f100f200fc00f000>} imagemask + } + 116 /G74 MSTT31c4f8 AddChar +/G69 [14.0 0.0 1.0 0.0 13.0 32.0] +/G69 { + 12 32 true [1 0 0 -1 -1.0 32.0] {<006000f000f000600000000000000000000001e03fe003c003c003c00780078007800f000f000f00 +1f001e001e003e003c003c007c00788079007a00fc007800>} imagemask + } + 105 /G69 MSTT31c4f8 AddChar +/G6f [25.0 0.0 1.0 0.0 24.0 23.0] +/G6f { + 23 23 true [1 0 0 -1 -1.0 23.0] {<000fc00070f001e03803c03c07801c0f001e1e001e3e001e3c003e7c003e7c003e78003cf8007cf8 +007cf80078f000f8f000f0f001e07803c0780780380f001e1c0007e000>} imagemask + } + 111 /G6f MSTT31c4f8 AddChar +/G73 [19.0 0.0 0.0 0.0 19.0 23.0] +/G73 { + 19 23 true [1 0 0 -1 0.0 23.0] {<007c2001c3e00380e00780e007804007804007c04007e00003f00003f80001f80000fc00007e0000 +3e00003f00401f00400f00400f00600f00e00e00f01c00f8380087e000>} imagemask + } + 115 /G73 MSTT31c4f8 AddChar +%%EndResource + +gs 867 63 225 684 CB +393 690 283 (declarations>) 283 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 867 63 225 741 CB +248 748 52 ( ) 52 SB +gr +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font + +%%BeginResource: font MSTT31c4eb +/G62 [28.0 0.0 2.0 -1.0 26.0 33.0] +/G62 { + 24 34 true [1 0 0 -1 -2.0 33.0] {} imagemask + } + 98 /G62 MSTT31c4eb AddChar +/G65 [22.0 0.0 2.0 -1.0 21.0 23.0] +/G65 { + 19 24 true [1 0 0 -1 -2.0 23.0] {<01f80007fe000f9f001f1f803e0f803e0fc07e0fc07e0fe0fe0fe0ffffe0ffffe0fe0000fe0000fe +0000fe0000ff00007f00007f80207f80603fc0c03fe1801fff000ffe0003f800>} imagemask + } + 101 /G65 MSTT31c4eb AddChar +/G69 [14.0 0.0 2.0 0.0 13.0 34.0] +/G69 { + 11 34 true [1 0 0 -1 -2.0 34.0] {<0e001f003f803f803f801f000e0000000000000000000000ff807f803f803f803f803f803f803f80 +3f803f803f803f803f803f803f803f803f803f803f803f807fc0ffe0>} imagemask + } + 105 /G69 MSTT31c4eb AddChar +/G6e [28.0 0.0 2.0 0.0 26.0 23.0] +/G6e { + 24 23 true [1 0 0 -1 -2.0 23.0] {<0007c0ff8ff07fbff83fe3f83fc1fc3fc1fc3f81fc3f81fc3f81fc3f81fc3f81fc3f81fc3f81fc3f +81fc3f81fc3f81fc3f81fc3f81fc3f81fc3f81fc3f81fc7fc3feffe7ff>} imagemask + } + 110 /G6e MSTT31c4eb AddChar +%%EndResource + +gs 867 63 225 741 CB +300 747 117 (begin) 117 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 867 63 225 798 CB +248 804 145 ( <) 145 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4f8 font + +%%BeginResource: font MSTT31c4f8 +/G75 [25.0 0.0 1.0 0.0 24.0 23.0] +/G75 { + 23 23 true [1 0 0 -1 -1.0 23.0] {<0380000fc03e1fc03c23c03c43c07cc7c0780780780780f80f80f00f01f00f01f01f03e01e03e01e +05e03e05e03c0bc03c13c07c13c07827887847907887a07f07c03c0780>} imagemask + } + 117 /G75 MSTT31c4f8 AddChar +/G3b [17.0 0.0 2.0 -6.0 13.0 23.0] +/G3b { + 11 29 true [1 0 0 -1 -2.0 23.0] {<01c003e003e003e001c0000000000000000000000000000000000000000000000000000038007c00 +7c007c003c001c0018001000300060008000>} imagemask + } + 59 /G3b MSTT31c4f8 AddChar +%%EndResource + +gs 867 63 225 798 CB +393 804 286 (instructions>;) 286 SB +gr + +%%BeginResource: font MSTT31c4f8 +/G20 [13.0 0.0 0.0 0.0 0.0 0.0] +/G20 { +} + 32 /G20 MSTT31c4f8 AddChar +%%EndResource + +gs 867 63 225 855 CB +248 862 26 ( ) 26 SB +gr +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font + +%%BeginResource: font MSTT31c4eb +/G64 [28.0 0.0 2.0 -1.0 26.0 33.0] +/G64 { + 24 34 true [1 0 0 -1 -2.0 33.0] {<0007fc0003fc0001fc0001fc0001fc0001fc0001fc0001fc0001fc0001fc01f1fc07fdfc1f8ffc1f +07fc3f03fc7f01fc7e01fc7e01fcfe01fcfe01fcfe01fcfe01fcfe01fcfe01fcfe01fcfe01fcfe01 +fc7f01fc7f03fc3f83fc3f8ffe1ffdff0ff9fc03e180>} imagemask + } + 100 /G64 MSTT31c4eb AddChar +%%EndResource + +gs 867 63 225 855 CB +274 861 78 (end) 78 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font + +%%BeginResource: font MSTT31c4a3 +/G50 [28.0 0.0 0.0 0.0 26.0 33.0] +/G50 { + 26 33 true [1 0 0 -1 0.0 33.0] {} imagemask + } + 80 /G50 MSTT31c4a3 AddChar +/G72 [17.0 0.0 1.0 0.0 17.0 23.0] +/G72 { + 16 23 true [1 0 0 -1 -1.0 23.0] {<061e1e7f7effff8e1f001e001e001e001e001e001e001e001e001e001e001e001e001e001e001e00 +1e003f00ffc0>} imagemask + } + 114 /G72 MSTT31c4a3 AddChar +/G6f [26.0 0.0 2.0 -1.0 24.0 23.0] +/G6f { + 22 24 true [1 0 0 -1 -2.0 23.0] {<00fc0003ff800f07c01e03e03c01f03800f07800f878007870007cf0007cf0007cf0003cf0003cf8 +003cf8003cf800387800787c00783c00703e00e01f00e00f83c007ff0001fc00>} imagemask + } + 111 /G6f MSTT31c4a3 AddChar +/G67 [25.0 0.0 1.0 -11.0 24.0 23.0] +/G67 { + 23 34 true [1 0 0 -1 -1.0 23.0] {<00fc000387000f03fe0e01fe1e01e03c01e03c00f03c00f03c00f03c00f03e00f01e01e01f01e00f +03c007c78003fc000c00001800001800003fffe03ffff81ffffc07fffe08001e1000063000066000 +0660000ce0000cf80038fe00f07fffe01fff8003fc00>} imagemask + } + 103 /G67 MSTT31c4a3 AddChar +/G61 [22.0 0.0 2.0 -1.0 22.0 23.0] +/G61 { + 20 24 true [1 0 0 -1 -2.0 23.0] {<07f0001ffc003c3e00381f00780f00780f00780f00300f00001f0000ff0003ef000f8f001e0f003c +0f00780f00700f00f00f00f00f00f00f00f81f10fc7f307fcfe03f8fc01e0780>} imagemask + } + 97 /G61 MSTT31c4a3 AddChar +/G6d [37.0 0.0 1.0 0.0 37.0 23.0] +/G6d { + 36 23 true [1 0 0 -1 -1.0 23.0] {<060f807c001e3fc1fe007e7fe3ff00fec3e61f001f81fc0f801e00f807801e00f007801e00f00780 +1e00f007801e00f007801e00f007801e00f007801e00f007801e00f007801e00f007801e00f00780 +1e00f007801e00f007801e00f007801e00f007801e00f007803f01f80fc0ffc7fe3ff0>} imagemask + } + 109 /G6d MSTT31c4a3 AddChar +/G69 [12.0 0.0 1.0 0.0 11.0 35.0] +/G69 { + 10 35 true [1 0 0 -1 -1.0 35.0] {<1c003e003e003e001c00000000000000000000000000000006001e007e00fe001e001e001e001e00 +1e001e001e001e001e001e001e001e001e001e001e001e001e003f00ffc0>} imagemask + } + 105 /G69 MSTT31c4a3 AddChar +/G73 [19.0 0.0 3.0 -1.0 18.0 23.0] +/G73 { + 15 24 true [1 0 0 -1 -3.0 23.0] {<0f883ff870786038e018e018f008f008fc007f007fc03fe00ff803fc00fc007e803e801ec01ee01c +e01cf838fff08fc0>} imagemask + } + 115 /G73 MSTT31c4a3 AddChar +/G75 [25.0 0.0 0.0 -1.0 24.0 22.0] +/G75 { + 24 23 true [1 0 0 -1 0.0 22.0] {} imagemask + } + 117 /G75 MSTT31c4a3 AddChar +/G6e [24.0 0.0 1.0 0.0 24.0 23.0] +/G6e { + 23 23 true [1 0 0 -1 -1.0 23.0] {<060f801e3fc07e7fe0fee3e01f81f01f00f01e00f01e00f01e00f01e00f01e00f01e00f01e00f01e +00f01e00f01e00f01e00f01e00f01e00f01e00f01e00f03f01f8ffc7fe>} imagemask + } + 110 /G6e MSTT31c4a3 AddChar +/G74 [15.0 0.0 0.0 -1.0 14.0 29.0] +/G74 { + 14 30 true [1 0 0 -1 0.0 29.0] {<010003000300070007000f001f007ff8fff80f000f000f000f000f000f000f000f000f000f000f00 +0f000f000f000f000f000f040f880ff807f003c0>} imagemask + } + 116 /G74 MSTT31c4a3 AddChar +/G2e [13.0 0.0 4.0 -1.0 8.0 3.0] +/G2e { + 4 4 true [1 0 0 -1 -4.0 3.0] {<60f0f060>} imagemask + } + 46 /G2e MSTT31c4a3 AddChar +/G49 [17.0 0.0 1.0 0.0 16.0 33.0] +/G49 { + 15 33 true [1 0 0 -1 -1.0 33.0] {} imagemask + } + 73 /G49 MSTT31c4a3 AddChar +/G68 [24.0 0.0 1.0 0.0 24.0 35.0] +/G68 { + 23 35 true [1 0 0 -1 -1.0 35.0] {<0600001e00007e0000fe00001e00001e00001e00001e00001e00001e00001e00001e00001e0f801e +3fc01e7fe01ec3e01f81f01f00f01e00f01e00f01e00f01e00f01e00f01e00f01e00f01e00f01e00 +f01e00f01e00f01e00f01e00f01e00f01e00f03f01f8ffc7fe>} imagemask + } + 104 /G68 MSTT31c4a3 AddChar +/G65 [22.0 0.0 2.0 -1.0 21.0 23.0] +/G65 { + 19 24 true [1 0 0 -1 -2.0 23.0] {<01f80007fe000e1f001c07803807c07803c07003e07003e0ffffe0ffffe0f00000f00000f00000f0 +0000f80000f800207c00607c00607f00c03f81c01fff800fff0007fe0001f800>} imagemask + } + 101 /G65 MSTT31c4a3 AddChar +/G66 [15.0 0.0 1.0 0.0 21.0 35.0] +/G66 { + 20 35 true [1 0 0 -1 -1.0 35.0] {<001f00007fc001c7e00383f00301f00700f00700600f00000f00000f00000f00000f00000f0000ff +fc00fffc000f00000f00000f00000f00000f00000f00000f00000f00000f00000f00000f00000f00 +000f00000f00000f00000f00000f00001f80003fc000fff800>} imagemask + } + 102 /G66 MSTT31c4a3 AddChar +%%EndResource + +gs 1061 63 1095 626 CB +1117 632 966 (Program is a unit. It is the root of a tree of units.) 966 SB +gr + +%%BeginResource: font MSTT31c4a3 +/G44 [36.0 0.0 0.0 0.0 34.0 33.0] +/G44 { + 34 33 true [1 0 0 -1 0.0 33.0] {} imagemask + } + 68 /G44 MSTT31c4a3 AddChar +/G78 [24.0 0.0 0.0 0.0 24.0 22.0] +/G78 { + 24 22 true [1 0 0 -1 0.0 22.0] {} imagemask + } + 120 /G78 MSTT31c4a3 AddChar +/G63 [22.0 0.0 2.0 -1.0 21.0 23.0] +/G63 { + 19 24 true [1 0 0 -1 -2.0 23.0] {<00fc0007ff000f0f801c07c03807c03807c0700380700000f00000f00000f00000f00000f00000f0 +0000f80020f800607c00407c00c07e00c03f83801fff800fff0007fc0001f000>} imagemask + } + 99 /G63 MSTT31c4a3 AddChar +/G70 [25.0 0.0 1.0 -11.0 23.0 23.0] +/G70 { + 22 34 true [1 0 0 -1 -1.0 23.0] {<061f001e3fc07e7fe0fec3f01f81f81f00f81e00781e007c1e007c1e003c1e003c1e003c1e003c1e +003c1e003c1e00381e00381e00781e00701f00f01f00e01fc3c01eff801e3e001e00001e00001e00 +001e00001e00001e00001e00001e00003f0000ffc000>} imagemask + } + 112 /G70 MSTT31c4a3 AddChar +%%EndResource + +gs 1061 63 1095 683 CB +1117 689 929 (During an execution of the program this tree is) 929 SB +gr + +%%BeginResource: font MSTT31c4a3 +/G64 [25.0 0.0 2.0 -1.0 24.0 35.0] +/G64 { + 22 36 true [1 0 0 -1 -2.0 35.0] {<0000600001e00007e0000fe00001e00001e00001e00001e00001e00001e00001e00001e001f1e007 +fde00f0fe01e07e03c03e03803e07801e07001e07001e0f001e0f001e0f001e0f001e0f001e0f001 +e0f801e0f801e07c01e07c01e03e03e03f87fc1ffdf80ff9e003e180>} imagemask + } + 100 /G64 MSTT31c4a3 AddChar +/G6c [12.0 0.0 1.0 0.0 11.0 35.0] +/G6c { + 10 35 true [1 0 0 -1 -1.0 35.0] {<06001e007e00fe001e001e001e001e001e001e001e001e001e001e001e001e001e001e001e001e00 +1e001e001e001e001e001e001e001e001e001e001e001e001e003f00ffc0>} imagemask + } + 108 /G6c MSTT31c4a3 AddChar +%%EndResource + +gs 1061 63 1095 740 CB +1117 746 696 (used as a collection of patterns for ) 696 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4f8 font +gs 1061 63 1095 740 CB +1813 746 185 (instances) 185 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font + +%%BeginResource: font MSTT31c4a3 +/G41 [35.0 0.0 1.0 0.0 36.0 34.0] +/G41 { + 35 34 true [1 0 0 -1 -1.0 34.0] {<0000c000000000c000000000e000000001e000000001f000000003f000000003f000000007f80000 +0006f800000006fc0000000c7c0000000c7c000000187e000000183e000000183f000000301f0000 +00301f000000600f800000600f800000e00fc00000c007c00000ffffc00001ffffe000018003e000 +038003f000030001f000030001f800060000f800060000f8000c0000fc000c00007c001c00007e00 +3e0000ff80ffc007ffe0>} imagemask + } + 65 /G41 MSTT31c4a3 AddChar +%%EndResource + +gs 1061 63 1095 740 CB +1998 746 85 (. An) 85 SB +gr +gs 1061 63 1095 797 CB +1117 803 579 (instance of a unit is either an ) 579 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4f8 font + +%%BeginResource: font MSTT31c4f8 +/G76 [22.0 0.0 1.0 0.0 22.0 23.0] +/G76 { + 21 23 true [1 0 0 -1 -1.0 23.0] {<0e0070ff00f81f00f80f00780f80380f80380780300780300780200780600780c007c08007c10007 +c30003c60003c40003c80003d00003e00003c000038000030000020000>} imagemask + } + 118 /G76 MSTT31c4f8 AddChar +%%EndResource + +gs 1061 63 1095 797 CB +1696 803 358 (activation record ) 358 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font + +%%BeginResource: font MSTT31c4a3 +/G28 [17.0 0.0 2.0 -11.0 16.0 35.0] +/G28 { + 14 46 true [1 0 0 -1 -2.0 35.0] {<00040018003000e001c00380030007000e000e001e001c003c003c007c007c0078007800f800f800 +f800f800f800f800f800f800f800f800780078007c007c003c003c001c001e000e000e0007000380 +018000c00060003000180004>} imagemask + } + 40 /G28 MSTT31c4a3 AddChar +%%EndResource + +gs 1061 63 1095 797 CB +2054 803 58 (\(of) 58 SB +gr + +%%BeginResource: font MSTT31c4a3 +/G29 [17.0 0.0 1.0 -11.0 15.0 35.0] +/G29 { + 14 46 true [1 0 0 -1 -1.0 35.0] {<80006000300018000e0006000700038001c001c001e000e000f000f000f800f800780078007c007c +007c007c007c007c007c007c007c007c0078007800f800f800f000f000e001e001c001c003800300 +07000e001c00300060008000>} imagemask + } + 41 /G29 MSTT31c4a3 AddChar +%%EndResource + +gs 1061 63 1095 854 CB +1117 860 253 (a procedure\)) 253 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4f8 font +gs 1061 63 1095 854 CB +1370 860 13 ( ) 13 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 1061 63 1095 854 CB +1383 860 115 (or an ) 115 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4f8 font + +%%BeginResource: font MSTT31c4f8 +/G62 [25.0 0.0 2.0 0.0 23.0 35.0] +/G62 { + 21 35 true [1 0 0 -1 -2.0 35.0] {<007c000ff80000f80000f80000f00000f00000f00001e00001e00001e00003c00003c00003c7c007 +8fe007bff007a1f007c0f80f80f80f00780f00781e00781e00781e00f83c00f03c00f03c00e07801 +e07801c07803c0f00380f00700f00e00f01c003830000fc000>} imagemask + } + 98 /G62 MSTT31c4f8 AddChar +/G6a [14.0 0.0 -9.0 -11.0 14.0 32.0] +/G6a { + 23 43 true [1 0 0 -1 9.0 32.0] {<00000c00001e00001e00000c00000000000000000000000000000000007c0007f800007800007800 +00700000f00000f00000f00001e00001e00001e00003c00003c00003c00003c00007800007800007 +80000f00000f00000f00001f00001e00001e00001e00003c00003c0000380000780000700070e000 +f1c000e380007c0000>} imagemask + } + 106 /G6a MSTT31c4f8 AddChar +%%EndResource + +gs 1061 63 1095 854 CB +1498 860 122 (object) 122 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 1061 63 1095 854 CB +1620 860 230 (\(of a class\).) 230 SB +gr +866 5 224 626 B +1 F +n +5 5 1091 626 B +1 F +n +5 5 1097 626 B +1 F +n +1052 5 1103 626 B +1 F +n +2 285 1092 632 B +1 F +n +32 0 0 63 63 0 0 0 58 /Helvetica-BoldOblique /font14 ANSIFont font +gs 868 75 225 918 CB +248 921 378 (Declarations) 378 SB +gr +32 0 0 46 46 0 0 0 42 /Helvetica-Oblique /font19 ANSIFont font +gs 868 56 225 1096 CB +248 1099 743 (there are five forms of a declaration:) 743 SB +gr +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font + +%%BeginResource: font MSTT31c4eb +/G76 [25.0 0.0 0.0 -1.0 24.0 22.0] +/G76 { + 24 23 true [1 0 0 -1 0.0 22.0] {} imagemask + } + 118 /G76 MSTT31c4eb AddChar +/G2c [13.0 0.0 2.0 -8.0 11.0 8.0] +/G2c { + 9 16 true [1 0 0 -1 -2.0 8.0] {<3c007e00ff00ff80ff80ff807f803b8003800300030006000e001c0030004000>} imagemask + } + 44 /G2c MSTT31c4eb AddChar +/G63 [22.0 0.0 2.0 -1.0 21.0 23.0] +/G63 { + 19 24 true [1 0 0 -1 -2.0 23.0] {<01fc0007ff000f9f801f0fc03f0fc03e0fc07e0fc07e07807e0000fe0000fe0000fe0000fe0000fe +0000ff0000ff00007f00007f80007f80203fc0401fe1c00fff8007fe0001f800>} imagemask + } + 99 /G63 MSTT31c4eb AddChar +/G73 [19.0 0.0 2.0 -1.0 17.0 23.0] +/G73 { + 15 24 true [1 0 0 -1 -2.0 23.0] {<0fc43ffc7c7c783cf81cfc0cfe0cff04ff807fc07ff03ff81ffc0ffc07fe01fe80fec07ec03ee03c +f03cf878fff08fc0>} imagemask + } + 115 /G73 MSTT31c4eb AddChar +/G74 [17.0 0.0 1.0 -1.0 16.0 30.0] +/G74 { + 15 31 true [1 0 0 -1 -1.0 30.0] {<004000c001c001c003c007c00fc03fc07ffefffe1fc01fc01fc01fc01fc01fc01fc01fc01fc01fc0 +1fc01fc01fc01fc01fc01fc01fc21fe60ffc07f803e0>} imagemask + } + 116 /G74 MSTT31c4eb AddChar +/G75 [28.0 0.0 2.0 -1.0 26.0 22.0] +/G75 { + 24 23 true [1 0 0 -1 -2.0 22.0] {} imagemask + } + 117 /G75 MSTT31c4eb AddChar +/G6c [13.0 0.0 1.0 0.0 12.0 33.0] +/G6c { + 11 33 true [1 0 0 -1 -1.0 33.0] {} imagemask + } + 108 /G6c MSTT31c4eb AddChar +/G68 [28.0 0.0 2.0 0.0 26.0 33.0] +/G68 { + 24 33 true [1 0 0 -1 -2.0 33.0] {} imagemask + } + 104 /G68 MSTT31c4eb AddChar +%%EndResource + +gs 926 60 1094 1089 CB +1117 1092 681 (var, const, unit, signal, handlers) 681 SB +gr +867 2 224 918 B +1 F +n +2 2 1092 918 B +1 F +n +2 2 1095 918 B +1 F +n +921 2 1098 918 B +1 F +n +2 2 2020 918 B +1 F +n +2 2 2021 918 B +1 F +n +131 2 2024 918 B +1 F +n +gs 867 61 225 1152 CB +248 1155 110 ( var) 110 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font + +%%BeginResource: font MSTT31c4a3 +/G3a [14.0 0.0 5.0 -1.0 9.0 23.0] +/G3a { + 4 24 true [1 0 0 -1 -5.0 23.0] {<60f0f0600000000000000000000000000000000060f0f060>} imagemask + } + 58 /G3a MSTT31c4a3 AddChar +/G54 [31.0 0.0 2.0 0.0 29.0 33.0] +/G54 { + 27 33 true [1 0 0 -1 -2.0 33.0] {} imagemask + } + 84 /G54 MSTT31c4a3 AddChar +/G2c [13.0 0.0 2.0 -9.0 9.0 3.0] +/G2c { + 7 12 true [1 0 0 -1 -2.0 3.0] {<78fcfe760606060c0c186080>} imagemask + } + 44 /G2c MSTT31c4a3 AddChar +/G79 [23.0 0.0 0.0 -11.0 23.0 22.0] +/G79 { + 23 33 true [1 0 0 -1 0.0 22.0] {} imagemask + } + 121 /G79 MSTT31c4a3 AddChar +/G7a [22.0 0.0 1.0 0.0 21.0 22.0] +/G7a { + 20 22 true [1 0 0 -1 -1.0 22.0] {<3ffff03ffff03803e03007c0200780000f80001f00003e00007c00007c0000f80001f00003e00003 +e00007c0000f80101f00101e00103e00307c0070fffff0fffff0>} imagemask + } + 122 /G7a MSTT31c4a3 AddChar +/G55 [36.0 0.0 0.0 -1.0 36.0 33.0] +/G55 { + 36 34 true [1 0 0 -1 0.0 33.0] {} imagemask + } + 85 /G55 MSTT31c4a3 AddChar +%%EndResource + +gs 867 61 225 1152 CB +358 1156 255 ( x: T, y,z: U;) 255 SB +gr + +%%BeginResource: font MSTT31c4a3 +/G76 [24.0 0.0 0.0 -1.0 24.0 22.0] +/G76 { + 24 23 true [1 0 0 -1 0.0 22.0] {} imagemask + } + 118 /G76 MSTT31c4a3 AddChar +/G62 [24.0 0.0 0.0 -1.0 22.0 35.0] +/G62 { + 22 36 true [1 0 0 -1 0.0 35.0] {<0600001e00007e0000fe00001e00001e00001e00001e00001e00001e00001e00001e00001e1f001e +3fc01effe01fc3f01f01f81e00f81e00781e007c1e003c1e003c1e003c1e003c1e003c1e003c1e00 +3c1e00381e00781e00781e00701e00e01f01c00fc38007ff0000fc00>} imagemask + } + 98 /G62 MSTT31c4a3 AddChar +%%EndResource + +gs 1061 60 1095 1152 CB +1117 1155 978 (declaration of variables x of type T, y,z of type U) 978 SB +gr +867 2 224 1152 B +1 F +n +2 2 1092 1152 B +1 F +n +2 2 1095 1152 B +1 F +n +921 2 1098 1152 B +1 F +n +2 2 2020 1152 B +1 F +n +2 2 2021 1152 B +1 F +n +131 2 2024 1152 B +1 F +n +2 57 1092 1155 B +1 F +n +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font +gs 867 61 225 1213 CB +248 1216 126 ( unit) 126 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font + +%%BeginResource: font MSTT31c4a3 +/G42 [33.0 0.0 0.0 0.0 30.0 33.0] +/G42 { + 30 33 true [1 0 0 -1 0.0 33.0] {} imagemask + } + 66 /G42 MSTT31c4a3 AddChar +%%EndResource + +gs 867 61 225 1213 CB +374 1217 108 ( A: B) 108 SB +gr + +%%BeginResource: font MSTT31c510 +/MSTT31c510 [50.0 0 0 0 0 0] 100 -100 [-50.0 -50.0 50.0 50.0] [1 50 div 0 0 1 50 div 0 0] /MSTT31c510 GreNewFont +%%EndResource + +32 0 0 50 50 0 0 1 46 /MSTT31c510 font + +%%BeginResource: font MSTT31c510 +/G3c [28.0 0.0 2.0 5.0 28.0 28.0] +/G3c { + 26 23 true [1 0 0 -1 -2.0 28.0] {<00000040000003c000000fc000003f800001fe000007f800001fc00000ff000003f800000fe00000 +7f800000fc0000007f8000000fe0000003f8000000ff0000001fc0000007f8000001fe0000003f80 +00000fc0000003c000000040>} imagemask + } + 60 /G3c MSTT31c510 AddChar +/G6b [25.0 0.0 0.0 0.0 25.0 35.0] +/G6b { + 25 35 true [1 0 0 -1 0.0 35.0] {<003f000003fe000000fe000000fe000000fc000000fc000000fc000001fc000001f8000001f80000 +01f8000003f8000003f1ff8003f03e0003f0380007e0300007e0600007e0c0000fe180000fc38000 +0fc780000fcf80001fdf80001fbfc0001fefc0001f8fc0003f0fc0003f0fc0003f07e2007f07e400 +7e07ec007e07f8007e03f000fe03e000fc01c000>} imagemask + } + 107 /G6b MSTT31c510 AddChar +/G69 [14.0 0.0 1.0 0.0 14.0 35.0] +/G69 { + 13 35 true [1 0 0 -1 -1.0 35.0] {<00e001f003f803f803f801f000e00000000000000000000007e07fe00fe00fc00fc00fc00fc01f80 +1f801f803f003f003f007f007e007e007e20fe40fcc0ff80ff00fe007800>} imagemask + } + 105 /G69 MSTT31c510 AddChar +/G6e [28.0 0.0 1.0 0.0 26.0 23.0] +/G6e { + 25 23 true [1 0 0 -1 -1.0 23.0] {<01f01e001ff07f0007f0ff0007e1ff0007e3ff0007e73f000fee3f000fcc7f000fd87e000ff07e00 +1fe0fe001fe0fc001fc0fc001f80fc003f81fc003f01f8003f01f8007f03f8807e03f1007e03f300 +7e03fe00fe03f800fc01f000>} imagemask + } + 110 /G6e MSTT31c510 AddChar +/G64 [25.0 0.0 1.0 0.0 28.0 35.0] +/G64 { + 27 35 true [1 0 0 -1 -1.0 35.0] {<000007e00000ffc000001fc000001fc000001f8000001f8000001f8000001f8000003f0000003f00 +00003f0000007f00001e7e0000717e0001e0fe0003e0fc0007c0fc000f80fc000f81fc001f81f800 +3f01f8003f01f8007e03f0007e03f0007e07f000fe07f000fc0fe000fc0fe000fc17e000fc17e200 +fc2fc400fe4fcc007f8ff8007f0fe0003e07c000>} imagemask + } + 100 /G64 MSTT31c510 AddChar +/G3e [28.0 0.0 2.0 5.0 28.0 28.0] +/G3e { + 26 23 true [1 0 0 -1 -2.0 28.0] {<80000000f0000000fc0000007f0000001fe0000007f8000000fe0000003fc0000007f0000001fc00 +00007f8000000fc000007f800001fc000007f000003fc00000fe000007f800001fe000007f000000 +fc000000f000000080000000>} imagemask + } + 62 /G3e MSTT31c510 AddChar +%%EndResource + +gs 867 61 225 1213 CB +482 1216 148 () 148 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 867 61 225 1213 CB +630 1217 17 (\() 17 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4f8 font + +%%BeginResource: font MSTT31c4f8 +/G70 [25.0 0.0 -7.0 -11.0 24.0 23.0] +/G70 { + 31 34 true [1 0 0 -1 7.0 23.0] {<0003c1f0007fc7f800078c7c0007b03c0007e03e000f401e000f801e000f801e001f003e001f003e +001e003c003e003c003c007c003c0078003c0070007800f0007800e0007801c000f8038000f00700 +00f80e0001fc3c0001efe00001e0000001e0000003c0000003c0000003c000000780000007800000 +078000000f8000001fc000007ff80000>} imagemask + } + 112 /G70 MSTT31c4f8 AddChar +%%EndResource + +gs 867 61 225 1213 CB +647 1217 149 (params) 149 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 867 61 225 1213 CB +796 1217 30 (\);) 30 SB +gr +gs 867 60 225 1271 CB +248 1274 106 ( <) 106 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4f8 font +gs 867 60 225 1271 CB +354 1274 249 (declarations) 249 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font + +%%BeginResource: font MSTT31c4a3 +/G3e [28.0 0.0 1.0 5.0 27.0 30.0] +/G3e { + 26 25 true [1 0 0 -1 -1.0 30.0] {<80000000e0000000780000001f00000007c0000000f00000003c0000000f00000003c0000000f800 +00003e0000000780000001c00000078000003e000000f8000003c000000f0000003c000000f00000 +07c000001f00000078000000e000000080000000>} imagemask + } + 62 /G3e MSTT31c4a3 AddChar +%%EndResource + +gs 867 60 225 1271 CB +603 1274 28 (>) 28 SB +gr +gs 867 60 225 1328 CB +248 1332 39 ( ) 39 SB +gr +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font +gs 867 60 225 1328 CB +287 1331 117 (begin) 117 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 867 60 225 1385 CB +248 1388 119 ( <) 119 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4f8 font +gs 867 60 225 1385 CB +367 1388 235 (instructions) 235 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 867 60 225 1385 CB +602 1388 41 (>;) 41 SB +gr +gs 867 61 225 1442 CB +248 1446 91 ( ) 91 SB +gr +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font + +%%BeginResource: font MSTT31c4eb +/G5f [25.0 0.0 -1.0 -11.0 25.0 -8.0] +/G5f { + 26 3 true [1 0 0 -1 1.0 -8.0] {} imagemask + } + 95 /G5f MSTT31c4eb AddChar +/G77 [36.0 0.0 0.0 -1.0 35.0 22.0] +/G77 { + 35 23 true [1 0 0 -1 0.0 22.0] {} imagemask + } + 119 /G77 MSTT31c4eb AddChar +/G3a [17.0 0.0 4.0 -1.0 12.0 23.0] +/G3a { + 8 24 true [1 0 0 -1 -4.0 23.0] {<3c7effffffff7e3c00000000000000003c7effffffff7e3c>} imagemask + } + 58 /G3a MSTT31c4eb AddChar +%%EndResource + +gs 867 61 225 1442 CB +339 1445 192 (last_will:) 192 SB +gr +32 0 0 50 50 0 0 1 46 /MSTT31c510 font + +%%BeginResource: font MSTT31c510 +/G20 [13.0 0.0 0.0 0.0 0.0 0.0] +/G20 { +} + 32 /G20 MSTT31c510 AddChar +%%EndResource + +gs 867 61 225 1442 CB +531 1445 41 ( <) 41 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4f8 font +gs 867 61 225 1442 CB +572 1446 269 (instructions>) 269 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 867 61 225 1500 CB +248 1504 39 ( ) 39 SB +gr +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font +gs 867 61 225 1500 CB +287 1503 91 (end ) 91 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 867 61 225 1500 CB +378 1504 48 (A;) 48 SB +gr + +%%BeginResource: font MSTT31c51d +/MSTT31c51d [42.0 0 0 0 0 0] 47 -115 [-42.0 -42.0 42.0 42.0] [1 42 div 0 0 1 42 div 0 0] /MSTT31c51d GreNewFont +%%EndResource + +32 0 0 42 42 0 0 1 38 /MSTT31c51d font + +%%BeginResource: font MSTT31c51d +/G65 [18.0 0.0 1.0 -1.0 17.0 20.0] +/G65 { + 16 21 true [1 0 0 -1 -1.0 20.0] {<03e00ff81c3c301e700e600f600fffffe000e000e000e000f000f00178017c037e063ffe1ffc0ff8 +03e0>} imagemask + } + 101 /G65 MSTT31c51d AddChar +/G76 [20.0 0.0 -1.0 -1.0 20.0 19.0] +/G76 { + 21 20 true [1 0 0 -1 1.0 19.0] {} imagemask + } + 118 /G76 MSTT31c51d AddChar +/G69 [12.0 0.0 1.0 0.0 11.0 29.0] +/G69 { + 10 29 true [1 0 0 -1 -1.0 29.0] {<0c001e001e000c000000000000000000000006003e00fe001e001e001e001e001e001e001e001e00 +1e001e001e001e001e001e001e003f00ffc0>} imagemask + } + 105 /G69 MSTT31c51d AddChar +/G64 [21.0 0.0 1.0 -1.0 21.0 29.0] +/G64 { + 20 30 true [1 0 0 -1 -1.0 29.0] {<000180000f80003f8000078000078000078000078000078000078003e7800ff7801e1f801c0f8038 +0f80780780700780700780f00780f00780f00780f00780f00780f00780f807807807807c0f803e1f +803ff7f01fe7e007c700>} imagemask + } + 100 /G64 MSTT31c51d AddChar +/G6e [22.0 0.0 1.0 0.0 22.0 20.0] +/G6e { + 21 20 true [1 0 0 -1 -1.0 20.0] {<061e003e7f00fec7801f07c01e03c01e03c01e03c01e03c01e03c01e03c01e03c01e03c01e03c01e +03c01e03c01e03c01e03c01e03c03f03e0ffcff8>} imagemask + } + 110 /G6e MSTT31c51d AddChar +/G74 [12.0 0.0 0.0 -1.0 12.0 25.0] +/G74 { + 12 26 true [1 0 0 -1 0.0 25.0] {<0200060006000e001e003e00ffe01e001e001e001e001e001e001e001e001e001e001e001e001e00 +1e001e001e001f300fe00780>} imagemask + } + 116 /G74 MSTT31c51d AddChar +/G6c [12.0 0.0 1.0 0.0 11.0 29.0] +/G6c { + 10 29 true [1 0 0 -1 -1.0 29.0] {<06003e00fe001e001e001e001e001e001e001e001e001e001e001e001e001e001e001e001e001e00 +1e001e001e001e001e001e001e003f00ffc0>} imagemask + } + 108 /G6c MSTT31c51d AddChar +/G79 [19.0 0.0 -1.0 -9.0 19.0 19.0] +/G79 { + 20 28 true [1 0 0 -1 1.0 19.0] {} imagemask + } + 121 /G79 MSTT31c51d AddChar +/G20 [11.0 0.0 0.0 0.0 0.0 0.0] +/G20 { +} + 32 /G20 MSTT31c51d AddChar +/G6f [20.0 0.0 1.0 -1.0 19.0 20.0] +/G6f { + 18 21 true [1 0 0 -1 -1.0 20.0] {<03f0000ffc001e3e00380f00380f80700780700780f003c0f003c0f003c0f003c0f003c0f003c0f8 +03c07803807803803c07003e07001f0e000ffc0003f000>} imagemask + } + 111 /G6f MSTT31c51d AddChar +/G75 [21.0 0.0 0.0 -1.0 21.0 19.0] +/G75 { + 21 20 true [1 0 0 -1 0.0 19.0] {} imagemask + } + 117 /G75 MSTT31c51d AddChar +/G68 [22.0 0.0 1.0 0.0 22.0 29.0] +/G68 { + 21 29 true [1 0 0 -1 -1.0 29.0] {<0e00007e0000fe00001e00001e00001e00001e00001e00001e00001e1e001e7f001ec7801f07801e +03c01e03c01e03c01e03c01e03c01e03c01e03c01e03c01e03c01e03c01e03c01e03c01e03c01e03 +c03f03e0ffcff8>} imagemask + } + 104 /G68 MSTT31c51d AddChar +/G72 [15.0 0.0 1.0 0.0 15.0 20.0] +/G72 { + 14 20 true [1 0 0 -1 -1.0 20.0] {<06383e7cfefc1f981f001e001e001e001e001e001e001e001e001e001e001e001e001e003f00ffc0 +>} imagemask + } + 114 /G72 MSTT31c51d AddChar +/G66 [13.0 0.0 0.0 0.0 17.0 29.0] +/G66 { + 17 29 true [1 0 0 -1 0.0 29.0] {<007c0001ff00038f800707800703000f00000f00000f00000f00000f0000fff8000f00000f00000f +00000f00000f00000f00000f00000f00000f00000f00000f00000f00000f00000f00000f00000f00 +001f8000fff000>} imagemask + } + 102 /G66 MSTT31c51d AddChar +/G6d [33.0 0.0 1.0 0.0 33.0 20.0] +/G6d { + 32 20 true [1 0 0 -1 -1.0 20.0] {<061f03c03e7f8fe0fec798f01f07e0781e03c0781e03c0781e03c0781e03c0781e03c0781e03c078 +1e03c0781e03c0781e03c0781e03c0781e03c0781e03c0781e03c0781e03c0783f03e07cffcff9ff +>} imagemask + } + 109 /G6d MSTT31c51d AddChar +/G61 [19.0 0.0 1.0 -1.0 19.0 20.0] +/G61 { + 18 21 true [1 0 0 -1 -1.0 20.0] {<07f0001e7800383c00781e00781e00781e00301e00001e00003e0001de00071e001c1e00381e0070 +1e00f01e00f01e00f01e00f03e00787e407f9f801e0e00>} imagemask + } + 97 /G61 MSTT31c51d AddChar +%%EndResource + +gs 867 51 225 1615 CB +248 1618 805 (evidently you need not to inherit from a module) 805 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font + +%%BeginResource: font MSTT31c4a3 +/G77 [36.0 0.0 0.0 -1.0 36.0 22.0] +/G77 { + 36 23 true [1 0 0 -1 0.0 22.0] {} imagemask + } + 119 /G77 MSTT31c4a3 AddChar +%%EndResource + +gs 1061 60 1095 1213 CB +1117 1216 972 (declaration of a module A which inherits from B.) 972 SB +gr +32 0 0 50 50 0 0 1 46 /MSTT31c510 font +gs 1061 61 1095 1270 CB +1117 1273 92 (kind) 92 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 1061 61 1095 1270 CB +1209 1274 320 ( may be one of: ) 320 SB +gr +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font +gs 1061 61 1095 1270 CB +1529 1273 582 (procedure, class, coroutine,) 582 SB +gr + +%%BeginResource: font MSTT31c4eb +/G6b [27.0 0.0 2.0 0.0 28.0 33.0] +/G6b { + 26 33 true [1 0 0 -1 -2.0 33.0] {} imagemask + } + 107 /G6b MSTT31c4eb AddChar +/G66 [16.0 0.0 1.0 0.0 20.0 34.0] +/G66 { + 19 34 true [1 0 0 -1 -1.0 34.0] {<007f0001ffc003e7e007c7e00fc7e00fc7e01fc3c01fc0001fc0001fc0001fc0001fc000fff800ff +f8001fc0001fc0001fc0001fc0001fc0001fc0001fc0001fc0001fc0001fc0001fc0001fc0001fc0 +001fc0001fc0001fc0001fc0001fc0003fe0007ff000>} imagemask + } + 102 /G66 MSTT31c4eb AddChar +%%EndResource + +gs 1061 60 1095 1328 CB +1117 1331 692 (process, block, handler, function) 692 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4f8 font +gs 1061 60 1095 1385 CB +1117 1388 149 (params) 149 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 1061 60 1095 1385 CB +1266 1388 590 ( is a list of formal parameters,) 590 SB +gr + +%%BeginResource: font MSTT31c4a3 +/G52 [33.0 0.0 0.0 0.0 34.0 33.0] +/G52 { + 34 33 true [1 0 0 -1 0.0 33.0] {} imagemask + } + 82 /G52 MSTT31c4a3 AddChar +/G45 [31.0 0.0 0.0 0.0 30.0 33.0] +/G45 { + 30 33 true [1 0 0 -1 0.0 33.0] {} imagemask + } + 69 /G45 MSTT31c4a3 AddChar +/G4d [44.0 0.0 0.0 0.0 44.0 33.0] +/G4d { + 44 33 true [1 0 0 -1 0.0 33.0] {} imagemask + } + 77 /G4d MSTT31c4a3 AddChar +/G4b [35.0 0.0 0.0 0.0 35.0 33.0] +/G4b { + 35 33 true [1 0 0 -1 0.0 33.0] {} imagemask + } + 75 /G4b MSTT31c4a3 AddChar +/G53 [28.0 0.0 4.0 -1.0 25.0 34.0] +/G53 { + 21 35 true [1 0 0 -1 -4.0 34.0] {<03f0200ffe601e0fe03c03e07801e07000e0f00060f00060f00020f80020fc0020fe00007f00007f +c0003fe0001ff8000ffe0007ff0001ffc000ffe0003fe0000ff00007f00001f88000f88000f8c000 +78c00078c00078e00070f000f0f801e0fe07c08fff8081fc00>} imagemask + } + 83 /G53 MSTT31c4a3 AddChar +%%EndResource + +gs 1061 60 1095 1442 CB +1117 1445 239 (REMARKS) 239 SB +gr + +%%BeginResource: font MSTT31c4a3 +/G2d [17.0 0.0 2.0 9.0 15.0 13.0] +/G2d { + 13 4 true [1 0 0 -1 -2.0 13.0] {} imagemask + } + 45 /G2d MSTT31c4a3 AddChar +/G6b [25.0 0.0 1.0 0.0 25.0 35.0] +/G6b { + 24 35 true [1 0 0 -1 -1.0 35.0] {<0600001e00007e0000fe00001e00001e00001e00001e00001e00001e00001e00001e00001e00001e +07fe1e01f01e01c01e03001e06001e0c001e18001e30001ee0001ff0001ef8001ef8001e7c001e3e +001e1f001e0f801e07801e07c01e03e01e01f03f01f8ffc7ff>} imagemask + } + 107 /G6b MSTT31c4a3 AddChar +%%EndResource + +gs 1061 60 1095 1499 CB +1117 1502 398 (- block has no name) 398 SB +gr +gs 1061 61 1095 1556 CB +1117 1560 382 ( its first line is: ) 382 SB +gr +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font +gs 1061 61 1095 1556 CB +1499 1559 128 (block ) 128 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 1061 61 1095 1556 CB +1627 1560 69 ( or ) 69 SB +gr +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font +gs 1061 61 1095 1556 CB +1696 1559 100 (pref ) 100 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font + +%%BeginResource: font MSTT31c4a3 +/G43 [33.0 0.0 2.0 -1.0 31.0 34.0] +/G43 { + 29 35 true [1 0 0 -1 -2.0 34.0] {<000ff020007ffe6000fc0fe003f003e007c001e00f8000f01f8000701f0000303f0000303e000030 +7e0000107e0000007e000000fc000000fc000000fc000000fc000000fc000000fc000000fc000000 +fc000000fc000000fc0000007e0000007e0000007e0000003f0000083f0000101f8000200f800060 +07c000c003f0018001fc0700007ffc00000ff000>} imagemask + } + 67 /G43 MSTT31c4a3 AddChar +%%EndResource + +gs 1061 61 1095 1556 CB +1796 1560 46 (C ) 46 SB +gr +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font +gs 1061 61 1095 1556 CB +1842 1559 115 (block) 115 SB +gr + +%%BeginResource: font MSTT31c4eb +/G2d [17.0 0.0 1.0 9.0 15.0 14.0] +/G2d { + 14 5 true [1 0 0 -1 -1.0 14.0] {} imagemask + } + 45 /G2d MSTT31c4eb AddChar +%%EndResource + +gs 1061 61 1095 1614 CB +1117 1617 30 (- ) 30 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 1061 61 1095 1614 CB +1147 1618 899 (function has a type of result after parameters,) 899 SB +gr +gs 1061 60 1095 1672 CB +1117 1675 616 (- handler has a different form., ) 616 SB +gr + +%%BeginResource: font MSTT31c52a +/MSTT31c52a [46.0 0 0 0 0 0] 43 -105 [-46.0 -46.0 46.0 46.0] [1 46 div 0 0 1 46 div 0 0] /MSTT31c52a GreNewFont +%%EndResource + +32 0 0 46 46 0 0 1 42 /MSTT31c52a font + +%%BeginResource: font MSTT31c52a +/G73 [18.0 0.0 2.0 -1.0 16.0 21.0] +/G73 { + 14 22 true [1 0 0 -1 -2.0 21.0] {<0f883ff870786038e018e018f008f8007e007f803fe00ff003f800f8007c803cc01cc01ce018f838 +fff08fc0>} imagemask + } + 115 /G73 MSTT31c52a AddChar +/G65 [19.0 0.0 1.0 -1.0 18.0 21.0] +/G65 { + 17 22 true [1 0 0 -1 -1.0 21.0] {<03f0000e7c00181e00300f00300f00600780600780ffff80e00000e00000e00000e00000f00000f0 +0080f801807801807c03007f07003ffe001ffc000ff80003e000>} imagemask + } + 101 /G65 MSTT31c52a AddChar +/G20 [12.0 0.0 0.0 0.0 0.0 0.0] +/G20 { +} + 32 /G20 MSTT31c52a AddChar +/G62 [23.0 0.0 0.0 -1.0 21.0 32.0] +/G62 { + 21 33 true [1 0 0 -1 0.0 32.0] {<0600003e0000fe00001e00001e00001e00001e00001e00001e00001e00001e00001e1f001e7f801e +ffc01f87e01f01f01e00f01e00f81e00781e00781e00781e00781e00781e00781e00781e00701e00 +f01e00e01e01e01f01c00f878007ff0000f800>} imagemask + } + 98 /G62 MSTT31c52a AddChar +/G6c [12.0 0.0 1.0 0.0 11.0 32.0] +/G6c { + 10 32 true [1 0 0 -1 -1.0 32.0] {<06003e00fe001e001e001e001e001e001e001e001e001e001e001e001e001e001e001e001e001e00 +1e001e001e001e001e001e001e001e001e001e003f00ffc0>} imagemask + } + 108 /G6c MSTT31c52a AddChar +/G6f [22.0 0.0 1.0 -1.0 21.0 21.0] +/G6f { + 20 22 true [1 0 0 -1 -1.0 21.0] {<01f80007fe000e0f801c07c03803c07803e07001e07001f0f000f0f000f0f000f0f000f0f000f0f0 +00f0f800e07800e07c01e03c01c01e03801f870007fe0001f800>} imagemask + } + 111 /G6f MSTT31c52a AddChar +/G77 [32.0 0.0 0.0 -1.0 32.0 20.0] +/G77 { + 32 21 true [1 0 0 -1 0.0 20.0] {} imagemask + } + 119 /G77 MSTT31c52a AddChar +/G2c [12.0 0.0 2.0 -8.0 9.0 3.0] +/G2c { + 7 11 true [1 0 0 -1 -2.0 3.0] {<78fcfe7e020204041830c0>} imagemask + } + 44 /G2c MSTT31c52a AddChar +%%EndResource + +gs 1061 60 1095 1672 CB +1733 1678 188 (see below,) 188 SB +gr + +%%BeginResource: font MSTT31c52a +/G2d [15.0 0.0 2.0 9.0 14.0 13.0] +/G2d { + 12 4 true [1 0 0 -1 -2.0 13.0] {} imagemask + } + 45 /G2d MSTT31c52a AddChar +/G61 [21.0 0.0 1.0 -1.0 21.0 21.0] +/G61 { + 20 22 true [1 0 0 -1 -1.0 21.0] {<07f0001ffc003c3e00781f00780f00780f00300f00000f00001f0000ef00038f000e0f00380f0078 +0f00700f00f00f00f00f00f81f10fc7f307fcfe07f8fc01e0780>} imagemask + } + 97 /G61 MSTT31c52a AddChar +/G74 [13.0 0.0 -1.0 -1.0 13.0 27.0] +/G74 { + 14 28 true [1 0 0 -1 1.0 27.0] {<010003000300070007000f003ff8fff80f000f000f000f000f000f000f000f000f000f000f000f00 +0f000f000f000f040f880ff807f003c0>} imagemask + } + 116 /G74 MSTT31c52a AddChar +/G5f [23.0 0.0 0.0 -10.0 24.0 -8.0] +/G5f { + 24 2 true [1 0 0 -1 0.0 -8.0] {} imagemask + } + 95 /G5f MSTT31c52a AddChar +/G69 [12.0 0.0 1.0 0.0 11.0 32.0] +/G69 { + 10 32 true [1 0 0 -1 -1.0 32.0] {<0c001e001e000c00000000000000000000000000000006003e00fe001e001e001e001e001e001e00 +1e001e001e001e001e001e001e001e001e001e003f00ffc0>} imagemask + } + 105 /G69 MSTT31c52a AddChar +/G6e [22.0 0.0 0.0 0.0 22.0 21.0] +/G6e { + 22 21 true [1 0 0 -1 0.0 21.0] {<060f003e3f80fe7fc01ec3e01f03e01e01e01e01e01e01e01e01e01e01e01e01e01e01e01e01e01e +01e01e01e01e01e01e01e01e01e01e01e03f03f0ffcffc>} imagemask + } + 110 /G6e MSTT31c52a AddChar +/G72 [16.0 0.0 1.0 0.0 16.0 21.0] +/G72 { + 15 21 true [1 0 0 -1 -1.0 21.0] {<063c3e7efefe1f9c1f001e001e001e001e001e001e001e001e001e001e001e001e001e001e003f00 +ffc0>} imagemask + } + 114 /G72 MSTT31c52a AddChar +/G75 [23.0 0.0 0.0 -1.0 22.0 20.0] +/G75 { + 22 21 true [1 0 0 -1 0.0 20.0] {} imagemask + } + 117 /G75 MSTT31c52a AddChar +/G63 [20.0 0.0 1.0 -1.0 19.0 21.0] +/G63 { + 18 22 true [1 0 0 -1 -1.0 21.0] {<00f80007fe000e1f001c0f80380f80380780700300700000700000700000f00000f00000f8000078 +00407800c07c00807e01803f03801fff001ffe0007fc0001f000>} imagemask + } + 99 /G63 MSTT31c52a AddChar +/G78 [23.0 0.0 0.0 0.0 23.0 20.0] +/G78 { + 23 20 true [1 0 0 -1 0.0 20.0] {} imagemask + } + 120 /G78 MSTT31c52a AddChar +/G64 [22.0 0.0 1.0 -1.0 22.0 32.0] +/G64 { + 21 33 true [1 0 0 -1 -1.0 32.0] {<0000c00007c0001fc00003c00003c00003c00003c00003c00003c00003c00003c001f3c007fbc01e +1fc01c07c03807c07803c07003c07003c0f003c0f003c0f003c0f003c0f003c0f003c0f803c0f803 +c07c03c07c07c03f0fc01ffbf80ff3f003c380>} imagemask + } + 100 /G64 MSTT31c52a AddChar +%%EndResource + +gs 1061 56 1095 1729 CB +1117 1732 637 (- last_will instruction are executed ) 637 SB +gr + +%%BeginResource: font MSTT31c537 +/MSTT31c537 [46.0 0 0 0 0 0] 43 -105 [-46.0 -46.0 46.0 46.0] [1 46 div 0 0 1 46 div 0 0] /MSTT31c537 GreNewFont +%%EndResource + +32 0 0 46 46 0 0 1 42 /MSTT31c537 font + +%%BeginResource: font MSTT31c537 +/G65 [20.0 0.0 1.0 0.0 18.0 21.0] +/G65 { + 17 21 true [1 0 0 -1 -1.0 21.0] {<003e0001c7000303800603800e03801c0700380700380e00781c0070700073c000fe0000f00000f0 +0000f00000f00200f80c007c18007ff0003fe0000f8000>} imagemask + } + 101 /G65 MSTT31c537 AddChar +/G78 [20.0 0.0 -1.0 0.0 20.0 21.0] +/G78 { + 21 21 true [1 0 0 -1 1.0 21.0] {<0700703f81f80783f803c63001cc0001c80001d00000f00000e00000e00000f00000f00000f00001 +f000017800023800063860ec38c0f83d80f81f00601e00>} imagemask + } + 120 /G78 MSTT31c537 AddChar +/G63 [20.0 0.0 1.0 0.0 19.0 21.0] +/G63 { + 18 21 true [1 0 0 -1 -1.0 21.0] {<003f0000e1800381c00701c00e01c01c01c01c0180380000780000700000700000f00000f00000f0 +0000f00300f00600f80c007c38007ff0003fe0000f8000>} imagemask + } + 99 /G63 MSTT31c537 AddChar +/G70 [23.0 0.0 -5.0 -10.0 22.0 21.0] +/G70 { + 27 31 true [1 0 0 -1 5.0 21.0] {<001e1f0000fe3f80001cc3c0001d81e0001f01e0003e01e0003c01e0003c01e0003801e0007801c0 +007001c0007003c000f0038000e0078000e0070000e00e0001c01c0001c0180001c0700003e0e000 +03bf800003800000038000000700000007000000070000000f0000000e0000000e0000001f000000 +ffc00000>} imagemask + } + 112 /G70 MSTT31c537 AddChar +/G74 [13.0 0.0 2.0 0.0 14.0 26.0] +/G74 { + 12 26 true [1 0 0 -1 -2.0 26.0] {<00c000800180038007001f007ff00e000e001e001e001c003c003c00380038007800780070007000 +f000e200e400e400f800e000>} imagemask + } + 116 /G74 MSTT31c537 AddChar +/G69 [13.0 0.0 1.0 0.0 11.0 28.0] +/G69 { + 10 28 true [1 0 0 -1 -1.0 28.0] {<01c001c001c0000000000000000007807f800700070007000f000e000e000e001c001c001c003c00 +380038007800720076007400f8007000>} imagemask + } + 105 /G69 MSTT31c537 AddChar +/G6f [23.0 0.0 1.0 0.0 21.0 21.0] +/G6f { + 20 21 true [1 0 0 -1 -1.0 21.0] {<003f0000e3c00380e00700e00e00f01e00f03c00f03c00f07800f07800f07000f0f001e0f001e0f0 +03c0f003c0f00780f00700700e00381c001c30000fc000>} imagemask + } + 111 /G6f MSTT31c537 AddChar +/G6e [23.0 0.0 0.0 0.0 21.0 21.0] +/G6e { + 21 21 true [1 0 0 -1 0.0 21.0] {<0780f03f83f80707f8070e380718380e30380e60780ec0700e80701d80f01f00e01e00e03c01e03c +01c03801c03803c07003887003907003a0f007c0e00380>} imagemask + } + 110 /G6e MSTT31c537 AddChar +/G61 [23.0 0.0 0.0 0.0 22.0 21.0] +/G61 { + 22 21 true [1 0 0 -1 0.0 21.0] {<001f0c007b9c00c0b80380780700780e00780e00701c00703800f03800e07800e07001e07003e0f0 +03c0f005c0f009c0f01380f863907fc3a07f83c01e0380>} imagemask + } + 97 /G61 MSTT31c537 AddChar +/G6c [13.0 0.0 1.0 0.0 13.0 32.0] +/G6c { + 12 32 true [1 0 0 -1 -1.0 32.0] {<00f007f000f000e000e000e001c001c001c001c00380038003800700070007000f000e000e000e00 +1c001c001c003800380038007800718071007200fc007000>} imagemask + } + 108 /G6c MSTT31c537 AddChar +/G79 [20.0 0.0 -4.0 -10.0 20.0 21.0] +/G79 { + 24 31 true [1 0 0 -1 4.0 21.0] {<00f00607f00f00f00f00780f00780300380300380200380600380400380c00380800381000383000 +3c20003c40003cc0001c80001d00001e00001e00001c0000180000100000200000400000c0006180 +00f70000fe0000f80000700000>} imagemask + } + 121 /G79 MSTT31c537 AddChar +/G2e [12.0 0.0 1.0 0.0 5.0 4.0] +/G2e { + 4 4 true [1 0 0 -1 -1.0 4.0] {<60f0f060>} imagemask + } + 46 /G2e MSTT31c537 AddChar +%%EndResource + +gs 1061 56 1095 1729 CB +1754 1732 256 (exceptionally.) 256 SB +gr +867 2 224 1213 B +1 F +n +2 2 1092 1213 B +1 F +n +1060 2 1095 1213 B +1 F +n +2 568 1092 1216 B +1 F +n +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font +gs 867 61 225 1785 CB +248 1788 163 ( const ) 163 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font + +%%BeginResource: font MSTT31c4a3 +/G3d [28.0 0.0 1.0 12.0 27.0 22.0] +/G3d { + 26 10 true [1 0 0 -1 -1.0 22.0] {} imagemask + } + 61 /G3d MSTT31c4a3 AddChar +/G38 [25.0 0.0 3.0 0.0 22.0 33.0] +/G38 { + 19 33 true [1 0 0 -1 -3.0 33.0] {<03f8000ffe003e1f00780780700780f003c0f003c0f003c0f803c0f803807c07807e0f003f8e001f +d8000ff00007f00003fc0007fe000c7f001c3f80381fc0780fc07007e0f003e0f001e0f001e0f001 +e0f801e07803c03c03803e0f000ffe0003f800>} imagemask + } + 56 /G38 MSTT31c4a3 AddChar +/G30 [25.0 0.0 2.0 0.0 23.0 33.0] +/G30 { + 21 33 true [1 0 0 -1 -2.0 33.0] {<00f80003fe000787000e03801c01c01c01c03800e03800e07800f0780070780070f00078f00078f0 +0078f00078f00078f00078f00078f00078f00078f00078f000787000707800f07800f03800e03800 +e01c01c01c01c00e0380070f0003fe0000f800>} imagemask + } + 48 /G30 MSTT31c4a3 AddChar +%%EndResource + +gs 867 61 225 1785 CB +411 1789 122 (cc=80) 122 SB +gr +gs 1061 60 1095 1785 CB +1117 1788 488 (declaration of a constant) 488 SB +gr +867 2 224 1785 B +1 F +n +2 2 1092 1785 B +1 F +n +1060 2 1095 1785 B +1 F +n +2 57 1092 1788 B +1 F +n +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font +gs 867 61 225 1846 CB +248 1849 176 ( signal ) 176 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 867 61 225 1846 CB +424 1850 41 (S;) 41 SB +gr +gs 867 61 225 1904 CB +248 1908 39 ( ) 39 SB +gr +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font +gs 867 61 225 1904 CB +287 1907 124 (signal) 124 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font + +%%BeginResource: font MSTT31c4a3 +/G51 [36.0 0.0 2.0 -9.0 34.0 34.0] +/G51 { + 32 43 true [1 0 0 -1 -2.0 34.0] {<000ff000007ffe0000f81f8003e007c007c003e00f8001f01f0000f81f0000f83e0000fc3e00007c +7e00007e7e00007e7c00003efc00003ffc00003ffc00003ffc00003ffc00003ffc00003ffc00003f +fc00003ffc00003f7c00003e7e00003e7e00007e3e00007c3f00007c1f0000f80f0000f0078001e0 +03c003c001e0078000781e00001ff8000007f0000003f8000001fc000000fe0000003f0000000f80 +000003e0000000f80000000f>} imagemask + } + 81 /G51 MSTT31c4a3 AddChar +%%EndResource + +gs 867 61 225 1904 CB +411 1908 377 ( Alarm\(x: T, y: Q\);) 377 SB +gr +gs 1061 60 1095 1846 CB +1117 1849 476 (declaration of a signal S) 476 SB +gr +gs 1061 60 1095 1903 CB +1117 1906 760 (it may have a list of formal parameters) 760 SB +gr +867 2 224 1846 B +1 F +n +2 2 1092 1846 B +1 F +n +1060 2 1095 1846 B +1 F +n +2 170 1092 1849 B +1 F +n +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font +gs 867 60 225 2020 CB +248 2023 223 ( handlers) 223 SB +gr +gs 867 61 225 2077 CB +248 2080 192 ( when) 192 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 867 61 225 2077 CB +440 2081 13 ( ) 13 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4f8 font + +%%BeginResource: font MSTT31c4f8 +/G67 [25.0 0.0 -2.0 -11.0 27.0 23.0] +/G67 { + 29 34 true [1 0 0 -1 2.0 23.0] {<000ff000003c3ff800f01ff001e01ff003e00f0003c00f0007c00f0007c01f0007801f0007801e00 +07803e0003c03c0003c0780001e1e000007f80000030000000e0000001c0000003c0000003f80000 +03ff000001ffe00003fff0000e0ff8003c01fc0078003c0070001c00f0001c00f0001800f0001800 +780030007c0060001f01800003fe0000>} imagemask + } + 103 /G67 MSTT31c4f8 AddChar +/G31 [25.0 0.0 3.0 0.0 22.0 33.0] +/G31 { + 19 33 true [1 0 0 -1 -3.0 33.0] {<0003e0003fc00007c00007c0000780000780000780000f00000f00000f00001e00001e00001e0000 +3c00003c00003c00007c0000780000780000f80000f00000f00000f00001e00001e00001e00003c0 +0003c00003c00007c00007c0001fe000fff800>} imagemask + } + 49 /G31 MSTT31c4f8 AddChar +/G2c [13.0 0.0 0.0 -7.0 6.0 4.0] +/G2c { + 6 11 true [1 0 0 -1 0.0 4.0] {<387c7c7c3c1c1818306080>} imagemask + } + 44 /G2c MSTT31c4f8 AddChar +/G53 [25.0 0.0 0.0 -1.0 27.0 35.0] +/G53 { + 27 36 true [1 0 0 -1 0.0 35.0] {<0007e020001c1c60003807c0007003c000e003c000e001c001e0018001e0018001e0018001f00100 +01f0010000f8000000fc0000007e0000007f0000003f0000001f8000000fc0000007e0000003f000 +0003f0000001f8000000f80000007c0010007c0010003c0030003c0030003c0030003c0030003800 +70003800780070007c0070007e00e000c783800080fe0000>} imagemask + } + 83 /G53 MSTT31c4f8 AddChar +/G49 [17.0 0.0 -2.0 0.0 20.0 34.0] +/G49 { + 22 34 true [1 0 0 -1 2.0 34.0] {<007ffc000fe00007c0000780000780000f80000f00000f00000f00001f00001e00001e00003e0000 +3c00003c00003c0000780000780000780000f80000f00000f00000f00001e00001e00001e00003c0 +0003c00003c00007c0000780000f80001fc000fff800>} imagemask + } + 73 /G49 MSTT31c4f8 AddChar +/G47 [36.0 0.0 2.0 -1.0 36.0 35.0] +/G47 { + 34 36 true [1 0 0 -1 -2.0 35.0] {<00007fc1800003807f80000e001f000038000f000070000f0001e000060003c00006000780000600 +07800004000f000004001e000000001e000000003c000000003c000000007c000000007800000000 +7800000000f800000000f80007ffc0f80000fe00f800007c00f800007c00f000007800f800007800 +f80000f800f80000f000780000f000780000f0003c0001e0003c0001e0001e0001e0000e0003e000 +070003c00003c007c00000f03e0000001ff00000>} imagemask + } + 71 /G47 MSTT31c4f8 AddChar +/G4e [33.0 0.0 -2.0 -1.0 38.0 34.0] +/G4e { + 40 35 true [1 0 0 -1 2.0 34.0] {<00ff0007ff003f8000f8000f8000e000078000e00007c000c00007c000c0000fc000c0000de000c0 +000de00180000df001800018f001800018f003000018f803000030780300003078020000303c0600 +00603c060000603c060000601e0c0000601e0c0000c01f0c0000c00f180000c00f180001800f9800 +0180079800018007b000030003f000030003f000030003e000070001e000070001e0000f0001c000 +1f0000c000ffe000c000000000c000>} imagemask + } + 78 /G4e MSTT31c4f8 AddChar +/G33 [25.0 0.0 2.0 0.0 23.0 33.0] +/G33 { + 21 33 true [1 0 0 -1 -2.0 33.0] {<000f80003fe0007ff000e1f80080f80100780000780000780000700000f00001e0000380000e0000 +7e0003ff00007f80001fc00007c00003e00003e00001e00001e00001e00001e00001c00001c00003 +80000380780700fe0e00fffc007ff0003f8000>} imagemask + } + 51 /G33 MSTT31c4f8 AddChar +/G3a [17.0 0.0 3.0 0.0 13.0 23.0] +/G3a { + 10 23 true [1 0 0 -1 -3.0 23.0] {<038007c007c007c0038000000000000000000000000000000000000000000000000000007000f800 +f800f8007000>} imagemask + } + 58 /G3a MSTT31c4f8 AddChar +%%EndResource + +gs 867 61 225 2077 CB +453 2081 508 (sig1,SIGN3: Inst; return;) 508 SB +gr +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font +gs 867 61 225 2135 CB +248 2138 192 ( when) 192 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 867 61 225 2135 CB +440 2139 13 ( ) 13 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4f8 font + +%%BeginResource: font MSTT31c4f8 +/G32 [25.0 0.0 1.0 0.0 23.0 33.0] +/G32 { + 22 33 true [1 0 0 -1 -1.0 33.0] {<000f80003fe0007ff000fff801c1f80100fc02007c00003c00003c00003c00003800003800003800 +00700000600000e00001c0000180000300000600000c0000180000300000600000c0000180000300 +200400400800c01fffc03fff807fff80ffff00>} imagemask + } + 50 /G32 MSTT31c4f8 AddChar +/G77 [31.0 0.0 -1.0 0.0 30.0 23.0] +/G77 { + 31 23 true [1 0 0 -1 1.0 23.0] {<0f00180cff00380e0f00380e0f80780e078078060780f8040780f80c0781f80c0781780807827810 +07c6783003c4782003cc784003c878c003d0788003d0790003e07a0003c07a0003c07c0003807800 +038070000300600002004000>} imagemask + } + 119 /G77 MSTT31c4f8 AddChar +%%EndResource + +gs 867 61 225 2135 CB +453 2139 515 (sig2: instructions2; wind;) 515 SB +gr +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font +gs 867 61 225 2193 CB +248 2196 223 ( others ) 223 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 867 61 225 2193 CB +471 2197 13 ( ) 13 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4f8 font +gs 867 61 225 2193 CB +484 2197 260 (in; terminate) 260 SB +gr +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font +gs 867 60 225 2251 CB +248 2254 314 ( end handlers) 314 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 1061 60 1095 2020 CB +1117 2023 886 (declaration of a module handling exceptions,) 886 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4f8 font +gs 1061 60 1095 2077 CB +1117 2080 367 (sig1, sig2, SIGN3 ) 367 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 1061 60 1095 2077 CB +1484 2080 476 (are names of exceptions) 476 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4f8 font +gs 1061 60 1095 2077 CB +1960 2080 13 (,) 13 SB +gr +gs 1061 60 1095 2134 CB +1117 2137 413 (Inst, instructions2,in) 413 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font + +%%BeginResource: font MSTT31c4a3 +/G71 [25.0 0.0 2.0 -11.0 24.0 23.0] +/G71 { + 22 34 true [1 0 0 -1 -2.0 23.0] {<00f86003fee00f0fe01e03e03c03e03801e07801e07001e07001e0f001e0f001e0f001e0f001e0f0 +01e0f001e0f001e0f801e07801e07c01e07e03e03f05e01ff9e00ff1e003c1e00001e00001e00001 +e00001e00001e00001e00001e00001e00003f0000ffc>} imagemask + } + 113 /G71 MSTT31c4a3 AddChar +%%EndResource + +gs 1061 60 1095 2134 CB +1530 2137 584 ( are sequences of instructions) 584 SB +gr +gs 1061 60 1095 2248 CB +1117 2251 452 (handlers appear as the ) 452 SB +gr +32 0 0 50 50 1 0 1 45 /MSTT31c4a3 font +gs 1061 60 1095 2248 CB +1569 2251 68 (last) 68 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 1061 60 1095 2248 CB +1637 2251 405 ( declaration in a unit) 405 SB +gr +867 2 224 2020 B +1 F +n +2 2 1092 2020 B +1 F +n +1060 2 1095 2020 B +1 F +n +2 287 1092 2023 B +1 F +n +32 0 0 50 50 0 0 0 46 /Helvetica-Oblique /font19 ANSIFont font +gs 868 60 225 2482 CB +248 2485 533 (Parametrisation of Units) 533 SB +gr +867 2 224 2311 B +1 F +n +2 2 1092 2311 B +1 F +n +2 2 1095 2311 B +1 F +n +1057 2 1098 2311 B +1 F +n +32 0 0 50 50 0 0 1 45 /MSTT31c4f8 font +gs 868 60 225 2542 CB +248 2545 140 (modes ) 140 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 868 60 225 2542 CB +388 2545 314 (of transmission:) 314 SB +gr +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font +gs 1062 61 1094 2542 CB +1117 2545 435 (input, output, inout ) 435 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 1062 61 1094 2542 CB +1552 2546 433 ( values of expressions) 433 SB +gr +868 2 224 2542 B +1 F +n +2 2 1093 2542 B +1 F +n +1059 2 1096 2542 B +1 F +n +gs 867 61 225 2603 CB +248 2607 105 (also ) 105 SB +gr +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font + +%%BeginResource: font MSTT31c4eb +/G79 [25.0 0.0 0.0 -11.0 24.0 22.0] +/G79 { + 24 33 true [1 0 0 -1 0.0 22.0] {} imagemask + } + 121 /G79 MSTT31c4eb AddChar +%%EndResource + +gs 867 61 225 2603 CB +353 2606 552 (procedure, function, type ) 552 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 867 61 225 2603 CB +905 2607 127 (can be) 127 SB +gr +gs 867 60 225 2661 CB +248 2664 524 (transmitted as a parameter) 524 SB +gr +gs 1061 60 1095 2603 CB +1117 2606 968 (formal procedures\(functions\) should be specified) 968 SB +gr +gs 1061 60 1095 2660 CB +1117 2663 953 (i.e. the types of arguments and results should be) 953 SB +gr +gs 1061 60 1095 2717 CB +1117 2720 120 (given.) 120 SB +gr +gs 1061 60 1095 2774 CB +1117 2777 987 (a formal type T alone is of limited use, however it) 987 SB +gr +gs 1061 60 1095 2831 CB +1117 2834 841 (may accompany other parameters using T.) 841 SB +gr +867 2 224 2603 B +1 F +n +2 2 1092 2603 B +1 F +n +2 2 1095 2603 B +1 F +n +1057 2 1098 2603 B +1 F +n +2 284 1092 2606 B +1 F +n +gs 868 60 225 2891 CB +248 2894 281 (Processes are ) 281 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4f8 font +gs 868 60 225 2891 CB +529 2894 216 (distributed) 216 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 868 60 225 2891 CB +745 2894 266 ( it means that) 266 SB +gr + +%%BeginResource: font MSTT31c4a3 +/G6a [12.0 0.0 -4.0 -11.0 8.0 35.0] +/G6a { + 12 46 true [1 0 0 -1 4.0 35.0] {<00e001f001f001f000e00000000000000000000000000000003000f003f007f000f000f000f000f0 +00f000f000f000f000f000f000f000f000f000f000f000f000f000f000f000f000f000f000f000e0 +00e000e070c0f980ff007e00>} imagemask + } + 106 /G6a MSTT31c4a3 AddChar +/G59 [36.0 0.0 1.0 0.0 36.0 33.0] +/G59 { + 35 33 true [1 0 0 -1 -1.0 33.0] {} imagemask + } + 89 /G59 MSTT31c4a3 AddChar +%%EndResource + +gs 868 60 225 2948 CB +248 2951 694 (they cannot share objects. You can) 694 SB +gr +gs 868 60 225 3005 CB +248 3008 791 (transmit only values of simple types and) 791 SB +gr +gs 868 60 225 3062 CB +248 3065 813 (names of processes or formal procedures) 813 SB +gr +gs 868 60 225 3119 CB +248 3122 461 (to be used for alien call) 461 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4f8 font + +%%BeginResource: font MSTT31c4f8 +/G2e [13.0 0.0 1.0 0.0 6.0 5.0] +/G2e { + 5 5 true [1 0 0 -1 -1.0 5.0] {<70f8f8f870>} imagemask + } + 46 /G2e MSTT31c4f8 AddChar +%%EndResource + +gs 868 60 225 3119 CB +709 3122 32 (s.) 32 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 1062 60 1094 2891 CB +1117 2894 973 (Processes can reside on different systems of your) 973 SB +gr +gs 1062 60 1094 2948 CB +1117 2951 831 (network. This explains the reasons for the) 831 SB +gr +gs 1062 60 1094 3005 CB +1117 3008 233 (restrictions.) 233 SB +gr +gs 1062 60 1094 3062 CB +1117 3065 888 (The present implementation of processes has) 888 SB +gr +gs 1062 60 1094 3119 CB +1117 3122 507 (several limitations. Sorry.) 507 SB +gr +867 2 224 2891 B +1 F +n +2 2 1092 2891 B +1 F +n +2 2 1095 2891 B +1 F +n +1057 2 1098 2891 B +1 F +n +868 2 224 3179 B +1 F +n +2 2 1093 3179 B +1 F +n +1059 2 1096 3179 B +1 F +n +1 #C +statusdict begin /manualfeed false store end +EJ RS +%%PageTrailer +%%PageResources: font Helvetica +%%+ font Helvetica-BoldOblique +%%+ font Helvetica-Oblique +%%+ font MSTT31c4a3 +%%+ font MSTT31c4bd +%%+ font MSTT31c4eb +%%+ font MSTT31c4f8 +%%+ font MSTT31c510 +%%+ font MSTT31c51d +%%+ font MSTT31c52a +%%+ font MSTT31c537 +%%Page: 2 2 +%%PageResources: (atend) +SS +0 0 12 16 799 1169 300 SM +32 0 0 63 63 0 0 0 58 /Helvetica-BoldOblique /font14 ANSIFont font +0 0 0 fC +gs 868 72 177 224 CB +200 224 359 (Instructions) 359 SB +gr +32 0 0 50 50 0 0 0 46 /Helvetica-BoldOblique /font14 ANSIFont font +gs 868 60 177 296 CB +200 299 473 (Atomic instructions) 473 SB +gr +0 0 0 fC +/fm 256 def +868 2 176 296 B +1 F +n +2 2 1045 296 B +1 F +n +1059 2 1048 296 B +1 F +n +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 867 60 177 356 CB +200 359 159 ( x := <) 159 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4f8 font + +%%BeginResource: font MSTT31c4f8 +/G78 [22.0 0.0 -1.0 0.0 22.0 23.0] +/G78 { + 23 23 true [1 0 0 -1 1.0 23.0] {<07801c3fc07e07c0fe03c1fe01e39c01e30001e60000fc0000f80000f80000f80000780000780000 +7c00007c0000bc0001bc00033e18021e10e61e20fc1fc0f80f80700700>} imagemask + } + 120 /G78 MSTT31c4f8 AddChar +%%EndResource + +gs 867 60 177 356 CB +359 359 212 (expression) 212 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 867 60 177 356 CB +571 359 28 (>) 28 SB +gr +gs 1061 60 1047 356 CB +1069 359 443 (assignment instruction) 443 SB +gr +867 2 176 356 B +1 F +n +2 2 1044 356 B +1 F +n +2 2 1047 356 B +1 F +n +1057 2 1050 356 B +1 F +n +2 56 1044 359 B +1 F +n +gs 867 61 177 416 CB +200 420 131 ( x := ) 131 SB +gr +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font +gs 867 61 177 416 CB +331 419 113 (copy ) 113 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 867 61 177 416 CB +444 420 45 (\(<) 45 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4f8 font +gs 867 61 177 416 CB +489 420 212 (expression) 212 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 867 61 177 416 CB +701 420 45 (>\)) 45 SB +gr +gs 1061 60 1047 416 CB +1069 419 992 (copying assignment instruction, has sense only for) 992 SB +gr +gs 1061 60 1047 473 CB +1069 476 363 (object expressions) 363 SB +gr +867 2 176 416 B +1 F +n +2 2 1044 416 B +1 F +n +1060 2 1047 416 B +1 F +n +2 113 1044 419 B +1 F +n +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font +gs 867 61 177 533 CB +200 536 125 ( call ) 125 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 867 61 177 533 CB +325 537 412 (Aprocedure\(params\)) 412 SB +gr +gs 1061 60 1047 533 CB +1069 536 506 (procedure call instruction) 506 SB +gr +867 2 176 533 B +1 F +n +2 2 1044 533 B +1 F +n +1060 2 1047 533 B +1 F +n +2 57 1044 536 B +1 F +n +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font +gs 867 60 177 594 CB +200 597 176 ( return) 176 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 1061 60 1047 594 CB +1069 597 587 (leaving procedure or function) 587 SB +gr +867 2 176 594 B +1 F +n +2 2 1044 594 B +1 F +n +1060 2 1047 594 B +1 F +n +2 56 1044 597 B +1 F +n +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font + +%%BeginResource: font MSTT31c4eb +/G78 [24.0 0.0 1.0 0.0 24.0 22.0] +/G78 { + 23 22 true [1 0 0 -1 -1.0 22.0] {} imagemask + } + 120 /G78 MSTT31c4eb AddChar +%%EndResource + +gs 867 61 177 654 CB +200 657 142 ( exit ) 142 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 867 61 177 654 CB +342 658 69 ( or ) 69 SB +gr +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font +gs 867 61 177 654 CB +411 657 193 ( exit exit ) 193 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 867 61 177 654 CB +604 658 69 (or ) 69 SB +gr +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font +gs 867 61 177 654 CB +673 657 257 (exit exit exit) 257 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 1061 61 1047 654 CB +1069 658 772 (leaving one, two or three nested loops ) 772 SB +gr +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font +gs 1061 61 1047 654 CB +1841 657 145 (do od) 145 SB +gr +867 2 176 654 B +1 F +n +2 2 1044 654 B +1 F +n +1060 2 1047 654 B +1 F +n +2 57 1044 657 B +1 F +n +gs 867 61 177 715 CB +200 718 138 ( new ) 138 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 867 61 177 715 CB +338 719 305 (Aclass\(params\)) 305 SB +gr +gs 1061 60 1047 715 CB +1069 718 625 (instruction generating an object) 625 SB +gr +867 2 176 715 B +1 F +n +2 2 1044 715 B +1 F +n +1060 2 1047 715 B +1 F +n +2 57 1044 718 B +1 F +n +32 0 0 50 50 0 0 0 46 /Helvetica-BoldOblique /font14 ANSIFont font +gs 868 60 177 776 CB +200 779 213 ( Objects) 213 SB +gr +867 2 176 776 B +1 F +n +2 2 1044 776 B +1 F +n +2 2 1047 776 B +1 F +n +1057 2 1050 776 B +1 F +n +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 867 61 177 836 CB +200 840 131 ( x := ) 131 SB +gr +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font +gs 867 61 177 836 CB +331 839 86 (new) 86 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 867 61 177 836 CB +417 840 13 ( ) 13 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4f8 font + +%%BeginResource: font MSTT31c4f8 +/G41 [31.0 0.0 -3.0 0.0 27.0 35.0] +/G41 { + 30 35 true [1 0 0 -1 3.0 35.0] {<000000100000003000000070000000f0000000f0000001f0000003f0000003e0000007e000000de0 +00001de0000019e0000031e0000061e0000061e00000c1e0000181e0000181e0000301e0000601e0 +000c01e0000c01e0001fffc0003fffc0003003c0006003c000c003c001c003c0018003c0030003c0 +060003c00e0003c01e0007c03f000fe0ffc07ffc>} imagemask + } + 65 /G41 MSTT31c4f8 AddChar +%%EndResource + +gs 867 61 177 836 CB +430 840 130 (Aclass) 130 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 867 61 177 836 CB +560 840 17 (\() 17 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4f8 font +gs 867 61 177 836 CB +577 840 149 (params) 149 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 867 61 177 836 CB +726 840 17 (\)) 17 SB +gr +gs 1061 60 1047 836 CB +1069 839 506 (creates an object of class ) 506 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4f8 font +gs 1061 60 1047 836 CB +1575 839 130 (Aclass) 130 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 1061 60 1047 836 CB +1705 839 113 ( with ) 113 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4f8 font +gs 1061 60 1047 836 CB +1818 839 149 (params) 149 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 1061 60 1047 893 CB +1069 896 651 (and stores it under the name of x) 651 SB +gr +867 2 176 836 B +1 F +n +2 2 1044 836 B +1 F +n +2 2 1047 836 B +1 F +n +1057 2 1050 836 B +1 F +n +2 113 1044 839 B +1 F +n +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font +gs 867 61 177 953 CB +200 956 130 ( end ) 130 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4f8 font +gs 867 61 177 953 CB +330 957 130 (Aclass) 130 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 867 61 177 953 CB +460 957 186 ( or ) 186 SB +gr +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font +gs 867 61 177 953 CB +646 956 137 (return) 137 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 1061 60 1047 953 CB +1069 956 988 (terminating initialisation of a newly created object) 988 SB +gr +867 2 176 953 B +1 F +n +2 2 1044 953 B +1 F +n +1060 2 1047 953 B +1 F +n +2 57 1044 956 B +1 F +n +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font +gs 867 61 177 1014 CB +200 1017 106 ( kill) 106 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 867 61 177 1014 CB +306 1018 17 (\() 17 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4f8 font +gs 867 61 177 1014 CB +323 1018 22 (x) 22 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 867 61 177 1014 CB +345 1018 17 (\)) 17 SB +gr + +%%BeginResource: font MSTT31c4a3 +/G7b [24.0 0.0 5.0 -11.0 19.0 35.0] +/G7b { + 14 46 true [1 0 0 -1 -5.0 35.0] {<000c007000c001800380070007000f000f000f000f000f800f800f80078007800780070007000600 +0e0018003000c00030001c000e000700070007800780078007800f800f800f800f000f000f000700 +07000380018000c00070000c>} imagemask + } + 123 /G7b MSTT31c4a3 AddChar +/G7d [24.0 0.0 5.0 -11.0 19.0 35.0] +/G7d { + 14 46 true [1 0 0 -1 -5.0 35.0] {} imagemask + } + 125 /G7d MSTT31c4a3 AddChar +%%EndResource + +gs 1061 60 1047 1014 CB +1069 1017 992 (deallocation instruction, causes{x=none}and kills ) 992 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4f8 font +gs 1061 60 1047 1014 CB +2061 1017 22 (x) 22 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font + +%%BeginResource: font MSTT31c4a3 +/G4e [36.0 0.0 -1.0 -1.0 36.0 33.0] +/G4e { + 37 34 true [1 0 0 -1 1.0 33.0] {} imagemask + } + 78 /G4e MSTT31c4a3 AddChar +/G21 [16.0 0.0 6.0 -1.0 10.0 34.0] +/G21 { + 4 35 true [1 0 0 -1 -6.0 34.0] {<60f0f0f0f0f0f0f0f0f0f0f0f0f0f0e060606060606060606060600000000060f0f060>} imagemask + } + 33 /G21 MSTT31c4a3 AddChar +%%EndResource + +gs 1061 60 1047 1071 CB +1069 1074 712 (REMARK. No dangling references!) 712 SB +gr +gs 1061 60 1047 1128 CB +1069 1131 24 ({) 24 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4f8 font +gs 1061 60 1047 1128 CB +1093 1131 22 (x) 22 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 1061 60 1047 1128 CB +1115 1131 28 (=) 28 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4f8 font + +%%BeginResource: font MSTT31c4f8 +/G79 [22.0 0.0 -5.0 -11.0 22.0 23.0] +/G79 { + 27 34 true [1 0 0 -1 5.0 23.0] {<003800c003fc01e0007c01e0003c01e0003e00e0003e0060001e0040001e00c0001e0080001e0180 +001e0100001e0300001e0200001e0400001f0c00000f1800000f1000000f3000000f6000000f4000 +000f8000000f0000000f0000000e0000000c000000180000003000000060000000c0000071800000 +f3000000fe000000fc00000070000000>} imagemask + } + 121 /G79 MSTT31c4f8 AddChar +%%EndResource + +gs 1061 60 1047 1128 CB +1143 1131 22 (y) 22 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font + +%%BeginResource: font MSTT31c4a3 +/G26 [38.0 0.0 1.0 -1.0 36.0 34.0] +/G26 { + 35 35 true [1 0 0 -1 -1.0 34.0] {<0007e00000001ff80000003c3c000000781c000000700e000000f00e000000f00e000000f00e0000 +00f01e000000f81c000000f8780000007cf00000007fe0ffc0007fc07f00003f003c00007e003c00 +01ff00380003df003000078f8030000f0f8060001e07c0c0003e07e0c0007c03e180007c01f30000 +fc01f60000fc00fc0000fc00780000fc007c0000fe003e0020fe007f80607f00dfe0c07f838fffc0 +3fff03ff801ffc01ff0007f0007c00>} imagemask + } + 38 /G26 MSTT31c4a3 AddChar +%%EndResource + +gs 1061 60 1047 1128 CB +1165 1131 38 (&) 38 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4f8 font +gs 1061 60 1047 1128 CB +1203 1131 22 (x) 22 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 1061 60 1047 1128 CB +1225 1131 28 (=) 28 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4f8 font + +%%BeginResource: font MSTT31c4f8 +/G7a [19.0 0.0 -1.0 0.0 19.0 22.0] +/G7a { + 20 22 true [1 0 0 -1 1.0 22.0] {<03fff007fff007ffe007ffc00601800c0300080600000c0000180000100000200000400000800001 +80000300000600800c01801803003fff007fff00fffe00fffe00>} imagemask + } + 122 /G7a MSTT31c4f8 AddChar +%%EndResource + +gs 1061 60 1047 1128 CB +1253 1131 19 (z) 19 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 1061 60 1047 1128 CB +1272 1131 184 (} => kill\() 184 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4f8 font +gs 1061 60 1047 1128 CB +1456 1131 22 (x) 22 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 1061 60 1047 1128 CB +1478 1131 54 (\) {) 54 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4f8 font +gs 1061 60 1047 1128 CB +1532 1131 22 (x) 22 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 1061 60 1047 1128 CB +1554 1131 162 (=none&) 162 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4f8 font +gs 1061 60 1047 1128 CB +1716 1131 22 (y) 22 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 1061 60 1047 1128 CB +1738 1131 162 (=none&) 162 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4f8 font +gs 1061 60 1047 1128 CB +1900 1131 19 (z) 19 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 1061 60 1047 1128 CB +1919 1131 148 (=none}) 148 SB +gr +867 2 176 1014 B +1 F +n +2 2 1044 1014 B +1 F +n +1060 2 1047 1014 B +1 F +n +2 170 1044 1017 B +1 F +n +32 0 0 50 50 0 0 0 46 /Helvetica-BoldOblique /font14 ANSIFont font +gs 867 60 177 1188 CB +200 1191 42 ( ) 42 SB +gr +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font +gs 867 60 177 1188 CB +242 1191 113 (inner) 113 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 1061 60 1047 1188 CB +1069 1191 988 (pseudoinstruction: a slot for the instructions of an) 988 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4f8 font + +%%BeginResource: font MSTT31c4f8 +/G68 [25.0 0.0 0.0 0.0 24.0 35.0] +/G68 { + 24 35 true [1 0 0 -1 0.0 35.0] {<003c0003fc00007c00003c0000780000780000780000f00000f00000f00001e00001e00001e03c01 +e0fe03c1ff03c39f03c60f078c1f07981f07b01e0f203e0f603e0fc03c1f807c1f007c1f00781e00 +f83e00f83c00f03c01f07801f27801e47801e8f803f0f001c0>} imagemask + } + 104 /G68 MSTT31c4f8 AddChar +%%EndResource + +gs 1061 60 1047 1245 CB +1069 1248 197 (inheriting) 197 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 1061 60 1047 1245 CB +1266 1248 89 ( unit) 89 SB +gr +867 2 176 1188 B +1 F +n +2 2 1044 1188 B +1 F +n +1060 2 1047 1188 B +1 F +n +2 113 1044 1191 B +1 F +n +32 0 0 50 50 0 0 0 46 /Helvetica-BoldOblique /font14 ANSIFont font +gs 868 60 177 1305 CB +200 1308 294 ( Coroutines) 294 SB +gr +867 2 176 1305 B +1 F +n +2 2 1044 1305 B +1 F +n +2 2 1047 1305 B +1 F +n +1057 2 1050 1305 B +1 F +n +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 867 61 177 1408 CB +200 1412 131 ( x := ) 131 SB +gr +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font +gs 867 61 177 1408 CB +331 1411 86 (new) 86 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 867 61 177 1408 CB +417 1412 265 ( Cor\(params\)) 265 SB +gr +gs 1061 60 1047 1408 CB +1069 1411 788 (creates a coroutine object x of type Cor) 788 SB +gr +867 2 176 1408 B +1 F +n +2 2 1044 1408 B +1 F +n +2 2 1047 1408 B +1 F +n +1057 2 1050 1408 B +1 F +n +2 57 1044 1411 B +1 F +n +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font +gs 867 61 177 1469 CB +200 1472 173 ( attach) 173 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 867 61 177 1469 CB +373 1473 58 (\(x\)) 58 SB +gr +gs 1061 60 1047 1469 CB +1069 1472 1000 (activates coroutine x, and then makes the current) 1000 SB +gr +gs 1061 60 1047 1526 CB +1069 1529 462 (coroutine chain passive) 462 SB +gr +867 2 176 1469 B +1 F +n +2 2 1044 1469 B +1 F +n +1060 2 1047 1469 B +1 F +n +2 113 1044 1472 B +1 F +n +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font +gs 867 60 177 1586 CB +200 1589 181 ( detach) 181 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 1061 60 1047 1586 CB +1069 1589 429 (undoes the last attach) 429 SB +gr +867 2 176 1586 B +1 F +n +2 2 1044 1586 B +1 F +n +1060 2 1047 1586 B +1 F +n +2 56 1044 1589 B +1 F +n +32 0 0 50 50 0 0 0 46 /Helvetica-BoldOblique /font14 ANSIFont font +gs 868 60 177 1646 CB +200 1649 653 ( Processes & Concurrency) 653 SB +gr +32 0 0 46 46 0 0 1 42 /MSTT31c52a font + +%%BeginResource: font MSTT31c52a +/G79 [22.0 0.0 0.0 -10.0 22.0 20.0] +/G79 { + 22 30 true [1 0 0 -1 0.0 20.0] {} imagemask + } + 121 /G79 MSTT31c52a AddChar +/G6a [12.0 0.0 -4.0 -10.0 8.0 32.0] +/G6a { + 12 42 true [1 0 0 -1 4.0 32.0] {<006000f000f000600000000000000000000000000000003001f007f000f000f000f000f000f000f0 +00f000f000f000f000f000f000f000f000f000f000f000f000f000f000f000f000e000e070c0f8c0 +fd807e00>} imagemask + } + 106 /G6a MSTT31c52a AddChar +/G70 [23.0 0.0 0.0 -10.0 21.0 21.0] +/G70 { + 21 31 true [1 0 0 -1 0.0 21.0] {<061f003e3fc0fe7fe01ec3e01f01f01e00f01e00f81e00781e00781e00781e00781e00781e00781e +00781e00701e00701e00f01e00e01f01c01f83c01eff001e7e001e00001e00001e00001e00001e00 +001e00001e00003f0000ffc000>} imagemask + } + 112 /G70 MSTT31c52a AddChar +/G76 [22.0 0.0 0.0 -1.0 22.0 20.0] +/G76 { + 22 21 true [1 0 0 -1 0.0 20.0] {} imagemask + } + 118 /G76 MSTT31c52a AddChar +/G6d [34.0 0.0 0.0 0.0 34.0 21.0] +/G6d { + 34 21 true [1 0 0 -1 0.0 21.0] {<060f00f0003e3f83f800fe7fc7fc001ec7ec3e001f03f01e001e01e01e001e01e01e001e01e01e00 +1e01e01e001e01e01e001e01e01e001e01e01e001e01e01e001e01e01e001e01e01e001e01e01e00 +1e01e01e001e01e01e001e01e01e003f03f03f00ffc7fc7fc0>} imagemask + } + 109 /G6d MSTT31c52a AddChar +%%EndResource + +gs 1062 56 1046 1646 CB +1069 1649 958 (truly object oriented processes and an objective com-) 958 SB +gr + +%%BeginResource: font MSTT31c52a +/G68 [22.0 0.0 0.0 0.0 22.0 32.0] +/G68 { + 22 32 true [1 0 0 -1 0.0 32.0] {<0e00007e0000fe00001e00001e00001e00001e00001e00001e00001e00001e00001e0f001e3f801e +7fc01ec3c01f03e01e01e01e01e01e01e01e01e01e01e01e01e01e01e01e01e01e01e01e01e01e01 +e01e01e01e01e01e01e03f03f0ffcffc>} imagemask + } + 104 /G68 MSTT31c52a AddChar +/G67 [22.0 0.0 0.0 -10.0 21.0 21.0] +/G67 { + 21 31 true [1 0 0 -1 0.0 21.0] {<01f800071e000e0ff81c07f81c07803c03c03c03c03c03c03c03c03c03c01e03c01e03800f070007 +8e0007f8000c00001800003800003fffc03ffff00ffff0080038100018200018600018e00030f000 +70fe01e07fffc01fff0007f800>} imagemask + } + 103 /G67 MSTT31c52a AddChar +/G66 [15.0 0.0 1.0 0.0 20.0 32.0] +/G66 { + 19 32 true [1 0 0 -1 -1.0 32.0] {<003f0000ff8001c7c00383e00701e00700c00700000f00000f00000f00000f00000f0000fffc00ff +fc000f00000f00000f00000f00000f00000f00000f00000f00000f00000f00000f00000f00000f00 +000f00000f00000f00001f8000fff800>} imagemask + } + 102 /G66 MSTT31c52a AddChar +%%EndResource + +gs 1062 56 1046 1699 CB +1069 1702 939 (munication mechanism just by calling methods of a) 939 SB +gr +gs 1062 56 1046 1752 CB +1069 1755 269 (distant process) 269 SB +gr +867 2 176 1646 B +1 F +n +2 2 1044 1646 B +1 F +n +2 2 1047 1646 B +1 F +n +1057 2 1050 1646 B +1 F +n +32 0 0 50 50 0 0 1 45 /MSTT31c4f8 font + +%%BeginResource: font MSTT31c4f8 +/G35 [25.0 0.0 1.0 0.0 24.0 33.0] +/G35 { + 23 33 true [1 0 0 -1 -1.0 33.0] {<001ffe001ffe003ffc003ffc00200000400000400000800000f00001fe0001ff0003ff80007fc000 +0fe00007e00003f00001f00001f00000f00000f00000f00000f00000e00000e00001c00001c00003 +80000300f80f00fc1c00fff8007fe0003f8000>} imagemask + } + 53 /G35 MSTT31c4f8 AddChar +%%EndResource + +gs 867 61 177 1808 CB +200 1812 209 ( proces5) 209 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 867 61 177 1808 CB +409 1812 42 (:=) 42 SB +gr +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font +gs 867 61 177 1808 CB +451 1811 86 (new) 86 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 867 61 177 1808 CB +537 1812 13 ( ) 13 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4f8 font + +%%BeginResource: font MSTT31c4f8 +/G54 [28.0 0.0 4.0 0.0 33.0 34.0] +/G54 { + 29 34 true [1 0 0 -1 -4.0 34.0] {<0ffffff80f03c0781c03c0301803c030100780302007802020078020200f0020000f0000000f0000 +001f0000001e0000001e0000001e0000003c0000003c0000003c0000007800000078000000780000 +00f8000000f0000000f0000000f0000001e0000001e0000001e0000003c0000003c0000003c00000 +07c0000007c000000fc00000fffc0000>} imagemask + } + 84 /G54 MSTT31c4f8 AddChar +%%EndResource + +gs 867 61 177 1808 CB +550 1812 229 (procesType) 229 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 867 61 177 1808 CB +779 1812 86 (\(...\);) 86 SB +gr +gs 1061 60 1047 1808 CB +1069 1811 386 (creates an object of) 386 SB +gr +gs 1061 61 1047 1865 CB +1069 1869 39 ( ) 39 SB +gr +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font +gs 1061 61 1047 1865 CB +1108 1868 100 (unit ) 100 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4f8 font +gs 1061 61 1047 1865 CB +1208 1869 229 (procesType) 229 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 1061 61 1047 1865 CB +1437 1869 27 (: ) 27 SB +gr +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font +gs 1061 61 1047 1865 CB +1464 1868 156 (process) 156 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 1061 61 1047 1865 CB +1620 1869 45 (\(<) 45 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4f8 font + +%%BeginResource: font MSTT31c4f8 +/G66 [15.0 0.0 -9.0 -11.0 23.0 35.0] +/G66 { + 32 46 true [1 0 0 -1 9.0 35.0] {<0000003c000000e6000001c70000038f0000078e0000070000000f0000000e0000001e0000001e00 +00003c0000003c000000fc00000fff80000fff8000007800000078000000f0000000f0000000f000 +0001f0000001e0000001e0000003e0000003c0000003c0000003c000000780000007800000078000 +000f0000000f0000000f0000001e0000001e0000001c0000001c0000003800000038000000300000 +0070000070600000f0c00000f1800000e30000007c000000>} imagemask + } + 102 /G66 MSTT31c4f8 AddChar +/G50 [30.0 0.0 -2.0 0.0 30.0 34.0] +/G50 { + 32 34 true [1 0 0 -1 2.0 34.0] {<007fffc0000fc0f00007803c0007801e0007801e000f001f000f001f000f000f000f001f001e001f +001e001e001e001e003e003c003c007c003c0078003c01e0007e07c0007bfe000078000000f80000 +00f0000000f0000000f0000001e0000001e0000001e0000003c0000003c0000003c0000007c00000 +078000000f8000001fc00000fff80000>} imagemask + } + 80 /G50 MSTT31c4f8 AddChar +%%EndResource + +gs 1061 61 1047 1865 CB +1665 1869 249 (formParams) 249 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 1061 61 1047 1865 CB +1914 1869 110 (>\); ...) 110 SB +gr +867 2 176 1808 B +1 F +n +2 2 1044 1808 B +1 F +n +2 2 1047 1808 B +1 F +n +1057 2 1050 1808 B +1 F +n +2 114 1044 1811 B +1 F +n +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font +gs 867 61 177 1926 CB +200 1929 192 ( resume) 192 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 867 61 177 1926 CB +392 1930 17 (\() 17 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4f8 font +gs 867 61 177 1926 CB +409 1930 157 (proces5) 157 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 867 61 177 1926 CB +566 1930 17 (\)) 17 SB +gr +gs 1061 60 1047 1926 CB +1069 1929 521 (activate a passive process ) 521 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4f8 font +gs 1061 60 1047 1926 CB +1590 1929 176 (process5) 176 SB +gr +867 2 176 1926 B +1 F +n +2 2 1044 1926 B +1 F +n +1060 2 1047 1926 B +1 F +n +2 57 1044 1929 B +1 F +n +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font +gs 867 60 177 1987 CB +200 1990 128 ( stop) 128 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 1061 60 1047 1987 CB +1069 1990 591 (the current process passivates) 591 SB +gr +867 2 176 1987 B +1 F +n +2 2 1044 1987 B +1 F +n +1060 2 1047 1987 B +1 F +n +2 56 1044 1990 B +1 F +n +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font +gs 867 61 177 2047 CB +200 2050 190 ( enable ) 190 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4f8 font +gs 867 61 177 2047 CB +390 2051 262 (hisprocedure) 262 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 1061 60 1047 2047 CB +1069 2050 296 (adds the name ) 296 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4f8 font +gs 1061 60 1047 2047 CB +1365 2050 314 (hisprocedure to) 314 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 1061 60 1047 2047 CB +1679 2050 357 ( the MASK of the) 357 SB +gr +gs 1061 60 1047 2104 CB +1069 2107 993 (process, enabling other processes to communicate) 993 SB +gr +gs 1061 60 1047 2161 CB +1069 2164 588 (with the process by means of ) 588 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4f8 font +gs 1061 60 1047 2161 CB +1657 2164 262 (hisprocedure) 262 SB +gr +867 2 176 2047 B +1 F +n +2 2 1044 2047 B +1 F +n +1060 2 1047 2047 B +1 F +n +2 170 1044 2050 B +1 F +n +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font +gs 867 61 177 2221 CB +200 2224 201 ( disable ) 201 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4f8 font + +%%BeginResource: font MSTT31c4f8 +/G46 [30.0 0.0 -2.0 0.0 33.0 34.0] +/G46 { + 35 34 true [1 0 0 -1 2.0 34.0] {<007fffffe0000fc001e000078000e000078000600007800040000f800040000f000040000f000000 +000f000000001e000000001e000000001e002000003e006000003c004000003c00c000003c03c000 +007fffc0000078078000007801800000f801800000f001800000f001000000f001000001e0000000 +01e000000001e000000003c000000003c000000003c000000007c000000007800000000780000000 +1fc0000000fff8000000>} imagemask + } + 70 /G46 MSTT31c4f8 AddChar +%%EndResource + +gs 867 61 177 2221 CB +401 2225 452 (aProcedure,aFunction) 452 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 1061 60 1047 2221 CB +1069 2224 150 (deletes ) 150 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4f8 font +gs 1061 60 1047 2221 CB +1219 2224 465 (aProcedure,aFunction ) 465 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 1061 60 1047 2221 CB +1684 2224 324 (from the MASK) 324 SB +gr +867 2 176 2221 B +1 F +n +2 2 1044 2221 B +1 F +n +1060 2 1047 2221 B +1 F +n +2 57 1044 2224 B +1 F +n +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font +gs 867 61 177 2282 CB +200 2285 188 ( accept ) 188 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4f8 font +gs 867 61 177 2282 CB +388 2286 485 (aProc1, aProc2, aFnctn) 485 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 1061 60 1047 2282 CB +1069 2285 297 (process waits \() 297 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4f8 font +gs 1061 60 1047 2282 CB +1366 2285 194 (inactively) 194 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 1061 60 1047 2282 CB +1560 2285 414 (\) for another process) 414 SB +gr +gs 1061 60 1047 2339 CB +1069 2342 339 (calling a method;) 339 SB +gr +gs 1061 60 1047 2396 CB +1069 2399 994 (accept makes possible rendez-vous of this process) 994 SB +gr +gs 1061 60 1047 2453 CB +1069 2456 769 (and another process calling his method) 769 SB +gr +867 2 176 2282 B +1 F +n +2 2 1044 2282 B +1 F +n +1060 2 1047 2282 B +1 F +n +2 227 1044 2285 B +1 F +n +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font +gs 867 61 177 2513 CB +200 2516 351 ( return disable ) 351 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font + +%%BeginResource: font MSTT31c4a3 +/G31 [25.0 0.0 6.0 0.0 19.0 33.0] +/G31 { + 13 33 true [1 0 0 -1 -6.0 33.0] {<01800f807f80cf800780078007800780078007800780078007800780078007800780078007800780 +078007800780078007800780078007800780078007800fc07ff8>} imagemask + } + 49 /G31 MSTT31c4a3 AddChar +%%EndResource + +gs 867 61 177 2513 CB +551 2517 140 (aProc1) 140 SB +gr +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font +gs 867 61 177 2513 CB +691 2516 151 ( enable) 151 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 867 61 177 2513 CB +842 2517 71 ( aQ) 71 SB +gr +gs 1061 60 1047 2513 CB +1069 2516 1010 (return from a rendez-vous reestablishes the MASK) 1010 SB +gr +gs 1061 60 1047 2570 CB +1069 2573 920 (of the called process; it is posible to modify its) 920 SB +gr +gs 1061 60 1047 2627 CB +1069 2630 942 (MASK disabling some procedures and enabling) 942 SB +gr +gs 1061 60 1047 2684 CB +1069 2687 123 (others) 123 SB +gr +867 2 176 2513 B +1 F +n +2 2 1044 2513 B +1 F +n +1060 2 1047 2513 B +1 F +n +2 227 1044 2516 B +1 F +n +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font +gs 867 61 177 2744 CB +200 2747 125 ( call ) 125 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4f8 font + +%%BeginResource: font MSTT31c4f8 +/G28 [16.0 0.0 3.0 -10.0 22.0 35.0] +/G28 { + 19 45 true [1 0 0 -1 -3.0 35.0] {<0000600000c0000180000300000e00001c0000380000700000e00001e00001c0000380000780000f +00000f00001e00001e00003c00003c00007c0000780000780000780000f80000f00000f00000f000 +00f00000e00000e00000e00000e00000e00000e00000600000600000600000600000200000300000 +300000100000100000180000080000>} imagemask + } + 40 /G28 MSTT31c4f8 AddChar +/G29 [17.0 0.0 -6.0 -10.0 13.0 35.0] +/G29 { + 19 45 true [1 0 0 -1 6.0 35.0] {<0002000003000001000001000001800001800000800000c00000c00000c00000c00000e00000e000 +00e00000e00000e00000e00001e00001e00001e00001e00001e00003c00003c00003c00007c00007 +80000780000f00000f00001e00001e00003c0000380000700000f00000e00001c000038000070000 +0e0000180000300000600000c00000>} imagemask + } + 41 /G29 MSTT31c4f8 AddChar +%%EndResource + +gs 867 61 177 2744 CB +325 2748 534 (proces5.hisprocedure\(par\)) 534 SB +gr +gs 867 68 177 2859 CB +200 2868 208 ( ) 208 SB +gr +32 0 0 50 50 0 0 0 51 /Symbol font +gs 258 68 177 2859 CB +408 2862 27 (\255) 27 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4f8 font +gs 867 63 177 2981 CB +200 2985 65 ( ) 65 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 867 63 177 2981 CB +265 2985 13 ( ) 13 SB +gr +32 0 0 50 50 0 0 0 46 /Palatino-Roman /font27 ANSIFont font +gs 867 63 177 2981 CB +278 2984 143 (this is ) 143 SB +gr +32 0 0 40 40 0 0 0 37 /Palatino-Roman /font27 ANSIFont font +gs 867 63 177 2981 CB +421 2993 242 (ALIEN CALL) 242 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 1061 60 1047 2744 CB +1069 2747 579 (the current process demands ) 579 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4f8 font +gs 1061 60 1047 2744 CB +1648 2747 176 (process5) 176 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 1061 60 1047 2744 CB +1824 2747 217 ( process to) 217 SB +gr +gs 1061 60 1047 2801 CB +1069 2804 165 (execute ) 165 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4f8 font +gs 1061 60 1047 2801 CB +1234 2804 262 (hisprocedure) 262 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 1061 60 1047 2801 CB +1496 2804 423 ( with the transmitted ) 423 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4f8 font +gs 1061 60 1047 2801 CB +1919 2804 69 (par) 69 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 1061 60 1047 2858 CB +1069 2861 919 (parameters and waits for the eventual outputs;) 919 SB +gr + +%%BeginResource: font MSTT31c4a3 +/Gb0 [19.0 0.0 2.0 19.0 17.0 34.0] +/Gb0 { + 15 15 true [1 0 0 -1 -2.0 34.0] {<07c01ff03838701c600cc006c006c006c006c006600c701c38381ff007c0>} imagemask + } + 176 /Gb0 MSTT31c4a3 AddChar +%%EndResource + +gs 1061 61 1047 2915 CB +1069 2919 740 (1\260 this instruction may meet with an ) 740 SB +gr +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font +gs 1061 61 1047 2915 CB +1809 2918 136 (accept) 136 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 1061 60 1047 2973 CB +1069 2976 278 (instruction of ) 278 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4f8 font +gs 1061 60 1047 2973 CB +1347 2976 189 (process5 ) 189 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 1061 60 1047 2973 CB +1536 2976 543 (process - in such case there) 543 SB +gr +gs 1061 60 1047 3030 CB +1069 3033 642 (is a rendez-vous of two process,) 642 SB +gr + +%%BeginResource: font MSTT31c4a3 +/G32 [25.0 0.0 1.0 0.0 23.0 33.0] +/G32 { + 22 33 true [1 0 0 -1 -1.0 33.0] {<00fc0007ff000fff801fffc01e0fe03803e03001f06001f06000f04000f00000f00000e00000e000 +01c00001c0000180000380000300000600000e00001c0000180000300000600000c0000180000300 +0406000c0c00381ffff83ffff87ffff0fffff0>} imagemask + } + 50 /G32 MSTT31c4a3 AddChar +%%EndResource + +gs 1061 61 1047 3087 CB +1069 3091 350 (2\260 otherwise the ) 350 SB +gr +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font +gs 1061 61 1047 3087 CB +1419 3090 73 (call) 73 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 1061 61 1047 3087 CB +1492 3091 572 ( tents to interrupt the normal) 572 SB +gr +gs 1061 60 1047 3145 CB +1069 3148 617 (flow of execution of the called ) 617 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4f8 font +gs 1061 60 1047 3145 CB +1686 3148 176 (process5) 176 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 1061 60 1047 3145 CB +1862 3148 176 ( process.) 176 SB +gr +867 2 176 2744 B +1 F +n +2 2 1044 2744 B +1 F +n +1060 2 1047 2744 B +1 F +n +2 457 1044 2747 B +1 F +n +32 0 0 42 42 0 0 1 38 /MSTT31c51d font + +%%BeginResource: font MSTT31c51d +/G4c [25.0 0.0 0.0 0.0 24.0 28.0] +/G4c { + 24 28 true [1 0 0 -1 0.0 28.0] {} imagemask + } + 76 /G4c MSTT31c51d AddChar +/G67 [21.0 0.0 1.0 -9.0 21.0 20.0] +/G67 { + 20 29 true [1 0 0 -1 -1.0 20.0] {<01f800071ff00e0f001c0f803c07803c07803c07803c07803c07801e07001e0e000f1c0007f8000c +00001800001800003c00003fff801fffc00fffe01800e0300060600060600060e000c0f001807c0f +003ffe000ff000>} imagemask + } + 103 /G67 MSTT31c51d AddChar +/G27 [8.0 0.0 2.0 17.0 6.0 29.0] +/G27 { + 4 12 true [1 0 0 -1 -2.0 29.0] {<60f0f0f0f0f0f0f060606060>} imagemask + } + 39 /G27 MSTT31c51d AddChar +/G38 [21.0 0.0 2.0 0.0 19.0 28.0] +/G38 { + 17 28 true [1 0 0 -1 -2.0 28.0] {<07e0001c3800381e00700e00f00f00f00f00f00f00f80f00fc1e007e1c003f38001fb0000fc00007 +e00007f8000cfc00187e00383f00701f00f00f80f00f80f00780f00780f00780780700380e001e1c +0007f000>} imagemask + } + 56 /G38 MSTT31c51d AddChar +/G32 [21.0 0.0 1.0 0.0 19.0 28.0] +/G32 { + 18 28 true [1 0 0 -1 -1.0 28.0] {<03e0000ff8001ffc00387e00303f00201f00400f00400f00000f00000f00000f00000e00000e0000 +1c00001c0000380000300000600000e00000c0000180000300000600000c00c01801803fff807fff +00ffff00>} imagemask + } + 50 /G32 MSTT31c51d AddChar +/G51 [30.0 0.0 1.0 -8.0 29.0 29.0] +/G51 { + 28 37 true [1 0 0 -1 -1.0 29.0] {<003fc00000fff00003e07c0007801e000f000f001e0007803e0007c03c0003c07c0003e07c0003e0 +780001e0f80001f0f80001f0f80001f0f80001f0f80001f0f80001f0f80001f0f80001e0780001e0 +7c0003e07c0003c03c0003c01e0007801e0007000f000e0007801c0001e07000007fc000001f8000 +000fc0000007e0000001f0000000f80000003e0000000780000000f0>} imagemask + } + 81 /G51 MSTT31c51d AddChar +/G63 [18.0 0.0 1.0 -1.0 17.0 20.0] +/G63 { + 16 21 true [1 0 0 -1 -1.0 20.0] {<01f00ffc1c1e380f300f70076000e000e000e000e000e000f000f00178037c027e0e3ffc1ffc0ff8 +03e0>} imagemask + } + 99 /G63 MSTT31c51d AddChar +/G6b [21.0 0.0 0.0 0.0 21.0 29.0] +/G6b { + 21 29 true [1 0 0 -1 0.0 29.0] {<0e00007e0000fe00001e00001e00001e00001e00001e00001e00001e00001e0ff01e07801e06001e +0c001e18001e30001e60001ee0001ff0001ef0001e78001e3c001e1e001e1f001e0f001e07801e03 +c03f03e0ffcff8>} imagemask + } + 107 /G6b MSTT31c51d AddChar +/G52 [27.0 0.0 0.0 0.0 28.0 28.0] +/G52 { + 28 28 true [1 0 0 -1 0.0 28.0] {} imagemask + } + 82 /G52 MSTT31c51d AddChar +/G43 [28.0 0.0 2.0 -1.0 27.0 29.0] +/G43 { + 25 30 true [1 0 0 -1 -2.0 29.0] {<003f820000ffe60003e07e0007801e000f000e001e0007003e0003003c0003007c0003007c000100 +78000000f8000000f8000000f8000000f8000000f8000000f8000000f8000000f8000000f8000000 +7c0000007c0000007c0000003e0000801e0001001f0002000fc00c0003f0380001fff000003f8000 +>} imagemask + } + 67 /G43 MSTT31c51d AddChar +%%EndResource + +200 3263 554 (Loglan'82 Quick Reference Card) 554 SB + +%%BeginResource: font MSTT31c51d +/G2d [14.0 0.0 2.0 8.0 13.0 12.0] +/G2d { + 11 4 true [1 0 0 -1 -2.0 12.0] {} imagemask + } + 45 /G2d MSTT31c51d AddChar +%%EndResource + +1050 3263 25 (- ) 25 SB +1075 3263 21 (2) 21 SB +1096 3263 25 ( -) 25 SB + +%%BeginResource: font MSTT31c51d +/G4e [30.0 0.0 0.0 0.0 30.0 28.0] +/G4e { + 30 28 true [1 0 0 -1 0.0 28.0] {} imagemask + } + 78 /G4e MSTT31c51d AddChar +/G62 [20.0 0.0 -1.0 -1.0 19.0 29.0] +/G62 { + 20 30 true [1 0 0 -1 1.0 29.0] {<0600003e0000fe00001e00001e00001e00001e00001e00001e00001e1e001e7f801effc01f87c01f +03e01e01e01e01f01e00f01e00f01e00f01e00f01e00f01e00f01e00e01e00e01e01e01e01c01f03 +800f870007fe0001f800>} imagemask + } + 98 /G62 MSTT31c51d AddChar +/G2c [11.0 0.0 2.0 -7.0 8.0 3.0] +/G2c { + 6 10 true [1 0 0 -1 -2.0 3.0] {<70f8fc740404081020c0>} imagemask + } + 44 /G2c MSTT31c51d AddChar +/G39 [21.0 0.0 2.0 0.0 19.0 28.0] +/G39 { + 17 28 true [1 0 0 -1 -2.0 28.0] {<03e0000c3800181c00380e00700e00700f00f00700f00780f00780f00780f00780f0078078078078 +07803c07801e1f000fef00000f00000e00001e00001c00003c0000780000f00001e0000380000f00 +00780000>} imagemask + } + 57 /G39 MSTT31c51d AddChar +/G34 [21.0 0.0 1.0 0.0 19.0 28.0] +/G34 { + 18 28 true [1 0 0 -1 -1.0 28.0] {<001c00003c00003c00007c00007c0000bc00013c00013c00023c00023c00043c00083c00083c0010 +3c00103c00203c00403c00403c00ffffc0ffffc0ffffc0003c00003c00003c00003c00003c00003c +00003c00>} imagemask + } + 52 /G34 MSTT31c51d AddChar +%%EndResource + +1734 3263 238 (November, 94) 238 SB +255 255 255 fC +1973 3 194 3259 B +1 F +n +0 0 0 fC +1973 2 194 3256 B +1 F +n +1 #C +statusdict begin /manualfeed false store end +EJ RS +%%PageTrailer +%%PageResources: font Helvetica-BoldOblique +%%+ font MSTT31c4a3 +%%+ font MSTT31c4eb +%%+ font MSTT31c4f8 +%%+ font MSTT31c51d +%%+ font MSTT31c52a +%%+ font Palatino-Roman +%%+ font Symbol +%%Page: 3 3 +%%PageResources: (atend) +SS +0 0 12 16 799 1169 300 SM +32 0 0 50 50 0 0 0 46 /Helvetica-BoldOblique /font14 ANSIFont font +0 0 0 fC +gs 868 57 225 281 CB +248 281 480 ( Exception handling) 480 SB +gr +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font +gs 867 61 225 338 CB +248 341 140 ( raise) 140 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 867 61 225 338 CB +388 342 13 ( ) 13 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4f8 font +gs 867 61 225 338 CB +401 342 153 (Asignal) 153 SB +gr +gs 1061 60 1095 338 CB +1117 341 153 (Asignal) 153 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 1061 60 1095 338 CB +1270 341 761 ( is raised. This lances the research of a) 761 SB +gr +gs 1061 61 1095 395 CB +1117 399 160 (module ) 160 SB +gr +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font +gs 1061 61 1095 395 CB +1277 398 189 (handling) 189 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font + +%%BeginResource: font MSTT31c4a3 +/G4c [30.0 0.0 0.0 0.0 29.0 33.0] +/G4c { + 29 33 true [1 0 0 -1 0.0 33.0] {} imagemask + } + 76 /G4c MSTT31c4a3 AddChar +%%EndResource + +gs 1061 61 1095 395 CB +1466 399 647 ( the signal along the chain of DL) 647 SB +gr +gs 1061 60 1095 453 CB +1117 456 871 (links i.e. along dynamic fathers of instances.) 871 SB +gr +0 0 0 fC +/fm 256 def +867 2 224 338 B +1 F +n +2 2 1092 338 B +1 F +n +2 2 1095 338 B +1 F +n +1057 2 1098 338 B +1 F +n +2 171 1092 341 B +1 F +n +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font +gs 867 60 225 513 CB +248 516 176 ( return) 176 SB +gr +32 0 0 50 50 0 0 0 51 /Symbol font +gs 49 68 1095 513 CB +1118 516 26 (\374) 26 SB +gr +gs 49 68 1095 513 CB +1117 516 26 (\374) 26 SB +gr +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font +gs 1061 68 1095 513 CB +1144 521 299 ( ) 299 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 1061 68 1095 513 CB +1443 522 606 (returns to after raise statement) 606 SB +gr +867 2 224 513 B +1 F +n +2 2 1092 513 B +1 F +n +1060 2 1095 513 B +1 F +n +2 64 1092 516 B +1 F +n +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font +gs 867 60 225 581 CB +248 584 145 ( wind) 145 SB +gr +32 0 0 50 50 0 0 0 51 /Symbol font +gs 49 68 1095 581 CB +1118 584 26 (\375) 26 SB +gr +gs 49 68 1095 581 CB +1117 584 26 (\375) 26 SB +gr +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font +gs 1061 68 1095 581 CB +1144 589 39 ( ) 39 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font + +%%BeginResource: font MSTT31c4a3 +/G33 [25.0 0.0 2.0 0.0 20.0 33.0] +/G33 { + 18 33 true [1 0 0 -1 -2.0 33.0] {<03f0000ffc001ffe00383f00601f80400f80800780000780000780000700000600000c0000080000 +1000003c0000fe0003ff00007f80001f80000fc00007c00007c00003c00003c00003c00003800003 +80000780000700700e00fc1c00fff0003fc000>} imagemask + } + 51 /G33 MSTT31c4a3 AddChar +%%EndResource + +gs 1061 68 1095 581 CB +1183 590 902 (3 forms of terminating an exception handling) 902 SB +gr +867 2 224 581 B +1 F +n +2 2 1092 581 B +1 F +n +1060 2 1095 581 B +1 F +n +2 64 1092 584 B +1 F +n +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font +gs 867 60 225 649 CB +248 652 246 ( terminate) 246 SB +gr +32 0 0 50 50 0 0 0 51 /Symbol font +gs 49 68 1095 649 CB +1118 652 26 (\376) 26 SB +gr +gs 49 68 1095 649 CB +1117 652 26 (\376) 26 SB +gr +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font +gs 1061 68 1095 649 CB +1144 657 78 ( ) 78 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 1061 68 1095 649 CB +1222 658 871 (destructs \(lastwill\) several instances of units) 871 SB +gr +867 2 224 649 B +1 F +n +2 2 1092 649 B +1 F +n +1060 2 1095 649 B +1 F +n +2 64 1092 652 B +1 F +n +32 0 0 50 50 0 0 0 46 /Helvetica-BoldOblique /font14 ANSIFont font +gs 868 60 225 774 CB +248 777 563 (Composed instructions) 563 SB +gr +867 2 224 717 B +1 F +n +2 2 1092 717 B +1 F +n +2 2 1095 717 B +1 F +n +1057 2 1098 717 B +1 F +n +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font +gs 867 68 225 834 CB +248 842 82 ( if ) 82 SB +gr +32 0 0 50 50 0 0 0 51 /Symbol font +gs 126 68 225 834 CB +330 837 21 (g) 21 SB +gr +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font +gs 867 68 225 834 CB +351 842 121 ( then ) 121 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 867 68 225 834 CB +472 843 17 (I) 17 SB +gr +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font +gs 867 68 225 834 CB +489 842 102 ( else ) 102 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font + +%%BeginResource: font MSTT31c4a3 +/G4a [19.0 0.0 1.0 -1.0 19.0 33.0] +/G4a { + 18 34 true [1 0 0 -1 -1.0 33.0] {<1fffc003fe0000f80000f80000f80000f80000f80000f80000f80000f80000f80000f80000f80000 +f80000f80000f80000f80000f80000f80000f80000f80000f80000f80000f80000f80000f80000f8 +0000f00070f000f0f000f8e000f9c0007f80003e0000>} imagemask + } + 74 /G4a MSTT31c4a3 AddChar +%%EndResource + +gs 867 68 225 834 CB +591 843 19 (J) 19 SB +gr +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font +gs 867 68 225 834 CB +610 842 43 ( fi) 43 SB +gr +32 0 0 50 50 0 0 0 51 /Symbol font +gs 43 68 1095 834 CB +1117 837 21 (g) 21 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 1061 68 1095 834 CB +1138 843 480 ( is a Boolean expression) 480 SB +gr +gs 1061 60 1095 899 CB +1117 902 659 (I, J are sequences of instructions ) 659 SB +gr + +%%BeginResource: font MSTT31c54f +/MSTT31c54f [42.0 0 0 0 0 0] 47 -115 [-42.0 -42.0 42.0 42.0] [1 42 div 0 0 1 42 div 0 0] /MSTT31c54f GreNewFont +%%EndResource + +32 0 0 42 42 0 0 1 38 /MSTT31c54f font + +%%BeginResource: font MSTT31c54f +/G7b [17.0 0.0 3.0 -9.0 20.0 29.0] +/G7b { + 17 38 true [1 0 0 -1 -3.0 29.0] {<000180000e0000180000300000600000e00001c00001c00001c00001c00003c00003c00003800003 +80000300000600000c0000300000c000006000003800001800001c00001c00003c00003c00003c00 +00780000780000f00000f00000e00000e00000e000006000007000003800000c0000>} imagemask + } + 123 /G7b MSTT31c54f AddChar +%%EndResource + +gs 1061 60 1095 899 CB +1776 909 17 ({) 17 SB +gr + +%%BeginResource: font MSTT31c55c +/MSTT31c55c [42.0 0 0 0 0 0] 95 -115 [-42.0 -42.0 42.0 42.0] [1 42 div 0 0 1 42 div 0 0] /MSTT31c55c GreNewFont +%%EndResource + +32 0 0 42 42 0 0 1 38 /MSTT31c55c font + +%%BeginResource: font MSTT31c55c +/G65 [19.0 0.0 1.0 0.0 19.0 19.0] +/G65 { + 18 19 true [1 0 0 -1 -1.0 19.0] {<001f8000e7c00187c00787c00f0fc01e0f801e1f003c1e007c3c007cf000ff8000f80000f80000f8 +0000f80300fc0e007ffc007ff0001fc000>} imagemask + } + 101 /G65 MSTT31c55c AddChar +/G6c [12.0 0.0 1.0 0.0 13.0 29.0] +/G6c { + 12 29 true [1 0 0 -1 -1.0 29.0] {<00f00ff003f003e003e003e007e007c007c007c00f800f800f801f801f001f003f003e003e003e00 +7c007c007c00fc00f840f880fb00fe007800>} imagemask + } + 108 /G6c MSTT31c55c AddChar +/G73 [16.0 0.0 0.0 0.0 16.0 19.0] +/G73 { + 16 19 true [1 0 0 -1 0.0 19.0] {<03fb078f0f071f061f821f821fc00fe00ff007f803f801fc40fc40fc607ce078f078f8f08fc0>} imagemask + } + 115 /G73 MSTT31c55c AddChar +/G20 [11.0 0.0 0.0 0.0 0.0 0.0] +/G20 { +} + 32 /G20 MSTT31c55c AddChar +%%EndResource + +gs 1061 60 1095 899 CB +1793 909 77 (else ) 77 SB +gr +32 0 0 42 42 0 0 1 38 /MSTT31c54f font + +%%BeginResource: font MSTT31c54f +/G4a [19.0 0.0 -2.0 0.0 22.0 28.0] +/G4a { + 24 28 true [1 0 0 -1 2.0 28.0] {<0007ff0000f80000f00000f00000e00000e00000e00001c00001c00001c00001c000038000038000 +0380000700000700000700000700000e00000e00000e00601c00f01c00f03800f07000e0e00061c0 +003f0000>} imagemask + } + 74 /G4a MSTT31c54f AddChar +/G20 [11.0 0.0 0.0 0.0 0.0 0.0] +/G20 { +} + 32 /G20 MSTT31c54f AddChar +/G69 [12.0 0.0 1.0 0.0 10.0 26.0] +/G69 { + 9 26 true [1 0 0 -1 -1.0 26.0] {<038003800380000000000000000007003f0007000e000e000e000e001c001c001c00380038003800 +7800700072007400f8007000>} imagemask + } + 105 /G69 MSTT31c54f AddChar +/G73 [16.0 0.0 0.0 0.0 16.0 19.0] +/G73 { + 16 19 true [1 0 0 -1 0.0 19.0] {<01f1070f06070e020e020f020f8007c003e001e001f000f8407840384038e038e030f0608f80>} imagemask + } + 115 /G73 MSTT31c54f AddChar +/G6f [21.0 0.0 1.0 0.0 19.0 19.0] +/G6f { + 18 19 true [1 0 0 -1 -1.0 19.0] {<007c000187000703800e01801c01c03c01c03801c07803c07003c0f003c0f00380f00780e00700e0 +0f00e00e00601c007038003860000f8000>} imagemask + } + 111 /G6f MSTT31c54f AddChar +/G70 [21.0 0.0 -4.0 -9.0 20.0 19.0] +/G70 { + 24 28 true [1 0 0 -1 4.0 19.0] {<00387c01f9fe007b1e00760f007c0700780700700700f00700e00e00e00e01c00e01c01c01c01c01 +c0380380300380600380c007c38007fe000700000700000e00000e00000e00001c00001c00003e00 +00ff8000>} imagemask + } + 112 /G70 MSTT31c54f AddChar +/G74 [12.0 0.0 1.0 0.0 13.0 25.0] +/G74 { + 12 25 true [1 0 0 -1 -1.0 25.0] {<004000800180018003800f003ff00f000f000e000e001e001c001c001c003c003800380038007800 +700073007200fc007000>} imagemask + } + 116 /G74 MSTT31c54f AddChar +/G6e [21.0 0.0 0.0 0.0 19.0 19.0] +/G6e { + 19 19 true [1 0 0 -1 0.0 19.0] {<0703c03f0fc00719e00e31e00e61c00e41c00c81c01d03c01e03801e03803c07803c070038070038 +0f00700e00700e40700e80e01f00e00e00>} imagemask + } + 110 /G6e MSTT31c54f AddChar +/G61 [21.0 0.0 1.0 0.0 20.0 19.0] +/G61 { + 19 19 true [1 0 0 -1 -1.0 19.0] {<003c2000eee00382e00703c00e01c01c03c01c03c0380380380380700380700700f00700e00f00e0 +1700e03e00f06e40f08e807f0f003c0e00>} imagemask + } + 97 /G61 MSTT31c54f AddChar +/G6c [12.0 0.0 1.0 0.0 12.0 29.0] +/G6c { + 11 29 true [1 0 0 -1 -1.0 29.0] {<00e007e000e001c001c001c003c00380038003800700070007000e000e000e001e001c001c001c00 +3800380038007800710072007400f8007000>} imagemask + } + 108 /G6c MSTT31c54f AddChar +/G7d [17.0 0.0 -3.0 -9.0 14.0 29.0] +/G7d { + 17 38 true [1 0 0 -1 3.0 29.0] {<001800000e00000700000300000380000380000380000780000780000f00000f00001e00001e0000 +1e00001c00001c00000c00000e0000030000008000070000180000300000600000e00000e00001e0 +0001e00001c00001c00001c00001c0000380000300000600000c0000380000c00000>} imagemask + } + 125 /G7d MSTT31c54f AddChar +%%EndResource + +gs 1061 60 1095 899 CB +1870 909 227 (J is optional}) 227 SB +gr +867 2 224 834 B +1 F +n +2 2 1092 834 B +1 F +n +2 2 1095 834 B +1 F +n +1057 2 1098 834 B +1 F +n +2 121 1092 837 B +1 F +n +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font +gs 867 61 225 959 CB +248 962 118 ( do ) 118 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 867 61 225 959 CB +366 963 17 (I) 17 SB +gr +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font +gs 867 61 225 959 CB +383 962 79 ( od) 79 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 1061 61 1095 959 CB +1117 963 885 (looping instruction; it is suggested to put an ) 885 SB +gr +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font +gs 1061 61 1095 959 CB +2002 962 77 (exit) 77 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 1061 60 1095 1017 CB +1117 1020 927 (instruction among the instructions I, see below) 927 SB +gr +867 2 224 959 B +1 F +n +2 2 1092 959 B +1 F +n +1060 2 1095 959 B +1 F +n +2 114 1092 962 B +1 F +n +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font +gs 867 68 225 1077 CB +248 1085 165 ( while ) 165 SB +gr +32 0 0 50 50 0 0 0 51 /Symbol font +gs 209 68 225 1077 CB +413 1080 21 (g) 21 SB +gr +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font +gs 867 68 225 1077 CB +434 1085 79 ( do ) 79 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 867 68 225 1077 CB +513 1086 17 (I) 17 SB +gr +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font +gs 867 68 225 1077 CB +530 1085 66 ( od) 66 SB +gr +32 0 0 50 50 0 0 0 51 /Symbol font +gs 43 68 1095 1077 CB +1117 1080 21 (g) 21 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 1061 68 1095 1077 CB +1138 1086 480 ( is a Boolean expression) 480 SB +gr +gs 1061 60 1095 1142 CB +1117 1145 543 (I a sequence of instructions) 543 SB +gr +gs 1061 60 1095 1199 CB +1117 1202 257 (equivalent to) 257 SB +gr +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font +gs 1061 60 1095 1256 CB +1117 1259 53 (do) 53 SB +gr +gs 1061 68 1095 1313 CB +1117 1321 82 ( if ) 82 SB +gr +32 0 0 50 50 0 0 0 51 /Symbol font +gs 125 68 1095 1313 CB +1199 1316 21 (g) 21 SB +gr +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font +gs 1061 68 1095 1313 CB +1220 1321 121 ( then ) 121 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 1061 68 1095 1313 CB +1341 1322 17 (I) 17 SB +gr +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font +gs 1061 68 1095 1313 CB +1358 1321 222 ( else exit fi) 222 SB +gr +gs 1061 60 1095 1378 CB +1117 1381 53 (od) 53 SB +gr +867 2 224 1077 B +1 F +n +2 2 1092 1077 B +1 F +n +1060 2 1095 1077 B +1 F +n +2 357 1092 1080 B +1 F +n +gs 867 61 225 1438 CB +248 1441 114 ( for ) 114 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 867 61 225 1438 CB +362 1442 54 (i:=) 54 SB +gr +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font +gs 867 61 225 1438 CB +416 1441 13 ( ) 13 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 867 61 225 1438 CB +429 1442 48 (A ) 48 SB +gr +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font +gs 867 61 225 1438 CB +477 1441 55 (to ) 55 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 867 61 225 1438 CB +532 1442 33 (B) 33 SB +gr +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font +gs 867 61 225 1438 CB +565 1441 79 ( do ) 79 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 867 61 225 1438 CB +644 1442 17 (I) 17 SB +gr +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font +gs 867 61 225 1438 CB +661 1441 66 ( od) 66 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 1061 60 1095 1438 CB +1117 1441 855 (i integer variable, A, B integer expressions,) 855 SB +gr +gs 1061 60 1095 1495 CB +1117 1498 543 (I a sequence of instructions) 543 SB +gr +867 2 224 1438 B +1 F +n +2 2 1092 1438 B +1 F +n +1060 2 1095 1438 B +1 F +n +2 113 1092 1441 B +1 F +n +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font +gs 867 61 225 1555 CB +248 1558 140 ( case ) 140 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 867 61 225 1555 CB +388 1559 22 (c) 22 SB +gr +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font +gs 867 61 225 1613 CB +248 1616 205 ( when ) 205 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 867 61 225 1613 CB +453 1617 104 (c1: I;) 104 SB +gr +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font +gs 867 61 225 1671 CB +248 1674 308 ( otherwise ) 308 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 867 61 225 1671 CB +556 1675 19 (J) 19 SB +gr +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font +gs 867 60 225 1729 CB +248 1732 127 ( esac) 127 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 1061 60 1095 1555 CB +1117 1558 309 (case instruction) 309 SB +gr +gs 1061 60 1095 1612 CB +1117 1615 646 (I, J are sequences of instructions) 646 SB +gr +gs 1061 60 1095 1669 CB +1117 1672 680 (c is an expression, c1 is a constant) 680 SB +gr +867 2 224 1555 B +1 F +n +2 2 1092 1555 B +1 F +n +1060 2 1095 1555 B +1 F +n +2 230 1092 1558 B +1 F +n +32 0 0 63 63 0 0 0 58 /Helvetica-BoldOblique /font14 ANSIFont font +gs 868 75 225 1861 CB +248 1864 374 (Expressions) 374 SB +gr +867 2 224 1789 B +1 F +n +2 2 1092 1789 B +1 F +n +2 2 1095 1789 B +1 F +n +1057 2 1098 1789 B +1 F +n +32 0 0 50 50 0 0 0 46 /Helvetica-Oblique /font19 ANSIFont font +gs 867 60 225 1936 CB +248 1939 501 (Arithmetic expressions) 501 SB +gr +867 2 224 1936 B +1 F +n +2 2 1092 1936 B +1 F +n +2 2 1095 1936 B +1 F +n +1057 2 1098 1936 B +1 F +n +2 56 1092 1939 B +1 F +n +gs 867 60 225 1996 CB +248 1999 464 (Boolean expressions) 464 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 1061 61 1095 1996 CB +1117 2000 153 (remark ) 153 SB +gr +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font +gs 1061 61 1095 1996 CB +1270 1999 42 (in) 42 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 1061 61 1095 1996 CB +1312 2000 97 ( and ) 97 SB +gr +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font +gs 1061 61 1095 1996 CB +1409 1999 33 (is) 33 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 1061 61 1095 1996 CB +1442 2000 428 ( object relations, e.g. ) 428 SB +gr +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font +gs 1061 61 1095 1996 CB +1870 1999 30 (if) 30 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 1061 61 1095 1996 CB +1900 2000 37 ( x) 37 SB +gr +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font +gs 1061 61 1095 1996 CB +1937 1999 55 ( in) 55 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 1061 61 1095 1996 CB +1992 2000 124 ( Clas2) 124 SB +gr +867 2 224 1996 B +1 F +n +2 2 1092 1996 B +1 F +n +1060 2 1095 1996 B +1 F +n +2 57 1092 1999 B +1 F +n +32 0 0 50 50 0 0 0 46 /Helvetica-Oblique /font19 ANSIFont font +gs 867 60 225 2057 CB +248 2060 425 (Object expressions) 425 SB +gr +867 2 224 2057 B +1 F +n +2 2 1092 2057 B +1 F +n +1060 2 1095 2057 B +1 F +n +2 56 1092 2060 B +1 F +n +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font +gs 867 61 225 2117 CB +248 2120 125 ( new) 125 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font + +%%BeginResource: font MSTT31c4a3 +/G5f [25.0 0.0 0.0 -11.0 26.0 -9.0] +/G5f { + 26 2 true [1 0 0 -1 0.0 -9.0] {} imagemask + } + 95 /G5f MSTT31c4a3 AddChar +%%EndResource + +gs 867 61 225 2117 CB +373 2121 363 ( T\(actual_params\)) 363 SB +gr +gs 1061 60 1095 2117 CB +1117 2120 966 (create new object of class \(coroutine, process\) T) 966 SB +gr +gs 1061 60 1095 2174 CB +1117 2177 683 (passing the actual_params list to it) 683 SB +gr +867 2 224 2117 B +1 F +n +2 2 1092 2117 B +1 F +n +1060 2 1095 2117 B +1 F +n +2 113 1092 2120 B +1 F +n +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font +gs 867 61 225 2234 CB +248 2237 130 ( this ) 130 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 867 61 225 2234 CB +378 2238 31 (T) 31 SB +gr +gs 1061 60 1095 2234 CB +1117 2237 969 (returns as a value the object of type T containing) 969 SB +gr +gs 1061 60 1095 2291 CB +1117 2294 293 (this expression) 293 SB +gr +867 2 224 2234 B +1 F +n +2 2 1092 2234 B +1 F +n +1060 2 1095 2234 B +1 F +n +2 113 1092 2237 B +1 F +n +gs 867 61 225 2351 CB +248 2355 83 ( E ) 83 SB +gr +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font + +%%BeginResource: font MSTT31c4eb +/G71 [28.0 0.0 2.0 -11.0 26.0 23.0] +/G71 { + 24 34 true [1 0 0 -1 -2.0 23.0] {<00fc0c03ff3c0fc7fc1f83fc1f01fc3f01fc7f01fc7e01fc7e01fcfe01fcfe01fcfe01fcfe01fcfe +01fcfe01fcfe01fcfe01fc7f01fc7f01fc3f03fc3f87fc1ffdfc0ff9fc03e1fc0001fc0001fc0001 +fc0001fc0001fc0001fc0001fc0001fc0003fe0007ff>} imagemask + } + 113 /G71 MSTT31c4eb AddChar +%%EndResource + +gs 867 61 225 2351 CB +331 2354 94 (qua ) 94 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 867 61 225 2351 CB +425 2355 35 (A) 35 SB +gr +gs 1061 60 1095 2351 CB +1117 2354 708 (qualifies the value of E as of type A) 708 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4f8 font + +%%BeginResource: font MSTT31c4f8 +/G52 [31.0 0.0 -2.0 0.0 30.0 34.0] +/G52 { + 32 34 true [1 0 0 -1 2.0 34.0] {<007fffc0001fc0f8000f803c0007803e0007801e000f001f000f001f000f001f000f001f001e001f +001e001e001e003e003e003c003c0078003c01f0003c07e0007fff0000781e0000781e0000f01e00 +00f00f0000f00f0000f00f0001e0078001e0078001e0078003c003c003c003c003c003e007c001e0 +078001e00fc001f01fc000fcfff800ff>} imagemask + } + 82 /G52 MSTT31c4f8 AddChar +%%EndResource + +gs 1061 61 1095 2408 CB +1117 2412 260 (Raises error ) 260 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 1061 61 1095 2408 CB +1377 2412 162 (if not E ) 162 SB +gr +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font +gs 1061 61 1095 2408 CB +1539 2411 42 (in) 42 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 1061 61 1095 2408 CB +1581 2412 48 ( A) 48 SB +gr +867 2 224 2351 B +1 F +n +2 2 1092 2351 B +1 F +n +1060 2 1095 2351 B +1 F +n +2 114 1092 2354 B +1 F +n +32 0 0 50 50 0 0 1 46 /MSTT31c4eb font +gs 867 61 225 2469 CB +248 2472 139 ( copy) 139 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 867 61 225 2469 CB +387 2473 65 (\(E\)) 65 SB +gr +gs 1061 60 1095 2469 CB +1117 2472 984 (returns a copy of value of the object expression E) 984 SB +gr +867 2 224 2469 B +1 F +n +2 2 1092 2469 B +1 F +n +1060 2 1095 2469 B +1 F +n +2 57 1092 2472 B +1 F +n +32 0 0 50 50 0 0 0 46 /Helvetica-Oblique /font19 ANSIFont font +gs 867 60 225 2530 CB +248 2533 501 (Character expressions) 501 SB +gr +867 2 224 2530 B +1 F +n +2 2 1092 2530 B +1 F +n +1060 2 1095 2530 B +1 F +n +2 56 1092 2533 B +1 F +n +gs 867 60 225 2590 CB +248 2593 410 (String expressions) 410 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 1061 60 1095 2590 CB +1117 2593 425 (only constant strings!) 425 SB +gr +867 2 224 2590 B +1 F +n +2 2 1092 2590 B +1 F +n +1060 2 1095 2590 B +1 F +n +2 56 1092 2593 B +1 F +n +32 0 0 58 58 0 0 0 52 /Helvetica-Oblique /font19 ANSIFont font +gs 866 72 225 2715 CB +248 2722 552 (Inheritance & Nesting) 552 SB +gr +32 0 0 63 63 0 0 0 52 /ZapfDingbats font +gs 866 72 225 2715 CB +800 2722 36 ( ) 36 SB +gr + +%%BeginResource: font MSTT31c574 +/MSTT31c574 [63.0 0 0 0 0 0] 47 -90 [-63.0 -63.0 63.0 63.0] [1 63 div 0 0 1 63 div 0 0] /MSTT31c574 GreNewFont +%%EndResource + +32 0 0 63 63 0 0 1 56 /MSTT31c574 font + +%%BeginResource: font MSTT31c574 +/G5b [56.0 0.0 5.0 0.0 51.0 46.0] +/G5b { + 46 46 true [1 0 0 -1 -5.0 46.0] {<00003ff000000001fffe0000000fc01fc000001c0001e00000700000780000e000003c0001800000 +0e000300000007000600000003800c00000001c00c00000000c01800000000e0307e0000007033ff +c000003027ffe00000306ffff00000187ffff80000185ffff8000018dffffc00000cffc3fc00000c +ffc3fc00f00cff81fe01f80cff81fe01f80cff81fe01f80cffc3fe01f80cffc3fe00f00cfffffe00 +001cffffff00001c7fffff0000187fffff8000387fffffc000783fffffe000f03ffffff001f03fff +fffc07f01fffffffffe00fffffffffc00fffffffffc007ffffffff8003ffffffff0001fffffffe00 +00fffffffc00007ffffff800001fffffe000000fffffc0000001fffe000000003ff00000>} imagemask + } + 91 /G5b MSTT31c574 AddChar +%%EndResource + +gs 667 72 225 2715 CB +836 2718 56 ([) 56 SB +gr +32 0 0 63 63 0 0 0 56 /Helvetica-Oblique /font19 ANSIFont font +gs 1061 73 1092 2707 CB +1114 2710 35 (2) 35 SB +gr +32 0 0 50 50 0 0 0 46 /Helvetica-Oblique /font19 ANSIFont font +gs 1061 73 1092 2707 CB +1149 2720 963 ( fundamental methods of unit's composition) 963 SB +gr +866 2 224 2650 B +1 F +n +2 2 1091 2650 B +1 F +n +2 2 1092 2650 B +1 F +n +1057 2 1095 2650 B +1 F +n +32 0 0 50 50 0 0 1 45 /MSTT31c4f8 font + +%%BeginResource: font MSTT31c4f8 +/G4d [42.0 0.0 -4.0 0.0 47.0 34.0] +/G4d { + 51 34 true [1 0 0 -1 4.0 34.0] {<007f8000000fe0000f8000000f0000078000001e000007c000003c000007c000007c000007c00000 +fc00000fc00000f800000fc00001f800000fc0000378000019e00006f8000019e0000cf0000019e0 +000cf0000039e00018f0000031e00031e0000031e00061e0000031e000c1e0000060f000c3c00000 +60f00183c0000060f00303c00000c0f00607c00000c0f00c07800000c0f01c078000018078180f80 +00018078300f0000018078600f0000018078c00f0000030079801e0000030079801e000003007b00 +1e000006003e003e000006003c003c00000e0038007c00001f003800fe0000ffe03007ffc000>} imagemask + } + 77 /G4d MSTT31c4f8 AddChar +/G2d [17.0 0.0 1.0 9.0 16.0 13.0] +/G2d { + 15 4 true [1 0 0 -1 -1.0 13.0] {<7ffe7ffefffcfffc>} imagemask + } + 45 /G2d MSTT31c4f8 AddChar +%%EndResource + +gs 867 60 225 2803 CB +248 2806 460 (Multi-level inheritance) 460 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 867 60 225 2803 CB +708 2806 333 ( permits to make) 333 SB +gr +gs 867 60 225 2860 CB +248 2863 656 (extensions of classes, coroutines,) 656 SB +gr +gs 867 60 225 2917 CB +248 2920 751 (processes defined on different level of) 751 SB +gr +gs 867 60 225 2974 CB +248 2977 580 (the nesting structure of units.) 580 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4f8 font + +%%BeginResource: font MSTT31c4f8 +/G6b [22.0 0.0 0.0 0.0 24.0 35.0] +/G6b { + 24 35 true [1 0 0 -1 0.0 35.0] {<001e0003fc00007c00007c0000780000780000780000f00000f00000f00001f00001e00001e00001 +e3ff03c0fc03c0f003c0c0078180078700078e000f1c000f3c000f7c001ffc001fbc001f1e001e1e +003c1e003c1e083c1f10780f10780f20780fc0f80f80f00700>} imagemask + } + 107 /G6b MSTT31c4f8 AddChar +%%EndResource + +gs 1061 60 1095 2803 CB +1117 2806 452 (Multi-kind inheritance) 452 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 1061 60 1095 2803 CB +1569 2806 437 ( permits to inherit in a) 437 SB +gr +gs 1061 60 1095 2860 CB +1117 2863 916 (block, procedure, function, class, coroutine or) 916 SB +gr +gs 1061 60 1095 2917 CB +1117 2920 163 (process.) 163 SB +gr +866 2 224 2803 B +1 F +n +2 2 1091 2803 B +1 F +n +2 2 1092 2803 B +1 F +n +1057 2 1095 2803 B +1 F +n +2 2 2153 2803 B +1 F +n +2 2 2154 2803 B +1 F +n +2 227 1092 2806 B +1 F +n +32 0 0 50 50 0 0 1 45 /MSTT31c4f8 font +gs 867 60 225 3034 CB +248 3037 410 (Multiple inheritance) 410 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 867 60 225 3034 CB +658 3037 385 ( is doable by means) 385 SB +gr +gs 867 60 225 3091 CB +248 3094 707 (of multi-level inheritance and other) 707 SB +gr +gs 867 60 225 3148 CB +248 3151 436 (ingredients of Loglan.) 436 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4f8 font +gs 1061 60 1095 3034 CB +1117 3037 339 (Generic modules) 339 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 1061 60 1095 3034 CB +1456 3037 612 ( are doable in various ways: by) 612 SB +gr +gs 1061 60 1095 3091 CB +1117 3094 976 (formal types, by multi-level inheritance combined) 976 SB +gr +gs 1061 60 1095 3148 CB +1117 3151 686 (with nesting, to say nothing about ) 686 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4f8 font +gs 1061 60 1095 3148 CB +1803 3151 133 (virtual) 133 SB +gr +32 0 0 50 50 0 0 1 45 /MSTT31c4a3 font +gs 1061 60 1095 3148 CB +1936 3151 32 (s.) 32 SB +gr +867 2 224 3034 B +1 F +n +2 2 1092 3034 B +1 F +n +1060 2 1095 3034 B +1 F +n +867 2 224 3208 B +1 F +n +2 170 1092 3037 B +1 F +n +2 2 1092 3208 B +1 F +n +1060 2 1095 3208 B +1 F +n +32 0 0 42 42 0 0 1 38 /MSTT31c51d font +248 3263 554 (Loglan'82 Quick Reference Card) 554 SB +1098 3263 25 (- ) 25 SB + +%%BeginResource: font MSTT31c51d +/G33 [21.0 0.0 2.0 0.0 17.0 28.0] +/G33 { + 15 28 true [1 0 0 -1 -2.0 28.0] {<07c01ff03ff8707c403c801c001c001c001800300020004001f007f800fc007c003e001e001e000e +000e000e000c000c0018e030f8607f80>} imagemask + } + 51 /G33 MSTT31c51d AddChar +%%EndResource + +1123 3263 21 (3) 21 SB +1144 3263 25 ( -) 25 SB +1782 3263 238 (November, 94) 238 SB +255 255 255 fC +1973 3 242 3259 B +1 F +n +0 0 0 fC +1973 2 242 3256 B +1 F +n +1 #C +statusdict begin /manualfeed false store end +EJ RS +%%PageTrailer +%%PageResources: font Helvetica-BoldOblique +%%+ font Helvetica-Oblique +%%+ font MSTT31c4a3 +%%+ font MSTT31c4eb +%%+ font MSTT31c4f8 +%%+ font MSTT31c51d +%%+ font MSTT31c54f +%%+ font MSTT31c55c +%%+ font MSTT31c574 +%%+ font Symbol +%%+ font ZapfDingbats +%%Page: 4 4 +%%PageResources: (atend) +SS +0 0 12 16 799 1169 300 SM +32 0 0 42 42 0 0 1 38 /MSTT31c51d font +0 0 0 fC +200 3263 554 (Loglan'82 Quick Reference Card) 554 SB +1050 3263 25 (- ) 25 SB +1075 3263 21 (4) 21 SB +1096 3263 25 ( -) 25 SB +1734 3263 238 (November, 94) 238 SB +255 255 255 fC +/fm 256 def +1973 3 194 3259 B +1 F +n +0 0 0 fC +1973 2 194 3256 B +1 F +n +1 #C +statusdict begin /manualfeed false store end +EJ RS +%%PageTrailer +%%PageResources: font MSTT31c51d +%%Trailer +SVDoc restore +end +%%Pages: 4 +% TrueType font name key: +% MSTT310000 = +% MSTT310000 = +% MSTT310000 = +% MSTT310000 = +% MSTT310000 = +% MSTT310000 = +% MSTT310000 = +% MSTT310000 = +% MSTT310000 = +% MSTT310000 = +% MSTT310000 = +% MSTT310000 = +% MSTT31c4a3 = 2027DTimes New RomanF00000032000001900000 +% MSTT31c4b0 = 2027DTimes New RomanF0000003f000001900000 +% MSTT31c4bd = 2027DTimes New RomanF0000004b000002bc0000 +% MSTT31c4ca = 2027DArialF00000032000001900001 +% MSTT31c4d5 = 2027DArialF00000032000001900000 +% MSTT31c4e0 = 2027DArialF0000002e000001900001 +% MSTT31c4eb = 2027DTimes New RomanF00000032000002bc0000 +% MSTT31c4f8 = 2027DTimes New RomanF00000032000001900001 +% MSTT31c505 = 2027DArialF0000003f000002bc0001 +% MSTT31c510 = 2027DTimes New RomanF00000032000002bc0001 +% MSTT31c51d = 2027DTimes New RomanF0000002a000001900000 +% MSTT31c52a = 2027DTimes New RomanF0000002e000001900000 +% MSTT31c537 = 2027DTimes New RomanF0000002e000001900001 +% MSTT31c544 = 2027DArialF00000032000002bc0001 +% MSTT31c54f = 2027DTimes New RomanF0000002a000001900001 +% MSTT31c55c = 2027DTimes New RomanF0000002a000002bc0001 +% MSTT31c569 = 2027DArialF0000003a000001900001 +% MSTT31c574 = 2027DWingdingsF0000003f000001900000 +% MSTT31c580 = 2027DArialF0000003f000001900001 +% MSTT31c58b = 2027DTimes New RomanF0000003f000001900001 +%%DocumentSuppliedResources: procset Win35Dict 3 1 +%%+ font MSTT31c4a3 +%%+ font MSTT31c4bd +%%+ font MSTT31c4eb +%%+ font MSTT31c4f8 +%%+ font MSTT31c510 +%%+ font MSTT31c51d +%%+ font MSTT31c52a +%%+ font MSTT31c537 +%%+ font MSTT31c54f +%%+ font MSTT31c55c +%%+ font MSTT31c574 + +%%DocumentNeededResources: font Helvetica +%%+ font Helvetica-BoldOblique +%%+ font Helvetica-Oblique +%%+ font Palatino-Roman +%%+ font Symbol +%%+ font ZapfDingbats + +%%EOF + \ No newline at end of file diff --git a/doc/quickref.txt b/doc/quickref.txt new file mode 100644 index 0000000..d69f4ce --- /dev/null +++ b/doc/quickref.txt @@ -0,0 +1,311 @@ +LOGLAN'82 +Quick Reference Card +Syntax Form + its meaning (informal) + + program ; + + begin + ; + end +Program is a unit. It is the root of a tree of units. +During an execution of the program this tree is +used as a collection of patterns for instances. An +instance of a unit is either an activation record (of +a procedure) or an object(of a class). + +Declarations + + +there are five forms of a declaration: + + + +var, const, unit, signal, handlers + + var x: T, y,z: U; +declaration of variables x of type T, y,z of type U + + unit A: B(params); + + begin + ; + last_will: + end A; + +evidently you need not to inherit from a module +declaration of a module A which inherits from B. +kind may be one of: procedure, class, coroutine, +process, block, handler, function +params is a list of formal parameters, +REMARKS +- block has no name + its first line is: block or pref C block +- function has a type of result after parameters, +- handler has a different form., see below, +- last_will instruction are executed exceptionally. + + const cc=80 +declaration of a constant + + signal S; + signal Alarm(x: T, y: Q); +declaration of a signal S +it may have a list of formal parameters + + + handlers + when sig1,SIGN3: Inst; return; + when sig2: instructions2; wind; + others in; terminate + end handlers +declaration of a module handling exceptions, +sig1, sig2, SIGN3 are names of exceptions, +Inst, instructions2,in are sequences of instructions + +handlers appear as the last declaration in a unit + + + + +Parametrisation of Units + + +modes of transmission: +input, output, inout values of expressions + +also procedure, function, type can be +transmitted as a parameter +formal procedures(functions) should be specified +i.e. the types of arguments and results should be +given. +a formal type T alone is of limited use, however it +may accompany other parameters using T. + +Processes are distributed it means that +they cannot share objects. You can +transmit only values of simple types and +names of processes or formal procedures +to be used for alien calls. +Processes can reside on different systems of your +network. This explains the reasons for the +restrictions. +The present implementation of processes has +several limitations. Sorry. + +Instructions + + +Atomic instructions + + + x := +assignment instruction + + x := copy () +copying assignment instruction, has sense only for +object expressions + + call Aprocedure(params) +procedure call instruction + + return +leaving procedure or function + + exit or exit exit or exit exit exit +leaving one, two or three nested loops do od + + new Aclass(params) +instruction generating an object + + Objects + + + x := new Aclass(params) +creates an object of class Aclass with params +and stores it under the name of x + + end Aclass or return +terminating initialisation of a newly created object + + kill(x) +deallocation instruction, causes{x=none}and kills x +REMARK. No dangling references! +{x=y&x=z} => kill(x) {x=none&y=none&z=none} + + inner +pseudoinstruction: a slot for the instructions of an +inheriting unit + + Coroutines + + + x := new Cor(params) +creates a coroutine object x of type Cor + + attach(x) +activates coroutine x, and then makes the current +coroutine chain passive + + detach +undoes the last attach + + Processes & Concurrency +truly object oriented processes and an objective com- +munication mechanism just by calling methods of a +distant process + + proces5:=new procesType(...); +creates an object of + unit procesType: process(); ... + + resume(proces5) +activate a passive process process5 + + stop +the current process passivates + + enable hisprocedure +adds the name hisprocedure to the MASK of the +process, enabling other processes to communicate +with the process by means of hisprocedure + + disable aProcedure,aFunction +deletes aProcedure,aFunction from the MASK + + accept aProc1, aProc2, aFnctn +process waits (inactively) for another process +calling a method; +accept makes possible rendez-vous of this process +and another process calling his method + + return disable aProc1 enable aQ +return from a rendez-vous reestablishes the MASK +of the called process; it is posible to modify its +MASK disabling some procedures and enabling +others + + call proces5.hisprocedure(par) + + * + + this is ALIEN CALL +the current process demands process5 process to +execute hisprocedure with the transmitted par +parameters and waits for the eventual outputs; +1 this instruction may meet with an accept +instruction of process5 process - in such case there +is a rendez-vous of two process, +2 otherwise the call tents to interrupt the normal +flow of execution of the called process5 process. + + + Exception handling + + + raise Asignal +Asignal is raised. This lances the research of a +module handling the signal along the chain of DL +links i.e. along dynamic fathers of instances. + + return +* returns to after raise statement + + wind +* 3 forms of terminating an exception handling + + terminate +* destructs (lastwill) several instances of units + + +Composed instructions + + + if * then I else J fi +* is a Boolean expression +I, J are sequences of instructions {else J is optional} + + do I od +looping instruction; it is suggested to put an exit +instruction among the instructions I, see below + + while * do I od +* is a Boolean expression +I a sequence of instructions +equivalent to +do + if * then I else exit fi +od + + for i:= A to B do I od +i integer variable, A, B integer expressions, +I a sequence of instructions + + case c + when c1: I; + otherwise J + esac +case instruction +I, J are sequences of instructions +c is an expression, c1 is a constant + + + +Expressions + + +Arithmetic expressions + + +Boolean expressions +remark in and is object relations, e.g. if x in Clas2 + +Object expressions + + + new T(actual_params) +create new object of class (coroutine, process) T +passing the actual_params list to it + + this T +returns as a value the object of type T containing +this expression + + E qua A +qualifies the value of E as of type A +Raises error if not E in A + + copy(E) +returns a copy of value of the object expression E + +Character expressions + + +String expressions +only constant strings! + + +Inheritance & Nesting * + +2 fundamental methods of unit's composition + +Multi-level inheritance permits to make +extensions of classes, coroutines, +processes defined on different level of +the nesting structure of units. +Multi-kind inheritance permits to inherit in a +block, procedure, function, class, coroutine or +process. + + +Multiple inheritance is doable by means +of multi-level inheritance and other +ingredients of Loglan. +Generic modules are doable in various ways: by +formal types, by multi-level inheritance combined +with nesting, to say nothing about virtuals. + + +Loglan'82 Quick Reference Card - 3 - December, 94 + + diff --git a/doc/readme b/doc/readme new file mode 100644 index 0000000..a4fe943 --- /dev/null +++ b/doc/readme @@ -0,0 +1,10 @@ +The files put here are +either Word2forWindows files .doc +or PostscriptFiles .ps +or ASCII text files .txt and all other extensions + +_________________________________________________________________ + +userman contains the USER'S Manual +loglan contains the micromanual +*rep82* different parts of Report on Loglan'82 language diff --git a/doc/report.hlp b/doc/report.hlp new file mode 100644 index 0000000..b64523c --- /dev/null +++ b/doc/report.hlp @@ -0,0 +1,7110 @@ +1 + + + INSTITUTE OF INFORMATICS, UNIVERSITY OF WARSAW + + + + + REPORT ON THE + + + + + + + + # ###### ###### # ###### # # #### #### + # # # # # # # ## # # # # # + # # # # # # # # # # #### # + # # # # ## # ###### # # # # # # + # # # # # # # # # ## # # # + ###### ###### ###### ###### # # # # #### ###### + + + + + PROGRAMMING LANGUAGE (*) + + + + + + + + + + W.M.BARTOL, P.GBURZYNSKI, P.FINDEISEN, A.KRECZMAR, M.LAO, A.LITWINIUK + + T.MULDNER, W.NYKOWSKI, H.OKTABA, A.SALWICKI, D.SZCZEPANSKA-WASERSZTRUM + + + + + + + + + + + + + + + --------------------------------------------------------- + (*) Supported in part by Zjednoczenie "MERA", POLAND + + + +1 + + + FOREWORD + -------- + + + + We submit to the reader the report of a language whose design is still in + progress. Therefore any remarks and comments are very desirable. They can + be sent to: + + + UNIVERSITY OF WARSAW + INSTITUTE OF INFORMATICS + PKIN 8TH FLOOR + 00-901 WARSAW + POLAND +  + + + + + + The edition has been produced by using the editor program (prepared by + P.Gburzynski, University of Warsaw) on minicomputer MERA 400. This original + Polish minicomputer was used for the first implementation of LOGLAN-82. + + + + Warszawa, June, 1982 +1 - 1 - + + + CONTENTS. + ######### + + List of symbols...................................................3 + + 1. Preface........................................................4 + + 2. The basic characteristics of LOGLAN-82.........................8 + 2.1. Control structure.........................................8 + 2.2. Block structure...........................................11 + 2.3. Procedures and functions..................................13 + 2.4. Classes...................................................14 + 2.5. Prefixing.................................................15 + 2.6. Object deallocator........................................17 + 2.7. Arrays....................................................18 + 2.8. Parameters................................................19 + 2.9. Coroutines................................................20 + 2.10. Processes.................................................21 + 2.11. Other important features..................................22 + + 3. Lexical and textual structure..................................23 + + 4. Types..........................................................26 + 4.1. Primitive types............................................27 + 4.2. System types...............................................28 + 4.3. Compound types and objects.................................29 + 4.3.1. Array type.............................................29 + 4.3.2. Class type.............................................30 + 4.4. Formal types...............................................30 + + 5.Declarations....................................................31 + 5.1. Constant declaration.......................................31 + 5.2. Variable declaration.......................................32 + 5.3. Unit declaration...........................................33 + 5.3.1. Class declaration (introduction).......................33 + 5.3.2. Subprogram declaration (introduction)..................34 + 5.3.3. Block..................................................35 + 5.3.4. Prefixing..............................................36 + 5.3.5. Formal parameters......................................37 + 5.3.6. Unit body..............................................40 + + 6. Static and dynamic locations . Visibility rules................42 + 6.1. Unit attributes............................................42 + 6.2. Protected attributes.......................................43 + 6.2.1. Hidden attributes......................................43 + 6.2.2. Taken attributes.......................................44 + 6.2.3. Legal and illegal identifiers .........................44 + 6.2.4. Close attributes.......................................45 + 6.3. Static location............................................46 + 6.4. Objects....................................................48 + 6.4.1.ements..........................................71 + 9.1. Sequential primitive statements............................71 + 9.1.1. Evaluation statement...................................72 + 9.1.2. Configuration statement................................75 + 9.1.2.1. Allocation statement...............................75 + 9.1.2.2. Deallocation statement.............................83 + 9.1.3. Simple control statement...............................84 + 9.1.4. Coroutine statement....................................86 + 9.2. Compound statements.......................................87 + 9.2.1. Conditional statement..................................87 + 9.2.2. Case statement.........................................89 +1 - 2 - + + + 9.2.3. Iteration statement....................................90 + + 10. Exception handling............................................96 + 10.1. Signal specification.......................................96 + 10.2. Signal handlers............................................97 + 10.3. Signal raising.............................................98 + 10.4. Handler execution.........................................101 + 10.5. System signals............................................103 + + 11. Processes....................................................104 + 11.1. Transition state statement...............................106 + 11.2. Primitive synchronizing statement........................109 + 11.3. Monitors (compound synchronization facilities)...........112 + + 12. Separate compilation of units................................115 + 12.1. Library items............................................117 + 12.1.1. Interface............................................118 + 12.1.2. Using languages......................................121 + 12.1.3. Using externals......................................122 + 12.1.4. Using sl-virtuals....................................122 + 12.2. Linking library items....................................123 + 12.2.1. Connecting the interface.............................123 + 12.3. Binary items.............................................126 + 12.4. Processing libraries.....................................127 + 12.4.1. Recompilation........................................127 + 12.4.2. Insertions and deletions.............................128 + + 13. File processing..............................................129 + 13.1. External and internal files..............................129 + 13.2. File generation and deallocation.........................130 + 13.3. Binary input-output......................................132 + 13.4. Other predefined operations..............................133 + 13.5. Text input-output........................................134 + 13.6. Example of high-level file processing....................136 + + Bibliography.....................................................137 + Index............................................................139 +1 - 3 - + + + List of symbols + *************** + + + + We shall use the following symbols (with indices if necessary): + + A - arithmetic expression, + B - boolean expression, + C - character expression, + D - string expression, + E - arbitrary expression, + F - function/procedure, + G, H - statement (or sequence of statements), + i, j, k, l, u - integer variable or index, + M, N, P, R, S, T - type or unit identifier, + O - object, + Q - constant, + V - valuation, + W - arbitrary identifier, + X - object expression, + Y - arbitrary variable, + Z - simple variable, + Pf - formal parameter, + Pa - actual parameter, + VE - the value of an expression E. +1 - 4 - + + + 1. PREFACE + ########### + + LOGLAN-82 #) is a universal programming language designed at the + Institute of Informatics, University of Warsaw. The shortest, informal + characterization of the language would read as follows. LOGLAN-82 belongs + to the Algol family of programming languages. Its syntax, however, is + patterned upon Pascal's. Many ideas are borrowed from SIMULA-67 [3]. The + language includes also some modern facilities such as concurrency and + exception handling. + + The characteristic programming constructs and facilities of the language + are as follows: + + - a convenient set of structured statements, + - block structure, + - procedures an functions, + - classes, + - prefixing, + - programmed deallocation, + - adjustable arrays, + - formal types and formal procedures, + - coroutines, + - processes, + - encapsulation techniques, + - exception handling, + - separate compilation techniques, + - file processing. + + + LOGLAN-82 history + ----------------- + + In the early seventies the Institute of Mathematical Machines "MERA" + (with two members of the present team of authors) and the Institute of + Informatics of Warsaw University initiated the design of a new high level + programming language. There were two main inspirations for taking up this + research. First the awareness that the SIMULA 67 programming language was a + substantial contribution to the software methodology and second that the + fast development of multiprocessor hardware will change the software + practice. + We began our work with analytical studies, seminars and lectures dealing + with the basic constructs and features of the known programming languages. + This helped us to establish the goals a new programming language should + reach. By then, however, we decided that the design of the programming + language would be a component of a broader software project, called LOGLAN. + + + + + + + + + ------------------------------------------------------------------------- + #) Recently we received information about another LOGLAN - an + esperanto-like language developed in US. +1 - 5 - + + + There is no doubt that the environment in which our investigations have + been carried out has shed a new light on these goals. In particular, the + experience accumulated by a big part of our team in the field of + Algorithmic Logic [15] influenced the form of the solutions accepted. + The first step of our work was finished in 1977 with the report on the + LOGLAN programming language [12]. The report provides a general outline of + a universal programming language. Among its most important features let us + mention a new approach to arrays, assignments, parameter transmission and + parallel computations. This version was not implemented. It constituted the + base for the agreement between the University of Warsaw and the State + Industrial Trust MERA, signed a year later. + A careful analysis of the constructs suggested in the primary project + preceded an actual implementation. With the intention of attaining this, + the interpreter of the language was designed. At that stage a number of + important modifications were introduced to the proposed outline. They + resulted from experiments with the interpreter which proved the usefulness + of some constructs and the uselessness of some others. + At the next stage of research the language was implemented on the + original Polish two-processor minicomputer MERA 400. The design was + restricted in several points because of the implementation constraints. + Some constructs were rejected, the decision concerning some others was put + off until a more elaborate analysis was carried out. + The experience of the team in the field of abstract data types and + computational complexity helped us to solve one of the most fundamental + implementation problems - a proper structure for secure and fast storage + management. In consequence, the language is furnished with a programmed + deallocator which allows the user to design the best strategy of storage + management at run time. + The implementation of unrestricted prefixing needed a completely new + approach. The well-known mechanisms like Dijkstra's display do not allow us + to release the SIMULA restrictions (the most important forbids the use + prefixing at different levels of unit nesting). Such a solution was found + and the LOGLAN-82 users may apply prefixing at an arbitrary level of unit + nesting. + Of the results we have obtained so far let us mention paper [1], which + deals with the principles of an efficient implementation of programming + languages with prefixing at many levels. The paper introduces the + generalized display mechanism and proves the correctness of an + update-display algorithm. A new data structure for efficient and secure + storage management is also provided. + Paper [2] deals with the design and implementation of class Simulation + (improving that provided in SIMULA 67). + The concurency problems are described in the special mathematical model + [19]. The correctness of the monitor implementation is proved in [20]. The + semantics of an assignment statement for subscripted variables is defined + and carefully examined in [21]. Paper [16] describes the semantics of + allocation, deallocation and control statements. + A comprehensive survey about LOGLAN-82 and its applications is supplied + in [8]. Let us mention the close connections between the development of the + language itself and of Algorithmic Logic, see [15, 22, 23, 24, 25, 26]. +1 - 6 - + + + LOGLAN-82 high points + --------------------- + + + - An orderly and intellectually manageable fashion of program design. + + - Clean, modular extensibility (by means of the above mentioned + facilities, in particular by prefixing). An algorithm employing an + abstract data structure can be prefixed by a class realizing that + structure. The class may be programmed by the user himself or by + another user, taken from the system library etc. In this way, + programs may be developed by teams of programmers. + + - An environment for distributed and safe development of large + programs and systems with easy inter-communication between members + of software teams, i.e., different parts of the design are easy to + read, check and modify. The modifications do not entail unexpected + interactions. + + - Possibility of systematic debugging in a way which contributes to + confidence in the overall program correctness. + + - The separate compilation facility. + + - Type checking, especially of references to objects, which + substantially reduces the need for run-time checks and increases the + safety of handling pointers. + + - Efficient storage management by means of well-tailored allocation/ + deallocation operations. + + - Clear visibility rules with the capability of unit encapsulation + techniques. + + - Concurrent computations in which several processes are + simultaneously and independently executed by any number of + processors. The concurrent multiprocessor computations were treated + with due care. We reached the necessary foundations for the + description of atomic operations for the concurrent statements. The + atomic operations may be efficiently implemented in any operating + system kernel. It is well known that concurrent computations have to + be synchronized and scheduled. We do not prejudge which facilities + are to be used for those purposes. In LOGLAN-82 all known + synchronization methods may be declared as predefined classes. For + example, let us mention that it is possible to define: + + - monitoring dialect similar to CONCURRENT PASCAL, + cf.[5], with the main notions: process, monitor, entry + procedure, delay, continue, + - tasking dialect similar to ADA's tasks, cf.[11], with + the main notions: task, accept, select, rendez-vous. + +1 - 7 - + + + First implementation of LOGLAN-82 + --------------------------------- + + + The first implementation of the language was finished in December 1981 on + the two processors Polish minicomputer MERA-400 (uni-bus architecture). The + whole compiler was programmed in FORTRAN IV Standard. The run-time system + and file processing were coded in the Mera Assembly Language GASS. + The implementation team was headed by Antoni Kreczmar (who is the author + of Running System) and included Pawel Gburzynski (File Processing), Marek + Lao (Semantic Analysis), Andrzej Litwiniuk (Code Generation), Wojtek + Nykowski (Parsing) and Danuta Szczepanska-Wasersztrum (Static Semantics). + + + + + Further work on LOGLAN-82 + ------------------------- + + Although we are convinced that LOGLAN-82 will prove to be useful for an + average user, we would like to stress that we were interested mainly in + finding answers to research questions. Our approach is more scientific than + commercial. + Among the studies that are planned for the nearest future, let us mention + further research on LOGLAN-82 itself and on its first compiler. The + portability of the compiler seems to be the main target of our team. + Moreover, LOGLAN-82 will be used in several applications. In this way the + language will be verified and its usefulness will be analyzed. We are + convinced that the new computer architecture and multiprocessor environment + should be taken into account. Therefore, we plan studies which could + support an efficient implementation of the language with richer semantics + are planned. It seems that the crucial point of the future hardware would + be the efficient implementation of the storage management. + + + + + + + Acknowledgments + --------------- + + + We wish to express our gratitude to all institutions and persons who + supported us materially or morally. Thanks are due to the State Industrial + Trust "MERA" and to its deputy director A.Janicki for the arrangements that + enabled us to realize the LOGLAN-82 project. + The LOGLAN-82 team wishes to thank all colleagues in Warsaw for criticism + and helpful remarks. This report has been carefully read by a number of + people, including J.Deminet, F.Kluzniak, A.Janicki, J.Rudzinski, + W.M.Turski. Their critical comments helped us to avoid numerous mistakes. +1 - 8 - + + + 2. The basic characteristics of LOGLAN-82 + ######################################### + + 2.1. Control structure + ********************** + + + Compound statements in LOGLAN-82 are built up from simple statements + (like assignment or call statement) by means of conditional, iteration and + case statements. + + + The syntax of a conditional statement is as follows: + + if boolean expression + then + sequence of statements + else + sequence of statements + fi + + The semantics of a conditional statement is standard. The keyword fi + allows us to nest conditional statements without the appearence of the + "dangling else" ambiguity. The "else" part in a conditional statement may + be omitted: + + if boolean expression + then + sequence of statements + fi + + Another version of a conditonal statement has the form: + + if B1 orif ... orif Bk + then + sequence of statements + else + sequence of statements + fi + + For the execution of a conditional statement with the orif list the + specified conditions B1, ..., Bk are evaluated in succession, until the + first one evaluates to true. Then the rest of the sequence is abandoned and + the "then" part is executed. If none of the conditions evaluates to true, + the "else" part is executed (if any). The orif construction provides a good + method for a short circuit technique, since the boolean expression + controling the conditional statement execution need not be evaluated till + the end. +1 - 9 - + + + Similarly, a conditional statement with the andif list has the form: + + if B1 andif ...andif Bk + then + sequence of statements + else + sequence of statements + fi + + For the execution of this kind of statement the conditions B1, ..., Bk + are evaluated in succession until the first one evaluates to false. Then + the "else" part is executed (if any). Otherwise the "then" part is + executed. + + + The basic form of an iteration statement in LOGLAN-82 is the following: + + do + sequence of statements + od; + + To terminate the iteration statement one can use the simple control + statement exit, which has the following syntactic form: + + exit ..... exit + + repeated an arbitrary number of times. It may occur in a nested loop + statement. The execution of exit.....exit (i - times) statement consists in + the control transfer to the statement immediately following the i-th od + after the exit statement, (where in counting the od's, the pairs do-od are + disregarded). In particular, when exit occurs in a simple loop the control + is transferred to the statement immediately following the od symbol, which + allows us to terminate the loop. Similarly, a double exit terminates two + nested loops, a triple exit terminates three nested loops etc. Moreover, a + LOGLAN-82 iteration statement allows us to place many loop exit points in + arbitrary configurations, e.g., exit may appear in nested conditional + statements, case statements, etc. + + Iteration statements with controlled variables (for statements) have the + forms: + + for j := A1 step A2 to (or downto) A3 + do + sequence of statements + od; +1 - 10 - + + + The type of the controlled variable j must be discrete. The value of this + variable in the case of the for statement with to is increased, and in the + case of the for statement with downto is decreased. The discrete range + begins with the value of A1 and changes with the step equal to the value of + A2. The execution of the for statement with to terminates when the value of + j becomes for the first time greater than A3 (with downto when the value of + j becomes for the first time less than A3). The values of the expressions + A1, A2, A3 are evaluated once, upon entry to the iteration statement. The + default value of A2 is equal to 1 (when the keyword step and A2 are + omitted). + + + An iteration statement with the while condition has the form: + + while boolean expression + do + sequence of statements + od; + + and is equivalent to + + do + if not boolean expression then exit fi; + sequence of statements + od; + + To enhance the users's comfort, the simple statement repeat is provided. + It may appear in an iteration statement and causes the current iteration to + be finished and the next one to be continued (something like jump to + CONTINUE in Fortran's DO statement). In general, this statement has the + form: + + exit ... exit repeat + + and causes the current iteration of the corresponding enclosing iteration + statement to be finished and the next one to be continued. + + A case statement in LOGLAN-82 has the form: + + case A + when Q1 : G1 + when Q2 : G2 + ... + when Qk : Gk + others G + esac + + where A is an arithmetic expression, Q1, ..., Qk are constants and G1, ..., + Gk are sequences of statements. A case statement selects for execution a + sequence Gj where the value of A equals Qj. The choice others covers all + values (possibly none) not given in the previous choices. +1 - 11 - + + + 2.2. Block structure + ******************** + + + + LOGLAN-82 adopts and extends the main semantic features of the ALGOL + family programming languages (ALGOL-60, ALGOL-68, SIMULA-67) i.e., the + block structure. The block concept of ALGOL-60 is a fundamental example of + this mechanism. The syntactic structure of a block is as follows: + + block + list of declarations + begin + sequence of statements + end + + The list of declarations defines some syntactic entities, e.g. constants, + variables, procedures, functions etc., whose scope is that block. The + syntactic entities occurring in the sequence of statements are identified + by means of identifiers which are introduced in the declaration lists. For + every identifier occurrence it must be possible to identify the + corresponding syntactic entity. This kind of correspondence between + occurrences of identifiers and syntactic entities is necessary to define + the semantics of a block statement. The block statement semantics may be + described as follows. + + When a block is entered, a dynamic instance of the block is generated. In + a computer, a block instance takes the form of a memory frame containing + syntactic entities declared in that block. All local syntactic entities of + an instance will be called its attributes . + + The frame of a block instance may be viewed as a box (with displayed + attributes when necessary). + + ------------------------ + ! attribute k ! + ------------------------ + ! ... ! + ------------------------ + ! ... ! + ------------------------ + ! attribute 1 ! + ------------------------ + block instance +1 - 12 - + + + A block is a statement, and so other blocks may occur in its sequence of + statement (i.e., blocks may be nested). Observe, that the occurrences of + identifiers in an inner block need not be local. They can refer to entities + declared in the outer block. For a non-local occurrence of identifier, the + corresponding attribute of a non-local instance should be identified. That + identification is possible thanks to an auxiliary notion of a syntactic + father. + + Consider the following block structure: + + -------------- + ! block[1] ! + ! ! + ! -----------! + ! ! block[2]!! + ! -----------! + -------------- + + + + + When the statements of block[2] are executed, the following two dynamic + block instances are created: + + + -------- -------- + ! O[2] !=============>! O[1] ! + -------- SL -------- + + Here O[1] is an instance of the block[1], and O[2] is an instance of the + block[2]. + + The instance O[1] is called the syntactic father of O[2] (or + alternatively the instance O[2] is syntactically linked by the SL-link with + the instance O[1]). During a program's execution the sequence of syntactic + fathers determined by an active instance forms a chain, called an SL-chain. + The instances forming the SL-chain correspond to the consequtive enclosing + units of the program, starting from the active one and ending on the main + block. Thus, this chain allows us to identify all non-local occurrences of + identifiers. + + A block statement terminates when the control reaches its final end, and + then its instance is automatically deallocated. +1 - 13 - + + + 2.3. Procedures and functions + ***************************** + + + A block is the simplest example of a unit. Blocks are syntactic units + generated by means of a block statement and deallocated automatically when + the end symbol is reached. Procedures and functions constitute the next + step of know-how in high level programming languages. + + The syntactic form of a procedure declaration is as follows: + + unit name: procedure(formal parameters); + list of declarations + begin + sequence of statements + end; + + A procedure is a named syntactic unit which may be invoked only via its + identifier by means of a call statement: + + call name (actual parameters); + + (Procedures differ from blocks also in that they can have parameters, but + this question will be discussed later.) + + When a procedure is called, its instance is created, as in the case of a + block. All local attributes are allocated in the new frame. A syntactic + father of such a newly generated instance is defined as usual, and allows + us to identify all non-local attributes. + + A procedure call is terminated when the control reaches return statement + or the final end. Then the control returns to the instance where the + procedure was called. That instance is referred to by another system + pointer (DL-link). + + After the termination of a procedure call there is no syntactic means to + access its local attributes, hence its instance is automatically + deallocated. + + Functions differ from procedures only in that they return a value and are + invoked in the expressions. +1 - 14 - + + + 2.4. Classes + ************ + + To meet the need for permanent data structures LOGLAN-82 introduces the + notion of class (cf [3]). Class is declared in a similar way to procedure. + It is named and may have parameters: + + unit M :class(formal parameters); + list of declarations + begin + sequence of statements + end; + + The main difference between classes and procedures consists in the way + the instances of these syntactic units are treated. (To distiguish class + instances from those of blocks, functions and procedures they will be + called class objects or simply objects). The class generation yields a + class object which is a permanent data unlike the vanishing procedure + (function, block) instance. The object O of class M is generated by the + object generator statement: + + new M + + This statement invokes the same sequence of actions as a procedure call, + i.e., it opens a new object, transmits parameters and executes the sequence + of statements of M. Return to the caller is made by the execution of a + return statement or when the final end is reached. + The access to such an object is then possible if its address is set to a + variable. The variables whose values point to class objects are called + reference variables. + A reference variable of type M is declared as follows: + + var X:M; + + and may point to any object of class M, for instance, the statement: + + X:=new M + + generates an object O of class M and assigns its address (reference) to X. + The default value of any reference variable is none, which denotes + fictitious non-existing object. + What is left behind is a structure of attributes which can be accessed by + means of dot-notation. These accessible attributes are either formal + parameters or local entities. If X is a reference variable of type M and W + is an attribute of class M, then the remote access to the attribute W has + the form: + + X.W + + The above remote access is correct if X points to an object O of class M. + Otherwise a run time error is raised (for instance when the value of X is + none). +1 - 15 - + + + 2.5. Prefixing + *************** + + Prefixing is another important programming facility borrowed from + SIMULA-67. Its most important feature consists in the possibility of unit + extension. Consider the following example. Let M be a class: + + unit M: class; + list of declarations of M + begin + sequence of statements of M + end ; + + Now let N be a class: + + unit N: M class + list of declarations of N + begin + sequence of statements of N + end ; + + Class N is prefixed by class M. The name of the prefix is located + immediately before the symbol class. Class N is treated as an extension of + M, i.e., the object of class N has a compact frame consisting of the + attributes of N as well as the attributes of M: + + --------------- + ! ! + ! ... ! M-attributes + ! ! + --------------- - - - - - - + ! ! + ! ! + ! ... ! N-attributes + ! ! + --------------- + + object of N + + The structure of such an object is determined by the class M as well as + by N (thus containing both M-attributes and N-attributes). + The statement + + X:=new N , + + where X is a variable of type N, creates an object of class N. +1 - 16 - + + + The sequences of statements of classes M and N are also concatenated. In + the sequence of statements of a class the keyword inner may occur anywhere, + but once only. The sequence of statements of N consists of the sequence of + statements of M with inner replaced by the sequence of statements of N + (inner in N is equivalent to an empty statement). If class N prefixes + another class P, then inner in N is replaced by the sequence of statements + of P, and so on. If inner does not occur explicitly, an implicit occurrence + of inner just before the final end of class is assumed. + + Prefixing allows the programmer to extend units. Assume, for instance, + that STACK is the data structure which defines a push-down memory: + + unit STACK :class; + ... + unit pop: function... + end; + ... + unit push: procedure... + end; + ... + begin + ... + end STACK; + + Any class prefixed by STACK inherits the operations on stack. For + instance, in a class declaration + + unit N: STACK class; + ... + begin + ... + call push; + ... + end ; + + the function pop and the procedure push may be used as any other local + attribute. + + A class may also be used to prefix blocks, procedures and functions. An + instance of a prefixed block is a compound object and is created upon entry + to the block and deallocated after its termination, as in the case of a + simple block. Similarly, an instance of a prefixed procedure (function) is + a compound object which is created when a procedure (function) is called + and deallocated after its termination. +1 - 17 - + + + 2.6. Object deallocator + *********************** + + The classical methods used to deallocate class objects are based on + reference counters or garbage collection. Sometimes both methods may be + combined. The reference counter is a system attribute holding the number of + references pointing to the given object. Hence any change of the value of a + reference variable X is followed by a corresponding increase or decrease of + the value of its reference counter. When the reference counter becomes + equal to 0, the object can be deallocated. + + The deallocation of class objects may also occur during the process of + garbage collection. During this process all unreferenced objects are found + and removed (while memory may be compactified). In order to keep the + garbage collector able to collect all the garbage, the user should clear + all reference variables, i.e., set to none, whenever possible. This system + has many disadvantages. First of all, the programmer is forced to clear all + reference variables, even those which are of auxiliary character. Moreover, + the garbage collector is a very expensive mechanism and thus can be used + only in emergency cases. + + In LOGLAN-82 a dual operation to the object generator, the so-called + object deallocator is provided. Its syntactic form is as follows: + + kill(X) + + where X is a reference expression. If the value of X points to no object + (none) then kill(X) is equivalent to an empty statement. If the value of X + points to an object O, then after the execution of kill(X) the object O is + deallocated. Moreover, all reference variables which pointed to O are set + to none., This deallocator provides full security, i.e., the attempt to + access the deallocated object O is checked and results in a run-time error. + For example, + + Y:=X; kill(X); Y.W:=Z; + + causes the same run-time error as + + X:=none; X.W:=Z; + + The system of storage management is arranged in such a way that the + frames of killed objects may be immediately reused without the necessity of + calling the garbage collector, i.e., the relocation is performed + automatically. +1 - 18 - + + + 2.7. Arrays + *********** + + LOGLAN-82's array is a kind of a class with indices instead of + identifiers selecting the attributes. A variable of an array type is a + reference variable pointing to an object which contains components of a + one-dimensional array. The components of such an array may also point to + one-dimensional arrays and so forth, hence multi-dimensional arrays may be + generated as well. + + The declaration of a variable Y of array type has the following form: + + var Y : array_of ... array_of T + + where the number of array_of defines the dimension of Y. The declaration of + a variable Y fixes its dimension, while the bound pairs are still + undetermined. The array generation statement has the form + + new_array Y dim (l : u) + + where l, u are arithmetic expressions determining the lower and upper + bounds of the first index. The object O of an array is generated and the + reference to O is assigned to Y. + + If Y is declared as a two-dimensional array, then one can generate a + two-dimensional array by means of the statements + + new_array Y dim (l:u); + + for i:=l to u + do + new_array Y(i) dim (li:ui) + od; + + where the shape of each row is determined by the bounds li, ui. Hence + triangular, tridiagonal, streaked arrays, etc. may be generated. Moreover, + the assignment statements allow us to interchange array references that are + of the same dimension and the same type, e.g. Y(i):=Y(j). In consequence, + the user may operate on array slices. The default value of any array + variable is none, as in the case of a reference variable. + +1 - 19 - + + + 2.8. Parameters + **************** + + In LOGLAN-82 there are four categories of parameters: variable + parameters, procedure parameters, function parameters and type parameters. + + Variable parameters + ------------------- + + Variable parameter transmission is simplified in comparison with ALGOL-60 + and SIMULA-67. There are three transmission modes of variable parameters: + input mode, output mode and inout mode. In the syntactic unit which is a + procedure, a function or a class, the formal input parameters are preceded + by the symbol input, the formal output parameters are preceded by the + symbol output and the formal inout parameters are preceded by the symbol + inout. The default transmission mode is input. Input parameters are treated + as local variables initialized by the values of the corresponding actual + ones. Output parameters are treated as local variables initialized in the + standard manner (real with 0.0, integer with 0, reference with none, etc.). + Upon return their values are assigned to the corresponding actual + parameters, which in this case must be the variables. Inout parameters act + as input and output parameters together. + + Procedure and function parameters + --------------------------------- + + In LOGLAN-82 procedures and functions may also be formal parameters. This + category of parameters allows us to parametrize a unit with respect to some + operations. A formal procedure (function) has the full specification part, + i.e., the parameter list (and the function type), for instance : + + unit Bisec: procedure(function f(x: real): real; a, b, eps:real); + begin + ... + end; + + Type parameters + --------------- + + Types are also allowed to be transmitted as parameters. This kind of + parameters enables us to parametrize a unit with respect to some types. For + instance consider the following declaration: + + unit sort:procedure(type T;A:arrayof T; function less(x, y:T):boolean); + begin + ... + end + + The actual parameter corresponding to the formal T must be a + non-primitive type. The array A must be the array of elements of the actual + type. + If function less defines the ordering relation on the elements of the + actual type, then this procedure may be invoked to sort the array A. +1 - 20 - + + + 2.9. Coroutines + *************** + + Coroutine is a generalization of class. A coroutine object is an object + whose sequence of statements can be suspended and reactivated in the + programmed manner. The generation of a coroutine object terminates with the + execution of the return statement (then the control is passed to the caller + as in the case of classes). A coroutine object after the execution of the + return statement is suspended. A suspended coroutine object may be + reactivated with the help of the attach statement: + + attach(X) + + where X is a reference variable designating the activating object. + + In general, from the moment of generation a coroutine object is either + active or suspended. Any reactivation of a suspended coroutine object O + causes the active coroutine object to be suspended and continues the + execution of O from the statement following the last executed one. + + During a coroutine execution some other unit instances may be generated. + They are dynamically dependent on that coroutine object. Thus, an active + coroutine (in particular the main program) can be illustrated by the + following chain: + + -------- -------- -------- + ! O[k] ! ---> !O[k-1]! --->...---> ! O[1] !---> + -------- -------- -------- + coroutine head + + where the arrows denote the DL-links. + + This DL-chain is transformed into the DL-cycle when the control is + transferred to another coroutine as the result of the attach statement. + + -------- -------- -------- + ! O[k] ! ---> !O[k-1]! --->...---> ! O[1] !---> + -------- -------- -------- ! + ! ! + <----------------------------------------------! + + +1 - 21 - + + + 2.10. Processes + *************** + + The concept of process in LOGLAN-82 is a natural extension of coroutine. + Coroutines are units which once generated may operate independently, each + one treated as a separate process. For coroutines, however, an essential + assumption is established; namely, when one coroutine object is activated, + the active one must be suspended. When processes are used, the activation + of a new process does not require the active one to be suspended. Thus + during a program's execution many processes may be active simultaneously. + Their statements are computed in parallel. + There are two operations, stop and resume, which concern the control of + processes. + + stop Operation which causes the active process to be + stopped. + resume(X) Operation which reactivates the process referenced by X. + + Synchronization and scheduling. + + Elementary synchronization in LOGLAN-82 is achieved by two-valued + semaphores and a number of simple indivisible statements operating on them. + These statements are the following (where Z denotes a variable of semaphore + type): + + + ts(Z) Test-and-set boolean function which closes semaphore Z + and returns the value true if Z was open and false if Z + was closed. + lock(Z) Operation which tests the value of the semaphore Z and + either enables the given process to enter the critical + region guarded by Z (if Z is open) or suspends the + process (in the opposite case) until another one opens + that critical region. + unlock(Z) Operation the execution of which opens the critical + region guarded by Z. + stop(Z) Operation that opens the critical region guarded by Z + and stops the execution of the given process. + + The above operations are implemented in the kernel of the operating + system. One can use them to define any complex synchronization facility, + e.g., monitors (cf. 11.3.). Once defined and stored in the library, the + facility can be used by any user. Moreover, using the high level + synchronizing tools, the user can cover the low level, primitive ones + (therefore the properties of high level tools cannot be disturbed). + + There is also a parameterless function wait. If wait is called in the + given process X, then process X waits for the termination of any of its son + (a son of X is a process which was generated in X). The returned value of + wait points to the first terminated son, and then, the computation of + process X is continued. If there is no such son, the returned value of wait + is none. +1 - 22 - + + + 2.11. Other important features + ****************************** + + In LOGLAN-82 the access control mechanism is enlarged so that it supports + the data encapsulation technique and the protection of attributes in + different environments. The mode of accessibility to attributes of a class + can be controlled by means of the specification hidden and close. On the + other hand, the mode of accessibility to attributes of a unit that are + inherited from its prefix can be controlled by means of the specifification + taken. This permits more flexible communication across the unit boundary as + well as defining of abstract behaviour with a hidden auxiliary structure. + (For details see 6). + + The language provides facilities for dealing with run time errors and + other exceptional situations raised by the user. These events are called + exceptions. So, the exceptions cause interruption of a normal program + execution. The response to an exception is defined by an exception handler. + The user is allowed to define the actions that should be raised when an + exception is encountered. + (For details see 10). + + Program units can be compiled separately. Two kinds of separately + compiled units are provided: binary items ready to be executed, and library + items. The purposes of separate compilation are the following: creating + user libraries, handling system and user libraries, compiling program + components during program testing, and program overlaying. + (For details see 12). + + Input-output facilities and file processing are defined by means of some + simple primitives. The user is able, however, to declare in the language + any class that provides high-level and secure file operations. Examples of + system classes that deal with high-level file operations are also given. + (For details see 13). +1 - 23 - + + + 3. Lexical and textual structure + ################################ + + + The basic character set consists of + + (a) 26 upper case letters: + + a b c d e f g h i j k l m n o p q r s t u v w x y z + + (b) 10 digits: + + 0 1 2 3 4 5 6 7 8 9 + + (c) 16 auxiliary characters: + + . : , ; _ = / + - * < > ' " ( ) + + (d) the space character + + This set can be extended with the following characters: + + (e) lower case letters + + (f) other special ASCII characters, e.g.: + + # $ ? % ^ + + (lower case letters are equivalent to the corresponding upper case ones.) + + A finite sequence of characters is called a word. The words called + identifiers have a special meaning. They are composed of letters, digits, + and underscores and start with a letter: + + + + : + + ----------> --------------------------> + ^ ^ ! + ! ! ! + !---> ----> ! ! + ! ! + ! ! + !--- _ -----> ! + ! ! ! + <------------------------------- + + + +1 - 24 - + + + Identifiers serve to identify program entities, i.e., constants, variables, + types, functions, procedures, classes, coroutines and processes. There are + a certain number of predefined system identifiers which have special + significance in the language. The following system identifiers are reserved + words (these identifiers cannot be declared by the programmer). + + + + + + + and_if detach if od taken + and dim in open terminate + array_of div inner or then + attach do input or_if this + downto inout others to + is output type + begin else + block end kill pref unit + esac procedure unlock + exit last_will process + lock put var + call fi virtual + case for main qua + class function mod wait + close raise wind + const get new read when + copy new_array repeat while + coroutine hidden none repeat write + handlers not return writeln + + signal + step + stop + + + +1 - 25 - + + + The lexical entities are identifiers, numbers, strings and delimiters. + The delimiters from the basic character set are: + + , ; = / + - * > < . ( ) : + + and the compound symbols are : + + =/= >= <= := + + Spaces play the role of separators, i.e., at least one space must + separate adjacent identifiers or numbers. The end of each line is + equivalent to a space. + + A comment starts with a left parenthesis and an asterisk and is + terminated by an asterisk and a right parenthesis. It may only appear + following a lexical unit or at the beginning or end of a program entity. + Comments have no effect on the meaning of a program and are used solely for + program documentation. + + By an identifier definition we mean a declaration or description in the + list of formal parameters. + + The notion of a unit is explained by the following diagram: + + + ---------------------- unit ---------------------- + ! ! ! + ! ! ! + ! ! ! + -----subprogram---- generalized class ! + ! ! ! ! ! ! + ! ! ! ! ! ! + function procedure class coroutine process block +1 - 26 - + + + 4. Types + ######## + + + A type T determines a set !T! of values and a family of operations + applicable to the elements of the set. Three kinds of types are + distinguished: primitive types, system types and compound types. Variables + may be declared to be of type T. Depending on the kind of type T we have to + distinguish two cases. + + + a) T is a primitive type. The value assigned to a variable Y of type + T must belong to the set !T!. + + + b) T is a compound or system type. The value assigned to a variable + Y of type T must be a reference pointing to an object in the set + !T! (for the notion of reference cf 4.3. and 6.3.) + + + + SYNTAX. + ------- + + + : + + -----> ------> + ! ^ + !-> ----->! + ! ! + !-> --->! + ! ! + !-> ----->! + ! ! + !-> ------->! + + + + Primitive and system types are pre-defined, compound types are defined by + the user. For file type see section 13. +1 - 27 - + + + 4.1. Primitive types + ******************** + + + SYNTAX. + ------- + + : + + -----> integer --------> + ! ^ + !---> real ---->! + ! ! + !--> boolean -->! + ! ! + !-> character -->! + ! ! + !---> string -->! + ! ! + !-> semaphore -->! + + + + SEMANTICS. + ---------- + + A primitive type determines a finite set of values which can be effectively + represented in a computer memory: + + !integer! - a subset of integers; + !real! - a subset of reals; + !boolean! - the set consisting of logical values T (true) and F (false); + !semaphore! - the set consisting of two values (closed and open); + !character! - a set of characters; + !string! - a subset of strings; + + These sets will be precisely defined in a concrete implementation. The + way in which the primitive type values are represented in a computer memory + is not essential for the description of semantics; however, the values of + integer and real types are differently represented. Namely, integers are + represented in the fixed-point form with a point after the last significant + digit, reals are represented in the floating-point form. So they will be + denoted differently, e.g., 2 and 2.0. Those values can be mutually + converted: the value of type integer is converted to type real by means of + conversion into the floating point form; the conversion into the opposite + direction truncates and transforms the real value into the fixed-point + form. +1 - 28 - + + + 4.2. System types + ################# + + + SYNTAX. + ------- + + : + + --------> coroutine --------> + ! ^ + !----> process --->! + + + + SEMANTICS. + ---------- + + The set !coroutine! is equal to the union of sets !T! for every type T + declared as: + + - unit T : coroutine + - unit T : process + - unit T : S class + where !S! is already a subset of the set !coroutine!. + + The set !process! is equal to the union of sets !T! for every type T + declared as: + + - unit T : process + - unit T : S class + where !S! is already a subset of the set !process!. + + The user may declare a variable of coroutine (process) type, e.g. of the + form + + var X : coroutine; + (var X : process;) + + and then to assign: + X:=new T + + where T belongs to the set !coroutine! (!process!). + + The main block belongs to both sets - !coroutine! and !process!. The + system variable main gives the reference to the main block. The variable + main may occur in the statements attach(main) and resume(main) only. +1 - 29 - + + + 4.3. Compound types and objects + ******************************* + + SYNTAX. + ------- + + : + + --------> ----------> + ! ^ + !----> --->! + + 4.3.1. Array type + ***************** + + + Objects of array type will be called array objects or shortly arrays. An + array can be considered as a vector; the access to its components is + provided by means of indexing. + + + SYNTAX. + ------- + + : + + ------> array_of -----> ----> + + + SEMANTICS + --------- + + LOGLAN-82 types can be uniformly denoted in the following way + + + !! array_of ... array_of T for i>0 + !! i - times + (array_of)T= !! + !! + !! T for i=0 + + where T is a type identifier. + + For i>0, the set !(array_of)T! consists of the array objects. Every + array object has the attributes accessed via indices l, l+1, ..., u where + l, u are the values of the lower and upper bounds, respectively, and l<=u. + The attributes with the indices l, ..., u are of type (array_of)T. + + Let O be an arbitrary fixed array object and let Y be a variable whose + value points to O. The operations related to the object O are: + + - Y(j), where l<=j<=u, gives the j-th attribute of the object O, + - lower(Y) and upper(Y), which give the value l and u, + respectively. +1 - 30 - + + + 4.3.2. Class type + ***************** + + + SYNTAX. + ------- + + : + + -----> -----> + + + : + + ------> ----------> + + + SEMANTICS + --------- + + A class T is a description of a data structure consisting of attributes + i.e., types, functions, procedures, variables, and a sequence of + statements. The family of admissible operations on the objects from the set + !T! contains the operations defined in the sequence of statements and those + defined in the declarations of functions and procedures. The other + operations are related to the notion of remote access. They allow us to + operate on the objects of type !T! from outside of them. + + + + 4.4. Formal types + ***************** + + + SYNTAX. + ------- + + : + + -----> -----> + + + : + + -----> ------------------> + + + SEMANTICS + --------- + + A formal type is a formal parameter of a unit and can be treated as the + name of an abstract data structure without any attribute. The corresponding + actual type must be a system type or a compound type. The set of objects of + the formal type T from a dynamic object O is equal to the set of objects of + the actual type which occurs in the actual parameter list of O. +1 - 31 - + + + 5. Declarations + ############### + + + Every identifier which is to be used in a program must be defined. System + identifiers are pre-defined, other identifiers are pre-compiled, (see 12.) + or they are defined by means of a declaration or description in the formal + parameter list. LOGLAN-82 is not strongly typed in the sense that sometimes + the type of variable and function value cannot be determined at compilation + time. The user may balance the generality and convenience given by the + formal types mechanism and the risk of reduced efficiency of his program + execution. The compiler option, however, allows us to supress the run time + checking with respect to the type compatibility. + + SYNTAX. + ------- + + : + + ------> --------> + ! ^ + !--> -->! + ! ! + !--> ------>! + ! ! + !--> ---->! + ! ! + !--> -->! + + + (For the definition of a signal declaration see 10. + For the definition of linked item specification see 12.) + + + 5.1. Constant declaration + ************************* + + + SYNTAX. + ------- + + : + + --> const ---> ---> = ---> -------------------> + ! ! + <------------------------ , --------------------- + + + SEMANTICS. + ---------- + + The expression defining the constant must be determinable at compilation + time. The type and the value of the constant is given by its declaration. + They are always primitive. + + Example. + -------- + + const pi=3.1415926, pihalf=pi/2; + +1 - 32 - + + + 5.2. Variable declaration + ************************* + + + SYNTAX. + ------- + + : + + ---> var --->---> + + + : + + ----> ---> : ---> ------> + ^ ! + !<------------------ , <--------------------------------! + + + : + + -----> -------> + ^ ! + !<---- , <---------! + + + SEMANTICS. + ---------- + + A variable is of a type given in a variable declaration. A declaration is + elaborated at the instant of generation of a unit object which contains + that declaration. An elaboration determines an initial value for every + variable. This value depends on the type identifier : + + integer - 0 + real - 0.0 + boolean - F + semaphore - open + character and string - defined in concrete implementation + any compound and system type- none + + The value of the variable may be modified by means of an assignment + statement (see 9.1.1.), but the variables of type T may only point to the + object from the set !T!. + + Example. + -------- + + var left, right: node, counter: integer, cycle: array_of boolean; + + +1 - 33 - + + + 5.3. Unit declaration + ********************* + + + SYNTAX. + ------- + + : + + ----> unit -------> ----------------------> + ! ! + !----> --->! + + + 5.3.1. Class declaration (introduction) + *************************************** + + + A class declaration is understood as a declaration of a class itself, as + well as a declaration of a coroutine or a process. The prefixing will be + described in 5.3.4.. + + + SYNTAX. + ------- + + : + + ----------> : ---> -----> class ----->! + ! ^ ! + ------------->!->->! + ! + !<------------------------------------------------------------! + ! ! + !-> ------------------------------->! + ! + !<------------------------------ ; ----------! + ! + !--> -----------------------------> + ! ^ + !-> ->! + + + : + + ----------------> ------> + + Example. + -------- + + unit complex: class(re, im:real); + var module:real; + begin + module:=sqrt(re*re+im*im) + end ; +1 - 34 - + + + 5.3.2. Subprogram declaration (introduction) + ******************************************** + + SYNTAX. + ------- + + + : + + --> virtual --> --> : --> ---> procedure + ! ^ ! ^ ! + !----------! !------------! ! + ! + <-------------------------------------------------------! + ! ! + !--> -------------------------->! + ! + <------------------------- ; ---------------------! + ! + !--> ------------------------------> + ! ^ + !-> ->! + + + + : + + ---- -------> + + + : + + --> virtual --> --> : --> --> function + ! ^ ! ^ ! + !----------! !-----------! ! + ! + !<------------------------------------------------------------! + ! ! + !-> ---------> : ----> -> + ! + !<-------------------- ; ----------------------------! + ! + !-> -------------------------------> + ! ^ + !-> ->! + + + + : + + -----> ----------> + + + + + Class (function, procedure) identifier may optionally follow the end + symbol (and if present must match the unit name). +1 - 35 - + + + Example. + -------- + + unit Euclid: function(n, m:integer):integer; + var k:integer; + begin + do + k:=n mod m; + if k=0 then result:=m; return fi; + n:=m; m:=k; + od; + end Euclid; + + + + 5.3.3. Block + ************ + + + In order to complete the description of LOGLAN-82 units the block syntax + is given here, however the occurrence of a block results in the execution + of its statements - see 9.1.2.. + + + SYNTAX. + ------- + + + : + + --> pref --> ---> ---> block ----> + ! ^ ^ ! + !-------------------->!--------------------------->! ! + ! + !<------------------------------------------! + ! + !--> ------> + + Example. + -------- + + block + var a, b, c, p, S:real; + begin + read(a, b, c); + p:=(a+b+c)/2; + S:=sqrt(p*(p-a)*(p-b)*(p-c)); + write(S) + end +1 - 36 - + + + 5.3.4. Prefixing + **************** + + + A unit which is a specialized form of a certain class (i.e., which has + all the properties of that class and some additional properties defined in + the unit) can be defined by means of prefixing. An identifier of the + prefixed unit may serve as a prefix for another unit, and so tree + structured hierarchies of units can be created. By a prefix sequence of a + unit M we mean a sequence M1, ..., Mk of units such that Mk = M, the unit + M1 has no prefix; for i = 1, ..., k-1, the unit Mi+1 is prefixed by Mi. Any + unit may be prefixed by a class without changing its character (e.g., a + prefixed procedure still remains a procedure). Procedures, functions, and + blocks cannot be used as prefixes. Process and coroutine, as special cases + of class, may also serve as prefixes, but not for procedures, functions or + blocks. + + If a coroutine (a process) occurs in a prefix sequence of a unit then + this unit is treated as a coroutine (a process), and so it has all the + properties of a coroutine (a process). Therefore, if a prefix sequence of a + unit M contains both a coroutine and a process then M has the properties of + a coroutine as well as those of a process. + + No unit is allowed to occur more than once in its prefix sequence. + + Put T pref* S if a unit T belongs to the prefix sequence of the unit S. + Unit S is called a subunit of unit T. As one can see from the definition of + object, any object of S has the attributes of the units S and T. Moreover, + the statements of that object come from the body of the unit T as well as + from that of the unit S. + + From the way of implementation it follows that prefixing is not a + macro-definition and so it does not require any pre-processing. +1 - 37 - + + + 5.3.5. Formal parameters + ************************ + + + SYNTAX. + ------- + + + : + + ---> ( -----> ---------------> ) ----> + ^ ! ^ ! + ! !--> -->! ! + ! ! ! ! + ! !--> --->! ! + ! ! ! ! + ! !--> ---->! ! + ! ! ! ! + ! !--> ->! ! + ! ! ! ! + ! !--> ->! ! + ! ! + !<----------- ; <------------------! + + + : + + ----> input -----> -------> + ! ^ + !----------->! + + + : + + ----> output ----> -------> + + + : + + ----> inout ----> -------> + + + : + + ----> type ------> -----------> + + +1 - 38 - + + + : + + ----> procedure ---> ---->! + ! + !<-----------------------------------------! + ! + !---> ------> + ! ^ + !----------------------------------->! + + : + + ---> function --> ------>! + ! + !<----------------------------------------------! + ! + !--> --> : --> --> + ! ^ + !-------------------------------->! + + + : + + -------> ( --------> -----------------> ) -----> + ^ ! ^ ! + ! !--> ->! ! + ! ! ! ! + ! !--> -->! ! + ! ! ! ! + ! !--> --->! ! + ! ! ! ! + ! !-> -->! ! + ! ! ! ! + ! !--> ->! ! + ! ! + <----------------- ; <-------------------! + + + : + + ----> procedure -----> ------> + + + : + + ----> function -------> -------> +1 - 39 - + + + SEMANTICS. + ---------- + + + By a formal parameter list of a unit M we shall mean a concatenated list + of formal parameters of the bodies of all units M1, ...., Mk = M from the + prefix sequence of unit M (successively from 1 to k). The parameters + occurring in a unit declaration are called formal parameters to stress that + they constitute a pattern for parameters occurring in the unit body. At the + instant of object generation the actual parameters for this generation are + fixed. The relations between formal and actual parameters depend on the + transmission mode which is specified in the formal parameter list. + + Those relations make possible the communication between a unit and its + environment. The first mode of transmission rectricts the communication to + the input (as the beginning of the body) of the actual parameter value for + the corresponding formal parameter. The second mode restricts the + communication to the output (as the end of the body) of the formal + parameter value for the corresponding actual parameter. The third mode + possesses both possibilities of the input and output transmission modes. In + all three cases, the formal parameters are considered to be declared in the + unit body. + + The next two modes of transmission are designed for subprograms and + types. The occurrence of a formal subprogram/type in the unit body is + matched with the corresponding actual subprogram/type (which is assigned at + the beginning of the body execution). In the case of a formal subprogram, a + simplified description of its parameters is required. + + Hence a LOGLAN-82 unit may be parametrized and designates the union of + all units definable by assigning specific actual types to the formal ones. + The actual type cannot be a primitive one. Parametrized units make possible + the design of universal algorithms, which will be defined in detail at + lower levels of program nesting. +1 - 40 - + + + 5.3.6. Unit body + **************** + + + SYNTAX. + ------- + + + : + + ---> ---> ---> -----> + ! ^ ! ^ + !--------------------->! !------------------->! + + + : + + ----> ------> ------> + ! ^ + !---------------------->! + + + : + + ----> taken -----> -----> ; ----> + ! ^ + !-----------------------! + + + : + + ------------> hidden -------------------> --> ; ---> + ! ! ! + !---------> close ------------>! ! + ! ! + !<--------------------------------------------------------------! + + + + : + + ----> ---->! + ! ! + ---> begin --> --> end --> + ! ^ + !---------------------------! +1 - 41 - + + + : + + !------------------------------------>! + ! ! + --------> -------> ; ----------------> + ^ ! + !<------------------------------! + + + : + + ------> -------> + ^ ! + !<----- ; ------------! + + + SEMANTICS. + ---------- + + In a unit body, a sequence of statements (if any) starts from the begin + symbol. Declarations/statements are separated by semicolons. An execution + of the unit body begins at the time of the generation of an object (of that + unit), see 9.1.2.. A declaration of a unit M is restricted at several + points : + + Restrictions + ------------ + + (i) The least (textual) unit containing an occurrence of a + control statement inner (see 9.1.3.) must be a generalized + class. An inner statement may occur in the class body at + the most once. If it does not occur explicitly then the + body of unit M is assumed to contain the inner statement as + the last one (preceding the end symbol). + + (ii) All identifiers defined in the body of unit M are + different. + + (iii) The input/output formal parameters of unit M cannot be of a + type declared in unit M. + + (iv) If a type T is a formal parameter of unit M then its + occurrence in the list of parameters must precede the + occurrences of other parameters whose description makes use + of T; +1 - 42 - + + + 6. Static and dynamic locations of identifiers. Visibility rules. + ################################################################# + + + As noted before, a non-system identifier used in a program must be + defined in the program by a declaration or by a description in a formal + parameter list. An identifier need not correspond, however, to only one + syntactic entity. A program is composed of units, and so the user designing + a unit must pay attention to the relationship between a given unit and the + other ones. He should feel free to define his own attributes with the same + identifiers as those used in the other units as long as he is not + interested in the entities they describe. Therefore some strict rules of + correspondence between the identifier and the attribute as well as its + valuation are necessary. The first correspondence is called the static + location of an identifier, and the second is called the dynamic location. + The static location is determined by the syntactic structure of a program. + The dynamic location depends on the dynamic configuration of objects. + + + 6.1. Unit attributes + ********************* + + + A set of attributes is assigned to each unit M. This set consists of all + syntactic entities defined in M and in the prefix sequence of M. Most of + them form the set of attributes which belong to each object of the unit, + i.e., they are dynamic. Virtual functions and procedures are attributes of + a very special kind. They are presented separately in 6.4.1. Some other + attributes, like constants, are static, i.e., they are not attrributes of + the objects of the unit but of the unit itself. Therefore static attributes + cannot be accessed by means of dot notation (cf 8.2.3.). + The user may protect attributes. The protection mechanisms are introduced + in the following sections and discussed in 8.2.3. + LOGLAN-82 identifiers cannot be overloaded, i.e., an identifier used in + the given unit corresponds to "exactly one" attribute determined by the + context. However, identifiers may be redefined. Therefore strict + correspondence between the occurrences of the identifiers and the + attributes must de defined. + Let W be a syntactic entity and M a syntactic unit. We say that W is + defined in M iff W is a formal parameter of M (but not of the prefix of M) + or W is declared in M. If W is defined in M, the entity it denotes is the + meaning of W. From now on we shall use interchangeably the notions of an + identifier and of an attribute. + Let W be an identifier and M a unit. If W is defined in M or in a unit + from M's prefix sequence, then W corresponds to an attribute of M. More + precisely, the corresponding attribute is the one defined in M, if it + exists, or the one defined in the prefix sequence. That means that the + redefinition of an identifier in a prefixed unit covers the attribute + corresponding to that identifier. +1 - 43 - + + + 6.2. Protected attributes + ************************* + + Let us consider a declaration of a prefixed unit. Let M be such a unit + and N its prefix. The attributes of N are visible in M (unless covered by + the local redefinition). The user, however, can restrict the use of N's + attributes in M. The protection may be specified already in unit N as well + as in M. The first way corresponds to the hidden specification while the + second to the taken specification. + + + 6.2.1. Hidden attributes + ************************ + + + A list of hidden attributes is a filter from the prefixing unit. The user + may specify within prefix N the attributes whose occurrence is illegal in + any unit prefixed by N (unless the identifiers of these attributes are + covered by the redeclarations). Remote access to such attributes is + forbidden as well (cf 6.2). The absence of hidden specification denotes the + empty list. + Consider an example: + + unit N : class; + hidden x, y, z; + var x, y, z:integer; + ... + end N; + + unit M:N class; + hidden x, t; + var x, y, t:integer; + ... + end M; + + Variables x, y declared in N are redeclared in M, and so the identifiers + x, y in M refer to the local entities. Variable t is declared in M and is + hidden in the units prefixed by M. Variable z is hidden in N, hence it + cannot be used in M. +1 - 44 - + + + 6.2.2. Taken attributes + *********************** + + + The list of taken attributes is a filter on the prefixed unit. In unit M + the user may specify explicitly the attributes from prefix N which are used + in M. Then in M the only attributes accessible from N are those from the + taken list. The occurrence of another attribute from N in M's body is + illegal. The absence of taken specification denotes the list of all (legal + and not hidden) identifiers from N. This means that the user is not + interested in the specification of this kind of filtering. + The identifiers in the taken list must be defined in the prefix sequence, + not in unit M. An exception is an identifier of a virtual attribute (cf + 6.4.). + + + 6.2.3. Legal and illegal identifiers + ************************************ + + In this section we consider only identifiers corresponding to the + attributes of a given unit. + + All identifiers defined in a unit are legal in that unit. In particular, + all identifiers declared in a non-prefixed unit are legal. + + Now let M be a unit, N its prefix and W an identifier not defined in M. + Then W is a legal identifier corresponding to an attribute of M iff + + + - W is legal in N + - W does not occur in the hidden list in N + - W occurs in the taken list in M or this list is absent + + + All identifiers specified in every context in a unit must be legal in + that unit. All identifiers specified in the taken list must be legal in the + prefix. + + An identifier is illegal in a unit iff it denotes an attribute of the + unit (according to 6.1) and that attribute is not legal. +1 - 45 - + + + 6.2.4. Close attributes + *********************** + + + Close attributes are not accessible by means of remote access (cf. + 8.2.3.) outside the unit. + + Let M be a unit with the prefix sequence M1, ..., Mk=M. An attribute W of + unit M is called a close attribute if W occurs in the close list of Mj for + some j, 1<=j<=k, and W is not redefined in any unit following that Mj in + the prefix sequence. However, remote access to a close attribute W is + allowed within the text of the unit M specifying it to be close, i.e., if + the static qualification of the object expression is equal to M, remote + access to W is allowed in all the units declared (directly or indirectly) + in M. + + The list of close attributes must consist of legal identifiers. All + hidden attributes are simultaneously close attributes. + + + Example + ------- + + block + var v:A; + unit A: class; + hidden z; + close x; + var x, z:real, y:A; + + unit B:A class; + var t:B; + begin + + ... z ... (* is illegal since hidden in A *) + ... x ... (* is legal *) + .. y.x+y.z .. (* is legal since y is qualified by A + and the expression is within A *) + ... t.x .. (* is illegal since t is qualified by B *) + + end B; + begin + + ... v.x+y.x .... (* is legal *) + + end A; + + begin (* outside A *) + + ... v.z .. (* is illegal since hidden, and so close as well *) + ... v.y.x ... (* is illegal since x is close *) + end +1 - 46 - + + + 6.3. Static location + ********************* + + + We say that the occurrence of an identifier W is in a unit M if M is the + syntactic unit most tightly enclosing that occurrence. On the basis of the + program structure every occurrence of an identifier W in a unit M can be + unequivocally related to a unit N, where the corresponding attribute W is + defined. The unit N is called the static container for that occurrence of W + in M and is denoted by SC(W, M). + More precisely, by a static container of an occurrence of an identifier W + in a unit M we mean a syntactic unit N such that: + + - W is defined in N + + - there exists a unit P satisfying the following conditons: + + + (1) N belongs to the prefix sequence of P (or is P), + (2) M is declared in P directly or indirectly, + (3) there is no other unit closer to M than P satisfying (2) in + which W is an attribute, + (4) N is P's nearest prefix defining W + (5) if W is illegal (hidden or not taken) in P, then the static + container is undefined. + + The following figure illustrates this definition + + the prefix sequence of P + P <-------- R <------------ SC(W,M)=N ... declaration of W ... + ^ + ! + . + . + . + ^ + ! + M ... the occurrence of W ... + + + The static location of an identifier W is defined for the occurrence of W + in a unit M iff there exists a static container SC(W, M). Every program + must be an expression in which the static location is defined for all + occurring identifiers. + The static container is sufficient to determine the static attribute of a + unit (constant). +1 - 47 - + + + Example. + -------- + + Consider the following program + + block + unit M: class; var X ... end M; + unit N: M class; var X ... end N; + begin + pref N block (* P *) + var Y : ...; + unit R: class; + ... X ... Y ... + end R; + begin + new R; + ... + pref N block (* S *) + var Y : ..., + unit T: R class; + ... X ... Y ... + end T; + begin + new T; + ... + end S; + end P; + end + + + Here we have + + SC(X, R)=SC(X, T)=N + and SC(Y, R)=P, SC(Y, T)=S. +1 - 48 - + + + 6.4. Objects + ************* + + + + + An object O of type M with the prefix sequence M1, ..., Mk=M (k=>1) is: + + - a k-tuple of the form O = (, ... ) where Vi + is the valuation of non-static attributes defined in the + unit Mi, + + + - and a unique reference pointing to this k-tuple. + + + Since the references are unique, two objects are different even if their + tuples are identical. + + Now let us define the valuation of an attribute of object O, depending on + the kind of that attribute: + + - the valuation of variables and variable parameters gives + their values, + + - the valuation of an attribute which is a subprogram is the + text of its declaration and an environment. (The environment + is the object containing the declaration of the subprogram. + In the case of a formal subprogram the value is determined + by the actual one (see 9.1.2.). The case of virtuals is + discussed below.) + + - an attribute which is a type has the value of the form: + (array_of) text of declaration. +1 - 49 - + + + 6.4.1. Virtual attributes + ************************* + + + The main feature of virtual atributes is that a redeclaration of an + identifier denoting a virtual subprogram in a prefixed unit does not cover + the declaration in the prefix but replaces it in all occurrences. The + replacement takes place in the so-called virtual chains of identifiers. We + define this notion below. + Let F be a subprogram and M a unit. By a virtual chain of F in M we mean + a sequence of virtuals corresponding to the maximal subsequence N1, ..., Nk + of the prefix sequence of M such that: + + (1) F is a legal identifier in every Ni and denotes an attribute + specified as virtual (unit virtual F: ...) + (2) In all the units Ni except Nk, F must not occur in the + hidden list + (3) In all the units except N1, F must occur in the taken list + unless the list is not specified. F must not occur in the + taken list in N1 if the list is specified. + (4) After removing the declaration of F from N1, F should be an + illegal attribute in N1 (hidden in the prefix, not taken) or + should denote a non-virtual attribute + (5) If Nk is not M, then one of the following conditions must be + satisfied: + - F occurs in the hidden list in Nk, + - F does not occur in the taken list in the unit + prefixed directly by Nk if the list is + specified, + - F is redefined in the unit prefixed directly + by Nk as a non-virtual attribute (then it must + not occur in the taken list either). + The class Nk from the definition is called the end of the virtual chain. + For a given unit and an identifier there may exist more than one virtual + chain. +1 - 50 - + + + Example 1. + ---------- + + + M unit virtual F: + + N unit virtual F: + + P .... F .... + + R unit F: + + S unit virtual F: + hidden F; + + T unit F: + + We have three virtual chains of F with respect to T. One is for F from the + classes M and N: + (F: ), (F: ), + The second is for F from the class S: + (F: ) + And the third one is for F in T: + (F: ) + + + Restrictions + ------------ + + (i) All virtual attributes belonging to the same virtual chain must be of + the same kind (either function or procedure), + + (ii) All the declarations of the virtuals belonging to the same virtual + chain must have formal parameter lists of the same pattern, in particular: + + - the lists may use different names of formal parameters, + but the correspondence between formal types must remain + valid, + + - the class types of corresponding formal variables or + functions must belong to the same prefix sequence, + + - the types of variable parameters or formal functions in + the ending of the virtual chain must not be less strongly + defined than the types of the corresponding parameters in + the beginning, i.e., a formal or system type against a + statically defined type, + + - the types of virtual functions must be identical or the + type of the function from the beginning of the virtual + chain must be a prefix of the type of the function from + the ending, + + (iii) The compatibility of virtuals must be defined statically. +1 - 51 - + + + Example 2. + ---------- + + (1) + The following lists are not compatible + .... (type T; type P; X: T; Y: P) .... + .... (type R; type S; X: S; Y: R) .... + + + (2) + The following lists are compatible iff M and N belong to the same prefix + sequence (and both are classes) + .... (type T; Z: T; Z1: M) .... + .... (type P; X: P; Y: N) .... + + + (3) + The following lists are compatible iff M denotes a system type (coroutine + or process) or is a formal type + + at the beginning: (X: M; Y: real) + at the ending: (X:coroutine; Y:real) + + (4) + The following lists are not compatible: + + ... (Y:integer) + ... (Y:real) + + (5) + The lists of the function from the beginning of the chain + + ... function (Z:integer; Z1:P) : M + + and from the ending + + ... function (Z:integer; Z1:P) :N + + are compatible iff M is a prefix of N. +1 - 52 - + + + 6.4.2. Valuation of virtuals + **************************** + + + Let O be an object of type M with the prefix sequence M1, ..., Mk=M. The + value of virtual attribute F declared in Mi is: + + - the text of the declaration taken from the end of the virtual chain, + - the environment of the object O. + + Example + ------- + An object of the class T given in the example 1 from 6.4.1 is of the + following form: + + --------------------------------------------- + ! ! ! + ! F : body F from N ! M ! + --------------------------------------------- + ! ! ! + ! F : body F from N ! N ! + --------------------------------------------- + ! ! ! + ! ! P ! + --------------------------------------------- + ! ! ! + ! F : body F from R ! R ! + --------------------------------------------- + ! ! ! + ! F : body F from S ! S ! + --------------------------------------------- + ! ! ! + ! F : body F from T ! T ! + --------------------------------------------- + + + The name "virtual subprogram" is derived from the features of virtual + entities, i.e., in any class a virtual subprogram F with an empty statement + list can be declared and then used as a virtual entity within the body of + the class. The user can assume the results of its execution without + knowledge of its internal structure. He can declare in a subclass a virtual + subprogram F again. This declaration replaces the previous one. So, during + the calls of the subprogram F in the body of the class as well as in the + body of the subclass, the subprogram with the text defined in the subclass + will be executed. This replacement is done only if F is a virtual attribute + of the subclass. Otherwise the new declaration of F covers the virtual + attribute of the class. +1 - 53 - + + + + + Abstention from those rules permits us: + + (i) to define the types of the parameters of a virtual subprogram and to + check them already at compilation time, + + (ii) to execute the virtual subprogram declared at the beginning of the + prefix sequence; its body may be empty, but it is always defined, + + (iii) to end the virtual chain and to cover a virtual identifier by a + redeclaration. + + The possibilities (ii) and (iii) can be used in the following case. Let M + and N be system classes of the form : + + unit M: class; + unit virtual error: procedure; + (* virtual procedure to be defined in M's subclasses*) + end error; + begin + ... + if B1 then call error fi; + end M; + + unit N: M class; + unit virtual error: procedure; + (* the definition of the body of error. It + will be executed during the calls within N + as well as in M *) + end error; + begin + ... + if B2 then call error fi; + end N + + If the programmer prefixes his own units by class M, he can declare his + own virtual procedure error. If he does not intend to signalize any errors, + he is able to use M without a redeclaration. Then if the condition B1 is + satisfied, the procedure with an empty body will be called, i.e., no + statement will be executed. On the other hand, if the programmer uses N as + a prefix of his own units, he can redeclare his own non-virtual procedure + error. In consequence, during the execution of statements of the classes M + and N the procedure defined by this system in the class N will be executed. + However during the execution of the user's units the procedures defined by + himself will be executed. +1 - 54 - + + + 6.5. Dynamic location + ********************** + + An executable program must always be a well-formed expression. During its + execution we can deal with many objects of the same syntactic unit even at + the same time. Hence an execution of a statement (in an object) requires + identification and access to all the syntactic entities used. In order to + define the syntactic environment of object O (of unit M) a static link (SL) + is introduced. This link always points to an object O1 of a unit N such + that M is declared in N. + Let us consider the occurrence of identifier W within a body of class N + from the prefix sequence of M. Let SL(M) denote the SL-chain of objects + starting from an object of unit M. This means that SL(M) is a sequence of + objects O1, ..., Ok such that O1 is an object of unit M, Ok is an object of + the main program, the SL-link of object Oi points to object Oi+1, for every + i=1, ..., k-1. + + The dynamic container of the occurrence of W in a body of class N with + respect to an object O1 (denoted by DC(W, N, O1)) is an object Oi from + SL(M) such that: + + (*) Oi is an object of the unit prefixed by the static container SC(W, + N); + (**) Oi is the nearest object in the SL-chain such that Oi satisfies (*). + + Hence the dynamic container is the unique object which contains the + valuation of the entity W related to the occurrence of this entity. Let us + return to the example from 6.3.; after the creation (new T) of an object O + of the class T the SL-chain of O is as follows: + + -------------- ------------ --------------- + ! X ! M ! ! X ! M ! ! ! R ! + <----- !------!-----! <------- !-----!----! <------ !-------!-----! + ! X ! N ! SL ! X ! N ! SL ! ! ! + !------!-----! !-----!----! ! ! T ! + OP ! Y,R ! P ! OS ! Y,T ! S ! O ! ! ! + -------------- ------------ --------------- + + Because SC(X, R)=SC(X, T)=N , we have DC(X, R, O)=DC(X, T, O)=OS. Since + SC(Y, T)=S , we have DC(Y, T, O)=OS. On the other hand SC(Y, R)=P and DC(Y, + R, O)=OP. + The syntactic environment of an object is determined by the SL chain. Its + main property is that for each identifier occurrence in the statements of + the given object exists its dynamic container in the chain. In order to + define the dynamic location of identifier W occurring in object O of unit M + in a body of unit R (which belongs to the prefix sequence of M), the + following steps are performed: + + - a static container N=SC(W, R) is defined; + - a dynamic container O1=DC(W, R, O) is defined (in the SL chain of object + O, the nearest object O1 is found such that this object has a "layer" ); + - a valuation V1(W) is found in the layers of the object O1 such + that N1 is the nearest N's prefix. +1 - 55 - + + + 7. Consistency of types + ####################### + + In order to determine the context-sensitive correctness of an assignment + statement and parameter transmission it is necessary to introduce the + notion of the static consistency of types. Nevertheless this notion is not + sufficient to determine the correctness of the executions of those + constructs. Therefore, the notion of the dynamic consistency of types will + be introduced to define the semantic correctness of program. The introduced + distinction follows from the implementation constraints; namely, static + consistency is verified at compilation time, dynamic consistency is + verified at run time. + + + Static consistency of types + --------------------------- + + The type (array_of)T is statically consistent with the type + (array_of)S, where T and S are not array types, iff one of the following + conditions holds: + - i=j and T=S, + - i=j=0 and T, S are integer or real types, + - both T and S are formal types, + - T is a formal type, S is not a formal type and i<=j, + - S is a formal type, T is not a formal type and j<=i, + - i=j=0 and T, S are generalized class types and T pref* S or + S pref* T, + - i=j=0 and T and S are one of them a system type and the other a + generalized class or system type. + + + Dynamic consistency of types. + ----------------------------- + + The type (array_of)T is dynamically consistent with the type + (array_of)S, where T and S are not array types, iff one of the following + conditions holds: + - i=j and T=S, + - i=j=0 and T, S are integer or real types, + - i=j=0 and T, S are generalized class types and T pref* S, + - i=j=0, T = coroutine, and S is declared as: + unit S: ... coroutine ...; or + unit S: ... process .....; or + unit S: R class..., where T is dynamically consistent with R, + - i=j=0, T = process, and S is declared as: + unit S: ... process .......; or + unit S: R class..., where T is dynamically consistent with R. + + At run time all formal types are replaced by actual non-formal ones. + Therefore, there is no reason to define dynamic consistency for formal + types. + Dynamic consistency is a subrelation of static consistency. Thus the + dynamic consistency is checked at compilation time, if possible. In other + cases the check is made at run-time. + From now on we shall use the following notation: + - for the desription of context properties, an occurrence of an + expression E is considered to be contained in the body of unit M, + - for the desription of semantic properties, an occurrence of an + expression E is considered to be contained in the body of unit M, with + respect to an object O of type M0 such that M pref* M0. +1 - 56 - + + + 8. Expressions + ############## + + + Expressions are composed of primitive expressions - constants and + variables by means of system operators and functions. They serve as + patterns for computing a certain value. Two kinds of expression properties + have to be considered: context (static) and semantic (dynamic) ones. + + + + + Context properties. + ------------------- + + We consider two context properties of each expression: + - to be a well-formed formula, + - to have a static type. + + The context correctness of an expression is examined at compilation time. + From now on, an expression is said to be a well-formed formula (shortly : + WFF) if it is statically correct. The static type of an expression is + determined by the program text. + + + + + Semantic properties. + -------------------- + + We consider three semantic properties of each expression: + - to be defined, + - to have a dynamic type, + - to have the type of its value. + + In some cases (for expressions of formal types) type must be determined + at run-time. Replacing formal types by the corresponding actual ones in the + static types of expressions, we obtain the dynamic types of those + expressions. Notice, that the actual type may not be accessible, if the + dynamic container for the formal type of the expression was killed. The + dynamic type will be defined only for the expressions which may occur on + the left side of an assignment, i.e., for variables. When the value and the + type of the value are computed, the semantic correctness of the expression + is established. + From now on an expression is said to be defined if it is dynamically + correct at run-time. The correctness of an expression will be examined + under the assumption that it is a WFF. Five kinds of expressions are + distinguished: arithmetic, boolean, character, string, and object + expressions. +1 - 57 - + + + 8.1. Constant + ************* + + + SYNTAX. + ------- + + : + + -----> -----> + + CONTEXT. + -------- + + Let E be a constant Q. The expression Q is a WFF if the static container + SC(Q, M) exists. The static type of Q is determined by its declaration (see + 5.1.). A constant cannot occur on the left side of an assignment statement, + as an actual output parameter, or in an expression X.Q, where X is an + object expression. + + SEMANTICS. + ---------- + + The constant Q is always defined. The value of the constant is fixed from + the declaration of that constant and cannot be modified. The type of the + value is equal to the static type. + + + + 8.2. Variable + ************* + + + SYNTAX. + ------- + + + : + + --------> ------------> + ! ^ + !---> ->! + ! ! + !----> ---->! + ! ! + !----> ---->! + + + For each kind of variables its context and semantic correctness will be + defined. Additionally the dynamic address of a variable will be defined as + a pair: (reference to an object, attribute of that object). +1 - 58 - + + + 8.2.1. Simple variable + ********************** + + + SYNTAX. + ------- + + + (simple variable>: + + ----> -----> + + + Let E be a variable Z. + + + CONTEXT. + -------- + + The variable Z is a WFF if the static container SC(Z, M) = R exists. The + static type of Z is determined by the declaration of Z and may be a formal + one. + + SEMANTICS. + ---------- + + The variable Z is defined if the dynamic container O1 = DC(Z, M, O) + exists. Let the static type of Z be: (array_of)S. The dynamic type of Z + is equal to (array_of)S in the case where S is not formal, otherwise it + is (array_of)T, where the actual type corresponding to the formal one + is (array_of)T. + The actual type is taken from the dynamic container DC(S, R, O1), i.e., + from an object belonging to the SL chain of the object O1. The value of Z + is given by the corresponding valuation of Z in the object O1. The address + of Z is a pair: (the reference to O1, attribute Z of O1). +1 - 59 - + + + 8.2.2. Subscripted variable + *************************** + + + SYNTAX. + ------- + + + : + + --> --> ( -> -----> ) --> + ^ ! + !<----------- , --------------! + + + Let E be an expression of the form Z(A1, ..., Ak), where Z is a simple + variable and A1, ..., Ak are arithmetic expressions. + + CONTEXT. + -------- + + Let (array_of)S denote a static type of Z. The expression Z(A1, ..., + Ak) is a WFF if: + - Z and A1, ..., Ak are WFFs, + - static types of A1, ..., Ak are integer or real, + - 1<=k<=i. + The static type of E is (array_of)S. + + SEMANTICS. + ---------- + + The expression E is defined if: + - the expression Z(A1, ..., Ak-1) is defined and its value equals the + reference to a non-empty array object O1 with the bounds l and u, l<=u. + - the value of Ak is defined and its truncation l1 satisfies: l<=l1<=u. + The dynamic type of E is equal to the static one if S is not formal, + otherwise it is (array_of)T where the actual type corresponding to + the formal one is (array_of)T. The actual type is determined as for a + simple variable (see 8.2.1.). The value of E is that of the attribute (l1) + of the object O1. The address of E is the pair: (the reference to O1, + attribute (l1)). +1 - 60 - + + + 8.2.3. Dotted variable + ********************** + + + SYNTAX. + ------- + + + : + + -> -->. --> ----> + + + It is sufficient to consider the expression E of the form X.Y, where Y is + a simple or subscripted variable. + + CONTEXT. + -------- + + The expression E is a WFF if: + + + - X, Y are WFFs, X is the qualified object expression, + - the static type of X is a generalized class type, + - Y is a non-closed attribute of the static type of X. + + + The static type of E is the same as the static type of Y. Notice that the + static type of X cannot be a formal type. + + SEMANTICS. + ---------- + + The expression E is defined if: + + + - the expression X is defined, + - the value of X is a reference to a non-empty object O1. + + + The dynamic type of E is the same as the dynamic type of Y would be if Y + occurred in the object O1. The value of X.Y is that of the attribute Y of + the object O1. The address of X.Y is the address of Y would be if Y + occurred in O1. +1 - 61 - + + + 8.2.4. System variable + ********************** + + + SYNTAX. + ------- + + : + + ------> result ----------------------------------------> + + + CONTEXT and SEMANTICS. + ---------------------- + + For every function F there is an implicitly declared variable result of + type T of the value of function F. The initial value of that variable + depends on type T (is equal to the default value of type T), the final + value (after completion of a function call) is also the value of function F + for the given call (see 9.1.2.). An occurrence of the variable result is + matched with the smallest unit F which contains that occurrence and which + is a function. + + + Example. + -------- + + unit Newton_symbol: function (i, k:integer): integer; + var j: integer; + begin + if i>= k and k>=0 + then result:=1; + for j:=0 to k-1 + do + result:=result*(i-j)div(j+1) + od + fi + end Newton_symbol; +1 - 62 - + + + 8.3. Arithmetic expression + ************************** + + + SYNTAX. + ------- + + : + + !------------------->! + ! ! + -----------> --------> -------> + ^ ! + !<--------------------------------! + + + + : + + -----> + -----> + ! ^ + !-> - -->! + + + + : + + ---------> -----------------> + ^ ! + ! !<-------------------! + ! ! ! ! ! + ! ! ! ! ! + ! * / div mod + ! ! ! ! ! + ! ! ! ! ! + !<-----------------! + + + + : + + ------------------ --------------------------------> + ! ^ ! ^ + !--! !---> ---------------------------->! + ! ! + !--> ------------------------->! + ! ! + !--> ------------------------->! + ! ! + !------> ---------------->! + ! ! + !-> ( ->-> ) ----->! +1 - 63 - + + + : + + -----> ------> + ^ ! + !<------------! + + + : + + !-------->! + ! ! + ---> --> . ---> ----->E --> --> --> + ! ^ ! ^ + !------------------>! !---------------------------->! + + + (function call will be defined in 9.1.2.). + + CONTEXT and SEMANTICS. + ---------------------- + + The type of the value of an arithmetic expression is always equal to its + static type. The dynamic type is not to be defined. The context and + semantic properties of arithmetic expressions will be defined inductively. + + Factors. + The type of an integer is integer, the type of a real is real, their + values are given directly. Constant, variable, and function call must be + WFFs (in the meaning of 8.1., 8.2 and 9.1.2.), and of type integer or real + (in order to create a well-formed factor). The factor is defined iff the + variable and the function call are defined. The context and semantic + properties of the factors of the form " abs A1 ", and " (A2) " are the same + as those of arithmetic expressions A1 and A2, respectively. The value of " + abs A1 " is the absolute value of A1. + + + Terms. + The operators *, /, div, mod are interpreted as multiplication, division, + integer division and remaindering, respectively. The last two operators are + defined for integer arguments only, " A1 div A2 " is equal to the + truncation of A1/A2; " A1 mod A2 " is equal to the remainder of A1/A2. The + type of a term of the form is real if the + operator is /, or at least one of the arguments is of type real. The term " + A1/A2 " is defined if the value of A2 is different from 0. The value is + defined inductively if Av1 and Av2 are the values of factor A1 and term A2 + respectively, and is an interpretation of operator W, then the value of + a term of the form " A1 W A2 " is Av1 Av2. If one of the arguments is + of type integer and the other is of type real then for the operators *, / + the integer type value is converted into a real type one. + + + Arithmetic expression. + An arithmetic expression of the form is of type + integer if both terms are of that type and it is of type real in the + opposite case. A value is defined inductively: if Av1 and Av2 are the + values of term A1 and arithmetic expression A2, respectively, then the + value of an expression A1+(-)A2 is Av1+(-)Av2, the value of +(-)A1 is + +(-)Av1. If one of the arguments is of type integer and the other is of + type real, then the integer type value is converted into a real type one. +1 - 64 - + + + 8.4. Boolean expression + *********************** + + + SYNTAX. + ------- + + : + + -------> ----------------> + ^ ! + !<---- or <---------------! + + + : + + ------> ----------> + ^ ! + !<---- and <------------! + + + : + + ----> not ----> ------------> + ! ^ + !-------->! + + + : + + --------> --------------------> + ! ^ + !----> -------------------->! + ! ! + !----> -------------------->! + ! ! + !----> --------------->! + ! ! + !----> -------------------->! + ! ! + !--> ( --> ->)--->! + + + : + + -----> ---------------> + ! ^ + !-> ----------->! + ! ! + !-> --------->! + ! ! + !-> --------->! + ! ! + !-> ------------>! + + + : + + -----> false --------> + ! ^ + !--> true --->! +1 - 65 - + + + : + + ---> --> + ! + !<-----------------------! + ! + !---> ----> + + + : + + ----> ---------> + ! ^ + !-> -->! + + + : + + ----------> = ----------------> + ! ^ + !------> =/= ------->! + + + : + + --------------------------------->! + ! ! ! ! + < > <= >= + ! ! ! ! + !-------------------------------> + + + : + + ---> --> --> + ! + !<-----------------------------------------! + ! + !---> -----> + + + : + + ---> --> --> + ! + !<----------------------------------------------! + ! + !---> ------> + + + : + + ---> ----> is ------> -------> + ! ^ ! ^ + !--> in -->! !--> ---->! +1 - 66 - + + + CONTEXT and SEMANTICS. + ---------------------- + + The context and semantic properties of boolean expressions can be defined + in the same way as those of arithmetic ones. A boolean expression is of + type boolean. + + Boolean primary. + The value of a boolean constant true and false is T and F, respectively. + The equality and inequality operators have the usual interpretation. Let + A1, A2 be two defined arithmetic expressions and let Av1, Av2 be their + values. Let be an interpretation of the arithmetic relational operator + W. Then the value of arithmetic relation " A1 W A2 " is Av1 Av2. If one + of the expressions is of type integer and the other is of type real then + the integer type value is converted into real type one. + + Let C1, C2 be two defined character expressions and let Cv1, Cv2 be their + values. Then the value of the character relation " C1=C2 " (" C1=/=C2 ") is + true iff the characters Cv1, Cv2 are identical (different). For string type + there are no relations, even no equality. + + A reference relation " X1=X2 " (" X1=/=X2 ") is a WFF if X1 and X2 are + well-formed object expression. The static types of the expressions have to + be statically consistent. The relation is defined if X1 and X2 are defined. + The value of that relation is true iff the values of both expressions are + equal to (different from) the same reference; in particular, if they are + both equal to none, then the value of " X1=X2 " is T. + An object relation "X is S" is a WFF if S is a generalized class + identifier, X is a WFF, and the static type of X is statically consistent + with S. An object relation "X in S" is a WFF if S is a generalized class or + system type identifier, X is a WFF, and the static type of X is statically + consistent with S. The value of the relation "X is S" is T iff the value of + the expression X is the reference to an object of class S. The value of the + relation "X in S" is T iff the value of X belongs to the set !S! . + + Boolean factor. + The value of a boolean factor "not B", where B is a boolean primary, is T + iff the value of B is F. + + Boolean term. + Let Bv2 and Bv1 be the values of boolean factor B2 and boolean term B1, + respectively. Then the value of a term of the form "B1 and B2" is T iff + Bv2=Bv1=T. + + Boolean expression + Let Bv1 and Bv2 be the values of boolean term B1 and boolean expression + B2, respectively. Then the value of an expression of the form "B1 or B2" is + F iff Bv1=Bv2=F. + + The value of the arithmetic and boolean expression is computed from left + to right with the following operator priorities: + (1) parentheses (, ), abs + (2) *, /, div, mod + (3) +, - + (4) <, <=, >, >=, =, =/= + (5) not + (6) and + (7) or. +1 - 67 - + + + 8.5. Character expression + ************************* + + + SYNTAX. + ------- + + : + + ----> ---------------------> + ! ^ + !---> --------------->! + ! ! + !---> --------------->! + ! ! + !---> ---------->! + + + : + + ----> ' -----> -----> ' ------> + + + : + + -------> ----------------------------> + ! ^ + !---> --------------->! + ! ! + !---> ------>! + ! ! + !--> ----->! + ! ! + !-> (: --> --> :) ->! + + + + + CONTEXT and SEMANTICS. + ---------------------- + + Constant, variable and function call are WFFs if they are of type + character. The standard function ord is defined for a character expression + and gives an integer value (dependent on implementation). +1 - 68 - + + + 8.6. String expression + ********************** + + + SYNTAX. + ------- + + + : + + -----> --------> + ! ^ + !---> ------->! + ! ! + !---> ------->! + ! ! + !---> -->! + + + + : + + ---> " -------> ---------------------> " -----> + ! ! + !<-------------------------------------! + + + + SEMANTICS. + ---------- + + Constant, variable and function call are WFFs if they are of string type. + The quotation mark " in the string constant is written twice "". + + Remark + ------ + The string type is a constant type in the sense that the universe is + defined at compilation time and there are no string operations predefined + in the language. However, a standard function may transform a string into + an array of characters. Then the user can treat the array of character as a + text type and can define any set of suitable text operations. + + End of remark + ------------- +1 - 69 - + + + 8.7. Object expression + ********************** + + SYNTAX. + ------- + + : + + --------> ---------------------------------------> + ! ^ + !--> --------> qua -> -->! + ! ^ + !--> -! + + : + + ----------> ---------------------> + ! ^ + !-----> ------------>! + ! ! + !---> --------->! + ! ! + !---> ------>! + ! ! + !----> --------->! + ! ! + !-----> ----->! + + : + + -----> none -------- > + + : + + ----> this ----> ---------> + + + (Function call and object generator will be defined in 9.1.2, process + waiting will be defined in 11.1. Variable is described in 8.2.). +1 - 70 - + + + CONTEXT. + -------- + The constant none is of a fictitious type statically consistent with any + non-primitive type. + To define the context of a local expression let us recall that the + occurrence of the expression E is considered in the unit M. Let E be the + local object "this T", then E is a WFF if there exists a unit N such that M + decl* N and T pref* N, (i.e., there exists a unit N statically enclosing M + and containing T in its prefix sequence). The static type of the expression + E is T. + The qualified object expression of the form "X qua T" is a WFF if X is a + WFF and the static type of X is statically consistent with T. The static + type of this expression is T. + + SEMANTICS. + ---------- + The constant none is always defined as an empty object. Every compound + and system type is dynamically consistent with the fictitious type of none. + The value of the local object "this T" is the nearest object of the type T1 + belonging to the SL chain of the object O such that T1 is prefixed by T, + (recall that O contains the given occurrence of the local object). The + expression "this T" is defined if its value exists. The dynamic type is not + to be defined. The type of the value is S. The qualified object expression + of the form "X qua T" is defined if X is defined, its value is different + from none, and the dynamic type of X as well as the type of its value are + dynamically consistent with T. The value of this expression is equal to the + value of X. The dynamic type is not to be defined. +1 - 71 - + + + 9. Sequential statements. + ########################## + + + Sequential statements are patterns for the sequencing of primitive actions. + + + SYNTAX. + ------- + + + : + + --------> ------------> + ! ^ + !-------> ---->! + + + + In a similar way to that followed in the description of expressions we + shall consider context and semantic properties of statements. A statement + will be called a WFF if it is correct at compilation time, and said to be + defined if it is correct at run time. + + + + + + + 9.1. Sequential primitive statements + ************************************* + + + The result of an execution of a primitive statement consists in the + modification of: + - the valuation (assignment statement); + - the configuration (allocation and deallocation statement); + - the control (control statement). + + By a configuration we mean the set of all objects existing at a given state + of computation. + + + SYNTAX. + ------- + + + : + + --------> -------------> + ! ^ + !----> ---->! + ! ! + !----> --->! + ! ! + !----> -------->! + + +1 - 72 - + + + 9.1.1. Evaluation statement + **************************** + + + SYNTAX. + ------- + + : + + --------> ----------------------> + ! ^ + !----> ------>! + ! ! + !----> --------->! + + + + : + + ---------------------------> + + + SEMANTICS. + ---------- + + An execution of an empty statement has no effect. + + + + + + SYNTAX. + ------- + + + : + + ------> ---> := --> ----> + + + : + + ----------> ------> , ---------------> + ! ! + ! ! + <--------------------------------- + + + CONTEXT. + -------- + + An assignment statement of the form y1, ..., yk:=e is a WFF if: + - variables y1, ..., yk and expression E are WFFs; + - the static types T1, ..., Tk of variables y1, ..., yk are statically + consistent with the static type S of the expression E. +1 - 73 - + + + SEMANTICS. + ---------- + + The execution of a statement consists of three steps : prologue, body and + epilogue. + + In the prologue the computation of the addresses of variables y1, ..., yk + is performed, i.e.: + + - For a dotted variable of the form X.z, the value of the expression X is + computed; + - For a subscripted variable of the form Z(i1, ..., ij) the value of the + expression Z(i1, ..., ij-1) is computed. If Z is of a formal type, then the + dynamic type T of the variable Z is determined. Finally the value of the + expression ij is computed. + + The above actions are performed from left to right. + + + During the body the computation of the type and the value of expression E + is performed. + + + The epilogue checks if the statement is well-defined and assigns the + values to the attributes determined by the addresses evaluated during the + prologue. + + An assignment is defined, if: + - the expressions y1, .., yk, E are defined; + - the dynamic types of y1, .., yk are defined and are dynamically + consistent with the type of the value of E. + + The values are assigned from right to left, i.e., at first the value of E + is assigned to yk (with possible conversion to the type of yk), next the + value of yk is assigned to yk-1 (with appropriate conversion), and so on. + For example, when r is real, n is integer, then: + + after r, n:=2.5 we have n=2, r=2.0, + after n, r:=2.5 we have r=2.5, n=2. + + Remark. + ------- + + The value of the expression Z computed at prologue may point to a non-empty + object O, but it could be changed to none as a result of the deallocation + of the object O (during the execution of the statement). It will be + detected at epilogue and will result in a run-time error. + + End of remark. + -------------- +1 - 74 - + + + An object of a compound type can be simultanously referenced by a number + of variables. If X and Y are the variables of such a type, then after + assignment X:=Y, both variables reference the same object. Hence some + side-effects may occur: the value of an attribute of the object referenced + by variable X can be changed as a result of an access to that object by + means of variable Y. In order to avoid such effects, one can use a copying + statement: + + X:=copy(Y) + + after which both variables reference identical objects but not the very + same one. + + SYNTAX. + ------- + + + : + + -> -> := -> copy -> ( -> -> ) -> + + + CONTEXT and SEMANTICS. + ---------------------- + + The semantics of the copying statement differs from that of the assignment + statement in the following points: + + + - The copying statement is defined if the value of the right side object + expression E is a reference to a terminated class object (i.e., an object + whose all statements were completed, see 9.1.3). Coroutine or process + objects must not be copied. + + + - During the epilogue, the copy of the value of the expression E is + assigned (a copy of none is none). +1 - 75 - + + + 9.1.2. Configuration statement + ******************************* + + + Configuration statements correspond to the generation and deallocation of + units and arrays. Allocation of an array object is a result of array + generation, allocation of a unit object is a result of a subprogram call, + generation of a generalized class object or block statement. + + SYNTAX. + ------- + + + : + + -----> -------> + ! ^ + !--> -->! + + + 9.1.2.1. Allocation statement + ***************************** + + + SYNTAX. + ------- + + + : + + ------> -----------------> + ! ^ + !--> -------->! + ! ! + !--> ----->! + ! ! + !---> ------->! + ! ! + !--> ------>! + + + : + + ---> ---> ----> + ! ^ + !--------------------------->! + + + : + + --> call --> -->! + ! + !<-----------------------! + ! + !---> < actual parameter list> ------------> + ! ^ + !----------------------------------->! +1 - 76 - + + + : + + --> --> . --> new -----! + ! ^ + !--------------------------------------! ! + ! + !--------------------------------------------------! + ! + !--> ---> --------> + ! ^ + !---------------------------! + + + : + + ----> --> . -->! + ! ^ ! + !----------------------------------------! ! + ! + !--------------------------------------------! + ! + !---> ---> + + + : + + ----> --> . -->! + ! ^ ! + !----------------------------------------! ! + ! + !--------------------------------------------! + ! + !---> ---> + + + : + + ---->(----------------> ----------------> ) ----> + ^ ! ^ ! + ! !->-------->! ! + ! ! ! ! + ! !->------->! ! + ! ! ! ! + ! !->------------------->! ! + ! ! + !--------------- , <---------------------------! +1 - 77 - + + + CONTEXT. + -------- + + We shall start with an allocation of a unit object O, i.e., subprogram + call, object generation and block statement. The execution of those + statements causes the generation of the new object O. Let Pa1, ..., Pak + denote actual parameters, k>=0, and let X be an object expression. The + allocation of an object of unit M is of one of the following forms: + + - for function M: M(Pa1, ..., Pak) or X.M(Pa1, ..., Pak) + (a function call must occur in an expression; it is not allowed as an + independent statement); + + - for procedure M: call M(Pa1, ..., Pak) or call X.M(Pa1, ..., Pak); + + - for class M: new M(Pa1, ..., Pak) or X.new M(Pa1, ..., Pak); + (an object generator may occur in an expression and it is also allowed as + an independent statement). + + - for block statement: pref M(Pa1, ..., Pak) block...end or block... end + (a block can be considered as an unnamed unit and a generation of its + object is the result of an occurrence of that block statement). + + + The allocation of a unit object is a WFF if: + + - a unit identifier M is visible (in the sense of the rules + used for the variables, see 8.2.), + - the actual parameters are WFFs, + - the formal parameter list and the actual parameter list + are statically compatible in the sense given below. + + Let us recall (5.3.5.) that a formal parameter list of a unit M is + defined as a concatenation of the lists of units belonging to the prefix + sequence of M. + + Static compatibility of parameters. + + The list of formal parameters (Pf1, ..., Pfj) is statically compatible + with the list of actual parameters (Pa1, ..., Pak) if j=k and for i=1, ..., + k the following conditions hold: + + - if Pfi is an input/output formal parameter then Pai is a + WFF of a static type which is statically compatible with + the static type of parameter Pfi, + - if Pfi is an output/inout parameter then Pai is a + variable, + - if Pfi is a formal function (procedure) then Pai is a + function (procedure) identifier, + - if Pfi is a formal type then Pai is a non-primitive type + identifier. +1 - 78 - + + + SEMANTICS. + ---------- + + The allocation of a unit object O is defined if: + - the unit and its environment are determined, + - the list of formal parameters is dynamically compatible + with that of actual parameters (in the sense provided + below), + - three steps of actions, called prologue, body, and + epilogue, are determined. + + Note the difference between the unit identifier and the unit itself. The + environment is the object which becomes the syntactic father of O. In the + case of a formal subprogram, the unit identifier may be replaced by one of + many existing units. Denote by O1 the object containing the given unit + object allocation statement. The prologue computes the values for input + formal parameters, determines the addresses of output actual parameters, + and determines actual subprograms/types. The prologue is executed in the + environment of the object O1. The body transfers the control to the + statements from the prefix sequence of the given unit. Those statements are + executed in the environment of the object O. + The epilogue transmits the values of output formal parameters (in the + environment of the object O1). + + Unit environment + + Consider the allocation of a unit which is not a block. A unit identifier + has one of the following forms: + + (a) M, + (b) X.M or X.new M . + + Ad (a). Let the static location of the given occurrence of M be + determined by the attribute M of the unit T. Consider three cases: + + (a1) M is an attribute of T and it is neither a virtual attribute nor a + formal parameter. Then the declaration of M is determined as (at + compilation time) as the declaration of the attribute M of unit T. The + environment of the unit M is the dynamic container of identifier M with + respect to the object O1. + + (a2) M is a virtual attribute of T. Then the declaration of M is + determined at run-time by the dynamic location of identifier M with respect + to the given occurrence (see 6.1.5.). The environment is determined as in + (a1). + + (a3) M is a formal subprogram of T. Then the declaration of M and its + environment are taken from the dynamic container of the identifier M. The + dynamic container is determined with respect to the object O1. + + Ad (b). Let X be a well-formed object expression of type R, let M be a + not close attribute of R, and let the expression X be defined. Denote by O2 + the non-empty object of unit R0 (R pref* R0) which is pointed to by X. The + cases (a1)-(a3) have to be considered in the same way as the above ones. + The descriptions differ in that the environments are determined with + respect to the object O2. Note that the environment of the object becomes + the syntactic father of the object O. +1 - 79 - + + + Dynamic compatibility of parameters. + + First let us note the difference between the determination of dynamic type + for the actual parameter Pa and the formal parameter Pf. The dynamic type + of Pa is determined in the environment of the object O1 (containing the + given allocation). It means that for the formal type S the actual type is + taken from the dynamic container with respect to O1. Recall that it + corresponds to the determination of the valuation of identifier S in the + SL-chain of O1 (according to the visibility rules) and taking the text of + declaration assigned to S (cf. 6.1.5.). + The dynamic type of Pf is determined in the corresponding environment. It + means that for the formal type S the actual type is taken from the + corresponding dynamic container. In other words, the valuation of + identifier S is searched for in the SL-chain of the environment (according + to the visibility rules). + + The list of formal parameters is dynamically compatible with the list of + actual parameters if the following conditions hold: + + - if Pfi is an input formal parameter, then Pai is defined and + the dynamic type of Pfi is dynamically consistent with the + type of the value of Pai, + - if Pfi is an output/inout formal parameter, then Pai is + defined and the dynamic type of Pai is statically consistent + (!) with the dynamic type of Pfi, + - if Pfi is a formal function (procedure), then the lists of + formal parameters of Pfi and that of Pai must be of the same + pattern (disregarding the descriptions of subprogram + parameters). They may differ in the parameter identifiers, and + they may differ in the class types of corresponding parameters + (however, the class types must belong to the same prefix + sequence), + - if Pfi is a formal function, then the dynamic type of Pfi + prefixes the dynamic type of Pai, or the two types are + identical. + + The above conditions are checked from left to right (i.e., for i=1, ..., + k). + + Recall that in the following description of prologue and epilogue the + computations of the values and addresses for formal parameters and actual + ones are performed in the syntactic environment of the object O1. +1 - 80 - + + + Prologue. + + The prologue consists of the following steps: + + (i) The frame for a new object O is allocated, the object O1 is called + the dynamic father of the object O. The sequence of dynamic fathers creates + a chain called the DL chain (DL for dynamic links); + + (ii) For the input and inout formal parameter Pf, the value of the + corresponding actual parameter is computed and assigned to Pf; + + (iii) For the output and inout formal parameter Pf, the address of the + corresponding actual parameter Pa is computed (in other words, the prologue + of the assignment of Pf to Pa is performed); + + (iv) For the formal type parameter Pf, the corresponding actual type Pa + is determined. According to 6.1.5. the valuation of the object O assigns + the text of the determined type Pa to the identifier Pf. Therefore as long + as that object exists the access to Pf is well-defined and connected with + Pa; + + (v) For the formal subprogram parameter, the actual subprogram is fixed + (in the same way as the determination of the allocated unit and its + environment). + + + After the execution of the epilogue the control is transferred to the + object O. Let M1, ..., Mk=M be the prefix sequence of M. The execution of + the statements from the object O begins from the first statement of the + unit M1 (for the description of the further progress of computation, see + inner statement, 9.1.3.). Note that those statements are executed in the + syntactic environment of the object O. When the control returns to the + calling object O1, the actions of the epilogue are performed. +1 - 81 - + + + Epilogue. + + The epilogue consists of the following steps: + + (i) For the output and inout formal parameter Pf the actions of the + epilogue for the assignment Pa:=Pf are performed, where Pa is the actual + parameter corresponding to Pf. It means that the value of Pf (computed + during the execution of the body) is assigned to Pa (this address was + computed during the prologue); + + (ii) If the unit is a function, then the result of the given call is + determined by the current value of the corresponding variable result, + + (iii) If the unit is a generalized class, then the result of a new M is a + reference to the object O; + + (iv) A terminated object (cf. 9.1.3.) of a block or a subprogram is + deallocated. However, the terminated object of a generalized class is + accessible as long as there is a reference pointing to it (unless it is + directly deallocated by means of the kill statement). + + + Remark. + ------- + + Note that for the input formal parameter Pf of non-primitive type, the + value of the corresponding actual variable parameter Pa may be updated + (both the formal parameter and the actual one point to the same object). In + order to access the value of Pa without the possibility of its modification + one can use the copying statement Pf:=copy(Pf) at the end of the unit body. + + End of remark. + -------------- +1 - 82 - + + + Array generation. + ----------------- + + + SYNTAX. + ------- + + + : + + ----> new_array -----> -----> ( -->! + ! + !<----------------------------------------------! + ! + !--> --> : --> --> ) --> + + + A declaration of a variable of an array type fixes the type of the array + elements; bound pairs are fixed at the time of generation. + + CONTEXT. + -------- + + A statement new_array Y dim (l:u) is a WFF if: + + - Y is a variable of the type (array_of)T, where i>0, T is a type + identifier; + + - l, u are WFFs and arithmetic expressions. + + The above statement is considered to be an assignment of a reference (to a + newly created object) on the variable Y. + + SEMANTICS. + ---------- + + The following actions are performed: + + - determine the address of variable Y; + - compute the values l1, u1 of expressions l, u; + - put l0, u0 truncations of l1, u1 respectively; + - check the condition l0<=u0; + - generate an array object and assign its address to Y. + + The initial values of attributes (l0), ..., (u0) depend on their type of + the form (array_of)T. + The value of an array type variable may be changed by means of + assignment, copying, and generation statements. The generation of an + n-dimensional array consists of n steps. The first dimension is generated: + e.g. new_array Y dim (l1:u1), + next the second dimension: + e.g. for i:=l1 to u1 do new_array Y(i) dim (li2:ui2) od + and so on. Unregular arrays can be generated in this way. +1 - 83 - + + + 9.1.2.2. Deallocation statement + ******************************* + SYNTAX. + ------- + : + + ----> kill ----> ( ----> ----> ) ---> + + CONTEXT and SEMANTICS. + ---------------------- + + A statement kill(X) is a WFF if X is a well formed object expression of + compound type. The statement kill(none) is always WFF and it is equivalent + to the empty statement. + The statement is defined if X points to an object O not belonging to the + SL chain or DL chain of an active object. By an active object we mean the + object containing the statement currently being executed (notice that in + the case of parallelism there may co-exist several active objects). + The execution of the statement results in the deallocation of object O, + all variables pointing to O are set to none. The deallocation of an object + which belongs to the SL chain or DL chain of an active object results in a + run-time error. + The statement kill(X) where X points to a coroutine head is described in + 9.1.4. The statement kill(X) where X points to a process is described in + 11.1. + + Remark. + ------- + + After a block or subprogram termination, the corresponding object is + automatically deallocated. On the other hand, the array, class, coroutine, + or process objects are not automatically deallocated. The computer memory + may be overloaded with such objects even if they are no longer referenced. + Those objects are recovered with the help of the system program called the + garbage collector. The user can help in the execution of that system + program and increase the efficiency of his program execution if he + deallocates unnecessary objects. One should realize, however, what are the + effects of deallocation (in particular, a side effect consisting in the + modification of the values of all variables which point to the same + deallocated object). + + End of remark. + -------------- + + Example. + -------- + + The deallocation of a binary tree can be performed by means of the + following recursive procedure: + + unit tree_kill: procedure (n:node); + begin + if n.l=/=none then call tree_kill(n.l) fi; + if n.r=/=none then call tree_kill(n.r) fi ; + kill(n) + end tree_kill + + where the class node has the form + + unit node: class; + var l, r: node ; +1 - 84 - + + + end node; +1 - 85 - + + + 9.1.3. Simple control statement + ******************************** + + + There are two kinds of simple control statements: a textual control + statement and a dynamic control statement. In this section we shall + consider the occurrence of a control statement in the object O of the unit + M, in the body of the unit Mj, where M has the prefix sequence M1, ..., + Mk=M, and 1<=j<=k. + + SYNTAX. + ------- + + : + + -----> --------> + ! ^ + !--> --->! + + : + + -------> inner -----> + ! ! + ! ! + !-----> exit ----->! + ! ! ! ! + ! !<------! ! + ! ! ! + !---> repeat ----->! + + + SEMANTICS. + ---------- + + For j=1, ..., k-1 the execution of the inner statement results in the + commencement of the execution of the unit Mj+1. The inner statement in the + body of the unit Mk=M is empty. + + ------- ------- ------- ------- + ! ! ! ! ! ! ! ! + inner < inner < ........ < inner < ..... + ! ! ! ! ! ! ! ! + ------- ------- ------- ------- + + body of M1 body of M2 body of Mk-1 body of Mk + + The semantics of repeat and exit statements will be defined jointly with + the semantics of a loop statement, see 9.2.3.. +1 - 86 - + + + SYNTAX. + ------- + + + : + + ---------> return -----------> + + SEMANTICS. + ---------- + + In this section we shall describe the semantics of a return statement and + a pseudo-statement end (which bound a unit declaration). + An object may be in one of the following three states: non-generated, + generated, terminated. An object is non-generated until the control reaches + the first return statement. From that moment an object becomes generated. + An object is terminated after the execution of its end statement. The main + program is considered to be always generated. A generated object is + considered to have no dynamic father (its DL is none). Note that the + execution of a terminated object cannot be resumed. However, the execution + of the generated object of a coroutine or a process can be resumed and + suspended. The return statement is empty if M is a coroutine and O is + generated. If M is a block, subprogram, or generalized class and O is + non-generated then O becomes generated. The control returns to the dynamic + father of O. For a coroutine or process the statement following the return + statement is a reactivation point. + + Now we shall consider the execution of the final end. For j=2, ..., k the + execution of the final end results in the control transfer to the statement + following the inner statement from the unit Mj-1. Suppose that j=1. If O is + a non-generated object of a coroutine, then O becomes generated and the + control returns to the dynamic father of O. Otherwise (O is a + coroutine/process object) the object O becomes terminated. The control + transfer is the same as in the case of detach statement. Moreover, if M is + a process, then the control becomes idle (and the corresponding processor + may be released, see 11). +1 - 87 - + + + 9.1.4. Coroutine statement + *************************** + + SYNTAX. + ------- + + : + + ------> detach ----------------------------------------------> + ! ^ + !-----> attach ----> ( ---> --> ) -->! + + CONTEXT and SEMANTICS. + ---------------------- + + By a chain of coroutine N with the head Ol we shall mean the DL chain of + objects O1, ..., Ol such that: + - for i=1, ..., l-1 the object Oi+1 is the dynamic father of Oi; + - Ol is the generated object of the coroutine N; + - Ol is non-terminated. + Thus the chain contains non-generated objects with the exception of the + head, which is generated but non-terminated. + The execution of a kill(X) statement where X points to the head Ol of the + coroutine chain results in a deallocation of the entire chain. + + The chain may be in one of the following two states: + - detached - the execution of the statements contained in this + chain is suspended, the object O1 contains a distinguished + point, called the reactivation point of the chain; + - attached - a statement from the object O1 is currently + executed. + + In the case of a sequential program exactly one chain is operational, + i.e., in the attached state. Note that a coroutine head may be the main + program. Coroutine control statements change the states of coroutine + chains. A reference to the coroutine chain W1 which has recently + transferred the control to the chain W is associated with chain W. Let us + denote this reference by CL (coroutine link). This link is then used by the + detach statement. Suppose that the object O (containing the occurrence of + the coroutine control statement) belongs to the chain W of the coroutine N + with the head Ol. + The statement attach(X) is a WFF if X is a well formed object expression + or the system variable main. The statement is defined if X points to the + head O1 of a coroutine chain W1. The execution of the statement results in + changing the state of W to a detached one and that of W1 to an attached + one. The statement determined by the reactivation point of the chain W1 + starts its execution. The CL link to the chain W is associated with the + chain W1. If O=O1 then the statement is empty. + The statement detach is defined except the case where the CL link of + chain W is none. The execution of the statement results in detaching the + chain W and attaching the chain W1 determined by the corresponding CL link + associated with W. The statement following the detach statement is the + reactivation point of the chain W. The execution of the chain W1 is resumed + at its reactivation point. +1 - 88 - + + + 9.2. Compound statements + ************************* + + Compound statements define case analysis (conditional and case statement) + and iteration (loop statements). + + + SYNTAX. + ------- + + --------> + ! ^ + !-----> ------->! + ! ! + !-----> ------->! + + + + + 9.2.1. Conditional statement + ***************************** + + + SYNTAX. + ------- + + + : + + ---> if --> --> then --> + ! ! ! + !---> ------->! ! + ! ! ! + !---> ------>! ! + ! + ! + ! + <-----------------------------------------------! + ! ! + !------> else --> --------> fi ----------> + + + + +1 - 89 - + + + : + + ---- -----------------> + ! ! + !<------- or_if <----------! + + + : + + ---- -----------------> + ! ! + !<------ and_if <----------! + + + CONTEXT and SEMANTICS. + ---------------------- + + + For the execution of an if statement of the form: + + if B1 or_if B2 ... or_if Bj + then + G + else + H + fi + + + the boolean expressions B1, .., Bj are evaluated in succession until the + first one evaluates to true, then the sequence G of statements is executed. + If none of the boolean expressions evaluates to true, then the sequence H + is executed. The conditional statement with the "else" part omitted is + equivalent to the conditional statement with the empty statement following + the else symbol. If the "andif" list occurs instead of the "orif" list, + then the expressions B1, ..., Bj are evaluated in succession until the + first one evaluates to false; then the sequence H is executed. Otherwise + the sequence G is executed. When a boolean expression occurs instead of an + "orif" or "andif" list, then its value controls the execution of the + conditional statement in the standard manner. +1 - 90 - + + + 9.2.2. Case statement + ********************** + + SYNTAX. + ------- + + : + + ----> case --! + ! + !-----------! + ! !-------------------->! + ! ! ! + ! <---- <--- : -----! ! + ! ! ! ! + !-> ---> when ---> ----------->! ! + ! ^ ! ^ ! ! + ! ! -> ->! ! ! + ! ! ! ! + ! <----- , -------------! ! + ! ! + !-> ---> when --->->:-! ! + ^ ^ ! ^ ! ! ! + ! ! !-> ->! ! ! ! + ! ! ! ! ! + ! !<--------- , --------! ! ! + ! ! ! + !<------ <----------! ! + ! ! + ! ! + <------------------------------------------------------------! + ! ! + ! ! + !-> others ----> ---------> esac ----> + + + + CONTEXT and SEMANTICS. + ---------------------- + + A statement: + + case E + when l1:G1 + ... + when lk:Gk + others H + esac + + is a WFF if E is an arithmetic or character expression and l1, ..., lk are + sequences of different constants. If the list H is empty, then the "others" + part can be omitted. + The case statement selects for execution a sequence Gi where the value of + E belongs to the sequence li. The choice others covers all values (possibly + none) not given in the previous choices. The choices in a case statement + must be mutually disjoint and if the "others" part is not present they must + exhaust all the possibile values of the expression E. + + + +1 - 91 - + + + 9.2.3. Iteration statement + *************************** + + + SYNTAX. + ------- + + + : + + + -------> ----------------------------------------> + ! ^ + !---> --------------------->! + ! ! + !---> -------------->! + + + : + + + ---> do -----> ----> od ---> + + + : + + + --> while --> --> do --> --> od --> + + + : + + ---> for ---> -->:= --> -->! + ! + <------------------------------------------------------------------! + ! ! + !--> step --> ----> to ----->! + ! ! + !-->downto-->! + ! + <---------------------------------------------------! + ! + !-> -->do--> --->od --> +1 - 92 - + + + CONTEXT and SEMANTICS. + ---------------------- + + Let us start from the semantics of loop and exit statements. The loop + statement: + + do + G + od + + causes the iteration of the sequence G until an exit statement is + encoutered. + Consider the occurrence of the exit statement exit ... exit(k-times) + where k >=1 . Let us denote this statement by H. Suppose that statement H + occurs in l (l>=0) nested iteration statements G1, ..., Gl, i.e., the + statement G2 is nested in G1, G3 in G2, etc. Let M be the smallest unit + enclosing that occurrence of H. + If k>l then the execution of H causes the termination of the unit body M + (jump to the final end). Otherwise the iteration statement Gk terminates, + and either the execution of the iteration statement Gk-1 is continued if + k=i + do + G; + i:=i+Av2 + od + + The statement (**) is equivalent to the above sequence of statements with + the condition Av3>=i replaced by Av3<=i and the assignment i:=i+Av2 + replaced by i:=i-Av2. The variables Av1, Av2, Av3 are fictitious variables + introduced only in order to define the semantics. The expression step A2 + may be omitted if the value of A2 equals 1. The value of the controlled + variable i should not be modified inside the loop (however, the result of + such a modification would be well-defined). Moreover, its value is + determined when loop is terminated according to the introduced semantics. +1 - 94 - + + + Examples. + --------- + + + (1) A palindrome is a word which is identical when written from left to + right and conversely. The given algorithm looks for the first occurrence of + a palindrome in a text and writes its length, (if found). + + unit palindrome: procedure; + var i, j, k: integer, + text: array_of character; + begin + read(j); + new_array text dim (1:j); + for k:=1 to j + do + read (text(k)) + od; + for i:=2 to j + do + k:=1; + while text(k)=text(i-k+1) + do + k:=k+1; + if k>i-k+1 + then + write ("found at i-th item"); + return + fi + od + od; + write ("not found") + end palindrome; +1 - 95 - + + + (2) A dictionary is a data structure S with the following operations: + + member(x, S) - determines whether x is a member of S + insert(x, S) - replaces S by the union of S and (x) + delete(x, S) - replaces S by the difference of S and (x) + + The elements of the set S are assumed to be of the same type T and to be + ordered by the relation less. A dictionary will be implemented by means of + binary search trees. The user has the access to the operations member, + insert, and delete and does not have to bother about the way of their + implementation. Below we propose how to accomplish these operations as + coroutines. + + unit bst: class (type t; function less(x, y:t):boolean); + hidden root, e, i, d; + var root: node, member: e, insert: i, delete: d; + unit node: class (value: t); + var l, r: node; + end node; + + unit e: coroutine; (*elem- output attribute*) + close trick, q, v; + var trick, elem: boolean, q, v: node, x:t; + begin + return; + do trick, elem:=false; (* loop for member *) + q:=root; + v:=none; + while q=/=none + do + if less(x, q.value) + then v:=q; q:=q.l + else + if less(q.value, x) + then v:=q; q:=q.r + else elem:=true; exit + fi + fi + od; + inner; (* elem=true iff x belongs to S *) + detach; + od + end e; + + unit help: E coroutine; + taken trick, elem, q, v, x; + begin + inner; (* trick=true iff x does not belong to S *) + if not trick then exit fi; + if v=none + then root:=q + else + if less(x, v.value) + then v.l:=q + else v.r:=q + fi (* after insert or delete *) + fi (* attach new node q to its father v *) + end help; +1 - 96 - + + + unit i: help coroutine; + taken trick, elem, q, x; + begin + trick:=true; + if elem then exit fi; + q:=new node(x) (* insert is a dummy if x belongs to S *) + end i; + + unit d: help coroutine; + taken elem, q; + hidden close w, u, s; + var w, u, s: node; + begin (* delete is a dummy if x does belong to S *) + if not elem then exit fi; + w:=q; + if q.r=none + then q:=q.l + else + if q.l=none + then q:=q.r + else u:=q.r; + if u.l=none + then u.l:=q.l; q:=u + else + do s:=u.l; + if s.l=none then exit fi; + u:=s + od; + s.l.:=w.l; u.l:=s.r; + s.r:=w.r; q:=s + fi + fi + fi; + kill(w) + end d; + + begin + member:=new e; insert:=new i; delete:=new d; + inner; + kill(member); kill(insert); kill(delete) + end bst; + + pref bst(t, less) block + taken member, insert, delete; + var y:t; + ... + begin + ... + member.x:=y; + attach(member); + if member.elem then ... fi; + ... + insert.x:=y; + attach(insert); + ... + delete.x:=y; + attach(delete); + ... + end; +1 - 97 - + + + 10. Exception handling + ####################### + + + This section defines the facilities for dealing with errors or other + exceptional situations that may arise during program execution. An + exception is an event that causes a suspention of normal program execution. + The occurrence of an exception is expressed by raising a signal. Executing + some actions in response to the arising of an exceptional situation, is + called signal handling. + + Signal names are introduced by signal specifications. Signals can be + raised by raise statements, or alternatively, their raising is caused by an + occurrence of a run-time error. When an exception arises, the control can + be passed to a user-pointed handler associated with the raised signal. The + principles of determining a handler that responds to the raised signals are + presented in 10.3. + + + 10.1 Signal specification + ************************* + + + SYNTAX + ------ + + : + + ----> signal ---> ---> ( --> --> ) -->; --> + ! ! !! + ! !-------------------------------->!! + !<---------------------- , ---------------------------! + + CONTEXT + ------- + + The signal specification defines signals which can appear in raise + statements and in signal handlers within the scope of the specification. + The identifiers of system signals, i.e., signals associated with run-time + errors, are not specified in the signal specification. + Signal identifiers are not accessible by remote access. They can occur, + however, in a hidden, close or taken list of a unit. +1 - 98 - + + + 10.2 Signal handlers + ******************** + + The response to one or more signals is specified by a signal handler. + + + SYNTAX + ------ + + : + + ---> handlers + ! + !-----------> when ---> --> : --> --! + ! ! ! ! + ! !<------ , -------! ! + ! ! + !--------<------------------------------------------------------! + ! + !-----------> others ----> --! + ! ! + !----------------------------------------> end handlers + ! ! + !--------------> + CONTEXT + ------- + + Handlers' declaration may appear at the end of the declaration part of a + unit. All identifiers visible in the unit and the signal formal parameters + may be used in the handler statements. A handler can handle the named + signals. A handler corresponding to the choice others handles all signals + not listed in the previously specified handlers, including those whose + identifiers are not visible within the unit. + + Any statement (except inner) whose occurrence in a unit is legal may + occur in the handler. + + Restrictions + ------------ + + The formal parameter lists of signals associated with the same handler + must be identical. + + Example + ------- + + + handlers + when emptytree: T:=new treelem; return; + others write(" signal not handled"); raise Error; + end handlers +1 - 99 - + + + 10.3. Signal raising + ******************** + + SYNTAX + ------ + + + ----> raise ---> --> ( --> --> ) -----> + ! ! + !----------------------------------->! + + + CONTEXT + ------- + + The signal name in the raise statement ought to be visible in the unit in + which the raise statement appears. The formal and actual parameter lists of + the signal must be compatible. + + Example + ------- + + raise empty(exprstack); + raise end_of_file (input); + + SEMANTICS + --------- + + When a signal is raised, the normal process execution is suspended and + the control is passed to a signal handler. The actual parameters are + transmitted to the handler, as in the case of a procedure. However, the + crucial point of exception handling is the way in which such a handler is + searched for and activated. Below we present the principles of handler + determination. + + Let us assume that signal f is raised in object Ok. This object and its + corresponding DL-chain may be illustrated as follows: + + + ------------ ------------ ------------ + ! ! ! ! ! ! + ! ! !handlers ! ! ! + ! !<---...........<---!when f !<---........<---!raise f ! + ! ! ! ! ! ! + ! ! ! ! ! ! + ------------ ------------ ------------ + O1 Oi Ok + + where O1 is the object of a coroutine or a process. +1 - 100 - + + + The objects in the DL-chain of Ok are successively checked whether they + contain a handler for signal f or a handler corresponding to the choice + others. The object Ok is checked first, next the object Ok-1 is checked and + so on. This search stops when the first object Oi containing the handler + for f or the handler for others is found. If such a handler is not found in + this DL-chain, then the system trap handler is executed and the process + terminates. + For the situation presented in the figure, the handler from object Oi is + executed, provided that none of the objetcs Oi+1, ..., Ok contains a + handler for signal f or the handler for others. + + In a concatenated object, i.e., in an object corresponding to a unit with + a non-empty prefix, the handlers declared in the prefixing unit are covered + by the handlers declared in the prefixed unit if they have the same + identifiers. Thus the signal raised during the execution of the prefix + statements may be handled by a handler declared in the prefixed unit. The + handler corresponding to the choice others responds to all the signals not + listed in the handlers declared in the units from the prefix sequence. The + handler for the choice others is taken from the innermost unit (with + respect to prefixing). + + Example + ------- + + block + unit A: procedure; + begin + ... + raise f + ... + end A; + unit B: procedure; + handlers + when f: .....; (* <----------- handler H1 *) + end handlers + begin + ... + call A; + ... + raise f; + ... + end B; + signal f; + handlers + when f: .....; (* <----------- handler H2 *) + end handlers; + begin + ... + raise f; + ... + call B; + ... + end + + If signal f is raised in the block satement, hanlder H2 will be executed. + If signal f is raised in procedure B or in procedure A, handler H1 will be + executed. +1 - 101 - + + + block + signal f; + unit A:class; + signal g; + handers + when g: .....; (* <---------- handler G1 *) + end handlers; + begin + ... + raise f; + ... + raise g; + ... + end A; + unit B:A class; + handlers + when f: .....; (* <---------- handler F1 *) + when g: .....; (* <---------- hadller G2 *) + end handlers; + begin + ... + raise f; + ... + raise g; + ... + end B; + begin + ... + end; + + If signal f is raised in an object of class B, handler F1 will be + executed. If signal g is raised in an object of class B, handler G2 will be + executed even if the signal is raised in the statements of class A. +1 - 102 - + + + 10.4. Handler execution + *********************** + + A handler execution terminates if one of the special control statements + is executed. + + SYNTAX + ------ + + : + + ------> return ----->! + ! ! + --->!---> wind ---------------> + ! ! + !---> terminate ---->! + + CONTEXT + ------- + + The statements wind and terminate may appear only within a handler + declaration. If none of them occurs in a handler statement list, the + statement terminate is assumed to be the last statement in such a list. + The execution of the statements wind and terminate causes an abnormal + termination of the corresponding objects from the DL-chain (see below). In + that case, the "last-will" statements are executed before the termination + of the objects. + + + SYNTAX + ------ + + : + + -----> last_will ----> : ---> -----------> + + CONTEXT + ------- + + Any unit body may be terminated with a sequence of statements labelled by + last_will. They are not executed during normal program execution. The + statement inner must not occur within the "last-will" statements. +1 - 103 - + + + + + SEMANTICS + --------- + + Let us assume that a signal f raised in an object Ok is handled by a + handler H from an object Oi: + + + O1 Oi-1 Oi Oi+1 Ok + ----- ----- ----- ----- ----- + ! ! <---...<---! !<---! !<----! !<---........<---! ! + ----- DL ----- DL ----- DL ----- DL ----- + ! ! + ! SL ! + ----- ! + ! ! H-------------------------------->! + ----- + + The statement return in a handler has a similar effect to that of the + statement return in a procedure. The handler object is deallocated and the + control is passed to the statement just following the corresponding raise + f. + The execution of the statement wind causes the termination and the + deallocation of the objects H, Ok, ..., Oi+1. Before the termination of + each of them, the "last-will" statements, if any, are executed. They + complete the object execution. In the prefixed object the "last-will" + statements of each prefix are successively executed, starting from the + innermost and ending on the outermost prefix. When the termination and + deallocation of these objects is completed, the control is passed to object + Oi, where the computation is continued in a normal way. Note that the wind + statement in the case of k=i is equivalent to return. + + The statement terminate causes the termination and the deallocation of + the objects H, Ok, ..., Oi+1, Oi. They are completed as in the case of + wind, i.e., the "last-will" statements are executed as well. The control is + passed to Oi-1, if such an object exists. If Oi-1 does not exists, i.e., Oi + is the head of the DL-chain, then this head is terminated (cf. the + semantics of the end statement of coroutine and process). + + + Remark + ------ + + If any control statement (raise, detach, attach, etc.) is executed within + the "last-will" statements and the control returns to the interrupted + object, the execution of the "last-will" statements as well as the + termination of the remaining objects in the DL-chain will be continued. + + End of remark + ------------- +1 - 104 - + + + 10.5. System signals + ******************** + + Some of the signals, called system signals, are predefined in the + language. They are raised automatically when a run-time error or another + exceptional system situation appears. + System signals have no parameters. They are not declared in the signal + specification, but the user may declare handlers for them. The execution of + the statement return is not allowed in the handler responding to such a + signal (note that sometimes the statement wind is equivallent to return). + + The following signals are predefined in the language: + + acc_error + A remote access to a non-existing object or an error in the + expression ...x qua A (x does not exist or the type of the object + pointed to by x is not prefixed by the type A). + mem_error + There is no free space for the allocation of a new object. + num_error + A numerical error, such as for instance integer overflow, + floating-point overflow, division by zero etc. + log_error + Any kind of the LOGLAN Running System error (except access error) + like e.g., an attempt to pass the control in a way inconsistent + with the LOGLAN-82 rules, an attempt to kill an active object, etc. + con_error + The value of an index expression exceeds the range of array indices + or the array bounds are incorrect. + sys_error + Any kind of system error like e.g., input-output error, parity + error, etc. + + Some other errors may also be introduced as system errors but are not + predefined in the language. +1 - 105 - + + + 11. Processes + ############## + + + Let us consider a snap-shot of a program's computation. This snap-shot is + called a configuration. Up till now a configuration has consisted of a + finite number of objects creating a number of coroutine chains. The main + program is the only chain with the head of process type. + Moreover, exactly one object has been considered "active" - i.e., its + statements have been executed by a physical processor. By a physical + processor we mean here an actual processor as well as the portion of time + of a central unit. + A configuration with many active objects illustrates the computation of a + program with parallel statements. Concurrent computation to some extent + generalizes coroutines, i.e., a configuration may contain many coroutine + chains with heads of coroutine type and many process chains with heads of + process type. + The fundamental notion is that of a process. A process may be treated as + a sequential program - only one statement of a process is being executed at + a time. A parallel program consists of a number of processes. In LOGLAN-82 + a process is a system type. A process object may be generated by means of + the new statement. The generated process object is suspended with the + execution of the return statement. This process may be resumed by means of + the resume statement. After resumption, process statements are executed by + a new processor, concurrently with the other active processes. During its + computations, the process may suspend its actions (but not the actions of + other processes) by means of the stop statement, then it may be resumed + again, and so on. + Observe that the attach and detach statements switch the processors from + one object to another, while the resume and stop statements acquire and + release a processor respectively. Resumption of a coroutine chain is + connected with the control transfer from the active coroutine chain. + Resumption of a process chain acquires new processor for that chain. + Similarly, suspension of a coroutine chain gives the control back to + another chain, while suspension of a process chain releases the processor. + Note that a process object is more complex than a coroutine object. So + coroutine operations are more efficient with respect to time and space. + Therefore the user should use processes only when they are indispensable. +1 - 106 - + + + In order to deal with communication among processes (e.g., by messages) + as well as their competition in acquiring a resource (such as a shared + variable) one should have the ability to define some synchronizing + operations. Those operations arise from the following constrains: + + - timing, i.e., mutual exclusion of actions; + - scheduling i.e., stating which of the waiting processes is to be resumed + as the first one. + + + For this purpose some synchronizing facilities are provided. One may think + of many such facilities, from low level ones, such as Dijkstra's semaphores + to high level ones, such as Hoare's monitors. The decision which one of the + synchronization methods should be chosen and incorporated into the language + is weighty. The primitive tools are difficult to use, but they are + efficient. The high-level constructs are safer, but they often limit + parallelism (because of the strong synchronizing constraints). + The synchronizing facilities introduced in LOGLAN-82 are elementary (low + level). Therefore they are implemented efficiently in the kernel of the + operating system. However, the high-level facilities e.g., monitors (see + [5], [6]), can be defined with their help. The user can, for a concrete + synchronization problem, make a choice between the pre-defined facilities + or program other ones. The low-level facilities are hidden when the high + level facilities are used. Thus, the properties of the latter cannot be + disturbed. + In any case, speaking about a parallel execution of processes, we mean + that they are executed really in parallel, independently of the relations + between a number of "ready" processes and a number of available processors + (the details of processor management are hidden in an operating system). + + + + SYNTAX. + ------- + + + : + + ------> -----------------> + ! ^ + !--> ----->! + + +1 - 107 - + + + 11.1. Transition state statement + ********************************* + + + Each process can be in one of five states: active, suspended, locked, + awaiting, terminated. The transitions among these states are described by + the following graph (where X denotes the reference to the given process and + Z a semaphore): + + + + **************** + * awaiting * + **************** X:=new + ! ! ! + ! ! ! + end of son! ! wait ! + ! ! ! + lock(Z) v ! v + ************* <------ ************* ------------> *************** + * locked * * active * stop * suspended * + ************* -------> ************* <----------- *************** + unlock(Z) ! resume(X) + ! + ! end of X + ! + v + ****************** + * terminated * + ****************** + + + + We shall now present the syntax and semantics of object expressions and + statements connected with the transitions of the process states: + + SYNTAX. + ------- + + + : + + !---> ------------> + ! ! + !---> ------->! + ! ! + !------> ------->! +1 - 108 - + + + + + : + + -----> stop --------> ( ---> ----> ) -------> + ! ^ + !--------------------------------->! + + + : + + ----> resume -----> ( ---> ---> ) ------> + + + : + + -----> wait --------------------------------------------> + + + SEMANTICS. + ---------- + + + From now on we shall consider the occurrence of the transition state + statement in the object O which belongs to the process R (i.e., there + exists a DL chain connecting the object O with the object O(R) of the + process R). If the process O(P) is generated in the process O(R), then the + process object O(R) is called the father of the process object O(P), and + O(P) is called a son of O(R). + The execution of the statement resume(X), where X points to the process + object, causes resumption of that process, providing that it was previously + suspended. Otherwise a run-time error occurs. +1 - 109 - + + + The statement stop suspends the process R. The statement stop(Z) is a + WFF if Z is a variable of type semaphore. The execution of this statement + suspends the given process and simultaneously opens semaphore Z. The + indivisibility of those actions means that no other process can refer to + the variable Z in the meantime (the statement stop(Z) is useful in the + synchronization of processes, see 11.2.). + + A process may wait for the termination of its son with the help of the + wait expression. The execution of the expression wait in an object + belonging to the process R causes waiting for the termination of any son of + the process R. When the first such son terminates its actions, the + reference to that son is returned as the value of wait and process R + continues its computation. If the process S does not embrace a + non-terminated son, the value of the expression wait is none. Thus the + execution of the statement + + while wait =/= none do od + + causes waiting for the termination of all the sons of the given process. + + The execution of the deallocation statement kill(X) where X points to a + process depends on its state. When that process is suspended or terminated, + then the execution of this statement is the same as in the case of a + coroutine. Otherwise it results in a run-time error. + + + Relations between parallel and coroutine computations. + + LOGLAN-82's coroutine computations can easily be simulated by means of + parallel computations. Coroutine computations are provided in LOGLAN-82, + nevertheless, in order to deal with the case of interleaving processes. + With coroutines instead of processes, one can avoid unnecessary memory + overloading by data structures inherited for processes and, moreover, + unnecessary scheduler activations. + Each process is also a coroutine, and so a process may also be subject to + the coroutine operations detach and attach. Therefore, the description of + possible state transitions provided above should be extended to transitions + caused by coroutine operations. + The execution of attach(Y) in the active process X results in the control + transfer from process X to process Y, i.e., if Y is not suspended then the + statement is illegal, otherwise process X becomes suspended and process Y + becomes active. + The execution of the detach statement in the active process X has the + effect as the execution of attach(Y), where Y is the coroutine (process) + recently resumed (by means of attach statement) by process X. +1 - 110 - + + + 11.2. Primitive synchronizing statement + **************************************** + + + SYNTAX. + ------- + + : + + ----> lock ----> ( ---> ---> ) ----> + ! ^ + !-> unlock -! + + + The expression test-and-set (ts) is a boolean expression (see 8.4.). + + + : + + -----> ts ---> (--> ---> ) ---> + + SEMANTICS. + ---------- + + The variable Z occurring in the expression ts(Z) has to be of type + semaphore. Evaluation of the expression consists in indivisible actions: Z + is closed and the returned value is true iff Z was open. + The statement lock(Z) is a WFF provided Z is a variable of type + semaphore. If Z is closed then the process which executes this statement is + suspended until Z becomes open. If Z is open then exactly one process of + those waiting for this event (having executed the lock instruction) will be + able to perform its actions. The others remain suspended as long as Z + becomes open again. Then exactly one process is allowed to proceed and Z + becomes closed. + The statement lock(Z) guards the entry into a critical region, i.e., a + sequence of statements, which are to be executed by only one process . The + entrance into a critical region may be of the form + + while ts(Z) do od + + as well, but it would cause busy waiting of processes awaiting for the + entrance. The statement lock is implemented in the operating system kernel + and its execution does not engage the processors by delayed processes. + + The exit from a critical region is offered by one of the following two + statements: stop(Z) or unlock(Z). The former statement is described in + 11.1. The unlock statement is a WFF provided Z is a variable of type + semaphore. The execution of this statement brings about the following + indivisible actions: Z becomes open, and if there are processes waiting for + entrance, then exactly one of the waiting processes enters the region. The + scheduling of the waiting processes is assumed to be fair. + + Thus a critical region may be written as follows: + + + lock (Z) lock (Z) + ............ or ............ + unlock(Z) stop (Z) + +1 - 111 - + + + Example 1. + ---------- + + Suppose that the following statements occur in two processes executed in + parallel: + + process P: process Q: + lock (sem); lock (sem); + x:=(x+4)*x; x:=-3; + unlock(sem) unlock(sem) + + and the initial value of the variable x is equal to 0. The execution of the + statement x:=(x+4)*x will not be interleaved by the execution of the + statement x:=-3, irrespectively of the succession of the arrival of + processes P and Q at their regions. Thus, these statements will be executed + in sequence and, independently of the succession, the final value of the + variable x after executing both those statements is equal to -3. + If the given statements did not occur in the critical regions, their + concurrent execution might be the following: compute x+4 - (yielding 4), + assign x:=-3, compute x*(x+4) - (yielding -12) and assign this value to x. + The presented critical regions make timing possible. For the description + of scheduling one should use more complex tools, presented in the next + section. + + Example 2. + ---------- + + Consider an algorithm which performs the copying of records from the + input queue to the output queue (comp. [5]). The algorithm gets the first + record from the input queue and stores it in the input buffer, next copies + the input buffer into the output buffer, and finally puts the output buffer + to the output queue and at the same time gets the next record from the + input queue, as in the following diagram: + + get 1 + , + , + copy 1 + , + , , + , , + get 2 put 1 + , , + , , + , + . + . + copy k + , + , + put k + + In order to program a parallel execution of get and put operations one + can use the cobegin-coend program connectives. A particular case of these + connectives is implemented in the copying procedure given below. We assume + that in the environment of this procedure the type T and the attributes of + class queue are visible. +1 - 112 - + + + unit copying: procedure (input_queue, output_queue: head); + var input_buffer, output_buffer:T, completed:boolean, sem:semaphore, + counter:integer, getr:get_type, putr:put_type; + unit cobegin: procedure; + (*resumes the processes putr and getr, suspends the calling process*) + begin + lock(sem); + resume(putr); + resume(getr); + stop(sem) + end cobegin; + unit coend: procedure; + (*suspends the calling process, if both processes + are suspended then the main program is resumed*) + begin + lock(sem); + if counter=0 + then + counter:=1 + else + counter:=0; resume(main) + fi; + stop(sem) + end coend; + + unit get_type: process; + begin + return; + do + if empty(input_queue) + then completed:=true + else (*get next record*) + input_buffer := out(input_queue) + fi; + call coend; + od + end get_type; + + unit put_type: process; + begin + return; + do + call output_buffer.into(output_queue); + call coend; + od + end put_type; + + begin + if not empty(input_queue) + then + input_buffer:=out(input_queue); + getr:=new get_type; putr:=new put_type; + do (*copying*) + output_buffer:=copy(input_buffer); + call cobegin; + if completed then exit fi + od; + kill(getr); kill(putr) + fi + end copying; +1 - 113 - + + + 11.3. Monitors (compound synchronization facilities) + ***************************************************** + + + In this section we shall describe Hoare's monitors ([6]). A monitor is a + data structure shared by many processes and a set of procedures operating + on this structure. Access to the shared monitor data is possible only via + these procedures, and so their bodies constitute critical regions. + Let us present an example of a class that realizes Hoare's monitors. + Non-conflict access to the monitor data is realized by the so-called entry + procedures. An entry procedure has a prefix entry which guarantees that + only one such procedure may enter the monitor. + In order to permit scheduling of processes that have entered the monitor, + two specialized procedures operating on the inner monitor queues are + provided. + + delay(Q) -stops the execution of the process and puts it + into a queue Q, the entry to the monitor is free, + continue(Q) -resumes the execution of the first process from a + queue Q (if Q is non-empty, otherwise the entry to + the monitor is free). + + As can easily be seen, correct use of these constructs is achieved when + continue is called as the last statement of an entry procedure. + + The declaration of the class Monitor is as follows: + + unit Monitor : queue class; + hidden sem, queue; + var sem:semaphore; + + unit entry: class; (* all entry procedures must have prefix entry *) + hidden busy; + var busy:boolean; + unit delay: procedure(Q:queue); + begin + call Q.into(this process); + stop(sem) + end delay; + unit continue:procedure(Q:queue); + (* continue can be called as the last statement of an entry procedure *) + begin + if not Q.empty + then + busy:=true + resume(Q.out); + fi; + end continue; + begin (* beginning of the prefix entry *) + lock(sem); (* entry to the critical region *) + inner; + if not busy + then + unlock(sem) + fi; + end entry; + end Monitor; +1 - 114 - + + + Example 1 + --------- + + A simple mail-box system with a circular buffer may be defined as the + following class prefixed by a Monitor: + + unit Mailbox:Monitor class(type T; size: integer); + var pool: arrayof T, count, in_index, out_index: integer; + var readers_queue, writers_queue:queue; + unit writer:entry procedure (r:T); + begin + if count=size then call delay(writers_queue) fi; + in_index:=in_index mod size +1; count:=count+1; + pool(in_index):=r; call continue(readers_queue) + end writer; + unit reader:entry procedure (output r: T); + begin + if count=0 then call delay(readers_queue) fi; + out_index:=out_index mod size +1; count:=count-1; + r:=pool(out_index); call continue(writers_queue) + end reader; + begin + new_array pool dim (1:size); + redears_queue:=new queue; writers_queue:=new queue; + end mailbox; + + Example 2 + --------- + Let W be a non-singular k to k matrix such that the norm of W is less than + 1. In order to solve the system of linear equations + + W*x = B + + one can use the Jacobi iteration method, i.e., for a given approximation Y + of a solution, the next approximation will be of the form: + + x(i)= -(W(i, 1)*y(1)+...+W(i, i-1)*y(i-1)+W(i, i+1)*y(i+1)+...+W(i, k)*y(k))+B(i) + + (without loss of generality one can assume that W(i, i)=1.) + + We shall use k parallel processes to compute the corresponding components + of the vector x. When the computation of all the components is completed, + the next approximation starts. Suppose that vector B is included in the + array W, i.e., it is the last column of W. In general, array W has many + zeros, and so instead of this array the user delivers the functions + computing the values + + -(W(i, 1)*y(1)+...+W(i, i-1)*y(i-1)+W(i, i+1)*y(i+1)+...+W(i, k)*y(k))+W(i, k+1) + + for the given vector y. +1 - 115 - + + + unit Jacobi : procedure(k:integer;eps:real;inout x:array_of real; + function W(i:integer; y:array_of real):real); + (* eps-accuracy, the starting point of the iteration should be + the actual parameter corresponding to x, the final value of x + will be equal to the solution found *) + + unit jac_unit :Monitor class; + taken entry; + var dist:real, q:queue; + + unit puti: entry procedure(i:integer); + taken delay, continue; + begin + dist:=dist+abs(x(i)-y(i)); + (*y-new iteration, x-old one*) + if q.cardinal O ! . + ! ! . + ----- . + O + . . + . . + O O <- linking point of N + . . + . . + O .---- + ! . ! + ! O <- N + ! ! + ----- + + Indeed, in n's SL-chain-to-come the module N will also be linked. + + + The SL-chain-to-come of an item being compiled will be called the + environment of the linking point of the item. +1 - 118 - + + + 12.1. Library items + ******************* + + + A library item consists of the interface specification and the body. The + interface is a connector between separate units: it allows us to code in + the item the access parts of other units and to use other units as prefixes + or data types. + The interface defines three kinds of units needed in order to execute the + item: + -externals - these are already compiled units stored in libraries. They + are expected to be visible in the environment of the linking point, + -languages- these are also already compiled units stored in libraries. + They must prefix some module in the SL-chain-to-come, + -sl_virtuals - functions and procedures which will use the item being + compiled and its environment whatever links the item. They are not known + during the compilation of the item. + + SYNTAX. + ------- + + + : + + --------->library item -->into -->;--->! + ! ! ! + !--------------------------->-! ! + ! + <-----------------------------------------------! + ! + ! + !------> --->! + ! ! + ! <------------------------------------! + ! + !--> compile ---> ----------------> + + + SEMANTICS + --------- + + The item is compiled and then stored in a given library. If in the library + there is already a module of the same name, it is replaced by the one being + compiled . + The default library identifier is the userlib. + + Example. + -------- + + library item into mathlib; + compile + unit sin : function (input x: real) : real; + . + . + end sin +1 - 119 - + + + 12.1.1. Interface + ***************** + + + SYNTAX. + ------- + + : + + ---------->languages--> --> ; ----->! + ! ^ ! ! + ! !<----------- , ------------! ! + ! ! + ! <---------------------------------------------------! + ! + !----> externals --> --> ; ->! + ! ^ ! ! + ! !<----------- , ------------! ! + ! ! + ! <---------------------------------------------------! + ! + !----> sl_virtuals --> --> ; -->! + ! ^ ! ! + ! !<---------- , -----------! ! + ! ! + ! <---------------------------------------------------! + ! + !-------------------> + + + : + + -----> -----> from ------> + ^ ! ^ ! + !<-------------- , -----------! !------------------------> ! + + + : + + ------> unit : ----> class ------------>! + ! ^ ! + !-> coroutine -->! ! + ! ! ! + !-> process ---->! ! + ! ! ! + !-> function --->! ! + ! ! ! + !-> procedure -->! ! + ! + ! <--------------------------------------------------------! + ! ! + !---> from -------------------------> ! + !-> + + + The default library identifier is the userlib. +1 - 120 - + + + : + + -> unit : -> function -> ->! + ! ! + ! !<-------------------------------! + ! ! + ! !--> : -------->! + ! ! + !--> ------------>! + ! + !-> + + SEMANTICS + --------- + + + The interface defines a minimum environment of the point at which the item + being compiled is to be linked. It is used to code the item and also to + check its static properties. Therefore, changing externals or languages in + the library, the user has to recompile also units depending on them. + Identifiers of externals may be used in sl_virtual specification to + define types of parameters and by the compiled unit as prefixes, types of + data and so on. Interface specification is not redundant, i.e., if an + external or language uses some other library items in its own interface, + they do not have to be specified again. However, only identifiers of the + specified units are accessible in the item being compiled. + + Example 1. + ---------- + + library item into datalib; + compile + unit heap : class.... + ... + end heap; + + library item into datalib; + externals + unit heap: class from datalib; + compile + unit priority_queue: heap class ... + var z: heap... + end priority_queue; + + library item into proglib; + externals + unit priority_queue: class from datalib; + compile + unit prog1: class; + var x: priority_queue; + ... + end prog1; + + Within the body of prog1 we can use the identifier of the priority_queue. + Class heap will be automatically connected, we are not allowed, however, to + use the identifier of heap. To make it possible we should define another + interface: +1 - 121 - + + + library item into proglib; + externals + unit priority_queue: class from datalib; + unit heap: class from datalib; + compile + unit prog2: class... + var x: priority_queue; + var y: heap; + ... + y:=x; + ... + X qua heap + end prog2; + + + Example 2. + ---------- + + library item into datalib; + externals + unit heap: class from datalib; + compile + unit test: class; + var z: heap + ... + end test; + + library item into proglib; + externals + unit priority_queue: class from datalib; + unit test: class from datalib; + compile + unit prog3: class; + var p: priority_queue, e: test; + ... + p.z:=e.z + ... + end prog3; + + + In this interface heap means the same class for both the priority_queue + and the test. +1 - 122 - + + + 12.1.2. Using languages + *********************** + + Languages are classes (coroutines, processes) already compiled. They are + expected to prefix modules in the SL-chain of the point of linking the item + being compiled. Their attributes may be used within the body of the + compiled item by means of the construction: + this . + If it does not lead to any confusion, the phrase + this . + may be omitted. The rules of accessing attributes in the case of regular + units are also valid in the case of languages. A language may also be used + like any of the specified externals. + + Example. + -------- + + library item into syslib; + compile + unit math: class; + ... + unit sin ... + end math; + library item into syslib; + compile + unit basicio: class; + ... + unit writereal... + end basicio; + library item; + languages math, basicio from syslib; + compile + unit prog: class... + ... + this math.sin (* or simply sin *) + this basicio.writereal (*or simply writereal *) + end prog; + + A correct use of the unit prog may be of the following form: + + library item; + externals + unit math: class from syslib, + unit basicio: class from syslib; + compile + unit user: class;... + basicio block... + math block... + class + external unit prog from userlib + (* this is linking prog- see 12.2 *) + ... + end user; +1 - 123 - + + + 12.1.3. Using externals + *********************** + + + External items are expected to be linked by the environment of the linking + point of the item being compiled. They may be used like units which are + declared and visible in the environment of a regular object. Some simple + examples have been given in 12.1.1. Some others are given in 12.2. + + + + 12.1.4. Using sl_virtuals + ************************* + + + The main purpose of sl_virtuals is to permit communication between the + compiled item and the modules which will use it. Communication may depend + upon the modules and there may be many fairly distinct of them. Sl_virtuals + and the modules are not previously compiled, i.e., they are not other + library items. Sl_virtuals are very similar to formal parameters or + external subroutines in FORTRAN. + + Example. + -------- + + This is an example of a procedure which sorts real numbers stored in any + structure with operations put_real and get_real. + + library item into sortlib; + sl_virtuals + unit empty : function : boolean, + unit get_real : function : real, + unit put_real : procedure (input X : real), + unit clear : procedure; + compile + unit sqsetort : procedure; + ... + begin + (*reading numbers*) + while not empty + do + ... + get_real; + ... ... + od; + ... + (*writing numbers*) + clear; + do + ... + call put_real(Z); + ... + od; + ... + end sqsetsort; +1 - 124 - + + + 12.2. Linking library items + *************************** + + + Declarations within a module may include specification of a library item to + be linked at that point. + + SYNTAX. + ------- + + + : + + ----------> external ----------> + + + SEMANTICS + --------- + + The object code of the linked item is added to the object code of the item + being compiled. Adding the same item a few times we create some unrelated + copies of the item as if the same source code occurred many times in + different places. + + + 12.2.1.Connecting the interface + ******************************* + + + Languages and sl_virtuals. + -------------------------- + + Languages and sl_virtuals specified by the linked item are looked for in + the environment of the linking point. If they are not found there, they + must be explicitly specified in the interface of the item being compiled. + + Example. + -------- + + library item into lib; + compile + unit M : class; + ... + end M; + + library item into lib; + compile + unit N : class; + ... + end N ; + + library item into lib; + languages M, N from lib; + compile + unit P : class; + ... + end P; +1 - 125 - + + + library item into lib; + languages M from lib; + compile + unit R : class; + ... + block + external unit N : class from lib; + ... + N block + ... + block + external unit P : class from lib; + ... + end r; + + Sl_virtual specification must be compatible in terms of the usual LOGLAN-82 + rules with the actual version or with the specification in the interface of + the item being compiled. + + EXTERNALS + --------- + + The externals specified in the added item are taken from the SL-chain of + the linking point or from the interface of the item being compiled. If they + do not occur there, they are linked together with the specified linked item + at the same point. + + Example. + -------- + + library item into lib; + compile + unit M : class; + ... + end M; + + library item into lib; + externals + unit M : class from lib; + compile + unit N : class; + var X : M + ... + end N; + (a) + library item into lib; + externals + unit M : class from lib; + compile + unit P : class; + external unit N : class from lib; + ... + end P; + + The actual version of the module M used by the module N is taken from the + interface of the module p. The SL-link of M is not known. +1 - 126 - + + + (b) + library item into lib; + compile + unit P : class; + ... + external unit M : class from lib; + ... + block + ... + external unit N : class from lib; + ... + end P; + The module M used by the module N comes from P where it is linked. The + SL-link of M is P. + Notice that if the program tree is the following: + + + O <- P + . . . + . . . + ----. O O + ! . ! . . + M -> O ! . . + ! ! . . + ----- .---- .---- + !. ! ! . ! + N1 - copy of N-> O ! ! O <- N2 - copy of N + ! ! ! ! + ----- ----- + + Then the attributes X in both copies are compatible, i.e., they are of the + same type. + + + (c) + library item into lib; + compile + unit P : class; + unit R : class; + external unit N : class from lib; + ... + end R; + unit S : class; + external unit N : class from lib; + ... + end S; + ... + end P; + + In this case two copies of N are formed. Because there occurs no copy of M + in the SL-chain or in the interface of P, two copies of M are also added. + The attributes X in the copies of N are of different types and are not + compatible. The copies of M are "own" copies for each N. +1 - 127 - + + + 12.3. Binary items + ****************** + + + A binary item consists of a very simple interface specification and the + body. The interface defines languages in which the program is written. A + binary compiled program is embedded in a number of blocks prefixed by these + languages. There is also a block containing definitions of linked library + items. + Compilation of a binary item results in an object code ready for + execution. + + + SYNTAX. + ------- + + + : + + -----> binary item ---> into ---> ; ------>! + ! ^ ! + !---------------------------->! ! + ! + !<------------------------------------------------------------! + ! + !-----> languages ---> --> ; --->! + ! ^ ! ! + ! !<------------ , ------------! ! + ! ! + ! <-------------------------------------------------------! + ! + !------> externals ---> --> ; -->! + ! ^ ! ! + ! !<------------- , ------------! ! + ! ! + ! <-------------------------------------------------------! + ! + !---> compile -----------------> + + + The rules of using languages and externals are the same as for library + items. + The default library identifier is bin. +1 - 128 - + + + 12.4. Processing libraries + ************************** + + + 12.4.1. Recompilation + ********************* + + + LOGLAN-82 guarantees uniqueness for types and units. The compiler + associates a "time stamp" (time of definition and compilation) with each + compiled unit. Compiling a module twice (even if no changes are made in its + source code) makes all units defined in the module different + (non-equivalent). Therefore after some changes in the library we should + recompile all modules connecting the changed items. + For example, consider the case where defs1 is used by defs2, and defs2 is + linked with the user. Suppose that defs1 is recompiled for some reason, + then defs2 is recompiled, too. Then the user should also be recompiled, + because recompiling defs2 invalidated the version of the user. + + Compilations and recompilations must occur in a specific order. + To recompile a module storedin the library, LOGLAN-82 commands the + following syntax: + + + --> recompile --> --> from --> + ^ ! + !<------------ , ----------! + + It is suggested that the LOGLAN-82 compiler makes the necessary + recompilations automatically. +1 - 129 - + + + 12.4.2. Insertions and deletions + ******************************** + + + To insert an item into a library the programmer writes only the source code + of the item. It is a code between + + + + library binary item into ; + ... + end + + + This code results in the insertion of the module into a given library. If + in the given library there already exists a module of the same name, the + new one replaces the old one. + + Deletions are made by using the following syntax: + + + --> delete ---> ---> from ----> + ^ ! + !<------------ , -----------! + + A linked item may be deleted from the library. However, the linking module + cannot be recompiled after that. +1 - 130 - + + + 13. File processing + #################### + + + 13.1. External and internal files + ********************************* + + External files are named after character strings and denote peripheral + devices or data sets. The logical and the physical structure of an external + file depend on the given computer and its file system, and so, for the + users of LOGLAN-82, external files are accessible via internal files only. + + + An internal file is an object of the predefined class type file. When an + internal file is generated, it may be associated with an appropriate + external file. Sometimes the user wish to generate an internal file not + associated with any specified external one. Such a file is called a local + file and its life-time is not longer than the life-time of the program + where it has been generated. + + + A file is always treated as an unbounded sequence of bytes. A file can be + read or written, and can be set to a required position. Each transmission + from or on a file starts at the byte pointed out by the so-called current + file position advanced by the number of transmitted bytes. File size is + defined as the greatest number of a byte transmitted on the file. + + There are some primitive facilities in the language which enable the user + to read or write a specified number of bytes, to change the current file + position, to obtain the file size, etc. All these facilities are in some + sense low-level, since they operate on bytes. The user is able, however, to + declare a class for file processing with high-level operations. + + An example of a system class which defines a set of input-output + operations applicable to files containing elements of a single type is + shown in 13.6. Moreover this is not the only way to define high-level file + processing. The user can declare, for instance, a class which defines + operations applicable to files containing elements of mixed types, a class + which defines operations on a file of arrays of various lengths, etc. +1 - 131 - + + + 13.2. File generation and deallocation + ************************************** + + + Before any operation on a file can be carried out, an internal file must + be generated. If the user wishes to communicate with an external file, then + the generated internal file must be associated with that external one. When + the generation of an internal file is in effect, the file is said to be + open. + + + SYNTAX + ------ + : + + -----> ----> : file --------------> + + : + + --> open + ! + ! + ( + ! + ---> , ---> ----> ) -------> + ! ! + !-------------------->! + + SEMANTICS + --------- + + Variables of file type are declared as any other variables of class type. + An object of file type (internal file) has no attributes visible to the + programmer. + File generation differs from class generation. It is performed by an open + statement. If the second argument appears, then a new internal file + associated with an external one (identified by the string) is generated. + The reference to such an internal file is set to the variable of type file + occurring as the first argument. If there is only one argument, then a new + local file is generated and the reference to the corresponding internal + file is set to the variable of type file occurring as the argument of the + operation. For instance: + + open(X, "teletype") + + generates a new internal file associated with the external file "teletype". + Similarly + + open(Y) + + generates a new local file referenced by Y. +1 - 132 - + + + Thus the operation new is not applicable to files. Moreover, remote + access to internal files is not permissible (no attributes visible to the + user). + Except file generation, remote access and prefixing, file type can be + applied as any other class type. In particular, expressions of file type + may be compared, assignments on variables of type file are allowed, the + user can declare a function of type file, etc. + + + Remark + ------ + + External file processing is not predefined in the language. The + operations on external files, such as file creation, file deletion, file + protection and so on, depend on the given file system. They may be + introduced into the language as standard functions or procedures in the + individual implementation. + + End of remark + ------------- + + + + After processing has been completed on a file, it can be closed and the + corresponding internal file may be deallocated. These actions are performed + by the kill statement, where the argument points to the corresponding + internal file. +1 - 133 - + + + 13.3. Binary input-output + ************************* + + + SYNTAX + ------ + + + < binary input-output operations>: + + ---> put ---> (---> -> , ---> --> ) ----> + + ---> get ---> (---> -> , ---> --> ) ----> + + + SEMANTICS + --------- + + + Operation put transmits a sequence of bytes from memory to an open file + (defined by the first parameter) at the current file position. This + sequence of bytes is defined by the list of expressions. For any list + element, going from left to right, the value of the expression is computed. + If this value is primitive, then the transmitted bytes correspond exactly + to the internal representation of the value. If the value is a reference to + an object, then the transmitted bytes cover all non-system attributes of + the referenced object. If this value is none, then no transmission is + performed. + Operation get transmits a sequence of bytes from an open file (defined by + the first parameter) to the memory. If a list element is an object + expression, then the transmitted bytes cover all non-system attributes of + the referenced object (hence, if the value of this expression is none, then + no transmission is performed). Otherwise, list element must be a variable + of primitive type, and then the transmitted bytes cover exactly its + internal representation. The sequence of transmitted bytes starts at the + current file position. + + For instance, let x be a real, i an integer and Y a reference variable to + an object of type A: + + unit A:class(j:integer); + var u, v, w:real; + end A; + + Then the statement + + put(F, x, i, x+i, "nothing", Y) + + transmits to file F the internal representation of the values of x, i, x+i, + the internal representation of the text "nothing" (i.e., the sequence of + characters) and the internal representation of the attributes j, u, v, w + from the object referenced by Y. +1 - 134 - + + + 13.4. Other predefined operations + ********************************* + + + SYNTAX + ------ + : + + !-----> ----------->! + ! ! + ------> size ---> ( -! !---> ) --------> + ! ! + !----> < expression> ----->! + + : + + ------> eof -----> ( ---> ----> ) ------------------> + + : + + ----> position ---> ( ---> -----> ) ---------------> + + : + + --> seek --> ( --> --> , --> --> ) --> + + SEMANTICS + --------- + + + The size operator of integer type gives the number of bytes of the + internal representation of an argument. If the argument is an expression of + primitive type, then the returned value may be computed at compilation time + and equals the number of bytes of the internal representation of that + primitive type. If the argument is an expression of class or array type, + then the returned value gives the number of bytes of the object referenced + by the argument (except system-attributes). If the object none is + referenced, then the returned value is 0. + Another kind of argument of size operator is type. It may be either an + explicitly written type or a formal type. If the argument is a primitive + type or a class type, then its length in bytes computed at compilation time + is returned. If the argument is an array type, then its size cannot be + established and so the expression is incorrect. If the argument is a formal + type, the returned value is defined similarly but computed at run time. + Thus when the actual type is array the run time error is raised. + In all these cases size operator informs the user about the length in + bytes of the internal representation of the argument (if possible). In + particular, the argument may be a file and then the length in bytes of the + corresponding external or local file is returned. + + The argument of the boolean operator eof must be a file. It returns the + value true iff the current position of the file exceeds or equals its size. + The argument of the integer operator position must also be a file. It + returns the current position of the file. + The first argument of the seek operation must be a file. Then the current + position of this file is set to the value defined by the second argument of + the operation. +1 - 135 - + + + 13.5. Text input-output + *********************** + + + Besides binary input-output LOGLAN-82 provides text input-output + operations also. The operations read and write are available for input and + output in human readable form. Namely, operation read decodes a sequence of + bytes into the internal representation of the corresponding value before + the transmission is performed. Similarly operation write encodes the + internal representation of a value into the corresponding sequence of bytes + before transmission is performed. + + + SYNTAX. + ------- + + + : + + !--------------------------->! + ! ! + --> read --> ( --> ---> , --> --> ) ----> + + + !------------------------------------>! + ! ! + ->writeln --> ( --> --> ) -------------------------> + ! + ! + ->write --> ( -------------->! + ! ! + -> , -> ----> ---> ) --------> + ^ ! + !<--------- , ------------! + + + : + + -------------------------------------------------------------------> + ! ^ ^ + !-> : -> -!- : -> -! +1 - 136 - + + + SEMANTICS. + ---------- + + An input statement read(F, y1, ..., yk) is correct if F is a file and y1, + ..., yk are variables of integer, real, or character type. File F is + treated as a sequence of symbols. The execution of that statement causes + the input data represented as the corresponding sequence of symbols from + file F to be read, decoded and assigned to y1, ..., yk respectively. The + input statement is defined if the assignments are defined (going from left + to right). + An output statement write(F, E:A1) is correct if F is a file, E is an + expression of a primitive type, and A1 is an arithmetic expression of + integer type. + Consider first the case where expression E is of integer type. The value + of expression A1 determines the number of symbols to be outputed on file F. + If the specified number of symbols is greater (less) than the number of + symbols required for the representation of the value of expression E, then + the value of E is preceded by the appropriate number of blanks (then the + least significant digits are omitted). The absence of format indicates a + standard one (dependent on an individual implementation). + If expression E is of real type, then the output statement may be of the + form write(F, E:A1:A2), where A1 and A2 are arithmetic expressions of + integer type. The meaning of the expression A1 is that described above, the + value of the expression A2 determines the number of digits following the + decimal point. In case of an output statement of the form write(F, E:A1), + where E is of real type, the exponent part is always present. The absence + of format indicates a standard one (dependent on an individual + implementation). + An output statement of the form write(F, E) where E is an expression of + character type causes the external representation of E to be outputed on + file F. + If E is an expression of string type, then its external representation is + outputed on file F. In this case format A1 may appear and defines the + maximal number of symbols which may be outputed, i.e., if the length of a + string exceeds the defined format, then the last symbols are dropped. + In the statement write(F, E:A1:A2) format A2 is computed first (if + present), format A1 is computed next (if present), and finally the value of + E is computed and outputed according to the defined formats. + The execution of an output statement with a list results in the + successive evaluations of the expressions A2, A1, E, and in the output of + the computed value. + Statement writeln outputs the end of line symbol after output is + completed. If writeln has only the file parameter, then the end of the line + symbol is outputed on file F. + If no file is specified, a default standard input or standard output file + is used. At the beginning of program execution, these files are open and + associated with two implementation defined external files. +1 - 137 - + + + 13.6. Example of high-level file processing + ******************************************* + + A class defining high-level file processing is presented below. The user + can prefix the main block of his program by such a class, and then, the + high-level file operations are provided automatically. + + unit input_output class; + hidden uni_file; + unit uni_file :class(type T); + hidden element_size; + var F:file, element_size:integer; + unit set_position:procedure(i:integer); + begin + call seek(F, i*element_size) + end set_position; + unit file_position:function:integer; + begin + result:=position(F) div element_size + end file_position; + unit end_of_file:function:boolean; + begin + result:=eof(F) + end end_of_file; + unit file_size:function:integer; + begin + result:=size(F) div element_size + end file_size; + unit read_element:procedure(output x:T); + begin + get(F, x) + end read_element; + unit write_element:procedure(x:T); + begin + put(F, x) + end write_element; + begin + element_size:=size(T) + end uni_file; + unit inout_file:uni_file class(S:string); + hidden F; + begin + open(F, S) + end inout_file; + unit in_file:inout_file class; + hidden write_element; + end in_file; + unit out_file:inout_file class; + hidden read_element; + end out_file; + unit local_file:uni_file class; + hiddden F; + begin + open(F) + end local_file; + unit close_file:procedure(E:uni_file); + begin + kill(E.F); kill(E) + end close_file; + end input_output; +1 - 138 - + + + Bibliography. + ############# + + Part A: the papers related to the language itself. + + [1] Bartol W.M, Kreczmar A., Litwiniuk A., Oktaba H.: Semantics and + implementation of prefixing at many levels, Ins.Inf.U.W. reports, nr 94., + 1980. + + [2] Bartol-Ratajczak W.M., Szczepanska-Wasersztrum D.: Data structure for + simulation purposes in LOGLAN. ICS PAS report 373, 1979. + + [3] Dahl O-J., Myhrhaug B., Nygaard K.: Common base language. NCC s-22, + October 1970. + + [4] Dahl O-J., Wang A.: Coroutine sequencing in a block structured + environment. BIT 11, 1971, pp.425-49. + + [5] Hansen P.B.: CONCURRENT PASCAL, a programming language for operating + system design. IST report no.10 April 1974. + + [6] Hoare C.A.R.: Monitors, an operating system structuring concept. CACM, + vol.17, n.10, October 1974, pp.549-57. + + [7] Muldner T.: On the properties of ADA's rendez-vous and an + implementation of its counterpart in LOGLAN. To appear. + + [8] Muldner T.: LOGLAN-82 programmer's manual (in Polish), pp.1-417. + + [9] Myhre O.: Protecting attributes of a local class. SIMULA Newsletters, + vol.5, n.4. November 1977. + + [10] Naur P.(ed): Revised report on the algorithmic language ALGOL 60. ACM + 6, 1963, pp.1-7. + + [11] Preliminary ADA reference manual. Sigplan Notices, vol.14 n.6, June + 1979. + + [12] Salwicki A., Muldner T., Oktaba H., Bartol-Ratajczak W.M.: Base + machine language. General outline. (in Polish). Archiwum opracowan nr 20, + 1977, IMM MERA. + + [13] Wirth N.: The programming language PASCAL, Acta Informatica, 1971, 1, + pp. 35-63. +1 - 139 - + + + Part B: The papers related to the general project LOGLAN-82 + + [14] Aho A.V., Hopcroft J.E., Ullman J.D.: The design and analysis of + computer algorithms. Addison-Wesley. 1974. + + [15] Banachowski L., Kreczmar A., Mirkowska G., Rasiowa H., Salwicki A.: An + introduction to algorithmic logic. Mathematiccal investigations in the + theory of programs. In Banach Center publications, Warsaw 1977. + + [16] Bartol W.M.: The definition of the semantics of some statements of a + block structured language with type prefixing. To appear in: Lect.Notes in + Comp. Sc. Proc. Poznan 1980, Symp. on algorithmic logic and LOGLAN. + + [17] Burkhard H.D.: On priorities of parallelism: Petri nets under the + maximum firing strategy. To appear in Lect. Notes in Comp.Sc. Proc. Poznan + 1980, Symp. on algorithmic logic and LOGLAN. + + [18] Dahl O-J., Dijkstra E.W., Hoare C.A.R.: Structured programming. + London. Academic Press 1972. + + [19] Muldner T.: On the semantics of parallel programs. ICS PAS report 348, + 1979, extended version to appear in Fund. Informaticae. + + [20] Muldner T.: Implementation and properties of certain tools for + parallel programs. ICS PAS report 356, 1979. see also FCT' 77, + Lect.Not.Comp.Sc.56. + + [21] Oktaba H.: On the algorithmic theory of references. To appear in: + Lect.Not. in Comp.Sc. Proc. Poznan 1980, Algorithmic logic and LOGLAN. + + [22] Salwicki A.: Programmability and recursiveness, to appear. + + [23] Salwicki A.: Formalized algorithmic languages. Bull.Acad. Polon.Sci. + 18, 1970, pp.227-232. + + [24] Salwicki A.: Applied algorithmic logic. Proc. MFCS' 77. Lect.Not. of + Comp.Sc. 53, 1977, pp.122-134. + + [25] Salwicki A.: An algorithmic approach to set theory. Proc.FCT'77. Lect. + Not. in Comp. Sc. 56, 1977. + + [26] Salwicki A.: On the algorithmic theory of stacks. Proc. MFCS' 78 + Lect.Not. in Comp.Sc. 64, 1978. +1 - 140 - + + + + Index + ##### + + + A D + actual paratemetr list, 76 deallocation, 17, 83 + allocation statement, 75-81 - statement, 83 + andif, 9 declaration list, 41 + arithmetic expression, 64-66 detach, 86,104,108 + array, 18,29,75,82 dotted variable, 60 + - generation statement 18,75,82 dynamic compatibility + - object, 29 of parameters, 79 + - type, 29 dynamic consistency + assignment statement, 72 of types, 55 + attach, 20,86,104,108 dynamic control statements, 85 + attribute, 11,30,42 dynamic instance, 11,13 + dynamic location, 42,54 + + B E + binary item, 126 evaluation statement, 71-73 + block statement, 11-12,35,75 exception, 22,96 + block structure,11 - handler, 22,97 + - handling, 96 + exit, 9,84,91 + C expressions, 56 + call statement, 13 external, 122-123 + case statement, 10,87,89 external file, 129 + character, 23 + character expression, 67 F + class, 14,33 file, 129,136 + - declaration, 33 - declaration, 130 + - object, 14,17 - generation, 130 + close, 22,40,45 formal + comment, 25 - function parameter, 38-39 + compound statement, 8,71,87-88 - input parameter, 37-39 + conditional statement, 8,87 - output parameter, 37-39 + configuration statement, 71 - parameter, 37-39 + consistency of types, 55 - procedure parameter, 38-39,41 + constant ,31,57 - type, 30 + - declaration, 31 - type parameter, 37-39 + context properties, 56 function, 13 + copy, 74 - call, 75-81 + copying statement, 72,74 + coroutine, 20,28,36,86 + - object, 20 + - statement, 86 +1 - 141 - + + + G O + garbage collection, 17 object, 14,48 + get, 132 - deallocation, 75,83 + - deallocator, 17 + H - expression, 69-70 + handler - generation, 75 + - declaration, 40 - generator statement, 14 + - execution, 101-102 orif, 8 + - termination, 101-102 + hidden, 22,40,43 + + I P + identifier definition, 25 parallel statement, 105 + illegal identifier, 44 prefix 15-16,36 + inheritance list, 40 - sequence, 36 + inner, 16,41,84 prefixing, 15,36 + interface, 118 primitive statement, 71 + internal file, 129 primitive synchronizing + iteration statement, 9,10,90-92 statement, 105,109 + procedure, 13 + K - call, 75-81 + kill, 17,83 process, 21,28,36,104 + - state transition, 105 + L protection list, 40 + languages, 118,121-123 protection of attributes, 22,43 + last_will, 101-102 put, 132 + - statement, 101-102 + legal identifier, 44 Q + lexical entity, 25 qua, 70 + library items, 115,117 qualified object expression, 69-70,76 + linked item specification, 31 + lock, 21,109 R + loop statement, 87,91 raise, 98 + read, 134-135 + M recompilation, 127 + main, 28 reference variable, 14 + monitor, 112 remote + - access, 14 + N - function identifier, 76 + none, 69 - procedure identifier, 76 + repeat, 10,84,91 + resume, 21,104,107-108 + return, 84 + run-time error, 22 +1 - 142 - + + + S T + scheduling, 21,105 taken, 40,44 + semantic properties, 56 terminate, 101-102 + semaphore, 27 textual control statement, 84 + separate compilation, 22,115-128 this, 70 + sequential statements, 71 ts, 21,109 + signal, 96 type, 26 + - declaration, 31 - class, 30 + - handler, 97 - compound, 26,29 + - raising, 98 - primitive, 26-27 + - specification, 96 + simple control statement, 84 U + simple variable, 58 unit, 13,25,31 + sl-virtual, 118,122-123 - attributes, 42 + statement list, 41 - body, 40-41 + static attribute, 46 - declaration, 31 + static compatibility unlock, 21,109 + of parameters, 77 + static consistency V + of types, 55 variable, 32,57 + static container, 46 - declaration, 31 + static location, 42,46 virtual + storage management, 17 - attribute, 49-53 + stop, 21,104,107-108 - chain, 49-53 + string, 27 - subprogram, 49-53 + - constant, 68 visibility rules, 42,44 + - expression, 68 + subprogram declaration, 34 W + - body, 40 wait, 21,107-108 + subscripted variable, 59 wind, 101-102 + synchronization, 21,105 write, 134-135 + syntactic writeln, 134-135 + - entity, 42 + - father, 12 + - unit, 13,42 + system signals, 103 + system variable, 61 diff --git a/doc/report82/index82.doc b/doc/report82/index82.doc new file mode 100644 index 0000000000000000000000000000000000000000..799737b58a2970190a77bb79db20ac0261200aa8 GIT binary patch literal 9913 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 literal 0 HcmV?d00001 diff --git a/doc/report82/oldgramr.doc b/doc/report82/oldgramr.doc new file mode 100644 index 0000000000000000000000000000000000000000..730561f09e82722497e27125a38c7b566a7319a8 GIT binary patch literal 39597 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 C8GE(> literal 0 HcmV?d00001 diff --git a/doc/report82/rep82tyt.doc b/doc/report82/rep82tyt.doc new file mode 100644 index 0000000000000000000000000000000000000000..9efd5f2e5c5e605375e645e5945be275520525ab GIT binary patch literal 4417 zcmeH~YiJx*6vyvA(j=QEO==oLv3jjgTivW}+DckMI!QL^ntd@l>$XwU$!3zBc6Vl( z*=^j4SV|F!6$C*jh$t$E_(3Z8Nu<;Vf_|tXRI0Vb($-iZ(Auh`ZTz1*n@yTWTLXTP z-re7Qo_p?@Gw06S`SIO0_UxA08iv$HSvl=-G4^~lV^Y&(&s2G}YN|eOt%0#t7ZZ8w z5|WxbZ(yr18eoc$nLGEfr!d-BmN8IY&)yR9|1Nj4x5ccf{9g7sdQP!-8p%S+?`B7k zZ(x^^_lf$X@_HZrxcG;n2_>W?l^~Dx@KCfTCPySC)Rpk_ zWHj`6P)>xD?KG5<M%A7nEhy*$%S&4=HoW}#bok_WWdo^lS~p`V^^C z5=s(MI2Gz5{oR2?e^-AnE@3&TEhQ!3pMFJ7Ms8^EbmOV+q_%~oiUv4}%i1p8)&}`N ziA%t`D-tV0+C zQ!%-l)~blWM;f<_13A6G3nnjQG;V3?pk|e;dDALzbBL=vs~W>aby(vg8PnFVtgR0l zT(`Mh(6d>t8+ANynZuT5+X1d*G)o&YEsd*22^w>%wbMp@kf+UDPBRKV36NqH%I6x#b3FuAM{TCOl+D=Y79xZcn> z;8SoI906Z|uK>l$Pv9i@1)KrD0*amKaWjFo8*x(w?gOj9 z8sG;Hfp)MFbbv?_dmE0GGgDU>sZnTX5+wgIB<-;5Bd% zybeA9AA*m-$KXj^`_o_m90H$#mF4(;ALSX)u!ylH&R2$*4nNtl`+u}}?asy_T)vRKYrK?%yTgST0qNQsV z)WuD^kVsp4zJODeZs1JB!f|EYW)@F$$)UKyq&!YHJgnN9m9lg?GsUw-n{0NH&y)0Y zv%Tz|C&=bncCc<^%^+&zF2`ja+$}$<*PN!9Rtw4ber3hCP;7G_arKwwoE2$JXPNgZ z^Ic41_#n#TM2BN?rF(MT9+&VudEW>3I`@GFsb?i@_jvZBbrg3fBUC@5{16-hBvVCi n!x^a$?N+5!C}ugARr**e@~}CKZzbN*jUmmkMDhmGr%4h6p literal 0 HcmV?d00001 diff --git a/doc/report82/report82.doc b/doc/report82/report82.doc new file mode 100644 index 0000000000000000000000000000000000000000..34941406228bbb00d537b617958eb9f5b5a075e3 GIT binary patch literal 308696 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

    {sa6 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 z zvp@l_uzvPc4Y85Gs?~~yYC{)mykd@>4td4AYPw{FlSQt;?5ZA1O>c^>f6%wq{;9yM zf6%mCXPR41X8nU}2MY+xt@RIj#ASUa6#wIm2)jy^ZReY(EOt?b`)W|j-PM2J1gnzb zB0CfI_*}Vdc>%VuFEdcR^4{%x*-mUQ;OvAewNJx z?IntxI2IkIk+z#=UN=yu{X8KloAUVTKpttij?n`NIRsBZUB5xZcE-cNL`ytfG7>1z7Z^uxdbfQidL#AK0uVtd8MQRxaws_cKP6SK4 zq&>*d_yqylE=j24i0Hb)(`We(oN6?P-INN@0hP)IWZ2&=1$s|NMw6@X(*oQzI zMV#leJIJh@^I|=^W3vIQa1xn|3Hu$y8B2pIIyCGG{RmH^3a`|8f|86A`)W@Ipvy0V z_bAR*bWOFV#d)_Vz9M2fay9#c*!ukWl$?Mblc{&QV5Lv;eUw1zMX?c8`k)W*yW!N`vQk@=TeoIY$h*;9ETq8+Y$`sUUaTv&1Rg z8+Ep$#{AIlE;4vxv9rm^qQI;ZOwMNeJhnPOrWwND-poM1J8v>FnW7UJ(d6Bg<$>|p1tbhu9ioX)x5kb@qIYU;N zB>U%2mEd)HFcPK9Ohmp3mIhU2??0$;4I!Dtd|{c!Y!X%U^&VGGcqs!jparzfsX9 z&|4pO;KQxEu^NLk=10G@*~Hl4RIQ&>%(t7sIL^3aCgWqE)`6&gSG>R#w3g_|a0Zxu zO+oehniE!|JwqHNrmK;)J9;Ca8(A&^f5nN_6Du50W+33p=T3PyTDj2u3lpuG)14@U zsq?vP1_|_QZg;uSHaC@T>om0vmM#ox*cgAS5x{GQ96z`6t95j%hv3J5uN`@aTRpd{ zGw|EHrBzCU8%JQROsRH#tDN8am#84w%h=s2+)>LQ>%mt>s*4qsIq%r9;HGu_Xt<>x zE2DS!tr5E4t6v*kS23t*#DDF%6{P&DuRk5$=_cnHyz_608mv#gYM?r_CA~dTzrE^9 zMRw_BOu4!$ac5XlBsM~CO>|r`TpdaGUzdwoi@YT|7n%2X0se>?8tgq6tOs))a7zw;b|bQF2vWq;B*e(|%e19^Pq z;C-*a^NW)b=A2W8lSehfsOCtMro0a|2Ah=?E%GW z2R8F{aC+f0Yk|3dEQd;9Ivy_mtRs0g5$V-&xMr7 z#;%^8Hw#CsVT|)qWXK2G)uTddP>kr&ZIa7z)6X(yN_V!#Zgv;l9W?;;00{9~?1&CV zV(y?gnvDnf4%nkeBHHhn!)ip(V!m{8iJO4hxOSaM$0%*0CDqfO1|Q~*z$my7LfW&Q zMI6`B%`6U)>SGUi;5z%k^0lW@#rO}G_>o@6uphBR9&$oeUM4xfM{`RM=Pzeu7Zjdy z)GV7xeC9ed^wAs=s>fM&0T#6Zb1U~`cAZ4Ii>B<_3VZ7@#Rx;AI!gC7)8fw)x2Vfr zx>d8{tNlFP?J}t&Z{q#BZ8F5N0$8i?Eo`hcl>{J!K`=A&A&zzdCL00wVP>*Z$}?5i zP%J9zEU(ZLvt+FgtNogU4-AQj$66xzDafk29dcZBs(ruFzUFkE&Q3u}rkPL|O`D=YETtccM3r1JYg>Q714?vG&Y1?cQ}c6l<$2hwvIXDRBtN86m?!m&1fg4>9_3w>(uhl-sbn$Cs2V znGtIdpOI9BDf(I-fu59xL|uejmHTM*!`YLIaAY-+FtaJwA7Gz`*eTq&2E`#mo97+1 z>!XYcZ0Gmsq~-*>%tnty=1E5eO4XwKmn2L4Q49c#vujjVWuOws{(v+371GP%N0s+lKg!fXdW_YLo`_yTw{rA3O%NwYcMj zh{&&XXwf`5S(9!5r6SdD+c2G?Zyqiux`QL>ao%v{lgK|{D=#E?B)Lf0Ydxc*j%LdF zDw&t>O|&y+_FS2P#8M9z;Ri0wHVH0rl*zkbu>XzZuy5HAM_rxW85xa++Ga!RS&pdZ zdNSw%qXR+6-X^c2_>d}de4ohB>OQqN2ZY?qDN2w1X8JI*uT zen3Md%VvxH3$m?l7Z8}8yHlpB6!$fnegiWvs?oVuQ80|F*94w*9Q9cS@APzMThM!0 zly{~t5Z|yW@3bj8r={1lJ8KH!L<_lGBwP`}U)Q%RccY?~j4#J8YIp*JR#Y=+Zr(QkH#Yrd#AfdEmsYjFm;n z39`KBDa?y%Vss%)Y%Nnx&tHLW7Y&}wpG&*)mYP_~6HhP%cF^_3Q}VAtR>^^43v0j; z8wta732#*thkWQ{(ZuM=1JaS!S?i~w+Fs2x*L)n^?fxZ5OyrbuZBO}RV3@`#W?7(V z;Fve8anXtLN&S)qc}wQk@#;rW4t5L7XL6+qO$C(7zllFVFvkXC6zB+WYtvC%U0s4% zdVw%5luWRVTBRtogRDk4^SCmX<9hmi$v9~7;1&HHG91mwL1V-w`az!$v>p0kB!N)` z_3?POlc;w=*V5BGsly0Ij;sRk22Tiso`JH6wkzhl6}#cS1HcGb{$NgXt{(3RW}?6Z0xL{=zb-*yKL+VlA#&MfOy?NavKV3 zII0r5%ojDwxqvfQ-P(k57p)-->*+4|2Ugu3>Dc=}?0T3#8dh@hLFQC^Q6X-E&n^AGLqW31KOJ7o+i#5 zWrCdBkz?3AfZ&*Jc)JH9_er`{xT~Oq!`Nkk(s)Gq+yrHtN4#_VXg-wMlp++dw-Z{HIUO?Gd!f=X4X!9BB3>0f<*p;&QrhZ_37F!eCp+kKn07tgY-_UedP>=rV>wJ5beJd_XXMBE{O=$ zR{218p~JFKC?;3D;`pxb@cVF_=j zCKz)W^pw@y&6uvOnLt?#&A*@)bfys&OTa?Xb%Z+Zv1C}lgxY6TbkJMCsHuvDiPBkS z?z$s!nZ91#jj~XmgqKS+*VWJ|38#b%ku0Do=TN+?&3Ip%k~O?Lg~R4m`*_4kDbLt- z5tG_-SK=%q1!yd9q4~*D3i2Yt2+q06#Pl|INpR|%$~0&Xc$#u$&Zd~0Oy?I1Kv}}N zGquU7xuHLQb=&#njed7?C!JF>!p@S5Tn4Y+aSrsNc(gun1K09IJl`gN zJsN&INqgeS>H)yVG1&%&R#O`~SCA=eeCKHzCk3M&;Qh3XpVGH_Hj~7KSpTPW(Tq8t z(mX~g$czClCtM9zl7TZWYy^t#pwJ2_$0+hKDA7rI7{CRTUTVx17dP}(%=bfa~oxQco6Qw;|Z@! zE!vBOb}WCkrJQg8x+m3k1-uS6MO9Lr7bj@F*>}q407-cPN+@bWdLLC7F98w)S}sN4 zR*e&?G2O86#^YhhMcOPqo=RDc3a1|^?cucDXwHHhRLUu`qb$veeGjgFba(SB>}00@ zwbfhpr(_ec+N6hrj%|#DrWKGm8H6-N_U>Mgk4^lZ;Xc$Fy~1zVi(r}$hfP_W#qjWI zeF4+v4IZ}dPz@BgeaMnVSf#OzYLC6kV~`B^>Ff$>ZEA@+Z$Fg}e%FzSgbiuM$y6QT2w9A%b}{ zvD#k+9O~6b)e1y@Sj=A>(=>9fMvJiPSYUCHuSc;TS(nT;qtd=|t+5r{zsbbt?&Q3j zO9qmck6681a*gV%33yJtP$kYz@#FMh6|-C1E4xi!o4_)!&iC0=h9thKH zVy)@(QG+gR8eK>Sj6i)f0yTWY1h%RZJ!)|GZX#>T-lXnc3UTb-adng0`LhCbz&&oX z0=ee?sGGZfKdis`6{I&Je=XgLt$8~6uAVn9o$&Rw;ft%cR!P;K#@ zn~x;qa$pE|hX?V#PhZ)og^v%!y54)icEM7&vur!MBbRQo==1FM9Zb%w*r7xTDr+)4 z+d97>bM8*f+nkT}fP3h|ir^ycmKAja<2A1?a0$ht1m_Ei~d#!aYGB{H8!4h__=bKS}{ zN7TeH^u?kkdzDIwgEIuRW>D`##_w~KIl~GH9r0{v9^9QePDyI9iWlZ)6#?kJI&EP! zL(>P>ctWK&n#Md(Q1YI366-_N6)~CYbadrP>QX9Vrfoc+RTwKjN7aHVKCr9GoV=B8 z(V;qe?YgDc5#XV(!L$rOJKmWK!f}b?mCWnyoXK}GZ1BI)Uc${i9_p@$b<|JdCM}Bz z%+xw~*ZYuIDHTB|jx#s9>dU`aG1S=<`7R@8DWG8L1nX9SoE3zb| z=SrW8`Bug%1ym|9^vX)6)#gOfg|M)SGgQ(H5z!#4)vr>2pDDZ|hG^0tc5g)&A1hcH z4Ww~C6EL*uf{?EMKAUSjzR&sNi3=yklNYmO=IV>yFDKyL_hEW!wygXamAu-8k6rB| z8;Oh}4!4&L)P+& z`4GiiW~#ETc`kL;utB2OF*NllG z5Y3r^4{{DIPA0jasl`0%I?Wh3secS$oD@aT-&*Lwj`ilaVtqVpjm~3Kgy$0M51YUY zo#XiAmGNR_<1&t(;tx*Gx>`!R&6;LiYi{wbsM@7+Af)uoS|1Kh5fQHpQL zFlb;Xt^yy&j%*CqZ)X$4FXJwmSNxZ$>fyRgTAeO+f%+JS^-;9St=%ne=!=J=QT)9h z|ExZ7|FS3Ifrou3L=>176p_BHj?p(I{MRSO6J%e!dYot;e;>s^tFS(*ee}&Q|DKZa znIe*kyUUyBoxS+CfxcIVr4wwSA{Z#AZ382+*>Hj$haF^h^e%N}jrNq*bY4kWhE!e> zJ+mKXJTiaxSB1aAy4ewz-CX{elymB9kKS4l{kmZ|S@`uRaKDLVnWr5XS%4B$a1ev| z6rqUTQKWls+G8S6J;r}utZW^__Ocsk2Lo78S{1I25K$)3)*vju_hFQVmcpu3Q}Mcm z1BlK4pS!nxt}02=JZ(QtxAmvq{=9ej(jp5{Mb=bzjS?_ZzNc9N*@=3R%$cb&0RnC! zBuYY%*_MC&{+`F(BjTKUu7G-(?Ohp2_ns3k9v8I6Emy3^sD`o= z))w;{a0M}k{!S%{%Bj*;rbk(0Ds(n9!-0fM9n@AxpP5NzFYx4GR45&r6%)2i-iV-t zS^!j6112>4g`eKv`eXu#NIp%`TF4hBS4%#txZ_3fnfkWnNi(4{i-XWi%tl6Nts+zO zH1g0oKWRoa=_qq<)V41xP7OqwOWfie*3;orY4Mz5m^2ek2UJW2&BaC@#*QG!x7nT?*S}K2;@mQ(tOA-N~dGbr>_+ z#@o+7>QovAU7pti=EmuzsTIOH4s-dVlUkxb%tzP|JUyVpuKWel%C91#ss4_q7&8%j ziQVz24nB(M{N|(8>cQTMuix*n(@~3W(0uznRQxt8-v3DT_)WcUTRni|A122Jlqr}5 zW(N@?gZPzPp+tvUn3C3tEiuqpHzH58+R{$<(YgAY{R}WOx*t5oA8z35ZNP4?09F_r zzZu-!R-QiixAWT?+~OPzgL7=oov_-Gb=m^sFdhU7XRPpipRuRQ#vN_es^Pre-gIiG zD^xf-4sdZ5ObA>q3t+utSaq#fM@1G5(xeoyyMCe)gC>JIj`k?O|+CS z^YHhZPrVurbLk*W9l(ude{yj7>P8B8Bi8o~RJ~5ET6$}EV0hdheCuZewKX{qt!=)m z><}ai`5cOKC~!FsTw$n_HdV`u{Z@F!0)J!J(t7)U1GYlb#@|Z7QWj$2dPK`xKmT>{ zmPTi%gL?3v0Ji&uz`|QS_)h>^TD%=^_2AEijcN7FO7_VtSzRfa)ZN2Z&@8Y4IOoMq z%&-8YJ6`62RQPnF*J+GWe-SW2xTC6V`3k?&HT91PB`_NpLcFP3X*0l{-Z>m@Jp`k;-x7pzYgw?E~a6 zSF(w!hMxs@0n2k>Qupt8gyXh{1}wLQ51!!5Oy_=4Rr4{J)<&3c+3@x34d*sJI&I=l zaOWC~KF>p{?qaKY;Zb(YBe-M#A)037v&cnUX(XI2WW|k2FGK(rO&73x1XDP0VUVPV zcuM?jupc4IPP+p~n8Z(4kDeVpdagPz*l^IrRBX(IQL;XceJv#z8ttU3@?s^H-B}yz z(0b>jP=A@3S(?b%M$AWear1aio_jQ-#yvbZc%`}>bD&W)YXTTS!dWAjVA?4_j81-v z8mbPf4#*g`wR9$Hwx5?Xbij=~bCXaIwC@B&TLB-F-dHkH(qQE(oac;Mnu>l(&rsjRpsBE(_Zm$ul?+Nq@&MW) zWj!e&VhA|St#c!jpSfh%lw=Yy(8=9-O(fNDy7tcM&q30Mmm*1Bx>xp&G?)yMdI6zI z1}llO&J)7fB%u)=;gMSC*kPi^DF0i@&FL@fJW-vt8>BUbse(3?d)C*!c_npe4wh3^ zj2EeqxqJzkgl1ez)SP2v-BfT0qA<6(L?>#cZEJ;u?{pgtdXFSmXHTi8O*9+(F2poO z5(&H}j!=u`dp@}>XgESPm3t5^0o`GSU50WFGkR|+MG=zHhtGuSz;#1#?er_4KIUTF z4eU%-ScWMGf-A@5NN|0jmqOFjkhYqZOekrQV26Xcu`e_L#e&mtP~=+Zx(sR)Cz%Rk zD#I*g{SXIq91iA)z_4Q*O6@G3MKe2$Nh_TO z>H=Ekfcs1Pz7L^*-iw#eHdTmyEh%WE4mrDuHb)RSDqUMo^0(0|*Y44!VZ1%F(34E?&Qk)U1@Xh1($@A6D{jU|vCgt&ro9rQ@)QfQM z@j4Nosr)1d7+5t6+j``&Z+EvxNgxAgvMuqFoUtxwnPW62e*D4q1J8nUX@3Z#_|CH? zd^Ry&MBIECGeto#aZb!j>gxX2JGcjPi(c5h|MhML0 zTV#gXvtI!LjFN#U>stj7*F9=F%#H{2Fr=-@nB?qwHZ?wXFw8{SQ<5jIp3&N{iP=Z7 zV#GT!0dchbQy)^ei@3gbm(MQ5;HAw_SEkZSiA)M*<3~^+rggnB$D^s?KxE6`L*0yk z42*NBBd4ZtX}UwWe8hbbAe79O2S}vbl&~&AAwz&x%zOn7UzhZRs@l$qz@r0Lc|y9b zohd#Sms_r~sB0aLg}6P1m-6lhRPi{1RT62wFssfT;!zB1H-T|%ykrev?+@ICVwXnl zu9nvMfwjAe{zrPVN9k#?u`jDqrE7>?+}^t(qN03I*igrMnowO6DfnvCvC__#g8ve$ z_mfl3M-6MbHSMbDt5^?LSB?*VK03QXs6Xq>Z7(!}uS@g)eq-l5k04qrkC&^RQ;o&? z?v2|5Ngx(js9b&hQIKSWeixj|8uecS?V|60<(R+D+Q@bE2(>r1qavXBEA))6OA zEO|jiksxoE6bt7V(nK#g_TbSg@}XL1hA-r;#2|FAa3fxGS&yDzp2sV0BKlZo*)lsQ z@41Y)^v<9PHoUdsd}Mm zT79r059MeR1oo;D-+Z9pJm^&CAefpCvcC=#xB+uBiQ1^WdXK6+fisASM-$+HE%iTl z-f`yCi|DP93niD?+E){7^GkMP7)YvD=PdQ|wI7qask2yvScIkYnsMKX>>wa|@v>Zg zEBpLFX&Q0HPm!7GwyM-TyFfC_c=D=nzwvYHY(ke{mzmJ6=@_}czO79L0hQ1?GNpG5 zd^Yc54qcz#CZYfLS#lg!$<4*E?|n-g(aGW28R1d(kIEB(43G;r_^wGQS_63%ll$!S z__6hwSOa%g>svp%)q`92y@l%MethdU@q%+n?h)J{Jw<4vmun+E`!#A*X&3QI`rr{p ziNvLX2g1iBtU!J6%!88VU)2o3nv@nJY%V&h?k1P3|9JD(aJ*=7Xpvq1*q7*pP8d#S zp}XIuJqhEw4`m-c`G947zyQchtWEIHr{#s#g(37p9f;gx?Vm(4ZNdcNhq`G9x%W?# znis{5OAN$05|^n{#F_lCNt`2f3MsVq|4HKPQ-k6a1igvjKI?tjH|7`Bje~J5b|n%S zm?oRw;Ba6uSi?%leIJJC^%U@dD4P(~q$HA4>y6`}RB}tvJQPW5T}&{eCXW)iJX*HT^h55<8VqL5mLzV38~~`KVd%SaV|v4iG6O!A=q$Z z5kz+r`Qvy+rk%5ZYr)NBt#H_dHL8gH64kruC02)G!D(UIj+1kh!<|`->o&YnHswIe zqf&xO7UaxL8loLI@g6oWW`}cEf1r1!;@b2#ecpU)(-d zxZ*rzt!yCGZEJ}Hv`u=cxf1z-4V3|D=V$9orp6crer#((A2KaSF^DQF4Q#OYt-bK9 zyF*u>X+lh~xY@!-{dEGBSZ2^z(c+Bq;XBBLdcjQIHDFx!%hv{+LRg?iICWZZ z%|bsd>TQ=yiluqWC1#~bJA8Gj9JngpV%%UMDUxskUUgJ#Z8T(Dcf`yKAVm}EY~Uj% zUgo6(!ys}_-zr$0HtA}Z^gbtf>cCrioeDUrp5(L>I$vZAYje7jOoOXOOb)6($@0DB z;8V^uRI@$|TwZTRqr1ZCA_mCXQF%dKt4%zbnG# zQi0?7X!oD?L(AF-v9L~?C>KUgQl~44V7aeOADS&)p)ELLl`tNMidd~!xSU0x4g~3% zwZ?i_KB}Pw!Xy_r2D7{BElL4icoxGU66F06#@x`jmmLP zrU(m2eJffS-Y78K0#SDb=s99@*;3ZaVbGEQ%;iI(xSla^i;scnXFPAN70=i5RLJlS zaYUKq3|Plcwnln0m!0+w1mLBDsd)l`HRY3X?!<)$`}3mI$qt(|hjhF6Iii?t08C+;qeYkmj3%8L54_?~U}M%2kDIsIiAo#rfxbxqRiGzWGo?u@4z7KFcaOv$BLyiP zblb{{pb|ftOYS+gXDPY}!Ixb`e`4FpH>tTCCaDpjqwynk2XrzJVJHcW3QOQDP$8tK zy9DhfYl5j=C>VsQw(F<1OX~aduQE@yAMM$w?Td%Hk?Ey2>KY)k>oG5HwW4a>vUh@L zmWy8|EqY_-eJ+MvY&DhE24`=Tk$G^RYju`Z=fjec^HrFYlck*r4|7Emz9^z+%M2X! zIJ{~WsG93q;tn4_meTIUq;=B-XOqk@4`((G*F?JQ;7ii+Mv_*bury|X!CLkZQyCI9 z*dz~k3$?npMwbFjX@Nmcgxfg7$bo6$O#-__%F$92ZQ2(ILSFrl?8@sw4%WGlD%53N z3AY-X8i0MDVd_x%+oA}l9+c?E~Hpr6a?tH3nLY*2&Dr|CWG6_Rl zv=n0QfKsU+x*3YikMeAy5ai+P_I}q5w%Z~qZWh_HaY(vtf(fMpE*BE!W3~_&iLpKD zFtfQfEeReG3o$#1)@-ku8@SsIHXc^r6FycTO=sXA)F_c7xeSU`O@*r;cJ@KD-Jh%d=TJ@1aZb%l&{-C=^818|p>r;xq!K9)vdnl9D-ZMz z$0CDZGzIt#YrP35d3k_*gce}CG+aL^A4ABiIgDtBdAfaf?8a-%yzFeFri@xLgFk00 zMC2#toB?aM+c>b@=LjRu1izMbuwh`XUMpK4j96kQHJz(nC!>?+Fl4JIM{6;Q$}#ap z7I)#joUm1-Oo`Jju?5yRH2mA@^`W-9$-D1HFRrbQZ{E5H&Wl5WO*@1Lyp9A6TKxqA zTc#%&?09^m2TSd#ontVmwoDH~<%YC2Hk!1yP%3;|WIkEl4@b*Z2|W|5>)q$S`jMT) zE~7`;it@6MHfpPkrlFwBv5o0kYQ>%gWV<8_^_AXML}(p(e@{cE2X4bJd9;haonxk( zr=y52k-8dWYB+#3g`pZb6V4!4ZQxENtD2sO)!!0SJJmBq!{6UM*nbctJyW#jN@)pG zi!Djbo`O3`trN9m=k4qIwYphaL&(##3QZ4OO`qcewVKzCP!G<|QmXqiJ07$r3wm*Aj8jEc?V zimNYNWNlwb)ysituf|D;keLB@pdO79|G$}AN;#p}gs5t{`1{VUw z$PKHA?5X!-v%MH|4?&^>iWKVNperXg=XNBVQ8A98q1?^}W?D;AUp78S2qZ6hDcU5N z&t;hscJg!EV&V866OU#B=TXVQFnKw9+hVQ}Dd(6*WUR`)eBiwm5l&K$-n0Y-_}~tB zwdTCdnk~_wEtLo!=t6$DAUNEb2SlBfZ$mQJJwUF9>b$pO8YAX5oSiJHt(Tn$(3Lmz z7=K;_OJR^@HXK;(_&7A8{1w>O1s!pV0Dx^xrUoKeS^DU(>L~7-JI~ zr45?+VlXcbU$HIvxGN3k#GMe76_+9DEd4yRIhM9|IjU!L$dOubb_UF>DMghT3vl=7 z4f){zc>eQ?ho{GT9R)kRTD=!IO1wNhh@?I0=w`uL~UZn*(?dmQ?Nh+uNb-Wdr9QAAGjD zvZ&`@`KPJ#gC-(qdCJM};Gyb<&rlVmK;eenGsgpM`?LphYwL33O33T|=o{Z}4*e~D zbd3p?5~``5qq?_OzY5VdfvfrX{xG)k3#E6Z_@vDi;OKV@akKU4;pP(*&(pJpf)4Yf z)5|b1!9hZ|h=;|3LR$Tw3`npK@AP@${Rce%HLS3HEqCxjf!6qz2DZQ7oXW&4y^I~L z3Wsfh>PW0l>{EpJSU_}@$-fQniOQ95U!VE-mY+ryzwF-Rg0tI>^%oaG>i=CQCCp~tEwts5t#4;YYR_vrL zU}C0f*qSyOlbXH$Oy57_DG$AxOkV5xL^inN-bsh!4{zb=#>c%%8zUg(&+T6pSIBz3 zIj=htGThh)!OL2@TS&Rf)n%!#WynYmY)T@E^5P1A+1hV|I`$6xww?SxgE@J9Dds?$ zxturlMre;W4Yw@Zwv#5iNz)*fMPP|h$ZQ|w6(d~gf-w2l1iYtO8ME`b7g4(@1HgtA z5K)?=Er_I}(8vpQ?8rNcTLaMtzioE}*!~XDs?x74sC#iE!061Leu_-U>=QIsds}kY}Pei=>3Hy4z3=apB`V} zrfy~S>nv>(9tS9<13~o&zz?pieodO3_3LZWcnq{A=#2OZZRX-$(Vc|rm&bV@qswyN z{3($dHIvl#6T=^AR`Go~Y-4jE$A=hUzN@1}AqrD9k+uS>VZeDx{vl3=KrJUa76M*{ zYbj`8%3nq1;gBucb@1?l?)@9T-v96;DpF5FjB3<3zuHNF1cU~| zsDup)HQZ&8Nv8uar1u;k(H1mYh6*kGO*E9`GSnaBkwD&mofP>RZcbu$(*`Sp z8aF^RPIxfH&F^jt2st~7u-e(-h7r!fG4?U=$|!fMd@^E^-RST;P2v@`Dj3zl{%iKz zl*|5Yh%C}F%wRi?XVB7!>3~JnvO6v)&sT5@_JL-p+VSiJ!f6CaqVr!c4)1k!s^{Nj z0Id5CLeB3m*}vgW*q^L;gLyoqzp^;X6iowEn5pp;piHPw@d%}GjHO^;Rt{3pnCCI0 zx?1%ZL2Z}5Bouv(q|tUX_})(%Qh$vK2Pz`UYoH@dQgkc?4wMwM6LhpF9L4K1smNCo zj3*=TFPNdS!S4!j{%U9UD#RiHp%s67t+oV0K~Fuu@X^I6!u~SEG*Z*Rmm_)`AzVsO z19jJYyf5L1WPYz(qdty6xnZ10`E4$fjH(+7Pkkb#_^obMNlixS;Z5<|P(!Cmd60Ab zo+#)%3LRa-Zf*fD=<8D`CTe@Yf_N=JOU!NoavOvb_!2nH-2}P?&^9{WfbO={Mu9Ux zsi^(Kv!ACJ9hLg7&5t^IQ_h!7slq|Ez5&Y&ip#C#5uCT!5pAYNV8du&&~NExiu%^n zr5~nsa#)v}-&32dEzi;dPZQ9S>wuQ!-2g5&~)si2LVJ8A427en3?-+}v=JJwxoJ|>Ih6?VQ8@(@* zOzU0nPN-@^rL%W6UY-9-TVeuZBjRlzCX`Txraq+_Jb#x=0Hy)mGzT(dd8&AM|WCjV?3kcK-)&w_}Z zp(lmp-xxP-aPNT-qo`LbY$O&I;Z~Iy4sOm@fgHa|;+}BYztIdZliD(O|0;*8|Lvz6Hmcg%Xu?CjU^r2)fsy_6N6eNNoG&5}zk zJ}m!(vW?wQI~V1UGHrOp(yHOb@{DC0i8(&MHgUeBlc%x1t$Q%t9@Nr7s@Av-OxZLq zSaoEf+W%+8FY*8@5EV1pXP)G|D@0)x*CDQ9=<+WBAh94ax~YlbFHbr~ck@F>yYk)e zX3;rh6MblZVZC2{=V8wMMjfWA6Yjq)exs?|XflokM~X%!&@!>dP$IoO<;Qv_OMl5h z6yedIfVfYLw-Mn>LQ&4O!1gD?_9ubuDY6d=s_>PFE*V2_Z9vo~H*V1{e(WnNKK|NY z9KB@&0mBnXy=|HGGoB9C_DoZNohVl$1m4(UyB?4HC&2Nv38@*C#>}sd+II!F?!K zNIgi2)qVSKMI-+uMY9c0#(>VB8XKUsP z;6O!zmghEo;ASb#RU|!R{8@mJ7C>f6jDf1&5yS&VHjsq&0fJKu>3Kp*hNQOrm4TW< zNhjDI>D%U9w1L!31c0zubwSJJeHL~W`g{O4M6x~F769kS|6lI^vT8hR4dCPSUxxo~ zanY+4I*P2WXgl^}_SYg-`eV_La_{=UFljaHVPiW=E8zwvT>A565ajC&0Ce`_W9@Sw zNIzyz0lwAMh@Ypa{LuB~qKk3ahN zYng&O+@}n!>eIhCjfp<}D`z9lg35lcEaRUvZ&M!{<+ge7`x4!YZ#v^9_FwbrSjP|b ze)v7A^n(JwsGhGz?Y-=>ZJ}2aFH;adkv*oRR-M_fyt)AS$xabHNZ0Ux}W=^V@ zuz7p+&w*cCP73!;qp7`^n`rI;E6Zg!+H;dP(U}ns&HNgst$!RRP;Fk0>Tw2LIy#yJ zT(!0*h<lK3=o!;TsxiFn@X5U^=w!#uVp;^9@J@&eore(#+=0o{Z2Q zo8@nNM6?Yg0-y5lax3(cWDgepqUR9pjRqr>#=4bqLvTtxcDPBrBz;SQ+Pi~ol(8tI zKAb#0!H?mH95AoS-#i|_sCW-9xa2`ynei#0Y2mJ*4M&26Rd32|?ePgBC%+SY_9wn?PF zpshA-wVO00tWDfCq|9Z-ZOoozSy0&KyBMu;b9`u}Cn!~STT#(raj|hK{NU!Si{-CE zX#2N$I;Jzqgij`DGD8%Puvmvh0)q^;q}Enx6MwqM6n32cIC~C?Q01i!%t%ZO^9EIb z{KLc{k@skIbgJx1f z2@;(3*xH#&WIF9vI`M%XmnUtp0ZMY<(qjC9K3%b5|JW;h6*0Qa3i6NXvS$01{!0y7W9}@=;N% zmXmp_x9jCw{su3-BLhv@DZYi|Ld*a~(SPgwwvJ@_P=9xZ4r$TF=qZSnAs8E<@DnwY zD;rD;IGD?u#6`zfF~K&8!`$?rWf1%O0JgqM@J^9ZqAp%cr1V=Q*sOH4JjaL|)~i|R z0%^*OxNXsilH{}5X__5S|ChI|#tC|BjXFtDvlPDT~rW2m3kYhn1y(D^F+ZnU_J0MW@?iRU)DJB8h9bbCzJl5+)0N$wl&#cBf|Q z_KB1Ow4$eGvIDvIE!H$uvZAB@%p@iLCo^gH2La zfRSgJmrgB@;MdWHVS0*R)MM$7*omUkFx$rbS(6j~RFK0Ix7Z-<0)HNV;v!n1aQb}T zfpWvW7lgYC${j!p!psNgq8(HXq4t8paTmJ?MdB0iP2#ANzQi*2U322ZK)q3E%a;*T zazPB!V+M=?!TP2#7X`F}4+2*cpeWpNnnRT6{cq6xeaj0Ux);kif1=M?EWWUoKgp^r zYD<|TiUiay;yFqn10YpnvFf%|CpV*sDHxlM!dz2(4-MpDan-s@U+w2@8XN^DN?ho0 zv3Qp#nDtY71>Lx(uP{TDj|SW5%p2}8Ef^f>&FzZ~>BybEF!K!bDaAcZ2Hf*!TGDEb zvcVRMp@mUpXq_JJX~1Fl>|3@@FX|M713>OpnGMC4W2)8Bu#1~W++QYZh7$))i9Bsp zn=z7-Xt<6i<1%*0HVTtcPy`s+ zFEcOFX-iq9S7MAfv9Z&$=k~_(!n(-4M8i+kPcKL>E)aG=8!D?m3mcC)#nK)$oX07? zg%?-;Y2G&XL9(wb39ApSg;Kme#yy~!A3%U0bUZCq(y%{89FZLP?{<|<>$8-a1EB_sJr1rv1VHT6VHwP{?qE#f$U!==9~!T7{OzG?&?hwVR;?_9`0&T}Q>_Q`&`^ zjnD4v-#z&1ll#eN`=cb2AmjTK*E%>SceW&y?noC`8-f|Gog|A>sWFoq z@8IK|kiq+xzd4!Fr7sQRgHg;grg({>zY5aq3-;TKR@5QC1)x^TDDQ7A>`(Z z!rb|4C~DKG;~iU5x}vBJB=CuYJy^-%Ofj$w!v#YZt8tXo`j@VOFaaXE+4uf@i?hQAGPt$z#! zQx~o@!4;$5Vj(J`Qycf2$93ca+fQ!P){-o0wvV{P%eB?d&#$FC$todIRD41TOuD#KQVHq7 zFNBBZs=AW4j-OJJsVbT*(4aDgFq}DRdDCpC?a$h14k(i7Qgb0yL4i+uM`#RaRIE(! zDv>T61z(@(AbwR9w4T;hTc{V%J8_9&T|y-(q^&LK_c=KQ-p|U>d!kGVlV)i|g4>sK z0+pNHdq*-ck9FJzq6_6FwT=(igx1JZz45gF3VB=gjcijD*8K`;ZLk=v1=G# z+EkPv=rn{VD8VB97ft%g65nMn%!~}uEcTbY8) zr0_p6w(?mywQy7Ij0`fYIwo7y@BA9xDG=Nfn7kr8g$&|Xo!d2GE|3-}mL(wNRb;E9 zv$KeT0%wyQzC_|b{2e^mopmzf(uZj3%J_V&42<2w6CCD9&=$;SSDbKn@!}zyl?=Az zFZR3-az8LVeINW5)ESQa!3ps54Mf-iqu5Rbif6IZ}UzB61cx-Ldg?Y-kKHcij(A0YE8#7%R?MZZ&&CyKrFLPYI*@sDtsvL zw>>Ux#72ts#93!*6me(0>RSC}!9kJ^btt8@IElR(>e5-tbtX#J5t9`>Jy2s`O<^=q zbPsy8G^wlY!HVvPQ`egv!PB(@N5pqu?$uhAvW$3 zXSq=W#pHuGK2Fojwn+2xM*Bcwed6GBt&(oFkvr_S$e>S}@y|*i`RVP-XiaHqSk6Qk zh(`vx&Wn|D_=DzC>Pe`e!b!>Mrs`CR#CMeDPzE3zY@8x*nIgEgg z-WSVnZ$siEw&ZH+7;;-}EM26PGa8NzSRpX+ai^d~UP_1QFnV8s=gofki2`0BcFn zu&e2KTkJv^-V#LmxqLv)T_2+{FQE^>IpC=ws1N5Yt(6O5f}2iF*BLMzTpFagN@I zaLHd#BiM$)*}xl>34`zOGikPUHf!{qzV^!R*!2kAP`L)I;{}jFs3QZ#QtfhXRl9HJ z*vY_W18hi~J?~#H8{%|B<1)$9slzb8{aOpBB7IjG+M$KW2Vt+i-u?rAs!ng{?VqyF zKi>cT&d2w@UVV7u_pAT;WOe1v{nghv(mp*qd~@ZW-rjjH(Hr{L&4yyt%q}%05XM#s zPvQ8dLDZ})%EbTwPRkw$caJs|hxyH6ZG(Js z_#DF#TeVrQjK7Vdmf-T+{&01=>0m8AS*cL|7q34|Y zD?uhNfoJxOT$tdNQe>@cr=S|z9e$#Y0?f`=!0GPhKn1YzZWCl}74+6Z9a+(oRJ7%m z9$a5~r*`nm1NBr*1X0baxG{K7Z;YR`UU-@@@N@iIho6>s4u3|ud$?eZo@@f{Vr&%Z z=8rP&`MTnJ!i^Wt7JvCHdpL1U#>L4AcRM`}ViH-_>3jPVL{g3e%+WKWc2>2^a)g+E zk&6isf9DMRiWxFYV!;_vN9VnZapT!_LTs@IUEYx{{D?6IC?!SanslehHiU6TC>i4H zg6nAHJY}B-G-(9ogM=mJ_tHIVSI0dG^`&wfEZp|Dmr9G@utsO*Xt29l+i1?_s+$xe zw4Lr31TA_z>2HkDM97rlY2OsJSokQq99M2I<<9T8?&WvawHM1o;AT&lx-k}gf*M|? z2oVa)Icaw`+e5^X9pPJ)H%vre@D+1mX%nun9@-n8ZtZtZ!n#%SPJ=aOk;9D|sXdPx zC8t-FT#ZOfG6Ql&Is09$#({9APW6615RQ_6^Q6S?>YFF*KQjyq@=Zi~159J6);1@0 zE)4O~{&*{H{t?xzZ&hExm2doL8dFe-w}bDs-^SNVF!9_bbu(Ktv6{aD@gx@R3>)D#kWO{0r1Mb=L@t zV#bh{l>d6o{tyzr&7E83wFVGnXB`*gZRGI;z zev`zERd-So5qpI_>QE(S{q`=Be0e_)waTeH0Qr}Rz$TF9=)U~14|bQ!a#YFphJ|a#f-yoh()MXGdTMWgtqHD zVw#A#D@{#sR@6L)R39F_dUFI9`nfUPC)aDc%E$9p=SRm+B8YvQ1@Ndcxuhk7K0IQ# zCH2blpE(o5h#rwzjFR3+l`{ENAkBABo6(abyVF1RQsz+Q&D>{4FOLr&2|4UFrb_ri zrov^AnYZU=xvRO3b9SE_0}8eR`;!WjfZ*e=U|}*au8Yhmm=TATUq{ zy?VIgJeu+}lWi(>*{U0HR8JoEWz7l<3UvyXt}P{r*f^w68;px z@<2gIU54T{VF(11;jn{lDgLhG^*V(?7M|pSNizT$v)uwM7>R~oLqAxi<#=!H-ng#d zzm!fPG6%V=R=p}^R;XgZ;)%MaMZlAGNX0d>C1iOLnH2H)B5Hu%fHjHZ@SGNalc912 zaXW@VwE^Hei{Pdl7>p|4%lR*C%%jzBt~8-4v@kuU068XtX)D~$AqkZN-cA8sGHS4K zersu{9_cncWA*Crxe%1G6OeoyID|C3g2WtY_Qqky7&ePC8v{PyZ7R*J4?&BVHGC&&Tj#~v6vDtv45l)osX(W{`wF|^~}Qc0VvrXRW_aSFQ; zMqg4HRGQ?!{mp9UTU$yWtiJut)vmoemV|`}V+sn&qj8o5p3q%StG)D}wWc1!Ye2ViOvF_rC`Q_~9?pC6~J3)@%pQnYHj zKpKpSrHaulpKq{RL@Rn(tLgAIwZutVv`wuk;g=dR&Vh-x<4p>iPiEz*YIhlHQD0MG zimzT}yqRaV08fq5gSkHrC1PI%PVlwa+64;efw4n);db!tS)y6=$m?*`<6y^@wq=c|F!lpen!%doZieKjAD;PV|=e_||vY*^zN46K^0o`C5Pr}jRnQwI# zj5#vSZFlsmkzsI1sJBi=vq6&>8=oMOgw^5TI-@BYG-yseZ};M4Y~8zgXLjY8 zkz+=kmS<*zcQZ&eeKKX2i`PvYA&mspghWK6t?haRd;YBHnTMT^4QX+rt{QAna`fFz z`3ckld*+NuoOUHI=A3ddgrT!>FhLiSF^J5=6E%32I`~6FJO4Ke8S1AS*=S?*CmDJp z2Ap?=WXWxlhB!}<$+0j!{ zzlnR3S7vLb8o@Ww!tf>yl@BviH3EK#Jz{^(^4R>*;HznbxHyyJ>=pf| zfD-~?yP@?=^uPp)?pyJ(JS@QcW5&3I5_QKgP)~-2LXhDiYWnX14Tcs3<(8vXI*pIa zpl^Ado2ECdTql-(-SOL%>RjeRj_1U7nKS5Emac=xL4;XODUT%FBwqJCry5;(OH{ZY zxDhZL!bx(ALg9atnrC&5J6gmX;nh%!-QP3{?c|2Ji3B>oN#B}i9SIX9CMa!Al#~Yz z_>Km<@0vS&XMNRZabr@jfrpN+9oWDfSZ(&2=wM9Wjf`p5F7F8bk-P%$Tm_cZ-dAWq^?keA$V4m$~e zw?+YpxV})08bS1AFVV1+iOI;z#E3Mhff$>Vbuot@)xZN?q8hbUTN+djLpMlox<648 z)DnCD34ROLot(st)@DL7{i?th`4u_jq>fVU?|g4hz@6HvyYu`Oeje6+0l2t1X^}MP z-eXyE+}32>Q;TFYYKKOUW;QTeB@2DEV}t*W%rz#%K#WU6BJRn>8D){}@XS->KrZd_ zo*To6LhVtnnRE)ZPOimi4LOCv;--C@-0$E!?#sbMiBEtMn=3XXzLN*c7=h^Q+UBz2 zi!;XF^aV*yiLIIgaIXqT4ei$yb+qZ!%G+2zSCnD>UVT;$Yk--pJO?z}+IgR4r?Esj zyP1oLi0)!Vg6R_AYZeD-2HWr5qS|C!l|MfuP_{S?RG-Q%Nkat1)M8h?SSW-=`oQRq zL&|mJRwXuwS347NDaW`@9Ikep7OrId8${7kb0xS(Y0R?nRUpO$4HNcYpj7h&3AC&H zI7vm}kPvl9s+7!tY12LW=mHjI$FePjYGR6&+APkNWdfO0Vx`*vY2)C_B5a{_+_APn z!*$WgOp*(Cb#Hx8$G1OB}9J=u zJ~j$>e8N%S=i=83Yvt67Y)(5y?I^IG$Js_N$8w#a^PZ7+QTVF`nL-Ur7+Y(vf*({l zPHZ;^q;}b+S)TF)rw(wc{O0k%Z=U42&2OIIvntQ2)AOo=`A&?T5_98RZ`gbLK6}=K z7FBxl{L|*qoKn&ix#@EZe~i;R`mXrwhWrfh%_~l4A);k-Uiw#cww^d~f1AHtNA(QM zaC=4f$HzI0%qzcKLY2ueKLkDRV`&asUgo?uRI@bOZAPgTJZVO$1`bY|EOB%k8@(S9 zjBo+1y*xxG@Tw3BRnDn)%GC07ju_iCOm@tShK-cd@jb4D7ptA)y^E0VLxL7sP^=Nh zu8{=DpEeBo5&?MtJ08p*PoG@9xxP(4#kk~UeOn=^q~>(RDA^U*CJ1*|oHe}gh?L(Y zERlZwSD%WC-#Vb%Fuc1QQ72xxBd00c1^2Sd4-2Yip-ZwIaiHu(dCqLK!4$!!Z2Nj_ zZLHrXcg*8%1W7kbOEa0Q*u??huq{iq~QLU%5p2?hB@Q18)yF1VHD$*@_( zQyx|&nTf}s{Ngw0vLw{)wtv=5r#czZj(@I7c2>9_&=+0|8o7Dv;x|Xdx26~sjx_hlK+!@+vOH&^j+THyibHN_m^ZE6DCi05O@YcMTS%R|I_c@S zt_WdZy>QL|!pSa-MVt~ED;9gO{HS0mQyrm5;Z_J`zf}-P7w#SW2W1>xe|lXsJLB6M zdlxtCKWmvg&WQ;^ShU7OhFM+f>3Z+h@eQp(P}F1cPxKb$O$lMJ{&4SN&5rhII0qt; z2YS+7mReky7s~SJ5y5#36^u4$!?O?k>==r5^b^Nv*~R;Gdj`R#Hz+!^=?GW;i6;7L z0_!0A49+6DjJ$5NZqS5OT3Rb0isITT|>($#%2(`{m1mn3`WJ`A%|>>_#!t z>#L8+=!hU5A1cSEQ#u;dL(9EA>;&_SdloIeH z9zG?*P3q5hfPe`&JZYNY3}F}<1f2HS$ZQ+aE84bAMMruOUD#0udMT|-jJgl9s5(~j z34KT~RvO1=M~8WX&5%o7-2Pt|DH%422B#D!Cxw$i1X)&7k|a*sjtJo2U?W(pgr^6d zi<1F%;}3qRW(6Tn!XB8~fjLX&tBY5sFIX{US56EVuB}KFxN4+B-)uEGr@Vp!~qrtr9Zxp1nIAi`c#%hjqz_3Y^QW%Dy-;_tFJ2WK{0Sr56m zM1%m3J>r^#S_ZL2Shk&4CfZ82oUs#nYvmQM<}J{eaj9bp?G-pHvem2~tx3VdA}s-< zTLr?Sg$X=3DYWHE`NoN;Oq@YE5=|X~#~ih06B&qsb&N1p;;Hq2kS(ZfX1$TCOPEpL zmFI_UTeDi3hL>t;q%q^A_VOGkU{(3%2>}r$ePt9Gv6oIkGZu^l2h1;%@zai#&>vq6&GqKvYU0!F0Xs0x~qlCmWwA!gEaZkVW~E- zzg?P{`A`(Qc~7@IdWnZI(ecd}T%u z^P-zN+!ZBYp6Oe78A24HN}Ap5F(pdSJ~|5JR5QHd@MFG@42dFbz0KD@mU()o&BWY+ zKXLO%px%v}w|=~N>v`FMV+Qw51luzxPdLGT2vpFm811K>C#Rd=>0t98+B5@K_%&); zHt^_vDsROwjO~DJjzh|H>>$LjdiM+94t|}tyiFXTslAHS7cI|$hSkn^w^k-Cmm6sL zZ4Gqst&IatJLsCMfI%(Czq$4QIqUq7+Qbj@^*IR3rx#{1djV-0JjU0-K-gNogl;R7n0srVlK5eD^;;#tCmVp|g{%cFA!fK&k+jCof zT9FU86!7C#%9J&f>@T8E(E?JH139Q9cCaJ`%V%L0YNVG5Af-~G)9ALL$EzP@lc4mr zIIBrhhiHQXkQ=uxtpRR@)x3`VI z$p|KS5OZ!(iPIlq5l$e~Y};+pf{@ZM*kFbptkjhKY@-$8OZzu{X|mN7XJyhnzaSc# z><07}uEzOvdRXD|K`o9WD9Ulz`mp!X=RX@jwDnbPNtCKa&tt6V(H*2oKQGI>J9#)T+~oYQj~rXDv7y z&DpZ&sl87TR$>oKvxM%RzFD|%Mty9|B*GH)muU#_epJq379etOY|@SzXyr{R$BZA_0WUPp5CMC*_*X2`W<3i%z?w?{<$X_$n$Ro7NBTiJzhc@qQ;J1_{wPCeIGcL<)62ZS^*jTaK0!iXAd zJr!-QA1f<_I6<$cUZt!L&8G9_j6FO+$Xuv5;tW-K$cB`tZT{!$X)UEFM*~Z@;+rmS zEut}2U(6F9ul&=vpr#UY*`IEFg!0zGc-K$e7{L35N+v<*cB*AtW8W-6O18=iZB3Olyf&M{Hi2=?hCL)*}*fV z>QJRbgXxu(cCIR97t#VVrvB)sM@KJhj%T+*luYC`(*%SaI;Cyi?0Ugfei&O8IC>k2 zrptHqAq(1?l<1m)^tp@Z*@?$`?yyn|C@ut@#HgE4Kj1~wPXT`$hGE5v8?iQ)f;KLzAKJB`tc8v5itg+YP=Lm^f`{w4hy@ctGSxGMH0F?iHU}=& z=g(#d4ZLdMWY&g8$ehhZtu#${+TBMCBH2z$xV}u*PpN@HIti3cKml>vbTQS}kOCDb zB0TkrufjQAdoFIgU#5pBbV6a0{yQ+p)6kHzY8OW<|9|G;N|_yk0*H<4@$BEQbl?pZ zTU*XbaTG<23g(z_+KBcU`eF7&Cb-EH0YM6}aLp)Do4lx?&6^HBnoqVDE$;h{c})kd zPLWgX5rm3~RST6o?gF+0mHTReo9{FMgf5&u(xnRN^3PXsCKZ0qY+w$)>u}+s{p4!} z^p)zT;Bp@tp-FvCv2zl6izqHQa$)QYJJTpsrf7C@M9_nndhBvs)qm*>4eM8#DQ!+P z4Y0<%DfhaVN=YHIn{QJErD*$ANQ<3O7W2G@)w{1qZ0XWDg1+Y~1y|taHb-;6n~3JS zSF{eE!en;)=1Ixj*l`UI9icIjXpSyjHWN`2eYcI?LD*5L?lu*8Dq^zyPMyKOO+ZPk zrFw?q2L>TM74dO?8G($t_7&R8HKz#(|ZAe!5QVf~6SW^dL9eAN}5{@YePRPq@pc;?2eL zqZhBi-`dyYA*7TsWOKN4Tza}`ehYF6nO6Ccl~U(#K0H0e3>uR;3JBd357)ay8@_ry#G*s$G z`k0t;3avgyjSi%&KK@X?w*2<-k2Oyg9_`C&^+o$E5@=smt1sKx+Gu`B9;ij(Inb9w_2)FU0PxMq_ z)`X;v)H=Nc-#c~k<+RxY09ahcx;A!22)p92mencgykvF=w2i>Rx3n{hI~>#%VZn@f z{_~56r^gVD9(}YhZ!?s3 zr{-*SC-eE8);6NkHkQ7Hfx;O%PWWa-N)B22SDX`J3KZHAzRn4E36|vvO0ycmJ9$hN z0xTRI`wM#tcGK!_P|?@c+lRz!-uhU zw4omVjCL0LdV4#T&0Lh-Ot#P^^mwHsBK#on-`>t8%R)ic+L7wCeC|XY-j;>qol>hb zH}n3)x?u<8ybCV+v%;=r}uBiGq=0C zHmvzESv2`R@Dv0~f1@3b`Wd0e+^(qGE(tF3isAVgrt2m~SQctX+P%F80lA%}4(gdE zDSv8i>N|gVEBw4eJAp=5rS#@>{aNh{khG6~20Srg;;3QL-oKp&!p4Vp!A}CQ%<+Pa zpLb|yq3?}HJb3H8Z&Vs4aCkSg)3F%9zSr-eo#l>(KI7wGRs#Zbi1oRd6yY(KvkiJQ z{PV*{QH(XJ{ku#d9nNb^6wMrjSFO*Qme_`7@p^n??~5Co?;M=8`8cXP-}~bE=DQqV zS4XoWjfc|wLw{&TNIvs7G>Cp24&9&&jxJs72+=Vw??@l#E$4Q`qp?bls;qR%oE9<} zpY~U=)ud%?6$;Lam#=;vbgU}@a4Lown~?fpcg9YA7wEc*2q%pJz;^Y7v&#w3>Wg(c z=A^H*v#+1c9mB2s@j6^pkDi_Cv_~S*q3d9a!09|%wv#s;{~Qq>{C<^rFH`+N7{6X~ z^DH=2OL_1rzi0;s&+SA5id;r)Exfo;^s9~rtj`@VWsGB`ScRQni5XPK68t`p*0=+rnP_Q^>Ta$#3)g0` z3nfFrYFoTRjpMd`C_^`w_Qp2v_2CZ%@h^0<0ZiB^O{;CLn<+@mkM$Qp(gfJ$kT|fq zV)f?$84^ZRgW5oDil3SRw(3tqE!iUS5R2?Yf|+P^Tf1{S^=?8l4fOqYGik&8GJ+~4GG07QiK4S6q-mQRekawLI3}l<2_ad;x!qwDYv_=LIR#We} zOhRP0F}99gUN&m=fRnUHq`F!h(&obnMDJUdjvt@CIeB%;hxe>Ifu!pGIhd}x?JvmK zZVv&kur=2lgu)pKU#2Q3=`U*p0+x%UdbZLbic||~#Kp!A#4N}*R;#H@ZG7n<2pB`Rewq8(cV;s2TU3I|%G-eL34W?k~UWE|1kQ$G*9+>M941 zA%7fAo9op1>Wk85zG%S#S~Po$Uwo)RR}&|$@WpSnihn_9-qEW^0j?7!_%S7w-(FUJ{U055c9cAlkDckacZ+ILnv zKVH0eSsTSIFpzEedz6gWI8|A|!|Dsd3$yW~ypbUDv8%=eqU}u(qXep0LkTar5W*SQ z&Ewks-e|;B^x_m$EkeXjZG*^7-EvmM*qDEQ^s~~nu~q0p6pFwxZdX5A^=YZO8cBmn zQQSX=G8Twl?AD_U6vJ&Abt|d)1DJUfeRsSPC&I$q)SE%~=9!S>!_*Um zXbZjtfwr3Eeue}M1~l%Dwd6K%-nID_ABM4^0GUKlqE|6UwQz^--M4|KM|2OElc%R( zyg?wKUY))QT^d6{{O`eheea8}_wVlh{=*0`IXmPeA{DJ#ua1G@g7c5fKMWW;Ef`pa|zG>j}Gw_j8#JATUzI=Ji?eps1x112Z zr1O)uqn@9zB+~FxeA2I;y$Gts;|Z~xJtD{z!qaI|#rGgqM3V$TDK=M~F7>Zzezksu z;D$<`p0Z9oJY=}oIk9J7x5oIcps@{&eE0Z}XqrA8FGmcqy^oo~spOwXG9--W3^$i`O>-TLzZ(bc+u#Cg5s4hgZss^$I4Nss}Ue zy=e<5QZa?Ak4tUn3Is3Pj#sG>!qa5aW<&HOn&(??lV*{v8r{btU~SnWOr{5EH~O6q zC}T{Mo<@lQxuH=EQ1lx~tTyg^K-`C<7FkO6Z$P^!$on6P8TWrHw6lZOGi2|4uv|J6 z*J%wSP!eeYsMWfe`ap(}&mnZ(;IxpCV#Lb z!-x9tTR!~uBX&Re`}#(Y;S3Vs{q0*lyYXbgR$uheV37vazoOxynLt@XKm&=fY#U5) z_VPgb@&zh0YfwO^bw93(LL21K&0A~BB%x*DRo}6Bcy^pig#}~S$>huIp4WgyxT8qFvi{o|{tiqqlL*FQ^axT<1XgGPAp9)%p z!`LTWWl&#xqd_jyR%RR!Psy2diZ@OR4EvnQ8=!g?2h*(D3ciZGhmJufE1l~_VkeT~ zDu)5Bjfq@Y>4qZ>NV$LwY8@ib!a=EcAW73w{&tj4ZgP>9X0Y6h1khflKk{n6J8z zBG+Hx?RmHw1#xc1Pn3DiRt@mT$0xCFs#M=Be_9Smp7Zq8vuh-G(3OxJ_NzED%cS__ zWv(|iWG|R7pYu4ZNGr}+^XGfQ;t{DhdZPWIMM1*p`pjt6UAwdPtg9NqLtTRL9`F3P znJ=MdbMiQy&FRM8LP5#c=X=<7h}Irbkv&YMOFUGMr27Qso#$6K5+IyDo)q$Sy0HNRp{>ol9#FN?I4Qr-G^J!n+;)3&6uSxN>SXZ+aEX3a zJ6B9F4wBsETm{cwT-ltLgeT6ZEjBnwU7y8=wXQwc7)HS%`C?eE%rGO>sS~d1$3Ko_ zk>YEg11nukYcJ3n1p-RJa97dhwx&yGOj z+3KfgJ_&K0Bg0d2aM%;Oy2IUL_|ESi+XJoDj zBpKYtr^q^yh)>CCWMN#f(r3O=-S8A+CG}nd(!(K75zNgtjg`{GRLjwYOo_e-^j0=i` z6{n|U=_AexVcVn+8i8L#zLaZ;l|2_TVi3u?6H>P4UavOE!IDsU_1s&%Y8{7Y@7Y*7 zCyK)=8;fY#KOQEXG#sGYwV$02M1I8mMMixh$IsUICyqYoyc;)%@%+*AYpXw9TfOf6 zX_Waw&Fq!M7UgQ}KkdEhRpzTmNTU8;!gJE*t&E03N_-Fsik6II-T_Pv=}&vNG#g`U zAZyRrd8Q9Tnf+5{-)Xo~BOAgS(OiV^r|X`LjvQ5Rr2C2b`O`-N;ZN6(Ck=8;VHyY+ zm8#in^V%u|O1#Y9(DJ0=vsuH@v_;6?EhHsTW3rPrN^J=B*@OAA>Ephl6L7AXb=z8` zo*+Gkqcitcvl)nE2_vqDwL|3TOhFAk)21?X?X5l=2(-NqGkYMhpe%6JyO>i{!4BxI z7_bNEP5Q(bBspe7U{)lZTyv}8Nuk#!ss?D%fT#}w7#?p-eN8)J<@FLZ#gtz^o;H&c z{rdXZ{JCy;(lmt&Fr==Wsws0P^V7=430Ragi;LBtga|31c}n#4IIWsBO_4Aj|AII@ zcWY8bIm23)E^YA3lXuC?8R<#Ktre?AqQR}R0n61$Sd;}E=tx9_B60EJ1vI8#3XNtfaq{#LR~w9{VfPaR8rlHwWI-`!>qG6jg7a zp5CKT`={$?i=@0E$d)J>Q8%xgoZ#wHapl0<3m~|DHo_ouGdCAYO=V-eQ?+A@*NcHP zRCfa|J!BC%-@8S;NcG}lyCSejlC|9ZdV@sE0RxL)^`0?VLOtB9C!zJpG5iJCIYl5)XxkNxoye5QmSHvww}cErm%3 z*R@mRO%*PfIVFKRk3;!x2k>#$pR)~MWjkHaazqgefl5t=M77Y*Q1G`>EacVslIctVqgrcq&WjD3uVK(oh!(7r8u0qy|fCGa0k z_WSWrcYHH+47b5&g+Z2ebeSj~w@iu79<^(!WhbuIAo_5I?Gm<|n5e^JoMhVERpNB- zpkW==zzrYfne9KCo8fNNZg2L)=gl|caASt)NhnG0VFC6MGnAHPWZ4AV^_CD%j08+V z-cJsRtBo8@3_YA?T#a$^XkA-a}dU)mb++fe{R2#BB?`8N&iz{hi_8t-jGk#de?g*uVc7kOLb8k^PtX9IUZ3?c$Fdr6| z6e2y3nz&Iw`WP6-wr+PTq-ePb#4=i-ETLOG93s(lF=Myt>YpJ3d>e7zdctp2!oVbB zjGqS@98NJ1YBlA}+dc?03BhWdIp?A!78*D#f!KJ`9=uC?$y}Y87CNm4-=V!K`c8j0 z+AADx;rM#J?e9i=!~6)KQT}X?rGKC4xNMjk&};*H{+#H2;XJ|=Ey`?x+r`U2YinGbJ6>}a)_baDM|vA{OFhr zq0wnktt3=MYudxX#Ch1S3FyS;*<;wuqvtjNFrmR;FVEn&N6&MQB;S!X;PlBKpD6f@ z>k_z{%CA+sznNViuG@!zQ z$`KdSAQ;WEb2NpS<5XQ40g}QmnGLwu)~cDT$ThMuVNJ(f2DCi6jPVh1e`|@AmW5|9 z+1;u{EaTC0&RGkYH3% zmI@FW8_TtqY&sh`ZDh*)eA(;q-QQDw5DCM_*68qT_!zH;2fw^aQ;A*hG1Po}Q&I|X zSk;fd{$hd7Q3IM9U;AA!nqIyWQ~`jS>L26N0Onu2sc{B35t(FsrsOiHUY25)laow z5!@KZc11o(7OX*SEW%U4}XQ%9Wd zMn)IyAgtLp9XeM`p?nD)Nl{2t5H<{qR`*Nct=Ljm81}2EEsVwXW}u3CkzPY63LF45*t5&7z9gP5(-pgf`S7hz6~I4c05V*g&d4pIT07 zS=rAj>q#X7erRGap_2Nt~984PWH-J`YdD-;JLWf*Y-yC z$9@_xZu8^KHVau*ITq19@!0k2+Jf^B`_x)S>!(fhm$|~!=KY4ngVp_XeNv4#$mAYm zA`7@lZh#z3!aclF;~(eaV)6X?7mgxs7FimE+aJczMlgl4J@&8)$b1UiAiy~I3Qumh z0B72vNII_NJ4eM+up4euL@}C4xTacjBmpX(JlP-Gy|L78 zfZD0C;0;VCX*%L7abF{PTHggXP8SbY)MJu*dO1n8!G2+is;QVbzoPwNGDM`=%XB(6 zUNqRM#=siM8T%1jHx5F6tm!D8yyGZ7pN`_4aqyVEyE9H?3T^*ea9~pHC=K+09HD`K z&{$3HNU&ao`nsrPB4PknAG16c-3kdN+zI6lbZaZlGiS|V(qOblbJZG1nR9`+ZWSZZ z7lf(J<>%$zvR^5h-4C+C9mBPoUnZNiWlvMyoq)-63aRay5C$!(TF*V_jRtJiGN+qQ z4aK+XIqFr7kKUfu%^F~}PEWPhATkJDWR#!t&y`WM$1htt%Sa95o+JQR_O|rDda1++fna`X68;U9l4eo%#!r%+WK!^T@ z6o2Gix0{g#m|8=n-nFt8pX)B_$<+6m({zNb?u}wZstR%daB@1_$qS#+gBlB3IiOgh zkaAoP(;RrV_S{j%Du>G%a3Sr(hZ#mtuSHRCj{2YKK%s$Bt7$6DYT7yHu1N(}z2WT2 zSJLyPEz7GC%H|b~WLJEGkFpcK+`+YUP#x7K#@+BTz>>Wut!|Jj2|B8ap@$+^)7Nd| z^N;3M6HTOhTi)h!4VPM`EP1Fcp?z{Oogsxn)Zf&-x17B4flq})piv8M17$rAO<7p6 z`q)rYkt00yR=HNvOv&FvNJI$@w-6$+M{ycXnrOJeldd(j%QG@ychkiumy%K{j6S92 z@xw$MoJ!DD*;JTA&~~s9R)IG>i>ba0QtATs-nu6|fz@Y@f_rN$UH^0!flRM>HvYDs zAf(Iq*psRU?ZfbCDCpNBF$tnytYWeP*C&qBi3fb|Z~CVy z#9u#D3zz*Y3d)TNZ*`LYvf}>fxBk4PnH95eI0I!iRa=Egc zE;7{h4kF|iYYgGK|JUwfq*#i=&RJs%O{1OKXz5OX?%Q=I@VeHWkg6@cK@Sbmi{6LR zEc8P110v=-bBX6lE~8rZ%SSRoUDAl`tlmy z4Hhw&flqLr&XZVbyIhICtjk>l&ziG@7+;rJmOH#eaREa_W?BA~=wq#AaB{Ti>^{L9 zBS6ELbJZ#1S^kHdgs8CGZ9o@rrqwOsTN#4w_$x>N40Li|G>(yOV0Zi4(<{3`1z1Ae zFQ-D#Gn9iPn$O6w4g9?#jC2}H_kt1B<(c7AdBFNB{?{m-)UDg z>f2>RC2E@13Y~-Usq7EyNHg>BN2f(himI7`qQVo>c&j+zGf)ezBY%X@sOYiZU0>b* zned7iX~l*)e_x@tZPL?|$ed^BYz5m@9o|?~M6|RkZBp)3rj=AFRV?jUvV^=keSs)Y zqg)po+qNw(Z{+}2LxaY`P``luFgp_G!ic zX+^#S91yFWpEwIhKDf%e1=#p#KIV+P-|r07~+h< z#t09*^9N#~t0#oS5Q=oj$zXZKRa^6!sTBZ(y$?=k#c;)sCl{LyG9Vrw5eKBbed7Yg z@_bt+xM|1(5>h%J;mMf*7$GSQorEE+eVZ>f4JGi=bk&n74|JiYV6{K|j_a#{;RBj;=pNWs_NkaMos! zUH@2e##+f)xKQp31urm6o^n+WSsljXkhW`u>7ME7?1IxMZhUB4$6M5&P7WXiN6P_jZrhRndm|@#|;yBYkz{kAdtANL4xQ=QSB5wtAtk0x}dVk1Upb$(SwpQaH^J6 z5a{@bK@AH<`jOoyh_ekag#5t1(4PV?d1OE(4WUx)=CR)*8zkNO)z1SM`67qSi;(dQ z0l^xFNFoUFm@QkpJ~Z3%pD-5$$ArYqvJ!+EMKaDH_Jx!Z5W?^cT?6z@Tt_U#>?=Ko z51ZtX7os>=J? zr?b-6r%!>3bYO9cf7s=UBp+GyqraB}>EAgY|Igf3dBNTw6u|uk>qlp&yJYVoQOote z|NFFd{^9R3xWxpDOJBy@$>Gag^0U}p^F7S+kIb+L)4o4Kt z>fc`?J4M1E;EkAqzWRIC9oCQH57`=$HN@pBkp$9&LsNPbM6Z(M+_2$*Kx%Kh_T_+@ zjQkpJK9q8;Ij~bQqHY@dm4aBa;v7dNyq-GdC@*Y`O=~MI0r|rt=D4sYTj@%$=@s29 z8F~1$BiU9>hTyf_^-{r7HDnp%e))_my(~Qwm{WrOKK85ruDw!Jldo;HAP)(_^p^Sw z-=?CizZyO9R#;u(lw?jqMPfoA=QHZb2`7S=Z+tpQ#+6gQO@t8EK#N%_@z-c1W)fiS zUULgpU)cYE7CJ&;u20yVzd)4e*7bqP#7jOiMVN-(^}Dx4jFm-!B_^-RMBYxpmVUz% z$CViRR*M~9w9q)R;Y%}P>!2Eq^*0ztih7}Rx!NY-9DwX62ugG{dOt4KHxY&-M3WsN zMJX|=g>rt1$e{|R4SvKZq!q=>6*9?@poC5$#)ij+Zbt>u)59ZaC}ndi84HPim~;1s z8tHkc7QvDhC}V+gowX7&r3U}%WLT*h_~I;p4B2Yd8OD=*Tfy1=@?6n-%kp8;lzP!e z6Uygs+ipWqXs==>&gxZ?Q;*nZ}>q`WT*c4&){ z-uj63vE!abLx0L%PsvFF#@m&$sJMCka2|q8E*p^lX&iX;$@qaq@|awWM)Z?daY?nK z!-lIJEq7k)grs^b!OHiuLay@L0_${U6ztT;54TYRm4fDyT3PG@cZW~mDQPbiHDy_H z?;&dudP{6%xcfNruX17M_U4&XaDmCMat&MICGuumh+YIk+El<3`7>N2XUh->?6F}+ z?d*<*FRviCj@G-;NEFQBgN?|gZ#A&E4O;BQBzCzIq9A=hCsdLY?{p}!TgMr% za60{@g4zfiP?bgq`rq($%&~)37j4J^y?(UT+ToeW>Gg|wT{Rue38Zpf2| z*mYgtdBFmi7SZ7gZtN`r1#LTF6(skZpDQ)%RmtygiNyNLDOrsQBiD;C3MwRJqO>h} zDDpeKI740BX+{&Gm3wiZEl!-Tbv-C&HmrnX2EEWGV%82H>XbG73wyv>I^4+2%M*fp zK6&))?DS;)AL^DWZ_PlGavHEmieKo*FsICwt#G4^YLALV~K=5RTg zqd7-<4Tg}j5*db%>*X`HU}Z)D__OuXXNv`)qV+3|zsGWiD<%xv#6}A~pp`xVtJR2T z4hCU}B^h9H5Kzbc8kTOh%+U3$L|_KR@$#~1XiZ%9<_M@>;iuNNfHWND(gr3F>oPT4 zM>aOrkCb+iR&W|2OT3gYPf|RD~7CMl3h|36XW#oZljVf(`VN0};09fdg1=;b7aE~+)8CT^LR zY$ZT&(&iK3%9khEQJ5Yz@+-00Btu*hjcaMsX2NqN9kd%lWf*h1eUo0 zRl9+L)U~F<%xfu>Pdx?k<0Dc!ui*jt9%xOp(bszT_T@7rN7vzy2M`U+LroPz2=dTQ ztyotg18ofpjf&QOKw7j_ur3q-$ItG3{Mo0gJNG|5JH*&q{m&0r#?GEfsIranfBql; zREXm5^3MmeA00nh`uTu|g&sbB@Xie`HTJ-#Mz=OWl_bAQsqoT}k3X{kZ9_sf=cgyF z0nx~-{dDGpu(!DI$2VA8#9?M#(qDjZf|eEqd=wlQ8&|{4a{Dg45(=YVi3>@@igo_7&jLD zV*cyW`BLFu96JpGJlN=e*4A5_(#$OXOb4oO+l$gd7e#!zr07PowA%jZ=7DFdm*Fwi zu7y@62_GpbuMU6mk~i6vFZ;1?a!7->Tp7qouh6^PglD4UF0V7JnO@BXJvZ=%z3A&51BYl9^4{f#Jp}#)~{hLR?wH(N&~4iW-w%0_uc){IdLcq8Chx2$z@t z42nUo*+w}aKj|q7sZ9lbOC-cF`xw*H*(utC?PC>j#J`0OYbrK+qdTt=myc%pw)fNy zs}C9Nwc?LFoj;nh+ z-(D58JOj4s=v#$pPvyqFoo^hg)7{-^4z@~a$}u)J6NlEae|IG#JvY^iv`mOP6H=|l zH?)`%uK;LUa%c#GT+PM?&jFLrt(i6l9pOQetWp*H_8<=H+YuwIBH+~L293|*ho&d&|T%12)Ig@$Q?`Xqe`gMW{H#idi-KY*Y3hH5Qaym<;Q4L z&a)N?k)3MTa-ak)(^|+CQ)*Z_1?aa$=P6-Zyvz(*c@%=}3eDAm=x_C11RsL^@L@vt z5@)K>btq7*LD$q;V$j;m0+Y+%^)w~1-Gx;r-*e9H@de$0rx>eT-UZ6Hw1x~s0A9ek z+1s$a1fa;aXs7CMxJfx}Ro)&I66`$W;&!?a>nJ>`FaZ?6m9d1AOJRlyh)EadItE0C z?Eo{a^~sBA?sUjY{>^@JC&*2bPTegk{cgMMCq>lTrVhK2Xf=E;Qpl*DCAFjx2upAa2ulMU5SHhT+p?!r_I*kq-{#+nmA&H-Q+B?0*a zhdfce7F(xQJXCh7nLvm4`hnB9m}mrB+kF{@GSXYJ{um(TDVmAsiEOTU`Zn)^(C+lB zHwv9-t|5_S>xNG)j-c{Qth%q(!6>=^ug$7nHU!+!;rSXdigU$+)o$={UsKpFpWav- z>ieXH0E{o}71Io53IoR59LK`;37Y_C;8D4R<=2~SAdUNi8SqUZ*o52CUR(Ld$!D9L z*1nT~>&SpL6f>v0W;`LSEXi2eB9P$rJ{x1oIt-`0T^CzJ~1TvRI>>DWhZ=b+TtQDvE*@v9S07c|E0P|DfbCb;bq z_Z>j304}C!yQqC$x)go3ilCrxRpsun*HGNNc-Oojhnqg+PPn;Z5BKy5t>u;I^dTmg zn15}4^Qy0Bb)%HyPn5etN@n-1(V7K{&z^M%JAj(Z5E2t63{ZEzXAzBUg7EV-3GiU# zs~EjElZ6ZQuH9ts&*ennpaZb_@_lW`p~0-a7lTVocTquurFC{WKq*3bl?R=>NJshBOR7kED0vFxy?v^g+IMFv!NQ$Rd3QCKM zh~zjkmu+UzC_Zp6{$sNA|1BH|QAF0{1>Z|rjU#0iWa5gm5o9@ltPGOlxG{GrsoDwUZ`ZA{=C=pm&t zq7>sq@sn-N4&SnElEo|L%&Ly)3ZYeGl8kqzX2k5=T2OltsX;i~EVo?RmJB&JoOnQI zsxU0kxJ08SjSR_b(Y1jW}Hf4u?-`0g!H12u+p1#X?f_YHGwv7hccQEQ}ja2%S3nB3Nu6pNL5*$ zzPo!DVU=pjP##|&Xq`gJQ!~&|8{5fj;%LJnh_U@g(5NKN@# zM1OtOp0fp1kXSI`MQdK-KR<4emV zNhp$zHh^{S!8W5oUD_r|vq2>I+AzsaqsUiiK>9dVvP>sb&Zj z`9CBCG?-445#C}l@|br+l~;xV6f({T+Pbnht%*1bx}ffbK@%-hDHz4kT~ZY+jpEWg zH5vK5I%a8Cf9?y6}TLYAgQ0+!>VF7)_NfN`c z$UFU*;4}4=F2xV=R{l6^lG2YqC%&j_sI8awPW>@3K?5-0~GD)1M zWfKY%uQ*$hp0|Z!c2uv#JEyn|n5h!?k9BS(!9?&{tt`D9;;2p=Oh`45R~Wz|*DUT) z1t^7LlhmxTj3w{XojDEHA1?WuKMV2KEQy*QSY-JBzX_EL<1-A3DP9U*v zXt8t(2;yQ4c~D@BV*O3^CvG7%gnimpM9FFFp2y@wNm~}oN0o$D=2TW*q?QrdPe2RQ zfQNOmBu`m9VwAcJxopKZDbXA~v(z)NxkL%~Hl=nzG_GTO@3i+mprYHOrI?5Wup$mi zuqn7Jtg9#+X0yWntOb=*lB#qH_jnA|U{``QyLJo@jkwof_6&%zlF8hck>=;`ASRq-T3POq4m<~&JFx4Rq}P>ajjmL$dZ6V+a5Mh`mk0Mj&R@2#C^ zR-eX@QdTyur=l=hCU)I)i~+JZsY5uhiaf$XIE!zD56jGh(${{Vq!x}aQZe}-C0BoQ z$+bl0y{(+0K?X(Hjat&{N|9f83W#@&60=8Y-kJQf{jOdR%hkfcX5~Y5rQ}A#6%{dT5zH`60$IoU zs^Jj97S`D+FjAFNQ(7%^cO9lHB(^|RbxJkS+A-Uiu4nC-Vwqyf$Ss?eWkEt%t;A4f zn|74pZQgX7_ueLsq zKhDm>^=~=?a&Vn*EswhK9=SSpz3`-eT`=H6T6?{$izfyXqt4m5$#;=jeJ#s+QRfS! z)O9wy`rP;eeyx`M&cy9DzVgey274ux-Wo6~eYo3oq&wEU{~O^ryGvpDTk#ju*vdg6 z^TgX~MX_-MV`9n2@O0W9QPcd{9;2|UOfH;C*kh0}{&2TkQZ-Re|B9eKrvm9u4nEG?Azokb$mx z058of48rAMArYGvk+1e>Xb8qA*G{NU_FTtJG{*xu$s)MMESh=tBcEk!>+xm!+1mg_GBf)F_OVtW1zB zZG0H5$B=$3h379VJ;ty@s~^l|dH%4<23OIs%e>MABsUm4vh}1+CzY?B)p;7%)Q?Bp ztP0yDgpmUkVKh0YhBljC-aFIzZb)d&$MA)!S0rJin9Y)|AXI`3*N<>+60-po2pa6- zSS6z4fC`kBx~2gUNTQ`wE=Wbq!0KYRjEue~I%f3P&aC zaU~l@jpfMQ&0Zhhr9!#exOs7W(0D5LZP`Mk)DOy-3*tH$%`m)Wq_$N-V)EUnnfPQq%+~{w5;OM0OyAg9AQJkK3d$w$H^Vt) zPq)hV?j1U_od{>(VaW!}>IAM$TE+ zFx@Z966acJR|f$dPHwPbF7WKl3CLdiG6Cv}kA&s?A79X0>7_|Oh3qu};u+f{o=u2E z13zB3n%J~MX18{oy1+`EbXcyJgKj_7O#l4*;Og+_lMV*o=$zk#^wn?CdY8z@_Aw<=i ztZZXdRZ(M7rKB&RYv`;0kIpfTACgz!Zz;M{@mErg3>QXv){JfEg3qQ|3@1|@!{a`# z50-SCDvT>i>HMlE2_`>f=*8YakQ`VSgRxx6zvKOwOv!UW?9bMZyELAy4ID$sF62bO zFy0N#tbV+O#m@^+9Bg)lkg+i|11UL%SIaldkuR`?e@w4Cq4l=bW-=`lhwgTmVEpQR z&!4pd`rQR}VxZPFzF;5}DCcUkDJjZAm0VO|-yum6>waC8oMxmJlxr^(c47R4mc%+# zB1iQd10$2B>|Flv9a8H@RKV=@S7$6(IL?DUY6)tpQc)jdi9x&=Ssnek#yYy0T^r|6 z#>whBv!SBZjI)ZC&7yIFm%MdVds0;yB3NzHOPb@UR<=r9BatfWMe)k!EydOxt9>&y zC5-Eyh3tI`MDZj}w9n*VVvL2_%)|9bpkUx2AJSx+M%k(}!Pm-HMTuRoUtjV*C|mUm zbM&)(7+X_k%bOEzlMLuhq=UPP6MqzVY!(?j#e+mb!1!lKKPsG2w8*s7%MAmNSKI_Mw{i8!I2pv#%28hWAU(Es z4bNCu>*+e9Yq-1CH{-}1U41i-V)FASyTHD*x}-nh!cl&KKjl-K^vtFiGmbi*#JrMr zTo62l>k6WhZQRX@4Lc$M+z;uE;knIN*w-5pAd)AJ%|xh8We96f)3V;RC5q3>s8(iz zO~ie!ZDcr#w2?bM)cbraG^n|qF+++-_Y_h*le)bp#=z2EN2qA16vnq^ualYkOR7|6 z25Vf~^;YM1L#7;ELptnL!BMvea^@hE4`uVdb4F}#1`<4HWiTs{tVgzOwgoM3IL6w26Wrvfir1Bsb9mAgxA@ z86Fi2ZeL(k=0s8(Sw^8>>7%jIH42o{sqLt~Im1#-QcdQ`mWdw5vfEe@z#u~y?*)cM;6Q1js8BPzUuhq@PZZDIGeLPKhD_u;GARFlP z@{^e9m0mJpo;SF5wSB1C4mq9tc(7y~MbgOz(C!jO7sd#s&QCdn24fsKyr6yvP?9>) z)Km8COx4S)?@Bl?Pos-mFIrI+>i1EDYbLrR+IkRPGwM?3$*v=J^hgV(cImEd?-?6m zefj86GETiL=H7Zq?^@!{G!1_2CLJZwb!2{p;SD>VPBgqo1B~*hEzl5WTc~m4V?qDA zW%ClZE@IxvMXR7u8;^({>uj5dhWxCks{XMHVa%)vJT(=k;bIu%tfS)fIeXqs-nekV zLWOrQHNJyCj43XxwvA`!t$`E0YF#u`PzHEiCeb2~RFEAY4pKJh(cA{ngD+_?A9Pi( zMh36E9$7!ikco+=>{y=*cIoiKKK0pApO!JoWrmqD-K+0jT)AMO3BT=i+-cNOi8m8u zrAqT?PTo4lIZx)*QjbIuU04-d-9`cuTo6gYl_=)eex1fAhAwX7lyXyIyfC&Vj1VM2 z>+-83PiYGh1vtDJJCK8+QI*j`wA9KwsV!6a%r=aLOa*~O=sxE$apSgJbtc3T?K%&F zDkmkymo#@1?`GVcJEOBkoFqHUbe+{_*}ANG#u%(jQJFKWk>x47{nGxzjh4V?4YyQlP}k8tisz z(H(rXg2){z;eoBhVp`wVOs*^6PmYD4rQlvsrNpGbsEzP# zPy%(sUJSlG%5*`jMrq){6$6Ukq_+7^*&+wSnc)e%ismk+X_!T(nRB+W+LR<&gT7LP zH03g%`Z_jxtHe3mtbp~w9E;l`sKFr>G=L_NXRT0`%Jh(yHpX3Z+5B!I z^i?Jcoa|J?vr+#+Rzu&=S(MqfVGIiIe6hb7v5zlzd9xFmjh}5xE{H?O4+~6eBPd3k zkjr&FCVg6hhkCKCJt0GyMhU}G@hroo@sf>?5tRZzsZCX>O~QYA7A&Ee4uwQY=*?3NquDK5pt8EKT;zFDJ{Da7R_GHulV zF;}%T6G0xA_6?6xvM}Jy1Ek9qkL7ZiK>IUgK{~dzWUY&8O^hfAPyt%wL&i@`%dBH6 zWbIhkF5KP-LPHl>;7*XD9O@v#e7+@g)lhSv{={r!g7GtdMJ{?vFvE)zuF z1$A)xspncJ3baMGL9LwH+U zhb-b!7NHTaoOqUEDnLD*-yxcX{A2rBlse8GX%SxXxBNAqS?o*ITe1lC@s)qc4MwN17`LrD7Xu=#kY%B=CqHy(NlS!uvY%7f)vC6l@kVcB ztX@r$zzb4IKwm7GNNzjv!=%mfx`dSiY1F53ie1+4UJZT#VewsALYv!>UA%wF40u9`6o zu!y$sjpnMi!bQK;SPSb>lUF9(J*7os+U+KF2(Rf+v#MmbBQMe|8u@v}WZ7EU_4UnC z*2leM&J&*hWc?sZa`G-wdC+^u-YUQ=zRtE~f5;NG=JKwwjM*kOdQ>MECHf|c?4GTJ ze#j)qSbl}CZHTMqMP%RG)KeOu!#2L}w#%rxl+1J&j-?srNlJX0yTZGg0tM=#VkHY) zB_tW8k||L&od0KB$NWJ>ai)8VqcHJ;XwZdiZ>GEwDtmtv4RH%@33+=$=f-+8e3BF< zB(&dvjWMuz;(im!WOX~0DLfhDiW8qehif=sHc(K&MjGW2>`F$aUNTp8!PM2T$Tmj~ zo9%?lwy}|q|0sZk@@Vog?2s@ZB1IEDnekgUO5vojjHeW|CuK?jHa-G#CQubA2I5V>-Q+*!^WtbRQ4b#eTe29udjAfsGiPriy&r#5p*l@f>13m5*41vdX$oi~Ry< z@MG&NYSrFxy6POUIhD%vE4wr9Bu9KMch0_Z%it(^4$Y65f(n$-O1li zC2Rb!$j$<8Z9+8W*Yrw#{`oGRjhQxHsega3-#rO7C@j0S20x67Tx$6iehtYqEquep z#@8NJeHvafSy86W-iC{!+?Q=e>D3X#h{Oi0X-CIIq9$7cl5D!oXZ{bs+}3@t*rM5O zeMg;xrFR+s|Oj{j^O@C z!w!79LCdAGNJFWRcu@wm$9>E!8y%7mS(^`myFsOe5sSXXDtnFVN3iN)4AnRCs{2Pn z);t~Nfp9HwczP5{gzD)qG-eWPW^M+zY~IeE4^5_A(@*wAu2fR$IJp%6tvY`$GbAFAok16rW=0SV?w6|CA-z%MC?|d<<7f@ACb=KTlDB|rQ{M`x z!R9}U%nWhi*{WOSwT0JAf3~Re0;@F|*H#MTS>`<0*t&IB65GV$y2=*MQrgHKUY&Kg_UbQgEbS*G!k z>vqkyGC;$(qk9{N*pg6g5^ZF{q)!{*)jD36|8sR~-LKt=Z}5d$K!q>-js1e(7K3m3FOO?=f{gCZS;*FI7N zT89x^ea2AU7SA$l*6FfZmk_sg)4U+lWU)#)1=U(Kf}FZyxz2vsue9*w1({QceS0{>Lcy z7W+r#HKIOhpg|7aZ8_>@7lkbdB(uS^!xcHCpZHbdX+5WbyWQVQCXw_p&d{1%350xH z-%VaFw*DL=0BA?H+ryS%DaK-@a{A)03vEk?E%B}jT}@(Y8eH5uE` z7Z<&inDJgm#Fx3zJY{G|z3}V;-Gkhr5Ye)d_5(K$9{X$1aesmpxXNu_1UKBsP58b&b^&sR-yJeUzJ_-^kFS0!-kb_-spN6e;U8~Q_{vAL`P_tv}? zjp-cg{;<&Ol|(Fp*4DQqrl`ArCaYxzjl@PEXL^bhIE9N*UbNV?>Hk1iR(x_J|7(*l zf>Fz|dlh5-R1>}UM|Ijq*!EdLAD)OB+c2v|#SnGX%)4vE(Z&j;)~vV~W4J|!OYbPN7U)`%D2{xnwsbaS5B;eq*P6k1XdA2aO<|WvNKfBG}9WVUQPUH8nWgm5EESKA=CTvdWm1G{O5 zL6dgJ_Pgb_x)N4Reyo8?|4=C(7xf;S!jd!;BLqbA4LVaoQkGruZALXj0Is*ggx&1h zvT>XZpqgiAC72{n-U`85wJ~-lAbP|a!2{4l+F*~!5>3TRZGeVBz3>$K)7dJz%#M-O z$xV^g`t)--ut9FpS#gPCXjUbIOjTp$J z-a~8JlV+J{TB5NV$4+O&wC6NI5wEH%>OGg;k1#`vkR2Xt%rhk)c*wH#HJ5~&=6Q!C z8ngE+%)X?4sbaE!u%dE@$6T&WN)D;iP_&q%6(|2<%%y~TMU?D^g-?hWTkOoKFS?g4 zMX|R+L3&fQc)RP!@};oullsP2qu5KTU@<+i+)^QMiqT4CkGvhOr#Ll*iO0C7>g-gc zSzsM6ZdhU2RvR>b%#&_lIRp+1eoa~)lhHLc(i$y(&#pUxRgzlsTZE>_ zjtk{Z?GY>FZdfCZ1+FQ3c((p=+JQbRUBZgj7|Q}hIj>wN7WMb`$0kWR=tC^1+DR#g zb|Q7t9J8Y4h^0|6{r}Q1(-X#D(jZwpTQ=NQK&fPHlL34xXx*Z^CMp08pdENJnQ!7o zO^C`0K@TcK3PF`ZoFv@CWTn>hxFGZ}VHR#!pmJF8KjhouO!%;IjgEQ=kch2G^LUR;}b|9*GH(3*%;nh7h@dyYmoQc1a~U5!?L_9tW;O*<)72h&JrVmO2|)RNwgasT8_+l#=aU7NT7s6d{NKWnRKB-2=f zgZTvQOq3|5IP-N#?nMq~Dfyac{zwy^c*y zY9V(gUcz2m)Ti-LC8eJz%<7ksY8OX8I>=8K&(~_wCb-s)~dh-$c3@XSds$StRB zbopf?g}~)4qCO}IGnMw1$-8R2Qk>3+#wLFJ)ZJT6h9=7tZ+fcdBtC4(?rg0|a@ypj zLN^bti$^fkJs(V-X3oRf;&rx#wIr~O2wkKj%2*ev-G!k!BOREW1&8J#rDu=plro6O zZhMMDmm<;o_Npzf2x~CH7&9!aF;}>sDZ{%+cf^tBAX&JMgIfq-VgbAbC0P(?#wLBe zOTtFBaJ6L?-LM&}WP?s|T&WrI(Lidb^ue=f`Eq0|6&icPa?dF*#W6BACa$t2hg3!d z+^bPyL0o#&BOgsr_=m*l9mgI`s!%4Fo-7N2BZG#!LtutIXS%xc1IW=iD zvMl$O-)Z&vC89w;GvEU)`I=;i>Cr@*x-3NaJP}*Zqd`KMP{R|tP?wo5@l(w+QKwm+ z{zA%HjUMg$(ol+g8f?hO$l@i$x%QtF`(kgVNsw(5S}I(weY2%+zDQ18Dr|Xy;WeSn zY_P1%h|#TzP_}d>kfMx;Zi8kLFm#JE2bP|;V)4nV_*y3z21qHAhFKzyR;9DYe(qw| zS`>eL)x~_e>p%H3Y0a2!c}`8Aa$#<_Y<*jJX!1p$mR^Ve zs$1^1qK_3a+GSe2z5-)k^-GV21#kWNGgZRG{Ns{0|LzI2jEOOY6yLNjB+7r-%Wcif z8-J$sl1=3V>s;EPRJkc00;X`gGgyo!`W0~@D*OMgwU17hRmn|WHyS{(QvUZ5b++_s z>~-may5DJa^3?KQ)nI_7ckIKXnE$Gje=J@S3J`Z$n4Gg&5N%#kj-*z&b4gBV&A-H* zA80Px(R97UYhpoL1FQ~SS{Z)+7ndsL#7c$}WkxQkEi0R6F&oC^Og^<^%%s#C$_LkE zL$(mABhOKCqm?}8>6S?>w}*~kk=GG1VNE~|X#<7m41-9x2k;RepKVE^p`NoQJEvxQ zm5@rgCX!))^2}*#)shNT8!`DUeRZVivGUotZAdm@Lcc15!J>>syp}uCERKZ=nyfsq zg~vDre#i#sq{Dub+xW`VP)l#>b^m2&k<-DM)2C-SBI8Ml0YTW^TVdekKHfiX4537HQDxX zHd-k(CUK%TRm_v4B61LJ*|wF%c#HBolHiNfiepVz;`!~ch-Q-D#2}-q9X@@lM8~(3 z!!0A=C6hxybV#yg8Y#=YfABQ+8i8sGq1CUD1`J?9rYdL2SWdfg0=m*c%B3HXs!d2( zp<8{8%I8BV>K~v;$L0mEt~h8|nN+6Nn9$@`V*Zuf@|^ebxsi&Qn=c%_Jc+Z<7kP!i z*=Dtvl#J252+_OE-mj9eZskUzW2D05v}%1fzW-=Zv0PMnY~5z`HnU+itn_x1aQD(} zI)HX^H-S`=Z!4B@xKvV9>qs)jK~H7sM2CcZ$KthMX(;JYi|4Uv0M$78#Rax!<@?Axr_|#^l1J zjyVS1jb*k`R6{uU*el*geFMy{#@A@M#C>6UQS_LmB?j>Cwhi>Nx?O(q zn#064Q;&>`y-g&@_DYNO4NXyr@vReZ%+)O$g=2gsPVLD4vqSbR6J#_L8%Xn%EJt&S zn(0=~#i;9< zXh`DbGeF1YTw8VINNz4tvQlF=f0a9WwFi})3Su@3~xdCF?F(zAQwuY zsS#T=Ls$a_!hk9}wn35m_MWP_W#bMa|F}>_glJ5bEs#-RNKpGVh9yG8C9vx|$7&!| zI0B4RP*UZ|(WY{sNlxX>VrtWO%ty3R357$6iNpk@aRn!t zzSjG;sXt-Unk27O3&v0omrrv?Lg>W_LaoQb5eK}~SO}XAPL^EEOmpVt3{=Vr8K9hW zP{p9P1(ZISEAP=IjOb4 z%wyLuQne}Zx=I73viNrA@<^M-z*}UpZFG$`n5T^CjBzqrvjf9b(ZE*VaPpCS4mRKC zoBz7`WNTVz6P=SMY7Qa?ZJSg4E@Kns3<=wEZsqj0iOs|GOr{O3|HGGj#Pwmh_%RF~ z6oPW01U@^b$q}6g5W)=0L*?SB;r4dSi~x-D2S>G`N_-)6^H6sygTks~9ZysbBZ7>R zW@xX-r4UD)vcYJ@7PF(Mh7)5n-~?M=9H&{X51IbWj-vmnXUB+cCxceQ!3eGV{5dhuVoZk03y)UhPJMy z=`|pr4A{_Fi6tL+#j2$3ZY9z#=ow+$F~TXi1OZvO@yjC))eoUeV5NZ|fJ{74zv}9w z5Y$Q4ES|wcmN#n>=HAgavL&qN7ms1Y>zIhXm`)R7I?Vwm-U?gndb)wc-pUf-+!y1j zZ`qzUJ#ZRgHA|d_wkYVs8-*ZkTA4R9w;#$~=P#RRwG>efYC!z>CJhu<`qt3{S(9jLosd@)qy=Rq@O6NQ`T^}p zCB60`iZ<3hi#u#q#TGT(%wFMiE*k?Q0xC&2N!dEM6&)JefgVODCVhv;*vgJ^(AU_wC#q8h@h@>9iK$(kB}HZIn#Mlfx7(IDF5Al`ie;D%Y#V1|a3t3@7NR2Y zs(K~{L?m5f_MuwC24+$cG&c>R0Sx0~^7q|$l~j`b%FjZDygQ}DT4a`~lrY?6;xHv< zio~>{ijh%4T-s0paS*&!8zOXTEj83TR()~S#30K(C_Dn1*3P^oHFpsk9gnrgGw)CI z1Ba8E7=o#}tONMUf0?1!q@2NEuT~v*!7ap|ZFaLPf1d0jE01OGHfcTx%RhJ3KXYtw zgcFLzFhI)0TvLmDkVaYEI&**3q8dJqP`p<5Z<;!+Gmi68RBttPL7Qh$h0S9Kt?(}h z#52Y>nwV&iEDc>213}6dxk>AdYxSK`+g|Xlt2eY|aAsGPDJlLoGihho!9w_e@>!%5 zDi1dpkCekd>vs)Z&SL?wDrKpAA%E>Lpfnx>)EoND>XC$`0eKmGu-?0C}&|sH-b2*vd4%v%m~>jnoz00>?Rp zgUa;Om>(+E(4lxqIsrPVE5){uig1Z;boUTSxnhE);M-Bh+C?EEbxA8~T&=>U+J{Pe zopaMroi-I&z1^CXjVxzD_n~jq$=1$K98w^OsqmIygf%ANk1TuGmR2_ zHFOEJcGsERcsDh^g+q_fTs8k=4dg0Nt5(=Ex89SpEeSs>TbUpZIFIcg(J5KhojltY zw#X_YW+Iw#=L>_CU}+3&)HbSl9p#S^`vrBJDMWFCN+l<6)ZJ*+@uAHc_k}%Id8SfH zk|8Ns^tP4*IVGD8hiTp?4d1Q*DxI;O&1J$K8x8w9?vfX&k>1lq z^l{4sT1izZ`!qd4s}AIh0GX&rg&&boE-OStqp-zdqk00tqYo~8MYL{37t3(59?Zf^ z(&WG%AIB?wD}xW@L($z%_0nL_#IY`1Wk;mQ=HjyprBrwoNOs;jj=6$a;t_BfrI{PV z&!UcX&Q5}ld%`pzcSLm_X0%`DX>yS?-(t0nop^DXfPihds`>TW?_|P z&iRc=N)oM6{7T1%DROOk83qWVNHU?ENEkeE%AA%eA2m4{)=nf7$m}OOd&E9<+3zN% z4OW)z6p39^c1xUQw*L}0Ifq-Xh7wpRNZ+mQCwz2LwW=;%zIesJvL%YljrNr7*B`5X ziVgV0@ftnF!Lj5&%2cywj0|Bd8w|Qh!9wlLW1P$YOCto#aImh`mAWb>g}0LH)^b4? zHXZh|-HW5!*#DEu!Mw$dSxYFy3{v_cr%IPgK02b5o{3DmA4YlIwGAw0+~9Q>8Cq|K z!nh79ansulTZ|esYclc;9yXPOpR&>+tFTiouX5<|Fs>>c zdDdp4TX3vvz)DNT;+JkaNqVialpGLyM=@X$B)S5F!RH;h^oQukmF-?H{A&2Eh9!Vh z8hKu&qh3f`C+e4#50c8;LL4p!&*EebYx110W?6NmWBS5MJt$b))?GWFje7iyQwdU5 zC#|b3*8G=!8;CrU22k-1GPUbO&bp+m{630bM_^iV0MCXax@*xAj$}9WW`sD=Xw!nu zQAU|$FncXaUNmj>UVKq!Ue(HiFcRw>>UGwyv|gGwnV4bJt)vZ|>&2B7It!*fuUnKe z(z(=C0-;BwRw_+=dD#dAF|N)nKQv5G!Xmco?gNbO$C~rk?~jcq6 zM5?m7U6N8Rdo+IVVQieA&_ixx#a`N~7xN%eFB-3#^cQD~aa1;FEh1ERg$lz)sQI;&Fy#HJZz zndJ?uqM_zxG#9e_{N%>umTzp+m>qX3q_8^4L*(Vl z?A$o?pa`~O1@`+I#!IQDs%m+-rFp3s$9g9V%gBs~%5i*LGezQpa2jT9XndSj5oHE3 z=WG^O+jK$)#>PC!AX!CS_KZWTum0~7@v9-9wkr7 z23^C*jxqOv8JAZbPRb@d9At<45Td={1gPham{D~QpFB5^B69|cDxp1+T{w_u9J+DX z8l$9+v{;-Z@=~dvV)=M-PBxc&Z0mv9wBCC`G)a?c3K^JXCMhtalVGul*(8u7e=IhW zX7T>ptYk)TnW(AZO0{PNwCF+DSa=?wLoJ3Vtx=>|CFkV0t39S@0O~`tnK{a+NbhXnqj@x7L@}QAQ!Q43Hce&Wb zFC`=PSZmTsi>8rPY1gI4?L*V4y=Wsgn-QGEx@KaL63I|BM%kO)$a8Y_VK}DYw#MVK zx}$v@Oh!`8eyXL%D&=owL6en;Vn1>xXWm$*;9JOP z@CSZYZT8yYt*aHPagI`fmUcuyi}6j*%X%ig&#>03%I`GvNh*13i*2!o z2C%e#8ieNtJue3?h|SHi8rH9})Hlxs*z$w6@-PD2UP%+fI0l4S3&i$PZ@1>o>JaR*k}tym zB-*_yo3Ab&O3b=oasLeB7qu9i#+AUSE$$bqX&lpx-883M&u{|}Px%s!8LsL=|Z}qvxW@w zj5$i~pnP(WFlnd|c}ra4*Gj%OCRxmEms{m!>o>0){V7Z*Th$;-)>OQbT-?T8&@V~) zG#V|%ywA&tyi0@RPW?XX_-IFS2Q|;o1DtYRR>P*u>bkR}l~vS5OOh>WYYRe^lna!G z@yre6(ODuS-0hN{_7b~o9^7vHl6C1Qh&;eFhAzZBnYFN)fuKghFrNCWmsK>o)4*PVU=0n^pcS$5Mtd3G}LXF(_^q|E$+pRQYzKR zDk|!)iUEH?P->*$?*x{yi7vfQ8P#3A6=5!4SrgI^WVS#OQ+#pQp+J+gHq8`cnyk(E z!XKx^!dT$06K7yToL{MBD5CmaC6Ab-)tbAj$JQIk7o@y{qcuL*B5%B}WSixZ zr4?VbJS=y$OPNDm1GLCN?>wBE`%BizDv_#gHf#Ngm`yr70B&*|oIy#2Lph{ily*7G-M6!s!FI z1Uc#19#5q5u+$ZcQ%$3+B+`bs7L&_c2JsBb@jb#g&AbYd)^U?0O=1jUHh*@nwlnXW zKhI`L`FK|U*`bs@r*RtFd225m+@$hS!c`Zpy>Ms?D+V_W_MCx@JU($DQ#_k%C#ZlY z@UZOHZEKn3!=}MpBsJ#sICsS&@3w3kM{=Ux(SttcfKjt#Rc+xQ&xuj_2Eo9UBHM%=h_Zzl7CD40P7Wa*yQ4_*k)I z37WO1zh9L+W$o56?QcZ}sj{1A_>{v%Hk!Y z%Dr!E*erSuj%?7mgc~;#ag&&5@yX9U<>cDYGg&>gL|e=rEfzhRerI(m^FUgyM6NN} zH9AOGG7UlMF*Y_3g&wwQcmsQ*kA^KjVIO0L*_57yYbR|R)wxd;J~4hD@?{l%j^VYN zhJ&C>>@YyLE~OstySU5*kx3$0=6E_f32$b5K8>Ja?Rsm^wKd-(HsI2*r#Ejn>O9U1 z7a+56#0{<;yFkp280??vQgAL@ylnaM+VZ8REsk8$hY&hrc%03LR?xNs&^5A$Iz!Bv zZX9~;;nULTQ69z zBegK3RZMf>AV%QYl%LIfdd?VvS#gr*;-n98cKqNdtuc1N1nqhUM>+N0S}Dv=i?a~E5u4of_I!3Yk4vKV4y?HR$U;XybYFX`}F?IS=pC-iIU z@P;s$Hz~~n)P>&)t2YH{qfV-_Y&4X%wgeX$f@sS&l)Nvcg@w;x8Q$Ops$kh25SW1* z0}DC{adg<4ex*-ND2k}2x!}vfqcgx<}s~$Q}J2yKt0-mP&`ZJ9HCykXka5(8kt550eW2&+0=qAHQvU z6B~Q1qisyBBb!kk5+m_c1^F7-!~sdTnU1(}2$z)>iy?QlZvsNy>27W@IvTDd^%H7~ ziL^nJD_LzYdQ=-p4>t^~GWB(#Y=1~?5bsspe!}p1n^cb4QtTk>Bhr9L1>&~})(bAa ztdFa!p3GuRo$|YQEqjMao+2CZ62Kzy%%ijVqy&OulRANN4IB|^7n2t+)|o)F=LJzT z-*+Riy(kD4w{0Tm48akJHaZb{iG1F5g3UPTB|}im6JmgE#YO%ANhgKLIIIQZAdi7~&8R$?z2I0J`PY^qc}^hgqRW?`Nv6*0niTN9mm zG2(f6SdrUCMta3`>epy@vVBb7bEA((QN`L>{p8i>h5&KaEDI=4r+OUC4@;ss( z4J289;*wR*p@}&9CN>Zvjf@iM=3pX7BD$f_-`~?WD_N8Mi2rJiRe@tOU)o6*qFB6> zHDVB0;*OLtIU);sQ=^$&6JO=RxF2DhvNKB3*Q~Qut61_1PD=K(g-={WdTncS=e1;% zqcL5{a$ab>$LxQg)HI!K-OzSks!3k*ALH#|{B)jRuY`a_^(UWeRpks_F%J*WRH33 zO9MgyXZLybCrCGV~sJ-g@VyaprywK>Ld-qGECGiL*l84g!~CiR)u-9Nv3?wsy< z%sMpr>0CEv>sn%j0vXJ-_X(tl3#qlPE>%z|X32G~+rc(fbmp~MmCKPH) z>z|wson|mV20tAhD$h?z$QQbo1hPWdCeTdaX}vZ?NDG9^3Xpg+Qdkj`7s6!D9DjSO zQx&Ssd*_WW>E=8r$zd@XU*)M-K-3?lvKH1h{yY!9~*OSdL^YH zkB*GG?%M4B?m4rm6912H`cD1D&ZS0xYy&;Y-Ji2v{zhjxu~Q*)U(Z}Gd9=V%C+h3# z>Fe*FH3v@066*BmbSpAGg!xB%A*jbD(hbH!cVD&lrT05~SQ0$Cj@?h;7T%s~Z>QUP z`4Hd6c%svK&U<+!-lo{Y$d&os^JaI?SKq}6^6-9m6T8#a8H(#XS9i9T0;g|Q)5Lfe zQ<{N$-f(%a@YR}$Xg(o`}u3<;)v=gPt&B<5BM)p?>3 zJIto^&F-GnywLtqr%zXqC#)Sw-NOheNy6@0s|0AL%5#0QN^up14f*#~%a;|F1o90H z;``>CG{%`t=ghe>d$(5WH0y7~Yl{;M6OWf#J|60eD2)>jFJ^iVoss-RUu>xVaN3wkL_ zYHnTcQ$np$V1&zpjkPu!Op-OLOi3L~W1owvq$Ton2W^NKj8YK2(LJlLdrn<#@-$T- zR~Z>+R9I$KT@~Wn@y$vZa?)BrZ)wG=$HsTl-_F?3^r_H+I4K03Gdn%f;)AkR-w!56 zV6iPbd^ndx=iL78xsv6I9|#AD!htip`{#AfIvPD?x1_vdZ|E;ONY;+_AkXsuxh)D* zz1->Nw`>?3Uo*HtA%YA_ZA%0y+SnYOF?agnY&S@lcM?sS>b)|nPClxOLx`llWNtVu z%jYKhRF}pW3ZYNh;CYk1RNnK~E7ER$&s?Ws&@ko0O+R@GxtN*jW`Nf%6LYg?Hc6oJ zy3hGX>$A_BUg>1B`F%6dr!(s)+ldze1JsGH7f=`SF1kq&UNLU*IkF`DL~8yoYf`et zOPwn%2_hGnE?GZ}L&9hBJ(qgP*eOvVZ$>Vi`er(Dm@OLGfZ!_A!g6WsHl6OOsrAk2 z={p*p_xwi*{TfC<5V_@MepAZU)X8GBKY}y9jCUL!IT~Su5^t=eUkMqTh0r&r%o)0} zN1<7Exu~ut!^`+~Z41V%7tVE4UsJ`lmMJO5>dWCF6NT!dbn{lP>AGjC z(SCnlkavuDtoD<=mffS~VXWqh`b}4ovvJ_b*@KgQR5{`fJCWI}6w$Fr3Hul(_4Uil zZLCuMzNRU*;?vXEKo#rnp6#Me@n)-afVPU)qCyB}td{7e1&}xoRZBgm|b;ThG zZ6y}?r|xEpuhx%z?=g~B7hKWe$%f1JYBZ86vOYAs)*LgyXx*Tmq@|OjP_u*@vTlBX z`m+$^AGx?4&h5y1Zg z!Kx-jZMf7qz>_F~wJbc|MrUK-i(Ew(Haw{dopz`x8kymd7c@@3WRC4-CUIx9JES39 zl6k(&-E7&&B0#cjloP28yuN*_W`r35RJ|*SViQD3$jN6usMM1Xr3fJeaO^{!3N}vi z%B_H{!}&-_ck5(Ar$RT3EUq6l<*zaK{6^D171^leUaQg^e;7j$W9cx4&IT{Zt1-V7 znf%2thNQShw)+gvbkOpF>{?28t5s31Z0fr5|@2ok_ttLa2$3R%_ZS zDTB__y{Y}#QbNsXT9i)3Tfro=y8AJ&T*Oa|^qkLZFbu#A)2Zg`NI8TLR)buT&US^E zY@uis)-`WT$KKZ|aAI&m4ZPTzzFAx9XYMs?b$hq2dGq%xp3#_L_LpksiYzo-gGbc$ zf+}R**5v5SQi>ltUyvozdgL7*?=0J87LLODd^ATT^SEihj0ED-A{jIg({+Y)VGJiyKW7TgSG9?wVwABue?$6TsCa6`Q}TsZ(BW z)y*QkEdPmZYtTNLmdevm$)c+QCDxS9d7VnLC8tkj*~wL;0d=AR(BLjQ29=7_CS_Ph z?tH+~c}8gY9u5F?ZZ7Lx_o?%OL3KA1Zl%_uURv?9MFDmtW6Y^n$DPE^$>PZcdK!}i zE3LUU>9kl$b@ON}p@Vb`58i~ebw#ZE>aUK_YWd5ed9+kRx7Vfh3R#f#Q<}y}zC`KZ zTgSOfN6z=n3~c1r%jzGEK+wNud4Wzw*^n|*olKN#U87EtV(sCe_5)$ofin%Z@`wFB zC_y}jNM+(0+kGh7i`Da-m%PbhX`aDxUobrfcM#Lgk`g6+`YPta9<%?UD;Ga^>Eq|j zdqU@FKJCj?%*kUL7-&3)37x=z7Oxh^9(wCxKV0h!8O(ozSMU+M8(&RtKKA^!*H10} zqHX8XE_!9}8^6Y6-Gv=Rv7p$mc>bY3IN+e8iptO3`+siQCptdC6U~0wiq4|wcyn7( zOetPu4?Kb2e>&~4#WRXM{7fnIefjv(b&oBU4-2gwEt6-1z_Fs3QFOGeKA^pL9DhIg znD*k3qT}F{z|~h@UF_Vsvrv*dfzswHAAtR>Uf9Epow{)l_f_UYtjrzItSGuVE@^-L z^yf{T%I5>xFKO@U(5D02uV_DaipqX?F@@h9ZTl6v-qx-f=u>AqzwF-hwhsF{rR_2H zcN(?RJMC@lR{O)7<~y_Fvi6v?lGdng5{Gf;?v5`QHCfwj@AS4E z9^Sca%E41rkMfZE3%)?doZl{Xu>2Z>L@}?UuHY_GYqVX2;BqV%lv}yqDfSWy-Yfj_!{7 zo+X*OyZy5Io^?n=Bdm>lygzUB?|)hQ%#LY%vU%P*f1+3;NfQY*L$O zA8+jx#en^-Fk6+k-ux6E%6|6AEl9SHx8R5-7G*;xtiMp@t#|H|ThMWz+|r2fkJpJs z+vmerWF_xB3Y#n|fJ$ZTiI>e~6#p?HzxDpWwYyn~hbDYrm}hYDNz}R(X5JH68D5Kel~x zkHXcAZ!ViUb1xo+EmMn!_0+lc)E{DFy1zw!2e&chOHn$fu+BGLDW>_AzO&^W=-uur zk6z#PF`kX`C`T(FpWRY9OFzT$V`H0`bf^g@$~%i69(Y}+kCon8 z+-9Su1KayMcTX4D{=0m9H%{Hzc5!F%2ld@49dGY^S=%?8_T3w&(sMgYKf~KQ|D~hV zlQ&MixO2;X-pjY{_x8?jPW`6&+gke#Z<~H~aohBrZIjD_E2bA6S4_WpZ?a&&+oo*U z@5a64c*XQB`;k^>y)1YfZPUzC64}VLqU3;lDtH--MEG;Id&DHpTuAX+|)C29^EmLosBB|s-3|-r21gUjy$JNusecKl-jB;$+ zar=n|nqc#?Ts`gTX)4R&B?DyZvhBG2RvOo`d>sF{N_TGOZPOpmCkxbI1>bhIaGCHm zbrX}9RPB7l^p$&QYdv-FetUaL+^`c(HF=JD>bAW;wFSO8Za?=7x8_tmb=h8@QcK*8 zw{P-t>8XqN`joho(sxdtmY#wVoqN$VrlJ13{n!V!Pi-qky8h%K75Q2FeekfO`MdRi zFU`>R{SJKml;R#3Y(Er48{$zKQhdIAmCy3+E?Y9dye_kR_w3p8ywnK~I%;1x+&6POlM&6nncF6Q zwm9CXo14jF3byWD=hZ@YyYXP}Z2P8a_f6Hx7UJiB*i`NG#-HK=yEduLnt9irJ^Q6j zbmx)#x=~T=i+IRliT;OmqbnKO?`52I9OEw!i15y`FT`PAh(q&fXsIDNwiW1Cb<4Mu z$zMhmzwq~a_H-pCTi?5n&5B}Qw8KsqsX3eNlUX87B>-e!c!ONjO@>_!glcl(kC$1~ z_TMM7_Q|ZtqW|{EtbH;oED?AV!e*f5A8luSuXCTw+9$L2$*ij(!Oj+z=02JA|CY@9 zyL~bXmfSZs+^LQU>~Cctw3R@Cz4)^(Gxx6oPF(@+3nASXLb@-6bPu7J3hMsj7N}nR zh_q>3*4kd=;kj!!*4DQ47k-VPx_9l~v*-1x6ZZz4u&*2M>&E-K@&Ao(d?g{Jd(pYa zS!ja-#a-tXbl-iU-}^$p_l17%3;o9INZzd5_Jw{!4Vypx9~%1oSbmN2`<_Mc`1hGZPD*B4-##@{u%c++3M1`Iv~Pvcz7AJ_lX z6-N8Ej3aIx$?*i`uPh4CSPX>p9XM$&gBf-&N0ayz*g13RU zgWHZTirc|KON!!P@L_N{_%!$o=znfe%mK%N6Tox9Nnj;-0ayptgNwo2zz0sE{NNh! zHE=ihEqKcF(OBTwpc@hzrZiRPY0keXgi%Xf1m?Q0iEEfVBr}>u?U<6UJT9#=YVs;4)9WN_?boV z3{V3L!6NYIU@U6~Ei{Q1QQthl*Ri!{2|? zr)$6PQ1R)HK2*H_9S;?61Ea0R#qd>woX+yH(6egt-bJHb8Re$e?E^a?oljmS{232X!BgO`KL z!6(7j!8i2%P0$)#3BCxf0$%~wfg8ZTgImCZU=KL-&FBJf-doW{;EumW&%C`TUil8> z^gEIJA1;cqj}*n+kMRuH|Kse#3hw(vQT%W4?a#6D<_qvExao^U@$@h88GIIe9^4Fm z0PeaP`3_!lEqn|<1pW>@{%b|?sc%qTaMbmLFn$v~1U7(;;3{x0cnBQ!EqD+_k@U#^ zK3F`6uDHLr=RsKPH-&!tXMX$tdx{5t{ot>sw<9~?kEtCryY{5uciVB&0VY?tL;pWV z<#-c#J9sBJ=SKPfcoX;p_z%!?6LJ8o25Z3U!A0N;;4wENGr$M_gL?jeb_Mf)2%p{p zO~6Iq&ERw3DsUV4DfrNjisED7E8tpi_>Yk#x56j4A@BbaUIe#*Tfql@0&n~j9Sx@a zjCKQ01y2VjgHym+U=3Igwt#KmBJgJL0q{}qEpQ{4_jBwC@Ylb@&HRH-Q;yyKtf;B9SfJNNg265nctw}0e`>C!B4 zKykLpauv7*{21I0eg=N}8~PA<*YA*T;A7yE;7afXa25DIxCJb{rznmC@7P@wmw*@i z9(e(_gO`Fkz%Rh`J@h-U1S|tXU?aE;{2ll*xCZ}F;BAMt6_2Gsv*2IAm%ugP zI&c&CKKL>CDfk6=0Q?^8H`rGEE%+F?68tl`9^3%F4SooI0&WMt0KW!bICA) z8{w^s+lni|@4#!`-d0=$J_{ZIzk4U;1uwm%t#}!DCwLcl4|uS+|DOB#t$%kHcRlQX zcNe?Dzx(el^8a^{%!9?x?m(`2dmrG|J?&qxS$L(z_w#noIN~go>3!fY-VHs#CEylt zEBGC_56pWH{R^A{&IE_PudR3rmFB?>{)bV2gire6{_99T4^Z zSt`>Irr~<v?DJQpMV3HPiFZdMbUfEu}1-uo!3%nP67+elM z13nLm|BXB6w-{}|{FVOP`?GtC|155sKiKWI z=?8n;wzao$gn-Su(#31^b&K*$AKq+CxK^yd0+wfo6YUT2f?SomEczJpP+9`d$ACV zp5I=KgEzdIXI|4@JoviyV){k2-<#TtW5I{OKY)J%SAlE5b>MdJ3-B9oKX~GssXzEr zFaw+e{`@VZb1`{==Yi$mt#9Mqx5ICjLMLzzSOY!{J_FWY29JU#eF*-L#rI&c`}EoW z>H2-y^=KLD@7>@*MgejU=GQ$PUDwqIVFgKj_5Opa+~Jxa+|&5)Y?b8&;QGIX&L3$n zjsRWYx8NS|)Q`3ohl9&5Z!bOumVX?Ye}d~*wima7fBrIU{MGhi=vrv>HTdA`?Zp6i z2^a?xU@Lf;zF*&7oc2xV^)0@G+5ZMjz=y!Mz+-RV^DXVg0Y9S8gHM4U{1OZH*X_k6 z2XqvdgO7t5kMF?7?kIi?{^H3U#dU{q+REV_#goAi&tQ-IXLc0Ne0E21BDe_5{?m@) zwizA8q9Z$s*LQamk6F@DECXL#-ch{bl#b%`fe!qK9mRKE+)_kU#?$!&qB^|jr5(lgmvt0x1Gj-a;N-vPC^mvGf#Y7+QGDaCI*R`V zKKF)>;y2eo2e9Vaj$$p?05*d2z$Wlja1FQ){42N~d=va0>;WBLqkv#4mbdctC&rD$n~z zdzi<0mXE;G(Qm(Y9}P9-XGPnV+8z3INBZ>h@M*QmuoYYcE(h0wUxKNRVcrUy2`&Kd z1785Y0(*ew2@eP7g0)~LxD(F_yK$pd>Z@|9C~O`%mT-Q5%5-UIrw*Q2e=Uf|iF4?uBRMRXR?fAzDbKR>yp z;qv#tef`g_{q`-_^Yf+aul?tLz824x(|#&FgU{`1oA9|K`#dH4JS~2n@{ry=gg(lf zQ`1#^YyLw=iftV)6;oncH{*n5s@v7z&_CtWHSlWiRq!it^>b*SuA(>=oDVJs-vc*; zAA%o)2f&gUMR6kd>XFRffS(-2Tp(E8P1^&_55EO0?4e(QzXcxwdq8_{QQS6@wgs>2 zqxk*I`+}XbX*ckG@YXp#zkL2Ye9zz;%rD;u9(N4$sNhTBD_}SHJ$U-D^l|Wfa3v?AVQcH@v8`$M{j$%AOG?ftd4Okgjxx@uOzDd(ib<=1joZU?cb|@D6YZcn?^45;_LF09*pz1HK5Z1G~Vz-~sU1=hKGZ>EINw z1-uNr0$h1Ab2&is+}{OfFGqHPi@{%m4}i~s8^EpLKJb_o%wdAVz%i#FqrhVDV(^zM z;VJMo@F}ocKlkd_-TJkA_b>d<-Meq+%8&WNb^hP1%l=V+@810#aJ#PE%{OlF-nYKP z_l!Si$JEYzZp8~tC5dyxFP)2W-ZE||PF2~z1a1Sr0(XIRtI+3Q#{l#Ln$Mqhy3gM~ zk-tv{n#Z3D=7VFvLh$F{Am;8L2NnR$^J`B3@H3hF03QW^4>Zr*4~_?#TYe!p3!Du! z&%6~}3$6n{KMP#~hF%O`fO+STA9xvf1-Js-0Dc614-QyO8Ng2PDsVXv$?x5L*X~_E z_^y6#;OAet^!Y2l``z8UKCDZZUAB7{k6ii=UBB3H>F$dmntCpj68*~lN*g3v`~9oA ze-KZ8_ncncn74{@b))Pvyz3&Zj-D zIPAu0@yP>UTaoPXE%jP*3O~x}s{K!!#`|X+@U+(#hh4RQeE&oCe%{k_3DDU7^F*Id zfZDli;0*q3khTF`Yv_~U2Jjs)e=YVPn6?f+0JFgWSPNbQ-T^KFFI|tl2tEit48E`d zUfPHp2Ok8V0sjp4fc9bd2s|Bp2OO{o+JM8rGr)P^D)3YA*%9XHz)j!*Fnu#I3Sc2P z4x9mA1h#^AgO7q6z>mRyf_p|iK0t8*-C!wr9{4x#BXApd5d0Td^b*np7fmpS2M*gx zdBA+|T(BN&1+N4j0-plLV0ZC**X{T2z7-C-b@zXOyATQf?cTe%xO?~QcZKiq`dzzk z;&OQGTYR{6_pSObK1l5~wV1MJOYQU1#XVdvHGgyNY}NjCTzd!RmCF7l@J;YT@M~~4 zc=0y$H+VU?7<>TyBlsrxF}Mr-7MyfGc0IW30_5d(-rYgG1$g1hNCVsfc7Z4S1#$y? z|K->Q;OF4!uYm8s3E;V4J9sG=+{rHW;Fo_%3;~$)O8PxG4{QcUzlyd1=Yh@O@K+Q2 z1ug}D1O6HO3%Ci~3ff)+UxCMg&%G8q9h~(#@&J#y2zw8_;Ej|Sd%MZ`O?=`1 zbzCm^nTk0bb$Y4CxtdG;ydNhGP?1TAD|j<;z?8%xTy1RslU1L#H$xxrWbia_1z7YJ zVn4vSZ>5ieZD2e2BDfmtdK>xz{PeGBW1v`ztH2##7kI@x%GisKyc4>CCGWzP1Gj>n zOK5BGui!p#!n) ztyEg=TBsC?WS2?^l~Ty^SlaC5Df><+TlQ=bvV{^-DYR%$ixlljixl0$&2pvR`*Y@; zxu@lMzR&mj`Yr$brr!5_X3m^*=A6$uGoSek*D;1A9ME69@)>1b)OP1K2C|+8FImQ& z%wVqp`V=yP&9r`5I${k+yyAQDC?8V)HQU0H*OeE9h%PMLu(oKGfIKS=gq-|UNErXE zX~T@7$wd;vR(V@|CGjjQcE?7U{4Xu!hU5K*tztSUIkrk6+sFUu;d?ZA!*9eic7HR9 z&LZ@c>A}Zu*)JwF$R<#agSd+B^yWd{VF+{ihLUgl{i)BvT*?(Z$Rmv9a~86Mdhd8& z3iz4OKPTHa=gRlob%Vha(QK%;05hogzBuPvMzE2iK9Kep!4^*bP#iLgs>2*Zpc60f z6+3?<{Zo<0c#^4P;;``F#HYN!bV1=4V|F~fA6j$eGP$ur#i+!CC9Wv*dzn_{4y+hr zTgy88T={6H2TS~3=92O!SK9uW4*74C46llxiQ{>`nYdPXHd`yC^L**NbSf&2>D+yb zq&$h=W3`_qe9tfVi4D{ouFo#>m`}}-=6Qt22>qnyvd72j2mYYxC~W|ylkG!QZ?yFD ziE@K)`Hq2~+UI5{ACT>5_0$+~OKxAQg0XQwt3r>zQ(~MQA8z7S1~QeZ)mZJ&kaoJh8>+k?W{{%%8sL!Y9l|+xCZxqdlaL+^Hb!0j^rMY}ulDVezVE=_i-Xp1o|@Y{7z}uy_&H zDe}LlXj=S=Rbncs%j3BAp&?$2<1aZ5RGiY{P&zFnM;5#$x80DWi+J7DqIui?e4qKK z>CB|rJZ%8J`$n6M0)8gj=dZaByPD^i$VT>Apl=t~^9rx=CQI03q2Hh8oJh96;0WR0 zIeL-f3pAxQZP{tDYLL*Ea5s+QJi2lzx%~@Ao6qfISbK@}2z?FTAh*BaYV)b3+K$v@ ze-5QF?Y?!qfjbyXwqN2|%cN_1bIfx49-KmvBeg|E>sF^@I2^x?C(F|D8z0dvO2>C* zK{$eIrOZQEaaQ;Bl&}W;q+#X`_6|I3_TYFImBA8vd+&U^IEZ_?_rPwy$Y_;n3go zU4}E4rTjvvU)38N!wFo*@ZY3cs{Nsi;bOWlxFJHmzG8X5(`>#f3Q}^||9}u4NAM=)Z@4iM+~cKHEo{q;3s;k14E~ z7q#3^f4u#r-`aW68+G(2=3S=J;ec>MyS%77_wqa+A$CmJ)2f*>fldU*IXQE_HALd- zAl(vJR8;i!?CBH7tX{o(x}~GSGmh(T6R$~~o*S3j?hR!2@RNNxIX(Tlbg7WE>T*+w zH8N9NDip{1Sj*#ON`h0vcN@cWX0n1!RIDd`QBp|QM2 zO)jK2lPP(4Uet=yxsWTlhBtYek&NbR7I453(i+#$n>t5H6AWS;6WHnKyr>jqX~`Wd zqrx%L9z99NZTRDO(1w*x_=HnFCIPeav$OHS9sd1lM&>2)v!T2%-V4ZW@8#t9;ynUu z=ca?CgxIPKN%jSj_&+0T`&+!jB*JwHJ0I)2QJLM?i|Xu0UBYz?t!Wz`kMmlFkiE8H zobY$7VgtK1k#=aqRouh#3}+Ja_?}JdcD(YLR$Rs{Jj4KoGM+gsVHqpMyg_HCV=R5wS?aBHelixCq=TH)) zr*IJWKbY1P6|E>LTH;@kGfuOoO~}M>Hiw2s@t0c?6t~`!I-pc$4LxP@-p<=P=jT4B zv+LGJ6Sj%C6zW0@iR6@PJfd-Vs`(vzE+%n$6@LBDa@(2lctjY&-9S8AWB z{Gb8na6Uch!$UmI3}*8un+g3$Hf`D<`K(hfBvU3qg@+C4XLA<(r@>6DYVa1f@3u-; zNvwzGU4Ie3Agev{dk4(%wRUF*}0SN%N@MT`;2B1-?Ncl`J}75f{!oB(|1|f#B+R4Ci`!S z3j(JCwx8lNeO3(TfY!2bVbQ{(^j{B|;J5SA=cMD3Aj$nZt^?wD%(U~9ql@v?WUr%o<0|>$YTx}D*L1LZcVz(euk~B< zNe}IG>i5)c<6#E!4bgS-FLyA31=PMiFFJ!W>B!AYrs@sS70tMgk11e}8+{IsFpi%% z;wIPLu#o3&*8bqaTU?)Xt2E73w<%Znlx1utx?Nl04&@C0pf|5GjTtn(+jia~P1BzN zWUmp+#JL9tihn3tQBbgSemIGnGi@_lP*7y08R@0*-=g_5rda=T(PfI`Bi%;Jt?7$P z?xYqFx5agP(jMF<#&gq868rHh$EMFACGp=nd(GQ2-)|l3IqY7)DJ?je{QKm8YEql* z^>ICfUt|iuuZ(n5ubLjM# zbU+^-qA$7E{%tb<2bVvdF5A;(_gcGro6@@gVtCW0g<qe5~@BS4(Y(z z%;Za!vYZl6x-OHQX~0!nW{D_s@^1xg?ZM9EWyl0T^8S+L>docY@>GGmlyfinhWYbb+Zy{x{>`~wl6_5 zT5#ek_N_RFrv{1(o@WsC-jwfY$mw(*ByM?-N621Zx>C6O+wpa#$9l}Y*7O1MLkQQL zeogLmr;XlGuM@66?L_W1sN>8RQtw^ggU6Z39~?Z``aDgzR`m zJEc>N>~d!A^|jT9XajI3@9`}a-cuLSopAl_tK?pT`@Q+p(D+*18Xj}6$9>5B$9&IU zgzIyUAom*GN6il-T&ug7-0O8~eIR{sA=_TNJJ_d=6wj) z_ufG6HNIb&-{m9M4|6)y z(v`;v*H4dQ0;~CfJwKO@$i1HWpXLWJgCgop5YODlhlJ~`SMoh;`H7MfjT*`lej{&^ z`h!wrugyMN_%>c;3hSvdIlgAQiN|K-Ub{WW{BpuI+GBCrvhB6wmA>%XaSi>M#_!ab zA&+toL-|jxF~4c1eK^X_%8SaeD|>M}`Cr;s<1?o7`&@O+Jn5E8xSXEcz|CZ@SDz_R>I9*`-vsFCiw(FDqyWBi2oZG6~s#YHxzi+x#kuCkx=X`Qg zf@jm|r&ah)zw%r7Ze*|B@3=ty%BO5#zlGWYglqaA=21T26ULCe&cD_o@yz{fdYW4W!Pc~DhpUKt<@xn}DU}jmiMHv>YE{gMilINv_bVpjR<2#e9R|g$Bp>2FiZsnYYGYq3%^Uxgg;B>hre?Q3%@A*bMhA2h3?I6ra7mo6(>bwJx-A}haqpfVhvRrFZMh3~ty3w4a`*Fd<9M5rd+R(d z4J0*x$#i`%Gb)i^(Pf!&>X6fg<8%;8f}AvSQg)1tmK(KS$Q>u+f?xdpWXH-FEnL8U zzp8`zoM~*}7jnnSXkVxdU=-`AwMje>#?a_M?l>Bw%>T|2zd3fm2W+6h@9HMPI2(f* z%4j~L@t@igT+bqwQm;sQyu~|c_ix;!p}%p{_t_~4ZoO1{aCy=u+_)$XE)w{9xR?qvqms`^YC za2LI}sG6}D=*At~&4&!<-rZ7BZ>sEWYzCIHJcRc&&H>|@$P{MpZLAEw=68yyzfUSU zn5*_RpG+?JSgV(xsX+hGa6-_vUu%oztc({X>tzB?{)O&;OFdhV{u{5Z7i!3_x%+rY zUbj5Aj3`b8|0gRF;NKP!yLjfG@%*U z@nRko{+!<^B8(q%3ayySH+;t`s_mbO_Mj&>@CJjZQQH_F9KvCo#|8A^Q+}pOomAA0 z4t&BZb&cJ@a_Svm+!0>lEpo@Jscg)egJ{Tdc0SN|KFI3{W7!Ph1I9JP>c z;a(kqi&iXNvErK$ZF6RXDc#1;#A3FgA7&jIcGTBV-Z|k?kis8+C@fmBV%&-qql=2f zTslvN7JSKc58-r)ZEh#oBA#|wZznP9RpLAQs`&l3-y_I=&UUSXZ2f;)7_a9C&OSu` z$)31a}g#`_H8 zSYrTfI4%|aLieW17@pyI!q`CLsM;(QbtH@nBn_l5PUJ zVNv0{qHH*mCKfHS*h!wx?Y|c-`fSmnP$Oq1@su3Z7f!AQiu?4;$;-rFI?WUx-5KlE zaViPNf4#1_1W4Ku@$)i zdwjwa=CPa~*}(4|(q(^$>zp#6;0I-Z3j)*Aw_!>*=F_3fA5X=h^h3O6+*Md=5vSXf z*&!y2TZuVkMDE^QZVi!}u97xG{5tX9K5TcjGnKpSM;QC*1Uk@_>-m%tXURuA%@S&# zt)Ac`Hgi%(d53xIbB=nJ!4%TuT)!bRsCu4!$<2f@raomXpR<^6SE zY$H3C)rG=?_?4!ej4#F8tfp3HX`SbJl`!trI@S}82j{lxwh3nr^8WbaCjU3BUY0(5 zoUD`CWlYa+^)Bfyf?MT!sb!lOPN$Z1SzlaMi1p$WbWYg5QeCvm=)xsj%?;enUCgFp zw^Y>p5-!sgqa|l>7W-czk6tN{(uGU7oU3@8r+AGajA8m~JnZvNkK3o%>&w+i2>R8RSzGx;Zd=+Ar1p@5$$r0I3a2X5hg zeqsZc+#t?*i;4V2%^T%GT5&pk8N_1N@)w8Sq(0#yZs7smVLD4m-7I}^8W(U4cQAtK z%;$U7QuY>c&vD$s06t_I3;2VIx2jv{NMBxNAa5|4HEg2XZQAto2PRY{O_AG?SoAHU)(;(#{WfO8-At4 zozg$GXiN)E<_!AKk12f30yeSdUA`NKaXhDT0oU;?0~x_g7Vr~0-EEvV_TVsv-D4e^ z+-u*F%ea!>gmL@6p~ijE7GVs(j~K@UmftU*_Et_YnQ6@68y4~#Va&g>ebjMW!f;AH zATD@=;S|#NL1~6h2xA0RVK>G-a5m3p+I&e~j_d5f@ft~4VeKS`|BKc@ajYlDm6Q6vZTJph48->t z##nx0|Gs_`+Hel%6UIFp#IJ<$4^QAE&frYSJ!ZT{_M#5;IEk)Y%5~hxPEYuad5FG* zaT5nT6_1_xy~ll?7U%58AN|zd=$;Q3V4jO_S|X9%B14{oOq&+sZkn8aMFykL7c zl;dc{*<8Xuxt)i3o(23!A%C+=e{~17IFLphPA?V_A}v(!9-PPxbLk_u4(5vO5MDSh zES$AE6TxwZft+pw;o0ITj@=#Z?Qa$TT6Kf7SA!?Ss62{QnLfKcOISN?ys_kbTh5SyHf$>B^U zDjhkGiA*7kgSpG=>MI^&4tu;|pO!aSPZ%e&3fVC-AAZ|-uoOq*jzifC$-`;CP!6n0 z?>weY=%$Ad2(NOzXgoki%pz3SRUnZUS%}54pB$HCy%j)b^OLjL+uwbg9YsSzBIv2yw9iX{DHXO zO+F;=Lv=RC(1(|Jg)+n9F-Gfn4C9P`$M@t7SEh5!NO3q?S@fyTrurCplrwmrVT_=} zSjV8~%VO$}vps}yOG}N{eq|sVY5KYL9*YQLnjSGhea#&9ndo!F34wT8yK-sz;QtQ( zESNj1uyES6iDO3>PTRrL=|ys4dcQ2a|DN8%ONY`qIUP#JWICk$4{;vn-E=4^#dFL4 zt@3{EzM%GF+%AmYA+-MERCV7@($8t(d(~h+>Tn3h(1d1mCXDSmkZ%cNyzWa)_NOjw zXh#QLp@1fn?GwMan*7RryvJ-dviEf9l`xj< z_1wg*Ol6lZv@O_!{is7d&frY?Fp@RwJ|iB7ww1@zIfFB~ftwk{Z-g;wkK`Es!9~2z zTfDg`GnLnxyJ_D=)r<$#yVPFgqP=g~H#;8G(0)1nhT?b0yf(dG5p@XLT$Nfhq!EYH zi!Z4@+x{S-rJw%hT;G(b%eOXNX<>HOb+{|rEWB2b;Q75|c z0nrM1hW@POsFm^}H!+0w8O92#tx_*=3avPu^SO*G`Iw1JVKYaqwvWdk-sMkD`QH8q zD`~XGXYn}|f6yl7UH+uRT5T7qQj6O3WE>UNi8J2e8^XBKYbYfDN9_a-;27G_l^c10 z=Xr-un8h-FrqoZ`Ae_S+{K^UIeGV7Xg_l{wz6IJg^yX>aW;_d7&;K|Dq+eKEqGUtc zz2DX;A-n(ADSUSR25FU!JjP3W$aEI65f|@9wKTTJ6eD*l{`n$eES zxSogT%e#!?3l^};FX|Ewr6s3vCf9K%Z!(_(_Wo6w%(-;qULIipukt!eSO^}7XR7Izg=AKXhDeoq+O8Y|4!kvt5KgGe9R=~vx48q+ibs% z>eQk(hth;*^koF2*hs^_<#F!eVLs;%8g9|X;u>z^T~@Mplph_$5uD4DyvCahV;mLo z@}rYDg-f}DkreVftyB39`{zfG@EA)uC_g{Cg(+0qDL*=xL+Hi*yv#t}U_A{rh^}Ka zKe2&oCB2Tew5JzuFp}j|C}o@I&LfOu9&0I8IzQT*6S#)Ed6GfA%P8ishILdbV?6o) z^HWk1XbW};pIL*G=tx)Y-V7%O}U9@`G8gYOetgYH>MNUkvnGps9o}- zPpMzd@4&tE=0RpKo4?q#e124!YFu8yxbT(oql#2vH_qiBJjN!vR+b*Pg6p`0yIIM8 zRr2)>i0>D0g2#?r%?o_UY}QlPK;|bA?kUiX`79#bU*H$YRLhT!q%D_m4=?gDU-K)K zcgv3s<4PW3DD%m4e}WxH>81^9SLU7wGT2l+Wgl~&++jGk4XFK}o+R0Ak07c2Yp2g3 z7LN~;vG@T?ybNR^k)FC zGLiKC8TOG+=))AU_iH%7JsU2fA2V1&xQ9b+4xlm3Xu%rxs3A{Lmqr}UnOw|cyvW;( z<}=1IkNGTO6$SiEg_`lbB06|{ig{G4C7sZjfvlwVe)-WQyvYarLgW4Oqw5*YZ=`C+ z_ng?@V_jO1z5m1v;R4LB=;rM|-jl#}e+f zaSxLyd!RCu9*p2Gn!682xEIGmJi|cVU=R;A%#Zr=0&npS)A*VVY@ysC$_g6Ngw9+; zKZfxIvslkx9CT=YbQEpr&Ykq-aqej({nCdw`G}R2In4K^0jJZIp4`im3}Pgs`Hbnz zXAyr=y0P!g(X^!-J-M5E8OZxABPaI$WpL}1u=Q&H?z!}up;SmuC6o|J{C5hUUE*+M zEChk2CQe8nmX+2dGgm)3OScAjN0i>Y{=`hdn9$uXQsN6w>H z6YT;X;9=h49fr`RX@1m>^SOk}S;IQYHuGE1oXdEgkxXC(zp#b9nyVu?o_1Wu*0H!L zee&nOaRNvaFsz+<*#6Yf*0Ek(DrC|^bWzxb+vvkn3}p<{Sj=CPKf(8-4##pl&AEt9 zbmdZJ@+FH{#TwR8wngzhcUlX#<$NyX3Ob)CzPOABd6-9eg7^4>S$ues@|JOY!7SFY ziLxhaBT$`MG~rY(;8J>W1CKL=QOsmMD_G4B?9?(p+L!tq cv-SlMuL;0LS%ADeJ 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 G_x}Q4q5!1; literal 0 HcmV?d00001 diff --git a/doc/userman.txt b/doc/userman.txt new file mode 100644 index 0000000..ff7f8a8 --- /dev/null +++ b/doc/userman.txt @@ -0,0 +1,1406 @@ + + + + + + + + + + + + + + + + + LOGLAN'82 + + + + + + + + USER'S GUIDE + + + + + + + + + + + + + + + + + + Institute of Informatics + University of Warsaw + January 1988 + + revised October 1993 + LITA + Université de Pau + +TABLE of CONTENTS + + + +{TOC \o|0. PREFACE 3 +1. USING LOGLAN-82 SYSTEM 3 +1.1. COMPILATION 3 +1.2. COMPILER SWITCHES 4 +1.3. CODE GENERATION 4 +1.4. PROGRAM INTERPRETATION 5 +1.5. COMPILE TIME ERRORS 6 +1.6. RUN-TIME ERRORS 6 +2. COMPILER OPTIONS 6 +2.1. OPTION FORMAT 7 +2.2. OPTIONS LIST 7 +3. CURRENT LOGLAN-82 IMPLEMENTATION SPECIFICATION 8 +3.1. IMPLEMENTED SUBSET OF LOGLAN 8 +3.2. PREDEFINED LANGUAGE ELEMENTS 8 +3.3. FILE SYSTEM 8 +3.3.1. FILE VARIABLES 8 +3.3.2. FILE GENERATION 9 +3.3.3. FILE DEALLOCATION 9 +3.3.4. GENERAL FILE OPERATIONS 9 +3.3.5. TEXT FILES 10 +3.3.6. BINARY SEQUENTIAL FILES 10 +3.3.7 DIRECT ACCESS BINARY FILES 10 +3.4. CONCURRENCY 11 +3.4.1. INVOKING THE LOGLAN INTERPRETER FOR CONCURRENT PROGRAMS 11 +3.4.2. RESTRICTIONS AND DIFFERENCES FROM THE REPORT 12 +3.4.3. COMMUNICATION MECHANISM 13 +3.5. SYSTEM SIGNALS 15 +3.6. IMPLEMENTATION RESTRICTIONS 15 + +APPENDICES + A : PREDEFINED CONSTANTS 16 + B : PREDEFINED CLASSES 16 + C : PREDEFINED PROCEDURES AND FUNCTIONS 20 + D : ERROR CODES 22 + E : LOGLAN RUNTIME ERRORS 34 + F : CHARACTER SET 36 + +BIBLIOGRAPHY 37 +I. LOGLAN'82 37 +II. Algorithmic Logic 39 +III. Related literature 40 +} +0. PREFACE + This document provides information necessary to compile and execute Loglan programs. + This manual assumes basic knowledge of Loglan-82 language, described in "Report on the Loglan Programming Language" (see Bibliography). +1. USING LOGLAN-82 SYSTEM +The following three steps are required to execute a Loglan program: + {SYMBOL 183 \f "Symbol" \s 10 \h} Compilation (to intermediate code), + {SYMBOL 183 \f "Symbol" \s 10 \h} Generation of the interpreted code (from intermediate code), + {SYMBOL 183 \f "Symbol" \s 10 \h} Interpretation (i.e. execution of program). + + + Compilation is accomplished by invoking Loglan compiler. This step creates two destination files: the intermediate code file and the listing file. The intermediate code file is the input file for the second step: generation of the code accepted by interpreter.In this step two files containing object code are produced. They are the input files for the third step: interpretation. This step is equivalent to execution of a program. + +1.1. COMPILATION +To invoke the Loglan compiler without specifying any command line parameters, type: + LOGLAN +Then the prompt appears on your terminal: + File name: +and the compiler waits for file specification.The default extension is LOG. +The compiler will produce (optionally) listing file with the same file name and the extension LST and will produce, if no error occurs, the code file with the extension LCD. Destination files will be stored on the same drive and directory as the source file. + + +Examples: + $ LOGLAN + + File name: PROGRAM + + Loglan compiler compiles program from PROGRAM.LOG file and creates PROGRAM.LCD. + + + $ LOGLAN A:PROGRAM1 or + + +In this case the source file is A:PROGRAM.DAT. The file PROGRAM.LCD will be created on drive A. + + $ LOGLAN /home/vous/PROGRAM2 + +If any error occurs, the code file is not produced. At the end of compilation the following message is printed: + error(s) detected {SYMBOL 168 \f "ZapfDingbats"} +1.2. COMPILER SWITCHES + There are two possibilities to specify compiler's options: by compiler switches (i.e. external options) or by comments in the source program (see chapter 2.). You may enter the compiler switches in command line after file name in the following format: + sw1 sw2... swk +where swi consists of character that designates the name of the option and either '+' or '-'. + + + +Examples: + + $ LOGLAN PROGRAM L- T+ + + $ LOGLAN PROGRAM + + In this case the default switches values are assumed. {SYMBOL 168 \f "ZapfDingbats"} + + + Scope of the switch is the entire program. All switches ,except H, correspond to options. A switch has greater priority then options: when you specify switch, all corresponding options inside source program will be ignored. Full description of each option is given in chapter 2.2. Switch L has additional significance. When this switch is set off no listing file is produced. +1.3. CODE GENERATION + In this step information from the intermediate code file is read and two destination files containing the code are produced. No switch is permitted for this step. To generate code files, type: + GEN + or HGEN , if the switch H+ was specified for the compiler.(DOS/AT only) + +You type file name without extension (extension is ignored). + + +Examples: + + + $ GEN + FILE_NAME: PROGRAM +Information is read from file PROGRAM.LCD from default drive and directory. Two destination files are produced: PROGRAM.CCD and PROGRAM.PCD and stored in the same directory as the input file. + + + $ GEN /home/vous/PROGRAM2 + + Files PROGRAM.CCD and PROGRAM.PCD are stored on drive A. {SYMBOL 169 \f "Symbol"} +1.4. PROGRAM INTERPRETATION + To interprete (execute) the Loglan program you must invoke the interpreter INT or HINT (if the switch H+ was specified). File name must be specified in command line. The file extension is ignored. The interpreter reads input files with the given name and extensions CCD and PCD and executes the Loglan program. +The syntax for calling the interpreter is + + INT + or + HINT (DOS/AT only) + +The following options are supported: + + /m < n > set memory size for Loglan program (in 16 bit words for small and 32 bit words for huge memory). For concurrent programs it means memory size for every process. + /i information about garbage collection-compactification is printed. + /r < n > used to invoke interpreter on nodes different from console (see 3.4.). option parameter is console node number (as defined by D-Link Network). + /d causes trace to be printed to the file with .TRD extension provided that the option or switch D+ was used during compiling. + + + At the end of interpretation the following message is printed: + + End of LOGLAN-82 program execution + + +Examples: + + $ LOGLAN \DAT\EXAMP.SRC, L+ + + + The file \DAT\EXAMP.LCD and \DAT\EXAMP.LST are generated. + + $ GEN \DAT\EXAMP + + The files \DAT\EXAMP.CCD and \DAT\EXAMP.PCD are created. {SYMBOL 168 \f "ZapfDingbats"} + +Then the program can be interpreted by: + + $ INT \DAT\EXAMP +1.5. COMPILE TIME ERRORS + The errors detected during the compilation are printed on the listing file, if this file is created. In the scope of option L- or if the switch L is set off only the incorrect lines and errors messages are printed . When the switch ( not option !) L is set off then listing file is not produced and incorrect lines and error messages are printed on the user's terminal. + Error message has the following format: + + *** ln ERROR en txt id +where: + + ln - index of incorrect line, + en - error code (see Appendix B), + txt- text that explain type of the error, + id - identifier helpful to situate the error. + +Error messages are printed in the source listing after incorrect lines. +For syntax errors (numbered 101-147, 201-212), sign '?' indicates the error's position in the line. +Error may be detected beyond the line containing it. +Identifier helpful to find an error is printed as soon as possible. + +For codes 331-338 error message is printed after first line of virtual module declaration. +Errors like "undeclared identifier" are printed in each module once, after first reference to this identifier. Further references are ignored. +The errors related to case instruction may appear before the incorrect line. +1.6. RUN-TIME ERRORS + Loglan run-time errors are detected by Loglan run-time system. When any of these errors occurs, the appropriate system signal is raised and error message is printed if handler is not found. All of these error messages are described in Appendix C. moreover the line number of the last executed statement is printed on the user's terminal. +2. COMPILER OPTIONS +Options, like switches are used to pass some information to the compiler. Options are placed in source program in comments. Scope of options in source program is textual. Option may appear in any place of source program, but it is active from the beginning of the nearest instruction. Listing option L is active from the next line after line containing setting this option on up to the line containing setting this option off. Options overwrite defaults, but are overwritten by switches (external options). Option definition is not allowed before the keyword program. +2.1. OPTION FORMAT + Options may be placed in source program in comments in the following format: + (*$opt1,opt2,...*) +where opti consists of character that designates the option and either '+' or '-' e.g.: (*$L-,T+*). Options in one comment should be separated by commas. Spaces in such comment are not allowed. + + + +2.2. OPTIONS LIST + D - trace + D+ - causes the line numbers of the executed instruction to be printed, + D- - default, + L - listing + L- - default, only incorrect lines are printed on the terminal + L+ - all lines are printed on the listing file + O - optimization + O+ - optimization of some arithmetical and logical expressions are included to generated code (default), + O- - generate code without optimization, + T - type conflict checking + T+ - default, dynamic checking of type conflict in assignment instructions and in parameter transmissions, + T- - no dynamic checking + H - memory model (switch only) APPLIES ONLY to PC/AT/XT !! + H- - default, small memory + H+ - huge memory + + PC/AT/XT When H- is specified all code and data must fit into 64K + bytes. When H+ is specified all memory available on IBM PC + may be utilized, with the cost of increased execution time. +3. CURRENT LOGLAN-82 IMPLEMENTATION SPECIFICATION +3.1. IMPLEMENTED SUBSET OF LOGLAN + The following constructions described in the report of Loglan-82 have not been implemented: + - local attributes, + - separate compilation, +File system is described in 3.3. +3.2. PREDEFINED LANGUAGE ELEMENTS + Predefined constants, procedures and functions are added to the language (see Appendix A). Moreover keywords char (short form of character) and bool (short form of boolean) are added. + The character set, defined in the report of Loglan-82, is extended by lower-case letters and the tabulation character (decimal code 9). It is possible to use operator '<>' which stands for 'not equal'. +3.3. FILE SYSTEM +Loglan contains the predefined reference type file and a set of statements and standard procedures to manipulate files. +Both sequential and direct access files are implemented. +3.3.1. FILE VARIABLES + Variables of the type file can be declared in the Loglan program and can be used as any variables of a reference type. + +Example: + + var f:file, + A:arrayof file; + + unit p:procedure(f:file); ... end p; + begin + ...... + f := A(i); + ...... + end; +3.3.2. FILE GENERATION +A file object is generated by open statement of the form: + + open(f,T) for internal files or + + open(f,T,A) for external files + +where + f is a file variable, + + T = text for text files, + char for binary sequential files of character, + integer integer or + real real values + direct for direct access binary files. + +A is an expression of the type arrayof char designating external file name. After execution of open statement the new file object is created and it becomes a value of the file variable f. If the file is opened as an external one, then it references to the file A. + + +Example: + + open(data,text) - new internal text file data is opened + open(num ,integer) - new internal binary file num is opened + (the file components are integer numbers) + open(f,text,unpack("my.dat")) - external text file f is opened; + it references to the file my.dat stored on the default drive and directory. + open(f,direct,A) - an external direct access file with name in array A is opened. +3.3.3. FILE DEALLOCATION + The file can be closed and deallocated by execution of the statement kill. +3.3.4. GENERAL FILE OPERATIONS + There are three standard procedures associated with files: RESET, REWRITE and UNLINK. + +call RESET(f) rewinds the file f. After execution of RESET on sequential files only read/get operations are available. + +call REWRITE(f) creates a new empty file. After execution of REWRITE on sequential files only write/put operations are available. + +call UNLINK(f) closes and deletes file f. File object is deallocated and f is set to one. + + RESET or REWRITE must be performed on the file opening before the first I/O operation on it. +3.3.5. TEXT FILES + The following operations are available to text files: read, readln, eoln, write, writeln, eof. The first parameter of the operation is a file variable. If it is omitted, then a standard input/output file assigned to user's terminal is used. + + + + + +Example: + + read(f,a,b); + read(c); + writeln(g," .... "); + if eof(f) then .... + + +For more information see [1]. +3.3.6. BINARY SEQUENTIAL FILES + Any file created with the parameter T = integer, real or char is a binary one. It is a sequence of components of the type T. Only objects of type T can be read from or written to this file. + The following operations are available to binary files: + put(f, w1, ..., wn) + get(f, x1, ..., xn) + eof(f) + +where f is a file opened with the type T, wi is an expression of the type T and xi is a variable of the type T. + The statement put(f, w1, ..., wn) writes the components w1, ...,wn to the file f. The statement get(f, x1, ..., xn) reads the next n components from the file f and assigns them to the variables x1, ..., xn. The statement eof is the same as for text files. +3.3.7 DIRECT ACCESS BINARY FILES +Direct access files are treated as a sequence of bytes without any interpretation. Operations RESET and REWRITE prepare a file for both reading and writing. RESET is used for existing files, + REWRITE for the new ones. +The following additional operations are available: + +call SEEK(f, offset, base) - moves the file pointer to the position designated by offset relative to base. + Offset is a signed integer specifying the number of bytes. +Possible values for base are: + 0 - begining of file, + 1 - current position of file pointer, + 2 - end of the file. + +Examples: + +call SEEK(f, 0, 0) - rewinds file f, +call SEEK(f, -3, 1) - backspaces file f by 3 bytes, +call SEEK(f, 0, 2) - moves the file pointer to the first byte after end of file + +POSITION(f) - returns current position of the file pointer associated with f. + +PUTREC(f, A, n) - where A is an array of any primitive type and n is an integer variable. Let k be the number of bytes occupied by elements of array A. This operation writes min(k, n) bytes from A to the file f and advances file pointer by the number of written bytes. The number of bytes written to the file is returned in the variable n. + + +GETREC(f, A, n) - where A is an existing array of any primitive type and n is an integer variable. Let k be the number of bytes occupied by elements of array A This operation reads min(k,n) bytes (or less, if end of file is encountered) from the file and advances the file pointer by the number of read bytes. The number of bytes read from the file is returned in the variable n. +3.4. CONCURRENCY + Implemented concurrency mechanisms differ much from those described in the LOGLAN-82 report []. In particular, only distributed processes are implemented, so they cannot communicate through shared variables. For this reason semaphores had to be replaced by an entirely new communication mechanism. Such a mechanism has been designed and it is based on the rendez-vous schema. +3.4.1. INVOKING THE LOGLAN INTERPRETER FOR CONCURRENT ROGRAMS + A concurrent LOGLAN program may run on a single computer with concurrency simulated by time slicing. In this case LOGLAN interpreter is invoked as usual. One must only remember that /m optional parameter (see 1.4.) denotes memory size for each process rather than for the whole program. +To achieve true parallel (multiprocessor) execution, a network of IBM PC computers may be used. For the time being, only D-Link Network Version 3.21 is supported. In order to run a LOGLAN program in the network environment take the following steps: + 1) make sure that every node is logged on, + 2) select arbitrarily one node as a console, + 3) invoke the LOGLAN interpreter on every node except the console, giving it /r option with the console node number (see 1.4.). You must give the same program file to all interpreters. Most conveniently it may be achieved by accessing a file on a disk connected through the network to each node. + 4) invoke the interpreter on the console without the /r option (in the usual way). Give it the same program file as above. + +After the last step the main program process begins its execution on the console node. Other processes may be created dynamically on any node on which an interpreter is running. + +Regardless of the fact whether the network is used or not, more than one process may be executed on the same computer. + +3.4.2. RESTRICTIONS AND DIFFERENCES FROM THE REPORT +All processes (even those executed on the same computer) are implemented as distributed, i.e. without any shared memory. This fact implies some restrictions on how processes may be used. Not all restrictions are enforced by the present compiler, so it is the programmer's responsibility to respect them. This is the list of restrictions: + + 1) all process units must be declared as global, i.e. directly inside the main program, + 2) a process cannot access global variables (except for the main program process), + 3) any remote access to a process object other than a procedure call is inhibited + 4) each parameter of + {SYMBOL 183 \f "Symbol" \s 10 \h} a process, + {SYMBOL 183 \f "Symbol" \s 10 \h} a procedure called by remote access to a process object, + {SYMBOL 183 \f "Symbol" \s 10 \h} a procedure parameter of a process, + must be one of the following: + {SYMBOL 183 \f "Symbol"} a value of the primitive type (Integer, Real, Char, Boolean, String) + {SYMBOL 183 \f "Symbol"} a procedure declared directly inside a process + {SYMBOL 183 \f "Symbol"} a procedure which is a formal parameter of a process + {SYMBOL 183 \f "Symbol"} any reference to a process object. + This restriction implies that references to objects other than processes have only local meaning (in a single process) and cannot be passed among the processes. + 5) comparisons, IS, IN and QUA operations are not allowed for the references to processes. + 6) operations which require dynamic type checking on the references to processes are not allowed. + 7) a process may be attached only by a proper coroutine generated by it. + 8) the variable MAIN is accesible only in the main program process. + + The following concurrent constructs described in the report are not implemented at all: + + - semaphores and all operations on them + - the WAIT expression. + + Semantics of the NEW generator is slightly modified when applied to the processes. The first parameter of the first process unit in the prefix sequence must be of type INTEGER. This parameter denotes the node number of the computer on which this process will be created. For a single computer operation this parameter must be equal to 0. + +Example: + +unit A:class(msg:string); +... +end A; +unit P:A process(node:integer, pi:real); +... +end P; +... +var x:P; +... +begin +... + (* Create process on node 4. The first parameter is the *) + (* string required by the prefix A, the second is the node number *) + x := new P("Hello", 4, 3.141592653); +... +end + + + The following parallel constructs are implemented as defined in the report: + + - KILL operation for a process + - RESUME statement + - STOP statement without parameter. +3.4.3. COMMUNICATION MECHANISM + Processes may communicate and synchronize by a mechanism based on rendez-vous. It will be referred to as "alien call" in the following description. + + An alien call is either: + - a procedure (or function) call performed by a remote access to a process object, or + - a call of a procedure which is a formal parameter of a process, or + - a call of a procedure which is a formal parameter of an alien-called procedure (this is a recursive definition). + + Every process object has an enable mask. It is defined as a subset of all procedures declared directly inside a process unit or any unit from its prefix sequence (i.e. subset of all procedures that may be alien-called). + A procedure is enabled in a process if it belongs to that process' enable mask. A procedure is disabled if it does not belong to the enable mask. + Immediately after generation of a process object its enable mask is empty (all procedures are disabled). + Semantics of the alien call is different from the remote call described in the report. Both the calling process and the process in which the procedure is declared (i.e. the called process) are involved in the alien call. This way the alien call may be used as a synchronization mechanism. + The calling process passes the input parameters and waits for the call to be completed. + The alien-called procedure is executed by the called process. Execution of the procedure will not begin before certain conditions are satisfied. First, the called process must not be suspended in any way. The only exception is that it may be waiting during the ACCEPT statement (see below). Second, the procedure must be enabled in the called process. + When the above two conditions are met the called process is interrupted and forced to execute the alien-called procedure (with parameters passed by the calling process). +Upon entry to the alien-called procedure all procedures become disabled in the called process. +Upon exit the enable mask of the called process is restored to that from before the call (regardless of how it has been changed during the execution of the procedure). The called process is resumed at the point of the interruption. The execution of the ACCEPT statement is ended if the called process was waiting during the ACCEPT (see below). +At last the calling process reads back the output parameters and resumes its execution after the call statement. + +The process executing an alien-called procedure can easily be interrupted by another alien call if the enable mask is changed. + +There are some new language constructs associated with the alien call mechanism. The following statements change the enable mask of a process: + ENABLE p1, ..., pn +enables the procedures with identifiers p1, ..., pn. If there are any processes waiting for an alien call of one of these procedures, one of them is chosen and its request is processed. The scheduling is done on a FIFO basis, so it is strongly fair. The statement: + DISABLE p1, ..., pn +disables the procedures with identifiers p1, ..., pn. +In addition a special form of the RETURN statement: + RETURN ENABLE p1, ..., pn DISABLE q1, ..., qn +allows to enable the procedures p1, ..., pn and disable the procedures q1,...,qn after the enable mask is restored on exit from the alien-called procedure. It is legal only in the alien-called procedures (the legality is not enforced by the compiler). +A called process may avoid busy waiting for an alien call by means of the ACCEPT statement: + ACCEPT p1, ..., pn +adds the procedures p1, ..., pn to the current mask, and waits for an alien call of one of the currently enabled procedures. After the procedure return the enable mask is restored to that from before the ACCEPT statement. + + Note that the ACCEPT statement alone (i.e. without any ENABLE/DISABLE statements or options) provides a sufficient communication mechanism. In this case the called process may execute the alien-called procedure only during the ACCEPT statement (because otherwise all procedures are disabled). It means that the enable mask may be forgotten altogether and the alien call may be used as a pure totally synchronous rendez-vous. Other constructs are introduced to make partially asynchronous communication patterns possible. + + +3.5. SYSTEM SIGNALS + System signals are connected to runtime errors (see APPENDIX C). + +These signals are the following: + + ACCERROR - reference to non existing object, + CONERROR - array index outside the range or lower bound is greater than upper bound during array object generation, + LOGERROR - errors related to control transfer, + MEMERROR - memory overflow, + NUMERROR - errors related to arithmentic operations like division by zero, floating point overflow, + TYPERROR - type conflict in assignment statement, during parameter transmission or headline conflict for actual parameter function and procedure. + SYSERROR - errors related to file system, like reading after writing, too many files etc. +3.6. IMPLEMENTATION RESTRICTIONS + - Text line in source program can't be longer than 80 characters. + - Maximal length of identifier is 20 characters, but entire length of all identifiers and keywords should be less than 3000 characters. + - String constant can't be longer than 260 characters. + - For case instructions: + - up to 6 levels of nested case instructions are allowed, + - range of labels can't be greater than 160. + - Number of formal parameters can't be greater than 40, whereas up to 35 output or input parameters are allowed. Total number of formal parameters and variables declared in one module can't be greater than 130. + - Number of array indices (i.e. arrayof) can't be greater than 63, + - Standard type integer has the range (-32767,+32767) for small memory (16 - bit word). For huge memory (32-bit word) the range is (-2147483647,+2147483647), but values of constant expressions in a program must lie within the range (-2767, 32767). + - Real numbers have the range (-8.43E-37, 3.37E+38) with 24-bit mantissa and 8-bit exponenet for small memory , giving about 7 digits of precision. For huge memory the range is (4.19E-307, 1.67E+308) with 53-bit mantissa and 11-bit exponent, giving about 15 digits of precision.Values of constant expression in a program must lie in the range (-8.43E-37, 3.37E+38). + + + +Warning + +Compiler computes values of expressions built from constants without range checking. It means, that integer overflow, floating point overflow or underflow cause incorrect result without any message. + + + +APPENDIX A : PREDEFINED CONSTANTS + + + INTSIZE + The size in bytes of integer variables (2 for small memory, 4 for huge memory) + + REALSIZE + The size in bytes of real variables (4 for small memory, 8 for huge memory) + +APPENDIX B : PREDEFINED CLASSES +IIUWGRAPH + +{Applies for DOS/AT versions, see a separate document IIUWGRAPH for details} + +{For Unix, see the separate document XIIUWGRAF} + +Class IIUWGRAPH defines the set of graphics procedures. The full description of these procedures is contained in the description of the library IIUWGRAF (Institute of Informatics, University of Warsaw). The following procedures are available in Loglan (heads are specified if they are different from these in IIUWGRAF description): + + gron - graphics on 1 parameter to be ignored integer + groff - GRAPHICS OFF, no parameters + cls - Clear screen, no pamrameters + point - set current position to (x,y) and give it current colour + move - set current position to (x,y) + draw + hfill + vfill + color + style + patern + intens + pallet + border + video + hpage + nocard : function: integer; + pushxy + popxy + inxpos : function: integer; + inypos : function: integer; + inpix + getmap : function(input x,y:integer): arrayof integer; + putmap + ormap + xormap + track + inkey : function : integer; + hascii + hfont + hfont8 + outstring + cirb + + + + +MOUSE + +{Applies only to DOS/AT versions} +{For UNIX and 386 versions see the corresponding documents} + +A predefined class MOUSE provides basic support for mouse. An external resident Microsoft compatible mouse driver (such as MOUSE.SYS) must be installed to use this class. MOUSE contains following procedures and functions: + +unit MOUSE: class; + +init:function(output b:integer):boolean +{Initializes mouse driver. Number of mouse buttons is returned in b. Returns true iff mouse hardware and software are installed.} + +showcursor:procedure +{This procedure increments the internal cursor counter. If the counter is 0 it displays the cursor on the screen. The cursor tracks the motion of the mouse, changing position as the mouse changes position.} + +hidecursor:procedure +{This procedure removes the cursor from the screen and decrements the internal cursor counter. Although the cursor is hidden it still tracks the motion of the mouse, changing position as the mouse changes position.} + +status:procedure(output h, v:integer, l, r, c:boolean) +{This procedure reports the status of the buttons and cursor. l, r, c are true iff respectively left, right and center (if it exists) buttons are down when the procedure is called. Also position of cursor is returned in h and v. Position is expressed in Color Graphics Adapter pixels (with resolution 640x200).} + +setposition:procedure(h, v:integer) +{This procedure sets the cursor to the specified horizontal and vertical positions on the screen. The new values must be within the specified ranges of the virtual screen. The values are rounded to the nearest values permitted by the screen for horizontal and vertical positions.} + +getpress:procedure(b:integer; output h, v, p:integer, l, r, c:boolean) +{This procedure gives a count of selected button presses (on p) since the last call to it and the position of the cursor (on h and v) the last time the button was pressed. Parameter b selects button to be checked: 0 - left, 1 - right, 2 - center. In addition current button status is returned in l, r and c (see procedure status).} + +getrelease:procedure(b:integer; output h, v, p:integer, l, r, c:boolean) +{This procedure gives a count of selected button releases (on p) since the last call to it and the position of the cursor (on h and v) the last time the button was released. Parameter b selects button to be checked: 0 - left, 1 - right, 2 - center. In addition current button status is returned in l, r and c (see procedure status).} + +setwindow:procedure(l, r, t, b:integer) +{Restricts the cursor movement to window described by l, r, t, b. L and r are minimum and maximum horizontal cursor position, t and b are minimum and maximum vertical cursor position (in pixels)} + +defcursor:procedure(s, x, y:integer) +{Selects text mode cursor characteristics. When s is 0, software cursor is selected and x, y define masks to be used when modifying character-attribute word in screen memory associated with position under cursor. This word is logicaly ANDed with x and the result is XORed with y. When s is 1, a hardware cursor is selected and x, y define first and last scan lines of the cursor box within character box. X must be not greater than y and both must be in range 0-7 for Color Graphics Adapter or 0-13 for Monochrome Display Adapter, Hercules Graphics Card and Enhanced Graphics Adapter. +Examples: +call defcursor(0, -1, 30464) + - selects standard (reverse video) software cursor +call defcursor(1, 11, 12) + - selects standard hardware cursor for HGC} + +getmovement:procedure(output h, v:integer) +{Returns relative mouse movement since last call (in 1/200 inches).} + +setspeed:procedure(h, v:integer) +{H and v specify horizontal and vertical cursor speed relative to mouse speed. It is expressed in mouse steps (1/200 inch) corresponding to 8 pixels on screen. Default is 8 horizontaly and 16 verticaly. +Examples: +call setspeed(1, 1) + - set maximum cursor speed +call setspeed(16, 32) + - set cursor speed two times slower than default} + +setthreshold:procedure(s:integer) +{sets threshold speed for double speed feature. If the mouse moves faster than the threshold, the cursor speed on the screen is doubled. Default threshold is 64 mouse steps/second. + +Example: +call setthreshold(10000) + - efectively disable double speed feature.} + + +end MOUSE; + +APPENDIX C : PREDEFINED PROCEDURES AND FUNCTIONS + ENDRUN:procedure; + Terminates program execution (ABORT). + + RANSET:procedure(x:real); + Initializes random generator (for RANDOM function) + + RANDOM:function:real; + Generates uniformly distributed pseudo-random numbers in the interval (0,1). + + SQRT:function(x:real):real; + Computes square root of parameter x. + + SIN:function(x:real):real; + Computes sinus of parameter x. + + COS:function(x:real):real; + Computes cosinus of parameter x. + + TAN:function(x:real):real; + Computes tangens of parameter x. + + EXP:function(x:real):real; + Computes e**x. + + LN:function(x:real):real; + Computes natural logarithmus of parameter x. + + ATAN:function(x:real):real; + Computes arcus tangens of parameter x. + + ENTIER:function(x:real):integer; + Computes entier part of parameter x. + + ROUND:function(x:real):integer; + Computes rounded value of parameter x: ROUND(x)=ENTIER(x+0.5). + + IMIN:function(x, y:integer):integer; + Computes minimum of two parameters. + + IMAX:function(x, y:integer):integer; + Computes maximum of two parameters. + + IMIN3:function(x, y, z:integer):integer; + Returns the minimum of three parameters. + + IMAX3:function(x, y, z:integer):integer; + Returns maximum of three parameters. + + ISHFT:function(x, k:integer):integer; + Logically shifts x by k bits: left, when k is positive, right otherwise. + + IAND:function(n, k:integer):integer; + Returns logical product of parameters (on all bits). + + IOR:function(n, k:integer):integer; + Returns logical sum of parameters (on all bits). + + XOR:function(n, k:integer):integer; + Returns exlusive sum of parameters (on all bits). + + INOT:function(n:integer):integer; + Returns logical complement of parameters (on all bits). + + ORD:function(c:char):integer; + Returns number that represents character c (see APPENDIX F). + The following equations are satisfied: CHR(ORD(c)) = c &ORD(CHR(n)) = n + + CHR:function(n:integer):char; + Returns character represented by parameter n (see APPENDIX F). + + UNPACK:function(s:string):arrayof char; + Returns address of new array object containing characters of the string s. + + MEMAVAIL:function:integer; + Returns the size of available memory in the current process (in words). + + EXEC:function(cmd:arrayof char):integer; + Calls secondary command processor with cmd as a command string. Exit code is returned as a value of EXEC. + + TIME:function: integer; + Returns an integer value indicating the amount of central processor time in seconds used by current process. + + RESET:procedure(f:file); + Positionnes file f at the first component and readies it to reading. + + REWRITE:procedure(f:file); + Positionnes file f at the first component and readies it for output. + The file f becomes empty (eof(f) = true). + + UNLINK:procedure(f:file); + Closes and deletes file f (see 3.3.4) + + SEEK:procedure(f:file; offset, base:integer); + Positiones file pointer (see 3.3.7) + + POSITION:function(f:file):real; + Reads position of file pointer (see 3.3.7) + + +APPENDIX D : ERROR CODES + 0 - ***declaration part overloaded +Overflow of compiler data structure of declaration part. Possible reasons: too complicated program structure (too many classes, protection lists, parameter lists,...), too complicated function expressions e.g. f(g(h(...))). It is possible that removing some errors e.g. "unvisible identifier" causes shortening of the program. + 10 - ***too many errors +Overflow of error diagnostic table. 1024 first detected errors are printed, but global number of error is equal to number of all detected errors. + 41 - ***declaration part overloaded +Comments as for 0. + 101 - ':=' expected + 102 - ';' expected + 103 - 'then' expected + 104 - 'fi'/'else' expected + 105 - 'od' expected + 106 - '(' expected + 107 - ')' expected + 108 - 'do' expected + 109 - identifier expected + 110 - too many exits found + Length of sequence exit exit ...exit exceeds level of loop nesting +1. + 111 - illegal character + 112 - wrong structure of 'if'-statement + 113 - 'end' missing + 114 - '.' expected + 115 - illegal constant in expression + Character constant or text appears in logical or arithmetical expression. + 116 - '=' expected + 117 - constant expected + 118 - ':' expected + 119 - unit kind specification expected +Keywords: class, procedure, function, coroutine or process missing in module headline. + 120 - 'hidden' or 'close' occurred twice + 121 - 'hidden' or 'close' out of a class + 122 - 'block' expected + 123 - object expression is not a generator +Object expression appearing as instruction is not a generator e.g. new (a).b + 124 - 'dim' expected + 125 - 'to'/'downto' expected + 126 - illegal arithmetic operator + 127 - declaration part expected + 128 - incorrect identifier at 'end' +Module name after end does not correspond to name in module headline. + 129 - wrong structure of 'case'-statement + 130 - wrong structure of 'do'-statement + 131 - illegal use of 'main' + Name main may be used only as an argument of attach operator; in other cases it is illegal. + 132 - 'when' expected + 133 - too many branches in 'case'-statement +Number of branches in case instruction is greater than 160. + 134 - 'begin' missed + 135 - bad option + 136 - is it really a loglan program??? +There is no Loglan keyword found in source program like: begin, block, unit, class,... + 137 - 'block' missed - parsing began +There is no keyword block or program at the beginning of the Loglan program. This message indicates the source line, that is the first compiled line. + 138 - 'repeat' out of a loop + The length of sequence: (exit)*repeat exceeds nested depth of the loop. + 139 - there is no path to this statement + 140 - 'andif'/'orif' mixed + 141 - array of 'semaphore' is illegal + 142 - wrong handler end +Handler declaration is not ended by instruction end or end handlers. + 143 - lastwill inside a structured statement + 144 - repeated lastwill +Label LASTWILL appears more than once in the same module. + 145 - no parameter specification + 146 - wrong register specification + 147 - "," expected + 191 - ***null program +There is no source program on the input file or there is no module declaration. Causes termination of program compilation. + 196 - ***too many identifiers +Entire length of all identifiers and keywords is greater than 3000 characters. This overflow terminates program compilation. + 197 - ***too many formal parameters +The length of formal parameter list and declared local variables (in actual module) is greater than 130. This error terminates program compilation. + 198 - ***parsing stack overloaded +Too complicated (nested) program structure. This error terminates program compilation. + 199 - ***too many prototypes +Too many declarations in program caused overflow of the compiler data structure. This error terminates program compilation. + 201 - wrong real constant + 202 - wrong comment + 203 - wrong character constant + 204 - wrong integer constant + 205 - integer overflow +Integer constant out of range. + 206 - real overflow +Real constant out of range. + 211 - identifier too long +Length of identifier is greater than 20 characters. + 212 - string too long +Length of string constant is greater than 260 characters. + 301 - prefix is not a class id +Prefix name ID is not a class name. It may appear when identifier ID is used earlier (declared more than once). + 303 - coroutine/process illegal here as prefix id +Procedure, function or block can't be prefixed by coroutine or process. + 304 - hidden identifier cannot be taken id +Identifier ID placed on taken list is on hidden list in the prefixing module. + 305 - undeclared identifier id + 306 - undeclared type identifier id + 307 - type identifier expected id +Identifier ID used in variable or function declaration as a type name, is not declared earlier as a type (but name has been used earlier). + 308 - undeclared prefix identifier id + 309 - declared more than once id + 310 - taken list in unprefixed unit + 316 - formal type specification after use id +Formal type ID appears in the parameter list after using this identifier as parameter type e.g. (... x: ID; type ID, ...). + 317 - hidden type identifier id +Type name ID is on hidden list in a prefix of one of the modules from SL chain of actual module and it is a nearest declaration of this identifier. + 318 - type identifier not taken id +Type name ID is not on taken list in a prefix of one of the modules from SL chain of actual module. + 319 - hidden identifier in the list id +Identifier ID from hidden or close list is on hidden list in one of the prefixing modules. + 320 - identifier in the list not taken id +Identifer ID from hidden or close list is not placed on taken list in none of the prefixing modules. + 321 - identifier cannot be taken id +Identifer ID from taken list is placed on taken list in none of the prefixes. + 322 - hidden prefix identifier id +Analogical to 317 error. + 323 - prefix identifier not taken id +Analogical to 318 error. + 329 - only procedure and function may be virtual + virtual specification appears with class specification. + 330 - virtual in unprefixed block/procedure/function + 331 - incompatible kinds of virtuals id +Kind of virtual module ID is different from kind of replaced module (e.g. one of them is a function, the other one is a procedure). + 332 - incompatible types of virtuals id + Type of virtual function ID is different from type of replaced function. + 333 - different lengths of form.param.lists in virtuals id +Virtual module ID and replaced module have different number of formal parameters. + 334 - conflict kinds of the 1st level parameters id +In the headline of virtual module ID kind of formal parameter differs from corresponding formal parameter in the headline of replaced module (e.g. type and variable, input and output parameters,.). + 335 - incompatible types of the 1st level parameters id +There are formal parameters of different types (function, procedure) in the headline of virtual module ID and in the headline of replaced module on the same position. + 336 - different lengths of the 2nd level params lists id +There are formal procedures/functions with different numbers of parameters in the headline of virtual module ID and in the headline of replaced module on the same position. + 337 - incompatible kinds of the 2nd level parameters id +There are parameters of different kinds on the same position in the corresponding procedure or function parameters in the headline of virtual module ID and in the headline of replaced module. + 338 - incompatible types of the 2nd level parameters id +There are parameters of different types on the same position in the corresponding procedure or function in the headline of virtual module ID and in the headline of replaced module. + 341 - ***declaration part overloaded +Analogical to error 0. + 342 - ***too many classes declared + 343 - ***too many prototypes +Too many modules declared on the same level. + 350 - undeclared signal identifier id + 351 - hidden signal identifier id +Analogical to error 317. + 352 - signal identifier not taken id +Analogical to error 318. + 353 - signal identifier expected id +Identifier ID placed in handler declaration as a signal name has not been declared as a signal. + 354 - different types of parameters id +In the headlines of signals, that have common handler, parameters of the different types appear on the same position. ID is one of these parameters. + 355 - incompatible kinds of parameters id +In the headlines of signals that have common handler, parameters of different kinds appear on the same position. ID is one of these parameters. + 356 - different identifiers of parameters id +In the headlines of signals that have common handler parameters of different names appear on the same position. ID is one of these parameters. + 357 - incompatible kinds of the 2nd level parameters id +Analogous to error 355 for 2-nd level parameters. + 358 - different types of the 2nd level parameters id +Analogous to error 354 for the 2-nd level parameters. + 359 - different lengths of the 2nd level params lists id +There are formal procedures or formal functions with different number of parameters on the same position in the headlines of signals this have common handler. ID is one of these formal parameters/functions. + 360 - different lengths of form. param. lists in signals id +There are different number of formal parameters in the signals that have common handler. ID is one of these signals. + 361 - non-local formal type cannot be used id +Formal parameter ID of signal is of non local formal type. + 362 - repeated handler for signal id +There are more than one handler for signal ID in the same module. + 370 - only 'input' is legal here +Formal parameter output or inout is illegal in process. + 398 - class prefixed by itself id +Construction unit ID: ID class is not allowed. + 399 - cycle in prefix sequence id +ID is a class identifier used in cyclic prefixing i.e. ID prefixes a, a prefixes b, ... , z prefixes ID. This construction is not allowed. + 401 - wrong label in 'case' id +Label in case instruction is not a constant. + 402 - 'case' statement nested too deeply +Nesting level in case instruction is greater than 6. + 403 - too long span of 'case' labels +Range of branches in case instruction is greater than 160. + 404 - repeated label in 'case'-statement id +Label ID appears more than once in case instruction. + 405 - illegal type of 'case' expression id +Control expression in case statement is not of + integer or char type. + 406 - different types of labels and 'case' expression + 407 - non-logical expression after 'if'/'while' id + 408 - real constant out of integer range +Error during conversion of real constant to integer constant. + 410 - simple variable expected id +Control variable in for loop is not a simple variable. + 411 - non-integer control variable id +Control variable ID in for loop is not of integer type. + 412 - non-integer expression id +Expression placed as array index or bound limit in array generation or as step in for loop or as format in write statement should be reducable to integer type. + 413 - file expression expected id + 414 - string expression expected id + 415 - reference expression expected id +Expression placed before dot (remote access), before qua or as a argument of kill or copy statement is not of class type. + 416 - array expression expected id + 417 - boolean expression expected id + 418 - semaphore variable expected + 419 - illegal type in 'open' +The type name placed in open is different than TEXT, REAL, INTEGER, CHAR and DIRECT. + 420 - variable expected id +Expression placed on the left side of assignment statement or as an argument of read instruction or in array instruction is not a variable. + 421 - class identifier after 'new' expected id +Identifier ID placed after new is not a class identifier. + 422 - procedure identifier after 'call' expected id + 423 - 'new' missing id +Keyword new doesn't appear before class identifier for object generation. + 424 - 'call' missing id +Keyword call doesn't appear before procedure identifier for procedure call. + 425 - 'inner' out of a class + 426 - 'inner' occurred more than once + 427 - 'wind'/'terminate' out of a handler + 428 - 'inner' inside lastwill + 429 - definition cannot be reduced to constant id +Identifier ID placed in constant definition is not a constant. + 430 - undefined constant in the definition id + 431 - wrong number of indices id +Number of indices in referencing to array element is different from declared number of indices. + 432 - index out of range id + 433 - upper bound less than lower bound id + 434 - too many subscripts id +Dimension of static array ID is greater than 7. + 435 - variable is not array id + 440 - type identifier expected after 'arrayof' id +Identifier ID placed after arrayof in actual parameter list, corresponding to type parameter is not a type name. + 441 - incorrect format in 'write' +There is format for expression of char type or there is double format for expression of type integer or string. + 442 - illegal expression in 'write' +Argument of write statement is not of type char, string, integer or real. + 443 - illegal type of variable in 'read' id +Argument of read statement is not of type char, integer or real. + 444 - no data for i/o transfer +There is only file identifier in I/O instruction. + 445 - illegal expression in 'put' + 446 - illegal expression in 'get' + 448 - 'raise' missing id +There is signal identifier without keyword raise in the context of signal raising. + 449 - signal identifier expected id +Identifer ID after keyword raise is not a signal identifier. + 450 - illegal procedure occurrence id +Procedure name ID appears in illegal context. + 451 - illegal class occurrence id +Class name ID appears in illegal context. + 452 - illegal type occurrence id +Type name ID appears in illegal context. + 453 - illegal signal occurrence id +Signal name ID appears in illegal context. + 454 - illegal operator occurence + 455 - wrong number of operands + 460 - divided by zero + 470 - illegal input parameter id +Actual parameter associated with input parameter is not expression that may have any value: it is e.g. procedure name + 471 - illegal output parameter id +Actual parameter corredponded to output parameter is not a variable. + 472 - illegal type parameter id +Actual parameter ID associated with type parameter is not a type name. + 473 - illegal procedure parameter id +Actual parameter ID associated with procedure parameter is not a procedure name. + 474 - illegal function parameter id +Actual parameter ID associated with function parameter is not a function name. + 475 - illegal left side of 'is'/'in' id +Left side argument ID of is/in is not a reference expression. + 476 - illegal right side od 'is'/'in' id +Right side argument ID of is / in is not a class name. + 477 - illegal parameter of 'attach' id +Parameter ID of attach statement is not a reference variable of class object. + 478 - illegal type of expression + 479 - negative step value + 550 - ***stack overloaded +This error may be removed by dividing expressions into subexpressions, making simpler nested callings of arrays, functions, classes and for loops. This error terminates compilation of current module, but other modules will be compiled. + 551 - ***too many auxiliary variables needed +Too complicated expressions. This error may be removed by declaration of additional variables and using them as auxiliary variables in expressions. + 552 - ***too many auxiliary reference variable needed +Analogical to error 551. + 553 - ***statement sequence too long or too complicated +This error may be removed by adding 'goto' statement into sequence of instructions e.g. if false then exit fi, inner, ... or by dividing complicated expression into subexpressions. + 554 - ***real constants dictionary overflow +Too many real constant, maybe because of evaluation of expressions built from real constants. + 600 - undeclared identifier id + 601 - illegal type before '.' id +Expression placed before dot (remote access) is not of class type. + 602 - close identifier after '.' id +Identifier ID placed after dot is on close list in the class or its prefix that construct expression before dot. + 603 - undeclared identifier after '.' id +Identifier ID placed after dot is not attribute of expression placed before dot. It may be caused by missing declaration or using bad prefix for class constructing expression before dot. + 604 - illegal operand type id +One of the arguments in arithmetical expression or in relation is not of arithmetical type. + 605 - illegal type in 'div/'mod' term id +Expression identified by ID used as argument of div or mode operation is not of integer type. + 606 - incompatible types in comparison id +ID is an identifier of left argument of relation. + 607 - unrelated class types in comparison id +ID is an identifier of left argument of relation. Both arguments are of class type and none of these classes prefixes the other one. + 608 - string cannot be compared id +ID identifies a string. + 609 - incompatible types in assignment/transmission id +ID is an identifier of left side of assignment statement or an identifier of actual parameter in object generation. Types of both sides of instruction or type of formal parameter and type of actual parameter are incompatible. + 610 - unrelated class types in assignment/transmission id +Analogical to errors 609 and 607. + 611 - constant after '.' id +An attempt to remote access to constant. + 612 - this class does not occur in sl-chain id + Class ID appeared in expression this ID, but ID dosn't prefix any module in SL chain of actual module. It may be a cycle. + 613,614 - class identifier expected id +For error 613: identifier ID used in expression this ID is not of class type. For error 614: identifier ID used in expression this ID is not name of any type. + 615 - illegal type before 'qua' id + Object expression before qua should be of one of the types: class, coroutine, process or simple (not array) formal type. + 616,617 - illegal type after 'qua' id +For error 616: identifier ID used after qua is not of any type. +For error 617: identifier ID used after qua is not of class type. + 618 - unrelated types in 'qua'-expression id +Identifier ID is a name of class type used after qua. This class type and class type used before qua doesn't prefix each other. + 619 - hidden identifier id +Identifier ID used in construction qua ID or this ID is on hidden list in the prefix of one of the module from SL chain of actual module. + 620 - not taken identifier id +Identifier ID used in construction qua ID or this ID is not on taken list in any prefix of any module of actual module. + 621 - invisible identifier after '.' id +Identifier ID placed after dot is on hidden list or is not on taken list in prefix. + 622 - formal parameter list is shorter id +Identifier ID identifies generated object: class, procedure or function. Formal parameters list of this object is shorter than actual parameters list. + 623 - formal parameter list is longer id +Analogical to error 622. + 624 - actual parameter is not a reference type id +Actual parameter identified by ID in generated object can't be of primitive type: integer, real, boolean or string. + 625 - actual parameter is not a type id +Actual parameter identified by ID is not a type, so it can't replace formal type parameter. + 626 - procedure-function conflict between parameters id +Actual parameter, identified by ID, that replaced formal parameter in generated object is function whereas formal parameter is a procedure or vice versa. + 627 - unmatched heads-wrong kinds of parameters id +ID identifies actual module that replaced formal module. There are parameters of different kinds on the same position in the headlines of these modules. For input - output conflict the agreement of parameter types is checked also. + 628 - unmatched heads-incompatible types in lists id +ID identifies actual module that replaced formal module. There are input /output parameters of different types on the same position in the headlines of actual and formal module. + 629 - unmatched heads-unrelated class types in lists id +ID identifies actual module that replaced formal module. There are input/output parameters specifying classes of disjointed prefix sequences +in the headlines of actual and formal module. + 630 - unmatched heads-different numbers of parameters id +There are different lengths of headlines in actual module identified by ID and formal module. + 631 - incompatible types of function parameters id +There are different types of actual function specified by identifier ID and formal function in generated object. + 632 - function/procedure expected id +Actual parameter identified by identifier ID is not function/procedure, whereas corresponding formal parameter is function/procedure. + 633 - actual function type defined weaker than formal id +Type of actual function identified by ID is weaker defined than formal function type e.g. formal function type is statically defined, whereas actual function type is formal (external) or formal function is class, whereas actual function type is coroutine or process. + 634 - unmatched heads-too weak type in actual list id +There are input/output parameters on the same position in the headlines of actual module identified by identifier ID and formal module, but ID is weaker defined than corresponding formal module parameter (see error 633). + 635 - standard function/procedure cannot be actual par. id +ID identifies standard procedure/function used as actual parameter. + 636 - illegal use of semaphore id + 637 - 'semaphore' cannot be used id + + +APPENDIX E : LOGLAN RUNTIME ERRORS + In the following list system signal name, raised after detection of runtime error, is placed in brackets. + +ARRAY INDEX ERROR (CONERROR) +Index outside range during reference to array variable. +NEGATIVE STEP VALUE (CONERROR) + +SL CHAIN CUT OFF (LOGERROR) +Control transfer to object that has SL link cut off earlier in the consequence of kill operation. +ILLEGAL ATTACH (LOGERROR) +The value of parameter of attach instruction is none or object differs from coroutine. +ILLEGAL DETACH (LOGERROR) +An attempt to return by detach to coroutine that has been dealocated (by kill). +ILLEGAL RESUME (LOGERROR) +An attempt to resume an object which is not a process or a process which is running. +TOO MANY PROCESSES ON ONE MACHINE (SYSERROR) +Number of processes existing on one computer is greater than 64. +INVALID NODE NUMBER (SYSERROR) +An attempt to create a process on a computer which is not connected to network. +IMPROPER QUA (LOGERROR) +Error during computing expression of the form: ...x qua a, when 'x' references to none or 'a' doesn't prefix dynamic type object, which is value of 'x'. +ILLEGAL ASSIGNMENT (TYPERROR) +Type conflict between left and right side of assignment instruction. +FORMAL TYPE MISSING (LOGERROR) +Formal type is not accessible because of SL cut off. +ILLEGAL KILL (LOGERROR) +An attempt to deallocate object in SL chain of active object. +ILLEGAL COPY (LOGERROR) +An attempt to copy non terminated object (i.e. class before execution of return statement, coroutine before execution of end statement...). +REFERENCE TO NONE (ACCERROR) +An attempt to remote access (by dot) to attributes of non existing object: dealocated or not generated. +MEMORY OVERFLOW (MEMERROR) + +INCOMPATIBLE HEADERS (TYPERROR) +Actual parameter list of generated object (procedure, function or class) is incompatible with formal parameter list from module declaration or formal function type is incompatible with actual function type. + +INCORRECT ARRAY BOUNDS (CONERROR) +An attempt to generate dynamic array object, when lower bound of + index range is greater than upper bound. +DIVISION BY ZERO (NUMERROR) + +COROUTINE TERMINATED (LOGERROR) +An attempt to transfer control to a terminated coroutine. +COROUTINE ACTIVE (LOGERROR) +An attempt to transfer control to an active coroutine. +HANDLER NOT FOUND (LOGERROR) +There is no handler for signal declared by user. +ILLEGAL RETURN (LOGERROR) +An attempt to execute return instruction in handler serving system signal. +UNIMPLEMENTED STANDARD PRC. (LOGERROR) +Standard procedure or function is not implemented. +FORMAL LIST TOO LONG (MEMERROR) +Formal parameter list is greater than 40. +ILLEGAL I/O OPERATION (SYSERROR) +Reading after writing, the type of the read/write parameter does not match the type of the file etc. +I/O ERROR (SYSERROR) + System error during I/O. +CANNOT OPEN FILE (SYSERROR) + +INPUT DATA FORMAT BAD (SYSERROR) + +SYSTEM ERROR (SYSERROR) +Should not occur. +UNRECOGNIZED ERROR + +APPENDIX F : CHARACTER SET +At the top of the table are hexadecimal digits (0 to 7), and to the left of the table are hexadecimal digits (0 to F). Hexadecimal code of ASCII character is constructed by contatenation of column label and row label. For example, the value of character representing the plus sign is 2B. + + 0 1 2 3 4 5 6 7 + _________________________________________________ + ! ! ! ! ! ! ! ! ! + 0 ! NUL ! DLE ! SP ! 0 ! @ ! P ! ! p ! + _________________________________________________ + ! ! ! ! ! ! ! ! ! + 1 ! SOH ! DC1 ! ! ! 1 ! A ! Q ! a ! q ! + _________________________________________________ + ! ! ! ! ! ! ! ! ! + 2 ! STX ! DC2 ! " ! 2 ! B ! R ! b ! r ! + _________________________________________________ + ! ! ! ! ! ! ! ! ! + 3 ! ETX ! DC3 ! # ! 3 ! C ! S ! c ! s ! + _________________________________________________ + ! ! ! ! ! ! ! ! ! + 4 ! EOT ! DC4 ! $ ! 4 ! D ! T ! d ! t ! + _________________________________________________ + ! ! ! ! ! ! ! ! ! + 5 ! ENQ ! NAK ! % ! 5 ! E ! U ! e ! u ! + _________________________________________________ + ! ! ! ! ! ! ! ! ! + 6 ! ACK ! SYN ! & ! 6 ! F ! V ! f ! v ! + _________________________________________________ + ! ! ! ! ! ! ! ! ! + 7 ! BEL ! ETB ! ' ! 7 ! G ! W ! g ! w ! + _________________________________________________ + ! ! ! ! ! ! ! ! ! + 8 ! BS ! CAN ! ( ! 8 ! H ! X ! h ! x ! + _________________________________________________ + ! ! ! ! ! ! ! ! ! + 9 ! HT ! EM ! ) ! 9 ! I ! Y ! i ! y ! + _________________________________________________ + ! ! ! ! ! ! ! ! ! + A ! LF ! SUB ! * ! : ! J ! Z ! j ! z ! + _________________________________________________ + ! ! ! ! ! ! ! ! ! + B ! VT ! ESC ! + ! ; ! K ! [ ! k ! { ! + _________________________________________________ + ! ! ! ! ! ! ! ! ! + C ! FF ! FS ! , ! < ! L ! \ ! l ! | ! + _________________________________________________ + ! ! ! ! ! ! ! ! ! + D ! CR ! GS ! - ! = ! M ! ] ! m ! } ! + _________________________________________________ + ! ! ! ! ! ! ! ! ! + E ! SO ! RS ! . ! > ! N ! ^ ! n ! ~ ! + _________________________________________________ + ! ! ! ! ! ! ! ! ! + F ! SI ! US ! / ! ? ! O ! _ ! o ! DEL ! + _________________________________________________ + + +where: + NUL Null DLE Data Link Escape + SOH Start of Heading DC1 Device Control 1 + STX Start of Text DC2 Device Control 2 + ETX End of Text DC3 Device Control 3 + EOT End of Transmission DC4 Device Control 4 + ENQ Enquiry NAK Negative Acknowledge + ACK Acknowledge SYN Synchronous Idle + BEL Bell ETB End of Transmission Block + BS Backspace CAN Cancel + HT Horizontal Tabulation EM End of Medium + LF Line Feed SUB Substitute + VF Vertical Tab ESC Escape + FF Form Feed FS File Separator + CR Carriage Return GS Group Separator + SO Shift Out RS Record Separator + SI Shift In US Unit Separator + SP Space DEL Delete +BIBLIOGRAPHY +Last update: {TIME \@ "MMMM d, yyyy"|March 21, 1994} + +Should you like to read on Loglan and its companion Algorithmic Logic, here it is, a short list of more important papers. + I. LOGLAN'82 +Bartol,W.M., et al. +Report on the Loglan 82 programming Language, +Warszawa-Lodz, PWN, 1984 + +A.Kreczmar +A micro-manual of the programming language LOGLAN-82, +Institute of Informatics, University of Warsaw, 1984 +(there exists a french translation of the above manual) +(both texts are distributed together with this package) + +A.Kreczmar, A.Salwicki, M. Warpechowski, +Loglan'88 - Report on the Programming Language, +Lecture Notes on Computer Science vol. 414, Springer Vlg, 1990, +ISBN 3-540-52325-1 + +/* do you know polish? istnieje dobry podrecznik Loglanu! */ +A.Szalas, J.Warpechowska, +LOGLAN, +Wydawnictwa Naukowo-Techniczne, Warszawa, 1991 ISBN 82-204-1295-1 + + +Some papers devoted to the problems and challenges of Loglan. + +Bartol,W.M., Kreczmar, A., Litwiniuk, A., Oktaba, H., +Semantic and Implementation of Prefixing at Many Levels, +in Lecture Notes in Computer Science vol.148, Springer Verlag, Berlin, +1983, pp.45-80 + +Krause,M., Kreczmar, A., Langmaack, H., Salwicki,A., +Specification and Implementation Problems of Programming Languaages +Proper for Hierarchical Data Types, +Report 8410 of Institut fuer Informatik und Praktische Mathematik +Christian-Albrechts-Universitaet Kiel, 1984, pp.1-68 + +Kreczmar,A., Salwicki,A., +Concatenable Type Declarations, Their Application and Implementation +in: Programming Languages and System Design, in Programming, Languages and System Design Proc. IFIP TC2 Conference (J.Bormann ed.) Dresden, 1983 +North Holland, Amsterdam, 1983, pp.29-41 + + +Cioni, G., Kreczmar, A., +Modules in high level programming languages +in: Advanced Programming Methodologies (G.Cioni, A.Salwicki eds.) +Academic Press, London, 1989, 247-340 + +Kreczmar, A., +On inheritance Rule in Object Oriented Programming +in: Advanced Programming Methodologies +Academic Press, London, 1989, pp. 141-164 + +Cioni,G., Kreczmar,A., Vitale, R., +Storage Management +in: Advanced Programming Methodologies +Academic Press, London, 1989, pp.341-366 + + +Cioni, G., Kreczmar, A., +Programmed deallocation without Dangling References, +IPL, vol. 18 1984, pp. 179-185 + +Krause, M., Kreczmar, A., Langmaack, H., Warpechowski, M., +Concatenation of program modules, an Algebraic Approach to the Semantic and Implementation Problems, +in: Proc. Computation Theory, LNCS 208, Springer Vlg, Berlin, 1986, pp. 134-156 +full text in: Report 8701 of Institut fuer Informatik und Praktische Mathematik +Christian-Albrechts-Universitaet Kiel, 1987, pp.1-48 + +Krause, M., +Die Korrektheit einer Implementation der Modulpraefigerung mit reiner Static Scope Semantik, +Report 8616 of Institut fuer Informatik und Praktische Mathematik +Christian-Albrechts-Universitaet Kiel, 1986, pp.1-139 + +Langmaack, H., +On static Semantic of Prefixing (=inheritance), +Talk delivered during the Summer School on Loglan'82, Zaborow, September 1983 + + +Ph.D. thesis (in polish!) related somehow to Loglan project. + +Szalas, A., +On parallel processes, 1984 + +Gburzynski, P., +GPR - theorem prover 1982 + +Petermann, U., +On file system and signalling exceptions between processes 1987 + +Oktaba, H. +On Formalisation of the Notion of Reference and its Applications in Theory of Data Structures, 1982 + +Bartol, W.M., +Application of Static Structure of Type Declarations and the System of Dynamic Configurations in a Definition of Semantics of a Universal Programming Language 1981 + +Szczepanska-Wasersztrum, D., +A logical system for reasoning about exceptions,1990 + +Litwiniuk, A.I., +Several algorithms for optimisation of code in presence of nesting, 1988 + +Jankowska-Puchalka B. +A code genarator generator for an object oriented language, 1992 +II. Algorithmic Logic +There is a monograph: + +G.Mirkowska, A.Salwicki, +Algorithmic Logic, +D.Reidel & Polish Scientific Publ., Dordrecht & Warszawa, 1987, ISBN 83-01-06859-0 + the book contains a chapter devoted to certain problems of Loglan. + +A new book on AL appeared in polish +G.Mirkowska, A.Salwicki, +Logika algorytmiczna dla programistow, +Wydawnictwa Naukowo-Techniczne, Warszawa, 1993 (ISBN 83-204-1296-X). +An english version in preparation. + + +There are many papers discussing the applications of AL in programming. + +Salwicki, A., +Development of Software from Algorithmic Specifications +in: Advanced Programming Methodologies +Academic Press, London, 1989, pp.1-40 + +Salwicki, A., +On algorithmic theory of Stacks, +in Proc. MFCS'78 (J.Winnkowski ed.), LNCS 63, Springer Berlin 1978, pp. + +Salwicki, A., +On algorithmic theory of dictionaries, +Proc. Logic of Programs (E.Engeler ed.), LNCS 125, Springer, Berlin 1981 pp.145-168 + +Müldner, T., Salwicki, A., +On algorithmic Properties of Concurrent Programs, +in: Proc. Logic of Programs (E.Engeler ed.), LNCS 125, Springer, Berlin 1981 pp.170-193 + +Mirkowska,G., Salwicki, A., +On applications of Algorithmic Logic, +in: Proc. CAAP'86 (P. Franchi-Zanetacci ed.) Springer, 1986 pp.288-306 + +Mirkowska,G., Salwicki, A., +Axiomatic definability of programming language semantics, +in: Proc. IFIP Working Conf on Formal Description of Programming Concepts +Ebberup 1986 (M. Wirsing ed.) +Noth Holland, Amsterdam, 1986, pp1-15 + +Mirkowska,G., Salwicki, A., +On Axiomatic Definition of Max-model of concurrency, +in Proc. Advanced School on Mathematical Models of Parallelism Rome 1986 +(M. Venturini-Zilli ed.) LNCS Springer Berlin + +Salwicki, A., +Algorithmic Theories of Data Structures, +in Proc. ICALP'82 (M.Nilsen, E.Schmidt eds.) LNCS 140 Springer, Berlin, 1982, pp. 458-472 +III. Related literature +on object programming is immense. + +Let us quote a few books: + +E. Horowitz, +Fundamentals of Programming Languages, +Springer, New York, 1983 + + +O.-J. Dahl, B. Myhrhaug, K. Nygaard, +Simula 67 Common Base Language, +Norwegian Computing Center, Oslo, 1970 the mother of object languages!! + +B. Meyer, +Object-oriented software construction, +Prentice Hall, 1988 + +B. Stroustrup +The C++ Programming Language, +Addison-Wesley, Reading, Mass., 1991 + +on logics of programs: + +see a survey + +D. Kozen, J. Tiuryn +Logics of Programs, +in: Handbook of Theoretical Computer Science, vol.B, Formal Models and Semantics +Elsevier, Amsterdam, 1990, pp. 789-998 +{PAGE|40} Loglan'82 user's manual + +Loglan'82 users's manual {PAGE|39} + + diff --git a/doc/userman2.doc b/doc/userman2.doc new file mode 100644 index 0000000000000000000000000000000000000000..07ea27b128d5b298af7a37193ef250b9508fd178 GIT binary patch literal 151097 zcmeFaOLJUTmhZ4oCFusd)wmPC@A~_{zV*M+X8G3t!{2{n zKc|`d8uj*8Jim48|GjnV&py2MOMmr8{r%Ag*Z=QB{xlk!+fO%Fx9&V#oNiQH|L4Wt z`tF^*;^~Wx$Lq!PH`Bj28X97wKN@$(lX0gQ92Xn?c zxvufowzu}zxAymZ8Go_Ay;gibC}tLBmuCLe&hGk?)wT7;(nlXG%r#!@ZEQU)9Cou0 z7mK~`_V(AG`%7N0Z9m`H*j(M;*xvGIi|N_=Zn5{x#{Sx~^}WWjx>}lRFfOosy1uo( z>z~+*WnS#;Za>{!eO`1fI){^SchGO#*EjcbZ-oJ1eRp?zcdzk4?;gxGc3*7GPCc)V zzrCY*?KM9A=!3;MChNZ!PqufTukQO(nn$Z*b7L5yk*z8~I z?gF)<0*+$i`OfD0bDr9QiehhPeQo2(#+tA1GkwU&xz+mPV(-OQd+Ynf_LJzQVU3sw zfPcLHWMhjq1(f>q#p=`bqFDFt_q>^=wgCigST!M$ed~W%KmcVXzbxkOP2^vdG83aQ;Uu|wk0_;5duCWBW z@esVvC00XfmyZE!vD!Ns47=mgv+iNBIXLMaHkO&TeYM2v-A=DPMvV5lo(wyU zWk}&KKl&h~8v?!9Kkbf+qru@sj9#1%2d}zEol((Ea(mD(`klkhXe0qW9u$Xzv-57R zQ?&a>A*VVTyVvgPrXc)V301l{ znY2$jEhP2maM(Ry>fL@Zv)efz495i%8K35{c7_8Db=K{l6r1tkOwk;5I>lGrgI-r} z&rdJ!YAO)J^#YuC`*e9c==BD#)e|EO>7f{nJLjXKXb<^$*!f}79WocKJ}l}5#70^BE+-?21j-Gb}%0(W1IK2&;W4dg*mXr%dVKlBv8JyfmCS$pkeG=bR1&_u_Ea0TiQR{CXft zxIOOP?)wCeA-vH_xzsAu3cYO3^$w5j8f^+5j62p~@oF??o9b3xvg3E*x6x!e4U{1fTYyDd-4vW0*mRBN}d84eD9 z(>WX)(wcMUheyR<7juWU6i5&tA59KBM>hFOqssa`N06{jlwpQxo|zg9cvT296%qBT zc27JH4Q7KwIBjP}o)bzJq(Lhdj+jPN3nDuPoZy0l%HlN=X#fOA=bgju@uim6?q9OD zGo*o}QJ*EXp&ICPIBFH+%kz$Sr)GeLEHwso#s>;#=i{P%e%`@ulsLE?OjtF{)9tr= zS9*9NDb;5bz0tseSvkpeckEyjE@H0TLkE>; z0!Qw*oij!N{Lse|7(V>ygY}Cx>aUXeELK-ii^r=NH{K%g=3#r}j# z!1Q#8gjEpOe*Bmb4%*|<4CckcT-579jSS-$=9KIV&inBHtkm9pXt`13GJS;_7`&ey_CXAtDtkS4( z2N(`{ZHs5_bbv@1F)^X+6j=y(HC}rxjn_SaR|OCdXkF4uKRYOlH9K%RU)=fRj+T07 z_Kt~aQFN6f0eGV%|Dd#DbGF$3#F_4zx4|`rXW{w^egyYkbxjda$pXtw-+rKwbi+h+AW^70P1kq8J$Z}LrQ~l3i=h}mrZXn(X$Si$5g8~ly^<->r_w5r=sv)08^Lt8e*|%jFqw;x8;Q7* zgaw%rv2(?f30=5lYabe~wGU6zOtst-L@$a43d>Z9oxf+)UThXxK>O$jc9DuHL@3>3 zlve)`yX+fH-OUVdPk*BhcJs06jjAo=5+E5B;@4}!5@Oecd^23CE`bSSq3UK+3P2wj zt%e;prGYBOkNR;F%F!H>Z3}sjS8^^jKb8=3Q%8%#8bcrtl0g=oh!bzHD)8xx;)~3x zUrIl~KE<=?7p810l=$qE;x({$i>4csFrG~EVXpajd+#1WZG0j1FJF1 zs8r9*@<&z_w34mq%*&-VgP;CNu_Iw8|55zl*ITR4*H`ROV)Tzb$k8`9UkoLNx+^No zo+j45#smP+ZjMi(QCy$wQ#tMyz?xe_DM~Y^-*@8oFgHR(y16lJWOVz<{H`eR(4SiP z4Z1S}gCCxV1oGh5PKIfhwolg8S?X0(+-Frk&Xn7=p*kVN>|!LjxnKpjRT!^x*9fKV zE6R2)&L*QV43rJ&Y_KEQ3G0Y7pXuKwmfv_Qi^XYTgj}>>R~6Q$3_CNvMXHh}6@67P zVXmV+e_fr4h(;PTVP#aBvM#Q&8JqhX6&dD%_yC3Lv^przT>FywmpDTg#@&YqTM5`K zUksi@q*f@W64wIH7a_gBtg^N@aR#rl3e5iQZ?5pMCRZx+7|XQXXmYN|1ZGss>)u)M zMbR&?of?w7XPq+{&!g^d)x$8ExJg4a!A!C6pePQyHa8H+Rw=9>{n+Bv^tqhz6RK?89;~6{H8QR?M)B{)QPI6UFmU%R%l{0+aWFQHyFU zilgrFF%}}raC={d(g51Fz|PX#vWzsA6P8f+A~mvLU~R3hA`IFlVjHoB&uNbNY$f~FYm@o3GdjS#$lVOLZ{ed7^wp}Nir5>Eqeq=ROvF^8KIcl-+f$h6M?8g zXl5;&MW+v9!eA=twBqq6Af4G6WR4~baUw<~xW-S+%4n)?-DjxP4E%^)U2okx?XSCc z;NFK~ZHWd;$KMC6YaD}!JeP1=zQ=F+e*N3k=R0$IyKAjt)6Ga5!`MV(sM1Kjk?6Sk zNUklyH-acKj3jh}fi$42x5_u^Wf}ogS2|3Rrt(PI#s+c6P(!@WWBHKIbC^L9tpck` zxX&Or`jNksrO98Jkgm*ymp5(J@R6qPzE$Z^1=`2Fa@0FwU8y?F!5n&BHQ&NIf#yw( z^KV|L8EgpCWK9R%Ve&(IQX_N~M%AX6CK-sbT0-8M8BHuoaT?4`&=<1~0&`10u|&2z zbH7bd@MN-Tn=eNG@!B4gn$5JOSmcMrg+-PqzooeI-`)|#6mpZeO;ZCjL0Db7q)XFI! zyQ^-M1v+Wfv%r?RLNpR813RPfaAKAK)(BXM&@9-2r<~gAw4!BRw__~^37c>@>CcY4 zL?L5fNx~A=7~?V2Nc)Pm&>+yw?VmVLdCb z&)jXJu0m}$i@$0VE^Y9C^ue~rEm}@%t_=eF$x1sXkOLclhpHiHWRx_O_BEm>r^_A& zlX)9cfe;8){s)2yS&_p$t{*HiH{D(${6f5v1~BUKxW8nA(2O*Mu7Oeg<5qEisfytX zcx0Ip$j*_9gU(5}f7^FkToLx!NFXv^rR2F{Gxm%^ftmK2?y4`jY>e#;H!XP3s`?iA(7X_tHceqFF}MuOBH{lcWfUh=$R2}v4vV#RQ;L2 zQ7>#fC8J#m7@uSCT1HOEy)QeL@=B7iDE7UYK_ceOgdj11a5n6`hZclMN&V|IaZvWb*gQD__O`au{ zUzq?lMXy8RI%EzLq^ZhW}S zH^Syw_qT2ZcAvwu%PWrAbN?pzJSa`#{F0HQIiWSZEM`vA!LY|-2v=8QI zvD1qy1IHAf@j7A*7$lt@4!ehLEgY&Y_(KZJ<_4KI+gqF837k7?1WfOdMOFOrmzAYH zs}ZF~L%i>5Bf-NWA?a0VzL)*_xE>m(TeLzM7Zc@q)LDdZ)E<-3VbL?ZD%tscW>`E} z{#D{i^#xTNTwUqI>r}_$UNvdCu7|~IyjI13F z&`Tf{_9FhK*h%TB%RVALu&AJYEkh4m*ECBji{o+R9L2G2jp90eLBqtOsm0f*3JHcb zNKnutJl{T0kf}Mun8m_PiI8E}X=6@%L9rHB{=i~m$|{KW=0CZ@aGRhC8O1Y49k^)F zL)YDHt`f!M1Wq0~}d&CHwg_W1P6-&M9tW{NM?*sibsS=*IO+K2bMXI%8~LySDufJR&t~G;fI~4iy%mXZkRDVhc%eDvWt2iu$HR3Zou%Z%6h+tFTRG z^&mbn3TMiwcm?q>D?y&ktE6M*wdBl1d^l3kM8X1T5oSbvyHXusHjQO{omouKg`ID3 zBc|D2vhgqgitkGpUmp__kAaFJiZ@w&nC{NbG%Y#kirBrvN&8RpzhJgyA&B5@}pVY)<}B@&5OJK z8bj`*4``zf_JvP8c13)p!}!&Z^WM>!uvwWNIxvb0^wPPYPr~X?O;omY)pw^UOMq+6 zRiRL_mqN{z%tft+XQF{06HW@UxrKc+i8JJ)L*(L4qm`q4^ zkwCP8Qi?d4pH}Pjk81OA)@B8vSINt6EL+v z%u?1GI6j{A&HZtUNwnw7ws=4}uZOY04Tr?6P&^M#X0=6d6aSRh=W|CC>phfLy-w#g}&^`w%1* z8G1*AL3UodcgOK1Eng6{SQ^%x7a>Cx@=`!knm08eYlI z7plI-CU>(Sn7`aG50zNP!5nq5_$0+NgJ@~73!-*XxCphf-!@EWn@Wm=0TTDXLL}xO zuH@kHiiA(ANT%fK3QDYf$=vk(b7rhJCh^W!GBY&&v%8-cNH$Z)=bu{_CjWA0ywv;D z_i?fEs90@w`7AxEw15mXoOZm(zBK%^_Z^22c(LkYGSWt&vgB|W?LuNWp*dC*uoY+J zB=|35$Q8cwaz3lahol?ks9h>VOG$S z=?hPrE0z?a@kSy@0|x>g4-Z2RqtEh3hh$3k9P-+gCopM|Xw2x_exOKwO;LvgTEFvp znxJA!$#@(Me?SH_k#6v6t4?#$8Zx&P1gthHN}PpgEaa)NrHNOMNA+Pc#zpx>oZ17> zVW(NAtER_uK3gJOBStxEEl~>u`P2X4$gmEJZ75v6zy47}FM>k{7CxHx7?wdSdEi1w$*JT(R8yK{YTh1&dZPK8` ziNp~hb?V$?)S?KBC%~ZMjYmlP%PTMiblq_;_|45Zk#Xpe!`?vtw&^ywUuIYY`mT7R zrHFk=KDDdsn~#pgV6s*C&rh02`A+Lz?C8OvHYtug9$<1}MJKn`_gnn)&F;qjy3Oy! z*5=06uUwxgX~x?$kME-KIM0GtCa@cTV9hKGN>N~a3O!eZs73c=w%?Px31*V(YPMDi zZq$ahd1-JL9g-Ddv<_MOmo|wTrr_(zlORAHG7JJ#jM3uW_vDn{I1MQm1As%sCLuIR zl47ECu;BPP0pf|UU8>Hb3YOK}NME)R;t2jTIpmO)QcUnqiB>=c3C~HCMCCS$NLf<3 z5=}quYFBRK-Zsm)oe%Cv1Uli=jud9X%tw=MTDv*7u!gOUG-=_iWq z$DcwD`$ig?Q<+8+mO>uObdkd?X>t?sFus_}GcrSzV_#-V(z3mUp!t+RO;zt{qM{pLw)Mn>3NF%vIv@;ifL(F2^& z_jf+P6L6{BH{`1D=g|`F#{b>I-#bEXKF^8NSjEb;g(W>{5=iV;LUSKWC#1Gvg#2_e zwPeSz;&xICBC&84WTM}`E%Vwpw<;PSFk?2rK06d*3@2gm5W(O5B*Fw6k5e$9V56fY z9tB}!OlI_v-dvia zMKMhhdV-`cmX5myup4b6GKyf^3vX3gBU2y?QD4gJ>*jBSdyvXx}i*%xPyv(myE6&08|3zzEwwt|x&XPLDa zU9vs1PA9x8kK)~@kU#q1u_feQb?C+{L^?^fT<8m@Qj3V2s#2by+%L1OFkk)Lp!UA8<$w z!Da@4I>}eE>9f#deVR_vahBX^%4KhT{a2!RGU_d=z-d;Jd)fFPn&EJ_6`T)j{RwyY z|Gv?htaV^We8D?0FQjGwvTnuLh!7zuHG;6#*tQ{EZiqbSBiVzMV|GHln}?DKu~Wfm zUpr=FhPs{95Lnc+CCLRdBMjzQin*+UI^SzCEoW%nF7P(RM)Q)Q6)_H5a@l&3)(QjC zK$B8eCf;*?p(H>JsPnC2-mL3cAmGM}(*vE>8qO}YiUqY~wivt?Hcq--fL-#1Pk%=L zi_!nP@#T72z>9R6Schh#S?_G`ZRq&CluG$WvsRp2d8mNhBA!I-jS9AXnlEjpE(lDfttRSs9NNU% zN3V2JC2*C1z-V={&H5_nR}4EnSGCD1Eu=A%a}*eFSf|NmDSVsbqYs|0zZk! zXlNhM)yy;o?0tQN_aVRvNvMuQE^dKv*(k$=+6ZvoIlN>C4MVBl9i0)zw%tVbW(kzW zh?w^E=(Z+LlJadThA6@wQTM;YlH0HyZZ`c1WwNPg9>ozF!=vh!+@i=OWGSg%iCU7U zXxl~{J0w7=s4N!28NomKgFtIIn4D-chtH0((SeG2BAqK%0YoG7YR;%cfTcMi@Nf1n z3`o{jB*_4I`L?#NiA^U}RgR;i`V0v&Oay{<`NR%{*(SnKhm*sm7KCRv&n4osS3*wx zQRla_I&w;O@F_cS2phwQ>P!68$|7;DXAcCfmS`KNJnQgfqXlN5Oh%qQ#&(_g zY2nSXH?KpkwlB+B4W(n)LAugpw{r#yI%fcVfpf{XsZ$)5b!ow0;@x<~zAp|AleO{s zR3{b!20(d#fH8I2WxtjTi-|i3oS|SlgYC3&H@X@O?-JpNx<71wLkV_3LApcP10)Y5 z&@m_9IyJ8;2#(H`H+j$jTtVh>*db0j6kn_I5~yGcXhHDG$5)I=Nc0kD28OWqG$x6v zn0$yib^4^U4m`JH+>SZ`<(`;M=J}Cu6!n?jkJwdkxcjja9rw^2*hf4uA~n+i1wBIb zkOISDlP>8f!>-&MuxRbg^3-+|@U`|!cLV7*xofC`)mFxfqoUSWlxO|u%%uz-c;+7G zpN%A(Hnrer<>QA8ENKMJu@l2O$ECASq2$f_P6Uw7iU3(lb~3%}C&Y$G3wFc!m|-~h z*+mMlUS^WE#+__TCHn@8W=ful$$PPtenFbOR1cJC5$hz$RK*vA8`%nsP-Iao*C1DA zBs#4wTwE%%UeAC}0uX1?yq$3x=U7x}rSViSVESroKuChX<}36aU@DuHE&+Z)eJKPoD*AxK#>+V~}JP(dzX<6+?I$JksG_JJclRbw)`}dZaHADic{DcoDdw zM1J;-xUic7KcZ0Nmm)bf>0S2vhot|)_{p#(HB|PQ4Xf!SuH{Q{r#ybdNXtVF2p$PT z6Ardr7Sr=Z86T9eOWbZFo1|vvw!r`S(e<0yOduv$0;35p2x!ut?;O&1R4ckrPG3c7 zMn*)U4S_NApbN{e6^{iR^`g`LmV<{9MDfO^F+eAcr82*oRNF$~Dx_KaL@K(Yc#Tqx z!)DPo35)|FSYaY`JbK$Tpb!$YbY>wZn&Ns#%>hgvq#aKraAN?dW^bJJrt8#XB>eZkAlKyJjW>aokbHg_!iS84NZWU`7m1Nj{<@pV*Vh^V2pV*F% zd7SSUro>t%#A(9IYm*}Q@%_1ggbE1MC}0W$R8U_+>__x!#F)3_uM(nElzE#K-phi- zthc z02WMrKrNFpdgeHYiexz%*W#pQDzNLt8+tV_$E1qS!q9uMa)?v!*~bt_9{O?j?0P?61t6jti5)7l1unvTxK3u#jnU9P;4W=S^n41e zNafqnqp1`p;U_#lDGIH!ro&93xCr+ws_dAVbBv6ufEw*Ye`hum613_1o7Ihd^k&+Y z_i66oN#VO4W{Y5J{hO4Gf$nGFxG*QDvg=5U*3mqonc9lrJPUf!{6TeILHoYeZJR|k z22-ne?B;z)*T`G6?l~7y ztnnp^Gc6j*Fh~{4nD0VXprx`d;oWGa_}KPD=)|WDeMU9G(s~iz2=xivQD=^?r}3eq zFU5s&h7=*#Y0f|(;Ku2*Jds=j!>uI&-u9SK(2+uz5 zw4#AH`<}O?zO9eaez8&Bqqr+QVsl*SOx8|r;^v@tXf!Tg)Qy2E_1h-_22v=^XoGuh zA9ijZO-QSz?xo}a|5t7vVtpjX(J0QgN>r2q9Iun%o-0(O4STDBq=1lxbf*hI6CRi-)C^LUr&U$|KjiZ^dk~FHQ zBEVr~Cqh;kP(>%UBs(^jSt+vA4?3jkpO~#iM{5goEGNMW%7t9P?T zor%09WNLr}=o=i>v|6NSEI-{Csf7w1m6RnH*lSjrS6*VnDBe;&ngRKYcDI7kv`Ab@>-zji8AwZ=R2h^Osnrio{4(W8HVWq>O*XF5Q~4-nW_Dancj zm9(2D9^KRkmdGCm)D>7w{ZtSO2$hkd&2xJlX<8M!5P1P-E7@HSy1GV4otFFpF8wf% zK@H^)tA)J?dEP)YO1NZ?Ofh~0Q-&A-knIDbD;j0rx?K}ssgemG3tXldAY&w!E!-$m zIiEzSn!8gOmRe6`oKpB2;!A5Uo3d$CgI{$%RRxK~*C^Jv?6!&XlnQm;m&@X39yDyG zvM8%omgvCNC_lo+F`9_gN#F&fQR;~(kO&#t4l$-v2CRtsmZNElC`GcU5UvFg7M3W5 z{IGN6r&w(SnLHj%M>g*>W9=SN!bAkcXGhiz-*FYflWkeoUE&})0*lv!tpS3M+g%Dq z*!RgFF!(&)*t-g#kQ=Vv$~pVC%uNvTQ=m~DQx>2q;3<<7`!sPS*Cf2y-73k}rVtOW zVv4&Fd~!b|MEn5u5HEw*W{L&kr_flznn5!bW29193ww9n2e-_UAJB(MOfNT#X^%Bbz1rvD&k=UguweK(&s9`t29W8DFuh*5$No2 z)dWf+=o+R-**d_=p&v_=#>B!Yx2f{zphby3S6IJ_u$y$#^rB5@6;S%)I?Z2l+(DREyOvqpZMin5FS50&hbLV=1{D_BHrU z=7wf_JtaEvRkZ8$!iy#*f{Iyq%=R_4cjzkiR1Eee#ghTyhv_P(sx@?#Tf(A->`n%j z8Px9OL+hf2JXI%wD+c(v?N1NJ%z?eEh#n|cq826CrW>oZn8J_l03hS6WUWZicDqrf zN@Az0cD1iM&^ZgN^9;z>NY683_;X?(ocO9=rQ&I|dsgcxN)|<-4U}5i_O+dR%K?be zM`jVI=z?FYQmg^RP}4x$P7d|l`WAGumP;pXFk6K+-8H0>Bsrd}RrXyX`Rxks2j(MN zNFa(1=FMq+VME>kKR~n_|M;3_AtsXPo z+-8dqm)ZcKt39(Xpo$}k50|mBsPT0~+JU8GAQ*q!84g-;AdTMfg;1_xPEHTF{~dP` z1x`HhpUQ^F5h_c5WO2ahSGRJrfoChdt*lc@qfqa|FC738rx=EIlp2tDDH4<8hgP_( z{5*xMOv+j>SvW>sd7-<2@-zc5kWkN(dqhEz!r+IMi91={Ga05@x@*Kp`o--U(B7v@ zu-)_Su`tJnp3uw;{egRc&m)txs=!3H7IwxV}W~3OgQtUbdCT|ri5Doo1yvG)W zA|X!86r$b3`SLs=I-%_EdHcdn{Bn)P2>}N*TWOp~n=V#A^ny(y28_7)LZ3+NRlalg zy~t;yqgsGwWr+vI3rq9!)vl{^+OzPuh#Crzq_;)s>&lWAAKdi$6Ue}1f2C>!r%KYA z0i*uRs+N_Zk@B@Y(h3kHS_{ExGC5#k>jEIVphU;Gpkb}r{L0+py{SK!26REu6!n&; zon(Qnd*K1MW2L#w7F+q!0_e21BY9H?%cKEYIxU`{m*ZNxFS(?1Dy;l!C`AT$?37X7 z8U0YnMZG$xR889XQm8T2@bj#XDAjkv(w1sVtE|oCo7GCh*mpa?o(*)?DxtRqrw2$6Pb7^rlzcvx?J;Mi03O_D?y8LkI0fitxDSxJLl8Tu5Ia<+ArrL6wO<4z6^NC3< z=t3mTd;#86S6~aEXfo@t;9`*KF8e-#HKkw@f2n@-aBg{NeRhcgl~hRhbp4YhHZUzt zvbb!^vF$zX%`jp2&>k^4EHW~Eu0pAm(#Z()u(D4Hft<*lVr@i@4^84<1zkBG0gEHw zpE09(rbM+wO=&*O>HgByIV~(yCq?8e654zQ3-_;`!q%6l6`ms! zlgPW&)Hi5U@w@75nm&h*WQHeRp#T}(SC4xTs;Ky8Ar*!d!Xi%xysV6=cad z%bwu@c)H>@d~H#sVT3~2eYJ8tMsx6Q1ZMnHZ@F!eH&rdHpOXY)85U8-N#J9)GL%xG za4y#t0S4>%4j$(XB6C$&kR)P<2=@iZ_7E2+ zMz*#0x(6inURJPY^4Mas7>5S~@~N2=CUItzo$g>fET|^c8tamgvZ={NKv`H-yZ&!6K;Jb>Yrw`o&kO+<`5ireqtc>FWOK z?gl|S4!;s4h|-q%PRLwAW1Y-RKIeo9WqMG4f72QMJ2K8Uu|>L_iFHV(VH(?jlL$0* z&b0_~BM5io8z=E3zwLG>ui@0=B9HY%EU)o)DD^P$*^+Un&f$c6a0H$<+0odWBDy!G z(x>G_h0M^ax%!s`1KgXz9dbA2{AT&2gQu~LSZ*irRw!dAOFE5CBu*`U&2yb?&^*6h z{r2A1&-dnj=So2JyQUafFKl-?3$wC}me#}{&zG5!e-Zge*J&mhS0*nd^3XIiZUR-A z{2%~2EM-|~H*Y|FBb#bDZpM*v+dUZThYfWECU!~`Vy^%puLKHjn3Q91rTX{lmpQ{8 z(!>sxrgeeoT>VubpB&6D&akGrE^2PA&IjhwJQ2@w8U z`Q;il|0YPg^!Zopg`AMp)<61ndX?YpjW4U`Afv1F`>+GwSOq( z*EGP+m#L+i!~c@Mf6s4U=Y|Yq*r^_gESD2M`CwX`*($*pO1?_KeyqC(hg^^whESk! zs;4(5s9G{d2Hkn$qt5Fr*q?}wr zC&e2~1=EvgxiJO-Mrxb{cIv@mjVz{&Db@zxmo5dHW9p#CB`9*)=)G+$;!;X%fsQX$kWo^XKtCRNk z(fRj?==R(Rg6HHlmo6+W7o1L9CUn(5EEexSurgSy+DD2bX0Ebwd+gsuX%{&!SehCv$@cv;5tlRK4Eft zw8*1}^Ya%E_|F?HRh~qnWgcm57oR?O7_IJCA4RhVdbX(1)Yg0ZwDv3-KGZ`S(OTO? zKC3Kj&BFn|h9sAydDGBETPVUfa<4({5F-sSKxF>_oq=AG5e&Gr3{KKPwuD@)3~{qHt) zGkhk6<_K$IdJVP&y|4{=1>ijhEO6>z6-*|4Tcu>xVUg{{EaA!ex`hH|b+{#ibs%6g z6A+47zOfY=u43tkJDq<*?dry2lJw1@uv}qj`v0m3Yo_H?+ zYaGk0i4nkpoF^agtR(gPKGSr7Ld4IQ3q)y>r_Uzsy2!Y5_44!32=hE`&-)M z%Q}S^m)VKF(hN))7V1NI9~}98+m>rvS$cai9;oDzg#IP7+81BjZPa!u!3)O_9#M*& zpPctWXe$Y5Ro>##p^E7!@z6m1eDr}Zrb6!)fiR|s%?K^ik~u`X^9|z&{kXu7oYN*` z{!+g#V!o+RZ~A?y!T$dblY#cE)3fCUtdf7b-+0yKjPh7tKWH2b2e143@l$m~Wm)NY z{r=E@S04?DtHx(Guzp&Y_d)IFg>pdqebENX-7G9M2#H8;H5Qf|mpT{l+J3q3>@GQ# z^hiK(N)}f|aVl?8k;Biozpe?fqIuD}EYjJE(&CdvoFyHRHoh`M8v@epgsB=1e!rfF zHi_Sir;0`>knG%~*}HV*7zDB!L{857WrV}uUGm0uFpXHEz0b>XI4$MWf}ffmqAWK_ zKg{RDbq|(mH-BE-^g=FFQT%mr@$}X&~e`kB=+wUs6nu%yCXh?RUP???Q-vx8{#` zSHEd?FFskoIqzQbkI6*uNo)1PQ)y0ocD;09BmZj|X*=86#DLH-+1B?;QnlyR6-hkg zHH4YwHJ7IGDYM3TUf=lPOA{IR=7HJti6b6{EeGD%+S&M)fioAlTuRWpTLWa{jdV{V zYCl~aHc_!Q1bi$eqC^aVvq~m{YHhWJNy9v<+AD^}KQdI%H7=2SKP$vwh`r2*EY={P zj|~86+1Iu(2?qtMe-(Pld}0%ixTO_Q3%j4hDzk^^Jq#12u*p=ns~2=-V}G_(#2#q1 zXEKoaYPtp5*d}2EitkFSh~N6`&}2=}+|x0vq%J-$F4iO>T9@`uuCN_ey{EyfnYZ40 z;{HVXR5cy%eQc`+sON*;<;kG`@x2e%Z%MvQT-)FAg%9EGbu1L(VQ(yg^XH>0+Zr z&XM~~zQl-W_)_w_@S~`Eq??^_slNDfe(u8(#A_S7UsXwvX?2+?{|zr%Y_DYIBN4K9 z%>D?sYP5N(4L@va(4{|;I`-#~eHU^vG-~;&_?Cum_%D(1VRwkPSLoClMn?C11gMdw zvJu&DLxs1^m+)O(5Bd8E3bb@w*()(@1L+H~nn~yGV5n;6jeJDO!s|nJ>J#~kFSN)@ zf)i9V)()2TOo$bh`o;;;B#nsNJs2a5^k!*2GUmss}mwDBFGCERGY{+Y4n&SsGo zY9kIxnN$!UmLUXeMv~CYFcGg9Wk}O z$bPCDcEMw+*->*uL|ggBmMc=r;$UE|6>q+a6{LM$sR?rb>5tNhP9i zMlmnym|AFEF0?KdTbGNi!`8udc+>jQ0(F@U8JF;Hb#X2dkss>J^>5RNCr}huR%uj;Urin%o`M) z7Mf|V%{m(6!8s{!$I78bh3dow+ml#sUD+?}$&r7|QN^L0yl5hx_1#BFj^Ji<;>G2; zcTP5PGLF17&Mw>WBk*#v-or_s7M|-sRcBpf~fE z`T0`aoq_A{pGNl{<_623)jllpi>V$D2c6?%_%2l1S5|9|sdzGl!$?t+X#sR3 zPaITA?QW10&6Z|YCr#{?QXFVSwK0wZmE0QDzMg#&`_nznt&sF$rC)(Nyaw38dSu@Kz!o!<5{BCC$oWjymNug< zElOjnhVjBRL3g_Vnxf3oFyzBTX74Ata;@9D*DMuwo8qZhtHqCSlO~$DXOh^0f^kI= zgW(-aAV`_$wQXWDv1$pu->8TZK&xAn-(EY9f5bE{e)2qU1aA^cFzb*|R=OXE9Tm8I zR02_1@Aj-Jy{jG)#J7TBq0fLC_V%ygP0TU&V#fM$S|Pu|;V3+7$kb?dxNZLt%LwQy zpH(lT+eFJ`>GB6el<(9U`vXhlbzf#gIWA0XW~*&*6Qqn7O`4%=1U7}_8nM!`vgi%v-A2w7_ zJzJAk4T@}6qPvvJG-Zs~T*_s1`($HRwM?Ej%;ak}O$$HDtwJFx&pgwG`xJC>Fi_%+ z?`(<<=Yl>YBG_G#$&vGaMIYyzk zBO)GlxYAq?MTE_0mKrLjXR%SHL;4jK_rl_*QJz6ZSyYukh9w`Q^K>>7cGqSXmKOO6 zmn+V%m>7^5TAK#0qZDRv$X8GOZ_PWrnF3Ijl zJ~)q*PCIbw`fY6 zUWFM(-ZX?xGPdNOF*6teS%GWVp7?3 zkeQ);Qw<}ah2BF*=xoWH$x*0=TO!Zuz&4KXYqvZ{TVl__vcRba(1F&X({_TA!%kIj z0k!pK7-`7X=2?tk&wSW&VjdGK9Wqg_X)@Bigm<_r!z!_t!kFcZDtkcki__U zWAJB10zOBYwY$zC49lXOpPT!v^+{{CC6=@u{1*8U?I_Idl3OQxI7AeDXk7SgXZ2}q zgGFF(38q;vQ4GGccO;bDQV1&{H*@*LG?{jmZ)UE+c7pH1tcC4P@lG-_OZi}tOb9MG zrJ*Tk*-jb?x#1*Z28br5;;baSSq^Fy)M$1~G8P&Y;S}%nM5)4!=WV;>I&5=;3w>A~ zHk0(a9D%Dha=3_Y$*Ce4_T&Zj<<80DK2U53C-k9XOKhJWa+0rSc(NJR13w9cPAzk~ z>KvmC>j6@1`gq{cI9jv&cx76Y4TFLj~?W?!_D9le4vEmiLvV-+x zExm1@sF7+j`lXz@ghgRALR0ws{B+g@Mx>1J+fiq7(ftD%5tdB#2X6L&AJ2zxmD0-p z`6VR<*sUgcR`EG`ov-K&Ro%r|)$Jr^oas<#pRgCfRjhdOm-}zUEz}dLjKg7OmY?Pp z^KKWv2ON2Is44LJf}YQ*8bH8tp+#)s74%2G7eRR*0V|f&KjKH?3_4GOVx$wTU(yL; z&)qq+6J)i9L)Oo!NaDn{kk4%uc`Py}xqcJm{$62DmGq6V+Lf`$GAOYHC0Tq|EqeqW z5x5*I5h~Hx7$L>c9lPV(5se|lee-}Q8BT~#k;FtStE`+e;;QZQ;U8Fs(MTo{gfDzK@-64yBBylINOv}Q7Y!P9Y@_58t-YUnxXkY5o zpa6LG54!L#lL*Qb_w-Qoqc`|+KwqFTKxDELQ9A++CQ3Sxb2Nn#qwj#pwN%@p<1U1# z{0P8G5qaJA`j&<2Ae``{0w>H{M5}vfCR!-zANu8}q$O2?sS`76a)O1qRgN8cIL0RJ z=#07J<-nN{%aeKkFu9|sOg9*@zSvC1{X2$G#eaGOn;pj?HtXPH?!F!fgV~P;NCWr< zxKf9wI%le&>m62%=1!p`P~=%Rg2Bq8G-~rz>%4W^>a~WgszD|zv+;_Zh-@7(@@3%P z#fw^;(*j}VP6=`CF@)RPA8^HhxYoq*uTAWxUqbqFvR>N?W3sK00H@vKu{VpKt(Brf zjnkJLRLpm?&@sOv-z4nQsZH+^I(OEhjA+3I2H0K|+Cx;W9)`dqW z{B#P}EIv9K0y=(Lif2NvKeIVCwhmTA!QP|oAy5smDA9NFcKFuFcWZlp{cnq}HrBU( z$$6#W$mkq|R>ew|AdXS-V#$hRgD_>rLi0+#_a)1W_n~LZYTdg=uy5Q&0R(>}CK5G( z^Wj^@3mFCJa5men5j)ZqZf3d1KM(o$oU7L5zJpQK6%h%6&vR}AaA8T@YpmPY1;RV9 zu4Ro|Mv_?~Qc-4$h<$6m(P`)K<#U~bLbT}TUj@n3Yz}>Hf5@s1rS@CqF4b(`f&wLW z1K8A1|E8R2-GCg2uF~$94aIfX^$&0^?S=QrzK2F|tE@b<51c3WXQ@-aD9gAO34AM{7FNmWox(Px>57{cMp7JxcX=|@G5ehQ{plJNQfSFeyRFl z^h4^EaGw+`TD9DMPB92~ zS+wUPfJ+J9l!}GNo|;J+J2w*{3}u}3?jNg!D-5QY*mO+eD&VKt!ltmgMag2eRn4n! zO!-dO&_a_%%YTI4m7F=_M3?lhbt<19Yqd(PsPwq3`pEe-X_^dROAWQ@Nz+xtQ8`MTY&e)^b!!L1A2B*5LVf&7 z$7KiBu@-7xqy46ZuJgWEd{&AqTsZ8>JvOlcMfnbZM{k2n&99^97H{m31cPI!96?)j^{=7r} zKIa9@GX2LED!~3z{_%Nw3ZM(0ZW&)iLc}Dd?ELZtHV*C6rkq8G@<&I!k=MYT2jvGB z#Fw<8kv@rFSJ}WN5TV|qPD`;Uv&LJ&wAu1=LbIU~?lsjI+k)73popk;6^@Vt_6U;Vl?F@uTCI_0Q_7yYz{*)np2DU4T(F+2T*A(e-$&bq?& z4No|q@3$6fGv;e62}WQ7&mIY6r%Y{%u?Jl5Fz*&N z$=c-qGZ&9$yvynYtF64*<@=homgp=r%cJ5weYWn?*wlnPwD&dsl*UFOKc?|#G!8<# zw&#H8!u)(|k@ZvQsI|1ne}sTaDk`B`rnOYEo_ybOsSs!bY)0zE1wLr^jDXV01KVj4 zS^69J;mVtfi{`@Jl}F19^Pd-&m-aJ1Mu)sy)XV$+Qa>+MUoPq81AnQXX;*%^td}%b zxBB^E_2qrNT=bXrbM@r|y`;Im)X(LZ!81y}Y(8iii?<#c)Jhsw2-mVEBS$RLp0)Gse)lxpE;gXVoR0?XZ|L^^frq!bebQsxN3qc)?~gVyY4{->4x)jU6I(eeF6xAg0~ z9tc0>uGr3JJB8sh5N!44&s+DJE9;%~IS}}=IYWqwQmVR}rakcp!|N)Reg=Q=sKTG>w#7uV}O! z6D4v)L@?BFWsWwC&C0)A@K4YE)0_HdDoo?_y^Y|i-g_G%+=uUNgit@crcw8}**tx; z@L<^t@7|+DE*gSAn}?5~H?E zP^Ofi{`cofs<7HZ`pvwkT(6_ttzxH25L{Q)AW>whi=x;jF?se9;)JgX)Kp4;B=Dpf zKfY;L2C)eTa#I)I#Ey0@I2!vP#6c-gqiaKF3lak*vz3)@5i0Ur#31@(=_8Pc+#*YY zY!_eCT8*`;*&^i|+R5M4iN2IWa(cpbvKC;PwOdt5Mzkgky*xa*xUjcsO^lGm5gWGp zSSkpm7#oBE9SXwwV_%!GkxXYj(TQWK(9PraFV4?bn%WBv!q;9%ACnfA9AoDx3tc6l~;;S7d|VBsq9mzHis z>5|Z2Wg!}`{E|w{_|&{{sxv{5NlGC+e&&fND(iM@0O_w(qoqPxD(FoHA%2-#Ntg}e(s?%6FIZKPtk8@e%)%k`zG&|2V`mW>kplm{RQrNU%(m}S6G$D9or1+ln9Qaev2cKxTQzvU;OEfb9N zQMTMwmP>>Ua_q3-)i1S-jJg`i>SLIArK*PkO8Z;bh^0Jb<{CvO5pu}) z;#HEJ@9HQB2{C&4p3Y_$fFH%JU)m)KWiCDy!Uo(VBWpYZ(%_79)p#z2!I#$^HVA0j z4j0qZMQ|=5Y>9J)e>|@w=$D=>5rgJo9Ip&4w0hlWW0_1b4Wkw3Eu&l&;^PD|`Eo9a zy2^C|$WWg#pt!90*=K&#&z>~$clz`l-#vL^-egoX5Zd5uG_nfGu(#hE49?|&sgOaR zZ87kMM)!`21g+ufU9^hy2Yrg?2vb+LPVDU4~#VTIXDV=4^8#e|+olx7*1U3uxB zba$qosVG;VfGAvTlqwJcK0DYVeyfcYg=9}Vy>qSD9a9RqJzw3q7e@*!6GkH=DWb!; z?@mdHBKP+-Y4vPTNX_!Qt(JO(l_pt|2(MnN_UAHf zouA9JNwoZ2rp=2oN(hmL>?-C*%Tau|~xWB%;g{U!$J7UHDu&QO0xr~0~FH8>pUbMeex3i*g6o)X|&`aAfv>kmn z%T{}~7<{?Hq3V;KQ<1Mb#=Wuwhq@CMN|eGN%Rf~=)B{*hW>ym_gYg=|z}2%9^EsVPDC^~UeH>!B zsf2hXQS8FMSm9)v?Mlu0tXbwYON8uJika@K8I$PR#6p3gX>6e_-VFQ=rT(NE*5o`A zDrWOut3k(;sDyqZbr|J1Fc>XIWJB#Yz1k$S;s>XqJW#C=q(-MLt;6k~WB@FBhmfYOSd)iip6`0!;`jcGyJ{5&^Y6#RzlR5nJHCyw9b@2mqC1A8AP+q zN^zGhPd9ztc&b@ORXIo%wDql8iQJ-DN!XH=tt`)hN)3eVME~5m!j+n(6i@R@KoYVJQVw5~lj+=c0}djelW9 z9rNMf+KJYmt2%l>Lz~BcDpegVy1Bo*y7sHOwjjT=Zm_*+q^j4_wsugzNxcI?Mneh> z&7yym0)SZ4iSyXyH`mu{8<3~$DUQzX-bx2TK38wpB*bd;E7vW(bZ1#dMeufs!BcVC z3gYM>Q(;9cq&(RNKlegEl7ZetGIHjWqTVx>`{9`wZlK4+!U2z5QLhwYUy*7(L+VDZ z!=P1IDwf9uu#+$XQirpqDRjw6h;hcv$LhjAx1=ar?Ti=XoUtzWMb$X@MRhgIeySEW zs%$`McS!jMSgkrD$iaAgeVMSNyPycL&;U0zr$>I6ieva(X?1F+VXwKq%KExaA57Kp zG?ivV@y}DhlcRiQnP*|xR@$$VQMU~ zSyEGs({#PmiUQGhu0IOk_A*8~o}hw@CH zh@sPIM0Gf;_`+fLHDflyj`aT6IN>L45inq;MM86-6ag(|}$ zp_agrfmft^rKsVI6$&acWAgloz-$*KLh zJY`g_lcsW@$iYF&@cTc1dCIC8c%?WcYVFOn^(akK{|7BYX*)D!6-u2ewmP?1E?8sp zzNx3uTh~>ktkivbe^JWDR~wvh*xi249v8VvDRsfDJj^JP7eI`>P)am;t!K3ZG-ETc z!rs72dBRb?l_#qY*4>^jr<@GR13r*V!34stPCV>$HsF8&TYO`Vn_x=4 zrUb99U~D|W%+;z##h27arE?qCil@8%XmwUF35OG`7OG?^BXmje`aJQ{$b0r=duyLp zF0zHfir--X@b0k{Rh&Ua4rc1fN|(bYqja6H=PIhFhqwlDx3PJ#gLAvCQM&_zsQR}~ zB{Px)NL`O6)W}w01c97#L|zPUAX5wgtKjqt3}XbaKX^D}hnX#Jh`c(gJhq22!#Ja* zl4(>u8+U+F#wHn|=0>O}S8d`OThDZf48p41glSfaXbW+l>m;7)829U5`x^_9X{p)* z)#O0DA#SEWqv~j>8nfA#azWBraQQ7nH59ry?GV}UAlpov5Z!RtzT^N%aEEhy1>&f}d57_uh5B}-Y00}QjI8|AgQNUMJ&(DB7g z&#ZMy$@X8S)2@?qQJi3TphO~CVYWNr*i$H4Gv|OPPE2{jY97vOdq#yz%yL)oFZQp) zctyqQ`_Hf9+Ecn_GN3gtx-$ReZcZw=mbR!X38hmv-lDzZWQSbnD*geomSGogxMwzL7L} zvBlLzVo9zu&+ieb76k^wsq~u=n(pD2uK#fLnyB#hi@kM`mXdzct>7tJSe$Jk;kjZ} z=@s(sK^&5W#t7TzT}oz-26mqT=ZD8uC&lB@UbL%dy5mmtS>w#@eYY1E#3Dp>RKZ{* znvoOjM=TVqp7Zvsg(L~xYfw4xmz-s=0|=7A;%Nm&FH;pXKU5fhCADjYU^vJZ1Fb|d zHllEYmMW^L`eW5)%oSS`9SWDg@aO4dDfmxDfMmkKTv6;sA#bk`ND}lhH9{;#PnzBE z=(U7{O`S4p$K&{wXBiwW?Ud*1jK7lQ98=t{muE$IvmF60oUvrp8;U|?SUntSr%Cl0 z=fwljEfvHmZ|6y@{&jp*^R)evA;~a_AUjFyjn4*l{u+pgqiumIltHB~kzI}(xNr*q z*lS>$-ug<*ayD02T9NSp+V@>-z%(OgT7ML=0f#QBD?bV{t37I+Pbg`tWyCUpP8^Q} zLSX7OByq@lM99HG;8!r#PP+b4?NDqo za7;sFI_`_Ewn~;#Ronb2LMhN27%bx z76&9n91JZLC}u&MZ8E`?EtQ`_+De>c4d?^vdx>K5;RYvd={1OfBBX$nGw~jB)gtV= zUGqj*H6*Lq>v_VrI@9lgM14=7S?J*+Qf3Cys&uVASQ=0 z^+II~4E|D8O5`rrj2dGp${&SM7x~dIB|}ydM~zUgrlqscsjFaX=)bCUU}UOK1&5+? zF$7A!^G|}%!OxK6J`{%hXU7mTwt)fLPe)QIY2S}0VJ#ppB*m~8VihF)7#szX$Ql4Q z2~TAB{o^qu^5QlwV=}0Dj^f$j%w+;Kq-$(2Gw?zC(w=swSZCnu$!d zf;XzHncQMs!jMFT7Q7e7)x2f~s+f2};@;9Q*Y?37W~3+h77(3u3x|}l%@q^kah4@o zwOx2aK)xU<4j07;w+nA0C>VijohyzM(k4v!gsKAGn5X~O`mK@ zkW7_V&B~JCW?In+)8^`_E+Xu*SlxOI0!^7+WJ!kP&wVYj)k*FiS*3o z=eyPpr6_BJQ=8qPRF8n-QnXARo)VhrG7}bDdPY2)E4bS@D==l-)^5T89Q17ke5{eV z1aO*k8n~L}1gTWdP0C$|QfRfX6wRJ;9(4mfcGu>qNLDCENbiN(OgG-i6`w5$blFM1`G^dAqW}to*iTRf|8WcgA)}4&O zm>f*#^RpM|NF(@~5g0y}GQObtrccx6d3VYuHkN(}#*%%A(l2eW$9`{(ON?rK&FPg> zQc0*?RtY3xLkf_sY{$?tM-j9+88S^Q#T^?wlg zLjPY!U|FD=t)`a=#2|% zW~<9*q+idIPyB6a4e8AqR}hR%RgL^+N~~3rvd+C1*#PS~FeZIxk)jDU`4H|T17e^>!doZL7KK1l~12tq- zR6m!X@_rWSXM6H$NDi59X3&iv+?)(hjywH-(A6K-SH=x-^v2>G_T7r5VE7#tc68U@ zVCz-i==ih0K;=xmc=E(&pz}+QE2IEWAwJUq_`lp|0$}v$?NL_+`rF(k;;R`cEE$(t zz=eKzNLP5^Q=AX~VXPbMHn*Q{uG$oqrf0pjy}7-s$t}%I&DxKk_^YXTKi~eEnhpA9 zSqplSZhtALkl@en*B5HZp8kd!5LFN;k;Px2wW}|blIJfFxYZYywd8LoTU32xi7ftR zVV*bTygb4lX>_#;#KG|_Xf1vTN>N7* z`wLKuMyg}^(cAK^hTF-Pp!kX0@~udsd~3Va<;&&TOTVmAZ}lG|*T1!d*LYL^aBu&+ z%|Im=uHL-(J8j*xdK#BGusg=4oHJr&xx}UEq6%8}hSQYqLtoYP_?39&+xm>RU+nMg z?`~{8RfCxMgWC6=?H{i`t-spd`Id3@Kdp9}tt#A<@5w-jVX)}_3a$=Nr^~jM68wAn ztNSmEOqQn>0#bK&*Z1OGeHpylUEf?^-7^?3!!A`2h#cUg=iEDskQ3}APD6$fF2`3; z;Wv|P>3ZOA%Tn1Al^YwA*Cq#ixs5fW%Czt;rZM8y3kpQoH8;N(*tJj>;TkH-=2kfyySj+`ctV+>lYVdPr=rf% z2pkI49Y|CwVAIN`Zlf!L@$TH3-=rg8*;Pi|zY`NbdaLt$9U{4J zalG3TVvbUnws}c%-dX!M2v}|;(i6KkDh@!+t~u-(Oci~kO)8ULVcrE77I*NZ9n9X^ z9;vVVS?^Bg;;pngKe`gvzn#~E8zA485l(LO!{yO4pK65N&3?uyVQ_;C%!Z_%v8zPT+6tjqXy zD74ePJHk~ePV~MmA$|@Y_Z+6+O?R_NlTUpI^2M>~wk|w=Y~!&lS?RM(%IT7Auea=p zvwM$IO)i1Z<$zr8!^~XgC4{{iRQe+6IAa=4g_ULg8jfWwsjVzoBm_4V*(F%Xmcsfd zPTwLu3^*o3?a)YtizQSU%P$4GL$(48GlG4cHqN_p)F3;XqDwI;ihasG2plrt8 zfc50M#S_aJ$aE6IFaKViQbC@w!7`+9r+4T3%%d(ll5`$+dJ3nzi=ilrKsV?@0TJXy zs>sugkQjD*vY5RJ8?BxK=|t-wUpBqP%s9C4+M#b2;|jL4v183%#eS_^bM6h3`|LNJw~0#$H9AwR_K+sQ5MAd+3=-JoNvIJC0|dC_XQZx7SJ;X% ztPVTCSD{EMpNRQ9CaxgtzZE;;F939VE^~YYfxvSpB)?yfa1*}*thYlgSEQ8;_a^)* z9RVy%h0zVaGRJvY`qas0gN*)kIU%{?6fP1Ql~<+dogE)V)k&VzJBNtxygh^?f>jxp zU1we2M?1eNFXk~m@m3mZ$hN{pQQ!&u6Q|_wOVJOeTm7{XoF}j+S9>Ar`5~xm zQ~Dot!ZLaR^ZMOqQ{Yf`7L${2QiWO5Mzui&^9pioEz&(D)Y24)0LC1Gd+IY~Evhla z3|YotGPMqW)hgz%eap9c!H3F>D8!M8S|AE&$)Nexg=UBrm{(GXrlN9ZUU%yf@9MW3 zS$CRkuk?eRCHuNYy3kONbWIFMbUM||5rI@P6`UY?7`;^x(Tp;`lrwzSP)$g3Q6{|p zN>_ZcFa64B6>Rg2>r+(W-AFL*>C8mxl$?}rBC_HpDx)NWQI|uvMq|{pqW<@duT>G= z{=4~mLWt_)Y6HQad#lN(Qi=Z6s=HF5xcNdQw*v7oHT%-)@W1QJ1^<#y8&){$nm+RA zdkGU$43hfr9{eo2A_;ODrb)sB1FjdC;S<6~S-`@(EMhb6*!+EnnuMTa_RDa63)b-; zpcoPLzYYJ5!ZNDXB;gj6k5qKdl(k%n*P9JK9WK%Hc$gtK!m$c5>%3WdxD&S=Qsnb_R3m2#C~40i%`=F0l7MmnE)?w zg^_<#A-s|~!xItJWmbZyEC5r5MT)=Ff#FYo1T@wnjA2)rmZQ6g<^U9R;>dZu_7Wv^ z7uI7v^-1Vibqb|gnZ}9Uh_odA8IBu#aT&qEv|d%n5!^__nmdt2GLU8=ox+HqMRwQM z>)89;JFMhSOcqdb1C*zLTX(%JP*qysR@<1T@Zvx z==!ZvIg-y=ae^FuOsxdB!Y(^msYIkKH!u#chn30cs_q)38!qqc%34bhzN&=z#Jp6X z_5NuZv_<{K9_3Qm^p){JK@rh;LfSOW0?}hX|2~C>dKAaQfA!Vs*}E2t=qr~CJrhlk ztH$+N#Nz@J@1LVWt3qsUY1hvGQ41{ArC4P-xE2TRDfXN|ok7(sSur&;U{jQd&*Q3N zKj{cfDS7N|f-~`lq*rvwwXkBy^w=9`pt09Y2RL1j zhOosL(|Fnb!2rSa78aG&Vu77BJf=F2Z4UnT97)DZL6Fld+-#R*VIx@o(E8}D5rx#k z9c^N~0&qO$)@BBQmysdFbO-&pg85l*kF2XU6{FYj6Lvtb)! z9Y6G~eS7}s2fo)wFvj2jhXW~>zsEm-Jiq**+6T>L>}o<0L1FI#$2^_f6+O{Wr#~S< zka6fYI^m~q0l0{o9XwLSrF~**^fXg7zKxX_+6KzdlW(o$D0OWcSHC``K z{YuUP`zH?F+#TX?-v{>{=40By+a>lG<}WJSi|p)i$`~H&o~7n|Lut_nN%Sz(2_pkp|ZW zfD$XzI8sy8<{vXmM!4ysYxWW&u7BfhqLVLc_a5u}Yk4=30Szbqpj>d>Oe_z!rWm55 zYOg&Zw3&2}oy_8vH~w{L?0cN)Z}yY#V19x ze?Xd$tjAIDanW4jk)Ch>P&@C%Lv9Nju$wg2e&9OFmjgT+Uz-AXg98nZqE~d$HNGf& zIX-LB%ud{lI{2%KrenbnXlF*R6cX2Vau{m#$ufNd>D54H&mk2I*f*LcfchS4+A&T9 z;J;Tz7(glUUJo578`?NDRPG%wD$PEZ8A`HCLkr_V7K$F63a3u)!iaG+pgy<82)&qJw$BYw=SFCdRn}r+++f6yi7Jvm6tA z^~FZc08KIM9ehip@Y=bO9)5>3Auvk%hrui0i(m<;cRZF&V#J8a5tJYgSR zPhx~8u*?&DIEV>1l7r{F+nc^opAcf;$89z*i5ft}YqeKPy5rYUvY6<@&Tpxwf<%?8 zC(S!+>d5y)VzW=lgQ*Kz!q%i#m;-;_A?Hh>ck&`MM`D!Yx@Nj5vnj#ZGo7jeO7Q%( zGTt-HLrP_x49ruGl|WuWK>jwID!shUlR~OGa8qLNra+j5aEa{6zxu>Z z;kv5ea`L zZes!-O1@%Qy1k|RbK*m`y(hCSQkTr}AfLkKn*zHEDoQtddL^W8sSGKvBZB^E{!H;m z$+(gTww+?mv}zS#6Y`RzgLs*ATgj$VrcIgrmS`yF!&S+sX51BP&sI}bKqeys8K>lf zn8jXF!#hm68bwsSv7bT@AE!-R(Kw?!eH4R#50D)k0xBkD`W5KN?=$cxSpR?Qy$5(z zRo1wFE=2@H2eCIUj!uFmfshaaHbMvxfdrEPVx2$&L_&foQgj^0(J5HRv5md!*z4H4 z*c%o=K@n8CA_^)+{k?1Ly-&-f&G&uJ*=2w)Wa<@4faunn~o4W)j(; ztw40}*tr1uErl5@A6Y)+SoB(KwoJP@6Ife8SW;&wYMejVe~zu z!?P{sZ-%HX+ccTWW>iw zMGNbkNSi}?b0(Q0y|q??$qc+Dq#dJ3XHt~HRkD{?72&&sJQ1X`r% z;PD9OXKBwc*)LzV$o(?nE4v`Xv`kQ0Qxt;k4`+L(UIRX>Um{>=~s z-}&0FzsQjrE3-d_YwG`=$VlUsR67&hYTN>(gq(01i!9o;)}aG2FSUiTf=010NVOPi zTk0f>e5iOfKZD{zMY3ZN<-wSWSlXH~uEuC?qqd@*Xc;T?ea}Nx$9);j6>5!NWwxfQ zbUC2)9W{&a#^!Scn!%+mmalR2tT7jWDkeUDqWQi~*~7vK_5 zfkTO;EV!(!prpL0BDgO*^Ws5Si+fY}EPH-<_Zh~Fs@RBi0xqL?@v=BCT~_FEyMeON z8M|&uhqrsn(D>Qk>PCY~8PZ^LTT((L;>MHB5;?nmnVopiO;z=oHWIk4F?ok`v2icO zF0O7s`{R3)k=-K2<;Rp&_%U$F-E2%4SZ9|m;?XEufKf;4StN{8t133#PJup?mP}Riml(fqTs)YH3Q{Hz}DhjbnJ-#BHq=99MU3hhy6E^ ztdoVJhy$zCW&O!S)^cwpqj_NPe-jXM{oHyR^Q5GrxTvgUwutb`gGE!+KVKH@On`KF zw~~;u(vc+t|GPlkUMy53+LNeY_G9xsZk#@?`w^@uA|2_|4(*xMyG30q9v-O+;f)g9 zg5NDB)Xk(2x-2dBE1j+}4J)YP;RVNrlDYi>*|pEx5KwVRPBf&9&E~>!xm-E58Jf=vV5N&C}u1p z5VAZQ8I*g-N<9{+j3ap2(8f2&22s`>)w{Za8X4^0S4~SV#tRMuH294iH_C2VNO0kh zvUDPuK8_jNBe>!3pbOg6pU@ri`sFi1?QOTXU__{4Mo!!;m`qhG+~48$w(pV`F@)#F%?}H&zZL9#np$>s=*jz|^O@fYl;Py&g**>X%W-(-ee5hgN9 z_lrR#oy?GeNSOe6zITu+x1)5e{dn$=*U)(I~E}GN~b(S^L?h>M$pZ%@uT& zQcxP@MMW*|&F*;Y&@2my@s+7|wN|?6!G-3?m5>X`3?0%#6!k0N^@)YYz6izA`Spc3 z-R8gPmbDC_j9r19^+4Yi8C6NxOh7yJ33bB<(hV;vE5o0luykM%i|NC$m!0pJmu6>9 zW(>3u5Pgfi!0cXaePtE(vr~ssK8$CzrB)4ujq;Pl$>JAGS&frTY2>HyP4q65Iyu90 ziji3ak#PvIikj+WqZ0A%r1o)tDw#|GhVGS2mvb00ual}Jo6pLUUCwJVtFW-FWRpw2 zlEF5!#h>|xK?pp7G>AwTe*c{D0ck5`IX04)H6bfGK7B&^#B{l^J3?2in;2oGnOJN4 ziYqEx@uKq?%VnC9X;1NT(TfjkuH%_An!u#)zbo5JHn44VC2M2pLgVX+o3UI={z#3r ziH#`;`~tNYB-xs38%8wiO~^^+O)4kUv9mcl%7_mU1Muts)w5TwRR>jMi0m)zA}Vb< z;fnHO&uMl;OHQb*AB%RgMg%d_;KV!?OMoS(^`YOyc!}LI7W-V;G;ym!R4DV%Vxpk$ zMKSb@-X*)I+$F8w5ot*&Ba?!#tdc@G;jqpBo+H1L$#t7QC09-vUz65@)#r`Xn?J9& zoL679`4jTwg!Ik--ba4#zWLwt<@c)k&7aVh69S3aT%M@l1X4r$Dw*4i<_l+CP~nGF z*G-_IrpOy9YF)p^hOtZu$QyOQei+AYSu&)~Mon^VZGHU|j3FcrK|VA)R&d!;aI!R) zQMWx^7Qz??71Mh51&m;KEUbkY{&`yME($MPZY8u+TvQ(d% zMdca3c4Th0o>36W8HKL9+pAgWa-XbYn?;$aOe9g#$Q?RM_5zp2PO>${_1YXrhatVPd)C-kOjS^;Y9?QPLxSu+QltMR==rd(|c#8CENFr(7Zj1>tBx69hNhs7e$4cWa!(s1IC$wKlgqgIGxPFPpbM2m2xO{PniCNV0J*vco~rppGwoFNZyWsFBUDYAabJbOT8vZ+a) zJK*x2=NDp@(fZ(GK&;jNMoer;#S}x1imvR)z1eck5y|y6JKL=3=8h6bTFYE1@wdYF zPn0v|ME*wPHnQDkc3!*{&QVbvTg{H~L`^EbT7V%b$q`WZqg0>I(9SsENoV8Ay|5!#vePw^udI7qORlZ+s7&d01OB3BO*A8CHzc zdU1lPk!^lNH)POyMWrf7+hC_3Y*I4CX4IyHI}xgjio``C<43~;L2rvJ%X8HjxW+x=kF0EKWRpCBry!zT7_4t;5o;(sSZz z(?)@z688Q;wK^@S4K)Qq_R8p^w)GlC*Vy3M*R5$L}VG6_i(umgj|<_C};e z9C~yoQD(SRfl6^Ss(MoW8!MGusgp==&>xDL0ntp8I%@Q01NEF@*Ue02S+%tqqNhtW zIxyovztM>N+E)}Rwm%!F=x~Yly?o$Lyj@#ovagN>+!XD)Yb?n0~QJ zge#nDx9LFQjD7v9Z;x<4FRMZ?bF@QBY#|B3(@GRvbKeS7gZI`O$vaOFg(pkv(a_6 zLqbOR`di7FE<7s1l_a7eVr#;q{B`_;Apti6LMPm0ne9z)PoDMC&abPJ6pY^~2v@dV z+5=RFXN>jf!q2OzlM3fm1&-I&~Is zwsR*s?%_Xy9B?~n&AFdEM_7tiUmB6(;54#=ZE0jLd1-j`Oc^Vb?BNT0Tl0-+m`t)n z42*h=$3`jyBP=>%%3VXb9*TgC41aQZiu8vr5Dl~qS4mqCKh^KfheC=bRSO&~=G499 zs`E{X7(>#bG4~gNV)djoj_gS!%t?*(eK^;gjQuDhh)I=B3?+UVEBpPKu9Cf^g*-`% z5Xu2p1%g5fr6-(oqQU))j>@b(O-nm;i5UcoA5}I4wHmcQx03lXUcG-G_#u9 zQNzjfaHXSYUK-q>(CJ8*v)agYX(0T@+BU`7M>e}Es*N0y7pX(R2(|`qhLvSFI>{5` ziw7QNVpTlQEX|3@q7EQg5su4BD8dyYaUp#Y$i0apF&9@+)k`Qk*-B9KoutN80R|Q2 z8RX@|M168LzeX$wH8>bSM2IRGD8%fbf`uAZxgeJKcuGV>;z^L|9j@D&`0T_VmOfCvw*(-#;ld&I<-6DvMjh^&sh1T{Xj_6{p= z6HOD(sNN1K^oT~UGm%nZ^IMq~xh8!^TOeChLs*dt=Hr`a}$efIU z`biL_wAmyiRU3uU;6jxe)-n~U;KHeJr^ib|46q;vOm|NsAx%}5HX2!?M6}1^=dI@I zDEq{@AU8#L;`ug_wdkP`f~i2iL)n!stKyvqpZq z7Af&!(?q)2gVcrZirSBfo8vVZV%wr%oLO{Ei*v0m42KlY0wX$FB$7kUV!{;CfeHD} zI4=Z^G^30y1jh7_QVGl!a>TS`YDlZkl}kV39=U;kqSVTtdZe3ZfU1P>Dz{LJG+NQ;908rrKASWSeyR z2@jIf=xY~|9d#@U0y2WC0v8goc&b7bGN=Z|NNFj7e)8?9VoPi-^z8O!8&AR01ICglbN*imM9l!GvX=imH zI(#}ZkYZ%Zlv(H|Vae9&87t4;GEN`rrO_88?EJiw!x?}`J0oSAHSots4eff^$xW)H;^JbD-h||XfN8{Ry$bIBbI1tr`RvO z&}s2_$=F7q-u(I#s=p?iHTR06+Dp}-2_0uBokY@hT?PlGk4L3uN+jea zCP+Jw6qXR{t1de@8e=Bto6sK)A{b9miw4oxjlnfmbhehLZBA2=gVrEPk)EI>+pgq9 z8@iyo6>o#0#T0Fi(f%k?D}St)(dj-dD#pLUWksv*1_bo}A<+==qI<0-J-17t7`L;W z{_8f()M42Ignp5&aJ_p=OP=hN8EyH8O4An?5NS1n0`oBr?r(mkm;cOU9jzN;ZR(p^7@ll$c-VM9~Em)$}Cg zvn&9%^Jt+P$73Lk7RIDZ5BhV+Dw-z7VVxJ`S9nxYEO?`{&GS?3b)v39)jg#t)<;TD z2MySgm3dX2GdC`IS~Q(Hv`DM%+=%3If0@3~Q6D$TPmpR_#=Y5d`bzyZqX}l*gVf4g zdJ~UYC9m|QLQyE5ZO&y%hhB>Z%9y6T7%7%wVZOC~YBkTCjF>omrIwDHE*k`EM09M@ zc`<|oF}mDMqXg>Nj!1K{+yz%z6IZblYqDelg=qmD@f4-X-T=X;u{zY6WRY9&UGYFW z5vdbaE=^lXL2hVDuU4n|iHdRE2}j>}07xuT`08l(_|r|%9LhEBu<8pG@;k6@95R7b zRn1t*bh5R?dTyE?S*oz4;3Mu1@**bt#sAA?L1;w3(cga%Hx{4t$w;E@^LNdPsdKMAkWuXLmfkYQ$KdR#hUT z$|g7DM;HnoVb@1*hJSTg9k_*P4U=M(TnY=kxs$xR=~$|z%vEZ~KOVcNP2#tpwjiW0 z*D|i*&~kf9<8QR3u3`*3N18bg@yzX!#^X_I#Z6jYTB+?Ze{y?@BG74FtrfDhh@Av> zY0$}F(pe-f^Ej^a2teweNHnwR`bacYw|Wm>&bc*qg}a5jbu0^Xo~KbCxayDG_#P@Y zj!p?_xddm40HDRyyUD0LEf8k7V)u&&=~|dj)b!SF|WMS(xF?XF0Nqk;Y0xp`IfG*R*FY$2wZ?943@F~2(hSMh1pc7W^f z2bv;hgz|{X`9WJgy%@&<*)%pJ)+}^ruB91}bsnrY)zxaDLQIu3(I~oxC6p!(jpM(` z%DBK~OJ~W>!f(e_QkPNn=6R1{Nlz7AQIMBznt^1Ib{gj@skrH~9E8*}117WLEH|+~ zvvk7GMA{SIS5!rOlDLd%7LTi+GCh=awhciJOp}@_tE9S{0^5#MOAVJTf~wJd+i{uH zY2WiMs5E|7Mbt>Pw9?LCkeG|$q{-9e#Ge);$IcpS*Vu}t%9cKWj-&_HqEXTnMaQyB zp+55<*hxsXU(><6fyHG-g%z8>EzQBW2HG^{WYF z+Xz3I=octwqOoKwH85{D%db`8@12R@=VUzgqEt-Dhin(Cf^jELOPQeJU>;2yJXh;= zu34PW3093ODVSlkks1n=72fCtGT*bu^ z#CBzE?P-w*qN3}KOTP8eM@z-yE((FBP9nIaVC4*TQ4fXds%`4DOXxwS$o27{MXO+I zvwk4tfNN3_sUzyJ@1N)vL4?hIJUpXUNYzb~hxyS0`)*{RP+TV=dX>~%7mjsK4Y`_z z%SwB|@(^+Ruo=I9q{Ro7>sa)EES3xriJ05^0KJ zg{I^9!Mc~g&Ph`{$2Mgc0Nlx0L82eR&8jx?zP&CDJyL8hsj6?56|nZcYFD+m)Ha@G zeL7bgD<>XNl`h*W3AO1+bP&~o&>9tEr?s>;B(@r&#F$6msMn)ReEQ*wNgfYfEVf8v z&s_rXAP&+hM#|NXi)N2Dnk^#}jmuWzAVQB%xjNrU8PxP(=>c`D5%bQN946CsC`8T6 zP=iK3756A5nSQ$+Phz;+7t3HBREcQZT(QeshQ!XEP|Xlb^la77JU>C!ow^lup*moO zgb*=1>Jy5$%z;YJ$}N%6n@EiiO^N2zm5Nfq<(WFQJi$pGaKO^$X!xS_Ti)BRo+;`h zS&Eu4^)ME;wJ)^Oq=5#}jfJa|N-mdzCez?RDB08*Oe!=?j|bF z@=uW^L2k)mEQ~_^O-)isogFIJ`u)R|Pb*LABvgnQy#03%S1wyhsqbHI3VHiOkgDVI z$E{j3S)}WLBf`RPzH<)`nmoNo{COg$+HvF45C9zqoWWz2qi5*Yqzl z>9)mJTcRrFqa`aaE9}L=oQ||0W>C-R&6p7PX(43W7P1I(EU#2VgRA|J^?ONmJm|0l z2Kf`*p=C*h5~kgdP!w!=rMizFliK<{^kffdF9_etpXsQiO0Z4~S{oxMe3Fn>sViP14g3f zZG2@Y!A|t$d=m}R&5I{r+DoT3jJ{=~3O}==RaV-zIu>;5v*dLIOY402q~6*P;WdF7 z++sbFOsScfOzT{!dwv*&#uJNb)W0MMT-@%c-x%GY?=rB&nd+WEBP;uX@c>-2q*6MM ze64eMYRxiN??jG6%>tQ(V0ca}8d-G7lxgbKSK?-7m$_;7*=>i+l#ton!+1J6-w)~` zU0=rK%$4zZmfq^P5q2fv5##J6Ec-mUazbX=4uZU3M2GH%-pTFV5=wrSUH)XUQCCn) zxZ#WpZ89UWQdOm0MJ$#eD9HuqEMGlYh8+M`nDcIqI{FkQPg zb+z+Pb`Kh!MKivV-Au$9lzgF?8($;FJVO&^DvJm)LFdbHIAYb)x-t!>`{AUL>3Hfz zDU*8X9f;vcRgxWD=yc1r2qHA06=EVR+Bc1yEwyAia>4FTvY=C>xLWF}zoIi#uxwUS zQ)?Z75hTJ40*%Hjk7bw<*QLN5HO-dk4%=h?eRF_Dyv#;sAhqLZ6W1h^TQgxrpp|br&6<0M!I3H$yJZ+U|$Yo zHWZu`NF9<~YowjxvvWXP(6woz_*?6aGO2_nY=~%c$eq%t(>>DA^=a%@(}3%{zSJlR z$*o^%X3@KvYPwELXNiIxE#%RB#E{!jGP<2eXs;7hK4y3zRqWJOY3Vjk97WrZJlTXi z96!XF8w93}HuH1(HBx{+bIrN$Tp+^XuRe&ULT6jdn$y5b#l)UenU^1TrwfRP9kPkv zPN!p1mI9`^o!aQ3!zEgWq)7a`Yhk1+jjhg(#LKX9TvuIP9$1fvfwA#I6ONcTT3nRz zSjlDyMr|Z*m zTo<((RBVa5HVbJI@yw8DgsMbwM2w_qGJ|+zcMy(oAoLUCe8RLcnGB-)5%=~=b40gGek1szLZ$b?p=7_9jP}klfg;sc zJ0Zn|vZBkpyfe{#uKPv|07<(x97# zI_*UCwMse_#plR^<#>#B$j{%(GZf?h#wxdFxy@sfB5vXwkCEv0@p1Q5 zbBWtmlo_ba$%CH)rugiGMXGEQ9B7JQ{EgVT5ee0ZvKl@ZYeQr-V3i3KAfu{On9LTZ zM8!DS#hYQX^edh?=~iquakB9SqbH%XrD$xEdA)kY?7SjD+YcA=L5&|+pbjh+7KxzdhWUmQ`zYVpOR zF9!bRqrde?r--u~Zj_6e=EJLw9-zkAE_!pNpm+Cer+Cc7xc7x6(@BcdRkH?kY<1IA z*#yGB0TQE1svtI^PwNzqrCqn;FT!gf7AS=v-<=sLQs~Enee}p;`6gapR6@;Du+&Xo zRN-lO2*|Tb8!O|UN;|Ob0qv_jJ1gcR{c}Lum6@6K9jP1u=CTL?Rv~Vr0#gmN!R<`x;j|8w?-Il&8p6 z3kA$gTHYX@2C)WgZn={+BaIUn*)_EqQ%{UohKp%~>juh=wDpd!W9OC*)rYqnKH;Kn0rt3L~%aGFE{}DWNtbKepyc4R%x^ zCnvVaL!NrV$z(?rPdQE@(PC6duS5no{5qB;ndP*5P}OvoRC6QWrt%l%*$$>}L--Ml z*O~C#u$@K;yta+dY0&0S-t)|Uxc*sbp-5}@F?1CVa?B4sL86E!NDM0-JglH3$s-x% z;Vb5W66MCvqu7*b@H`0-=B`n@g7!m5HY#u5gL(J6R1|GeFuc8^) z(cQ>s^}EWhZAc8ui7-BzbRlV{4h3ap1!M3IA6Rs(eXd0^o#)rK!cLq~eRIHMPrBnx@s zZRwyv$#k;C54g}S0SX+_#0SLmm9!DZBc)MB%9swG#3N&5^#`+Gc5^;kGcc;VHdc3) z&G|{bWQ{Hz@W9YhW6V=a%gc+(lcgp6FXG$6Aw17CnO;7o+!Q^6<2xDK5U{V9h&2yP z5CJEPWmKOzFC7PntbWVOCA{Ji#0@Q0!XsLeB_oFqC@PDD5KZei`a4XYMN&j&i?hEA z#U{#6K5|uOMp7xBIy!9i4U;6?;XIag1c4nhvLKYX2w9P?*|HVK+*X?S@aP#bCCXeH zuYU6Mh-o_F#A-^}**uvxEe$cS%Wib7xS1*8kpK*Rx`8lfcvekEMd%Yvv`yDqBR7&V zq-1=F=B{B`EGRE89$YfKsH7s9UNMG*@SGb_0u^!>$qw5^MKzl~s+nO@d&@q8PiG#i z&F0UNpmrioqJv7yhEwAth~)5M0xcOF&8|VF@9A1!kvKDWuMdX_&34NunyLEXbPSdK zpQCq-7P-_9Q$d_cL1Dy3*}UA`u~fxq%xlB2v0u z)^uL%NM`l4YSQ3Tx2fvlU9LSy^~g3_!_BWo&X*mw{gaUzt>$G#gNn+EN(zgT6{S=H zsb2+!g?@387m*l8*I>z}l%i+qn=qS1v%3jq?O|xbg4(E()eoiQ>l^GNDK6jCmU7{t zZKY*nl03(`Y|yaM(aCha@MF`lxTLUj_z2pH0mF)tLy8Ip7L}Dp<*&du18Df9*84+f zelV^alj*)45I6>j(WY6hn=?mx)9MLn4MyKSFt^uXT5H?HX2B5O#3o(!)`c}O9OP38y5 zYQYA5I#$HslWZATLhCY&dQ&2~UCtAR2NsmcbHEF;qCuBC%i6C9BL2RpY7&{Ja8KDZ zPHa{q4=XOOKxdRZCHEjVwV6lnyQ_K8}Lb$kJoz8|pC(qQ@Z1HmMH?Fi$!pVFl*l8BIJ(%4U^5 zyiCVXCRR`5S##rRq+eH6GeNwT(tC;+_F;XkjE!(8riQwQZ2Q&nz|$e2TkEqYxxApf zu(%lOz~3Ytp`fOl79R^#%vP!Sv}nPj2Kc77c`}2Tx|@SUs)0x1nU8iJd0M5&sF4ZZ zVhKW#u}nrwWNHC9lJrdBxwTqhr5^VhAm#7M+A2ZwhldRC%GUQ@`ktfjx%%E)-}Cgn z54X^R(A&w|`$}<-ZhF7%c@M|K#J?Ms?XYCGBwCI4@)1eill;Vce||67eSKXF{B@8$Z=qZ9e2 zQQm)zX)*Phw4l?aTyiD02Wg!7iDPD*c(2fR^cBZV^8RZ~i_uP`rQ{f5SW+-lVtcU0 znV&c=()W@2j=jM*&GPQTmP#0^gh_@4v>h z^ihS{Ejge_baGL}0EsO=NxbtD?}PPyw7yT!cbdCjXIk=ITC{d!3`zXcHO~CR@eqAK zR^J&E;+tvm{%b6kzBVmGw02{YNo?uZ^3G4ZW4Z7?M&E1nozCyCGc5%+EyJ{4l#f&y zJ4EA*9}1~BTHlY;_fzzJhP?k8%Y~+pSGVLSQ!eF&68}Rr&WGvyP<=mM-zVw&>GJ+- zObbn+riCGFVmQdOiOgS-qQmu_!6=ST(Dzz>KSSPsjcK7N)U*_;l``0*B~#;kgua^^ zbfO;PBTu^iAn(7%w9pi4TFM#0=$2$qNn)F&??>u;iN2qt?{vcX^-OvHHKqm8GHFqL zHPWPob%@0ID2=(MF_}DBzG2D$J4aih|DCi*M@pxu`?<`KzDKe|o>LcpwU-V_a-clW ze3(ql6g7^kWcb)dMC|+|Llp8<^zn2j%_xB0qrF)F$${1CQ&eb&in9F+F+_t4E97y) z?!|@J*RczGxeLXDO%~C?B)rIF$s`x%w74+GzYufLzfg8X@ZJ37!rT@Y=K2?6n{nZ( z%{8pyioV*5#g;5_iz^GpO{%M(%3~?n>Ca}67(>bM_rVR?i;0vhpU%Te8|v9(5+_u) zBz6~y<&hjvouWjN?ZqBRnUn#Hf=}}AfK(+1FgwVWg#JzfCiwPZ1@P2BR{z(!)1^sG z4&ecmGo*80o2;lD+ich3w3mj~1vtFAs-}6eyGj}_5sd2OAQnQJyW98n(xfHJ*?gs` zrb$*b*(@0)myD`zFw1!eCb+775iLhd#6%5?i`L{6A&7EL4q_X=WO=m=C^a!OW`DP<}m{Aw>chg&faS(V~Ks9LbhKDK4X5pDb@tLUMU~sq<8XS_a8U)&NG-i%SQW6^s}%hL6K|RA#by z3cG#aPuWE$o=@nXJa9O#B+s&+&g;P4N?3C^c`QThy>c^>*?s%w?k;uTj#^ExZ)RwG z5xz>!!!1+nWSY@T1>=CNY zuKq~A?%~9!WPO7ygT&v8HB*g@j+v?QwESMA2dzXa)m@h zMu6;dWAl5-aM51!43pky4lPfx!R>Ec60sk|*5>N*C*fNFtnvDb0Umby&L>_QqIH?)Qf~@k&S{@=kiB+z{vm|n? z5t&#&wNbw4XfiY{U%V2dSv?|E2FpVPnX4f-CG6_Qgi&3x(9NNikE_wGF;1&zFPz+L z#H$=9U-eENRm;#X!qzi`5!>hX%0 zNW&+k9?rc9_4PcD&o4F;eOkoiAw4A7d-crC%GL%jXnyivMD)ST>XbtpH^KZtu+eo|2ZK4YEWzL+WlUCDf(Km58Ut zKIw}i$s#F8WAH596zM?@O-52nTFN96-zX1(6ps&?T2Bt)(T$Z2O4tS@Dfnvq^6oi{CLSfM39Mynn}zXOk`PxXE*eMkCOb1P-(-zZJQ-4w(ez^ni62LuZUQP%MZGhXNy~+f zrNk;GR@XEn3#ORG@uGKI=8=?YzZ97x@+N27iI9QSvZ_(mx`)q2(yXpaak8AqJWKJQ z;t|OTj4)#Bb_Pv9I%|N;;@7bht}3g0av)>%cxh_t#l$K>ZBN8}s7001`V>r-M<-WR zPBtfK_VntTnX9#*oF!%Gqrq|EVQyI;;jBKu6WOzaNex6fqW+z(Mi3+)3aU;MGe!zA zXd;HAF6*o6YiXy*l=Q(_Ho!nTl8VMGv}eJ%%BpH<)2Kx}D4iy!uBzT7t8WIaW}nQQ zTr2OkP^Er$>QKtU&N`G;4b2*lk4-g_;O$8@an*8=bqx z6eB}!X@E?xiQ!X?lN};LwQQ)DMQL`zZA*HYti)tuGMtf2uSAR zXHZj}94ao)lTe|Uh1K*5P_@zas*10)j!$W*q}gIIQ!`~Q8!tDQ^XW`VQ&-Mbz+%;F z%QuO;JAIzVQ%V2NQ)zOXI+oK{WK2|M(4=YQ7bhKwrfZsslBf{d5T_pzQV!jTeMM#M zB;>wU3`eN}X0vbdiT)7}t8O5@6IlZlSm0R58Oh_Y5t&D&5viVn|B%@6(h!@fHezBH z8}DegMn5->FhrV)b$+fU@xSRtZFPr;;9Ys6VkqAoh3&!hu|-J;r7 zc5kK`)hZ{!4IbOvFk^b1T9G59um_JQ!-gbuHh-QhwDZ8ckgy^Cc@WQbnWi z$=4yW($Vx}LT#$HE)`n;_H*g7m1_S8x%=~*zr;T5d*bYTNRpS zB!+&Q?HTGe={Tc^LbKbazGXx zH@z4~DciTVE>q$F11M+fK}^row71SUkURIK5L@(GWwRmewqpLE=IbOMr%ddpGM+WO zroqG_+K=kk;x1H}fmvnMxZl?@!!<&?FH~WPgjl!95o~Hots2Ncf!d9n6z*x{qeV?u zBPX+Gc4p7K{N8;t$z{_4lGTv7K+7l$enmu+459irg!>%h7(S7Q4O3Bkb2-$}D8P$# zs<{sp0^iI^-N_M^;OmKwgEyO8Zd5}7Xt_>r!Z?~ySDCD;Ri9uHJB(tK()RVOa+2vT z#kO;mmwBvuHx^(~O4HvsQCA*H4K~uE13G+EW#!7PlI|gjWxC%F!)$NHGZoR5T1Gl` zTPf8h)F6^>a>-Q}qxt+Uvf6SCHCETwPtm>2rPkGtr@Kfv>MhV`h;Bo1AGX)%0IVR>4g{3LezXm+|VWt zXgDKBHJ3yqo8D!%=|c_QR9mHcbX8D~wj4Erq&wIomOc>>o6he1=HjCHq&+4w>VGMw zeR^hQ_tlm-P#R){r-*7?B%Qh>!!$CH=oJ3U%W#R{n>PB2pvqoITO%GQmzgHR9W&X&3 z3^icFGQy$)Z>^@9#>vSt86c8mF`P%bM$sIIp+^a_V#Ai6G5BT3*N&E%x|pH{hBXh3 zmb7siV%%N{X@TOxf?7Xqh!75fmDG9SiK#fdaP;Z&+?HLu;^Q>l&+7pA2JwggK23Pdm{{42kufwYSu%Y>CCk&~9yODh)=1{{k=~d*3331?l0PWI35;Y+ zt)9TBkL|9hn2UA6hJmGxwe=DtyY>bzX?NI=NXBOoD4Q{^5;b<~CPgdpsh-X)I+_uJ zOy6Q@bgd1N=&!2C=ty5es$O++2sXK2)%wY%g{3Xw2v+J<}oB-fGK`Eh@lv2ei*gpAvGyC=>le&y37+kblZtm{whZR>8Fe^~m+&(C*mPbUN z!jej(uHb2ncEDMZ8~i3-;*I`qksEIN+)H~Kw;Y{?kpT8PE%CR6ch*j4_iuIHdp*uy ze8dGa+g`X=+l!8Ad-08JBXN~cZ=D(5=65?0rq|`@`~UC%r`h1Y{g3@+&q{dSHSlkE z8$O2PTY26I&;-r!XE+BQgU4YOybN!&_Plv;V>{2g34Y$u^L~K?+IwDC7z{&T0!)N| z!=3ONybgVL^1MUq0D7W9CtcjJC=5A3+R=Z%F4&fluI5`2Aj`TjPcPeZA&u_i5#_ zmHhIB{Z-D@Ul#EW@~hX@^ICbG$^JHkvWI>uXzR6V<(c`~;65K>kAE?>z5hmnFOV}&R^Y(#m zaD5NYyB+R>hhR0Vg&$xOwCYI;pabj%zk^J8IF~Tt33v-WfJN{nEQ2-h3$*UdwXh2m z!4Mb*cfbQM8x}zMk)C%mJP$9xmq!s+f6qH&pywS4<6#0^3)jK?60RvFZO0G}98iW# zLndUwa43P9a30(Vcflt33A&VXynd4>|JK18?<;Q=|CYhh$iGcrME>a&o4il?J751T z^*)OHlX5hr+<_`Une*!8wN3DKVIpBmcDF<;ClU7VLH6%{MqZ3mc%vkqyFo6DfpJg; zGvIW12p)#l;SFeCL4HFLy1`#YlLt_GEcpea;CQHq2AB$`!)9;|Khymhd)nZNMMRLXw_^%1(9?shhQmu13!B|LGW*r zxBmP1Kkr-qtzNa-TlVGZMV~DCXwm99tLLm*y=u{ytKGjv?=E_i@4s9vCEBjFw}aQ& z+mABdS^g4RuWf6}xO2ON`K4Ve``0snRRTm0?BEUX_Gv3((%F=?lK@lZR#I9glAJO^ z;=dkB|BT**r{Fnw1>S|d&Y>>De$XF^pcu;FcxZPnIvaL_{b9*p(Iv1JeuA-oqi(?z zm<~7moic(~;4PR9AHiaHZYK2;=E6Mq2tI~yU=3`5jnMf#^g48b-QW;76bhgSN?|lS z43EJJ@H%uqpZW`Zpg%kekHd5D8mzj2uwXs3y3q5gp#~aY2F!lyI_PmjH8IFJf@Ou~!e}r=&^JdS>hJH{8PrlsxZ`%>1xMaNTLfM2qD_PYAq)Nr z_rT-u47>!Patq4PNy2xVOxb_aqHKe6rL^t&U#-x8OTSvm-=$xX5To0*gst6Y+Kjd; z4YuUPQm`$9cf7>uEhxALoemenrEn$O47bAr(D7c{RLF%RU;vcD2~Z8U+($iz@8Ad6 z2s_+Q-ob8A2j{^Ba4Fmj_rPQD94v)pu=4}tHS~r&xE8L1r{HOL6W)R$4|?7RI1a`` z1N;$Y!J9A-zJxXKGwk;eZ9Vjce3%RuKa1XgtKk;74W5IOpF^*}Q}7JbJnwmv;JBAb zD;)L;x(v$Tc$ff}!_Kct`F_9tJN|vY{u^6L@z3(B`{zp1{QYXh`W4<1@2eG`ulQ`m z0^S$QS@7P16`pJ9JA`b3c42Kkz?7_hCvAU7!?#UR+J#mkL<=~%PP4$RSxtha zFSmnN=pCT;V4)}Wy|MgEUAL`(mbj_$QHxNmOK-Hq@p<@N$Aq`n&Izv+UVs;2IeZ5{ zLSmPM*BajHlAuB-yj$QYxN!G`_fNPT?u1?TUyl=w$ zH#`b&!i)PQypQ1M{S)5rA$dT;%Ynz?ZMdT=*Ft)?gm*Y>IEXL~PIz5^m+*4o=rqED zuc2*v!n+ve!D83|pC6L&Ho?L}DH~Xo!FibpZ$7MnPkWF?c&}%|YoDF)y1*eYy;s7! z1fIxEcyr*3-jpR&^+|X$;Nbj(cLJOOXT$Qo?>IOMu7_7(0W5?|mnOW+;9qbRTm#oa+hufBVL#X(vY-d_gly;y zd5{l%;V3A8lVIbz)vK2K|JE&E6&*B@PpcM+(Eoq>wKM9S*KQ^g+VF|7A$hZ{d_*_2 z3h4&ZR_x~;d=~2bY&Zx00)K;Y?;$=O;@~ZZmGBj;hBfdVtb-q5J#2&AYK=Vty7852Z``(>*XEb3gWI;>?Ki*tZr>fH7by4n#^W=`@>~BMyYmBDz7Aw2%SX7S?p-+$@h_g|9N;>C+^|JNm#%sl7x(@#I=oThVX$DedgJd^oMkS;BI zOye`rZ{^b5?kAIvo%c(0`Qm30cW(#zt!-<`5hABocAl8%a^=q^kNkUi?S7Wyp^4D7 zdS7#GC;Ka<+j)JWOS_+U+0kot{z3a3jH=zq-k0CFsr+Dz$J-@Ta=U8DwUKiD*+@kz zZ|BhOR%Sxwz7?6-vb-&kT-l5?c5`ztpA+>Jov51-pNGlYnXy?o58Ry0JsjT$yY50c z!eJouGcq5uAMDc^n;cGuKfoVhCdgdPzu_*BIhq$Cdsk!*dc#9q=%2$y=roz9*C@ICwpKdf2t#Tt2i zV&1=4^T~&Ay=*?{H*3~B`_{`p{O4Z#;kK9c;H?$*^O_X$=;X8WtviT_1yVPwRhPzJ z5LbwczO z;Rq;!o8c*V2a@UBA5MiI;Lz@j+rb;~4QyDu;p?^W7vC&dxYqxE9>33t+qC^=D8lu)~%gi`36Q2BALmY>l+(NgDANPglH6PAgv z6mYDuLkbEd&H0BgCJWQxedv0qncF*qzfBpmy^zSHjRl$KdkUTbH_!LmEc(RIt_QLM zm%ycPEy(=e-S9N5fK~7d$b4UCH~?hM?@*9=zdysd@DzLo1=+Mka5`KEFTq*8DAyd? zci26bYvES79UcUkJNyJ>9p1C=N0vUKN2~9SywNqug&Ny;kew;cSY)mSbE3Olc((Sm|Q4>pk7k!B|NAt~y;||GeuDiDL+`>=_y)d((+)?b;C=WI@{Sk2&YIXHU&@&@n2hfq<7 zEW(5EF8mDp4rHDR(%}#&hnesxdriGRm+UU^c9S6UxyA(5iy+h7~YuBzgsYf`Oy> z9&UnL;9Xb=UqQjK=y@0pGS_?x$Q<)jxDjN2`CgFu<@IY;e!k%SH)cKgz^prG-8}2+ z1+y-_^wL@9op;_WdEI>T&6m!ab*>z)mpAirb;?-GPGfieG0|m5wGX3t8?Wcla^X`b z=i3Lly-Qm!(WezMz;{*xI`?VS<+Yz|srV%nmjU7vNQ`U!gKtFds6KEOD!U~@G@+K3u_rmhUIYFWGX`)@&o^b&tXIC_3cXeV#$Vu zD_722IeX#C*(*2j@6~y)ZrJeZ!j-SSu;IxK59uXKIP2aew{4(Q1SLh0-!yn*0SOUvnr_<2O@FDy( z6+I3^rZL_C&%+mR&~(Cw<6%5p2n{m`8pQ8ocW}NRSsaW1#}E)75b^nV4%(k#{5=Z! zTLfXBj|=%c4?6yVelF|+;seqTMuX^i?6+l$=T;9gI^@EG68 zr-xp6;a>jy`yqLkV=3e|n!9@>+)>g$8l*?k7e5Roz~uFQ3W$XK7=07>^4I0MdwM`0Gc4~yVyNIR1{3>lCG z;x98DUV(%Ehz^J8a6P;L^Fe%RTAk&2CD7qd)K&Ne5@(bD@EbS~dc$Bi4kp8&;4-)q zo`Ls4{B0J2_}pv)=d1GApYa<2@mYBvb~}f89dJG?g&d2&N-fNU7hol9g0|;U1)(QQ zglk|fd=6j2YFH1g|AMT*p3n_`3n#(>f5py(g|HaDfQ{kT_Z!!kkKb=xwPqEgUV&H{PlyE2Kl`0VWeH|heM1iuII+c^&|f`7mx@Ep7Y3*kFR{GGgky&xU>LLrpG z$xsh7;IHscxB|rg=O(xXZi6>K{D9WN$eH*Nzl^g55a4C2=_4(^8sLHv5=!olYw zn;?EYh42Ts2kwUlLHv8(gtwu?1?V8y6LO#gMnV-d!8vd}+zn5{Gw>X|058D`5dWYq z7m_v@2jU-e1zZE~!(8|X#80U8MT80cVJut+AAl+IXi@uRz7d)Eeia{=8rhK3%&Dm^ z2><#$AAH@zbd+e9NT~;M5-I=VB~I&Ly~GVp_=oWWx`n@Qz*{gI_P7K+3CF@8;2qfM zpS15#2{*#6AU;5E!LFB*zi=v?0pbgE3oL=|mtpIH_ydiAbKyPM^K!}tj)0?}3dGmv zMpy{DUqO2h!$JIfmP5}gkvn)D=7IR^bodwj3OErihnwIzcnQRJ=X>aJ6?zATg81$H z0Um{S;C=WI=0f|c(N}O1Tn;}$n`>xcp)bsWH$Z$|R>K<5QnR&x&8jsU*Klk;+IRVa zGB%$UZ$uY-XpZf9<^w0JK}&oBYc>Y;UyR77cY2Nz4z(oIe_QIlCNLJEN&?@RQkN^< zLXjXHd`JDSkob1LmOOwn;W79ceuAv)$bYy5t_1Ppc@A1%kN$%KI18?W8{uZS6~v!s zmm9G0pxceucknmZ{U+uCp!?1A*+Kks&Vuw?&=s&0#P?=BYy|PY+4WZR3l!Z(dBF~M zFjfU){*9dg=fG{y?oRFt{b4v<4YS}Cxc@Ht1@H*0g#+$JN5Kow^B&?1?eEocqg?bA z)VDPoS1sMRShY2OsgCo$-}v5}FTeTRn{U4P1n_$J%{TAm!xMK9FEiGj-pcmO$>lw? z7jM2lvbFu5y1A?UUfOH_n0DMh=34)lHozRWp_ZE$N490)D5&dv7nJprJ4jhaNL z2-RX+pQU7D@)wq~kSt2=S9z+C_~t!<&V`HNV^{#6!eLJ`h6gKP4UB$@@`MR+6WkA< z!A?&jH&6@zfd9aJ@SZ{U!$09>xECIS9iGMBfI=7s<6ttJ0q4L>5Z|mz;8GADtt;Uw z5Ff2OK>V~`fC0~O9h?cb!tL-PEP)@P^Yh3zjE5SS1oy&^aL5bTw2%d7!j*6ptcJla z(zZb@G{f!i2)qch;ZxZ2CB{x*KR5uAPy#*q1OB9)l;~JE(pGn;*V_c5h-A zz_sudeEJr020w%Nr-^Uc-f$@7Lph9xIye)~g(qP(?D`JpL0=dS;*T~KCPO`32TS3g zcZoCH2TNe=Y{G|U;dxjAtDwt!j5k0HTmm=4-Ec2hTg^7&V#m26$DWgy{YZ;XlP^uX z{L>@(WL|R4Jj{Rn6twywtDm~tLIwg`Uu(IRFl8O|3HI61eHZiu#Qv9f&xKvyr#`}& zFcZ#)%i#vN6CQ?V;8l1X+I)asgyTP?oZ&5a7v6&p;5Ty^e}%*5Vq3vI@Da?1rLY`Y z&7%%M9^^wmD2KnpEO-T8gEyenN0cLELN!c)8n^^5hb!SJcm?Lb64(GceoT#kuFwPe z!_hDb#=~jwC%6!#(0;-1;m^?S6T$^s zs`k(K&dd|x*yfj&9?nN{7{7Q(8-e zpc1Zt#~}9$(hU9J4{#^k4fn%3*!xTD3^*RnhG$_D?6w5ChKpbx9I}-51A4+pI2JB} z+0bDbbqZ>s4sL>5px1J24Cn(}6#}C(!tcQ)R-Xi4gpcS-hWdm?CPH?iDgTot4ky6H z@Gg7_`>ep8g419++ynQ)2QUXZuf%?abK!b;8pOwT%qrSR$o-0T83sZ#+yk#d;%mkW z;85rRC&QI+KRgWofhCY!P1(TVa3u7H255rI;YxTFR>A(?V3)uJa1Fc#ZP%cqp*Qq_ z5ik>Og;!zsZ?QdL65ImsL#OXZH|z)LFczv{JT$`FutQ3D^aE-Ck#d0wI1}2h=N`}vzJqo0c>~9=4l+?$ z&707la1A{36LtaY_%rwWh5Up&VTVM*+Yz#118jl=TP3`Iw85_s4sV;2=K;QZfI~jsy-!|V0aN2eR*0{u^I^$4 zQu1L9d1vB7}a1A^G^I;)ufZcXZczb~JQLo|nT(}v;UtN6D+d@0|JDdj} zb><#$V3&k<5X^#C;5B#yoG*K;-SBgU8{j5*2A+d;@B=)uJ8}l?_awg18<;EjdKq23 zujRE^-#7cFC($2V@b#Rp-{qax>+(rnFYyg3k1~<=Iy`Q0T&nQ_WXc~CKo-KsBi;Fw za`@Okhwra+=MW-cw)TcgT8@Vk;ZyhwHo-o7;qwcyNy?j(pOem-!T9^}I~sD>lc_#Fno zIH-mT;38NEi(nS zT=)pq!$vqHBjIJh7qA4{WfCUzg~Q+jm;>|RJ6Hz?WF@>LjDlm~3YZVS?SbxrfiMnE zhsWSUSO-7A{ykZ10#Cs+@G86x9kcP5hYZMqQaA=q?S&k}rEodC1TVv1a>&({{VIF)89ea~D_z>p8 zBKQe@fv$P1ae#%e2#)Q;x&Sx<&VV!FTDTtE8kv*wsh2PoWUb7(@Ep7VGy77HU?D65 zSwqtnhQe^@ei&;$U?ThxE`$5v0r(L%z$Qo@j-H1z;VkHU1oaR0hpuoW^oPk%4|8B1 zd<+X<2`qyZunNA0Z$Q??)WP}i61)tnpx05XKY~&4A9xH*$=FhLrMTg1TfKcn5H5EA zEL-MU;-7yqS6}bUHTK;%-ft$W6N+uQomaOiaUJiWZMQGVKV1K}R{muY@6TY*{t5i5 z$Rjuv8sRE<3*Le6p?d*k0cFq#&2Tk*3=5#m0M`7#QBVsv!>uqI4lJY%hLLa{Tma9& zTKFCg9mpCTm=OIQkf4npqW1UMhwh4;W4obX0K8Jq#hA%qRX z;3l{Q=0Wdb+5n)-S<{a3)*_&%<))a18nvj)qBa2|Nyal%dO^4laWG;4|o1PFX-R zTn4YgK^24r7s7+E9P&p}mT(R{2n%7CQRo)95MF>4P&^vBf?MEoXnQPW3nSrP_zY%_ zVa*b>K92js$?y+&1b%`11{3CF@|a1DF{zd-*=>JlsiI^)bF1zo)*dZ=G$kI?)i?|d|W7Mb(;pg%H? zX#dHjtL(ou(yOrj22=MqqkUfF2hd1ExiPRaG1?yqA8tMg%hnry`Bu^nf;d9u3 zQo^f&`(cM#>MHCunctyf9qlT#uTOX-@S7==H|%mM`3qyu+H$wEa7Af&1ZSID96y1>6IRV3+e~i(n!=4QrwI`LrW&EzE|Wpyvh1 zFyRTgc_V3<3zunpI&b@c;%-or|^Z33+JRk59d<9vHDf?g@oPrL|a2;3y zJK+>)SHorVQ;+Km@O1`(Dbv3=Rc!v~4*jUea#{cEzt)kK$VqU1uSw}}U&8fi9@&Z* zuVFi~gf#g*?=Wx{JWE;s3C1$o)vyw3p$UdROWg-wLa*ht`=R{`>RQ+a8PD;)2-UD3 zMz5sp3v1vM9D1Jm;sx>wl*1DE7{;$6e?Y(0kPU*i056#OqE zhqZ9mD~2q9RqzE&coqNf4cze>@3zo+E!TdXeGpj3dki$f&2Lb~!C^>WPrU{QVBDKL z|8RH%<@`pxP3eCXs{f%!x@O(LAt?0cnx;L88H6LGYUQ6 zZkYZK*MYa;8yLKkdxG5%{VsJA{0@#l>%UMQz-l-N-QOdR!6x_$2JWK$2k(MsH_ro9 z!y#zA(s=27qxHGM?`Z`3Q3-0j*y{=`F%qPoe%yHIM>ea^PMdbtd!1Fcd#`Ehr5!iY z%dH;A@H20h_>rwZ(%jAw5$%LA8gBplJX5d|jzQ-=JcFk1L9-f8IpyS_2Cs+&h&}TpI3ZQxeYG4Pv58uOp1C*Pv7LG%QTAn#r4*TFgkbRIg z94vzmAo>H|=G&f`D|E4Gk!MmOd8L`OPrQ|b!sUc{9NB2N zd5_$u>R*@*s)L~pQa`3F1Vu@>4nvM{ zUU&d1U<+)6y`cIbx*w+<3Web4ig5Fhw*GFoHQQkd%+{Z_0nM%9;?=9?u3kMAc>*(6 znf*ThD}P;+2gwWMuKQGn#eS#-N0-IDC)fdwPK&57c((^fx5Xmd&w!)jV!%n>li*kI zFgQ9dGEUK^gOL!a|3dXmsE&#DFc1d8lTZy$L-#YJFI2*Vum|>m>Y6wKm*7jN2wA!( z>i9hlgU{0D14oZUWDH&J{z?VJcBki)T zpiO4z(3O}KV6t5)nttx`q#rl*GUnFgBQkVj7|dF1mE^GmF-GcTVVzAf5u#g5PqdLd zP1oUdv;@t*FQLYhpH%6v-q1wU!}Cs*ouj2A`)ql5RK|ml_i$UBSp5Xh5Xc(wN$l7roUE_Zp)%2)t1G` zKwB0oZEcxXQfyhA1Z-KnJZ8(#qHD_%Wrr6)mM!Zjg|;lf zszU1;neO>INjqECSt@LQUC5u7zpgUKmUWYRY*}|S6kB2GAwRceJ>B%U*^Sd%B-i%W z%Z zup57OxM9B2z2Bd>GOl25Jk+udHo>Em2C5%H^)IUq-mJyU!CT1_yk5+?m8zFbb#tkH zCe?>@MH)~b{;hl`ji?g;-qbkUWS&JexTqEn)#RY7`E^CNuIkm5ow~YDS9qPGywH^% zI@@1oeCw=Vo%yM=|8xeJ&H~bzAUYdBM}&1$P)CMzbU=HEwUfC=fV*Zoh_pZ#^l+*`QlBHd~9D~ z-$~+q5}b-zpUNr%z@MqbrNtF$Ay9linO8i0QlNYm{xC%)UY}q>6&p|`>a4=T4d&*; z&a$wxT(2+|E4^c;P7{BMU`3>WFk!_46DbuFr$}6i6c($Q=4q7@=aU(gvt|dUO|DXR z8FpSU7gDN$DIq9W37uRlu|AntS&E4lN$|-m*Dkcg<~J3UR85{fQ{r;PvWdfexb6TE z?8pP9lA0?e7$XT*l}yIAjOASta|H`nQv$^VVOCJQ>IXaV!H81^$|WXO%Bq6FDH83I zDVX=v5S3%EGB_uE+cQk3TFD|}-6)zBcFqnv=SW9^&FNiV|j`3H7(+z);BKO7p3CR>3|9K~I8p zHaKYrZn*<@Ez|Tgey#o2zR9XMsD>R$@P9B_ccGS83qzZ zn-!Wbo&!o^c@bU#tq}Z~W{9nDn{I6g@sgWBF$*03s649wbnBn0O-qk>JbK>4 zQA~<9cRaqie(2I&^}kj>9?#&ME(o-C8S6I literal 0 HcmV?d00001 diff --git a/doc/xiiuwgra.doc b/doc/xiiuwgra.doc new file mode 100644 index 0000000000000000000000000000000000000000..44e10beaa06a2683c36bb2e71a30c2c268312ed8 GIT binary patch literal 24123 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 z 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 literal 0 HcmV?d00001 diff --git a/doc/xiiuwgra.txt b/doc/xiiuwgra.txt new file mode 100644 index 0000000..bf23762 --- /dev/null +++ b/doc/xiiuwgra.txt @@ -0,0 +1,506 @@ + + + DOCUMENTATION SUR XIIUWGRAF + --------------------------- + + Gestion de graphismes en multifenˆtrage sous XWindows. + + + 1 : Diff‚rences essentielles avec la librairie graphique + IIUWGRAPH + + + 2 : Ouvrir et fermer une fenˆtre avec XIIUWGRAF + + 2.1 : Proc‚dure HPAGE + 2.2 : Proc‚dure GRON + 2.3 : Proc‚dure GROFF + + + 3 : Description des diverses commandes d‚di‚es aux graphismes + utilisables par l'interprˆteur LOGLAN + + 3.1 : Proc‚dure COLOR + 3.2 : Proc‚dure BORDER + 3.3 : Proc‚dure MOVE + 3.4 : Fonction CLS + 3.5 : Proc‚dure POINT + 3.6 : Proc‚dure DRAW + 3.7 : Proc‚dure CIRB + 3.8 : Proc‚dure HFILL + 3.9 : Proc‚dure VFILL + 3.10 : Fonction INXPOS + 3.11 : Fonction INYPOS + + + 3.12 : Commandes de saisie et de restition d'une partie d'une + fenˆtre + 3.12.1 : Fonction GETMAP + 3.12.2 : Proc‚dure PUTMAP + 3.12.3 : Proc‚dure ORMAP + 3.12.4 : Proc‚dure XORMAP + + 3.13 : Proc‚dure INPIX + 3.14 : Proc‚dure STYLE + + 3.15 : Commandes de saisie et d'affichage de caractŠres + 3.15.1 : Fonction INKEY + 3.15.2 : Proc‚dure HASCII + 3.15.3 : Proc‚dure OUTSTRING + + 3.16 : Proc‚dure PUSHXY + 3.17 : Proc‚dure POPXY + + 4 : Description des commandes de gestion de la souris + + 4.1 : Proc‚dure STATUS + 4.2 : Proc‚dure GETPRESS + 4.3 : Proc‚dure GETRELEASE + 4.4 : Proc‚dure GETMOVEMENT + + + +|----------------------------------------------------------------------------| +|----------------------------------------------------------------------------| +|----------------------------------------------------------------------------| + + 1 : Diff‚rences essentielles entre XIIUWGRAF et IIUWGRAPH + ----------------------------------------------------- + + Ce paragraphe a pour objet de donner certaines particularit‚s de + XIIUWGRAF,ceci afin de comprendre son fonctionnement g‚n‚ral. + + Tout d'abord il est important de signaler qu'… la diff‚rence de + IIUWGRAPH, XIIUWGRAF est un programme … part entiŠre (plus exactement un + processus cr‚e par l'interprˆteur LOGLAN).C'est pour cela qu'il est + d‚conseill‚ (sauf cas de force majeure) de faire CONTROL-C pour terminer + un programme : en effet, ceci a pour effet de terminer l'ex‚cution de + l'interprˆteur sans terminer XIIUWGRAF (cr‚ation d'un processus zombie). + Pour terminer une session graphique, il faudra donc automatiquement taper + dans le programme en LOGLAN la commande GROFF car elle va terminer + l'ex‚cution de XIIUWGRAF. + + Certaines commandes de IIUWGRAPH n'ont pas ‚t‚ impl‚ment‚es (par + exemple HIDECURSOR,SHOWCURSOR,PALLET, ...), soit parce qu'elles seraient + d'un int‚rˆt trŠs faible dans la gestion de XWindows,soit parce qu'elles + seraient difficilement r‚alisables, soit parce que les programmeurs ont ‚t‚ + atteints de fain‚antise chronique. + + Enfin, dans vos programmes il faudra imp‚rativement que vos unit‚s + g‚rant le graphisme h‚ritent de la classe IIUWGRAPH sous peine d'erreurs … + la compilation . + + +|----------------------------------------------------------------------------| +|----------------------------------------------------------------------------| +|----------------------------------------------------------------------------| + + + 2 : Ouvrir et fermer une fenˆtre avec XIIUWGRAF + ------------------------------------------- + + XIIUWGRAF permet … l'utilisateur d'ouvrir jusqu'… seize fenˆtres … + l'‚cran.Ces fenˆtres sont s‚lectionnables dans le programme en LOGLAN par + la commande GRON d‚crite plus loin. + + 2.1 : La proc‚dure HPAGE + ------------------ + + CALL HPAGE(numerofenetre,x,y); + VAR numerofenetre,x,y : INTEGER; + + Cette proc‚dure a pour r“le de donner la position … laquelle + sera affich‚e la fenˆtre dans l'‚cran, de donner la taille de cette + fenˆtre et de l'effacer quand le besoin s'en fait sentir. Cette proc‚dure + devra ˆtre appel‚e deux fois pour ouvrir une fenˆtre. + + HPAGE re‡oit trois paramˆtres : le premier est le num‚ro de la + fenˆtre (un entier compris entre 0 et 15),les deux suivants sont soit les + coordonn‚es de la fenˆtre … l'‚cran, soit la taille de cette fenˆtre. + Un troisiŠme appel de HPAGE avec l'un des deux derniers paramˆtres + nuls aura pour effet de l'effacer. + + Exemple : CALL HPAGE(0,posx,posy); + ------- CALL HPAGE(0,longueur,hauteur); + + Le coin en haut … gauche de la fenˆtre 0 sera aux coordonn‚es + (posx,posy) et la fenˆtre aura une taille de longueur X hauteur. + + CALL HPAGE(0,0,valeur) + ou CALL HPAGE(0,valeur,0) + ou CALL HPAGE(0,0,0) + + La fenˆtre 0 est effac‚e. + + 2.2 : La proc‚dure GRON + ----------------- + + CALL GRON(numerofenetre); + VAR numerofenetre : INTEGER; + + La proc‚dure GRON affiche la fenˆtre de num‚ro numerofenetre … + l'‚cran. Ensuite pour s‚lectionner la fenˆtre dans laquelle on veut + travailler, on refait un deuxiŠme appel de cette commande. + + Exemple : CALL HPAGE(0,0,0); + CALL HPAGE(1,150,0); + CALL HPAGE(0,100,100); + CALL HPAGE(1,200,150); + CALL GRON(0); Affichage de la fenˆtre 0 + CALL GRON(1); Affichage de la fenˆtre 1 + ... + CALL GRON(0); S‚lection de la fenˆtre 1 + ... + + + 2.3 : La proc‚dure GROFF + ------------------ + + CALL GROFF; + + L'appel … cette commande a pour cons‚quence l'effa‡age de toutes les + fenˆtres et la fin d'ex‚cution du processus XIIUWGRAF. + + +|----------------------------------------------------------------------------| +|----------------------------------------------------------------------------| +|----------------------------------------------------------------------------| + + + 3 : Description des diff‚rentes commandes graphiques + ------------------------------------------------ + + 3.1 : Proc‚dure COLOR + --------------- + + CALL COLOR(couleur); + VAR couleur : INTEGER; + + Permet de d‚terminer la couleur d'avant plan (0 pour noir et une + valeur sup‚rieure ou ‚gale … 1 pour blanc). Cette commande a une + action locale … la fenˆtre s‚lectionn‚e par GRON. + + 3.2 : Proc‚dure BORDER + ---------------- + + CALL BORDER(couleur); + VAR couleur : INTEGER; + + Commande qui s‚lectionne la couleur de fond. + + 3.3 : Proc‚dure MOVE + -------------- + + CALL MOVE(posx,posy); + VAR posx,posy : INTEGER; + + posx et posy deviennent les coordonn‚es courantes dans la fenˆtre. + Comme COLOR, MOVE n'agit que sur la fenˆtre s‚lectionn‚e. + + 3.4 : Proc‚dure CLS + ------------- + + CALL CLS; + + Efface la fenˆtre en blanc par d‚faut ou de la couleur sp‚cifi‚e par + la commande BORDER. + + 3.5 : Prc‚dure POINT + -------------- + + CALL POINT(x,y); + VAR x,y : INTEGER; + + Affiche un point aux coordonn‚es (x,y) de la couleur sp‚cifi‚e par la + commande COLOR ou noir par d‚faut. La position courante dans la fenˆtre + devient (x,y). + + 3.6 : Proc‚dure DRAW + -------------- + + CALL DRAW(x,y); + VAR x,y : INTEGER; + + Affiche une ligne qui part de la position courante dans la fenˆtre + vers la position (x,y). La position courante dans la fenˆtre devient + (x,y). Elle est affich‚e avec la couleur courante (s‚lectionn‚e avec + COLOR) et avec le style de trac‚ courant (s‚lectionn‚e par la commande + STYLE d‚crite plus loin); + + 3.7 : Proc‚dure CIRB + -------------- + + CALL CIRB(posx,posy,rayon,alpha,beta,cbord,style,p,q); + VAR posx,posy,rayon,p,q,cbord,style : INTEGER; + VAR alpha,beta : REAL; + + Si style a pour valeur 0, CIRB affiche un arc de centre (posx,posy), + de rayon rayon. alpha et beta sont les angles de d‚part et d'arriv‚e de + l'arc en question. Si alpha=beta alors un cercle (ou une ellipse) est + dessin‚. Si p=q alors on obtient un cercle, si p>q une ellipse allong‚e + dans le sens vertical est obtenue, sinon si p>q on a pour r‚sultat une + ellipse allong‚e dans le sens horizontal. Cet affichage est fait avec + la couleur d'avant plan courante et le style de trac‚ courant. + + Si style vaut 1, CIRB affiche un arc rempli ressemblant … une portion + de camenbert avec la couleur d'avant plan courante. + + Si style vaut 2, l'int‚rieur de l'arc d‚limit‚ par sa courbure et la + corde joignant ses deux extrˆmit‚s est rempli avec la couleur d'avant + plan courante. + + Si l'on choisi pour style une valeur <0 ou >3, la valeur 0 est prise. + + 3.8 : Proc‚dure HFILL + --------------- + + CALL HFILL(y); + VAR y : INTEGER; + + Trace une ligne horizontale de la position courante (posx,posy) vers + les coordonn‚es (posx,y) avec la couleur d'avant plan courante et le + style de trac‚ courant. La position courante dans la fenˆtre devient + (posx,y). + + 3.9 : Proc‚dure VFILL + --------------- + + CALL VFILL(x); + VAR x : INTEGER; + + Trace une ligne verticale de la position courante (posx,posy) vers + les coordonn‚es (x,posy) avec la couleur d'avant plan courante et le + style de trac‚ courant. La position courante dans la fenˆtre devient + (x,posy). + + 3.10 : Fonction INXPOS + --------------- + + posx:=INXPOS; + VAR posx : INTEGER; + + Retourne la position courante sur l'axe des abscisses de la fenˆtre + courante. + + 3.11 : Fonction INYPOS + --------------- + + posy:=INYPOS; + VAR posy : INTEGER; + + Retourne la position courante sur l'axe des ordonn‚es de la fenˆtre + courante. + + 3.12 : Commandes de saisie et de restitution d'une partie d'une + -------------------------------------------------------- + fenˆtre. + -------- + + 3.12.1 : Fonction GETMAP + --------------- + + tab:=GETMAP(x,y); + VAR x,y : INTEGER; + VAR tab : ARRAYOF INTEGER; + + Sauve dans le tableau tab une partie rectanguraire de la fenˆtre + courante, le coin en haut … gauche ‚tant la position courante dans la + fenˆtre et le coin en bas … droite ‚tant la position (x,y). + Le tableau devrait avoir une taille minimum de : + 4 + (nbrelignes * (3 + nbrecol div 8)) octets + + En sachant qu'en LOGLAN un entier tient sur 4 octets, il ne vous + reste plus qu'… faire votre cuisine. + + 3.12.2 : Proc‚dure PUTMAP + ---------------- + + CALL PUTMAP(tab); + VAR tab : ARRAYOF INTEGER; + + Affiche la portion d'image sauv‚e dans tab … la position + courante dans la fenˆtre. Ce qu'il y avait … cette mˆme position avant + l'affichage est totalement effa‡‚. + + 3.12.3 : Proc‚dure ORMAP + --------------- + + CALL ORMAP(tab); + VAR tab : ARRAYOF INTEGER; + + Lors de l'affichage, une op‚ration OR est faite avec la portion + d'image sauv‚e dans tab et celle … la position courante dans la + fenŠtre : l'image est donc affich‚e en "transparence". + + 3.12.4 : Proc‚dure XORMAP + ---------------- + + CALL XORMAP(tab); + VAR tab : ARRAYOF INTEGER; + + Mˆme chose qu'avec ORMAP … la diff‚rence qu'une op‚ration XOR est + faite avec l'image sauv‚e dans tab et celle … la position courante + dans la fenˆtre. + + 3.13 : Fonction INPIX + -------------- + + couleur:=INPIX(x,y); + VAR couleur,x,y : INTEGER; + + Cette fonction met la postion courante dans la fenˆtre … (x,y) et + renvoie la couleur du point de la fenˆtre … cette position(0 pour + noir et 1 pour blanc). + + 3.14 : Proc‚dure STYLE + --------------- + + CALL STYLE(style); + VAR style : INTEGER; + + D‚finit le style de trac‚ dans la fenˆtre courante. + + Si style vaut 0, le trac‚ sera fait avec la couleur de fond. + Si style vaut 1, le trac‚ sera fait avec la couleur d'avant plan. + Si style vaut 2,3,4 ou 5, le trac‚ sera fait avec les motif suivant : + + 2 : ******...******...****** + + 3 : ****......****......**** + + 4 : **...**...**...** + + 5 : **.........**.........** + + * : couleur d'avant plan + . : couleur de fond + + 3.15 : Commandes de saisie et d'affichage de caractŠres + ------------------------------------------------ + + 3.15.1 : Fonction INKEY + -------------- + + ascii:=INKEY; + VAR ascii : INTEGER; + + Retourne le code ascii de la touche tap‚e au clavier ou la + valeur 0 sinon. L'appui sur les touches sp‚ciales (comme SHIFT, + les touche F1,F2,...,CONTROL,...) renvoient des valeurs + n‚gatives. Vous verrez bien par vous-mˆme quelles sont ces + valeurs en faisant un petit programme test. + + 3.15.2 : Proc‚dure HASCII + ---------------- + + CALL HASCII(code); + VAR code : INTEGER; + + Affiche le caractŠre de code ascii code avec le coin en haut + … gauche du caractŠre … la position courante (posx,posy) dans la + fenˆtre. La position courante devient (posx+largeur,posy). + + Si code=0, une partie rectangulaire de largeurXhauteur est + affich‚e avec la couleur de fond de la fenˆtre courante et + position courante dans la fenˆtre reste inchang‚e. + + En g‚n‚ral la fonte par d‚faut qui est utilis‚e sous + XWindows a une hauteur de dix points et une largeur de six points. + + 3.15.3 : Proc‚dure OUTSTRING + ------------------- + + CALL OUTSTRING(tab); + VAR tab : ARRAYOF CHAR; + + Affiche la chaine de caractŠre tab … la position courante + (posx,posy) de la fenˆtre. La position courante devient + (posx+largeur*longueur_chaine,posy) o— largeur est la largeur + de la fonte utilis‚e. + + 3.16 : Proc‚dure PUSHXY + ---------------- + + CALL PUSHXY; + + Sauvegarde le contexte graphique dans une pile, c'est … dire la + position courante dans la fenˆtre,les couleurs de fond et d'avant plan + et le style de trac‚ s‚lectionn‚ pour cette fenˆtre. + + Chaque Fenˆtre est dot‚e de sa pile de sauvegarde qui lui est propre + et chaque pile a une profondeur maximale de 16. + + 3.17 : Proc‚dure POPXY + --------------- + + CALL POPXY; + + Restore dans la fenˆtre courante le contexte graphique situ‚ en haut + de la pile de sauvegarde et ce contexte est enlev‚ de la pile. + + +|----------------------------------------------------------------------------| +|----------------------------------------------------------------------------| +|----------------------------------------------------------------------------| + + + 4 : Description des commandes de gestion de la souris + ------------------------------------------------- + + 4.1 : Proc‚dure STATUS + ---------------- + + CALL STATUS(h,v,l,r,c); + VAR h,v : INTEGER; + VAR l,r,c : BOOLEAN; + + Cette proc‚dure renvoie la position courante (h,v) du pointeur de la + souris ainsi que l'‚tat des boutons de la souris. + l,r,c sont respectivement les boutons gauche, droit et du centre de la + souris. + + Ces valeurs bool‚ennes ont la valeur TRUE si le bouton correspondant + est appuy‚. + + 4.2 : Proc‚dure GETPRESS + ------------------ + + CALL GETPRESS(b,h,v,p,l,r,c); + VAR b,h,v,p : INTEGER; + VAR l,r,c : BOOLEAN; + + Cette proc‚dure renvoie le nombre de fois o— le bouton s‚lectionn‚ a + ‚t‚ appuy‚ depuis le dernier appel … cette commande, ainsi que la + position (h,v) du curseur la derniŠre fois que le bouton consid‚r‚ a + ‚t‚ appuy‚. + + Le paramˆtre b permet de s‚lectionner le bouton … tester : + - 0 : bouton gauche + - 1 : bouton droit + - 2 : bouton du milieu + + En sus, la proc‚dure renvoie l'‚tat courant des trois boutons l,r,c. + + 4.3 : Proc‚dure GETRELEASE + -------------------- + + CALL GETRELEASE(b,h,v,p,l,r,c); + VAR b,h,v,p : INTEGER; + VAR l,r,c : BOOLEAN; + + Cette proc‚dure a la mˆme fonction que GETPRESS … la diff‚rence + qu'elle teste le nombre de relƒchements du bouton s‚lectionn‚ et non + l'appui. + + 4.4 : Proc‚dure GETMOVEMENT + --------------------- + + CALL GETMOVEMENT(h,v); + VAR h,v : INTEGER; + + Cette proc‚dure renvoie le mouvement relatif (h,v) du curseur de la + souris depuis son dernier appel. + + + Zatsolfolcs... + \ No newline at end of file diff --git a/examples.zip b/examples.zip new file mode 100644 index 0000000000000000000000000000000000000000..67a47cf4833951571a9b8efd28118417f92cc594 GIT binary patch literal 190194 zcmXV0Wl$VUl*HYg;K70?xD(vno#5{78X&m4ySv+NaCf&2?kw(be0NthzozELo7eri zd#XlB78(Wz0s;a70>Q?Q$UIg}-$x7r!ekTz0`YTKL|8$Vm03(t^ehK4TTeaZ!@AMt=I(g)mGtXW)N>Tj3zc#7lpG12 z^oHCa(+F{KmYsyf;NWqGuj*ov-<3C3a7|!3pae+D`E2?`K6lGcTy=^^$lktCx6K4) zY@_4*fc@**L0PWFS8v~xfj+{o2$zQ^yONvqV#Q|XZDB{&tA6lXgE1a6SI~W2QPbBC z9b1O<{(%qb#-!JNKLWVsD${rix5Bhorm$tjsyyH820-~KC$jb_Dl~gLOM^8jl}$~V zWJ#x374kWou2hZL28o8QYWLb9k#hC`nSIlxvFx<77E?~1?+bY&)bn%|hQ7+lwPY;# zr_SG#eieG=u)yHGhGdTJp~*5(hwGP9?YB=e-543aH(|b0#R>s z?B2aLnr2n6x{U?uHx8dU_u%n)Vm_wa6%x>;M!D_z_`;(tL~9%sbEsCc$RW0`ZE+Y> ztHm!y8v7;BtNdY3^^hqu*6eV!W;J9Uky&I`vRdUZ+$k{bFxNb7l-0Q&Icp7aJN937 za_{Ok5@Q}$h&^|d8IP5C-%z!vvF5)ccEzP%q3*K(K&R%^V5BVJDQwzvY2_ZUjytcf zn&v}3B`z~P9EZ#|*x>747LFi(u!jWk`}#g$444aS6$CfxsU_QDzsNZMM84m>r-Zfr>O1u82gZ9}`j ztY*WvMU?c4X_!fSW54HG`Id4`Bum);@f|@a_HqDcdX;9!{W^K_X$?!n7M_&9w)T({ z`pNkI6KRaLkkR~T8WQM=ZX!w+>IBg#Le9b=YUeM)bK-FQw6Gxmx#xv=l4jAGp29TN z67j9GouimaV4NWv&=PZkd|vN?cj(IW52MGL#PqGjUc1F+w}khNU^LCz{Q>0{dZmn; z*edn}o(wH^bUSFI!;qdJfGJi=_rBgfUd?ZT*=DxOyS+6Qr|S)<{{Gt1ML8xx60u4* z0^ReMSB5CVW@La^fzPRxf13tT?U!{Nt4#&T4AP;u{7ng4WHKXH`^S!!xZ6@PLrEjU zk`1e2MY3F6@>v9P;_A*yyL-n*jJPj0w_fWx)S$lmN#g~$WK8&!X6u|~5WSXezBKko z!ifXMwerrlgSqNntJm8KUviV&-EM)9MH#p!JJ{Eh(%x%8^l)ry@LLqOOM@X6*XC}g zKDl3^hWUm=+nMI5Xa}?rn@Ez>V(hgd@tB$R%Ll!XLFG?Gjhcu`*HD!D-VeiElyJv2 zQc}%G>62>C+cE*|o$BBiPOON@M&b z71Qh=gqU4|oC5(SgU)i5_iUwAB@>!XAjF)ZG^nqqU1v ztQ-=!B^M*VEUHD87yK{>I|j-f$#*V%)$eH=JJKhL=Q}EDE7UrtPuyjvPTJr$M54eE zm_lqCg+gm2q!U`FNxEjWo*#a^%=6`ZmAOobA(msv{d3NTHbgb1I<5sQ5yV- zs_i=mzsfmEC3}bt?0MSp8`8_GT!Ez;GFkAme`u4IJ(H$MSE{#MRq7|1m2GI$pB7g) zR=V+>&Awg~vKf?!SyUUfwCf2OklworWV4{Ee$N^*eALXUuPXLb;V!Om8i`cSLJdK? zV7zD@w_ltookPHxsk)XBSm{0aa(eLLr+9a`y`J zX^dbd6T7&LFNY5FXHuAv%0*(%4ej*%7>7`rDd&h&GNI!+u;*y=u(v5JGv-o3dThy< zRoi>WK}Sgk0&}Nk_C+OnW5OL6^r*GMLjmpTN@#rh-n~+j;}NPP^OMtP7J8^k)_XFt z_fq;X29<+3MQ2sCXDX3`&}lrK>fv6?%LX{S^ij(3QXvOnzy`Q%VDh0yAPSETX{ z>hL_Gm+dH9@1cIx1sTgWEFBtW?EQ}ESeeOh$Vit<2%=Kuu?a~zMk9jGoOL{cVkPF8 zbQT$Nq|%+*S&C;Re%@(9G-G#-w=KP@UL-3MqtxBi2uN1s)Is)JbZ1VXlcGNR$;z>~ z|L0GgEz?MAgAHEXMuwhGY+}Ox4OW?pl%{iHHqFkNJGNA5qsDLFUnM6f>tR=wB%|$c zlJmyi7xH10d1-R{bAsc#wT8;7c5OqgM9W{|T^KY&Cz@MqE)4{^uk0tfB)VX*{QHq&dVR?Rf{e-zYU2~4c#>Oj{TwG zW^0puCJoCWDHnf!0=VZU%Jsk;Ux>FaLp!AzUw)jki!k{e+Qv0@FvizENOOdueJe&r z_dA99w@Ck!iu8Rc8(|d}{^-C;cF~%i+NcNoMC0^HoAX&ou(`==W<#i*%WAL%Qp_O5 z8!UZ=Sc}`w6FXap^_|Im>KPQs1%EKz&{HFeS1h#xV5r; zuqA(u3KQp*En0_1A`}}?zvu-X4)3P2ko?Dk@78x&g^a((Jziuy6 z(dJ#)Vsb+>xfS=49!0vXRZ^JptSAr`C`^LvB5!E1`i5SXy@?X!oIx>uc(f9oJX*i2 z%voHQZZBpk+R%HOn!Fs}BrTqrWix{Mlm%cK-H^x-uk7h4h^AgPo6D+B)@zeD-;?vF zOJ%F5RxCAsJ4Ov64Oun=Q8B3dtkB{A*$e2x_?5sXWS=L|;<*vu$+o0ET*2TWu3z8q zN>!+qbMHH;;S$h`8S3NLFeKX6ZJkxo;#P*p;3cNtcmr$AI?Ui)d=gEkImYxA{jD9n zyZ>HNzlGuHYfGtJB|ja#3M2L4JaQBA(WzLK+%n04!Nzf%0jkPmKDx4+%+s$<*?-Zi z*hTJ(Lk*4ch12nZF@Rn6d?a`Y)%CYrVUP7ktUK8j%*wlEY>MKhyV2zJv?SPJRAEgA zE3FKfAUjd}r6b;y=bCj>scU%py?j+&`ZnYE!P*l56DLNBj_^rZ7k z`nRkf6oOx*{+yNw0uo^6(JEFm06)}~%Vb5-C@RhM)&3T&HglNtKBik|t*mmKNWL_k zv*oZ)DR3D;3RMyr#scnYe&t{iq7iOaW#Zj;Dp1%G_i4mfi*!2$xqF{sxE>^j&r3Fk zY$%XWDjNFpiT#x628GJE#>9EJG%XUZd>Jtyr@Vj#o_TvA9str{r-Fo_n+|>+hbI>{ ziS$lYEc#8wzII-=hO+HEm(rVgh%8;-8QT?G;wNWObJYpBa(S2>2lA2qt<8gb3dy)7 zzoV|Pb!4S?F=ycEWxgRc?J zTQaR<#pV50!`e4QV!P!IJ!~8d7@Mw#i0=9~dBh|4 z>NnW!@4@@d6SWu3iwIBUrA7E{bD9PON-gJ)J4?XI-Dr?YlwIb|KV_fCIqgdpcV+qu zzqu5D;XPQ6)mdg10s&sJPE&y_{z0@8Ry*D9-ysHLTpCNcMb-JB5hOQ01{?wThblTc zPOr;avoI9SaK?l#0y+&FH_CUa(Y>?$NCuDC1bz(=Kas!i+LKNL`zUU!o)X8%gi<*n ztHIX-8~OU&iZ%HbokfQW+F7-Y3u7Sj@@UBnDokzhQ)9#VSnV;|In^}JY`5g%)D16M z?uz@1*x1fD|4v}wfCSYdIZrh4>_Rl>RJH-Sh<{|An?)C$K9ftYQvOfdDsTJP^U#Yg zII^xEoHWOOla9u&6?OqMxD)7#+BP+m=Qx z@;Vv0nIP<#7M`9TQ?MUSPT;fMYluhT*$}-WG?RbvrX@vs-d6urx%VV}ZahA=KFX~) zBV3-TNcG7^*MQ zs!LQ7TrK5zuIwp$apzdv>SPjvHG#L@OWpVN>&|4E?P0UKO_Oj|&I64}sliqemg)ah z)^nlj*q7CGWw*3&<1Uj6Z)u-6-+nSRpowyl64}(@5;SY1akWy3#gV0cFp$llqPuy6 z^NG{H;-Y|EuZ_>!)iT~fWmBn16Y+1m$T_d(-Nn6NJ7S}}<9^}`z?(wKTH0RYsO=1w z%10gfPyF!WZbuUM@?F5gFbOxVTvb47k#OFTyA~tdbvM z@A{*@JhWwS37XITRbcmu;ok0s16NnUJg5t+nXw!7sNJ@il-y?`)#bS=hmnVgRr?W+ z;%nzB)-G0CdY-spWNTA}5bo#F9JITsSCiz;!ESb@&S<3@;>8$uQTacSp}i?l)SXER8#F1jBb@(C>WfW%>p5g{>}$DBUl7?b0VjSLdFF zLPNL5o4r5Eai2)bxrS0#uaIJldoq>@MJCz5M#xr`;~gF?ey;@Hqnb^W|Mc?a-~^l3 zC6JKrvFn-qhQZlY=whxCZ-v}Wxu{>grGi>MDMU1K+0 z(9LlRj9<4bVOxU8N^Ha1))yDv<+f{0A=s)gG{cjG!PgiNHMh#_j3Pw6nS2Desyys0 z^*?Hawe;h(u zW+7su4l0jT(yDN`7yLpE7Rit6eYH(B%Oc^`+QDy$ucYeJ3D9_*@@V!$S(%}kv$e)L zq<@tC1dge&qHaf(JDt4hI5VK>mwu?+R~#}wZhjSYE~pWHQs0>ySpXe=6y!^9`WIHy|?3z|hH1sE_lh1u(WqY?UD z9}0@^OjJf*%Jyt}A?sHoN+x18b-?>9dbookqy8Oqw40xrVl%k{E0X}#8+dzrL6B0; zr>pD9lV~Tk$S3W#^mg@kJ~q6+f?e@%s)bHv6%n&rUUw#0ky$Jb(?HeQb1M6`+lscc z`<`qwLB3S3u!eh%uXDP2PkBn=)@F8>^F%2z=~P^F+JYEl3*SFmNvV?Ml`o;9Jln<# z+V?oulSKQIlpO0CZNCbw)ma@{3eqQc*yoTC=FmYZ;zxtG$oQp?yA@~W>gdB|d#bN4B-U zT{3Iru_yh4fwV z)9R&|`|LebHn=I~CgW!=YzBz%YpyO_m8SDX;q>)Do=zG7{C^3$}qkpf~&P_*qA(n6V@OveV$#znSdi`>d3NsgYwoEvr!@Kitc| z?H|9J^4HP zxgK`*h0ro}<2tJd%-qD9;dT;ePYnrT%}$n1LfM> zl`0}oFO`Fx@g>0~1#|M+8fW?tS}Tbmx|ygs(Hm$ZFt$mW_z=)~bSst6Vs9n=7flG%x4_Rpa z6vq{eKAHOj^I+9e-KD=eS6sKY_(fA=VIgMktGaRZ1%U$L>is!+rkz4>lxDjZ z?)>4*RK!rJoWAWs@RCxI2&S-|rX4-Vq5a^=dWXjE=ONh)i=;&q~Fko4;bJb=HDhah{4gMP7WD zs-%PQBx&ySIO(vUS%2P%>%y`qLtCaISK?QyavUBqY!{X%KQ#OmVdm_n?yVYa6JTTRcJiWqV!6=lDTQtlfGaUm%c%#Na zbS7r9srp})t?HXwxXsfN&M47{*Akz12r^kVrB|5CsfbyS$!|j3@GUi;r zput6r{KZ%D_7T|d!=|VB_+xE=9B0{i*PRi|V_^oDSRpoblC&j( z%46~xL_*2ffZv3VT9o0uoBZVK-D8-g6F{@MgAi4V&pl?HYrkHF zwS)}m*QNe#*U7&uLI5*`eA64dmv}M_nYv5o#tYs6y{PECQ28TOj@9C>?CZGN^^pC# zDSb_`g1K3%N0GP>#Y?KVbi8j*E*WV|yt0I!tVmBepVdf7k;Fh`vfQ5Y62K_deb)+C zi}fE1K@RiqIW#Vr{sAW12=>ggTWlHTle8d3;q6r=oF$c%lZ5( zwbfd8RpDzCP(7Q(19|peDse7@rmBltIqdUmOYUNnk?I>U&XrwMnnrDnpC0w;e0Tno zb@!Py66Qq-hcKm3{=+^hXfVm#)vftgq)TF)7G}l0ax{&s|L__D%r{&5gDHs?Vzw24 zo9TNlVzsWdp}m<7?wOBfx)-t=nwZT(%0wLSFW5aAd2;h;G`mD)r7JvW_Nn7(qS+O6 zW}CG|JKv?^D)pjO5l-MMl8SghTVj2$K&C%3O~*IYDC_2_;za_b8WKB3sg1%nP}#f2 z+Gr=3Pv*G-)eij?iwJEwinJhWbnn%G)c zp3SSIgeChc);%2#{kkjdIGVJzx}T$FwRy9wT02f@rhFq+Gw2ohPT}s?yH3Tp)toks zQgXYmKa8U}B_Cz>nmzsO${kRl&;(6QlxD!1G}&<=B?7Cnb4Z?5LB#uJ-;e2SMKGgLZS}-_09U>v zeewXWy^OEhC9?of(7q+Q$(ABr{5-eOMNT7s{E)+!V9PQ_G?1*0Y>taNQlNz;VdcmknjcXPMdj z-*D!Zhq}2pYQTa?k>4)!Ww!LNHJO-JGXjQ7X^CPuwSvV0hGcH-Y?6&T)>`&1ph#~k zQ&|+fg}|U{wDG=zv^lC(x33GZI;3}!f^Xiut4dF9S|t=cx}%%&d*Zl`0j!6)4vqmd zoH`R{>TpGH+y2h`f#TCjk^3PwU_EQjT4l#;vP` zhm;c+As*IwjctV*D_kk?Dudk2L0uU$)Jw!>%21Lhb_M9@{)}9KBD9&5O3L>fA zki&q5_F+B3^jO3SL!IS!G8eiHGUoD@`=KTYJM-rXWtVpV4o978=2np988=l^HoAwc z6y)nl57pb;hO?BDxt9N%}#c_Eja? zNeAsJS8@R~q{ZNPUNIkfID$$R7Ln)5nNNC>AQD~o;o#iJcfN&nOri-bKlbT=T?+_H z+tVuht;PGP1Ds5o*WWA_VbD?RM^(DZp%lwFn)o#eJ&NQ?RPET83wG4#=+^fHz?Dkh z@KS_hbxCf8#7+N*Jd!%85dR~d1tr!k-iU2Ug-%!I6mJPX{DaqX;!d&eIi94NEQA|& znkTErk}D0rd?ui-Xy^HY+xEauR)=yl_q)n9z|ev3?zbF{$YFqlfUNrNd`7P+eZs5` zr{d=9bf8LU|7=M(RGb1LzW~6p<*S;?K09CppGWofEH}+T6JTXnz^M zWEo8)+ujgbO3@mz`Hr22JVz`fjz`HYm)X5-!-AqETiTWv-(e)x%QZ?RkAY_xZ;o(> z(upf;3z4gAUM8M0YFg*-0`DV7ey)0=Y*tWLh0T^);;qm@6so?!3BzejdZ`&fYS{75^0tcJstmsC-A{y=D;Z_ZZxpt16dhWf<`XrzLFd! z_)!CKE!eSQWcOI0M7c9ypL0!;uZ*rIbmGz8octkB~0^WvMQ&x1CH)4rY;df#X> zHTFoM&UqC)Cq1;liNCBKj}|GygD&({^>WGgo&Zh63&>63I3>9sq=6j*zPT8v^3!sn z!-SID#mbE-v$YD-nsn+@Myv;U&Cb3ijFLBiB7#m4X^#|Uk_Pvk zBe!DIY}dXw0==M}iEXB@reT#*qft63p@kQ2W}_dKS$63yvrn|Ch%6?nDzNvHT(?)U z%q*2$IZMMk##~$#i6UIPM9VQM)DHC+Rz~_ggjN=vThzax&yQEl-o|@h65grmtI}7O z`L;#RiB@FOe^u9p9%M^jDYXz@oia1+_=4Gvn=p04>l@#)LgXTKEdN(&Qq;I{ddxm? zEVwhA{P98JW7qLY8Wj^cT? zx3d7rT6GyhB`1-(RnA`8bWy$@v#gU*qP9GWJ%UZU%0s((eHs2rXq}%u%HWAuC^T%U z;fA7%Z4ghfq{{-wuGAUThjQM`Ij4mpgO$X4Kgi0FPq#H%*tO#TBVKTJd=O7soLcP8 zzb0M#WB?-P@?KntIAKfOW>M8Qcp8BCz zG{|*q&HTcHI?<2ctYdZuw8u0O-;(;xqQRCKWZ`X+NE^ACxlh=AwI{8j=PVvhejD)Fi*Mu*f$q7l`xjnQ7s zmG&bJc;%WuV1Hw_575r9stL?hCqb9xGB#AdECuuU_2r^wiFQil#(u%A4|=MJq^0?5 z?I|-zFvoM~e3Ut+S@k4sA+~PHXuE@wt){>dI+4}#NtU&yp_Qc5%zoNr&6tJ|MFlT> z%dGs}WIl_5HC{`z#LkYS+|dyX0p=2B)$VaVi?pNP-qRUB{Ky3o2}s?C#_x0#C4IX1 zzA2{&?Y#}NEO1%A)){hY(J|~Q2%Kb{?oB3e%;(JzM$LF^3ZXT8EuPgY;Kn;X;#Czm zNgTTH(utZ)1VI%S~rUsy@rBz-OI=ND)BOm?DX@Ud{@nHb4R&_2eH;aVQYPR zyF0X#<|(gGa+cp#DF+3bSwf<*EH-w#iJYCPE}h=G1uZ3eeJdDOQhZwkOF8!w0t6Zp zx2?z)y_(t8sg(=V69xswM1m8li@rVkDnGV1cGgjPl|BW#>^BAz0~ly%uXNni4!>kL zyWf0WNI%nRGT)yK!p&~(!p29Z;nb3JtL9&eaM{@cpHA8J?o=Nv=Pkabat+q?a$GG< z-fU~+dQ3Ll)Gc3>bzck@~v@WF`x(kRjRs3oFtN(P;&E!y~5-<;E@enqLUA?zTda_ zR;(81CrX%JSYVTAqMXwqtHM zk24uxZuJBgZj29uM-9yd>&XIqjtBnf9F#D+L}`U?d$9MlKdp#=tg(`9_dohevib2< zKb4jOpQv7B2l>0(*qN|gyDKta@*OCqC~|aH7XIelWa8Z%2A9&j+uB>>(f`hvdlSA< zyNS8!oo&R}e&DEzP8bTaw80|YIX-}W)T5H)wTnm-ArrdPW#XFl3ApjdI=1XS*2>Yr zPFrG|RFzrW(W%jGaLu$1SNEMH_OY;m4ORiMu0s2_wKccJ?_FK}L9kgxH(AXJrPu1b zXihb!IHWiWzEABCRYqv|Nvu|`**Z~Na}TRJDU0V+h4nU&*jX zddc;Ljc&&A7q$VY6kTAOy7n#3-+l{h5mqnW~ zE=!o&(u<*Cl^8wU3=_ zn_X4LCrfZ`Bi+Xdu<>#pZX6A7+|6kkD+x8Mh>*2A3%I&^k}Z{;k;5wI=$L1kADG9E zI5gmTZ~Zy-A!C=lM`7*lls2E7K+##K7| zJgA8F*MwX5-P_Ri1pFHq5KGc(iGNj&vdm;z;Zr_4fsFp!ecy_(X(hOT`hV;F@)Yhe z?@oL%Y0gmYZhVY-iT0%iXzHL4O+q=Ko4e5$uuxM>S%t1XFS>ZE#PN1nReA^AmZ93o zo7;CZ1HS#g<-o=7M!MElV1~@vJ&q8-J5<1Q!rPUtGwJcvMzhvGQxZ*1U2S zkhb8qkcYtS!0nJSKoiJBYG)Ue7O`&+CU`{l#NvmI{YftiU;xm>!}A5AN&u<= z`yg|$mm}>Xvlhw|I(%91{7)D$;5e`YbO|s6or6d~@SttrC6Em827W5zPZ^rYiP{BN@x`BmW20!#;HawG~v zMZ|=ng+xpZQU$CUp=u#}|HRt^;ML>u-wd$Dy+wYIdY`?2oCy6eWao<7ZRgSD%KKt> z_r`7N7{slRT`8o9fuG1|1`4zRt^q3}cM0s|mF(EJhJx!U3RA#-5@P?4_~xlg`R#KN(_4F_^!!21ApL5N^> ztyTgnVrDTcl)y=lu@VFs99JMMAPH1YiGfxOa0B^)sz6yF1F$X_9!%~D!>AYh8dwC7 z1$>X_MraJI`Yfso-~)I8lmY%LY#gKkb^wur`5c8jG5DeG1>9x=;^w#W9t5KM;7J3F zws$>?MA5+s;SXNhALVffKl%olF7edwJDby{95gKS*0~k*eqQs#<-$z|W2YfGu}THY zlf!a`+yEJX)J7-^02ohHPZCcePk2wVbf^G`GBUaWq!~1g5M;n$J_0kO1B7PqLkM~> zOCU=SONc|DE}#aq4x#{CfKe=YWFmHhU_PM+I%B{y0JV+S2%xZyu)2}D;q+j)P`2O& z5$qxI;0)mm;kTi-;kMz0U_K!Ip)R1&10?}PMr8T5;tbqa#lmoVK!kP_J+xW~&7dk^ z3y27$`w55x=umRn96c_pPjd3br9KNl)|PIHI+;tWluBVBef)uBYREW%SC7t*oEeK* z2+Iib%MnWpju&Vh4^aoP4uB0DYEcKHf3`abG!JqDvvcogQ5e9)LJo&u2g2kSad`4* zp)*6(!FU9HK*+NM-IBxn1yO^<9I?1zv!R!Q1nV)ovCbeU^AX%b`k*y~Z2*@*KT!ED z2EG>D4yb<^`AXT5vYpTubpxpv)*fC6N(kOu$D0et{h8aikpSwV*qLU=1KSgK)UfZDHF&_y9Q|W-v6E z5^MwJ1GBHd4@hGWPCz3A{((HdL%;!H$!0 z?W+?a|1Guj5JVPC7LpfY7$_7XDSUG*LJYSQ>;nA$Ed*%=RuIYl6Oz0@p+KQvSPO&( z3`Qu586-4li$H=EIA)kS7&GuCC>(?iiZgN&i|7YdfY@hXJAvl$koX~*!J9@<-O#=e zazWF9OXV2D!F3^gK$|pVCnit6bSN??GB`3wuD~o{BtxhrG$#RMosRJS;k?ea;F<6!alc3Z;EWHz;`{b;@9)~ut#?FZ@uv3$>bh#+<;N=P0NmK_ zz7dP3z$4wGBACrlh?|;bpdugHHN*wL3s!by^F-oDO>IWJ`s#?ojps|~i_aLj%gqff z20#L{Itn~~^@MqaW%SL!V1dIA`r#WkDLqn0w{DJK-}7-7;pore$t&5gb(un zqmiR^bIJ%_&|O=q^IzQhMU6q3X24Q%Y)GH!5#ap9)PuSYUJfP;`hdMKw6i_JEdZiKE7czbo}an5Bq;8^fA!!%|XeSmnxeq_^fO~s&4g5?0yfX%_2j;QUV z8xRJrtr)VxpDwZgNlkswB~U2vA(-e>j)lP(>1`4bPvkH z(l8i=NvlurjG;ZzA7LJ;+F^aMHy~rR7zU8QI$+`YYRL$8Ps(=O4RmH+$%xCq8w2Kn zWuQO!+9m7}T8buK(38zm=n(U8<2vR1`$d1A_u;hU6R1c8#@mN!-q$~=?lo%wmTJ1|Q{1Iw zBX)lh9YGuhQM`R>Tdjam)iGy{!Aj@lZSlMk~6v4!xC=}Yj+ z)=v0}^a&*TI|3=7Ix7!6DcMg&_SH7Q4Y=Y}JOpMv-S_6E~9 z(zYYNVton@1S#B2q6j0@aIhH&2LqB%7%^EGb^*8@!~h@yWC0dIaA0XLF4zr>>PX}{ z$`Hy8Nd<(E3ZihtB!K)>4&Z~q74Zx5^ts|4b0{C{ZQF;J%nLJE6l?;{1Eqm}fT_5h zk}zn4IEOHa(J2$QvfW98Dn@|tB z7M=|L)8S#;f-ZyR;X<|0cJi^+gh}Lr$AKxJ7?2An3M2_C0||b5;1_;mG+7G2&w}9i zfF+iL-l#sR!WLFXVSC5WPY74}Y~x+16ack>7NRjQ zXCO6#pa@`nfTsX;(0?Y4{8=S4m<%-hc^wQ-EOxW7k>DDTuOr2`Af)mT0TAlvDQicj zN8-n?kMxhc?YO=~uQ0E~uWC$o)tQ_5z!MX~FpQu2K>BA)jVo#1j#s zQ15-zw+P?P1}Oq_@_{DffnoaTmN32;z6h^4uTZaqpWY5J9XNQ1*Z`xIPlggy1N!pG z8F@z{txnh{ShVsG&5-4w<&Y{s7tjYN`57z9fQLWlH7M|ccLB1(I0HbL`Y+u1NdK9y z&F2|6&>Kh-#07!`6L{h^+hQ9-YQdnv%L0CYJTaipjhMLcseZC(p(h&gwIiItpn2kY zGI`Rrqxll(q1!_lLTp2BLkmIo!90Y71F=Ec^<)$4%wqW5@LJ?8Zw{*O$@XxzkobX7 zfX^$OLG6CV8ygU(Bi|zzSOBaFMs{TR3^~vPPa=#EH6Tkz6mHCHl&|EUNXUGS&1VpU z*@CKt{D2XJ?uF}xw1@Wy{G=~%`g3Cc3nc8GcxOU+LwzIg?F45q)Q&u#m9cpud-8d5 zJt903v?IPEe|De7vO_5%%m|YkiWpu2vPu}g9bxZtUI6DH1u%mnx@D(S1gsH-CG2nz z_Gh|<;sYR*2O)x)!52~QocoH${zw}zy=eB3+fZ#GWI=hsK0r~>ug_Lt@k7V;NOdBMTv(I zMQKDy@2?K^z>*UA8xa|(!7JW*a}=9`W<;zhA?Ye?&^hurln?x6X1Xj)?6|bLTEvR5 zTRosmNV-D^mxLlFEVc@J->1H)=23>dve{(O`r@n9@u0C-(;HXW+g5o@;vFYgEHv}$ zIeKc|!!@C}3zD{E7UGK>C0!ED3>AF|l1h2*mm^Xg1))MoOVpYYT1#vJ`Mwh9TfXNA z!6Jo|g1QPRIGH0z?+DIWw&s-9S^H=FHQBx*^zx9-BOL9jAecr~dekE2WO*L;45Z2r z-hGz)b&2!lw5_r}7ighUd@JPhLV;W6^CFh=s5$FENcPlgOV&*ZYBdGcMP&hwSwdb( z9;ENF?z5!4BE#iL3bR(cqH|c}zjKQwZ)Lrs?&pP1idm#_ry8(?W4>Hz8?rSo9R`@;QA2OFS;jZbiGl!;C z(66rOOl2>YumUnwmP`T)({sqTh$N+TN5uLxvI34o@nKpIMxLk&zZf{vd}k* zqDS7Da&5D|IzKs@|7gtf>L?N&Iju=$9npFJMw`dvl{Jhy=Y(=%Pyao0=L)?kMQKT8 zHcL>cQxkWXe%WN0i~7R1_QGOl>F^30@I2ug5Pm5L47f>wih5*$9wIR6CZHt_W;ZEj znSAt#=efpr!vPSG{3ZVJ(WfwX_-0tl)xh>QkuknY*n#_o@x z#hSPVt>eGbi)nPf$F15LT`qyf>RM;-_enkBHLh#fVzeaI>@>Ehczu}jcY3B|VKjzf z%tZH}4QUTCXMbYSvTsTjcJYQ{a>FOQMl!?Cyc}1I2q{uxXD$~(Yom$1le6M8Tns8G z^Qu%~=NzW$+|4~3dHI)S#(M??=v`V(d7kU)J4|oGQE%uTx3~_=JJ>B?8B>j~U07?I zEd03zJ4THYeO1l3W3H3St`+Ks_Vdg8}o9dliOLA;As!d&@ zF%aR4_q9n0rOOoG+DseMgJB+}xp+v(2TmiJ@hA?su5W+WLAyj&zGlwtp$R!d>meS51us zhOQB_Y-yJ0O9nyD7)&gOYSsNSpDb_fyS`~&NyDoGrg{5Yx_=hVJ@$Cv3zINK61q&k z+;};4a&mKURa$A!=4exF6{7jT?>i0;F=XAy=I8!t3Z21G`k+}ALDD0=#Qdpt`p^DN>QM4 zsnnxUL%5<@<4o}Rjl~lsy1XLcD)oK$?lk&+_mJj}>_gA@v*T{!itCn_l;`Bif)Dd? z$KO&kp;B&Lc!dpTis|!1-pL7e>jFv@PI^_zEbdg0H!Y&u{1^Ss-Y&Qd&$nK+9#j<7 zJsvbm=5M+vbvm!!6#1&wCNH@)nfe%(!)}UN`xrE>5}cNgHT6do`bs>y2(g!bq%ZH! z&Yd6{a{9#2|01hdWy@(4Gylr8GFD{2j5LbxV|M9R^5?9N`QG}d#|PO*PAnk*@Q_zo zV|wPMIb-eUAu1?jubqfMQPm1=l4D3KZI*}?EK6Vgi~DUJ%P8%KgysP(znUcKUJ;FV z>eOBKDbLakaJ}#7$!j{5)|<4mufZFbZFmcAp+2)Uf}g8x5s-9v@t#z4zn_<3{8zL0 z^ZBD$GUB~w)B3)(fX;jWs=Vam%^=S?CD#bhatlMjG%>NOq)d}_Y&TX1z2FU6g3JF) zpc+NYhi&q!NOY)wD(7{t&8M|Zpuv4`?V!bG9sF^V;wnM>f~mzcb@v0U>$ZBHRqhK8 zZN^)ey0hRrSw)@x_vhmCWg_$im_EXjx_CA16a<=RgVs@r^|M`iir$Z^&_po{+2mG- z0n!$+IC->KNwqt{hwx^srdJX=De=d+5CU|PEEdvNIhb%_Y}=5pg}X7+LqTlZ;~&#j z)7%*jN7I5NxE~Hx@DH>nF`gt+P&)HLP0&H}{Xyy(fG97(Z(q=>8i0c+T>!uQ8$8^` z6q6<-86zAX{d1}<-j!ntmA%h=Dr5U#VfbMFd}a8caanP=c7xhn|BmB;78hxhop(Aa zUrarW^2J&r$?;HUr165fu8c@c0&~XtY`;ppStw8aXkj={jG}mSh+Oe@#BkRDwo&5y zYn2DDLM*~!+=Z+dTN<=S=#VhLVmyy}|3hiU#6)vKuDhD@cw8&Hs# zhbC2N4tQ%7I9zB@0s%#>^#?p&w}{i1$|{hOhdExKQl@%+On`WOyGR~^f~B%AFiTcz z6r_jjZET6Gs{UnSPmM}I^~0g>N$~~rM|9)zP*64p@p&knR$gHIKNa>gO!fQg#q)nj zPAH8{it1OH0she_*T@YDa{;Flt#Z>6m#2m4yv+gFozQ+ZnYreoDjpwnEio5s%|(yc z!~Di(S9zlk>1n;6oKH+cnJj*@*5?<`5;gll=arG* zM76)h>+>Sni58!CsiHP}1NS0f>g5Wz>TL=jaSEEXB_79>WtTf-xds_i;Py8*DyrKn zH@Ng*q)b7Rtk%0^W}!t9w;j9vs^6!CY?23Ln}S+ZQR>BzaJ}r)a^z8}Rb`oZ*v;Bv zOLMbV_L-qA=HgOwaTyZJ;FDEV4)|5EtTZ-x}XC5_7Q@jxrvAze!PD)eW+{UevG#uTQBFKZ;-j8s&gzVsK#+ z9OV|Vx9MJAZM7U|7A<#1L5a8!ZE}m%#8NOiZ9i{vP zU>@B~%jkYP@DKDPZKoa=5O*VxMtO7#EvKK-YxDt~`yP-q61bC8@{9sj(%;j((fpg% z7|##vrhlhn^bI+)0T+#+6ZD_i`hEJl>E4@w^+FD?m1=T<`)EKOFqRIC2mVAi{|zvc zcF=pY-?-1alQ038PxW*UJxXUNL5yS3DB3`;&_&9a2n?n?YNVeS_eF1}PSLqf0<1Jl z+zXu#OrhTt0-qM@=c)8tuZ#Vw%Fnob-AXROV1};kGwuInjxZX)P2!nqT2AZeMcPTb z=~u?tGW|y82I(&CUu_u>k1T(@02&)I_!djzb-qg6{T_pum@Ms=Jpe^aEu!t!Ll584 z{l`(8wjX-fiJ=Uep8~w$4xXj&5|2uVA0@xV)#|GEiysu1)z(I@YpknLS?+cF#a;EY zRJrwDpX_qYEi5lCT~JY6kmD-zaldM|>n{{m1; z0|XQR000O8uAq1tgSIK|kR|{CJFEZz3jhEBQ&d4zNl#8LOixG6ecN)|#ENChOFc)g?`awH)E2^s*kBtNRkRlCj)oZmg@x%L19ij?TR zH(gPP!CZQJx_i2NdYYHP;A7xkkSq`LD4D-|^%MMSyngfS&+9#CPr7bzIP}PwckcK7 z;n3}mNY5LRV!W<*HV%rfXC5hrzWn45FFZ0H`8|K=6~(;$%f=^U-1kT1CJh(2q)mK( z{0AF~bbIb__zo&`2mRrQT)2PUlMXpOI&q+oe~Q9~qVVYWEh_AJqci{FOHtl@>kv}R z@KdkYd_y~AG|{#eu*UTO=mRE z!+B1oyURR^ql^Obi{YkJklpWNkI1Ia9+lBqG>>vgYYGNNWgoncejj+DR}4DnH(Gn| zh}S>UE#CdOc~f!?Pqt}qY2K4K$>=&0KR@Tw)(wQ9c_s`scyQ0p{q86CqetkRH13^; zJy`uY3B2ye?SJfffRs3y-z*s`63Vc2EBN^KC0MD&QA#IyIKPQ0MiIc~#14~9{gL<4 z3-&bDIO{OfT?{^Zd?N2q=~>|ZQIzh-mU3Rae`|SBTg(e#eH5_UTpqkaUN`VZK&Y@T zlypD2exI$%Buv9ePE(qZ4Ay3sPSSABC3y68N%e|uZIR4%D#nZQzjAt?mlsMe(z`5A zi>KmmG{50k`|Ji}0_*4of%|1}4pR!;?#K(&-Vxt85$eOX&a>o>8tV*Qb_&2Q-R^IV zVmw(M->~w_OD||lZuiI=(i{9CzVDNksC7OFNCXvIWHf*_X9Ecg8}5@k?D~GADSI`G z2f6hH}8u=g@0a@c7E=VCK-M5`o#OwAE}q;zKIe-QkpH}9J+}V8*%Vn zBHGu&W-->t_X3Penj;}-XQVCi4_c8pO6gy8o)Hg0KeEsMoU#668M4{vctS%LEX2c{(NR~4!bl^2A^v_8H z8vNQJ$8U+-KV!|`cgV>vs7t~LS@h6C?WLxONgNS59-PT{Lwq~)Ka*B-Zv$*d7Cb4GyNs4<9eSuto{L?C6_ z7zN|iq_NS=&B~l{>l@fGAS_0Pg3n*RU-qCr!q;X7V#TQciSI?djF=E22 zKriuUle`g6D<-^>ZD3eM(!Y}ClY{FmKTntRxx)tDXdLvbhy}BqVb#3~=Tkr_+bS|n zX0`aM>rPth2Cd@F$8NR12un3WRIvXOglXM&pJw~#@W3kB_NKMEEfa9-QS1xk{Y!=6 zOOf-`hGV?;hHkfFF<{Mbn;LPQQ7M&TuKYfhlwVMllO&xc^Z6sqito$feNMBjT9s9^ zl20ESmZWiCHvU2Py$fS(EGlg`%hP+Cky%!HSp{DE%)e-~+P}zUW?Jtr;-MG@9^DVa z#(h;)h31WD4{A(q)5h`Jeb~Rr#o!D!Z%sF%7x-U^vq9T};tpx1UZFPq!KVhA*G0nC0Gb|81W;4h_ji-T{v ztErumc=wYBU+u*HLYl5n@ht_*1$##pNp|lPe~^#F$)g!m3Ou)`>H5~0Imn7DlP&Xh zaK>%0_CJ%O(`NHPt;(!i;SGNJ87l9+W`7weo=Q^8)^7*ot=a(r7f`(if;Z@p5r_5_ zX$&|!%^gi4Y%x#z|J_Zb|_0t0n$|<%$^5A zwnY#!(X(bLMty>#pcK22w{TwNUtIRQ3$H(NnLmkpt9~DQV>rVimw`VB{ESEQ5#&jlV5s4*6*DyJoAxcdrWs9hEWgt>3?Z2q7WUrxCYQ8=jQe(nqz7?$ zh4*=&gbv_FZ_C_B0^;c0m$gTRvzT6U>N!ZGo7>!hJ~%p&GAZn4=ggeQ9^dw}a)PjOH(L8HtT1 z5c7Poy)%m$sq=ws>%I0+HGol&%S5X^lKNn5g8)s{(5MFfy}inufMPjuY}a-+)P+F+2ju>s|0eLf-^YH> z{}90Wks#`Dk^bL|fI7r^2i$zgk`-jj#UiCy21Q%7pi6NE98uMs%b6zsnYYCOkhV7D zCZ^2ioY$6**U{XGlbd$U$%bOR_sKpe0>{?fCpl=S8Y#E`IKs3h$#Ti)x!N0Vlkw! zCt-nL{cy=)2oCFq3y3G?tVL7Zwu?p;GHiV$*~-3I_FZ(krdO;i@j<|qG&-bjB{y~i zb0r4e3hDT*vj(U!4+v45ZmjU6^)>qA%*pO#MRz14P2&+;1R$#1( zGqrx=1&gWT!V#Wd{R9QdXnVJ|X)J8u{=gfbNwGgk<~f~%A%-lGwT)e6)q)%r)+1@q zSQ#A5iez>GGXa*1HmmB8dDhlmqP4daw3}UAx`FEtK}7>2eRf0EnU&$a$qJ9YTzce&&S}a# zgj1SnBXhZ#J43B7bRbr^!F(8P>HFiJf~&TM^|=ayT3+QRz>^@8WVQ&?Fv|FG8C!HQ zua~*@5dnPmgVEUSRSAJnw4qB>od{(KVGsi`sG&p;+%5E;+#j$nRt-^5MNy!~Wpa)5 zy+0W88>3JDP+JtttHxa(oR|#X)B04k5gym+Q;_M!;B4IU$Vad51uS57O3Bc_827ky zZao@R1e!&&Wz3GJ+a)KPcCN8FzGa%Wq4pw8CN#@=$ZdNxk$fut9rDK9EU^T%xo<0Ym!=T3kORl%(H+E@g_8-*NC+AcTEh7>NoSEd3jvVSghaO*ro#$M zCQx>$s$jLB25d_I4h3;heKw`QI~3rd;f){?zu)(y+e1hetogHrTZCB_-Gw>Dg{pTx zn3iwPR{``%XwU5`m)oKwn)xv(6T(YF20wd5LE=i(a<5$JFhtQLr+tUPg*OtDG;0+J zJkS;t3S>H%8ij%vvv=8F!x4VRxvcmjHm z;N0>}4|JfHC(Cp$4j~sQok1v!#>*mx*fYesCH-mZH$4O@@Rnt;YAyb>$<2G%2I8K& zy9QKq$M0|}xz+hx|IE*z77!aE@&}V0huLu0d zp&{C@j1+|B?^JFp)Vr|C&k{zxiFOFS8-SqV#}8$wkatAVF5XpuaJ0(Rz|>p5ETSi_ zr6n53D74~~(R))-c@ssrn2ph7;qU&)(5ci+tzht@quV5!P%N`x{xH`q2qh(xNbSwi zDa~pm6U~XfUTO-kY#H4_dtE(?^5x?XlKn`gDJ|7{OZAx)(C#2>5*&}WNpx>&rE(j*AQ#e`V#4Kj^*(slE)QNUW-h@?QY5^ERkfZQmD3tRgooDVpe&$Da9>6 z1~rc#n2>yyz%I+{nrP;=AhwHjYn|1S$SQn`u2u{8)j0p3oQM)$W}Kc~_N2=>rr1e1 zpU@Zy-b<`yRfv{t{-k#IFPoY86di9@%*|7pg(x-H6(654Kz~qVdc6PzBxaG4p0{Cy zE%&d>h}?yQ>KilAnG_-pne2jj@tsU%4_v8c5y3)^axq%|{HQQ@gC%oQJC%=zf%;$`zwG@N8hS=a|^WZ80M@bNP7fm3TSYs3& zdK6=xdBtNOAoh4x9JfD$Og&z3;f>${Uhq6V0qMEqlRF*(V|gQZlECx4H-rAiF=IM5 zc{Wc6nimzjt`AYkMJxXD^MGGtFl5uDfH^1e?IM{iDCwLw)!D|aEF;IdFusz7hp48l zFrI`_mO&xzQx)Pq?~;gJ(JtEStU$NAv~{w*-9nrHT7}m8M7$ebUq_SM@CJD_#hoSQ zZ_9qvHE$>90GAA*{Yes+>;G9_ z|2dW+1GY-y4ZwuV^y0uYodR|T;IZ7=o5XNuulS3PY9j|qEf=2ZDP8(Z`}~CC45TpM zDylTega+Ke7JQIDEJ{oET8GN9L<%q`?K~@GQ(#xxPHOMw7K5>!07g=442(qQB+TI? zYQ^=G;{4v$ZqlcuxdqRUnGR+sK@=zn%cwV{7TY6&&@Lpk}@ z(GQ+|_Pp5_aQ(pPAIa$-)?dut&h!`0n|=Y;51jt7n*P6j@bqt^ypCe}7ef{oJO??2#D(G} zRVi-11T|zoh?5i!&2A|iU&{zJ4h9^5$c0!ei=o-GQ06L2!K5=pG+5v{P^N!rbftHF zSDOu>VH#au)0AOCVr2T5MJab{()rYu;-aLEz%-PQ{!S(|hCtmq@iEP+SI@MEBFc|C5CA zW0)sV%BPadu0*b;D2LQ^b^EKZ9HMpyNMV}HKnXr=*|Bx@m?lddbSZ5#Hp+Sf@f+%c z-dW?c`MMED=xREy5sdqdPlKR0_~@-B4=Kegw82s&PErP~%J5<%%Az}sF3B5Nvb+r= zX3Jp)itwdcpexk3sk zM4}M*R>?|%ABj9atGpu5p(YvC88K{RAJ3xhKR zS)D?_MrP^&ufZLZd@HHh;7k_;E$Yv%V(#%2jv?-}SJ*(nSF7663^ATi7u%cGQxqDh&q=E*hQT;;=lh3wIu4(80;>RDZNQ&;`j*JBu= zdCb{i$Rf;Y^%+n{S>>W@dJs)x%Pzo{xi<)gycbte8V;viMO4Oll?+7Cqn2Dn*7Qkm z-T;%^jpAZb4}JXoJC|g5iO_ImAP8leN4{+lDUGy>+8RyI|$|fEuL7Z_V$2d2NM0QPU(yM zq4x)qBzEo(z=I@Q+m3K&8}89^ll{XcZ$=!_zcihl zA+qJA>0PzFK@9kSwR6AcnUY6~ySoS^J>q;=1unyo;;eVe8i5b3hJK&jm*Y`AVfB=+ zBKDMtFZR$H>z-$xMHV=!UcJOwfD(A!PhL>`$4)#dPEFIS)XK;AiU7170@Uq(Pbn*A z+Tdf07so%x4u+`Y?XdYcYT7_TnGVdcW`8MXp{VFWh+?=nV=rnQR8=&^;a6s-lPK2e zLsUyXHeJ=67RwS4&1h|g&Qdzy`b*7~qQRNP?4Msv+MVJL*F`E+fs{FH;tMp|6egyu zm1k_%e=1r(()8`xk43q!SAM`~_lF+x>8#XBYNe3PlT$%W*^z@$v&!R!6ux4tV!ZN{ zpK#)ofa-+>4Cy2D$XvQU7r!6_i>bGo_oq$!w3&aT)qH(w$M{O;NIjELMGtFQ8x>;% zbHl0yKu%YTc(8VC+rk>+k0i%eM;pOiwAd2d$Zxbc-2d7b?ti@$Zs9ws zuu}nGcihwQCwY>GF_}M39%uJX2QA4eu82VKA>10yut6% zG`gc!K*kpUhj|LaVbZd=JScw;1FZPEB&%(*A*0rq84U1#KXk~RyU|kDE+g2iR*Y+py zNp0Z{C=T2#c{Z(xd$yrj@(w6lQ@aNU_y>47PSy6*@BJW4UqnisHl5>UeX!J#(<*B0 zaC39VwBcWfSB2KV8w4NSzCTpafIXKh8fUxiXyg_1sfMIHcRcaiSn>?h$c&vwi?$JC zqjF=n`F352AWpJ-Xtmew95rzYU-Qg&?*Ia&$@^cqjcOWYwyN!pt@I#UP9|75lp=9Z zLX|u;m|p|~tcJ?4Ee(}W{-A=Obs3SUylOHo+>jE2Us$X-B^me@!Lt}<8T|$w;p>+w zsLJR85ZO>DhTobwJv!k(^MZ=^4^QA7ysAt2Eh!s_RsgR%VCj+hH!IRrTy01eJcE9{-0tDENx{ZpFG!LzH@L2d%<+U6ZxD=_xJ5*pugEW)M53L4*Q zEFzed6GCAMoDmK6#F~~o6Sj2K9LW(V&_ac_Mv0VffAHUj6Ab%;2-pqfO~uRhLWd!? zVhpik5h|1Lq1`#I2ozz+)eDnyEkTs1q%1?$6(LxHSi!*SU$UGUY)1F{Ck~(5{-MQ& zvYZxHDbkA`#W#n@14qMU{GhZ3B7Q?;qp3{jKA6Gz7f zAb%p%;N1MMe`wJig>UWNR2Kz!TTaKue-5e-agyUc=?^YG1Rl%97x=?s=uz<$!rhOn z7u{4qn3jQ7D1%DqTq)!lf!E}U-bC~A?==eaG_Kx+d#^=r`ypq2Fy+Ju?_P2`X0==_ z=VRkO>Gpgrro{c7E#2BP?sSNwj2UXB-02*m6n~#VhZEsMr-Ap0@HZ$jGOq zW>e1L#LtD<58@bxA1Ousqew%y=eeVS9~i!N84q{Kue2!tB)=|-ku83FM-XYF<(%M+ z930qQZ_pQ_&gi>M*7%smgM_?U8GmDSh|8JSy6Oh#w>FF)Ev-3|u|rk)nCBBKf@)D$ z+}C>-#z?DCZr<{7R%=g13+1cH34Grezg!8aec};TZZUpB}5AW(PB-ASTtWPL`Kw}a=VrxI$jCUjezK8O^8^q zUM)l@D6iyEU7=btqF>(8&>~gMvlm9EB}Vr(t*?lM0`r9+w;yyQ-G!$9Ux|W3?92rb z)p63Z^6`mwHV(U=JjmmTosBSR$=ztA3NzflhUnymhJ20o8zGZB1Z701b3sb?(Z>5} z)%nPhle+9C>~zH;+A~IBTg?rf|5dwLmsLj`=PpTDNKsT`i)s@j~#ATBJ5 z$+Z!oP~slt^@fY_e8dJvPnj0^Uhp3p=C?Gh-49qYDxOm1^-;4)_D`Az#_@|Ott-`A zOeRIy(-%(atMut?=!q5?WY>8xpCd^@j(LV2Z^RRWpmTa*@fb=l6e;W}o`7S@Dyw zavl}->VV^n_W-l5??KluCy3$x8#MxumYBN6p%GaDSX>obfiu&|z=;)EoIpz1Bhh5= z6yLYu*hI-LB{z2e=8JtV{cUanyDO``@ z7k^Mf1ie}+$eOgd)6gNtxp6r_Myn%eL>^bmFMEFIdG44@cOTt-Y)?emNNskM6$*ey`kevCfc?eCV<_xcFe8=UU>Yu62c0t`dq?{zH<)l+H;s zpGIGouyR>cMG;Fu8(kS!Qm>M1?S44E?7b}3??t1)-qp?8U5RzDb@O0QCzcH<>RwST zPO=h`EMztf_mt`^n@VM+vB6ayjJm zW|xb2h7mLa9KVj{IPO<%MQ!sU$%gkJQ@~NCu?&&QQXkj5GIp2?XPWVK$||x09q1H* znE>g&O6pUM)D#gtDGg&TUq;@=<&azqzIc7p2Q|5cNaiY*u96r+vyzyG^LIrDSAyt7 zrs7Ak2ve3+X@-c8PKM|Qk$}m!4Edx(Ewfw$6^4*?3;2e@O|NPtw zis=pID*RbKs+jIZc*mm|QF~rSZqjgZ8x^z4FpAkq^HY^G|Dw@qA9Kx3mEW7?>{P4W zDFw5$v*8HEPzd{g9Wb|w^5YZzd{{iU4pG5TQE=Eq1;E?l5T1IBig9!fe+lP&Pp1E3Cn6p@CXs2tUj3v}Vu^EZbtDVH&t8|I ztfRjxDZ(Y0;_K#RWK~o22yQHku|2y4KxoAnfz(eB z!bn==4fz1FhB4_*4FZemEK-vk7S%aBcR97JY5_5+vq<#$*UusF z&fo%4V4Vqa3<%Dx#+Ejl&QbB-&U-R)VRIjj0|Jyc8jRt}4Ua(>^hbVwT)h1iQ=*b= zbusYDl>>51$X=}GacP9MD4R^G+^{jOk}x+0{ZHAfLg)S)16tlJr6-mBXBd5eEvIKv&U*4PnR;*QgT1Lnh{ zW~IrY!nbV0G{PO{&}lX8O^&KfxbC;(967DG_D08*MqJU`agH4p+sxZkHUlmP7hnwD zMKo15;U-eP+9}P*vD9PuYDyu_dw*zmgbiDFD~yky#7WwS_FINvQg<%R0Nfhk#bUu9 za3pv!_{08NV|zxUwNC2!)gW?YF$;pkF{BDoUaBuK*9hacO$VemSKn~JR-N=dI%O@$ zPFelb;iaspblXV>&t>49ms4AQ=ncBR74O(p&oFheaCv7q(292rkzbLe|1(wpltKsz zyGW(48_J+=zWFV4l7@dL%UnhVtvFKtjt}o8h)`7>6eS zMlb|5vY2r(PBASq8jM^qEEuc9bJrhv!+M>Xbp;Bknh7_*A>9PKd*`Z6(;JRRyEGXi zmFn>c?~CD4R^w7!-<~iVRin4#^K?Kb6WMsZ8X>CFNVvHZh~d#F)mC`N8No*bL+US;C`y^AD9)ZH&0G<+?M3;w0r8++s$gGW;Z*< zmJ`LYEk|ID-O3uCSZ6;lv6AK^+fFKBh5dB6xlf|+q`^1Oz}&+U$bkbNeJ

    zTp8~gHyX$cB zM)5~cv!cm_#F_$=q3D|ov^eJaQ&t|3f5k0)^sA-1w#U3~S|eyLAc|+mcd|K>i8{?Y zCi@XF*ucD{8RUJZh{)F6lTd!%N~(_h2;J`RAJl?hUh_AIs)e$JMIN`uYqa(4`YGM$Uv2S2bNWh)2Acl;eDUhhrCP+Lp?9s>?Nz2F$1IRQ3-}yvcMAroow)cBYR<~PWTwlF~&Z+B@ zvP(=@1i;rwRT#;ogkRyE%jRMIYr7Nmv`C*>51l}uo?%aldfR<*w(#k+$c|F4(>i~7 zZ9^a=wP1S~-dOcHEt{^}nWs;o;oBWIdic3_av&JGcc4AQGh&oKXo4@nz%oS zyOf}7!<)Fg6V~Ek){vT?H{FqkIR(0p^6m6FC~dEbu|8$vaebnWIDnYA=i@#t3bC*1 zI@`BF9Ujx7$tG-0NTYVA#UU%QHsjMm*z-bK{OxBp?=|@^v{I3FoS^-d&CX|s08>`& zT{t=ReOQmw;{67H10_$d7iR!&di4CmPwf3RFnIQJpHa*1y%z9u287*{WfowpSpnnW z+TvFSK_1BBY0WqN*Du>A)RLraqjw}(yF&q1-!uWts)=_nnEe80%7nkyqua8ruXe-X z$pceEP62mnD5~y~5gw|~KF+e%4_rZ1OISjxBkmG#5y3^e>G<2X9Wn7-SEsBL&o@yI zt}kILdpzc4SX3`gaOatV_kk%0Ona0sL!q*QFt43w?V$)>gnyG z0dnX=?vv&QsU3aEIZpikh@?C_V+)&pax*yS}J8j5~T93ddFBvSNZlm>#G@Iehq0IiCCE z$>qcteuwHY{B}TtQhQ$Ae+?*>D9uZ5NZ}q;4JqR{)!}G^ZDSl4sT>;dk?^$NLD*Xh z@LXzFA%d)M;_To7LyW9!nSV4+5H}GR>|&gIy=;+YD9Xm!AYzXom)TYXU+6q1Tk!*b ziF)&FE^q~McJ3MqgC^IsteCKDiKRNgdNMlm?ZiMAN?if&0=IRR7M8*;b#~0ZKwo)z ztm?B&Q?*qmkZ9Vf&LGA^^0pq+=dEz}VIO(jUem(W91hk`78=Xov}S}?aaI7KaZ%jA z#Mc!6_@N#hUU2$|GW$e11I!~)o5Re8-e~F_INNXckbXOEa)Dcp%67{t30S1%%Qbz; z#IX~CWDzgd`cgF{3)rTx@={kX zb=tMtzgFEtj8A%&V9cSN5L;kH0Yl(5-M9HiCe$MqbX?xy_m*(hCphzSCep8*<4ZQS zlpWiwP3I~}18$_cws}dn5ZKSP$?BdhW$E0CQ3sMKltSwFT%i+@x?%hY+2T^2w@iP& zH4O#rWV0V`;FGeFDg`QoPZ37l)h zt@y0-HY>{D4>CQ$@Qr%KAI_GB{-kZ2?q35r?>Q!RrP&zn3Kja#bpra+nlMl8VXL$D zT2oug%aQ~PWP)LU?^fb#B(2B^pT$Z8yGg- zn^vxr(DIB+l4m)$RC=iBgqoOGACu+73pkol?^C%;g)GOlu3?S)NQ*1FRTB7EqwGB+ z+U^vEsdR~kr`|!*lOl;roxI1Wg^9`Vys1}CRSpI-Bg_#!ss5cHXaAbP*$B-NUA83d zYJI^xndsHg1U@2_N*6S~a1Sioza$cRb~tH;Pi!&jkS;Os&j9;FTLtDm!uL9L*JxMgnGq)3K_v8)zE#&V}-sCg42`4B~mHbo;_fNq!__FSI*UkTv@E$ z3mzq2+pH1K>HZ|rqAFkbdWg;I?2sMvGE!R5@kncg<*^-+xW1M{PMoMQPRL4i=P5;#QS@t7HJK-3 z)e4bYK<#o4)_#w=siE}fg$1)(XYbQ?m%G86))prsf7{SKmt-ro%|_vGgF>%GgP4wp~-E;nMo4H2J7-JeVRF1 z5msSpzk@M$fLUUdkj2*ap3YWrXpPpW9~~N-nIA(sB1`c<8aD5~&9?r$!S3`H*vtki z$AgO0Ggf73lnPb;FnI9&h>q$pKc%o~Zf?+I|CZyzJMaVj<7|h9+dRL1c7I%6)lObd z^6o<_N$>Avs+Mug)Nj+ePH&KuRR5CmEkJ-n%B=_1A5`S!{uSzjeFc=nw&ZcA+}!SF ze^CE_sudc_uzZ zTi>3$KeR4xXFY-_Z1`rK@3GmDZ+F+rC98wfSPkSu-?mUrP>Gx!26N^&H;zy+lZqOjsn-{T7G(97NmP?6{Cak4B|h$*ocbssG2{lsc>T>ZTWP`BZ}rk zmy`vo@Ru^af31W3WCfXnhGxO6hBVkRe;e!T*u`!;jxAlv0aPbZau6khgkV*}birwX zFkayx+Xi_jQYT$b8k+tUPtpNMqnGB6&J*%*r~O+h?&&$lgR)c<`TqW#$$xGg0B3#n zChlc=sy-{>`+1Ok%Yf;2tWz_8(w4gt&!or?VIIDP_I#nU;*Hd_p2#f754|@ric@OK z4_GeMRwAN$>zbb)1L-qBd6QrB_2l7=Xs_$+?ID`EgQ>mjsn;nAYg+b7IHYex1>gFN zmit@gP2R#&ScKmQQrg=T0q-h9nk5KabgS z{WM}vPu&9(krcF!`Ak2^sne#~_nEN+@331)_Rr91n+B1Z@&Vv~h-lXROdjWJUQeW! zpj_L`na#BpmKQ~)qjRnf;xs{Wg(PKA!M=#~NI?qvgse^4qS~}KsYCk4-zhk!my~Qg zaN~7rs!v>tk9GP22Mbqm&eNt%`&fz@h};Dh&68jij`v%0-`_K!lb!0cyvo+B75eQ> zxR~fLs7}w>{(efy9tIH)b@~~sB1H8Ak|gngMgTS`WM;9M`TGEXOG>s`5AX#5*2X9N zYSv5NUd7w>E}Bz)zunas_!JS%Vr=Gzc;(uJ%ZWAiqXXUve`1aj1&&_J_En^@$&LSelBLzP{o(8U@W`FNe!< z(8jCYcrzOX`3c6!ILOaD8o)4U%-|M7z7PjG_VXXlMnUt)ud8v;#%mt&CK?6#3C77d z$j>|)@G$5bubnIsW~wh${hg^olY!YeU#~|&v3Jns%VZQZ_ktF2JPH~hxLJ*Y{LF)c zW+0y;=R-ybpaDNJU#~_%v3F9xb-3}yDM{>sm^OZg9dn4=b~%G}R!alYS1(0% zs6Gcnfli9a~|Ih#W_y72x|NiTomDgeZ636ZwI{zEC?O%C2Lc}pdhsggG zcT6;CBC>exl0MmK*iLBsunp58JPkrOxincer<-?sBp&kzDy_xoA$^0SkOh{;G@t#f zd65B$iIqUY92^X0f8;8Q&)T%6cU-_pQCnAKD%x9nEvnB{RCRiXOk8@-vlh3UriOrP zMf;%7+e?uiuA)iL)&3Q{k#K$_Tbb}iI40Z8ys*9d# zGF^w!bUB1BSBn|!t{4oHKjI~8&*>$IB7o!C3`$n25tr(oSLYim-ybI$Q=+q_3$@}?;z9(SqhVqy$g`DBLX~t17m%1 zPEB5F2ySSSO7JvQ&dpbaLRZ1lRk~*yl^FiXreSG6M&udM5J6tqj}dtt#vbIk^H@<% z{FJT7is!kXXX~+yu4i5e=PR#-@y09SV(AsJ!}hV=Vf)zbIPvk_aWW@IXL6*U+>CdV zozvq7sT=tUZ~c8Q*UQCz)mjd?WhQFY>|aH5gSR8{d)iiY^(p>nKCwRQ4>F(fqv+_$ zT<>kWyFDf}pKAo`81cnAUyqv+z@vZT`85Xdt&7mWn`e`~coS{VCi3n+WFrbAO6bP~ zwec&NJ&{-OICUz*xaj=!jZ;b716e|aLXWvOg86!!59#C~E*rmZt6$sQ*YDcuuocCtaoF$J>iCTC+v;Pq9%=*-+RAIIpp9W$wL};f zeb81Pli4s8fKe)gwu;?(vkZ!eckiy+c{il0-NLffSIbswc{N;Mu8s(ay<&0332RfR zA&TZR&)TBANh6fRb@_*or@x6fb>!a4tgrmILG-N4Ix<|e3$%7+({Mmc&OXxps}3Xe zyrQ!zwQF9&#&B)ISGbkN3hdqbHx=F&)hCvY0H3;y#Cq@lYrE_C2vUf_r~K9X8wK6$ z%Qc{=)_|)QIbA7|8oUmv2);s?7ShV`KVD(%sU~G@e|2qt4YfrZB!QSL5gb!~sSZEgL_0U-MS(BnZ>UkJLQMB!H)ekI{83U6_E zOQ`M*abEhfyw!2?3q}RwDff6GIjLilx zqFMY4QEV!Sp%O(iFPXU^lO(fWK9q%_lFTD7m8GGw*!Zce041KS$Cz0oPP885X0t_! z7dVw>b01DLL!1cb;b!6MDvAi1BuTtvVnQa4=3Y9<7I{s^*qI~FJQ-nULC6fTvm|7O z*jW*=Rx__vL~A0}ucepF#tivQFq}9ch7(6?FPS+p zoH&lWbQa$mV7weLKwNlqyi-&SSqaSi#bP^M*GgtJx-MvBJ#u%rc%|Lnvf%jeSET9= z!MRKC{S5hhT2AO&F@~I_Hw?5eRGmYxAi^ zm+`N%Dp8qH=bR7Ei0e$E&F|FC$Ks_c84~-TpjP+sPj`dTPo15nyt9wU!+rI{tj`iD z(a3M5pT=qU4}VD!L}5(@rNV=IHa{^godk?*Cg_Loiufx_O?^+bKu(1 zzQgQM?i2arV3FN^gN&}=8>-x+MN$q+OE4h5VG=-&CI>C2k8c(9AJ%h(Iow34o&Wi z{3of3TpVMwB|pj!!r~ydoVYf7a!cl5#SZ6%7TrX_N_SATxmSiWY(AkIft^zd|N7og z2DWZe{0gA|pbRoCn5I}&#t!!@a~x|!nGbT^Ap358RdRr!AUQsD^q~v-+k|PBDDn(8 zrW0LEc^kYWQN${*0BS3~L^DP_u?BTdA~glS-s0kcj7Z3)k9J$_@A!l&YvE;K0leMwCHz_#O(!!R_sh( zWEMLm11+oZZwakJu^Csr7epFU>W2A&Y)*e9ZT?Es?23xV2?eY7LM8vpq?-I|Sf~)9 zAa~@CJtmKs9X)8*>7&P^Zo2)W^IS8~?u}nQ^%(^nmiqajtL=L?CLf!pCx|3@0<$%0 z2HosKYC1ZV1>Y$NmPrZjuh69Rior*R#y+!`Gx+64hFNLpjEgsQ=6=nj4x_@L{LRq55TQHSn!!$}thM@&`yRKN`rSGnH6GO5 z@QWNOe3i87?l7B~`ga{qf3Qus0YoAC!1@ihzJicjl)W}dEbi1TGm}}lt9<2T*Ue+P zd&abSa(;yx9H2*}4yv^wG1aiTM@39YaJ^gUlIo3!WS#KrY%3 zwC8sUZ_}{kytXM=u*_pruHQQztm1#imzy=dI@#VS@f$9Psw6L#Vr^9Ym=7zmFonROpAYv>Yj-D z4)l&u*2&2O@rVnaqSHa}@Kfqx)_AJ`DYStUl3MFB0pd|M-tp=^n`NwIVtVsV8x}V0 zC=YN3QOJCCMI*=ZLtX$`I&rE;uui-@GBrim?CXCp15m=+g4g#3nGq}RbdM$z-wU&Z zVhrI398#SvDQ}{oglMCiO({B-t;b9xcvP*&Oei6+pn}j>1Ix;XJWT_O7!DQZ7AD3e z4P33E#R6_SK2lu+4x|7@V27$K{QZ_i?;t_Dtr-BuQF9%;>{Ig~TvhUGEb6&3Q%Oeg zD9LVDyY2Sx)t%v9M zRS48`LwMWDr}Sq)sFIZ6?&Jqk-1KD7R`03;^nlHL2}-vyG* z-Dns#`a*e(-5noDbW?oDg{{-KpA=WSlC3NF{3{n(R1@C&0i0A_V`q`qL~22v{=CZ- zv-6|MXi1M}xuHI2Z#G$~%v>+`ggl4!#-vNCtmLOgoiS6oY^=Nc`p--ZB#OG;(R;n8 z_IVdbq~w|B3BCQ<Yq?4-~#?6S#F-ig5r4zFCL6c4Zne7NvC;&aQ_JEn5c|Ijz1seV#nU%6J9T z(RT-{I6&~}HE}{uaZ)#RLh(^;IT^?S$Lw{iNdDdVp;&c($&N zp(@i1zFuc3B#)Tg-m*rw*=_Ai?v#)oaBGKH`HM=Sbwi{4~nHdk>L{;Ac`2!2>hg&Wix;BJl2+TzBxqxg(4`k~sM2|~QF|qiUnGs0DaC0|?!~YB>_9o{O zh84A(!)2*gb@*rBHAf{dt79dr!i!3)jxL)KU7%9mIsifco_~;!>NClKL^MTJ`a>=_ zku-GJK{l0|a+xh4pl!P8v#G<3F2z4>fzK(Uq!dm2qY=}BW{4$ab-o7`ys^ZgXtZ%R z(E4{Ec7Dwfi3H3lm)%w;RD8W8H{7L~ zNlrnFbn#T*MyPTfeLX-37T?&SD^2RjklwlcsJdzlxQA-Vhyk)e{HaMk8^CBlhkiu( z^#Okyu71FoiVO-LJEC;BKZV+efgqU=xc!~R%XArU$r4NY`B$~ilcZ`?sZ0=>+Ls=J za2;h(H9$~-)2E5~xH)XD+%j=v9=9l|pPV;*als@eZD)y}SgX`$hS29M&cs4lQ zI8DI$#=(Q#`1{m&c^c7^WLBql-yT)gIWirJ{ovBF1it|_#_0jga9i!Qy!>hwOmV4k zd&VyOaqNu0wZX4|+o#^a$Wv)HT`I{3#U&K2DlvpclFsoha!&_28Qzk@*T}ernSkwd zRh%-yl~p0z7idVbCRBh&T1*fqGrxAxG}1oH1$i)g6mNX|bAS$R zO2wpUeUMmR=w9jXc=OtWtL|y9L~cm<35{hcRq6{IYPpT6t2Ycb)+Qytf!qCeXdno>u#qX#4gF8*H&OY z6V7owMiOXcHnQi&9XiIM6}6*|W!JMnpdw`(V5Ko3IN)rJXGg&fwT!MA8uCP1F*IO{ zv??dW2Z6BQGL;Xf0KL?HUbCCVprB!etj z;gHOJgR?`Uja^uM0B5H}2~8G|%zlEiV?`o;Iee}WiYBDz9<9d>GxG!wJM%2#D82qc zTzZvvlim>$m)=|8cauK&*EmxDxn&Tqedxf8u<{0ou<$PL$}{KwjTkkmeE=k`b%-tI z5%dc@lm0||IWaX=DUnKjl06XTClW$Op-#x;V8hhpKbp}uQUww+!q?7x*1rUygcKqX zG$xX6*GAW67ir-vPP92dq9|NUKn5Ir9(Bjaw&LN^JifAcx^(76c8e}*EU6HS@h-Op z#1K2__WjOYi({zFUQ?*dRzrK?f-b%*=yxMbv}r#}iLNHivfNt5)?^4``sfQXl3Sqv zIYp_lvvEbx#g?X?rY4>;kDouq!X`%65KomLAZQ;7AkY{kPDoVf5sU_y=CT@Q z11ME!M>l9`cuCm}u|7r)8I4nDZvVH;xdC0s{=FF?KBiZ6*s3IU&?cBf0>=x1JBNMr zB4O1?A(k6Adj;OUo-OuxlLTj|AiY>L4QbduDFl6Pi(DC_zq8%i80L05Yzle1X@Bel zPK1Cg{@lT#Lr1I1@N^G9~0425ygD3|+%`3}6+soYRp__WkXq&0$vcZR_S}*`1 z*m${Ud67(HNVXzXHbSG%gsc4*{;L?yfR-o^Av%ReA%~Y<-2iEYQ3``I#&Fu^uN4vX z=#OR%w&=97ZAN!Ax)=lE7U&klzBJ(}uMNxu_)-N=PJPy|DfJz7BGC}Cog6N5Si_;d zIQT^Mbgqh{efspPvEspbxSKNJNHi8aA}$kS!S)4-9At-*TS7mz(QMM!?{DG;wotrX zBNLQ&;kU)su_2mqci!S6~~jnH3^;uJIQ04VSP0D$@@Ta!_dR+eD=k8tfq2iDnG#i#EnLBce#o}u0! z|6N^UJ;Zo=u#p;zA_EfIc&DBsfY97(ce>jcmy5~H+l~}Zo%zP1szmb?`yqQZ(pIZr zUu;H!zqqv&w;cBh0r|T&T_^=K3e(DB+b0?zY=r&)=`U zzjtr?eJ*GD>39)tkP9SWA%4`M!R>xsfBbszS8=>%QETG

    kC7%;uDYp5~B-LEpV| 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

    *bG`3M2^e4E)D{>?Mhk=L(Gfo2W~r*d=B8Z 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Ð0Z3@ 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ⅆ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 DlHP3I literal 0 HcmV?d00001 diff --git a/examples/ansi.log b/examples/ansi.log new file mode 100644 index 0000000..f64ca4d --- /dev/null +++ b/examples/ansi.log @@ -0,0 +1,59 @@ +(***************************************************************) + unit Bold : procedure; + begin + write( chr(27), "[1m") + end Bold; + + unit Blink : procedure; + begin + write( chr(27), "[5m") + end Blink; + + unit Reverse : procedure; + begin + write( chr(27), "[7m") + end Reverse; + + unit Normal : procedure; + begin + write( chr(27), "[0m") + end Normal; + + unit Underscore : procedure; + begin + write( chr(27), "[4m") + end Underscore; + + + + unit inchar : IIuwgraph function : integer; + (*podaj nr znaku przeslanego z klawiatury *) + var i : integer; + begin + do + i := inkey; + if i <> 0 then exit fi; + od; + result := i; + end inchar; + + unit NewPage : procedure; + begin + write( chr(27), "[2J") + end NewPage; + + unit SetCursor : procedure(row, column : integer); + var c,d,e,f : char, + i,j : integer; + begin + i := row div 10; + j := row mod 10; + c := chr(48+i); + d := chr(48+j); + i := column div 10; + j := column mod 10; + e := chr(48+i); + f := chr(48+j); + write( chr(27), "[", c, d, ";", e, f, "H") + end SetCursor; + diff --git a/examples/apply/backtrac.log b/examples/apply/backtrac.log new file mode 100644 index 0000000..87a7ac1 --- /dev/null +++ b/examples/apply/backtrac.log @@ -0,0 +1,920 @@ +PROGRAM BACKTRACKING ; + +(*************************************************************************) +(* Programme : BACKTRAC.LOG *) +(* Date : 04/03/93 *) +(* Auteur : SIMON Philippe LICENCE INFORMATIQUE 1992/93 *) +(* *) +(* Ce programme permet d'effectuer des op‚rations de retour arriŠre *) +(* de fa‡on intelligente. Pour cela 2 exemples de BACKTRACKING ont ‚t‚ *) +(* choisi. La Gestion du Planning d'une Semaine et le ProblŠme des Pions *) +(* Noirs et Blancs. Le choix de ces 2 exemples ce faisant par un MENU *) +(* principal. *) +(*************************************************************************) + + + + VAR choix,touche : integer, + r : SEM, + pi :pion; + +(*************************************************************************) +(* METHODES USUELLES *) +(* *) +(* Cette partie contient des m‚thodes usuelles de travail (BIBLIOTHEQUE) *) +(*************************************************************************) + + + UNIT eff : PROCEDURE ; + (* envoie un ordre d'‚ffacer l'‚cran *) + var i : integer ; + BEGIN + WRITE( chr(27), "[2J"); + END ; + + + UNIT GetCar : IIuwgraph FUNCTION : INTEGER; + (* attend que l'utilisateur tape une touche et renvoie le code ASCII *) + VAR i : INTEGER; + BEGIN + i := 0; + WHILE i=0 + DO + i := INKEY; + Result := i; + OD; + END GetCar; + + + UNIT attendre : PROCEDURE(t : integer); + (* Procedure permettant d'attendre pendant 't' seconde(s) *) + + VAR j : integer; + + BEGIN + j := TIME; + while (ABS(j - TIME) < t) do od; + END; + + + (*--------------------------------------------------------------*) + (* PROCEDURE li‚es la gestion du MENU Principal *) + (*--------------------------------------------------------------*) + + UNIT menu : PROCEDURE ; + (* Appelle les m‚thodes correspondantes au choix de l'utilisateur *) + + VAR boucle : BOOLEAN; + + BEGIN + boucle := TRUE; + WHILE (boucle) + DO + CALL eff; + WRITELN; + WRITELN (" ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿"); + WRITELN (" ³ M E N U ³"); + WRITELN (" ³ ³"); + WRITELN (" ³ 'BACKTRACKING INTELLIGENT' ³"); + WRITELN (" ³ ³"); + WRITELN (" ³ ³"); + WRITELN (" ³ 0.......... QUITTER ³"); + WRITELN (" ³ ³"); + WRITELN (" ³ ³"); + WRITELN (" ³ 1 ..... Gestion du planning de la ³"); + WRITELN (" ³ semaine. ³"); + WRITELN (" ³ ³"); + WRITELN (" ³ 2 ..... ProblŠme des pions noirs ³"); + WRITELN (" ³ et blancs. ³"); + WRITELN (" ³ ³"); + WRITELN (" ³ ³"); + WRITELN (" ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ"); + WRITELN;WRITELN; + WRITE (" Entrez votre choix : "); + READLN (choix); + + CASE choix + WHEN 0 : boucle := FALSE; + + WHEN 1 : CALL eff; + r := NEW SEM; + + WHEN 2 : CALL eff; + pi := NEW pion; + ESAC; + choix := 0; + OD; + END menu; + +(***************************************************************************) +(* LA PARTIE GESTION DU PLANNING DE LA SEMAINE *) +(* *) +(* il s'agit ici de la DECLARATION de l'objet SEM *) +(* (utilise la bibliothŠque Graphique IIugraph) *) +(***************************************************************************) + + + UNIT SEM : IIuwgraph CLASS; + + VAR i,cpt,ex,pl,et,arg,retour,val,N,N2,M : integer, + exercice,plaisir,argent,etude,interv,interv2,interv3 : integer, + MA,ME,JE,res : ARRAYOF integer, + L1,L2,V1,V2 : ARRAYOF ARRAYOF integer, + solution_possible : boolean; + + UNIT recurs : PROCEDURE(i : integer, res : ARRAYOF integer); + (* recurs est la proc‚dure principale, appel‚e de fa‡on recursive *) + (* afin de cr‚er l'arboresence de tous les cas possibles d'une *) + (* Gestion de Semaine. A l'interieur de cette proc‚dure nous avons *) + (* 6 autres sous_proc‚dures li‚es aux 6 premiers jours de la *) + (* semaine (LUNDI MARDI MERCREDI JEUDI VENDREDI). Chacune de ces *) + (* proc‚dures est propre … un test, … des affectation et … des *) + (* retours arriŠres particuliers. *) + (* Chaque solution trouv‚e est rang‚e dans le tableau 'res'. *) + + + + VAR j,w : integer; + + + UNIT lundi : PROCEDURE; + (* La proc‚dure lundi correspond en quelque sorte … la racine *) + (* de l'arbre de gestion de la semaine. Les affectations *) + (* touchent ici les exercices, le plaisir, et l'argent. De plus *) + (* on gŠre, grace … la variable retour, les retours arriŠres *) + (* afin de calculer les branches de l'arbre … ‚laguer. *) + + + BEGIN + FOR w := 1 TO N + DO + FOR j := 1 TO M + DO + (* on initialise les variables de travail li‚es + aux exercices, aux plaisirs, et … l'argent *) + ex := 0; pl := 0; arg := 0; et := 0; + res(i) := L1(2,w); + res(i+1) := L2(2,j); + res(i+2) := L1(1,w) + L2(1,j); + (* On incr‚mente les variables de travail *) + ex := ex + res(i); + pl := pl + res(i+1); + arg := arg + res(i+2); + + (* appel de la procedure recurs correspondant au mardi *) + CALL recurs(i+1,res); + + (* On decrement les variable de travail *) + ex := ex - res(i); + pl := pl - res(i+1); + arg := arg - res(i+2); + + (* retour = 4 ou 5 correspond au vendredi *) + IF retour = 4 THEN w := (exercice - val)/interv2; + j := M; + FI; + IF retour = 5 THEN j := (plaisir - val); + FI; + retour := 0; + + OD; + OD; + solution_possible := FALSE; + END lundi; + + UNIT mardi : PROCEDURE; + (* La proc‚dure mardi correspond … la seconde tranche de l'arbre*) + (* de gestion de la semaine. Les affectations touchent ici les *) + (* ‚tudes. *) + (* On gŠre, grace … la variable retour, les retours arriŠres du *) + (* mercredi afin de calculer les branches de l'arbre … ‚laguer. *) + + BEGIN + FOR w := 1 TO N + DO + res(i+2) := MA(w); + et := 0; + IF retour = 0 THEN + (* On incremente les variable de travail *) + et := et + res(i+2); + + (* appel de la procedure recurs correspondant au mercredi *) + CALL recurs(i+1,res); + + (* On decremente les variable de travail *) + et := et - res(i+2); + FI; + (* retour = 2 correspond au mercredi *) + IF retour = 2 THEN w := (etude - val)/interv; + IF w >= N THEN retour := 1; + ELSE retour := 0; + FI; + FI; + OD; + solution_possible := FALSE; + END mardi; + + + + UNIT mercredi : PROCEDURE; + (* La proc‚dure mercredi correspond … la troisiŠme tranche de *) + (* l'arbre de gestion de la semaine. Les affectations touchent *) + (* ici les ‚tudes. *) + (* On gŠre, grace … la variable retour, les retours arriŠres du *) + (* jeudi afin de calculer les branches de l'arbre … ‚laguer. *) + + BEGIN + FOR w := 1 TO N + DO + res(i+2) := ME(w); + IF retour = 0 THEN + (* On incremente les variable de travail *) + et := et + res(i+2); + + (* appel de la procedure recurs correspondant au jeudi *) + CALL recurs(i+1,res); + + (* On decremente les variable de travail *) + et := et - res(i+2); + FI; + (* retour = 3 correspond au jeudi *) + IF retour = 3 THEN w := (etude - val)/interv; + IF w >= N THEN retour := 2; + val := val + ME(N); + ELSE retour := 0; + FI; + FI; + OD; + solution_possible := FALSE; + END mercredi; + + + UNIT jeudi : PROCEDURE; + (* La proc‚dure jeudi correspond … la quartriŠme tranche de *) + (* l'arbre de gestion de la semaine. Les affectations touchent *) + (* ici les ‚tudes. *) + (* On gŠre, grace … la variable retour, les retours arriŠres du *) + (* jeudi au mercredi afin de calculer les branches de l'arbre … *) + (* ‚laguer. *) + + BEGIN + FOR w := 1 TO N + DO + res(i+2) := JE(w); + IF retour = 0 THEN + (* On incremente les variable de travail *) + et := et + res(i+2); + IF et < etude THEN + (* si aucun cas n'est trouv‚ on indique un + retour arriŠre et on calcul grace … la + variable val et a l'indice de boucle w + les branches … ‚laguer. *) + + IF w = N THEN retour := 3; + val := et; + ELSE w := (etude - et)/interv; + IF w>=N THEN w := N - 1 FI; + FI; + ELSE + (* appel de la procedure recurs correspondant + au vendredi *) + CALL recurs(i+1,res); + FI; + (* On decremente les variable de travail *) + et := et - res(i+2); + FI; + OD; + solution_possible := FALSE; + END jeudi; + + + UNIT vendredi : PROCEDURE; + (* La proc‚dure vendredi correspond … la cinquiŠme tranche de *) + (* l'arbre de gestion de la semaine. Les affectations touchent *) + (* ici les exercices, le plaisir, et l'argent. *) + (* On gŠre, grace … la variable retour, les retours arriŠres du *) + (* lundi afin de calculer les branches de l'arbre … ‚laguer. *) + + BEGIN + FOR w := 1 TO N + DO + FOR j := 1 TO M + DO + res(i+2) := V1(2,w); + res(i+3) := V2(2,j); + res(i+4) := V1(1,w) + V2(1,j); + (* On incremente les variable de travail *) + ex := ex + res(i+2); + pl := pl + res(i+3); + arg := arg + res(i+4); + IF arg > argent THEN j := M; + ELSE + IF ex < exercice THEN + (* si aucun cas n'est trouv‚ on indique un + retour arriŠre et on calcul grace … la + variable val et … l'indice de boucle w + les branches … ‚laguer. *) + + IF w = N THEN retour := 4; + val := ex; + exit; + ELSE w := ((exercice - ex)/interv2); + IF w >= N THEN w := N-1 FI; + j := M; + FI + ELSE + IF pl < plaisir THEN + (* si aucun cas n'est trouv‚ on indique un + retour arriŠre et on calcul grace … la + variable val et a l'indice de boucle j + les branches … ‚laguer. *) + + IF j = M THEN retour := 5; + val := pl; + ELSE j := (plaisir - pl)/interv3; + FI; + (* appel de la procedure recurs correspondant + … une solution trouv‚e *) + ELSE CALL recurs(i+1,res); + FI + FI + FI; + (* On decremente les variable de travail *) + ex := ex - res(i+2); + pl := pl - res(i+3); + arg := arg - res(i+4); + OD; + OD; + solution_possible := FALSE; + END vendredi; + + + + BEGIN + + retour := 0; + solution_possible := TRUE; + + CASE i + + WHEN 1 : CALL lundi; + + WHEN 2 : CALL mardi; + + WHEN 3 : CALL mercredi; + + WHEN 4 : CALL jeudi; + + WHEN 5 : CALL vendredi; + + ESAC; + + (* si une solution est trouv‚e on l'imprime … l'‚cran *) + IF solution_possible THEN CALL imprim(res) FI; + + END recurs; + + + (*------------------------------------------------------------------*) + (* PROCEDURE li‚es la gestion du MENU de la Gestion de la Semaine *) + (*------------------------------------------------------------------*) + + UNIT menu_ps : PROCEDURE; + VAR i : integer; + + BEGIN + WRITELN(" ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ "); + WRITELN(" ³ PLANNING DE LA SEMAINE AVEC CONTRAINTES ³ "); + WRITELN(" ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ "); + WRITELN(" Chaque jour implique un choix particulier :"); + WRITELN; + WRITELN(" * LUNDI :"); + FOR i := 1 TO N DO + WRITE(" $",L1(1,i):2," Exercice ",L1(2,i):2); + IF i > M THEN WRITELN; + ELSE WRITELN(" $",L2(1,i):2," Plaisir ",L2(2,i)); + FI; + OD; + WRITELN; + WRITELN(" * MARDI MERCREDI JEUDI :"); + FOR i := 1 TO N DO + WRITELN(" Etude ",MA(i):2," ",ME(i):2," ",JE(i)); + OD; + WRITELN; + WRITELN(" * VENDREDI :"); + FOR i := 1 TO N DO + WRITE(" $",V1(1,i):2," Exercice ",V1(2,i):2); + IF i > M THEN WRITELN; + ELSE WRITELN(" $",V2(1,i):2," Plaisir ",V2(2,i)); + FI; + OD; + WRITELN; + WRITE(" CONTRAINTES : "); + WRITE(" Exercice >= ",exercice:2," Argent ($) =< ",argent:2); + WRITELN(" Etude >= ",etude:2," Plaisir >= ",plaisir:2); + touche := Getcar; + END; + + + + (*---------------------------------------------------------------------*) + (* PROCEDURES li‚es la gestion de l'AFFICHAGE … l'‚cran des resultats *) + (*---------------------------------------------------------------------*) + + + UNIT imprim : PROCEDURE(res : ARRAYOF integer); + (* La proc‚dure imprim permet d'afficher toutes les solutions *) + (* possibles (les unes a la suite des autres) pages par pages … *) + (* l'‚cran, sous forme de tableau de resultat. *) + + VAR j : integer; + + BEGIN + IF cpt = 0 THEN CALL eff; + (* affichage de l'entete … l'‚cran *) + CALL entete; + FI; + WRITE ("³",res(1):4,"³",res(2):4,"³",res(3):4); + WRITE ("³",res(4):6," ³",res(5):6," ³",res(6):6); + WRITE (" ³",res(7):4,"³",res(8):4,"³",res(9):4); + WRITE ("º",ex:4,"³",pl:4,"³",arg:4,"³",et:4,"³"); + WRITELN; + cpt := cpt + 1; + IF cpt = 16 THEN WRITELN ("Appuyez sur une touche pour continuer..."); + touche := Getcar; + cpt := 0; + FI; + + END imprim; + + + UNIT entete : PROCEDURE; + (* Affiche l'entete du tableau de resultat … l'‚cran. *) + BEGIN + WRITELN("CONTRAINTES : "); + WRITE("Exercice >= ",exercice:2," Argent ($) =< ",argent:2); + WRITELN(" Etude >= ",etude:2," Plaisir >= ",plaisir:2); + WRITE("ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÂÄÄÄÄÄ"); + WRITELN("ÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄËÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿"); + WRITE("³ LUNDI ³ MARDI ³MERCREDI³ JEUD"); + WRITELN("I ³ VENDREDI º TOTAL ³"); + WRITE("ÃÄÄÄÄÂÄÄÄÄÂÄÄÄÄÅÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÅÄÄÄÄÄ"); + WRITELN("ÄÄÄÅÄÄÄÄÂÄÄÄÄÂÄÄÄÄÎÄÄÄÄÂÄÄÄÄÂÄÄÄÄÂÄÄÄÄ´"); + WRITE("³Exer³Plai³ $ ³ Etude ³ Etude ³ Etud"); + WRITELN("e ³Exer³Plai³ $ ºExer³Plai³ $ ³Etud³"); + WRITE("ÃÄÄÄÄÅÄÄÄÄÅÄÄÄÄÅÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÅÄÄÄÄÄ"); + WRITELN("ÄÄÄÅÄÄÄÄÅÄÄÄÄÅÄÄÄÄÎÄÄÄÄÅÄÄÄÄÅÄÄÄÄÅÄÄÄÄ´"); + END entete; + + + UNIT fin : PROCEDURE; + (* Affiche la fin du tableau de resultat … l'‚cran. *) + + BEGIN + WRITE("ÀÄÄÄÄÁÄÄÄÄÁÄÄÄÄÁÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÁÄÄÄÄÄ"); + WRITELN("ÄÄÄÁÄÄÄÄÁÄÄÄÄÁÄÄÄÄÁÄÄÄÄÁÄÄÄÄÁÄÄÄÄÁÄÄÄÄÙ"); + WRITELN ("Appuyez sur une touche pour continuer..."); + touche := Getcar; + END fin; + + + BEGIN + PREF IIUWGraph block; + BEGIN + (* Initialisation des tableaux et des variables de JEUX D'ESSAI *) + + N := 4; + M := 3; + N2 := 2; + (* D‚claration d'intervalles *) + interv := 2; + interv2 := 5; + interv3 := 1; + ARRAY res DIM (1:9); + ARRAY L1 DIM (1:N2); + FOR i := 1 TO N2 + DO + ARRAY L1(i) DIM (1:N); + OD; + ARRAY L2 DIM (1:N2); + FOR i := 1 TO N2 + DO + ARRAY L2(i) DIM (1:M); + OD; + ARRAY MA DIM (1:N); + ARRAY ME DIM (1:N); + ARRAY JE DIM (1:N); + ARRAY V1 DIM (1:N2); + FOR i := 1 TO N2 + DO + ARRAY V1(i) DIM (1:N); + OD; + ARRAY V2 DIM (1:N2); + FOR i := 1 TO N2 + DO + ARRAY V2(i) DIM (1:M); + OD; + + (* Initialisation des tableaux jeux d'essai du mardi,mercredi et + jeudi concernant les ‚tudes. *) + + FOR i := 1 TO N + DO + MA(i),ME(i),JE(i) := (i-1) * interv; + OD; + + (* Initialisation des tableaux jeux d'essai du lundi et vendredi + concernant l'argent. *) + + L1(1,1),V1(1,1) := 0; + L1(1,2),V1(1,2) := 0; + L1(1,3),V1(1,3) := 0; + L1(1,4),V1(1,4) := 20; + + (* Initialisation des tableaux jeux d'essai du lundi et vendredi + concernant les exercices. *) + + FOR i := 1 TO N + DO + L1(2,i),V1(2,i) := (i-1) * interv2; + OD; + + (* Initialisation des tableaux jeux d'essai du lundi et vendredi + concernant les plaisirs ou divertissements. *) + + L2(1,1),V2(1,1) := 0; + L2(1,2),V2(1,2) := 0; + L2(1,3),V2(1,3) := 20; + + FOR i := 1 TO M + DO + L2(2,i),V2(2,i) := (i-1) * interv3; + OD; + + (* Les contraintes d'une semaine ‚quilibr‚e sont les suivantes : *) + + argent := 30; + etude := 14; + exercice := 20; + plaisir := 2; + + cpt := 0; + CALL GRON(1); + CALL menu_ps; + CALL recurs(1,res); + CALL fin; + CALL GROFF; + END; + END SEM; + + + +(***************************************************************************) +(* LA PARTIE GESTION DU JEU DES PIONS NOIRS ET BLANCS *) +(* *) +(* il s'agit ici de la DECLARATION de l'objet PION *) +(* (utilise la bibliothŠque Graphique IIugraph) *) +(***************************************************************************) + + + UNIT PION : IIuwgraph CLASS; + + VAR n,i,M : integer, + tab : ARRAYOF char, + trouve,manuel: boolean; + + + UNIT procent : PROCEDURE(A,B : char, P,NN : integer); + (* La procedure procent permet de parcourir l'arbre des solutions *) + (* en anticipant le meilleur des chemins c'est a dire en parcourant*) + (* le moins de chemin possible. *) + (* Les paramŠtres d'entr‚s A et B prennent soit la valeur Noir et *) + (* Blanc ou Blanc et Noir. Idem pour les 2 entier P et NN qui *) + (* prennent en fonction de la couleur des pions soit la valeur 1 et*) + (* M (2*n+1) ou -1 et 1. (P indique le sens de deplacement). *) + + VAR bo : boolean, + j, k : integer; + + UNIT proc : PROCEDURE(X : char); + (* La proc‚dure proc permet de connaitre si l'on se trouve dans *) + (* position de blocage ou bien si l'on peut continuer dans ce *) + (* chemin. (Cas o— l'on place un pion … cot‚ d'un autre pion de *) + (* mˆme couleur). *) + + BEGIN + bo := TRUE; + k := 2; + j := i + 2*P; + IF (j >= 1) AND (j <= M) THEN + WHILE ((bo) AND (j <> NN+P)) + DO + (* On test si tous les pions suivants sont + de mˆme couleur. Si oui alors on poursuit + le chemin dans l'arbre, sinon on se trouve + bloqu‚. *) + + IF tab(j) <> X THEN bo := FALSE; + ELSE k := k + 1; + FI; + j := j + P; + OD; + FI; + END proc; + + + UNIT affect2 : PROCEDURE; + (* La proc‚dure affect2 permet de d‚placer un pion en sautant *) + (* par dessus un pion de couleur adverse. *) + (* Le sens du d‚placement ‚tant indiquer par l'entier P. *) + + BEGIN + tab(i) := tab(i-2*P); + tab(i-2*P) := ' '; + i := i - 2*P; + (* appel de la proc‚dure principale tentative *) + CALL tentative; + i := i + 2*P; + tab(i-2*P) := tab(i); + tab(i) := ' '; + END affect2; + + + + UNIT affect1 : PROCEDURE; + (* La procedure affect1 permet de d‚placer un pion d'une *) + (* case en avant (pion avance dans la case vide). *) + (* Le sens du d‚placement ‚tant indiquer par l'entier P. *) + + BEGIN + tab(i) := tab(i-P); + tab(i-P) := ' '; + i := i - P; + (* appel de la proc‚dure principale tentative *) + CALL tentative; + i := i + P; + tab(i-P) := tab(i); + tab(i) := ' '; + END affect1; + + + + BEGIN + (* On test si l'on se trouve en bordures du jeux (du tableau) + C'est a dire que l'on verifie que les indices de tables + sont toujours valide pour continuer les tests suivants. *) + IF ((i-P) > 0) AND ((i-P) <= M) THEN + + (* On test si l'on peut avancer le pion dans la case vide en + fonction de P (indique le sens du d‚placement). *) + IF tab(i-P) = A THEN + + (* On test si l'on se trouve en bordures du jeux, en + fonction du sens du d‚pacement. *) + IF ((i+P) > 0) AND ((i+P) <= M) THEN + + (* On test si le pion situ‚ aprŠs la case vide est de + mˆme couleur que celui plac‚ avant. *) + IF tab(i+P) = A THEN + (* Si oui on appele la proc‚dure proc *) + CALL proc(A); + (* On test si l'on poursuit le chemin *) + IF bo THEN + CALL affect1; + (* On test si l'on se trouve dans + l'‚tat final du jeux. (k=n) *) + IF k = n THEN trouve := FALSE FI; + IF trouve THEN CALL aff_retour_ar FI; + FI; + ELSE + (* Sinon on appele la proc‚dure d'affectation + affect1, et on poursuit le chemin. *) + CALL affect1; + IF trouve THEN CALL aff_retour_ar FI; + FI; + ELSE + (* Sinon on appele la proc‚dure d'affectation affect1 *) + CALL affect1; + IF trouve THEN CALL aff_retour_ar FI; + FI; + ELSE + + (* On test si l'on se trouve en bordures du jeux (du tableau) + C'est a dire que l'on verifie que les indices de tables + sont toujours valide pour continuer les tests suivants. *) + IF ((i-2*P) > 0) AND ((i-2*P) <= M) THEN + + (* On test si l'on peut avancer le pion plac‚ 2 cases + avant la case vide en sautant un pion de couleur + adverse plac‚ une case avant la case vide, toujours + en fonction du sens P. *) + IF (tab(i-2*P) = A) AND (tab(i-P) = B) THEN + + (* On test si l'on se trouve en bordures du jeux, en + fonction du sens du d‚pacement. *) + IF ((i+P) > 0) AND ((i+P) <= M) THEN + + (* On test si le pion situ‚ aprŠs la case vide + est de mˆme couleur que celui plac‚ 2 cases + avant la case vide. *) + IF tab(i+P) = A THEN + (* Si oui on appele la proc‚dure proc *) + CALL proc(A); + (* On test si l'on poursuit le chemin *) + IF bo THEN + CALL affect2; + (* On test si l'on se trouve dans + l'‚tat final du jeux. (k=n) *) + IF k = n THEN trouve := FALSE; FI; + IF trouve THEN CALL aff_retour_ar FI; + FI; + ELSE + (* Sinon appel de la proc‚dure d'affectation + affect2, et on poursuit le chemin. *) + CALL affect2; + IF trouve THEN CALL aff_retour_ar FI; + FI; + ELSE + (* appel de la proc‚dure d'affectation affect2 *) + CALL affect2; + IF trouve THEN CALL aff_retour_ar FI; + FI; + FI; + FI; + FI; + FI; + END procent; + + + + + UNIT tentative : PROCEDURE; + (* Cette proc‚dure permet de parcourir l'arbre du jeux des pions. *) + (* En faisant d'abord avancer les pions Noirs puis les pions Blancs*) + (* Tant que l'‚tat final n'est pas atteint on affiche l'‚volution *) + (* du d‚placement dans l'arbre. *) + + BEGIN + IF trouve THEN + CALL cls; + (* On imprime le resultat a l'instant t *) + CALL imprim; + (* On d‚place les pions Noirs *) + CALL procent('N','B',1,M); + (* On d‚place les pions Blancs *) + CALL procent('B','N',-1,1); + + FI; + END tentative; + + + + (*---------------------------------------------------------------------*) + (* PROCEDURES li‚es la gestion de l'AFFICHAGE … l'‚cran des resultats *) + (*---------------------------------------------------------------------*) + + + UNIT aff_retour_ar : PROCEDURE; + (* Proc‚dure permettant d'indiquer … l'‚cran que l'on effectue *) + (* un retour arriŠre (BACKTRACKING). *) + + BEGIN + CALL CLS; + CALL move(150,220); CALL draw(360,220); + CALL move(150,260); CALL draw(360,260); + CALL move(150,220); CALL draw(150,260); + CALL move(360,220); CALL draw(360,260); + CALL move(180,237); + CALL outstring("RETOUR ARRIERE ..."); + CALL imprim; + END; + + + + + UNIT imprim : PROCEDURE; + (* Proc‚dure permettant d'afficher de maniŠre graphique les *) + (* pions Noirs et Blancs dans un tableaux proportionnel au *) + (* nombre de pions. *) + (* Les proc‚dures graphiques utilis‚es : outstring, move, draw *) + (* cirb. *) + + VAR l,col,xi,touche : integer; + + BEGIN + CALL move(100,10); + CALL outstring("LE PROBLEME DES PIONS NOIRS ET BLANCS"); + + (* Affichage du tableau de jeux *) + CALL move(70,80); CALL draw(70+60*(2*n+1),80); + CALL move(70,120); CALL draw(70+60*(2*n+1),120); + FOR l := 0 TO ((n+1)*2-1) DO + CALL move(70+(60*l),80); CALL draw(70+(60*l),120); + OD; + + (* Affichage des pions Noirs et Blancs *) + FOR l := 1 TO M + DO + xi := 100 + ((l-1) * 60); + IF tab(l) <> ' ' + THEN IF tab(l) = 'B' THEN col := 15; + ELSE col := 0; + FI; + CALL cirb(xi,100,20,10,10,15,col,2,2); + FI; + OD; + IF manuel THEN + CALL move(50,300); + CALL outstring("Appuyez sur une touche pour continuer..."); + touche := Getcar; + ELSE CALL attendre(2); + FI; + END imprim; + + + UNIT menu_p : PROCEDURE; + VAR choix : integer; + + BEGIN + manuel := TRUE; + CALL eff; + WRITELN(" ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ "); + WRITELN(" ³ PROBLEME DES PIONS NOIRS ET BLANCS ³ "); + WRITELN(" ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ "); + WRITELN; WRITELN; + WRITELN (" A partir d'un etat initial qui est le suivant :"); + WRITELN (" NNN*BBB"); + WRITELN (" Il faut aboutir … un etat final qui est le suivant :"); + WRITELN (" BBB*NNN"); + WRITELN; + WRITELN (" Sachant que l'on … des rŠgles fix‚es :"); + WRITELN (" ÄÄ> <ÄÄ"); + WRITELN (" - Les sens sont fix‚s : NNN*BBB"); + WRITELN (" - Un pion peut avancer dans une case vide '*' si :"); + WRITELN (" * Elle est juste devant. "); + WRITELN (" * Il l'atteint en sautant par dessus un pion"); + WRITELN (" de couleur adverse."); + WRITELN; + WRITELN (" D‚sirez vous un traitement :"); + WRITELN; + WRITELN (" 1 ......... MANUEL"); + WRITELN (" 2 ......... AUTOMATIQUE"); + WRITELN; + WRITE (" Votre choix : "); + READLN (choix); + IF choix = 2 THEN manuel := FALSE FI; + CALL eff; + WRITELN; WRITELN; WRITELN; WRITELN; + n := 0; + WHILE ((n < 2) OR (n > 4)) + DO + WRITE(" Donnez le Nombre de Pions (2,3 ou 4) : "); + READLN (n); + OD; + END; + + + + BEGIN + (* On utilise pour repr‚senter de fa‡on graphique … l'‚cran les pions *) + (* Noirs et Blancs la Biblioth‚que graphique IIugraph. *) + + PREF IIUWGraph block; + BEGIN + CALL GRON(1); + CALL menu_p; + + (* initialisation … l'‚tat initial du tableau de jeux en fonction *) + (* du nombres de pions entr‚s pr‚alablement. ex: NNN BBB *) + + ARRAY tab DIM (1:(n*2)+1); + + FOR i := 1 TO n DO tab(i) := 'N' OD; + tab(n+1) := ' '; + FOR i := (n+2) TO (n*2)+1 DO tab(i) := 'B' OD; + + i := n + 1; + + (* La variable M repr‚sente l'indice maximum du tableau du jeux *) + (* en fonction du nombres de pions. ex: si n=3 ÄÄ> M=7 *) + M := 2*n + 1; + + trouve := TRUE; + (* Appel de la proc‚dure principale 'tentative' de parcours + d'arbre. *) + CALL tentative; + CALL GROFF; + END; + END PION; + + + +(*******************************) +(*** PROGRAMME PRICIPAL *****) +(*******************************) + +BEGIN + (* Appel du menu principal *) + CALL menu; +END BACTRACKING; + \ No newline at end of file diff --git a/examples/apply/deriv.ccd b/examples/apply/deriv.ccd new file mode 100644 index 0000000000000000000000000000000000000000..122debac4d269dab8df34ce5d36aea7fd078a86f GIT binary patch literal 23664 zcmds93w%`7nLqQmcP8%ylJGFV6_Ga)Vi1%>M2IK~K@b%2u`vud2$PVRiTJ2uv{r4a zLSdy((QUPBx4YeQ?RUmdxz;edpYJ&z!k)XOdynUFJ8L zd(J)I_x-=e`Of2>3uE>_4_nPVYz}jh$gI0G2zuLQ%sko16ozt!rHa3ZbhRc;#m;B-Q-2+mx`i9g+4}xFdoMirIot zSGYSAqShy~1Gm4C2>rlk#Z0ia|Vwd+sQ4#P!cPN6s*$9uhL4dq+fW8*+8K(2D`Ox(YTSZu$KKV`9*>3Bf+0t+Wud4Q7aQPiTUT3q?6xidm_NRW z%ywTqVgo?ep|$P6U`I(}ZJM9#ICAG-&srnGCfp!x-5udBqru8VQQJD*7{qK+-kQ}9 zsO{0QyTRt0?lQs=3iwdHF(0~TcpY?eiZUNt-LMGqj)DImcm5o{``LV6-c7ZG{IlEU zG8z66m-#Km(q*j+m(5$exW!n|x@1XcX)vvwFOI^viM=Ed95NYcP*4uwW!LYvVO>oF*qhS&s_?~pTwVb&#S zYeF!XuIVvg#sJ+}ur>z3YoV!wtmndnn6^Sdebun-$fo~~%%ivp1_dfuR6?F9xTvb9n zw(ziz{G}l8u)l<^kq2Hg_A&iELVxWxW<9^lTOPJJFg8^~Zk+0ibd9LE79UC)9U


    cDII7*E-AJ`# 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 literal 0 HcmV?d00001 diff --git a/examples/apply/deriv.log b/examples/apply/deriv.log new file mode 100644 index 0000000..fccfe2b --- /dev/null +++ b/examples/apply/deriv.log @@ -0,0 +1,747 @@ +PROGRAM DERIVATION; + +(**********************************************************) +(* permet de saisir caractŠre par caractŠre *) + + UNIT readkey : IIUWgraph function : integer; + begin + do + result := inkey; + if result > 0 then exit fi + od + end readkey; + + unit gotoxy : procedure(lig, col : integer); + var c,d,e,f : char, + i,j : integer; + begin + i := lig div 10; j := lig mod 10; + c := chr(48+i); d := chr(48+j); + i := col div 10; j := col mod 10; + e := chr(48+i); f := chr(48+j); + write( chr(27), "[", c, d, ";", e, f, "H") + end gotoxy; + + Unit mesg : procedure (message1, message2 : string); + begin + call gotoxy(23,1); + write(message1); + call gotoxy(24,1); + write(message2); + return; + end mesg; + + Unit charint : function (c : char) : integer; + begin + result := ord(c) - 48 ; + end charint; + +(**********************************************************) +(* UNITE IMPLANTATION DES PILES POUR EMPILER LES OPERANDES *) + + UNIT pile1 : class; + const max = 100; + var premier : integer, + stack : arrayof expr; + + UNIT empiler : procedure (car : expr); + BEGIN + premier := premier + 1; + stack(premier) := car; + call display("stak = ",stack(premier)); + END empiler; + + UNIT empty : function : boolean; + BEGIN + result := premier = 0; + END EMPTY; + + UNIT sommet : function: expr; + BEGIN + IF not empty then result := stack(premier); + (* else call error (raise pile-vide) *) + FI; + END sommet; + + UNIT depiler : procedure; + BEGIN + IF not empty then premier := premier - 1; + writeln(premier); + FI; + END depiler; + +BEGIN + premier := 0; + array stack dim (1 : max); +END pile1; + +(**********************************************************) +(* UNITE IMPLANTATION DES PILES POUR LES OPERATEURS *) + + UNIT pile2 : class; + const max = 100; + var premier : integer, + stack : arrayof char; + + + UNIT empiler : procedure (car : char); + BEGIN + premier := premier + 1; + stack(premier) := car; + END empiler; + + UNIT empty : function : boolean; + BEGIN + result := premier = 0; + END EMPTY; + + UNIT sommet : function: char; + BEGIN + IF not empty then result := stack(premier); + (* else call error (raise pile-vide) *) + FI; + END sommet; + + UNIT depiler : procedure; + BEGIN + IF not empty then premier := premier - 1; + writeln(premier); + FI; + END depiler; +BEGIN + premier := 0; + array stack dim (1 : max); +END pile2; + + +UNIT EXPR:CLASS; (* OUR FUNCTIONS WILL BE EXPRESSIONS *) + UNIT VIRTUAL DERIV:FUNCTION(X:VARIABLE):EXPR; + END DERIV; +END EXPR; + + UNIT VARIABLE:EXPR CLASS(ID:char); + (* DIFFERENTIATED EXPRESSION WILL OBVIOUSLY CONSIST OF VARIABLES*) + UNIT VIRTUAL DERIV:FUNCTION(X:VARIABLE):EXPR; + BEGIN + writeln("je suis dans variable"); + IF X.ID=ID THEN + RESULT:=ONE + ELSE + RESULT:=ZERO + (*THIS IS THE DERIVATIVE OF A VARIABLE + OTHER THEN X WITH RESPECT TO X *) + FI + END DERIV; + END VARIABLE; + + (* DIFFERENTIATION OF A FUNCTION OF A VARIABLE X *) + + + UNIT CONSTANT:EXPR CLASS(K:REAL); + (* DIFFERENTIATED EXPRESSION WILL CONSIST OF CONSTANT *) + UNIT VIRTUAL DERIV:FUNCTION(X:VARIABLE):EXPR; + BEGIN + writeln("je suis dans constant "); + RESULT:=ZERO; + END DERIV; + END CONSTANT; + + UNIT PAIRE:EXPR CLASS(L,R:EXPR); + (* WE WILL ALSO COMPUTE DERIVATIVES OF EXPRESSIONS WITH TWO + ARGUMENT OPERATORS *) + UNIT VIRTUAL DERIV: FUNCTION(X:VARIABLE):EXPR; + END; + END PAIRE; + + + UNIT SOMME : PAIRE CLASS; + (* WE DIFFERENTIATE THE SUM OF TWO EXPRESSIONS *) + UNIT VIRTUAL DERIV:FUNCTION(X:VARIABLE):EXPR; + VAR LPRIM,RPRIM:EXPR; + BEGIN + writeln("je suis sum"); + LPRIM:=L.DERIV(X); + RPRIM:=R.DERIV(X); + (*WE DELETE 0 AS THE NEUTRAL ELEMENT OF + ADDITION *) + IF LPRIM=ZERO THEN + RESULT:=RPRIM + ELSE + IF RPRIM=ZERO THEN + RESULT:=LPRIM + ELSE + RESULT:=NEW SOMME(LPRIM,RPRIM) + FI + FI; + END DERIV; + END SOMME; + + + UNIT DIFF:PAIRE CLASS; + (* WE DIFFERENTIATE THE DIFFERECE OF TWO EXPRESSIONS *) + UNIT VIRTUAL DERIV:FUNCTION(X:VARIABLE):EXPR; + VAR LPRIM,RPRIM: EXPR; + BEGIN + LPRIM:=L.DERIV(X); + RPRIM:=R.DERIV(X); + (* WE DELETE THE SUBTRACTED ZERO *) + IF RPRIM=ZERO THEN + RESULT:=LPRIM + ELSE + RESULT:=NEW DIFF(LPRIM,RPRIM) + FI + END DERIV; + END DIFF; + + UNIT PRODUIT : paire class; + UNIT VIRTUAL deriv : function (X : variable) : expr; + VAR UPRIMV, UVPRIM : expr; + BEGIN + UPRIMV := new produit(L.deriv(X), R); + UVPRIM := new produit(L, R.deriv(x)); + result := new somme (UPRIMV, UVPRIM); + END DERIV; + END PRODUIT; + + UNIT DIVISE : PAIRE class; + UNIT virtual deriv : function (X : variable): expr; + VAR UPRIMV, UVPRIM, VCARRE, NUMERA : EXPR; + BEGIN + UPRIMV := new produit (L.deriv(X), R); + UVPRIM := new produit (L, R.deriv(X)); + NUMERA := new diff (UPRIMV, UVPRIM); + VCARRE := new produit (R, R); + result := new divise (NUMERA, VCARRE); + END DERIV; + END DIVISE; + + UNIT SINUS : EXPR class (L : EXPR); + UNIT virtual deriv : function (X:variable) : expr; + VAR LPRIM : EXPR; + BEGIN + LPRIM := new cosinus (L); + result := new produit (L.deriv(X), LPRIM); + END deriv; + END sinus; + + UNIT cosinus : expr class (L:expr); + UNIT virtual deriv : function (X:variable) : expr; + VAR LPRIM : expr; + BEGIN + LPRIM := new produit (new constant(-1), new sinus (L)); + result := new produit (L.deriv(X) , LPRIM); + END deriv; + END cosinus; + + UNIT LOGN : expr class (L : expr); + UNIT virtual deriv : function (X:variable): expr; + BEGIN + result := new divise (L.DERIV(X), L); + END DERIV; + END logn; + + UNIT expon : expr class (L:expr); + UNIT virtual deriv : function(X : variable) : expr; + BEGIN + result := new produit (L.deriv(X), L); + END deriv; + END expon; + + UNIT racine : expr class (L:expr); + UNIT virtual deriv : function (X : variable) : expr; + VAR prod, rac : expr; + BEGIN + RAC := new racine(L); + prod := new produit (new constant (2), rac); + result := new diff(L.deriv(X), prod); + END deriv; + END racine; + + + UNIT DISPLAY:PROCEDURE(T:STRING,E:EXPR); + (* DISPLAY THE EXPRESSION TREE IN A READABLE FORM *) + + UNIT SCAN:PROCEDURE(E:EXPR); + BEGIN + IF E IS SOMME THEN + WRITE(" ("); CALL SCAN(E QUA PAIRE.L); + WRITE("+"); + CALL SCAN(E QUA PAIRE.R); + WRITE(" )"); + ELSE + IF E IS DIFF THEN + WRITE(" ("); + CALL SCAN(E QUA PAIRE.L);WRITE("-"); + CALL SCAN(E QUA PAIRE.R); + WRITE(" )") + ELSE + IF E is PRODUIT then + write(" ("); + call scan (E QUA PAIRE.L); + write("*"); + call scan (E QUA PAIRE.R); + write(" )"); + ELSE + IF E IS DIVISE then + write(" ("); + call scan (E QUA PAIRE.L); + write("/"); + call scan (E QUA PAIRE.R); + write(" )"); + ELSE + IF E IS SINUS then + write(" ( sin("); + call scan (E QUA SINUS.L); + write(" )"); + ELSE + IF E IS COSINUS then + write(" ( cos("); + call scan (E QUA COSINUS.L); + write(" )"); + ELSE + IF E IS LOGN then + write(" ( LN("); + call scan (E QUA LOGN.L); + write(" )"); + ELSE + IF E IS EXPON then + write(" ( EXP("); + call scan (E QUA EXPON.L); + write(" )"); + ELSE + IF E IS RACINE then + write(" ( û ("); + call scan (E QUA RACINE.L); + write(" )"); + ELSE + IF E IS CONSTANT THEN + WRITE(E QUA CONSTANT.K:6:2) + ELSE + IF E IS VARIABLE THEN + WRITE(E QUA VARIABLE.ID); + FI FI FI FI FI FI FI FI FI FI FI; + END SCAN; + + BEGIN + WRITE(T); + CALL SCAN(E); + WRITELN; + END DISPLAY; + + +(*********************************************************) +(******* calcul de la d‚riv‚e **********) +(******* les op‚rateurs vont dans P2 ****) +(******* et les op‚randes vont dans P1 ****) + +UNIT expderivee : procedure (express : arrayof char, + taille : integer); + CONST max = 100; + VAR opaux , c: char, + P1 : pile1, + P2 : pile2, + const1, auxreel : real, + decim, saisie : boolean, + X, Y, Z, T , arg1, arg2, consta, E,U,V, F : expr, + compt, j, cptcons : integer; + + BEGIN + compt := 0; + P1 := new pile1; + P2 := new pile2; + decim, saisie := false; + FOR j := 1 to taille + do + write(express(j)); + od; + j := 1; + DO + if j = taille + 1 then exit fi; + case express(j) + when '(' : j := j + 1; + + when 'X','x': X := new variable('X'); + call P1.empiler(X); + j := j + 1; + + when 'Y','y': E := new variable('Y'); + call P1.empiler(E); + j := j + 1; + + when 'Z','z': E := new variable('Z'); + call P1.empiler(E); + j := j + 1; + + when 'T','t': E := new variable('T'); + call P1.empiler(E); + j := j + 1; + + when '0','1','2','3','4','5','6','7','8','9','.' : + cptcons := 100; + auxreel := charint(express(j)); + const1 := auxreel * cptcons; + j := j + 1; + writeln("j = ",j); + writeln("avant test"); + while not saisie do + writeln("dans test"); + c := express(j); + IF (c = '0' or c = '1' or c = '2' or c='3' + or c='4' or c='5' or c= '6' or c = '7' or + c = '8' or c='9') + THEN + writeln("test0"); + cptcons := cptcons div 10; + auxreel := charint(express(j)); + const1 := const1 + (auxreel * cptcons); + j := j + 1; + ELSE + IF ( c ='.' ) + THEN writeln("test1"); + const1 := const1 / cptcons; + cptcons := 1; + j := j + 1; + decim := true; + ELSE + writeln("test2"); + IF not decim then const1 := const1 / cptcons;FI; + E := new constant (const1); + writeln("avant empile"); + call p1.empiler(E); + writeln("apres empile"); + saisie := true; + writeln("j = ",j); + FI; + FI; + OD; + + when ' ' : j := j + 1; + + when 'C', 'S','E','R','L','c','s','e','r','l','+','-', + '*','/' : writeln(express(j)); + call P2.empiler(express(j)); + j := j + 1; + + when ')' : opaux := P2.sommet ; + call P2.depiler; + case opaux + when '+','-','*','/' : + arg2 := P1.sommet; + call display("arg2 = ",arg2); + call P1.depiler; + arg1 :=P1.sommet; + call display("arg1 = ",arg1); + call P1.depiler; + case opaux + when '+' : E := new somme(arg1, arg2); + call display("E = ",E); + when '-' : E := new diff (arg1, arg2); + call display("E = ",E); + when '*': E := new produit (arg1,arg2); + when '/': E := new divise (arg1, arg2); + esac; + call P1.empiler (E); + + when 'C','c','e','E','s','S','r','R','l','L' : + arg2 := P1.sommet; + call display("arg2 = ",arg2); + call P1.depiler; + + + esac; + j := j + 1; + + esac; + od; + call display ("fonction = ", E); + F := E.deriv(X); + call display("Derivee = ", F); + readln; +END expderivee; + + +(**********************************************************) +(*********** Saisie de la fonction … d‚river **********) + +UNIT expsaisie : procedure (output express : arrayof char, + taille : integer); +VAR expression : arrayof char, + car : char, + opbool, cstbool, varbool, decibool : boolean, + i, touche, opcpt, ligne, pouvcpt, pfermcpt : integer; + +BEGIN + array expression dim (1:maxi); + ligne := 5; + writeln("Saisissez votre expression en parenth‚sant convenablement"); + i := 1; + call gotoxy(ligne,1); + DO + touche := readkey; + car := chr (touche); + case car + when 'v','V': (* l'utilisateur veut valider l'expression *) + IF (pouvcpt =/= pfermcpt) + then + mes1 := "Expression incorrecte, il manque des parenthŠses."; + mes2 := "Expression ignor‚e."; + ELSE + IF pouvcpt =/= opcpt + THEN mes1 := "Expression incorrecte. Il manque des parenthŠses ou des op‚rateurs."; + mes2 := "Expression ignor‚e."; + ELSE + sais := true; + taille := i - 1; + express := expression; + mes1 := "Expression valid‚e."; + mes2 := blanc; + FI; + FI; + call mesg(mes1, mes2); + call gotoxy(25,1); + write(" "); + readln; + exit; + + when 'i','I': mes1 := "Expression ignor‚e"; + call mesg(mes1, blanc); + call gotoxy(25,1); + write(" "); + readln; + exit; + + when ' ': (*rien*) + IF decibool + THEN mes1 := "Erreur : il manque la partie d‚cimale."; + call mesg(mes1, blanc); + call gotoxy(ligne, i); + FI; + + when '(': write(car); + IF decibool + THEN mes1 := "Erreur : il manque la partie d‚cimale."; + call mesg(mes1, blanc); + call gotoxy(ligne, i); + ELSE + pouvcpt := pouvcpt + 1; + opbool := false; + cstbool := false; + varbool := false; + expression(i) := car; + i := i + 1; + call gotoxy(ligne,i); + FI; + + when ')' : IF decibool + THEN mes1 := "Erreur : il manque la partie d‚cimale."; + call mesg(mes1, blanc); + call gotoxy(ligne, i); + ELSE + pfermcpt := pfermcpt +1; + opbool := false; + cstbool := false; + varbool := false; + write(car); + expression(i) := car; + i := i + 1; + call gotoxy(ligne,i); + FI; + + when '+', '-', '*', '/', 'C', 'c','E','e','L','l','R','r','S','s' : + write(car); + IF opbool + then mes1 := "2 op‚rateurs ne peuvent pas ˆtre cons‚cutifs."; + mes2 := "Resaisissez le caractŠre."; + call mesg (mes1,mes2); + call gotoxy(ligne,i); + ELSE + IF decibool + THEN mes1 := "Erreur : il manque la partie d‚cimale."; + call mesg(mes1, blanc); + call gotoxy(ligne, i); + ELSE + opbool := true; + varbool := false; + cstbool := false; + expression (i) := car; + i := i + 1; + opcpt := opcpt + 1; + call mesg(blanc,blanc); + call gotoxy(ligne,i); + FI; + FI; + + when '0','1','2', '3','4','5','6','7','8','9' : + write(car); + IF varbool + then mes1 := "Il manque un op‚rateur ou une parenthŠse"; + mes2 := "Resaisissez le caractŠre."; + call mesg(mes1, mes2); + call gotoxy(ligne, i); + ELSE + decibool := false; + cstbool := true; + varbool := false; + opbool := false; + expression(i) := car; + i := i + 1; + call mesg (blanc, blanc); + call gotoxy(ligne,i); + FI; + + when '.' : IF decibool + THEN mes1 := "Erreur : il manque la partie d‚cimale."; + call mesg(mes1, blanc); + call gotoxy(ligne, i); + ELSE + IF (varbool or opbool or not cstbool) + THEN + mes1 := "Expression incorrecte."; + mes2 := "Resaisissez le caractŠre."; + call mesg(mes1, mes2); + call gotoxy(ligne,i); + ELSE + (* cstbool est … vraie *) + decibool := true; + cstbool := false; + expression(i) := car; + i := i + 1; + call mesg(blanc, blanc); + call gotoxy(ligne, i); + FI; + FI; + + when 'x','y','z','t','X','Y','Z','T': + write(car); + IF varbool + then mes1 := "On ne peut pas avoir 2 variables cons‚cutives."; + mes2 := "Il manque un op‚rateur ou une parenthŠse."; + call mesg (mes1, mes2); + call gotoxy(ligne, i); + ELSE + IF cstbool + then mes1 := "Il manque un op‚rateur ou une parenthŠse."; + mes2 := "Resaisissez le caractŠre." ; + call mesg(mes1, mes2); + call gotoxy(ligne,i); + ELSE + IF decibool + THEN mes1 := "Erreur : il manque la partie d‚cimale."; + call mesg(mes1, blanc); + call gotoxy(ligne, i); + ELSE + cstbool := false; + opbool := false; + varbool := true; + expression(i) := car; + i := i + 1; + call mesg(blanc, blanc); + call gotoxy(ligne,i); + FI; + FI; + FI; + + otherwise write(car); + mes1 := "CaractŠre invalide. Corrigez le."; + call mesg(mes1,blanc); + call gotoxy(ligne,i); + esac; + OD; +END expsaisie; + + +(**********************************************************) +(***** GUIDE UTILISATION *****) +Unit guideutil : procedure; +BEGIN +END guideutil; + + +(*********************************************************************) +(***************** EFFACEMENT DE L'ECRAN *****************************) +UNIT Newpage : procedure; +begin + write(chr(27), "[2J") +end newpage; + + +(**********************************************************) +(****** MENU ******) +UNIT MENU : PROCEDURE; +VAR choix, k : integer; + +BEGIN +DO + call newpage; + Write (" Ú"); + For k:= 3 to 61 DO + Write("Ä"); + OD; + writeln("¿"); + Writeln(" ³ ³"); + Writeln(" ³ **** CE PROGRAMME DONNE L'EXPRESSION DE LA **** ³"); + WRITELN(" ³ **** DERIVEE CORRESPONDANT A UNE FONCTION **** ³"); + Writeln(" ³ **** DONNEE **** ³"); + writeln(" ³ ³"); + writeln(" ³ ³"); + writeln(" ³ 1 : Saisir une fonction ³"); + Writeln(" ³ 2 : Calculer la d‚riv‚e d'une fonction ³"); + Writeln(" ³ 3 : Visualiser le guide d'utilisation ³"); + Writeln(" ³ 4 : Quitter ³"); + writeln(" ³ ³"); + Write (" À"); + For k := 2 to 60 DO + write ("Ä"); + OD; + writeln("Ù"); + writeln; + write(" votre choix :"); + readln (choix); + call newpage; + CASE choix + When 1 : taille := 0; + call expsaisie (express,taille); + + WHEN 2 : IF not sais + then write("coucou"); + mes1 := "Aucune expression correcte n'a ‚t‚ saisie"; + mes2 := blanc; + call mesg (mes1, mes2); + write(""); + readln; + call menu; + ELSE call expderivee(express, taille); + FI; + + WHEN 3 : call guideutil; + + WHEN 4 : exit ; + OTHERWISE mes1 :="le choix demand‚ est incorrect "; + call mesg(mes1, blanc); + write(""); + readln; + ESAC; +OD; +END MENU; + + +(**********************************************************) +(***** PROGRAMME PRINCIPAL *****) +(**********************************************************) +CONST MAXI = 80, + MAX = 50, + BLANC = " "; + +VAR sais : boolean, + express : arrayof char, + mes1, mes2 : string, + taille : integer, + ZERO,ONE:CONSTANT; + + +BEGIN + ZERO:=NEW CONSTANT(0); + ONE:=NEW CONSTANT(1); + sais := false; + call menu; +END; diff --git a/examples/apply/deriv.pcd b/examples/apply/deriv.pcd new file mode 100644 index 0000000000000000000000000000000000000000..d0b2e8412d42360072b9ecc714bfd67d5b3ef585 GIT binary patch literal 2000 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 + do + write(a); + tmp(long):=a; + long:=long+1; + a:=getchar; + od; + writeln; + long:=long-1; + array s dim (1:long); + for i:=1 to long do s(i):=tmp(i); od ; + result:=s; + End saisiestring; + +(* Procedure permettant de choisir la couleur d'‚criture et de fond du texte *) + UNIT Couleur : procedure ( texte,fond : integer); + var t , f : char ; + Begin + t:=chr(48+texte); + f:=chr(48+fond); + Write ( chr(27) , "[1;3",t,";4",f,"m"); + End couleur; + +(* Procedure permettant d'effacer la ligne courante *) + UNIT EraseLine : procedure; + Begin + Write( chr(27), "[K") + End EraseLine; + +(* Procedure permettant d'effacer entiŠrement l'‚cran *) + UNIT Cls : procedure; + Begin + Write( chr(27), "[2J"); + Write( chr(27), "[H"); + End Cls; + +(* Procedure permettant de positionner le curseur sur l'‚cran *) + UNIT SetCursor : procedure(column, row : integer); + var c,d,e,f : char, + i,j : integer; + Begin + i := row div 10; + j := row mod 10; + c := chr(48+i); + d := chr(48+j); + i := column div 10; + j := column mod 10; + e := chr(48+i); + f := chr(48+j); + Write( chr(27), "[", c, d, ";", e, f, "H") + End SetCursor; + + +(* Procedure permettant de calculer a exposant b *) +UNIT exposant : function (a,b:integer) : integer ; + Begin + result:=round(exp(b*ln(a))); + End exposant; + +(* Procedure affichant le r‚sultat d'un essai de pattern matching *) +UNIT afficheresultat : procedure (resultat : boolean); +Begin + call couleur(cyan,noir); + call setcursor(18,18); + if resultat then + Writeln("Le pattern a ete trouve dans la chaine"); + else + Writeln("Le pattern n'a pas ete trouve dans la chaine"); + fi; + call couleur(blanc,noir); + call setcursor(55,24); + Write("Appuyez sur ENTREE"); + readln; +End afficheresultat; + +(* Procedure mettant en place les differents textes sur l'‚cran *) +UNIT afficheecran : procedure (p , s : arrayof char); +var t : integer ; + Begin + call couleur(blanc,noir); + call Cls; + Write("Pattern : "); + call couleur(jaune,noir); + for t:=1 to upper(p) + do + Write(p(t)); + od ; + writeln; + call couleur(blanc,noir); + Writeln; + Writeln("Chaine ou on cherche le pattern :"); + call couleur(jaune,noir); + for t:=1 to upper(s) + do + Write(s(t)); + od ; + End afficheecran ; + + +(**************************************************************************) +(* *) +(* ALGORITHME SIMPLE *) +(* *) +(**************************************************************************) +UNIT AlgoSimple : procedure ( p , s : arrayof char) ; + +(* Procedure ecrivant diff‚rents textes sur l'‚cran *) + + UNIT ecran : procedure ; + Begin + call couleur(blanc,noir); + call setcursor(1,10); + Writeln("On compare la premiere lettre de : "); + Writeln(" avec la premiere lettre de : "); + Writeln; + Writeln("Si elles sont egales, on reduit le pattern de 1 caractere"); + End ecran ; + +(* Procedure permettant d'afficher les diff‚rentes ‚tapes de l'ex‚cution de *) +(* l'algorithme *) + + UNIT AfficheChaine : procedure (p,s:arrayof char; posp,poss : integer); + Var t , longs , longp , posx , longtest : integer ; + var car : char + Begin + posx:=35; + longp:=upper(p); + longs:=upper(s); + longtest:=longp-posp+1; + call couleur(jaune,bleu); + call setcursor(35,10); + for t:=posp to longp + do + Write(p(t)); + od; + call couleur(jaune,noir); + Write(" "); + for t:=1 to longs + do + if ( (t>=poss) and (tm); + od; + call afficheresultat(resultat) ; +End AlgoSimple; + + + +(**************************************************************************) +(* *) +(* ALGORITHME DE KNUTH, MORRIS et PRATT *) +(* *) +(**************************************************************************) +UNIT AlgoKMP : procedure(p , s : arrayof char) ; + +(* procedure permettant d'effectuer les affichages *) + + UNIT ecran : procedure (h:arrayof integer) ; + var i : integer ; + begin + call couleur(blanc,noir); + call setcursor(1,7); + writeln("On compare le caractere en surbrillance du pattern avec celui de la chaine."); + writeln("Quand on trouve un caractere non correspondant, on revient en arriere dans le"); + writeln("pattern d'un nombre n de positions."); + writeln("n est donn‚ par la table suivante:"); + writeln("caractere num :"); + writeln("hash code (=n) :"); + call couleur(jaune,noir); + for i:=1 to upper(h) + do + call setcursor(13+i*4,11); + write(i:4); + call setcursor(13+i*4,12); + write(h(i):4); + od; + end ecran ; + +(* procedure d'affichage du texte *) + + UNIT AfficheChaine : procedure (p,s:arrayof char; posp,poss : integer); + Var t , longs , longp : integer ; + Var car : char ; + Begin + longp:=upper(p); + longs:=upper(s); + call setcursor(11,1); + for t:=1 to longp + do + if (t=posp) then + call couleur(jaune,bleu); + else + call couleur(jaune,noir); + fi; + Write(p(t)); + od; + call setcursor(1,4); + for t:=1 to longs + do + if (t=poss) then + call couleur(jaune,bleu); + else + call couleur(jaune,noir); + fi; + Write(s(t)); + od; + car:=getchar; + End AfficheChaine; + +(* Procedure de calcul de la hash function, stockee dans une table *) + + UNIT KMPhash : function(p : arrayof char) : arrayof integer; + var i, j : integer, + h : arrayof integer , + sortie: boolean ; + + Begin + (* initialisations *) + i := 1; + j := 0; + m := upper(p); + array h dim (1:m); + h(1) := 0; + + (* boucle principale *) + while (i < m) + do + sortie:=false ; + while (not sortie) + do + sortie:=true; + if (j>0) then + if (p(j) <> p(i)) then + sortie:=false ; + j:=h(j); + fi ; + fi ; + od; + + i := i+1; + j := j+1; + if (p(i) = p(j)) then h(i) := h(j); + else h(i) := j; + fi; + od; + result:=h; + End KMPhash; + +var i, j, m, n : integer, + h : arrayof integer, + sortie , resultat : boolean; + +(* Corps de l'algorithme KMP *******************) + +Begin + call afficheecran(p,s); + + (* initialisations *) + m := upper(p); + n := upper(s); + array h dim(1:m); + h := KMPhash(p); + call ecran(h); + i := 1; + j := 1; + + (* boucle principale *) + while ((i <= m) and (j <= n)) + do + sortie:=false; + while (not sortie) + do + sortie:=true; + if (i>0) then + if (p(i) <> s(j)) then + sortie:=false ; + i:=h(i); + call setcursor(1,14); + call couleur(blanc,noir); + write("On se deplace a la position : ",i); + fi ; + if (i>0) then + call affichechaine(p,s,i,j); + else + call setcursor(1,14); + call couleur(blanc,noir); + call eraseline; + call affichechaine(p,s,i+1,j); + fi; + fi; + od; + i := i+1; + j := j+1; + od; + resultat := (i > m); + call afficheresultat(resultat); + End AlgoKMP; + +(**************************************************************************) +(* *) +(* ALGORITHME DE KARP et RABIN *) +(* *) +(**************************************************************************) +UNIT AlgoKarpRabin : procedure (p , s : arrayof char); + +(* Affichage de l'ecran et des commentaires *) + + UNIT Ecran : Procedure (hash : integer); + begin + call couleur(blanc,noir); + call setcursor(1,8); + write("Hash code du pattern :"); + call couleur(jaune,noir); + writeln(hash); + call couleur(blanc,noir); + writeln("Hash code du texte selectionne :"); + end ecran ; + +(* procedure d'affichage du texte *) + + UNIT AfficheChaine : procedure (s:arrayof char ; poss ,longp,hash:integer); + Var t , longs : integer ; + Var car : char ; + Begin + longs:=upper(s); + call couleur(jaune,noir); + call setcursor(33,9); + write(hash); + call setcursor(1,4); + for t:=1 to longs + do + if ( (t>=poss) and (t= (n-m+1)) or ( trouve) ) then exit fi; + hstr := newhash(hstr , m , j , s); + j:=j+1; + + od; + call afficheresultat(trouve); + End AlgoKarpRabin; + +(**************************************************************************) +(* *) +(* ALGORITHME DE BOYER et MOORE (modifi‚ HORSPOOL) *) +(* *) +(**************************************************************************) +UNIT AlgoBoyerMoore : procedure ( p , s : arrayof char); + +(* procedure d'affichage du texte *) + + UNIT AfficheChaine : procedure (s:arrayof char; poss : integer); + Var t , longs : integer ; + Var car : char ; + Begin + longs:=upper(s); + call setcursor(1,4); + for t:=1 to longs + do + if (t=poss) then + call couleur(jaune,bleu); + else + call couleur(jaune,noir); + fi; + Write(s(t)); + od; + car:=getchar; + End AfficheChaine; + +(* Procedure de remplissage de la table Delta *) + +UNIT Delta : function (p : arrayof char) : arrayof integer ; + +Var d : arrayof integer, + a : integer; + +Begin + array d dim(1:127); + m:=upper(p); + (* initialisation *) + for a:=1 to 127 do + d(a):=m; + od; + (* calcul pour le pattern *) + for a:=1 to m-1 do + d(ord(p(a))):=m-a; + od; + result:=d; +End Delta; + +var j, m, n, a : integer, + trouve : boolean, + d : arrayof integer; + + +(* Corps de l'algorithme BM ************************) + +Begin + (* initialisations *) + call afficheecran(p,s); + m:=upper(p); + n:=upper(s); + d:=Delta(p); + j:=m; + trouve:=false; + + (* boucle principale *) + while ( (j<=n) and (not trouve) ) + do + call affichechaine(s,j); + if (s(j) = p(m)) then + trouve:=true; + for a:=1 to m + do + if (p(a)<>s(j-m+a)) then + trouve:=false; + fi; + od; + fi; + call couleur(blanc,noir); + call setcursor(1,8); + if (not trouve) then + writeln("La derniere lettre du pattern ne correspond pas avec la lettre de la chaine"); + writeln("en surbrillance, alors on se deplace de ",d(ord(s(j))):2," positions"); + else + call eraseline; + writeln; + call eraseline; + fi; + j:=j+d(ord(s(j))); + od; + call afficheresultat(trouve); + +End AlgoBoyerMoore ; + + +(* Procedure affichant le premier ecran et saisissant les choix *) + +UNIT EcranPrincipal : procedure ; +var choix : integer , + p , s : arrayof char ; + Begin + choix:=0; + while (choix<>5) + do + call couleur(blanc,noir); + call cls; + call setcursor(27,1); + Write("Programme Pattern Matcher"); + call setcursor(27,2); + Write("-------------------------"); + call setcursor(1,22); + writeln("Tous les algorithmes s'executent en pas a pas, il faut appuyer sur une touche"); + write("pour faire s'executer le pas suivant..."); + + call setcursor(1,6); + writeln(" 1) Algorithme simple"); + writeln(" 2) Algorithme de Karp et Rabin"); + writeln(" 3) Algorithme de Knuth, Morris et Pratt"); + writeln(" 4) Algorithme de Boyer et Moore"); + writeln(" 5) Quitter le programme"); + writeln; + write("Votre choix : "); + readln(choix); + if (choix < 5) then + writeln; + writeln("Saisie de la chaine ou on recherche le pattern :"); + call couleur(jaune,noir); + s:=saisiestring; + call couleur(blanc,noir); + writeln("Saisie du pattern a rechercher :"); + call couleur(jaune,noir); + p:=saisiestring; + call couleur(blanc,noir); + case choix + when 1 : call algoSimple(p,s); + when 2 : call algoKarpRabin(p,s); + when 3 : call algoKMP(p,s); + when 4 : call algoBoyerMoore(p,s); + esac ; + fi; + od; + End EcranPrincipal; + + +(***************************************************************************) +(* PROGRAMME PRINCIPAL *) +(***************************************************************************) + + +Begin + call ecranprincipal; +End; \ No newline at end of file diff --git a/examples/apply/kmpalg.pcd b/examples/apply/kmpalg.pcd new file mode 100644 index 0000000000000000000000000000000000000000..7a05cd00000ab0e0d9295bf5e354f00846718fc6 GIT binary patch literal 1160 zcmZwHOK1~87zglwcV~BNnl#Dgu_jF+9(wTV-J|v7eNR@)tQbZ9^L{UUqWc|-((w&7ae3{M6Z@+J5XObYOi4Cyeh%U&h zn{8c$w-5*dvwh3YhUh``ZHL)~Q_6vEiD4|}Z05VPtZRxqx?u_=p3uEy-D$dAIX&Mim2V`M()R5IT{Gr7&)kYRpYF}FZZ4Na zdv~6)?sK|z`A!bGZ_iZSjd}V09&-&3X{H$43X!w%h&?T?qgF`s{K@Mcdmb?AF?XN& zT82QQkVgV{nC~X*-lbb#)brhDk59L`n8ONO=eH|#H`uQBBIn?0I6n((Jn5Pozi3*x z%yzrxY)sJkhJ~G;+~0AIpJVL{Y$s#xymC)GxgTdZ-Y^BuvRz!M*FCA~ic;qsjMAK7 zTr27Bc<5|QmgM_8%9=;Gj$?E)<;dBnv&T1V%$Gf+aERsr>mFwBP$hB>4yt^^6?v}q zaeOahKjUY=?nXlAV4+|Bj)s}9#(aC|)>d`5Te-oiey)b-red!BOa`rL{C~qhYE_i4 Hz4O3-7U!gE literal 0 HcmV?d00001 diff --git a/examples/apply/paretn.ccd b/examples/apply/paretn.ccd new file mode 100644 index 0000000000000000000000000000000000000000..63cf1d0b6682b73e82642ebf578f6e0dbdd6f525 GIT binary patch literal 16950 zcmds8dz4*OdEfV(bKf(05%QP>JRvP1=@3Z>70HAwEHp7B5(r|`*yXyJImz5)=HB5x z(u7rsS}nLr3ju)y9|3FSEmGH_Y6U?7aRnj>D3a=`t5_)z@zL7V+PSCS@7sHybMBdQ zckWF7YgjXL&OYD%zHfi;{q2nq;Xg-gTe13FAuO?al@KX0N>AG^6~Y$VR&K!adW>$P zpVjoUUYsd5dhS@M(eP>&x8!;a&u!GI%{`twRI1e7k&-(&Tq;*QA^M|`l_e#bRX4%U z5*Lk)HTQYfxb1_hDy)(5j9l96h| zZ^9CTX?T0d9_!wSHwdOHq-jAmyOGp44kWHlqJc7QR-RU1$&z03C`6sHm>AAkd+v^QB8_GuDs_d}+ zZh6GrQEE2a5<6#&os*1&+`if*YCOTHNs+in zf1kIe`df(a(Oe;(Q@?v6&(U%D+{3g0qbXtpb0rTUp7y!;sxgO<6Gz%-No;a%luC#} z!<)XQ#6q!v##Y+r+2_;yY`bQer~;?zGe9Rr`Buyp60h>)=&5?L$iUwrr#E6`TtL3emIlM?H?Zy z>0H5qZiFa01^Vx>5HwPBX!$vcrOu63j{XAr+VOAZayiSg=-u~k=J6+J(@#?CXnh~26|Cb`-q#fc%Ru4Y z7=^cD6z(xlNCj({W1w(%jKcp!C}1V4c_n`zgIa90uk`P_;v-|=P9>w4g>` zRn%rCQoA#jQ>BMMo1urG3IYBfQASMVdZ>!U+bf(ODdFB{RKe+?oz61i zu;}CjmFR>Gd0S@8U*$3TMa9*u1g?mGWl=pM&R>}Gzdyc%X*pDH4G4#%QE)Iq^#O5+ zks{ID6{G&U9H_sbc=vt0JwHBRrENLd9ZPqoEC&iWF| z(eavEZBblJEf#Q)7n+BBzypmC4#-sVxtqB{RU>8cHgok{AknKimgZ?5ILQ+nEbAeL z`mT~(QhYRd^fPK+QuPpK-kibezB7K1VnR+FWDPzYi+hI>^YD`~s3#&&6ZI$M&Uz$i zA;V~ip<1!TTGTC^h1QY;ku%nE9TQeGKaAj)IR%n?mO1{Gl0a|7=HeM5w67;3nd|XM z&3r7uGCQw~bWQ6dk6~-WUvT_h*7Y|O-F$>&_y#hVNmE}pM4z=SSy@j#`drvTW!y`A z!+X~7o34`wTG7aa)c|I-8kLbr$EynzC$l4~(@~rvTgMnMAZ+sXG~t%of|uqLrFR=} zn&L_l&aA?DzQQ>t!e^+3&JpTeZE{-Gf+Wsu?c$h`6Ir!`I8?;=N=0L`UcExiGkbN9 z!K=?{weJb)5f1`q%Xt+ArR}qowq@k(=QZ`WWYjNEBu39vdajIYxAE$hwaCgTKK4>x zph!tOsDk7BI#L!4ky6I*FjC&Y_?7}6un;w9AGr=*a|?f65?Cb0E-vEtasIM+ic&t~ zq@}z_VdyUQyhA~s8nHO-8KD*TvX8(ICD-U_*Lk++RGLyog%J4r{DhbWwwwR}*+XHPePgi62w+^H-8T8-;XRZ`I z$-TJmr>M?C&Ps{-R)zv(Wh$ggESQBKORLP;+1UcTTFwIZEl$(Gl z%!&83MYOy54P8ax`~t^?&A4(wNPVZ z#Y+rvSV72W^SKt)VdV9_G($$07Z~cZEm=ue)O*wQf{ZP?Hbf;TYp#%oQ+V!Y+IaZ1 z!jy|(irV5GN^a(8JIxSn4=D_jjq?X%QToD2lt%o{$l8c(tCya1Z3MaAHbH8ec;&Y$ zPUa=pKy(+PBa4hS@YYUMIs8;=ZT@eF=RO_ZMVhPe0#T+3iTE^8UoH#!1^`@r~Kv^5SJ~0#4d5w}5&i!--?@n4*^8CF9JG{fNCR5FLNX<*i z^|L4{$kUcthFpKpzny9sOB`n&Z;xr9Z-NHkk75?&acd0rofBXIb&FwTCcC)Vu(Edr zE1PFn*?|~;>mvMtvzyrR6Q8uatk6YxJR zhU*_s06#MZ|A>M1V<*5>jNy9Jfa__cCo5(bTK`X}?{@6Fwu2{6zzf}fP+qW3K#%E; z($B;o={!fxTodc9<|B~M)3*)lJEmgHj7Xgo@3qQq0D75WH$d-`U*+}rJ%J&kNL$KyO)pdBOLYRc?Yd2p{9Wa%97K-|!*e#e$c0KkW`kdHUp{_Pq^d!(u8i2PdT77kb-%4n z1hS}aoGjTPa3$A&Px6en#;+Dx!UQ_V44+p+h??(0JW&(vWZKi|GuMQ~OuY)@Qf+77N*os;f+=pV^kQ zU#x0kO^$U)`^^US>&ykOY1MnjDYon%J;QQx6h}!r75ju7!EawpV=uU1Dx*z z27Ncc;BSqzjp~R-D30lRWrLwB@qX^jrD-0tccs#La@0!NiG7u|z9o?EL@$th^NLjM zm2CMRV@#JDc-`G*>$F@V3B!4g+9#v!muldr)XDjr-4FuUbsW)gZc>x zUWocvdSQ5K{)2hY<4}uE9LS>3Yk+MP$+pshZVyp)pQoRA-{uaUHE5LNiJ}I4^by8W zGUDm%qaO;aNcMAJ$;mz%KegY$bpK4zove>)Klz}+_O3Ck$+QpLr{vFV(7Z>%eQ zS)?lsUH`d(GgCidPt1C8@~^Eo>{c`l*iGwh#JDa+xDK(`4HAEuBa`k)zQk{N6{lVd zBLUY8I`4hIbs&qApA1=g_cfcYL|%aXQ9ZyJz`@N}85NK6smak6`A-(rE%3|ScBBs) zc$Rt7mGKdVKEh`#8Bt+~?9dp4|-fodo-rv7UFRD%Qu(SmfNN+jw|N zVakfolk|=me!7t9J+6A=(Gy;*=bLIg+7-q4V*!8h4y>idTx{>xi<2? zpsodP&oKO>!3yvdyMnyH*EE0qdMjEVea&D+{}oyaWgp!!_^leHJV&E?KlGmlU#0Vb zF7E#Rhlq=(0UZj^-9ai_`{7I+rp z`I!+A@XQ+AR9B0BXU3MaZ zJM&+ObV0&w(Hnz0mIzghK{<(;rx1ghn+TPUK`l#!%Eh2oB|>El(lzDjOjoBQ*fq=8 zg1xM~Tk_Uv@B}A8J9Wx)Jya8-Iu!JTb61?YVt0X4SJ`(j8fssg*X#r*;&{^41E^Y4 zrfRxJl?qOL>arIw)@mq#xb^Nv_ZN6hG3LYV!Qcjce~5GdIWl>!FC>gRjff zdT>X1Vva~!&pa3NHu-Xw)JuI9xl2NIB6mr2w`RgF>7U+#SsRV3=thH=CTdXLIHf$- zh4*bxns6d_XyTdxukTfz&3J{k-nfR&nphXp#KSR7{ILO!(IuEcHp$86(k6$ewz&leiHth)?SF=f|sqEuwW2&*tt#2Ak0 zeRo9fVSe5jgSs{mYDc8=?!{&tNSrZbkjb0=Ko(lXc_j4r2A@Q{;qT(kt{j(ptlzQE zzs}V6t5eJUG;4r%kbsjnKaMffzmdeyLB=?~Tl^jPf95CupN`L2dCI2?#hgX|2Z2_V AlK=n! literal 0 HcmV?d00001 diff --git a/examples/apply/paretn.log b/examples/apply/paretn.log new file mode 100644 index 0000000..9e2f550 --- /dev/null +++ b/examples/apply/paretn.log @@ -0,0 +1,637 @@ +BLOCK +(* auteurs V.Borry et V.Iriart *) +(* Licence GR2. 1993/94 *) + + Const noir = 0 , + rouge = 1 , + vert = 2 , + jaune = 3 , + bleu = 4 , + magenta = 5 , + cyan = 6 , + blanc = 7 ; + +(* Fonction qui attend qu'un caractŠre soit tap‚ au clavier *) +(* et le renvoie *) + UNIT GetChar:function:char; + var a:integer; + begin + pref IIUWGRAPH block + begin + a:=0; + while a=0 + do + a:=inkey; + od; + result:=chr(a); + end; + End GetChar; + +(* Fonction qui saisit une chaine de caractŠres et la place dans un tableau *) +(* de caractŠres *) + UNIT SaisieString : function : arrayof char ; + var a : char , + s , tmp : arrayof char , + i , long : integer ; + Begin + a:=getchar; + array tmp dim (1:255); + long:=1; + while (ord(a)<>13) + do + write(a); + tmp(long):=a; + long:=long+1; + a:=getchar; + od; + writeln; + long:=long-1; + array s dim (1:long); + for i:=1 to long do s(i):=tmp(i); od ; + result:=s; + End saisiestring; + +(* Procedure permettant de choisir la couleur d'‚criture et de fond du texte *) + UNIT Couleur : procedure ( texte,fond : integer); + var t , f : char ; + Begin + t:=chr(48+texte); + f:=chr(48+fond); + Write ( chr(27) , "[1;3",t,";4",f,"m"); + End couleur; + +(* Procedure permettant d'effacer la ligne courante *) + UNIT EraseLine : procedure; + Begin + Write( chr(27), "[K") + End EraseLine; + +(* Procedure permettant d'effacer entiŠrement l'‚cran *) + UNIT Cls : procedure; + Begin + Write( chr(27), "[2J"); + Write( chr(27), "[H"); + End Cls; + +(* Procedure permettant de positionner le curseur sur l'‚cran *) + UNIT SetCursor : procedure(column, row : integer); + var c,d,e,f : char, + i,j : integer; + Begin + i := row div 10; + j := row mod 10; + c := chr(48+i); + d := chr(48+j); + i := column div 10; + j := column mod 10; + e := chr(48+i); + f := chr(48+j); + Write( chr(27), "[", c, d, ";", e, f, "H") + End SetCursor; + + +(* Procedure permettant de calculer a exposant b *) +UNIT exposant : function (a,b:integer) : integer ; + Begin + result:=round(exp(b*ln(a))); + End exposant; + +(* Procedure affichant le r‚sultat d'un essai de pattern matching *) +UNIT afficheresultat : procedure (resultat : boolean); +Begin + call couleur(cyan,noir); + call setcursor(18,18); + if resultat then + Writeln("Le pattern a ete trouve dans la chaine"); + else + Writeln("Le pattern n'a pas ete trouve dans la chaine"); + fi; + call couleur(blanc,noir); + call setcursor(55,24); + Write("Appuyez sur ENTREE"); + readln; +End afficheresultat; + +(* Procedure mettant en place les differents textes sur l'‚cran *) +UNIT afficheecran : procedure (p , s : arrayof char); +var t : integer ; + Begin + call couleur(blanc,noir); + call Cls; + Write("Pattern : "); + call couleur(jaune,noir); + for t:=1 to upper(p) + do + Write(p(t)); + od ; + writeln; + call couleur(blanc,noir); + Writeln; + Writeln("Chaine ou on cherche le pattern :"); + call couleur(jaune,noir); + for t:=1 to upper(s) + do + Write(s(t)); + od ; + End afficheecran ; + + +(**************************************************************************) +(* *) +(* ALGORITHME SIMPLE *) +(* *) +(**************************************************************************) +UNIT AlgoSimple : procedure ( p , s : arrayof char) ; + +(* Procedure ecrivant diff‚rents textes sur l'‚cran *) + + UNIT ecran : procedure ; + Begin + call couleur(blanc,noir); + call setcursor(1,10); + Writeln("On compare la premiere lettre de : "); + Writeln(" avec la premiere lettre de : "); + Writeln; + Writeln("Si elles sont egales, on reduit le pattern de 1 caractere"); + End ecran ; + +(* Procedure permettant d'afficher les diff‚rentes ‚tapes de l'ex‚cution de *) +(* l'algorithme *) + + UNIT AfficheChaine : procedure (p,s:arrayof char; posp,poss : integer); + Var t , longs , longp , posx , longtest : integer ; + var car : char + Begin + posx:=35; + longp:=upper(p); + longs:=upper(s); + longtest:=longp-posp+1; + call couleur(jaune,bleu); + call setcursor(35,10); + for t:=posp to longp + do + Write(p(t)); + od; + call couleur(jaune,noir); + Write(" "); + for t:=1 to longs + do + if ( (t>=poss) and (tm); + od; + call afficheresultat(resultat) ; +End AlgoSimple; + + + +(**************************************************************************) +(* *) +(* ALGORITHME DE KNUTH, MORRIS et PRATT *) +(* *) +(**************************************************************************) +UNIT AlgoKMP : procedure(p , s : arrayof char) ; + +(* procedure permettant d'effectuer les affichages *) + + UNIT ecran : procedure (h:arrayof integer) ; + var i : integer ; + begin + call couleur(blanc,noir); + call setcursor(1,7); + writeln("On compare le caractere en surbrillance du pattern avec celui de la chaine."); + writeln("Quand on trouve un caractere non correspondant, on revient en arriere dans le"); + writeln("pattern d'un nombre n de positions."); + writeln("n est donn‚ par la table suivante:"); + writeln("caractere num :"); + writeln("hash code (=n) :"); + call couleur(jaune,noir); + for i:=1 to upper(h) + do + call setcursor(13+i*4,11); + write(i:4); + call setcursor(13+i*4,12); + write(h(i):4); + od; + end ecran ; + +(* procedure d'affichage du texte *) + + UNIT AfficheChaine : procedure (p,s:arrayof char; posp,poss : integer); + Var t , longs , longp : integer ; + Var car : char ; + Begin + longp:=upper(p); + longs:=upper(s); + call setcursor(11,1); + for t:=1 to longp + do + if (t=posp) then + call couleur(jaune,bleu); + else + call couleur(jaune,noir); + fi; + Write(p(t)); + od; + call setcursor(1,4); + for t:=1 to longs + do + if (t=poss) then + call couleur(jaune,bleu); + else + call couleur(jaune,noir); + fi; + Write(s(t)); + od; + car:=getchar; + End AfficheChaine; + +(* Procedure de calcul de la hash function, stockee dans une table *) + + UNIT KMPhash : function(p : arrayof char) : arrayof integer; + var i, j : integer, + h : arrayof integer , + sortie: boolean ; + + Begin + (* initialisations *) + i := 1; + j := 0; + m := upper(p); + array h dim (1:m); + h(1) := 0; + + (* boucle principale *) + while (i < m) + do + sortie:=false ; + while (not sortie) + do + sortie:=true; + if (j>0) then + if (p(j) <> p(i)) then + sortie:=false ; + j:=h(j); + fi ; + fi ; + od; + + i := i+1; + j := j+1; + if (p(i) = p(j)) then h(i) := h(j); + else h(i) := j; + fi; + od; + result:=h; + End KMPhash; + +var i, j, m, n : integer, + h : arrayof integer, + sortie , resultat : boolean; + +(* Corps de l'algorithme KMP *******************) + +Begin + call afficheecran(p,s); + + (* initialisations *) + m := upper(p); + n := upper(s); + array h dim(1:m); + h := KMPhash(p); + call ecran(h); + i := 1; + j := 1; + + (* boucle principale *) + while ((i <= m) and (j <= n)) + do + sortie:=false; + while (not sortie) + do + sortie:=true; + if (i>0) then + if (p(i) <> s(j)) then + sortie:=false ; + i:=h(i); + call setcursor(1,14); + call couleur(blanc,noir); + write("On se deplace a la position : ",i); + fi ; + if (i>0) then + call affichechaine(p,s,i,j); + else + call setcursor(1,14); + call couleur(blanc,noir); + call eraseline; + call affichechaine(p,s,i+1,j); + fi; + fi; + od; + i := i+1; + j := j+1; + od; + resultat := (i > m); + call afficheresultat(resultat); + End AlgoKMP; + +(**************************************************************************) +(* *) +(* ALGORITHME DE KARP et RABIN *) +(* *) +(**************************************************************************) +UNIT AlgoKarpRabin : procedure (p , s : arrayof char); + +(* Affichage de l'ecran et des commentaires *) + + UNIT Ecran : Procedure (hash : integer); + begin + call couleur(blanc,noir); + call setcursor(1,8); + write("Hash code du pattern :"); + call couleur(jaune,noir); + writeln(hash); + call couleur(blanc,noir); + writeln("Hash code du texte selectionne :"); + end ecran ; + +(* procedure d'affichage du texte *) + + UNIT AfficheChaine : procedure (s:arrayof char ; poss ,longp,hash:integer); + Var t , longs : integer ; + Var car : char ; + Begin + longs:=upper(s); + call couleur(jaune,noir); + call setcursor(33,9); + write(hash); + call setcursor(1,4); + for t:=1 to longs + do + if ( (t>=poss) and (t= (n-m+1)) or ( trouve) ) then exit fi; + hstr := newhash(hstr , m , j , s); + j:=j+1; + + od; + call afficheresultat(trouve); + End AlgoKarpRabin; + +(**************************************************************************) +(* *) +(* ALGORITHME DE BOYER et MOORE (modifi‚ HORSPOOL) *) +(* *) +(**************************************************************************) +UNIT AlgoBoyerMoore : procedure ( p , s : arrayof char); + +(* procedure d'affichage du texte *) + + UNIT AfficheChaine : procedure (s:arrayof char; poss : integer); + Var t , longs : integer ; + Var car : char ; + Begin + longs:=upper(s); + call setcursor(1,4); + for t:=1 to longs + do + if (t=poss) then + call couleur(jaune,bleu); + else + call couleur(jaune,noir); + fi; + Write(s(t)); + od; + car:=getchar; + End AfficheChaine; + +(* Procedure de remplissage de la table Delta *) + +UNIT Delta : function (p : arrayof char) : arrayof integer ; + +Var d : arrayof integer, + a : integer; + +Begin + array d dim(1:127); + m:=upper(p); + (* initialisation *) + for a:=1 to 127 do + d(a):=m; + od; + (* calcul pour le pattern *) + for a:=1 to m-1 do + d(ord(p(a))):=m-a; + od; + result:=d; +End Delta; + +var j, m, n, a : integer, + trouve : boolean, + d : arrayof integer; + + +(* Corps de l'algorithme BM ************************) + +Begin + (* initialisations *) + call afficheecran(p,s); + m:=upper(p); + n:=upper(s); + d:=Delta(p); + j:=m; + trouve:=false; + + (* boucle principale *) + while ( (j<=n) and (not trouve) ) + do + call affichechaine(s,j); + if (s(j) = p(m)) then + trouve:=true; + for a:=1 to m + do + if (p(a)<>s(j-m+a)) then + trouve:=false; + fi; + od; + fi; + call couleur(blanc,noir); + call setcursor(1,8); + if (not trouve) then + writeln("La derniere lettre du pattern ne correspond pas avec la lettre de la chaine"); + writeln("en surbrillance, alors on se deplace de ",d(ord(s(j))):2," positions"); + else + call eraseline; + writeln; + call eraseline; + fi; + j:=j+d(ord(s(j))); + od; + call afficheresultat(trouve); + +End AlgoBoyerMoore ; + + +(* Procedure affichant le premier ecran et saisissant les choix *) + +UNIT EcranPrincipal : procedure ; +var choix : integer , + p , s : arrayof char ; + Begin + choix:=0; + while (choix<>5) + do + call couleur(blanc,noir); + call cls; + call setcursor(27,1); + Write("Programme Pattern Matcher"); + call setcursor(27,2); + Write("-------------------------"); + call setcursor(1,22); + writeln("Tous les algorithmes s'executent en pas a pas, il faut appuyer sur une touche"); + write("pour faire s'executer le pas suivant..."); + + call setcursor(1,6); + writeln(" 1) Algorithme simple"); + writeln(" 2) Algorithme de Karp et Rabin"); + writeln(" 3) Algorithme de Knuth, Morris et Pratt"); + writeln(" 4) Algorithme de Boyer et Moore"); + writeln(" 5) Quitter le programme"); + writeln; + write("Votre choix : "); + readln(choix); + if (choix < 5) then + writeln; + writeln("Saisie de la chaine ou on recherche le pattern :"); + call couleur(jaune,noir); + s:=saisiestring; + call couleur(blanc,noir); + writeln("Saisie du pattern a rechercher :"); + call couleur(jaune,noir); + p:=saisiestring; + call couleur(blanc,noir); + case choix + when 1 : call algoSimple(p,s); + when 2 : call algoKarpRabin(p,s); + when 3 : call algoKMP(p,s); + when 4 : call algoBoyerMoore(p,s); + esac ; + fi; + od; + End EcranPrincipal; + + +(***************************************************************************) +(* PROGRAMME PRINCIPAL *) +(***************************************************************************) + + +Begin + call ecranprincipal; +End; \ No newline at end of file diff --git a/examples/apply/paretn.pcd b/examples/apply/paretn.pcd new file mode 100644 index 0000000000000000000000000000000000000000..7a05cd00000ab0e0d9295bf5e354f00846718fc6 GIT binary patch literal 1160 zcmZwHOK1~87zglwcV~BNnl#Dgu_jF+9(wTV-J|v7eNR@)tQbZ9^L{UUqWc|-((w&7ae3{M6Z@+J5XObYOi4Cyeh%U&h zn{8c$w-5*dvwh3YhUh``ZHL)~Q_6vEiD4|}Z05VPtZRxqx?u_=p3uEy-D$dAIX&Mim2V`M()R5IT{Gr7&)kYRpYF}FZZ4Na zdv~6)?sK|z`A!bGZ_iZSjd}V09&-&3X{H$43X!w%h&?T?qgF`s{K@Mcdmb?AF?XN& zT82QQkVgV{nC~X*-lbb#)brhDk59L`n8ONO=eH|#H`uQBBIn?0I6n((Jn5Pozi3*x z%yzrxY)sJkhJ~G;+~0AIpJVL{Y$s#xymC)GxgTdZ-Y^BuvRz!M*FCA~ic;qsjMAK7 zTr27Bc<5|QmgM_8%9=;Gj$?E)<;dBnv&T1V%$Gf+aERsr>mFwBP$hB>4yt^^6?v}q zaeOahKjUY=?nXlAV4+|Bj)s}9#(aC|)>d`5Te-oiey)b-red!BOa`rL{C~qhYE_i4 Hz4O3-7U!gE literal 0 HcmV?d00001 diff --git a/examples/apply/sacados.ccd b/examples/apply/sacados.ccd new file mode 100644 index 0000000000000000000000000000000000000000..5b0f88c0f3f931086c0adeb18de06303fef2957c GIT binary patch literal 6366 zcmc&&TWlQF8UD}Qc5Ek@%LAD;MH7_=q?kaSkitgD1(TwLkmf>N5+j9pjMp)n#Ooxa zLd1}UKDEWPTv}R%Tl&&cNFqXjs(~N~H-#X95Qv+EK!D0ipDH17`u+boyE{9Xo!Ann zj$)skIp_QT|NF0JiCRAn^~Xf>Y1?E{ug9BeyW=g%Zt9~ogKO8XT(@*-eEJVvNbAOu z$t14UAeSvhze(IQ%2-I>(lO)Y?UV8fE({>6(I_YZ8S4KqfyHkI6xOxCHNMys_E z-n`@HroieF*<2mxty5#rsy0&HoYbL3OrqP=*rq94LXUxUGmPOo-6 z{_Q8ild^Ig&_t2?ofG0O@4i|e3&YTH9DLULUU~i^o*cqEMaSp-jxmSzj2{F#==8?9bpO0SCRhYs|)pLpeB)hjCxtIO%(j#_Uh!0K*dUEIVPD8RaLR#=xev4#q; zelaVoYnoWw3b2M|g;i@}-Bp0~bBh(ExX-d%Ar~>i-Z0ToQ6#=$kKQmVUG8e?a(96) z>-CHZ0tZ=0#BrjqQnJ!oAuBmz6h#h45NGN#<%C#D46T#M>ZUP!b_OdYC&uLcT3vBe zsI^0!0}GVGUyl3*iml70!R9yB) zAF`Nt+-7&&mf7LT4$dYIt9ziIIc+k(Y<;_(lwSr5hMxt%JOa!>xL75+m0>2=50+O} zCQr+%ky~YT!1}tZelHx9RiCXc4H<0bbr#FSoxyq-9!c+J#!#71sakR8;}f4>sVgP6 zgs5LWudsMtn{FlW!qzZHTt&+2Cehf#YRIX$Dr7vrK+kI}ZdVF-8O|{-e2o=j6(Ri8 zB9u}HbFp-}X0Ij^ch~6ry334gmkc;76RF!odN$qz6YqWm8(cE+?)r?fRdWPzj|gZx z(u{jVKr@KBNJ(xmm)!D=3P(gla%^9k&%WbO+mMK(*pjjE#3sY6841uXQIjoFX z2@WK1T??qeK$K!2U&r%A!sx7h_l)dMtVEZ-l@+t!EnehIZDUvb(C)>NCL_H#!&M;f zbi;QQ=Gu5XUeZt}@o3}>$ zU)srP8Vqo~m==q7v&D#e7uXf@U~#07)vzy8m)UGLYJZ*Wh+=M7xejXlWmG9l>qHZ=@w%r&03M+Bc@ z2{Tg1P5+Lhe>XhwUwM=6+o?L3lc_VgcKuefZimHNzbWw6U&TKMMCKlu6(Y3gXzicDcR>V z>#UoZ?4HyMkttlCe~iDu&}8JZ~*8xgAIz7bxWkyU@+PoXVt}e#@Sg^;M(~y^m$B*RwkRzQEecwah zH#ZS8?|dk>W+yWCk?A}xCR&qoTSOlAqdT~m(~Pg&OnfcxGS6ExyQxyWa{7aIoAIR$ zTWTuO`#IidF!+tlx^@Qt&1mQzjG^@;*fi5MW~MVlEUGqUs8-JXsGGU`I>V)(;qt2t zmwtxJFLSxHz7stgT%IHHupeCV9U-5yZ!DLrXQO&>Ref5x{6Z`?*2Cg9EU%~fRr%<^$+gm5i^wXHdYD6V| z;sM!A4V50&<}IsDcS@U1I0nyAwZ=OM)@zeB~5Pja%=)$-)MJl0cPv;8z z#u@M%6Aatv then + call odlej(A(k)); + return + fi; + if s+A(k)=v then raise trouve fi; + s := s+A(k); + for i := k+1 to upper(A) do call p(s,i) od; + call odlej(A(k)); + + last_will : call MyWrite(k); + call affich(inXpos,inYpos,", "); + end p; + handlers + when trouve : call affich(10,300,"press any key"); + i := inchar; + call affich(10,300,"RESULT:: "); + call move(80,300); + terminate; + end handlers; + + begin + for i := lower(A) to upper(A) do call p(0,i) od; + call affich(10,315,"There is no such sequence !!! "); + + last_will : call affich(10,325,"END of EXECUTION"); + end sac_a_dos; + + unit affich : procedure(x,y:integer,s:string); + var TAB : arrayof char,i:integer; + begin + call color(14); + TAB:= unpack(s); + call move(x,y); + for i := lower(TAB) to upper(TAB) do + call HASCII(0); + call HASCII(ord(TAB(i))); + od; + end affich; + + unit inchar : function : integer; + var i : integer; + begin + do + i := inkey; + if i<>0 then exit fi; + od; + result :=i; + end inchar; + + unit MyRead : function : integer; + var OrdN : integer; + begin + result := 0; + do + OrdN:=inchar; + if OrdN=13 then exit fi; + if (ordN<58 and ordN>47) + then + call hascii(0); + call hascii(OrdN); + result := result*10+ (OrdN - 48) + else + if ordN=8 then result := result div 10; + call move(inXpos-8,inYpos);call hascii(0); + fi; + fi; + od; + end MyRead; + + unit MyWrite : procedure( Number : integer ); + var i, j, n : integer, + Chiffres:arrayof integer; + begin + array Chiffres dim(1:10); + n:=0; + if Number=0 then n:=1; Chiffres(1):=0 + else + while Number>0 + do + n := n+1; + i := Number div 10; + Chiffres(n) := Number - i*10; + Number := i; + od; + for i := n downto 1 + do + call HASCII(0); + call Hascii(Chiffres(i)+48); + od; + fi; + end MyWrite; + + unit dzban : procedure(x,y,z,v:integer); + var j : integer; + begin + call color(14); + for j :=1 to 3 do + call move(y+6+j,x); + call draw(y+6+j,x-v); + call move(z+j,x); + call draw(z+j,x-v); + od; + for j :=y to z+10 do + call move(j,x); + call draw(j,x+10) + od; + for j :=1 to 3 do + call move(y-5,x+10+j); + call draw(z+15,x+10+j) + od; + end dzban; + + var A : arrayof integer, + v,i,j,n : integer; +begin + call GRON(0); + call aFFich(150,15,"KNAPSACK PROBLEM"); + call affich(10,40,"Given a sequence A[1],...,A[n] of integers"); + call affich(10,55,"find a subsequence i1,...,ij of the indices "); + call affich(10,70,"such that A[i1] +...+ A[ij] = v "); + call affich(10,110,"n = "); + n := MyRead; + call affich(10,130,"Elements of A :: "); + array A dim (1:n); + call move(10,145); + for i := 1 to n do + call color(i); + A(i):= MyRead; + call affich(inXpos,inYpos,", ") + od; + call affich(10,165,"v = "); + v := MyRead; + level := 300; + call dzban( level,350,600,v); + + call sac_a_dos(A,v); + v := inchar; + call GROFF; + end; + +end test; + + + + + + +program test; +(*_________________________________________________________*) +(* Donnee un sequence des nombres entier a1, ... an . *) +(* Trouver un sequence k1,k2,... ki tel que *) +(* SOMME( 0v then return fi; + if s+A(k)=v then raise trouve fi; + s := s+A(k); + for i := k+1 to upper(A) do call p(s,i) od; + last_will : writeln(k); + end p; + handlers + when trouve : writeln("RESULTAT :: "); + terminate; + end handlers; + +begin + for i := lower(A) to upper(A) do call p(0,i) od; + writeln("il n'y a pas sequence i1,..ik tel que le somme est v "); + + last_will : writeln("Fin du sequence"); +end sac_a_dos; + +var A: arrayof integer, v,i,n : integer; + +begin + write(" n= "); + readln(n); + array A dim (1:n); + for i := 1 to n do read(A(i)) od; + write("v = "); + readln(v); + call sac_a_dos(A,v); + writeln("et fin d'execution."); + +end test; + +Dla danych 1 2 3 4 5 6 7 8 9 10, v=12 +Wynik : sequence : 6 3 2 1 ( w takiej wlasnie kolejnosci !) + Fin de sequence +et fin d'execution. + + (* jezeli uzyje wind zamiast terminate to nawet gdy znajde rozwiazanie *) + (* instrukcja for jest w tej procedurze kontynuowana az do konca, a potem *) + (* wydrukuje sie " il n'ya pas sequence ...." *) + (* czyli wind "zwija" obiekty az do tego w ktorym jest odpowiedni handler *) + (* ale nie usuwa tego ostatniego (w przeciwienstwie do terminate) *) + (* ten tekst jest drukowany w obu przypadkach i wind i terminate *) + + + +program TTT; +signal f(inout x,y : integer),g; +unit ppass : procedure( inout x,y : integer); + begin + raise f(x,y); + call ppass(x,y); +end ppass; +var x,y,z,s : integer; + +handlers + when g : s := s+s; + wind +end handlers; +begin + block; + handlers + when f : if y=0 then raise g fi; + s := s+x; + y := y-1; + return; + end handlers; + begin + readln(x,y); + z := y; + call ppass(x,z); + write("to sie nie wydrukuje , bo wind zwija ten obiert bloku!"); + end; + writeln("s= :" ,s); +end TT diff --git a/examples/apply/sacados.pcd b/examples/apply/sacados.pcd new file mode 100644 index 0000000000000000000000000000000000000000..a49347288e5811bb813ec720f96c36cfb0073cd6 GIT binary patch literal 560 zcmZvZy-EZz6opSFGn1LPxa02n9^2a4`W&|QR)V$dR#u9Q*llAWhzMfgTZpKLf5<8b z{>5|eB(8#io8;tv_vB_Kgf%lniM}zAG2pt{Zjm7btEV#Um>F1fW3C~$8}}ghgJG;( z(mitf|8hrW08hU**_aH=d8!Jbh+B)5yoX9vX>!bxKTJv9>)_SE;Y!2 z)X%|2Zm;a3H3%>;?@5ca>u{8)M|}0pYA=U-z7QQNmb%^q2e147)I~_ literal 0 HcmV?d00001 diff --git a/examples/apply/total/d b/examples/apply/total/d new file mode 100644 index 0000000..570adbc --- /dev/null +++ b/examples/apply/total/d @@ -0,0 +1 @@ +131343131 \ No newline at end of file diff --git a/examples/apply/total/m b/examples/apply/total/m new file mode 100644 index 0000000..478ede7 --- /dev/null +++ b/examples/apply/total/m @@ -0,0 +1,4 @@ +000111000001110000000011100001010100010010100001010010010010010100010001010010001100010001000110001100011000 + + + \ No newline at end of file diff --git a/examples/apply/total/neocogni.log b/examples/apply/total/neocogni.log new file mode 100644 index 0000000..ad89238 --- /dev/null +++ b/examples/apply/total/neocogni.log @@ -0,0 +1,1085 @@ +program RESNEURONAL; + +(*-------------------------------------------------------------------------------------------------------------------------------------------------------------------*) + +(*------------------------------------------------- Definition des outils de gestion de l'envirronement graphique --------------------------------------------------*) + +unit ekran: iiuwgraph class; + + + (* Tracage d'une boite *) + unit box : procedure(x,y,xl,yl,co : integer); + begin + call color(co); + call move(x,y); + call draw(x+xl,y); + call draw(x+xl,y+yl); + call draw(x,y+yl); + call draw(x,y); + end box; + + + + (* Impression des coefficients non nuls d'une matrice (n*n) *) + unit circles_in_box : procedure( invers_img,x,y,n:integer , boite :mat ); + var i,j : integer; + + begin + + for i:=1 to n do + for j:=1 to n do + + (* teste le mode d'impression ("inverse motif" ou non) *) + if (invers_img=1) then + if (boite.tab(j,i)=/=0) then call color(1) + else call color(0) fi + else + if (boite.tab(j,i)=/=0) then call color(0) + else call color(1) fi + fi; + + call cirb(x+(i-1)*10,y+(j-1)*10,5,0,0,0,1,1,1); + call cirb(x+(i-1)*10+1,y+(j-1)*10+1,4,0,0,0,1,1,1); + call cirb(x+(i-1)*10+2,y+(j-1)*10+2,3,0,0,0,1,1,1); + call cirb(x+(i-1)*10+3,y+(j-1)*10+3,2,0,0,0,1,1,1); + call cirb(x+(i-1)*10+4,y+(j-1)*10+4,1,0,0,0,1,1,1) + + od + od + + end circles_in_box; + + + + (* Tracage d'un graphique a partir d'une matrice de reels donnee a une echelle donnee *) + unit graphique : procedure( tab_don:arrayof integer , posx,posy:integer , + val_initx,pasx, val_inity,pasy:real , + leg_absc,leg_ord : string ); + var i,j,transl,nouvelx,nouvely : integer; + begin + (* Trace des axes *) + call move(posx,posy); call draw(posx,posy-150); + call move(posx,posy); call draw(posx+400,posy); + call move(posx,posy-150); call draw(posx+5,posy-140); + call move(posx,posy-150); call draw(posx-5,posy-140); + call move(posx+400,posy); call draw(posx+390,posy-5); + call move(posx+400,posy); call draw(posx+390,posy+5); + call grstrwrite(posx+410,posy,leg_absc); + call grstrwrite(posx,posy-160,leg_ord); + + + (* Impression du pas *) + nouvelx:=posx;nouvely:=posy; + j:=upper(tab_don)-lower(tab_don); transl:=0; + for i:=0 to j do + call grintwrite(1,posx+i*(400 DIV j),posy+20,val_inity+i*pasy); + call grintwrite(1,posx-20,posy-i*(150 DIV j),val_initx+i*pasx); + call move(nouvelx,nouvely); + call draw(posx+i*(400 DIV j),posy-tab_don(i+1)*(150 DIV j)); + nouvelx:=posx+i*(400 DIV j); nouvely:=posy-tab_don(i+1)*(150 DIV j); + transl:=tab_don(i+1) + od + end graphique; + + + + + + (* Ecriture d'un texte *) + unit grstrwrite : procedure( x,y : real , s:string); + var a:arrayof char, i:integer; + begin + call move(x,y); + a:=unpack(s); + for i:=lower(a) to upper(a) do call HASCII(ORD(a(i))) od; + end grstrwrite ; + + + (* Ecriture d'un reel quelconque < 10 *) + unit grintwrite : procedure( co,x,y:integer , nbe:real ); + var i,j:integer; + begin + call color(co); + + (* On rend d'abord le reel entier *) + j:=nbe*1000; + + (* Puis on l'affiche en (x,y) *) + for i:=0 to 4 do + call move(x-i*8,y); + if i=3 then call HASCII(ORD('.')) + else call HASCII(j MOD 10 +48) ; j:=j DIV 10 fi + od + end grintwrite; + + + + + (* Saisie a la souris des formes proposees par l'utilisateur *) + unit souris:mouse procedure; + var b,h,hs,hg,v,vs,vg,p,i,j,val:integer,l,r,c,ecrire,gommer: boolean; + begin + val:=1; ecrire:=false; gommer:=false; + + call box(117,87,196,208,1); + call grstrwrite(175,285,"F I G U R E"); + call box(119,89,192,192,1); + call showcursor; + call box(400,125,140,100,1); + call grstrwrite(425,210,"S O U R I S"); + call box(403,128,134,75,1); + call grstrwrite(410,140,"BOUTON 1: LEVE"); + call grstrwrite(410,160,"BOUTON 2: STYLO"); + call grstrwrite(410,180,"BOUTON 3: FIN "); + + do + + call status(h,v,l,r,c); + if not(ecrire) then call move(h,v) fi; + if ecrire then + j:=entier((h-130) DIV 10)+1;i:=entier((v-100) DIV 10)+1; + hg:=(j*10)+125;vg:=(i*10)+95; + if (hg>=135 and hg<=295 and vg>=105 and vg<=265) then + forme.tab(i+1,j+1):=val; + call cirb(hg-5,vg-5,5,0,0,0,1,1,1); + call cirb(hg-4,vg-4,4,0,0,0,1,1,1); + call cirb(hg-3,vg-3,3,0,0,0,1,1,1); + call cirb(hg-2,vg-2,2,0,0,0,1,1,1); + call cirb(hg-1,vg-1,1,0,0,0,1,1,1) + fi + fi; + + hs:=inxpos;vs:=inypos; + call getpress(0,h,v,p,l,r,c); + if p=1 then + ecrire:=not(ecrire); + if ecrire then + call color(0); + call grstrwrite(410,140,"BOUTON 1: LEVE"); + call color(1); + call grstrwrite(410,140,"BOUTON 1: BAISSE") + else + call color(0); + call grstrwrite(410,140,"BOUTON 1: BAISSE"); + call color(1); + call grstrwrite(410,140,"BOUTON 1: LEVE") + fi; + if gommer then call color(0) fi + fi; + call move(hs,vs); + + hs:=inxpos;vs:=inypos; + call getpress(2,h,v,p,l,r,c); + if p=1 then + gommer:=not(gommer); + if gommer then + val:=0; + call color(0); + call grstrwrite(410,160,"BOUTON 2: STYLO"); + call color(1); + call grstrwrite(410,160,"BOUTON 2: GOMME"); + call color(0) + else + val:=1; + call color(0); + call grstrwrite(410,160,"BOUTON 2: GOMME"); + call color(1); + call grstrwrite(410,160,"BOUTON 2: STYLO"); + call color(1) + fi + fi; + call move(hs,vs); + + call getpress(1,h,v,p,l,r,c); + if p=1 then exit fi + od + + end souris; + + + unit introduction : mouse procedure; + var f:file, + i,j,hg,vg,p,h,v:integer, + l,r,c : boolean, + figure:arrayof arrayof integer; + begin + array figure dim (1:35); + for i:=1 to 35 do array figure(i) dim (1:72) od; + + open(f,integer,unpack("PRESENTATION")); + call reset(f); + for i:=1 to 35 do for j:=1 to 72 do + get(f,figure(i,j)) + od od; + kill(f); + + call cls; + call color(1); + for j:=1 to 72 do for i:=1 to 35 do + call move(360,30); + hg:=((j-1)*10)+5;vg:=((i-1)*10)+5; + if figure(i,j)=1 then + call draw(hg-1,vg-1); call draw(hg+1,vg-1); + call draw(hg+1,vg+1); call draw(hg-1,vg+1); + call draw(hg-1,vg-1); call draw(hg,vg); + + call cirb(hg-5,vg-5,5,0,0,0,1,1,1); + call cirb(hg-4,vg-4,4,0,0,0,1,1,1); + call cirb(hg-3,vg-3,3,0,0,0,1,1,1); + call cirb(hg-2,vg-2,2,0,0,0,1,1,1); + call cirb(hg-1,vg-1,1,0,0,0,1,1,1); + fi + od od; + call grstrwrite(110,40,"TOTAL Jaimie"); + call grstrwrite(520,40,"SAINT-JEAN Patrick"); + call grstrwrite(335,310,"CLIQUER"); + call box(300,300,120,30,1); + + do + call getpress(0,h,v,p,l,r,c); + if p=1 then exit fi; + call getpress(1,h,v,p,l,r,c); + if p=1 then exit fi; + call getpress(2,h,v,p,l,r,c); + if p=1 then exit fi; + od + + end introduction; + + + + + + unit presentation : procedure; + begin + call cls; + call box(40,20,600,60,1); + call box(42,22,596,56,1); + call box(17,5,646,340,1); + call box(20,8,640,295,1); + call box(20,312,480,30,1); + call grstrwrite(155,325,"R E S E A U N E U R O N A L"); + call box(502,312,158,30,1); + call grstrwrite(567,318,"TOTAL"); + call grstrwrite(542,330,"SAINT - JEAN") + end presentation; + + + + unit parties : procedure ( s:string ); + begin + call cls; + call box(200,140,320,68,1); call grstrwrite(286,173,s); + for i:=1 to 50000 do od; + end; + + + + unit affichage : procedure ( num : integer ); + var i,j:integer; + begin + case num + when 1 : + (* Presentation graphique de l'apprentissage : *) + call presentation; + call grstrwrite(135,45,"APPRENTISSAGE DES MOTIFS DE LA PREMIERE COUCHE"); + call box(40,260,600,20,1); + call grstrwrite(185,267,"niveau d'apprentissage de chaque motif"); + + (* Affichage du 1er motif *) + call box(55,200,20,40,1); call box(49,129,32,32,1); + call circles_in_box(1,50,130,3,motif(1)) + + + + when 2 : + for i:=1 to 25000 do od; + call presentation; + call grstrwrite(120,45, + "FIN DE L'APPRENTISSAGE DES MOTIFS DE LA PREMIERE COUCHE"); + call grstrwrite(100,180, + "Le reseau est a meme de reconnaitre l'ensemble de ces motifs"); + + for i:=1 to 100000 do od; + + + + when 3 : + call presentation; + call grstrwrite(225,45,"CONTROLE DES CONNAISSANCES"); + + + + when 4: + (* Affichage des formes saisis *) + call box(220,105,220,20,1); + call grstrwrite(240,112,"FORME A RECONNAITRE ..."); + call box(324,129,32,32,1); + call circles_in_box(1,325,130,3,motif(1)); + call box(180,170,310,20,1); + call grstrwrite(200,176,"... PARMIS LES FORMES PRESENTEES"); + call box(100,250,410,20,1); + call grstrwrite(120,256,"... AVEC UN COEFFICIENT DE SELECTIVITE DE :"); + call box(520,250,50,20,1); + + for i:=1 to 9 do + (* Affichage des motifs *) + call box(65*i-1,199,32,32,1); + call circles_in_box(1,65*i,200,3,formes_test(i)) + od; + + for i:=1 to 15000 do od + + + + when 5: + call grintwrite(1,560,256,k_selectivite); + for i:=1 to 4 do + call box(518,248,54,24,1);call box(519,249,52,22,1); + for k:=1 to 2000 do od; + call box(518,248,54,24,0);call box(519,249,52,22,0); + for k:=1 to 2000 do od + od + + + + when 7 : + for i:=1 to 30000 do od; + + call presentation; + call grstrwrite(200,45,"CONCLUSIONS SUR LE TEST"); + call grstrwrite(60,100, + " Nous nous apercevons donc que, plus le coefficient de selectivite"); + call grstrwrite(60,130, + "augmente, et moins les formes sont considerees comme proche du modele"); + call grstrwrite(60,160,"presente ."); + call grstrwrite(60,190, + "De plus, cela permet de supposer que le NEOCOGNITRON reconnait ( en"); + call grstrwrite(60,220, + "generalisant a tous les motifs de l'apprentissage ) des formes pro-"); + call grstrwrite(60,250,"ches des modeles qui lui sont connus ."); + call grstrwrite(60,280, + " Choisissons la valeur du coefficient a partir de cette etude ..."); + + for i:=1 to 300000 do od; + + call presentation; + call grstrwrite(140,45,"VISUALISATION GRAPHIQUE DES RESULTATS DU TEST") + + + + when 8 : + (* Impression du graphique *) + call graphique(tab_result,100,250,0,1,1.125,0.125,"K_SELECTIVITE", + "NBE DE FORMES RECONNUES"); + + for i:=1 to 150000 do od; + + call box(300,100,320,40,1); + call grstrwrite(340,110,"On choisira un coefficient de:"); + call grstrwrite(340,125," 2.0"); + + for i:=1 to 150000 do od + + + + when 9 : + call presentation; + call grstrwrite(180,45,"APPLICATION A UN MOTIF PLUS COMPLEXE"); + for i:=1 to 30000 do od; + + call presentation; + call grstrwrite(200,45,"SAISIE DE LA FORME A LA SOURIS"); + call souris; + + (* Saisie de la visualisation graphique du motif *) + call move(117,87);tab_graph:=fenetre.getmap(313,295); + + (* Recherche des parties proche d'un des motifs connus de la 1ere couche *) + call presentation; + call grstrwrite(100,45, + "RECHERCHE DE CHACUN DES MOTIFS SUR LA FORME PRESENTEE"); + + (* Mise en place graphique de la forme,du motif cherche sur la forme et de la matrice de sortie de la 1ere couche *) + call move(90,87); call putmap(tab_graph); + call box(400,97,176,188,1); call box(402,99,172,172,1); + call grstrwrite(442,275,"SORTIE PLAN"); + call box(303,166,80,60,1); call box(303,236,80,40,1); + call grstrwrite(318,262,"CHERCHE"); + call grstrwrite(325,245,"MOTIF"); + call move(400,97); tab_graph:=getmap(576,285) + + + + when 10 : + (* Superposition des 12 plans *) + call presentation; + call grstrwrite(50,45, + "RECAPITULATIF DES SORTIES DES 12 PLANS DE NEURONES DE LA COUCHE"); + + (* Recapitulatif graphique des sorties de chacun des 12 plans *) + for i:=1 to 12 do + call move(225,97);call putmap(res_final(i)); + for j:=1 to 3000 do od; + call move(225,97);call putmap(tab_graph); + od; + + for i:=1 to 20000 do od; + + call presentation; + call grstrwrite(100,45, + "SUPERPOSITION DES 12 PLANS DE SORTIE DE LA PREMIERE COUCHE"); + + for i:=1 to 15000 do od; + + (* Superposition des 12 plans *) + for i:=1 to 12 do + call move(225,97);call ormap(res_final(i)); + for j:=1 to 5000 do od; + od; + + for i:=1 to 50000 do od; + + call presentation; + call grstrwrite(290,45,"CONCLUSIONS"); + call grstrwrite(250,150, + "ON OBTIENT BIEN LA FIGURE DONNEE"); + call grstrwrite(200,200, + "SEULEMENT A L'AIDE DE CES 12 MOTIFS ELEMENTAIRES"); + + for i:=1 to 100000 do od + + + + + when 11 : call parties("P A R T I E A") + when 12 : call parties("P A R T I E B") + when 13 : call parties("P A R T I E C") + + when 14 : call parties(" F I N") + + esac + + end affichage; + +begin + + call gron(2);call border(0);call color(1); + + +end ekran; + + + + + + + +(*------------------------------------------------------------------------------------------------------------------------------------------------------------------*) + + +(* Definition d'une matrice (n*n) *) +unit mat : class (n : integer); + var tab : arrayof arrayof real, + i : integer; +begin + array tab dim (1:n); + for i:=1 to n do array tab(i) dim (1:n) od; +end mat; + + + + +(*------------------------------------------------------------------------------------------------------------------------------------------------------------------*) + +(* Definition du resultat du test presente apres l'apprentissage *) +unit resultat_test : class; + + unit elem2 : class; + var nb_rec : integer, + forme : arrayof integer; + begin + array forme dim (1:9) + end elem2; + + var i:integer, + tab : arrayof elem2; +begin + array tab dim (1:10); + for i:=1 to 10 do tab(i):=new elem2 od +end resultat_test; + + + + +(*------------------------------------------------------------------------------------------------------------------------------------------------------------------*) + + +(* Definition de la premiere couche *) +unit tabcouche1 : class; + + unit elem : class; + (* Matrice des poids du motif du plan considere *) + var tpoids1 : mat; + + (* Valeur d'inhibition du motif *) + var poidsinhibe1 : real; + + (* Sorties de la premiere couche *) + var sortie1 : arrayof arrayof integer; + end elem; + + + (* structure de la table des neurones *) + var plans1 : arrayof elem; + + (* Plans d'inhibition *) + var distance1 : arrayof mat; + + (* Fichier contenant les valeurs de pre-initialisation de la matrice des distances *) + var i,j: integer, + c : char; + +(* initialisation des differentes tables *) +begin + + + (* La 1ere couche est constituee de 12 plans (12 motifs differents) *) + array plans1 dim (1:12); + + + (* initialisation des elements de la table des plans *) + for i:=1 to 12 + do + plans1(i):= new elem; + (* initialisation de la matrice des poids de chacun des 12 plans *) + plans1(i).tpoids1 := new mat(3); + + (* initialisation de la valeur d'inhibition de chaque plan *) + plans1(i).poidsinhibe1 := 0; + + (* initialisation de la table des neurones de la couche *) + array plans1(i).sortie1 dim (1:17); + for j:=1 to 17 do array plans1(i).sortie1(j) dim (1:17) od; + + od; + + + (* Saisie de la matrice des distances , cette matrice est initialisee une fois pour toute . + On observe une ponderation decroissante du centre vers l'exterieur. + La matrice des distance est initialisee a des petites valeurs en la normant *) + + distance1 := saisie(1,"D"); + call fenetre.cls; + + for i:=1 to 3 do + for j:=1 to 3 do + distance1(1).tab(i,j) := distance1(1).tab(i,j)/(2*SQRT(17)) + od + od + + + +end tabcouche1; + + + + + +(*------------------------------------------------------------------------------------------------------------------------------------------------------------------*) + +(* Fonction de saisie de fichiers texte . + Pour simplifier la saisie,le nom du fichier sera arrete a 1 seul caractere + -----------------------------------------------------------------------------*) + +unit saisie : function (tail_tab : integer,nom_fic: string) : arrayof mat; + + var f:file, + i,j,k : integer, + c : char; + + +begin + + (* ouverture du fichier contenant les motifs en lecture *) + open(f,text,unpack(nom_fic)); + (* Positionnement en debut de fichier *) + call RESET(f); + + + (* Initialisation du tableau des motifs : + il y a tail_tab motifs differents ... *) + array result dim (1:tail_tab); + (* ... et chaque motif est constitue d'un tableau (3*3) de reels *) + for k:=1 to tail_tab do result(k):=new mat(3) od; + + + + (* Remplissage de la table des motifs saisis *) + for k:=1 to tail_tab do + for i:=1 to 3 do for j:=1 to 3 do + read(f,c);result(k).tab(i,j):=ord(c)-48 + od od + od; + + (* Fermeture fichier *) + kill(f) + +end saisie; + + + + + + +(*------------------------------------------------------------------------------------------------------------------------------------------------------------------*) + +(* En plus d'initialiser la 1ere couche , cette coroutine effectue l'apprentissage des formes qui doivent etre connues . + -----------------------------------------------------------------------------------------------------------------------*) + +unit ajuste_poids_1 : coroutine(nb_cor:integer); + + var i,j,k,t : integer, + total,som_inhib : real, + c : char, + + cor : ajuste_poids_1; + +begin + + (* initialisation du poids d'inhibition *) + som_inhib:=0; + for i:=1 to 3 do for j:=1 to 3 do + som_inhib := som_inhib + (motif(nb_cor).tab(i,j)*couche.distance1(1).tab(i,j)) + od od; + som_inhib := SQRT(som_inhib); + + + (* Creation de toutes les coroutines ,1 pour l'apprentissage de chacun des 12 motifs *) + if nb_cor<12 then + + (* Creation de la coroutine d'apprentissage du motif (nb_cor + 1) *) + cor:=new ajuste_poids_1(nb_cor+1); + + (* Affichage des motifs *) + call fenetre.box(50*(nb_cor+1)+5,200,20,40,1); + call fenetre.box(50*(nb_cor+1)-1,129,32,32,1); + call fenetre.circles_in_box(1,50*(nb_cor+1),130,3,motif(nb_cor+1)); + + fi; + + return; + + t:=239; + (* Apprentissage du motif nb_cor *) + for k:=1 to 200 do + + (* Impression physique de la coroutine traitee *) + call fenetre.box(50*nb_cor-3,127,36,36,1); + (* Impression du pourcentage d'apprentissage *) + if (k MOD 5)=0 then + call fenetre.move(50*nb_cor+5,t); + call fenetre.draw(50*nb_cor+25,t); + t:=t-1 + fi; + + (* On attend la fin de l'execution des coroutines suivantes *) + if nb_cor<12 then + attach(cor) + fi; + + (* Renforcement des poids du motif etudie *) + for i:=1 to 3 do + for j:=1 to 3 do + couche.plans1(nb_cor).tpoids1.tab(i,j) := couche.plans1(nb_cor).tpoids1.tab(i,j) + + ( k_appr*motif(nb_cor).tab(i,j) * couche.distance1(1).tab(i,j) ); + od + od; + + (* calcul du poids d'inhibition *) + couche.plans1(nb_cor).poidsinhibe1 := couche.plans1(nb_cor).poidsinhibe1 + + k_appr*som_inhib; + + call fenetre.box(50*nb_cor-3,127,36,36,0); + + + detach + + od + + + +end ajuste_poids_1; + + + + + +(*------------------------------------------------------------------------------------------------------------------------------------------------------------------*) + +(* Cette coroutine effectue le traitement de la reconnaissance des motifs + de la 1ere couche . + Elle effectue 2 traitements : celui du test de fiabilite de la methode + sur des formes simples , puis la reconnaissance de formes donnees plus + complexes . + -------------------------------------------------------------------------*) + +unit filtre : coroutine (num_essai,nb_cor,cor_traite,plan : integer); + + + (* Cette fonction calcule la valeur de sortie d'un neurone de la couche *) + unit calcul_sortie : function(forme : mat , plan_traite : integer):integer; + var i,j : integer, + valeur,som,som_inhib: real; + begin + + som,som_inhib := 0; + for i:=1 to 3 do for j:=1 to 3 do + som:= som + forme.tab(i,j)*couche.plans1(plan_traite).tpoids1.tab(i,j); + som_inhib := som_inhib + forme.tab(i,j)*couche.distance1(1).tab(i,j) + od od; + som_inhib := couche.plans1(plan_traite).poidsinhibe1*SQRT(som_inhib); + + + (* Valeur de sortie du neurone considere *) + valeur := (1 + som)/(1 + k_selectivite/(1 + k_selectivite)*som_inhib) - 1; + + if valeur>0 then + result:=1 + fi + + end calcul_sortie; + + + + var i1,i2,j1,j2 : integer, + c : char, + + mat_traite,bidon : mat, + cor : filtre; + +begin + + (* Creation des filtres correspondant au nombre de plans *) + if (nb_cor>cor_traite) then + cor := new filtre(num_essai,nb_cor,cor_traite+1,plan+1); + fi; + + return; + + + if (nb_cor>cor_traite) then attach(cor) fi; + + mat_traite := new mat(3); + if nb_cor=12 then + (* Formes compliquees *) + + (* Affichage du motif recherche sur la forme proposee *) + call fenetre.box(328,180,32,32,1); + call fenetre.circles_in_box(1,329,181,3,motif(cor_traite)); + + (* Creation d'une matrice d'entiers bidon de taille 1 afin d'utiliser la fonction 'circle_in_box' *) + bidon:=new mat(1); + + for i1:=1 to 17 do + for j1:=1 to 17 do + + for i2:=1 to 3 do for j2:=1 to 3 do + mat_traite.tab(i2,j2) := forme.tab(i1+i2-1,j1+j2-1) + od od; + + if calcul_sortie(mat_traite,plan)=1 then + couche.plans1(plan).sortie1(i1,j1) := 1; bidon.tab(1,1):=1; + for i2:=1 to 3 do + call fenetre.circles_in_box(0,83+(j1*10),80+(i1*10),3,mat_traite); + call fenetre.circles_in_box(1,83+(j1*10),80+(i1*10),3,mat_traite); + od; + call fenetre.circles_in_box(1,393+(j1*10),90+(i1*10),1,bidon) + fi; + + od + od; + + for i1:=1 to 30000 do od; + + (* Sauvegarde graphique de la matrice de sortie du plan traite *) + call fenetre.move(400,97);res_final(cor_traite):=fenetre.getmap(576,285); + + (* Nettoyage graphique de la matrice de sortie du plan 'cor_traite' *) + call fenetre.move(400,97); call fenetre.putmap(tab_graph) + + else + + (* Formes simples du fichier de test *) + mat_traite := formes_test(plan); + + if calcul_sortie(mat_traite,plan)=1 then + (* Nombre de formes considerees comme proche du 1er motif (celui presente) par le reseau *) + resultat.tab(num_essai).nb_rec := resultat.tab(num_essai).nb_rec + 1; + (* Permet de savoir si la forme nb_cor du jeu de test est consideree comme proche du 1er motif *) + resultat.tab(num_essai).forme(cor_traite):=1 + fi; + + fi; + + detach + +end filtre; + + + + + + + + + +(*------------------------------------------------------------------------------------------------------------------------------------------------------------------*) + + + var c : char, + k_selectivite : real, + i,j,k,k_appr : integer, + + tab_result,tab_graph : arrayof integer, + res_final : arrayof arrayof integer, + resultat : resultat_test, + forme : mat, + motif,formes_test : arrayof mat, + apprend : ajuste_poids_1, + verif,chercher : filtre, + couche : tabcouche1, + fenetre : ekran; + + + + + +(*------------------------------------------------------------------ Programme principal ---------------------------------------------------------------------------*) + +begin + + (* les constantes d'apprentissage et de selectivite des formes sont fixees arbitrairement *) + k_appr := 10; + + write(chr(27),"[2J",chr(27),"[H"); + + (* ouverture d'une fenetre *) + fenetre := new ekran; + + call fenetre.introduction; + + (* Saisie de la table des motifs *) + motif := saisie(12,"M"); + + (* Creation de la premiere couche *) + couche := new tabcouche1; + + + + (*------------------------------------------- Phases d'initialisation de la 1ere couche et apprentissage des motifs ---------------------------------------------*) + + call fenetre.affichage(11); call fenetre.affichage(1); + + apprend := new ajuste_poids_1(1); + for i:=1 to 200 do attach(apprend) od; + + call fenetre.affichage(2); + + + (*------------------------------------------------------------------- Filtrage des formes ----------------------------------------------------------------------*) + + (*------------------------------------------- D'abord ,on verifie la methode sur des exemples simples -----------------------------------------------------*) + + + call fenetre.affichage(12); call fenetre.affichage(3); + + (* Saisie du fichier contenant les formes simples *) + formes_test := saisie(9,"T"); + + call fenetre.affichage(4); + + + (* Verification de la methode et modulation du coefficient de selectivite, + afin de montrer que plus le coefficient est important et plus les formes reconnus sont proches du motif recherche *) + + (* Creation de la matrice des resultats *) + resultat:=new resultat_test; + + for j:=1 to 10 do + k_selectivite:=1+j/8; + call fenetre.affichage(5); + verif := new filtre(j,9,1,1); + attach(verif); + + (* Presentation du resultat avec ce coefficient de selectivite k_selectivite *) + for i:=1 to 9 do + if resultat.tab(j).forme(i)=1 then + call fenetre.box( (65*i)-2,198,34,34,1); + call fenetre.box( (65*i)-3,197,36,36,1) + fi + od; + + for i:=1 to 30000 do od; + call fenetre.grintwrite(0,560,256,k_selectivite); + for i:=1 to 9 do + if resultat.tab(j).forme(i)=1 then + call fenetre.box( (65*i)-2,198,34,34,0); + call fenetre.box( (65*i)-3,197,36,36,0) + fi + od + od; + + call fenetre.affichage(7); + + (* Recuperation des resultats dans une table d'entiers *) + array tab_result dim(1:10); + for i:=1 to 10 do + tab_result(i):=resultat.tab(i).nb_rec; + od; + + call fenetre.affichage(8); + + + (*------------------------------------------------ Application a un motif plus complexe ----------------------------------*) + + (* Creation de la retine *) + forme := new mat(19); + + call fenetre.affichage(13); call fenetre.affichage(9); + + (* Creation matrice des resultats pour affichage final *) + array res_final dim (1:12); + + (* Mise en place de la reconnaissance des 12 motifs dans la forme proposee *) + chercher := new filtre(1,12,1,1); + + k_selectivite := 2; + attach(chercher); + + call fenetre.affichage(10); + + call fenetre.affichage(14); + + (* Fermeture de la fenetre *) + call fenetre.groff; + +end RESNEURONAL; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/apply/total/presenta b/examples/apply/total/presenta new file mode 100644 index 0000000000000000000000000000000000000000..c9a8553b300577db02b0750304fb51852e6e6810 GIT binary patch literal 10080 zcmeH_iAqCJ3`Fby|Fi@dI399ywFpH`;gMyQyiWUg>}M0$1U7+9U=!E`Hi1oG6W9bc zflXi&cv%8(FT4CZ4sSmF?^L6!m~yZ@j0_jf+i?EhQGHHX)YQSaW|_;~+Qy7*V6 zC-)sjE_>@btvQpPSbA6b1)Fx{u=l%882zpDY@eHU!tLeRwtmmf?Pu@oQhC?A2{X55@=x#5={oIc$Gz`$-sDgl?r9g? zdh?A>^MvJI>ckC}dU~fDo?EQcWZ&&3%zV!5%Y!p}W4V_)af4OmV=b|0ij$tWwVBE1 zE`7W*cYJc#n>%6jx6ZSDZrU48zpl?Nm408@k;DG>z095Nl3TqWYoEoxbI0E=??4Z8 a{9fd;w=UjWH-SxH6W9bcflc5KCh!jBKLG{+ literal 0 HcmV?d00001 diff --git a/examples/apply/total/t b/examples/apply/total/t new file mode 100644 index 0000000..5a2b5e9 --- /dev/null +++ b/examples/apply/total/t @@ -0,0 +1 @@ +000111000111000000100011000100111000110111000111111000111111100111111110101010000 \ No newline at end of file diff --git a/examples/apply/windo.log b/examples/apply/windo.log new file mode 100644 index 0000000..80fa585 --- /dev/null +++ b/examples/apply/windo.log @@ -0,0 +1,546 @@ +PROGRAM TestWindow; + +BEGIN + PREF IIUWGRAPH BLOCK + +(* -------------------- Limites de l'‚cran -------------------- *) + + CONST XTailleEcran=638, YTailleEcran=348; + + +(* ================================================================== *) +(* CLASSE Fenetre *) +(* ================================================================== *) + +UNIT Fenetre : CLASS (x,y,largeur,hauteur,numero : INTEGER); + + VAR ArrierePlan : ARRAYOF INTEGER, + BufferFenetre : ARRAYOF INTEGER, + ContenuFenetre : ARRAYOF INTEGER, + Buffer : ARRAYOF INTEGER, + Titre : ARRAYOF CHAR, + Active : BOOLEAN, + CurseurX,CurseurY,x1,y1 : INTEGER; + + +(* -------------------- PROCEDURE InitFenetre -------------------- *) + +UNIT InitFenetre : PROCEDURE; + VAR Cx, Cy, i, k : INTEGER; + +BEGIN + IF Active + THEN + Cx:=CurseurX; Cy:=CurseurY; + CALL MettreCurseur(0,0); + CALL OUTSTRING("Fenˆtre "); + CALL HASCII(0); CALL HASCII(numero+48); + CurseurX:=Cx; CurseurY:=Cy; + k:=8*9; + CALL COLOR(1); + CALL STYLE(4); + FOR i:=1 TO 7 + DO + CALL MOVE(x+k,y+i); CALL HFILL(x1-8); + CALL MOVE(x1-i,y+1); CALL VFILL(y1-1); + CALL MOVE(x+1,y1-i); CALL HFILL(x1-1); + CALL MOVE(x+i,y+10); CALL VFILL(y1-1); + OD; + CALL STYLE(1); + FI; +END InitFenetre; + + +(* -------------------- PROCEDURE MettreCurseur -------------------- *) + +UNIT MettreCurseur : PROCEDURE (ligne, colonne : INTEGER); + +BEGIN + CurseurX:=x+8*colonne; + CurseurY:=y+10*ligne; + IF Active + THEN CALL MOVE(CurseurX,CurseurY); + FI; +END MettreCurseur; + + +(* -------------------- PROCEDURE SauveFenetre -------------------- *) + +UNIT SauveFenetre : PROCEDURE; + +BEGIN + IF Active + THEN + CALL MOVE(x,y); + BufferFenetre:=GETMAP(x1,y1); + Active:=FALSE; + FI; +END SauveFenetre; + + +(* -------------------- PROCEDURE CacheFenetre -------------------- *) + +UNIT CacheFenetre : PROCEDURE; + +BEGIN + IF Active + THEN CALL MOVE(x,y); + BufferFenetre:=GETMAP(x1,y1); + CALL XORMAP(BufferFenetre); + CALL MOVE(x,y); + CALL PUTMAP(ArrierePlan); + KILL(ArrierePlan); + Active:=FALSE; + FI; +END CacheFenetre; + + +(* -------------------- PROCEDURE AfficheFenetre -------------------- *) + +UNIT AfficheFenetre : PROCEDURE; + +BEGIN + IF NOT Active + THEN + CALL MOVE(x,y); + ArrierePlan:=GETMAP(x1,y1); + CALL XORMAP(ArrierePlan); + CALL MOVE(x,y); + CALL PUTMAP(BufferFenetre); + KILL(BufferFenetre); + Active:=TRUE; + FI; +END AfficheFenetre; + + +(* -------------------- PROCEDURE EffaceFenetre -------------------- *) + +UNIT EffaceFenetre : PROCEDURE; + +BEGIN + IF Active + THEN + CALL MOVE(x+8,y+8); + ContenuFenetre:=GETMAP(x1-8,y1-8); + CALL XORMAP(ContenuFenetre); + KILL(ContenuFenetre); + CALL MettreCurseur(1,1); + FI; +END EffaceFenetre; + + +(* -------------------- PROCEDURE DeplaceFenetre -------------------- *) + +UNIT DeplaceFenetre : PROCEDURE (dx, dy : INTEGER); + +BEGIN + IF x=0 AND dx<0 THEN EXIT FI; + IF y=0 AND dy<0 THEN EXIT FI; + IF x1=XTailleEcran AND dx>0 THEN EXIT FI; + IF y1=YTailleEcran AND dy>0 THEN EXIT FI; + IF x+dx<0 THEN dx:=-x FI; + IF y+dy<0 THEN dy:=-y FI; + CurseurX:=(CurseurX-x)/8; + CurseurY:=(CurseurY-y)/10; + IF Active + THEN + CALL MOVE(x,y); + IF ContenuFenetre=/=none THEN KILL(ContenuFenetre) FI; + BufferFenetre:=GETMAP(x1,y1); + FI; + IF x1+dx>XTailleEcran THEN dx:=XTailleEcran-x1 FI; + IF y1+dy>YTailleEcran THEN dy:=YTailleEcran-y1 FI; + x:=x+dx; + y:=y+dy; + x1:=x1+dx; + y1:=y1+dy; + IF Active + THEN + CALL XORMAP(BufferFenetre); + CALL MOVE(x,y); + CALL PUTMAP(BufferFenetre); + KILL(BufferFenetre); + FI; + CALL MettreCurseur(CurseurY,CurseurX); +END DeplaceFenetre; + + +(* -------------------- PROCEDURE ChangeTaille -------------------- *) + +UNIT ChangeTaille : PROCEDURE (dc, dl : INTEGER); + + VAR x2,y2 : INTEGER; + +BEGIN + IF Active + THEN + IF x1+8>XTailleEcran AND dc>0 THEN EXIT FI; + IF y1+10>YTailleEcran AND dl>0 THEN EXIT FI; + x2:=x1+8*dc; + y2:=y1+10*dl; + IF x2XTailleEcran + THEN largeur:=(XTailleEcran-x)/8 + ELSE + largeur:=largeur+dc + FI; + FI; + IF y2YTailleEcran + THEN hauteur:=(YTailleEcran-y)/10 + ELSE + hauteur:=hauteur+dl + FI; + FI; + x2:=x+8*largeur; + y2:=y+10*hauteur; + IF x20 THEN EXIT FI; + OD; + WHILE touche<>13 + DO + CALL HASCII(0); + IF touche=8 + THEN + IF i>LOWER(chaine) THEN i:=i-1 FI; + CALL MOVE(INXPOS-8,INYPOS); + col:=col-1; + IF col=0 + THEN + col:=largeur-2; + lig:=lig-1; + IF lig=0 THEN lig:=1; col:=1 FI; + CALL MettreCurseur(lig,col); + FI; + CALL HASCII(0); + CALL MettreCurseur(lig,col); + ELSE + CALL HASCII(touche); + chaine(i):=CHR(touche); + i:=i+1; + IF i>UPPER(chaine) THEN EXIT FI; + col:=col+1; + IF col=largeur-1 + THEN + col:=1; + lig:=lig+1; + if lig=hauteur-1 THEN EXIT FI; + CALL MettreCurseur(lig,col); + ELSE + CurseurX:=CurseurX+8; + FI; + FI; + DO + CALL HASCII(0); + CALL HASCII(0); + CALL HASCII(95); + CALL MOVE(INXPOS-8,INYPOS); + touche:=INKEY; + IF touche<>0 THEN EXIT FI; + OD; + OD; + IF touche=13 + THEN + CALL MOVE(INXPOS-8,INYPOS); + CALL HASCII(32); + chaine(touche):=CHR(13); + long:=i; + FI; + FI; +END SaisirChaine; + + +(* -------------------- PROCEDURE AfficheChaine -------------------- *) + +UNIT AfficheChaine : PROCEDURE (chaine : ARRAYOF CHAR); + + VAR lig, col, i : INTEGER; + +BEGIN + col:=(CurseurX-x)/8; + lig:=(CurseurY-y)/10; + FOR i:=LOWER(chaine) TO UPPER(chaine) + DO + CALL MOVE(CurseurX,CurseurY); + IF chaine(i)=CHR(13) THEN EXIT FI; + CALL HASCII(0); + CALL HASCII(ORD(chaine(i))); + col:=col+1; + IF col=largeur-1 + THEN + col:=1; + CurseurX:=x+8; + CurseurY:=y+10; + IF CurseurY>y1-12 THEN CurseurY:=y+10 FI; + lig:=lig+1; + IF lig=hauteur-1 THEN EXIT FI; + ELSE + CurseurX:=CurseurX+8; + FI; + OD; +END AfficheChaine; + + +(* -------------------- INITIALISATION Fenetre -------------------- *) + +BEGIN + IF x<0 + THEN x:=0; + ELSE IF x>XTailleEcran + THEN x:=0; + FI; + FI; + IF y<0 + THEN y:=0; + ELSE IF y>YTailleEcran + THEN y:=0; + FI; + FI; + IF x+8*largeur>XTailleEcran + THEN largeur:=ENTIER((XtailleEcran-x)/8); + FI; + IF y+10*hauteur>YTailleEcran + THEN hauteur:=ENTIER((YTailleEcran-y)/10); + FI; + x1:=x+8*largeur; + y1:=y+10*hauteur; + CALL MOVE(x,y); + ArrierePlan:=GETMAP(x1,y1); + CALL XORMAP(ArrierePlan); + Active:=TRUE; + CALL InitFenetre; + CurseurX:=x+8; + CurseurY:=y+10; +END Fenetre; + + +(* ==================== PROGRAMME PRINCIPAL ==================== *) + + BEGIN + PREF MOUSE BLOCK + +UNIT Coord : PROCEDURE (posx,posy : INTEGER); + VAR tourx,toury,i : INTEGER, + xx,yy : ARRAYOF INTEGER; + +BEGIN + CALL COLOR(6); + CALL MOVE(0,0); + CALL OUTSTRING(" "); + CALL MOVE(0,0); + CALL OUTSTRING("COORDONNEES : "); + ARRAY xx DIM (1:3); + ARRAY yy DIM (1:3); + IF posx<10 THEN tourx:=1; + ELSE IF posx<100 THEN tourx:=2; + ELSE tourx:=3; + FI; FI; + IF posy<10 THEN toury:=1; + ELSE IF posy<100 THEN toury:=2; + ELSE toury:=3; + FI; FI; + FOR i:=tourx DOWNTO 1 + DO + xx(i):=posx MOD 10; + posx:= posx DIV 10; + OD; + FOR i:=toury DOWNTO 1 + DO + yy(i):=posy MOD 10; + posy:=posy DIV 10; + OD; + FOR i:=1 TO tourx + DO + CALL HASCII(xx(i)+48); + OD; + CALL OUTSTRING(" "); + FOR i:=1 to toury + DO + CALL HASCII(yy(i)+48); + OD; +END Coord; + + +(* -------------------- PROCEDURE Deplace -------------------- *) + +UNIT Deplace : PROCEDURE (i : INTEGER); + + VAR touche : INTEGER; + +BEGIN + DO touche:=INKEY; IF touche<>0 THEN EXIT FI; OD; + WHILE touche=/=102 + DO + IF touche=-72 + THEN CALL fen(i).DeplaceFenetre(0,-5); + ELSE IF touche=-80 + THEN CALL fen(i).DeplaceFenetre(0,5); + ELSE IF touche=-75 + THEN CALL fen(i).DeplaceFenetre(-5,0); + ELSE IF touche=-77 + THEN CALL fen(i).DeplaceFenetre(5,0); + FI; + FI; + FI; + FI; + DO touche:=INKEY; IF touche<>0 THEN EXIT FI; OD; + OD; +END Deplace; + + +(* -------------------- PROCEDURE taille -------------------- *) + +UNIT Taille : PROCEDURE (i : INTEGER); + + VAR touche : INTEGER; + +BEGIN + DO touche:=INKEY; IF touche<>0 THEN EXIT FI; OD; + WHILE touche=/=102 + DO + IF touche=-72 + THEN CALL fen(i).ChangeTaille(0,-1); + ELSE IF touche=-80 + THEN CALL fen(i).ChangeTaille(0,1); + ELSE IF touche=-75 + THEN CALL fen(i).ChangeTaille(-1,0); + ELSE IF touche=-77 + THEN CALL fen(i).ChangeTaille(1,0); + FI; + FI; + FI; + FI; + DO touche:=INKEY; IF touche<>0 THEN EXIT FI; OD; + OD; +END Taille; + + +(* -------------------- PROCEDURE Saisir -------------------- *) + +UNIT Saisir : PROCEDURE (i : INTEGER); + +BEGIN + CALL COLOR(4); + CALL fen(i).SaisirChaine(chaines,longueur); + CALL COLOR(16); +END Saisir; + + +(* -------------------- PROCEDURE Affiche -------------------- *) + +UNIT Affiche : PROCEDURE (i : INTEGER); + +BEGIN + CALL COLOR(8); + CALL fen(i).AfficheChaine(chaines); + CALL COLOR(16); +END Affiche; + + +(* -------------------- PROCEDURE AfFen -------------------- *) + +UNIT AfFen : PROCEDURE (INOUT k : INTEGER; i : INTEGER); + + VAR touche : INTEGER; + +BEGIN + CALL COLOR(10); + k:=i-1; + DO + touche:=INKEY; + IF touche=102 THEN EXIT FI; + IF touche=115 THEN + CALL fen(k).SauveFenetre; + k:=k-1; + IF k=0 THEN k:=i-1 FI; + CALL fen(k).AfficheFenetre; + FI; + OD; +END AfFen; + + +(* -------------------- MAIN ------------------- *) + +VAR + fen : ARRAYOF Fenetre, + h,v,p : INTEGER, + l,r,c : BOOLEAN, + chaines : ARRAYOF CHAR, + i,cour,touche,longueur : INTEGER; + + +BEGIN + CALL GRON(2); + CALL CLS; + CALL COLOR(16); + CALL BORDER(15); + CALL DEFCURSOR(0,1,13); + CALL SHOWCURSOR; + ARRAY fen DIM (1:50); + ARRAY chaines DIM (1:50); + i:=1; + DO + touche:=INKEY; + CALL GETPRESS(1,h,v,p,l,r,c); + IF l AND r THEN EXIT FI; + CALL GETPRESS(0,h,v,p,l,r,c); + IF l + THEN + CALL HIDECURSOR; + CALL MOVE(0,0); CALL Coord(h,v); + fen(i):=NEW Fenetre(h,v,20,7,1); + CALL SHOWCURSOR; + i:=i+1; + cour:=i-1; + FI; + CASE touche + WHEN 100 : CALL Deplace(cour); + WHEN 115 : CALL Saisir(cour); + WHEN 116 : CALL Taille(cour); + WHEN 99 : CALL Affiche(cour); + WHEN 101 : CALL fen(cour).EffaceFenetre; + WHEN 32 : CALL fen(cour).CacheFenetre; + WHEN 97 : CALL fen(cour).AfficheFenetre; + WHEN 109 : CALL AfFen(cour,i); + ESAC; + OD; + CALL GROFF; +END;END;END + diff --git a/examples/backtrac/graphcol.log b/examples/backtrac/graphcol.log new file mode 100644 index 0000000..8c4377f --- /dev/null +++ b/examples/backtrac/graphcol.log @@ -0,0 +1,358 @@ +PROGRAM GraphColoring; + UNIT BACKTRACK: CLASS; + HIDDEN SE,ELEM,TOP; + VAR ROOT:NODE,SEARCH:SE,FOUND,OPT:NODE, + NUMBER_OF_NODES,NUMBER_OF_LEAVES,NUMBER_OF_ANSWERS:INTEGER, + NUMERO_DE_NOEUDS: INTEGER; + + UNIT NODE: COROUTINE(FATHER:NODE); + VAR NSONS,LEVEL,MY_NUMBER: INTEGER , DEADEND:BOOLEAN; + UNIT VIRTUAL LEAF: FUNCTION :BOOLEAN; + END LEAF; + UNIT VIRTUAL ANSWER :FUNCTION :BOOLEAN; + END ANSWER; + UNIT VIRTUAL LASTSON: FUNCTION : BOOLEAN; + END LASTSON; + UNIT VIRTUAL NEXTSON: FUNCTION : NODE; + END NEXTSON; + UNIT VIRTUAL EQUAL : FUNCTION (W:NODE):BOOLEAN; + END EQUAL; + UNIT VIRTUAL COST: FUNCTION :REAL; + END COST; + BEGIN + NUMERO_DE_NOEUDS := NUMERO_DE_NOEUDS + 1; + MY_NUMBER := NUMERO_DE_NOEUDS; + IF FATHER =/= NONE + THEN + LEVEL:=FATHER.LEVEL+1 + ELSE + LEVEL:=0 + FI; + END NODE; + + UNIT OK: FUNCTION (V:NODE):BOOLEAN; + VAR W:NODE; + BEGIN + IF V=NONE THEN RESULT:=FALSE; RETURN FI; + RESULT:=TRUE; W:=V.FATHER; + WHILE W =/= NONE + DO + IF V.EQUAL(W) THEN RESULT:=FALSE; RETURN FI; + W:=W.FATHER + OD + END OK; + + UNIT PURGE: PROCEDURE (V:NODE); + VAR W: NODE; + BEGIN + IF V=NONE THEN RETURN FI; + DO + W:=V.FATHER; KILL(V); + IF W=NONE THEN RETURN FI; + W.NSONS:=W.NSONS-1; + IF W.NSONS =/= 0 THEN RETURN FI; + V:=W + OD; + END PURGE; + + VAR TOP:ELEM; + + UNIT ELEM: CLASS (NEXT:ELEM, V:NODE); + END ELEM; + + UNIT VIRTUAL INSERT: PROCEDURE(V:NODE); + BEGIN + TOP:=NEW ELEM(TOP,V); + END INSERT; + + UNIT VIRTUAL DELETE: FUNCTION :NODE; + VAR E:ELEM; + BEGIN + IF TOP =/= NONE + THEN + RESULT:=TOP.V; + E:=TOP; TOP:=TOP.NEXT; KILL(E); + FI; + END DELETE; + + UNIT SE: COROUTINE ; + VAR I:INTEGER,V,W:NODE; + BEGIN + RETURN; CALL INSERT(ROOT); + DO + V:=DELETE; + IF V=NONE THEN EXIT FI; + ATTACH(V); + IF V.ANSWER + THEN + NUMBER_OF_ANSWERS:=NUMBER_OF_ANSWERS+1; + FOUND:=V; + IF OPT=NONE ORIF V.COST < OPT.COST + THEN + OPT:=V + FI; + DETACH; + (* HERE THE USER OF BACKTRACK MAY UNDERTAKE SOME ACTIONS + ON THE ANSWER NODES. IF NOT NECESSARY DO ATTACH *) + ELSE + IF V.DEADEND + THEN + NUMBER_OF_LEAVES:=NUMBER_OF_LEAVES+1; + CALL PURGE(V); + ELSE + DO + W:=V.NEXTSON; V.NSONS:=V.NSONS+1; + NUMBER_OF_NODES:=NUMBER_OF_NODES+1; + IF OK(W) + THEN + W.DEADEND:=W.LEAF; CALL INSERT(W); + FI; + IF V.LASTSON THEN EXIT FI; + OD; + FI; + FI; + OD; + FOUND:=NONE; + END SE; + + + UNIT KILLALL :PROCEDURE; + VAR V:NODE; + BEGIN + DO + V:=DELETE; + IF V=NONE THEN RETURN FI; + CALL PURGE(V); + OD; + END KILLALL; + + BEGIN + NUMBER_OF_NODES := 1; + SEARCH:=NEW SE; + INNER; + KILL(SEARCH); CALL KILLALL; + END BACKTRACK; + + + VAR N,M,I,J:INTEGER,H1,H2,H3:CHAR; + VAR INC: ARRAYOF ARRAYOF BOOLEAN, + f: file; + BEGIN + open(f, text, unpack("colourng.his")); + DO + + writeln; writeln; + writeln("An aplication of Backtracking to Graph Colouring"); + WRITE(" NUMBER OF VERTICES= (exit on zero) "); + + READLN(N); + + IF N=0 THEN EXIT FI; + call rewrite(f); + WRITEln(f," NUMBER OF VERTICES= ",N); + WRITE(" NUMBER OF COLOURS= "); + READLN(M); + WRITEln(f," NUMBER OF COLOURS= ",M); + ARRAY INC DIM (1:N); + FOR I:=1 TO N DO ARRAY INC(I) DIM (1:I); OD; + writeln;writeln; + WRITELN(" GIVE A GRAPH BY DEFINING SUCCESSIVE EDGES"); + WRITELN(" For each vertex give a list of adjacent vertices"); + WRITELN(" Don't give numbers less than number of current vertex"); + WRITELN(" TO END A LIST WRITE 0"); + Writeln(" Example: for i-th vertex give i+2,i+3 avoid i-5"); + FOR I:=1 TO N + DO + WRITELN(" VERTEX ",I:3," IS INCIDENT WITH VERTICES="); + WRITELN(f," VERTEX ",I:3," IS INCIDENT WITH VERTICES="); + DO + READ(J); WRITE(f,J); + IF J>1 AND J<=N THEN INC(J,I):=TRUE ELSE EXIT FI; + OD; + WRITELN(" END OF EDGES WITH VERTEX", I:3); + WRITELN(f," END OF EDGES WITH VERTEX", I:3); + OD; + WRITELN(" GRAPH HAS THE FOLLOWING INCIDENCE MATRIX"); + WRITELN(f," GRAPH HAS THE FOLLOWING INCIDENCE MATRIX"); + FOR I:=1 TO N + DO + FOR J:=1 TO I + DO + IF INC(I,J) + THEN WRITE(1:2); write(f,1:2) + ELSE WRITE(0:2); write(f,0:2) + FI; + OD; + WRITELN; writeln(f); + OD; + PREF BACKTRACK BLOCK + VAR K:INTEGER; + UNIT STATE: NODE CLASS(I,J,NC:INTEGER); + + (*I- VERTEX, J-COLOUR, NC-NUMBER OF COLOURS *) + + UNIT VIRTUAL ANSWER: FUNCTION: BOOLEAN; + BEGIN + RESULT:= I=N AND OKGO(THIS STATE) + END ANSWER; + + UNIT VIRTUAL LEAF: FUNCTION :BOOLEAN; + BEGIN + RESULT:=I=N OR NOT OKGO(THIS STATE) + END LEAF; + + UNIT OKGO: FUNCTION(V:STATE) : BOOLEAN; + VAR I,J:INTEGER; + BEGIN + I:=V.I; J:=V.J; + DO + V:=V.FATHER; + IF V=NONE THEN RESULT:=TRUE; EXIT FI; + IF V.J=J AND INC(I,V.I) THEN EXIT FI; + OD; + END OKGO; + + + UNIT VIRTUAL LASTSON: FUNCTION :BOOLEAN; + BEGIN + IF K=M + THEN + RESULT:=TRUE; + K:=0; + FI; + END LASTSON; + + UNIT VIRTUAL NEXTSON : FUNCTION :STATE; + VAR V:STATE,NCK:INTEGER; + BEGIN + V:=THIS STATE; + K:=K+1; + NCK:=NC; + DO + IF V=NONE THEN NCK:=NCK+1; EXIT FI; + IF V.J=K THEN EXIT FI; + V:=V.FATHER; + OD; + RESULT:=NEW STATE(THIS STATE,I+1,K,NCK); + call DISPLAY(result); + END NEXTSON; + + UNIT VIRTUAL EQUAL: FUNCTION(S:STATE):BOOLEAN; + BEGIN + RESULT:=I=S.I AND J=S.J + END EQUAL; + + UNIT VIRTUAL COST: FUNCTION :REAL; + BEGIN + RESULT:=NC + END COST; + + + BEGIN + RETURN; + DO + DETACH + OD; + END STATE; + + + UNIT DISPLAY: PROCEDURE(V:STATE); + BEGIN + IF V=NONE + THEN WRITELN(" NO SOLUTIONS"); writeln(f,"no solutions"); RETURN + FI; + WRITE("State no:",V.MY_NUMBER); + if V.FATHER <>none then WRITE(" son of state:",V.FATHER.MY_NUMBER) fi; + if V.ANSWER then WRITELN(" SOLUTION! ") + else + if V.LEAF then WRITELN(" DEADEND ") + else WRITELN + fi + fi; + WRITE(f,"State no:",V.MY_NUMBER); + if V.FATHER <>none then WRITE(f," son of state:",V.FATHER.MY_NUMBER) fi; + if V.ANSWER then WRITELN(f," SOLUTION! ") + else + if V.LEAF then WRITELN(f," DEADEND ") + else WRITELN(f) + fi + fi; + WRITELN("VERTEX COLOUR"); + WRITELN(f,"VERTEX COLOUR"); + DO + WRITE(V.I); WRITE(" "); WRITELN(V.J); + WRITE(f,V.I); WRITE(f," "); WRITELN(f,V.J); + V:=V.FATHER; + IF V=NONE THEN EXIT FI + OD; + WRITELN; + END DISPLAY; + + BEGIN + READLN; + ROOT:=NEW STATE(NONE,1,1,1); + call DISPLAY(ROOT); + WRITE("DO YOU WANT TO OPTIMIZE "); + WRITELN("OR TO PRINT ALL THE SOLUTIONS ?"); + WRITELN(" (ANSWER OPT OR ALL)"); + READLN(H1,H2,H3); + IF H1='O' AND H2='P' AND H3='T' + THEN + DO + ATTACH(SEARCH); + IF FOUND=NONE THEN EXIT FI; + IF OPT =/= NONE ANDIF OPT.COST
    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 andif l>0 andif k<47 andif l<36 then b:=true; exit fi; + od; + if b then call A.przesunpion(i); + else call A.przesunpion(0); + fi; + detach; + od; + end player; + + +unit gracz1:coroutine(g,eh,spp:integer); + +var stran :arrayof integer; +var pp,j,i,nrkil,witch :integer; +var home :arrayof boolean; +var polepos :boolean; + +unit man:class; (* pawn *) + var ple,saf,rsa :integer; + var kil,hun,fin,mov :boolean; +end man; + +var pawn :arrayof man; + +unit pawns:procedure; + var h:integer; + begin + for i:=1 to 4 do + pawn(i).ple:=tab(g,i); + od; + pp:=0; + polepos:=true; + for i:=1 to 4 do home(i):=false; od; + for i:=1 to 4 do + h:=tab(g,i); + if h=0 then pp:=pp+1 fi; + if h=spp then polepos:=false fi; + if h>100 then home(h-100):=true fi; + od; + if pp=0 then polepos:=false fi; +end pawns; + +unit finish:function:boolean; + unit inhome:function(a:integer):boolean; + begin + result:=false; + if a>1 andif a<=eh andif a+kostka>eh then + if a+kostka-eh<5 andif not home(a+kostka-eh) then + result:=true; + pawn(i).mov:=true; + else + pawn(i).mov:=false; + fi; + else + pawn(i).mov:=true; + fi; + end inhome; + begin + result:=false; + for i:=1 to 4 do + pawn(i).fin:=false; + if pawn(i).ple>0 andif pawn(i).ple<99 then + if inhome(pawn(i).ple) then + result:=true; + pawn(i).fin:=true; + fi + else + pawn(i).mov:=false; + fi; + od; +end finish; + +unit killer:function:integer; + begin + for i:=1 to 4 do + pawn(i).kil:=false; + pawn(i).hun:=false; + j:=pawn(i).ple; + if j>0 andif j<50 then + j:=j+kostka; + if j>40 then j:=j-40 fi; + if stran(j)=/=0 then + if stran(j)=/=g then + pawn(i).hun:=true + else + pawn(i).kil:=true; + pawn(i).mov:=false; + result:=result+1; + fi; + fi; + fi; + od; +end killer; + +unit strangers:procedure; + begin + for i:=1 to 40 do stran(i):=0;od; + for i:=1 to 4 do + for j:=1 to 4 do + if tab(i,j)>0 andif tab(i,j)<50 then + stran(tab(i,j)):=i; + fi; + od; + od; +end strangers; + +unit safety:procedure; + unit rafset:function(a:integer):integer; + var b,c,p:integer; + var finplo :boolean; + begin + if a>40 then a:=a mod 40 fi; + result:=0; + finplo:=false; + if a mod 10=1 then + if (a+9) div 10 =/=g then result:=1 fi; + fi; + for p:=1 to 6 do + if a = 1 then a:=40; + else a:=a-1; + fi; + b:=stran(a); + if a mod 10 =0 then finplo:=true fi; + if b=/=0 andif b=/=g then + if finplo then + c:=(((a-1) div 10)+2) mod 4; + if c=0 then c:=4 fi; + if c=/=g then result:=result+1 fi; + else + result:=result+1; + fi; + fi; + od; + end rafset; + begin + for i:=1 to 4 do + if pawn(i).ple>0 andif pawn(i).ple<99 then + pawn(i).saf:=rafset(pawn(i).ple); + pawn(i).rsa:=pawn(i).saf-rafset(pawn(i).ple+kostka); + else + pawn(i).saf:=6; + pawn(i).rsa:=-12; + fi; + od; +end safety; + +unit move:procedure; + var speed:boolean; + var moves:arrayof boolean; + begin + j:=-12; + + speed:=true; + array moves dim(1:4); + for i:=1 to 4 do + moves(i):=false; + if not pawn(i).kil andif pawn(i).hun then + moves(i):=true; + speed:=false; + fi + od; + for i:=1 to 4 do + if not pawn(i).kil andif pawn(i).ple>0 andif pawn(i).mov then + if speed orif moves(i) then + if pawn(i).rsa>j then + witch:=i; + j:=pawn(i).rsa + fi + fi + fi + od; + kill (moves); + if witch>4 then witch:=0 fi; +end move; + +begin + array pawn dim(1:4); + array home dim(1:4); + array stran dim(1:40); + for i:=1 to 4 do + pawn(i):=new man; + od; + return; + do + call pawns; + call strangers; + if finish then + for i:=1 to 4 do + if pawn(i).fin then witch:=i fi; + od; + else + if polepos and kostka=6 then + i:=1; + while tab(g,i)=/=0 do i:=i+1; od; + if i>4 then i:=4 fi; + witch:=i; + else + nrkil:=killer; + witch:=0; + if nrkil=/=4-pp then + call safety; + call move; + fi; + fi; + fi; + call A.przesunpion(witch); + detach; +od; +end gracz1; +(* * * * * *) + + + unit gracz3:coroutine; + + unit possible_pool:function(gracz,pion,kostka:integer):integer; + var beg,dom,i:integer,b:boolean; + begin + beg:=(gracz-1)*10+1; + if tab(gracz)(pion)=0 then + if kostka=6 then result:=beg; + else result:=0; + fi; + else + if tab(gracz)(pion)>=100 then result:=0; + else + if tab(gracz)(pion)=beg then + dom:=kostka+tab(gracz)(pion)+100; + for i:=1 to 4 do + b:=false; + if tab(gracz)(i)=dom then b:=true; fi; + if b then result:=0; else result:=100; fi; + od; + else + b:=false; + for i:=1 to 4 do + if i<>pion andif tab(gracz)(pion)+kostka=tab(gracz)(i) then + b:=true; + fi; + od; + if b then result:=0; + else result:=tab(gracz)(pion)+kostka; + fi; + fi; + fi; + fi; + end possible_pool; + + unit inni_w_domu:function(gracz:integer):integer; + var i:integer; + begin + result:=0; + for i:=1 to 4 do + if tab(gracz)(i)>=100 then result:=result+1; + fi; + od; + end inni_w_domu; + + unit inni_jeszcze_w_domu:function(gracz:integer):integer; + var i:integer; + begin + result:=0; + for i:=1 to 4 do + if tab(gracz)(i)=0 then result:=result+1; + fi; + od; + end inni_jeszcze_w_domu; + + unit wyjscie_z_domu:function(pion:integer):integer; + begin + if tab(3)(pion)=0 and kostka=6 then result:=1; + else result:=0; + fi; + end wyjscie_z_domu; + + unit state_of_player:function(player:integer):integer; + var i:integer; + begin + result:=0; + for i:=1 to 4 do + if tab(player,i)=0 then result:=result-1; + else + if tab(player,i)>=100 then result:=result+2; + fi; + fi; + od; + if result<0 then result:=0; + fi; + end state_of_player; + + unit pod_biciem:function(pool:integer):integer; + var i,j,k:integer; + begin + if pool=0 or pool>=100 then result:=0; + else + for i:=1 to 4 do + if i<>3 then + for j:=1 to 4 do + for k:=1 to 6 do + if possible_pool(i,j,k)=pool then result:=result+1; + fi; + od; + od; + fi; + od; + fi; + end pod_biciem; + + unit wyjscie_spod_bicia:function(pion:integer):integer; + var p,k:integer; + begin + p:=pod_biciem(tab(3)(pion)); + if p>0 then + k:=pod_biciem(possible_pool(3,pion,kostka)); + if p-k>0 then result:=p-k; + else + if p=k then result:=spodmn*p; + else result:=0; + fi; + fi; + fi; + end wyjscie_spod_bicia; + + unit wejscie_pod_bicie:function(pion:integer):integer; + begin + result:=pod_biciem(possible_pool(3,pion,kostka)); + end wejscie_pod_bicie; + + unit bicie:function(pion:integer):integer; + var i,j,p:integer; + begin + result:=0; + p:=possible_pool(3,pion,kostka); + if p<100 then + for i:=1 to 4 do + if i<>3 then + for j:=1 to 4 do + if tab(i,j)=p then result:=state_of_player(i)*3; + fi; + od; + fi; + od; + fi; + end bicie; + + unit stoi_moj:function(pole:integer):boolean; + var pion:integer; + begin + result:=false; + for pion:=1 to 4 do + if tab(3,pion)=pole then result:=true; fi; + od; + end stoi_moj; + + unit dom:function(pion:integer):integer; + begin + if tab(3)(pion)<100 and possible_pool(3,pion,kostka)>=100 then + result:=1; + else result:=0; + fi; + end dom; + + var turniej:arrayof integer; + var ii,j:integer; + var spodmn,inni,innij:integer; + + begin + array turniej dim(1:4); + spodmn:=2; + return; + do +(* call A.gdziepiony; *) + for ii:=1 to 4 do turniej(ii):=0; od; + inni:=inni_w_domu(1); + inni:=inni+inni_w_domu(2); + inni:=inni+inni_w_domu(4); + innij:=inni_jeszcze_w_domu(1); + innij:=innij+inni_jeszcze_w_domu(2); + innij:=innij+inni_jeszcze_w_domu(4); + for ii:=1 to 4 do + turniej(ii):=turniej(ii)+dom(ii)*inni*3; + turniej(ii):=turniej(ii)+wyjscie_z_domu(ii)*(inni+innij); + turniej(ii):=turniej(ii)+bicie(ii); + turniej(ii):=turniej(ii)-wejscie_pod_bicie(ii); + turniej(ii):=turniej(ii)+wyjscie_spod_bicia(ii); + od; + for ii:=1 to 4 do + if possible_pool(3,ii,kostka)=0 + orif stoi_moj(possible_pool(3,ii,kostka)) + then turniej(ii):=-1; fi; + od; + j:=1; + for ii:=2 to 4 do + if turniej(ii)>turniej(j) then j:=ii; + fi; + if turniej(ii)=turniej(j) then + if tab(3)(ii)>tab(3)(j) then j:=ii; + fi; + fi; + od; + if turniej(j)>=0 then + call A.przesunpion(j); + fi; + detach; + od; + end gracz3; + +(***************************************************************) + + +unit gracz4: coroutine; +const g=4; +const start=31; +const endpos=30; + +var players : arrayof boy; + +unit boy:class; + var pos,back : integer; + var suicide,stab,finish,moveout : boolean; +end boy; + +unit playerinit:procedure; +var i:integer; + begin + for i:=1 to 4 do + players(i).pos:=tab(g,i); + od; +end playerinit; + +unit finishing:function(nr:integer):boolean; + var i,j:integer; + begin + result:=false; + i:=players(nr).pos; + if i<>0 + then + if i+kostka>endpos and i+kostka nr + then + if (players(j).pos-100+1)=i+kostka-endpos + then result:=false; + fi; + fi; + od; + fi; + fi; +end finishing; + +unit suiciding:function(nr:integer):boolean; + var i:integer; + begin + result:=false; + if players(nr).pos<>0 + then + for i:=1 to 4 + do + if nr<>i + then + if (players(nr).pos+kostka-1) mod 40 + 1 = players(i).pos + andif players(i).pos<100 + then + result:=true; + exit; + fi; + fi; + od + else + for i:= 1 to 4 + do + if i<>nr andif players(i).pos=start + then result:=true; + exit; + fi; + od; + fi; +end suiciding; + +unit stabing:function(nr:integer):boolean; + var i,j:integer; + var b1,b2:boolean; + begin + result:=false; + for i:=1 to 4 + do + if i<>g + then + for j:= 1 to 4 + do + if players(nr).pos > 0 and players(nr).pos <100 + then + b1:=(players(nr).pos+kostka-1) mod 40 +1 =tab(i,j) ; + b2:=players(nr).pos>=start and b1; + if b1 and (players(nr).pos+kostka-1) mod 40 + 1<=endpos orif b2 + then + result:=true; + exit exit; + fi + else + result:=(kostka=6 and players(nr).pos=0 and tab(i,j)=start); + exit exit; + fi; + od; + fi; + od; +end stabing; + +unit atback:function(nr:integer):integer; + var i,j,np:integer; + begin + np:=players(nr).pos; + result:=0; + if np<>0 + then + if np < 7 + then + for i:=1 to 4 + do + if i<>g + then + for j:=1 to 4 + do + if (tab(i,j) < np) + then + if tab(i,j)>0 + then result:=result+1; + fi + else + if tab(i,j) > 40-(6-np) + then result:=result+1; + fi; + fi; + od; + fi; + od; + else + for i:=1 to 4 + do + if i<>g + then + for j:=1 to 4 + do + if tab(i,j) < np + andif tab(i,j) > np-7 + then result:=result +1; + fi; + od; + fi; + od; + fi; + fi; + end atback; + + unit begining : function(nr:integer):boolean; + begin + result:=players(nr).pos=0 and kostka=6; + end begining; + + unit move:function:integer; + var i,j,k : integer; + var ok:boolean; + begin + for i:= 1 to 4 + do + players(i).back:=atback(i); + players(i).suicide:=suiciding(i); + players(i).stab:=stabing(i); + players(i).finish:=finishing(i); + players(i).moveout:=begining(i); + od; + ok:=false; + (********************* bije i wychodzi ************) + for i:=1 to 4 + do + if players(i).moveout + then + for j:=1 to 4 + do + if g<>j + then + for k:=1 to 4 + do + if tab(j,k)=start + then + result:=i; + ok:=true; exit exit exit; + fi; + od; + fi; + od; + fi; + od; + (******************** gonia go i konczy **************) + if not ok + then + for i:=1 to 4 + do + if players(i).pos>0 + andif players(i).pos<100 + andif players(i).finish + andif players(i).back > 0 + then + result:=i; + ok:=true; exit; + fi; + od; + fi; + (******************** gonia go i bije ******************) + if not ok + then + for i:=1 to 4 + do + if players(i).pos<100 + andif players(i).back>0 + andif players(i).stab + then + result:=i; + ok:=true; exit; + fi; + od; + fi; + (******************* bije ********************************) + if not ok + then + for i:=1 to 4 + do + if players(i).stab + then + result:=i; + ok:=true; exit; + fi; + od; + fi; + (******************** goni go conajmniej dwoch **********) + if not ok + then + for i:=1 to 4 + do + if players(i).pos<100 + andif players(i).back>=2 + andif not players(i).suicide + then + result:=i; + ok:=true; exit; + fi; + od; + fi; + (******************* wychodzi ****************************) + if not ok + then + for i:=1 to 4 + do + if players(i).moveout + andif not players(i).suicide + then + result:=i; + ok:=true; exit; + fi; + od; + fi; + + (******************* konczy *******************************) + if not ok + then + for i:=1 to 4 + do + if players(i).finish + then + result:=i; + ok:=true; exit; + fi; + od; + fi; + + (******************** gonia go **********) + if not ok + then + for i:=1 to 4 + do + if players(i).pos<100 + andif players(i).pos>0 + andif players(i).back>0 + andif not players(i).suicide + then + result:=i; + ok:=true; exit; + fi; + od; + fi; + (******************* nie bije swojego *********************) + if not ok + then + for i:=4 downto 1 + do + if players(i).pos<100 + andif players(i).pos>0 + andif not players(i).suicide + then + result:=i; + ok:=true; exit; + fi; + od; + fi; + (******************* bije swojego *********************) + if not ok + then + for i:=1 to 4 + do + if players(i).suicide + then + result := 0 ; + ok:=true; exit; + fi; + od; + fi; + + + if not ok then result:=0 fi; + + + end move; + + + + + + + (****** MAIN *****) + (*****************) +var aa:char; + + var i,m:integer; + begin + array players dim(1:4); + for i:=1 to 4 + do + players(i):=new boy; + od; + return; + do + call playerinit; + m:=move; + call A.przesunpion(m); + + detach; + od; +end gracz4; + + + (********* * * * * * * * * * * * *************) + + + unit arbiter:iiuwgraph coroutine; + + var x,y,zawod,i,j,ktory,sk : integer; + var polestartu,skon,zero,wejscie,plansza: arrayof integer; + var dom,old,tabcub : arrayof arrayof integer; + var tabpi : arrayof arrayof arrayof integer; + var dtab : arrayof arrayof string; + var ctabs : arrayof string; + + const c=1.3; +(********** plan **************) + + unit line:class(x1,y1,x2,y2:integer); + end line; + + unit inchar : function: integer; + var i : integer; + begin + do + i := inkey; + if i <> 0 then exit fi; + od; + result := i; + end inchar; + + unit OUTHLINE: procedure(b:string); + var i,j:integer; + var a :arrayof char; + + begin + a:=unpack(b); + i:=upper(a); + for j:=1 to i do + call hascii(0); + call hascii(ord(a(j))); + od; + kill (a); + end outhline; + unit sdrp:procedure(a,b,c,d:integer); + begin + call move(a,c); + call draw(b,c); + call draw(b,d); + call draw(a,d); + call draw(a,c); + end sdrp + + unit sdrp1:procedure; + begin + call sdrp(45,76,23,49); + call move(76,23); + call draw(80,26); + call draw(80,52); + call draw(49,52); + call draw(45,49); + end sdrp1; + + unit sdrp2:procedure; + begin + call sdrp(48,82,23,49); + call move(82,49); + call draw(78,52); + call draw(44,52); + call draw(44,26); + call draw(48,23); + end sdrp2; + + unit sdrp3:procedure; + begin + call sdrp(48,82,26,52); + call move(48,52); + call draw(44,49); + call draw(44,23); + call draw(78,23); + call draw(82,26); + end sdrp3; + + unit sdrp4:procedure; + begin + call sdrp(45,76,26,52); + call move(45,26); + call draw(49,23); + call draw(80,23); + call draw(80,49); + call draw(76,52); + end sdrp4; + + + unit drp1:procedure(a,b:integer,t:arrayof string); + begin + call move(a,b); + call outhline(t(1)); + call move(a,b+8); + call outhline(t(2)); + call move(a,b+16); + call outhline(t(3)); + end drp1 + + unit drp11:procedure(d:integer); + begin + call sdrp1; + call drp1(51,25,dtab(d)); + end; + + unit drp21:procedure(d:integer); + begin + call sdrp2; + call drp1(53,25,dtab(d)); + end; + + unit drp31:procedure(d:integer); + begin + call sdrp3; + call drp1(53,28,dtab(d)); + end; + + unit drp41:procedure(d:integer); + begin + call sdrp4; + call drp1(51,28,dtab(d)); + end; + + unit mktab:procedure; + var i,j:integer; + begin + array tabpi dim(1:4); + for i:=1 to 4 do + array tabpi(i) dim(1:4); + for j:=1 to 4 do + array tabpi(i,j) dim(1:200); + od; + od; + for i:=1 to 4 do + call cls; + call drp11(i); + call move(43,22); + tabpi(i,1):=getmap(84,54); + od; + + for i:=1 to 4 do + call cls; + call drp21(i); + call move(43,22); + tabpi(i,2):=getmap(84,54); + od; + + for i:=1 to 4 do + call cls; + call drp31(i); + call move(43,22); + tabpi(i,3):=getmap(84,54); + od; + + for i:=1 to 4 do + call cls; + call drp41(i); + call move(43,22); + tabpi(i,4):=getmap(84,54); + od; + end mktab; + + unit piszpion:coroutine(x,y,k:integer); + var i,j:integer; + begin + return; + do + call move(x,y); + for i:=1 to 2 do + call putmap(tabpi(ktory,k)); + for j:=1 to 30 do od; + call putmap(zero); + for j:=1 to 30 do od; + od; + call putmap(tabpi(ktory,k)); + detach; + od; + end piszpion; +var pl:arrayof arrayof arrayof piszpion; + + + unit mkpl:procedure; + var a,b,c,i,j:integer; + + begin + array pl dim(0:104); + array pl(0) dim(1:4); + for i:=1 to 4 do + array pl(0,i) dim (1:4); + array pl(100+i) dim (1:4); + for j:=1 to 4 do + array pl(100+i,j) dim (1:1); + od; + od; + for i:=1 to 40 do + array pl(i) dim(1:1); + array pl(i,1) dim(1:1); + od; + +open(f,integer,unpack("pola")); +call reset(f); + +for i:=1 to 40 do +get(f,a); +get(f,b); +get(f,c); +pl(i,1,1):=new piszpion(a,b,c); +od; + +for i:=1 to 4 do +for j:=1 to 4 do +get(f,a); +get(f,b); +get(f,c); +pl(0,i,j):=new piszpion(a,b,c); +od; +od; + +for i:=1 to 4 do +for j:=101 to 104 do +get(f,a); +get(f,b); +get(f,c); +pl(j,i,1):=new piszpion(a,b,c); +od; +od; + +end mkpl; + unit sq:procedure(x,y:integer); + begin + call move(c*(x+1)+40,20+y+1); + call draw(c*(x+35)+40,20+y+1); + call draw(c*(x+35)+40,20+y+35); + call draw(c*(x+1)+40,20+y+35); + call draw(c*(x+1)+40,20+y+1); + end sq; + + unit cube:procedure; + begin + call move(0,8); + call draw(32,8); + call draw(32,34); + call draw(0,34); + call draw(0,8); + call draw(10,0); + call draw(41,0); + call draw(32,8); + call move(41,0); + call draw(41,26); + call draw(32,34); + end; + + unit cubes:procedure(i,a,b,c:integer); + begin + call cube; + call move(4,9); + call outhline(ctabs(a)); + call move(4,17); + call outhline(ctabs(b)); + call move(4,25); + call outhline(ctabs(c)); + call move(0,0); + tabcub(i):=getmap(41,34); + call cls; + end cubes; + + unit cu:procedure(i,j:integer); + begin + call move(310,70); + call outhline("PLAYER : "); + case j + when 1: call outhline("1"); + when 2: call outhline("2"); + when 3: call outhline("3"); + when 4: call outhline("4"); + esac; + call move(360,80); + call putmap(tabcub(i)); + end cu; + + unit hjm:procedure(nw:arrayof arrayof integer); + var i,j,x:integer; + var z:string; + unit drp:procedure(i,j:integer); + var b1,b2:boolean; + begin + b1:=old(i,j)=0; + if not b1 then b2:=plansza(old(i,j))=0 fi; + if b2 or b1 then + if b1 then + attach(pl(0,i,j)); + else + attach(pl(old(i,j),1,1)); + fi; + call putmap(zero); fi; + if nw(i,j)=0 then x:=ktory; + ktory:=i; + attach(pl(0,i,j)); + ktory:=x; + else + if nw(i,j)>100 then attach(pl(nw(i,j),i,1)); + else attach(pl(nw(i,j),1,1)); + fi; + fi; + end drp; + begin + i:=ktory; + do + for j:=1 to 4 do + if old(i,j)<>nw(i,j) then call drp(i,j); fi; + old(i,j):=nw(i,j); + od; + i:=i mod 4 +1; + if i=ktory then exit fi; + od; + end; + + unit drpl:procedure; + var i,x,y,x1,x2,y1,y2:integer; + begin + call gron(1); + open(f,integer,unpack("plan")); + call reset(f); + for i:=1 to 47 do + + get(f,x1); + get(f,y1); + call move(x1,y1); + get(f,x2); + get(f,y2); + call draw(x2,y2); + + + x:=735-x1; + y:=y1; + call move(x,y); + x:=735-x2; + y:=y2; + call draw(x,y); + + x:=735-x1; + y:=328-y1; + call move(x,y); + x:=735-x2; + y:=328-y2; + call draw(x,y); + + x:=x1; + y:=328-y1; + call move(x,y); + x:=x2; + y:=328-y2; + call draw(x,y); + + od; + + end drpl; + + unit starter:procedure; + var i,j:integer; + begin + array zero dim(1:1300); + call gron(1); + call move(0,0); + zero:=getmap(42,32); + call cubes(1,1,2,1); + call cubes(2,3,1,4); + call cubes(3,3,2,4); + call cubes(4,5,1,5); + call cubes(5,5,2,5); + call cubes(6,5,5,5); + call mktab; + call mkpl; + call drpl; + call sq(72,0); + call sq(395,36); + call sq(395,252); + call sq(72,216); + for i:=1 to 4 do + for j:=1 to 4 do + ktory:=i; + attach(pl(0,i,j)); + od; + od; + i:=inchar; + + end starter; + +(************** end plan ***********) + + + unit przesunpion:procedure(co:integer); + var g,s,t:integer; + + unit start:procedure; + begin + g:=polestartu(ktory); + tab(ktory,co):=g; + if plansza(g)=/=0 then + tab((plansza(g)/10),(plansza(g) mod 10)):=0; + fi; + plansza(g):=ktory*10+co; + end start; + begin + if co<1 orif co>4 then return fi; + if ktory<1 orif ktory>4 then return fi; + s:=tab(ktory,co); + g:=s+kostka; + if s>100 then return fi; + if s=0 then + if kostka=6 then call start fi; + return; + fi; + t:=wejscie(ktory); + if s<=t andif g>t then + t:=g-t; + if t<5 andif dom(ktory,t)=0 then + dom(ktory,t):=co; + tab(ktory,co):=100+t; + plansza(s):=0; + fi; + return; + else + if g>40 then g:=g-40 fi; + if plansza(g)=/=0 then + tab((plansza(g)/10),(plansza(g) mod 10)):=0; + fi; + tab(ktory,co):=g; + plansza(g):=plansza(s); + plansza(s):=0; + fi; + end przesunpion; + + unit koniec: function: boolean; + var doszedl: boolean; + begin + doszedl:=true; + for i:=1 to 4 + do + if dom(ktory,i)=0 then + doszedl:=false;exit + fi + od; + if doszedl then + sk:=sk+1; + skon(ktory):=sk; + fi; + result:= sk=4 + end koniec; + + unit komunikat: procedure; + var m: arrayof integer; + begin + array m dim (1:4); + for i:=1 to 4 do + m(skon(i)):=i; + od; + call groff; + writeln; + for i:=1 to 4 do + writeln (i:1," miejsce zajal gracz ",m(i):1) + od + end komunikat; + +begin (* arbiter *) + array tab dim (1:4); + array old dim (1:4); + array dom dim (1:4); + array ctabs dim (1:5); + array tabcub dim (1:6); + array plansza dim (1:40); + array skon dim (1:4); + array wejscie dim (1:4); + array polestartu dim (1:4); + array dtab dim(1:4); + for i:=1 to 4 + do + skon(i):=0; + array tabcub(i) dim(1:200); + array dtab(i) dim (1:3); + array tab(i) dim (1:4); + array old(i) dim (1:4); + array dom(i) dim (1:4); + polestartu(i):=10*(i-1)+1; + wejscie(i):=polestartu(i)-1; + od; + wejscie(1):=40; + for i:=5 to 6 do + array tabcub(i) dim(1:200); + od; + ctabs(1):=" "; + ctabs(2):=" * "; + ctabs(3):="* "; + ctabs(4):=" *"; + ctabs(5):="* *"; + dtab(1,1):=" 1 "; + dtab(1,2):=" 1 "; + dtab(1,3):=" 1 "; + dtab(2,1):="2 "; + dtab(2,2):=" 2 "; + dtab(2,3):=" 2"; + dtab(3,1):=" 3"; + dtab(3,2):=" 3 "; + dtab(3,3):="3 "; + dtab(4,1):=" "; + dtab(4,2):="444"; + dtab(4,3):=" "; + + return; + call starter; + ktory:=0; + do + ktory:= (ktory mod 4) + 1; + if skon(ktory)=/=0 then repeat fi; + do + kostka:=entier(random*6)+1; + call cu(kostka,ktory); + attach (gracz(ktory)); + call hjm(tab); + if koniec then exit exit fi; + if kostka=/=6 or skon(ktory)=/=0 then exit fi + od + od; + call komunikat; + read (i); + call endrun +end arbiter; + + var A: arbiter; +(* * * * * *) +begin (* program glowny *) +array gracz dim (1:4); +writeln ("Type how many PLAYERS want to enjoy game"); +read(ia); +for i:=1 to ia do +gracz(i) := new player(i); +od; +if ia=0 then ia:=1;gracz(1):=new gracz1(1,40,1); fi; +for i:=ia+1 to 2 do +gracz(i) := new gracz1(i,(i-1)*10,i*10-9); +od; +gracz(3):=new gracz3; +gracz(4):=new gracz4; +A := new arbiter; +attach (A) +end chinczyk + \ No newline at end of file diff --git a/examples/chin/chinczyk.pcd b/examples/chin/chinczyk.pcd new file mode 100644 index 0000000000000000000000000000000000000000..978d54b975d109e7a8f2d5490378f928b7966fc7 GIT binary patch literal 2560 zcmZwIYiJx*6bJCLGrP0RW0UMQyGt-6n-rTS*<`I~jGJuIO`Et$jA^RW#|JBxVy(44 zs(w(YSkP*M_(i0pEmA=cLJ&WwwTM!xRqLaM8qrWwLREYQtw^P&jQ=}x&+ZwV3uk9` z?{ChTd*|L++YXyYC`yNn5UF;=2+&;6Ii(e3+opSp&xK$Gx!)!YqA9rZ+7Vol(Qiek zeme;Fr?0ydOj9#GZ&W&$9xx2blyer_MhV@z%i~nxoKGUx6x@~w_er-s62l!o3!~a| zI9^lb=W{M>x3o?^7uFzHFe({Rc7|D8#xxT>q#6L5Rr;t4<3kSL?D z)A5)Qq{rb_3+LW7VTLn_Y6{UK=vVDg9G8W2Gbk5IDyP~*FuM_llFnCr*tSIvV+v>B zUQI@I-CZybB97IST$mnkrrM+vb(~N2-Ve8@UOM;Oq1@ ze>>tnL~EmT_v*S=H*(#rc((VzB~sFD)2=ba5!_9e| zdyPp8Ob)5*(juLEZc?Hps-K7YWfR;|tDn2rT1D=L z7>Aia6xyWQsOwI&vAYrGCd4ZqH>TZm(GA0lB9=XFM7vNs=Np14AU3zlx;JRIrCrVQ z2K4t~JrCj-NlTa4E|He=oP&GGX@9+!n%+v%4t z+sW%?E!NBRa4&e=wR#-;JJtTppuYog6(W+6`8s*L8D1}KFloe)a2B=0O=AU&XDYDn zxwXRGDje_g5Z#sGb+sC14dTTvzDn)i7M<^K7uRjVI=vEZ*5g*e&7kgl7r%$<;Zks~ zcguVYI^WUmmHPgYa96-Rm6fhe=bOydkmYp5;1Y1BdZeq>?o1EQa|A95H`6O!wRUgy z*64MwdMn`~xsv1ennj5mk2j2b6>xinv#87&hecC4zCQ!bf?M>spi|ePUvfMzmjea` z;J)fB)wRgRBbmlXzw6`u`w!f5AVA&y(p}On-@j77Pyd3u2)AmTbbo7?UdMHp;4Z+G z<)!;WyI7vb@iW}-a7R7vSM84Hd0xJU`w1>EAoKmGUHJg#I|p|jZimM$YPY-S=HV9L z&UoBe?amJH|L<%dNZ-QQ8)V%%$AxLdV5Rt9_!6#Wu;hT87N)vEb$?%=U$xUXem&%z z;={Ii9faxJP*l9fKZn~|@N+v0^1bmH+_qsqw`-W+f1kj7ia0q^au%J^<2XIS?j+2| zh#y9!`v`6ZD`06&t mSsQu(9)o)iZeXJ1EPB@&N0vq>c)h#{_YPdmCh6XG#_=D0JU0md literal 0 HcmV?d00001 diff --git a/examples/chin/li1004.ccd b/examples/chin/li1004.ccd new file mode 100644 index 0000000000000000000000000000000000000000..a76d6f3b2c51abb3fda8b6dac5dde231317433de GIT binary patch literal 18978 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 literal 0 HcmV?d00001 diff --git a/examples/geometri/convexh1.log b/examples/geometri/convexh1.log new file mode 100644 index 0000000..47e5bb3 --- /dev/null +++ b/examples/geometri/convexh1.log @@ -0,0 +1,395 @@ +PROGRAM OTOCZKA; + +(*Program znajduje najmniejszy wypukly wielokat zawierajacy zadany zbior*) +(* punktow. *) +(* autor: Joanna Hybel *) +(*program nr 5 jest przedmiotem zal. PP II *) + +VAR i,j,k,licz,ix:integer, + pom:punkt, + punkty:arrayof punkt; (*zbior punktow*) + +UNIT punkt:class; + var + x,y:integer, + theta:real; +end punkt; + + +begin + pref iiuwgraph block + + UNIT hframe:procedure(x,y,length,width:integer); + (*---------------------------------------------*) + begin + call move(x,y); + call draw(x+width,y); + call draw(x+width,y+length); + call draw(x,y+length); + call draw(x,y); + end hframe; + + UNIT hwrite:procedure(tekst:string;x,y:integer); + (*---------------------------------------------*) + var i:integer, + tab:arrayof char; + begin + tab:=unpack(tekst); + call move(x,y); + for i:=lower(tab) to upper(tab) + do + call hascii(ord(tab(i))); + od; + end; + +UNIT inchar:function:integer; + (*---------------------------------------------*) +var ii:integer; +begin +do + ii:=inkey; + if ii<>0 then exit fi; +od; +result:=ii; +end inchar; + + UNIT zmaz :procedure(x,y,dl,sz:integer); + (*---------------------------------------------*) + begin + dl:=dl div 8; + sz:=sz div 8; + for i:=1 to dl do + for j:=1 to sz do + call move(x+(j-1)*8,y+(i-1)*8); + call hascii(0); + od; + od; + end zmaz; + +UNIT wpisz_theta:procedure; + (*---------------------------------------------*) + + UNIT uzup_theta:function(p:punkt):real; + var dx,dy:integer, + th:real; +begin + dx:=p.x-punkty(1).x; + dy:=p.y-punkty(1).y; + if dx=0 and dy=0 then th:=0 + else + th:=dy/(abs(dx)+abs(dy)); + fi; + if dx<0 then th:=2-th + else + if dy<0 then th:=th+4 fi; + fi; + result:=th*90.0; +end uzup_theta; +begin + for i:=1 to licz do + punkty(i).theta:=uzup_theta(punkty(i)); + od; +end wpisz_theta; + +UNIT rys_otocz:procedure; + (*---------------------------------------------*) + UNIT czysc:procedure(p1,p2:punkt); + begin + call move(p2.x,p2.y); + call color(0); + call draw(p1.x,p1.y); + call color(1); + call cirb(p2.x,p2.y,2,3,3,1,1,2,2); + call cirb(p1.x,p1.y,2,3,3,1,1,2,2); + end czysc; + + UNIT rys:procedure(p1,p2:punkt); + begin + call color(11); + call move(p2.x,p2.y); + call draw(p1.x,p1.y); + end rys; + +UNIT po_tej_samej_str: function(p1,p2,p3:punkt):boolean; + (*Czy punkty punkty(1),p3 leza po tej samej stronie prostej p1,p2?*) + var dx1,dx2,dx3,dy1,dy2,dy3,k,l:real; + begin + dx1:=p2.x-p1.x; + dy1:=p2.y-p1.y; + dx2:=p3.x-p1.x; + dy2:=p3.y-p1.y; + dx3:=punkty(1).x-p1.x; + dy3:=punkty(1).y-p1.y; + k:=(dy2*dx1-dy1*dx2); + l:=(dy3*dx1-dy1*dx3); + if k=0 orif l=0 then result:=true; + else + if k>0 then result:=(l>0); + else result:=(l<0); + fi; + fi; + end po_tej_samej_str; +begin + call hwrite("press any key to draw a CONVEX HULL",24,316); + i:=2; k:=3; + call rys(punkty(1),punkty(2)); + for j:=3 to licz + do + ix:=inchar; + k:=j; + do + if po_tej_samej_str(punkty(i-1),punkty(i),punkty(k)) then + i:=i+1; exit; + else + call czysc(punkty(i-1),punkty(i)); + i:=i-1; + fi; + od; + pom:=punkty(i); + punkty(i):=punkty(k); + punkty(k):=pom; + call rys(punkty(i-1),punkty(i)); + od; + call rys(punkty(i),punkty(1)); + call zmaz(24,304,32,580); +end rys_otocz; + +UNIT dane :procedure; + (*---------------------------------------------*) + UNIT los_gen:procedure; + var x1,y1:integer; + begin + for i:=1 to licz do + do + x1:=random*400+100; + if x1>5 andif x1<614 then + punkty(i).x:=x1; + exit; + fi; + od; + do + y1:=random*200+50; + if y1>35 andif y1<300 then + punkty(i).y:=y1; + exit; + fi; + od; + call cirb(x1,y1,2,3,3,11,1,2,2); + od; + end los_gen; + + UNIT uzyt_gen :procedure; + begin + call hwrite("USE ARROWS TO MOVE THE CURSOR",24,308); + call hwrite("END - finishes",24,320); + + call track(300,150); + k:=0; + do + if inxpos>5 andif inxpos<514 then + if inypos>35 andif inypos<287 then + k:=k+1; + punkty(k).x:=inxpos; + punkty(k).y:=inypos; + call cirb(inxpos,inypos,2,3,3,11,1,2,2); + fi + fi; + if k=licz then exit fi; + call track(inxpos+3,inypos) + od; + call zmaz(24,304,32,580); + end uzyt_gen; +begin + call zmaz(24,304,32,580); + call hwrite("the number of points 3",20,291); + call hwrite("1 - if you would like less points ",20,303); + call hwrite("2 - if you would like more points ",20,315); + call hwrite("ENTER - to continue execution",20,327); + licz:=3; +do + ix:=inchar; + case ix + when 50 : if licz<99 then licz:=licz+1 ; + call move(252,291); + call hascii(0); + call move(260,291); + call hascii(0); + call move(252,291); + if licz>9 then call hascii(licz div 10+48) fi; + call hascii(licz mod 10 +48); + fi; + when 49 : if licz>3 then licz:=licz-1 ; + call move(252,291); + call hascii(0); + call move(260,291); + call hascii(0); + call move(252,291); + if licz>9 then call hascii(licz div 10+48) fi; + call hascii(licz mod 10 +48); + + fi; + when 13 : exit; + otherwise; + esac; +od; +array punkty dim (1:licz); +for i:=1 to licz do + punkty(i):=new punkt; +od; +call zmaz(20,291,48,580); +call hwrite("M E N U :",20,291); +call hwrite("1 - random generation of points",20,303); +call hwrite("2 - points given by user",20,315); +do + ix:=inchar; + if ix=49 orif ix=50 then exit fi; +od; + call zmaz(20,291,48,580); + case ix + when 49:call los_gen; + when 50:call uzyt_gen; + otherwise; + esac; +end dane; + + UNIT znajdz_max_y:procedure; + (*---------------------------------------------*) + begin + pom:=punkty(1); + j:=1; + for i:=1 to licz do + if pom.y> punkty(i).y then(*bylo <*) + pom:=punkty(i); + j:=i; + else + if pom.y=punkty(i).y then + if pom.x> punkty(i).x then + pom:=punkty(i); + j:=i; + fi; + fi; + fi; + od; + pom:=punkty(1); + punkty(1):=punkty(j); + punkty(j):=pom; + end znajdz_max_y; + + (*funkcje okreslajace wzgl. czego sortujemy : *) + + unit l1 :function(p1,p2:punkt):boolean; + begin + result:=(p1.thetaj then exit fi; + od; + if lj then + kon:=i; + pocz:=j; + if lg1 then lg1:=false; + (*porzadkowanie punktow lezacych na prostej poziomej,przechodzacych przez*) + (*punkt zaczepienia - punkty(1) ;tj.tworza kat zerowy z punktem zaczepienia *) + call sort(l3) ; + else + (*porzadkowanie punktow tworzacych ten sam kat rozny od zerowego*) + call sort(l2); + fi; + fi; + i:=i+1; + od; + end posortuj; +(*---------------------------------------------------------------------------*) +begin (*PROGRAM GLOWNY*) + call gron(1); + call color(14); + call hframe(5,3,342,610); + call hframe(4,2,340,612); + call hframe(5,287,54,610); + call hframe(5,7,28,610); + call color(15); + call hwrite("CONVEX HULL by Joanna Hybel",185,17); + do + call dane; + call znajdz_max_y; + call wpisz_theta; + call posortuj; + call rys_otocz; + call hwrite("ESC - end of program execution",24,308); + call hwrite("ENTER - continue ",24,320); + do + ix:=inchar; + case ix + when 13:call zmaz(6,37,246,608); + exit; + when 27:exit exit; + otherwise; + esac; + od; + od; + call groff; +end; +end; diff --git a/examples/geometri/convexh1.pcd b/examples/geometri/convexh1.pcd new file mode 100644 index 0000000000000000000000000000000000000000..4250d0f21c0598422e61e581282caa81904debaf GIT binary patch literal 1000 zcmZwFPfHs?7zXfXH=EsPQa9UZ41wN?-$1;2(SwIT@z#SaMbTzr63vyKCEnY7Ra4sYKw6 zUy6b|s+b}I+wQD7zwfGXu6W~&?w;#F=dA-X0r!J0AL{U&1g$~>pMbBpeifa&VaxCn8g_!IP=&Fe@S5L^UMmJ)HxtwWA zb@%DcLtWc+`r?d=qTxN=dQ#3;6|Y1?DQTk9^*x$*jHcvtyrsKf|60iuy6~F&uh^G2 zd=6Q1zFjxpuw}XLZHIMV($xa)g>X?ctR!@7algpeW?Tf^rf}W(ZOMJvpev{3x}AA9 zDk<+C&dPJTX7B$lj#lq&WUm#{FNaohu%3C1MdXx4WI I?u&f?0M=K2M*si- literal 0 HcmV?d00001 diff --git a/examples/geometri/convexh2.log b/examples/geometri/convexh2.log new file mode 100644 index 0000000..8b49ddc --- /dev/null +++ b/examples/geometri/convexh2.log @@ -0,0 +1,373 @@ + PROGRAM OT; +(* Program zaliczeniowy Joanny Chromiec. Rysowanie otoczki wypuklej. *) +BEGIN + +pref IIUWgraph block + +(* procedury i funkcje EKPAKU i funkcja wsp - pomagajace organizowac ekran *) + +unit inchar: function:integer; + var ii:integer; + begin + do + ii:=inkey; + if ii<>0 then exit fi; + od; + result:=ii; +end inchar; + +unit NewPage : procedure; +begin + write( chr(27), "[2J") +end NewPage; + +unit SetCursor : procedure(row, column : integer); + var c,d,e,f : char, + i,j : integer; +begin + i := row div 10; + j := row mod 10; + c := chr(48+i); + d := chr(48+j); + i := column div 10; + j := column mod 10; + e := chr(48+i); + f := chr(48+j); + write( chr(27), "[", c, d, ";", e, f, "H") +end SetCursor; + +unit wsp:function(arg:real;czy_x:boolean):integer; +begin + result:= arg+5; + if czy_x then + result:=5+result + fi +end wsp; + +(* rysowanie strony tytulowej *) + +unit tytul:procedure; +begin + call newpage; + call setcursor(5,20); + writeln(" C O N V E X H U L L "); + call setcursor(10,10); + writeln(" written by JOANNA CHROMIEC "); + call setcursor(11,10); + WRITELN(" in LOGLAN programming language"); + call setcursor(25,26); + WRITE ("press any key "); + control:=INCHAR +end tytul; + +(* wczytanie ilosci punktow, wylosowanie ich inarysowanie na ekranie *) + +unit menu:procedure; + unit ramka : procedure; + var i:integer; + begin + call gron(0); call move(0,0); call draw(0,347); + call draw(719,347); call draw(719,0); call draw(0,0); + call move(0,310); call draw(719,310); call move(9,6); + call draw(11,6); call move(8,7); call draw(12,7); + call move(7,8); call draw(13,8); call move(10,5); + call draw(10,305); call draw(710,305); call move(709,304); + call draw(709,306); call move(708,304); call draw(708,306); + call move(707,303); call draw(707,307); call move(706,303); + call draw(706,307); call move(8,105); call draw(12,105); + call move(8,205); call draw(12,205); call move(109,304); + call draw(109,306); call move(110,304); call draw(110,306); + call move(209,304); call draw(209,306); call move(210,304); + call draw(210,306); call move(309,304); call draw(309,306); + call move(310,304); call draw(310,306); call move(409,304); + call draw(409,306); call move(410,304); call draw(410,306); + call move(509,304); call draw(509,306); call move(510,304); + call draw(510,306); call move(609,304); call draw(609,306); + call move(610,304); call draw(610,306); + end ramka; + + unit losowo:procedure; + begin + for i:=1 to n + do + punkty(i):=new punkt; + punkty(i).y:=(entier(random*1000)) mod 300; + punkty(i).x:=(entier(random*1000)+350) mod 700; + od; + for i:=1 to n + do + call cirb(wsp(punkty(i).x,true),wsp(punkty(i).y,false),2,2,2,1,1,5,5) + od + end losowo; + +begin + CALL NEWPAGE; + CAll setcursor(5,5); + write("give a number of points : "); + readln(n); + array punkty dim(1:n); + call gron(0); + call ramka; + call losowo; +end menu; + +(* wybor punktu poczatkowego, wyliczenie thety dla reszty i posortowanie ich *) + +unit przygotowanie : procedure; + + unit poy : function(p1,p2:punkt):boolean; + begin + result:=(p1.y>p2.y); + end poy; + + unit poth : function(p1,p2:punkt):boolean; + begin + result:=(p1.thetaj then exit fi; + od; + if lpunkty(i).x then tu:=i fi + fi + fi; + od; + pom:=punkty(tu); + punkty(tu):=punkty(1); + punkty(1):=pom + end znajdzdobry; + +var i1, j1 :integer; + +begin (* przygotowanie *) + call znajdzdobry; + call wpisztheta; + call sort(2,n,poth); + i1:=1; + do + if punkty(i1+1).theta=0 then i1:=i1+1 else exit fi; + if i1=n then exit fi; + od; + call sort(1,i1,pox); + i1:=i1+1; + j1:=i1; + while i1=0 + end dobrze; + + unit rysodc: procedure; + begin + call move(wsp(stos.topg qua punkt.x,true),wsp(stos.topg qua punkt.y,false)); + call draw(wsp(stos.topd qua punkt.x,true),wsp(stos.topd qua punkt.y,false)); + end rysodc; + + unit zmazodc: procedure; + begin + call color(0); + call move(wsp(stos.topg qua punkt.x,true),wsp(stos.topg qua punkt.y,false)); + call draw(wsp(stos.topd qua punkt.x,true),wsp(stos.topd qua punkt.y,false)); + call color(1); + end zmazodc; + + unit typstos:class; + + var szczytg, szczytd : elstosu; + + unit topg : function : elstosu; + begin + result:=szczytg; + end topg; + + unit topd : function : elstosu; + begin + result:=szczytd; + end topd; + + unit usun:procedure; + begin + if szczytg<> none then + szczytg:=szczytd; + if szczytd<>none then szczytd:=szczytd.dowiazanie fi; + fi + end usun; + + unit wloz : procedure (el:elstosu); + begin + el.dowiazanie:=szczytg; + szczytd:=szczytg; + szczytg:=el; + end wloz; + + end typstos; + + var stos:typstos; + +begin + stos:=new typstos; + for i:=1 to 2 + do + pom:=copy(punkty(i)); + call stos.wloz(pom); + od; + call rysodc; + for j:=1 to 200 do od; + for ind:=3 to n-1 + do + pom:=copy(punkty(ind)); + call stos.wloz(pom); + call rysodc; + for j:=1 to 200 do od; + while not dobrze + do + call zmazodc; + for j:=1 to 200 do od; + call stos.usun + od; + call rysodc + od; + pom:=copy(punkty(n)); + call stos.wloz(pom) ; + call rysodc; + for j:=1 to 200 do od; + pom:=copy(punkty(1)); + call stos.wloz(pom); + call rysodc; + for j:=1 to 200 do od; + (* tutaj rysowanie napisu czy chcesz dzialac dalej *) + call move(30,325); + call hascii(ord('r')); call hascii(ord('e')); + call hascii(ord('p')); call hascii(ord('e')); call hascii(ord('a')); + call hascii(ord('t')); call hascii(ord('?')); call hascii(ord('(')); + call hascii(ord('y')); call hascii(ord('/')); + call hascii(ord('n')); + call hascii(ord(')')); + + control:=inchar; + +end dzialaj; + + +unit elstosu:class; + var dowiazanie:elstosu; +end elstosu; + + +unit punkt : elstosu class; + var + x,y:integer, + theta:real; +end punkt; + +var punkty:arrayof punkt; + +var n,control,i,j:integer; + +begin (* bloku *) + call tytul; + control:=ord('y'); + while control=ord('y') + do + call menu; + call przygotowanie; + call dzialaj; + call groff + od +end; +END; diff --git a/examples/geometri/convexh3.log b/examples/geometri/convexh3.log new file mode 100644 index 0000000..0c94b3c --- /dev/null +++ b/examples/geometri/convexh3.log @@ -0,0 +1,946 @@ +PROGRAM GRAFIKA ; + +BEGIN + +PREF IIUWGRAPH BLOCK ; + +(*===========================================================================*) + +SIGNAL error ; + +(*===========================================================================*) + +CONST PI = 3.1415926536 ; + +(*===========================================================================*) +(* ZMIENNE GLOBALNE *) +(*===========================================================================*) + +VAR + datapoints : points , + N : integer , (* Liczba punktow *) + srodek : punkt , + stack : lifo , + debug : file , + pierjeryw : integer , + monitor,message : okno ; + + + +(*===========================================================================*) +(* LIFO *) +(*===========================================================================*) + + +unit lifo: class ; + + VAR p : punkt , + next : lifo ; +end lifo ; + + (* *) + (* PUSH i POP *) + (* *) + + unit PUSH : procedure (p:punkt ;inout stos:lifo) ; + + VAR pom : lifo ; + BEGIN + pom := new lifo ; + pom.p := p ; + pom.next:=stos ; + stos := pom + + end PUSH ; + + unit pops : procedure (inout stos :lifo ) ; + + VAR pom : lifo ; + + BEGIN + pom := stos ; + stos := stos.next ; + kill (pom) + end pops ; + + + + +(*===========================================================================*) +(* Grafika *) +(*===========================================================================*) + +UNIT sufit :function (x:real):integer ; +Begin + result := entier (x) ; + if result <> x then result := result + 1 fi +end sufit ; + +(*===========================================================================*) + +UNIT punkt : class (x,y : real) ; + + Unit kart : class ; + var xk , yk :real ; + begin + xk := x - srodek.x ; + yk := y - srodek.y + End kart ; + + +end punkt ; + +(*===========================================================================*) + +UNIT prosta : class ( A,B :punkt ) ; + +Begin + if A.x = B.x andif A.y = B.y then raise error fi ; +LASTWILL + kill (a) ; + kill (b) +END prosta ; + +(*===========================================================================*) + +UNIT segment : procedure ( a,b : punkt ) ; + +VAR x,y,z,t :integer ; + +BEGIN + call pushxy ; + x := 21 + (a.x * 55); + y := 284 - (a.y * 35); + z :=21 + (b.x * 55); + t := 284 - (b.y * 35); + call move (x ,y ) ; + call draw ( z ,t ) ; + call color (1) ; + call point (x , y ) ; + call cirb (x,y,2,0,0,1,1,1,1) ; + call point (z,t) ; + call cirb (z,t,2,0,0,1,1,1,1) ; + call popxy +END segment ; + +(*===========================================================================*) + +UNIT kursor : class (wr,kol : integer) ; + +end kursor ; + +(*===========================================================================*) + +UNIT okno : class (lg,pd : punkt ) ; + +Var map : arrayof integer , + rozm : integer ; + +begin + rozm := 4 + ( pd.y-lg.y) * sufit((pd.x -lg.x ) / 8) ; + rozm := rozm div 2 + 1 ; + call move (lg.x,lg.y) ; + map := getmap(pd.x,pd.y) ; + kill (lg) ; + kill (pd) +end okno ; + +(*===========================================================================*) + +UNIT points : class ; + +Var p : punkt , + next : points ; + +end points ; + +(*===========================================================================*) + +UNIT uklad : procedure ; + +VAR i,j : integer , + pom1,pom2 : punkt ; + +BEGIN + call move (20,10) ; + call draw (15,20) ; + call move (25,20) ; + call draw (20,10) ; + call draw (20,285) ; + call draw (545,285) ; + call draw (535,280) ; + call move (535,290) ; + call draw (545,285) ; + call move (9,288) ; + call hascii (48) ; + j := 0 ; + for i := 75 step 55 to 530 do + j := j+1 ; + call move (i,283) ; + call draw (i,287) ; + call move (i-4,288) ; + call hascii (48 + j) + od ; + j := 0 ; + for i := 250 step 35 downto 25 do + j := j+1 ; + call move (22,i) ; + call draw (18,i) ; + call move (9,i-4) ; + call hascii (48 + j) ; + od ; + +END uklad ; + +(*===========================================================================*) + +UNIT nwrite : procedure (n : integer ) ; +BEGIN + if not (0 <= n and n <= 99) then + raise error + fi ; + call hascii (48 + n div 10 ) ; + call hascii (48 + n mod 10 ) +END nwrite ; + +(*===========================================================================*) + +UNIT hwrite :procedure(s:string) ; + +VAR i : integer , + tab : arrayof character ; + +BEGIN + tab := unpack (s) ; + for i := lower(tab) to upper(tab) do + call hascii(ord(tab(i))) + od ; + kill (tab) +END hwrite ; + +(*===========================================================================*) +(* A N S I *) +(*===========================================================================*) + + unit Reverse : procedure; + begin + write( chr(27), "[7m") + end Reverse; + + unit Normal : procedure; + begin + write( chr(27), "[0m") + end Normal; + + + unit EraseLine : procedure; + begin + write( chr(27), "[K") + end EraseLine; + + unit inchar : function : integer; + (*podaj nr znaku przeslanego z klawiatury *) + var i : integer; + begin + do + i := inkey; + if i <> 0 then exit fi; + od; + result := i; + end inchar; + + unit NewPage : procedure; + begin + write( chr(27), "[2J") + end NewPage; + + unit SetCursor : procedure(row, column : integer); + var c,d,e,f : char, + i,j : integer; + begin + i := row div 10; + j := row mod 10; + c := chr(48+i); + d := chr(48+j); + i := column div 10; + j := column mod 10; + e := chr(48+i); + f := chr(48+j); + write( chr(27), "[", c, d, ";", e, f, "H") + end SetCursor; + + unit CursorLeft : procedure (columns : integer); + var e,f : char, + i,j : integer; + begin + i := columns div 10; + j := columns mod 10; + e := chr(48+i); + f := chr(48+j); + write( chr(27), "[", e, f, "D") + end CursorLeft; + + unit CursorRight : procedure (columns : integer); + var e,f : char, + i,j : integer; + begin + i := columns div 10; + j := columns mod 10; + e := chr(48+i); + f := chr(48+j); + write( chr(27), "[", e, f, "C") + end CursorRight; + + unit CursorUp : procedure (rows : integer); + var c,d : char, + i,j : integer; + begin + i := rows div 10; + j := rows mod 10; + c := chr(48+i); + d := chr(48+j); + write( chr(27), "[", c, d, "A") + end CursorUp; + + unit CursorDown : procedure (rows : integer); + var c,d : char, + i,j : integer; + begin + i := rows div 10; + j := rows mod 10; + c := chr(48+i); + d := chr(48+j); + write( chr(27), "[", c, d, "B") + end CursorDown; + + +UNIT czekaj :procedure ; + Var i :integer ; + Begin + i := inchar +End czekaj ; + +UNIT przerwa : procedure ; + Var i : integer ; + Begin + for i := 1 to pierjeryw do od +End przerwa ; + +(*========================================================================*) +(*------------------------------------------------------------------------*) +(* MENU GLOWNE *) +(*------------------------------------------------------------------------*) +(*========================================================================*) + + +UNIT menu : procedure ; + +VAR i,j :integer ; + +(*------------------------------------------------------------------------*) + + Unit list : class ; + + Var nast,pop : list ; + + Unit virtual proc : procedure ; + Begin + End proc ; + + End ; + + VAR lista : list ; + +(*------------------------------------------------------------------------*) + + UNIT run : list class ; + + unit virtual proc : procedure ; + + Var x,y : real , + punkty : arrayof tpunkt , + pr : prosta , + poms : lifo , + a,b : punkt , + poml1 : points ; + +(* - - - - - - - - - - - - - - - - - - *) + + Unit tpunkt : punkt class ; + + Var b : bieg ; + + Unit bieg : class ; + var a,r : real ; + begin + writeln (debug , "353(bieg) reached"); + r := sqrt ( (x - srodek.x)*(x - srodek.x) + + (y - srodek.y)*(y - srodek.y) ) ; + if (x - srodek.x) = 0 then + if (y - srodek.y) > 0 then + a := PI/2 + else + a := -PI/2 + fi + else + if (x - srodek.x) > 0 then + a := atan ((y - srodek.y)/(x - srodek.x)) + else + a := atan ((y - srodek.y)/(x - srodek.x)) ; + a := PI + a + fi + fi + End bieg ; + + Begin + b := new bieg ; + Lastwill + kill (b) + End tpunkt ; + +(* - - - - - - - - - - - - - - - - - - *) + + Unit sort :procedure(a:arrayof tpunkt ; + function less (p1,p2 : tpunkt):boolean) ; + + Unit sorting:procedure (l,p : integer ) ; + var i,j : integer , + x,w : punkt ; + Begin + i := l ; j := p ; + x := a ((l+p) div 2 ) ; + Do + while less (a(i),x) do i := i + 1 od ; + while less (x,a(j)) do j := j - 1 od ; + if i <= j then + w := a(i) ; + a(i) := a(j) ; + a(j) := w ; + i := i+1 ; j := j-1 + fi ; + if i > j then exit fi + Od ; + if l < j then call sorting (l , j) fi ; + if i < p then call sorting (i , p) fi + End sorting ; + + Begin + call sorting (lower(a) , upper(a) ) + End sort ; + +(* - - - - - - - - - - - - - - - - - - *) + + Unit prep:procedure ; + + Var miny : punkt ; + + Begin + poml1 := datapoints.next ; + miny := poml1.p ; + while poml1 <> none + do + if poml1.p.y < miny.y then + miny := poml1.p + fi ; + poml1 := poml1.next + od ; + srodek := miny + End prep ; + +(* - - - - - - - - - - - - - - - - - - *) + + Unit less1 : function (p1,p2 : tpunkt) : boolean ; + Begin + result := p1.b.a = p2.b.a ; + if result then + result := p1.b.r < p2.b.r + else + result := p1.b.a < p2.b.a + fi + End less1 ; + +(* - - - - - - - - - - - - - - - - - - *) + + Unit sameside : function (p1,p2 : punkt ; pr : prosta ) : boolean ; + + Var a,b : real ; + + Begin + a := (pr.B.y - pr.A.y) / (pr.B.x - pr.A.x) ; + b := pr.B.y - a * pr.B.x ; + result := (a * p1.x + b - p1.y) * (a * p2.x + b - p2.y) >= 0 + End sameside ; + +(* - - - - - - - - - - - - - - - - - - *) + + Handlers + when error : terminate ; + End handlers ; + +(* - - - - - - - - - - - - - - - - - - *) + + Begin + if N < 3 then raise error fi ; + call pushxy ; + writeln(debug,""); + writeln(debug,"RUN starts"); + call move (100,320) ; + call hwrite("Quicksort working "); + call prep ; + writeln(debug,"PREP done"); + array punkty dim (1 : N-1) ; + poml1 := datapoints.next ; + i := 1 ; + while poml1 <> none + do + if poml1.p <> srodek then + punkty (i) := new tpunkt(poml1.p.x,poml1.p.y) ; + i := i + 1 ; + writeln(debug,"PUNKTY (",i:2,") done"); + fi ; + poml1 := poml1.next ; + od ; + if i <> N then raise error fi ; + writeln(debug,"PUNKTY done"); + call sort (punkty,less1) ; + call hwrite("done !") ; + writeln(debug,"QUICKSORT done"); + for I := 1 to N-1 + do + writeln (debug,punkty(i).b.a) ; + od ; + + + (*------------- T O J E S T D U S Z A P R O G R A M U ----------------*) + + call color (1) ; + call push (srodek,stack ) ; + call push (punkty (1) , stack ) ; + call segment (srodek,stack.p) ; + call przerwa ; + call push (punkty (2) , stack ) ; + call przerwa ; + call segment (stack.next.p,stack.p) ; + for i := 3 to N-1 + do + call color (1) ; + call przerwa ; + call segment (stack.p,punkty(i)) ; + a :=copy (stack.p) ;b:=copy (stack.next.p) ; + pr := new prosta(a,b) ; + while not sameside (punkty(i),srodek,pr) + do + call color (0) ; + call przerwa ; + call segment (punkty(i) , stack.p) ; + call przerwa ; + call segment (stack.p,stack.next.p) ; + call pops (stack) ; + call color (1) ; + call przerwa ; + call segment (stack.p,punkty(i) ) ; + kill (pr.a);kill(pr.b) ; + kill (pr) ; + a := copy (stack.p) ; + b := copy (stack.next.p) ; + pr := new prosta(a,b) ; + od ; + kill (pr.a);kill(pr.b) ; + kill (pr) ; + call push (punkty(i),stack) + od ; + call color (1) ; + call przerwa ; + call segment (stack.p,srodek) ; + writeln(debug,"OTOCZKA DONE") ; + poms := stack.next ; + writeln(debug,"a done") ; + while poms.p <> none + do + call segment (stack.p, poms.p) ; + writeln(debug,"b done") ; + stack := poms ; + poms := poms.next ; + if poms = none then exit fi + od ; + writeln(debug,"STACK REWRITTEN") ; + poml1 := datapoints.next ; + while poml1 <> none + do + x := 21 + (poml1.p.x * 55) ; + y := 284 - (poml1.p.y * 35) ; + call point ( x , y ) ; + call cirb (x,y,2,0,0,1,1,1,1) ; + poml1 := poml1.next + od ; + writeln(debug,"POINTS REWRITTEN") ; + message := new okno (new punkt(100,320),new punkt(530,330)) ; + call move(100,320) ; + call xormap(message.map); + kill (message.map) ; + kill (message) ; + poms := stack ; + while stack <> none + do + poms := poms.next ; + kill (stack) ; + stack := poms + od ; + writeln(debug,"stack killed") ; + for i := 1 to N-1 + do + kill (punkty(i).b) ; + kill (punkty(i)) + od ; + kill (punkty) ; + call popxy + end proc ; + + End run + +(*------------------------------------------------------------------------*) + + Unit randp : list class ; + + Unit virtual proc : procedure ; + + Var M,i,j : integer , + poml1 : points , + x,y : real ; + Begin + call pushxy ; + call move (150,305) ; + call hwrite ("There are "); + call nwrite(N) ; + call hwrite (" points now .") ; + call move (150 , 327) ; + call hwrite ("How many new points generate ?") ; + call move (440,316) ; + call hwrite("M = ") ; + i := 0 ; + while i<48 or i>57 + do + i := inchar + od ; + call hascii ( i ) ; + j := 0 ; + while (j<48 or j>57) and j<>13 + do + j := inchar + od ; + if j = 13 then + M := i-48 + else + call haSCII (j) ; + M := (i-48)*10 + j-48 ; + while i <> 13 do i := inchar od + fi ; + + if N + M > 99 then M := 99 - N fi ; + N := N + M ; + poml1 := datapoints ; + while poml1.next <> none + do + poml1 := poml1.next + od ; + for i := 1 to M + do + poml1.next := new points ; + poml1 := poml1.next ; + poml1.p := new punkt (random * 9 , random * 7 ) ; + x := 21 + (poml1.p.x * 55) ; + y := 284 - (poml1.p.y * 35) ; + call point ( x , y ) ; + call cirb (x,y,2,0,0,1,1,1,1) ; + od ; + call move (6,301) ; + message := new okno (new punkt(6,301),new punkt (549,339) ); + call xormap (message.map) ; + kill (message.map) ; + kill (message) ; + call popxy + + end proc + End randp ; + +(*------------------------------------------------------------------------*) + + Unit Inputp : list class ; + + Unit virtual proc :procedure ; + + Var poml1 : points , + a,b : integer , + x,y : real ; + + begin + call pushxy ; + if N = 99 then + call move (70,315); + call hwrite (" To many points (Ok?)") ; + while i <> 13 + do + i := inchar + od ; + call move (50,315) ; + message := new okno(new punkt(50,315),new punkt(60,550)); + call xormap (message.map) ; + kill (message.map) ; + kill (message) ; + else + poml1 := datapoints ; + while poml1.next <> none + do + poml1 := poml1.next + od ; + call move(100,315) ; + call hwrite("Press 'End' when ready") ; + call move (225,150) ; + call track (inxpos,inypos) ; + if 20 < inxpos andif inxpos < 548 andif + 7 < inypos andif inypos < 280 then + x := inxpos ; + y := inypos ; + call point ( x , y ) ; + call cirb (x,y,2,0,0,1,1,1,1) ; + Writeln(debug,"Nowy punkt -",x:3,",",y:3); + poml1.next := new points ; + poml1 := poml1.next ; + poml1.p := new punkt ((x-20)/55,(285-y)/35 ) ; + N := N + 1 + fi ; + call move (100,315) ; + message := new okno(new punkt(100,315),new punkt(500,330)) ; + call xormap(message.map) ; + kill (message.map) ; + kill (message) ; + poml1 := datapoints ; + i := 0; + while poml1.next <> none + do + poml1 := poml1.next ; + I := I + 1 + od ; + writeln (debug,i : 3,"PUNKTOW wlozonych") ; + fi ; + call popxy ; + end proc ; + + End inputp ; + +(*------------------------------------------------------------------------*) + + UNIT delp : list class ; + + Unit virtual proc :procedure ; + + Var poml1,poml2 : points ; + + Begin + call pushxy ; + call move ( 50,315) ; + call hwrite ("Are you sure ? (y/n) ") ; + i := 0 ; + while i <> 121 and i <> 110 + do + i := inchar + od ; + if i = 121 then + poml1 := datapoints.next ; + while poml1 <> none + do + poml2 := poml1.next ; + kill (poml1.p) ; + kill (poml1) ; + poml1 := poml2 + od ; + N := 0 ; + monitor := new okno (new punkt (6,6),new punkt(549,299) ) ; + call move (6,6) ; + call xormap(monitor.map) ; + kill (monitor.map) ; + kill (monitor) ; + call uklad ; + fi ; + call move (50,315) ; + for i := 1 to 21 + do + call hascii(0) ; + call move (inxpos+8,inypos) + od ; + + call popxy + end proc ; + + begin + End delp ; + +(*------------------------------------------------------------------------*) + +UNIT Clrscr : list class ; + +Unit virtual proc : procedure ; + +Var x,y : real , + poml1 : points ; + +Begin + call pushxy ; + monitor := new okno (new punkt(6,6),new punkt(549,299)) ; + call xormap (monitor.map) ; + kill (monitor.map) ; + kill (monitor) ; + call uklad ; + poml1 := datapoints.next ; + while poml1 <> none + do + x := 21 + (poml1.p.x * 55) ; + y := 284 - (poml1.p.y * 35) ; + call point ( x , y ) ; + call cirb (x,y,2,0,0,1,1,1,1) ; + poml1 := poml1.next + od ; + call popxy +End proc ; + +END clrscr ; + + +(*------------------------------------------------------------------------*) + + Unit pstryczek : procedure (a,b : integer ); + + Unit ramka: procedure(a,b:integer) ; + begin + call move (a-1,b-1) ; + call draw (a+19*8+2 , b-1) ; + call draw (a+19*8+2 , b+9) ; + call draw (a-1,b+9 ) ; + call draw (a-1,b-1) ; + call move (a,b) + end ramka ; + + + Begin + call COLOR (0) ; + call ramka(inxpos,inypos) ; + call move (a,b) ; + call color (11) ; + call ramka(a,b) ; + + End pstryczek ; + +(*------------------------------------------------------------------------*) + + BEGIN + lista:= new randp ; + lista.pop := new clrscr ; + lista.pop.nast := lista ; + lista.nast := new inputp ; + lista.nast.pop := lista ; + lista.nast.nast := new delp ; + lista.nast.nast.pop := lista.nast ; + lista.nast.nast.nast := new run ; + lista.nast.nast.nast.pop :=lista.nast.nast ; + lista.nast.nast.nast.nast := lista.pop ; + lista.pop.pop := lista.nast.nast.nast ; + + call move (580,50); + call hwrite("Random points ") ; + call move (580,80) ; + call hwrite("Input point") ; + call move (580,110) ; + call hwrite("Del points") ; + call move (580,140) ; + call hwrite("R U N") ; + call move (580,170) ; + call hwrite("Clr scr") ; + call move (560 , 300) ; + call hwrite ("Press 'Esc' to quit") ; + + call pstryczek (555,50) ; + j := 50 ; + DO + i := inchar ; + if i = 27 then exit fi ; + if i = 13 then + call lista.proc + else + + case i + 80 + + when 0 : lista := lista.nast ; + if j = 170 then + j := 50 ; + call pstryczek (555,50) ; + else + j :=j+30 ; + call pstryczek (555,j) + fi ; + + when 8 : lista := lista.pop ; + if j = 50 then + j := 170 ; + call pstryczek (555,170) ; + else + j :=j-30 ; + call pstryczek (555,j) + fi ; + esac + fi + OD + + END menu ; + +(*------------------------------------------------------------------------*) +(* KONIEC MENU GLOWNEGO *) +(*------------------------------------------------------------------------*) + +UNIT welcome : procedure ; + + Unit ramka : procedure ; + + end ramka ; + +begin + call newpage ; + + + call setcursor (10,30) + +end welcome ; + +(*===========================================================================*) + +HANDLERS + when error : call groff ; + writeln (" BLAD ! ") ; + call czekaj ; + call endrun +END handlers ; + +(*===========================================================================*) + +BEGIN (* BLOKU GLOWNY *) + pierjeryw := 20 ; + datapoints := new points ; + stack := new lifo ; + open (debug,text,unpack("debug.dub")); + call rewrite(debug) ; + call gron(1); + call move (5,5) ; + call draw (715,5) ; + call draw (715,340) ; + call draw (5,340) ; + call draw (5,5) ; + call move (550,5) ; + call draw (550,340) ; + call move (550,300) ; + call draw (5,300) ; + call uklad ; + call menu ; + call groff ; + +END + +END GRAFIKA diff --git a/examples/geometri/convgraf.ccd b/examples/geometri/convgraf.ccd new file mode 100644 index 0000000000000000000000000000000000000000..53204faff82e005d99bedd0c5e41a0468534485d GIT binary patch literal 19428 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 literal 0 HcmV?d00001 diff --git a/examples/geometri/convgraf.log b/examples/geometri/convgraf.log new file mode 100644 index 0000000..7c91926 --- /dev/null +++ b/examples/geometri/convgraf.log @@ -0,0 +1,472 @@ +PROGRAM convexhull; + + (* BAYEUL St‚phane Licence Informatique Groupe 1 *) + +VAR p : ARRAYOF points, + taille,i,j,n,O12,guziki,c : INTEGER, + choix,souris,valeur,chaine : ARRAYOF CHAR, + ligne : LINE, + inst,quitter : BOOLEAN; + + +(***********************************************************************) + UNIT POINTS : CLASS; +(***********************************************************************) +VAR x,y : INTEGER, + z : CHAR; +END points; + +(***********************************************************************) + UNIT LINE : CLASS; +(***********************************************************************) +VAR p1,p2 : points; +END line; + +(***********************************************************************) + UNIT NEWPAGE : PROCEDURE; +(***********************************************************************) +BEGIN + WRITE ( CHR (27), "[2J"); +END newpage; + +(***********************************************************************) + UNIT SETCURSOR : PROCEDURE (ROW,COLUMN : INTEGER); +(***********************************************************************) +VAR c,d,e,f : CHAR, + i,j : INTEGER; + BEGIN + i := row DIV 10; + j := row MOD 10; + c := CHR (48+i); + d := CHR (48+j); + i := column DIV 10; + j := column MOD 10; + e := CHR (48+i); + f := CHR (48+j); + WRITE ( CHR (27), "[", c, d, ";", e, f, "H"); +END setcursor; + +(***********************************************************************) + UNIT TRANSENTIER : PROCEDURE (INPUT chaine : ARRAYOF char; + OUTPUT nbr : INTEGER); +(***********************************************************************) + + (* TRANSFORME UNE CHAINE DE CARACTERES EN UN ENTIER *) + +VAR i : INTEGER; +BEGIN + nbr := 0; + FOR i := 1 to UPPER (chaine) DO + CASE chaine(i) + WHEN '0','1','2','3','4','5','6','7','8','9' : + nbr := (nbr*10)+(ord(chaine(i))-48); + ESAC; + OD; +END transentier; + +(***********************************************************************) + UNIT FILL : PROCEDURE (X,Y,Large,Haut,Col:INTEGER) ; +(***********************************************************************) + +VAR I : INTEGER ; +BEGIN + PREF IIUWGRAPH BLOCK + BEGIN + CALL COLOR (Col) ; + FOR I:=Y TO Y+Haut + DO + CALL MOVE(X,I) ; + CALL DRAW(X+Large,I) ; + OD ; + END ; +END FILL; + +(***********************************************************************) + UNIT TEXTE : PROCEDURE (X,Y : INTEGER; + S : STRING); +(***********************************************************************) + + (* Saisie d'un string en colonne X et ligne Y *) + +BEGIN + PREF IIUWGRAPH BLOCK + BEGIN + CALL MOVE (X,Y); + CALL OUTSTRING(s); + END ; +END Texte; + +(***********************************************************************) + UNIT SAISIECHAINE : PROCEDURE (INPUT Col,Lig : INTEGER; + OUTPUT Valeur : ARRAYOF CHAR); +(***********************************************************************) + + (* Saisie d'une chaine de caractŠres en graphique *) + +VAR C,I,X : INTEGER; + +BEGIN +PREF IIUWGRAPH BLOCK +BEGIN + ARRAY VALEUR DIM (1:5); + X := COL; + C := 0; + I := 1; + DO + C := 0 ; + WHILE C = 0 + DO + CALL COLOR (12) ; + CALL TEXTE (X,LIG-4," "); + C := INKEY; + CALL TEXTE (X,LIG,"-"); + OD; + CALL MOVE (X,LIG-4) ; + IF (C=13) THEN CALL MOVE (X,LIG-4);CALL HASCII(0);EXIT; FI; + IF (C=8) THEN + IF X > COL THEN + I := I-1; + X := X-8; + CALL MOVE (X,LIG-4); + CALL HASCII (0); + CALL TEXTE (X,LIG," "); + CALL MOVE (X,LIG-4); + FI; + ELSE + IF I <= 5 THEN + CALL HASCII (0) ; + CALL HASCII (c); + VALEUR (i) := CHR (C); + I:=I+1; + X:=X+8; + ELSE + CALL COLOR(11); + CALL TEXTE(105,258,"Chaine trop longue "); + CALL TEXTE(105,274,"Appuyez sur une touche pour continuer"); + WHILE INKEY=0 DO OD; + CALL FILL (101,251,398,58,0) ; + FI; + FI; + OD; +END; +END SAISIECHAINE; + +(***********************************************************************) + UNIT TAB_PREDEFINI : PROCEDURE; +(***********************************************************************) +BEGIN + (******************************************************) + (* 0 <= X >= 52 et 0 <= Y >= 26 *) + (******************************************************) + taille := 16; + ARRAY p DIM (0:taille+1); + FOR i:=0 TO taille+1 DO + p(i) := NEW points; + OD; + p(1).x:=3 ;p(1).y:=9 ;p(1).z:='A' ;p(2).x:=11 ;p(2).y:=1 ;p(2).z:='B' ; + p(3).x:=6 ;p(3).y:=8 ;p(3).z:='C' ;p(4).x:=4 ;p(4).y:=3 ;p(4).z:='D' ; + p(5).x:=5 ;p(5).y:=15 ;p(5).z:='E' ;p(6).x:=8 ;p(6).y:=11 ;p(6).z:='F' ; + p(7).x:=1 ;p(7).y:=6 ;p(7).z:='G' ;p(8).x:=7 ;p(8).y:=4 ;p(8).z:='H' ; + p(9).x:=9 ;p(9).y:=7 ;p(9).z:='I' ;p(10).x:=14;p(10).y:=5 ;p(10).z:='J'; + p(11).x:=10;p(11).y:=13;p(11).z:='K';p(12).x:=15;p(12).y:=14;p(12).z:='L'; + p(13).x:=15;p(13).y:=2 ;p(13).z:='M';p(14).x:=13;p(14).y:=16;p(14).z:='N'; + p(15).x:=2 ;p(15).y:=12;p(15).z:='O';p(16).x:=12;p(16).y:=10;p(16).z:='P'; + p(0):=p(16);p(17):=p(1); +END tab_predefini; + +(***********************************************************************) + UNIT SAISIE_SOURIS : MOUSE PROCEDURE; +(***********************************************************************) + VAR h,v,t,b,nbr : INTEGER, + l,r,c,fin : BOOLEAN; + BEGIN + PREF IIUWgraph BLOCK + BEGIN + CALL cls; CALL affiche_grille; + b:=0; + inst := INIT (guziki); + IF NOT inst THEN + CALL TEXTE(100,100,"Erreur d'installation de la souris");EXIT; + FI; + CALL DEFCURSOR (1,11,12); + CALL SHOWCURSOR; + CALL STATUS (h,v,l,r,c); + nbr := 1; + fin := FALSE; + WHILE NOT fin AND nbr<=taille DO + CALL GETPRESS (b,h,v,t,l,r,c); + IF l THEN + IF 0 <= h DIV 012 ANDIF h DIV O12 <= (640-11) DIV O12 ANDIF + 0 <= (316-v) DIV O12 ANDIF (316-v) DIV O12 <= 319 DIV O12 THEN + (* COORDONNEES VALABLES *); + p(nbr) := NEW points; + p(nbr).x := h DIV O12; + p(nbr).y := (316-v) DIV O12; + p(nbr).z := CHR (64+nbr); + CALL MOVE (h,v) ; + CALL MOVE (p(nbr).x*O12+9,316-(p(nbr).y*O12)); + CALL HIDECURSOR ; CALL COLOR (2); + CALL HASCII (ord(p(nbr).z)); + CALL SHOWCURSOR ; CALL COLOR (3); + FOR i:=1 TO 3000 DO OD; + nbr:=nbr+1; + ELSE (* COORDONNEES NON VALABLES *); + CALL GETPRESS (b,h,v,t,l,r,c); + FI; + FI; + OD; + p(0) := p(taille); p(taille+1) := p(1); + CALL HIDECURSOR; + END; +END saisie_souris; + +(***********************************************************************) + UNIT SAISIE_POINTS : IIUWgraph PROCEDURE; +(***********************************************************************) +VAR + size,i : INTEGER, + valable : BOOLEAN; +BEGIN + CALL TEXTE (100,230," 0 <= X >= 52 et 0 <= Y >= 26 "); + FOR i:=1 TO taille DO + p(i) := NEW points; + valable := FALSE; + WHILE NOT valable DO + CALL COLOR (7); + CALL TEXTE (100,240,"Abscisses du point nø : "); + CALL TEXTE (100,250,"Ordonn‚es du point nø : "); + CALL COLOR (10); + CALL MOVE (290,240);CALL HASCII (64+i); + CALL MOVE (290,250);CALL HASCII (64+i); + CALL COLOR (4); + CALL SAISIECHAINE (350,244,chaine); + CALL TRANSENTIER (chaine,p(i).x); + CALL SAISIECHAINE (350,254,chaine); + CALL TRANSENTIER (chaine,p(i).y); + IF p(i).x<0 ORIF p(i).x > ((640-11) DIV O12) THEN + valable:=FALSE; + ELSE IF p(i).y<0 ORIF p(i).y > (319 DIV O12) THEN + valable:=FALSE; + ELSE valable := TRUE; + FI; + FI; + p(i).z := CHR (64+i); + CALL TEXTE (290,254," "); + CALL TEXTE (290,244," "); + OD; + OD; + p(0) := p(taille); p(taille+1) := p(1); +END saisie_points; + +(***********************************************************************) + UNIT AFFICHE_GRILLE : mouse PROCEDURE; +(***********************************************************************) +VAR i : INTEGER; +BEGIN + PREF IIUWgraph BLOCK + BEGIN (* Graduations *) + CALL COLOR (7); + FOR i := 11 STEP O12 TO 640 DO + CALL TEXTE (i,314,"."); + OD; + FOR i := 315 STEP O12 DOWNTO 0 DO + CALL TEXTE (11,i,"."); + OD; (* Reperes *) + CALL TEXTE (8,16,"Y"); + CALL TEXTE (8,26,"^"); + CALL TEXTE (614,316,"> X"); + CALL MOVE (618,319); + CALL DRAW (11,319); (* Ligne horizontale *) + CALL DRAW (11,26); (* Ligne verticale *) + END; +END affiche_grille; + +(***********************************************************************) + UNIT THETA : FUNCTION(P1,P2 : POINTS): REAL; +(***********************************************************************) +VAR dx,dy,ax,ay : INTEGER, + t : REAL; +BEGIN + dx := p2.x - p1.x; ax := ABS (dx); + dy := p2.y - p1.y; ay := ABS (dy); + IF (dx=0) AND (dy=0) THEN + t := 0; + ELSE t := dy/(ax+ay); + FI; + IF dx<0 THEN + t := 2-t; + ELSE IF dy<0 THEN + t := 4+t; + FI; + FI; + result := t*90.0; +END theta; + +(***********************************************************************) + UNIT WRAP : PROCEDURE (INOUT N : INTEGER); +(***********************************************************************) +VAR j,i,min,m : INTEGER, + minangle,v : REAL, + t,tb,p1,p2,prec : points, + ligne : line; +BEGIN + min :=1 ; tb := NEW points; t := NEW points; + p1 := NEW points; p2 := NEW points; + ligne := NEW line ; prec := NEW points; + (* Choix du premier point *) + FOR i := 2 TO taille DO + IF p(i).yp(min).x THEN + min := i; + FI; + FI; + FI; + OD; + (* Initialisations *) + m := 0; p(taille+1) := p(min); minangle := 0.0; + (* Boucle de Recherche *) + DO + m:=m+1 ; t:=p(m) ; p(m):=p(min) ;p(min):=t; + min:=taille+1; v:=minangle; minangle:=360.0; + FOR i:=m+1 TO taille+1 DO + (* Recherche du plus petit angle *) + IF theta (p(m),p(i))>v THEN + (* Recherche du point suivant *) + IF theta (p(m),p(i)) < minangle THEN + min := i; minangle := theta (p(m),p(min)); + FI; + (* Cas ou plusieurs points sont alignes *) + IF theta (p(m),p(i)) = minangle ANDIF p(min)<>p(i) THEN + ligne.p1 := p(m); ligne.p2 := p(min); + IF NOT on (ligne,p(i)) THEN + min := i; minangle := theta (p(m),p(min)); + FI; + FI; + FI; + OD; + IF min = taille+1 THEN EXIT; + FI; + OD; + n:=M; +END wrap; + +(***********************************************************************) + UNIT ON : FUNCTION (L:LINE;P1:POINTS):BOOLEAN; +(***********************************************************************) +BEGIN + result := FALSE; + IF (l.p1.x=p1.x) THEN + IF l.p1.y>=p1.y ANDIF p1.y>=l.p2.y THEN + result:=TRUE + ELSE IF l.p2.y>=p1.Y ANDIF p1.Y>=l.p1.y THEN + result:=TRUE; + FI; + FI; + ELSE + IF (l.p1.y=p1.Y) THEN + IF l.p1.x<=p1.x ANDIF p1.x<=l.p2.x THEN + result:=TRUE + ELSE IF l.p2.x<=p1.x ANDIF p1.X<=l.p1.x THEN + result:=TRUE; + FI; + FI; + FI; + FI; +END on; + +(***********************************************************************) + UNIT AFFICHE_ENVELOPPE : IIUWgraph PROCEDURE; +(***********************************************************************) +BEGIN + PREF mouse BLOCK + BEGIN + CALL COLOR(8); + CALL HIDECURSOR; + FOR i:=1 TO n-1 DO + CALL MOVE ((p(i).x*O12)+ O12,316-(p(i).y*O12)+O12 DIV 4); + CALL DRAW ((p(i+1).x*O12)+ O12,316-(p(i+1).y*O12)+O12 DIV 4); + OD; + CALL MOVE ((p(n).x*O12)+ O12,316-(p(n).y*O12)+O12 DIV 4); + CALL DRAW ((p(1).x*O12)+ O12,316-(p(1).y*O12)+O12 DIV 4); + CALL SHOWCURSOR; + END; + CALL COLOR (6); + CALL TEXTE (50,335,"L'enveloppe convexe est :"); + FOR i:=1 TO n DO + CALL MOVE (300+(i*10),335); + CALL HASCII (ord(p(i).z)); + OD; + CALL COLOR (5); + CALL TEXTE (150,325,"Appuyez sur ENTREE pour continuer"); + C := 0; + WHILE C <> 13 DO + C := INKEY; + OD; +END affiche_enveloppe; + +(***********************************************************************) +(* Programme principal *) +(***********************************************************************) +BEGIN + PREF IIUWgraph BLOCK + BEGIN + O12:=12; + CALL GRON(nocard); + quitter:=FALSE; + WHILE NOT quitter DO + CALL CLS; CALL COLOR (1); + CALL TEXTE (100,10,"ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿"); + CALL TEXTE (100,20,"³ Enveloppe convexe ³"); + CALL TEXTE (100,30,"ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ"); + CALL COLOR (2); + CALL TEXTE (80,100,"Voulez_vous : aisir des points"); + CALL TEXTE (80,110," tiliser des points pr‚d‚finis"); + CALL TEXTE (80,120," uitter"); + CALL COLOR (14); + CALL MOVE (192,100);CALL OUTSTRING("S"); + CALL MOVE (192,110);CALL OUTSTRING("U"); + CALL MOVE (192,120);CALL OUTSTRING("Q"); + CALL COLOR (5); + CALL TEXTE (80,140,"Votre choix : "); + CALL SAISIECHAINE (190,144,choix); + CALL COLOR (3); + WHILE choix(1)<>'u' AND choix(1)<>'s' AND choix(1)<>'q' AND + choix(1)<>'U' AND choix(1)<>'S' AND choix(1)<>'Q' DO + CALL SAISIECHAINE (190,144,choix); + OD; + CASE choix(1) + WHEN 'u','U' : CALL tab_predefini; + WHEN 's','S' : CALL TEXTE (100,200, + "Combien de points voulez_vous saisir :"); + CALL SAISIECHAINE (420,204,chaine); + CALL TRANSENTIER (chaine,taille); + ARRAY p DIM (0:taille+1); + CALL TEXTE (100,210, + "Voulez-vous utiliser la souris (o/n) ?"); + CALL SAISIECHAINE (410,214,souris); + WHILE souris(1)<>'O' AND souris(1)<>'N' + AND souris(1)<>'o' AND souris(1)<>'n' DO + CALL SAISIECHAINE (410,214,souris); + OD; + IF souris(1)='N' ORIF souris(1)='n' THEN + CALL saisie_points; + ELSE CALL saisie_souris; + FI; + WHEN 'q','Q' : quitter:=TRUE;CALL GROFF; EXIT; + ESAC; + CALL CLS; + CALL COLOR (9); + FOR i:=1 TO taille DO + CALL MOVE (p(i).x*O12+9,316-(p(i).y*O12)); + CALL HASCII (ord(p(i).z)); + OD; + CALL affiche_grille; + CALL wrap(n); + CALL affiche_enveloppe; + FOR i:=0 TO taille+1 DO KILL (p(i));OD; + OD; + END; (*block*) + +END convex_hull; \ No newline at end of file diff --git a/examples/geometri/convgraf.pcd b/examples/geometri/convgraf.pcd new file mode 100644 index 0000000000000000000000000000000000000000..864b23ecf0f5b780d069a8e1b20755d8807b209f GIT binary patch literal 1040 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 Mb7Pfb-d-yGKRrqptpET3 literal 0 HcmV?d00001 diff --git a/examples/geometri/cub.log b/examples/geometri/cub.log new file mode 100644 index 0000000..30ca999 --- /dev/null +++ b/examples/geometri/cub.log @@ -0,0 +1,727 @@ +PROGRAM Infographie; + +(* Auteurs: Peyrard Fabrice & Pianelo Patrice *) + +BEGIN + Pref Mouse Block + VAR + h,v,p,lg,b,vitd,vith : Integer, + l,r,z : Boolean, + cour,debut: Cub; + +(*ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»*) +(*º/////////////////////// CUB \\\\\\\\\\\\\\\\\\\\\\ º*) +(*ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ*) + +Unit Cub : Class; +Var + x,y : Real, + suiv : Cub; + +(*ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»*) +(*º/////////////////////// DROITE \\\\\\\\\\\\\\\\\\\\º*) +(*ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ*) + +Unit Droite : Coroutine; +Var + dif,dif1,b : Integer; +Begin + Return; + Do + dif1 := 640; + cour := debut; + Do + b := Calcul_b (cour.x,cour.y); + dif := (b - y) - (x+lg+lg Div 3); + If ((dif < dif1) AND (dif > 0)) Then + dif1 := dif; + Fi; + If (cour.suiv = NONE) Then + Exit; + Else + cour := cour.suiv; + Fi; + Od; + Call Cube (x,y,0); + If (dif1 < vith) Then + x := x + dif1; + Else + x := x + vith; + Fi; + Call Cube (x,y,15); + Call Setwindow (x,x+(lg+lg Div 3),y,y+lg); + Detach; + Od; +End Droite; + +(*ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»*) +(*º/////////////////////// GAUCHE \\\\\\\\\\\\\\\\\\\\º*) +(*ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ*) + +Unit Gauche: Coroutine; +Var + dif,dif1,b : Integer; +Begin + Return; + Do + dif1 := 640; + cour := debut; + Do + b := Calcul_b (cour.x+lg+lg Div 3,cour.y); + dif := x-(b - y); + If ((dif < dif1) AND (dif > 0)) Then + dif1 := dif; + Fi; + If (cour.suiv = NONE) Then + Exit; + Else + cour := cour.suiv; + Fi; + Od; + Call Cube (x,y,0); + If (dif1 < vith) Then + x := x - dif1; + Else + x := x - vith; + Fi; + Call Cube (x,y,15); + Call Setwindow (x,x+(lg+lg Div 3),y,y+lg); + Detach; + Od; +End Gauche; + +(*ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»*) +(*º/////////////////////// HAUT \\\\\\\\\\\\\\\\\\\\\\º*) +(*ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ*) + +Unit Haut: Coroutine; +Var + dif,dif1: Integer; +Begin + Return; + Do + dif1 := 640; + cour := debut; + Do + dif := y-(lg Div 2) - cour.y; + If ((dif < dif1) AND (dif > 0)) Then + dif1 := dif; + Fi; + If (cour.suiv = NONE) Then + Exit; + Else + cour := cour.suiv; + Fi; + Od; + Call Cube (x,y,0); + If (dif1 < vitd) Then + y := y - dif1; + x := x + dif1; + Else + y := y - vitd; + x := x + vitd; + Fi; + Call Cube (x,y,15); + Call Setwindow (x,x+(lg+lg Div 3),y,y+lg); + Detach; + Od; +End Haut; + +(*ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»*) +(*º//////////////////////// BAS \\\\\\\\\\\\\\\\\\\\\\º*) +(*ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ*) + +Unit Bas: Coroutine; +Var + dif,dif1: Integer; +Begin + Return; + Do + dif1 := 640; + cour := debut; + Do + dif := cour.y-(lg Div 2) - y; + If ((dif < dif1) AND (dif > 0)) Then + dif1 := dif; + Fi; + If (cour.suiv = NONE) Then + Exit; + Else + cour := cour.suiv; + Fi; + Od; + Call Cube (x,y,0); + If (dif1 < vitd) Then + y := y + dif1; + x := x - dif1; + Else + y := y + vitd; + x := x - vitd; + Fi; + Call Cube (x,y,15); + Call Setwindow (x,x+(lg+lg Div 3),y,y+lg); + Detach; + Od; +End Bas; + +(*ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»*) +(*º/////////////////////// CUBE \\\\\\\\\\\\\\\\\\\\\ º*) +(*ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ*) + +Unit Cube: IIUWGraph Procedure (x,y,c : Integer); +Begin + Call Color (c); + Call Move (x,y); + Call Draw (x + lg + lg Div 3,y); + Call Draw (x + lg + lg Div 2 + lg Div 3,y - lg Div 2); + Call Draw (x + lg Div 2,y - lg Div 2); + Call Draw (x,y); + Call Draw (x,y + lg); + Call Draw (x + lg + lg Div 3,y + lg); + Call Draw (x + lg + lg Div 3,y); + Call Move (x + lg + lg Div 3,y + lg); + Call Draw (x + lg + lg Div 2 + lg Div 3,y + lg Div 2); + Call Draw (x + lg + lg Div 2 + lg Div 3,y - lg Div 2); +End Cube; + +(*ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»*) +(*º/////////////////////// NOIR \\\\\\\\\\\\\\\\\\\\\ º*) +(*ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ*) + +Unit Noir: IIUWGraph Procedure (x,y,c : Integer); +Var + i : Integer; +Begin + Call Color (c); + For i:= x + 1 To x + (lg+lg Div 3) - 1 Do + Call Move (i,y+1); + Call Draw (i,y+lg-1); + Od; + For i := y To y + lg-2 Do + Call Move (x+(lg+lg Div 3)+1,i); + Call Draw (x+(lg+lg Div 2+lg Div 3)-1,i-(lg Div 2)+2); + Od; + For i:= x + 2 To x + (lg+lg Div 3) Do + Call Move (i,y-1); + Call Draw (i+(lg Div 2)-2,y-(lg Div 2)+1); + Od; +End Noir; + +Unit Calcul_b: Function (vx,vy:Integer):Integer; +Begin + result := vx + vy; +End Calcul_b; + +(*ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»*) +(*º////////////////////// DEPLACE \\\\\\\\\\\\\\\\\\\ º*) +(*ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ*) + +UNIT Deplace: IIUWGraph Procedure; +Var + i : Integer, + err : Boolean, + Ba : Bas, + Ha : Haut, + Ga : Gauche, + Dr : Droite, + c1 : Cub; +Begin + Ba := New Bas; + Ha := New Haut; + Ga := New Gauche; + Dr := New Droite; + + Call Setposition (x+(4*lg) Div 6,y+lg Div 2); + Call Hidecursor; + Do + i := Inkey; + Call Status (h,v,l,r,z); + +(*ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»*) +(*º/////////////////////// DROITE \\\\\\\\\\\\\\\\\\\\º*) +(*ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ*) + + If ((i = -77) OR (h>=x+(lg+lg Div 3))) Then + If (x+lg+lg Div 3 < 595-vith) Then + err := False; + cour := debut; + Do + b := Calcul_b (cour.x,cour.y); + If (y = -(x+lg+lg Div 3) + b) Then + If ((y-lg Div 2 < cour.y) AND (y > cour.y-lg Div 2)) Then + err := True; + Exit; + Fi; + Fi; + If (cour.suiv = NONE) Then + Exit; + Else + cour := cour.suiv; + Fi; + Od; + If Not err Then + Attach (Dr); + Fi; + cour := debut; + Do + Call Cube (cour.x,cour.y,2); + If (cour.suiv = NONE) Then + Exit; + Else + cour := cour.suiv; + Fi; + Od; + Fi; + Fi; + +(*ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»*) +(*º/////////////////////// GAUCHE \\\\\\\\\\\\\\\\\\\\º*) +(*ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ*) + + If ((i = -75) OR (h<=x)) Then + If (x > vith) Then + err := False; + cour := debut; + Do + b := Calcul_b (cour.x+lg+lg Div 3,cour.y); + If (y = -x+b) Then + If ((y-lg Div 2 < cour.y) AND (y > cour.y-lg Div 2)) Then + err := True; + Exit; + Fi; + Fi; + If (cour.suiv = NONE) Then + Exit; + Else + cour := cour.suiv; + Fi; + Od; + If Not err Then + Attach (Ga); + Fi; + cour := debut; + Do + Call Cube (cour.x,cour.y,2); + If (cour.suiv = NONE) Then + Exit; + Else + cour := cour.suiv; + Fi; + Od; + Fi; + Fi; + +(*ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»*) +(*º//////////////////////// BAS \\\\\\\\\\\\\\\\\\\\\\º*) +(*ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ*) + + If ((i = -80) OR (v>=y+lg)) Then + If (y+lg < 300-vitd) AND (x > vith) Then + err := False; + cour := debut; + Do + If (y = cour.y-(lg Div 2)) Then + If ((x <= cour.x+(lg+lg Div 2+lg Div 3)) AND + (x >= cour.x-(lg Div 2+lg Div 3))) Then + err := True; + Exit; + Fi; + Fi; + If (cour.suiv = NONE) Then + Exit; + Else + cour := cour.suiv; + Fi; + Od; + If Not err Then + Attach (Ba); + Fi; + cour := debut; + Do + Call Cube (cour.x,cour.y,2); + If (cour.suiv = NONE) Then + Exit; + Else + cour := cour.suiv; + Fi; + Od; + Fi; + Fi; + +(*ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»*) +(*º/////////////////////// HAUT \\\\\\\\\\\\\\\\\\\\\\º*) +(*ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ*) + + If ((i = -72) OR (v<=y)) Then + If (y-lg Div 2 > vitd) AND (x+lg+lg Div 3 < 595-vith) Then + err := False; + cour := debut; + Do + If (y-(lg Div 2) = cour.y) Then + If ((x+(lg + lg Div 2 + lg Div 3) >= cour.x) AND + (x+(lg Div 2) <= cour.x+(lg + lg Div 3))) Then + err := True; + Exit; + FI; + Fi; + If (cour.suiv = NONE) Then + Exit; + Else + cour := cour.suiv; + Fi; + Od; + If Not err Then + Attach (Ha); + Fi; + cour := debut; + Do + Call Cube (cour.x,cour.y,2); + If (cour.suiv = NONE) Then + Exit; + Else + cour := cour.suiv; + Fi; + Od; + Fi; + Fi; + +(*ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»*) +(*º///////////////////// VALIDATION \\\\\\\\\\\\\\\\\\º*) +(*ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ*) + + If ((i = 27) OR l) Then + cour := debut; + C1 := new Cub; + C1.x := x; + C1.y := y; + Do + b := Calcul_b (debut.x+lg+lg Div 3,debut.y); + If ((y-lg Div 2) < debut.y) AND (x < (b-y)) + OR ((y) < (debut.y-lg Div 2) AND (x >= (b-y))) Then + C1.suiv := debut; + debut := C1; + Exit; + Fi; + If (cour.suiv = NONE) Then + cour.suiv := C1; + C1.suiv := NONE; + Exit; + Fi; + b := Calcul_b (cour.suiv.x+lg+lg Div 3,cour.suiv.y); + If ((y-lg Div 2) < cour.suiv.y) AND (x < (b-y)) + OR ((y) < (cour.suiv.y-lg Div 2) AND (x >= (b-y))) Then + C1.suiv := cour.suiv; + cour.suiv := C1; + Exit; + Fi; + cour := cour.suiv; + Od; + cour := debut; + Do + Call Cube (cour.x,cour.y,2); + Call Noir (cour.x,cour.y,0); + If (cour.suiv = NONE) Then + Exit; + Else + cour := cour.suiv; + Fi; + Od; + Exit; + Fi; + Od; + Kill (Ba); + Kill (Ha); + Kill (Ga); + Kill (Dr); +End Deplace; + +End Cub; + +(*ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»*) +(*º///////////////////// RECTANGLE \\\\\\\\\\\\\\\\\\\º*) +(*ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ*) + +Unit Rectangle: IIUWGraph Procedure (x1,y1,x2,y2,c : Integer); +Begin + Call Color (c); + Call Move (x1,y1); + Call Draw (x2,y1); + Call Draw (x2,y2); + Call Draw (x1,y2); + Call Draw (x1,y1); + Call Move (x1+1,y1+1); + Call Draw (x2-1,y1+1); + Call Draw (x2-1,y2-1); + Call Draw (x1+1,y2-1); + Call Draw (x1+1,y1+1); +End Rectangle; + +(*ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»*) +(*º////////////////////// EFFACE \\\\\\\\\\\\\\\\\\\\\º*) +(*ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ*) + +Unit Efface: IIUWGraph Procedure (x1,y1,x2,y2,c : Integer); +Var + i : Integer; +Begin + Call Color (c); + For i:=y1 To y2 Do + Call Move (x1,i); + Call Draw (x2,i); + Od; +End Efface; + +(*ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»*) +(*º////////////////////// TEXTE \\\\\\\\\\\\\\\\\\\\\\º*) +(*ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ*) + +Unit Texte: IIUWGraph Procedure (x,y : Integer,ch:String); +Begin + Call Color (9); + Call Move (x,y); + Call Outstring (ch); +End Texte; + +(*ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»*) +(*º///////////////////// OPTIONS \\\\\\\\\\\\\\\\\\\\\º*) +(*ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ*) + +Unit Options: IIUWGraph Procedure; +Var + cc: Cub, + i: Integer; +Begin + lg := 30; + cc := New Cub; + Call cc.Cube (290,50,15); + Call cc.Noir (290,50,1); + Call cc.Cube (235,40,15); + Call cc.Noir (235,40,2); + Call cc.Cube (360,35,15); + Call cc.Noir (360,35,3); + Call cc.Cube (200,70,15); + Call cc.Noir (200,70,4); + Call cc.Cube (260,80,15); + Call cc.Noir (260,80,5); + Call cc.Cube (320,75,15); + Call cc.Noir (320,75,6); + Call Color (2); + Call Move (260,135); + Call Outstring ("OPTIONS"); + Call Color (15); + Call Move (100,150); + Call Outstring ("Vitesse"); + Call Move (410,150); + Call Outstring ("Taille"); + Call Rectangle (150,170,165,185,9); + Call Rectangle (150,200,165,215,9); + Call Rectangle (150,230,165,245,9); + Call Color (15); + Call Move (180,178); + Call Outstring ("Lent"); + Call Move (180,208); + Call Outstring ("Moyen"); + Call Move (180,238); + Call Outstring ("Rapide"); + Call Rectangle (450,170,465,185,9); + Call Rectangle (450,200,465,215,9); + Call Rectangle (450,230,465,245,9); + Call Color (15); + Call Move (480,178); + Call Outstring ("Petit"); + Call Move (480,208); + Call Outstring ("Moyen"); + Call Move (480,238); + Call Outstring ("Gros"); + Call Rectangle (250,300,350,330,14); + Call Texte (265,310,"Continuer"); + Call Efface (152,202,163,213,7); + Call Efface (452,202,463,213,7); + lg := 60; + vitd := 4; + vith := 6; + z := Init (i); + Call Setwindow (0,630,0,330); + Call Showcursor; + Do + Call Status (h,v,l,r,z); + If (l) Then + Call Hidecursor; + If ((h >= 250) AND (h <= 350)) AND ((v >= 300) AND (v <= 330)) Then + Exit; + Fi; + If ((h >= 150) AND (h <= 165)) AND ((v >= 170) AND (v <= 185)) Then + Case (vitd) + When 2: Call Efface (152,172,163,183,0); + When 4: Call Efface (152,202,163,213,0); + When 10: Call Efface (152,232,163,243,0); + Esac; + Call Efface (152,172,163,183,7); + vitd := 2; + vith := 4; + Fi; + If ((h >= 150) AND (h <= 165)) AND ((v >= 200) AND (v <= 215)) Then + Case (vitd) + When 2: Call Efface (152,172,163,183,0); + When 4: Call Efface (152,202,163,213,0); + When 10: Call Efface (152,232,163,243,0); + Esac; + Call Efface (152,202,163,213,7); + vitd := 4; + vith := 6; + Fi; + If ((h >= 150) AND (h <= 165)) AND ((v >= 230) AND (v <= 245)) Then + Case (vitd) + When 2: Call Efface (152,172,163,183,0); + When 4: Call Efface (152,202,163,213,0); + When 10: Call Efface (152,232,163,243,0); + Esac; + Call Efface (152,232,163,243,7); + vitd := 10; + vith := 12; + Fi; + If ((h >= 450) AND (h <= 465)) AND ((v >= 170) AND (v <= 185)) Then + Case (lg) + When 30: Call Efface (452,172,463,183,0); + When 60: Call Efface (452,202,463,213,0); + When 80: Call Efface (452,232,463,243,0); + Esac; + Call Efface (452,172,463,183,7); + lg := 30; + Fi; + If ((h >= 450) AND (h <= 465)) AND ((v >= 200) AND (v <= 215)) Then + Case (lg) + When 30: Call Efface (452,172,463,183,0); + When 60: Call Efface (452,202,463,213,0); + When 80: Call Efface (452,232,463,243,0); + Esac; + Call Efface (452,202,463,213,7); + lg := 60; + Fi; + If ((h >= 450) AND (h <= 465)) AND ((v >= 230) AND (v <= 245)) Then + Case (lg) + When 30: Call Efface (452,172,463,183,0); + When 60: Call Efface (452,202,463,213,0); + When 80: Call Efface (452,232,463,243,0); + Esac; + Call Efface (452,232,463,243,7); + lg := 80 + Fi; + Call Showcursor; + Fi; + Od; + Call Efface (0,0,640,350,0); + Kill (cc); +End Options; + + +(*ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»*) +(*º/////////////// PROGRAMME PRINCIPAL \\\\\\\\\\\\\\\º*) +(*ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ*) + +BEGIN + Pref IIUWGraph Block + VAR + i,j,nb : Integer, + C : Cub; + Begin + nb := 13; + z := Init (j); + Call Gron (nocard); + Call Border (5); + Call Options; + Call Color (3); + Call Move (0,300); + Call Draw (605,300); + Call Draw (605,310); + Call Draw (0,310); + Call Move (605,300); + Call Draw (638,267); + Call Move (605,310); + Call Draw (638,277); + Call Move (0,320); + Call Color (15); + C := New Cub; + C.x := 200; + C.y := 150; + Call C.Cube (C.x,C.y,2); + debut := C; + For i:=1 to nb Do + Call Rectangle (520,315,600,345,14); + Call Texte (535,325,"Quitter"); + Call Rectangle (420,315,500,345,14); + Call Texte (435,325,"Suivant"); + z := Init (j); + Call Setwindow (0,630,0,330); + Call Showcursor; + Do + Call Status (h,v,l,r,z); + If (l) Then + If ((h >= 520) AND (h <= 600)) AND + ((v >= 315) AND (v <= 345)) Then + Call Hidecursor; + Call Efface (520,315,600,345,0); + Call Efface (420,315,500,345,0); + Exit + Exit; + Fi; + If ((h >= 420) AND (h <= 500)) AND + ((v >= 315) AND (v <= 345)) Then + Exit; + Fi; + Fi; + Od; + Call Hidecursor; + Call Efface (520,315,600,345,0); + Call Efface (420,315,500,345,0); + Call Color (15); + Call Move (10,320); + Call Outstring ("D‚placez le cube, et fixez"); + Call Outstring (" le en cliquant sur le bouton de GAUCHE."); + C := New Cub; + C.x := 595-lg-lg Div 3; + C.y := 290-lg; + Call C.Cube (C.x,C.y,15); + z := Init (j); + Call C.Deplace; + Call Move (10,320); + Call Outstring (" "); + Call Outstring (" "); + Od; + Call Move (0,320); + Call Color (15); + Call Outstring ("Cliquez sur le bouton de DROITE"); + Call Outstring (" pour obtenir une figure en couleurs. "); + Do + Call Status (h,v,l,r,z); + If (r) Then + i := 1; + cour := debut; + Do + Call C.Cube (cour.x,cour.y,15); + Call C.Noir (cour.x,cour.y,i); + If (cour.suiv = NONE) Then + Exit; + Else + cour := cour.suiv; + Fi; + i := i + 1; + Od; + Exit; + Fi; + Od; + Call Move (0,320); + Call Color (15); + Call Outstring ("Cliquez sur le bouton de GAUCHE"); + Call Outstring (" pour sortir ... "); + Do + Call Status (h,v,l,r,z); + If (l) Then + Exit; + Fi; + Od; + Call Groff; + End; +End; +END Infographie. + diff --git a/examples/geometri/cub.pcd b/examples/geometri/cub.pcd new file mode 100644 index 0000000000000000000000000000000000000000..48f418977d8d7f93d91e212d1e9364f66e0b76a2 GIT binary patch literal 1116 zcmZ9L&r4KM6vw~w-kb5q6pfB(p_ENUh7_bk3rUD9C*KedJ)_ZZ~kBdYB0|eNeUb0a=qi%{71rK3W~Jl-9tM zWY6q(60^WVAHBuo29hI5ppkI^k9~A_&b5V3d7d|>GR;E?V2Jt}KCOZ-w1pyV;f;?j z?XGaO4jMY`z1|mJurWzp$TIq7#sN%v@7P>}iL*Z1u8JO%+R>g+SH#PDZ#^5+)FUKI z=^G7U)t+*IO^hwXO1Pc3=y>$K)SkI*sqe>ofAk)<(Li135PiL&$CSe{#tgk$+RB?7 zQ5{;Bpe#3Kk47gG6P)x~>IGVMIR$by)){)2kIqDA6GGQf;e)Jj%Elh*M9jIvL+&bI zCDkBm41LK*m*>ufgs!C0W-&KnBT2oIw46H))yBCQI&A12BIPZda?6AcQGuGcFs&W5 zP-j7N*W~H!M2;lG=dVZF%A0I!Z9#f=&EXwfr2Zd0oA3a>8q&|I3M|XDg>phiy%VR^ zFXgE*2QR4?ruMUTxCv-K*2!D6Z0N@7B0Zoo1466ZU_b8AnjLJXUZD4OTxkV9A3!JY z$Iw@6inRB^OACEI_Ou@@M?>)y4sKGHn=0Ke(Ss--Y5EBKW^Ca}J^%7{CY*}P)OP2V z+K=35o>PkshU<&9!PfwMW44V&t^vHFTCkIi=~}Hrm^T}jxjIPK|GVdMC2yf?4*0~# z1_Rcvj`1&V{aE}WwfSM0 + then result:=1 + else + if x=0 + then result:=0 + else result:=-1 + fi + fi + end sgn; + unit sqr:function(x:real):real; + begin + result:=x*x + end sqr; + unit grafika:class(Xlewe,Xprawe,Ygorne,Ydolne:real); + + unit punkt:class(x,y:real); +(* unit zaznacz:procedure; + begin + call ekran.krzyzyk(x,y) + end zaznacz; + + unit opisz:procedure(zn:char); + begin + call ekran.opis(x,y,zn) + end opisz;*) + end punkt; + +(*=========================================================================*) + + unit prosta:class(a,b:punkt); + var k1,k2:punkt; + +(* unit RysujProsta:procedure; + var l:real; + begin + l:=(odleglosc(new punkt(Xlewe,Ydolne), + new punkt(Xprawe,Ygorne))/odleglosc(a,b); + k1:=new punkt(l*(a.x-b.x)+a.x,l*(a.y-b.y)+a.y); + k2:=new punkt(l*(b.x-a.x)+b.x,l*(b.y-a.y)+b.y); + call ekran.odcinek(k1.x,k1.y,k2.x,k2.y) + end RysujProsta; + + unit RysujOdcinek:procedure(c:punkt); + begin + { ZAKLADAMY, ZE C JEST NA PROSTEJ } + { JESLI K1=NONE, TO K2=NONE } + + if k1=none + then + k1,k2:=c; + call ekran.odcineczek(a.x,a.y,b.x,b.y,k1.x,k1.y) + else + if lewy(k1,c)=c + then + call ekran.odcinek(c.x,c.y,k1.x,k1.y); + k1:=c + else + if prawy(k2,c)=c + then + call ekran.odcinek(k2.x,k2.y,c.x,c.y); + k2:=c + fi + fi + fi + end RysujOdcinek; + + unit RysujPolprPr(c:punkt); + var l:real; + begin + l:=(odleglosc(new punkt(Xlewe,Ydolne), + new punkt(Xprawe,Ygorne))/odleglosc(a,b); + k2:=new punkt(l*(b.x-a.x)+b.x,l*(b.y-a.y)+b.y); + call ekran.odcinek(c.x,c.y,k2.x,k2.y) + end RysujPolprPr; + + unit RysujPolprLw(c:punkt); + var l:real; + begin + l:=(odleglosc(new punkt(Xlewe,Ydolne), + new punkt(Xprawe,Ygorne))/odleglosc(a,b); + k1:=new punkt(l*(a.x-b.x)+a.x,l*(a.y-b.y)+a.y); + call ekran.odcinek(k1.x,k1.y,c.x,c.y) + end RysujPolprLw; *) + + unit lewy:function(c,d:punkt):punkt; + begin + if (sgn(b.x-a.x)=sgn(d.x-c.x)) orif + (sgn(b.y-a.y)=sgn(d.y-c.y)) + then result:=c + else result:=d + fi + end lewy; + + unit prawy:function(c,d:punkt):punkt; + begin + if (sgn(b.x-a.x)=sgn(d.x-c.x)) orif + (sgn(b.y-a.y)=sgn(d.y-c.y)) + then result:=d + else result:=c + fi + end prawy; + + end prosta; + +(*=========================================================================*) + + unit okrag:class(S:punkt,r:real); + +(* unit RysujOkrag:procedure; + begin + call ekran.okrag(S.x,S.y,r,0.0,2*PI) + end RysujOkrag; + + unit RysLuk1:procedure(A:punkt); + var alfa:real; + begin + alfa:=asin((A.y-S.y)/r) + end RysLuk1; + + unit RysLuk2:procedure(A,B:punkt); + begin + call ekran.okrag(S.x,S.y,r,asin((A.y-S.y)/r)-0.18, + asin((B.y-S.y)/r)+0.18) + end;*) + +(* unit PrawoLewo:class(OdCzego,A,B:punkt); + var alfa,beta,gamma:real; + begin + gamma:=asin((OdCzego.y-S.y)/r); + alfa:=asin((A.y-S.y)/r)-gamma; + beta:=asin((B.y-S.y)/r)-gamma; + + if alfa<0.0 then alfa:=alfa+2*PI fi; + if beta<0.0 then beta:=beta+2*PI fi; + end PrawoLewo; + + unit NaPrawo:PrawoLewo function :punkt; + begin + if alfa(O1.r+O2.r)) or (abs(O1.r-O2.r)>d) then return fi; + + (* Przesuwamy uklad wsp. o wektor O1.S *) + S2x:=O2.S.x-O1.S.x; + S2y:=O2.S.y-O1.S.y; + + (* Obracamy uklad wsp. o kat alfa pod jakim O1 O2 przecina + os odcietych *) + sin_alfa:=S2y/d; + cos_alfa:=S2x/d; + + (* Obliczamy wsp jednego punktu przeciecia *) + x:=(sqr(O1.r)-sqr(O2.r))/(2*d)+d/2; + y:=sqrt(sqr(O1.r)-sqr(x)); + (* Drugi punkt przeciecia jest symetryczny wzgledem os OX *) + + (* Wracamy do ukladu sprzed obrotu *) + Q1:=new punkt (x*cos_alfa-y*sin_alfa,x*sin_alfa+y*cos_alfa); + Q2:=new punkt(x*cos_alfa+y*sin_alfa,x*sin_alfa-y*cos_alfa); + + (* Wracamy do ukladu sprzed przesuniecia *) + Q2.x:=Q2.x+O1.S.x; + Q2.y:=Q2.y+O1.S.y; + Q1.x:=Q1.x+O1.S.x; + Q1.y:=Q1.y+O1.S.y + end CzwOO; + +(*======================================================================*) + + unit CzwOP:procedure(O:okrag,P:prosta;output Q1,Q2:punkt); + var A,B,C,x,y,pom,d,odl,wersorX,wersorY,ax,ay,bx,by:real; + begin + ax:=P.a.x-O.S.x; + bx:=P.b.x-O.S.x; + ay:=P.a.y-O.S.y; + by:=P.b.y-O.S.y; + + A:=by-ay; + B:=ax-bx; + C:=bx*ay-ax*by; + + pom:=-C/(A*A+B*B); + x:=A*pom; + y:=B*pom; + + d:=odleglosc(P.a,P.b); + wersorX:=(bx-ax)/d; + wersorY:=(by-ay)/d; + + odl:=sqr(O.r)-(sqr(x)+(sqr(y))); + if odl<0 then return fi; + odl:=sqrt(odl); + + Q1:=new punkt(x+wersorX*odl+O.S.x,y+wersorY*odl+O.S.y); + Q2:=new punkt(x-wersorX*odl+O.S.x,y-wersorY*odl+O.S.y) + end CzwOP + + end grafika; +begin + pref grafika(-100,100,100,-100) block + var punkty:array_of punkt, + okregi:array_of okrag, + proste:array_of prosta, + konce1,konce2,srodki:array_of integer, + i,j,k,l,m,n:integer, + c,c1:char, + x,y,z:real; + unit piszwynik :procedure(i,j:integer); + begin + writeln("nrp x y"); + write(i," "); + if punkty(i)=none then writeln("none") + else writeln(punkty(i).x,punkty(i).y) + fi; + write(j," "); + if punkty(j)=none then writeln("none") + else writeln(punkty(j).x,punkty(j).y) + fi + end piszwynik; + + begin + writeln("Jakie n?"); + readln(n); + array punkty dim(1:n); + array okregi dim(1:n); + array proste dim(1:n); + array srodki dim(1:n); + array konce1 dim(1:n); + array konce2 dim(1:n); + + do + write(" Point Line Circle Intersection Quit :"); + readln(c); + case c + when 'p': + write("New List :"); + readln(c1); + case c1 + when 'n': + write("point: nr x y "); + readln(i,x,y); + punkty(i):=new punkt(x,y); + when 'l': + j:=1; + for i:=1 to n do + if (j mod 25)=1 then + write("nr x y"); + j:=j+1; + readln + fi; + if punkty(i)<>none then + writeln(i," ",punkty(i).x," ", + punkty(i).y); + j:=j+1 + fi + od; + esac; + when 'l': + write("New List "); + readln(c1); + case c1 + when 'n': + write("nrl nrp nrp :"); + readln(i,j,k); + proste(i):=new prosta(punkty(j),punkty(k)); + konce1(i):=j; + konce2(i):=k; + when 'l': + j:=1; + for i:=1 to n do + if (j mod 25)=1 then + write("nrl nrp nrp"); + j:=j+1; + readln + fi; + if proste(i)<>none then + writeln(i," ",konce1(i)," ", + konce2(i)); + j:=j+1 + fi + od; + esac; + when 'c': + write("New List "); + readln(c1); + case c1 + when 'n': + write("nrc nrp rad :"); + readln(i,j,x); + okregi(i):=new okrag(punkty(j),x); + srodki(i):=j; + when 'l': + j:=1; + for i:=1 to n do + if (j mod 25)=1 then + write("nrc nrp rad"); + j:=j+1; + readln + fi; + if okregi(i)<>none then + writeln(i," ",srodki(i)," ", + okregi(i).r); + j:=j+1 + fi + od; + esac; + when 'i': + write (" 1-LL 2-CL 3-CC "); + readln(c1); + case c1 + when '1': + write("nrp nrp nrl nrl "); + readln(i,j,k,l); + call CZwPP(proste(k),proste(l),punkty(i),punkty(j)); + call piszwynik(i,j); + when '2': + write("nrp nrp nrc nrl "); + readln(i,j,k,l); + call CZwOP(okregi(k),proste(l),punkty(i),punkty(j)); + call piszwynik(i,j); + when '3': + write("nrp nrp nrc nrc "); + readln(i,j,k,l); + call CZwOO(okregi(k),okregi(l),punkty(i),punkty(j)); + call piszwynik(i,j); + esac; + when 'q': call endrun; + esac; + od + end +end. \ No newline at end of file diff --git a/examples/geometri/inwers.ccd b/examples/geometri/inwers.ccd new file mode 100644 index 0000000000000000000000000000000000000000..801f8dfddf6552583cd868451ddbf337b9630d91 GIT binary patch literal 19214 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 0 then exit fi; + od; + result := i; + end inchar; + + + unit ryspunkt:procedure(x,y:real); + (* Procedura rysuje punkt jako krzyzyk *) + var x1,y1:integer; + begin + call color(14); + y1:=entier(poczY-y*skala); + x1:=entier(x*skala*aspekt+poczX); + call move(x1,y1+3); + call draw(x1,y1-3); + call move(x1-4,y1); + call draw(x1+4,y1); + end ryspunkt; + + unit rys_ukl_wsp:procedure; + (* Rysowanie ukladu wspolrzednych na ekranie oraz skali na osi OX i OY *) + var i,y,x:integer; + begin + call color(14); + call move(poczX,poczY); + call hfill(szerekranu); + call draw(poczX,0); + i:=1; + x:=0; + y:=skala; + while y>= skala do + y:=poczY - i*skala; + if y >= 4 then + call move(0,y-4) + else + call move(0,y); + fi; + call outstring(liczba(i)); + call move(poczX-2,y); + call draw(poczX,y); + i:=i+1; + od; + i:=1; + while x<=(szerekranu-skala*aspekt) do + x:=poczX+i*skala*aspekt; + if x <= (szerekranu-5) then + call move(x-9,poczY+5); + else + call move(x-13,poczY+5); + fi; + call outstring(liczba(i)); + call move(x,poczY); + call draw(x,poczY+3); + i :=i+1; + od; + end rys_ukl_wsp; + + + unit rysokrag:procedure(x,y,promien:real); + (* Rysowanie okregu na ekranie w ten sposob aby nie przecinal osi *) + (* ukladu wspolrzednych, jesli okrag nie miesci sie na ekranie to *) + (* rysowany jest tylko wycinek *) + const srodek=0, + prawo=1, + lewo=2, + gora=4, + dol=7, + goraprawo=5, + goralewo=6, + dolprawo=8, + dollewo=9, + goradol=11, + goraprawodol=12, + goralewodol=13, + pi=3.1415926536; + var x1,x2,y1,y2,a,b,r,katpocz,katkon:real, + polozenie:integer; + begin + call color(11); + a:=x; + b:=y; + r:=promien; + polozenie:=srodek; + katpocz,katkon:=0; + if (a+r)>29 then polozenie:=prawo fi; + if (a-r)<0 then polozenie:=polozenie+lewo fi; + if (b+r)>18 then polozenie:=polozenie+gora fi; + if (b-r)<0 then polozenie:=polozenie+dol fi; + case polozenie + when gora:x1:=sqrt(r*r-(18-b)*(18-b)); + katpocz:=pi-atan((18-b)/x1); + katkon:=atan((18-b)/x1); + when dol: x1:=sqrt(r*r-b*b); + katpocz:=2*pi-atan(b/x1); + katkon:=pi+atan(b/x1); + when prawo:y1:=sqrt(r*r-(29-a)*(29-a)); + katpocz:=atan(y1/(29-a)); + katkon:=2*pi-atan(y1/(29-a)); + when lewo: y1:=sqrt(r*r-a*a); + katpocz:=pi+atan(y1/a); + katkon:=pi-atan(y1/a); + when goraprawo:x1:=sqrt(r*r-(18-b)*(18-b)); + y1:=sqrt(r*r-(29-b)*(29-b)); + katpocz:=0.5*pi+atan(x1/(18-b)); + katkon:=2*pi-atan(y1/(29-a)); + when goralewo:x1:=sqrt(r*r-(18-b)*(18-b)); + y1:=sqrt(r*r-a*a); + katpocz:=pi+atan(y1/a); + katkon:=atan((18-b)/x1); + otherwise + case polozenie + when dolprawo:y1:=sqrt(r*r-(29-a)*(29-a)); + x1:=sqrt(r*r-b*b); + katpocz:=atan(y1/(29-a)); + katkon:=pi+atan(b/x1); + when dollewo: x1:=sqrt(r*r-b*b); + y1:=sqrt(r*r-a*a); + katpocz:=2*pi-atan(b/x1); + katkon:=pi-atan(y1/a); + when goradol: x1:=sqrt(r*r-(18-b)*(18-b)); + x2:=sqrt(r*r-b*b); + katpocz:=pi-atan((18-b)/x1); + katkon:=pi+atan(b/x2); + call cirb(entier(a*skala*aspekt+poczX), + entier(poczY-b*skala), + entier(r*skala*aspekt), + katpocz,katkon,1,0,1,1); + x1:=a+sqrt(r*r-(18-b)*(18-b)); + x2:=a+sqrt(r*r-b*b); + katpocz:=2*pi-atan(b/(x2-a)); + katkon:=atan((18-b)/(x1-a)); + when goraprawodol:x1:=sqrt(r*r-(18-b)*(18-b)); + x2:=sqrt(r*r-b*b); + katpocz:=pi-atan((18-b)/x1); + katkon:=pi+atan(b/x2); + when goralewodol:x1:=sqrt(r*r-(18-b)*(18-b)); + x2:=sqrt(r*r-b*b); + katpocz:=2*pi-atan(b/x2); + katkon:=atan((18-b)/x1); + esac; + esac; + + call cirb(entier(a*skala*aspekt+poczX),entier(poczY-b*skala), + entier(r*skala*aspekt),katpocz,katkon,11,0,1,1); + end rysokrag; + + + + + + begin + array liczba dim(1:29); + liczba(1):=" 1"; + liczba(2):=" 2"; + liczba(3):=" 3"; + liczba(4):=" 4"; + liczba(5):=" 5"; + liczba(6):=" 6"; + liczba(7):=" 7"; + liczba(8):=" 8"; + liczba(9):=" 9"; + liczba(10):="10"; + liczba(11):="11"; + liczba(12):="12"; + liczba(13):="13"; + liczba(14):="14"; + liczba(15):="15"; + liczba(16):="16"; + liczba(17):="17"; + liczba(18):="18"; + liczba(19):="19"; + liczba(20):="20"; + liczba(21):="21"; + liczba(22):="22"; + liczba(23):="23"; + liczba(24):="24"; + liczba(25):="25"; + liczba(26):="26"; + liczba(27):="27"; + liczba(28):="28"; + liczba(29):="29"; + + end grafika; + + + + unit geometria:grafika class; + + + unit punkt:class(x,y:real); + begin + call ryspunkt(x,y); + end punkt; + + unit okrag:class(srodek:punkt;promien:real); + var i:integer; + begin + call rysokrag(srodek.x,srodek.y,promien); + i := inchar ; (*** czekaj nich popatrze ***) + end okrag; + + + + unit odleglosc:function(a,b:punkt):real; + var a1,a2:real; + begin + a1:=b.x-a.x; + a2:=b.y-a.y; + result:=sqrt((a1*a1)+(a2*a2)); + end odleglosc; + + + unit dalszy:function(od_punktu,P1,P2:punkt):punkt; + begin + if odleglosc(od_punktu,P1) > odleglosc(od_punktu,P2) then + result:=P1 + else + result:=P2 + fi; + end dalszy; + + unit przeciecieokr:procedure(k1,k2:okrag;output Apunkt,Bpunkt:punkt); + (* Procedura ta oblicza wspolrzedne punktow przeciecia sie + dwoch okregow k1, k2 rozwiazujac uklad dwoch rownan + kwadratowych opisujacych okregi k1 i k2 .I tak + k1 - srodek (a,b) ,promien r + k2 - srodek (c,d) ,promien R *) + var f,aa,bb,cc,sqrdel,delta, + a,b,c,d,e,r2,r1,c_a,r1_2,r1_2_r2_2:real; + var x1,x2,y1,y2:real; + begin + a:=k1.srodek.x; + b:=k1.srodek.y; + c:=k2.srodek.x; + d:=k2.srodek.y; + r1:=k1.promien; + r2:=k2.promien; + r1_2:=r1*r1; + r1_2_r2_2:=r1_2-(r2*r2); + if a=c then + y1:=r1_2_r2_2/(2*(d-b))+(d+b)/2; + y2:=y1; + sqrdel:=sqrt(r1_2-(y1-b)*(y1-b)); + x1:=a-sqrdel; + x2:=a+sqrdel; + else + if b=d then + x1:=r1_2_r2_2/(2*(c-a))+(c+a)/2; + x2:=x1; + sqrdel:=sqrt(r1_2-(x1-a)*(x1-a)); + y1:=b-sqrdel; + y2:=b+sqrdel + else + c_a:=c-a; + e:=(c+a)/2+(r1_2_r2_2-b*b+d*d)/(2*c_a); + f:=(b-d)/c_a; + aa:=(f*f)+1; + bb:=2*(f*(e-a)-b); + cc:=(e*e)-(2*e*a)+(a*a)+(b*b)-(r1*r1); + delta:=(bb*bb)-(4*aa*cc); + y1:=((-bb)-sqrt(delta))/(2*aa); + y2:=((-bb)+sqrt(delta))/(2*aa); + x1:=e+f*y1; + x2:=e+f*y2; + fi; + fi; + Apunkt:=new punkt(x1,y1); + Bpunkt:=new punkt(x2,y2); +end przeciecieokr; + + + unit wydluz2x:function(P,K:punkt):punkt; + var P1,P2,P3,P4,P5:punkt, + KP,PK:okrag; + begin + KP:=new okrag(K,odleglosc(K,P)); + PK:=new okrag(P,KP.promien); + call przeciecieokr(KP,PK,P1,P2); + kill(P2); + kill(PK); + PK:=new okrag(P1,KP.promien); + call przeciecieokr(KP,PK,P2,P3); + P4:=copy(dalszy(P,P2,P3)); + kill(P3); + kill(P2); + kill(PK); + PK:=new okrag(P4,KP.promien); + call przeciecieokr(KP,PK,P3,P4); + P5:=copy(dalszy(P1,P3,P4)); + kill(P4); + kill(P3); + kill(P1); + kill(P2); + result:=P5; + kill(KP); + kill(PK); + end wydluz2x; + + + + begin + end geometria; + +begin + +pref geometria block +const ek_rob=0, + cls_ek=1, + exit_con=2, + inwer=3, + enter=13, + st_w_dol=-80, + st_w_gore=-72, + esc=27; + + +unit inwersja:geometria procedure(x,y:real); + var P,P1,P2,P3,P4:punkt, + i,odl:integer, + KPS,KP1,KP2:okrag; + begin + call color(14); + if (S.x=/=x) or (S.y=/=y) then + odl:=0; + P:=new punkt(x,y); (* PUNKT KTORY MA BYC PRZEKSZTALCONY *) + call outstring("P"); + if odleglosc(P,S)<= (KS.promien/2) then + (* NALEZY PRZESUNAC P POZA OKRAG INWERSJI DOKONAC INWERSJI I *) + (* PRZESUNAC TYLE SAMO RAZY CO POPRZEDNIO *) + P1:=copy(P); + P2:=copy(S); + while odleglosc(P1,S)<=KS.promien do + P3:=wydluz2x(P2,P1); + kill( P2); + P2:=P1; + P1:=P3; + odl:=odl+1; + od; + kill( P2); + kill( P); + P:=P1; + P1:=none; + P3:=none; + call ryspunkt(P.x,P.y); + call outstring("P1'"); + fi; + KPS:=new okrag(P,odleglosc(P,S)); + call przeciecieokr(KPS,KS,P1,P2); + kill( KPS); + kill( P); + KP1:=new okrag(P1,KS.promien); + KP2:=new okrag(P2,KS.promien); + call przeciecieokr(KP1,KP2,P3,P4); + kill( P1); + kill( P2); + kill( KP1); + kill( KP2); + P:=copy(dalszy(S,P3,P4)); + call ryspunkt(P.x,P.y); + if odl>0 then + call outstring("P2'") + else + call outstring("P'") + fi; + kill( P3); + kill( P4); + P1:=copy(S); + for i:=1 to odl do + P3:=wydluz2x(P1,P); + kill( P1); + P1:=P; + P:=P3; + od; + call ryspunkt(P.x,P.y); + call outstring("P' "); + kill(P); + kill(P1); + fi; + end inwersja; + + +unit strzalka:procedure(x,y:integer); +begin + call cirb(x,y,29,2.9,3.3,0,1,1,1); +end strzalka; + + +unit rys_menu:procedure; +begin + call color(14); + call move(519,0); + call hfill(619); + call draw(519,25); + call hfill(619); + call draw(519,50); + call hfill(619); + call draw(519,75); + call hfill(619); + call draw(519,100); + call draw(619,100); + call draw(619,0); + call move(533,5); + call outstring("SHAW AUX"); + call move(533,30); + call outstring("CLEAR AUX"); + call move(533,55); + call outstring("END"); + call move(533,80); + call outstring("INVERSION"); +end rys_menu; + + +unit czyt_licz:function:real; +const kropka=46; +var ulamek:bool, + wykladnik,res:real, + lzn,(*liczba wczytanych znakow *) + znak:integer;(*kod wczytanego znaku*) +begin + ulamek:=false; + wykladnik:=1; + result:=0; + do + znak:=inchar; + case znak + when kropka: ulamek:=true; + wykladnik:=1; + lzn:=lzn+1; + call hascii(znak); + when enter: exit; + otherwise lzn:=lzn+1; + if lzn <= 5 then + if ulamek then + wykladnik:=wykladnik/10; + result:=result+(znak-ord('0'))*wykladnik; + else + result:=result*wykladnik+(znak-ord('0')); + wykladnik:=wykladnik*10; + fi; + call hascii(znak); + else + exit + fi; + esac; + od; +end czyt_licz; + + +var i,stan,znak:integer, + S:punkt, + KS:okrag, + wsp_strz:arrayof arrayof integer, + x,y:real; +begin + + array wsp_strz dim(0:5); + for i:=0 to 5 do + array wsp_strz(i) dim(1:2); + od; + for i:=0 to 5 do + wsp_strz(i,1):=515; + od; + wsp_strz(0,2):=15; + wsp_strz(1,2):=40; + wsp_strz(2,2):=65; + wsp_strz(3,2):=90; + wsp_strz(4,2):=120; + wsp_strz(5,2):=140; + stan:=0; + call gron(0); (* 0 - STRONA ROBOCZA *) + call rys_ukl_wsp; + + (******* RYSUJ OKRAG INWERSJI ***********) + + call color(2); + S:=new punkt(11.5,9.5); + call outstring(" S"); + KS:=new okrag(S,4); + kill(S); + kill(KS); + call hpage(1,1,0); (* 1 - STRONA Z MENU *) + call cls; + call rys_ukl_wsp; + + (******* RYSUJ OKRAG INWERSJI ***********) + call color(14); + S:=new punkt(11.5,9.5); + call outstring(" S"); + KS:=new okrag(S,4); + call rys_menu; + call strzalka(wsp_strz(stan,1),wsp_strz(stan,2)); + do + znak:=inchar; + case znak + when st_w_dol: call color(0); (**** 0 - kolor tla *****) + call strzalka(wsp_strz(stan,1),wsp_strz(stan,2)); + stan:=(stan+1) mod 4; + call color(14); (**** 14 - kolor znaku *****) + call strzalka(wsp_strz(stan,1),wsp_strz(stan,2)); + when st_w_gore:call color(0); (**** 0 - kolor tla *****) + call strzalka(wsp_strz(stan,1),wsp_strz(stan,2)); + stan:=(stan+3) mod 4; + call color(14); (**** 1 - kolor znaku *****) + call strzalka(wsp_strz(stan,1),wsp_strz(stan,2)); + when enter: case stan + when ek_rob: call hpage(0,1,0); + znak:=inchar; + call hpage(1,1,0); + + when cls_ek: call hpage(0,1,0); + call cls; + call rys_ukl_wsp; + call rysokrag(S.x,S.y,KS.promien); + call ryspunkt(S.x,S.y); + call outstring(" S"); + call hpage(1,1,0); + + when exit_con: exit; + + when inwer: call move(519,115); + call outstring("X="); + call move(540,112); + call draw(590,112); + call move(540,112); + call draw(540,125); + call draw(590,125); + call draw(590,112); + call move(546,115); + (*wczytnie x*) + x:=czyt_licz; + call move(519,145); + call outstring("Y="); + call move(540,142); + call draw(590,142); + call move(540,142); + call draw(540,155); + call draw(590,155); + call draw(590,142); + call move(546,145); + (*wczytnie y*) + y:=czyt_licz; + call color(0); + for i:=112 to 155 do + call move(515,i); + call draw(595,i); + od; + call color(11); + call hpage(0,1,0); + if (x>0) andif (y>0) andif (x<29) andif (y<18) + then + call inwersja(x,y); + znak:=inchar; + call hpage(1,1,0); + else + call move(360,180); + + call outstring(" bad data "); + call move(360,200); + call outstring(" press ESC "); + do + znak:=inchar; + if znak=Esc then exit fi; + od; + call cls; + call rys_ukl_wsp; + call rysokrag(S.x,S.y,KS.promien); + call ryspunkt(S.x,S.y); + call outstring(" S"); + call hpage(1,1,0); + fi; + esac; + esac; + od; + call groff; + end; +end geo diff --git a/examples/geometri/inwers.pcd b/examples/geometri/inwers.pcd new file mode 100644 index 0000000000000000000000000000000000000000..d753ef5cb1117fed7c4b9b1fc94865c81878fa5a GIT binary patch literal 800 zcmZva%_~Gv7{;G_&z(C4HxqHE!7vHgvLIjCOp?r?l#hjl1q%xcitH58_(~|n!ot{5 zHWvN_7PFnQv5>N|v(oY0k7MqXx8Cz{&+k0XIp@AoT6!Ns$Y~m!xMkm=yF&;_DZC-u zPQ8L(`ib>0Q{=jR4&;DdPXI$Mr?%aYOOYl~bM7w$a-7HXp~)dJ4Q!B$f#!~Rep zV%H$z&W<%5r{wNRxD#LR(XQfsoj4$K#QX?wCJxCx!@!pvMH#YO-=p3>`|+5&jg9jz zUKp5(Rlz&O4!K=&TmN#|SPKunsg+}m_uVF!iz^i=O{~-Ro4)t)0d!%7@3zETC6{k3 za$zjH_b^astV1Oh$jmVp$)yrS&cwX0mrmHQFwL_~(s!2JLkTxU?u9S%lyLN%$dH*} zzBUE*#(nO+$zuJfNR#_%R=0 then + result:=new punkt; + result.x:=(-b+sqrt(d))/(2*a); + result.y:=(-b-sqrt(d))/(2*a); + fi + fi + fi; + end rozwiaz; + + unit odcinek:zbior class; + var a,b:punkt; + + unit dlugosc:function:real; + begin + result:=a.odleglosc(b); + end dlugosc; + + end odcinek; + + unit okrag:zbior class; + var o:punkt, + r:real; + + unit przeczokreg:function (a:okrag):prosta; + var pom1,pom2:real; + begin + if a=/=none then + pom1:= r*r-o.x*o.x-o.y*o.y; + pom2:= a.r*a.r-a.o.x*a.o.x-a.o.y*a.o.y; + result := new prosta; + result.a:=2*(a.o.x-o.x); + result.b:=2*(a.o.y-o.y); + result.c:=pom2-pom1; + fi + end przeczokreg; + + unit przeczprost:function(l:prosta):odcinek; + var pom:punkt; + + begin + if l.a=/=0 then + pom:=rozwiaz(1+(l.b/l.a)*(l.b/l.a),2*(l.b*l.c/l.a+o.x*l.b/l.a-o.y), + 2*o.x*l.c/l.a+(l.c*l.c)/(l.a*l.a)+o.x*o.x+o.y*o.y-r*r); + result:=new odcinek; + result.a:=new punkt; + result.a.x:=-(pom.x*l.b/l.a+l.c/l.a); + result.a.y:=pom.x; + result.b:=new punkt; + result.b.x:=-(pom.y*l.b/l.a+l.c/l.a); + result.b.y:=pom.y; + else + pom:=rozwiaz(1+(l.a/l.b)*(l.a/l.b),2*(l.a*l.c/l.b+o.x*l.a/l.b-o.y), + 2*o.x*l.c/l.b+(l.c*l.c)/(l.b*l.b)+o.x*o.x+o.y*o.y-r*r); + result:=new odcinek; + result.a:=new punkt; + result.a.y:=-(pom.x*l.a/l.b+l.c/l.b); + result.a.x:=pom.x; + result.b:=new punkt; + result.b.y:=-(pom.y*l.a/l.b+l.c/l.b); + result.b.x:=pom.y; + fi; + end przeczprost; + end okrag; + + unit prosta:zbior class; + var a,b,c:real; + + unit przeczprost:function (l:prosta):punkt; + var pom:real; + begin + if (l=/=none) and (not rownolega(l)) then + pom:= 1/(l.a*b-l.b*a); + result:=new punkt; + result.x:=-pom*(b*l.c-c*l.b); + result.y:=pom*(a*l.c-c*l.a); + fi + end przeczprost; + + unit rownolega:function(l:prosta):boolean; + begin + if l=/=none then + if a*l.b-b*l.a=0 then + result:=true; + else + result:=false; + fi + fi + end rownolega; + + end prosta; + + unit ekran:iiuwgraph class; + + (* Klasa obslugujaca ekran *) + const skala=10, + wysekr=348, + szerekr=620, + poczpoz=szerekr div 2, + poczpio=wysekr div 2, + p=3, + q=4, + aspekt=p/q; + + unit inchar:function:integer; + begin + while result=0 do + result:=inkey; + od; + end inchar; + + unit punktnaekr:class; + var x,y:integer; + end punktnaekr; + + unit naekranie:function(a:punktnaekr):boolean; + begin + result:=((a.x>0) and (a.x0) and (a.y=0 do + call rysczw(x,y); + y:=y-1; + fy:=fy-qq8; + if fs<=0 then + x:=x+1; + fx:=fx+pp8; + fs:=fs+fx-fy+qq4; + else + fs:=fs-fy+qq4; + fi; + od; + end rysokr; + + unit poczatek:procedure; + begin + call gron(0); + end poczatek; + + unit koniec:procedure; + begin + call groff; + end koniec; + + unit czysc:procedure; + begin + call cls; + end czysc; + + end ekran; + + var pr,ppr:prosta, + okg:okrag, + ppom,po,pk,pp:punkt, + odp:odcinek, + okl,okp:okrag, + i:real, + j:integer, + a:char, + ekr:ekran; + + begin + ekr:=new ekran; + do + i:=0; + while (i<1) or (i>9) do + writeln("Podaj dlugosc odcinka"); + readln(i); + od; + call ekr.poczatek; + call ekr.czysc; + pr:=new prosta; + pr.a:=0; + pr.b:=1; + pr.c:=0; + pp:=new punkt; + pp.x:=-1; + pp.y:=0; + pk:=new punkt; + pk.x:=i; + pk.y:=0; + call ekr.rysodc(pp,pk); + okg:=new okrag; + okg.o:=new punkt; + okg.o.x:=(i-1)/2; + okg.o.y:=0; + okg.r:=(i+1)/2; + call ekr.rysokr(okg); + okl:=new okrag; + okl.o:=pp; + okl.r:=2; + call ekr.rysokr(okl); + okp:=new okrag; + okp.o:=new punkt; + okp.o.x:=1; + okp.o.y:=0; + okp.r:=2; + call ekr.rysokr(okp); + ppr:=okl.przeczokreg(okp); + odp:=okg.przeczprost(ppr); + call ekr.rysodc(odp.a,odp.b); + ppom:=pr.przeczprost(ppr); + j := inchar; + call ekr.koniec; + writeln("Punkt przeciecia,x=",ppom.x," y=",ppom.y); + writeln("punkt gorny,x=",odp.a.x," y=",odp.a.y); + writeln("Dlugosc d=",ppom.odleglosc(odp.a)); + writeln(" CZY CHCESZ JESZCZE RAZ?(T/N) "); + readln(a); + if (a=/='t') and (a=/='T') then exit fi; + od; + end; \ No newline at end of file diff --git a/examples/geometri/mariusz4.log b/examples/geometri/mariusz4.log new file mode 100644 index 0000000..b9d9de5 --- /dev/null +++ b/examples/geometri/mariusz4.log @@ -0,0 +1,249 @@ +program pierwiastek; +begin +pref IIUWgraph block +const + aspekt=1.33333333333, + Pi=3.1415926536, + jednostka=25; +(*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*) + unit WaitMoment:procedure; + var r:integer; + begin + call move(290,320); + call outstring("Press any key!"); + while r = 0 do + r:=inkey + od; + call move(290,320); + call outstring(" * "); + end WaitMoment; +(*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*) +unit punkt:class(x,y:real); + unit plot:procedure; + begin + call move(round(x*aspekt)-3,round(y)); + call draw(round(x*aspekt)+3,round(y)); + call move(round(x*aspekt),round(y)-2); + call draw(round(x*aspekt),round(y)+3); + end plot; +end punkt; + +(*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*) + +unit okrag :class (S:punkt;r:real); + unit cirb:procedure(alfa,beta:real); + var gamma,x,y:real; + begin + if alfa."); + call track(303,202); + B:=new punkt(inxpos*(1/aspekt),inypos); + call B.plot; + call outstring ("B"); + call move (100,300); + call outstring(" "); + AB:=new odcinek(A,B); + C:=punkt_odlegly(AB,1); + call C.plot; + call outstring ("C"); + AC:=new odcinek(A,C); + call WaitMoment; + D:=srodek_odcinka(AC); + call D.plot; + call outstring("D"); + call WaitMoment; + o1:=new okrag(D,odleglosc(D,C)); + call cirb(round(D.x*aspekt),round(d.y),round(odleglosc(D,C)*aspekt),1,1,1,0,1,1); + BE:=prostopadla(AC,B); + call WaitMoment; + call okrag_odcinek(o1,BE,F,G); + wynik:=odleglosc(B,F); + call F.plot; + call outstring("F"); + BF:=new odcinek(B,F); + call move(100,310); + call outstring("Dlugosc odcinka BF wynosi pierwiastek z dlugosci odcinka AB."); + call WaitMoment; + call groff + end +end. + \ No newline at end of file diff --git a/examples/geometri/odcinki.ccd b/examples/geometri/odcinki.ccd new file mode 100644 index 0000000000000000000000000000000000000000..ea8e73439ec6523f14ce3a8759e6cbce0e663842 GIT binary patch literal 35516 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 QVNKUs%SpRtt5fIwKZ&qd7XSbN literal 0 HcmV?d00001 diff --git a/examples/geometri/odcinki.lcd b/examples/geometri/odcinki.lcd new file mode 100644 index 0000000000000000000000000000000000000000..792d3d06bc82ce206fe5feca287036a05e013ff5 GIT binary patch literal 82432 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 literal 0 HcmV?d00001 diff --git a/examples/geometri/odcinki.log b/examples/geometri/odcinki.log new file mode 100644 index 0000000..9f402a9 --- /dev/null +++ b/examples/geometri/odcinki.log @@ -0,0 +1,1049 @@ +program Seg; +begin; +pref IIUWGRAPH block; + +unit Welcome : Ansi procedure ; +const X = 100 , + Y = 80 , + Height = 150 , + Width = 80 , + Room = 20; + +var P : point , + i : integer ; + + unit DrawO : procedure( P : Point ); + begin + call Move( P.X,P.Y ); + call Draw( P.X + Width , P.Y ); + call Draw( P.X + Width , P.Y + Height ); + call Draw( P.X , P.Y + Height ); + call Draw( P.X , P.Y ); + end; + + unit DrawD : procedure( P : Point ); + begin + call DrawO( P ); + call Move( P.X + 2,P.Y ); + call Draw( P.X + 2 ,P.Y + Height ); + end; + + unit DrawC : procedure( P : point ); + begin + call Move( P.X + Width ,P.Y ); + call Draw( P.X, P.Y ); + call Draw( P.X , P.Y + Height ); + call Draw( P.X + Width , P.Y + Height ); + end; + + unit DrawI : procedure( P : point ); + begin + call Move( P.X,P.Y ); + call Draw( P.X + 2, P.Y ); + call Draw( P.X + 2, P.Y + Height ); + call Draw( P.X,P.Y + Height ); + call Draw( P.X, P.Y ); + end; + + unit DrawN : procedure( P : point ); + begin + call Move( P.X , P.Y + Height ); + call Draw( P.X , P.Y ); + call Draw( P.X + Width , P.Y + Height ); + call Draw( P.X + Width , P.Y ); + end DrawN ; + + unit DrawK : procedure( P : point ); + begin + call Move( P.X , P.Y ); + call Draw( P.X, P.Y + Height ); + call Move( P.X + Width , P.Y ); + call Draw( P.X , P.Y + Height div 2 ); + call Draw( P.X + Width , P.Y + Height ); + end; + + begin + call Gron( 1 ); + P := new point ( X,Y ); + call DrawO( P ); + P.X := P.X + Width + Room; + call DrawD( P ); + P.X := P.X + Width + Room ; + call DrawC( P ); + P.X := P.X + Width + Room ; + call DrawI( P ); + P.X := P.X + Room; + call DrawN( P ); + P.X := P.X + Width + Room ; + call DrawK( P ); + P.X := P.X + Width + Room ; + call DrawI( P ); + P.Y := 300 ; + P.X := 20; + call MyWrite( P, "Copyright by Anna Wosinska " ); + i := inchar ; + if i = Hlp then call Help ; fi ; + call Groff; + end Welcome; + + + + +unit Point : class ( X, Y : integer); +end Point; + +unit Interval : class( x1, x2 : integer ); + + unit Assign : procedure( y1,y2 : integer ); + + begin + if y1 > y2 then call Swap( y1,y2 ); fi; + x1 := y1; + x2 := y2; + end Assign; + +begin + if x1 > x2 then call Swap ( x1,x2 ); fi; +end Interval; + +unit Swap : procedure( inout y1,y2 : integer ); + var x : integer; +begin + x := y1; + y1 := y2; + y2 := x; +end Swap; + + unit Elem : class( Info : integer ); + var next : Elem; + end Elem ; + +unit IncidList : class( Key : integer ); + var Head : Elem; + + unit Into : procedure( i : integer ); + var Aux : Elem; + + begin + if Head = none then + Head := new Elem( i ); + else + Aux := new Elem( i ); + Aux.next := Head.next ; + Head.next := Aux; + fi; + end Into; + + unit KillList : procedure ; + + unit KL : procedure( inout u : Elem ); + begin + if u <> none then + if u.next = none then + kill ( u ); + else + call KL( u.next ); + fi; + fi; + end KL; + + begin + call KL( Head ); + end KillList ; + +end IncidList; + +unit Node : class( Key, Info : integer ); +var l, r : node ; +end Node ; + +unit BST : class ; +close Delete, Insert ; + + var root : node; + +(* Nodes in this BST are sorted according to their Key value( k ) *) + + unit Insert : procedure( k,i : integer ); + + unit Ins : procedure( inout u : node ); + begin + if u <> none then + if k <= u.Key then call Ins( u.l ); + else call Ins( u.r ); + fi; + else + u := new node( k, i ); + fi; + end Ins; + + begin (* Insert *) + call Ins( root ); + end Insert; + + unit Build : procedure( P : integer); + var i : integer; + + begin + for i := 1 to Act do + if Tree( P,i ) = 0 then exit ; + else + if not Lines( Tree( P,i) ).Vertical then + call Insert( Lines( Tree( P,i )).Pe.X , Tree( P,i )); + call Insert( Lines( Tree( P,i )).Pb.X , Tree( P,i )); + + else + (* Lines( Tree( P,i )).Vertical *) + if Min( Lines( Tree( P,i )).Pb.Y , Lines( Tree( P,i )).Pe.Y ) = P + then + call Insert( Lines( Tree( P,i )).Pb.X , Tree( P,i )); + fi; + fi; + fi; + od; + end Build; + + + unit Update : procedure( P : integer ) ; + var i : integer ; + + begin + for i := 1 to Act do + if Tree( P,i ) = 0 then exit ; fi; + + if Lines( Tree( P,i )).Vertical then + if Max( Lines( Tree( P,i )).Pb.Y , Lines( Tree( P,i )).Pe.Y ) = P + then + call Delete( Lines( Tree( P,i )).Pb.X , Tree( P,i ) ) ; + fi; + + else + call Delete( Lines( Tree( P,i )).Pb.X , Tree( P,i ) ); + call Delete( Lines( Tree( P,i )).Pe.X , Tree( P,i ) ); + fi; + od; + end Update ; + + + unit Delete : procedure( k,i : integer ); + + unit Del : procedure( inout u : node ); + var Q : node ; + + unit DelMax : procedure( inout v : node ); + begin + if v.r <> none then call DelMax( v.r ); + else + (* v.r = none *) + Q.Key := v.Key; + Q.Info := v.Info ; + Q := v ; + v := v.l ; + fi; + end; + + begin + if u <> none then + if k < u.key then call Del ( u.l ); + else + if k > u.key then call Del( u.r ); + else + if i <> u.info then call Del( u.l ); + else + (* k = u.key *) + (* i = u.info *) + Q := u; + if u.r = none then u := u.l ; + else + (* u.r <> none *) + if u.l = none then u := u.r ; + else + (* u.r <> none *) + (* u.l <> none *) + call DelMax( Q.l ); + kill(Q); + (* Q = maximal in left subtree of u *) + fi; + fi; + fi; + fi; + fi; + fi; + end Del; + + begin + call Del ( root ); + end Delete ; + + unit Range : procedure ( x1, x2, Index : integer ); + + unit Ran : procedure( v : node ); + var tx1, tx2 : boolean; + + begin + if v <> none then + if x1 > x2 then call Swap( x1,x2 ); fi ; + tx1 := v.Key >= x1; + tx2 := v.Key <= x2; + +(* x1 < v.key < x2 *) + if v.info = 0 then + call Groff; + writeln("v.info = 0 "); + call Endrun ; + fi; + + if tx2 and tx1 then call Information( Index ).Into( v.info ) ;fi; + + if tx2 then call Ran( v.r ); fi; + fi; + end Ran; + + begin (* Range *); + call Ran( root ); + end Range; + + + +end BST; + + +unit Murderer : procedure( T : BST ); + + unit Killer : procedure( u : Node ); + begin + if u <> none then + if u.l <> none then + call Killer( u.l );fi; + if u.r <> none then + call Killer( u.r ); fi; + kill( u ); + fi; + end Killer; + + begin + if T <> none then + call Killer( T.Root ); + fi; +end Murderer; + +unit BuildTree : procedure; + + var j,i : integer; + +begin + array Tree dim ( MinY : MaxY ); + for i := MinY to MaxY do + array Tree( i ) dim ( 1 : Act + 1 ); + od ; + + for i := 1 to Act do + j := 1; + while Tree( Lines( i ).Pb.Y,j ) <> 0 do j := j + 1 ; od; + + Tree( Lines( i ).Pb.Y, j ) := i ; + + if Lines( i ).Vertical then + j := 1; + while Tree( Lines( i ).Pe.Y,j ) <> 0 do j := j + 1; od; + Tree( Lines( i ).Pe.Y, j ) := i ; + fi; + od; +end BuildTree ; + +unit Scan : procedure ; +var XTree : BST, + Aux : Elem, + k,l : integer ; +begin + Xtree := new BST ; + for k := MinY to MaxY do + if Tree( k,1 ) <> 0 then + call BegScanLine( k ) ; + call XTree.Build( k ); + for l := 1 to Act do + if Tree( k,l ) = 0 then exit ; fi; + call XTree.Range( Lines( Tree( k,l)).Pb.X, Lines( Tree( k,l)).Pe.X , + Tree( k,l ) ); + + Aux := Information( Tree( k,l )).Head; + block + +handlers + when conerror : call groff ; + writeln("k = ", k) ; + writeln("l = ", l) ; + if k < lower(Tree) orif k > upper(Tree) + orif l < lower(Tree(k)) orif l > upper(Tree(k)) then + writeln(" Excessed bounds of Tree ") ; + else + writeln("Tree(k,l) = ", Tree(k,l)); + writeln("Aux.Info = ", Aux.Info) ; + if Tree(k,l) < lower(Lines) + orif Tree(k,l) > upper(Lines) + orif Aux.Info < lower(Lines) + orif Aux.Info > upper(Lines) then + writeln("Excessed bounds of Lines, which are (", + lower(Lines), ":", upper(Lines), ")") ; + fi ; + fi ; + call endrun ; + end handlers ; + begin + while Aux <> none do + call CrossPoint( Lines( Tree( k,l )),Lines( Aux.Info )); + Aux := Aux.next; + od; + end ; + od; + + call Xtree.Update( k ); +(* call kill ( Tree( k )); *) + call EndScanLine( k ) ; + fi; + od; + call Murderer( XTree ); +end Scan ; + +unit ANSI : class; + + + unit Inchar : IIUWgraph function : integer ; + (*podaj nr znaku przeslanego z klawiatury *) + var i : integer; + begin + do + i := inkey; + if i <> 0 then exit fi; + od; + result := i; + end inchar; + + +end Ansi; + +unit MyWrite : procedure( Pos : Point, Word : string ); +var i : integer, + A : arrayof char; + +begin; + A := unpack( Word ); + call Move( Pos.X, Pos.Y ); + for i := lower( A ) to upper( A ) do + call HASCII( 0 ); + call HASCII( ord( A( i ))); + od; + kill ( A ); +end MyWrite; + +unit Erase : procedure( Line : integer ); +var Aux : Point; + +begin + Aux := new Point( Left + M, Line ); + call Mywrite(Aux, + " "); + kill ( Aux ); +end Erase; + +unit Frame : procedure( P1, P2 : point ); +begin + call Move ( P1.X, P1.Y ); + call Draw ( P1.X, P2.Y ); + call Draw ( P2.X, P2.Y ); + call Draw ( P2.X, P1.Y ); + call Draw ( P1.X, P1.Y ); +end Frame; + +unit SysDraw : procedure; + + unit GradVert : procedure( P : Point, Number : integer ); + var i,j : integer; + + begin + call Move( P.X - M, P.Y ); + call Draw( P.X + M, P.Y ); + if Number < 10 then + call Move( P.X - 2 * M - LetDim , P.Y - LetDim div 2 ); + call HASCII( 0 ); + call HASCII( Number + 48 ); + else + i := Number div 10; + j := Number - i * 10; + call Move( P.X - 2 * M - 2 * LetDim , P.Y - LetDim div 2 ); + call HASCII( 0 ); + call Hascii( i + 48 ); + call Move( P.X - 2 * M - LetDim , P.Y - LetDim div 2 ); + call Hascii( 0 ); + call Hascii( j + 48 ); + fi; + end GradVert; + + unit GradHor : procedure( P : Point , Number : integer ); + var i,j : integer; + + begin + call Move( P.X, P.Y - M ); + call Draw( P.X, P.Y + M ); + if Number < 10 then + call Move( P.X - LetDim div 2, P.Y + 4 * M ); + call HASCII( 0 ); + call HASCII( Number + 48 ); + else + i := Number div 10; + j := Number - i * 10; + call Move( P.X - LetDim div 2 , P.Y + 4 * M ); + call HASCII( 0 ); + call Hascii( i + 48 ); + call Hascii( 0 ); + call Hascii( j + 48 ); + fi; + end GradHor; + + unit ArVert : procedure( X, Y : integer); + begin + call Move( X - 2 * M, Y + 2 * M ); + call Draw( X, Y ); + call Draw( X + 2 * M, Y + 2 * M ); + end ArVert; + + unit ArHor : procedure( X,Y : integer ); + begin + call Move( X - 2 * M, Y - 2 * M ); + call Draw( X, Y ); + call Draw( X - 2 * M, Y + 2 * M ); + end ArHor; + +var i : integer, + P : Point; + +begin + call Move( LeftMargin,UpMargin ); + call Draw( LeftMargin, DimY - DownMargin ); + call Draw( DimX - RightMargin, DimY - DownMargin ); + call ArVert( LeftMargin, UpMargin ); + call ArHor( DimX - RightMargin, DimY - DownMargin ); + +call Move( LeftMargin - 2 * M - 2 * LetDim, DimY - DownMargin - LetDim div 2); + call Hascii( 0 ); + call Hascii( 48 ); + call Hascii( 48 ); + + P := new Point( LeftMargin, DimY - DownMargin ); + for i := MinX + 1 to MaxX do + P.X := P.X + Sc; + call GradHor( P , i ); + od; + kill ( P ); + + P := new Point ( LeftMargin, DimY - DownMargin ); + for i := MinY + 1 to MaxY do + P.Y := P.Y - Sc; + call GradVert( P , i ); + od; + kill ( P ); +end SysDraw; + +unit Segment : class( pb , pe : Point, Vert : boolean ); +hidden Vert; + + unit Vertical : function : boolean; + begin + result := Vert ; + end Vertical; + + +end Segment; + +unit SegKill : procedure( inout S : Segment ); +begin + kill ( S.Pb ); + kill ( S.Pe ); + kill ( S ); +end SegKill ; + +unit GenSeg : function : Segment ; + +var X1, Y1, X2, Y2 : integer; + +begin + if Random < 0.5 then + (* Generates horizontal segment *) + do + X1 := Random * MaxX ; + Y1 := Random * MaxY ; + X2 := Random * MaxX ; + Y2 := Y1; + if X1 <> X2 and Y2 > MinX then exit ; fi; + od; + result := new Segment( new Point( X1 ,Y1 ), new Point( X2,Y2 ),false); + else + (* Generates vertical segment *) + do + X1 := Random * MaxX ; + Y1 := Random * MaxY ; + X2 := X1; + Y2 := Random * MaxY ; + if Y1 <> Y2 and X2 > MinX then exit; fi; + od; + result := new Segment( new Point( X1 ,Y1 ), new Point( X2,Y2 ),true); + fi; + +end GenSeg; + +unit SegDraw : procedure( S : Segment ); + +begin; + if S.Vertical then + call Move( LeftMargin + Sc*S.Pb.X + M, DimY - ( Sc*S.Pb.Y + DownMargin)); + call Draw( LeftMargin + Sc*S.Pb.X - M, DimY - ( Sc*S.Pb.Y + DownMargin)); + call Move( LeftMargin + Sc*S.Pb.X, DimY - ( Sc*S.Pb.Y + DownMargin)); + call Draw( LeftMargin + Sc*S.Pe.X, DimY - ( Sc*S.Pe.Y + DownMargin)); + call Move( LeftMargin + Sc*S.Pe.X + M, DimY - ( Sc*S.Pe.Y + DownMargin)); + call Draw( LeftMargin + Sc*S.Pe.X - M, DimY - ( Sc*S.Pe.Y + DownMargin)); + else + call Move( LeftMargin + Sc*S.Pb.X , DimY - ( Sc*S.Pb.Y + DownMargin) + M ); + call Draw( LeftMargin + Sc*S.Pb.X , DimY - ( Sc*S.Pb.Y + DownMargin) - M); + call Move( LeftMargin + Sc*S.Pb.X, DimY - ( Sc*S.Pb.Y + DownMargin)); + call Draw( LeftMargin + Sc*S.Pe.X, DimY - ( Sc*S.Pe.Y + DownMargin)); + call Move( LeftMargin + Sc*S.Pe.X , DimY - ( Sc*S.Pe.Y + DownMargin) + M); + call Draw( LeftMargin + Sc*S.Pe.X , DimY - ( Sc*S.Pe.Y + DownMargin) - M); + fi; +end SegDraw; + +unit KeyServer : Ansi procedure; +var PrevChar , i : integer; + +begin + while not Over do + i := inchar; + case i + when Esc : call Escape; + when NSys : Over := true; + when Hlp : call Help; + when NewSeg : if PrevChar <> NewSeg then call ClearWindow; fi; + Act := Act + 1; + Lines( Act ) := GenSeg; + call SegEdit( Act ); + call SegDraw( Lines( Act )); + + when Termin : exit; + + when Enter : call ClearWindow; + call SegRead; + + otherwise; + esac; + PrevChar := i; + od; + call ClearWindow ; +end KeyServer ; + +unit Pause : procedure( T : integer ); +var i : integer; +begin + for i := 1 to T do; od; +end Pause ; + + +unit Help : Ansi procedure; +var i : integer , + Aux : Point ; +begin; + Aux := new Point( LeftMargin + Distance, DimY - Window + 2 * M ) ; + call Clearwindow ; +call MyWrite + ( Aux," Esc - terminates program, Del - new system of coordinates "); + Aux.Y := Aux.Y + LetDim + M ; +call Mywrite( Aux," Enter - generates new segment, End - scanning "); + Aux.Y := Aux.Y + LetDim + M ; +call MyWrite( Aux," Space - you enter new segment "); + kill ( Aux ) ; + i := inchar ; + call ClearWindow ; +end Help; + +unit SegRead : procedure; + + + unit ReadInteger : ANSI function : integer; + + + var X,Y,i, OrdN, j : integer, + Number : arrayof integer; +(* i - liczba wprowadzonych znakow *) + begin + array Number dim( 1 : NumbLenght ); + i:= 0 ; + X := InXPos; + Y := InYPos; + do + OrdN:=inchar; + if i = NumbLenght or (OrdN < 48 and OrdN > 57) then exit fi; + + case OrdN + when 48 :i:=i+1; + Number(i):=0; + when 49 :i:=i+1; + Number(i):=1; + when 50 :i:=i+1; + Number(i):=2; + when 51 :i:=i+1; + Number(i):=3; + when 52 :i:=i+1; + Number(i):=4; + when 53 :i:=i+1; + Number(i):=5; + when 54 :i:=i+1; + Number(i):=6; + when 55 :i:=i+1; + Number(i):=7; + when 56 :i:=i+1; + Number(i):=8; + when 57 :i:=i+1; + Number(i):=9; + when 8 :if i>0 then + Number( i ) := 0; + i := i - 1; + fi; + when 13 :if i > 0 then exit fi ; + + esac; + + if Number( 1 ) <> 0 then + call Move( X,Y ); + call hascii( 0 ); + call hascii(48+Number( 1 )); + call hascii( 0 ); + + fi; + + if i = 2 then + call Move( X + LetDim, Y ); + call hascii( 0 ); + call hascii( 48 + Number( 2 )); + call hascii( 0 ); + fi; + od; + + if Number( 1 ) = 0 and Number( 2 ) = 0 then + call Move( X,Y ); + call hascii( 0 ); + call hascii( 48 ); + call hascii( 0 ); + fi; + + if i = 1 then result := Number( 1 ); + else + result := 10 * Number( 1 ) + Number ( 2 ); + fi; + kill( Number ); + end ReadInteger; + +const StrLenght = 26; + +var Aux : Point, + X1, X2, Y1, Y2 : integer; + +begin + Aux := new Point( LeftMargin + Distance, DimY - Window + 2 * M ) ; + call MyWrite( Aux," ENTER NEW SEGMENT : X1 = " ); + X1 := ReadInteger; + Aux.X := Aux.X + StrLenght * LetDim + NumbLenght * LetDim; + call MyWrite( Aux ," Y1 = " ); + Y1 := ReadInteger; + + Aux.X := Aux.X - (NumbLenght + 6) * LetDim; + Aux.Y := Aux.Y + M + LetDim; + call MyWrite( Aux, " X2 = " ); + X2 := ReadInteger; + Aux.X := Aux.X + (NumbLenght + 6 ) * LetDim ; + call Mywrite( Aux, " Y2 = " ); + Y2 := ReadInteger; + Aux.X := Aux.X - StrLenght * LetDim - NumbLenght * LetDim; + Aux.Y := Aux.Y + M + LetDim; + if ( X1 <> X2 ) and ( Y1 <> Y2 ) then + call MyWrite( Aux," THIS SEGMENT IS NEITHER HORIZONTAL NOR VERTICAL ! "); + else + if X1 < MaxX and X2 < MaxX and Y1 < MaxY and Y2 < MaxY then + Act := Act + 1; + if X1 = X2 then + Lines( Act ) := new Segment( new Point( X1,Y1 ), + new Point( X2,Y2 ), true ); + else + Lines( Act ) := new Segment( new Point( X1,Y1 ), + new Point( X2,Y2 ), false ); + fi; + call SegDraw( Lines( Act )); + else + call MyWrite( Aux," THE SEGMENT IS TOO BIG ! " ); + fi; + fi; + kill ( Aux ); +end SegRead; + +unit WriteInteger : procedure( Number : integer ); +begin + if Number < 10 then + call HASCII( 0 ); + call HASCII( Number + 48 ); + call Hascii( 0 ); + else + i := Number div 10; + j := Number - i * 10; + call HASCII( 0 ); + call Hascii( i + 48 ); + call Hascii( 0 ); + call Hascii( j + 48 ); + fi; +end WriteInteger; + +unit SegEdit : procedure( Cur : integer ); + + +const StrLenght = 24; + +var Aux : Point; + +begin; + Aux := new Point( LeftMargin + Distance, DimY - Window + 2 * M ); + call MyWrite( Aux," CURRENT SEGMENT : "); + call WriteInteger( Act ); + + Aux.Y := Aux.Y + M + LetDim ; + call Mywrite( Aux," BEGIN : X1 = "); + call WriteInteger( Lines( Cur ).Pb.X ); + Aux.X := Aux.X + StrLenght * LetDim + NumbLenght * LetDim ; + call MyWrite( Aux," Y1 = "); + call WriteInteger( Lines( Cur ).Pb.Y ); + + Aux.X := Aux.X - StrLenght * LetDim - NumbLenght * LetDim ; + Aux.Y := Aux.Y + M + LetDim ; + call Mywrite( Aux," END : X2 = "); + call WriteInteger( Lines( Cur ).Pe.X ); + Aux.X := Aux.X + StrLenght * LetDim + NumbLenght * LetDim ; + call MyWrite( Aux," Y2 = "); + call WriteInteger( Lines( Cur ).Pe.Y ); + kill ( Aux ); +end SegEdit; + +unit ClearWindow : procedure ; +var + Line, i : integer; + +begin + for i := 0 to (( Window - Down ) div LetDim) - 1 do + call Erase( DimY - Window + i * LetDim + M ); + od; +end ClearWindow ; + +unit Escape : procedure; +begin; + Over := true; + Continue := false; +end Escape; + + + +unit CrossPoint : procedure ( S1, S2 : segment ) ; +var X1,X2,X3,X4,Y1,Y2,Y3,Y4 : integer ; + +begin + if S1.Vertical then + if not S2.Vertical then + (* S1 is vertical and S2 is horizontal *) + call Mark( S1.pe.X, S2.pe.Y); + else + (* both S1 and S2 are vertical *) + Y1 := min( S1.pb.Y, S1.pe.Y ); + Y2 := max( S1.pb.Y, S1.pe.Y ); + Y3 := min( S2.pb.Y, S2.pe.Y ); + Y4 := max( S2.pb.Y, S2.pe.Y ); + if not( Y1 = Y3 and Y2 = Y4 ) then + if Y2 > Y4 then + if Y1 > Y3 then + call Mark( S1.pb.X, Y4 ); + call Mark( S1.pb.X, Y1 ); + else + call Mark( S1.pb.X, Y4 ); + call Mark( S1.pb.X, Y3 ); + fi; + else + if Y1 > Y3 then + call Mark( S1.pb.X, Y2 ); + call Mark( S1.pb.X, Y1); + else + call Mark( S1.pb.X, Y2 ); + call Mark( S1.pb.X, Y3); + fi; + fi; + fi; + fi; + else + if S2.Vertical then + (* S1 is horizontal and S2 is vertical *) + call Mark( S2.Pb.X, S1.Pb.Y); + else + (* both are horizontal *) + X1 := min( S1.pb.X, S1.pe.X ); + X2 := max( S1.pb.X, S1.pe.X ); + X3 := min( S2.pb.X, S2.pe.X ); + X4 := max( S2.pb.X, S2.pe.X ); + if not( X1 = X3 and X2 = X4 ) then + if X2 > X4 then + if X3 > X1 then + call Mark( X4, S1.pb.Y); + call Mark( X3, S1.pb.Y); + else + call Mark( X1, S1.pb.Y); + call Mark( X4, S1.pb.Y); + fi; + else + if X3 > X1 then + call Mark( X3, S1.pb.Y); + call Mark( X2, S1.pb.Y); + else + call Mark( X1, S1.pb.Y); + call Mark( X2, S1.pb.Y); + fi; + fi; + fi; + fi; + fi; +end CrossPoint ; + +unit Mark : procedure( input X,Y : integer ); + +begin + if X >= 0 and Y >= 0 then + x := X * Sc + LeftMargin ; + y := DimY - ( DownMargin + Y * Sc ) ; + call cirb( x,y,R,1,1,1,0,1,1 ); + fi; +end Mark; + +unit Min : function( x,y : integer ): integer ; +begin + if x < y then result := x ; + else result := y; fi; +end Min ; + +unit Max: function( x,y : integer ) : integer ; +begin + if x < y then result := y ; + else result := x; fi; +end Max ; + +var Aux : Point, + LongHLine : arrayof integer ; + +unit BegScanLine : procedure( y : integer ); + +begin + call Move( LeftMargin , DimY - DownMargin - y * Sc ); + LongHLine:= GetMap( DimX - RightMargin, DimY - DownMargin - y * Sc) ; + call Move( LeftMargin, DimY - DownMargin - y * Sc); + call Draw( DimX - RightMargin, DimY - DownMargin - y * Sc) ; + Aux := new Point( LeftMargin + Distance, DimY - Window + 2 * M ) ; + call MyWrite( Aux," SCANNING ... : "); + call WriteInteger( y ); +end BegScanLine ; + + +unit EndScanLine : procedure( y : integer ); + +begin + call Move( LeftMargin, DimY - DownMargin - y * Sc); + call PutMap( LongHLine ); + kill ( LongHLine ); + call Erase( Aux.Y ); + kill ( Aux ); +end EndScanLine; + + + + +const + NumbLenght = 2, + DimX = 619, + DimY = 348, + M = 2, + R = 3, + LetDim = 8, + Distance = 20, + Window = 40, + Left = 0, + Right = 0, + Up = 0, + Down = 2, + LeftMargin = 25, + RightMargin = 10, + UpMargin = 10, + DownMargin = 60, + Sc = 20, + MaxX = 29, + MinX = 0, + MaxY = 14, + MinY = 0, + Esc = 27, (* Escape *) + Hlp = - 59, (* F1 *) + NSys = - 83,(* Del *) + Enter = 13, (* enter *) + Termin = - 79,(* End *) + NewSeg = 32, (* space bar *) + Numb = 100; + + +var Tree : arrayof arrayof integer , + Act, j, i : integer, + Continue,Over : boolean, + Information : arrayof IncidList, + Lines : arrayof segment; + +begin (* Seg *); + call Welcome ; + Continue := true; + while Continue do + Act := 0; + Over := false; + call Gron( 1 ); + call Frame( new Point( Left, Up ), + new Point( DimX - Right, DimY - Window - M )); + call Frame( new Point( Left, DimY - Window ), + new Point( DimX - Right, DimY - Down )); + call SysDraw; + array Lines dim( 1 : Numb ); + call KeyServer; + if not Over and Act > 0 then + call BuildTree; + array Information dim ( 1 : Act ); + for i := 1 to Act do + Information( i ) := new IncidList( i ); + od; + call Scan; + write( chr( 7 )); + do + i := inkey; + if i <> 0 then exit; fi; + od; + call Groff; + if i = Esc then exit ; fi ; + + for i := 1 to Act do + if Information( i ) <> none then + call Information( i ). KillList; + fi; + od; + kill ( Information ); + for i:=1 to Act do + call SegKill( Lines( i )); + od; + kill ( Lines ); + for i := MinY to MaxY do kill ( Tree( i )); od; + kill ( Tree ); + fi; + od; + call Groff ; +end ; +end; + \ No newline at end of file diff --git a/examples/geometri/odcinki.pcd b/examples/geometri/odcinki.pcd new file mode 100644 index 0000000000000000000000000000000000000000..a74682394f387416a98f971865de46b320110c2d GIT binary patch literal 2680 zcmZve3v3is6o$|4YvQ9IN}=lv5AnDj+are9r65_B+{J+tMjF}Q4tR+UdOdVHX<8Q1*Eq`KY?9+| z^O5I-FsDYqS4i1(t&t)Q%rm^yVk*zF?4yK=v&?Z6pf>ok4TI(&uU+HR83uKjJioUw zi#MTnFuzV0_m-HSL0x7B`kg8JorUcZ7iT9L)Q`L%U4gonLsx-Yp>g)F#q(QZW|E&~ zz;A&rgVt%BGrw2O0JuxxH$lzNfW|p_?}_>Gc@3!B2=1K5IeET-i9UGLfvX3X9#F1j zIeFngCi#R>4W<@aq;V$Ih^uJOvLsgt=3=Nd=;WDHCAqfXIP}5eB3zGYoTqVqii1md zkeB49f-492l8cK;Zc{Kz_7O!NCEyBD^}5Bf?ggn4%A)hZOoS$byC$S_lO#7klp)tC zyZPX{U7UT6LA@bWmyb*Uw{J}DP>B1@gP#jUpw=8agK&SCbe^o+mZN^>Y%pQysEf;y z+{v6U)>Q~TkMY>f&C~PjeS>bug1_gz@W*|5SjG1*Gr?&S#bMZ++Q;9aFp}@fd4x*0!^Hv z=be^Z@sw=zaS~a-L8rhCy0~G<4GHcT7#_cZqY^#O-Zv;%qOJ!Y`2}34bS!Q{DRW2Q z{{$U{X1lnbW!<@@+y{^EQTs=5JudDC$@K~DJNP^fgIymJyZGRBY7Za19#iY|8?fI( z+ceHkhmg0>lR`UVs*eL;4kB;Z#qsk#;qlXGOwDgEF8O}2xn+9YePVuoDl7}h_4gUF zz65uri~B-ybIMfRJzzeCPL%6;pGfY{a>eZiGX$-w(7BH#x3)sn-HE!pn00X<2`)f; zE3&lb#)sg}xHvl-kIp#v`vLsz&>%D~uGifm@=|F*T+MGQ>b?(dhl_hxaJjTQ9;P(B zw>)@ndGOxyQn=E|^Ao?f5}pE@RH^bdf*AnYsc|N47I_8KmE<;ndjs5{i+fFSLzUz4 zUVRzwP$9sIT6Uck1!TIZeURL zAfhOZR&yUu!(R`KEK~F(5Yjy4k$+g!q_Za*Y(Bse<7q?P! zRL9&S@Rvi6LVN1;yoV+CmEazP-w!v_F`n@YRt`MGvC{JWqf(6I)cTP(OzI@J&c*Mn=(1!fV{->7rlf-9qyjr_d7 z6aF30La44u=MsXukXo9UyAA#=(CyG>7k8`RrqQ;hbnX7=1h=Kx$y0wR>S?f<^KOE_ Q0J<5vy2as4x>4l)4+a-jmjD0& literal 0 HcmV?d00001 diff --git a/examples/geometri/p3d.log b/examples/geometri/p3d.log new file mode 100644 index 0000000..3436333 --- /dev/null +++ b/examples/geometri/p3d.log @@ -0,0 +1,1082 @@ +PROGRAM P3D; + signal WIN1, WIN2, WIN3, PLEIN; + + UNIT INCHAR : IIuwgraph function : integer; + begin + do + i := inkey; + if i <> 0 then exit fi; + od; + result := i; + end inchar; + + UNIT INIT_GRAPH : procedure; + begin + pref iiuwgraph block + begin + call hpage(0,1,1); + end + end init_graph; + +(* DEFINIT LES 27 ZONES ACTIVE DE L'ECRAN + OU L'ON PEUT CLIQUER A LA SOURIS *) + + UNIT MOUSEPOS : function : integer; + var x, y : integer, + pressed, l, r, c : boolean; + begin + pref mouse block + begin + call showcursor; + do + call getpress(0,x,y,b,l,r,c); + if l then + if ((x>110) and (x<130)) + then if ((y>290) and (y<310)) then result := 1; exit fi; + if ((y>190) and (y<210)) then result := 11; exit fi; + if ((y>090) and (y<110)) then result := 21; exit fi; + fi; + if ((x>260) and (x<280)) + then if ((y>290) and (y<310)) then result := 2; exit fi; + if ((y>190) and (y<210)) then result := 12; exit fi; + if ((y>090) and (y<110)) then result := 22; exit fi; + fi; + if ((x>410) and (x<430)) + then if ((y>290) and (y<310)) then result := 3; exit fi; + if ((y>190) and (y<210)) then result := 13; exit fi; + if ((y>090) and (y<110)) then result := 23; exit fi; + fi; + if ((x>160) and (x<180)) + then if ((y>250) and (y<270)) then result := 4; exit fi; + if ((y>150) and (y<170)) then result := 14; exit fi; + if ((y>050) and (y<070)) then result := 24; exit fi; + fi; + if ((x>310) and (x<330)) + then if ((y>250) and (y<270)) then result := 5; exit fi; + if ((y>150) and (y<170)) then result := 15; exit fi; + if ((y>050) and (y<070)) then result := 25; exit fi; + fi; + if ((x>460) and (x<480)) + then if ((y>250) and (y<270)) then result := 6; exit fi; + if ((y>150) and (y<170)) then result := 16; exit fi; + if ((y>050) and (y<070)) then result := 26; exit fi; + fi; + if ((x>210) and (x<230)) + then if ((y>210) and (y<230)) then result := 7; exit fi; + if ((y>110) and (y<130)) then result := 17; exit fi; + if ((y>010) and (y<030)) then result := 27; exit fi; + fi; + if ((x>360) and (x<380)) + then if ((y>210) and (y<230)) then result := 8; exit fi; + if ((y>110) and (y<130)) then result := 18; exit fi; + if ((y>010) and (y<030)) then result := 28; exit fi; + fi; + if ((x>510) and (x<530)) + then if ((y>210) and (y<230)) then result := 9; exit fi; + if ((y>110) and (y<130)) then result := 19; exit fi; + if ((y>010) and (y<030)) then result := 29; exit fi; + fi; + fi + od; + call hidecursor; + end + end mousepos; + +(* STRUCTURE DEFINISSANT 3 CASES (BOX) ALIGNEES DANS LE CUBE *) + + UNIT LIGNE : class(tab_nb : arrayof integer); + var suiv, pred : ligne, + occur : arrayof box, + i : integer; + + UNIT box : class(nb : integer); + var no : integer, + flag : boolean; + begin + no := nb; + flag := false + end box; + + begin + array occur dim(1:3); + for i := 1 to 3 do occur(i) := new box(tab_nb(i)) od + end ligne; + +(* LISTE DOUBLEMENT CHAINEE : POSSIBILITES D'UN JOUEUR *) + + UNIT POSS : class; + var tactik,fin : ligne; + + UNIT VIDE : function : boolean; + begin + result := tactik = NONE + end vide; + + UNIT DELPOSS : procedure; + begin + do + if vide then exit fi; + call supprimer(tactik); + od + end delposs; + + UNIT SUPPRIMER : procedure(e : ligne); + var aux : ligne; + begin + if e=tactik + then + tactik:=tactik.suiv; + kill(e); + exit + else + if e=fin + then + fin := fin.pred; + kill(e); + exit + else + fi + fi; + aux := tactik.suiv; + do + if aux=e + then + aux.pred.suiv := aux.suiv; + aux.suiv.pred := aux.pred; + kill(aux); + exit + else + aux := aux.suiv + fi + od + end supprimer; + + UNIT AJOUTER : procedure(e : ligne); + var i : integer; + begin + if vide then tactik,fin := e + else fin.suiv := e; + e.pred := fin; + fin := e + fi + end ajouter; + end poss; + + UNIT ELEMENT : class; + var tab : arrayof integer, + suivant : element; + begin + array tab dim(1:3) + end element; + +(* PILE D'ELEMENTS : LISTE DE TOUTES LES SOLUTIONS POUR UNE CASE DONNEE *) + + UNIT PILE : class; + var tete : element; + + UNIT PILEVIDE : function : boolean; + begin + result := tete = NONE + end pilevide; + + UNIT EMPILER : procedure(e : element); + begin + if not pilevide then e.suivant := tete fi; + tete := e + end empiler; + + UNIT DEPILER : function : element; + var aux : element; + begin + result := tete; + if not pilevide then tete := tete.suivant fi + end depiler; + + UNIT DELPILE : procedure; + var aux : element; + begin + do if pilevide then exit fi; + aux := tete; + tete := tete.suivant; + kill(aux) + od + end delpile; + end pile; + +(* LISTE DE NUMEROS DE CASE A NE PAS JOUER *) + + UNIT LISTE : class; + var tete, queue : numero; + + UNIT NUMERO : class(val : integer); + var next : numero; + end numero; + + UNIT LISTEVIDE : function : boolean; + begin + if tete = NONE then result := true fi + end listevide; + + UNIT AJOUT : procedure(e : integer); + var aux : numero; + begin + if listevide then tete, queue := new numero(e) + else aux := new numero(e); + queue.next := aux; + queue := aux + fi + end ajout; + + UNIT MEMBER : function(e : integer) : boolean; + var aux : numero; + begin + if listevide then exit fi; + aux := tete; + do if aux = NONE then exit fi; + if aux.val = e then result := true; + exit + else aux := aux.next + fi + od + end member; + + UNIT DELLISTE : procedure; + var aux : numero; + begin + do if listevide then exit fi; + aux := tete.next; + kill(tete); + tete := aux + od + end delliste; + end liste; + +(* INITIALISATION DU CUBE MATERIALISE PAR UN TABLEAU A TROIS DIMENSIONS *) + + UNIT M3D : class; + var i, j, k : integer, + chape : arrayof arrayof arrayof integer; + + begin + array chape dim (1:3); + for i := 1 to 3 + do + array chape(i) dim (1:3) + od; + for j := 1 to 3 + do + for k := 1 to 3 + do + array chape(j,k) dim (1:3) + od + od + end M3D; + +(* TRANSFORME UN ENTIER X (0 < X < 28) EN COORDONNEES DU CUBE I,J,K *) + UNIT INT_COORD : procedure (val : integer; output i, j, k : integer); + begin + k := (val div 10)+1; + i := (((val mod 10)-1) div 3)+1; + j := (((val mod 10)-1) mod 3)+1; + end int_coord; + +(* MISE A JOUR DU TABLEAU DES COUPS OPTIMUMS *) + + UNIT MAJTOP : procedure(topcoup : arrayof integer); + var i : integer, + lig : ligne; + begin + for i := 1 to 29 do topcoup(i) := 0 od; + lig := jeu1.tactik; + do + if lig = NONE then exit fi; + for i := 1 to 3 + do + if (not(lig.occur(i).flag) and (MDJ.disponible(lig.occur(i).no))) + then topcoup(lig.occur(i).no) := topcoup(lig.occur(i).no) + 1 + fi + od; + lig := lig.suiv + od + end MAJTOP; + +(* MISE A JOUR DES LISTES DOUBLEMENT CHAINEES EN FONCTION DU COUPS JOUE *) + + UNIT MAJJEU : procedure (poss1 : poss); + var poss2 : poss, + sol : element, + lig, nouv : ligne, + i, pasbon : integer, + identique, good : boolean; + begin + if MDJ.premier then pasbon := 2; + poss2 := jeu2; + else pasbon := 1; + poss2 := jeu1 + fi; + do + if pile_sol.pilevide then exit fi; + sol := pile_sol.depiler; + lig := poss1.tactik; + do + if lig = NONE then exit fi; + identique := true; + for i := 1 to 3 + do if lig.occur(i).no = clic then lig.occur(i).flag := true fi; + if lig.occur(i).no <> sol.tab(i) + then identique := false + fi + od; + if identique then exit fi; + lig := lig.suiv; + od; + if not identique + then + good := true; + for i := 1 to 3 + do + if MDJ.joue(sol.tab(i)) = pasbon + then + good := false; + exit + fi + od; + if good then + nouv := new ligne(sol.tab); + call poss1.ajouter(nouv); + for i := 1 to 3 + do if ((MDJ.joue(poss1.fin.occur(i).no) <> 0) or + (poss1.fin.occur(i).no = clic)) + then poss1.fin.occur(i).flag := true + fi + od + fi + fi + od; + lig := poss2.tactik; + do + if lig = NONE then exit fi; + for i := 1 to 3 + do if lig.occur(i).no = clic + then + nouv := lig.suiv; + call poss2.supprimer(lig); + exit + else nouv := lig.suiv + fi + od; + lig := nouv; + od; + end majjeu; + + UNIT ERREURCLIC : procedure; + begin + pref iiuwgraph block + begin + call hpage(1,1,1); + call move(125,90); + call color(12); + call outstring("Cher utilisateur,"); + call move (100,100); + call outstring("Vous ne pouvez jouer que sur des cases marrons !"); + call move(400,340); + call color(14); + call outstring("< Appuyez sur une touche >"); + i := 0; + pref mouse block + begin + do + if driver then + call getpress(0,xm,ym,b,l,r,c); + if l then l := false; + call setposition(xm+20,ym+20); + exit fi; + fi; + i:=inkey; + if i<>0 then exit fi + od + end; + call hpage(0,1,0); + end + end erreurclic; + +(* LE MAITRE DU JEU *) + + UNIT ARBITRE : class; + +(* DESSINE LE CUBE EN MODE GRAPHIQUE *) + UNIT INIT_AFFCUBE : procedure; + var i, j , k, x, y, couleur : integer; + begin + pref iiuwgraph block + begin + x := 120; y := 300; + call color(9); + call move(x,y); + call draw(x,y-200); call draw(x+300,y-200); + call draw(x+300,y); call draw(x,y); + y := y-200; call move(x,y); + call draw(x+100,y-75); call draw(x+400,y-75); call draw(x+300,y); + call move(x+400,y-75); + call draw(x+400,y+125); call draw(x+300,y+200); + y := y+200; call move(x+350,y-37); + call draw(x+350,y-237); call draw(x+50,y-237); + call move(x+150,y); + call draw(x+150,y-200); call draw(x+250,y-275); + call move(x,y-100); + call draw(x+300,y-100); call draw(x+400,y-175); + call style(5); call move(x,y); + call draw(x+100,y-75); call draw(x+100,y-275); + call move(x+100,y-75); call draw(x+400,y-75); + call move(x+350,y-37); + call draw(x+50,y-37); call draw(x+50,y-237); + call move(x+150,y); + call draw(x+250,y-75); call draw(x+250,y-275); + call move(x,y-100); + call draw(x+100,y-175); call draw(x+400,y-175); + call move(x+200,y-37); call draw(x+200,y-237); + call move(x+50,y-137); call draw(x+350,y-137); + call move(x+150,y-100); call draw(x+250,y-175); + call style(1); + call color(6); + couleur := 6; + for k := 1 to 3 + do if k > 1 then call color(15); couleur := 15 fi; + for j := 1 to 3 + do for i := 1 to 3 + do x := 120+(j-1)*150+(i-1)*50; + y := 300-((k-1)*100+(i-1)*37); + call cirb(x, y, 3, 0.0, 0.0, couleur, couleur, 1, 1); + od + od + od + end + end init_affcube; + +(* AFFICHE SUR LE CUBE L'ENDROIT OU A ETE JOUE LE COUPS *) + UNIT AFFCOUPS : procedure(i,j,k : integer); + var x, y : integer; + begin + pref iiuwgraph block + begin + x := 120+(j-1)*150+(i-1)*50; + y := 300-((k-1)*100+(i-1)*37); + x := x-3; y := y-4; + call move(x,y); + if MDJ.premier then call color(12) + else call color(10) + fi; + call outstring("Û"); + call move(x-5,y-3); + call draw(x+12,y-3); call draw(x+12,y+10); + call draw(x-5,y+10); call draw(x-5,y-3); + call color(15); + end + end affcoups; + +(* INITIALISATION DES 13 FACES CONTENUES DANS LE CUBE : + ASSOCIATION DE 9 NUMEROS DE CASES POUR CHACUNE D'ELLES *) + + UNIT INIT_FACES : procedure; + var i, j, k, t : integer; + begin + array face dim(1:13); + for i:= 1 to 13 + do array face(i) dim(1:9) + od; + for i := 1 to 9 + do face (1,i) := i; + face (2,i) := i+10; + face (3,i) := i+20; + face (12,i) := 3*i; + od; + for i := 1 to 3 + do for j := 1 to 3 + do face (3+i, j) := i+3*(j-1); + face (3+i,j+3) := i+10+3*(j-1); + face (3+i,j+6) := i+20+3*(j-1); + od; + od; + k := 1; + for t := 1 to 3 + do for i := 7 to 9 + do for j := 1 to 3 + do face (i,j+3*(t-1)) := k; + k := k+1; + od; + od; + k := k+1; + od; + for i := 1 to 3 + do face (10,i) := i; + face (10,i+3) := i+13; + face (10,i+6) := i+26; + od; + for i := 1 to 3 + do face (11,i) := i+6; + face (11,i+3) := i+13; + face (11,i+6) := i+20; + od; + for i := 1 to 3 + do face (13,i) := 1+3*(i-1); + face (13,i+3) := face (13,i)+11; + face (13,i+6) := face (13,i)+22; + od; + end init_faces; + +(* CREATION DU MASQUE POUR TROUVER TOUTES LES SOLUTIONS SELON UNE CASE *) + UNIT INIT_MASK : procedure; + var i : integer; + begin + array mask dim(1:8); + for i := 1 to 8 + do array mask(i) dim(1:3) od; + for i := 1 to 3 do mask(1,i) := i od; + for i := 1 to 3 do mask(2,i) := i+3 od; + for i := 1 to 3 do mask(3,i) := i+6 od; + for i := 1 to 3 do mask(4,i) := 1+3*(i-1) od; + for i := 1 to 3 do mask(5,i) := 2+3*(i-1) od; + for i := 1 to 3 do mask(6,i) := 3+3*(i-1) od; + for i := 1 to 3 do mask(7,i) := 1+4*(i-1) od; + for i := 1 to 3 do mask(8,i) := 2*i+1 od; + end INIT_MASK; + +(* EMPILE TOUTES LES SOLUTIONS SELON UNE CASE CHOISIE *) + UNIT SOLUTIONS : procedure(nobox : integer); + var i, j, k, l, m,z : integer, + e : element; + begin + call pile_sol.delpile; + for i := 1 to 13 + do for j := 1 to 9 + do if face(i,j) = nobox + then for k := 1 to 8 + do for l := 1 to 3 + do if mask(k,l) = j + then + e := new element; + for m := 1 to 3 + do + e.tab(m) := face(i,mask(k,m)) od; + call pile_sol.empiler(e); + fi + od + od + fi + od + od + end solutions; + +(* INDIQUE SI LA CASE CHOISIE PAR UN JOUEUR EST ACCESSIBLE OU NON *) + UNIT DISPONIBLE : function (choix : integer) : boolean; + var i, j, k : integer; + begin + result := false; + call int_coord(choix,i,j,k); + if dispo(i,j) = choix then result := true fi + end disponible; + +(* MISE A JOUR DE LA MATRICE CONTENANT TOUTES LES CASE DISPONIBLES. + CHANGEMENT DE COULEUR POUR LE PION SITUE AU DESSUS DU COUPS JOUE *) + + UNIT MAJDISPO : procedure(i, j ,k : integer); + var x, y, h, c, l : integer; + begin + dispo(i,j) := dispo(i,j)+10; + pref iiuwgraph block + begin + if dispo(i,j) > 29 + then dispo(i,j) := 0 + else call int_coord(dispo(i,j), c, l, h); + x := 120+(l-1)*150+(c-1)*50; + y := 300-((h-1)*100+(c-1)*37); + call color(6); + call cirb(x, y, 3, 0.0, 0.0, 6, 6, 1, 1); + fi + end + end majdispo; + +(* RENVOIE, POUR UNE CASE DONNEE, LE NUMERO DU JOUEUR QUI A JOUE DESSUS *) + UNIT JOUE : function(endroit : integer) : integer; + var i, j, k : integer; + begin + call int_coord(endroit, i, j, k); + result := cube.chape(i,j,k) + end joue; + +(* MISE A JOUR DES NUMEROS DU CUBE POUR SAVOIR QUI A JOUE A QUEL ENDROIT. + POR SAVOIR SI LE CUBE EST PLEIN OU SI UN JOUEUR A GAGNE *) + + UNIT MAJCUBE : function(i, j, k : integer; nojoueur : boolean) : integer; + var m, n : integer, + x, y, x1, y1, z1, x2, y2, z2 : integer, + pasfini : boolean, + poss1 : poss, + aux : ligne; + begin + result := 0; + pasfini := false; + if nojoueur then cube.chape(i, j, k) := 1; + else cube.chape(i, j, k) := 2 + fi; + for m := 1 to 3 + do for n := 1 to 3 + do if cube.chape(m,n,3) = 0 + then pasfini := true; + exit exit + fi + od + od; + if not pasfini then result := FINI fi; + if MDJ.premier then poss1 := jeu1 + else poss1 := jeu2 + fi; + aux := poss1.tactik; + pasfini := false; + while ((aux <> NONE) and (not pasfini)) + do if (aux.occur(1).flag AND + aux.occur(2).flag AND + aux.occur(3).flag) + then pref iiuwgraph block + begin + call color(11); + call int_coord(aux.occur(1).no,x1,y1,z1); + call int_coord(aux.occur(3).no,x2,y2,z2); + x := 120+(y1-1)*150+(x1-1)*50; + y := 300-((z1-1)*100+(x1-1)*37); + call move(x,y); + x := 120+(y2-1)*150+(x2-1)*50; + y := 300-((z2-1)*100+(x2-1)*37); + call draw(x,y); + call color(15); + end; + pasfini := true; + else aux := aux.suiv + fi; + od; + if pasfini then + result := GAGNE fi; + end majcube; + +(* DECLARATIONS DES VARIABLES DE L'ARBITRE *) + const GAGNE = 1, FINI = 2; + var cube : M3D, + face, mask : arrayof arrayof integer, + premier : boolean, + x, y, z, + i, j, + resultat : integer, + joueur1 : strat1, + joueur2 : strat2, + joueur3 : user; + + +(* LE MAITRE DE JEU ENGAGE LA PARTIE *) + + UNIT START_GAME : procedure; + begin + pref iiuwgraph block + begin + pile_sol := new pile; + listdef := new liste; + call init_faces; + call init_mask; + cube := new M3D; + call init_affcube; + array dispo dim(1:3); + for i := 1 to 3 + do array dispo(i) dim(1:3); + for j := 1 to 3 do dispo(i,j) := i*3+j-3 od + od; + premier := true; + do + call move(100,320); + call color(4); + if nbjoueur + then call outstring("Choisissez la premiŠre case du joueur ROUGE"); + else call outstring("Choisissez la premiŠre case pour l'ORDINATEUR") + fi; + joueur1 := new strat1; + if disponible(clic) then exit fi; + call erreurclic; + kill(joueur1) + od; + call int_coord(clic, x, y, z); + call solutions(clic); + i := majcube(x,y,z,premier); + call majdispo(x, y, z); + call majjeu(jeu1); + call affcoups(x,y,z); + premier := not premier; + do + call move(100,320); + if nbjoueur + then + call color(2); + call outstring("Choisissez la premiŠre case du joueur VERT "); + joueur2 := new strat2; + if disponible(clic) then exit fi; + call erreurclic; + kill(joueur2) + else + call outstring(" "); + call move(100,320); + call color(14); + call outstring("Votre choix ? "); + joueur3 := new user; + if disponible(clic) then exit fi; + call erreurclic; + kill(joueur3) + fi; + od; + call move(100,320); + call outstring(" "); + call int_coord(clic, x, y, z); + call solutions(clic); + i := majcube(x,y,z,premier); + call majdispo(x, y, z); + call majjeu(jeu2); + call affcoups(x, y, z); + premier := not premier; + do + do + if premier then attach(joueur1) + else if nbjoueur then attach(joueur2) + else attach(joueur3) + fi + fi; + if disponible(clic) then exit fi; + od; + call int_coord(clic, x, y, z); + resultat := majcube(x, y, z, premier); + call affcoups(x, y, z); + if resultat = GAGNE + then if premier then raise WIN1 + else if nbjoueur then raise WIN2 + else raise WIN3 + fi + fi + fi; + if resultat = FINI then raise PLEIN fi; + call majdispo(x, y, z); + premier := not premier; + od; + lastwill : call move(70,340); + call color(3); + call outstring("Arbitre : Belle partie n'est-ce pas ?"); + call move (410,340); + call color(14); + call outstring("< Appuyez sur une touche >"); + i := 0; + pref mouse block + begin + do + if driver + then + call getpress(0,xm,ym,b,l,r,c); + if l then l := false; + call setposition(xm+20,ym+20); + exit fi + fi; + i:=inkey; + if i<>0 then exit fi + od; + if driver then call hidecursor fi + end; + call hpage(0,0,0); + end + end start_game; + end arbitre; + +(* STRATEGIE COMMUNE AUX DEUX JOUEURS : ATTAQUE OU DEFENSE IMMEDIATE *) + + UNIT STRATEGIE : procedure(output priorite : boolean); + var nb_flag,i : integer, + lig : ligne, + poss1, poss2 : poss; + begin + if MDJ.premier then poss1 := jeu1; + poss2 := jeu2 + else poss1 := jeu2; + poss2 := jeu1 + fi; + priorite := false; + lig := poss1.tactik; + do + if lig = NONE then exit fi; + nb_flag := 0; + for i:=1 to 3 + do if lig.occur(i).flag then nb_flag := nb_flag+1 fi + od; + if nb_flag = 2 + then for i := 1 to 3 + do if not lig.occur(i).flag then exit fi + od; + if MDJ.disponible(lig.occur(i).no) + then priorite := true; + clic := lig.occur(i).no; + exit + fi + fi; + lig := lig.suiv + od; + if not priorite + then + lig := poss2.tactik; + call listdef.delliste; + do + if lig = NONE then exit fi; + nb_flag := 0; + for i:=1 to 3 + do if lig.occur(i).flag then nb_flag := nb_flag+1 fi od; + if nb_flag = 2 + then + for i := 1 to 3 + do + if not lig.occur(i).flag then exit fi + od; + if MDJ.disponible(lig.occur(i).no) + then + priorite := true; + clic := lig.occur(i).no; + exit + else call listdef.ajout(lig.occur(i).no-10); + fi + fi; + lig := lig.suiv + od + fi + end strategie; + +(* STRATEGIE D'ATTAQUE DU JOUEUR 1 *) + + UNIT STRAT1 : coroutine; + var trouve,priorite : boolean, + i, j, k, max, imax, min : integer; + + begin + pref mouse block + begin + if driver then clic := mousepos + else read(clic) + fi + end; + return; + do + call strategie(priorite); + if not priorite then + call majtop(topcoups1); + for i := 29 downto 1 + do if ((topcoups1(i) > max) and (not listdef.member(i))) + then + max := topcoups1(i); + imax := i; + trouve := true; + fi; + od; + if trouve + then clic := imax + else min := 30; + for i := 1 to 3 + do for j := 1 to 3 + do + if ((dispo(i,j) < min) and (dispo(i,j) > 0)) + then min := dispo(i,j) + fi + od + od; + clic := min + fi + fi; + call MDJ.solutions(clic); + call majjeu(jeu1); + call int_coord(clic, i, j, k); + max := MDJ.majcube(i, j, k, MDJ.premier); + detach + od + end strat1; + +(* STRATEGIE DE DEFENSE DU JOUEUR 2 *) + + UNIT STRAT2 : coroutine; + var trouve, priorite : boolean, + i, j, k, max, imax : integer; + + begin + pref mouse block + begin + if driver then clic := mousepos + else read(clic) + fi + end; + return; + do + call strategie(priorite); + if not priorite then + call majtop(topcoups1); + for i := 29 downto 1 + do if ((topcoups1(i) > max) and (not listdef.member(i))) + then + max := topcoups1(i); + imax := i; + trouve := true + fi; + od; + if trouve + then clic := imax + else max := 1; + for i := 1 to 3 + do for j := 1 to 3 + do + if dispo(i,j) > max + then max := dispo(i,j) + fi + od + od; + clic := max + fi + fi; + call MDJ.solutions(clic); + call majjeu(jeu2); + call int_coord(clic, i, j, k); + max := MDJ.majcube(i, j, k, MDJ.premier); + detach + od + end strat2; + +(* CAS OU L'UTILISATEUR EST LE JOUEUR 2 *) + + UNIT USER : coroutine; + var i, j, k, max : integer; + begin + pref mouse block + begin + if driver then clic := mousepos + else read(clic) + fi + end; + return; + pref iiuwgraph block + begin + do + call move(100,320); + call outstring(" "); + call move(100,320); + call color(14); + call outstring("Votre choix ? "); + do + pref mouse block + begin + if driver then clic := mousepos + else read(clic) + fi + end; + if MDJ.disponible(clic) then exit fi; + call erreurclic; + od; + call move(100,320); + call outstring(" "); + call MDJ.solutions(clic); + call majjeu(jeu2); + call int_coord(clic, i, j, k); + max := MDJ.majcube(i, j, k, MDJ.premier); + detach + od + end + end user; + +(* DECLARATIONS DES VARIABLES DU PROGRAMME PRINCIPAL *) + var dispo : arrayof arrayof integer, + jeu1, jeu2 : poss, + topcoups1, + topcoups2 : arrayof integer, + MDJ : arbitre, + pile_sol : pile, + listdef : liste, + clic, i, b, + xm, ym : integer, + nbjoueur, + driver, a, l, r, c : boolean; + +(* TRAITEMENT DES SIGNAUX *) + handlers + when WIN1 : pref iiuwgraph block + begin + call move(100,325); + call color(4); + call outstring("MA STRATEGIE D'ATTAQUE ETAIT IMPARABLE !"); + call color(15); + end; + wind; + when WIN2 : pref iiuwgraph block + begin + call move(100,325); + call color(10); + call outstring("MA DEFENSE M'A MEME EMMENE A LA VICTOIRE !!!! "); + call color(15); + end; + wind; + when WIN3 : pref iiuwgraph block + begin + call move(80,325); + call color(13); + call outstring + ("Bravo, vous venez de gagner contre un professionnel !!!! "); + call color(15); + end; + wind; + when PLEIN : pref iiuwgraph block + begin + call move(100,325); + call color(15); + call outstring("Le cube est plein, aucun joueur n'a gagn‚"); + end; + wind; + end handlers; + +begin (* MAIN *) + write(chr(27),"[2J"); + pref iiuwgraph block + begin + pref mouse block + begin + call gron(5); + driver := init(b); + call init_graph; + call move (210,150); + call color(3); + call outstring("M O R P I O N 3 D"); + call move(20,250); + call color(13); + call outstring("Voulez-vous jouer avec l'ordinateur (o/n) ?"); + b := inchar; + if b = 111 then nbjoueur := false; + call color(2); + call move(20,270); + call outstring("Vous ˆtes le joueur VERT."); + call move(360,340); + call color(14); + call outstring("< Appuyez sur une touche >"); + b := 0; + do if driver + then + call getpress(0,xm,ym,b,l,r,c); + if l then l := false; + call setposition(xm+20,ym+20); + exit fi + fi; + b:=inkey; + if b<>0 then exit fi + od; + else nbjoueur := true + fi; + call init_graph; + jeu1 := new poss; + jeu2 := new poss; + array topcoups1 dim (1:29); + array topcoups2 dim (1:29); + mdj := new arbitre; + call mdj.start_game; +end +end +end P3D. diff --git a/examples/graphcol.ccd b/examples/graphcol.ccd new file mode 100644 index 0000000000000000000000000000000000000000..5cea7468eac6cc6e0877408e6fdd3b62dd51707f GIT binary patch literal 8888 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 literal 0 HcmV?d00001 diff --git a/examples/graphcol.log b/examples/graphcol.log new file mode 100644 index 0000000..a7c4151 --- /dev/null +++ b/examples/graphcol.log @@ -0,0 +1,301 @@ +BLOCK + UNIT BACKTRACK: CLASS; + HIDDEN SE,ELEM,TOP; + VAR ROOT:NODE,SEARCH:SE,FOUND,OPT:NODE, + NUMBER_OF_NODES,NUMBER_OF_LEAVES,NUMBER_OF_ANSWERS:INTEGER; + + UNIT NODE: COROUTINE(FATHER:NODE); + VAR NSONS,LEVEL: INTEGER , DEADEND:BOOLEAN; + UNIT VIRTUAL LEAF: FUNCTION :BOOLEAN; + END LEAF; + UNIT VIRTUAL ANSWER :FUNCTION :BOOLEAN; + END ANSWER; + UNIT VIRTUAL LASTSON: FUNCTION : BOOLEAN; + END LASTSON; + UNIT VIRTUAL NEXTSON: FUNCTION : NODE; + END NEXTSON; + UNIT VIRTUAL EQUAL : FUNCTION (W:NODE):BOOLEAN; + END EQUAL; + UNIT VIRTUAL COST: FUNCTION :REAL; + END COST; + BEGIN + IF FATHER =/= NONE + THEN + LEVEL:=FATHER.LEVEL+1 + ELSE + LEVEL:=0 + FI; + END NODE; + + UNIT OK: FUNCTION (V:NODE):BOOLEAN; + VAR W:NODE; + BEGIN + IF V=NONE THEN RESULT:=FALSE; RETURN FI; + RESULT:=TRUE; W:=V.FATHER; + WHILE W =/= NONE + DO + IF V.EQUAL(W) THEN RESULT:=FALSE; RETURN FI; + W:=W.FATHER + OD + END OK; + + UNIT PURGE: PROCEDURE (V:NODE); + VAR W: NODE; + BEGIN + IF V=NONE THEN RETURN FI; + DO + W:=V.FATHER; KILL(V); + IF W=NONE THEN RETURN FI; + W.NSONS:=W.NSONS-1; + IF W.NSONS =/= 0 THEN RETURN FI; + V:=W + OD; + END PURGE; + + VAR TOP:ELEM; + + UNIT ELEM: CLASS (NEXT:ELEM, V:NODE); + END ELEM; + + UNIT VIRTUAL INSERT: PROCEDURE(V:NODE); + BEGIN + TOP:=NEW ELEM(TOP,V); + END INSERT; + + UNIT VIRTUAL DELETE: FUNCTION :NODE; + VAR E:ELEM; + BEGIN + IF TOP =/= NONE + THEN + RESULT:=TOP.V; + E:=TOP; TOP:=TOP.NEXT; KILL(E); + FI; + END DELETE; + + UNIT SE: COROUTINE ; + VAR I:INTEGER,V,W:NODE; + BEGIN + RETURN; CALL INSERT(ROOT); + DO + V:=DELETE; + IF V=NONE THEN EXIT FI; + ATTACH(V); + IF V.ANSWER + THEN + NUMBER_OF_ANSWERS:=NUMBER_OF_ANSWERS+1; + FOUND:=V; + IF OPT=NONE ORIF V.COST < OPT.COST + THEN + OPT:=V + FI; + DETACH; + (* HERE THE USER OF BACKTRACK MAY UNDERTAKE SOME ACTIONS + ON THE ANSWER NODES. IF NOT NECESSARY DO ATTACH *) + ELSE + IF V.DEADEND + THEN + NUMBER_OF_LEAVES:=NUMBER_OF_LEAVES+1; + CALL PURGE(V); + ELSE + DO + W:=V.NEXTSON; V.NSONS:=V.NSONS+1; + NUMBER_OF_NODES:=NUMBER_OF_NODES+1; + IF OK(W) + THEN + W.DEADEND:=W.LEAF; CALL INSERT(W); + FI; + IF V.LASTSON THEN EXIT FI; + OD; + FI; + FI; + OD; + FOUND:=NONE; + END SE; + + + UNIT KILLALL :PROCEDURE; + VAR V:NODE; + BEGIN + DO + V:=DELETE; + IF V=NONE THEN RETURN FI; + CALL PURGE(V); + OD; + END KILLALL; + + BEGIN + SEARCH:=NEW SE; + INNER; + KILL(SEARCH); CALL KILLALL; + END BACKTRACK; + + + VAR N,M,I,J:INTEGER,H1,H2,H3:CHAR; + VAR INC: ARRAYOF ARRAYOF BOOLEAN; + BEGIN + DO + WRITE(" NUMBER OF VERTICES= "); + READLN(N); + IF N=0 THEN EXIT FI; + WRITE(" NUMBER OF COLOURS= "); + READLN(M); + ARRAY INC DIM (1:N); + FOR I:=1 TO N DO ARRAY INC(I) DIM (1:I); OD; + WRITELN(" GIVE A GRAPH BY DEFINING SUCCESSIVE EDGES"); + WRITELN(" TO END A LIST WRITE 0"); + FOR I:=1 TO N + DO + WRITELN(" VERTEX ",I:3," IS INCIDENT WITH VERTICES="); + DO + READ(J); + IF J>1 AND J<=N THEN INC(J,I):=TRUE ELSE EXIT FI; + OD; + WRITELN(" END OF EDGES WITH VERTEX", I:3) + OD; + WRITELN(" GRAPH HAS THE FOLLOWING INCIDENCE MATRIX"); + FOR I:=1 TO N + DO + FOR J:=1 TO I + DO + IF INC(I,J) THEN WRITE(1:2) ELSE WRITE(0:2) FI; + OD; + WRITELN; + OD; + PREF BACKTRACK BLOCK + VAR K:INTEGER; + UNIT STATE: NODE CLASS(I,J,NC:INTEGER); + + (*I- VERTEX, J-COLOUR, NC-NUMBER OF COLOURS *) + + UNIT VIRTUAL ANSWER: FUNCTION: BOOLEAN; + BEGIN + RESULT:= I=N AND OKGO(THIS STATE) + END ANSWER; + + UNIT VIRTUAL LEAF: FUNCTION :BOOLEAN; + BEGIN + RESULT:=I=N OR NOT OKGO(THIS STATE) + END LEAF; + + UNIT OKGO: FUNCTION(V:STATE) : BOOLEAN; + VAR I,J:INTEGER; + BEGIN + I:=V.I; J:=V.J; + DO + V:=V.FATHER; + IF V=NONE THEN RESULT:=TRUE; EXIT FI; + IF V.J=J AND INC(I,V.I) THEN EXIT FI; + OD; + END OKGO; + + + UNIT VIRTUAL LASTSON: FUNCTION :BOOLEAN; + BEGIN + IF K=M + THEN + RESULT:=TRUE; + K:=0; + FI; + END LASTSON; + + UNIT VIRTUAL NEXTSON : FUNCTION :STATE; + VAR V:STATE,NCK:INTEGER; + BEGIN + V:=THIS STATE; + K:=K+1; + NCK:=NC; + DO + IF V=NONE THEN NCK:=NCK+1; EXIT FI; + IF V.J=K THEN EXIT FI; + V:=V.FATHER; + OD; + RESULT:=NEW STATE(THIS STATE,I+1,K,NCK); + END NEXTSON; + + UNIT VIRTUAL EQUAL: FUNCTION(S:STATE):BOOLEAN; + BEGIN + RESULT:=I=S.I AND J=S.J + END EQUAL; + + UNIT VIRTUAL COST: FUNCTION :REAL; + BEGIN + RESULT:=NC + END COST; + + + BEGIN + RETURN; + DO + DETACH + OD; + END STATE; + + + UNIT DISPLAY: PROCEDURE(V:STATE); + BEGIN + IF V=NONE THEN WRITELN(" NO SOLUTIONS"); RETURN FI; + WRITELN("VERTEX COLOUR"); + DO + WRITE(V.I); WRITE(" "); WRITELN(V.J); + V:=V.FATHER; + IF V=NONE THEN EXIT FI + OD; + WRITELN; + END DISPLAY; + + BEGIN + READLN; + ROOT:=NEW STATE(NONE,1,1,1); + WRITE("DO YOU WANT TO OPTIMIZE "); + WRITELN("OR TO PRINT ALL THE SOLUTIONS ?"); + WRITELN(" (ANSWER OPT OR ALL)"); + READLN(H1,H2,H3); + IF H1='O' AND H2='P' AND H3='T' + THEN + DO + ATTACH(SEARCH); + IF FOUND=NONE THEN EXIT FI; + IF OPT =/= NONE ANDIF OPT.COST*@(Kx*=k^?T$I zIfnaeK)G)`YDyp?GUS{{Ro+uDs5oCErSC24 zZ^%5^?wq1w&TQn%4%7FFz89F+q!E|*eQ8}Q)^p6_o|5Od$&#zeGu$dwk?FW4k)5}~ zyja|0)6$=}BJ;66-wZvs$z3v>l=r=3J`u`DqMg3Fm|JAjIX&-9Tw8@QmSnuU!TNRf zoaR2^oML6loG+A)>ATAMB)LYWobzxU+#r23Ny2}wzAj;|kO$8BxXZThiF4;M7s;%1 z72E~u=A1i=IY$3L7u zzO||T-Hu|8V2+b7&gpqaaU1CSl@{|J#2hBevtnO8?;+c_GShtrSl>tI2=|V2d0v(M i)^)R@Z#QNy37bWqo_CLRS+j6EF~ek?bNc(+W!zt+8iJ|- literal 0 HcmV?d00001 diff --git a/examples/grazyna.xmp/belote.log b/examples/grazyna.xmp/belote.log new file mode 100644 index 0000000..7a0ad75 --- /dev/null +++ b/examples/grazyna.xmp/belote.log @@ -0,0 +1,3556 @@ +program belote; + +(* + ************************************************************************ + * * + * TP LI1 : Mai 1995 * + * * + * Co-auteurs : R‚gis BRETTE * + * Jean-Yves LAGARDE * + * * + * SUJET : A partir du langage LOGLAN, r‚aliser * + * une application utilisant les coroutines. * + * * + * MACHINE : DOS 386, Systeme LOGLAN-82 * + * Version de classe graphisme : IIUWgraph * + * Ecran : 640 X 480 * + * * + * REALISATION : Cette application permet de simuler un * + * jeu de cartes : la belote. Les diff‚rents * + * joueurs sont simul‚s par des coroutines. * + * * + * MODE D'EMPLOI : On clique … la souris avec le bouton gauche* + * sur les boutons pr‚sents … l'‚cran. * + * * + * * + * * + * * + * * + ************************************************************************ + +*) + + +CONST + noir =0, + bleu =1, + vert =2, + cyan =3, + rouge =4, + magenta =5, + marron =6, + gris_clair =7, + gris_fonce =8, + bleu_clair =9, + vert_clair =10, + cyan_clair =11, + rouge_clair =12, + magenta_clair =13, + jaune =14, + blanc =15, + vide =0, + plein =1, + + larg_caract = 8, + haut_caract = 8, + + nb_pli = 8, + defaut = 500, + + sept = 1, + huit = 2, + neuf = 3, + valet = 4, + dame = 5, + roi = 6, + dix = 7, + as = 8, + + P = 1, + T = 2, + CA = 3, + CO = 4; + +Begin +Pref iiuwgraph block (* fonctions graphiques *) +Begin +Pref mouse block (* souris *) + + var + P1,P2,P3,P4,P5,P6,P7,P8,T1,T2,T3,T4,T5,T6,T7,T8 : carte, + CA1,CA2,CA3,CA4,CA5,CA6,CA7,CA8,CO1,CO2,CO3,CO4, + CO5,CO6,CO7,CO8 : carte, + carte_ret,carte_oui : carte, + atout_joue : arrayof boolean, + score1,score2,tour,atout,fin_donne1,fin_donne2 : integer, + oui,non,b_pic,b_trefle,b_carreau,b_aide_atout : bouton_relief, + b_coeur,rien,carre,b_option,b_debut,b_fin : bouton_relief, + nom : string, + image,image2,depart,save_menu : arrayof integer, + del_menu,terrain,save_joueur : arrayof integer, + he,ve,pe,le,re,ce : integer, + dede,on_prend,termine : boolean, + joueur_prend,adv1_prend,part_prend,adv2_prend : boolean, + belote_joueur,belote_adversaire1 : boolean, + belote_partenaire,belote_adversaire2 : boolean, + s,e1,e2,e11,e22 : PILE, + user : joueur, + part : partenaire, + adv1 : adversaire1, + adv2 : adversaire2, + ca_u : carte_user, + j_jeu,p_jeu,a1_jeu,a2_jeu : arrayof carte_user, + pli : arrayof carte, + tx,ty : arrayof integer, + commence,i,j,k,abscisse,ordonnee,coul, + cpt_pli,eval,attente,total,lg : integer; + + (*************************************) + (* Bouton en relief *) + (*************************************) + +Unit BOUTON_RELIEF : class (x1,y1,x2,y2,nb_car:integer,titre:string); +var selectionne : boolean; + + Unit print : procedure; + begin + if not selectionne + then + call patern(x1,y1,x2,y2,gris_clair,plein); + call patern(x1,y1,x2,y2,noir,vide); + call patern(x1+1,y1+1,x1+1,y2-1,blanc,plein); + call patern(x1+2,y1+2,x1+2,y2-2,blanc,plein); + call patern(x1+1,y1+1,x2-1,y1+1,blanc,plein); + call patern(x1+2,y1+2,x2-2,y1+2,blanc,plein); + call patern(x2-1,y1+1,x2-1,y2-1,gris_fonce,plein); + call patern(x2-2,y1+2,x2-2,y2-2,gris_fonce,plein); + call patern(x1+1,y2-1,x2-1,y2-1,gris_fonce,plein); + call patern(x1+2,y2-2,x2-2,y2-2,gris_fonce,plein); + call patern(x1+5,y1+5,x2-5,y2-5,gris_fonce,vide); + call outstring(ENTIER((x2-x1-nb_car*larg_caract)/2)+x1, + ENTIER((y2-y1-haut_caract)/2)+y1,titre,noir,gris_clair); + else + call patern(x1,y1,x2,y2,gris_clair,plein); + call patern(x1,y1,x2,y2,noir,vide); + call patern(x1+1,y1+1,x1+1,y2-1,noir,plein); + call patern(x1+2,y1+2,x1+2,y2-2,noir,plein); + call patern(x1+1,y1+1,x2-1,y1+1,noir,plein); + call patern(x1+2,y1+2,x2-2,y1+2,noir,plein); + call patern(x1+5,y1+5,x2-5,y2-5,gris_fonce,vide); + call outstring(ENTIER((x2-x1-nb_car*larg_caract)/2)+x1+1, + ENTIER((y2-y1-haut_caract)/2)+y1+1,titre,noir,gris_clair); + fi ; + end print; + + Unit choix : procedure ; + var pause : integer; + begin + selectionne:=TRUE; + call print; + (* on attend un peu pour visualiser l'effet de pression..*) + for pause:=1 to 1000 do od; + selectionne:=FALSE; + call print; + end choix; + + Unit dedans : function(h,v :integer):boolean; + begin + result := (v>y1 and vx1 and hy1 and vx1 and hy and vx and h=50) + then + call outstring(300,26,"EST prend",noir,gris_clair); + for i:=1 to 27000 do od; + call outstring(300,26," ",noir,gris_clair); + adv1_prend:=true; + on_prend:=true; + atout:=carte_ret.couleur; + attach(main); + else + call outstring(250,26,"EST ne prend pas ",noir,gris_clair); + for i:=1 to 27000 do od; + call outstring(250,26," ",noir,gris_clair); + attach(part); + fi; + + end tour1; + + Unit tour2 : procedure; + begin + j:=1; + while ((j<=4) and not(on_prend)) + do + coul:=j; + cumul:=0; + if (coul=/=carte_ret.couleur) + then + for i:=1 to 5 + do + if (a1_jeu(i).c.couleur=coul) + then + cumul:=cumul+evalue(a1_jeu(i).c); + fi; + od; + if (cumul>=50) + then + call outstring(300,26,"EST prend",noir,gris_clair); + for i:=1 to 17000 do od; + call outstring(300,26," ",noir,gris_clair); + adv1_prend:=true; + on_prend:=true; + atout:=coul; + else + call outstring(250,26,"EST ne prend pas ",noir,gris_clair); + for i:=1 to 17000 do od; + call outstring(250,26," ",noir,gris_clair); + fi; + fi; + j:=j+1; + od; + if adv1_prend + then + attach(main); + else + attach(part); + fi; + +end tour2; + + Unit donne2 : procedure; + var i : integer; + begin + if adv1_prend + then + a1_jeu(6).c:=carte_ret; + a1_jeu(6).present:=true; + for i:=7 to 8 + do + a1_jeu(i).c:=s.pop; + a1_jeu(i).present:=true; + od; + else + for i:=6 to 8 + do + a1_jeu(i).c:=s.pop; + a1_jeu(i).present:=true; + od; + fi; + (* belote ou non ? *) + belote_adversaire1:=false; + for i:=1 to 8 + do + if a1_jeu(i).c.couleur=atout and a1_jeu(i).c.valeur=dame + then + for j:=1 to 8 + do + if a1_jeu(j).c.couleur=atout and a1_jeu(j).c.valeur=roi + then + belote_adversaire1:=true; + fi; + od; + fi; + od; + + fin_donne2:=fin_donne2+1; + attach(part); + if fin_donne2=4 + then + fin_donne2:=0; + attach(main); + fi; + +end donne2; + + +Unit jouer_carte : procedure; +var trouve,pas_encore : boolean, + i,remember,forte : integer; + +begin + i:=1; + remember:=0; + trouve:=false; + if cpt_pli=1 (* c'est lui qui joue en premier *) + then + if adv1_prend or adv2_prend + then + (* ils ont pris *) + (* adv1 joue atout si possible *) + while i<9 and not trouve + do + if a1_jeu(i).c.couleur=atout and a1_jeu(i).present + then + pli(cpt_pli):=a1_jeu(i).c; + a1_jeu(i).present:=false; + atout_joue(a1_jeu(i).c.valeur):=true; + trouve:=true; + fi; + i:=i+1; + od; + i:=1; + pas_encore:=true; + while i<9 and not trouve + do + (* adv1 n'a pas d'atout, alors il joue as sinon indien *) + if a1_jeu(i).present + then + if pas_encore + then + pli(cpt_pli):=a1_jeu(i).c; + remember:=i; + pas_encore:=false; + if pli(cpt_pli).valeur=as + then + trouve:=true; + fi; + else + (* il n'a pas encore trouve d'as, et il lui reste des cartes + a comparer *) + if a1_jeu(i).c.valeur=as + then + pli(cpt_pli):=a1_jeu(i).c; + remember:=i; + trouve:=true; + else + (* si toujours pas d'as, il prend la plus petite de son jeu *) + if pli(cpt_pli).valeur>a1_jeu(i).c.valeur + then + pli(cpt_pli):=a1_jeu(i).c; + remember:=i; + fi; + fi; + fi; + fi; + i:=i+1; + od; + (* il joue donc la carte nø remember *) + if remember<>0 + then + a1_jeu(remember).present:=false; + if a1_jeu(remember).c.couleur=atout + then + atout_joue(a1_jeu(remember).c.valeur):=true; + fi; + fi; + else + (* Ils n'ont pas pris *) + i:=1; + pas_encore:=true; + while i<9 and not trouve + do + (* adv1 joue as sinon indien different d'atout *) + if a1_jeu(i).c.couleur<>atout + then + if a1_jeu(i).present + then + if pas_encore + then + pli(cpt_pli):=a1_jeu(i).c; + remember:=i; + pas_encore:=false; + if pli(cpt_pli).valeur=as + then + trouve:=true; + a1_jeu(remember).present:=false; + if a1_jeu(remember).c.couleur=atout + then + atout_joue(a1_jeu(remember).c.valeur):=true; + fi; + fi; + else + (* il n'a pas encore trouve d'as, et il lui reste des cartes + a comparer *) + if a1_jeu(i).c.valeur=as + then + pli(cpt_pli):=a1_jeu(i).c; + remember:=i; + a1_jeu(remember).present:=false; + if a1_jeu(remember).c.couleur=atout + then + atout_joue(a1_jeu(remember).c.valeur):=true; + fi; + trouve:=true; + else + (* si toujours pas d'as, il prend la plus petite carte de son jeu *) + if pli(cpt_pli).valeur>a1_jeu(i).c.valeur + then + pli(cpt_pli):=a1_jeu(i).c; + remember:=i; + fi; + fi; + fi; + fi; + fi; + i:=i+1; + od; + if remember=0 + then + (* il ne lui reste que de l'atout *) + (* il est donc oblige de jouer atout *) + i:=1; + while i<9 + do + (* adv1 joue le plus petit atout *) + if a1_jeu(i).present + then + if remember=0 + then + remember:=i; + else + if not compare_atout(a1_jeu(i).c.valeur,a1_jeu(remember).c.valeur) + (* a1_jeu(i).c.valeuratout + then + pas_encore:=true; + while i<9 and not trouve + do + (* Il joue as sinon indien dans couleur demandee different d'atout *) + if a1_jeu(i).present and a1_jeu(i).c.couleur=pli(1).couleur + then + if pas_encore + then + remember:=i; + pas_encore:=false; + if a1_jeu(remember).c.valeur=as + then + trouve:=true; + fi; + else + (* il n'a pas encore trouve d'as, et il lui reste des cartes + a comparer *) + if a1_jeu(i).c.valeur=as + then + remember:=i; + trouve:=true; + else + (* si toujours pas d'as, il prend la plus petite de son jeu *) + if a1_jeu(remember).c.valeur>a1_jeu(i).c.valeur + then + remember:=i; + fi; + fi; + fi; + fi; + i:=i+1; + od; + if remember=0 + then + (* il n'a pas de la couleur demandee, il essaie de jouer atout *) + i:=1; + while i<9 + do + (* adv1 joue le plus petit atout *) + if a1_jeu(i).present and a1_jeu(i).c.couleur=atout + then + if remember=0 + then + remember:=i; + else + if not compare_atout(a1_jeu(i).c.valeur,a1_jeu(remember).c.valeur) + then + remember:=i; + fi; + fi; + fi; + i:=i+1; + od; + if remember=0 + then + (* il ne peut pas couper *) + i:=1; + while i<9 + do + (* adv1 joue sa plus petite carte *) + if a1_jeu(i).present + then + if remember=0 + then + remember:=i; + else + if a1_jeu(i).c.valeur=50) + then + call outstring(300,26,"NORD prend",noir,gris_clair); + for i:=1 to 27000 do od; + call outstring(300,26," ",noir,gris_clair); + part_prend:=true; + on_prend:=true; + atout:=carte_ret.couleur; + attach(main); + else + call outstring(250,26,"NORD ne prend pas ",noir,gris_clair); + for i:=1 to 27000 do od; + call outstring(250,26," ",noir,gris_clair); + attach(adv2); + fi; + +end tour1; + +Unit tour2 : procedure; +begin + j:=1; + while ((j<=4) and not(on_prend)) + do + coul:=j; + cumul:=0; + if (coul=/=carte_ret.couleur) + then + for i:=1 to 5 + do + if (p_jeu(i).c.couleur=coul) + then + cumul:=cumul+evalue2(p_jeu(i).c); + fi; + od; + if (cumul>=50) + then + call outstring(300,26,"NORD prend",noir,gris_clair); + for i:=1 to 17000 do od; + call outstring(300,26," ",noir,gris_clair); + part_prend:=true; + on_prend:=true; + atout:=coul; + else + call outstring(250,26,"NORD ne prend pas ",noir,gris_clair); + for i:=1 to 17000 do od; + call outstring(250,26," ",noir,gris_clair); + fi; + fi; + j:=j+1; + od; + if part_prend + then + attach(main); + else + attach(adv2); + fi; + +end tour2; + +Unit donne2 : procedure; + var i : integer; + begin + if part_prend + then + p_jeu(6).c:=carte_ret; + p_jeu(6).present:=true; + for i:=7 to 8 + do + p_jeu(i).c:=s.pop; + p_jeu(i).present:=true; + od; + else + for i:=6 to 8 + do + p_jeu(i).c:=s.pop; + p_jeu(i).present:=true; + od; + fi; + belote_partenaire:=false; + for i:=1 to 8 + do + if p_jeu(i).c.couleur=atout and p_jeu(i).c.valeur=dame + then + for j:=1 to 8 + do + if p_jeu(j).c.couleur=atout and p_jeu(j).c.valeur=roi + then + belote_partenaire:=true; + fi; + od; + fi; + od; + + fin_donne2:=fin_donne2+1; + attach(adv2); + if fin_donne2=4 + then + fin_donne2:=0; + attach(main); + fi; + +end donne2; + +Unit jouer_carte : procedure; +var trouve,pas_encore : boolean, + i,remember,forte,grand,petit,maitre : integer; + +begin + i:=1; + remember:=0; + trouve:=false; + if cpt_pli=1 (* c'est lui qui joue en premier *) + then + if joueur_prend or part_prend + then + (* ils ont pris *) + (* part joue atout si possible *) + grand:=0; + petit:=0; + while i<9 + do + if p_jeu(i).present + then + if p_jeu(i).c.couleur=atout and grand=0 + then + grand:=i; + petit:=i; + else + if p_jeu(i).c.couleur=atout + then + if compare_atout(p_jeu(i).c.valeur,p_jeu(grand).c.valeur) + then + grand:=i; + fi; + if not compare_atout(p_jeu(i).c.valeur,p_jeu(petit).c.valeur) + then + petit:=i; + fi; + fi; + fi; + fi; + i:=i+1; + od; + if grand<>0 + then + maitre:=at_fort; + if p_jeu(grand).c.valeur=maitre + then + remember:=grand; + else + remember:=petit; + fi; + pli(cpt_pli):=p_jeu(remember).c; + fi; + i:=1; + pas_encore:=true; + while i<9 and not trouve and grand=0 + do + (* part n'a pas d'atout, alors il joue as sinon indien *) + if p_jeu(i).present + then + if pas_encore + then + pli(cpt_pli):=p_jeu(i).c; + remember:=i; + pas_encore:=false; + if pli(cpt_pli).valeur=as + then + trouve:=true; + fi; + else + (* il n'a pas encore trouve d'as, et il lui reste des cartes + a comparer *) + if p_jeu(i).c.valeur=as + then + pli(cpt_pli):=p_jeu(i).c; + remember:=i; + trouve:=true; + else + (* si toujours pas d'as, il prend la plus petite de son jeu *) + if pli(cpt_pli).valeur>p_jeu(i).c.valeur + then + pli(cpt_pli):=p_jeu(i).c; + remember:=i; + fi; + fi; + fi; + fi; + i:=i+1; + od; + (* il joue donc la carte nø remember *) + if remember<>0 + then + p_jeu(remember).present:=false; + fi; + else + (* Ils n'ont pas pris *) + i:=1; + pas_encore:=true; + while i<9 and not trouve + do + (* part joue as sinon indien different d'atout *) + if p_jeu(i).c.couleur<>atout + then + if p_jeu(i).present + then + if pas_encore + then + pli(cpt_pli):=p_jeu(i).c; + remember:=i; + pas_encore:=false; + if pli(cpt_pli).valeur=as + then + trouve:=true; + p_jeu(remember).present:=false; + fi; + else + (* il n'a pas encore trouve d'as, et il lui reste des cartes + a comparer *) + if p_jeu(i).c.valeur=as + then + pli(cpt_pli):=p_jeu(i).c; + remember:=i; + p_jeu(remember).present:=false; + trouve:=true; + else + (* si toujours pas d'as, il prend la plus petite carte de son jeu *) + if pli(cpt_pli).valeur>p_jeu(i).c.valeur + then + pli(cpt_pli):=p_jeu(i).c; + remember:=i; + fi; + fi; + fi; + fi; + fi; + i:=i+1; + od; + if remember=0 + then + (* il ne lui reste que de l'atout *) + (* il est donc oblige de jouer atout *) + i:=1; + while i<9 + do + (* part joue le plus petit atout *) + if p_jeu(i).present + then + if remember=0 + then + remember:=i; + else + if not compare_atout(p_jeu(i).c.valeur,p_jeu(remember).c.valeur) + (* p_jeu(i).c.valeuratout + then + pas_encore:=true; + while i<9 and not trouve + do + (* Il joue as sinon indien dans couleur demandee different d'atout *) + if p_jeu(i).present and p_jeu(i).c.couleur=pli(1).couleur + then + if pas_encore + then + remember:=i; + pas_encore:=false; + if p_jeu(remember).c.valeur=as + then + trouve:=true; + fi; + else + (* il n'a pas encore trouve d'as, et il lui reste des cartes + a comparer *) + if p_jeu(i).c.valeur=as + then + remember:=i; + trouve:=true; + else + (* si toujours pas d'as, il prend la plus petite de son jeu *) + if p_jeu(remember).c.valeur>p_jeu(i).c.valeur + then + remember:=i; + fi; + fi; + fi; + fi; + i:=i+1; + od; + if remember=0 + then + (* il n'a pas de la couleur demandee, il essaie de jouer atout *) + i:=1; + while i<9 + do + (* part joue le plus petit atout *) + if p_jeu(i).present and p_jeu(i).c.couleur=atout + then + if remember=0 + then + remember:=i; + else + if not compare_atout(p_jeu(i).c.valeur,p_jeu(remember).c.valeur) + then + remember:=i; + fi; + fi; + fi; + i:=i+1; + od; + if remember=0 + then + (* il ne peut pas couper *) + i:=1; + while i<9 + do + (* part joue sa plus petite carte *) + if p_jeu(i).present + then + if remember=0 + then + remember:=i; + else + if p_jeu(i).c.valeur0 + then + if p_jeu(remember).c.couleur=atout + then + atout_joue(p_jeu(remember).c.valeur):=true; + fi; + fi; + + + pli(cpt_pli).x:=295; + pli(cpt_pli).y:=100; + call pli(cpt_pli).print; + for i:=1 to 30000 do od; + +end jouer_carte; + +begin + return; + + call donne1; + if not(on_prend) + then + call tour1; + fi; +(* 2ieme tour *) + if not(on_prend) + then + call tour2; + fi; + + if on_prend + then + call donne2; + for n:=1 to 8 + do + call jouer_carte; + attach(main); + od; + fi; + + + attach(main); +end partenaire; + + + + +Unit adversaire2 : coroutine; +var i,j,n,cumul : integer; + + Unit donne1 : procedure; + begin + for i:=1 to 2 + do + a2_jeu(i).c:=s.pop; + a2_jeu(i).present:=true; + od; + for i:=1 to 7000 do od; + attach(user); + for i:=1 to 7000 do od; + for i:=3 to 5 + do + a2_jeu(i).c:=s.pop; + a2_jeu(i).present:=true; + od; + for i:=1 to 7000 do od; + fin_donne1:=fin_donne1+1; + attach(user); + if fin_donne1=4 + then + fin_donne1:=0; + attach(main); + fi; + + end donne1; + + Unit tour1 : procedure; + begin + on_prend:=false; + adv2_prend:=false; + (* peut-il prendre ? *) + cumul:=evalue(carte_ret); + for i:=1 to 5 + do + if (a2_jeu(i).c.couleur=carte_ret.couleur) + then + cumul:=cumul+evalue(a2_jeu(i).c); + fi; + od; + if (cumul>=50) + then + call outstring(290,26,"OUEST prend",noir,gris_clair); + for i:=1 to 27000 do od; + call outstring(290,26," ",noir,gris_clair); + adv2_prend:=true; + on_prend:=true; + atout:=carte_ret.couleur; + attach(main); + else + call outstring(240,26,"OUEST ne prend pas",noir,gris_clair); + for i:=1 to 27000 do od; + call outstring(240,26," ",noir,gris_clair); + attach(user); + fi; + + (* attach(user); *) + +end tour1; + +Unit tour2 : procedure; +begin + j:=1; + while ((j<=4) and not(on_prend)) + do + coul:=j; + cumul:=0; + if (coul=/=carte_ret.couleur) + then + for i:=1 to 5 + do + if (a2_jeu(i).c.couleur=coul) + then + cumul:=cumul+evalue(a2_jeu(i).c); + fi; + od; + if (cumul>=50) + then + call outstring(290,26,"OUEST prend",noir,gris_clair); + for i:=1 to 17000 do od; + call outstring(290,26," ",noir,gris_clair); + adv2_prend:=true; + on_prend:=true; + atout:=coul; + else + call outstring(240,26,"OUEST ne prend pas",noir,gris_clair); + for i:=1 to 17000 do od; + call outstring(240,26," ",noir,gris_clair); + fi; + fi; + j:=j+1; + od; + if adv2_prend + then + attach(main); + else + attach(user); + fi; + +end tour2; + + Unit donne2 : procedure; + var i : integer; + begin + if adv2_prend + then + a2_jeu(6).c:=carte_ret; + a2_jeu(6).present:=true; + for i:=7 to 8 + do + a2_jeu(i).c:=s.pop; + a2_jeu(i).present:=true; + od; + else + for i:=6 to 8 + do + a2_jeu(i).c:=s.pop; + a2_jeu(i).present:=true; + od; + fi; + belote_adversaire2:=false; + for i:=1 to 8 + do + if a2_jeu(i).c.couleur=atout and a2_jeu(i).c.valeur=dame + then + for j:=1 to 8 + do + if a2_jeu(j).c.couleur=atout and a2_jeu(j).c.valeur=roi + then + belote_adversaire2:=true; + fi; + od; + fi; + od; + + fin_donne2:=fin_donne2+1; + attach(user); + if fin_donne2=4 + then + fin_donne2:=0; + attach(main); + fi; + +end donne2; + +Unit jouer_carte : procedure; +var trouve,pas_encore : boolean, + i,remember,forte,grand,petit,maitre : integer; + +begin + i:=1; + remember:=0; + trouve:=false; + if cpt_pli=1 (* c'est lui qui joue en premier *) + then + if adv1_prend or adv2_prend + then + (* ils ont pris *) + (* adv2 joue atout si possible *) + grand:=0; + petit:=0; + while i<9 + do + if a2_jeu(i).present + then + if a2_jeu(i).c.couleur=atout and grand=0 + then + grand:=i; + petit:=i; + else + if a2_jeu(i).c.couleur=atout + then + if compare_atout(p_jeu(i).c.valeur,a2_jeu(grand).c.valeur) + then + grand:=i; + fi; + if not compare_atout(a2_jeu(i).c.valeur,a2_jeu(petit).c.valeur) + then + petit:=i; + fi; + fi; + fi; + fi; + i:=i+1; + od; + if grand<>0 + then + maitre:=at_fort; + if a2_jeu(grand).c.valeur=maitre + then + remember:=grand; + else + remember:=petit; + fi; + pli(cpt_pli):=a2_jeu(remember).c; + fi; + i:=1; + pas_encore:=true; + while i<9 and not trouve + do + (* adv2 n'a pas d'atout, alors il joue as sinon indien *) + if a2_jeu(i).present + then + if pas_encore + then + pli(cpt_pli):=a2_jeu(i).c; + remember:=i; + pas_encore:=false; + if pli(cpt_pli).valeur=as + then + trouve:=true; + fi; + else + (* il n'a pas encore trouve d'as, et il lui reste des cartes + a comparer *) + if a2_jeu(i).c.valeur=as + then + pli(cpt_pli):=a2_jeu(i).c; + remember:=i; + trouve:=true; + else + (* si toujours pas d'as, il prend la plus petite de son jeu *) + if pli(cpt_pli).valeur>a2_jeu(i).c.valeur + then + pli(cpt_pli):=a2_jeu(i).c; + remember:=i; + fi; + fi; + fi; + fi; + i:=i+1; + od; + (* il joue donc la carte nø remember *) + if remember<>0 + then + a2_jeu(remember).present:=false; + fi; + else + (* Ils n'ont pas pris *) + i:=1; + pas_encore:=true; + while i<9 and not trouve + do + (* adv2 joue as sinon indien different d'atout *) + if a2_jeu(i).c.couleur<>atout + then + if a2_jeu(i).present + then + if pas_encore + then + pli(cpt_pli):=a2_jeu(i).c; + remember:=i; + pas_encore:=false; + if pli(cpt_pli).valeur=as + then + trouve:=true; + a2_jeu(remember).present:=false; + fi; + else + (* il n'a pas encore trouve d'as, et il lui reste des cartes + a comparer *) + if a2_jeu(i).c.valeur=as + then + pli(cpt_pli):=a2_jeu(i).c; + remember:=i; + a2_jeu(remember).present:=false; + trouve:=true; + else + (* si toujours pas d'as, il prend la plus petite carte de son jeu *) + if pli(cpt_pli).valeur>a2_jeu(i).c.valeur + then + pli(cpt_pli):=a2_jeu(i).c; + remember:=i; + fi; + fi; + fi; + fi; + fi; + i:=i+1; + od; + if remember=0 + then + (* il ne lui reste que de l'atout *) + (* il est donc oblige de jouer atout *) + i:=1; + while i<9 + do + (* adv2 joue le plus petit atout *) + if a2_jeu(i).present + then + if remember=0 + then + remember:=i; + else + if not compare_atout(a2_jeu(i).c.valeur,a2_jeu(remember).c.valeur) + (* a2_jeu(i).c.valeuratout + then + pas_encore:=true; + while i<9 and not trouve + do + (* Il joue as sinon indien dans couleur demandee different d'atout *) + if a2_jeu(i).present and a2_jeu(i).c.couleur=pli(1).couleur + then + if pas_encore + then + remember:=i; + pas_encore:=false; + if a2_jeu(remember).c.valeur=as + then + trouve:=true; + fi; + else + (* il n'a pas encore trouve d'as, et il lui reste des cartes + a comparer *) + if a2_jeu(i).c.valeur=as + then + remember:=i; + trouve:=true; + else + (* si toujours pas d'as, il prend la plus petite de son jeu *) + if a2_jeu(remember).c.valeur>a2_jeu(i).c.valeur + then + remember:=i; + fi; + fi; + fi; + fi; + i:=i+1; + od; + if remember=0 + then + (* il n'a pas de la couleur demandee, il essaie de jouer atout *) + i:=1; + while i<9 + do + (* adv2 joue le plus petit atout *) + if a2_jeu(i).present and a2_jeu(i).c.couleur=atout + then + if remember=0 + then + remember:=i; + else + if not compare_atout(a2_jeu(i).c.valeur,a2_jeu(remember).c.valeur) + then + remember:=i; + fi; + fi; + fi; + i:=i+1; + od; + if remember=0 + then + (* il ne peut pas couper *) + i:=1; + while i<9 + do + (* adv2 joue sa plus petite carte *) + if a2_jeu(i).present + then + if remember=0 + then + remember:=i; + else + if a2_jeu(i).c.valeur0 + then + if a2_jeu(remember).c.couleur=atout + then + atout_joue(a2_jeu(remember).c.valeur):=true; + fi; + fi; + + + pli(cpt_pli).x:=190; + pli(cpt_pli).y:=170; + call pli(cpt_pli).print; + for i:=1 to 30000 do od; + +end jouer_carte; + +begin + return; + + call donne1; + if not(on_prend) + then + call tour1; + fi; +(* 2ieme tour *) + if not(on_prend) + then + call tour2; + fi; + if on_prend + then + call donne2; + for n:=1 to 8 + do + call jouer_carte; + attach(main); + od; + fi; + + attach(main); +end adversaire2; + +(* *********************** fin des coroutines ************************* *) + + + (*************************************) + (* On coupe le jeu de cartes *) + (*************************************) + + +Unit COUPE_JEU : procedure; +var i,j : integer, + tmp1,tmp2 : pile; +begin + tmp1:=new pile; + tmp2:=new pile; + call RANSET(1000); + i:=entier(RANDOM*32); + if i<3 or i>29 + then + i:=15; + fi; + for j:=1 to i + do + call tmp1.push(s.pop); + od; + while not s.empty + do + call tmp2.push(s.pop); + od; + while not tmp1.empty + do + call s.push(tmp1.pop); + od; + while not tmp2.empty + do + call s.push(tmp2.pop); + od; + kill(tmp1); + kill(tmp2); + +end coupe_jeu; + + + (*************************************) + (* Melange du jeu de cartes *) + (*************************************) + +Unit MELANGE : procedure; +var + tab : arrayof carte, + tampon : carte, + a,b,i,j,attente : integer; + +begin + array tab dim(0:31); + tab(0):=P1; + tab(1):=P2; + tab(2):=P3; + tab(3):=P4; + tab(4):=P5; + tab(5):=P6; + tab(6):=P7; + tab(7):=P8; + tab(8):=T1; + tab(9):=T2; + tab(10):=T3; + tab(11):=T4; + tab(12):=T5; + tab(13):=T6; + tab(14):=T7; + tab(15):=T8; + tab(16):=CA1; + tab(17):=CA2; + tab(18):=CA3; + tab(19):=CA4; + tab(20):=CA5; + tab(21):=CA6; + tab(22):=CA7; + tab(23):=CA8; + tab(24):=CO1; + tab(25):=CO2; + tab(26):=CO3; + tab(27):=CO4; + tab(28):=CO5; + tab(29):=CO6; + tab(30):=CO7; + tab(31):=CO8; + for a:=1 to 10 + do + call RANSET(1000); + i:=entier(RANDOM*10); + for attente:=1 to 2000 do od; + call RANSET(1500); + j:=entier(RANDOM*10); + for b:=1 to 15 + do + tampon:=tab(i); + tab(i):=tab((i+j) mod 31); + tab((i+j) mod 31):=tampon; + i:=(i+4) mod 31; + j:=(j+3) mod 31; + tampon:=tab(i); + tab(i):=tab((i+j) mod 31); + tab((i+j) mod 31):=tampon; + i:=(i+1) mod 31; + j:=(j+7) mod 31; + od; + od; + for a:=0 to 31 + do + call s.push(tab(a)); + od; + +end melange; + + (**************************************************) + (* Renvoie la valeur de l'atout le plus fort *) + (* qui n'a pas encore ete joue *) + (**************************************************) + +Unit AT_FORT : function : integer; +begin + if not atout_joue(valet) + then + result:=valet; + else + if not atout_joue(neuf) + then + result:=neuf; + else + for i:=8 downto 1 + do + if not atout_joue(i) + then + result:=i; + fi; + od; + fi; + fi; +end at_fort; + + + + + (**************************************************) + (* Ordre de croissance des cartes a l'atout *) + (* --> retourne vrai si c1>c2 *) + (**************************************************) + +Unit COMPARE_ATOUT : function(c1,c2 : integer): boolean; +begin + if c1=valet + then + result:=true; + else + if c2=valet + then + result:=false; + else + if c1=neuf + then + result:=true; + else + if c2=neuf + then + result:=false; + else + (* il n'y a ni valet ni neuf *) + if c1>c2 + then + result:=true; + else + result:=false; + fi; + fi; + fi; + fi; + fi; +end compare_atout; + + (**************************************************) + (* Attribue une valeur pour chaque carte *) + (**************************************************) + +Unit EVALUE : function(c : carte): integer; +begin + case c.valeur + when sept : result:=5; + when huit : result:=7; + when dame : result:=10; + when roi : result:=13; + when dix : result:=15; + when as : result:=18; + when neuf : result:=22; + when valet: result:=30; + esac; +end evalue; + + (**************************************************) + (* Attribue une valeur pour chaque carte *) + (**************************************************) + +Unit EVALUE2 : function(c : carte): integer; +begin + case c.valeur + when sept : result:=4; + when huit : result:=4; + when dame : result:=6; + when roi : result:=6; + when dix : result:=10; + when as : result:=15; + when neuf : result:=15; + when valet: result:=25; + esac; +end evalue2; + + (*************************************) + (* Affichage du menu *) + (*************************************) + +Unit PREMIER_MENU : procedure; +begin + b_option:=new bouton_relief(280,140,360,180,6,"Option"); + b_debut:=new bouton_relief(280,200,360,240,5,"Jouer"); + b_fin:=new bouton_relief(280,260,360,300,7,"Quitter"); + call patern(220,50,420,320,gris_clair,plein); + call patern(220,50,420,320,gris_fonce,vide); + call patern(221,51,419,51,gris_fonce,plein); + call patern(222,52,418,52,gris_fonce,plein); + call patern(221,51,221,319,gris_fonce,plein); + call patern(222,52,222,318,gris_fonce,plein); + call patern(419,51,419,319,gris_fonce,plein); + call patern(418,52,418,318,gris_fonce,plein); + call patern(221,319,419,319,gris_fonce,plein); + call patern(222,318,418,318,gris_fonce,plein); + + call outstring(293,70,"M E N U",noir,gris_clair); + call patern(285,85,355,85,noir,plein); + call outstring(275,90 ,"JYL & REDGE ",noir,gris_clair); + call outstring(275,105," 1995 ",noir,gris_clair); + call b_option.print; + call b_debut.print; + call b_fin.print; + call patern(0,0,640,40,gris_clair,plein); + (* affichage des bandes de commentaires en gris du haut *) + call move(0,20); + call color(noir); + call draw(640,20); + call move(0,40); + call draw(640,40); + call outstring(270,4,"B-E-L-O-T-E",noir,gris_clair); + (* sauvegarde menu *) + call move(100,50); + save_menu:=getmap(540,370); + call menu; +end premier_menu; + + + (*************************************) + (* MENU *) + (*************************************) + +Unit MENU : procedure; +var h,v,p,l,r,c : integer, + d : boolean; +begin + call move(100,50); + call putmap(save_menu); + d:=false; + do + d:=getpress(h,v,p,l,r,c); + case (c) + when 1 : + if b_option.dedans(h,v) + then + call b_option.choix; + call option; + else + if b_debut.dedans(h,v) + then + call b_debut.choix; + (* affichage des bandes de commentaires en gris du haut *) + call move(0,20); + call color(noir); + call draw(640,20); + call move(0,40); + call draw(640,40); + call outstring(270,2,"B-E-L-O-T-E",noir,gris_clair); + call move(219,49); + call putmap(del_menu); + exit; + else + if b_fin.dedans(h,v) + then + call b_fin.choix; + termine:=true; + call fermeture; + exit; + fi; + fi; + fi; + esac + od; +end menu; + + (*************************************) + (* SOUS-MENU *) + (*************************************) + +Unit OPTION : procedure; +var h,v,p,l,r,c,i : integer, + op1,op2,op3 : bouton_enfonce, + valide : bouton_relief, + d : boolean; +begin + op1:=new bouton_enfonce(210,200,270,240,3,"5OO"); + op2:=new bouton_enfonce(290,200,350,240,4,"1OOO"); + op3:=new bouton_enfonce(370,200,430,240,4,"15OO"); + valide:=new bouton_relief(280,255,360,295,2,"OK"); + call patern(190,130,450,310,gris_clair,plein); + call patern(190,130,450,310,noir,vide); + + call patern(191,131,449,131,blanc,plein); + call patern(192,132,448,132,blanc,plein); + call patern(191,131,191,309,blanc,plein); + call patern(192,132,192,308,blanc,plein); + + call patern(449,131,449,309,gris_fonce,plein); + call patern(448,132,448,308,gris_fonce,plein); + call patern(191,309,449,309,gris_fonce,plein); + call patern(192,308,448,308,gris_fonce,plein); + + + call outstring(260,145,"Nombre de points",noir,gris_clair); + call outstring(260,165," par partie",noir,gris_clair); + call op1.choix; + call op2.print; + call op3.print; + call valide.print; + + d:=false; + do + d:=getpress(h,v,p,l,r,c); + case (c) + when 1 : + if op1.dedans(h,v) + then + call op1.choix; + call op2.print; + call op3.print; + total:=300; + fi; + if op2.dedans(h,v) + then + call op1.print; + call op2.choix; + call op3.print; + total:=1000; + fi; + if op3.dedans(h,v) + then + call op1.print; + call op2.print; + call op3.choix; + total:=1500; + fi; + if valide.dedans(h,v) + then + call valide.choix; + for i:=1 to 5000 do od; + call move(100,50); + call putmap(save_menu); + exit; + fi; + + esac + od; +end option; + + + (*************************************) + (* Calcul du score pour *) + (* chaque equipe *) + (*************************************) + +Unit CALCUL_SCORE : procedure; +var s1,s2,i,attente : integer, + dedans,capot : boolean; + +begin + s1:=0; + s2:=0; + (* prise en compte du 10 de der *) + if commence=1 or commence=3 + then + s1:=s1+10; + else + s2:=s2+10; + fi; + + while not(e1.empty) + do + if e1.sommet.valeur.couleur=atout and e1.sommet.valeur.valeur=valet + then + s1:=s1+20; + else + if e1.sommet.valeur.couleur=atout and e1.sommet.valeur.valeur=neuf + then + s1:=s1+14; + else + case e1.sommet.valeur.valeur + when dix : s1:=s1+10; + when valet : s1:=s1+2; + when dame : s1:=s1+3; + when roi : s1:=s1+4; + when as : s1:=s1+11; + esac; + fi; + fi; + call e11.push(e1.pop); + od; + while not(e2.empty) + do + if e2.sommet.valeur.couleur=atout and e2.sommet.valeur.valeur=valet + then + s2:=s2+20; + else + if e2.sommet.valeur.couleur=atout and e2.sommet.valeur.valeur=neuf + then + s2:=s2+14; + else + case e2.sommet.valeur.valeur + when dix : s2:=s2+10; + when valet : s2:=s2+2; + when dame : s2:=s2+3; + when roi : s2:=s2+4; + when as : s2:=s2+11; + esac; + fi; + fi; + call e22.push(e2.pop); + od; + dedans:=false; + capot:=false; + if (s1=0) + then + score2:=score2+250; + capot:=true; + call outstring(270,22,"Equipe1 est capot",noir,gris_clair); + for i:=1 to 40000 do od; + call outstring(270,22," ",noir,gris_clair); + else + if (s2=0) + then + score1:=score1+250; + capot:=true; + call outstring(270,22,"Equipe2 est capot",noir,gris_clair); + for i:=1 to 40000 do od; + call outstring(270,22," ",noir,gris_clair); + + else + if joueur_prend or part_prend + then + if s10 + then + if pli(gagnant).valeurpli(gagnant).valeur + then gagnant:=i; + fi; + od; + fi; + result:=gagnant; +end EVALUE_PLI; + + (*******************************************************) + (* On remet les cartes des joueurs dans le jeu *) + (*******************************************************) + +Unit PERSONNE_A_PRIS : procedure; +var + i : integer; +begin + for i:=1 to 5 + do + call s.push(j_jeu(i).c); + od; + for i:=1 to 5 + do + call s.push(a1_jeu(i).c); + od; + for i:=1 to 5 + do + call s.push(p_jeu(i).c); + od; + for i:=1 to 5 + do + call s.push(a2_jeu(i).c); + od; + call s.push(carte_ret); +end personne_a_pris; + + (*************************************) + (* Affichage des atouts *) + (*************************************) + +Unit affiche_atout : procedure; +var i : integer; +begin + call patern(180,395,460,460,gris_clair,plein); + call patern(180,395,460,395,blanc,plein); + call patern(181,396,459,396,blanc,plein); + call patern(180,395,180,460,blanc,plein); + call patern(181,396,181,459,blanc,plein); + + call patern(182,397,458,397,blanc,plein); + call patern(182,397,182,458,blanc,plein); + call patern(458,397,458,458,gris_fonce,plein); + call patern(182,458,458,458,gris_fonce,plein); + + call patern(180,460,460,460,gris_fonce,plein); + call patern(181,459,459,459,gris_fonce,plein); + call patern(460,395,460,460,gris_fonce,plein); + call patern(459,396,459,459,gris_fonce,plein); + call outstring(200,400," 7 ",noir,blanc); + call outstring(230,400," 8 ",noir,blanc); + call outstring(260,400," 9 ",noir,blanc); + call outstring(290,400," V ",noir,blanc); + call outstring(320,400," D ",noir,blanc); + call outstring(350,400," R ",noir,blanc); + call outstring(380,400," 10 ",noir,blanc); + call outstring(410,400," A ",noir,blanc); + for i:=1 to 8 + do + if atout_joue(i) + then + call patern(200+(i-1)*30,420,200+i*30,450,gris_fonce,plein); + fi; + call patern(200+(i-1)*30,420,200+i*30,450,noir,vide); + od; + for i:=1 to 100000 do od; +end affiche_atout; + + (*************************************) + (* Affichage du score *) + (*************************************) + +Unit AFFICHE_SCORE : procedure; +begin + call outstring(500,2,"Equipe 1 :",noir,gris_clair); + call track(600,2,score1,gris_clair,noir); + call outstring(500,22,"Equipe 2 :",noir,gris_clair); + call track(600,22,score2,gris_clair,noir); +end affiche_score; + + (*************************************) + (* Affichage du vainqueur *) + (*************************************) + +Unit AFFICHE_VAINQUEUR : procedure; +var + d : boolean, + h,v,p,l,r,c : integer, + ok : bouton_relief; + +begin + ok:=new bouton_relief(270,150,370,190,4,"O.K."); + call move(0,0); + call putmap(depart); + if score1score2 + then + call outstring(240,22,"Vainqueur : Equipe1",noir,gris_clair); + else + (* on ne sait jamais ... *) + call outstring(240,22," Match nul !",noir,gris_clair); + fi; + fi; + call affiche_score; + call ok.print; + d:=false; + do + d:=getpress(h,v,p,l,r,c); + case (c) + when 1 : + if ok.dedans(h,v) + then + call ok.choix; + call move(0,0); + call putmap(depart); + call MENU; + exit; + fi; + esac + od; + +end affiche_vainqueur; + + + (***************************************) + (* Affichage du tapis de cart *) + (***************************************) + +Unit Affiche_tapis : procedure; +begin + call patern(160,90,480,350,25,plein); + call patern(160,90,480,350,gris_fonce,vide); + call patern(161,91,479,349,gris_fonce,vide); + call intens(4,tx,ty,26,plein); + call coeur(170,95); + call carreau(445,290); + call pic(170,290); + call trefle(445,95); +end affiche_tapis; + + (***************************************) + (* Initialisation de l'ecran *) + (***************************************) + +Unit INIT_ECRAN : procedure; +var nord,est,ouest:bouton_relief; +begin + nord:=new bouton_relief(280,49,360,79,4,"NORD"); + est:=new bouton_relief(540,195,620,235,3,"EST"); + ouest:=new bouton_relief(20,195,100,235,5,"OUEST"); + call patern(0,0,640,40,gris_clair,plein); + (* affichage des bandes de commentaires en gris du haut *) + call move(0,20); + call color(noir); + call draw(640,20); + call move(0,40); + call draw(640,40); + call outstring(270,2,"B-E-L-O-T-E",noir,gris_clair); + call nord.print; + call est.print; + call ouest.print; + call move(0,41); + terrain:=getmap(640,361); + (* sauvegarde de l'ecran *) + call move(0,0); + depart:=getmap(640,480); +end init_ecran; + + (*****************************************************) + (* Initialisation diverses (cartes, jeu...) *) + (*****************************************************) + +Unit INITIALISATION : procedure; +var i : integer; +begin + P1:=new carte(P,sept); + P2:=new carte(P,huit); + P3:=new carte(P,neuf); + P4:=new carte(P,dix); + P5:=new carte(P,valet); + P6:=new carte(P,dame); + P7:=new carte(P,roi); + P8:=new carte(P,as); + T1:=new carte(T,sept); + T2:=new carte(T,huit); + T3:=new carte(T,neuf); + T4:=new carte(T,dix); + T5:=new carte(T,valet); + T6:=new carte(T,dame); + T7:=new carte(T,roi); + T8:=new carte(T,as); + CA1:=new carte(CA,sept); + CA2:=new carte(CA,huit); + CA3:=new carte(CA,neuf); + CA4:=new carte(CA,dix); + CA5:=new carte(CA,valet); + CA6:=new carte(CA,dame); + CA7:=new carte(CA,roi); + CA8:=new carte(CA,as); + CO1:=new carte(CO,sept); + CO2:=new carte(CO,huit); + CO3:=new carte(CO,neuf); + CO4:=new carte(CO,dix); + CO5:=new carte(CO,valet); + CO6:=new carte(CO,dame); + CO7:=new carte(CO,roi); + CO8:=new carte(CO,as); + s:=new pile; + e1:=new pile; + e2:=new pile; + e11:=new pile; + e22:=new pile; + b_aide_atout:=new bouton_relief(600,420,630,450,1,"?"); + user:=new joueur; + part:=new partenaire; + adv1:=new adversaire1; + adv2:=new adversaire2; + array j_jeu dim(1:8); + array p_jeu dim(1:8); + array a1_jeu dim(1:8); + array a2_jeu dim(1:8); + array pli dim(1:4); + array atout_joue dim(1:8); + for i:=1 to 8 + do + j_jeu(i):=new carte_user; + p_jeu(i):=new carte_user; + a1_jeu(i):=new carte_user; + a2_jeu(i):=new carte_user; + atout_joue(i):=false; + od; + for i:=1 to 4 + do + pli(i):=new carte(P,SEPT); + od; + array tx dim(1:4); + array ty dim(1:4); + tx(1):=320; + tx(2):=162; + tx(3):=320; + tx(4):=478; + ty(1):=92; + ty(2):=220; + ty(3):=348; + ty(4):=220; + +end initialisation; + + (*****************************************) + (* Initialisation des variables *) + (*****************************************) + +Unit INIT_VARIABLES : procedure; +var i : integer; +begin + s:=new pile; + e1:=new pile; + e2:=new pile; + e11:=new pile; + e22:=new pile; + user:=new joueur; + part:=new partenaire; + adv1:=new adversaire1; + adv2:=new adversaire2; + array pli dim(1:4); + for i:=1 to 8 + do + j_jeu(i):=new carte_user; + p_jeu(i):=new carte_user; + a1_jeu(i):=new carte_user; + a2_jeu(i):=new carte_user; + od; + for i:=1 to 4 + do + pli(i):=new carte(P,SEPT); + od; + score1:=0; + score2:=0; + tour:=1; + for i:=1 to 8 + do + j_jeu(i):=new carte_user; + p_jeu(i):=new carte_user; + a1_jeu(i):=new carte_user; + a2_jeu(i):=new carte_user; + od; + for i:=1 to 4 + do + pli(i):=new carte(P,SEPT); + od; + + +end init_variables; + + + (******************************************************) + (* Distribue 5 cartes pour chaque joueur puis *) + (* retourne une carte *) + (******************************************************) + +Unit DISTRIBUE_1 : procedure; +begin + (* on desire distribuer les cartes *) + case tour + when 1 : attach(user); + when 2 : attach(adv1); + when 3 : attach(part); + when 4 : attach(adv2); + esac; + + call move(0,0); + image:=getmap(640,480); +(* on retourne une carte *) + carte_ret:=s.pop; + carte_ret.x:=295; + carte_ret.y:=190; + call carte_ret.print; +end distribue_1; + + (*********************************) + (* On demande qui veut prendre *) + (*********************************) + +Unit QUI_PREND : procedure; +begin + case tour + when 1 : attach(user); + when 2 : attach(adv1); + when 3 : attach(part); + when 4 : attach(adv2); + esac; +end qui_prend; + + (*************************************************************) + (* On distribue les cartes restantes et on affiche l'atout *) + (*************************************************************) + +Unit DISTRIBUE_2 : procedure; +begin + (* on effectue la troisieme donne *) + case tour + when 1 : attach(user); + when 2 : attach(adv1); + when 3 : attach(part); + when 4 : attach(adv2); + esac; + (* on affiche l'atout *) + case atout + when 1 : + call outstring(2,5,"ATOUT PIC",noir,gris_clair); + when 2 : + call outstring(2,5,"ATOUT TREFLE",noir,gris_clair); + when 3 : + call outstring(2,5,"ATOUT CARREAU",noir,gris_clair); + when 4 : + call outstring(2,5,"ATOUT COEUR",noir,gris_clair); + esac; + if joueur_prend + then + call outstring(2,25,"Preneur : SUD",noir,gris_clair); + fi; + if adv1_prend + then + call outstring(2,25,"Preneur : EST",noir,gris_clair); + fi; + if part_prend + then + call outstring(2,25,"Preneur : NORD",noir,gris_clair); + fi; + if adv2_prend + then + call outstring(2,25,"Preneur : OUEST",noir,gris_clair); + fi; +end distribue_2; + + (*************************************) + (* Ouverture mode graphique *) + (*************************************) + +Unit OUVERTURE : procedure; +begin + call gron(1); + call border(bleu_clair); + call cls; + (*for i:=32 to 40 + do + call patern(300,300,100,100,i,plein); + call track(50,40,i,noir,blanc); + for attente:=1 to 10000 do od; + od; + *) + call cls; + call init(1,0); + call showcursor; + call move(219,49); + del_menu:=getmap(421,361); + call move(150,80); + image2:=getmap(500,360); +end OUVERTURE; + + (*************************************) + (* Fermeture mode graphique *) + (*************************************) + +Unit FERMETURE : procedure; +begin + call groff; +end FERMETURE; + + (******************************************************************) + (* debut PROGRAMME PRINCIPAL *) + (******************************************************************) + + + +begin + +call OUVERTURE; +total:=defaut; +termine:=false; +call initialisation; +call init_ecran; +call premier_menu; +while not termine +do + call init_variables; + call melange; + call move(0,0); + call putmap(depart); + call affiche_score; + + while score1 0 + then + (* il y a des places disponibles … table *) + (* le philosophe peut rentrer *) + place_dispo := place_dispo - 1; + call e.actionp(num, 2); + if place_dispo = 0 then + (* il n'y a plus de places disponibles *) + (* aucun philosophe ne peut entrer *) + return disable dem_entrer; + fi; + else + call e.actionp(num, 5); + return; + fi; + END dem_entrer; + + UNIT sortir : procedure(num : integer); + begin + (* un philosophe sort de la salle *) + (* une place est liberee *) + place_dispo := place_dispo + 1; + call e.actionp(num, 4); + return enable dem_entrer; + END sortir; + + begin + enable dem_entrer, sortir; + return; + do od; + END doorman; + + (*******************************************************) + (* processus permettant de prendre et rendre les *) + (* fourchettes *) + (*******************************************************) + UNIT fork : iiuwgraph process (node : integer,e:ecran); + var aux : boolean; + + UNIT prendref : procedure (output foccupee : boolean; + input num,i:integer); + begin + if aux + then foccupee := true; + aux := false; + + else foccupee := false; + fi; + if i=0 then + if foccupee + then + call e.actionp(num, 9); + else + call e.actionp(num, 11); + fi; + else + if foccupee + then + call e.actionp(num, 10); + else + call e.actionp(num, 12); + fi; + fi; + END prendref; + + UNIT rendref : procedure (output foccup : boolean; + input num:integer,i:integer); + begin + aux := true; + foccup := false; + if i=0 then call e.actionp(num, 6) + else call e.actionp(num,7 ) fi; + END rendref; + + begin + aux := true; + enable prendref, rendref; + return; + do + accept prendref, rendref; + od; + END fork; + + (*******************************************************) + (* PROGRAMME PRINCIPAL *) + (*******************************************************) + CONST + xt = 300, + yt = 170, + rt = 105; + + VAR i : integer, + gardien : doorman, + f : arrayof fork, + f0 : fork, + ph : arrayof philosophe, + ph0 : philosophe, + e : ecran; + + BEGIN (********* programme principale ***********) + + call newpage; + e := new ecran(0); + resume(e); + + call e.table(xt,yt,rt); + + (* affichage des fourchettes *) + for i := 0 to 4 + do + call e.fourchette(i, 0, 14); + od; + (* affichage de gardien *) + call e.guard(50,250,14); + gardien := new doorman(0, 4, e); + array ph dim (1:5); + array f dim (0:4); + for i := 0 to 4 + do + f0 := new fork(0,e); + f(i) := f0; + resume(f(i)); + od; + resume (gardien); + for i:= 1 to 5 + do + ph0 := new philosophe(0, i, gardien, f(i mod 5), f(i-1), e); + ph(i) :=ph0; + od; + for i := 1 to 5 + do + resume(ph(i)); + od; + + +END philos5. diff --git a/examples/grazyna.xmp/bus13.log b/examples/grazyna.xmp/bus13.log new file mode 100644 index 0000000..6cdc032 --- /dev/null +++ b/examples/grazyna.xmp/bus13.log @@ -0,0 +1,994 @@ +BLOCK + +(*****************************************************************************) +(********************************** F I F O **********************************) +(*****************************************************************************) + +unit FIFO : class ( type T); + + var HEAD,LAST : ELEM; + + unit ELEM : class ( INFO : T); + var NEXT : ELEM; + begin + end ELEM; + + unit EMPTY : function : boolean; + begin + result := (HEAD=NONE) + end EMPTY; + + unit INTO : procedure ( INFO : T ); + begin + if EMPTY then + HEAD := new ELEM(INFO); + LAST := HEAD + else + LAST.NEXT := new ELEM(INFO); + LAST := LAST.NEXT + fi + end INTO; + + unit FIRST : function : T; + begin + result := HEAD.INFO + end FIRST; + + unit OUT_FIRST : procedure; + begin + if not EMPTY + then + HEAD := HEAD.NEXT + fi + end OUT_FIRST; + + unit CARDINAL : function : integer; + var HLP : ELEM; + begin + HLP := HEAD; + while HLP <> NONE + do + result :=result + 1; + HLP := HLP.NEXT + od + end CARDINAL; + + end FIFO; + + +(*****************************************************************************) +(************************** E N D F I F O *******************************) +(*****************************************************************************) + +(* * * * * * * * *) + +(*****************************************************************************) +(************************* S I M U L A T I O N *******************************) +(*****************************************************************************) + +UNIT PRIORITYQUEUE: IIUWGRAPH CLASS; + + UNIT QUEUEHEAD: CLASS; + (* HEAP ACCESING MODULE *) + VAR LAST,ROOT:NODE; + + UNIT MIN: FUNCTION: ELEM; + BEGIN + IF ROOT=/= NONE THEN RESULT:=ROOT.EL FI; + END MIN; + + UNIT INSERT: PROCEDURE(E:ELEM); + (* INSERTION INTO HEAP *) + VAR X,Z:NODE; + BEGIN + X:= E.LAB; + IF LAST=NONE THEN + ROOT:=X; + ROOT.LEFT,LAST:=ROOT + ELSE + IF LAST.NS=0 THEN + LAST.NS:=1; + Z:=LAST.LEFT; + LAST.LEFT:=X; + X.UP:=LAST; + X.LEFT:=Z; + Z.RIGHT:=X; + + ELSE + LAST.NS:=2; + Z:=LAST.RIGHT; + LAST.RIGHT:=X; + X.RIGHT:=Z; + X.UP:=LAST; + Z.LEFT:=X; + LAST.LEFT.RIGHT:=X; + X.LEFT:=LAST.LEFT; + LAST:=Z; + FI + FI; + + CALL CORRECT(E,FALSE) + END INSERT; + +UNIT DELETE: PROCEDURE(R: ELEM); + VAR X,Y,Z:NODE; + BEGIN + X:=R.LAB; + Z:=LAST.LEFT; + IF LAST.NS =0 THEN + Y:= Z.UP; + if y<>none then Y.RIGHT:= LAST else root :=none fi; + LAST.LEFT:=Y; + LAST:=Y; + ELSE + Y:= Z.LEFT; + Y.RIGHT:= LAST; + LAST.LEFT:= Y; + FI; + Z.EL.LAB:=X; + X.EL:= Z.EL; + LAST.NS:= LAST.NS-1; + R.LAB:=Z; + Z.EL:=R; + + z.left.right := none; + z.ns := 0; + z.left, z.right, z.up := none; + IF X.LESS(X.UP) THEN CALL CORRECT(X.EL,FALSE) + ELSE CALL CORRECT(X.EL,TRUE) FI; + END DELETE; + +UNIT CORRECT: PROCEDURE(R:ELEM,DOWN:BOOLEAN); + (* CORRECTION OF THE HEAP WITH STRUCTURE BROKEN BY R *) + VAR X,Z:NODE,T:ELEM,FIN,LOG:BOOLEAN; + BEGIN + Z:=R.LAB; + IF DOWN THEN + WHILE NOT FIN DO + IF Z.NS =0 THEN FIN:=TRUE ELSE + IF Z.NS=1 THEN X:=Z.LEFT ELSE + IF Z.LEFT.LESS(Z.RIGHT) THEN X:=Z.LEFT ELSE X:=Z.RIGHT + FI; FI; + IF Z.LESS(X) THEN FIN:=TRUE ELSE + T:=X.EL; + X.EL:=Z.EL; + Z.EL:=T; + Z.EL.LAB:=Z; + X.EL.LAB:=X + FI; FI; + Z:=X; + OD + ELSE + X:=Z.UP; + IF X=NONE THEN LOG:=TRUE ELSE LOG:=X.LESS(Z); FI; + WHILE NOT LOG DO + T:=Z.EL; + Z.EL:=X.EL; + X.EL:=T; + X.EL.LAB:=X; + Z.EL.LAB:=Z; + Z:=X; + X:=Z.UP; + IF X=NONE THEN LOG:=TRUE ELSE LOG:=X.LESS(Z); + FI; + OD + FI; + END CORRECT; + +END QUEUEHEAD; + + +UNIT NODE: CLASS (EL:ELEM); + (* ELEMENT OF THE HEAP *) + VAR LEFT,RIGHT,UP: NODE, NS:INTEGER; + UNIT LESS: FUNCTION(X:NODE): BOOLEAN; + BEGIN + IF X= NONE THEN RESULT:=FALSE + ELSE RESULT:=EL.LESS(X.EL) FI; + END LESS; + END NODE; + + +UNIT ELEM: CLASS(PRIOR:REAL); + (* PREFIX OF INFORMATION TO BE STORED IN NODE *) + VAR LAB: NODE; + UNIT VIRTUAL LESS: FUNCTION(X:ELEM):BOOLEAN; + BEGIN + IF X=NONE THEN RESULT:= FALSE ELSE + RESULT:= PRIOR< X.PRIOR FI; + END LESS; + BEGIN + LAB:= NEW NODE(THIS ELEM); + END ELEM; + +END PRIORITYQUEUE; + +UNIT SIMULATION: PRIORITYQUEUE CLASS; +(* THE LANGUAGE FOR SIMULATION PURPOSES *) + + hidden curr, pq; + signal ERROR1, ERROR2; + VAR CURR : SIMPROCESS, (* ACTIVE PROCESS *) + PQ : QUEUEHEAD, (* THE TIME AXIS *) + MAINPR : MAINPROGRAM; + + + UNIT SIMPROCESS: COROUTINE; + (* USER PROCESS PREFIX *) + + VAR EVENT, (* ACTIVATION MOMENT NOTICE *) + EVENTAUX: EVENTNOTICE, + (* THIS IS FOR AVOIDING MANY NEW CALLS AS AN RESULT OF *) + (* SUBSEQUENT PASSIVATIONS AND ACTIVATIONS *) + FINISH: BOOLEAN; + + UNIT IDLE: FUNCTION: BOOLEAN; + BEGIN + RESULT:= EVENT= NONE + END IDLE; + + UNIT TERMINATED: FUNCTION :BOOLEAN; + BEGIN + RESULT:= FINISH; + END TERMINATED; + + UNIT EVTIME: FUNCTION: REAL; + (* TIME OF ACTIVATION *) + BEGIN + IF IDLE THEN raise ERROR1; FI; + RESULT:= EVENT.EVENTTIME; + END EVTIME; + handlers + when ERROR1 : + WRITELN(" AN ATTEMPT TO ACTIVATE AN IDLE PROCESS TIME"); + attach(main); + when ERROR2 : + WRITELN(" AN ATTEMPT TO ACTIVATE A TERMINATED PROCESS TIME"); + attach(MAIN); + end handlers; + + BEGIN + RETURN; + INNER; + FINISH:=TRUE; + CALL PASSIVATE; + raise ERROR2; + END SIMPROCESS; + + + UNIT EVENTNOTICE: ELEM CLASS; + (* A PROCESS ACTIVATION NOTICE TO BE PLACED ONTO THE TIME AXIS PQ *) + VAR EVENTTIME: REAL, PROC: SIMPROCESS; + + UNIT VIRTUAL LESS: FUNCTION(X: EVENTNOTICE):BOOLEAN; + (* OVERWRITE THE FORMER VERSION CONSIDERING EVENTTIME *) + BEGIN + IF X=NONE + THEN + RESULT:= FALSE + ELSE + RESULT:= EVENTTIME< X.EVENTTIME OR + (EVENTTIME=X.EVENTTIME AND PRIOR<= X.PRIOR); + FI; + END LESS; + + END EVENTNOTICE; + + + UNIT MAINPROGRAM: SIMPROCESS CLASS; + (* IMPLEMENTING MASTER PROGRAM AS A PROCESS *) + BEGIN + DO ATTACH(MAIN) OD; + END MAINPROGRAM; + + UNIT TIME:FUNCTION:REAL; + (* CURRENT VALUE OF SIMULATION TIME *) + BEGIN + RESULT:=CURRENT.EVTIME + END TIME; + + UNIT CURRENT: FUNCTION: SIMPROCESS; + (* THE FIRST PROCESS ON THE TIME AXIS *) + BEGIN + RESULT:=CURR; + END CURRENT; + + UNIT SCHEDULE: PROCEDURE(P:SIMPROCESS,T:REAL); + (* ACTIVATION OF PROCESS P AT TIME T AND DEFINITION OF *) + (* "PRIOR"- PRIORITY WITHIN TIME MOMENT T *) + BEGIN + + if p.terminated then raise ERROR2 fi; + + IF ThfKe&mdYEBzeKOxf>;t7fX_ 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 literal 0 HcmV?d00001 diff --git a/examples/jeu/pina.log b/examples/jeu/pina.log new file mode 100644 index 0000000..309f194 --- /dev/null +++ b/examples/jeu/pina.log @@ -0,0 +1,1983 @@ + +Program chinois; +const blanc=15,bleu=1,vert=2,vertpetrole=3,rouge=4,violet=5,marron=6,grisclair=7, + grisfonce=8,bleuroi=9,vertclair=10,free=-1; + + + UNIT coord2D:class(x,y:integer); + end; + + UNIT coord3D:class(x,y,h:integer); + end; + + +UNIT gestion_caractere: IIUWGRAPH class; + + UNIT SAISIE:function(ti,e,x,y:integer):arrayof char; + var i,n:integer, + c: integer, + t :arrayof char; + begin + + array t dim(1:e); + for i:=1 to e do + t(i):=' '; + od; + + do + i:=1; + c:=inkey; + while c<>13 and c<>27 and i<=e do + + case ti + when 1: + if c>=48 and c<=57 then + t(i):=chr(c); + call move(x+i*9,y); + call hascii(c); + i:=i+1; + fi; + when 2: + + if c>64 then + t(i):=chr(c); + call move(x+i*9,y); + call hascii(c); + i:=i+1; + fi; + esac; + c:=inkey; + od; + if t(1)<>' ' then exit; fi; + od; + result:=t; + end SAISIE; + + UNIT ConvEnt:function(t:arrayof char):integer; + var n,i:integer; + begin + n:=0; + for i:=1 to upper(t) do + if t(i)<>' ' then + n:=n*10+(ord(t(i))-48); + fi; + od; + + result:=n; + end ConvEnt; + + UNIT displaystring:procedure(t:arrayof char,x,y,coul:integer); + var i:integer; + begin + call color(coul); + for i:=1 to upper(t) + do + call move(x+i*9,y); + call hascii(ord(t(i))); + od; + end; +END; + + +UNIT element:class; +var x,i,j,h:integer; +END; + + +UNIT ARBTAS : class; (* structure utilis‚e par la coroutine ordinateur *) + + var tab : arrayof element, (* tableau contenant les elements du tas *) + nb : integer, (* entier le nombre d'elements du tas *) + dimen: integer; + (* fonction testant si le tas est vide ou non *) + unit vide : function : boolean; + begin + if (tab(1) = none) + then result := true; + fi; + end vide; + + (* fonction retournant le minimum du tas *) + unit mini : function : element; + begin + if not vide + then result := tab(1); + fi; + end mini; + + (* fonction retournant la position d'un element dans le tas *) + unit membre : function(elem:element) : integer; + var i : integer; + begin + if not vide + then for i:=1 to nb + do + if tab(i).x = elem.x + then result := i; + exit; + fi; + od; + fi; + end membre; + + (* procedure pour inserer un nouvel element dans le tas *) + unit inserer : procedure(elem : element); + var i : integer, + aux : element, + tabaux : arrayof element; + begin + if (nb >= dimen) (* on aggrandit le tableau trop petit *) + then array tabaux dim (1:nb+1); + for i:=1 to nb + do + tabaux(i) := tab(i); + od; + tab := tabaux; + dimen := dimen + 1; (* la dimension du tableau est *) + (* incremente de 1 *) + fi; + nb := nb + 1; (* le nombre d'elements est incremente de 1 *) + tab(nb) := elem; (* l'element a inserer est place a la fin *) + i := nb; + aux := new element; + do (* on effectue des echanges tant que le fils est inferieur *) + (* au pere *) + if (i <= 1 ) orif ( tab(i).x >= tab(i div 2).x ) + then exit; + fi; + aux := tab(i DIV 2); (* echange pere-fils *) + tab(i DIV 2) := tab(i); + tab(i) := aux; + i := i div 2; + od; + end inserer; + + (* procedure pour supprimer un element du tas *) + unit supprimer : procedure(elem : element); + var i,j : integer, + aux : element; + begin + i := membre(elem); + if ( i <> 0 ) (* on teste si l'element appartient au tas *) + then kill(tab(i)); + tab(i) := tab(nb); (* le dernier element est place *) + (* a l'endroit de l'element supprime *) + nb := nb - 1; (* on decremente le nombre d'elements *) + aux := new element; + + while ( i <= (nb div 2) ) + do (* tant que tab(i) n'est pas une feuille *) + + if (2*i = nb) orif (tab(2*i).x < tab(2*i + 1).x) + then j := 2*i; (* on calcule l'indice du plus petit *) + else j := 2*i + 1; (* des 2 fils *) + fi; + + if tab(i).x > tab(j).x + then aux := tab(i); (* echange si la condition d'ordre *) + tab(i) := tab(j);(* n'est pas satisfaite *) + tab(j) := aux; + i := j; + else exit; + fi; + od; + tab(nb + 1) := none; (* le dernier element est supprime *) + fi; + end supprimer; + +begin + array tab dim (1:10); + nb := 0; + dimen:=10; +end ARBTAS; + + + +UNIT elem:class(i,j,k:integer); +var prec:elem; +end; + + +UNIT pile:class; (* structure utilis‚e par la coroutine controle*) + var pointeur:elem; + + UNIT empiler:procedure(e:elem); + begin + e.prec:=pointeur; + pointeur:=e; + end; + + UNIT depiler:procedure; + var tampon:elem; + begin + if not vide then + tampon:=pointeur; + pointeur:=pointeur.prec; + kill(tampon); + fi; + end; + + UNIT sommet:function:elem; + begin + result:=pointeur; + end; + + UNIT vide:function:boolean; + begin + result:=(pointeur=none); + end; +begin +pointeur:=none; +END; + +UNIT drawrect: IIUWGRAPH procedure(x1,y1,x2,y2,couleur:integer); +begin + call color(couleur); + call move(x1,y1); + call draw(x2,y1); + call draw(x2,y2); + call draw(x1,y2); + call draw(x1,y1); +end; + + +UNIT player: gestion_caractere class(couleur:integer,pl:plateau_jeu); +END; + + + +UNIT ordi: player coroutine; + +var coinlibre,find:boolean, + coin,c,quel,version:integer, + place:coord3D, + pos:integer,cointab:arrayof coord2D, + posajouer:arrayof arrayof integer, + mem:arbtas, + adver,moi:arrayof info; + + + +UNIT info: class(n,sur:integer); +var rangee:arrayof arrayof combinaison; +begin + + block + var i,j:integer; + + begin + array rangee dim(1:n); + for i:=1 to n do array rangee(i) dim (1:sur); od; + for i:=1 to n do + for j:=1 to sur do + rangee(i,j):=new combinaison; + od; + od; + end; + +end; + + +UNIT find_place:function(quoi,l,x,h:integer;inout p:coord3D):boolean; +const ligne=1,colonne=2,lignediag=3,coldiag=4,axe=5,dbdiag=7,bigdiag=6; +var i:integer, + trouve:boolean; +begin + trouve:=false; + case quoi + + when dbdiag: + + case x + when 1: + case h + when 1: + for i:=1 TO 4 do + if pl.jeu(i,i,i)=free then + if i=posajouer(i,i) then trouve:=true; + p.x:=i;p.y:=i;p.h:=i; + exit; fi; + fi; + od; + when 2: + for i:=1 TO 4 do + if pl.jeu(i,i,(4-i)+1)=free then + if posajouer(i,i)=(4-i)+1 then trouve:=true; + p.x:=i;p.y:=i;p.h:=(4-i)+1; + exit; + fi; + fi; + od; + esac; + when 2: + case h + when 1: + for i:=1 TO 4 do + if pl.jeu(i,(4-i)+1,i)=free then + if i=posajouer(i,(4-i)+1) then trouve:=true; + p.x:=i;p.y:=(4-i)+1;p.h:=i; + exit; + fi; + fi; + od; + when 2: + for i:=1 TO 4 do + if pl.jeu(i,(4-i)+1,(4-i)+1)=free then + if posajouer(i,(4-i)+1)=(4-i)+1 then trouve:=true; + p.x:=i;p.y:=(4-i)+1;p.h:=(4-i)+1; + exit; + fi; + fi; + od; + esac; + esac; + + when bigdiag: + + case l + when 1: + for i:=1 TO 4 do + if pl.jeu(i,i,h)=free then + if h=posajouer(i,i) then trouve:=true; + p.x:=i;p.y:=i;p.h:=h; + fi; + exit; + fi; + od; + when 2: + for i:=1 TO 4 do + if pl.jeu(i,(4-i)+1,h)=free then + if h=posajouer(i,(4-i)+1) then trouve:=true; + p.x:=i;p.y:=(4-i)+1;p.h:=h; + fi; + exit; + fi; + od; + esac; + when ligne: (* recherche d'une place dans la ligne sp‚cifi‚e *) + for i:=1 to 4 do + if pl.jeu(x,i,h)=free then + if h=posajouer(x,i) then trouve:=true; fi; + exit; + fi; + od; + if trouve then + p.x:=x; + p.y:=i; + p.h:=posajouer(x,i); + + fi; + when colonne: (* recherche d'une place dans la colonne sp‚cifi‚e *) + for i:=1 to 4 do + if pl.jeu(i,x,h)=free then + if posajouer(i,x)=h then trouve:=true; + p.x:=i;p.y:=x;p.h:=posajouer(i,x); + fi; + exit; + fi; + od; + + + + when lignediag:(* recherche d'une place dans la diagonnal ligne sp‚cifi‚e *) + case l + when 1: for i:=1 to 4 do + if pl.jeu(x,i,i)=free then + if posajouer(x,i)=i then trouve:=true; + p.x:=x;p.y:=i;p.h:=i; + fi; + exit; + fi; + od; + + + when 2: for i:=1 to 4 do + if pl.jeu(x,i,(4-i)+1)=free then + if posajouer(x,i)=(4-i)+1 then trouve:=true; + p.x:=x;p.y:=i;p.h:=(4-i)+1; + fi; + exit; + fi; + od; + + + esac; + when axe: (* recherche d'une place dans l'axe sp‚cifi‚e *) + if posajouer(x,h)<>5 then + p.x:=x; + p.y:=h; + p.h:=posajouer(x,h); + trouve:=true; + fi; + when coldiag:(* recherche d'une place dans la diagonnal colonne sp‚cifi‚e *) + case l + when 1: for i:=1 to 4 do + if pl.jeu(i,x,i)=free then + if posajouer(i,x)=i then trouve:=true; + p.x:=i;p.y:=x;p.h:=i; + fi; + exit; + fi; + od; + + + when 2: for i:=1 to 4 do + if pl.jeu(i,x,(4-i)+1)=free then + if posajouer(i,x)=(4-i)+1 then trouve:=true; + p.x:=i;p.y:=x;p.h:=(4-i)+1; + fi; + exit; + fi; + od; + esac; + + esac; + result:=trouve; + +end; + +UNIT isintwodiag:function(x,y,h:integer;inout a,b:integer):boolean; +var trouve:boolean; +begin + trouve:=false; + if (h=x) and (x=y) then trouve:=true; + a:=1;b:=1; + else + if (x=y) and (h=(4-x)+1) then trouve:=true; + a:=1;b:=2; + else + if (x=(4-y)+1) and (h=x) then trouve:=true; + a:=2;b:=1; + else + if (x=(4-y)+1) and (h=y) then trouve:=true; + a:=2;b:=2; + fi; + fi; + fi; + fi; + result:=trouve; +end; + +UNIT isinbigdiag:function(x,y:integer;inout quel:integer):boolean; +const droite=1,gauche=2; +var i:integer, + trouve:boolean; +begin + quel:=0; + trouve:=false; + if (x=y) then trouve:=true; + quel:=1; + else + if (x=(4-y)+1) then trouve:=true; + quel:=2 + fi; + fi; + + result:=trouve; +end; + + +UNIT isindiag:function(l,h:integer;inout dg:integer):boolean; +var trouve:boolean; +begin + trouve:=false; + if h=l then trouve:=true; + dg:=1; + else + if h=(4-l)+1 then trouve:=true; + dg:=2; + fi; + fi; + result:=trouve; +end; + + +unit troisboules:function(tab:arrayof info;inout p:coord3D):boolean; +var i,j:integer, + trouve:boolean; +begin + trouve:=false; + if p<>none then + + + if tab(1).rangee(p.x,p.h).nbre_boule=3 then + trouve:=find_place(1,0,p.x,p.h,p); + + else if tab(2).rangee(p.y,p.h).nbre_boule=3 then + trouve:=find_place(2,0,p.y,p.h,p); + + else + if tab(5).rangee(p.x,p.y).nbre_boule=3 then + trouve:=find_place(5,0,p.x,p.y,p); + + else + if isinbigdiag(p.x,p.y,i) then + if tab(6).rangee(p.h,i).nbre_boule=3 then + trouve:=find_place(6,i,p.x,p.h,p); + fi; + fi; + if isintwodiag(p.x,p.y,p.h,i,j) then + if tab(7).rangee(i,j).nbre_boule=3 then + trouve:=find_place(7,0,i,j,p); + fi; + fi; + for i:=1 to 2 do + if tab(3).rangee(p.x,i).nbre_boule=3 then + trouve:=find_place(3,i,p.y,p.h,p); + exit; fi; + if tab(4).rangee(p.y,i).nbre_boule=3 then + trouve:=find_place(4,i,p.x,p.h,p); + exit; fi; + od; + fi; + fi; + fi; + fi; + result:=trouve; +end; + +UNIT addcombinaison:procedure(tab:arrayof info,x,y,h:integer); +begin + + call tab(1).rangee(x,h).plus; + call tab(2).rangee(y,h).plus; + call tab(5).rangee(x,y).plus; + if isindiag(y,h,quel) then + call tab(3).rangee(x,quel).plus; + fi; + if isindiag(x,h,quel) then + call tab(4).rangee(y,quel).plus; + fi; + if isinbigdiag(x,y,quel) then + call tab(6).rangee(h,quel).plus; + fi; + if isintwodiag(x,y,h,quel,version) then + call tab(7).rangee(quel,version).plus; + fi; + +end; +UNIT delcombinaison:procedure(tab:arrayof info,x,y,h:integer); +var quel,version:integer; +begin + + (* si une boule a deja ete mise *) + call tab(1).rangee(x,h).elimine; + call tab(2).rangee(y,h).elimine; + + if isindiag(y,h,version) then (* diagonnale ligne*) + call tab(3).rangee(x,version).elimine; fi; + if isindiag(x,h,version) then (* diagonnale colonne*) + call tab(4).rangee(y,version).elimine; fi; + call tab(5).rangee(x,y).elimine; + if isinbigdiag(x,y,quel) then + call tab(6).rangee(h,quel).elimine; fi; + if isintwodiag(x,y,h,quel,version) then + call tab(7).rangee(quel,version).elimine; fi; +end; + +UNIT selectcoup: procedure(inout p:coord3D); +var coup:element, + trouve,bien:boolean; + +begin + trouve:=false; + while (not mem.vide) and (not trouve) do + coup:=mem.mini; + + posajouer(coup.i,coup.j):=posajouer(coup.i,coup.j)+1; + p.x:=coup.i; + p.y:=coup.j; + p.h:=coup.h+1; + if p.h<>5 then + if not troisboules(adver,p) then + p.h:=coup.h; + p.x:=coup.i; + p.y:=coup.j; + trouve:=true; + posajouer(coup.i,coup.j):=posajouer(coup.i,coup.j)-1; + else + posajouer(coup.i,coup.j):=posajouer(coup.i,coup.j)-1; + call mem.supprimer(coup); + fi; + else trouve:=true; + p.h:=coup.h; + posajouer(coup.i,coup.j):=posajouer(coup.i,coup.j)-1; + fi; + od; + while not mem.vide do + call mem.supprimer(mem.mini); + od; +end; + + +UNIT stratego:procedure; +var coup:coord3D, + e:element, + poid,n,version,quel,x,i,j:integer; +begin + + for i:=1 to 4 do + for j:=1 to 4 do + if posajouer(i,j)<5 then + coup:=new coord3D(i,j,posajouer(i,j)); + + poid:=0; + n:=0; + + + if moi(1).rangee(coup.x,coup.h).possible then + case moi(1).rangee(coup.x,coup.h).nbre_boule + when 3:poid:=poid+100; + otherwise + poid:=poid+moi(1).rangee(coup.x,coup.h).nbre_boule; + esac; + n:=n+1; + fi; + if moi(2).rangee(coup.y,coup.h).possible then + case moi(2).rangee(coup.y,coup.h).nbre_boule + when 3:poid:=poid+100; + otherwise + poid:=moi(2).rangee(coup.y,coup.h).nbre_boule+poid; + esac; + n:=n+1; + fi; + + if isindiag(coup.y,coup.h,quel) then + if moi(3).rangee(coup.x,quel).possible then + case moi(3).rangee(coup.x,quel).nbre_boule + when 3:poid:=poid+100; + otherwise + poid:=poid+moi(3).rangee(coup.x,quel).nbre_boule; + esac; + n:=n+1; + fi; + fi; + if isindiag(coup.x,coup.h,quel) then + if moi(4).rangee(coup.y,quel).possible then + case moi(4).rangee(coup.y,quel).nbre_boule + when 3: poid:=poid+100; + otherwise + poid:=poid+moi(4).rangee(coup.y,quel).nbre_boule; + esac; + n:=n+1; + fi; + fi; + + if moi(5).rangee(coup.x,coup.y).possible then + case moi(5).rangee(coup.x,coup.y).nbre_boule + when 3:poid:=poid+100; + otherwise + poid:=poid+moi(5).rangee(coup.x,coup.y).nbre_boule; + esac; + n:=n+1; + fi; + if isinbigdiag(coup.x,coup.y,quel) then + if moi(6).rangee(coup.h,quel).possible then + case moi(6).rangee(coup.h,quel).nbre_boule + when 3: poid:=poid+100; + otherwise + poid:=poid+moi(6).rangee(coup.h,quel).nbre_boule; + esac; + n:=n+1; + fi; + fi; + if isintwodiag(coup.x,coup.y,coup.h,quel,version) then + if moi(7).rangee(quel,version).possible then + case moi(7).rangee(quel,version).nbre_boule + when 3:poid:=poid+100; + otherwise + poid:=poid+moi(7).rangee(quel,version).nbre_boule; + esac; + n:=n+1; + fi; + fi; + + if adver(1).rangee(coup.x,coup.h).possible and + adver(2).rangee(coup.y,coup.h).possible then + if adver(1).rangee(coup.x,coup.h).nbre_boule=2 and + adver(2).rangee(coup.y,coup.h).nbre_boule=2 then + poid:=poid+20; + fi; + fi; + if adver(1).rangee(coup.x,coup.h).possible and + isindiag(coup.x,coup.h,quel) then + + if adver(4).rangee(coup.y,quel).possible then + if adver(1).rangee(coup.x,coup.h).nbre_boule=2 and + adver(4).rangee(coup.y,quel).nbre_boule=2 then + poid:=poid+20; + fi; + fi; + fi; + + x:=coup.x; + for c:=1 to 2 do + if adver(c).rangee(x,coup.h).possible and + adver(5).rangee(coup.x,coup.y).possible then + if adver(c).rangee(x,coup.h).nbre_boule=2 and + adver(5).rangee(coup.x,coup.y).nbre_boule=2 then + poid:=poid+20; + fi; + fi; + if adver(c).rangee(x,coup.h).possible and + isinbigdiag(coup.x,coup.y,quel) then + + if adver(6).rangee(coup.h,quel).possible then + if adver(c).rangee(x,coup.h).nbre_boule=2 and + adver(6).rangee(coup.h,quel).nbre_boule=2 then + poid:=poid+20; + fi; + fi; + fi; + if adver(c).rangee(x,coup.h).possible and + isintwodiag(coup.x,coup.y,coup.h,quel,version) then + + if adver(7).rangee(quel,version).possible then + if adver(c).rangee(x,coup.h).nbre_boule=2 and + adver(7).rangee(quel,version).nbre_boule=2 then + poid:=poid+20; + fi; + fi; + fi; + x:=coup.y; + od; + + if adver(1).rangee(coup.x,coup.h).possible then + case adver(1).rangee(coup.x,coup.h).nbre_boule + when 3:poid:=poid+80; + otherwise + poid:=poid+1; + esac; + n:=n+1; + fi; + if adver(2).rangee(coup.y,coup.h).possible then + case adver(2).rangee(coup.y,coup.h).nbre_boule + when 3:poid:=poid+80; + otherwise + poid:=1+poid; + esac; + n:=n+1; + fi; + + if isindiag(coup.y,coup.h,quel) then + if adver(3).rangee(coup.x,quel).possible then + case adver(3).rangee(coup.x,quel).nbre_boule + when 3:poid:=poid+80; + otherwise + poid:=poid+1; + esac; + n:=n+1; + fi; + fi; + if isindiag(coup.x,coup.h,quel) then + if adver(4).rangee(coup.y,quel).possible then + case adver(4).rangee(coup.y,quel).nbre_boule + when 3:poid:=poid+80; + otherwise + poid:=poid+1; + esac; + n:=n+1; + fi; + fi; + + if adver(5).rangee(coup.x,coup.y).possible then + case adver(5).rangee(coup.x,coup.y).nbre_boule + when 3:poid:=poid+80; + otherwise + poid:=poid+1; + esac; + n:=n+1; + fi; + if isinbigdiag(coup.x,coup.y,quel) then + if adver(6).rangee(coup.h,quel).possible then + case adver(6).rangee(coup.h,quel).nbre_boule + when 3:poid:=poid+80; + otherwise + poid:=poid+1; + esac; + n:=n+1; + fi; + fi; + if isintwodiag(coup.x,coup.y,coup.h,quel,version) then + if adver(7).rangee(quel,version).possible then + case adver(7).rangee(quel,version).nbre_boule + when 3:poid:=poid+80; + otherwise + poid:=poid+1; + esac; + n:=n+1; + fi; + fi; + if coinlibre and poid<20 then + do + pos:=round(random*3)+1; + coup.x:=cointab(pos).x; + coup.y:=cointab(pos).y; + coup.h:=1; + + if pl.jeu(coup.x,coup.y,coup.h)=free then + coin:=coin-1;poid:=poid+20; + if coin=0 then coinlibre:=false; fi; + exit; fi; + + od; + fi; + poid:=(-poid); + e:=new element; + e.x:=poid; e.i:=coup.x;e.j:=coup.y;e.h:=coup.h; + call mem.inserer(e); + + fi; + od; + od; +end; + +unit combinaison:class; + var nb:integer, + possible:boolean; + + unit incremente:function:integer; + begin + nb:=nb+1; + result:=nb; + end; + + unit plus:procedure; + begin + nb:=nb+1; + end; + + unit nbre_boule:function:integer; + begin + result:=nb; + end; + + unit elimine:procedure; + begin + possible:=false; + end; + +begin + nb:=0; + possible:=true; +END; + +begin + mem:=new arbtas; + array cointab dim(1:4); + cointab(1):=new coord2D(1,1); + cointab(2):=new coord2D(4,4); + cointab(3):=new coord2D(1,4); + cointab(4):=new coord2D(4,1); + coinlibre:=true; + coin:=4; + block + var i,j:integer; + begin + array adver dim (1:7); + array moi dim (1:7); + + array posajouer dim(1:4); + for i:=1 to 4 do + + array posajouer(i) dim(1:4); + + if (i<3) then + adver(i):=new info(4,4); + moi(i):=new info(4,4); + else + adver(i):=new info(4,2); + moi(i):=new info(4,2); + fi; + + od; + adver(5):=new info(4,4); + moi(5):=new info(4,4); + adver(6):=new info(4,2); + moi(6):=new info(4,2); + adver(7):=new info(2,2); + moi(7):=new info(2,2); + + + for i:=1 to 4 do + for j:=1 to 4 do + posajouer(i,j):=1; + od; + od; + end; + + return; + place:=new coord3D(1,1,1); + DO + find:=false; + call pl.arrow.ligne(pl.line,0); + call pl.arrow.colonne(pl.col,0); + + (*****************************************) + (* elimination de quelques combinaisons *) + (*****************************************) + if pl.haut<>0 then + call addcombinaison(adver,pl.line,pl.col,pl.haut); + call delcombinaison(moi,pl.line,pl.col,pl.haut); + posajouer(pl.line,pl.col):=posajouer(pl.line,pl.col)+1; + + + (*********************************) + (*** est ce que j'ai gagne ? !!!!*) + (*********************************) + + find:=troisboules(moi,place); + + (*********************************) + (* contre des 3 boules align‚es *) + (*********************************) + if (pl.haut=1 and + ((pl.line=4 or pl.line=1) and (pl.col=1 or pl.col=4))) then + coin:=coin-1; fi; + if coin=0 then coinlibre:=false; fi; + + if not find then + + if (adver(1).rangee(pl.line,pl.haut).nbre_boule=3) and + (adver(1).rangee(pl.line,pl.haut).possible) then + find:=find_place(1,0,pl.line,pl.haut,place); + + fi; + if (adver(2).rangee(pl.col,pl.haut).nbre_boule=3) and + (adver(2).rangee(pl.col,pl.haut).possible) then + find:=find_place(2,0,pl.col,pl.haut,place); + + fi; + if (adver(5).rangee(pl.line,pl.col).nbre_boule=3) and + (adver(5).rangee(pl.line,pl.col).possible) then + find:=find_place(5,0,pl.line,pl.col,place); + + fi; + + if isindiag(pl.col,pl.haut,quel) then + + if (adver(3).rangee(pl.line,quel).nbre_boule=3) and + (adver(3).rangee(pl.line,quel).possible) then + find:=find_place(3,quel,pl.line,pl.haut,place); + fi; + fi; + if isindiag(pl.line,pl.haut,quel) then + + if (adver(4).rangee(pl.col,quel).nbre_boule=3) and + (adver(4).rangee(pl.col,quel).possible) then + find:=find_place(4,quel,pl.col,pl.haut,place); + fi; + + fi; + if isinbigdiag(pl.line,pl.col,quel) then + if (adver(6).rangee(pl.haut,quel).nbre_boule=3) and + (adver(6).rangee(pl.haut,quel).possible) then + find:=find_place(6,quel,pl.line,pl.haut,place); + fi; + fi; + if isintwodiag(pl.line,pl.col,pl.haut,quel,version) then + if (adver(7).rangee(quel,version).nbre_boule=3) and + (adver(7).rangee(quel,version).possible) then + find:=find_place(7,0,quel,version,place); + fi; + fi; + fi; + + fi; + (******************************************) + (* jouer les coins du niveau 1 en premier *) + (******************************************) + + + IF not find then + + + (*********************) + (* quel coup jouer ? *) + (*********************) + call stratego; (* evaluation de toutes les combinaisons*) + call selectcoup(place); (* choisi un coup a jouer *) + + FI; + + (*****************************************) + (* on incremente le nombre de boules... *) + (*****************************************) + call addcombinaison(moi,place.x,place.y,place.h); + call delcombinaison(adver,place.x,place.y,place.h); + posajouer(place.x,place.y):=posajouer(place.x,place.y)+1; + + + + if pl.enfiler(place.x,place.y,couleur) then + call pl.arrow.ligne(place.x,blanc); + call pl.arrow.colonne(place.y,blanc); + fi; + + + detach; + od; +end; + +UNIT humain:player COROUTINE; + var i,j:integer; + begin + i,j:=1; + return; + do + + do + + call pl.arrow.selectaxe(i,j); + if pl.enfiler(i,j,couleur) then exit; fi; + od; + detach; + od; + + end; + +UNIT joueurs:class; +var couleur:integer, + joueur:player, + nom:arrayof char; +begin +array nom dim(1:8); +end; + + +UNIT controle:iiuwgraph coroutine(equipe:arrayof joueurs,pl:Plateau_Jeu); +var tour:integer, + aux: arrayof arrayof arrayof integer, + difference: pile, + pion:elem; + + + UNIT AquiLeTour:procedure; + begin + tour:=tour+1; + if tour=3 then tour:=1; fi; + end; + + UNIT copie_jeu:procedure; + var k:integer; + begin + for k:=1 to 4 + do + aux(pl.line,pl.col,k):=pl.jeu(pl.line,pl.col,k); + od; + end; + + UNIT coup:function:boolean; + var i,j,k,n,c:integer; + + begin + call pl.arrow.ligne(pl.line,0); + call pl.arrow.colonne(pl.col,0); + + n:=0; + for i:=1 to 4 + do + for j:=1 to 4 + do + for k:=1 to 4 + do + if (pl.jeu(i,j,k)<>aux(i,j,k)) then + + n:=n+1; + pion:=new elem(i,j,k); + call difference.empiler(pion); + fi; + od; + od; + od; + + if n>1 or n=0 then result:=false; + else + + pion:=difference.sommet; + if pl.jeu(pion.i,pion.j,pion.k)=equipe(tour).couleur then + result:=true; + pl.line:=pion.i;pl.col:=pion.j;pl.haut:=pion.k; + call pl.arrow.ligne(pl.line,blanc); + call pl.arrow.colonne(pl.col,blanc); + + else result:=false; + fi; + + fi; + end; + +unit alignee_ligne:function(couleur:integer):integer; +var a,n:integer; +begin + n:=0; + for a:=1 to 4 + do + + if pl.jeu(a,pion.j,pion.k)=couleur then n:=n+1; fi; + od; + result:=n; +end; + +unit colhaut:function(couleur:integer):integer; +var a,n:integer; +begin + n:=0; + for a:=1 to 4 + do + + if pl.jeu(pion.i,pion.j,a)=couleur then n:=n+1; fi; + od; + result:=n; +end; + + +unit alignee_colonne:function(couleur:integer):integer; +var j,n:integer; +begin + n:=0; + for j:=1 to 4 + do + if pl.jeu(pion.i,j,pion.k)=couleur then n:=n+1; fi; + od; + result:=n; +end; + +unit diag_colonne:function(dir,couleur:integer):integer; +var k,i,n:integer; +begin + + n:=0;i:=1; + if dir=-1 then k:=4; + else k:=1; + fi; + for i:=1 to 4 + do + if pl.jeu(i,pion.j,k)=couleur then n:=n+1; fi; + k:=k+(1*dir); + od; + result:=n; +end; + +unit diagonnale: function(quel,couleur:integer):integer; +var n,j,i:integer; + +begin + n:=0; + if quel=11 then + j:=1; + for i:=1 to 4 + do + if pl.jeu(i,j,pion.k)=couleur then n:=n+1; fi; + j:=j+1; + od; + else + j:=1; + for i:=4 downto 1 + do + if pl.jeu(i,j,pion.k)=couleur then n:=n+1; fi; + j:=j+1; + od; + fi; + result :=n; + +end; + +unit doublediagonnale: function(quel,dir,couleur:integer):integer; +var n,i,j,k:integer; + +begin + + n:=0;i:=1; + if dir=-1 then k:=4; + else k:=1; + fi; + + if quel=11 then + j:=1; + for i:=1 to 4 + do + if pl.jeu(i,j,k)=couleur then n:=n+1; fi; + j:=j+1;k:=k+(1*dir); + od; + else + j:=1; + for i:=4 downto 1 + do + if pl.jeu(i,j,k)=couleur then n:=n+1; fi; + j:=j+1; k:=k+(1*dir); + od; + fi; + result :=n; + +end; + + +unit diag_ligne:function(dir,couleur:integer):integer; +var k,j,n:integer; +begin + + n:=0;j:=1; + if dir=-1 then k:=4; + else k:=1; + fi; + for j:=1 to 4 + do + if pl.jeu(pion.i,j,k)=couleur then n:=n+1; fi; + k:=k+(1*dir); + od; + result:=n; +end; + + +UNIT gagne:function:boolean; +const droite=-1,gauche=1; +var rangee:boolean; + + + begin + pion:=difference.sommet; + rangee:=false; + if alignee_ligne(equipe(tour).couleur)=4 then rangee:=true; fi; + if alignee_colonne(equipe(tour).couleur)=4 then rangee:=true; fi; + if diag_colonne(droite,equipe(tour).couleur)=4 then rangee:= true;fi; + if diag_colonne(gauche,equipe(tour).couleur)=4 then rangee:=true; fi; + if diag_ligne(droite,equipe(tour).couleur)=4 then rangee:= true; fi; + if diag_ligne(gauche,equipe(tour).couleur)=4 then rangee:= true; fi; + + if colhaut(equipe(tour).couleur)=4 then rangee:=true; fi; + + if diagonnale(11,equipe(tour).couleur)=4 then rangee:=true; fi; + if doublediagonnale(11,droite,equipe(tour).couleur)=4 then rangee:=true;fi; + if doublediagonnale(11,gauche,equipe(tour).couleur)=4 then rangee:=true; fi; + if diagonnale(41,equipe(tour).couleur)=4 then rangee:=true; fi; + if doublediagonnale(41,droite,equipe(tour).couleur)=4 then rangee:=true; fi; + if doublediagonnale(41,gauche,equipe(tour).couleur)=4 then rangee:=true; fi; + + result:=rangee; + call difference.depiler; (* pile est maintenant vide *) + end; + + + + +UNIT restore:procedure; + begin + while (not (difference.vide)) do + pion:=difference.sommet; + pl.jeu(pion.i,pion.j,pion.k):=aux(pion.i,pion.j,pion.k); + call pl.boulle(pion.i,pion.j,pion.k,aux(pion.i,pion.j,pion.k)); + call difference.depiler; + od; + end; + +UNIT nom_joueur: gestion_caractere procedure(nom:arrayof char,couleur:integer); + var i,j:integer; + begin + call dialog1; + call color(couleur); + for i:=1 to 20 + do + call move(430,240+i); + call draw(450,240+i); + od; + call displaystring(nom,460,245,blanc); + end; + +begin + block + var i,j,k:integer; + begin + array aux dim(1:4); + + for i:=1 to 4 + do + array aux(i) dim(1:4); + for j:=1 to 4 + do + array aux(i,j) dim (1:4); + od; + od; + + + + for i:=1 to 4 + do + for j:=1 to 4 + do + for k:=1 to 4 + do + aux(i,j,k):=-1; + od; + od; + od; + + end; + + difference:=new pile; + call pl.initialisation; + tour:=0; + return; + + do + call AquiLeTour; + do + call nom_joueur(equipe(tour).nom,equipe(tour).couleur); + if equipe(tour).joueur is humain then + call move(450,300); + call outstring("A VOTRE TOUR !"); fi; + attach(equipe(tour).joueur); + call color(0); + call move(450,300); + call outstring(" "); + if coup then exit; + else call restore; fi; + od; + if gagne then attach(main); + else call copie_jeu; fi; + od; +END; + +UNIT pause: IIUWGRAPH procedure(t:string,x,y,couleur:integer); +var c:integer; +begin + call move(x,y); + call color(couleur); + call outstring(t); + c:=inkey; + do + if c<>0 then exit; fi; + c:=inkey; + od; +end; + + +UNIT Plateau_Jeu: IIUWGRAPH class; + + VAR grille:arrayof arrayof coord2D, + line,col,haut:integer, + jeu: arrayof arrayof arrayof integer; + + UNIT cadre: procedure; + begin + + call move(179,321); + call draw(392,250); + call draw(282,140); + call draw(69,211); + call draw(179,321); + + end; + + + UNIT ombre: procedure(cx,cy,cxx,cyy,fill_color:integer); + var x,y,xx,yy,i:integer; + begin + call move(cx,cy); + call draw(cxx,cyy); + xx:=cxx; + yy:=cyy; + x:=cx; + y:=cy; + for i:=1 to 109 + do + x:=x+1; + y:=y+1; + xx:=xx+1; + yy:=yy+1; + call move(x,y); + call draw(xx,yy); + od; + end; + + UNIT enlever:procedure(a,b:integer); + var niveau:integer, + occupe:boolean; + begin + niveau:=4; + occupe:=false; + while not occupe do + occupe:=(jeu(a,b,niveau)<>free); + if not occupe then + niveau:=niveau-1; + fi; + od; + jeu(a,b,niveau):=free; + end; + + UNIT enfiler:function(a,b,couleur:integer):boolean; + var niveau,c:integer, + libre:boolean; + begin + niveau:=5; + libre:=true; + while libre do + niveau:=niveau-1; + if niveau<>0 then + libre:= (jeu(a,b,niveau)=-1); + else libre:=false; + fi; + od; + + niveau:=niveau+1; + if niveau=5 then result:=false; + else + jeu(a,b,niveau):=couleur; + call boulle(grille(b,a).x,grille(b,a).y,niveau,couleur); + result:=true; + fi; + end; + + + UNIT boulle:procedure(x,y,h,couleur:integer); + + begin + call color(couleur); + call move(x,y-(26*(h-1))); + call draw(x,y-(26*(h-1))-26); + call move(x+1,y-(26*(h-1))-1); + call draw(x+1,y-(26*(h-1))-26); + call move(x-1,y-(26*(h-1))-1); + call draw(x-1,y-(26*(h-1))-26); + call move(x+1,y-(26*(h-1))+1); + call draw(x+1,y-(26*(h-1))-26); + end; + + + UNIT axe: procedure(x,y:integer); + begin + call move(x+1,y-1); + call draw(x+1,y-108); + call move(x,y); + call draw(x,y-108); + call move(x-1,y-1); + call draw(x-1,y-108); + call move(x+1,y+1); + call draw(x+1,y-108); + end; + + UNIT plan: procedure(x,y,i:integer); + var xx,yy:integer; + begin + xx:=x; + yy:=y; + call axe(xx,yy); + grille(i,1):=new coord2D(xx,yy); + xx:=xx-42; + yy:=yy-42; + call axe(xx,yy); + grille(i,2):=new coord2D(xx,yy); + + call move(xx,yy); + call draw(136,278); + + xx:=xx-26; + yy:=yy-26; + call axe(xx,yy); + grille(i,3):=new coord2D(xx,yy); + call move(xx,yy); + call draw(110,252); + + xx:=xx-41; + yy:=yy-41; + call axe(xx,yy); + grille(i,4):=new coord2D(xx,yy); + call move(xx,yy); + call draw(x,y); + + end; + + + unit rangee: procedure; + + begin + call plan(round(213*0.38)+178,round(-71*0.38)+320,2); + call plan(round(213*0.65)+178,round(-71*0.65)+320,3); + call plan(213+178,-71+320,4); + end; + + + UNIT initialisation:procedure; + var i,j,k:integer; + begin + for i:=1 to 4 + do + for j:=1 to 4 + do + for k:=1 to 4 + do + jeu(i,j,k):=-1; + od; + od; + od; + for i:=1 to 4 + do + for j:=1 to 4 + do + call boulle(grille(i,j).x,grille(i,j).y,3,blanc); + call boulle(grille(i,j).x,grille(i,j).y,1,blanc); + call boulle(grille(i,j).x,grille(i,j).y,4,blanc); + call boulle(grille(i,j).x,grille(i,j).y,2,blanc); + + od; + od; + + end; + + + UNIT fleche: class; + + var + tab_coord:arrayof arrayof coord2D; + + unit ligne:procedure(i,couleur:integer); + + var y1:integer; + + begin + call color(couleur); + + y1:=(-(tab_coord(1,i).x-20)+tab_coord(1,i).x+3*tab_coord(1,i).y)div 3; + call move(tab_coord(1,i).x,tab_coord(1,i).y); + call draw(tab_coord(1,i).x-20,y1); + + y1:=(-(tab_coord(1,i).x-5)+tab_coord(1,i).x+3*tab_coord(1,i).y)div 3; + call move(tab_coord(1,i).x-5-3,y1-3); + call draw(tab_coord(1,i).x,tab_coord(1,i).y); + + call move(tab_coord(1,i).x,tab_coord(1,i).y+5); + call draw(tab_coord(1,i).x,tab_coord(1,i).y); + end; + + unit colonne:procedure(i,couleur:integer); + + begin + call color(couleur); + call move(tab_coord(2,i).x,tab_coord(2,i).y); + call draw(tab_coord(2,i).x+15,tab_coord(2,i).y+15); + + call move(tab_coord(2,i).x,tab_coord(2,i).y); + call draw(tab_coord(2,i).x+5,tab_coord(2,i).y); + + call move(tab_coord(2,i).x,tab_coord(2,i).y); + call draw(tab_coord(2,i).x,tab_coord(2,i).y+5); + + end; + + + UNIT SelectAxe:procedure(inout i,j:integer); + const droite=-77,gauche=-75,hauts=-72,bas=-80,retour=13; + var key:integer; + begin + call drawrect(0,0,413,349,rouge); + call ligne(line,15); + call colonne(col,15); + do + do + key:=inkey; + if key<>0 then exit; fi; + od; + + case key + when hauts : call ligne(line,0); + if line+1<=4 then + line:=line+1;fi; + call ligne(line,15); + when bas : call ligne(line,0); + if line-1>=1 then + line:=line-1; fi; + call ligne(line,15); + when gauche : call colonne(col,0); + if col-1>=1 then + col:=col-1; fi; + call colonne(col,15); + when droite : call colonne(col,0); + if col+1<=4 then + col:=col+1; fi; + call colonne(col,15); + when retour : i:=line; + j:=col; + exit; + esac; + od; + call ligne(line,0); + call colonne(col,0); + call drawrect(0,0,413,349,blanc); + end; + + + begin + array tab_coord dim(1:2); + for line:=2 downto 1 + do + array tab_coord(line) dim(1:4); + od; + line:=line+1; + tab_coord(1,4):=new coord2D(53,219); + tab_coord(1,3):=new coord2D(92,258); + tab_coord(1,2):=new coord2D(116,282); + tab_coord(1,1):=new coord2D(160,326); + tab_coord(2,1):=new coord2D(190,332); + tab_coord(2,2):=new coord2D(271,305); + tab_coord(2,3):=new coord2D(328,286); + tab_coord(2,4):=new coord2D(398,256); + + end; + + + var arrow:fleche; + +BEGIN + block + var i,j:integer; + begin +call gron(1); + +array grille dim(1:4); + +for i:=1 to 4 + do + array grille(i) dim(1:4); + od; + +array jeu dim(1:4); + +for i:=1 to 4 + do + array jeu(i) dim(1:4); + for j:=1 to 4 + do + array jeu(i,j) dim (1:4); + od; + od; + + +call color(grisfonce); +call ombre(69,223,282,152,4); +call color(grisclair); +call ombre(69,211,282,140,0); + +call color(blanc); +call plan(178,320,1); +call rangee; +call cadre; +call move(440,10); +call outstring("PUISSANCE 4 CHINOIS"); + +call drawrect(418,220,620,349,blanc); +call drawrect(0,0,413,349,blanc); +line,col:=2; +haut:=0; +arrow:= new fleche; +end; +END; (* fin Plateau_Jeu *) + +UNIT menu: gestion_caractere function:integer; +var choix:integer; +begin + call dialog2; + call drawrect(418,220,620,349,blanc); + call drawrect(418,50,620,200,rouge); + call color(blanc); + call move(480,60); + call outstring(" OPTIONS "); + call move(420,80); + call outstring("[1] Un joueur"); + call move(420,100); + call outstring("[2] Deux joueurs"); + call move(420,120); + call outstring("[0] Quitter"); + call move(470,180); + call outstring("Votre choix :"); + do + choix:=ConvENT(saisie(1,1,570,180)); + if choix>=0 and choix<=2 then exit; fi; + od; + result:=choix; + call drawrect(418,50,620,200,blanc); + call drawrect(418,220,620,349,rouge); +end; +UNIT withwho: gestion_caractere function:integer; +var choix:integer; +begin + call dialog2; + call drawrect(418,220,620,349,blanc); + call drawrect(418,50,620,200,rouge); + call color(blanc); + call move(480,60); + call outstring(" OPTIONS "); + call move(420,80); + call outstring("[1] Ordinateur"); + call move(440,90); + call outstring(" contre Vous"); + call move(420,110); + call outstring("[2] Ordinateur"); + call move(440,120); + call outstring(" contre Ordinateur"); + + call move(420,140); + call outstring("[0] Retour"); + call move(470,180); + call outstring("Votre choix :"); + do + choix:=ConvENT(saisie(1,1,570,180)); + if choix>=0 and choix<=2 then exit; fi; + od; + result:=choix; + call drawrect(418,50,620,200,blanc); + call drawrect(418,220,620,349,rouge); +end; + +UNIT dialog1:iiuwgraph procedure; +var i:integer; +begin + call color(0); + for i:=1 to 108 + do + call move(419,220+i); + call draw(619,220+i); + od; + +end; +UNIT dialog2:iiuwgraph procedure; +var i:integer; +begin + call color(0); + for i:=1 to 148 + do + call move(419,51+i); + call draw(619,51+i); + od; + +end; + +UNIT name:gestion_caractere function(i:integer):arrayof char; +begin + + call dialog1; + call drawrect(418,220,620,349,rouge); + call color(blanc); + call move(420,230); + if i=1 then + call outstring("Nom du joueur 1:"); + else call outstring("Nom du joueur 2:"); + fi; + result:=saisie(2,8,430,250); + call drawrect(418,220,620,349,blanc); +end; + +UNIT whostart:gestion_caractere function:integer; +var i,c,a:integer; +begin + call dialog1; + call drawrect(418,220,620,349,rouge); + call color(blanc); + call move(420,230); + call outstring(" Voulez-vous que"); + call move(420,240); + call outstring("je commence la partie ?"); + i:=1; + call move(440,260); + call color(grisfonce); + call outstring("NON"); + call move(540,260); + call color(grisclair); + call outstring("OUI"); + + c:=inkey; + while c<>13 do + if c<>0 then + i:=i+1; + if i>2 then i:=1; fi; + + case i + when 1:call move(440,260); + call color(grisfonce); + call outstring("NON"); + call move(540,260); + call color(grisclair); + call outstring("OUI"); + when 2:call move(440,260); + call color(grisclair); + call outstring("NON"); + call move(540,260); + call color(grisfonce); + call outstring("OUI"); + esac; + fi; + c:=inkey; + od; + result:=i; +end; + +unit thegame: gestion_caractere procedure; +var a:integer; +begin + call dialog2; + call displaystring(team(1).nom,430,90,bleuroi); + call move(490,120); + call color(blanc); + call outstring("contre"); + call displaystring(team(2).nom,530,150,bleuroi); +end; + + +UNIT quelcouleur:gestion_caractere function(t:arrayof char):integer; +const droite=-77,gauche=-75; +var i,c,a:integer; +begin + call dialog1; + call drawrect(418,220,620,349,rouge); + call displaystring(t,420,230,blanc); + + call move(440,250); + call outstring("Boule:"); + c:=inkey; + i:=1;a:=2; + if i=boule then + i:=i+1; + a:=a+1 fi; + + call move(500,250); + call color(i); + call outstring(""); + call displaystring(unpack("->:couleur suivante"),420,310,grisfonce); + call displaystring(unpack("<-:couleur pr‚c‚dente"),420,320,grisfonce); + while c<>13 do + if c<>0 then + case c + when droite: + i:=i+1; + if i>14 then i:=1; fi; + if i=boule then + i:=i+1; fi; + if i>14 then i:=1; fi; + when gauche: + i:=i-1; + if i<1 then i:=14; fi; + if i=boule then i:=i-1;fi; + if i<1 then i:=14; fi; + esac; + + fi; + if i<>a then + a:=i; + call move(500,250); + call color(i); + call outstring(""); + fi; + c:=inkey; + od; + result:=i; + call drawrect(418,220,620,349,blanc); +end; + +signal quitter,gagner; +VAR plateau:plateau_jeu, + team: arrayof joueurs, + c,i,j,boule:integer, + partie:boolean, + arbitre:controle; + +handlers + when quitter: + pref iiuwgraph block + begin + kill(arbitre); + kill(team(1).joueur); + kill(team(2).joueur); + kill(team(1)); + kill(team(2)); + call groff; + end; + wind; + when gagner: + pref iiuwgraph block + begin + kill(team(1).joueur); + kill(team(2).joueur); + kill(arbitre); + call color(0); + call move(450,270); + call outstring(" "); + + call color(rouge); + call move(500,270); + call outstring(" A GAGNE !"); + end; + return; + + +end; + + +BEGIN +plateau:=new plateau_jeu; +array team dim(1:2); + + team(1):=new joueurs; + team(2):=new joueurs; +pref gestion_caractere block + +begin +do + boule:=0; + partie:=false; + case menu + when 2:team(1).nom:=name(1); + team(1).couleur:=quelcouleur(team(1).nom); + boule:=team(1).couleur; + team(1).joueur:=new humain(team(1).couleur,plateau); + team(2).nom:=name(2); + team(2).couleur:=quelcouleur(team(2).nom); + team(2).joueur:=new humain(team(2).couleur,plateau); + partie:=true; + + when 1: + case withwho + when 1: + case whostart + when 2:team(1).nom:=name(1); + team(1).couleur:=quelcouleur(team(1).nom); + boule:=team(1).couleur; + team(1).joueur:=new humain(team(1).couleur,plateau); + team(2).nom:=unpack("COMPUTER"); + team(2).couleur:=quelcouleur(team(2).nom); + team(2).joueur:=new ordi(team(2).couleur,plateau); + partie:=true; + + when 1:team(2).nom:=name(2); + team(2).couleur:=quelcouleur(team(2).nom); + boule:=team(2).couleur; + team(2).joueur:=new humain(team(2).couleur,plateau); + team(1).nom:=unpack("COMPUTER"); + team(1).couleur:=quelcouleur(team(1).nom); + team(1).joueur:=new ordi(team(1).couleur,plateau); + partie:=true; + + esac; + when 2:team(1).nom:=unpack("Computer1"); + team(1).couleur:=quelcouleur(team(1).nom); + boule:=team(1).couleur; + team(1).joueur:=new ordi(team(1).couleur,plateau); + team(2).nom:=unpack("Computer2"); + team(2).couleur:=quelcouleur(team(2).nom); + team(2).joueur:=new ordi(team(2).couleur,plateau); + partie:=true; + esac; + when 0: raise quitter; + + + esac; + if partie then + call thegame; + arbitre:=new controle(team,plateau); + attach(arbitre); + raise gagner; + kill(arbitre); + fi; + od; + +end; + +END; diff --git a/examples/jeu/pina.pcd b/examples/jeu/pina.pcd new file mode 100644 index 0000000000000000000000000000000000000000..82ac8c1aedba62a43d18b84ac81af4e2073ad19c GIT binary patch literal 5456 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 literal 0 HcmV?d00001 diff --git a/examples/jeu/reversi.ccd b/examples/jeu/reversi.ccd new file mode 100644 index 0000000000000000000000000000000000000000..6a91e4ce39d3c301515048738fe7714a323b5549 GIT binary patch literal 21700 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 literal 0 HcmV?d00001 diff --git a/examples/jeu/reversi.log b/examples/jeu/reversi.log new file mode 100644 index 0000000..5f5f016 --- /dev/null +++ b/examples/jeu/reversi.log @@ -0,0 +1,764 @@ +PROGRAM Reversi; + +(*** 2ø PROJET DE LI1 DU BINOME : LAPORTE-FAURET Olivier + GOUDOU Pascal ***) + +CONST noir=0, bleu=1, rouge=4, jaune=14, blanc=15, + bas_g=1, gauche=2, haut_g=3, haut=4, + haut_d=5, droite=6, bas_d=7, bas=8; + +VAR nb_rouges,nb_bleus,libre : INTEGER, + grille : ARRAYOF ARRAYOF rectangle, + gr_prio : ARRAYOF ARRAYOF INTEGER, + meill_coup : ARRAYOF infos, + som_prio,nb_pions_pris : INTEGER, + ligne,colonne : INTEGER; + + + +(***********************************************************************) + +UNIT points : CLASS; +VAR x,y : INTEGER; +END points; + +(***********************************************************************) + +UNIT rectangle : CLASS; +VAR p1, p2 : points, + occupe : INTEGER; +END rectangle; + +(***********************************************************************) + +UNIT infos : CLASS; +VAR sens : INTEGER, + li,co : INTEGER; +END infos; + +(***********************************************************************) + +UNIT affiche_grille : PROCEDURE; + + UNIT init_grille : PROCEDURE; + (*** Cette proc‚dure permet d'initialiser les grilles et les tableaux + n‚cessaires au bon d‚roulement du programme. ***) + + VAR i,j,icks,igrec : INTEGER; + BEGIN + (* initialisation de la grille devant contenir les pions rouges et bleus *) + ARRAY grille DIM (1:8); + FOR i:=1 TO 8 + DO + ARRAY grille(i) DIM (1:8); + OD; + igrec:=40; + FOR i:=1 TO 8 + DO + icks:=10; + FOR j:=1 TO 8 + DO + grille(i,j):=NEW rectangle; + grille(i,j).p1:=NEW points; + grille(i,j).p2:=NEW points; + grille(i,j).p1.x:=icks; + grille(i,j).p1.y:=igrec; + grille(i,j).p2.x:=icks+36; + grille(i,j).p2.y:=igrec+30; + grille(i,j).occupe:=noir; + icks:=icks+36; + OD; + igrec:=igrec+30; + OD; + (* initialisation de la grille des priorit‚s *) + ARRAY gr_prio dim (1:8); + FOR i:=1 TO 8 + DO + ARRAY gr_prio(i) DIM (1:8); + OD; + gr_prio(1,1):=20; + gr_prio(1,8):=20; + gr_prio(8,1):=20; + gr_prio(8,8):=20; + gr_prio(1,3):=14; + gr_prio(1,6):=14; + gr_prio(8,3):=14; + gr_prio(8,6):=14; + gr_prio(3,1):=14; + gr_prio(6,1):=14; + gr_prio(3,8):=14; + gr_prio(6,8):=14; + gr_prio(1,4):=12; + gr_prio(1,5):=12; + gr_prio(8,4):=12; + gr_prio(8,5):=12; + gr_prio(4,1):=12; + gr_prio(5,1):=12; + gr_prio(4,8):=12; + gr_prio(5,8):=12; + gr_prio(1,2):=9; + gr_prio(1,7):=9; + gr_prio(8,2):=9; + gr_prio(8,7):=9; + gr_prio(2,1):=9; + gr_prio(7,1):=9; + gr_prio(2,8):=9; + gr_prio(7,8):=9; + gr_prio(3,3):=6; + gr_prio(3,6):=6; + gr_prio(6,3):=6; + gr_prio(6,6):=6; + gr_prio(3,4):=4; + gr_prio(3,5):=4; + gr_prio(6,4):=4; + gr_prio(6,5):=4; + gr_prio(4,3):=4; + gr_prio(5,3):=4; + gr_prio(4,6):=4; + gr_prio(5,6):=4; + gr_prio(2,3):=2; + gr_prio(2,4):=2; + gr_prio(2,5):=2; + gr_prio(2,6):=2; + gr_prio(7,3):=2; + gr_prio(7,4):=2; + gr_prio(7,5):=2; + gr_prio(7,6):=2; + gr_prio(3,2):=2; + gr_prio(4,2):=2; + gr_prio(5,2):=2; + gr_prio(6,2):=2; + gr_prio(3,7):=2; + gr_prio(4,7):=2; + gr_prio(5,7):=2; + gr_prio(6,7):=2; + gr_prio(4,4):=2; + gr_prio(4,5):=2; + gr_prio(5,4):=2; + gr_prio(5,5):=2; + gr_prio(2,2):=1; + gr_prio(2,7):=1; + gr_prio(7,2):=1; + gr_prio(7,7):=1; + END init_grille; + + UNIT cercles_au_centre : PROCEDURE; + VAR i,j : INTEGER; + BEGIN + CALL dessine_cercle(4,4,rouge); + CALL dessine_cercle(4,5,bleu); + CALL dessine_cercle(5,4,bleu); + CALL dessine_cercle(5,5,rouge); + nb_rouges:=2; nb_bleus:=2; libre:=60; + END cercles_au_centre; + + UNIT chiffres : IIUWGRAPH PROCEDURE; + VAR i,col,lig : INTEGER; + BEGIN + CALL COLOR(blanc); + col:=28; + FOR i:=49 TO 56 + DO + CALL MOVE(col,30); + CALL HASCII(i); + col:=col+36; + OD; + lig:=55; + FOR i:=49 TO 56 + DO + CALL MOVE(0,lig); + CALL HASCII(i); + lig:=lig+30; + OD; + END chiffres; + + UNIT quadrillage : IIUWGRAPH PROCEDURE; + VAR col,lig : INTEGER; + BEGIN + CALL COLOR(blanc); + col:=10; + WHILE col<=298 + DO + CALL MOVE(col,40); + CALL DRAW(col,280); + col:=col+36; + OD; + lig:=40; + WHILE lig<=280 + DO + CALL MOVE(10,lig); + CALL DRAW(296,lig); + lig:=lig+30; + OD; + END quadrillage; + +VAR col,lig,tch : INTEGER; +BEGIN + CALL init_grille; + CALL quadrillage; + CALL cercles_au_centre; + CALL chiffres; +END affiche_grille; + +(***********************************************************************) + +UNIT dessine_cercle : IIUWGRAPH PROCEDURE(ptx,pty,couleur : INTEGER); +VAR cx,cy : INTEGER; +BEGIN + PREF MOUSE BLOCK + BEGIN + CALL COLOR(couleur); + cx:=(grille(ptx,pty).p1.x + grille(ptx,pty).p2.x)/2; + cy:=(grille(ptx,pty).p1.y + grille(ptx,pty).p2.y)/2; + CALL HIDECURSOR; + CALL CIRB(cx,cy,16,0.0,0.0,couleur,1,1,1); + CALL SHOWCURSOR; + grille(ptx,pty).occupe:=couleur; + END; +END dessine_cercle; + +(***********************************************************************) + +UNIT efface : IIUWGRAPH PROCEDURE(x,y : INTEGER); +VAR abscis : INTEGER; +BEGIN + CALL COLOR(noir); + CALL MOVE (x,y); + FOR abscis:=x TO 639 + DO + CALL OUTSTRING(" "); + CALL MOVE(abscis,y); + OD; +END efface; + +(***********************************************************************) + +UNIT texte : IIUWGRAPH PROCEDURE (x,y,c : INTEGER; s : STRING); +BEGIN + PREF MOUSE BLOCK + BEGIN + CALL COLOR(c); + CALL MOVE (x,y); + CALL OUTSTRING(s); + END; +END texte; + +(***********************************************************************) + +UNIT fill : IIUWGRAPH PROCEDURE (x,y,large,haut,couleur:INTEGER) ; +VAR i : INTEGER ; +BEGIN + CALL COLOR(couleur); + FOR i:=y TO y+haut + DO + CALL MOVE(x,i) ; + CALL DRAW(x+large,i) ; + OD ; +END fill; + +(***********************************************************************) + +UNIT saisie_rep : IIUWGRAPH PROCEDURE (couleur : INTEGER; + OUTPUT valeur : CHAR); +VAR c : INTEGER; +BEGIN + DO + c:=INKEY; + IF c=78 ORIF c=79 ORIF c=110 ORIF c=111 THEN EXIT FI; + (* N *) (* O *) (* n *) (* o *) + OD; + valeur:=CHR(c); + (*CALL COLOR(couleur); + CALL HASCII(c); + CALL pause(1);*) +END saisie_rep; + +(***********************************************************************) + +UNIT pause : PROCEDURE(seconde : INTEGER); +VAR temps:INTEGER; +BEGIN + FOR temps:=1 TO (1000*seconde) DO OD; +END pause; + + +(***********************************************************************) + +UNIT test_couleur : PROCEDURE(couleur : INTEGER); +BEGIN + IF couleur=rouge THEN + nb_rouges:=nb_rouges+1; + nb_bleus:=nb_bleus-1 + ELSE + nb_bleus:=nb_bleus+1; + nb_rouges:=nb_rouges-1; + FI; +END test_couleur; + +(***********************************************************************) +(* Dans les 4 proc‚dures qui suivent, les flŠches pr‚sentes sous les en_tˆtes + indiquent le sens dans lequel s'effectue la coloration *) + +UNIT diagonale_droite : PROCEDURE(xd,yd,xa,ya,colorie : INTEGER); +(* > *) +(* / *) +(* / *) +(* / *) +(* / *) +VAR i,j : INTEGER; +BEGIN + i:=xd; + j:=yd; + WHILE i>=xa AND j<=ya + DO + CALL dessine_cercle(i,j,colorie); + CALL test_couleur(colorie); + i:=i-1; + j:=j+1; + OD; +END diagonale_droite; + +(***********************************************************************) + +UNIT diagonale_gauche : PROCEDURE(xd,yd,xa,ya,colorie : INTEGER); +(* < *) +(* \ *) +(* \ *) +(* \ *) +(* \ *) +VAR i,j : INTEGER; +BEGIN + i:=xd; + j:=yd; + WHILE i>=xa AND j>=ya + DO + CALL dessine_cercle(i,j,colorie); + CALL test_couleur(colorie); + i:=i-1; + j:=j-1; + OD; +END diagonale_gauche; + +(***********************************************************************) + +UNIT verticale : PROCEDURE(xd,xa,y,colorie : INTEGER); +(* | *) +(* | *) +(* | *) +(* | *) +(* v *) +VAR i : INTEGER; +BEGIN + i:=xd; + WHILE i<=xa + DO + CALL dessine_cercle(i,y,colorie); + CALL test_couleur(colorie); + i:=i+1; + OD; +END verticale; + +(***********************************************************************) + +UNIT horizontale : PROCEDURE(x,yd,ya,colorie : INTEGER); +(* *) +(* *) +(* -----> *) +(* *) +(* *) +VAR j : INTEGER; +BEGIN + j:=yd; + WHILE j<=ya + DO + CALL dessine_cercle(x,j,colorie); + CALL test_couleur(colorie); + j:=j+1; + OD; +END horizontale; + +(***********************************************************************) + +UNIT cherche_intervalle : IIUWGRAPH PROCEDURE(abscis,ordon,couleur : INTEGER; + dessinez : BOOLEAN; + OUTPUT trouve : BOOLEAN); +VAR i,j,inverse : INTEGER, + somme,nb_pris,so,nbp : INTEGER; +BEGIN + IF couleur=rouge THEN inverse:=bleu ELSE inverse:=rouge FI; + IF ordon>2 THEN + (* recherche en bas … gauche *) + IF abscis<7 THEN + i:=abscis; j:=ordon; + DO + so:=so+gr_prio(i,j); + i:=i+1; j:=j-1; + IF i>8 ORIF j<1 THEN EXIT FI; + IF grille(i,j).occupe<>inverse THEN EXIT FI; + nbp:=nbp+1; + OD; + IF i<=8 ANDIF i<>abscis+1 ANDIF j>=1 ANDIF j<>ordon-1 + ANDIF grille(i,j).occupe=couleur THEN + somme:=so; nb_pris:=nbp; + trouve:=TRUE; + IF dessinez THEN + CALL diagonale_droite(i-1,j+1,abscis+1,ordon-1,couleur); + ELSE + IF couleur=rouge THEN RETURN FI; + FI; + FI; + FI; (*abscis<7*) + + (* recherche vers la gauche *) + so:=0; nbp:=0; + j:=ordon; + DO + so:=so+gr_prio(abscis,j); + j:=j-1; + IF j<1 THEN EXIT FI; + IF grille(abscis,j).occupe<>inverse THEN EXIT FI; + nbp:=nbp+1; + OD; + IF j>=1 ANDIF j<>ordon-1 ANDIF grille(abscis,j).occupe=couleur THEN + somme:=somme+so; nb_pris:=nb_pris+nbp; + trouve:=TRUE; + IF dessinez THEN + CALL horizontale(abscis,j+1,ordon-1,couleur); + ELSE + IF couleur=rouge THEN RETURN FI; + FI; + FI; + + (* recherche en haut … gauche *) + IF abscis>2 THEN + so:=0; nbp:=0; + i:=abscis; j:=ordon; + DO + so:=so+gr_prio(i,j); + i:=i-1; j:=j-1; + IF i<1 ORIF j<1 THEN EXIT FI; + IF grille(i,j).occupe<>inverse THEN EXIT FI; + nbp:=nbp+1; + OD; + IF i>=1 ANDIF i<>abscis-1 ANDIF j>=1 ANDIF j<>ordon-1 + ANDIF grille(i,j).occupe=couleur THEN + somme:=somme+so; nb_pris:=nb_pris+nbp; + trouve:=TRUE; + IF dessinez THEN + CALL diagonale_gauche(abscis-1,ordon-1,i+1,j+1,couleur); + ELSE + IF couleur=rouge THEN RETURN FI; + FI; + FI; + FI; (*abscis>2*) + FI; (*ordon>2*) + + (* recherche vers le haut *) + IF abscis>2 THEN + so:=0; nbp:=0; + i:=abscis; + DO + so:=so+gr_prio(i,ordon); + i:=i-1; + IF i<1 THEN EXIT FI; + IF grille(i,ordon).occupe<>inverse THEN EXIT FI; + nbp:=nbp+1; + OD; + IF i>=1 ANDIF i<>abscis-1 ANDIF grille(i,ordon).occupe=couleur THEN + somme:=somme+so; nb_pris:=nb_pris+nbp; + trouve:=TRUE; + IF dessinez THEN + CALL verticale(i+1,abscis-1,ordon,couleur); + ELSE + IF couleur=rouge THEN RETURN FI; + FI; + FI; + FI; (*abscis>2*) + + IF ordon<7 THEN + (* recherche en haut … droite *) + IF abscis>2 THEN + so:=0; nbp:=0; + i:=abscis; j:=ordon; + DO + so:=so+gr_prio(i,j); + i:=i-1; j:=j+1; + IF i<1 ORIF j>8 THEN EXIT FI; + IF grille(i,j).occupe<>inverse THEN EXIT FI; + nbp:=nbp+1; + OD; + IF i>=1 ANDIF i<>abscis-1 ANDIF j<=8 ANDIF j<>ordon+1 + ANDIF grille(i,j).occupe=couleur THEN + somme:=somme+so; nb_pris:=nb_pris+nbp; + trouve:=TRUE; + IF dessinez THEN + CALL diagonale_droite(abscis-1,ordon+1,i+1,j-1,couleur); + ELSE + IF couleur=rouge THEN RETURN FI; + FI; + FI; + FI; (*abscis>2*) + + (* recherche vers la droite *) + so:=0; nbp:=0; + j:=ordon; + DO + so:=so+gr_prio(abscis,j); + j:=j+1; + IF j>8 THEN EXIT FI; + IF grille(abscis,j).occupe<>inverse THEN EXIT FI; + nbp:=nbp+1; + OD; + IF j<=8 ANDIF j<>ordon+1 ANDIF grille(abscis,j).occupe=couleur THEN + somme:=somme+so; nb_pris:=nb_pris+nbp; + trouve:=TRUE; + IF dessinez THEN + CALL horizontale(abscis,ordon+1,j-1,couleur); + ELSE + IF couleur=rouge THEN RETURN FI; + FI; + FI; + + (* recherche en bas … droite *) + IF abscis<7 THEN + so:=0; nbp:=0; + i:=abscis; j:=ordon; + DO + so:=so+gr_prio(i,j); + i:=i+1; j:=j+1; + IF i>8 ORIF j>8 THEN EXIT FI; + IF grille(i,j).occupe<>inverse THEN EXIT FI; + nbp:=nbp+1; + OD; + IF i<=8 ANDIF i<>abscis+1 ANDIF j<=8 ANDIF j<>ordon+1 + ANDIF grille(i,j).occupe=couleur THEN + somme:=somme+so; nb_pris:=nb_pris+nbp; + trouve:=TRUE; + IF dessinez THEN + CALL diagonale_gauche(i-1,j-1,abscis+1,ordon+1,couleur) + ELSE + IF couleur=rouge THEN RETURN FI; + FI; + FI; + FI; (*abscis<7*) + FI; (*ordon<7*) + + (* recherche vers le bas *) + IF abscis<7 THEN + so:=0; nbp:=0; + i:=abscis; + DO + so:=so+gr_prio(i,ordon); + i:=i+1; + IF i>8 THEN EXIT FI; + IF grille(i,ordon).occupe<>inverse THEN EXIT FI; + nbp:=nbp+1; + OD; + IF i<=8 ANDIF i<>abscis+1 ANDIF grille(i,ordon).occupe=couleur THEN + somme:=somme+so; nb_pris:=nb_pris+nbp; + trouve:=TRUE; + IF dessinez THEN CALL verticale(abscis+1,i-1,ordon,couleur) FI; + FI; + FI; (*abscis<7*) + IF trouve ANDIF dessinez THEN + CALL dessine_cercle(abscis,ordon,couleur); + IF couleur=rouge THEN nb_rouges:=nb_rouges+1 + ELSE nb_bleus:=nb_bleus+1; + FI; + FI; + IF somme>=som_prio THEN + IF nb_pris>nb_pions_pris THEN + som_prio:=somme; + nb_pions_pris:=nb_pris; + ligne:=abscis; + colonne:=ordon; + FI; + FI; +END cherche_intervalle; + +(***********************************************************************) + + +UNIT cherche_case : PROCEDURE(abscis,ordon : INTEGER; + OUTPUT trouve : BOOLEAN); + + (* Cette proc‚dure va permettre de rechercher dans la matrice "grille", + la position du point de coordonn‚es (abscis,ordon) - ce point correspond + en fait au point de clic de la souris. La case ainsi obtenue se situe + … la ligne lig et en colonne col *) + +VAR verif : BOOLEAN, + lig,col : INTEGER; +BEGIN + FOR lig:=1 TO 8 + DO + IF grille(lig,1).p1.y<=ordon ANDIF ordon<=grille(lig,1).p2.y THEN + FOR col:=1 TO 8 + DO + IF grille(lig,col).p1.x<=abscis ANDIF + abscis<=grille(lig,col).p2.x THEN + IF grille(lig,col).occupe=noir THEN + CALL cherche_intervalle(lig,col,rouge,TRUE,trouve); + FI; + EXIT; + FI; + OD; + EXIT; + FI; + OD; +END cherche_case; + +(***********************************************************************) + +UNIT app_tch : IIUWGRAPH PROCEDURE; +VAR tch : INTEGER; +BEGIN + CALL texte(150,310,jaune,"APPUYER SUR ENTREE"); + DO + tch:=INKEY; + IF tch=13 THEN EXIT FI; + OD; +END app_tch; + +(***********************************************************************) + +UNIT resultat : PROCEDURE; +BEGIN + WRITELN("Rouges = ",nb_rouges :2 ,", Bleus = ",nb_bleus :2); + IF nb_rouges>nb_bleus THEN + WRITE("Les Rouges ont gagn‚ de ",nb_rouges-nb_bleus :2," point(s)") FI; + IF nb_rougesncJdB;CAr5;_Udp>u~W1zl7^q9BNr@StE` zLa{_R;_4E*Si#_Ac!@(_?*;fYTk_~Mc3F7T*zqNaiefIBHfZsQfv5_LftjXsc__> zPEnHnDjtM;7U^E;1hs@u{XyNWNVnt6?>BOL!es?PGvQFor+k?A6YfbuZi67~(u+hE zJ0;f-xWS~{+3rMA+*i!)JK8VDed8s^+6q{&x%QCt1umbm^FFilQW@*__ym_t+fMq$ zwA3}(;M~y;nRh&K`FPD)FvyS&%cYmftx%$ACYN1`^EtYJz&2F_M>v)O0 zH^{4bwtLO)peODr+$P+#>m5FFZW=U z(XwSbZ;4&8oa1wK2WAoNsN?RkJ63Mz^SppPxn-K;Zn9e`cTiis&&~+C zD|u?1vI*?VG+e*qCfOaSNZl(iSJCDjH_q;MMfUlkiqU1b4aZ$#w;AS{SzW+-`>OW* z8vP>mSMC3U^T<18IeCvtbhc`r(^0s0oy|OP9_@9?KAX{VaO1V6llRS|shX_UjE=w! ebVa$rE<0}+>xg$pxlDHl@3R>lf;-;(zxxL+X_l%0 literal 0 HcmV?d00001 diff --git a/examples/logic/gentzen.ccd b/examples/logic/gentzen.ccd new file mode 100644 index 0000000000000000000000000000000000000000..b92c57d64cb4f8fa0e6f9789b7dba451cbe452ed GIT binary patch literal 38598 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 110 Then + i:=i-1; + X:=X-8; + Call move(X,180); + Call Hascii(0); + Call texte(X,184,15,"-"); + Call move(X,180); + Fi; + When 0 : + If X < 486 Then + Call Hascii (0) ; + Call Hascii (d); + valeur(i):=chr(d); + i:=i+1; + X:=X+8; + Fi; + Otherwise + Call texte(105,258,15,"CaractŠre ill‚gal"); + Call texte(105,274,15,"Appuyez sur une touche pour continuer"); + while inkey=0 do od; + Call Fill (101,251,398,38,0) ; + Call move(110+(longueur*8),180); + esac; + if i=48 then + Call texte(105,258,15,"Chaine trop longue "); + Call texte(105,274,15,"Appuyez sur une touche pour continuer"); + while inkey=0 do od; + Call Fill (101,251,398,38,0) ; + Call move(110+(longueur*8),180); + fi; + od; + longueur:=i-1; +End; +End Chaine; + +(************************************************) +(* Analyseur lexical *) +(************************************************) + +(* Ces deux proc‚dures v‚rifient la validit‚ *) +(* syntaxique de la chaine *) + +Unit Evolution : procedure(inout etat:Integer; inout nbre:Integer; + inout nbcar:Integer; input c:Char); +Begin + case etat + when 1 : case c + when '(' : nbcar := 0; + nbre:=nbre+1; + etat := 1 ; + when 'a','b','c','d','x','y','z' : nbcar := nbcar + 1; + etat := 2 ; + when '|' : etat := 3 ; + otherwise etat := 0; + esac; + when 2 : case c + when '&','%','>' : etat := 1 ; + when ')' : nbcar := 0; + nbre:=nbre-1; + etat := 2 ; + otherwise etat := 0; + esac; + when 3 : case c + when '(' : nbre:=nbre+1; + etat := 1 ; + otherwise etat := 0; + esac; + esac; +End Evolution; + + +(*La fonction analyseur retourne un booleen selon que la formule + propositionnel est correcte ou non *) + + +Unit Analyseur : function(longueur : Integer) : Boolean; +Var etat,nbre,nbcar,i : Integer, + b : boolean, + c : Char; +Begin + B:=False; + etat:=1; + nbre:=0; + nbcar:=0; + i:=1; + while (( etat > 0 ) and (i <= longueur )) + do + c := valeur(i); + If C='>' Or C='&' Or C='%' Or C='|' Then B:=True; Fi; + call Evolution(etat,nbre,nbcar,c); + if nbcar>2 then + etat := -1; + fi; + i := i+1; + Od; + result:=false; + If Not B Then + Call Texte(105,266,15,"Erreur de s‚mantique"); + Else + case etat + when 0 : Call texte(105,266,15,"Erreur de syntaxe"); + when moinsun : Call texte(105,266,15, + "Chaine incorrecte, parenth‚sez vos expressions !"); + otherwise if nbre < 0 then + Call texte(105,266,15, + "Chaine incorrecte, caractŠre(s) ( absent(s)"); + else if nbre > 0 then + Call texte(105,266,15, + "Chaine incorrecte, caractŠre(s) ) absent(s)"); + fi; + fi; + esac; + If ((etat > 0) and (nbre=0)) then + Call texte(105,266,15,"Chaine correcte"); + result:=true; + Fi; + Fi; +End Analyseur; + +(***********************************************) +(* Impl‚mentation de la pile *) +(***********************************************) + +Unit Unepile : Class(type telem); +Var p1,p2 : Pile; + + Unit Link : Class; + Var next : Link, + valeur : telem; + End Link; + + Unit Pile : Class; + Var top : Link; + End Pile; + + Unit Push : Function (E : Telem ; S : Pile) : Pile; + Var aux : Link; + Begin + aux := New Link; + aux.valeur := E; + if Empty_Pile(S) + then + aux.next := None; + else + aux.next := S.top; + fi; + Result := New Pile; + result.top := aux; + End Push; + + Unit Empty_Pile : Function (S : Pile) : Boolean; + Begin + Result := (S=None); + End Empty_Pile; + + Unit Top : Function (S : Pile) : Telem; + Begin + Result := S.top.valeur; + End Top; + + Unit Down : Function (S : Pile) : Pile; + Begin + if s.top.next <> none + then Result := New Pile; + Result.top := S.top.next; + else + Result:=none; + fi; + End Down; + +End Unepile; + +(************************************************) +(* Recherche des operateurs principaux *) +(************************************************) + +(* Cette proc‚dure construit l'arbre associ‚ *) +(* la formule entr‚e par l'utilisateur *) + +Unit Elem : Class; + Var Valeur:Char; +End Elem; + + +Unit Noeud : Class; +Var left , right : Noeud, + Valeur : Char ; +End Noeud ; + + +Unit Operateur : procedure(longueur : Integer; output racine : Noeud); +Var i : Integer, + n,p,ng,nd : Noeud, + up1,up2 : UnePile, + e,aux : Elem, + c : Char; + +Begin + +up1 := new UnePile(Noeud); +up2 := new UnePile(Elem); +for i:=1 to longueur +do + +c:=valeur(i); +case c + When 'a','b','c','d','x','y','z' : n := New Noeud; + n.valeur := c; + up1.p1 := up1.Push(n,up1.p1); + when '&','%','>','|' : e := new elem; + e.valeur := c; + up2.p2 := up2.Push(e,up2.p2); + when ')' : if not up2.Empty_Pile(up2.p2) + then + aux := up2.top(up2.p2); + up2.p2 := up2.down(up2.p2); + nd := up1.top(up1.p1); + up1.p1 := up1.down(up1.p1); + if aux.valeur <> '|' + then ng := up1.top(up1.p1); + up1.p1 := up1.down(up1.p1); + else + ng := none; + fi; + p := new Noeud; + p.left := ng; + p.right := nd; + p.valeur := aux.valeur; + up1.p1 := up1.push(p,up1.p1); + fi; +esac; +od; +if not up2.Empty_Pile(up2.p2) +then aux := up2.top(up2.p2); + up2.p2 := up2.down(up2.p2); + nd := up1.top(up1.p1); + up1.p1 := up1.down(up1.p1); + if aux.valeur <> '|' then + ng := up1.top(up1.p1); + up1.p1 := up1.down(up1.p1); + else + ng := none; + fi; + p := new Noeud; + p.left := ng; + p.right := nd; + p.valeur := aux.valeur; +fi; +racine := p; +End; + + + + +(************************************************) +(* Impl‚mentation de la liste *) +(************************************************) + +(* Cette impl‚mentation de liste permettra *) +(* d'ins‚rer les variables en fin de liste *) +(* et les op‚rateurs au d‚but *) + +Unit Node : Class ; + Var Val: Sequence , + Left, Right: Node ; +End Node; + +Unit Sequence : Class; + Var Gauche, Droite: Liste ; +End Sequence; + +Unit Liste : Class; +Var Debut: Noeud, + suivant : Liste; +End Liste; + + +Unit Empty_Liste : function(l:Liste) : Boolean; +Begin + result := l=none; +End Empty_Liste; + + +Unit Insert : Function (E:Noeud;L:Liste) : Liste ; +Var l1,aux : Liste; +Begin + If Empty_Liste(l) + Then L := new Liste; + L.Debut:=New Noeud; + L.Debut := E; + Else + l1:=L; + aux:=new Liste ; + If E.Valeur<>'|' Andif E.Valeur<>'%' + Andif E.Valeur<>'&' Andif E.Valeur<>'>' + Then + Aux.Debut := E ; + While L1.Suivant <> None + Do + l1 := L1.Suivant ; + Od ; + L1.Suivant := Aux ; + Else + Aux.Debut := E ; + Aux.Suivant := L ; + L := Aux ; + Fi ; + Fi; + Result := L ; + +End Insert; + + +Unit Delete : Function(L:Liste): Liste; +Begin + Result := L.suivant; +End Delete; + + +(************************************************************) +(* Procedures de d‚composition d'une expression bool‚enne *) +(************************************************************) + +(* Ces proc‚dures permettent de d‚composer la liste *) +(* initiale gr…ce … la m‚thode de GENTZEN de maniŠre *) +(* … n'obtenir que des variables aux feuilles *) + + + +Unit Copie_Liste : Function (L:Liste) : Liste ; +Var Der,Aux:Liste ; +Begin + Result := New Liste ; + if L<>None Then Der := New Liste ; + Der := Copy (L) ; + l := L.Suivant ; + Fi ; + Result := Der ; + While L <> None + Do + Aux := New Liste ; + Aux := Copy (L) ; + Der.Suivant := Aux ; + L := L.Suivant ; + Der :=Aux ; + Od ; +End Copie_Liste ; + + + +Unit Op_Negation_G : Procedure(Input Racine:Noeud;Inout D:Node) ; +Var L,R : Liste , + X : Node ; +Begin + + X := new Node ; + X.Val := New Sequence ; + L := Copie_Liste (D.Val.Gauche) ; + R := Copie_Liste (D.Val.Droite) ; + L := Delete (L) ; + R := Insert (Racine.Right,R) ; + X.Val.Droite:=Copie_Liste (R); + X.Val.Gauche:=Copie_Liste (L) ; + D.Right:=New Node; + D.Right:=X; + Kill (L) ; + Kill (R) ; + +End Op_Negation_G ; + + +Unit Op_Alternative_G : Procedure(Input Racine:Noeud;Inout D:Node ) ; +Var L,S : Liste , + X,Y : Node ; +Begin + + X := new Node ; + X.Val := New Sequence ; + Y := new Node ; + Y.Val := New Sequence ; + X.Val.Droite:= Copie_Liste (D.Val.Droite) ; + Y.Val.Droite:= Copie_Liste (D.Val.Droite) ; + l := Copie_Liste (D.Val.Gauche) ; + L := Delete (L) ; + S := Copie_Liste (L) ; + L := Insert (Racine.Left,L) ; + S := Insert (Racine.Right,S) ; + X.Val.Gauche:= Copie_Liste (L) ; + Y.Val.Gauche:= Copie_Liste (S) ; + D.Left := New Node ; + D.Right := New Node ; + D.Left:= X ; + D.Right:= Y ; + Kill (L) ; + Kill (S) ; + +End Op_Alternative_G ; + +Unit Op_Conjonction_G : Procedure (Input Racine:Noeud;Inout D : Node); +Var L : Liste , + X : Node; +Begin + X := new Node ; + X.Val := New Sequence ; + L := Copie_Liste (D.val.Gauche) ; + L := Delete (L) ; + L := Insert (Racine.Left,L) ; + L := Insert (Racine.Right,L) ; + X.Val.Gauche:=Copie_Liste (L) ; + X.Val.Droite:=Copie_Liste (D.Val.Droite) ; + D.Right:=New Node ; + D.Right:=X ; + Kill (L) ; + +End Op_Conjonction_G ; + +Unit Op_Implique_G : Procedure (Input Racine:Noeud;Inout D:Node ) ; +Var L,R : Liste , + X,Y : Node ; +Begin + X := new Node ; + X.Val := New Sequence ; + Y := new Node ; + Y.Val := New Sequence ; + L := Copie_Liste (D.Val.Gauche) ; + R := Copie_Liste (D.Val.Droite) ; + X.val.Droite := Copie_Liste (R) ; + L := Delete (L) ; + Y.Val.Gauche := Copie_Liste (L) ; + Y.Val.Droite := Copie_Liste (Insert (Racine.Left,R)) ; + X.Val.Gauche := Copie_Liste (Insert (Racine.Right,L)) ; + D.Left := New Node ; + D.Right := New Node ; + D.Left := X ; + D.Right := Y ; + Kill (L) ; + Kill (R) ; + +End Op_Implique_G ; + + +Unit Op_Negation_D : Procedure(Input Racine:Noeud; Inout D : Node ) ; +Var L,R : Liste , + X : Node ; +Begin + + X := new Node ; + X.Val := New Sequence ; + L := Copie_Liste (D.Val.Gauche) ; + R := Copie_Liste (D.val.Droite) ; + L := Insert (Racine.Right,L) ; + R := Delete (R) ; + X.Val.Droite:=Copie_Liste (R); + X.Val.Gauche:=Copie_Liste (L) ; + D.Right := New Node ; + D.Right:=X; + Kill (L) ; + Kill (R) ; + +End Op_Negation_D ; + + +Unit Op_Alternative_D : Procedure(Input Racine:Noeud;Inout D:Node ) ; +Var R : Liste , + X : Node ; +Begin + + X := new Node ; + X.Val := New Sequence ; + R := Copie_Liste (D.Val.Droite) ; + R := Delete (R) ; + R := Insert (Racine.Left,R) ; + R := Insert (Racine.Right,R) ; + X.Val.Gauche := Copie_Liste (D.Val.Gauche) ; + X.Val.Droite := Copie_Liste (R) ; + D.Right := New Node ; + D.Right := X ; + Kill (R) ; + +End Op_Alternative_D ; + + +Unit Op_Conjonction_D : Procedure (Input Racine:Noeud; + Inout D : Node) ; +Var S,R : Liste , + X,Y : Node ; +Begin + + X := new Node ; + X.Val := New Sequence ; + Y := new Node ; + Y.Val := New Sequence ; + R := Copie_Liste (D.Val.Droite) ; + R := Delete (R) ; + S := Copie_Liste (R) ; + S := Insert (Racine.Left,S) ; + R := Insert (Racine.Right,R) ; + X.Val.Gauche := Copie_Liste (D.Val.Gauche) ; + X.Val.Droite := Copie_Liste (S) ; + Y.val.Gauche := Copie_Liste (D.Val.Gauche) ; + Y.Val.Droite := Copie_Liste (R) ; + D.Left := New Node ; + D.Right := New Node ; + D.Left := X ; + D.Right := Y ; + Kill (R) ; + Kill (S) ; + +End Op_Conjonction_D ; + + +Unit Op_Implique_D : Procedure (Input Racine:Noeud;Inout D:Node ) ; +Var L,R : Liste , + X : Node ; +Begin + + X := new Node ; + X.Val := New Sequence ; + L := Copie_Liste (D.Val.Gauche) ; + R := Copie_Liste (D.val.Droite) ; + X.Val.Gauche := Copie_Liste (Insert (Racine.Left,L)) ; + R := Delete (R) ; + X.Val.Droite := Copie_Liste (Insert (Racine.Right,R)) ; + D.Right := New Node ; + D.Right := X ; + Kill (L) ; + Kill (R) ; + +End Op_Implique_D ; + + +Unit Trait_List_G : Procedure (Racine:Noeud;Inout D:Node); +Begin + + Case Racine.Valeur + When '|' : Call Op_Negation_G (Racine,D) ; + When '%' : Call Op_Alternative_G (Racine,D) ; + When '&' : Call Op_Conjonction_G (Racine,D) ; + When '>' : Call Op_Implique_G (Racine,D) ; + Esac; + +End trait_List_G ; + +Unit Trait_List_D : Procedure (Racine:Noeud;Inout D:Node); + +Begin + + Case Racine.Valeur + When '|' : Call Op_Negation_D (Racine,D) ; + When '%' : Call Op_Alternative_D (Racine,D) ; + When '&' : Call Op_Conjonction_D (Racine,D) ; + When '>' : Call Op_Implique_D (Racine,D) ; + Esac; + +End trait_List_D ; + + + + +Unit Decompose : Procedure (Inout Diagramme : Node); +Var D,X,Y:Node, + Courant,L : Liste , + Fin,Trouve : Boolean , + Racine : Noeud ; +Begin + D := Diagramme ; + If D<>None + Then + If D.Val.Gauche<>None AndIf (D.Val.Gauche.Debut.Valeur='&' + Or D.Val.Gauche.Debut.Valeur='%' + Or D.Val.Gauche.Debut.Valeur='>' + Or D.Val.Gauche.Debut.Valeur='|') + Then + Racine := Copy (D.Val.Gauche.Debut) ; + Call Trait_List_G (Racine,D) ; + + Else + If D.Val.Droite<>None AndIf (D.Val.Droite.Debut.Valeur='&' + Or D.Val.Droite.Debut.Valeur='%' + Or D.Val.Droite.Debut.Valeur='>' + Or D.Val.Droite.Debut.Valeur='|') + Then Racine := Copy (D.Val.Droite.Debut) ; + Call Trait_List_D (Racine,D) ; + Fi ; + Fi; + WriteLn ; + Call Decompose (D.Left) ; + Call Decompose (D.right) ; + Diagramme := D ; + Fi ; +End Decompose ; + + + +Unit Parcours_Arbre_Right : Procedure(racine : Noeud;Sens,I,J:Integer; + Inout Z:Integer); +Var P : Noeud ; +Begin +Pref IIUWGRAPH Block +Begin + p:=racine; + If p <> none Then + If P.Left<>None + Then Call Move (I+8*Z,J) ; + Call Hascii (0) ; + Call Hascii (40) ; + Z:=Z+1 ; + Fi ; + Call Parcours_Arbre_Right(p.Left,Sens,I,J,Z); + Call Move (I+8*Z,J); + Call Hascii (0) ; + Case P.Valeur + When '&' : Call dessine_et(I+8*Z,J); + When '%' : Call dessine_ou(I+8*Z,J); + When '>' : Call dessine_implique(I+8*Z,J); + When '|' : Call dessine_non(I+8*Z,J); + otherwise Call Hascii(Ord(P.Valeur)); + esac; + Z:=Z+1; + If P.Valeur='|' + Then Call Move (I+8*Z,J) ; + Call Hascii (0) ; + Call Hascii (40) ; + Z:=Z+1 ; + Fi; + call parcours_Arbre_Right(p.Right,Sens,I,J,Z); + If P.Right<>None Or P.Valeur='|' + Then Call Move (I+8*Z,J) ; + Call Hascii (0) ; + Call Hascii (41) ; + Z:=Z+1 ; + Fi ; + Fi ; +End; +End Parcours_Arbre_Right; + + + +Unit Parcours_Arbre_Left : procedure(racine : Noeud;Sens,I,J:Integer; + InOut Z:Integer); +Var P : Noeud ; +Begin +Pref IIUWGRAPH Block +Begin + p:=racine; + If p <> none Then + If P.Left<>None Or P.Valeur='|' + Then Call Move (I+8*Z,J) ; + Call Hascii (0) ; + Call Hascii (41) ; + Z:=Z-1 ; + Fi ; + Call parcours_Arbre_Left(p.Right,Sens,I,J,Z); + If P.Valeur='|' + Then Call Move (I+8*Z,J) ; + Call Hascii (0) ; + Call Hascii (40) ; + Z:=Z-1 ; + Fi; + Call Move (I+8*Z,J); + Call Hascii (0) ; + Case P.Valeur + When '&' : Call dessine_et(I+8*Z,J); + When '%' : Call dessine_ou(I+8*Z,J); + When '>' : Call dessine_implique(I+8*Z,J); + When '|' : Call dessine_non(I+8*Z,J); + otherwise Call Hascii(Ord(P.Valeur)); + esac; + Z:=Z-1; + Call parcours_Arbre_Left(p.Left,Sens,I,J,Z); + If P.Right<>None And P.Valeur<>'|' + Then Call Move (I+8*Z,J) ; + Call Hascii (0) ; + Call Hascii (40) ; + Z:=Z-1 ; + Fi ; + Fi ; +End; +End Parcours_Arbre_Left; + + + +Unit Affiche_Liste : Procedure (Input L:Liste;I,J,Sens:Integer ); +Var Z : Integer ; +Begin + Pref IIUWGRAPH Block + Begin + Call color(12); + Call Move (I,J) ; + Call dessine_fleche(I,J); + Z:=0; + Call color(15); + If L=None + Then Call Move(I+Sens,J); + Call dessine_vide(I+sens,J); + Fi ; + While L<>None + Do + Z:=0; + I:=I+Sens; + Call Move (I,J) ; + If Sens =-8 + Then Call Parcours_Arbre_Left (L.Debut,Sens,I,J,Z); + Else Call Parcours_Arbre_Right(L.Debut,Sens,I,J,Z); + Fi ; + L := L.Suivant ; + If L<>None + Then I:=I+8*Z; + Call Move (I,J); + Call Hascii (0) ; + Call Hascii (44); + Fi ; + Od ; + End; +End Affiche_Liste ; + + +Unit Parcours : Procedure(Racine:Node;X,Y,Z:integer); +Var P : Node ; +Begin + Pref IIUWGRAPH Block + Begin + P := Racine; + If P <> None Then + Call Affiche_Liste (P.Val.Gauche,X,Y,-8) ; + Call Affiche_Liste (P.Val.Droite,X,Y,+8) ; + Call Parcours(P.Left,X-Z,Y+32,Z/2) ; + If P.Left<>None Then Call color(11); + Call Move (X,Y+8) ; + Call Draw (X-Z,Y+30) ; + Call Move (X,Y+8) ; + Call Draw (X+Z,Y+30) ; + Call color(15); + Call Parcours(P.Right,X+Z,Y+32,Z/2) ; + Else If P.Right<>None + Then Call color(11); + Call Move (X,Y+8) ; + Call Draw (X,Y+30) ; + Call color(15); + Fi ; + Call Parcours(P.Right,X,Y+32,Z/2) ; + Fi; + Fi; + End; +End Parcours; + + +(****************************************************) +(* Evaluation de la Tautologicit‚ de la formule *) +(****************************************************) + + +Unit Recherche_Tautologie : Procedure(Left,Right:Liste;X,Y,Z:Integer; + OutPut H:Boolean) ; +Var Element : Char, + Large,Xx: Integer, + Totaul : Boolean, + L,R : Liste; + +Begin + Totaul := False ; + Large := 24; + Xx:=x; + X := X-8; + H := False ; + L := Copie_Liste (Left); + R := Copie_Liste (Right); + If (Left=None) Or (Right=None) + Then + call texte(150,Y+20,11, + "Cette expression n'est pas une tautologie.") ; + Else Element := Left.Debut.valeur ; + Do + Do + If Element = Right.Debut.Valeur Then Exit; Fi; + Right := Right.Suivant ; + If Right = None Then Exit; Fi; + Od; + If Right<>None Then + call texte(150,Y+20,11, + "Cette expression est une tautologie."); + Totaul:=True ; + H := True ; + Fi ; + If Totaul Then Exit; Fi; + Left := Left.Suivant ; + If Left = None Then + call texte(150,Y+20,11, + "Cette expression n'est pas une tautologie."); + Exit; + Fi; + Right := Copie_Liste(R); + Od; + Fi ; + If Not Totaul + Then While L<>None + Do L:=L.Suivant ; + If L<>None Then X:=X-16; + Large:=Large+16; + Fi; + Od; + While R<>None + Do R:=R.Suivant ; + If R<>None Then Large:=Large+16; + Fi; + Od; + Call Rectangle (X-1,Y,Large+2,8,15) ; + Fi; + +End Recherche_Tautologie; + + +Unit Affiche_Feuille:Procedure (D:Node;X,Y,Z:Integer;Inout H:Boolean); +Begin + If D<>None + Then If Not H Then Return; + Fi; + Call Affiche_Feuille (D.Left,X-Z,Y+32,Z/2,H) ; + If D.Left<>None + Then Call Affiche_Feuille (D.Right,X+Z,Y+32,Z/2,H) ; + Else Call Affiche_Feuille (D.Right,X,Y+32,Z/2,H) ; + Fi ; + If (D.Left=None) And (D.Right=None) + Then + Call Recherche_Tautologie(D.Val.Gauche,D.Val.Droite,X,Y,Z,H); + Fi ; + Fi; +End Affiche_Feuille ; + + +(************************************) +(* Proc‚dures Graphiques *) +(************************************) + + + +Unit Rectangle : Procedure (X,Y,Large,Haut,Col:Integer) ; +Begin +Pref IIUWGRAPH Block +Begin + Call Color(Col) ; + Call Move (X,Y) ; + Call Draw (X+Large,Y) ; + Call Draw (X+Large,Y+Haut) ; + Call Draw (X,Y+haut) ; + Call Draw (X,Y) ; +End ; +End ; + + + +Unit Fill : Procedure (X,Y,Large,Haut,Col:Integer) ; +Var I:Integer ; +Begin +Pref IIUWGRAPH Block +Begin + Call Color (Col) ; + For I:=Y To Y+Haut + Do + Call Move(X,I) ; + Call Draw(X+Large,I) ; + Od ; +End ; +End ; + + +Unit Texte : Procedure (X,Y,col : integer; s : string); +Begin +Pref IIUWGRAPH Block +Begin + Call Color (Col) ; + Call Move (X,Y); + Call outstring(s); +End ; +End ; + + +Unit dessine_et : Procedure(X,Y : integer); +Begin +Pref IIUWGRAPH Block +Begin + Call Hascii(0); + Call move(X,Y+6); + Call draw(X+3,Y+2); + Call draw(X+6,Y+6); +End; +End; + + +Unit dessine_ou : Procedure(X,Y : integer); +Begin +Pref IIUWGRAPH Block +Begin + Call Hascii(0); + Call move(X,Y+2); + Call draw(X+3,Y+6); + Call draw(X+6,Y+2); +End; +End; + + +Unit dessine_implique : Procedure(X,Y : integer); +Begin +Pref IIUWGRAPH Block +Begin + Call Hascii(0); + Call move(X,Y+2); + Call draw(X+4,Y+2); + Call move(X,Y+4); + Call draw(X+4,Y+4); + Call move(X+3,Y); + Call draw(X+6,Y+3); + Call draw(X+3,Y+6); + +End; +End; + + +Unit dessine_non : Procedure(X,Y : integer); +Begin +Pref IIUWGRAPH Block +Begin + Call Hascii(0); + Call move(X+1,Y); + Call draw(X+3,Y); + Call draw(X+3,Y+6); +End; +End; + + +Unit dessine_vide : Procedure(X,Y : integer); +Begin +Pref IIUWGRAPH Block +Begin + Call Hascii(0); + Call cirb(X+3,Y+4,3,0,0,15,0,1,1); + Call move(X,Y+7); + Call draw(X+8,Y); +End; +End; + + +Unit dessine_fleche : Procedure(X,Y : integer); +Begin +Pref IIUWGRAPH Block +Begin + Call Hascii(0); + Call move(X+1,Y+4); + Call draw(X+7,Y+4); + Call move(X+4,Y+1); + Call draw(X+7,Y+4); + Call draw(X+4,Y+7); +End; +End; + + +(********************************) +(* Programe Principal *) +(********************************) + +Begin + array valeur dim(1:47); + Pref IIUWGRAPH Block + Begin + Call Gron (0) ; + Do + Call Cls ; + Call Rectangle (120,10,344,40,15); + Call Rectangle (125,51,345,6,15); + Call Rectangle (465,15,6,42,15); + Call Fill (126,51,344,5,9); + Call Fill (465,16,5,37,9); + Call texte(121,27,15, + " EVALUATION DE PROPOSITIONS LOGIQUES "); + Call Rectangle (100,150,400,72,15) ; + Call move(100,200); + Call draw(500,200); + Call Rectangle (144,200,44,22,15); + Call Rectangle (232,200,44,22,15); + Call texte(105,208,12,"F1:"); + Call dessine_et(131,208); + Call texte(149,208,12,"F2:"); + Call dessine_ou(175,208); + Call texte(193,208,12,"F3:"); + Call dessine_implique(219,208); + Call texte(237,208,12,"F4:"); + Call dessine_non(263,208); + Call texte(285,208,12,"Variables : a,b,c,d,x,y,z"); + Call texte(105,160,15,"Entrez la proposition : ("); + Call texte(308,160,12,"F10 "); + Call texte(340,160,15,"pour quitter)"); + Call texte(110,184,15, + "------------------------------------------------"); + Call Rectangle (100,250,400,60,15) ; + Call Move (100,290) ; + Call Draw (500,290) ; + Call Texte (225,297,12,"Fenˆtre de messages"); + Call Move(110,180); + longueur:=0; + + Do + Ch := New Chaine; + If Analyseur(Longueur) Then + Call texte(153,280,15,"Appuyez sur une touche pour continuer"); + while inkey=0 do od; + Exit; + else + Call texte(153,280,15,"Appuyez sur une touche pour continuer"); + while inkey=0 do od; + Call Fill (101,251,398,38,0) ; + Call move(110+(longueur*8),180); + Fi; + Od; + + call cls ; + call color(15); + H := True ; + i:=1; + call Operateur(longueur,racine); + xx :=320; + Y := 80; + Z:=256; + Diagramme := New Node; + Diagramme.Val := New Sequence ; + Diagramme.Val.Droite := Insert (Racine,Diagramme.Val.Droite) ; + Courant := Diagramme ; + Call decompose(Diagramme) ; + Call texte(105,32,12, + "Evolution de la formule suivant la methode de GENTZEN") ; + Call texte(97,40,12, + "ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ") ; + Call color(15); + Call parcours(Courant,xx,y,Z); + Call texte(130,320,12,"Appuyez sur une touche pour continuer"); + While inkey=0 do od; + Call Texte(130,320,12," "); + Call Affiche_Feuille (Diagramme,320,80,256,H) ; + While inkey=0 do od; +Od; + Call Groff; +End ; +End Evaluationdepropositionslogiques; + diff --git a/examples/logic/gentzen.pcd b/examples/logic/gentzen.pcd new file mode 100644 index 0000000000000000000000000000000000000000..88094f8a77a61ce635ab4caee174e0f20b3ebf7a GIT binary patch literal 2560 zcmZwIdu$X%90%~I>9Hu!f{97K7@Nla>uxP!EuM+4#Vx0+y~tCIIah-4{lI$ zz1&@N+}m&m;eMCgJKSA$+#a~M;38(eUW4{=ccU5R>$gKyX*b+#$?f9qPBVi0!CIH9 zQ8(Oj$-T_oDzgOt1J<^{b;7kuuARHBcDz=MuZMdM=Z3I-84i|Z&?fF0!zqf;I?Qdg zs#7!E-x1NR;m(RgDM*i@)`wtM!6l=jdxX2mQC7z?j4y_3!nsy*_j9)(I-Uw?5#rs2 z`8C3=l-xq@p0r&Z+-$gdxDLrxbGJQOjyk5R2HgTP3w>=|oZqe7ZHPy3KPnNg0{v#V zoe9yUx!aduZZgaS^r>(IrJ|e2-G$OJ3egRiTMRA**OnArg1gRS8JT2ajSJz%!(A&A zU5Gp7rc$hnjljSMoy@H4PH@K_V z|C%R>?ho!-Cb7Juib_Ai{R(GH5#3MR6;EMxe1mwG;eLSISRuNvxofLn^Sgxk4a0o} zr=~@BfxA$e{SQ7x-hQ|txZQ%&X#g&W&Gy|idydY)oJ2ndcS>@nxf@K!k@pz#zON{B z0&a9#KCe!Pxw|s0m~`sHcn{(o!r50Tx?Z^dv7HAir&5CUC;@r{?jYRss=PDkO*qzW zuVQtuwgYY#T+0mmD-M>W(@q|*eMW9ScnLLk!+o5|JA+=aT&a2^s| z?mgqDkqq0PUqnvUI^n(*oc$vXej3fNyzOvp=v(1xvbj+=S+MH$Uw-Mv(;WpviDY>WZdj0fjmaWS=)Vc=uqZzJhrkHoFoi{*t%oN|# zPax(mbMh|t{wSos=7{cbxNURYZX9*b72RsMShd@QC{-=Gm2ew8ToJWOZUx-@8h1RC z?yV8yJqp+B;fm>~6OL sG4BI#Lv?N!r;$3*ErIK+ce?}~uNU2YaG?gbE2UV2=o;ac+~aoF0SFO4vH$=8 literal 0 HcmV?d00001 diff --git a/examples/new-1.exe b/examples/new-1.exe new file mode 100644 index 0000000000000000000000000000000000000000..785a22cc3ec69f75d14e0c646863a31fa102af7c GIT binary patch literal 74880 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 then + call rectangle(50,50,h,v,3); + choix := 0; + choix := quoi(h,v); + writeln(f,"choix : ",choix); + case choix + when 1 : call rectangle(200,200,250,250,3); + writeln(f,"r1 "); + when 2 : call rectangle(160,160,300,300,3); + writeln(f,"r2"); + when 3 : call rectangle(120,120,350,350,3); + writeln(f,"r3"); + esac; + fi; + p := 0; + od; + end; + + unit quoi : function (h,v : integer) : integer; + var + p_rgs : rgs, + resultat : integer, + a,b,c : boolean; + begin + p_rgs := rgs_pere; + p_rgs := p_rgs.suiv; + do + a:=(p_rgs.x1 < h and p_rgs.x2> h ) ; + b:=(p_rgs.y1 < v and p_rgs.y2 > v) ; + c:= a and b; + if c then + result := p_rgs.code; + return; + fi; + if p_rgs.suiv =/= none + then + p_rgs:=p_rgs.suiv; + else + result := 0; + return; + fi; + od; + end quoi; + + unit rgs : class(x1,y1,x2,y2,code : integer); + var + suiv : rgs; + begin + call rectangle(x1,y1+100,x2,y2+100,15); + end rgs; + + unit affiche : procedure(x1,y1,x2,y2 : integer); + begin + call rectangle(x1,y1,x2,y2,1); + call rectanglef(x1+3,y1+3,x2-3,30,8); + call rectangle(x1+3,33,x2-3,y2-3,9); + end affiche; + + begin + ind := 0; + indc := 4; + x1 := 0; + y1 := 0; + x2 := 639; + y2 := 479; + call affiche(x1,y1,x2,y2); + rgs_pere := new rgs(0,0,0,0,0); + inner; + call gestionnaire; + End windows; + + Unit monwindows : windows class; + begin + menubar := new menu("troisieme",3, + new menu("deuxieme",2, + new menu("premier",1,none))); + call menubar.affiche; + End monwindows; + + + + + Begin + open(f,text,unpack("testing")); + call rewrite(f); + call gron(1); + w := new monwindows; + call groff; + kill(f); + end; + end; +end. diff --git a/examples/pataud/multilvl.log b/examples/pataud/multilvl.log new file mode 100644 index 0000000..36cc5ee --- /dev/null +++ b/examples/pataud/multilvl.log @@ -0,0 +1,37 @@ +program M; + (* example of multilevel iheritance *) + var x: integer; + unit A: class; + var x: integer; + begin + x := 3; + inner; + end A; +begin + pref A block + var y: integer, bb: B; + unit B: class; + begin + x := y; + writeln(x); + inner; + end B; + begin + y := 2; + bb := new B; + pref A block + var y: integer, cc: C; + unit C: B class; + begin + y := x; + writeln(y); + inner; + end C; + begin + y := 4; + cc := new C; + end + end; + writeln(x); +end program; + \ No newline at end of file diff --git a/examples/pataud/new1.log b/examples/pataud/new1.log new file mode 100644 index 0000000..e278b60 --- /dev/null +++ b/examples/pataud/new1.log @@ -0,0 +1,253 @@ +Program SystemedeFenetrage; + + (*****************************************************************************) + (* premiere famille de classes : les classes graphiques *) + (*****************************************************************************) + Unit Ptr : Class; + End Ptr; + + Unit Windows : Ptr Class(father :windows,x1,y1,x2,y2 : integer); + Close hauteur,largeur; + Var lborder,cfond,cborder : integer, + hauteur,largeur : integer, + xpos,ypos,xmax,ymax : integer, + num_id : integer, + save_map : arrayof integer; + + Unit Affiche : procedure; + Begin + call father.rectanglef(x1,y1,x2,y2,cfond); + End Affiche; + + Unit virtual rectangle : procedure(xx1,yy1,xx2,yy2,c :integer); + Begin + if(xx1x1 and yy1y1) + then call father.rectangle(xx1,yy1,xx2,yy2,c); + fi; + End rectangle; + + Unit virtual rectanglef : procedure(xx1,yy1,xx2,yy2,c : integer); + End rectanglef; + + + Begin + hauteur:=y2-y1-2*lborder; + largeur:=x2-x1-2*lborder; + End Windows; + + Unit Bitmap : Windows Class; + End Bitmap; + + Unit Son : Windows Class; + End Son; + + Unit Maine : Windows Class; + End Maine; + + Unit Dialogue : Son Class; + End Dialogue; + + Unit Catalogue : Dialogue Class; + End Catalogue; + + Unit Question : Dialogue Class; + End Question; + + Unit Widgets : Ptr Class; + End Widgets; + + Unit Menu : Widgets Class; + End Menu; + + Unit Menu_V : Menu Class; + End Menu_V; + + Unit Menu_H : Menu Class; + End Menu_H; + + Unit Bottons : Widgets Class; + End Bottons; + + Unit Racc : Bottons Class; + End Racc; + + Unit Opt_list : Bottons Class; + End Opt_list; + + Unit Oneline : Opt_list Class; + End Oneline; + + Unit Multiline : Opt_list Class; + End Multiline; + + Unit Botton : Bottons Class; + End Botton; + + Unit Lift : Widgets Class; + End Lift; + + Unit Lift_V : Lift Class; + End Lift_V; + + Unit Lift_H : Lift Class; + End Lift_H; + + (*****************************************************************************) + (* deuxieme famille de classes : les structures de donnees *) + (*****************************************************************************) + Unit Ensemble : CLass; + End Ensemble; + + Unit Queue : Ensemble Class; + End Queue; + + Unit Ofpriority : Queue Class; + End Ofpriority; + + Unit ListD : Ensemble Class; + End ListD; + + Unit Clic : ListD Class; + End Clic; + + Unit Bot : ListD Class; + End Bot; + + Unit Key : ListD Class; + End Key; + + Unit Win : ListD Class; + End Win; + + Unit Stack : Ensemble Class; + End Stack; + + + (*****************************************************************************) + (* Famille de process *) + (*****************************************************************************) + Unit Applications : process (node : integer); + End Applications; + + Unit Gest_event : mouse process (node : integer,gest : gest_wind); + + Unit ready : procedure; + End ready; + + Unit event : function(output v,h,p,l,r,c : integer) : boolean; + Begin + result:=getpress(v,h,p,l,r,c); + End; + + Var i :integer, + v,h,p,l,r,c : integer; + Begin + return; + accept ready; + call init(1,1); + call showcursor; + do + if(event(v,h,p,l,r,c)) + then call gest.event(v,h,p,l,r,c); + fi; + od + End Gest_event; + + Unit Gest_wind : iiuwgraph process(node,x1,y1,x2,y2 : integer,gest:gest_event); + Var i :integer, + v,p,h,l,r,c : integer, + w : windows, + j : graph; + + Unit getinfo : procedure (g : gest_event); + Begin + gest:=g; + disable getinfo; + End getinfo; + + Unit event : procedure (input lv,lh,lp,ll,lr,lc : integer); + Begin + v:=lv; h:=lh; p:=lp; l:=ll; r:=lr; c:=lc; + End event; + + Unit traitement : procedure; + Begin + if((h=164 and l=27) or c=3) + then call fin; + fi; + call patern(80,25,130,100,0,1); + call track(40,10,4,v); + call track(140,10,4,p); + call track(80,30,4,h); + call track(80,50,4,l); + call track(80,70,4,r); + call track(80,90,4,c); + End traitement; + + Unit fin : procedure; + begin + call groff; + writeln("on ferme"); + call endrun; + End fin; + + Unit graph : windows class; + + Unit virtual rectangle : procedure (x1,y1,x2,y2,c : integer); + Begin + call patern(x1,y1,x2,y2,c,0); + End rectangle; + + Unit virtual rectanglef : procedure (x1,y1,x2,y2,c : integer); + Begin + call patern(x1,y1,x2,y2,c,1); + End rectanglef; + + End graph; + + Begin + call gron(0); + j:=new graph(none,0,0,0,0); + w:=new windows(j,x1,y1,x2,y2); + w.cfond:=10; + call w.affiche; + return; + accept getinfo; + call gest.ready; + call outstring(10,40,"Windows",0,10); + do + accept event; + call traitement; + od; + call groff; + End Gest_wind; + + Unit Application : Applications process; + End Application; + + +(*****************************************************************************) +(* P r o g r a m m e P r i n c i p a l *) +(*****************************************************************************) +Var i : integer, + G1 : Gest_wind, + G2 : Gest_event; +handlers + when memerror : call endrun; + when syserror : call endrun; +end handlers; +Begin + G1:=new Gest_wind(0,0,0,640,480,none); + G2:=new Gest_event(0,G1); + resume(G1); + resume(G2); + call G1.getinfo(G2); +End. + + + + + + + + diff --git a/examples/pataud/new2.log b/examples/pataud/new2.log new file mode 100644 index 0000000..d439ac7 --- /dev/null +++ b/examples/pataud/new2.log @@ -0,0 +1,567 @@ +Program SystemedeFenetrage; + +Const Noir =0,Bleu =1,Vert =2,Cyan =3, + Rouge =4,Magenta =5,Marron =6,GrisCLair =7, + GrisFonce =8,BleuClair =9,VertClair =10,CyanClair =11, + RougeClair =12,MagentaClair =13,Jaune =14,Blanc =15; + + + + (*****************************************************************************) + (* premiere famille de classes : les classes graphiques *) + (*****************************************************************************) + Unit Ptr : Class; + End Ptr; + + Unit Windows : Ptr Class(father :windows,x1,y1,x2,y2 : integer); + Close hauteur,largeur; + Var lborder,cfond,cborder : integer, + lbande,cfbande,cbbande : integer, + hauteur,largeur : integer, + xpos,ypos,xmax,ymax : integer, + xdeb,ydeb : integer, + num_id : integer, + ListM : Lclic, + ListK : LKey, + nombande : arrayof char, + barcde : menu, + save_map : arrayof integer; + + Unit option : procedure (l1,l2,l3,l4,l5,l6 : integer,l7 : arrayof char); + Begin + cfond:=l1; lborder:=l2; cborder:=l3; lbande:=l4; + cfbande:=l5; cbbande:=l6; + nombande:=copy(l7); + End option; + + Unit Affiche : procedure; + Var i,j,k :integer; + Begin + call father.rectanglef(x1,y1,x2,y2,cfond); + for i:=0 to lborder + do + call father.rectangle(x1+i,y1+i,x2-i,y2-i,cborder); + od; + i:=y1+lborder+1; + call father.rectanglef(x1+lborder+1,i,x2-lborder-1,i+imax(14,lbande),cfbande); + j:=(x2-x1-2*lborder-8*(upper(nombande)-lower(nombande)))/2; + for i:=lower(nombande) to upper(nombande) + do + k:=x1+lborder+j+i*8; + call father.outxyascii(k,y1+lborder+2,ord(nombande(i)),cbbande,cfbande); + od; + call affichesuite; + if(barcde<>none) + then call barcde.affichemenu; + fi + End Affiche; + + Unit virtual affichesuite :procedure; + End affichesuite; + + Unit virtual rectangle : procedure(xx1,yy1,xx2,yy2,c :integer); + End rectangle; + + Unit virtual rectanglef : procedure(xx1,yy1,xx2,yy2,c : integer); + End rectanglef; + + Unit virtual outxyascii : procedure(x,y,car,cf,cb : integer); + End outxyascii; + + Unit virtual outxytext : procedure(x,y:integer,chaine:string,c1,c2:integer); + End outxytext; + + Begin + hauteur:=y2-y1-2*lborder; + largeur:=x2-x1-2*lborder; + End Windows; + + Unit Bitmap : Windows Class; + End Bitmap; + + Unit Son : Windows Class; + End Son; + + Unit Maine : Windows Class; + End Maine; + + Unit Dialogue : Son Class; + End Dialogue; + + Unit Catalogue : Dialogue Class; + End Catalogue; + + Unit Question : Dialogue Class; + End Question; + + Unit Widgets : Ptr Class(father : windows); + End Widgets; + + (**********************************************************************) + Unit Menu : Widgets Class(x,y,col_e,col_f: integer); + Var liste : ensemble; + + Unit item : element class(nom : string,key : integer,suite :Menu); + End item; + + Unit insert : procedure(nom : string,key : integer,s : menu); + var e : item; + Begin + e:=new item(nom,key,s); + if(liste=none) + then liste:=new ensemble; + fi; + call liste.insert(e); + End insert; + + Unit virtual affichemenu : procedure; + End affichemenu; + + End Menu; + + Unit Menu_V : Menu Class; + + Unit virtual affichemenu : procedure; + Var cour : item, + tlen : arrayof char, + len : integer, + xx,yy : integer; + Begin + call liste.initialise; + xx:=x; yy:=y; + if(liste.getelm(cour)) + then while(cour<>none) + do + call father.outxytext(xx,yy,cour.nom,col_e,col_f); + tlen:=unpack(cour.nom); + len:=upper(tlen)-lower(tlen)+1; + kill(tlen); + if(father.ListM=none) + then father.ListM:=new LClic; + fi; + call father.ListM.insert(new elm_c(0 ,xx,yy,xx+len*8,yy+14)); + (* id *) + yy:=yy+20; + if not liste.getelm(cour) + then exit + fi + od + fi + End affichemenu; + + End Menu_V; + + Unit Menu_H : Menu Class; + End Menu_H; + + Unit Bottons : Widgets Class; + End Bottons; + + Unit Racc : Bottons Class; + End Racc; + + Unit Opt_list : Bottons Class; + End Opt_list; + + Unit Oneline : Opt_list Class; + End Oneline; + + Unit Multiline : Opt_list Class; + End Multiline; + + Unit Botton : Bottons Class; + End Botton; + + Unit Lift : Widgets Class; + End Lift; + + Unit Lift_V : Lift Class; + End Lift_V; + + Unit Lift_H : Lift Class; + End Lift_H; + + (*****************************************************************************) + (* deuxieme famille de classes : les structures de donnees *) + (*****************************************************************************) + Unit element : class; (* general *) + End element; + + Unit elm_c : element class(id,x1,y1,x2,y2 : integer); (* listclic *) + End elm_c; + + Unit elm_a : element class(p : Applications); (* liste application *) + End elm_a; + + + Unit Ensemble : CLass; + Var root,last : node, + courant : node; + + Unit node : class(elm : element); + Var next : node; + End node; + + Unit virtual insert : procedure(e : element); + Begin + if not member(e) + then if empty + then root:=new node(e); + last:=root; + else last.next:=new node(e); + last:=last.next; + fi + fi + End insert; + + Unit virtual delete : procedure(e : element); + Var flag : node; + Begin + if member(e) + then flag:=courant.next; + if flag=last + then last:=courant; + courant.next:=none; + kill(flag); + else if courant.next<>none + then courant.next:=courant.next.next; + kill(flag); + fi + fi + fi + End delete; + + Unit virtual member : function (e : element) : boolean; + Var savecou : node, + bl : boolean; + Begin + courant:=root; + savecou:=courant; + bl:=false; + while(courant<>none) + do + if not egalite(courant.elm,e) + then savecou:=courant; + courant:=courant.next; + else bl:=true; + exit; + fi + od; + courant:=savecou; + result:=bl; + End member; + + Unit virtual egalite : function (e1,e2 :element) :boolean; + End egalite; + + Unit empty : function : boolean; + Begin + result:=(root=none); + End empty; + + Unit initialise : procedure; + Begin + courant:=root; + End initialise; + + Unit getelm : function(output e : element) :boolean; + Begin + if(courant<>none) + then e:=courant.elm; + result:=true; + courant:=courant.next; + else result:=false; + fi + End getelm; + + End Ensemble; + + Unit Queue : Ensemble Class; + End Queue; + + Unit Ofpriority : Queue Class; + End Ofpriority; + + Unit ListD : Ensemble Class; + End ListD; + + Unit LClic : ListD Class; + + Unit virtual egalite : function (e1,e2 :element) :boolean; + Begin + if (e1 qua elm_c.x1=e2 qua elm_c.x1 and e1 qua elm_c.x2=e2 qua elm_c.x2 + and e1 qua elm_c.y1=e2 qua elm_c.y1 and e1 qua elm_c.y2=e2 qua elm_c.y2) + then result:=TRUE; + else result:=FALSE; + fi + End egalite; + + Unit appartient : function (x,y : integer) : boolean; + Var e : elm_c, + b : boolean; + Begin + call initialise; + b:=false; + while(getelm(e)) + do + if (x>=e.x1 and x<=e.x2 and y>=e.y1 and y<=e.y2) + then b:=TRUE; + exit; + fi + od; + result:=b; + End appartient; + + End LClic; + + Unit LBot : ListD Class; + End LBot; + + Unit LAppli : ListD Class; + End LAppli; + + Unit LKey : ListD Class; + End LKey; + + Unit LWin : ListD Class; + End LWin; + + Unit Stack : Ensemble Class; + End Stack; + + + (*****************************************************************************) + (* Famille de process *) + (*****************************************************************************) + Unit Applications : process (node,x1,y1,x2,y2 : integer,father : Gest_Wind); + Var w : windows, (* maine *) + Filles : windows, (* son *) + i : integer; + + Unit virtual gestionnaire : procedure(id : integer); + Begin + End gestionnaire; + + Begin + writeln("coucou"); + w:=new windows(father.getw,x1,y1,x2,y2); + return; + writeln("toto"); + call w.option(Noir,3,VertClair,15,VertCLair,Noir,unpack("nom")); + call w.affiche; + do + od; + End Applications; + + (************************************************************************) + (************************************************************************) + Unit Gest_event : mouse process (node : integer,gest : gest_wind); + + Unit ready : procedure; + End ready; + + Unit event : function(output v,h,p,l,r,c : integer) : boolean; + Begin + result:=getpress(v,h,p,l,r,c); + End; + + Var i :integer, + v,h,p,l,r,c : integer; + Begin + return; + accept ready; + call init(1,1); + call showcursor; + do + if(event(v,h,p,l,r,c)) + then call gest.event(v,h,p,l,r,c); + fi; + od + End Gest_event; + + (***********************************************************************) + (***********************************************************************) + Unit Gest_wind : iiuwgraph process(node,x1,y1,x2,y2 : integer,gest:gest_event); + Var i,k :integer, + v,p,h,l,r,c : integer, + ListK : LKey, + ListM : LClic, + ListA : LAppli, + w : windows, + j : graph; + + + Unit getinfo : procedure (g : gest_event); + Begin + gest:=g; + disable getinfo; + writeln("getinfo"); + End getinfo; + + Unit event : procedure (input lv,lh,lp,ll,lr,lc : integer); + Begin + v:=lv; h:=lh; p:=lp; l:=ll; r:=lr; c:=lc; + End event; + + Unit traitement : procedure; + Begin + if((h=164 and l=27) or c=3) + then call fin; + fi; + + (* recherche dans un arbre des fenetres filles si l'evenement *) + (* appartient a qqn *) + + + + End traitement; + + Unit fin : procedure; + begin + call groff; + writeln("on ferme"); + call endrun; + End fin; + + (***********************************************************************) + Unit graph : windows class; + + Unit virtual rectangle : procedure (x1,y1,x2,y2,c : integer); + Begin + call patern(x1,y1,x2,y2,c,0); + End rectangle; + + Unit virtual rectanglef : procedure (x1,y1,x2,y2,c : integer); + Begin + call patern(x1,y1,x2,y2,c,1); + End rectanglef; + + Unit virtual ligne : procedure (x1,y1,x2,y2,c : integer); + Begin + call color(c); + call move(x1,y1); + call draw(x2,y2); + End ligne; + + Unit virtual outxyascii : procedure (x,y,car,cf,cb :integer); + Begin + call move(x,y); + call color(cf); + call border(cb); + call hascii(car); + End outxyascii; + + Unit virtual outxytext : procedure (x,y :integer, chaine :string,c1,c2 :integer); + Begin + call outstring(x,y,chaine,c1,c2); + End outxytext; + + Unit virtual affichesuite : procedure; + Var x,y : integer; + Begin + x:=x1+100-lborder; y:=y1+lbande+lborder+1; + call rectanglef(x,y,x+lborder,y2-lborder-1,cborder); + x:=x+lborder; y:=y2-100-lborder; + call rectanglef(x,y,x2-lborder,y+lborder,cborder); + xdeb:=x1+100+10; + ydeb:=y1+lborder+lbande+10; + End affichesuite; + + End graph; + + Unit initialisation1 : procedure; + Var itermed1 : menu_v, + i,j : integer; + Begin + i:=w.lborder+10+20; j:=y1+w.lborder+10+w.lbande+20*4; + itermed1:=new menu_V(w.father,i,j,Blanc,GrisFonce); + call itermed1.insert("Nouveau",319,none); + call itermed1.insert("Ouvrir",320,none); + call itermed1.insert("D‚placer",321,none); + call itermed1.insert("Copier",322,none); + call itermed1.insert("Supprimer",323,none); + call itermed1.insert("Propri‚t‚",324,none); + i:=w.lborder+10; j:=y1+w.lborder+10+w.lbande; + w.barcde:=new menu_V(w.father,i,j,Blanc,GrisFonce); + call w.barcde.insert("Fichier",315,itermed1); + call w.barcde.insert("Options",316,none); + call w.barcde.insert("Fenetre",317,none); + call w.barcde.insert("Aide",318,none); + End initialisation1; + + Unit initialisation2 : procedure; + Begin + ListA:=new LAppli; + End initialisation2; + + Unit xdeb : function : integer; + Begin + result:=w.xdeb; + End xdeb; + + Unit ydeb : function : integer; + Begin + result:=w.ydeb; + End ydeb; + + Unit getw : function : windows; + Begin + result:=w; + End getw; + + + Begin + call gron(0 ); (* 3 = 1024x768x256 *) + j:=new graph(none,x1,y1,x2,y2); + w:=new windows(j,x1,y1,x2,y2); + call w.option(Grisfonce,3,BleuClair,15,BleuCLair,Blanc,unpack("Gest_Wind")); + call initialisation1; + call w.affiche; + call J.option(Grisfonce,3,BleuClair,15,BleuCLair,Blanc,unpack("Gest_Wind")); + call j.affichesuite; + return; + accept getinfo; + enable xdeb,ydeb,getw; + call gest.ready; + call initialisation2; + do + accept event; + call traitement; + od; + call groff; + End Gest_wind; + + +(*****************************************************************************) +(* P r o g r a m m e P r i n c i p a l *) +(*****************************************************************************) +Var i : integer, + G1 : Gest_wind, + Z1 : applications, + G2 : Gest_event, + x,y :integer; +Begin + G1:=new Gest_wind(0,0,0,640,480,none); + G2:=new Gest_event(0,G1); + resume(G1); + resume(G2); + call G1.getinfo(G2); + + x:=G1.xdeb; + writeln("x=",x); + y:=G1.ydeb; + writeln("y=",y); + Z1:=new applications(0,x+10,y+10,x+330,y+210,G1); + + + call G1.ListA.insert(new elm_a(Z1)); + resume(Z1); +End. + + + + + + + + diff --git a/examples/pataud/new3.log b/examples/pataud/new3.log new file mode 100644 index 0000000..4beb46a --- /dev/null +++ b/examples/pataud/new3.log @@ -0,0 +1,897 @@ +Program SystemedeFenetrage; +begin +pref iiuwgraph block +(* version lightweight processus *) +Const Noir =0,Bleu =1,Vert =2,Cyan =3, + Rouge =4,Magenta =5,Marron =6,GrisCLair =7, + GrisFonce =8,BleuClair =9,VertClair =10,CyanClair =11, + RougeClair =12,MagentaClair =13,Jaune =14,Blanc =15; + + + (*********************************************************************) + (* notion de lightweight process *) + (*********************************************************************) +var actualp: proces; +var active: set; +var suspended :set; + + unit semafor : class; + hidden close SEM, SUSPENDED; + var SEM : boolean; + var SUSPENDED : set; + + unit tsp : function : boolean; + begin + result := SEM; + sem := true; + end tsp; + + unit up : procedure; + begin + SEM := false; + end up; + + unit lockp : procedure; + begin + if SEM + then + call active.delete(actualp); + call suspended.insert(actualp); + actualp.suspndd := true; + actualp := active.amember; + attach(actualp); + else + SEM := true + fi + end lockp; + + unit unlockp : procedure; + var aux : proces; + + begin + if suspended.empty + then + SEM := false + else + aux := suspended.min; + call suspended.delete(aux); + aux.suspndd := false; + call active.insert(aux) + fi + end unlockp; + + begin (* initialization of a semaphore*) + suspended := new set + end semafor; + + + unit set : class; + (* in this version it will be a queue *) + + unit link : class(x : proces); + var next : link + end link; + + var head, tail : link; + + unit insert : procedure(x : proces); + var ogniwo : link; + begin + ogniwo := new link(x); + if tail = none + then + head := ogniwo + else + tail.next := ogniwo + fi; + tail := ogniwo + end insert; + + unit empty : function : boolean; + begin + result := (head = none) + end empty; + + unit min : function : proces; + begin + result := head.x; + end min; + + unit delete : procedure (x : proces); + var o,ogniwo : link; + begin + o,ogniwo := head; + while ogniwo.x =/= x + do + o := ogniwo; + ogniwo := ogniwo.next; + if ogniwo = none + then + writeln(" deleted process does not exist"); + return + fi; + od; + if ogniwo = head + then + head := head.next + fi; + o.next := ogniwo.next; + if ogniwo = tail + then + tail := o; + tail.next := none + fi; + kill(ogniwo) + end delete; + + unit amember : function : proces; + var o : link; + begin + result := head.x; + if head.next =/= none + then + o := head; + tail.next := o; + tail := o; + head := head.next; + o.next := none + fi + end amember; + + end set; + + + + unit proces : coroutine; + (* this class implements notion of process*) + var nrofsons : integer; + var waiting, terminated, suspndd : boolean; + var father, nameofson : proces; + + unit resumep : procedure(x : proces); + begin + if x.suspndd + then + call suspended.delete(x); + call active.insert(x); + x.suspndd := false; + else + if x.terminated + then + (* error *) + writeln(" you are resuming a terminated process?!"); + return + fi + fi + end resumep; + + + unit stopp : procedure; + begin + call active.delete(actualp); + call suspended.insert(actualp); + suspndd := true; + actualp := active.amember; + attach(actualp) + end stopp; + + unit waitp : function(y : proces) : proces; + begin + if y = none + then + (*error*) + writeln(" waiting for a process which does not exist"); + return + fi; + if y.terminated + then + return + fi; + if y.father =/= this proces + then + (* error *) + writeln(" y is not your son!"); + return + fi; + (* O.K. *) + nameofson := y; + waiting := true; + call stopp; + + (* here we shall return upon termination of son*) + result := nameofson; + waiting := false; + end waitp; + + + unit stoppar :procedure (z:semafor); + begin + call z.unlockp; + call stopp + end stoppar; + + unit waitn : function : proces; + begin + if nrofsons = 0 + then (*error*) + writeln(" you wait for a son, but it does not exist "); + return; + else + waiting:=true; + nameofson:=none; + call stopp; + (* you return here *) + result:=nameofson; + waiting:= false; + fi; + end waitn; + + unit xqmulti : procedure; + begin + actualp:=active.amember; + attach(actualp) + end xqmulti; + + begin (*prologue of process*) + father:= actualp; + if father =/= none + then + father.nrofsons:=father.nrofsons +1; + fi; + call suspended.insert (this proces); + suspndd:=true; + + inner; (* here comes the body of your process *) + + (* process epilogue *) + terminated :=true; + call active.delete(actualp); + if father =/= none + then + father.nrofsons:=father.nrofsons - 1; + if father.waiting + then + if father.nameofson = none + then + father.nameofson := this proces + fi; + if father.nameofson = this proces + then + call resumep(father) + fi + fi; + actualp:=active.amember; + attach(actualp); + else + attach(main); + fi; + end proces; + unit resumep : procedure(x : proces); + begin + if x.suspndd + then + call suspended.delete(x); + call active.insert(x); + x.suspndd := false; + else + if x.terminated + then + (* error *) + writeln(" you are resuming a terminated process?!"); + return + fi + fi + end resumep; + + unit Arbitrage : procedure; + begin + actualp:=active.amember; + attach(actualp); + end Arbitrage; + + + + + + (*****************************************************************************) + (* premiere famille de classes : les classes graphiques *) + (*****************************************************************************) + Unit Ptr : Class; + End Ptr; + + Unit Windows : Ptr Class(father :windows,x1,y1,x2,y2 : integer); + Close hauteur,largeur; + Var lborder,cfond,cborder : integer, + lbande,cfbande,cbbande : integer, + hauteur,largeur : integer, + xpos,ypos,xmax,ymax : integer, + xdeb,ydeb : integer, + num_id : integer, + ListM : Lclic, + ListK : LKey, + nombande : arrayof char, + barcde : menu, + save_map : arrayof integer; + + Unit option : procedure (l1,l2,l3,l4,l5,l6 : integer,l7 : arrayof char); + Begin + cfond:=l1; lborder:=l2; cborder:=l3; lbande:=l4; + cfbande:=l5; cbbande:=l6; + nombande:=copy(l7); + writeln("coucou2 l1=",l1); + End option; + + Unit Affiche : procedure; + Var i,j,k :integer; + Begin + call father.rectanglef(x1,y1,x2,y2,cfond); + for i:=0 to lborder + do + call father.rectangle(x1+i,y1+i,x2-i,y2-i,cborder); + od; + i:=y1+lborder+1; + call father.rectanglef(x1+lborder+1,i,x2-lborder-1,i+imax(14,lbande),cfbande); + j:=(x2-x1-2*lborder-8*(upper(nombande)-lower(nombande)))/2; + for i:=lower(nombande) to upper(nombande) + do + k:=x1+lborder+j+i*8; + call father.outxyascii(k,y1+lborder+2,ord(nombande(i)),cbbande,cfbande); + od; + call affichesuite; + if(barcde<>none) + then call barcde.affichemenu; + fi + End Affiche; + + Unit virtual affichesuite :procedure; + End affichesuite; + + Unit virtual rectangle : procedure(xx1,yy1,xx2,yy2,c :integer); + End rectangle; + + Unit virtual rectanglef : procedure(xx1,yy1,xx2,yy2,c : integer); + End rectanglef; + + Unit virtual outxyascii : procedure(x,y,car,cf,cb : integer); + End outxyascii; + + Unit virtual outxytext : procedure(x,y:integer,chaine:string,c1,c2:integer); + End outxytext; + + Begin + hauteur:=y2-y1-2*lborder; + largeur:=x2-x1-2*lborder; + End Windows; + + Unit Bitmap : Windows Class; + End Bitmap; + + Unit Son : Windows Class; + End Son; + + Unit Maine : Windows Class; + End Maine; + + Unit Dialogue : Son Class; + End Dialogue; + + Unit Catalogue : Dialogue Class; + End Catalogue; + + Unit Question : Dialogue Class; + End Question; + + Unit Widgets : Ptr Class(father : windows); + End Widgets; + + (**********************************************************************) + Unit Menu : Widgets Class(x,y,col_e,col_f: integer); + Var liste : ensemble; + + Unit item : element class(nom : string,key : integer,suite :Menu); + End item; + + Unit insert : procedure(nom : string,key : integer,s : menu); + var e : item; + Begin + e:=new item(nom,key,s); + if(liste=none) + then liste:=new ensemble; + fi; + call liste.insert(e); + End insert; + + Unit virtual affichemenu : procedure; + End affichemenu; + + End Menu; + + Unit Menu_V : Menu Class; + + Unit virtual affichemenu : procedure; + Var cour : item, + tlen : arrayof char, + len : integer, + xx,yy : integer; + Begin + call liste.initialise; + xx:=x; yy:=y; + if(liste.getelm(cour)) + then while(cour<>none) + do + call father.outxytext(xx,yy,cour.nom,col_e,col_f); + tlen:=unpack(cour.nom); + len:=upper(tlen)-lower(tlen)+1; + kill(tlen); + if(father.ListM=none) + then father.ListM:=new LClic; + fi; + call father.ListM.insert(new elm_c(0 ,xx,yy,xx+len*8,yy+14)); + (* id *) + yy:=yy+20; + if not liste.getelm(cour) + then exit + fi + od + fi + End affichemenu; + + End Menu_V; + + Unit Menu_H : Menu Class; + End Menu_H; + + Unit Bottons : Widgets Class; + End Bottons; + + Unit Racc : Bottons Class; + End Racc; + + Unit Opt_list : Bottons Class; + End Opt_list; + + Unit Oneline : Opt_list Class; + End Oneline; + + Unit Multiline : Opt_list Class; + End Multiline; + + Unit Botton : Bottons Class; + End Botton; + + Unit Lift : Widgets Class; + End Lift; + + Unit Lift_V : Lift Class; + End Lift_V; + + Unit Lift_H : Lift Class; + End Lift_H; + + (*****************************************************************************) + (* deuxieme famille de classes : les structures de donnees *) + (*****************************************************************************) + Unit element : class; (* general *) + End element; + + Unit elm_c : element class(id,x1,y1,x2,y2 : integer); (* listclic *) + End elm_c; + + Unit elm_a : element class(p : Applications); (* liste application *) + End elm_a; + + + Unit Ensemble : CLass; + Var root,last : node, + courant : node; + + Unit node : class(elm : element); + Var next : node; + End node; + + Unit virtual insert : procedure(e : element); + Begin + if not member(e) + then if empty + then root:=new node(e); + last:=root; + else last.next:=new node(e); + last:=last.next; + fi + fi + End insert; + + Unit virtual delete : procedure(e : element); + Var flag : node; + Begin + if member(e) + then flag:=courant.next; + if flag=last + then last:=courant; + courant.next:=none; + kill(flag); + else if courant.next<>none + then courant.next:=courant.next.next; + kill(flag); + fi + fi + fi + End delete; + + Unit virtual member : function (e : element) : boolean; + Var savecou : node, + bl : boolean; + Begin + courant:=root; + savecou:=courant; + bl:=false; + while(courant<>none) + do + if not egalite(courant.elm,e) + then savecou:=courant; + courant:=courant.next; + else bl:=true; + exit; + fi + od; + courant:=savecou; + result:=bl; + End member; + + Unit virtual egalite : function (e1,e2 :element) :boolean; + End egalite; + + Unit empty : function : boolean; + Begin + result:=(root=none); + End empty; + + Unit initialise : procedure; + Begin + courant:=root; + End initialise; + + Unit getelm : function(output e : element) :boolean; + Begin + if(courant<>none) + then e:=courant.elm; + result:=true; + courant:=courant.next; + else result:=false; + fi + End getelm; + + End Ensemble; + + Unit Queue : Ensemble Class; + End Queue; + + Unit Ofpriority : Queue Class; + End Ofpriority; + + Unit ListD : Ensemble Class; + End ListD; + + Unit LClic : ListD Class; + + Unit virtual egalite : function (e1,e2 :element) :boolean; + Begin + if (e1 qua elm_c.x1=e2 qua elm_c.x1 and e1 qua elm_c.x2=e2 qua elm_c.x2 + and e1 qua elm_c.y1=e2 qua elm_c.y1 and e1 qua elm_c.y2=e2 qua elm_c.y2) + then result:=TRUE; + else result:=FALSE; + fi + End egalite; + + Unit appartient : function (x,y : integer) : boolean; + Var e : elm_c, + b : boolean; + Begin + call initialise; + b:=false; + while(getelm(e)) + do + if (x>=e.x1 and x<=e.x2 and y>=e.y1 and y<=e.y2) + then b:=TRUE; + exit; + fi + od; + result:=b; + End appartient; + + End LClic; + + Unit LBot : ListD Class; + End LBot; + + Unit LAppli : ListD Class; + End LAppli; + + Unit LKey : ListD Class; + End LKey; + + Unit LWin : ListD Class; + End LWin; + + Unit Stack : Ensemble Class; + End Stack; + + + (*****************************************************************************) + (* Famille de process *) + (*****************************************************************************) + Unit Applications : proces class(x1,y1,x2,y2 : integer,father : Gest_Wind); + Var w : windows, (* maine *) + Filles : windows, (* son *) + i : integer; + + Unit virtual gestionnaire : procedure(id : integer); + Begin + End gestionnaire; + + Begin + writeln("coucou"); + w:=new windows(father.getw,x1,y1,x2,y2); + return; + writeln("toto"); + call w.option(Noir,3,VertClair,15,VertCLair,Noir,unpack("nom")); + call w.affiche; + + do + call Arbitrage; + od; + End Applications; + + (************************************************************************) + (************************************************************************) + Unit Gest_event : proces class(gest : gest_wind); + + Unit ready : procedure; + Begin + writeln("Gest_events READY"); + End ready; + + Unit souris: Mouse coroutine; + begin + call init(1,1); + return; + +(* ici on peut mettre la fermeture de la souris *) + End souris; + + Var myszka: souris; + + Unit event : function(output v,h,p,l,r,c : integer) : boolean; + Begin + result:=myszka.getpress(v,h,p,l,r,c); + End; + + Var i :integer, + v,h,p,l,r,c : integer; + Begin + myszka := new souris; + (* accept ready; *) +(* call init(1,1); *) + call myszka.showcursor; + return; + do + if event(v,h,p,l,r,c) + then + call gest.event(v,h,p,l,r,c); + fi; + call Arbitrage; + od; + End Gest_event; + + (***********************************************************************) + (***********************************************************************) + Unit Gest_wind : proces class(x1,y1,x2,y2 : integer,gest:gest_event); + Var i,k :integer, + v,p,h,l,r,c : integer, + ListK : LKey, + ListM : LClic, + ListA : LAppli, + w : windows, + j : graph; + + + Unit getinfo : procedure (g : gest_event); + Begin + gest:=g; + disable getinfo; + writeln("getinfo"); + End getinfo; + + Unit event : procedure (input lv,lh,lp,ll,lr,lc : integer); + Begin + v:=lv; h:=lh; p:=lp; l:=ll; r:=lr; c:=lc; + End event; + + Unit traitement : procedure; + Begin + if((h=164 and l=27) or c=3) + then call fin; + fi; + + (* recherche dans un arbre des fenetres filles si l'evenement *) + (* appartient a qqn *) + + + + End traitement; + + Unit fin : procedure; + begin +(* call groff; *) + attach (j.gr); (* pour terminer iiuwgraph *) + writeln("on ferme"); + call endrun; + End fin; + + (***********************************************************************) + Unit graph : windows class; + + unit graphi: iiuwgraph coroutine; + begin + call gron(0); + return; + + end graphi; + + var gr: graphi; + + Unit virtual rectangle : procedure (x1,y1,x2,y2,c : integer); + Begin + call gr.patern(x1,y1,x2,y2,c,0); + End rectangle; + + Unit virtual rectanglef : procedure (x1,y1,x2,y2,c : integer); + Begin + writeln("coucou3 x1=",x1,"x2=",x2,"y1=",y1,"y2=",y2,"c=",c); + if gr=none then writeln("NONE!") fi; + call gr.patern(x1,y1,x2,y2,c,1); + + End rectanglef; + + Unit virtual ligne : procedure (x1,y1,x2,y2,c : integer); + Begin + call gr.color(c); + call gr.move(x1,y1); + call gr.draw(x2,y2); + End ligne; + + Unit virtual outxyascii : procedure (x,y,car,cf,cb :integer); + Begin + call gr.move(x,y); + call gr.color(cf); + call gr.border(cb); + call gr.hascii(car); + End outxyascii; + + Unit virtual outxytext : procedure (x,y :integer, chaine :string,c1,c2 :integer); + Begin + call gr.outstring(x,y,chaine,c1,c2); + End outxytext; + + Unit virtual affichesuite : procedure; + Var x,y : integer; + Begin + x:=x1+100-lborder; y:=y1+lbande+lborder+1; + call rectanglef(x,y,x+lborder,y2-lborder-1,cborder); + x:=x+lborder; y:=y2-100-lborder; + call rectanglef(x,y,x2-lborder,y+lborder,cborder); + xdeb:=x1+100+10; + ydeb:=y1+lborder+lbande+10; + End affichesuite; + begin + gr := none; + (* gr := new graphi; *) + End graph; + + Unit initialisation1 : procedure; + Var itermed1 : menu_v, + i,j : integer; + Begin + i:=w.lborder+10+20; j:=y1+w.lborder+10+w.lbande+20*4; + itermed1:=new menu_V(w.father,i,j,Blanc,GrisFonce); + call itermed1.insert("Nouveau",319,none); + call itermed1.insert("Ouvrir",320,none); + call itermed1.insert("D‚placer",321,none); + call itermed1.insert("Copier",322,none); + call itermed1.insert("Supprimer",323,none); + call itermed1.insert("Propri‚t‚",324,none); + i:=w.lborder+10; j:=y1+w.lborder+10+w.lbande; + w.barcde:=new menu_V(w.father,i,j,Blanc,GrisFonce); + call w.barcde.insert("Fichier",315,itermed1); + call w.barcde.insert("Options",316,none); + call w.barcde.insert("Fenetre",317,none); + call w.barcde.insert("Aide",318,none); + End initialisation1; + + Unit initialisation2 : procedure; + Begin + ListA:=new LAppli; + End initialisation2; + + Unit xdeb : function : integer; + Begin + result:=w.xdeb; + End xdeb; + + Unit ydeb : function : integer; + Begin + result:=w.ydeb; + End ydeb; + + Unit getw : function : windows; + Begin + result:=w; + End getw; + + + Begin + call gron(0 ); (* 3 = 1024x768x256 *) + j:=new graph(none,x1,y1,x2,y2); + w:=new windows(j,x1,y1,x2,y2); + + call w.option(Grisfonce,3,BleuClair,15,BleuCLair,Blanc,unpack("Gest_Wind")); + call initialisation1; + call w.affiche; + + call J.option(Grisfonce,3,BleuClair,15,BleuCLair,Blanc,unpack("Gest_Wind")); + call j.affichesuite; + (* accept getinfo; *) +(* enable xdeb,ydeb,getw; *) +(* call gest.ready; *) + call initialisation2; + return; + + do + (* accept event; *) + call traitement; + call Arbitrage; + od; + (* call groff; *) + attach(j.gr); + End Gest_wind; + + +(*****************************************************************************) +(* P r o g r a m m e P r i n c i p a l *) +(*****************************************************************************) +Var i : integer, + G1 : Gest_wind, + Z1 : applications, + G2 : Gest_event, + x,y :integer; + +Begin + active:= new set; + suspended :=new set; + G1:=new Gest_wind(0,0,640,480,none); + G2:=new Gest_event(G1); + call resumep(G1); + call resumep(G2); + call G1.getinfo(G2); + + x:=G1.w.xdeb; + writeln("x=",x); + y:=G1.w.ydeb; + writeln("y=",y); + Z1:=new applications(x+10,y+10,x+330,y+210,G1); + + + call G1.ListA.insert(new elm_a(Z1)); + call resumep(Z1); + call Arbitrage; + writeln("Dobro doszli"); +end +End. + + + + + + + + diff --git a/examples/pataud/new5.log b/examples/pataud/new5.log new file mode 100644 index 0000000..b228885 --- /dev/null +++ b/examples/pataud/new5.log @@ -0,0 +1,798 @@ +Program SystemedeFenetrage; + +Const Noir =0,Bleu =1,Vert =2,Cyan =3, + Rouge =4,Magenta =5,Marron =6,GrisCLair =7, + GrisFonce =8,BleuClair =9,VertClair =10,CyanClair =11, + RougeClair =12,MagentaClair =13,Jaune =14,Blanc =15; + +Const MODE = 0; +Const XMAX = 640, YMAX= 480; + + (*****************************************************************************) + (* premiere famille de classes : les classes graphiques *) + (*****************************************************************************) + Unit Ptr : class; + End Ptr; + + Unit Windows : process (node : integer,father :windows,x1,y1,x2,y2 : integer); + Var lborder,cfond,cborder : integer, + lbande,cfbande,cbbande : integer, + hauteur,largeur : integer, + xpos,ypos,xmax,ymax : integer, + xdeb,ydeb : integer, + num_id : integer, + ListM : Lclic, + ListK : LKey, + Bout : arrayof bottons, + nombande : arrayof char, + barcde : menu, + save_map : arrayof integer; + + + Unit option : procedure (l1,l2,l3,l4,l5,l6 : integer,l7 : string); + Begin + cfond:=l1; lborder:=l2; cborder:=l3; lbande:=l4; + cfbande:=l5; cbbande:=l6; + nombande:=unpack(l7); + xdeb:=x1+lborder+3; + ydeb:=y1+lborder+lbande+3; + bout(1):=new racc(this windows,x1+lborder+1,y1+lborder+1,x1+lborder+1+ + lbande,y1+lborder+1+lbande,spr_close); + bout(2):=new racc(this windows,x2-lborder-2-lbande*2,y1+lborder+1, + x2-lborder-2-lbande,y1+lborder+1+lbande,spr_lower); + bout(3):=new racc(this windows,x2-lborder-1-lbande,y1+lborder+1, + x2-lborder-1,y1+lborder+1+lbande,spr_upper); + End option; + + Unit Affiche : procedure; + Var i,j,k :integer; + Begin + call father.moveto(x1,y1); + save_map:=father.getmape(x2,y2); + call father.rectanglef(x1,y1,x2,y2,cfond); + for i:=0 to lborder + do + call father.rectangle(x1+i,y1+i,x2-i,y2-i,cborder); + od; + i:=y1+lborder+1; + call father.rectanglef(x1+lborder+1,i,x2-lborder-1,i+imax(14,lbande),cfbande); + j:=(x2-x1-2*lborder-8*(upper(nombande)-lower(nombande)))/2; + for i:=lower(nombande) to upper(nombande) + do + k:=x1+lborder+j+i*8; + call father.outxyascii(k,y1+lborder+2,ord(nombande(i)),cbbande,cfbande); + od; + call affichesuite; + if(barcde<>none) + then call barcde.affichemenu; + fi; + call bout(1).affiche; + call bout(2).affiche; + call bout(3).affiche; + call affichesuite; + End Affiche; + + Unit virtual affichesuite :procedure; + End affichesuite; + + Unit virtual moveto : procedure(x1,y1 : integer); + Begin + call father.moveto(x1,y1); + End moveto; + + Unit virtual getmape : function(x2,y2 : integer) : arrayof integer; + Begin + result:=father.getmape(x2,y2); + End getmape; + + Unit virtual putmape : procedure(a : arrayof integer); + Begin + call father.putmape(a); + End putmape; + + Unit virtual rectangle : procedure(xx1,yy1,xx2,yy2,c :integer); + Begin + call father.rectangle(xx1,yy1,xx2,yy2,c); + End rectangle; + + Unit virtual ligne : procedure (xx1,yy1,xx2,yy2,c : integer); + Begin + call father.ligne(xx1,yy1,xx2,yy2,c); + End ligne; + + Unit virtual rectanglef : procedure(xx1,yy1,xx2,yy2,c : integer); + Begin + call father.rectanglef(xx1,yy1,xx2,yy2,c); + End rectanglef; + + Unit virtual outxyascii : procedure(x,y,car,cf,cb : integer); + Begin + call father.outxyascii(x,y,car,cf,cb); + End outxyascii; + + Unit virtual outxytext : procedure(x,y:integer,chaine:string,c1,c2:integer); + Begin + call father.outxytext(x,y,chaine,c1,c2); + End outxytext; + + Unit virtual outxyint : procedure(x,y,val,cf,ce :integer); + Begin + call father.outxyint(x,y,val,cf,ce); + End outxyint; + + unit ydebut: function: integer; + begin + result := ydeb + end ydebut; + + unit xdebut: function: integer; + begin + result := xdeb + end xdebut; + + Unit EndWindow : procedure; + Begin + call father.moveto(x1,y1); + call putmape(save_map); + End EndWindow; + + Begin + hauteur:=y2-y1-2*lborder; + largeur:=x2-x1-2*lborder; + array bout dim (1:3); + return; + + enable outxytext, outxyascii, rectanglef, rectangle, affichesuite, + affiche, option, xdebut, ydebut, outxyint, ligne, moveto , + getmape, putmape, Endwindow; + do + accept + od + End Windows; + + (***********************************************************************) + Unit graph : windows class; + + Unit enablegraph : procedure; + Begin + End enablegraph; + + Unit disablegraph : procedure; + Begin + End disablegraph; + + Unit virtual rectangle : iiuwgraph procedure (x1,y1,x2,y2,c : integer); + Begin + call patern(x1,y1,x2,y2,c,0); + End rectangle; + + Unit virtual rectanglef : iiuwgraph procedure (x1,y1,x2,y2,c : integer); + Begin + call patern(x1,y1,x2,y2,c,1); + End rectanglef; + + Unit virtual ligne : iiuwgraph procedure (x1,y1,x2,y2,c : integer); + Begin + call color(c); + call move(x1,y1); + call draw(x2,y2); + End ligne; + + Unit virtual outxyascii : iiuwgraph procedure (x,y,car,cf,cb :integer); + Begin + call move(x,y); + call color(cf); + call border(cb); + call hascii(car); + End outxyascii; + + Unit virtual outxytext : iiuwgraph procedure (x,y :integer, + chaine :string,c1,c2 :integer); + Begin + call outstring(x,y,chaine,c1,c2); + End outxytext; + + Unit virtual outxyint : iiuwgraph procedure (x,y,val,cf,ce :integer); + Begin + call track(x,y,val,cf,ce); + End outxyint; + + Unit virtual moveto : iiuwgraph procedure (x1,y1 : integer); + Begin + call move(x1,y1); + End moveto; + + Unit virtual getmape : iiuwgraph function (x2,y2 : integer) : arrayof integer; + Begin + result:=getmap(x2,y2); + End getmape; + + Unit virtual putmape : iiuwgraph procedure (a : arrayof integer); + Begin + call putmap(a); + End putmape; + + Unit virtual affichesuite : procedure; + Var x,y : integer; + Begin + x:=x1+100-lborder; y:=y1+lbande+lborder+1; + call rectanglef(x,y,x+lborder,y2-lborder-1,cborder); + x:=x+lborder; y:=y2-100-lborder; + call rectanglef(x,y,x2-lborder,y+lborder,cborder); + xdeb:=x1+100+10; + ydeb:=y1+lborder+lbande+10; + End affichesuite; + + Begin + return; + + enable affichesuite,affiche, option, xdebut, ydebut, + enablegraph,disablegraph; + do + accept + od + End graph; + + + Unit Bitmap : Windows Class; + End Bitmap; + + Unit Son : Windows Class; + End Son; + + Unit Maine : Windows Class; + End Maine; + + Unit Dialogue : Son Class; + End Dialogue; + + Unit Catalogue : Dialogue Class; + End Catalogue; + + Unit Question : Dialogue Class; + End Question; + + Unit Widgets : class(father : windows); + End Widgets; + + (**********************************************************************) + Unit Menu : Widgets Class(x,y,col_e,col_f: integer); + Var liste : ensemble; + + Unit item : element class(nom : string,key : integer,suite :Menu); + End item; + + Unit insert : procedure(nom : string,key : integer,s : menu); + var e : item; + Begin + e:=new item(nom,key,s); + if(liste=none) + then liste:=new ensemble; + fi; + call liste.insert(e); + End insert; + + Unit virtual affichemenu : procedure; + End affichemenu; + + End Menu; + + Unit Menu_V : Menu Class; + + Unit virtual affichemenu : procedure; + Var cour : item, + tlen : arrayof char, + len : integer, + xx,yy : integer; + Begin + (* ... *) + End affichemenu; + + End Menu_V; + + Unit Menu_H : Menu Class; + + Unit virtual affichemenu : procedure; + Var cour : item, + tlen : arrayof char, + len : integer, + xx,yy : integer; + Begin + (* ... *) + End affichemenu; + + End Menu_H; + + (***********************************************************************) + Unit Bottons : Widgets Class(x1,y1,x2,y2 : integer); + Unit affiche : procedure; + Begin + call father.rectanglef(x1,y1,x2,y2,GrisClair); + call father.ligne(x1,y1,x2,y1,blanc); + call father.ligne(x1,y1+1,x2-1,y1+1,blanc); + call father.ligne(x1,y1,x1,y2,blanc); + call father.ligne(x1+1,y1+2,x1+1,y2-1,blanc); + call father.ligne(x1+1,y2,x2,y2,GrisFonce); + call father.ligne(x1+2,y2-1,x2-1,y2-1,GrisFonce); + call father.ligne(x2,y2,x2,y1+1,GrisFonce); + call father.ligne(x2-1,y2-1,x2-1,y1+2,GrisFonce); + call affichesuite; + End affiche; + + Unit virtual affichesuite : procedure; + End affichesuite; + + End Bottons; + + Unit Racc : Bottons Class(procedure sprite(x1,y1,x2,y2,c : integer, + father :windows)); + Unit virtual affichesuite : procedure; + Begin + call sprite(x1,y1,x2,y2,Noir,father); + End affichesuite; + End Racc; + + Unit Opt_list : Bottons Class; + End Opt_list; + + Unit Oneline : Opt_list Class; + End Oneline; + + Unit Multiline : Opt_list Class; + End Multiline; + + Unit Botton : Bottons Class; + End Botton; + + Unit Lift : Widgets Class; + End Lift; + + Unit Lift_V : Lift Class; + End Lift_V; + + Unit Lift_H : Lift Class; + End Lift_H; + + + + +(***************************************************************************) +(* procedure d'affichage des sprites des boutons *) +(***************************************************************************) + +(***************************************************************************) + Unit spr_upper : procedure(x1,y1,x2,y2,couleur : integer,father:windows); + var i,x,y : integer; + Begin + x:=(x2-x1)/2; + y:=(y2-y1)/2; + for i:=1 to y + do + call father.Ligne(x1+x-i/2,y1+y/2+i,x1+x+i/2,y1+y/2+i,couleur); + od + End spr_upper; + +(***************************************************************************) + Unit spr_lower : procedure(x1,y1,x2,y2,couleur : integer,father:windows); + var i,x,y : integer; + Begin + x:=(x2-x1)/2; + y:=(y2-y1)/2; + for i:=1 to y + do + call father.Ligne(x1+x-i/2,y2-y/2-i,x1+x+i/2,y2-y/2-i,couleur); + od + End spr_lower; + +(***************************************************************************) + Unit spr_left : procedure(x1,y1,x2,y2,couleur : integer,father:windows); + var i,x,y : integer; + Begin + x:=(x2-x1)/2; + y:=(y2-y1)/2; + for i:=1 to x + do + call father.Ligne(x2-x/2-i,y1+y-i/2,x2-x/2-i,y1+y+i/2,couleur); + od + End spr_left; + +(***************************************************************************) + Unit spr_right : procedure(x1,y1,x2,y2,couleur : integer,father:windows); + var i,x,y : integer; + Begin + x:=(x2-x1)/2; + y:=(y2-y1)/2; + for i:=1 to x + do + call father.Ligne(x1+x/2+i,y1+y-i/2,x1+x/2+i,y1+y+i/2,couleur); + od + End spr_right; + +(***************************************************************************) + Unit spr_close : procedure(x1,y1,x2,y2,couleur : integer,father:windows); + var y : integer; + Begin + y:=(y2-y1)/2; + call father.Rectanglef(x1+3,y1+y-1,x2-3,y1+y+1,couleur); + End spr_close; + +(***************************************************************************) + Unit spr_point : procedure(x1,y1,x2,y2,couleur : integer,father:windows); + var x,y : integer; + Begin + y:=(y2-y1)/2; + x:=(x2-x1)/2; + call father.Rectanglef(x1+x-1,y1+y-1,x1+x+1,y1+y+1,couleur); + End spr_point; + + + + (*****************************************************************************) + (* deuxieme famille de classes : les structures de donnees *) + (*****************************************************************************) + Unit element : class; (* general *) + End element; + + Unit elm_c : element class(id,x1,y1,x2,y2 : integer); (* listclic *) + End elm_c; + + Unit elm_a : element class(p : Applications); (* liste application *) + End elm_a; + + + Unit Ensemble : CLass; + Var root,last : node, + courant : node; + + Unit node : class(elm : element); + Var next : node; + End node; + + Unit virtual insert : procedure(e : element); + Begin + if not member(e) + then if empty + then root:=new node(e); + last:=root; + else last.next:=new node(e); + last:=last.next; + fi + fi + End insert; + + Unit virtual delete : procedure(e : element); + Var flag : node; + Begin + if member(e) + then flag:=courant.next; + if flag=last + then last:=courant; + courant.next:=none; + kill(flag); + else if courant.next<>none + then courant.next:=courant.next.next; + kill(flag); + fi + fi + fi + End delete; + + Unit virtual member : function (e : element) : boolean; + Var savecou : node, + bl : boolean; + Begin + courant:=root; + savecou:=courant; + bl:=false; + while(courant<>none) + do + if not egalite(courant.elm,e) + then savecou:=courant; + courant:=courant.next; + else bl:=true; + exit; + fi + od; + courant:=savecou; + result:=bl; + End member; + + Unit virtual egalite : function (e1,e2 :element) :boolean; + End egalite; + + Unit empty : function : boolean; + Begin + result:=(root=none); + End empty; + + Unit initialise : procedure; + Begin + courant:=root; + End initialise; + + Unit getelm : function(output e : element) :boolean; + Begin + if(courant<>none) + then e:=courant.elm; + result:=true; + courant:=courant.next; + else result:=false; + fi + End getelm; + + End Ensemble; + + Unit Queue : Ensemble Class; + End Queue; + + Unit Ofpriority : Queue Class; + End Ofpriority; + + Unit ListD : Ensemble Class; + End ListD; + + Unit LClic : ListD Class; + + Unit virtual egalite : function (e1,e2 :element) :boolean; + Begin + if (e1 qua elm_c.x1=e2 qua elm_c.x1 and e1 qua elm_c.x2=e2 qua elm_c.x2 + and e1 qua elm_c.y1=e2 qua elm_c.y1 and e1 qua elm_c.y2=e2 qua elm_c.y2) + then result:=TRUE; + else result:=FALSE; + fi + End egalite; + + Unit appartient : function (x,y : integer) : boolean; + Var e : elm_c, + b : boolean; + Begin + call initialise; + b:=false; + while(getelm(e)) + do + if (x>=e.x1 and x<=e.x2 and y>=e.y1 and y<=e.y2) + then b:=TRUE; + exit; + fi + od; + result:=b; + End appartient; + + End LClic; + + Unit LBot : ListD Class; + End LBot; + + Unit LAppli : ListD Class; + Unit egalite : function (e1,e2 :elm_a) :boolean; + Begin + if (e1 qua elm_a.p = e2 qua elm_a.p) + then result:=TRUE; + else result:=FALSE; + fi; + End egalite; + End LAppli; + + Unit LKey : ListD Class; + End LKey; + + Unit LWin : ListD Class; + End LWin; + + Unit Stack : Ensemble Class; + End Stack; + + + + (*****************************************************************************) + (* Famille de process *) + (*****************************************************************************) + Unit Applications : process (node,x1,y1,x2,y2: integer,father: Gest_Wind); + Var w : windows, (* maine *) + j : graph, + Filles : windows, (* son *) + i : integer, + nom : string; + + Unit virtual gestionnaire : procedure(id : integer); + Begin + End gestionnaire; + + Unit affecte : procedure ( nm : string); + Begin + nom:=nm; + End affecte; + + Begin + w:=new windows(0,father.getw,x1,y1,x2,y2); + resume(w); + return; + accept affecte; + call w.option(Noir,3,Bleu,15,Bleu,Blanc,nom); + call w.affiche; + End Applications; + + (************************************************************************) + (************************************************************************) + Unit Gest_event : mouse process (node : integer,gest : gest_wind); + + Unit ready : procedure; + End ready; + + Unit event : function(output v,h,p,l,r,c : integer) : boolean; + Begin + result:=getpress(v,h,p,l,r,c); + End; + + Var i :integer, + v,h,p,l,r,c : integer; + Begin + return; + accept ready; + call init(1,1); + call showcursor; + do + if(event(v,h,p,l,r,c)) + then call gest.event(v,h,p,l,r,c); + fi; + od + End Gest_event; + + (***********************************************************************) + (***********************************************************************) + Unit Gest_wind : iiuwgraph process(node,x1,y1,x2,y2 : integer, + gest:gest_event); + + Var i,k,px,py :integer, + v,p,h,l,r,c : integer, + ListK : LKey, + ListM : LClic, + ListA : LAppli, + w : windows, + j : graph; + + + Unit getinfo : procedure (g : gest_event); + Begin + gest:=g; + disable getinfo; + End getinfo; + + Unit event : procedure (input lv,lh,lp,ll,lr,lc : integer); + Begin + v:=lv; h:=lh; p:=lp; l:=ll; r:=lr; c:=lc; + call traitement; + End event; + + + Unit traitement : procedure; + + Unit fin : procedure; + begin + call groff; + call endrun; + End fin; + + Begin + if((p=164 and l=27) or c=3) + then call fin; + fi; + (* recherche dans un arbre des fenetres filles si l'evenement *) + (* appartient a qqn *) + (* ici c'est a refaire, c'est juste pour tester *) + if(c=1) + then if(v>110 and v<400 and h>50 and h<250) + then writeln("coucou"); + fi; + fi; + End traitement; + + + + Unit initialisation2 : procedure; + Begin + ListA:=new LAppli; + End initialisation2; + + Unit xdeb : function : integer; + Begin + result:=j.xdebut; + End xdeb; + + Unit ydeb : function : integer; + Begin + result:=j.ydebut; + End ydeb; + + Unit getw : function : windows; + Begin + result:=w; + End getw; + + + Unit insertA : procedure(e : applications); + Begin + call ListA.insert(new elm_a(e)); + end; + + + + Begin + call gron(MODE); (* 5 = 1024x768x256 *) + j:=new graph(0,none,x1,y1,x2,y2); + resume(j); + w:=new windows(0,j,x1,y1,x2,y2); + resume(w); + call w.option(Grisfonce,3,BleuClair,15,BleuCLair,Blanc,"Gest_Wind"); + call w.affiche; + call J.option(Grisfonce,3,BleuClair,15,BleuCLair,Blanc,"Gst_Windows"); + call j.affichesuite; + return; + + accept getinfo; + enable xdeb,ydeb,getw,insertA; + call gest.ready; + call initialisation2; + enable event; + px:=w.xdebut; py:=w.ydebut; + i:=1; + do + call w.outxyint(px,py,i,Bleu,Blanc); + i:=i+1; + od; + call groff; + End Gest_wind; + + + Unit Appli : Applications class; + Var px,py : integer; + Begin + px:=w.xdebut; py:=w.ydebut; + call w.outxytext(px,py,"coucou",Vert,Noir); + i:=1; + do + call w.outxyint(px,py+20,i,Bleu,Blanc); + i:=i+1; + od + End Appli; + + +(*****************************************************************************) +(* P r o g r a m m e P r i n c i p a l *) +(*****************************************************************************) +Var i : integer, + G1 : Gest_wind, + Z1,Z2 : appli, + G2 : Gest_event, + x,y :integer; + +Begin + G1:=new Gest_wind(0,0,0,XMAX,YMAX,none); + G2:=new Gest_event(0,G1); + resume(G1); + resume(G2); + call G1.getinfo(G2); + + x:=G1.xdeb; + y:=G1.ydeb; + + Z1:=new appli(0,x+10,y+10,x+330,y+210,G1); + resume(Z1); + call G1.insertA(Z1); + call Z1.affecte("Application - 1 -"); + + Z2:=new appli(0,x+250,y+80,x+520,y+250,G1); + resume(Z2); + call G1.insertA(Z2); + call Z2.affecte("Application - 2 -"); + + +End. + + + + + + + + diff --git a/examples/pataud/proc2.log b/examples/pataud/proc2.log new file mode 100644 index 0000000..41cf8f4 --- /dev/null +++ b/examples/pataud/proc2.log @@ -0,0 +1,400 @@ + + program processus4; + +(* czytelnicy pisarze *) + unit elem : class; + var ile , nr : integer,qui:pi; + (*nr procesu ktory zostawil informacje lub ostatni FreePl w buforze*) + end elem; + + unit ecran :IIUWGRAPH process(node:integer); + + unit outtext : procedure(x,y:integer, s:string); + var A: arrayof char, i: integer; + begin + call move(x,y); + call color(14); (* yellow *) + A := unpack(s); + for i := lower(A) to upper(A) do + (* call HASCII(0); *) + call HASCII(ord(A(i))); + od; + end outtext; + + unit outmessage: procedure(x,y:integer, s: string); + var A: arrayof char, i: integer; + begin + call move(x,y); + call color(12); (* rouge clair *) + A := unpack(s); + for i := lower(A) to upper(A) do + call HASCII(ord(A(i))) + od + end outmessage; + + unit circle: procedure(col,x,y,r : integer); + var i: integer; + begin + call color(col); + call rectangle(x,y,r,r); + for i := 1 to r-1 do + call line(col,x,y+i,r,true) + od + end circle; + + unit line : procedure(col,x,y,dlugosc:integer,poziomo:boolean); + begin + call color(col); + call move(x,y); (* pozycja linii *) + if poziomo + then + call draw(x+dlugosc,y); + else (* linia pionowa *) + call draw(x, y+dlugosc); + fi; + end line; + + + unit Fin:procedure; + begin + call GrOFF; call endRun + end fin; + + unit pisarz: procedure(nr:integer); + begin + call color(2*nr+1); + call circle(2*nr+1,(nr-1)*150+20,8,10); + (* call rectangle((nr-1)*150+20,10,10,10);*) + call rectangle((Nr-1)*150+10,20,80,200); + end pisarz; + + unit rectangle:procedure(x,y,dl,wys:integer); + var i: integer; + begin + call move(x,y); + call draw(x+dl,y); + call draw(x+dl,y+wys); + call draw(x,y+wys); + call draw(x,y); + end rectangle; + + unit magazyn : procedure; + begin + call color(1); + call rectangle(10,250,600,50); + end magazyn; + begin + call gron(1); + return; + enable magazyn,pisarz; + do + accept Fin, line, circle, outtext, outmessage + od; + + end ecran; + + unit pi : elem process(node,nr : integer, M : monitor,ek:ecran); + (* nr jest numerem pisarza *) + const stala=62;(* dludosc linii rysowanej przez pisarza *) + var posX, posY:integer; (* pozycja pisarza na ekranie *) + + unit tempo : procedure(n:integer); + var i : integer; + begin + for i :=1 to n do i:=i od + end tempo; + + + unit wezwij_put : procedure(e:elem); + var czekaj : boolean; + begin + (* najpierw wymazuje z obszaru pisarza *) + call ek.outtext((nr-1)*150+20,200,"sends "); + for i := 1 to e.ile + do + call ek.line(0,(nr-1)*150+22,32+i,stala, true); + call tempo(200); + od; + call ek.outtext((nr-1)*150+20,200,"waiting "); + do + call M.putt(e.nr, e.qui, e.ile, czekaj); + if czekaj + then + call ek.outmessage((nr-1)*150+20,180,"stopped"); + stop + else + exit + fi; + od; + end wezwij_put; + + unit wezwij_get : procedure(inout e:elem); + var czekaj : boolean, qui:pi,n,ch:integer ; + begin + + do + n := e.nr; qui := e.qui; + call m.gett(n,qui,ch, czekaj); + if czekaj then + call ek.outmessage((nr-1)*150+20,180,"stopped"); + stop + else + e:=new elem; e.nr :=n; + e.qui:=qui; e.ile :=ch; + call ek.outtext((nr-1)*150+20,200,"receives"); + for i := 1 to ch + do + call ek.line(2*n+1,(nr-1)*150+22,32+i,stala,true); + call tempo(200); + od; + call ek.outtext((nr-1)*150+20,200, " "); +(* otrzymalem wiadomosc od pisarza nr *) + exit + fi; + od; + end wezwij_get; + + unit fin : procedure; + end; + +var el: elem, r : real; +begin + call ek.pisarz(nr); + call ek.outtext((nr-1)*150+36,8,"Actor"); + return; + do + r := random*100; + if r=0 then accept fin; exit fi; + (* to niezbt dobre rozwiazanie ze wzgl na kolejnosc *) + if r<50 then + (* pisarz cos produkuje i chce to wyslac *) + el := new elem; + el.qui := this pi; + el.nr := nr; + el.ile := random*175; + call ek.outtext((nr-1)*150+20,200,"writes "); + for i := 1 to el.ile + do + call ek.line(2*nr+1,(nr-1)*150+22,26+i,stala,true); + call tempo(250); + od; + call ek.outtext((nr-1)*150+20,200," "); + call tempo(400); + call wezwij_put(el) + else + (* pisarz zdecydowal sie cos przeczytac *) + el := new elem; + el.nr := nr; el.qui := this pi; + call ek.outtext((nr-1)*150+20,200,"demands "); + call wezwij_get(el); + call ek.outtext((nr-1)*150+20,200," "); + call tempo(500); + call ek.outtext((nr-1)*150+20,200,"reads "); + (* czytam przesylke *) + for i := el.ile downto 1 + do + call ek.line(0,(nr-1)*150+22,26+i,stala,true); + call tempo(250); + od; + call ek.outtext((nr-1)*150+20,200," "); + + fi; + od; +end pi; + +unit monitor : elem process(node,size,max_proc : integer, ek:ecran); +const posX = 30, + posY = 250; + unit Belem : class(e:elem,posx:integer); + end Belem; + +var buffer : arrayof Belem, + queue_pour_lire, + queue_pour_ecrire: queue, + Qpos:integer, + counter, ilosc_ak, i,x, nb_proc: integer; + (* zmienna counter mowi ile jest elementow w buforze *) + (* ilosc_ak = ilosc miejsca w magazynie juz wykorzystana*) + (* nb_proc = ilosc procesow stojacuch w obu kolejkach *) + + unit qEl: class; + var qui : pi, next : qEL; + end qEL; + + unit queue: class(pos:integer); + var first, last : qEL; + + unit into : procedure(p: pi,nr: integer (* nr is the no of pi*)); + var aux : qEL, c:integer; + begin + + call ek.circle(2*nr+1,pos+30,339,10); + pos := pos+30; + (* rysowanie kolka w odpowiedniej kolejce i odp.kolorem*) + nb_proc := nb_proc+1; + aux := new qEL; + aux .qui :=p; + aux . next := none; + if first=none then + first := aux; last := aux + else + last.next := aux; + last := aux; + fi; + end into; + + unit out : function : pi; + begin + if first=none then exit else + nb_proc := nb_proc -1; + call ek.circle(0,pos,339,10); + pos :=pos-30; + (* wymazanie kolka w odpowiedniej kolejce *) + result := first.qui; + first := first.next; + fi; + end out; + + unit empty : function: boolean; + begin + result := (first=none) ; + end empty; + end queue; + + unit tempo : procedure(n:integer); + var j,x:integer; + begin + for j := 1 to n do x:=x od; + end tempo; + + unit putt : procedure(n:integer,qui:pi,ch:integer; output czekaj : boolean); + var aux, i : integer,e : elem; + begin + + if (counter< 20 and ilosc_ak+ch 0 then (* mozna cos zabrac z magazynu *) + e := buffer(counter).e; + nr := e.nr; qui := e.qui; ch := e.ile; + counter := counter - 1; + czekaj := false; + for i := x downto x-ch + do + call ek.line(0,i,posY+7,39,false); + call tempo(200); + + od; + x := x-ch; + ilosc_ak := ilosc_ak-ch; + (* w magazynie zwolnilo sie miejsce i ktos moze wpisac *) + + if not queue_pour_ecrire.empty + then + (* writeln("M budzi pisarza ktory chce pisac ");*) + p := queue_pour_ecrire.out; + call ek.outtext((nr-1)*150,180," "); + resume(p); + fi; + else (*jezeli counter=0 tzn. nic nie ma w magazynie *) +(* writeln("M wpisuje pisarza",nr,"do kolejki czytelnikow");*) + czekaj := true; + qui := p;(* to jest instrukcja niepotrzebna *) + call queue_pour_lire.into(p,nr); + fi; + end gett; + +begin (* tu sie zaczyna tresc monitora *) + + array buffer dim(1:20); + + counter := 0; + x := 12; ilosc_ak := 0; + Qpos := posX; + queue_pour_lire := new queue(Qpos); + queue_pour_ecrire := new queue(Qpos+300); + call ek.magazyn; + call ek.outtext(posX,posY-6,"BUFFER"); + call ek.outtext(posX,posY+60,"READERS' QUEUE"); + call ek.outtext(posX+ 300, posY+60,"WRITERS'QUEUE"); + return; + do + accept putt, gett; + if nb_proc = max_proc + then + call ek.outmessage(470,339,"DEADLOCK! press CR"); + readln; + call ek.fin; + fi; + od; +end monitor; + + + (* M A I N *) + +var PROC : arrayof pi,p,P1,P2,P3 : pi, + M : monitor, + EK : ecran, + i, NbProc : integer; + +begin + + write("NbProc : "); + readln(NbProc); + array Proc dim(1:NbProc); + + ek := new ecran(0); + resume(ek); + M := new monitor(0,550,NbProc,ek); + resume(M); + for i := 1 to NbProc + do + P := new pi(0,i,M,ek); + Proc(i) := P; + od; + + + call ek.outmessage(550,320,"press CR"); + readln; + call ek.outtext(550,320," "); + + for i :=1 to NbProc + do p := Proc(i); + resume(p); + od; + + +end processus4; diff --git a/examples/pataud/simula.log b/examples/pataud/simula.log new file mode 100644 index 0000000..7509c94 --- /dev/null +++ b/examples/pataud/simula.log @@ -0,0 +1,2663 @@ +Program simulation; + +(***************************************************************************) +(* Programme de systŠme de fenetrage avec boutons et gestion de la souris *) +(* ainsi que de simulation d'un r‚seau routier en ville. *) +(* BARETS Olivier & PATAUD Fr‚d‚ric & PEYRAT Fran‡ois 1993/1994 *) +(* plateforme : PC-DOS_386 avec clavier 102 touches / mode VGA / souris *) +(* PC 486DX33 16Mo Ram *) +(***************************************************************************) + +Begin +Pref iiuwgraph block + + Begin + Pref mouse block + + Const Noir = 0, Bleu = 1, Vert = 2, Cyan = 3, + Rouge = 4, Magenta = 5, Marron = 6, GrisClair = 7, + GrisFonce = 8, BleuClair = 9, VertClair =10, CyanClair =11, + RougeClair =12, MagentaClair=13, Jaune =14, Blanc =15; + + Const T_F1 =315, T_F2 =316, T_F3 =317, T_F4 =318, + T_F5 =319, T_F6 =320, T_F7 =321, T_F8 =322, + T_F9 =323, T_F10 =324, T_SHFTF1 =340, T_SHFTF2 =341, + T_SHFTF3 =342, T_SHFTF4 =343, T_SHFTF5 =344, T_SHFTF6 =345, + T_SHFTF7 =346, T_SHFTF8 =347, T_SHFTF9 =348, T_SHFTF10=349, + T_CTRLF1 =350, T_CTRLF2 =351, T_CTRLF3 =352, T_CTRLF4 =353, + T_CTRLF5 =354, T_CTRLF6 =355, T_CTRLF7 =356, T_CTRLF8 =357, + T_CTRLF9 =358, T_CTRLF10=359, T_ALTF1 =360, T_ALTF2 =361, + T_ALTF3 =362, T_ALTF4 =363, T_ALTF5 =364, T_ALTF6 =365, + T_ALTF7 =366, T_ALTF8 =367, T_ALTF9 =368, T_ALTF10 =369, + Tou_Ent =013, T_ESC =027, T_N =078, T_Y =089, + T_FLGCH =331, T_FLDTE =333, T_FLHAU =328, T_FLBAS =336, + T_ALT1 =376, T_ALT2 =377, T_PGUP =329, T_PGDOWN =337; + + Var SIZEX : integer, + SIZEY : integer; + + +(* les variables du systŠme de fenetrage *) + + Var code : integer, + Larg_Vil : integer, (* largeur de la ville *) + Haut_Vil : integer, (* Hauteur de la ville *) + Larg_Aff : integer, (* largeur de l'interieur de la fenetre maine *) + Haut_Aff : integer, (* hauteur de l'interieur de la fenetre maine *) + Xdep_Aff : integer, (* Point de depart de l'affichage en X ds maine *) + Ydep_Aff : integer, (* point de depart de l'affichage en Y ds maine *) + COEF_X : real, (* coeficient de zoom en x *) + COEF_Y : real, (* coeficient de zoom en y *) + COORD_X : integer, (* coordonn‚e en X de Xdep_Aff en relatif *) + COORD_Y : integer, (* coordonn‚e en Y de Ydep_Aff en relatif *) + W : Maine, + Keys : ListKey, + M : arrayof Menu, + clics : cliquer; + + +(* les variables de la simulation *) + + Var RaciSomm : Sommets, + RaciArcs : Arcs, + NbCarActiv : integer, + NBSOMMETS : integer; + + Unit pointeur : class; + End pointeur; + + + +(***************************************************************************) +(* definition des classes et procedures de simprocess *) +(***************************************************************************) + + +UNIT PRIORITYQUEUE: CLASS; + + (* HEAP AS BINARY LINKED TREE WITH FATHER LINK*) + + + UNIT QUEUEHEAD: CLASS; + (* HEAP ACCESING MODULE *) + VAR LAST,ROOT:NODE; + + UNIT MIN: FUNCTION: ELEM; + BEGIN + IF ROOT=/= NONE THEN RESULT:=ROOT.EL FI; + END MIN; + + UNIT INSERT: PROCEDURE(R:ELEM); + (* INSERTION INTO HEAP *) + VAR X,Z:NODE; + BEGIN + X:= R.LAB; + IF LAST=NONE THEN + ROOT:=X; + ROOT.LEFT,ROOT.RIGHT,LAST:=ROOT + ELSE + IF LAST.NS=0 THEN + LAST.NS:=1; + Z:=LAST.LEFT; + LAST.LEFT:=X; + X.UP:=LAST; + X.LEFT:=Z; + Z.RIGHT:=X; + ELSE + LAST.NS:=2; + Z:=LAST.RIGHT; + LAST.RIGHT:=X; + X.RIGHT:=Z; + X.UP:=LAST; + Z.LEFT:=X; + LAST.LEFT.RIGHT:=X; + X.LEFT:=LAST.LEFT; + LAST:=Z; + FI + FI; + CALL CORRECT(R,FALSE) + END INSERT; + +UNIT DELETE: PROCEDURE(R: ELEM); + VAR X,Y,Z:NODE; + BEGIN + X:=R.LAB; + Z:=LAST.LEFT; + IF LAST.NS =0 THEN + Y:= Z.UP; + Y.RIGHT:= LAST; + LAST.LEFT:=Y; + LAST:=Y; + ELSE + Y:= Z.LEFT; + Y.RIGHT:= LAST; + LAST.LEFT:= Y; + FI; + Z.EL.LAB:=X; + X.EL:= Z.EL; + LAST.NS:= LAST.NS-1; + R.LAB:=Z; + Z.EL:=R; + IF X.LESS(X.UP) THEN CALL CORRECT(X.EL,FALSE) + ELSE CALL CORRECT(X.EL,TRUE) FI; + END DELETE; + +UNIT CORRECT: PROCEDURE(R:ELEM,DOWN:BOOLEAN); + (* CORRECTION OF THE HEAP WITH STRUCTURE BROKEN BY R *) + VAR X,Z:NODE,T:ELEM,FIN,LOG:BOOLEAN; + BEGIN + Z:=R.LAB; + IF DOWN THEN + WHILE NOT FIN DO + IF Z.NS =0 THEN FIN:=TRUE ELSE + IF Z.NS=1 THEN X:=Z.LEFT ELSE + IF Z.LEFT.LESS(Z.RIGHT) THEN X:=Z.LEFT ELSE X:=Z.RIGHT + FI; FI; + IF Z.LESS(X) THEN FIN:=TRUE ELSE + T:=X.EL; + X.EL:=Z.EL; + Z.EL:=T; + Z.EL.LAB:=Z; + X.EL.LAB:=X + FI; FI; + Z:=X; + OD + ELSE + X:=Z.UP; + IF X=NONE THEN LOG:=TRUE ELSE LOG:=X.LESS(Z); FI; + WHILE NOT LOG DO + T:=Z.EL; + Z.EL:=X.EL; + X.EL:=T; + X.EL.LAB:=X; + Z.EL.LAB:=Z; + Z:=X; + X:=Z.UP; + IF X=NONE THEN LOG:=TRUE ELSE LOG:=X.LESS(Z); + FI; + OD + FI; + END CORRECT; + +END QUEUEHEAD; + + + UNIT NODE: CLASS (EL:ELEM); + (* ELEMENT OF THE HEAP *) + VAR LEFT,RIGHT,UP: NODE, NS:INTEGER; + UNIT LESS: FUNCTION(X:NODE): BOOLEAN; + BEGIN + IF X= NONE THEN RESULT:=FALSE + ELSE RESULT:=EL.LESS(X.EL) FI; + END LESS; + END NODE; + + + UNIT ELEM: CLASS(PRIOR:REAL); + (* PREFIX OF INFORMATION TO BE STORED IN NODE *) + VAR LAB: NODE; + UNIT VIRTUAL LESS: FUNCTION(X:ELEM):BOOLEAN; + BEGIN + IF X=NONE THEN RESULT:= FALSE ELSE + RESULT:= PRIOR< X.PRIOR FI; + END LESS; + BEGIN + LAB:= NEW NODE(THIS ELEM); + END ELEM; + + +END PRIORITYQUEUE; + + + +UNIT SIMULATION: PRIORITYQUEUE CLASS; +(* THE LANGUAGE FOR SIMULATION PURPOSES *) + + VAR CURR: SIMPROCESS, (*ACTIVE PROCESS *) + PQ:QUEUEHEAD, (* THE TIME AXIS *) + MAINPR: MAINPROGRAM; + + + UNIT SIMPROCESS: pointeur COROUTINE; + (* USER PROCESS PREFIX *) + VAR EVENT, (* ACTIVATION MOMENT NOTICE *) + EVENTAUX: EVENTNOTICE, + (* THIS IS FOR AVOIDING MANY NEW CALLS AS AN RESULT OF *) + (* SUBSEQUENT PASSIVATIONS AND ACTIVATIONS *) + FINISH: BOOLEAN; + + UNIT IDLE: FUNCTION: BOOLEAN; + BEGIN + RESULT:= EVENT= NONE; + END IDLE; + + UNIT TERMINATED: FUNCTION :BOOLEAN; + BEGIN + RESULT:= FINISH; + END TERMINATED; + + UNIT EVTIME: FUNCTION: REAL; + (* TIME OF ACTIVATION *) + BEGIN + IF IDLE THEN CALL ERROR1; + FI; + RESULT:= EVENT.EVENTTIME; + END EVTIME; + + UNIT ERROR1:PROCEDURE; + BEGIN + ATTACH(MAIN); + WRITELN(" AN ATTEMPT TO ACCESS AN IDLE PROCESS TIME"); + END ERROR1; + + UNIT ERROR2:PROCEDURE; + BEGIN + ATTACH(MAIN); + WRITELN(" AN ATTEMPT TO ACCESS A TERMINATED PROCESS TIME"); + END ERROR2; + BEGIN + + RETURN; + INNER; + FINISH:=TRUE; + CALL PASSIVATE; + CALL ERROR2; + END SIMPROCESS; + + +UNIT EVENTNOTICE: ELEM CLASS; + (* A PROCESS ACTIVATION NOTICE TO BE PLACED ONTO THE TIME AXIS PQ *) + VAR EVENTTIME: REAL, PROC: SIMPROCESS; + + UNIT VIRTUAL LESS: FUNCTION(X: EVENTNOTICE):BOOLEAN; + (* OVERWRITE THE FORMER VERSION CONSIDERING EVENTTIME *) + BEGIN + IF X=NONE THEN RESULT:= FALSE ELSE + RESULT:= EVENTTIME< X.EVENTTIME OR + (EVENTTIME=X.EVENTTIME AND PRIOR< X.PRIOR); FI; + + END LESS; + END EVENTNOTICE; + + +UNIT MAINPROGRAM: SIMPROCESS CLASS; + (* IMPLEMENTING MASTER PROGRAM AS A PROCESS *) + BEGIN + DO ATTACH(MAIN) OD; + END MAINPROGRAM; + +UNIT TIME:FUNCTION:REAL; + (* CURRENT VALUE OF SIMULATION TIME *) + BEGIN + RESULT:=CURRENT.EVTIME + END TIME; + +UNIT CURRENT: FUNCTION: SIMPROCESS; + (* THE FIRST PROCESS ON THE TIME AXIS *) + BEGIN + RESULT:=CURR; + END CURRENT; + +UNIT SCHEDULE: PROCEDURE(P:SIMPROCESS,T:REAL); + (* ACTIVATION OF PROCESS P AT TIME T AND DEFINITION OF "PRIOR"- PRIORITY *) + (* WITHIN TIME MOMENT T *) + BEGIN + IF TD0Dvk%7s=LFfBUJQX#UaEIzFoa?mvIb4MK-6_a8m^;mMyVff)rI}J_KVff4v!9S-`*b%uuq$t zZI^ylLt9$CczG>oa);9XioL%Cd@X1N28(~D&}u7cAN_#PqQZge`Oy$+6(WN4WIy|p zgOgLvG$%yP?+Hh!l@UmuR0L};kMWliUiqGbL!^vPaZoHXuoyFvq)e4 z1~_gNt%ExP9T3T2zMh^;C+9z5VR|8gymG|QtAlgywhSTd{4$ih2L2Y{aMT;z7n}yi zO}my)si*qMNwGXTn&)9_OLC^O9`%T4vie$pt9U|lV7qcnauxMp_;4U4gF})ZWKlw& zoEP8@_4Gh*UBn{mboIME9wCZnIF|MYND|uS5tw$aMgh)`tVJeezyxB-lUli4{EjF3 zfma{&i6ob1{VBjDRK-_FwKq$VcJbkN4T*XmL$#&gLaA$i$-vbV#793MxPRSBDxpl) z_vE>KE#%0wMZKInSpjQ7t!q5a0Dm+;$_fR4(7r^HbOi~&;P~QL0PbzyOCw6K4#6en zQEO5H#R-mUPx$ay5-j)P8;-<@tMjO72bS>dDaMPGPHPTu67=Lx^RArulhu?ryhEgt z*RiI4^M9on()G^J^t}ZD@EXHgj@nF+=FWXNJ{mRe=QVMv;Te>zzn8X>nm`$uCS23r ztG>=^;tjSJbdvKqxJ*wK$v30boYl#X=vZTWX*{ooorEM5)qF?pD*Y zA&qV9Ev>)mT(zVL0`fHl!^7eg8%I3O(g8-!k{5Gq_B?@QU^p=hbx8}Sgy99~9#`N% zA_){ZsGATtipWRYRUIV_@@q5hPJ>Uu-O#itt+P}AYUAs5MA5;|{*VfeTQjhKweyu1 zKm2gGkAvMX(>>V#VgF$N`J-iLU#;$GbN`#4rqD{m@$tV2jsH0(J|03@BZp{xfWX9C zp=2l_@J9bh!e%@sl>=1Hz}3}>a$gVNh-%u0me>^lEiLGQVeyf7`I_e|C8Xon=Ho12 zm4fTPmug{zCv|nG2ctTzlIT}b%$w-HPaFCCA*ZBF8WIv%0IpFv%R(>DK0!)Ii0efn zCq1dbcD2SWVd)w-Sm#Ii(fgMOyCg*DVeZ)BMNkQni@qjG!<-EudCHT4y+$J-QLzyt zs7C;DAu;`G8|vWm@aXe0`H$=|q9y!U7klF9k!}c!os@cQS+>v*nH^`g36mD? z1q%tMypGXA)n=)kTKp@3&!;&cnNiXZcTIrR=@7cHxX}d>p zIk7-1W_S8CK!0Qxm1SIE#@^F7^y|8hw(+^&fWDFj!}2Yxsyb{2Q! z_=T*Pb@Tqr1>DzbG}ZkH>}=qDkRpja#Nkko!ZBPYEwXh(Z7+9bA1CXj73^uz2THQ|Le;J~@X)@_KT;DkGRIy55|)7zw7(0EWB&Pi zPb_|lqdDq_eu}p8_zN^dO5np2JY3?PB3uD1nK|-8s1p@k?(itC2K49cPG=-XcqY3X zX!Y~}IhiG`rSGPV>YWz>oJkN3XE@f!z|k6O}U~PLC|<)W&oK zR60|i^gCsZ47B7nR-{0N<`cOUDbgOO>5*#?ROsZMozN5QSlR@LKoLwoPvm}9h$Ak; zNO&McBHi#46-W59l}r@9{S;nf#j5&G49#(8Mx17eds0*_TdZ(_8?=6FyS>xC+rGD1 z6puga74dG*@4arD*=W1YY}058w1$efy_Bu)Z8MI^J~w_EDx%z|t=-(VzdLd*wsl?M zG*t8!cRry-Y4i3U_-KbC!4QSsr?(f)HTs{ZCTzsbQgR`kqFyZ+<2k0IHQibx=^V&cP!iXF8t z+k^I-_CVe4IsCC-rT}tiw2-l)sv~Ic9yR{i7l{e*b6D*?cAGJ>7V@74WCjc-? zpJ5D+erH2|B3F1F9%5Jl4M$Exa;j-h2A9xEyBP%9^uaFG1_HXV+Q~S64^7WDWAMn~ z*Z)H2y7Zdf%w&i6ED!en!`>`yfI2JvjV7fxdb07YCm}EyLVveXGE{k=1Hu>AMOc!I zqHfO-Hp0L8C}3g&gg7}cx!m_n-dDLGZMzh`I%V+$#5Do;*Ex7T#gN$JHRDz=5eBVe z{XrnZVJ!HI#x4=#^&}FMsy9aY!2t{+KbLv8uvImaqOA3+6|JM~t38z?!>-;oyV{Yg zbm=dnFs-Y$JAWPi2Z6k7L!lQr(+@F-DFDM~*{>{G(>}SvG}>1+(D?5anbp za4u~0j&0TW~)uQPXKv+ga z-1`!FMHQRLS8|^t*5s%hnT$v@q0-@ybB|H!8SM9R&(8i|=sw$u9eD#kMfj`4_rJ|MPW;&D6k#gDC$VCd9N$alB-3-2!)NV_U^Q|sXg?1N-5fa zx`WlghyPmqw;6=z$}g^$ydj8ax)`z0V1=H>(HyJjCJtsptoXQijg;6T^pFNJ2|x@& zQ3e~5!$-=@kBbt?2_&{<>S|IHk@Z&tLm;w~17&XVnQqnAw|vR88h@8YTKEnss#n04 zV2;7|gcq;=rv&*tp+qYb@e-RDWWkE-hC3L*hZ6g|XvZ-1%n+i|u*EP6MkPVP^mpN6 zHh7qYbD4!|f*1X-CDM@jB!#gMo^^FDB%(lt9O(p+0W@;2@6Y7{jP=<(a-O-TotYO|m3KX2L zc;Gm0yvBloc#+9iNt(B>^rbDQ-k#L4@HmrFNMJ}#dJ!K<~`ryN3GO+43vC%-? z#YM_mJ^eQUMfE^f38)H@sk&Skz;9LogxRX&cJrom?7^zaRAdpGbH&3de~Zezsx(1f z)A2Io%kI`DhNQzHu{@3cE?j99$ z%fz1u0zV#nCa%6BUzg-apOwwn`CyBh(bv+>vSt(!|M$4#XM34Oahlp=3xcG4KztOElz-$0=}Fca-&CyeY!Ajg@1dmVSSOs_iL{MYgwH8MH9TNxJ-a8c5E;aGWIc~U|JWOn@y41>(m7bi>f!%4C5W+ zR1aQL7CF)4)b85+AwkkluOm6ih%drwBDub1ADiRl%f=bO%UCmG(|^zWfHW>;2%sAb zC?T_B7~-4kNRT1Sch#1=*Cv`aMPI%H&RKudpD?$)k8nHBps5ptMX#i{6uolP>RU;w z-itJWu}SDt4_vdBF>U#(j&m$boKdkE#Xo6}qc56L1JS&*5s9_C_owfwKgrMT5Ej3T z@DVY7n$|k_JR;ph2;tv_I|~c=w}^WLUw(>CT?g|Dg_Ipvq1WGmfhh%=a8II@5sSu$ zqQUOgVbquX6i_xgCmjh#EE1)ntel~=K}-v+gmmxzQg7Ic0~jJZN$(nlebzmc*8U-CU-wEE zcdx&|MRG*KUt%Q3x-y4IBGe_prF&mrw|iV<0Q1N?9C*8`dvX#)zy)8v@VZFXS4Gls zE)E};KT-l`I>PAe0h;Jk_zDOkp8i2IEa@xsyjN?=0)OjIE zJ@wcWQfj8{G>8;hSrD*lAGdq$G+q=c=oilF>tQNVq|JZeT*=>U|78gbBAjqE@`T6~ zcIaCVAp^*MI2W_kl>|w9*`^W4c3Lz> z{IZR20aNQ5LZ2O?zD@zDa~KNZOM~hOuLae>loSpYPX9$n z9(paPNi-+J7PM>mE1^w}GIhZi{tbxR5TD6AN4BD?TTUfQEuL8R;p z8hwMSoyx}!sEN2?4ZlU656X5glzch{wjhZRnph&1_&$?_&`S+?v4Pt0d9d{Y;~3v*Rv=liWPMIdv-j8t=^uTMnO#;ONhD`}U;ZvGYw{iDSlR0&aoqP~ zI0xBgk}&T1j#>40;|W&CrH4#U#XAI<>><0whs7?jWDV7WaT&;D9W{oo9H(LtRaie9 zC92Gxv~KA(rx!=BU+(MfFP_|0W$Tj*YPW7ZpZE?jWcN+4u%Yxo{;eMKehhd!xW}t{ z#5*≺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 X+Bff1u&(FC-qZ5-^u&^heG2{`!L#hP literal 0 HcmV?d00001 diff --git a/loglan96/loglan93/expr.cc b/loglan96/loglan93/expr.cc new file mode 100644 index 0000000..af7ddc5 --- /dev/null +++ b/loglan96/loglan93/expr.cc @@ -0,0 +1,856 @@ +#include +#include +#include "Objects.h" + +#include "Expr.h" + +//************************************** +//** ** +//** Objects decribing an expression ** +//** inside an abstract tree. ** +//** ** +//************************************** + +ostream& operator <<( ostream& stream, ExprType type ) +{ + switch(type) + { + case Ident: + return stream << "Identifier"; + case IntegerConst: + return stream << "Integer Constant"; + case IntegerExpr: + return stream << "Integer expression"; + case RealConst: + return stream << "Real Constant"; + case RealExpr: + return stream << "Real expression"; + case BoolConst: + return stream << "Boolean Constant"; + case BoolExpr: + return stream << "Boolean expression"; + case ObjExpr: + return stream << "Object expression"; + case ObjConst: + return stream << "Object Constant"; + case Other: + return stream << "Other"; + case ExprError: + return stream << "Error Type"; + default: + return stream << "Unknown value"; + } +} + +ostream& operator <<( ostream& stream, ArithOpType type ) +{ + switch(type) + { + case Plus: + return stream << " Plus "; + case Minus: + return stream << " Minus "; + case Multiply: + return stream << " Multiply "; + case Divide: + return stream << " Divide "; + case IntDivide: + return stream << " Integer Divide"; + case Modulo: + return stream << " Modulo "; + default: + return stream << "Unknown value"; + } +} + +ostream& operator <<( ostream& stream, BoolOpType type ) +{ + switch(type) + { + case Less: + return stream << " Less "; + case LessOrEqual: + return stream << " Less Or Equal "; + case Equal: + return stream << " Equal "; + case NotEqual: + return stream << " Not Equal "; + case Greater: + return stream << " Greater "; + case GreaterOrEqual: + return stream << " Greater Or Equal "; + case Or: + return stream << " Or "; + case And: + return stream << " And "; + case AndIf: + return stream << " AndIf "; + case OrIf: + return stream << " OrIf "; + default: + return stream << "Unknown value"; + } +} + +ostream& operator <<( ostream& stream, ObjOpType type ) +{ + switch(type) + { + case Qua: + return stream << " Qua "; + case Is: + return stream << " Is "; + case In: + return stream << " In "; + default: + return stream << "Unknown value"; + } +} + +Expression::Expression( ExprType rettype , Location *objloc ) +{ + kind = "NullObject"; + returntype = rettype; + place = objloc; +} + +ostream& operator << ( ostream& stream , Expression ThisExp ) +{ +#ifdef VERBOSE_PRINT_EXPR_TREE + stream << "\nExpression :"; +#endif + ThisExp.Print( stream ); + return stream; +} + +void Expression::Print( ostream& stream ) +{ +#ifdef VERBOSE_PRINT_EXPR_TREE + stream << "\nkind :" << kind << \ + "\ntype :" << type << \ + "\nlocation :" << *place << \ + "\nReturnType :" << returntype; +#endif +} + +IntegerConstant::IntegerConstant( int value, Location *TheLoc ) : + Expression( IntegerConst,TheLoc ),rvalue(value) +{ + kind = "IntegerConstant"; +} + +void IntegerConstant::Print( ostream& stream ) +{ + Expression::Print(stream); +#ifdef VERBOSE_PRINT_EXPR_TREE + stream = stream << "\nRValue :" << rvalue; +#else + stream << rvalue; +#endif +} + +RealConstant::RealConstant( double value, Location *TheLoc ) : + Expression( RealConst,TheLoc ),rvalue(value) +{ + kind = "RealConstant"; +} + +void RealConstant::Print( ostream& stream ) +{ + Expression::Print(stream); +#ifdef VERBOSE_PRINT_EXPR_TREE + stream = stream << "\nRValue :" << rvalue; +#else + stream << rvalue; +#endif +} + +BoolConstant::BoolConstant( int value, Location *TheLoc ) : + Expression( BoolConst, TheLoc ),rvalue(value) +{ + kind = "RealConst"; +} + +void BoolConstant::Print( ostream& stream ) +{ + Expression::Print(stream); +#ifdef VERBOSE_PRINT_EXPR_TREE + stream << "\nRValue :" << rvalue; +#else + stream << rvalue; +#endif +} + +StringConstant::StringConstant( String *value, Location *TheLoc ) : + Expression( StringConst,TheLoc ),rvalue(value) +{ + kind = "StringConstant"; +} + +void StringConstant::Print( ostream& stream ) +{ + Expression::Print(stream); +#ifdef VERBOSE_PRINT_EXPR_TREE + stream << "\nRValue :" << *rvalue; +#else + stream << *rvalue; +#endif +} + +CharConstant::CharConstant( char value, Location *TheLoc ) : + Expression( CharConst, TheLoc ),rvalue(value) +{ + kind = "CharConstant"; +} + +void CharConstant::Print( ostream& stream ) +{ + Expression::Print(stream); +#ifdef VERBOSE_PRINT_EXPR_TREE + stream << "\nRValue :" << rvalue; +#else + stream << rvalue; +#endif +} + +Identifier::Identifier( String * TheName, Location *TheLoc ) : + Expression( Ident, TheLoc ) +{ + kind = "Identifier"; + Title = TheName; +} + +Identifier::Identifier( Entry ThisEntry, Location *TheLoc ) : + Expression( Ident, TheLoc ) +{ + kind = "Identifier"; + Title = NULL; + Where = ThisEntry; +} + +void Identifier::Print( ostream& stream ) +{ + Expression::Print(stream); +#ifdef VERBOSE_PRINT_EXPR_TREE + stream << "\nTitle :" << *Title; +#else + stream << *Title ; +#endif +} + +NoneObject::NoneObject( Location *TheLoc ) : Expression( ObjConst, TheLoc ) +{ + kind = "None"; +} + +Result::Result( Location *TheLoc ) : Expression( ObjConst, TheLoc ) +{ + kind = "Result"; +} + +UnaryOperator::UnaryOperator( Expression * ThisExp, ExprType ret, Location *TheLoc ) : + Expression( ret, TheLoc ) +{ + kind = "UnaryOperator"; + Argument = ThisExp; + place = new Location(*(ThisExp->place) + *TheLoc); +} + +void UnaryOperator::Print ( ostream& stream ) +{ + Expression::Print(stream); +#ifdef VERBOSE_PRINT_EXPR_TREE + stream << "\n(("; + Argument->Print(stream); + stream << "\n))"; +#else + stream << '('; + Argument->Print(stream); + stream << ')'; +#endif +} + +BinaryOperator::BinaryOperator( Expression *LeftExpr, Expression *RightExpr, + ExprType ret , Location *TheLoc ) : + Expression( ret, TheLoc ) +{ + kind = "BinaryOperator"; + LeftMember = LeftExpr; + RightMember = RightExpr; + place = new Location(*(LeftMember->place) + *TheLoc + *(RightMember->place)); +} + +virtual void BinaryOperator::Print( ostream& stream ) +{ + Expression::Print( stream ); +#ifdef VERBOSE_PRINT_EXPR_TREE + stream << "\n(\nLeft Member :\n"; + LeftMember->Print( stream ); + stream << " , "; + RightMember->Print( stream ); + stream << "\n)"; +#else + stream << " ( "; + LeftMember->Print(stream); + stream << ' ' << kind << ' '; + RightMember->Print(stream); + stream << " ) "; + +#endif +} + +BoolOperator::BoolOperator( Expression *LeftExpr, Expression *RightExpr, + BoolOpType TheOp , Location *TheLoc ) : + BinaryOperator( LeftExpr, RightExpr, Other,TheLoc ) +{ + kind = "Boolean Operator"; + OpKind = TheOp; + + if ( (TheOp == Or) || (TheOp == And) ) + switch( LeftExpr->returntype) + { + case BoolExpr: + case BoolConst: + case Ident: + switch( RightExpr->returntype ) + { + case BoolExpr: + case BoolConst: + case Ident: + returntype = BoolExpr; + break; + + default: + returntype = ExprError; + cout << "Operand 2 of Operator " << TheOp << " : \""; + RightExpr->Print( cout ); + cout << "\" is not a boolean expression.\n"; + break; + } + break; + + default: + cout << "Operand 1 of Operator " << TheOp << " : \""; + LeftExpr->Print( cout ); + cout << "\" is not a boolean expression.\n"; + switch( RightExpr->returntype ) + { + case BoolExpr: + case BoolConst: + case Ident: + break; + + default: + cout << "Operand 2 of Operator " << TheOp << " : \""; + RightExpr->Print( cout ); + cout << "\" is not a boolan expression.\n"; + break; + } + returntype = ExprError; + } + else + switch( LeftExpr->returntype ) + { + case IntegerConst: + case IntegerExpr: + switch( RightExpr->returntype ) + { + case IntegerConst: + case IntegerExpr: + case Ident: + returntype = BoolExpr; + break; + + default: + returntype = ExprError; + cout << "As operand 1 of operator " << TheOp << " is " + << LeftExpr->returntype << ", operand 2 that is \""; + RightExpr->Print( cout ); + cout << "\" is expected to be an Integer Expression too.\n"; + } + break; + + case RealConst: + case RealExpr: + switch( RightExpr->returntype ) + { + case RealConst: + case RealExpr: + case Ident: + returntype = BoolExpr; + break; + + default: + returntype = ExprError; + cout << "As operand 1 of operator " << TheOp << " is " + << LeftExpr->returntype << ", operand 2 that is \""; + RightExpr->Print( cout ); + cout << "\" is expected to be a Real Expression too.\n"; + } + break; + + case CharConst: + case CharExpr: + switch( RightExpr->returntype ) + { + case CharConst: + case CharExpr: + case Ident: + returntype = BoolExpr; + break; + + default: + returntype = ExprError; + cout << "As operand 1 of operator " << TheOp << " is " + << LeftExpr->returntype << ", operand 2 that is \""; + RightExpr->Print( cout ); + cout << "\" is expected to be a Character Expression too.\n"; + } + break; + + case StringConst: + case StringExpr: + switch( RightExpr->returntype ) + { + case StringConst: + case StringExpr: + case Ident: + returntype = BoolExpr; + break; + + default: + returntype = ExprError; + cout << "As operand 1 of operator " << TheOp << " is " + << LeftExpr->returntype << ", operand 2 that is \""; + RightExpr->Print( cout ); + cout << "\" is expected to be a String Expression too.\n"; + } + break; + + case ObjConst: + case ObjExpr: + if ( (TheOp == Equal) || (TheOp == NotEqual) ) + switch( RightExpr->returntype ) + { + case ObjConst: + case ObjExpr: + case Ident: + returntype = BoolExpr; + break; + + default: + returntype = ExprError; + cout << "As operand 1 of operator " << TheOp << " is " + << LeftExpr->returntype << ", operand 2 that is \""; + RightExpr->Print( cout ); + cout << "\" is expected to be an Object Expression too.\n"; + } + else + { + cout << " Only = and <> can be applied onto objects.\n"; + returntype = ExprError; + } + break; + + case BoolConst: + case BoolExpr: + if ( (TheOp == Equal) || (TheOp == NotEqual) ) + switch( RightExpr->returntype ) + { + case BoolConst: + case BoolExpr: + case Ident: + returntype = BoolExpr; + break; + + default: + returntype = ExprError; + cout << "As operand 1 of operator " << TheOp << " is " + << LeftExpr->returntype << ", operand 2 that is \""; + RightExpr->Print( cout ); + cout << "\" is expected to be a Boolean Expression too.\n"; + } + else + { + cout << " Only = and <> can be applied onto booleans.\n"; + returntype = ExprError; + } + break; + + case Ident: + switch( RightExpr->returntype ) + { + case IntegerConst: + case IntegerExpr: + case RealConst: + case RealExpr: + case CharConst: + case CharExpr: + case StringConst: + case StringExpr: + returntype = BoolExpr; + break; + + case ObjConst: + case ObjExpr: + if ( (TheOp == Equal) || (TheOp == NotEqual) ) + returntype = BoolExpr; + else + { + cout << " You can only apply Equal and NotEqual onto objects.\n"; + returntype = ExprError; + } + break; + + case BoolConst: + case BoolExpr: + if ( (TheOp == Equal) || (TheOp == NotEqual) ) + returntype = BoolExpr; + else + { + cout << " You can only apply Equal and NotEqual onto booleans.\n"; + returntype = ExprError; + } + break; + + case Ident: + returntype = BoolExpr; + break; + + default: + returntype = ExprError; + cout << " Type of Operand 2 \""; + RightExpr->Print( cout ); + cout << "\" of operand " << TheOp << " is wrong.\n"; + } + break; + + case ExprError: + returntype = ExprError; + break; + + default: + returntype = ExprError; + cout << " The type of Operand 1 \""; + LeftExpr->Print( cout ); + cout << "\" of operator " << TheOp << " is wrong.\n"; + } +} + +virtual void BoolOperator::Print( ostream& stream ) +{ +#ifdef VERBOSE_PRINT_EXPR_TREE + BinaryOperator::Print( stream ); + stream << "\nKind of Boolean Operator : " << OpKind; +#else + stream << " ( "; + LeftMember->Print( stream ); + stream << ' ' << OpKind << ' '; + RightMember->Print( stream ); + stream << " ) "; +#endif +} + +ArithOperator::ArithOperator( Expression *LeftExpr, Expression *RightExpr, + ArithOpType TheOp , Location *TheLoc ) : + BinaryOperator( LeftExpr, RightExpr, Other, TheLoc ) +{ + kind = "Arithmetic Operator"; + OpKind = TheOp; + + switch( LeftExpr->returntype) + { + case IntegerConst: + case IntegerExpr: + + switch( RightExpr->returntype ) + { + case IntegerConst: + case IntegerExpr: + returntype = IntegerExpr; + break; + + case RealConst: + case RealExpr: + returntype = RealExpr; + break; + + case Ident: + returntype = IntegerExpr; + break; + + case ExprError: + returntype = ExprError; + break; + + default: + returntype = ExprError; + cout << "Operand 2 of Operator " << TheOp << " : \""; + RightExpr->Print( cout ); + cout << "\" is not an arithmetic expression.\n"; + break; + } + break; + + case RealConst: + case RealExpr: + switch( RightExpr->returntype ) + { + + case IntegerConst: + case IntegerExpr: + case RealConst: + case RealExpr: + case Ident: + returntype = RealExpr; + break; + + case ExprError: + returntype = ExprError; + break; + + default: + returntype = ExprError; + cout << "Operand 2 of Operator " << TheOp << " : \""; + RightExpr->Print( cout ); + cout << "\" is not an arithmetic expression.\n"; + + } + break; + + case Ident: + switch( RightExpr->returntype ) + { + case IntegerConst: + case IntegerExpr: + returntype = IntegerExpr; + break; + + case RealConst: + case RealExpr: + returntype = RealExpr; + break; + + case Ident: + returntype = Ident; + break; + + case ExprError: + returntype = ExprError; + break; + + default: + returntype = ExprError; + cout << "Operand 2 of Operator " << TheOp << " : \""; + RightExpr->Print( cout ); + cout << "\" is not an arithmetic expression.\n"; + } + break; + + case ExprError: + returntype = ExprError; + break; + + default: + returntype = ExprError; + cout << "Operand 1 of Operator " << TheOp << " : \""; + LeftExpr->Print( cout ); + cout << "\" is not an arithmetic expression.\n"; + switch( RightExpr->returntype ) + { + case IntegerConst: + case IntegerExpr: + case RealConst: + case RealExpr: + case Ident: + break; + + default: + cout << "Operand 2 of Operator " << TheOp << " : \""; + RightExpr->Print( cout ); + cout << "\" is not an arithmetic expression.\n"; + } + + } +} + +virtual void ArithOperator::Print( ostream& stream) +{ +#ifdef VERBOSE_PRINT_EXPR_TREE + BinaryOperator::Print( stream ); + stream << "\nKind of Arithmetic Operator : " << OpKind; +#else + stream << " ( "; + LeftMember->Print( stream ); + stream << ' ' << OpKind << ' '; + RightMember->Print( stream ); + stream << " ) "; +#endif +} + +ObjOperator::ObjOperator( Expression *LeftExpr, Expression *RightExpr, + ObjOpType TheOp , Location *TheLoc ) : + BinaryOperator( LeftExpr, RightExpr, Other, TheLoc ) +{ + kind = "Object Operator"; + OpKind = TheOp; + + switch(LeftExpr->returntype) + { + case Ident: + switch ( RightExpr->returntype ) + { + case Ident: + if (TheOp == Qua) + returntype = ObjExpr; + else + returntype = BoolExpr; + break; + + case ExprError: + returntype = ExprError; + break; + + default: + returntype = ExprError; + cout << "Operand 2 of Operator " << TheOp << " : \""; + RightExpr->Print( cout ); + cout << "\" is not an Identifier.\n"; + } + break; + + case ExprError: + returntype = ExprError; + break; + + default: + cout << "Operand 1 of Operator " << TheOp << " : \""; + LeftExpr->Print( cout ); + cout << "\" is not an Identifier.\n"; + + } +} + +virtual void ObjOperator::Print( ostream& stream ) +{ +#ifdef VERBOSE_PRINT_EXPR_TREE + BinaryOperator::Print( stream ); + stream << "\nKind of Object Operator : " << OpKind; +#else + stream << " ( "; + LeftMember->Print( stream ); + stream << ' ' << OpKind << ' '; + RightMember->Print( stream ); + stream << " ) "; +#endif +} + +Not::Not( Expression *TheExpr, Location *TheLoc ) : + UnaryOperator( TheExpr , Other, TheLoc ) +{ + kind = "Not"; + + switch( TheExpr->returntype ) + { + case BoolExpr: + case BoolConst: + case Ident: + returntype = BoolExpr; + break; + + case ExprError: + returntype = ExprError; + break; + + default: + returntype = ExprError; + cout << "Operand of Operator Not : \""; + TheExpr->Print( cout ); + cout << "\" is not a Boolean Expression.\n"; + } +} + +This::This( Expression *TheExpr, Location *TheLoc ) : + UnaryOperator( TheExpr, Other, TheLoc ) +{ + kind = "This"; + + if ( TheExpr ) + switch ( TheExpr->returntype ) + { + case Ident: + returntype = ObjExpr; + break; + + default: + returntype = ExprError; + cout << "Operand is of operator 'This' is not an Identifier.\n"; + } + else + returntype = ObjExpr; +} + +void This::Print( ostream& stream ) +{ + cout << " This "; + if ( Argument ) + UnaryOperator::Print( stream ); +} + +New::New( Expression *TheExpr, Location *TheLoc ) : + UnaryOperator( TheExpr , Other, TheLoc ) +{ + kind = "New"; + + switch( TheExpr->returntype ) + { + case Ident: + returntype = ObjExpr; + break; + + case ExprError: + returntype = ExprError; + break; + + default: + returntype = ExprError; + cout << "Operand \""; + TheExpr->Print(cout); + cout << "\"type of New operator is wrong.\n"; + } +} + +Copy::Copy( Expression *TheExpr, Location *TheLoc ) : + UnaryOperator( TheExpr, Other, TheLoc ) +{ + kind = "Copy"; + switch(TheExpr->returntype) + { + case Ident: + case ObjExpr: + returntype = ObjExpr; + break; + + case ExprError: + returntype = ExprError; + break; + + default: + returntype = ExprError; + cout << "Wrong operand type for operand \""; + TheExpr->Print(cout); + cout << "\" of Copy.\n"; + break; + } +} + +ArrayOf::ArrayOf( Expression *TheExpr, ExprType ret, Location *TheLoc ) : + UnaryOperator( TheExpr, ret, TheLoc ) +{ + kind = "ArrayOf"; +} + +Error::Error( ) : Expression( ExprError, NULL ) +{ + kind = "Error into Expression"; +} diff --git a/loglan96/loglan93/expr.h b/loglan96/loglan93/expr.h new file mode 100644 index 0000000..3d1221e --- /dev/null +++ b/loglan96/loglan93/expr.h @@ -0,0 +1,332 @@ +//**************************************************************** +//* * +//* Expr.h : Header file of the Expression hierarchy classes * +//* This file describes all the nodes contained into * +//* an expression tree of the program. * +//* * +//* (c) LITA, university of PAU (France), summer 1993. * +//**************************************************************** + +//************************************** +//** ** +//** Objects decribing an expression ** +//** inside an abstract tree. ** +//** ** +//************************************** + +// This is a global variable used for identify the location of a lexem. +extern Location ThisPlace; + +//** +//** Enumeration type used for calculating the return type +//** of one expression node. +//** + +typedef enum +{ + Ident, // Identifier node : could match any kind of expression + IntegerConst, // Integer constant node. + IntegerExpr, // Integer expression node. + RealConst, // Real constant node. + RealExpr, // Real expression node. + BoolConst, // Boolean constant node. + BoolExpr, // Boolean expression node. + ObjConst, // Object constant node (like NONE operator or + // predefined type ). + ObjExpr, // Object expression node. + StringExpr, // String expression node. + StringConst, // String constant node. + CharExpr, // Character expression node. + CharConst, // Character constant node. + Other, // Other Node (used for constructors, will be removed too ). + ExprError // This node and maybe its children is holding + // a wrong expression. +} ExprType; + +// We overload this operator for let it print an ExprType object. +ostream& operator << ( ostream& , ExprType ); + +//** +//** This class is a dummy class that is just for testing code. +//** The code should be removed when joining to the symbol Table. +//** This is supposed to described the type of one symbol table entry. +//** The only node to use it is the Identifier Node for now. +//** + +class Entry +{ + int dummy; //** Just to say the class is not empty. +}; + +//** +//** This is the Expression class. This class is the root of all the tree +//** of the expression classes. You find in it all the method and fields +//** that every node uses. +//** + +class Expression +{ + + public: + String kind; // Verbose description of the type of the node. + Location *place; // Position of the object in the source text. + ExprType returntype; // Kind of result the node produces. + + Expression( ExprType,Location* );// The constructor take just the kind + // of the node, and eventually its position. + virtual void Print( ostream& ); // Virtual procedure that prints the contents + // of the node. Of course there is a lot of + // different version of this procedure. + +// This overloading allow the programmer to write 'cout << TheExpression' +// for printing the contents of all the nodes in the tree. + friend ostream& operator << ( ostream& , Expression ); +} ; + +//** +//** This is the Identifier Operator Class that derives from Expression +//** class. This nodes holds a string field to store temporaly the string that +//** lex has parsed and an entry type for the variable in the symbol table. +//** + +class Identifier : public Expression +{ + public: + String *Title; // The name of the operator. + Entry Where; // The entry if defined (else NULL). + + Identifier( String *, Location * ); + // Initialised with the name if it has not been + // declared (maybe further). + Identifier( Entry, Location *); // else initialised with its entry. + void Print( ostream& ); // This Print write down the name of the identifier. + +} ; + +//** +//** This is the UnaryOperator class. This class derives from Expression +//** from which it adds an Expression pointer for one argument of type +//** Expression. This class in general should not be instantiated. +//** Use derivation for creating new unary operator. +//** + +class UnaryOperator : public Expression +{ + public: + Expression *Argument; // This holds the argument which is another + // expression. + +// We need to construct this the argument taken and what kind of result +// this operator returns. + + UnaryOperator( Expression *ThisExp, ExprType ret, Location * ); + + virtual void Print( ostream& ); // This print outputs the name of + // the operator and the argument into brackets. + +} ; + +//** +//** This is the BinaryOperator class. This is the same as UnaryOperator +//** except it takes two expression instead of one. +//** This class is separate from the UnaryOperator because functions that +//** takes one argument can't accept two arguments (which will surely happend +//** if BinaryOperator derives from UnaryOperator ). +//** + +class BinaryOperator : public Expression +{ +public: + Expression *LeftMember,*RightMember; + + BinaryOperator( Expression *LeftExpr, Expression *RightExpr, + ExprType ret, Location *TheLoc ); + virtual void Print( ostream& ); // The two expression are printed into + // brackets and separated by a ','. + +} ; + +//** +//** This is the BoolOperator class. This class describes all the boolean +//** operators ( =, =/= or <>, <, <=, >, >=, OR, AND, ORIF and ANDIF ). +//** The operators are discimined by the field OpKind. +//** We use for this a new enumeration type called BoolOpType (BOOLean OPerator +//** TYPE). +//** + +typedef enum +{ + Less, // A < B + LessOrEqual, // A <= B + Equal, // A = B + NotEqual, // A =/= B or A <> B + Greater, // A > B + GreaterOrEqual, // A >= B + Or, // A OR B (inclusif OR) + And, // A AND B + AndIf, // A ANDIF B (same as AND) + OrIf // A ORIF B (same as OR) +} BoolOpType; + +// We overload << for printing BoolOpType variable. + +ostream& operator << ( ostream& , BoolOpType ); + +class BoolOperator : public BinaryOperator +{ +public: + BoolOpType OpKind; + +// For creation, we need the two expression and the kind of boolean operator. +// For example if a is an 'BoolOperator *' +// then 'a = new BoolOperator( Expr1, Expr2, Or )' will describe the expression +// '(Expr1) OR (Expr2)'. + BoolOperator( Expression *LeftExpr, Expression *RightExpr, + BoolOpType Operator, Location * ); + void Print( ostream& ); +} ; + +//** +//** This is the ArithOperator class. This class is designed on the same model +//** as BoolOperator but for arithmetic Operator. +//** The new enumerated type is calls ArithOpType (ARITHmetic OPerator TYPE). +//** + +typedef enum +{ + Plus, // A + B + Minus, // A - B + Multiply, // A * B + Divide, // A / B + IntDivide, // A DIV B + Modulo // A MOD B +} ArithOpType; + +ostream& operator << ( ostream& , ArithOpType ); + +class ArithOperator : public BinaryOperator +{ +public: + ArithOpType OpKind; + ArithOperator( Expression *LeftExpr, Expression *RightExpr, + ArithOpType Operator, Location * ); + void Print( ostream& ); +} ; + +//** +//** This is the ObjOperator class. This class derives from the class +//** BinaryOperator. It describes the operators which need object expression +//** as argument (essentially QUA, IS ,IN ). +//** + +typedef enum +{ + Qua, + Is, + In +} ObjOpType; + +ostream& operator << ( ostream& , ObjOpType ); + +class ObjOperator : public BinaryOperator +{ +public: + ObjOpType OpKind; + ObjOperator( Expression *LeftExpr, Expression *RightExpr, + ObjOpType Operator, Location * ); + void Print( ostream& ); +} ; + +class Not : public UnaryOperator +{ +public: + Not( Expression *TheExpr, Location * ); +} ; + +class This : public UnaryOperator +{ + public: + This( Expression *TheExpr, Location * ); + void Print( ostream& ); +} ; + +class New : public UnaryOperator +{ + public: + New( Expression *TheExpr, Location * ); +} ; + +class Copy : public UnaryOperator +{ + public: + Copy( Expression *TheExpr, Location * ); +} ; + +class ArrayOf : public UnaryOperator +{ + public: + ArrayOf( Expression *TheExpr, ExprType ret, Location * ); +} ; + +class NoneObject : public Expression +{ + public: + NoneObject( Location * ); +} ; + +class Result : public Expression +{ + public: + Result( Location * ); +} ; + +class Error : public Expression +{ + public: + Error( void ); +} ; + +class IntegerConstant : public Expression +{ +public: + int rvalue; + IntegerConstant( int value, Location * ); + void Print( ostream& ); + +} ; + +class RealConstant : public Expression +{ +public: + double rvalue; + RealConstant( double value, Location * ); + void Print( ostream& ); + +} ; + +class BoolConstant : public Expression +{ + public: + int rvalue; + + BoolConstant( int, Location * ); + void Print( ostream& ); +} ; + +class StringConstant : public Expression +{ + public: + String *rvalue; + + StringConstant( String *, Location * ); + void Print( ostream& ); +} ; + +class CharConstant : public Expression +{ + public: + char rvalue; + + CharConstant( char rvalue, Location * ); + void Print( ostream& ); +} ; diff --git a/loglan96/loglan93/instr.cc b/loglan96/loglan93/instr.cc new file mode 100644 index 0000000..0d8a1e4 --- /dev/null +++ b/loglan96/loglan93/instr.cc @@ -0,0 +1,454 @@ +//**************************************************************** +//* * +//* Instr.h : Header file for the object class hierarchy for * +//* the instructions. * +//* * +//* (c) LITA, university of PAU (France), summer 1993. * +//**************************************************************** + +#include +#include +#include "Objects.h" +#include "Expr.h" +#include "Instr.h" + +//*************************************** +//** ** +//** Objects decribing an instruction ** +//** inside an abstract tree. ** +//** ** +//*************************************** + +/* + Instruction + + Single_Instruction Complex_Instruction + + + Single_Instruction + +*:= *job io signal control object + + Attach Put Raise Return Wind + Resume Get Call Inner + Stop Read Exit Kill + Detach ReadLn Generator + Terminate Write + WriteLn + + + Complex_instructions + + *Loop Block Condition + + *For Pref Block *If + *While Case +*/ + +virtual void Instruction::Print( ostream& stream ) +{ + stream << " \"" << kind << "\" "; +} + +ostream& operator << ( ostream& stream , Instruction TheInstr ) +{ + TheInstr.Print( stream ); +} + +OneArgInstr::OneArgInstr( Expression * TheExpr, String TheStr, Location *TheLoc ) : + Instruction( TheStr, TheLoc ) +{ + argument = TheExpr; +} + +void OneArgInstr::Print( ostream& stream ) +{ + Instruction::Print( stream ); + stream << "(" << *argument << ");\n"; +} + +TwoArgInstr::TwoArgInstr( Expression *TheExpr1, Expression *TheExpr2, + String TheStr , Location *TheLoc) : + Instruction( TheStr, TheLoc ) +{ + arg1 = TheExpr1; + arg2 = TheExpr2; +} + +void TwoArgInstr::Print( ostream& stream ) +{ + Instruction::Print( stream ); + stream << "(" << *arg1 << "," << *arg2 << ");"; +} + +Affectation::Affectation( Expression *L_Value, Expression *R_Value ) : + TwoArgInstr( L_Value , R_Value, String("Affectation"), + new Location(*L_Value->place + *R_Value->place) ) +{ + switch( L_Value->returntype ) + { + case Ident: + /* Here we should verify if the returntype of the Expression is coherent + with the type of the Identifier ( if it is declared ). */ + break; + default: + L_Value->Print( cout ); + cout << " is not an Identifier .\n" ; + break; + } +} + +void Affectation::Print( ostream& stream ) +{ + arg1->Print( stream ); + cout << " := "; + arg2->Print( stream ); +} + +Attach::Attach( Expression *TheExpr, Location *TheLoc ) : + OneArgInstr( TheExpr, String("Attach"), + new Location( *TheLoc + *TheExpr->place )) +{ + switch( TheExpr->returntype ) + { + case Ident: + case ObjExpr: + case ObjConst: + /* Here we should verify if the Expression + is coherent with a coroutine object. */ + break; + + case ExprError: + /* Here we test if the expression is correct or not. + If it is not correct, a report of the error has already been + emited and we have to go ahead without any comment for avoiding + errors provoked by the wrong expression. */ + break; + + default: + /* Here the Expression is correct according to the rules of building + an expression but the expression is not an object type so we emit + an error saying that there is a mismatched expression used with + the Attach instruction. */ + cout << " Operand \""; + TheExpr->Print( cout ); + cout << "\" for instruction Attach is wrong.\n"; + break; + } +} + +Resume::Resume( Expression *TheExpr, Location *TheLoc ) : + OneArgInstr( TheExpr, String("Resume"), + new Location( *TheLoc + *TheExpr->place ) ) +{ + switch( TheExpr->returntype ) + { + case Ident: + case ObjExpr: + case ObjConst: + /* Here we should verify if the Expression + is coherent with a process object. */ + break; + + case ExprError: + /* Here we test if the expression is correct or not. + If it is not correct, a report of the error has already been + emited and we have to go ahead without any comment for avoiding + errors provoked by the wrong expression. */ + break; + + default: + /* Here the Expression is correct according to the rules of building + an expression but the expression is not an object type so we emit + an error saying that there is a mismatched expression used with + the Resume instruction. */ + cout << " Operand \""; + TheExpr->Print( cout ); + cout << "\" for instruction Resume is wrong.\n"; + break; + } +} + +Stop::Stop( Expression *TheExpr, Location *TheLoc ) : + OneArgInstr( TheExpr, String("Stop"), + new Location( *TheLoc + *TheExpr->place) ) +{ + switch( TheExpr->returntype ) + { + case Ident: + case ObjExpr: + case ObjConst: + /* Here we should verify if the Expression + is coherent with a process object. */ + break; + + case ExprError: + /* Here we test if the expression is correct or not. + If it is not correct, a report of the error has already been + emited and we have to go ahead without any comment for avoiding + errors provoked by the wrong expression. */ + break; + + default: + /* Here the Expression is correct according to the rules of building + an expression but the expression is not an object type so we emit + an error saying that there is a mismatched expression used with + the instruction Stop. */ + cout << " Operand \""; + TheExpr->Print( cout ); + cout << "\" for instruction Stop is wrong.\n"; + break; + } +} + +Stop::Stop( Location *TheLoc ) : OneArgInstr( NULL, String("Stop"), TheLoc ) {} + +void Stop::Print( ostream& stream ) +{ + if (argument) + OneArgInstr::Print( stream ); + else + cout << "Stop;\n"; +} + +Get::Get( Expression *TheArg, Location *TheLoc) : + OneArgInstr( TheArg, String("Get"), + new Location(*TheArg->place + *TheLoc) ) +{ + switch(TheArg->returntype) + { + case Ident: + case ExprError: + break; + + default: + cout << " Operand \""; + TheArg->Print( cout ); + cout << "\" for instruction Get is wrong.\n"; + break; + } +} + +Put::Put( Expression *TheArg, Location *TheLoc) : + OneArgInstr( TheArg, String("Put"), + new Location(*TheArg->place + *TheLoc) ) +{ + switch(TheArg->returntype) + { + case Ident: + case ExprError: + break; + + default: + cout << " Operand \""; + TheArg->Print( cout ); + cout << "\" for instruction Put is wrong.\n"; + break; + } +} + +Block::Block( Instruction *FirstInstr, Location *TheLoc ) : + Instruction( String("Block"), TheLoc ), InstrList( FirstInstr ) +{ + +// We have to test the pointer because a block of instruction could be empty. +// i.e. : for i := 1 to 2 do od; +// \___/-> empty block; + if (FirstInstr) + *place = *place + *FirstInstr->place; + +} + +Block& operator += ( Block& TheBlock, Instruction *TheInstr ) +{ + TheBlock.InstrList += TheInstr; +// The test is not worth here because the block is expanded only if there is +// a new instruction who of course is not empty. + *TheBlock.place = *TheBlock.place + *TheInstr->place; + return TheBlock; +} + +void Block::Print( ostream& stream ) +{ + stream << "Block\n"; + InstrList.Print( stream ); + stream << "End of Block.\n"; +} + +ListOfInstr::ListOfInstr( Instruction *TheInstr ) +{ + Instruct = TheInstr; + NextInst = NULL; +} + +ListOfInstr& operator += ( ListOfInstr& TheList , Instruction *TheInstr ) +{ + ListOfInstr *Current = &TheList; + + while (Current->NextInst != NULL ) Current = Current->NextInst; + Current->NextInst = new ListOfInstr( TheInstr ); + return TheList; +} + +void ListOfInstr::Print( ostream& stream ) +{ + ListOfInstr *Current; + + Current = NextInst; + Instruct->Print( stream ); + stream << "\n"; + + while (Current != NULL) + { + Current->Instruct->Print( stream ); + stream << "\n"; + Current = Current->NextInst; + } + +} + +ConditionIf::ConditionIf( Expression *TheCondition, + Block *Block1, Block *Block2, Location *TheLoc ) : + Instruction( String( " If " ), + new Location( *TheLoc + *Block1->place + *Block2->place ) ), + Condition( TheCondition ), BlockThen( Block1 ), BlockElse( Block2 ) +{ + switch( TheCondition->returntype ) + { + case BoolExpr: + case BoolConst: + case Ident: + case ExprError: + break; + + default: + cout << " Bad Expression \""; + TheCondition->Print( cout ); + cout << " for If condition.\n"; + break; + } +} + +void ConditionIf::Print( ostream& stream ) +{ + cout << "If ("; + Condition->Print( cout ); + cout << ")\nThen \n"; + BlockThen->Print( cout ); + if (BlockElse) + { + cout <<"Else\n"; + BlockElse->Print( cout ); + } +} + +void Loop::Print( ostream& stream ) +{ + stream << " DO\n"; + Body->Print( stream ); + stream << "\nOD\n"; +} + +While::While( Expression *TheExpr, Block *TheBlock, Location *TheLoc ) : + Loop( TheBlock, String("While") ), Condition( TheExpr ) +{ + if (TheExpr) + { + *place = *TheLoc + *TheBlock->place; + switch( TheExpr->returntype ) + { + case Ident: + case BoolConst: + case BoolExpr: + case ExprError: + break; + + default: + cout << "Wrong expression \""; + TheExpr->Print( cout ); + cout << "\" for Instruction While.\n"; + break; + } + } +} + +void While::Print( ostream& stream ) +{ + stream << "While "; + Condition->Print( stream ); + Loop::Print( stream ); +} + +For::For( Expression *TheVar, Expression *Initial, Expression *Final, + Expression *Step, Block *TheBlock, Location *TheLoc ) : + Loop( TheBlock, String("For") ), Counter( TheVar ), + CounterInit( Initial ), CounterStop( Final ), CounterStep( Step ) +{ + *place = *TheLoc + *TheVar->place + *Initial->place + *Final->place + + *Step->place + *TheBlock->place; + switch( CounterInit->returntype ) + { + case Ident: + case IntegerConst: + case IntegerExpr: + case RealExpr: + case RealConst: + case ExprError: + break; + + default: + cout << " Bad Expression type for Initial value \""; + CounterInit->Print( cout ); + cout << "\" of variable "; + Counter->Print( cout ); + cout << ".\n"; + } + + switch( CounterStop->returntype ) + { + case Ident: + case IntegerConst: + case IntegerExpr: + case RealExpr: + case RealConst: + case ExprError: + break; + + default: + cout << " Bad Expression type for Initial value \""; + CounterInit->Print( cout ); + cout << "\" of variable "; + Counter->Print( cout ); + cout << ".\n"; + } + + switch( CounterStep->returntype ) + { + case Ident: + case IntegerConst: + case IntegerExpr: + case RealExpr: + case RealConst: + case ExprError: + break; + + default: + cout << " Bad Expression type for Step value \""; + CounterStep->Print( cout ); + cout << ".\n"; + } + +} + +void For::Print( ostream& stream ) +{ + stream << "For "; + Counter->Print( cout ); + stream << " := "; + CounterInit->Print( cout ); + stream << " TO "; + CounterStop->Print( cout ); + stream << " Step "; + CounterStep->Print( cout ); + Loop::Print( stream ); +} diff --git a/loglan96/loglan93/instr.h b/loglan96/loglan93/instr.h new file mode 100644 index 0000000..0e1717d --- /dev/null +++ b/loglan96/loglan93/instr.h @@ -0,0 +1,248 @@ +//**************************************************************** +//* * +//* Instr.h : Header file for the object class hierarchy for * +//* the instructions. * +//* * +//* (c) LITA, university of PAU (France), summer 1993. * +//**************************************************************** + +//*************************************** +//** ** +//** Objects decribing an instruction ** +//** inside an abstract tree. ** +//** ** +//*************************************** + +/* + Instruction + + Single_Instruction Complex_Instruction + + + Single_Instruction + + := job io signal control object + + Attach Put Raise Return Wind + Resume Get Call Inner + Stop Read Exit Kill + Detach ReadLn Generator + Terminate Write + WriteLn + + + Complex_instructions + + Loop Block Condition + + For Pref Block If + While Case +*/ + +class Instruction +{ + public: + String kind; + Location *place; + + Instruction( String TheStr, Location *TheLoc ) : + kind( TheStr ), place( TheLoc ) + {} + + virtual void Print( ostream& ); + + friend ostream& operator << ( ostream& , Instruction ); +} ; + +class OneArgInstr : public Instruction +{ + public: + Expression *argument; + + OneArgInstr( Expression * , String, Location * ); + virtual void Print( ostream& ); +} ; + +class TwoArgInstr : public Instruction +{ + public: + Expression *arg1,*arg2; + + TwoArgInstr( Expression *, Expression *, String, Location *); + virtual void Print( ostream& ); +} ; + +class Affectation : public TwoArgInstr +{ + public: + Affectation( Expression *, Expression * ); + void Print( ostream& ); +} ; + +typedef enum +{ + AttachInstr, + ResumeInstr, + StopInstr +} OneArgJob; + +class Attach : public OneArgInstr +{ + public: + Attach( Expression *, Location * ); +} ; + +class Resume : public OneArgInstr +{ + public: + Resume( Expression *, Location * ); +} ; + +class Detach : public Instruction +{ + public: + Detach( Location *TheLoc ) : Instruction( String( "Detach" ), TheLoc ) {} +} ; + +class Terminate : public Instruction +{ + public: + Terminate( Location *TheLoc ) : Instruction( String( "Terminate" ), TheLoc ) {} +} ; + +class Stop : public OneArgInstr +{ + public: + Stop( Expression *, Location * ); + Stop( Location * ); + void Print( ostream& ); +} ; + +//** +//** These class describes the I/O instructions of LOGLAN +//** +//** Each Instruction taking a variable argument number +//** for example "writeln( output,a,b )" +//** is simplified into the following Instructions : +//** write( output, a ); +//** write( output, b ); +//** writeln( output ); +//** + +class Read : public OneArgInstr +{ + public: + Read( Expression *, Location * ); +} ; + +class Readln : public Instruction +{ + public: + Readln( Location * ); +} ; + +class Write : public OneArgInstr +{ + public: + Write( Expression *, Location * ); +} ; + +class Writeln : public Instruction +{ + public: + Writeln( Location * ); +} ; + +class Get : public OneArgInstr +{ + public: + Expression *TheFile, *TheArg; + Get( Expression *, Location * ); +} ; + +class Put : public OneArgInstr +{ + public: + Expression *TheFile, *TheArg; + Put( Expression *, Location * ); +} ; + +//** +//** This is the only Instruction concerning signals. +//** + +class Raise : public OneArgInstr +{ + public: + Raise( Expression *TheExpr, Location *TheLoc ) : + OneArgInstr( TheExpr, String("Raise"), TheLoc ) {} +} ; + +//** +//** Class container for a set of Instructions. We call it a block. +//** Tool class for containing several instructions and manipulate them. +//** + +class ListOfInstr +{ + Instruction *Instruct; + ListOfInstr *NextInst; + public: + friend ListOfInstr& operator += ( ListOfInstr& , Instruction * ); + ListOfInstr( Instruction *TheInstr ); + void Print( ostream& ); +} ; + +class Block : public Instruction +{ + ListOfInstr InstrList; + public: + Block( Instruction *FirstInstr, Location *TheLoc ); + friend Block& operator += ( Block& TheBlock, Instruction *TheInstr ); + void Print( ostream& ); +} ; + +//** +//** Class conditionnal If : A class with 2 Blocks conditionnaly executed. +//** + +class ConditionIf : public Instruction +{ + Block *BlockThen, *BlockElse; + Expression *Condition; + public: + ConditionIf( Expression *, Block *, Block *, Location * ); + void Print( ostream & ); +} ; + +//** +//** Class Loop : A class for hanling loop construction +//** + +class Loop : public Instruction +{ + Block *Body; + public: + Loop( Block *TheBlock, String TheName ) : + Instruction( TheName, TheBlock->place ), Body( TheBlock ) {}; + void Print( ostream& ); +} ; + +class While : public Loop +{ + Expression *Condition; + public: + While( Expression *, Block *, Location * ); + void Print( ostream& ); +} ; + +class For : public Loop +{ + Expression *Counter; + Expression *CounterInit; + Expression *CounterStop; + Expression *CounterStep; + public: + For( Expression *,Expression *, Expression *, Expression *, Block *,Location * ); + void Print( ostream& ); +} ; diff --git a/loglan96/loglan93/lex.l b/loglan96/loglan93/lex.l new file mode 100644 index 0000000..75d6f6f --- /dev/null +++ b/loglan96/loglan93/lex.l @@ -0,0 +1,926 @@ +%{ + +//**************************************************************** +//* * +//* Lex.l : Reg. Exp. for the LOGLAN-82 and the LOGLAN-93 * +//* languages. * +//* * +//* (c) LITA, university of PAU (France), summer 1993. * +//**************************************************************** + +#ifdef TOKENS_DEBUG +#define TOKENS_ERROR +#define TOKENS_DEBUG_printf(a) fprintf(stderr,a) +#define TOKENS_DEBUG_printf2(a,b) fprintf(stderr,a,b) +#else +#define TOKENS_DEBUG_printf(a) +#define TOKENS_DEBUG_printf2(a,b) +#endif + +#ifdef TOKENS_ERROR +#define TOKENS_ERROR_printf(a) fprintf(stderr,a) +#else +#define TOKENS_ERROR_printf(a) +#endif + +#ifdef SYNTAX_ONLY +#define SEMANTIC(a) +#else +#define SEMANTIC(a) a +#endif + +#ifndef SYNTAX_ONLY + +#include +#include +#include "Objects.h" +#include "Expr.h" +#include "Instr.h" + +#endif + +#include "syntax.h" + +int line_number=1; + +#ifndef SYNTAX_ONLY +void LexAdvanceCursor( int length ); + +Location ThisPlace; +int BeginningOfLine; + +#endif + +%} + +%x CondComment CondLineComment +%x CondString + +Letter [A-Za-z] +IdLetter {Letter}|[_0-9] +Digit [0-9] + +Identifier {Letter}({IdLetter}*) +A [Aa] +B [Bb] +C [Cc] +D [Dd] +E [Ee] +F [Ff] +G [Gg] +H [Hh] +I [Ii] +J [Jj] +K [Kk] +L [Ll] +M [Mm] +N [Nn] +O [Oo] +P [Pp] +Q [Qq] +R [Rr] +S [Ss] +T [Tt] +U [Uu] +V [Vv] +W [Ww] +X [Xx] +Y [Yy] +Z [Zz] + +%% + +{B}{E}{G}{I}{N} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(Begin); + } + +{E}{N}{D} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(END); + } + +{P}{R}{O}{G}{R}{A}{M} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(PROGRAM); + } + +{U}{N}{I}{T} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(UNIT); + } + +{C}{L}{A}{S}{S} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(CLASS); + } + +{P}{R}{O}{C}{E}{D}{U}{R}{E} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(PROCEDURE); + } + +{F}{U}{N}{C}{T}{I}{O}{N} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(FUNCTION); + } + +{C}{O}{R}{O}{U}{T}{I}{N}{E} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(COROUTINE); + } +{P}{R}{O}{C}{E}{S}{S} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(PROCESS); + } + +{B}{L}{O}{C}{K} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(BLOCK); + } + +{T}{Y}{P}{E} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(TYPE); + } + +{H}{A}{N}{D}{L}{E}{R}{S} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(HANDLERS); + } + +{I}{N}{P}{U}{T} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(INPUT); + } + +{O}{U}{T}{P}{U}{T} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(OUTPUT); + } + +{I}{N}{O}{U}{T} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(INOUT); + } + +{V}{I}{R}{T}{U}{A}{L} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(VIRTUAL); + } + +{W}{H}{E}{N} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(WHEN); + } + +{O}{T}{H}{E}{R}{W}{I}{S}{E} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(OTHERWISE); + } + +{C}{O}{N}{S}{T} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(CONST); + } + +{V}{A}{R} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(VAR); + } + +{S}{I}{G}{N}{A}{L} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(SIGNAL); + } + +{O}{T}{H}{E}{R}{W}{I}{S}{E} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(OTHERWISE); + } + +{I}{N}{T}{E}{G}{E}{R} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(INTEGER); + } + +{R}{E}{A}{L} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(REAL); + } + +{B}{O}{O}{L}{E}{A}{N} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(BOOLEAN); + } + +{C}{H}{A}{R}{A}{C}{T}{E}{R} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(CHARACTER); + } + +{S}{T}{R}{I}{N}{G} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(STRING); + } + +{F}{I}{L}{E} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(File); + } + +{P}{R}{O}{C}{E}{S}{S} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(PROCESS); + } + +{C}{O}{R}{O}{U}{T}{I}{N}{E} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(COROUTINE); + } + +{A}{R}{R}{A}{Y}{O}{F} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(ARRAY_OF); + } + +{N}{O}{N}{E} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(NONE); + } + +{T}{H}{I}{S} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(THIS); + } + +{D}{I}{V} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(DIV); + } + +{M}{O}{D} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(MOD); + } + +{I}{S} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(IS); + } + +{I}{N} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(IN); + } + +{O}{R} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(OR); + } + +{A}{N}{D} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(AND); + } + +{N}{O}{T} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(NOT); + } + +{Q}{U}{A} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(QUA); + } + +{R}{E}{S}{U}{L}{T} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(RESULT); + } + +{N}{E}{W} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(NEW); + } + +{C}{O}{P}{Y} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(COPY); + } + +{A}{T}{T}{A}{C}{H} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(ATTACH); + } + +{D}{E}{T}{A}{C}{H} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(DETACH); + } + +{S}{T}{O}{P} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(STOP); + } + +{R}{E}{S}{U}{M}{E} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(RESUME); + } + +{T}{E}{R}{M}{I}{N}{A}{T}{E} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(TERMINATE); + } + +{P}{U}{T} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(PUT); + } + +{G}{E}{T} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(GET); + } + +{R}{E}{A}{D} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(READ); + } + +{R}{E}{A}{D}{L}{N} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(READLN); + } + +{W}{R}{I}{T}{E} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(WRITE); + } + +{W}{R}{I}{T}{E}{L}{N} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(WRITELN); + } + +{C}{A}{L}{L} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(CALL); + } + +{K}{I}{L}{L} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(KILL); + } + +{E}{X}{I}{T} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(EXIT); + } + +{R}{E}{P}{E}{A}{T} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(REPEAT); + } + +{I}{N}{N}{E}{R} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(INNER); + } + +{W}{I}{N}{D} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(WIND); + } + +{R}{A}{I}{S}{E} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(RAISE); + } + +{A}{R}{R}{A}{Y} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(ARRAY); + } + +{D}{I}{M} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(DIM); + } + +{D}{O} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(DO); + } + +{O}{D} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(OD); + } + +{W}{H}{I}{L}{E} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(WHILE); + } + +{F}{O}{R} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(FOR); + } + +{S}{T}{E}{P} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(STEP); + } + +{T}{O} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(TO); + } + +{D}{O}{W}{N}{T}{O} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(DOWNTO); + } + +{I}{F} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(IF); + } + +{T}{H}{E}{N} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(THEN); + } + +{E}{L}{S}{E} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(ELSE); + } + +{F}{I} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(FI); + } + +{A}{N}{D}{I}{F} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(ANDIF); + } + +{O}{R}{I}{F} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(ORIF); + } + +{C}{A}{S}{E} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(CASE); + } + +{E}{S}{A}{C} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(ESAC); + } + +{P}{R}{E}{F} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(PREF); + } + +{S}{H}{A}{R}{E}{D} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(SHARED); + } + +{E}{N}{U}{M} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(ENUM); + } + +{T}{R}{U}{E} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisBool.Bool = 1 )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(BOOLCONST); + } + +{F}{A}{L}{S}{E} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisBool.Bool = 0 )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(BOOLCONST); + } + +\* { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(STAR); + } + +\/ { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(DIVIDE); + } + +\+ { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(PLUS); + } + +\- { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(MINUS); + } + +\= { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(EQUAL); + } + +("<>")|("=/=") { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(NEQUAL); + } + +"<" { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(LESS); + } + +">" { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(GREATER); + } + +(">=")|("=>") { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(GREATEROREQUAL); + } + +("<=")|("=<") { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(LESSOREQUAL); + } + +\( { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(OPENINGBRACKET); + } + +\) { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(CLOSINGBRACKET); + } + +\, { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(LIST_SEPARATOR); + } + +: { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(VARSEPARATOR); + } + +\; { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(ENDSENTENCE); + } + +\. { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(POINT); + } + +":=" { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisLoc = new Location( ThisPlace ) )); + return(AFFECTATION); + } + +" " { + SEMANTIC(( ThisPlace.Tab(1) )); + } + +\n { + SEMANTIC(( BeginningOfLine = 1 )); + SEMANTIC(( ThisPlace.Cr() )); + line_number++; + } + +{Identifier} { + TOKENS_DEBUG_printf2("%s.\n",yytext); + SEMANTIC(( yylval.ThisString.Str = new String ( yytext ) )); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisString.Loc = new Location( ThisPlace ) )); + return(IDENTIFIER); + } + +{Digit}+ { + TOKENS_DEBUG_printf("DigitSequence.\n"); + SEMANTIC(( yylval.ThisInt.Int = atoi(yytext) )); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisInt.Loc = new Location( ThisPlace ) )); + return(DIGITSEQUENCE); + } + +\'.?\' { + TOKENS_DEBUG_printf("CharConst.\n"); + SEMANTIC(( yylval.ThisChar.Char = yytext[1] )); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisChar.Loc = new Location( ThisPlace ) )); + return(CHARCONST); + } + +\'[^\'\n]*\' { + TOKENS_ERROR_printf("Error : Multiple Character constant.\n"); + SEMANTIC(( yylval.ThisChar.Char = yytext[1] )); + SEMANTIC(( LexAdvanceCursor( strlen(yytext) ) )); + SEMANTIC(( yylval.ThisChar.Loc = new Location( ThisPlace ) )); + return(CHARCONST); + } + +\" { + BEGIN(CondString); + SEMANTIC(( ThisPlace.Tab( 1 ) )); + yymore(); + } + +"(*" { + BEGIN(CondComment); + SEMANTIC(( ThisPlace.Tab( 2 ) )); + yymore(); + } + +. { + TOKENS_ERROR_printf("Erreur d'entree.\n"); + SEMANTIC(( ThisPlace.Select( 1 ) )); + } + +"//" { + BEGIN(CondLineComment); + SEMANTIC(( ThisPlace.Tab( 2 ) )); + yymore(); + } + +.*\n { + BEGIN(INITIAL); + SEMANTIC(( ThisPlace.Cr() )); + SEMANTIC(( BeginningOfLine = 1 )); + line_number++; + } + +\" { + TOKENS_DEBUG_printf2("String :%s\n",yytext); + BEGIN(INITIAL); + SEMANTIC( + { + yylval.ThisString.Str = new String(yytext); + ThisPlace.Select( strlen(yytext) ); + yylval.ThisString.Loc = new Location( ThisPlace ); + }); + return(TEXTCONST); + } + +\\\" { + yymore(); + } + +\n { + TOKENS_ERROR_printf("Error : Unterminated String.\n"); + line_number++; + BEGIN(INITIAL); + SEMANTIC(( ThisPlace.Cr() )); + SEMANTIC(( BeginningOfLine = 1 )); + return(TEXTCONST); + } + +. { + yymore(); + } + +"(*" { + SEMANTIC(( ThisPlace.Tab( 2 ) )); + } + +"*)" { + BEGIN(INITIAL); + SEMANTIC(( ThisPlace.Select( 2 ) )); + } + +. { + SEMANTIC(( ThisPlace.Tab( 1 ) )); + } + +%% +#ifndef SYNTAX_ONLY +void LexAdvanceCursor( int length ) +{ + + if ( !BeginningOfLine ) + ThisPlace.Advance(); + ThisPlace.Select( length ); + BeginningOfLine = 0; + ThisPlace; +} +#endif /* SYNTAX_ONLY */ diff --git a/loglan96/loglan93/loglan.tar b/loglan96/loglan93/loglan.tar new file mode 100644 index 0000000000000000000000000000000000000000..02fd5208aa1f02006df037cc2847d4fae1696bc2 GIT binary patch literal 163840 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 literal 0 HcmV?d00001 diff --git a/loglan96/loglan93/makefile b/loglan96/loglan93/makefile new file mode 100644 index 0000000..98f82df --- /dev/null +++ b/loglan96/loglan93/makefile @@ -0,0 +1,75 @@ +# CDEFINE : Any symbols used for debugging +# RULES_DEBUG : if defined prints the rules reduced +# RULES_ERROR_DEBUG : if defined prints the error rules reduced +# TOKENS_DEBUG : if defined prints the tokens read in the input +# +CXX=gcc + +LDFLAGS= -lm -lg++ +CDEFINE= +YACC=bison -y +YFLAGS=-d -v +CXXFLAGS= $(CDEFINE) $(CFLAGS) + +DIST= syntax.y lex.l \ + SymTable.cc SymTable.h \ + Objects.cc Objects.h \ + Expr.cc Expr.h \ + Instr.cc Instr.h \ + tstSymbt.cc tstObj.cc tstExpr.cc\ + Makefile \ + test.log test1.log test2.log test3.log test4.log + +SYNTAXOBJ=syntax.o lex.o Objects.o Expr.o Instr.o + +.l.cc: + $(LEX) -t $(LFLAGS) $< > $@ + +all: syntax + +check: test + +test: all + ./syntax < test.log 2>&1 > result.out + +syntax: $(SYNTAXOBJ) + $(CXX) -o syntax $(CXXFLAGS) $(SYNTAXOBJ) $(LDFLAGS) + +lex.o: lex.cc syntax.h + +tstSyntax.o: syntax.cc + $(CXX) $(CXXFLAGS) -DSYNTAX_ONLY -DRULES_DEBUG -c syntax.cc -o tstSyntax.o + +tstLex.o: lex.cc + $(CXX) $(CXXFLAGS) -DSYNTAX_ONLY -DTOKENS_DEBUG -c lex.cc -o tstLex.o + +tstObj: tstObj.o Objects.o + $(CXX) -o tstOBJ $(CXXFLAGS) $(LDFLAGS) tstObj.o Objects.o + +tstSymbt: tstSymbt.o SymTable.o + $(CXX) -o tstSymbt tstSymbt.o SymTable.o $(CXXFLAGS) $(LDFLAGS) + +tstExpr: tstExpr.o Expr.o + $(CXX) -o tstExpr tstExpr.o Expr.o $(CXXFLAGS) $(LDFLAGS) + +tstInstr: tstInstr.o Instr.o Objects.o Expr.o + $(CXX) -o tstInstr tstInstr.o Instr.o Expr.o Objects.o $(CXXFLAGS) $(LDFLAGS) + +tstSyntax: tstSyntax.o tstLex.o + $(CXX) -o tstSyntax tstSyntax.o tstLex.o $(CXXFLAGS) $(LDFLAGS) + +syntax.cc syntax.h: syntax.y + $(YACC) $(YFLAGS) syntax.y + mv y.tab.c syntax.cc + mv y.tab.h syntax.h + mv y.output syntax.out + +clean: + rm -f syntax.[ch] lex.c *.o syntax.output + rm -f result.out tst*.o + +realclean: clean + rm -f syntax tst* + +dist: + tar cvf loglan.tar $(DIST) diff --git a/loglan96/loglan93/objects.cc b/loglan96/loglan93/objects.cc new file mode 100644 index 0000000..d144d70 --- /dev/null +++ b/loglan96/loglan93/objects.cc @@ -0,0 +1,220 @@ +#include +#include +#include "Objects.h" + +#define LINE_WIDTH 256 // set the line width to anything you want. + // The Only assumption is that a column number + // is lesser than LINE_WIDTH + +#define POSITION(line,column) ( (line) * LINE_WIDTH + (column) ) + +//************************************** +//* Class Location : * +//* Class used for storing location * +//* of an object * +//************************************** + +// Constructor with two arguments : the markers are set equal each other +// Start mark = End mark. + +Location::Location( void ) +{ + LineStart = LineEnd = 1; + ColumnStart = ColumnEnd = 1; +} + +Location::Location( int Line, int Column = 1 ) +{ + if (Line < 0 || Column < 0 || Column > LINE_WIDTH) + error("Incoherent values for initialisation of Location object."); + LineStart = LineEnd = Line; + ColumnStart = ColumnEnd = Column; +} + +// Constructor with four arguments : the two first are for Start mark +// and the two last are for the End mark. + +Location::Location( int First_Line, int First_Column, + int Last_Line, int Last_Column ) +{ + if ((First_Line <= 0) || (First_Column <= 0) || + (Last_Line <= 0) || (Last_Column <= 0) || + (First_Column > LINE_WIDTH) || (Last_Column > LINE_WIDTH)) + error("Incoherent values for initialisation of Location object."); + + if ( POSITION(First_Line,First_Column) < POSITION(Last_Line,Last_Column) ) + { + LineStart = First_Line; + LineEnd = Last_Line; + ColumnStart = First_Column; + ColumnEnd = Last_Column; + } + else + { + LineStart = Last_Line; + LineEnd = First_Line; + ColumnStart = Last_Column; + ColumnEnd = First_Column; + } +} + +Location::Location( const Location& TheLoc ) +{ + LineStart = TheLoc.LineStart; + LineEnd = TheLoc.LineEnd; + ColumnStart = TheLoc.ColumnStart; + ColumnEnd = TheLoc.ColumnEnd; +} + +// SetEnd method : Set the End mark to line number Line +// and column number Column. + +void Location::SetEnd( int Line, int Column ) +{ + + if ( Line <= 0 || Column <= 0 || Column > LINE_WIDTH) + error("Incoherent values for initialisation of Location object."); + + if ( POSITION(Line,Column) > POSITION(LineStart,ColumnStart) ) +// The new End Mark is after the Start Mark so we just adjust the End Mark. + { + LineEnd = Line; + ColumnEnd = Column; + } + else + { +// The new End Mark is before the Start Mark so we have two swap the two marks. + LineEnd = LineStart; + ColumnEnd = ColumnStart; + LineStart = Line; + ColumnStart = Column; + } +} + +// This function sets the beginning of the Location Object at +// the line Line and the column Column + +void Location::Move( int Line , int Column ) +{ + LineStart = Line; + ColumnStart = Column; + if ( POSITION(LineStart,ColumnStart) > POSITION(LineEnd,ColumnEnd) ) + { + ColumnEnd = ColumnStart; + LineEnd = LineStart; + } +} + +// This function simply advance the start position by 'distance' columns. +void Location::Tab( int distance ) +{ + ColumnStart += distance; + if (ColumnStart > LINE_WIDTH) + { + LineStart++; + ColumnStart = ((ColumnStart - 1) % LINE_WIDTH) + 1; + } + if (POSITION(LineStart,ColumnStart) > POSITION(LineEnd,ColumnEnd) ) + { + LineEnd = LineStart; + ColumnEnd = ColumnStart; + } +} + +// This function return the start position to the first column of the next line. +void Location::Cr( void ) +{ + LineStart++; + ColumnStart = 1; + if ( POSITION(LineStart,ColumnStart) > POSITION(LineEnd,ColumnEnd) ) + { + LineEnd = LineStart; + ColumnEnd = ColumnStart; + } +} + +void Location::Select( int length ) +{ + LineStart = LineEnd; + ColumnStart = ColumnEnd; + ColumnEnd += length - 1; + if ( ColumnEnd >= LINE_WIDTH ) + { + LineEnd++; + ColumnEnd = (ColumnEnd - 1 ) % LINE_WIDTH + 1; + } +} + +void Location::Advance( void ) +{ + LineStart = LineEnd; + ColumnStart = ++ColumnEnd; + if (ColumnStart == LINE_WIDTH) + { + ColumnStart = ColumnEnd = 1; + LineStart = ++LineEnd; + } +} + +void Location::CrSelect( void ) +{ + LineEnd++; + ColumnEnd = 1; +} + +// Checking the properties of a location Object : +// Line numbers and Column numbers must be greater than 0 and +// Start Mark must be come before the End Mark. + +int Location::OK( void ) +{ + if ( (LineStart < 0) || (LineEnd < 0) || + (ColumnStart < 0) || (ColumnEnd < 0) || +// here we compute the number of characters from the begining +// assuming the line is LINE_WIDTH characters wide . + ( POSITION( LineStart,ColumnStart ) > POSITION( LineEnd,ColumnEnd ) ) + ) + { + error(" This Location object is not in a coherent state."); + return -1; + } + else + return 0; +} + +// Overloading semantic of + operator. +// this return a Location Object that include both objects Location. +Location operator + ( const Location& FirstLocation , + const Location& SecondLocation ) +{ + if (POSITION( FirstLocation .LineStart,FirstLocation .ColumnStart ) < + POSITION( SecondLocation.LineEnd ,SecondLocation.ColumnEnd ) ) + { + return Location( FirstLocation .LineStart , + FirstLocation .ColumnStart, + SecondLocation.LineEnd, + SecondLocation.ColumnEnd ); + } + else + { + return Location( SecondLocation.LineStart , + SecondLocation.ColumnStart, + FirstLocation.LineEnd, + FirstLocation.ColumnEnd ); + } +} + +// Well, this print out the contents of a Location object. + +ostream& operator << ( ostream& cout, Location there ) +{ + cout << '(' << there.LineStart << ':' << there.ColumnStart << ','; + return cout << there.LineEnd << ':' << there.ColumnEnd << ')'; +} + +// General fonction that force the program to abort. +void error( char * TheString ) +{ + cout << TheString; + exit(-1); +} diff --git a/loglan96/loglan93/objects.h b/loglan96/loglan93/objects.h new file mode 100644 index 0000000..5163a37 --- /dev/null +++ b/loglan96/loglan93/objects.h @@ -0,0 +1,152 @@ +//************************************** +//* Class Location : * +//* Class used for storing location * +//* of an object * +//************************************** + +void error(char *); // outputs an error message then exits. + +class Location +{ + int LineStart, // Line number where the entity starts + LineEnd, // Line number where the entity ends. + ColumnStart, // Column number of the beginning of the entity. + ColumnEnd; // Column number of the end of the entity. + + int OK( void ); // Checks some properties of the object. + + public: + + // Several Constructors for initialisation of Location Object. + // The entity for the two first constructors is set to end at the same + // point than its beginnning. + + // First constructor sets the Location to the beginning of the Text. + Location( void ); + + // Second constructor sets the Location to line Line and column Column. + // If Column is ommited, it is assumed that you are talking about the + // column 1. + + Location( int Line , int Column = 1 ); + + // Last constructor for the ones who knows about the beginning and the + // end of the entity referenced. + Location( int First_Line, int First_Column, + int Last_Line, int Last_Column); + + Location( const Location& ); + + // Set the point in the text where the entity ends. + void SetEnd( int Line, int Column ); + + // Move the beginning of the Location to the place indicated. + void Move( int Line , int Column ); + + // Advance the start position to n columns. + void Tab( int distance ); + + // Return the start position to next line. + void Cr( void ); + + void Select( int length ); + + void Advance( void ); + + void CrSelect( void ); + + // Overloading of the operator + for computing new Location + // The Location Object resulting begins at the first Location + // ( The most little position in the text) and ends at the + // last location (The furthest position). + friend Location operator + ( const Location& , const Location& ); + + // friend operation that allows to write the Location of the entity on + // the output stream. + friend ostream& operator << ( ostream& cout, Location there ); +} ; + +//** +//** Several structure used inside the lex and yacc structure +//** + +//** LocInt : concatenation of a integer and a location Object. +typedef struct +{ + int Int; + Location *Loc; +} LocInt; + +//** LocBool : concatenation of a boolean and a location Object. +typedef struct +{ + int Bool; + Location *Loc; +} LocBool; + +//** LocInt : concatenation of a integer and a location Object. +typedef struct +{ + double Real; + Location *Loc; +} LocDouble; + +//** LocStr : concatenation of a String and a location Object. +typedef struct +{ + String *Str; + Location *Loc; +} LocStr; + +//** LocChar : concatenation of a character and a location Object. +typedef struct +{ + char Char; + Location *Loc; +} LocChar; + +//******************************************* +//* Class ErrorEntry * +//* This Class describes an error emited * +//* during the analysis of the text. * +//******************************************* + +enum ErrorKind {Warning, // This entry is a warning. + Error, // This entry is a real error. + Fatal, // This entry is a spurious error. + Internal, // This error is because of the compiler. + Operating_system, // This error is because of the operating system. + Unknown}; // We don't know why an error has been generated. + +class ErrorEntry +{ + Location place; // Where it has happened. + int number; // The number of error encountered. + ErrorKind kind; // The type of error (see upper). + char *comment; // A precision about the error. + + public: + // Two constructors to initialize an ErrorEntry object. + + // First constructor, give the location of the error and its identification + ErrorEntry( Location, int, ErrorKind ); + + // Second constructor, just add a commend to the error. + ErrorEntry( Location, int, ErrorKind, char * ); + + // the friend operator << that allows to output the content of an + // ErrorEntry object into an output stream. + friend ostream operator << ( ostream& cout, ErrorEntry TheError); +} ; + +//******************************************* +//* Class ErrorStorage * +//* This class describes the object that * +//* holds all of the errors and warning * +//* produced by the analysis phase. * +//******************************************* + +class ErrorStorage +{ + +} ; diff --git a/loglan96/loglan93/symtable.cc b/loglan96/loglan93/symtable.cc new file mode 100644 index 0000000..1f37069 --- /dev/null +++ b/loglan96/loglan93/symtable.cc @@ -0,0 +1,340 @@ +#include +#include +#include +#include "SymTable.h" + +int init_offset(type kind) { + + switch (kind) { + case CLASS_S : + case PROCESS_S : + case COROUTINE_S : + case SIGNAL_S : + case FUNCTION_S : + case PROCEDURE_S : + case BLOCK_S : + case HANDLERS_S : break; + }; + + return 1; + +}; + +int update_offset(type kind) { + + switch (kind) { + case CLASS_S : + case PROCESS_S : + case COROUTINE_S : + case SIGNAL_S : + case FUNCTION_S : + case PROCEDURE_S : + case HANDLERS_S : + case VARIABLE_S : + case CONSTANT_S : break; + }; + + return 1; + +}; + +void list::add_elem(entry* e) { + + list_elem* ThisElement; + + ThisElement = new list_elem(e); + ThisElement->next = end_ptr; + end_ptr = ThisElement; + +}; + + +entry* list::find_virt(String id) +{ + list_elem* ThisElement; + + for( ThisElement = end_ptr; + (ThisElement != NULL) && ( ThisElement->info_ptr->id != id); + ThisElement = ThisElement->next + ); + + if ( ThisElement ) + return ThisElement->info_ptr; + else + return NULL; +}; + + +void spec_list::add(String id) +{ + + end_ptr=new spec_elem(id,end_ptr); + +}; + +bool spec_list::present(String id) { + + spec_elem* temp; + + temp=end_ptr; + while ( temp != NULL && temp->info != id ) + temp=temp->next; + if (temp != NULL) + return TRUE; + else + return FALSE; + +}; + + +void pref_list::add_pref(entry* e,sharing sh) +{ + list* temp; + + end_ptr = new pref_list_elem(e,sh,end_ptr); + + if ((temp=((c_class*)(e->rest))->my_symtab->formal_param_list) != NULL) { + if (symtab->last->formal_param_list == NULL) + symtab->last->formal_param_list=new list; + symtab->last->formal_param_list->end_ptr=temp->end_ptr; + }; + +}; + + +entry::entry(String ii,type kk,int oo,spec ss,packet* pp) +{ + id = ii; + kind = kk; + offset = oo; + visible = ss; + rest = pp; +}; + +node::node(int ll) +{ + level=ll; + current_offset=OFFSET; + if (symtab == NULL) + end_ptr = begin_ptr + = new entry(NO_IDENT,FATHER,NO_OFFSET,NORMAL, + new f_father(NULL,level) + ); + else + end_ptr = begin_ptr + = new entry(NO_IDENT,FATHER,NO_OFFSET,NORMAL, + new f_father(symtab->last,level) + ); + + virtual_list = NULL; + begin_ptr->prev = NULL; + close=taken=hidden = NULL; + +}; + +void node::close_unit() +{ + symtab->last=((f_father*)(begin_ptr->rest))->father_ptr; +}; + + +node* node::open_unit() +{ + node* temp; + + temp = new node(level+1); + + ((c_class*)(symtab->last->end_ptr->rest))->my_symtab=temp; + + temp->current_offset=init_offset(end_ptr->kind); + symtab->last=temp; + + return temp; + +}; + +void node::add_spec(spec kind,String id) +{ + + switch (kind) { + + case CLOSE : + if (close==NULL) close=new spec_list; + close->add(id); + break; + + case HIDDEN : + if (hidden==NULL) hidden=new spec_list; + hidden->add(id); + break; + + case TAKEN : + if (taken==NULL) taken=new spec_list; + taken->add(id); + break; + + }; + +}; + +void node::add_virt(entry* v) { + + if (virtual_list == NULL) virtual_list=new list; + virtual_list->add_elem(v); + +}; + +void node::add_form_param(entry* fp) { + + if (formal_param_list == NULL) formal_param_list=new list; + formal_param_list->add_elem(fp); + +}; + + +struct find_result* node::local_find(String id,visible vis) { + + entry* temp; + bool stop=FALSE; + + + temp=end_ptr; + + while ( !stop && temp->kind != FATHER) { + if (temp->id != id) + temp=temp->prev; + else + switch (temp->visible) + { + case HIDDEN : + if (vis == NOT_HIDDEN) + temp=temp->prev; + else + stop=TRUE; + break; + + case NORMAL : + case CLOSE : + stop=TRUE; + break; + }; + }; + + + if ( !stop ) + return new find_result(level,NULL); + else + return new find_result(level,temp); +}; + +struct find_result* symboltable::find_in_module(node* start,String id,bool dot=DOT,visible vis=ALL) { + + struct find_result* temp1; + node* temp2; + pref_list_elem* temp3; + bool stop=FALSE; + + temp1=start->local_find(id,vis); + if (temp1->found != NULL && !dot) + return temp1; + else if (start->prefix != NULL) { + + temp3=start->prefix->end_ptr; + while ((temp3 != NULL) && !stop) { + temp1=((c_class*)(temp3->where->rest))->my_symtab->local_find(id,NOT_HIDDEN); + if (temp1->found != NULL) stop = TRUE; + temp3=temp3->next; + }; + if (temp3 != NULL && !dot) return temp1; + }; + +return new find_result(temp1->level,NULL); + + +}; + +struct find_result* symboltable::find(String id) { + + struct find_result* temp1; + entry* temp2; + node* temp3; + + temp1=symtab->find_in_module(symtab->last,id,FALSE,ALL); + if (temp1->found != NULL && temp1->found->id == id) return temp1; + temp3=((f_father*)(symtab->last->begin_ptr->rest))->father_ptr; + while (temp3 != NULL && temp1->level != MAIN_LEVEL ) { + temp1=symtab->find_in_module(temp3,id,FALSE,NOT_HIDDEN); + temp3=((f_father*)(temp3->begin_ptr->rest))->father_ptr; + }; + + if (temp1->found != NULL && temp1->found->id == id) + + return temp1; + + else + + return new find_result(MAIN_LEVEL,NULL); + +}; + +entry* symboltable::inherit(String id,sharing sh=NOT_SHARED) { + + entry* temp; + + pref_list_elem* temp1; + + + temp=symtab->find(id)->found; + + if (temp != NULL && ( temp->kind ==CLASS_S || temp->kind == PROCESS_S || temp->kind == COROUTINE_S) ) { + + if (last->prefix == NULL) last->prefix = new pref_list; + + if (((c_class*)(temp->rest))->prefix != NULL) { + + temp1=((c_class*)(temp->rest))->prefix->end_ptr; + while (temp1 != NULL) { + last->prefix->add_pref(temp1->where,temp1->shared); + temp1=temp1->next; + }; + }; + last->prefix->add_pref(temp,sh); + return temp; + } + + else + + return NULL; + +}; + +entry* symboltable::insert(String id,type kind,packet* p) { + + entry* temp; + + spec temp1; + + if ( ((symtab->last->local_find(id,ALL))->found == NULL) ) + { + + temp1=NORMAL; + if (symtab->last->close != NULL) + if (symtab->last->close->present(id) ) temp1=CLOSE; + if (symtab->last->hidden != NULL) + if (symtab->last->hidden->present(id) ) temp1=HIDDEN; + temp=new entry(id,kind,symtab->last->current_offset,temp1,p); + symtab->last->current_offset += update_offset(kind); + temp->prev=symtab->last->end_ptr; + symtab->last->end_ptr=temp; + if (kind == VARIABLE_S && (((v_variable*)p)->type == POINTER)) { + if (symtab->last->ref_var_list == NULL) + symtab->last->ref_var_list=new list; + symtab->last->ref_var_list->add_elem(temp); + }; + return temp; + + } + + else return NULL; + +}; diff --git a/loglan96/loglan93/symtable.h b/loglan96/loglan93/symtable.h new file mode 100644 index 0000000..c4a098d --- /dev/null +++ b/loglan96/loglan93/symtable.h @@ -0,0 +1,202 @@ +typedef int bool; + +typedef enum { FATHER,PREFIX,CLASS_S,PROCESS_S,COROUTINE_S,VARIABLE_S,SIGNAL_S, + CONSTANT_S,FUNCTION_S,PROCEDURE_S,BLOCK_S,HANDLERS_S } type; + +typedef enum { CLOSE,HIDDEN,TAKEN,NORMAL } spec; + +typedef enum { INTEGER,REAL,BOOLEAN,CHARACTER,STRING,FILE,SEMAPHORE,POINTER } var_type; + +typedef enum { ALL,NOT_HIDDEN } visible; + +typedef enum { SHARED,NOT_SHARED } sharing; + + + + +#define NO_OFFSET -2 +#define NO_IDENT NULL +#define OFFSET 150 +#define TRUE 1 +#define FALSE 0 +#define MAIN_LEVEL 0 +#define DOT TRUE +#define NOT_DOT FALSE + +class packet {public : }; + +class entry +{ +public : + String id; + type kind; + int offset; + spec visible; + packet* rest; + entry* prev; + + entry(String,type,int,spec,packet*); +}; + +struct find_result +{ + int level; + entry* found; + + find_result(int l,entry* e) { level=l;found=e;} +}; + + +class list_elem +{ +public : + entry* info_ptr; + list_elem* next; + list_elem(entry* e) { info_ptr=e; }; +}; + +class list +{ +public : + list_elem* end_ptr; + void add_elem(entry*); + + entry* find_virt(String); + + list() { end_ptr=NULL; }; +}; + +class spec_elem +{ +public : + String info; + spec_elem* next; + + spec_elem(String e,spec_elem* n) { info=e;next=n; }; +}; + +class spec_list +{ +public : + spec_elem* end_ptr; + + void add ( String ); + bool present( String ); + + spec_list() { end_ptr=NULL; }; +}; + +class pref_list_elem +{ + public : + entry* where; + int base; + sharing shared; + pref_list_elem* next; + + pref_list_elem(entry* e,sharing sh,pref_list_elem* c) + { + where = e; + shared = sh; + next = c; + }; + +}; + + +class pref_list +{ +public : + pref_list_elem* end_ptr; + void add_pref(entry*,sharing); + pref_list() {end_ptr=NULL;}; +}; + +class node +{ +public : + int level; + int current_offset; + entry* end_ptr; + entry* begin_ptr; + list* virtual_list; + list* formal_param_list; + list* ref_var_list; + pref_list* prefix; + spec_list* close; + spec_list* hidden; + spec_list* taken; + + void add_spec(spec,String); + void add_virt(entry*); + void add_form_param(entry*); + void close_unit(); + node* open_unit(); + struct find_result* local_find(String,visible); + node(int); + +}; + +class c_class : public packet +{ +public : + pref_list* prefix; + bool f_param; + bool virt; // or shared + node* my_symtab; + +}; + +class f_father : public packet +{ +public : + node* father_ptr; + int level; + int base; + f_father(node* ff,int ll) { father_ptr=ff;level=ll; }; +}; + +class symboltable +{ +public : + node* last; + node* root; + entry* inherit(String,sharing sh = NOT_SHARED); + entry* insert(String,type,packet*); + + struct find_result* find_in_module(node*,String,bool,visible vis = ALL); + + struct find_result* find(String); + symboltable() {root=last=new node(MAIN_LEVEL);}; +}; + +class v_variable : public packet +{ +public : + var_type type; + bool f_param; +}; + +class s_signal : public c_class {}; + +class h_handler : public c_class {}; + +class c_coroutine : public c_class { }; + +class p_process : public c_class {}; + +class b_block : public c_class {}; + +class p_procedure : public c_class { public: } ; + +class f_function : public c_class { + +public : + type result_type; +}; + +class c_constant : public packet +{ +public : + int ptr; //here will be link to constant value +}; diff --git a/loglan96/loglan93/syntax.y b/loglan96/loglan93/syntax.y new file mode 100644 index 0000000..9819b97 --- /dev/null +++ b/loglan96/loglan93/syntax.y @@ -0,0 +1,1406 @@ +//**************************************************************** +//* * +//* Syntax.y : Grammar for the LOGLAN-82 and the LOGLAN-93 * +//* languages. * +//* * +//* (c) LITA, university of PAU (France), summer 1993. * +//**************************************************************** + +%{ + +#ifdef RULES_DEBUG + +#define RULES_DEBUG_printf(a) fprintf(stderr,a) +#define RULES_ERROR_DEBUG + +#else + +#define RULES_DEBUG_printf(a) + +#endif + +#ifdef RULES_ERROR_DEBUG + +#define RULES_ERROR_printf(a) fprintf(stderr,a) + +#else + +#define RULES_ERROR_printf(a) + +#endif + +#ifndef SYNTAX_ONLY + +#define SEMANTIC(a) a + +#include +#include +#include +#include "Objects.h" +#include "Expr.h" +#include "Instr.h" + +extern int BeginningOfLine; + +#else + +#define SEMANTIC(a) + +#endif + +void initialize( void ); +int yylex( void ); +int line_number; +int yyerror( void ); +int yyerror( char * ); + +%} + +%union { + Expression *Expr; + Instruction *Instr; + Block *ThisBlock; + Location *ThisLoc; + BoolOpType bool; + ArithOpType arith; + ObjOpType object; + OneArgJob ThisArgJob; + LocInt ThisInt; + LocDouble ThisReal; + LocChar ThisChar; + LocStr ThisString; + LocBool ThisBool; +} + +%type binary_operator +%type arith_operator arith_operator2 +%type opt_Num_const +%type opt_prefix_sign +%type factor expression expression_in_bracket +%type NumberConst object_factor composed_expr2 +%type composed_expr logic_expr variable +%type object generator r_value +%type one_or_more_logic_factor one_or_more_logic_term +%type one_or_more_factor one_or_more_term +%type non_prefixed_variable non_prefixed_generator +%type short_or_and_list +%type object_operator +%type affectation_instruction instruction +%type single_instruction complex_instruction +%type condition_instruction loop_instruction +%type parameter_job_instruction +%type instructions opt_instructions opt_else loop_body + +// Main + +%token PROGRAM BLOCK PREF + +// Module definition + +%token UNIT CLASS PROCEDURE FUNCTION +%token COROUTINE PROCESS VIRTUAL SHARED ENUM + +// Parameters transmission mode + +%token INPUT OUTPUT INOUT TAKEN CLOSE HIDDEN + +// Sub-parts of module + +%token HANDLERS SIGNAL Begin END + +// Variable and constants declarations + +%token VAR CONST +%token IDENTIFIER +%token INTEGER TYPE REAL BOOLEAN CHARACTER +%token STRING File ARRAY + +//Punctuation + +%token LIST_SEPARATOR VARSEPARATOR OPENINGBRACKET +%token CLOSINGBRACKET ENDSENTENCE POINT + +//Operators + +%token STAR DIVIDE DIV MOD PLUS MINUS +%token LESS LESSOREQUAL EQUAL NEQUAL +%token GREATER GREATEROREQUAL +%token OR AND NOT ANDIF ORIF +%token AFFECTATION +%token QUA THIS IS IN NEW COPY ARRAY_OF +%token NONE + +// Constants + +%token TEXTCONST +%token CHARCONST +%token DIGITSEQUENCE +%token BOOLCONST + +//Keywords for Instructions + +%token IF THEN ELSE FI +%token CASE WHEN OTHERWISE ESAC +%token WHILE FOR STEP TO DOWNTO DO OD +%token ATTACH DETACH RESUME STOP TERMINATE +%token RESULT +%token GET PUT READ READLN WRITE WRITELN +%token DIM +%token RAISE KILL +%token CALL RETURN +%token EXIT REPEAT +%token INNER WIND + +%% + +// We begin with the main rule that initialize the variables analyse the +// program and then go on is compilation. + +but: initloglan program endprogram analyse + { RULES_DEBUG_printf(" but -> initloglan program analyse \n");} ; + +// This rule is empty. Is only use is for side-effect. + +initloglan: { initialize(); } + ; + +// This one too... + +analyse: + ; + +program: program_module + {RULES_DEBUG_printf("program -> program_module.\n"); } + | block_module + {RULES_DEBUG_printf("program -> block_module.\n"); } + | unit_module + {RULES_DEBUG_printf("program -> unit_module.\n"); } + ; + +program_module: PROGRAM IDENTIFIER endsentence module_body + { RULES_DEBUG_printf("program_module -> PROGRAM IDENTIFIER endsentence module_body.\n"); } + | PROGRAM error module_body + { RULES_ERROR_printf(" error: program name missing.\n"); } + ; + +block_module: BLOCK module_body + { RULES_DEBUG_printf("block_module -> BLOCK module_body.\n"); } + | error + { RULES_ERROR_printf(" error : BLOCK or PROGRAM expected.\n"); } + ; + +unit_module: module_header module_body + { RULES_DEBUG_printf("unit_module -> module_header module_body.\n"); } + ; + +module_body: opt_declarations module_code + { RULES_DEBUG_printf("module_body -> opt_declarations module_code.\n"); } + ; +module_header: UNIT opt_virtual IDENTIFIER VARSEPARATOR prefix_list module_type parameters endsentence opt_visibility_declarations + { RULES_DEBUG_printf("module_header -> UNIT opt_virtual IDENTIFIER VARSEPARATOR prefix_list modul_type parameters endsentence opt_visibility_declarations.\n"); } + | UNIT opt_virtual IDENTIFIER VARSEPARATOR ENUM OPENINGBRACKET identifier_list CLOSINGBRACKET endsentence + { RULES_DEBUG_printf("module_header -> UNIT opt_virtual IDENTIFIER VARSEPARATOR ENUM OPENINGBRACKET identifier_list CLOSINGBRACKET endsentence.\n"); } + ; + +prefix_list: + { RULES_DEBUG_printf("prefix_list -> .\n"); } + | list_prefix + { RULES_DEBUG_printf("prefix_list -> list_prefix.\n"); }; + +list_prefix: opt_shared identifier_path + { RULES_DEBUG_printf("list_prefix -> identifier_path .\n"); } + | opt_shared identifier_path LIST_SEPARATOR prefix_list + { RULES_DEBUG_printf("list_prefix -> identifier_path LIST_SEPARATOR prefix_list.\n"); } + ; + +opt_shared: SHARED + { RULES_DEBUG_printf("opt_shared -> SHARED.\n"); } + | + { RULES_DEBUG_printf("opt_shared -> .\n"); } + ; + +opt_virtual: VIRTUAL + { RULES_DEBUG_printf("opt_virtual -> VIRTUAL.\n"); } + | + { RULES_DEBUG_printf("opt_virtual -> .\n"); } + ; + +identifier_path: + IDENTIFIER + { RULES_DEBUG_printf("identifier_path -> IDENTIFIER.\n"); } + | IDENTIFIER VARSEPARATOR identifier_path + { RULES_DEBUG_printf("identifier_path -> IDENTIFIER VARSEPARATOR identifier_path.\n"); } + ; + +module_type: CLASS + { RULES_DEBUG_printf("module_type -> CLASS.\n"); } + | PROCEDURE + { RULES_DEBUG_printf("module_type -> PROCEDURE.\n"); } + | FUNCTION + { RULES_DEBUG_printf("module_type -> FUNCTION.\n"); } + | COROUTINE + { RULES_DEBUG_printf("module_type -> COROUTINE.\n"); } + | PROCESS + { RULES_DEBUG_printf("module_type -> PROCESS.\n"); } + ; + +parameters: OPENINGBRACKET formal_parameters_list opt_endsentence CLOSINGBRACKET end_parameters + { RULES_DEBUG_printf("parameters -> OPENINGBRACKET formal_parameters_list opt_endsentence CLOSINGBRACKET end_parameters.\n"); } + | end_parameters + { RULES_DEBUG_printf("parameters -> end_parameters.\n"); } + ; + +end_parameters: VARSEPARATOR typeident + { RULES_DEBUG_printf("end_parameters -> VARSEPARATOR IDENTIFIER.\n"); } + | + { RULES_DEBUG_printf("end_parameters -> .\n"); } + ; + +formal_parameters_list: formal_parameters_list endsentence formal_parameter + { RULES_DEBUG_printf("formal_parameters_list -> formal_parameters_list endsentence formal_parameter.\n"); } + | formal_parameter + { RULES_DEBUG_printf("formal_parameters_list -> formal_parameter.\n"); } + ; + +formal_parameter: parametertype var_param_list + { RULES_DEBUG_printf("formal_parameter -> parametertype var_param_list.\n"); } + | TYPE IDENTIFIER + { RULES_DEBUG_printf("formal_parameter -> TYPE IDENTIFIER.\n"); } + | callable_module + { RULES_DEBUG_printf("formal_parameter -> callable_module.\n"); } + ; + +parametertype: INPUT + { RULES_DEBUG_printf("parametertype -> INPUT.\n"); } + | OUTPUT + { RULES_DEBUG_printf("parametertype -> OUTPUT.\n"); } + | INOUT + { RULES_DEBUG_printf("parametertype -> INOUT.\n"); } + | + { RULES_DEBUG_printf("parametertype -> .\n"); } + ; + +var_param_list: var_param_list LIST_SEPARATOR var_declaration + { RULES_DEBUG_printf("var_param_list -> var_param_list LIST_SEPARATOR var_declaration.\n"); } + | var_declaration + { RULES_DEBUG_printf("var_param_list -> var_declaration.\n"); } + ; + +var_declaration: identifier_list VARSEPARATOR typeident + { RULES_DEBUG_printf("var_declaration -> identifier_list VARSEPARATOR typeident.\n"); } + ; + +identifier_list: identifier_list LIST_SEPARATOR IDENTIFIER + { RULES_DEBUG_printf("identifier_list -> identifier_list LIST_SEPARATOR IDENTIFIER.\n"); } + | IDENTIFIER + { RULES_DEBUG_printf("identifier_list -> IDENTIFIER.\n"); } + ; + +typeident: list_arrayof definedtype + { RULES_DEBUG_printf(" typeident -> list_arrayof definedtype .\n"); } + | definedtype + { RULES_DEBUG_printf(" typeident -> definedtype .\n"); } + ; + +list_arrayof: list_arrayof ARRAY_OF + { RULES_DEBUG_printf(" list_arrayof -> list_arrayof ARRAY_OF .\n"); } + | ARRAY_OF + { RULES_DEBUG_printf(" list_arrayof -> .\n"); } + ; + +definedtype: predefinedtype + | IDENTIFIER + ; + +predefinedtype: INTEGER + { RULES_DEBUG_printf(" predefinedtype -> INTEGER .\n"); } + | REAL + { RULES_DEBUG_printf(" predefinedtype -> REAL.\n"); } + | BOOLEAN + { RULES_DEBUG_printf(" predefinedtype -> BOOLEAN.\n"); } + | CHARACTER + { RULES_DEBUG_printf(" predefinedtype -> CHARACTER.\n"); } + | STRING + { RULES_DEBUG_printf(" predefinedtype -> STRING.\n"); } + | File + { RULES_DEBUG_printf(" predefinedtype -> FILE.\n"); } + | PROCESS + { RULES_DEBUG_printf(" predefinedtype -> PROCESS.\n"); } + | COROUTINE + { RULES_DEBUG_printf(" predefinedtype -> PROCESS.\n"); } + ; + +callable_module: function_callable + { RULES_DEBUG_printf("callable_module -> function_callable.\n"); } + | procedure_callable + { RULES_DEBUG_printf("callable_module -> procedure_callable.\n"); } + ; + +function_callable: FUNCTION IDENTIFIER parameters + { RULES_DEBUG_printf("function_callable -> FUNCTION IDENTIFIER parameters.\n"); } + ; + +procedure_callable: PROCEDURE IDENTIFIER parameters + { RULES_DEBUG_printf("procedure_callable -> PROCEDURE IDENTIFIER parameters.\n"); } + ; + +handlers_declaration: HANDLERS handlers_body END HANDLERS opt_endsentence + { RULES_DEBUG_printf("handlers_declaration -> HANDLERS handlers_body END HANDLERS opt_endsentence.\n"); } + ; + +opt_endsentence: ENDSENTENCE + { RULES_DEBUG_printf("opt_endsentence -> ENDSENTENCE.\n"); } + | + { RULES_DEBUG_printf("opt_endsentence -> .\n"); } + ; + +endsentence: ENDSENTENCE + { RULES_DEBUG_printf("endsentence -> ENDSENTENCE.\n"); } + | error + { RULES_ERROR_printf("error : ';' expected.\n"); } + +handlers_body: when_list opt_others + { RULES_DEBUG_printf("handlers_body -> when_list opt_others.\n"); } + ; + +when_list: when_list when_unique + { RULES_DEBUG_printf("when_list -> when_list when_unique.\n"); } + | when_unique + { RULES_DEBUG_printf("when_list -> when_unique.\n"); } + ; + +when_unique: WHEN identifier_list VARSEPARATOR instructions + { RULES_DEBUG_printf("when_unique -> WHEN identifier_list VARSEPARATOR instructions.\n"); } + ; + +opt_others: OTHERWISE VARSEPARATOR instructions + { RULES_DEBUG_printf("opt_others -> OTHERWISE VARSEPARATOR instructions.\n"); } + | + { RULES_DEBUG_printf("opt_others -> .\n"); } + ; + +module_code: Begin opt_instructions END module_code_end + { + RULES_DEBUG_printf("module_code -> BEGIN opt_instructions END module_code_end.\n"); + SEMANTIC( + { + if ($2) + $2->Print( cout ); + }); + } + | END module_code_end + { RULES_DEBUG_printf("module_code -> END module_code_end.\n"); } + ; + +opt_instructions: instructions + { + RULES_DEBUG_printf("opt_instructions -> instructions opt_endsentence.\n"); + SEMANTIC(( $$ = $1 )); + } + | + { + RULES_DEBUG_printf("opt_instructions ->.\n"); + SEMANTIC(( $$ = NULL )); + } + ; + +module_code_end: + IDENTIFIER + { RULES_DEBUG_printf("module_code_end -> IDENTIFIER .\n"); } + | + { RULES_DEBUG_printf("module_code_end -> .\n"); } + ; + +opt_declarations: + { RULES_DEBUG_printf("opt_declarations -> .\n"); } + | declarations handlers_declaration + { RULES_DEBUG_printf("opt_declarations -> declarations handlers_declaration.\n"); } + | handlers_declaration + { RULES_DEBUG_printf("opt_declarations -> handlers_declaration.\n"); } + | declarations + { RULES_DEBUG_printf("opt_declarations -> declarations .\n"); } + ; + +declarations: declarations declaration endsentence + { RULES_DEBUG_printf("declarations -> declarations declaration endsentence.\n"); } + | declaration endsentence + { RULES_DEBUG_printf("declarations -> declaration endsentence. \n"); } + ; + +declaration: const_declaration + { RULES_DEBUG_printf("declaration -> const_declaration.\n"); } + | variables_declaration + { RULES_DEBUG_printf("declaration -> variables_declaration.\n"); } + | unit_module + { RULES_DEBUG_printf("declaration -> unit_module.\n"); } + | signal_declaration + { RULES_DEBUG_printf("declarations -> signal_declaration.\n"); } + ; + +opt_visibility_declarations: + visibility_declarations + { RULES_DEBUG_printf("opt_visibility_declarations -> visibility_declarations.\n"); } + | + { RULES_DEBUG_printf("opt_visibility_declarations -> .\n"); } + ; + +visibility_declarations: + visibility_declarations visibility_declaration endsentence + { RULES_DEBUG_printf("visibility_declarations -> visibility_declarations visibility_declaration endsentence.\n"); } + | visibility_declaration endsentence + { RULES_DEBUG_printf("visibility_declarations ->visibility_declaration endsentence.\n"); } + ; + +visibility_declaration: + visibility_keyword identifier_list + { RULES_DEBUG_printf("visibility_declaration -> visibility_keyword identifier_list.\n"); } + ; + +visibility_keyword: + TAKEN + { RULES_DEBUG_printf("visibility_keyword -> TAKEN.\n"); } + | CLOSE + { RULES_DEBUG_printf("visibility_declarations -> CLOSE.\n"); } + | HIDDEN + { RULES_DEBUG_printf("visibility_declarations -> HIDDEN.\n"); } + ; + +variables_declaration: VAR vars_list + { RULES_DEBUG_printf("variables_declaration -> VAR vars_list.\n"); } + ; + +const_declaration: CONST const_list + { RULES_DEBUG_printf("variables_declaration -> CONST const_list.\n"); } + ; + +signal_declaration: SIGNAL IDENTIFIER parameters + { RULES_DEBUG_printf("signal_declaration -> SIGNAL IDENTIFIER parameters.\n");} + ; + +// instructions are composed of juxtaposition of several instruction. +instructions: instruction + { + RULES_DEBUG_printf("instructions -> instruction.\n"); + SEMANTIC(( $$ = new Block( $1 ) )); + } + | instructions instruction + { + RULES_DEBUG_printf("instructions -> instructions instruction.\n"); + SEMANTIC(( *$1 += $2 )); + } + ; + +// An Instruction could be a single instruction (like WRITE or STOP) +// or a complex instruction (i.e. composed ) (like IF FOR WHILE CASE ... ) +instruction: single_instruction endsentence + { + RULES_DEBUG_printf("instruction -> single_instruction endsentence.\n"); + SEMANTIC(( $$ = $1 )); + } + | complex_instruction + { + RULES_DEBUG_printf("instruction -> complex_instruction.\n"); + SEMANTIC(( $$ = $1 )); + } + ; + +// List of every single instruction available +single_instruction: + affectation_instruction + { + RULES_DEBUG_printf("instruction -> affectation_instruction.\n"); + SEMANTIC(( $$ = $1 )); + } + | job_instruction + { + RULES_DEBUG_printf("instruction -> job_instruction.\n"); + SEMANTIC(( $$ = $1 )); + } + | io_instruction + { RULES_DEBUG_printf("instruction -> io_instruction.\n"); } + | signal_instruction + { RULES_DEBUG_printf("instruction -> signal_instruction.\n"); } + | array_instruction + { RULES_DEBUG_printf("instruction -> array_instruction.\n"); } + | object_instruction + { RULES_DEBUG_printf("instruction -> object_instruction.\n"); } + | CALL variable + { RULES_DEBUG_printf("instruction -> CALL variable.\n"); } + | RETURN + { RULES_DEBUG_printf("instruction -> RETURN.\n"); } + | exit_instruction + { RULES_DEBUG_printf("instruction -> exit_instruction.\n"); } + ; + +// Subdivision of complex instructions : +// instruction declaring a loop +// instruction declaring a condition +// instruction declaring a sub-block +complex_instruction: + loop_instruction + { + RULES_DEBUG_printf("complex_instruction -> loop_instruction.\n"); + $$ = $1; + } + | condition_instruction + { RULES_DEBUG_printf("complex_instruction -> condition_instruction.\n"); } + | block_instruction + { RULES_DEBUG_printf("complex_instruction -> block_instruction.\n"); } + | case_instruction + { RULES_DEBUG_printf("complex_instruction -> case_instruction.\n"); } + ; + +vars_list: vars_list LIST_SEPARATOR var_declaration + { RULES_DEBUG_printf("vars_list -> vars_list LIST_SEPARATOR var_declaration .\n"); } + | var_declaration + { RULES_DEBUG_printf("vars_list -> var_declaration .\n"); } + ; + +const_list: const_list LIST_SEPARATOR one_const + { RULES_DEBUG_printf("const_list -> const_list LISTSEPARATOR one_const.\n");} + | one_const + { RULES_DEBUG_printf("const_list -> one_const.\n");} + ; + +one_const: IDENTIFIER EQUAL expression + { + RULES_DEBUG_printf("one_const -> IDENTIFIER EQUAL expression. \n"); + } + ; + +expression: one_or_more_logic_term + { + RULES_DEBUG_printf("expression -> one_or_more_logic_term.\n"); + SEMANTIC(( $$ = $1 )); + } + ; + +one_or_more_logic_term: + one_or_more_logic_factor + { + RULES_DEBUG_printf("one_or_more_logic_term -> one_or_more_logic_term.\n"); + SEMANTIC(( $$ = $1 )) ; + } + | one_or_more_logic_term OR one_or_more_logic_factor + { + RULES_DEBUG_printf("one_or_more_logic_term -> one_or_more_logic_term OR one_or_more_logic_factor.\n"); + SEMANTIC(( $$ = new BoolOperator( $1, $3 , Or, $2 ) )); + } + ; + +one_or_more_logic_factor: + composed_expr + { + RULES_DEBUG_printf("one_or_more_logic_factor -> composed_expr.\n"); + SEMANTIC(( $$ = $1 )); + } + | one_or_more_logic_factor AND composed_expr + { + RULES_DEBUG_printf("one_or_more_logic_factor -> one_or_more_logic_factor AND composed_expr.\n"); + SEMANTIC(( $$ = new BoolOperator( $1, $3, And, $2 ) )); + } + ; + +composed_expr: NOT composed_expr2 + { + RULES_DEBUG_printf("composed_expr -> NOT composed_expr2.\n"); + SEMANTIC(( $$ = new Not( $2,$1 ) )); + } + | composed_expr2 + { + RULES_DEBUG_printf("composed_expr -> composed_expr2.\n"); + SEMANTIC(( $$ = $1 )); + } + ; + +composed_expr2: logic_expr + { + RULES_DEBUG_printf("composed_expr2 -> logic_expr.\n"); + SEMANTIC(( $$ = $1 )); + } + | logic_expr binary_operator logic_expr + { + RULES_DEBUG_printf("composed_expr2 -> logic_expr binary_operator logic_expr.\n"); + SEMANTIC(( $$ = new BoolOperator( $1 , $3 , $2 ) )); + } + | logic_expr object_operator object + { + RULES_DEBUG_printf("composed_expr2 -> logic_expr object_operator logic_expr.\n"); + SEMANTIC(( $$ = new ObjOperator( $1 , $3 , $2 ) )); + } + ; + +binary_operator: + EQUAL + { + RULES_DEBUG_printf("binary_operator -> EQUAL.\n"); + SEMANTIC(($$ = Equal)); + } + | NEQUAL + { + RULES_DEBUG_printf("binary_operator -> NEQUAL.\n"); + SEMANTIC(($$ = NotEqual)); + } + | LESS + { + RULES_DEBUG_printf("binary_operator -> LESS.\n"); + SEMANTIC(($$ = Less)); + } + | LESSOREQUAL + { + RULES_DEBUG_printf("binary_operator -> LESSOREQUAL.\n"); + SEMANTIC(($$ = LessOrEqual)); + } + | GREATER + { + RULES_DEBUG_printf("binary_operator -> GREATER.\n"); + SEMANTIC(($$ = Greater)); + } + | GREATEROREQUAL + { + RULES_DEBUG_printf("binary_operator -> GREATEROREQUAL.\n"); + SEMANTIC(($$ = GreaterOrEqual)); + } + ; + +object_operator: + IS + { + RULES_DEBUG_printf("object_operator -> IS.\n"); + SEMANTIC(( $$ = Is )); + } + | IN + { + RULES_DEBUG_printf("object_operator -> IN.\n"); + SEMANTIC(( $$ = In )); + } + ; + +object: COROUTINE + { RULES_DEBUG_printf("object -> COROUTINE.\n"); } + | PROCESS + { RULES_DEBUG_printf("object -> PROCESS.\n"); } + | IDENTIFIER + { + RULES_DEBUG_printf("object -> IDENTIFIER.\n"); + SEMANTIC(( $$ = new Identifier( $1.Str, $1.Loc ) )); + } + | error + { + RULES_ERROR_printf("error : bad object.\n"); + SEMANTIC(( $$ = new Error( new Location( ThisPlace ) )); + } + ; + +logic_expr: opt_prefix_sign one_or_more_term + { + RULES_DEBUG_printf("expression -> opt_prefix_sign one_or_more_term.\n"); +// To be modified, must take care of the optionnal prefix sign. + SEMANTIC(( $$ = $2 )); + } + ; + +// The optionnal prefixing sign: +a, -a, a +opt_prefix_sign: + PLUS + { + RULES_DEBUG_printf("opt_prefix_sign -> PLUS.\n"); + SEMANTIC(( $$.Int = 1 )); + SEMANTIC(( $$.Loc = $1 )); + } + | MINUS + { + RULES_DEBUG_printf("opt_prefix_sign -> MINUS.\n"); + SEMANTIC(( $$.Int = -1 )); + SEMANTIC(( $$.Loc = $1)); + } + | + { + RULES_DEBUG_printf("opt_prefix_sign -> .\n"); + SEMANTIC(( $$.Int = 1 )); + SEMANTIC(( $$.Loc = new Location(ThisPlace) )); + } + ; + +one_or_more_term: + one_or_more_factor + { + RULES_DEBUG_printf("one_or_more_term -> one_or_more_factor.\n"); + SEMANTIC(($$ = $1)); + } + | one_or_more_term arith_operator one_or_more_factor + { + RULES_DEBUG_printf("one_or_more_term -> one_or_more_term arith_operator one_or_more_factor.\n"); + SEMANTIC(( $$ = new ArithOperator( $1 , $3 , $2 ) )); + } + ; + +one_or_more_factor: + factor + { + RULES_DEBUG_printf("one_or_more_factor -> factor.\n"); + SEMANTIC(($$ = $1)); + } + | one_or_more_factor arith_operator2 factor + { + RULES_DEBUG_printf("one_or_more_factor -> one_or_more_factor arith_operator2 factor.\n"); + SEMANTIC(( $$ = new ArithOperator( $1 , $3 , $2 ) )); + } + ; + +arith_operator: + PLUS + { + RULES_DEBUG_printf("arith_operator -> PLUS.\n"); + SEMANTIC(($$ = Plus)); + } + | MINUS + { + RULES_DEBUG_printf("arith_operator -> MINUS.\n"); + SEMANTIC(($$ = Minus)); + } + ; + +arith_operator2: + STAR + { + RULES_DEBUG_printf("arith_operator2 -> STAR.\n"); + SEMANTIC(($$ = Multiply)); + } + | DIVIDE + { + RULES_DEBUG_printf("arith_operator2 -> DIVIDE.\n"); + SEMANTIC(($$ = Divide)); + } + | DIV + { + RULES_DEBUG_printf("arith_operator2 -> DIV.\n"); + SEMANTIC(($$ = IntDivide)); + } + | MOD + { + RULES_DEBUG_printf("arith_operator2 -> MOD.\n"); + SEMANTIC(($$ = Modulo)); + } + ; +factor: NumberConst + { + RULES_DEBUG_printf("factor -> NumberConst.\n"); + SEMANTIC(( $$ = $1 )); + } + | TEXTCONST + { + RULES_DEBUG_printf("factor -> TextConst.\n"); + SEMANTIC(( $$ = new StringConstant ( $1.Str, + $1.Loc ) )); + } + | CHARCONST + { + RULES_DEBUG_printf("factor -> CharConst.\n"); + SEMANTIC(( $$ = new CharConstant( $1.Str, + $1.Loc ) )); + } + | BOOLCONST + { + RULES_DEBUG_printf("factor -> BOOLCONST.\n"); + SEMANTIC(( $$ = new BoolConstant( $1.Bool, + $1.Loc ) )); + } + | variable + { + RULES_DEBUG_printf("factor -> variable.\n"); + SEMANTIC(( $$ = $1 )); + } + | object_factor + { + RULES_DEBUG_printf("factor -> object_factor.\n"); + SEMANTIC(( $$ = $1 )); + } + | generator + { + RULES_DEBUG_printf("factor -> generator.\n"); + SEMANTIC(( $$ = $1 )); + } + | expression_in_bracket + { + RULES_DEBUG_printf("factor -> expression_in_bracket.\n"); + SEMANTIC(($$ = $1)); + } + | error + { + RULES_ERROR_printf(" error : bad factor.\n"); + SEMANTIC(($$ = new Error )); + } + ; + +// Two results possible : an Integer constant if syntaxic string looks like +// 1000 or 1E3. +// or a Real constant if it looks like +// 1.3 1E-3, etc... +NumberConst: DIGITSEQUENCE opt_Num_const + { + RULES_DEBUG_printf("NumberConst -> DIGITSEQUENCE opt_Num_const.\n"); + SEMANTIC( + { + if ($2 >= 1) + { + $$ = new IntegerConstant((int)($1.Int * $2.Real), + new Location(*$1.Loc + *$2.Loc)); + } + else + { + $$ = new RealConstant( $1 * $2, + new Location(*$1.Loc + *$2.Loc)); + } + }) + } + | DIGITSEQUENCE POINT DIGITSEQUENCE opt_Num_const + { + RULES_DEBUG_printf("NumberConst -> DIGITSEQUENCE POINT DIGITSEQUENCE opt_Num_const.\n"); + SEMANTIC( + { + double dec = $3.Int; + + while (dec > 1) dec /= 10; + dec += $1; + + $$ = new RealConstant( dec * $4 ); + }) + } + | DIGITSEQUENCE POINT opt_Num_const + { + RULES_DEBUG_printf("NumberConst -> DIGITSEQUENCE POINT opt_Num_const.\n"); + SEMANTIC( + { + printf("Valeur numerique : "); + $$ = new RealConstant( $1 * $3 ); + }) + } + | POINT DIGITSEQUENCE opt_Num_const + { + RULES_DEBUG_printf("NumberConst -> POINT DIGITSEQUENCE opt_Num_const.\n"); + SEMANTIC( + { + double dec = $2; + + while (dec > 1) dec /= 10; + + $$ = new RealConstant( dec * $3 ); + }) + } + ; + +// The IDENTIFIER must be the E letter for the analyse of an sci notated value +// ( for example 1E-2 ). + +opt_Num_const: IDENTIFIER opt_prefix_sign DIGITSEQUENCE + { + RULES_DEBUG_printf("opt_Num_const -> IDENTIFIER opt_prefix_sign DIGITSEQUENCE.\n"); + SEMANTIC( + { + if ( *$1 == "E" ) + $$ = pow( 10 , (double) $3 * $2 ); + else + printf("Error : E was expected.\n"); + }) + } + | + { + RULES_DEBUG_printf("opt_Num_const -> .\n"); + SEMANTIC(( $$ = 1 )); + } + | IDENTIFIER error + { + RULES_DEBUG_printf(" error : exponant value expected.\n"); + SEMANTIC(( $$ = 1 )); + } + ; + +object_factor: NONE + { + RULES_DEBUG_printf("object_factor -> NONE.\n"); + SEMANTIC(( $$ = new NoneObject )); + } + | THIS IDENTIFIER + { + RULES_DEBUG_printf("object_factor -> THIS IDENTIFIER.\n"); + SEMANTIC(( $$ = new This( new Identifier ($2 ) ) )); + } + | THIS error + { RULES_ERROR_printf(" error : IDENTIFIER expected.\n"); } + ; + +qualifier_expr: non_prefixed_variable + { RULES_DEBUG_printf("qualifier_expr -> non_prefixed_variable.\n"); } + | non_prefixed_generator + { RULES_DEBUG_printf("qualifier_expr -> non_prefixed_generator.\n"); } + ; + +opt_qualifier: qualifier_expr opt_qua_list POINT + { RULES_DEBUG_printf("opt_qualifier -> qualifier_expr opt_qua_list POINT.\n"); } + | THIS IDENTIFIER opt_qua_list POINT + { RULES_DEBUG_printf("opt_qualifier -> THIS IDENTIFIER opt_qua_list POINT.\n"); } + | THIS error + { RULES_DEBUG_printf(" error : IDENTIFIER expected.\n"); } + ; + +opt_qua_list: opt_qua_list QUA IDENTIFIER + { RULES_DEBUG_printf("opt_qua_list -> QUA IDENTIFIER.\n"); } + | + { RULES_DEBUG_printf("opt_qua_list -> .\n"); } + | opt_qua_list QUA error + { RULES_ERROR_printf(" error : bad qua list (IDENTIFIER is missing).\n"); } + ; + +opt_list_qualifier: + opt_list_qualifier opt_qualifier + { RULES_DEBUG_printf("opt_list_qualifier -> opt_list_qualifier opt_qualifier.\n"); } + | opt_qualifier + { RULES_DEBUG_printf("opt_list_qualifier -> opt_qualifier.\n"); } + ; + +variable: opt_list_qualifier non_prefixed_variable + { + RULES_DEBUG_printf("variable -> opt_list_qualifier non_prefixed_variable.\n"); + SEMANTIC(( $$ = $2 )); + } + | non_prefixed_variable + { + RULES_DEBUG_printf("variable -> non_prefixed_variable.\n"); + SEMANTIC(( $$ = $1 )); + } + ; + +non_prefixed_variable: RESULT + { + RULES_DEBUG_printf("non_prefixed_variable -> RESULT.\n"); + SEMANTIC(( $$ = new Result )); + } + | identifier_path + { + RULES_DEBUG_printf("non_prefixed_variable -> identifier_path.\n"); + SEMANTIC(( $$ = new Identifier( $1 ) )); + } + | identifier_path OPENINGBRACKET one_or_more_expression CLOSINGBRACKET + { + RULES_DEBUG_printf("non_prefixed_variable -> identifier_path OPENINGBRACKET one_or_more_expression CLOSINGBRACKET.\n"); + SEMANTIC(( $$ = new Identifier( $1 ) )); + } + ; + +one_or_more_expression: + expression + { RULES_DEBUG_printf("one_or_more_expression -> expression.\n"); } + | one_or_more_expression LIST_SEPARATOR expression + { RULES_DEBUG_printf("one_or_more_expression -> one_or_more_expression LIST_SEPARATOR expression.\n"); } + ; + +generator: opt_list_qualifier non_prefixed_generator + { + RULES_DEBUG_printf("generator -> opt_list_qualifier non_prefixed_generator.\n"); + SEMANTIC(( $$ = $2 )); + } + | non_prefixed_generator + { + RULES_DEBUG_printf("generator -> non_prefixed_generator.\n"); + SEMANTIC(( $$ = $1 )); + } + ; + +non_prefixed_generator: NEW identifier_path actual_parameters + { + RULES_DEBUG_printf(" non_prefixed_generator -> NEW identifier_path actual_paramters.\n"); + SEMANTIC(( $$ = new New( new Identifier( $2 ) ) )); + } + | NEW ARRAY OPENINGBRACKET expression LIST_SEPARATOR expression CLOSINGBRACKET + { + RULES_DEBUG_printf("non_prefixed_generator -> NEW ARRAY OPENINGBRACKET expression VARSEPARATOR expression CLOSINGBRACKET"); + SEMANTIC(( $$ = new Error )); + } + | NEW error + { RULES_DEBUG_printf(" error : IDENTIFIER or ARRAY expected.\n"); } + | NEW ARRAY error + { RULES_DEBUG_printf(" error : syntax error in array definition.\n"); } + ; + +actual_parameters: + | OPENINGBRACKET actual_parameters_list CLOSINGBRACKET + { RULES_DEBUG_printf(" actual_parameters -> OPENINGBRACKET actual_parameters_list CLOSINGBRACKET.\n"); } + ; + +actual_parameters_list: + actual_parameter + { RULES_DEBUG_printf("actual_paramters_list -> actual_parameter.\n"); } + | actual_parameters_list LIST_SEPARATOR actual_parameter + { RULES_DEBUG_printf("actual_parameters_list -> actual_parameters_list LIST_SEPARATOR actual_parameter.\n"); } + ; + +actual_parameter: + expression + { RULES_DEBUG_printf("actual_parameter -> expression.\n"); } + | predefinedtype + { RULES_DEBUG_printf("actual_parameter -> predefinedtype.\n"); } + ; + +affectation_instruction: + l_identifiers_list AFFECTATION r_value + { + RULES_DEBUG_printf("affectation_instruction -> l_identifiers_list AFFECTATION r_value.\n"); + SEMANTIC(( $$ = new Affectation( $1 , $3 ) )); + } + | l_identifiers_list error r_value + { + RULES_ERROR_printf("error : ':=' expected.\n"); + SEMANTIC(( $$ = new Affectation( $1 , $3 ) )); + } + ; + +//** Warning !!! Theses actions are to be replaced by something right +//** It's just Test Code . + +l_identifiers_list: variable + { + RULES_DEBUG_printf("l_identifiers_list -> variable.\n"); + SEMANTIC(( $$ = $1 )); + } + | l_identifiers_list LIST_SEPARATOR variable + { + RULES_DEBUG_printf("l_identifiers_list -> l_identifiers_list LIST_SEPARATOR variable.\n"); + SEMANTIC(( $$ = $3 )); + } + ; + +r_value: expression + { + RULES_DEBUG_printf("r_value -> expression .\n"); + SEMANTIC(( $$ = $1 )); + } + | COPY expression_in_bracket + { + RULES_DEBUG_printf("r_value -> COPY expression_in_bracket .\n"); + SEMANTIC(( $$ = new Copy( $2 ) )); + } + ; + +job_instruction: + parameter_job_instruction OPENINGBRACKET expression CLOSINGBRACKET + { + RULES_DEBUG_printf("job_instruction -> parameter_job_instruction ( expression ).\n"); + SEMANTIC( + { + switch($1) + { + case AttachInstr: + $$ = new Attach( $3 ); + break; + case ResumeInstr: + $$ = new Resume( $3 ); + break; + case StopInstr: + $$ = new Stop( $3 ); + break; + } + }); + } + | DETACH + { + RULES_DEBUG_printf("job_instruction -> DETACH.\n"); + SEMANTIC(( $$ = new Detach )); + } + | STOP + { + RULES_DEBUG_printf("job_instruction -> STOP.\n"); + SEMANTIC(( $$ = new Stop )); + } + | TERMINATE + { + RULES_DEBUG_printf("job_instruction -> TERMINATE.\n"); + SEMANTIC(( $$ = new Terminate )); + } + ; + +parameter_job_instruction: + ATTACH + { + RULES_DEBUG_printf("parameter_job_instruction -> ATTACH.\n"); + SEMANTIC(( $$ = AttachInstr )); + } + | RESUME + { + RULES_DEBUG_printf("parameter_job_instruction -> RESUME.\n"); + SEMANTIC(( $$ = ResumeInstr )); + } + | STOP + { + RULES_DEBUG_printf("parameter_job_instruction -> STOP.\n"); + SEMANTIC(( $$ = StopInstr )); + } + ; + +io_instruction: + file_io_instruction + { RULES_DEBUG_printf("io_instruction -> file_io_instruction .\n"); } + | input_instruction + { RULES_DEBUG_printf("io_instruction -> input_instruction .\n"); } + | output_instruction + { RULES_DEBUG_printf("io_instruction -> output_instruction .\n"); } + ; + +file_io_instruction: + file_io_keyword OPENINGBRACKET expression LIST_SEPARATOR one_or_more_expression CLOSINGBRACKET + { RULES_DEBUG_printf("file_io_instruction -> file_io_keyword ( expression LIST_SEPARATOR one_or_more_expression ).\n"); } + ; + +file_io_keyword: + PUT + { RULES_DEBUG_printf("file_io_keyword -> PUT.\n"); } + | GET + { RULES_DEBUG_printf("file_io_keyword -> GET.\n"); } + ; + +input_instruction: + input_keyword OPENINGBRACKET l_identifiers_list CLOSINGBRACKET + { RULES_DEBUG_printf("input_instruction -> input_keyword ( l_identifiers_list ).\n"); } + | READLN + { RULES_DEBUG_printf("input_instruction -> READLN.\n"); } + ; + +input_keyword: + READ + { RULES_DEBUG_printf("input_keyword -> READ.\n"); } + | READLN + { RULES_DEBUG_printf("input_keyword -> READLN.\n"); } + ; + +output_instruction: + output_keyword OPENINGBRACKET l_formated_identifiers_list CLOSINGBRACKET + { RULES_DEBUG_printf("output_instructions -> output_keyword ( l_formated_identifiers_list ).\n"); } + | WRITELN + { RULES_DEBUG_printf("output_instructions -> WRITELN.\n"); } + ; + +output_keyword: + WRITE + { RULES_DEBUG_printf("output_keyword -> WRITE.\n"); } + | WRITELN + { RULES_DEBUG_printf("output_keyword -> WRITELN.\n"); } + ; + +l_formated_identifiers_list: + expression opt_modifiers + { RULES_DEBUG_printf("l_formatted_identifiers_list -> expression opt_modifiers.\n"); } + | l_formated_identifiers_list LIST_SEPARATOR expression opt_modifiers + { RULES_DEBUG_printf("l_formatted_identifiers_list -> l_formated_identifiers_list LIST_SEPARATOR expression opt_modifiers.\n"); } + ; + +opt_modifiers: VARSEPARATOR NumberConst opt_modifiers2 + { RULES_DEBUG_printf(" opt_modifiers -> VARSEPARATOR NumberConst opt_modifiers2.\n");} + | + { RULES_DEBUG_printf(" opt_modifiers -> .\n");} + ; +opt_modifiers2: VARSEPARATOR NumberConst + { RULES_DEBUG_printf(" opt_modifiers2 -> VARSEPARATOR NumberConst.\n");} + | + { RULES_DEBUG_printf(" opt_modifiers2 -> .\n");} + ; + +signal_instruction: + RAISE IDENTIFIER actual_parameters + { RULES_DEBUG_printf("signal_instruction -> RAISE IDENTIFIER actual_parameters.\n"); } + ; + +array_instruction: + ARRAY variable DIM OPENINGBRACKET expression VARSEPARATOR expression CLOSINGBRACKET + { RULES_DEBUG_printf("array_instruction -> ARRAY variable DIM OPENINGBRACKET expression VARSEPARATOR expression CLOSINGBRACKET.\n"); } + ; + +exit_instruction: + exit_list opt_repeat + { RULES_DEBUG_printf("exit_instruction -> opt_exit_list opt_repeat.\n");} + | REPEAT + { RULES_DEBUG_printf("exit_instruction -> REPEAT.\n");} + ; +exit_list: exit_list EXIT + { RULES_DEBUG_printf("opt_exit_list -> opt_exit_list EXIT.\n");} + | EXIT + { RULES_DEBUG_printf("opt_exit_list -> EXIT .\n");} + ; + +opt_repeat: REPEAT + { RULES_DEBUG_printf("opt_repeat -> REPEAT.\n");} + | + { RULES_DEBUG_printf("opt_repeat -> .\n");} + ; + +loop_instruction: + WHILE expression loop_body + { + RULES_DEBUG_printf("loop_header -> WHILE expression loop_body.\n"); + SEMANTIC(( $$ = new While( $2, $3 ) )); + } + | FOR variable AFFECTATION expression DOWNTO expression loop_body + { + RULES_DEBUG_printf("loop_header -> FOR variable AFFECTATION expression DOWNTO expression loop_body.\n"); + SEMANTIC(( $$ = new For( $2, + $4, $6, + new IntegerConstant( -1 ), + $7 ) )); + } + | FOR variable AFFECTATION expression TO expression loop_body + { + RULES_DEBUG_printf("loop_header -> FOR variable AFFECTATION expression TO expression loop_body.\n"); + SEMANTIC(( $$ = new For( $2, + $4, $6, + new IntegerConstant( 1 ), + $7 ) )); + } + | FOR variable AFFECTATION expression TO expression STEP expression loop_body + { + RULES_DEBUG_printf("loop_header -> FOR variable AFFECTATION expression TO expression STEP expression loop_body.\n"); + SEMANTIC(( $$ = new For( $2, + $4, $6, + $8, + $9 ) )); + } + ; + +loop_body: + DO opt_instructions OD + { + RULES_DEBUG_printf("loop_body -> DO opt_instructions OD.\n"); + SEMANTIC(( $$ = $2 )); + } + | DO opt_instructions error + { + RULES_ERROR_printf("error OD expected.\n"); + SEMANTIC(( $$ = NULL )); + } + ; + +condition_instruction: + IF short_or_and_list THEN opt_instructions opt_else FI + { + RULES_DEBUG_printf("condition_instruction -> IF short_or_and_list THEN opt_instructions opt_else FI.\n"); + SEMANTIC(( $$ = new ConditionIf( $2, $4, $5 ) )); + } + | IF short_or_and_list error + { RULES_ERROR_printf("error : THEN expected.\n"); } + | IF short_or_and_list THEN opt_instructions opt_else error + { RULES_ERROR_printf("error : FI or ELSE expected.\n"); } + ; + +short_or_and_list: expression + { + RULES_DEBUG_printf("short_or_and_list -> expression.\n"); + SEMANTIC(( $$ = $1 )); + } +// The two next rules are wrong because ORIF and ANDIF are supposed to have +// the same priority. This has to be fixed. + | short_or_and_list ORIF expression + { + RULES_DEBUG_printf("short_or_and_list -> short_or_and_list ORIF expression.\n"); + SEMANTIC(( $$ = new BoolOperator( $1, $3, Or ) )); + } + | short_or_and_list ANDIF expression + { + RULES_DEBUG_printf("short_or_and_list -> short_or_and_list ANDIF expression.\n"); + SEMANTIC(( $$ = new BoolOperator( $1, $3, And ) )); + } + ; + +opt_else: ELSE opt_instructions + { + RULES_DEBUG_printf("opt_else -> ELSE opt_instructions. \n"); + SEMANTIC(( $$ = $2 )); + } + | + { + RULES_DEBUG_printf("opt_else -> . \n"); + SEMANTIC(( $$ = NULL )); + } + ; + +case_instruction: + CASE expression case_when_list opt_case_otherwise ESAC + { RULES_DEBUG_printf("case_instruction -> CASE expression case_when_list opt_case_otherwise ESAC.\n"); } + ; + +opt_case_otherwise: + OTHERWISE opt_instructions + { RULES_DEBUG_printf("opt_case_otherwise -> OTHERWISE opt_instructions.\n"); } + | + { RULES_DEBUG_printf("opt_case_otherwise -> .\n"); } + ; + +case_when_list: + one_when_case + { RULES_DEBUG_printf("case_when_list -> one_when_case.\n"); } + | case_when_list one_when_case + { RULES_DEBUG_printf("case_when_list -> case_when_list one_when_case.\n"); } + ; + +one_when_case: WHEN expression VARSEPARATOR opt_instructions + { RULES_DEBUG_printf("one_when_case -> WHEN expression VARSEPARATOR opt_instructions.\n"); } + ; + +object_instruction: + WIND + { RULES_DEBUG_printf("object_instruction -> WIND.\n"); } + | INNER + { RULES_DEBUG_printf("object_instruction -> INNER.\n"); } + | KILL expression_in_bracket + { RULES_DEBUG_printf("object_instruction -> KILL expression_in_bracket.\n"); } + | generator + { RULES_DEBUG_printf("object_instruction -> generator.\n"); } + ; + +block_instruction: + PREF IDENTIFIER actual_parameters BLOCK opt_block_taken module_body endsentence + { RULES_DEBUG_printf("block_instruction -> PREF IDENTIFIER actual_parameters BLOCK opt_block_taken module_body endsentence.\n"); } + ; + +opt_block_taken: + TAKEN identifier_list endsentence + { RULES_DEBUG_printf("opt_block_taken -> TAKEN identifier_list endsentence.\n"); } + | + { RULES_DEBUG_printf("opt_block_taken -> .\n"); } + ; +expression_in_bracket: + OPENINGBRACKET expression CLOSINGBRACKET + { + RULES_DEBUG_printf("expression_in_bracket -> OPENINGBRACKET expression CLOSINGBRACKET.\n"); + SEMANTIC(( $$ = $2 )); + } + | OPENINGBRACKET expression error + { RULES_ERROR_printf("error : unbalanced bracket. \n"); } + ; + +endprogram: ENDSENTENCE + { RULES_DEBUG_printf("endprogram -> ENDSENTENCE.\n"); } + | POINT + { RULES_DEBUG_printf("endprogram -> POINT.\n"); } + | error + { RULES_ERROR_printf("error : ';' or '.' expected.\n"); } + ; +%% +void initialize( void ) +{ + BeginningOfLine = 1; +} + +main() +{ + yyparse(); +} + +int yyerror( void ) +{ + printf("Syntax error at line %d.\n",line_number); + return 0; +} + +int yyerror( char *s ) +{ + printf("%s",s); + return 0; +} diff --git a/loglan96/loglan93/test.log b/loglan96/loglan93/test.log new file mode 100644 index 0000000..fee393b --- /dev/null +++ b/loglan96/loglan93/test.log @@ -0,0 +1,44 @@ +PROGRAM TEST; + +(* This is only a test program *) + +UNIT VIRTUAL A: SHARED C, SHARED D : K : Z ,E CLASS; + + UNIT K: D PROCEDURE(INPUT H : CHAR; INOUT P : PROC ) ; + END K; + + UNIT L : D FUNCTION( A,B: INTEGER; OUTPUT P : RESULTAT ):INTEGER; + END L; + + UNIT WEEK : ENUM(Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday); + END WEEK; + +END; + +CONST A=A QUA B . D + C / A * ( B AND (K+C = KAN)) OR (123 + 234.34 + 256E-5 < 1); +VAR H,K,L,LIOP : INET, + A,C,E : INTEGER, + BRK,RCS : OBJ; + +SIGNAL SIG(A:K; FUNCTION B : RESULTAT;); + +HANDLERS + WHEN I : A := B; + WHEN N : K QUA C QUA G. C := F; + OTHERWISE : Q := COPY(A); +END HANDLERS; +BEGIN + A := R QUA C .A QUA B .D; + A := "ABCD"; + STOP; + WHILE A + DO + IF B <> 6 THEN + IF K =/= 5 THEN + ARRAY A DIM (1:6); + ELSE + A := NEW ARRAY(1,6); + FI + FI + OD +END; diff --git a/loglan96/loglan93/test1.log b/loglan96/loglan93/test1.log new file mode 100644 index 0000000..1791e1a --- /dev/null +++ b/loglan96/loglan93/test1.log @@ -0,0 +1,7 @@ +PROGRAM A; + UNIT B:PROCEDURE; + END B; + +CONST I = A QUA; +BEGIN +END A; diff --git a/loglan96/loglan93/test2.log b/loglan96/loglan93/test2.log new file mode 100644 index 0000000..4cb1adb --- /dev/null +++ b/loglan96/loglan93/test2.log @@ -0,0 +1,7 @@ +PROGRAM ID; +BEGIN +FOR I := 1 TO 2 +DO +A := A + 1; +OD +END A; diff --git a/loglan96/loglan93/test3.log b/loglan96/loglan93/test3.log new file mode 100644 index 0000000..8d2cf9f --- /dev/null +++ b/loglan96/loglan93/test3.log @@ -0,0 +1,4 @@ +PROGRAM Test3; +BEGIN + A := A AND 1 + 4 = 5; +END; diff --git a/loglan96/loglan93/test4.log b/loglan96/loglan93/test4.log new file mode 100644 index 0000000..beb220e --- /dev/null +++ b/loglan96/loglan93/test4.log @@ -0,0 +1,5 @@ +program test4; + +Begin + Read(A); +eND; diff --git a/loglan96/loglan93/tstexpr.cc b/loglan96/loglan93/tstexpr.cc new file mode 100644 index 0000000..3b0b056 --- /dev/null +++ b/loglan96/loglan93/tstexpr.cc @@ -0,0 +1,25 @@ +#include +#include +#include "Objects.h" +#include "Expr.h" + +Location ThisPlace(1,2,4,5); + +main() +{ + +// Test : building the expression 'A := B + ( 1 * 4 );' + + Expression *TheExpr; + + TheExpr = new Affectation( new Identifier( new String("A")), + new ArithOperator( new Identifier( new String("B")), + new ArithOperator( new IntegerConstant(1), new IntegerConstant(4), IntegerExpr, Multiply ), + IntegerExpr, Plus ), + Instruction ); + + cout << "The Expr is : \n"; + TheExpr->Print( cout ); + cout << '\n'; + +} diff --git a/loglan96/loglan93/tstobj.cc b/loglan96/loglan93/tstobj.cc new file mode 100644 index 0000000..5dfc6cf --- /dev/null +++ b/loglan96/loglan93/tstobj.cc @@ -0,0 +1,27 @@ +/********************************** + * test of the location class * + **********************************/ + +#include +#include "Objects.h" + +Location a,*b,c(4,4,6,8); + +main() +{ + cout << "Location of a " << a << ".\n" << "Location of c " << c << ".\n"; + b = new Location ( 5,5 ); + cout << "After creation, Location of b is " << *b << ".\n"; + b->SetEnd(9,2); + cout << "After modification, Location of b is " << *b << ".\n"; + a.Move(15,3); + a.Tab( 40 ); + cout << "After modification of A , and tabbing, Location of a is " << a << ".\n"; + a.Cr(); + cout << "Then Location of a is after Cr :"<< a << ".\n"; + a.Select( 15 ); + cout << "Location of a after Select(15) is " << a << ".\n"; + a.Select( 2 ); + cout << "Location of a after Select(15) is " << a << ".\n"; + cout << "After all of this the location of a + c is " << (a + c) << ".\n"; +} diff --git a/loglan96/loglan93/tstsymbt.cc b/loglan96/loglan93/tstsymbt.cc new file mode 100644 index 0000000..c50dc79 --- /dev/null +++ b/loglan96/loglan93/tstsymbt.cc @@ -0,0 +1,76 @@ +#include +#include +#include "SymTable.h" + +symboltable *table = new symboltable; + +main() +{ + + node* temp1; + entry* temp; + entry* temp0; + node* temp2; + struct find_result* temp3; + String t = "t", a = "a", + x = "x", y = "y", + u = "u", v = "v", + z = "z", b = "b", + o = "o"; + +//temp=table->insert(t,VARIABLE_S,new v_variable); +temp0=table->insert(a,CLASS_S,new c_class); +temp3=table->find(a); +cout << "test 1 " << temp3->found->id << '\n'; + +temp1=table->last->open_unit(); +table->last->add_spec(CLOSE,x); +table->last->add_spec(CLOSE,y); +table->last->add_spec(HIDDEN,t); +table->last->add_spec(HIDDEN,u); +table->last->add_spec(CLOSE,t); +table->last->add_virt(temp0); + +temp=table->insert(x,VARIABLE_S,new v_variable); +temp=table->insert(t,VARIABLE_S,new v_variable); +temp=table->insert(u,VARIABLE_S,new v_variable); +temp=table->insert(z,VARIABLE_S,new v_variable); +temp=table->insert(y,VARIABLE_S,new v_variable); + + +temp3=table->find_in_module(temp1,y,NOT_DOT); +cout << "test " << temp3->found->id << '\n'; +temp3=temp1->local_find(x,ALL); +cout << "test " << temp3->found->id << '\n'; +temp3=table->find(u); +cout << "test " << temp3->found->id << '\n'; +table->last->close_unit(); + +temp3=table->find(a); +cout << "test " << temp3->found->id << '\n'; + +temp0=table->insert(b,CLASS_S,new c_class); +temp1=table->last->open_unit(); + +temp3=table->find(a); +cout << "test 2 " << temp3->found->id << 'n'; + +temp0=table->inherit(a); + +temp3=table->find(o); +if (temp3->found == NULL) cout << "o nie jest widoczy \n"; + +temp3=table->find_in_module(temp1,t,NOT_DOT); +if (temp3->found == NULL) cout << "t nie jest widoczy z zewnatrz\n"; + +temp3=table->find_in_module(temp1,t,TRUE); +if (temp3->found == NULL) cout << "t nie jest widoczy przez kropke\n"; + +temp3=table->find_in_module(temp1,x,TRUE); +if (temp3->found == NULL) cout << "x nie jest widoczy \n"; + +temp3=table->find(a); +cout << "test " << temp3->found->id << '\n'; + + +} diff --git a/loglan96/loglan94/neweditr.log b/loglan96/loglan94/neweditr.log new file mode 100644 index 0000000000000000000000000000000000000000..9cc1b221965db5654cb5b3438a786cb788b18ea7 GIT binary patch literal 4318 zcmeHKYiv|S6rSDfvfafJo|S~x*bphCZGupLtRYyXAPJI&mO%A~O!v<2-uCXjH}}!) zk{C)6B&k0%F}@8L<2wTS&mS65V~mN9AZiR~#26&R#AqTIHPr9Sy?1v@0fqR>I5*$S zoS8Fo&zyVaoO4e+*Um<6O*b;Ol(n;38I3WPOEUJ&%-UGgduCeHyF!~`Y>+WkKYbnX zUAmsZUcu~a_9p5>Y^aGiFRnAp$9N_j--UiFdqHttT^(mHsa3W52KFIFzGW}Zp!ZU} zm@UDHSF>K!BY>New69-cxQO#I_HLw_-YcIBA6&z9Gy`JOeJl~O8x2AiRb4ydE zbp`i|k_)}Wt-R_+%(}}xix2p^p>e@IM@r%lJepszyeY%EZ|WX5!?7&S8Nzk3Ef31D zaQHfjK}UGHWx82zYIS5=l`-VsXu3+okXNrGr|@nTC7I>IaYO}j<%+_&B#YJ)9DZ$< z-)32c6lN$My?a0wbh9c%P8bI7a)(-5_&SSMET0$jVd#dNcoiuFLr!%5wcM-NlDD*R z5@dPp%v{fN-qF!f-Ilakdx<(JEr|r<*)`CvFKhhLaOos4`EId!-immk@vHs{hoUdOV%u7?Nnh7>khb8OSY?UkF7lLtwb`&uL z)`c&UC9UVA2GebY5y41wv(U!9$=|;w39K5cxLdT!uwvM^Cr3Q)aseqEDKrdXHQ7Cx z57{-@kH~q_an}gbElY<7_C3i)=n&XfiB~fnvpZ5-_ptQbJB29Iey@xc3C>O$X1+t`lG>8>;? z*_vU|i5=G#~!%MQX?W~m2BOBR{HMP+N)%f%7gF{)aOXs z5IM=yVX=kdf)ypa|B;^`gs*=c_yPC{_!St0_kIdE40KLs>}Eg*o(GNq9|8BmZ|?@i zfIYx{z+PY;d=W1PXb>7zW@s`y#W{m9s(W( z4g#lv^FT7e*fO9K=m!eG!@yDC6cB4bGzaDatAI{m2zUc{4>$%K2TlOzfj@ycu(kQX z27q!70~nC~C70)+XSSrS*!9o^JAn{ob=D<$UjTooZOINZv7if z*t~0QDH=nW1q-6dBu(u|H}6Q(stKf#F;??+eHqiux91_k~BS) zxp3QeY|E7{atwGmw^ACg4DN{mL-Ka6o604c6lCn8fV;+qnjDsfWz!Z!^1xxX2cA^G z)z@Stzg!j-SMh1OFswqBr{Q+ugBt)aosa9P^Y&in` zASwq*QrU8b!i)*=CvBNHpl)hb8AOS~Q$V>Ok(t^>J;y2LkpfGWhU_OzQIWO_z7OV9 z0_yNyrFv3)9aA3JtyJp6YTpRDVKUK_S+QINCcfT6z}sp|iiGDT~E4L6) znfL@OiY#pb&<~V=?}7Cgd=U5=m|4q4lg($2loRjnImWj146?*%jLpJ_Bfw{kvQg?$=|ZfC_bHjTfjj^l z2TlUt0dq0440shd1e^jE!wOn~ZlD6}1nvj+0~GQe0}ca6fX{(1fZqXn6s1Pb9XMM)I3lt@ua$&{K$AS0R*DxxW=BAOB_qA9temJ%!)rzDG7O0;O4k}aYs z*&;fo+GL6nFQR9JG$mm~FA8Z&$cSDY(v+OhKK)@!i5ksQB8QUtQk{pTgp#`jCXq<& z$Hb>NeNoN*xch8!(b(DGTx=rXSBryc9F4N(;D?d^X(PV~_qNF@7{cW9SGq7{;V1`8 rKS9+rHef)W8~)aYzM_q|VcToj%q~-NcFIBCD~z(98`7r?RE7Bqa@IQN literal 0 HcmV?d00001 diff --git a/loglan96/loglan94/newgramr.doc b/loglan96/loglan94/newgramr.doc new file mode 100644 index 0000000000000000000000000000000000000000..5a8601948ff260526d9a70410a7f9bcd81985172 GIT binary patch literal 39647 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 T{ifvF+Q^p1(B?)VBT)X|I7FWw literal 0 HcmV?d00001 diff --git a/loglan96/loglan95/examples.doc b/loglan96/loglan95/examples.doc new file mode 100644 index 0000000000000000000000000000000000000000..b62cf1ff55447c8234b83bd9a29df352dc931f09 GIT binary patch literal 16386 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 literal 0 HcmV?d00001 diff --git a/loglan96/loglan95/filesys.doc b/loglan96/loglan95/filesys.doc new file mode 100644 index 0000000000000000000000000000000000000000..a81501b39eeecb23158b99fea5cd9abe64765500 GIT binary patch literal 2428 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�>~ew`W@6@j34F=NUnV``uU`!;B0 zY_Y5w7{IRgwwD`ttTx=ZV{9x+jE+HP61mJW=&(7rV{dM^7b$xx=}3}rEN^GPY{v-R zjv2fiLwGx5ZM!{Nno@I@g2u$d#`m!{XNrv@uuO$O^t`(5Ecc{FNk3!jc9c={dxA`7E1IySavRCd9hEFqv4lzS>R)=1 zUVb-QQ#7Kg7$G>&!p@v`5VsD>1QqXniQ~YvBauee@lI{Ykn72IQXjr_C66$mnTiGzcpcHjMJ#Lr7v=LhNMt*iTy$4qt3c` zPu&Kcw|bI$b`m7)!SNP*P=%nds-g&~4)qP~DpxG|Bb^_IL^@76i_JhPuMT~P6wALf zHOIfizG`Hrxm>QM)HSvD3KefYxl~YDwWe*w$`$MF0Fy_;iD#K@2E132mN@rhVy0&# zF~P95MUSz6p=L&JL8eERk~-Upa_TO~Jk4A#{O*@+PE|#T-C)1sM+4@quS%0$>lWy4 zK_mhm(v-?$R><;~nVH3j+B0}<#g0>hA+d>MSzUDWFfi!qY`d;CS$+2tB;03WmcC@l zhb&#iqwK=%zEGAzyFg{c zNmA%(m0qgsCf5#z?Xu8etM#WX6{4l2mYuU?y~}}(yuta@q#%-esf&x<(6)Znnw63o zE~R(WNuC};DvyB*yi+bpMn^4sUi!lkLL{s9;GtHPRS04@qra0;p>cuDgQHcA?P;Pn zD=37?9QP__7-`<{%1SjyLH$RASEYqI5tGvzO5E(Jvpp| z2Xy%|G4Ug1BUPwSKT1b7WKxF={1|8Z!5uF^4GK9}x}h?uw5l@9=|gAzVifCI3ai($ zZPbm1J<++YFK0erFjXmYH5=4S_8FA9HIhk{bXZ08lm@!VCONcxi1aaLqHrWH>cjcg zPt>`?4lEX{SDipqSNbchgT(O{axcy;H6wXUGcnOP$vL&=eC70P&1|l*2|B`h23^Iu z4sB>^*3gX7!04EV_96?b>N6blXNo{djMasph0@=NLnE#tx=H3jqjMa>7%eplaT0)s z!Va)gh9|8TYF(Q-%1M>pVdT@5A(cp zc`5_2rZwuMlPGGNGX2ADC1Z_n$%dWn54`vx%cQ6SG(LTS0T|kU>9np`7#;;DCC}-0 zZ#dRUq1n^RhPk40mc5H3MA~caWKxnt%5^o&b(QB6Bx-erth})}^sJE%;Yw}P5}i|O z9gNx?+4>1mQvG!8WfqBZ>w*ON5s8dKZQ#5Qevc71lT3Wcd{GL=9@*)Z6Jp`vsVG`3 zOy@GijH-@yREN#&x~`HJ5gBipAAr8LepvGACreTfjm%ZyVwu5@E2dC%=TfjOF$#-? z&VJd_^8L@iU=PNvXmnu7VNls6U~feZoQU;UqC;3&N9!Z!bH~TaG19RCdri(m;6$Q; zZ%@=k+f>zirD==DhPy|)b{DhOm1n6B#fyH#tHwN+<1ZwM~|L3OeAw- zvX(Ma0-@xltQ*E@rH;|Wm2MOX)I%NeA+H*X5Ld6bo~}NX=7Ey0oGX0=lQW&;85(z0 z(rpUUQe6^p&2hhCI`gwesK#RD>LMgF`Y#Sv#V6B=bQd;s@|Y$iC%azrI?>tQa+Nz2 z8Oq6Elk6H)cF*=vpTsVOm{(bnrqkPS`Cd2LxKBLIv{ z@gbuSqCHrKQBds3^vS}R!OlN-yoJT1R0~^RjT~x~ksXQ_qN}IDRz#DP2y=ps${hTg zc{x(c(z$i;%xE7aVof6bi5O4pm$(C~;Zfk$!Bb(4$l8gKPa_eR8U+bjj!&UktAZ7c z%u0g^b5rCx(SHd-u7Hq`kd53UVW3hE*V4&AXvQn!WJI_EPK4E7d~SD5XBG`j{V
    8gbKcp|?L*&i3WD)riV;>UK+%L3yJqiQ!0UH%y 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 literal 0 HcmV?d00001 diff --git a/loglan96/loglan95/libmangr.doc b/loglan96/loglan95/libmangr.doc new file mode 100644 index 0000000000000000000000000000000000000000..8e5acbad08cea1c4e26b6a68ef1734df84ca11e4 GIT binary patch literal 4083 zcmeHK%WqUw82@I5DV>1<1zJD}9+1Goc0wx)C^0aVnp7zyv_wdZ;mq7KGpD_e@jj*u zkpwlkP&S4IJ6{R>0j_Z6V_}TO$3{0K%EmwKZHRTubg?v-_f%aUnySRI#kY7JDIW-}kJ1DkWVhYcY zXyMtuVPvm3;x(01R{oF}*|%@c0M9*Io>i4lH&sx`&(xK$6ZKB4UX*?9)&e12q1>kS zJ=algDCXoO3Q7nN-#g3ymDVdN{} zRfUTkDJ$6l?-hO8tz)r})tQ|Y1(@~~%m*oe`fTX3XW`$5_r(r9$hpBWtE3#Fa9iNnO*q`vb81Y0eGt@T76fv{z_SkM40O$v z9IHh!*^N9y83tLdECaBKNlDNe#*k;dVH1`p1z{v@Ncu5Hh5VC<9X61)Ot8yrlWgpq zd3YBpr%KOEbchAForfokPt25-RG6wSYwYPj1TAEgvyJ(lKqABS-G+c}-=X&#~jS8YH4*|BSli(7bu|y$%+*CJ?c(@M6p%cm0i*l}WfyvFli+toX zsN+a88N^mJr1r;*Jxi0Qs*$%v?u*MDL=O*FJfu`S!p-|p5?2M7=_}hq!kYTPDxpk; z6=X;ue~9buUDPkB#=Z}hqsN$4LY%-WOnXw};U4rfH5gt}?99QVq>lnv<^`B?9B!eB zM);yr)=*hn4VY*5&M|l`$6n|1-ibL^I-qXXiCqUUSi?!XjOU;g0-*D@*=`FFgl+IC zCw84YIgAh1!GC?Pzg)cVN$KA>|M_>`8^AljyTDc8ec&_TbD-8obQ<8_f){{4=r{BC zEB$i+KYIS3`HwNMhSI#&hIqjhluD=3vyx~9dUnvNj{h&h*Bk?10AB&ufcG*)Ujq9f z`zi1va0AF^iBTm@Dm-URRj@I3Gm@Cv}O`1{S9Hy0OvSiF91vHPI;?c&1XLejNxec^gM7H|GP z{|5D`h7j-!TA7A;IBuo8tz6Q&#d72EC|WEBx0qJ8+rE-QdpJ$2iQ1H%X@!y9ew0?G zaHUDpmNsr#Pf><88P;eWB%MgZ5-wIp` zW4SDCPWqsNIH&l$ItHUhBufG7uBB-nY literal 0 HcmV?d00001 diff --git a/loglan96/loglan95/library.doc b/loglan96/loglan95/library.doc new file mode 100644 index 0000000000000000000000000000000000000000..c5a53694102a8386f21599b9739752814634ccd9 GIT binary patch literal 4027 zcmeH~du&rx9LIm{o*iyH_7GRp!&KZ77%VVkCF;r;P_uTktvt+(bnP9xTYJ0QwtIk@ z1roua#Hfj&{-Gu$5JePY)QAZXv-nCRB#1_`7{xybh6QvYOq}1}xwnt3!w_TCKRoT{ z+;e}g^ZVU*wH;eX0Q56zywE1EXt*WeU zneasWlt_o7&lhzK4NJ<|HP)*H)lM}Sh;x8wr-;P^S}350L_$;JF_vUZR9wW;q{Jaa zFdT@*mKPTZA^HNkaA|R$x>=boyh>d6ao9{fg0WOdqjDNp%cf`{Hj%U2 zYHMo|NX~{LuYb0Hwn@RPI1~dM-o`-@K$gv8F2}4-24AIyl~}qyBa@V7vVzq(cA05Q z+i0(%WeJ1fXiP~-d2*i2oLo*MeOIU&mIkXF(jaxLja*WOsYong&y;{er=w&|uu|2P zVEoz>u)9bbW%>J+0nbzCM$!%egh-al3y$|?sXiqV=e2`jv2auCbOmMAAAlLUW&@#Z&%5w6~*35s4;ZikK&Q zl);WDU&e|wOBN@lj&H=ujPCUKT$wACvtXHNBZ`YyV%{1c%-^}S_Q_!6;wuCo0c;N#xt$b9r1stn<1i>5J_{C!lYAz_ZfZ+|<0jd6M34 zulbBs%hW9-3O+8UCNV;g%x6YeY@XmL^Uh+dpEb{W8Bb z&8RIq{{j0K`-n1b%m2##pP%zjfZbpZI0)VZN5L^L3@(CSz!i{d#giD!0A*k)SPqpC3t5k1vi7aU>Ud@ctHs0pbu;X+rcwn4|o;q2k(Q!;45$% zd<({aB@Z{Ai|cGA zCYo}a2bpPUeCOauZ)eJ{eEn0WJLZkNDf(&+GVM!VX^sR zy>WE^`5xt4dWFDQLNORsSn^V1dva{;6~@@Gwx=wXT4CL2rD;SHl;_&Z{mAQF6!fbK3Dnp_M25fel?=Rgh%NY z-e@GCk*&h&8;o>B!&EqroVpqaQ_(EKYhe#-XCvT3-~>EjsVJK$$2bR3Z^V`XH@ge)im6hHb2T*l9bcM@&wdKN<0eF`w!3t1G%G9MJA; ts22+&s-{K~kvUo4YWy7(Ha-LKTy<(8eY4Une1UMk8thTC1acnk{s3enB2EAR literal 0 HcmV?d00001 diff --git a/loglan96/loglan95/liste.doc b/loglan96/loglan95/liste.doc new file mode 100644 index 0000000000000000000000000000000000000000..8d7409a9459e9167a7d5828a21289f36e985bc84 GIT binary patch literal 1848 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

    HaMxI%K~UWVs>O3ZtdK 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 literal 0 HcmV?d00001 diff --git a/loglan96/loglan95/planwork.doc b/loglan96/loglan95/planwork.doc new file mode 100644 index 0000000000000000000000000000000000000000..42f6b4664c66ea9d20eba6c9339ae34af7637a13 GIT binary patch literal 28417 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 literal 0 HcmV?d00001 diff --git a/loglan96/loglan95/propo1.doc b/loglan96/loglan95/propo1.doc new file mode 100644 index 0000000000000000000000000000000000000000..1c4fd38934f70f8eff9faccab410f74265ecca12 GIT binary patch literal 4419 zcmeHKU2I%O6&`Qw{A_BI#Bmj5gbv0jiLf_p>{1*M$~txM3OfyJhY*pM@x8OV6W^cJ zox9lEhbTf&36Yk*@PZH$4=qJd#6zL2`Xf~FLWD$kC_;dUfM6kmP=o{z2_k%F=H6X9 zDF`71FYM}@ojZ5#IcL7}&6&MFe`ZpwpWL%s;4{fh_PNq0#2ZB+PVLV}dcU)Kdi{Uc z+b6`h5Vjphi>tS6hs1G=lc?FdZ`~HfMcgfBbL!|%i!Y%a6R+B*{?)c1UbplAS^G}$ z3u}KL);(qWdE{=Td{<=SLhKZ~L?6EY{-;t}lEIqxR`p9k4dTAbO3V{;;V29K4$O=(QNN;xbU`Fv$`Ba#6dXsIOVkTev^s6(a` zrP52aM=D9;1WqvDr10sHQJAvj)?OP_-oOHQFnT3W6FuL@t#9}MIU(FB=A)hJs6j`- zSxlY`0uYfVGBSZ%TAXC8*~_D(BZ?DWC5U^w%Mb*G`f){RQ;}L%9t?x7RELT{w&kah z$gsqu9xu@{+{Ka6Y)evIh8io!L|T{(rPtJva_jYVy{-~u2-A~9nN}S69Pz?ro=sy- zPL;B}F^}vBp*B^bQ)nTH?Q(t2BG%^x(wJ>o3273PBXTqvEKt22fq29>(OqQ&b6~gC z)ShuBDA22ls?~GnKT@llo$pNzS8^KCK(=M3HI6Ydn2XA}Kn8Fd|P`jdU-VPvp6-*Rkvn^JatCTP3zLjT9hL zV6+{iOg!h!QR*@eQS(rmD4W1G^l#`$t_|fM1?^UEb4VBQZHi)Fu|m4fA;T%W8eVzQ zNs-kCMN0WBGUPu|GUbT7(dQGm{kuPJ;EHU1Md4HpTW+Ayy?# zhaEIA4T<7q8`YA?mV%fweS-MdZzIv!;;NBRNxIF8iy@HgQYKkeBQx5wRI?&)Xwcy34EGp|0+ciQ5T?%eImAg*tKyb{T#sFL zyW5@fZtuDZ40rW72;3fVwKdgt*TZC`z1|MAOgeUp9dX$`3fW+{7`sVH*E6Y3*wA@T z@tU|O*gDnQ30tV5YMM*cu;#gx*xj7%1SaBMOT7wbb746cEIv}AC6@@6K2~eR-kZB7 zJN8_ebmeUe<=7v-PU8gi2)Sog>b!@!=*yH+wVv{sFzNUYZE4_p6QoP3M36}8&LGF; z#P$*Q^kDJS)?$qLYi^5nOL{L*7ff~rLg@O}TT zcAT%^sO0FdpYEN(aiFf{y36F*HH_(l#SfHFNwL3SSGHIniRNKm0OKQ{1G)c=J; z15Zc&;s;-?j8;a6z9q!jTJ_BGV&%--C+4X4FYV;pFCAJKJ^8#4ON*7-@}sqn-+%x7 z=!I_zQC)mV{J-}fU|>iT*vdg?svqwnq96Tt>=Fg{Td>!McJ*!h zrEK1zf+&pS`R81}47>td132%T^9SH!2-pX_3pfY-7?3-J@PHS9?*hLEz6`Hl0d4{t zzt^iL1zXE;(dluy5l-|Ywz;K zo7b;jzjf!1qxrwwg2ujUUknLx8Y^>B+OxaJTCyKJXtyoD^N(8wd062#kL)hoy$fgJ z!|={Mm=>%kt^hl2k2&9k_w@r0ieUX*<|i_Q8w!mAo&+k+(r7h-b%+=P-C3fi>;a msqb$d_WrubhOzST-UC^0D*N46iTvbob&2xV^ZN$6kNzE_<|;G* literal 0 HcmV?d00001 diff --git a/loglan96/loglan95/pv1.doc b/loglan96/loglan95/pv1.doc new file mode 100644 index 0000000000000000000000000000000000000000..44bec841e661210e30b2111e80b3324088c4fa1a GIT binary patch literal 3372 zcmd^CU1(fI6h8TDe%2I?rBqkSsA-$p?UuwA+DNf$n$lphNjITQ5yi>9lg&-<-n-1) zn{;iFQ1LdsCwjWYuod_dT8ZvmySBHt3DKW^NLhZUgOu2p79%o{p`8+$ zv>27{tYaN<+S~XytZfL{p_m45qP?v2#ol$62ngzvjbdSDAM>*9F?3wl+(cJ5@^qIPB=DSQon zyOa_MQEOoKwXHPo3tI!n%ZHAc5)&$zRmu~ls4QpFv1Gt5C`ug&3DulJ(N%2MvT>*@ z1ws%+dn#K^LU~(Qt~5p&_C=*lI<7LTS*4jkW7}l|BArergr{bO)LNEAg*793ch^R{ zTz^*Sln9GOr8hs2NWg`~61y1=@i8U?SbVn_7#bPQjb*Z9ViNB~?OTfVNnq7l#A53? z(!E$m8jgo&DeXZq;ZIB}3lZGP(naG$u7I`s(v?i&tvy%~BJH4&t*SIc5|K*`2H^+| zfB0cw9OO>qmq;fW)2ReP=OGk`iHsGsL#;4u`5IF2rV$&(P-Y-29z=`W99birKp3S8 zoJlg^{E73*^WiRR$%c>iXZK>|STn?u-EBf`O-Y?sqRXFA+V!OkdpENI6%VRVoAe)( zTdT>?upMxwZ-SzaAfr}hq;~ue8X!G6(*u=Ntc)CNsBQgI)@cSQA84GG3&T4 za!t%?CkT*k%W}7eW$uRzavU**MQlr4R057=7pY1(p$p;>SEDc}Uc?wRBPUQl`DK~s zc$OQ&_eG;Z+vn1Rf^cx9v1%qLxu}&%)-fvF+O(|#x)7%I4I)NWSRCjOH#r~t8~P{2Lpm(;WXexl%8}; z#zEz`w;`PT;9tkH&!nIGF!TI@rWd@%7uPkta`l;-eE)d=vU!#tOzwG`Xmlu(8{3;ZxN`nb z^6*aNKuo-v+coZi={vCf z|JrJT>xtIHmN(*FM0_V%Mhw)wx@H&WyEbDdlnF_neSV~VQ+j%_^G z*@0Mrsyo-Yc8S`(L=|GHemUPfToy~PEEb3CNL|;RE%y*1c(>7NqJ7|rld83)jgT=> z1N)Cm@SXqGC`#40mip`0u@GK4hhpuR;z%~(hTgH3#+(AaWLbQdaz4IQ)Vj8Qv{abz zU254#8SO|H(hU&03?&%IF`ZhG+prkM1i7DQW=%dRU9{c|C(@d_SWc1&K t>1rDXaeGb~Tsrw%*DVT4@ztB77835QV`&(=?<>7~o`ih=5~^gAwPwHE*Y literal 0 HcmV?d00001 diff --git a/loglan96/loglan95/pv2.doc b/loglan96/loglan95/pv2.doc new file mode 100644 index 0000000000000000000000000000000000000000..096b1756abcb8587a7a026282f7b57db5002c80b GIT binary patch literal 10011 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 literal 0 HcmV?d00001 diff --git a/loglan96/loglan95/pv3.doc b/loglan96/loglan95/pv3.doc new file mode 100644 index 0000000000000000000000000000000000000000..dd0f5fab9d592f15974ec92c183e52c1b9b1fc1a GIT binary patch literal 2349 zcmeHI&1+LZ5T7KiCXoaUrB>_5NQ?GRANEV_L1?6{Af;9-ejK;S+CF_BWs|hlQxQB! zwH6f-L9B}4U*N%SJbLmVA}E50Md(36gJ2K(+xL=MYpEy{4?4?lc4u~G-tNx4-4{1D z($SVkm_QpfE6{L&=z0*kNKx~>ufp6f2@$J_JYMZZpPR?298Ov|w`p z;~EA2@LA74Y`uxX^H;0L`i_ThQ?JJz#Q&=UnIL;=dRmTU=DGUu4C z!;ReO4oJI4Nv>;dZj42l+l=ip<>pkjmUkN5A(S#@u9n*k?h;v%OV@JJ;BH|JnyDiu z$D+FJQfWj;=lC!jm&BrVa5Q_AP(!h3lKYk0?`DL>gCfJWzzTYXX2doMLHtnl1}Cw+ z0aFgLdx*1rl6#e~ZJ}UR3}Enn$)Z~0}M& zZYjNJJN#&d|2dzxb+#78#K=kG)T89--KC>W$(f4MF{gy+32L*?JNWUD$rBnn2SK#i zbP$TNJu;KCrCv)znr$hwrqi3~aCPEs#WOmuT1y6m_50o zps%2KG5=4I?_v!U^S=T)t^`&CYk_q@u_i__9s_39#zn}N0bL_k0bM6w^7#*w6R$Pp z(dA#i%tP~GArIr9h>f%c9#?Ne)^vh>@^!Ya3qGz+_#@a&z`&o?x>C=#D^RmCyqxfY z(K3n?wZq0Qph!5XE65|5ztRK!=9hUHElSbg*RKc!QP+^Z4}#uEXFY@$I#Eu0OBk%Y(z(eS P+NN}RrCRc7!EXF-b8|DC literal 0 HcmV?d00001 diff --git a/sources/f2c/cds.c b/sources/f2c/cds.c new file mode 100644 index 0000000..3902dde --- /dev/null +++ b/sources/f2c/cds.c @@ -0,0 +1,180 @@ +/**************************************************************** +Copyright 1990 by AT&T Bell Laboratories and Bellcore. + +Permission to use, copy, modify, and distribute this software +and its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the names of AT&T Bell Laboratories or +Bellcore or any of their entities not be used in advertising or +publicity pertaining to distribution of the software without +specific, written prior permission. + +AT&T and Bellcore disclaim all warranties with regard to this +software, including all implied warranties of merchantability +and fitness. In no event shall AT&T or Bellcore be liable for +any special, indirect or consequential damages or any damages +whatsoever resulting from loss of use, data or profits, whether +in an action of contract, negligence or other tortious action, +arising out of or in connection with the use or performance of +this software. +****************************************************************/ + +/* Put strings representing decimal floating-point numbers + * into canonical form: always have a decimal point or + * exponent field; if using an exponent field, have the + * number before it start with a digit and decimal point + * (if the number has more than one digit); only have an + * exponent field if it saves space. + * + * Arrange that the return value, rv, satisfies rv[0] == '-' || rv[-1] == '-' . + */ + +#include + + extern char *Alloc(), *mem(), *strcpy(); + + char * +cds(s, z0) + char *s, *z0; +{ + int ea, esign, et, i, k, nd = 0, sign = 0, tz; + char c, *z; + char ebuf[24]; + long ex = 0; + static char etype[256], *db; + static int dblen = 64; + + if (!db) { + etype['E'] = 1; + etype['e'] = 1; + etype['D'] = 1; + etype['d'] = 1; + etype['+'] = 2; + etype['-'] = 3; + db = Alloc(dblen); + } + + while((c = *s++) == '0'); + if (c == '-') + { sign = 1; c = *s++; } + else if (c == '+') + c = *s++; + k = strlen(s) + 2; + if (k >= dblen) { + do dblen <<= 1; + while(k >= dblen); + free(db); + db = Alloc(dblen); + } + if (etype[(unsigned char)c] >= 2) + while(c == '0') c = *s++; + tz = 0; + while(c >= '0' && c <= '9') { + if (c == '0') + tz++; + else { + if (nd) + for(; tz; --tz) + db[nd++] = '0'; + else + tz = 0; + db[nd++] = c; + } + c = *s++; + } + ea = -tz; + if (c == '.') { + while((c = *s++) >= '0' && c <= '9') { + if (c == '0') + tz++; + else { + if (tz) { + ea += tz; + if (nd) + for(; tz; --tz) + db[nd++] = '0'; + else + tz = 0; + } + db[nd++] = c; + ea++; + } + } + } + if (et = etype[(unsigned char)c]) { + esign = et == 3; + c = *s++; + if (et == 1) { + if(etype[(unsigned char)c] > 1) { + if (c == '-') + esign = 1; + c = *s++; + } + } + while(c >= '0' && c <= '9') { + ex = 10*ex + (c - '0'); + c = *s++; + } + if (esign) + ex = -ex; + } + /* debug */ if (c) + /* debug*/ Fatal("unexpected character in cds"); + ex -= ea; + if (!nd) { + if (!z0) + z0 = mem(4,0); + strcpy(z0, "-0."); + sign = 0; + } + else if (ex > 2 || ex + nd < -2) { + sprintf(ebuf, "%ld", ex + nd - 1); + k = strlen(ebuf) + nd + 3; + if (nd > 1) + k++; + if (!z0) + z0 = mem(k,0); + z = z0; + *z++ = '-'; + *z++ = *db; + if (nd > 1) { + *z++ = '.'; + for(k = 1; k < nd; k++) + *z++ = db[k]; + } + *z++ = 'e'; + strcpy(z, ebuf); + } + else { + k = (int)(ex + nd); + i = nd + 3; + if (k < 0) + i -= k; + else if (ex > 0) + i += ex; + if (!z0) + z0 = mem(i,0); + z = z0; + *z++ = '-'; + if (ex >= 0) { + for(k = 0; k < nd; k++) + *z++ = db[k]; + while(--ex >= 0) + *z++ = '0'; + *z++ = '.'; + } + else { + for(i = 0; i < k;) + *z++ = db[i++]; + *z++ = '.'; + while(++k <= 0) + *z++ = '0'; + while(i < nd) + *z++ = db[i++]; + } + *z = 0; + } + return sign ? z0 : z0+1; + } diff --git a/sources/f2c/data.c b/sources/f2c/data.c new file mode 100644 index 0000000..8d615b3 --- /dev/null +++ b/sources/f2c/data.c @@ -0,0 +1,401 @@ +/**************************************************************** +Copyright 1990 by AT&T Bell Laboratories and Bellcore. + +Permission to use, copy, modify, and distribute this software +and its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the names of AT&T Bell Laboratories or +Bellcore or any of their entities not be used in advertising or +publicity pertaining to distribution of the software without +specific, written prior permission. + +AT&T and Bellcore disclaim all warranties with regard to this +software, including all implied warranties of merchantability +and fitness. In no event shall AT&T or Bellcore be liable for +any special, indirect or consequential damages or any damages +whatsoever resulting from loss of use, data or profits, whether +in an action of contract, negligence or other tortious action, +arising out of or in connection with the use or performance of +this software. +****************************************************************/ + +#include "defs.h" + +/* ROUTINES CALLED DURING DATA AND PARAMETER STATEMENT PROCESSING */ + +static char datafmt[] = "%s\t%09ld\t%d" ; + +/* another initializer, called from parser */ +dataval(repp, valp) +register expptr repp, valp; +{ + int i, nrep; + ftnint elen; + register Addrp p; + Addrp nextdata(); + + if (parstate < INDATA) { + frexpr(repp); + goto ret; + } + if(repp == NULL) + nrep = 1; + else if (ISICON(repp) && repp->constblock.Const.ci >= 0) + nrep = repp->constblock.Const.ci; + else + { + err("invalid repetition count in DATA statement"); + frexpr(repp); + goto ret; + } + frexpr(repp); + + if( ! ISCONST(valp) ) + { + err("non-constant initializer"); + goto ret; + } + + if(toomanyinit) goto ret; + for(i = 0 ; i < nrep ; ++i) + { + p = nextdata(&elen); + if(p == NULL) + { + err("too many initializers"); + toomanyinit = YES; + goto ret; + } + setdata((Addrp)p, (Constp)valp, elen); + frexpr((expptr)p); + } + +ret: + frexpr(valp); +} + + +Addrp nextdata(elenp) +ftnint *elenp; +{ + register struct Impldoblock *ip; + struct Primblock *pp; + register Namep np; + register struct Rplblock *rp; + tagptr p; + expptr neltp; + register expptr q; + int skip; + ftnint off, vlen; + + while(curdtp) + { + p = (tagptr)curdtp->datap; + if(p->tag == TIMPLDO) + { + ip = &(p->impldoblock); + if(ip->implb==NULL || ip->impub==NULL || ip->varnp==NULL) + fatali("bad impldoblock 0%o", (int) ip); + if(ip->isactive) + ip->varvp->Const.ci += ip->impdiff; + else + { + q = fixtype(cpexpr(ip->implb)); + if( ! ISICON(q) ) + goto doerr; + ip->varvp = (Constp) q; + + if(ip->impstep) + { + q = fixtype(cpexpr(ip->impstep)); + if( ! ISICON(q) ) + goto doerr; + ip->impdiff = q->constblock.Const.ci; + frexpr(q); + } + else + ip->impdiff = 1; + + q = fixtype(cpexpr(ip->impub)); + if(! ISICON(q)) + goto doerr; + ip->implim = q->constblock.Const.ci; + frexpr(q); + + ip->isactive = YES; + rp = ALLOC(Rplblock); + rp->rplnextp = rpllist; + rpllist = rp; + rp->rplnp = ip->varnp; + rp->rplvp = (expptr) (ip->varvp); + rp->rpltag = TCONST; + } + + if( (ip->impdiff>0 && (ip->varvp->Const.ci <= ip->implim)) + || (ip->impdiff<0 && (ip->varvp->Const.ci >= ip->implim)) ) + { /* start new loop */ + curdtp = ip->datalist; + goto next; + } + + /* clean up loop */ + + if(rpllist) + { + rp = rpllist; + rpllist = rpllist->rplnextp; + free( (charptr) rp); + } + else + Fatal("rpllist empty"); + + frexpr((expptr)ip->varvp); + ip->isactive = NO; + curdtp = curdtp->nextp; + goto next; + } + + pp = (struct Primblock *) p; + np = pp->namep; + skip = YES; + + if(p->primblock.argsp==NULL && np->vdim!=NULL) + { /* array initialization */ + q = (expptr) mkaddr(np); + off = typesize[np->vtype] * curdtelt; + if(np->vtype == TYCHAR) + off *= np->vleng->constblock.Const.ci; + q->addrblock.memoffset = + mkexpr(OPPLUS, q->addrblock.memoffset, mkintcon(off) ); + if( (neltp = np->vdim->nelt) && ISCONST(neltp)) + { + if(++curdtelt < neltp->constblock.Const.ci) + skip = NO; + } + else + err("attempt to initialize adjustable array"); + } + else + q = mklhs( (struct Primblock *)cpexpr((expptr)pp) ); + if(skip) + { + curdtp = curdtp->nextp; + curdtelt = 0; + } + if(q->headblock.vtype == TYCHAR) + if(ISICON(q->headblock.vleng)) + *elenp = q->headblock.vleng->constblock.Const.ci; + else { + err("initialization of string of nonconstant length"); + continue; + } + else *elenp = typesize[q->headblock.vtype]; + + if (np->vstg == STGBSS) { + vlen = np->vtype==TYCHAR + ? np->vleng->constblock.Const.ci + : typesize[np->vtype]; + if(vlen > 0) + np->vstg = STGINIT; + } + return( (Addrp) q ); + +doerr: + err("nonconstant implied DO parameter"); + frexpr(q); + curdtp = curdtp->nextp; + +next: + curdtelt = 0; + } + + return(NULL); +} + + + +LOCAL FILEP dfile; + + +setdata(varp, valp, elen) +register Addrp varp; +ftnint elen; +register Constp valp; +{ + struct Constblock con; + register int type; + int i, k, valtype; + ftnint offset; + char *dataname(), *varname; + static Addrp badvar; + + if (varp->vstg == STGCOMMON) { + if (!(dfile = blkdfile)) + dfile = blkdfile = opf(blkdfname, textwrite); + } + else { + if (procclass == CLBLOCK) { + if (varp != badvar) { + badvar = varp; + warn1("%s is not in a COMMON block", + varp->uname_tag == UNAM_NAME + ? varp->user.name->fvarname + : "???"); + } + return; + } + if (!(dfile = initfile)) + dfile = initfile = opf(initfname, textwrite); + } + varname = dataname(varp->vstg, varp->memno); + offset = varp->memoffset->constblock.Const.ci; + type = varp->vtype; + valtype = valp->vtype; + if(type!=TYCHAR && valtype==TYCHAR) + { + if(! ftn66flag) + warn("non-character datum initialized with character string"); + varp->vleng = ICON(typesize[type]); + varp->vtype = type = TYCHAR; + } + else if( (type==TYCHAR && valtype!=TYCHAR) || + (cktype(OPASSIGN,type,valtype) == TYERROR) ) + { + err("incompatible types in initialization"); + return; + } + if(type == TYADDR) + con.Const.ci = valp->Const.ci; + else if(type != TYCHAR) + { + if(valtype == TYUNKNOWN) + con.Const.ci = valp->Const.ci; + else consconv(type, &con, valp); + } + + k = 1; + + switch(type) + { + case TYLOGICAL: + if (tylogical != TYLONG) + type = tylogical; + case TYSHORT: + case TYLONG: + dataline(varname, offset, type); + prconi(dfile, con.Const.ci); + break; + + case TYADDR: + dataline(varname, offset, type); + prcona(dfile, con.Const.ci); + break; + + case TYCOMPLEX: + case TYDCOMPLEX: + k = 2; + case TYREAL: + case TYDREAL: + dataline(varname, offset, type); + prconr(dfile, &con, k); + break; + + case TYCHAR: + k = valp -> vleng -> constblock.Const.ci; + if (elen < k) + k = elen; + for(i = 0 ; i < k ; ++i) { + dataline(varname, offset++, TYCHAR); + fprintf(dfile, "\t%d\n", + valp->Const.ccp[i]); + } + k = elen - valp->vleng->constblock.Const.ci; + if(k > 0) { + dataline(varname, offset, TYBLANK); + fprintf(dfile, "\t%d\n", k); + } + break; + + default: + badtype("setdata", type); + } + +} + + + +/* + output form of name is padded with blanks and preceded + with a storage class digit +*/ +char *dataname(stg,memno) + int stg; + long memno; +{ + static char varname[64]; + register char *s, *t; + char buf[16], *memname(); + + if (stg == STGCOMMON) { + varname[0] = '2'; + sprintf(s = buf, "Q.%ld", memno); + } + else { + varname[0] = stg==STGEQUIV ? '1' : '0'; + s = memname(stg, memno); + } + t = varname + 1; + while(*t++ = *s++); + *t = 0; + return(varname); +} + + + + + +frdata(p0) +chainp p0; +{ + register struct Chain *p; + register tagptr q; + + for(p = p0 ; p ; p = p->nextp) + { + q = (tagptr)p->datap; + if(q->tag == TIMPLDO) + { + if(q->impldoblock.isbusy) + return; /* circular chain completed */ + q->impldoblock.isbusy = YES; + frdata(q->impldoblock.datalist); + free( (charptr) q); + } + else + frexpr(q); + } + + frchain( &p0); +} + + + +dataline(varname, offset, type) +char *varname; +ftnint offset; +int type; +{ + fprintf(dfile, datafmt, varname, offset, type); +} + + void +make_param(p, e) + register struct Paramblock *p; + expptr e; +{ + p->vclass = CLPARAM; + impldcl((Namep)p); + p->paramval = mkconv(p->vtype, e); + } diff --git a/sources/f2c/defines.h b/sources/f2c/defines.h new file mode 100644 index 0000000..9df8110 --- /dev/null +++ b/sources/f2c/defines.h @@ -0,0 +1,288 @@ +#define PDP11 4 + +#define BIGGEST_SHORT 0x7fff /* Assumes 32-bit arithmetic */ +#define BIGGEST_LONG 0x7fffffff /* Assumes 32-bit arithmetic */ + +#define M(x) (1<tag==TCONST && ISINT(z->constblock.vtype)) + +/* ISCHAR assumes that z has some kind of structure, i.e. is not null */ + +#define ISCHAR(z) (z->headblock.vtype==TYCHAR) +#define ISINT(z) ONEOF(z, MSKINT) /* z is a tag, i.e. a mask number */ +#define ISCONST(z) (z->tag==TCONST) +#define ISERROR(z) (z->tag==TERROR) +#define ISPLUSOP(z) (z->tag==TEXPR && z->exprblock.opcode==OPPLUS) +#define ISSTAROP(z) (z->tag==TEXPR && z->exprblock.opcode==OPSTAR) +#define ISONE(z) (ISICON(z) && z->constblock.Const.ci==1) +#define INT(z) ONEOF(z, MSKINT|MSKCHAR) /* has INT storage in real life */ +#define ICON(z) mkintcon( (ftnint)(z) ) + +/* NO66 -- F77 feature is being used + NOEXT -- F77 extension is being used */ + +#define NO66(s) if(no66flag) err66(s) +#define NOEXT(s) if(noextflag) errext(s) + +/* round a up to the nearest multiple of b: + + a = b * floor ( (a + (b - 1)) / b )*/ + +#define roundup(a,b) ( b * ( (a+b-1)/b) ) diff --git a/sources/f2c/defs.h b/sources/f2c/defs.h new file mode 100644 index 0000000..f7fbada --- /dev/null +++ b/sources/f2c/defs.h @@ -0,0 +1,773 @@ +/**************************************************************** +Copyright 1990 by AT&T Bell Laboratories, Bellcore. + +Permission to use, copy, modify, and distribute this software +and its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the names of AT&T Bell Laboratories or +Bellcore or any of their entities not be used in advertising or +publicity pertaining to distribution of the software without +specific, written prior permission. + +AT&T and Bellcore disclaim all warranties with regard to this +software, including all implied warranties of merchantability +and fitness. In no event shall AT&T or Bellcore be liable for +any special, indirect or consequential damages or any damages +whatsoever resulting from loss of use, data or profits, whether +in an action of contract, negligence or other tortious action, +arising out of or in connection with the use or performance of +this software. +****************************************************************/ + +#include +#ifndef NULL +/* ANSI C */ +#include +#endif + +#include "ctype.h" + +#include "ftypes.h" +#include "defines.h" +#include "machdefs.h" + +#define MAXDIM 20 +#define MAXINCLUDES 10 +#define MAXLITERALS 200 /* Max number of constants in the literal + pool */ +#define MAXTOKENLEN 302 /* length of longest token */ +#define MAXCTL 20 +#define MAXHASH 401 +#define MAXSTNO 801 +#define MAXEXT 200 +#define MAXEQUIV 150 +#define MAXLABLIST 125 /* Max number of labels in an alternate + return CALL */ + +/* These are the primary pointer types used in the compiler */ + +typedef union Expression *expptr, *tagptr; +typedef struct Chain *chainp; +typedef struct Addrblock *Addrp; +typedef struct Constblock *Constp; +typedef struct Exprblock *Exprp; +typedef struct Nameblock *Namep; + +extern FILEP opf(); +extern FILEP infile; +extern FILEP diagfile; +extern FILEP textfile; +extern FILEP asmfile; +extern FILEP c_file; /* output file for all functions; extern + declarations will have to be prepended */ +extern FILEP pass1_file; /* Temp file to hold the function bodies + read on pass 1 */ +extern FILEP expr_file; /* Debugging file */ +extern FILEP initfile; /* Intermediate data file pointer */ +extern FILEP blkdfile; /* BLOCK DATA file */ + +extern int current_ftn_file; + +extern char *blkdfname, *initfname, *sortfname; +extern long int headoffset; /* Since the header block requires data we + don't know about until AFTER each + function has been processed, we keep a + pointer to the current (dummy) header + block (at the top of the assembly file) + here */ + +extern char main_alias[]; /* name given to PROGRAM psuedo-op */ +extern char token [ ]; +extern int toklen; +extern long lineno; +extern char *infname; +extern int needkwd; +extern struct Labelblock *thislabel; + +/* Used to allow runtime expansion of internal tables. In particular, + these values can exceed their associated constants */ + +extern int maxctl; +extern int maxequiv; +extern int maxstno; +extern int maxhash; +extern int maxext; + +extern flag nowarnflag; +extern flag ftn66flag; /* Generate warnings when weird f77 + features are used (undeclared dummy + procedure, non-char initialized with + string, 1-dim subscript in EQUIV) */ +extern flag no66flag; /* Generate an error when a generic + function (f77 feature) is used */ +extern flag noextflag; /* Generate an error when an extension to + Fortran 77 is used (hex/oct/bin + constants, automatic, static, double + complex types) */ +extern flag zflag; /* enable double complex intrinsics */ +extern flag shiftcase; +extern flag undeftype; +extern flag shortsubs; /* Use short subscripts on arrays? */ +extern flag onetripflag; /* if true, always execute DO loop body */ +extern flag checksubs; +extern flag debugflag; +extern int nerr; +extern int nwarn; + +extern int parstate; +extern flag headerdone; /* True iff the current procedure's header + data has been written */ +extern int blklevel; +extern flag saveall; +extern flag substars; /* True iff some formal parameter is an + asterisk */ +extern int impltype[ ]; +extern ftnint implleng[ ]; +extern int implstg[ ]; + +extern int tyint, tyioint, tyreal; +extern int tylogical; /* TY____ of the implementation of logical. + This will be LONG unless '-2' is given + on the command line */ +extern int type_choice[]; +extern char *typename[]; + +extern int typesize[]; /* size (in bytes) of an object of each + type. Indexed by TY___ macros */ +extern int typealign[]; +extern int proctype; /* Type of return value in this procedure */ +extern char * procname; /* External name of the procedure, or last ENTRY name */ +extern int rtvlabel[ ]; /* Return value labels, indexed by TY___ macros */ +extern Addrp retslot; +extern Addrp xretslot[]; +extern int cxslot; /* Complex return argument slot (frame pointer offset)*/ +extern int chslot; /* Character return argument slot (fp offset) */ +extern int chlgslot; /* Argument slot for length of character buffer */ +extern int procclass; /* Class of the current procedure: either CLPROC, + CLMAIN, CLBLOCK or CLUNKNOWN */ +extern ftnint procleng; /* Length of function return value (e.g. char + string length). If this is -1, then the length is + not known at compile time */ +extern int nentry; /* Number of entry points (other than the original + function call) into this procedure */ +extern flag multitype; /* YES iff there is more than one return value + possible */ +extern int blklevel; +extern long lastiolabno; +extern int lastlabno; +extern int lastvarno; +extern int lastargslot; /* integer offset pointing to the next free + location for an argument to the current routine */ +extern int argloc; +extern int autonum[]; /* for numbering + automatic variables, e.g. temporaries */ +extern int retlabel; +extern int ret0label; +extern int dorange; /* Number of the label which terminates + the innermost DO loop */ +extern int regnum[ ]; /* Numbers of DO indicies named in + regnamep (below) */ +extern Namep regnamep[ ]; /* List of DO indicies in registers */ +extern int maxregvar; /* number of elts in regnamep */ +extern int highregvar; /* keeps track of the highest register + number used by DO index allocator */ +extern int nregvar; /* count of DO indicies in registers */ + +extern chainp templist[]; +extern int maxdim; +extern chainp earlylabs; +extern chainp holdtemps; +extern struct Entrypoint *entries; +extern struct Rplblock *rpllist; +extern struct Chain *curdtp; +extern ftnint curdtelt; +extern chainp allargs; /* union of args in entries */ +extern int nallargs; /* total number of args */ +extern int nallchargs; /* total number of character args */ +extern flag toomanyinit; /* True iff too many initializers in a + DATA statement */ + +extern flag inioctl; +extern int iostmt; +extern Addrp ioblkp; +extern int nioctl; +extern int nequiv; +extern int eqvstart; /* offset to eqv number to guarantee uniqueness + and prevent from going negative */ +extern int nintnames; + +/* Chain of tagged blocks */ + +struct Chain + { + chainp nextp; + char * datap; /* Tagged block */ + }; + +extern chainp chains; + +/* Recall that field is intended to hold four-bit characters */ + +/* This structure exists only to defeat the type checking */ + +struct Headblock + { + field tag; + field vtype; + field vclass; + field vstg; + expptr vleng; /* Expression for length of char string - + this may be a constant, or an argument + generated by mkarg() */ + } ; + +/* Control construct info (for do loops, else, etc) */ + +struct Ctlframe + { + unsigned ctltype:8; + unsigned dostepsign:8; /* 0 - variable, 1 - pos, 2 - neg */ + unsigned dowhile:1; + int ctlabels[4]; /* Control labels, defined below */ + int dolabel; /* label marking end of this DO loop */ + Namep donamep; /* DO index variable */ + expptr domax; /* constant or temp variable holding MAX + loop value; or expr of while(expr) */ + expptr dostep; /* expression */ + Namep loopname; + }; +#define endlabel ctlabels[0] +#define elselabel ctlabels[1] +#define dobodylabel ctlabels[1] +#define doposlabel ctlabels[2] +#define doneglabel ctlabels[3] +extern struct Ctlframe *ctls; /* Keeps info on DO and BLOCK IF + structures - this is the stack + bottom */ +extern struct Ctlframe *ctlstack; /* Pointer to current nesting + level */ +extern struct Ctlframe *lastctl; /* Point to end of + dynamically-allocated array */ + +typedef struct { + int type; + chainp cp; + } Atype; + +typedef struct { + int nargs, changes; + Atype atypes[1]; + } Argtypes; + +/* External Symbols */ + +struct Extsym + { + char *fextname; /* Fortran version of external name */ + char *cextname; /* C version of external name */ + field extstg; /* STG -- should be COMMON, UNKNOWN or EXT + */ + unsigned extype:4; /* for transmitting type to output routines */ + unsigned used_here:1; /* Boolean - true on the second pass + through a function if the block has + been referenced */ + unsigned exused:1; /* Has been used (for help with error msgs + about externals typed differently in + different modules) */ + unsigned exproto:1; /* type specified in a .P file */ + unsigned extinit:1; /* Procedure has been defined, + or COMMON has DATA */ + unsigned extseen:1; /* True if previously referenced */ + chainp extp; /* List of identifiers in the common + block for this function, stored as + Namep (hash table pointers) */ + chainp allextp; /* List of lists of identifiers; we keep one + list for each layout of this common block */ + int curno; /* current number for this common block, + used for constructing appending _nnn + to the common block name */ + int maxno; /* highest curno value for this common block */ + ftnint extleng; + ftnint maxleng; + Argtypes *arginfo; + }; +typedef struct Extsym Extsym; + +extern Extsym *extsymtab; /* External symbol table */ +extern Extsym *nextext; +extern Extsym *lastext; +extern int complex_seen, dcomplex_seen; + +/* Statement labels */ + +struct Labelblock + { + int labelno; /* Internal label */ + unsigned blklevel:8; /* level of nesting , for branch-in-loop + checking */ + unsigned labused:1; + unsigned fmtlabused:1; + unsigned labinacc:1; /* inaccessible? (i.e. has its scope + vanished) */ + unsigned labdefined:1; /* YES or NO */ + unsigned labtype:2; /* LAB{FORMAT,EXEC,etc} */ + ftnint stateno; /* Original label */ + char *fmtstring; /* format string */ + }; + +extern struct Labelblock *labeltab; /* Label table - keeps track of + all labels, including undefined */ +extern struct Labelblock *labtabend; +extern struct Labelblock *highlabtab; + +/* Entry point list */ + +struct Entrypoint + { + struct Entrypoint *entnextp; + Extsym *entryname; /* Name of this ENTRY */ + chainp arglist; + int typelabel; /* Label for function exit; this + will return the proper type of + object */ + Namep enamep; /* External name */ + }; + +/* Primitive block, or Primary block. This is a general template returned + by the parser, which will be interpreted in context. It is a template + for an identifier (variable name, function name), parenthesized + arguments (array subscripts, function parameters) and substring + specifications. */ + +struct Primblock + { + field tag; + field vtype; + Namep namep; /* Pointer to structure Nameblock */ + struct Listblock *argsp; + expptr fcharp; /* first-char-index-pointer (in + substring) */ + expptr lcharp; /* last-char-index-pointer (in + substring) */ + }; + + +struct Hashentry + { + int hashval; + Namep varp; + }; +extern struct Hashentry *hashtab; /* Hash table */ +extern struct Hashentry *lasthash; + +struct Intrpacked /* bits for intrinsic function description */ + { + unsigned f1:3; + unsigned f2:4; + unsigned f3:7; + unsigned f4:1; + }; + +struct Nameblock + { + field tag; + field vtype; + field vclass; + field vstg; + expptr vleng; /* length of character string, if applicable */ + char *fvarname; /* name in the Fortran source */ + char *cvarname; /* name in the resulting C */ + chainp vlastdim; /* datap points to new_vars entry for the */ + /* system variable, if any, storing the final */ + /* dimension; we zero the datap if this */ + /* variable is needed */ + unsigned vprocclass:3; /* P____ macros - selects the varxptr + field below */ + unsigned vdovar:1; /* "is it a DO variable?" for register + and multi-level loop checking */ + unsigned vdcldone:1; /* "do I think I'm done?" - set when the + context is sufficient to determine its + status */ + unsigned vadjdim:1; /* "adjustable dimension?" - needed for + information about copies */ + unsigned vsave:1; + unsigned vimpldovar:1; /* used to prevent erroneous error messages + for variables used only in DATA stmt + implicit DOs */ + unsigned vis_assigned:1;/* True if this variable has had some + label ASSIGNED to it; hence + varxptr.assigned_values is valid */ + unsigned vimplstg:1; /* True if storage type is assigned implicitly; + this allows a COMMON variable to participate + in a DIMENSION before the COMMON declaration. + */ + unsigned vcommequiv:1; /* True if EQUIVALENCEd onto STGCOMMON */ + unsigned vfmt_asg:1; /* True if char *var_fmt needed */ + unsigned vpassed:1; /* True if passed as a character-variable arg */ + unsigned vknownarg:1; /* True if seen in a previous entry point */ + unsigned visused:1; /* True if variable is referenced -- so we */ + /* can omit variables that only appear in DATA */ + unsigned vnamelist:1; /* Appears in a NAMELIST */ + unsigned vimpltype:1; /* True if implicitly typed and not + invoked as a function or subroutine + (so we can consistently type procedures + declared external and passed as args + but never invoked). + */ + unsigned vtypewarned:1; /* so we complain just once about + changed types of external procedures */ + unsigned vinftype:1; /* so we can restore implicit type to a + procedure if it is invoked as a function + after being given a different type by -it */ + unsigned vinfproc:1; /* True if -it infers this to be a procedure */ + unsigned vcalled:1; /* has been invoked */ + unsigned vdimfinish:1; /* need to invoke dim_finish() */ + +/* The vardesc union below is used to store the number of an intrinsic + function (when vstg == STGINTR and vprocclass == PINTRINSIC), or to + store the index of this external symbol in extsymtab (when vstg == + STGEXT and vprocclass == PEXTERNAL) */ + + union { + int varno; /* Return variable for a function. + This is used when a function is + assigned a return value. Also + used to point to the COMMON + block, when this is a field of + that block. Also points to + EQUIV block when STGEQUIV */ + struct Intrpacked intrdesc; /* bits for intrinsic function*/ + } vardesc; + struct Dimblock *vdim; /* points to the dimensions if they exist */ + ftnint voffset; /* offset in a storage block (the variable + name will be "v.%d", voffset in a + common blck on the vax). Also holds + pointers for automatic variables. When + STGEQUIV, this is -(offset from array + base) */ + union { + chainp namelist; /* points to names in the NAMELIST, + if this is a NAMELIST name */ + chainp vstfdesc; /* points to (formals, expr) pair */ + chainp assigned_values; /* list of integers, each being a + statement label assigned to + this variable in the current function */ + } varxptr; + int argno; /* for multiple entries */ + Argtypes *arginfo; + }; + + +/* PARAMETER statements */ + +struct Paramblock + { + field tag; + field vtype; + field vclass; + field vstg; + expptr vleng; + char *fvarname; + char *cvarname; + expptr paramval; + } ; + + +/* Expression block */ + +struct Exprblock + { + field tag; + field vtype; + field vclass; + field vstg; + expptr vleng; /* in the case of a character expression, this + value is inherited from the children */ + unsigned opcode; + expptr leftp; + expptr rightp; + }; + + +union Constant + { + struct { + char *ccp0; + ftnint blanks; + } ccp1; + ftnint ci; /* Constant long integer */ + double cd[2]; + char *cds[2]; + }; +#define ccp ccp1.ccp0 + +struct Constblock + { + field tag; + field vtype; + field vclass; + field vstg; /* vstg = 1 when using Const.cds */ + expptr vleng; + union Constant Const; + }; + + +struct Listblock + { + field tag; + field vtype; + chainp listp; + }; + + + +/* Address block - this is the FINAL form of identifiers before being + sent to pass 2. We'll want to add the original identifier here so that it can + be preserved in the translation. + + An example identifier is q.7. The "q" refers to the storage class + (field vstg), the 7 to the variable number (int memno). */ + +struct Addrblock + { + field tag; + field vtype; + field vclass; + field vstg; + expptr vleng; + /* put union...user here so the beginning of an Addrblock + * is the same as a Constblock. + */ + union { + Namep name; /* contains a pointer into the hash table */ + char ident[IDENT_LEN + 1]; /* C string form of identifier */ + char *Charp; + union Constant Const; /* Constant value */ + struct { + double dfill[2]; + field vstg1; + } kludge; /* so we can distinguish string vs binary + * floating-point constants */ + } user; + long memno; /* when vstg == STGCONST, this is the + numeric part of the assembler label + where the constant value is stored */ + expptr memoffset; /* used in subscript computations, usually */ + unsigned istemp:1; /* used in stack management of temporary + variables */ + unsigned isarray:1; /* used to show that memoffset is + meaningful, even if zero */ + unsigned ntempelt:10; /* for representing temporary arrays, as + in concatenation */ + unsigned dbl_builtin:1; /* builtin to be declared double */ + unsigned charleng:1; /* so saveargtypes can get i/o calls right */ + ftnint varleng; /* holds a copy of a constant length which + is stored in the vleng field (e.g. + a double is 8 bytes) */ + int uname_tag; /* Tag describing which of the unions() + below to use */ + char *Field; /* field name when dereferencing a struct */ +}; /* struct Addrblock */ + + +/* Errorbock - placeholder for errors, to allow the compilation to + continue */ + +struct Errorblock + { + field tag; + field vtype; + }; + + +/* Implicit DO block, especially related to DATA statements. This block + keeps track of the compiler's location in the implicit DO while it's + running. In particular, the isactive and isbusy flags tell where + it is */ + +struct Impldoblock + { + field tag; + unsigned isactive:1; + unsigned isbusy:1; + Namep varnp; + Constp varvp; + chainp impdospec; + expptr implb; + expptr impub; + expptr impstep; + ftnint impdiff; + ftnint implim; + struct Chain *datalist; + }; + + +/* Each of these components has a first field called tag. This union + exists just for allocation simplicity */ + +union Expression + { + field tag; + struct Addrblock addrblock; + struct Constblock constblock; + struct Errorblock errorblock; + struct Exprblock exprblock; + struct Headblock headblock; + struct Impldoblock impldoblock; + struct Listblock listblock; + struct Nameblock nameblock; + struct Paramblock paramblock; + struct Primblock primblock; + } ; + + + +struct Dimblock + { + int ndim; + expptr nelt; /* This is NULL if the array is unbounded */ + expptr baseoffset; /* a constant or local variable holding + the offset in this procedure */ + expptr basexpr; /* expression for comuting the offset, if + it's not constant. If this is + non-null, the register named in + baseoffset will get initialized to this + value in the procedure's prolog */ + struct + { + expptr dimsize; /* constant or register holding the size + of this dimension */ + expptr dimexpr; /* as above in basexpr, this is an + expression for computing a variable + dimension */ + } dims[1]; /* Dimblocks are allocated with enough + space for this to become dims[ndim] */ + }; + + +/* Statement function identifier stack - this holds the name and value of + the parameters in a statement function invocation. For example, + + f(x,y,z)=x+y+z + . + . + y = f(1,2,3) + + generates a stack of depth 3, with , , AT THE INVOCATION, NOT + at the definition */ + +struct Rplblock /* name replacement block */ + { + struct Rplblock *rplnextp; + Namep rplnp; /* Name of the formal parameter */ + expptr rplvp; /* Value of the actual parameter */ + expptr rplxp; /* Initialization of temporary variable, + if required; else null */ + int rpltag; /* Tag on the value of the actual param */ + }; + + + +/* Equivalence block */ + +struct Equivblock + { + struct Eqvchain *equivs; /* List (Eqvchain) of primblocks + holding variable identifiers */ + flag eqvinit; + long int eqvtop; + long int eqvbottom; + int eqvtype; + } ; +#define eqvleng eqvtop + +extern struct Equivblock *eqvclass; + + +struct Eqvchain + { + struct Eqvchain *eqvnextp; + union + { + struct Primblock *eqvlhs; + Namep eqvname; + } eqvitem; + long int eqvoffset; + } ; + + + +/* For allocation purposes only, and to keep lint quiet. In particular, + don't count on the tag being able to tell you which structure is used */ + + +/* There is a tradition in Fortran that the compiler not generate the same + bit pattern more than is necessary. This structure is used to do just + that; if two integer constants have the same bit pattern, just generate + it once. This could be expanded to optimize without regard to type, by + removing the type check in putconst() */ + +struct Literal + { + short littype; + short litnum; /* numeric part of the assembler + label for this constant value */ + int lituse; /* usage count */ + union { + ftnint litival; + double litdval[2]; + } litval; + char *cds[2]; + }; + +extern struct Literal litpool[ ]; +extern int nliterals; +extern char Letters[]; +#define letter(x) Letters[x] + + +/* popular functions with non integer return values */ + + +int *ckalloc(); +char *varstr(), *nounder(), *addunder(); +char *copyn(), *copys(); +chainp hookup(), mkchain(), revchain(); +ftnint convci(); +char *convic(); +char *setdoto(); +double convcd(); +Namep mkname(); +struct Labelblock *mklabel(), *execlab(); +Extsym *mkext(), *newentry(); +expptr addrof(), call1(), call2(), call3(), call4(); +Addrp builtin(), Mktemp(), mktmp0(), mktmpn(), autovar(); +Addrp mkplace(), mkaddr(), putconst(), memversion(); +expptr mkprim(), mklhs(), mkexpr(), mkconv(), mkfunct(), fixexpr(), fixtype(); +expptr errnode(), mkaddcon(), mkintcon(), putcxop(); +tagptr cpexpr(); +ftnint lmin(), lmax(), iarrlen(); +void *memcpy(), *memset(); +char *strcat(), *strcpy(), *strncpy(); +char *dbconst(), *flconst(); + +void puteq (), putex1 (); +expptr putx (), putsteq (), putassign (); + +extern int forcedouble; /* force real functions to double */ +extern int doin_setbound; /* special handling for array bounds */ +extern int Ansi; +extern double atof(); +extern char *cds(), *cpstring(), *dtos(), *gmem(), *mem(), *string_num(); +extern char *c_type_decl(); +extern char hextoi_tab[]; +#define hextoi(x) hextoi_tab[(x) & 0xff] +extern char *casttypes[], *ftn_types[], *protorettypes[], *usedcasts[]; +extern int Castargs, infertypes; +extern FILE *protofile; +extern void exit(), inferdcl(), protowrite(), save_argtypes(); +extern char binread[], binwrite[], textread[], textwrite[]; +extern char *wh_first, *wh_last, *wh_next; +extern void putwhile(); diff --git a/sources/f2c/equiv.c b/sources/f2c/equiv.c new file mode 100644 index 0000000..817fc5f --- /dev/null +++ b/sources/f2c/equiv.c @@ -0,0 +1,371 @@ +/**************************************************************** +Copyright 1990 by AT&T Bell Laboratories and Bellcore. + +Permission to use, copy, modify, and distribute this software +and its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the names of AT&T Bell Laboratories or +Bellcore or any of their entities not be used in advertising or +publicity pertaining to distribution of the software without +specific, written prior permission. + +AT&T and Bellcore disclaim all warranties with regard to this +software, including all implied warranties of merchantability +and fitness. In no event shall AT&T or Bellcore be liable for +any special, indirect or consequential damages or any damages +whatsoever resulting from loss of use, data or profits, whether +in an action of contract, negligence or other tortious action, +arising out of or in connection with the use or performance of +this software. +****************************************************************/ + +#include "defs.h" + +LOCAL eqvcommon(), eqveqv(), nsubs(); + +/* ROUTINES RELATED TO EQUIVALENCE CLASS PROCESSING */ + +/* called at end of declarations section to process chains + created by EQUIVALENCE statements + */ +doequiv() +{ + register int i; + int inequiv; /* True if one namep occurs in + several EQUIV declarations */ + int comno; /* Index into Extsym table of the last + COMMON block seen (implicitly assuming + that only one will be given) */ + int ovarno; + ftnint comoffset; /* Index into the COMMON block */ + ftnint offset; /* Offset from array base */ + ftnint leng; + register struct Equivblock *equivdecl; + register struct Eqvchain *q; + struct Primblock *primp; + register Namep np; + int k, k1, ns, pref, t; + chainp cp; + extern int type_pref[]; + + for(i = 0 ; i < nequiv ; ++i) + { + +/* Handle each equivalence declaration */ + + equivdecl = &eqvclass[i]; + equivdecl->eqvbottom = equivdecl->eqvtop = 0; + comno = -1; + + + + for(q = equivdecl->equivs ; q ; q = q->eqvnextp) + { + offset = 0; + primp = q->eqvitem.eqvlhs; + vardcl(np = primp->namep); + if(primp->argsp || primp->fcharp) + { + expptr offp, suboffset(); + +/* Pad ones onto the end of an array declaration when needed */ + + if(np->vdim!=NULL && np->vdim->ndim>1 && + nsubs(primp->argsp)==1 ) + { + if(! ftn66flag) + warni + ("1-dim subscript in EQUIVALENCE, %d-dim declared", + np -> vdim -> ndim); + cp = NULL; + ns = np->vdim->ndim; + while(--ns > 0) + cp = mkchain((char *)ICON(1), cp); + primp->argsp->listp->nextp = cp; + } + + offp = suboffset(primp); + if(ISICON(offp)) + offset = offp->constblock.Const.ci; + else { + dclerr + ("nonconstant subscript in equivalence ", + np); + np = NULL; + } + frexpr(offp); + } + +/* Free up the primblock, since we now have a hash table (Namep) entry */ + + frexpr((expptr)primp); + + if(np && (leng = iarrlen(np))<0) + { + dclerr("adjustable in equivalence", np); + np = NULL; + } + + if(np) switch(np->vstg) + { + case STGUNKNOWN: + case STGBSS: + case STGEQUIV: + break; + + case STGCOMMON: + +/* The code assumes that all COMMON references in a given EQUIVALENCE will + be to the same COMMON block, and will all be consistent */ + + comno = np->vardesc.varno; + comoffset = np->voffset + offset; + break; + + default: + dclerr("bad storage class in equivalence", np); + np = NULL; + break; + } + + if(np) + { + q->eqvoffset = offset; + +/* eqvbottom gets the largest difference between the array base address + and the address specified in the EQUIV declaration */ + + equivdecl->eqvbottom = + lmin(equivdecl->eqvbottom, -offset); + +/* eqvtop gets the largest difference between the end of the array and + the address given in the EQUIVALENCE */ + + equivdecl->eqvtop = + lmax(equivdecl->eqvtop, leng-offset); + } + q->eqvitem.eqvname = np; + } + +/* Now all equivalenced variables are in the hash table with the proper + offset, and eqvtop and eqvbottom are set. */ + + if(comno >= 0) + +/* Get rid of all STGEQUIVS, they will be mapped onto STGCOMMON variables + */ + + eqvcommon(equivdecl, comno, comoffset); + else for(q = equivdecl->equivs ; q ; q = q->eqvnextp) + { + if(np = q->eqvitem.eqvname) + { + inequiv = NO; + if(np->vstg==STGEQUIV) + if( (ovarno = np->vardesc.varno) == i) + { + +/* Can't EQUIV different elements of the same array */ + + if(np->voffset + q->eqvoffset != 0) + dclerr + ("inconsistent equivalence", np); + } + else { + offset = np->voffset; + inequiv = YES; + } + + np->vstg = STGEQUIV; + np->vardesc.varno = i; + np->voffset = - q->eqvoffset; + + if(inequiv) + +/* Combine 2 equivalence declarations */ + + eqveqv(i, ovarno, q->eqvoffset + offset); + } + } + } + +/* Now each equivalence declaration is distinct (all connections have been + merged in eqveqv()), and some may be empty. */ + + for(i = 0 ; i < nequiv ; ++i) + { + equivdecl = & eqvclass[i]; + if(equivdecl->eqvbottom!=0 || equivdecl->eqvtop!=0) { + +/* a live chain */ + + k = TYCHAR; + pref = 1; + for(q = equivdecl->equivs ; q; q = q->eqvnextp) + { + np = q->eqvitem.eqvname; + np->voffset -= equivdecl->eqvbottom; + t = typealign[k1 = np->vtype]; + if (pref < type_pref[k1]) { + k = k1; + pref = type_pref[k1]; + } + if(np->voffset % t != 0) + dclerr("bad alignment forced by equivalence", np); + } + equivdecl->eqvtype = k; + } + freqchain(equivdecl); + } +} + + + + + +/* put equivalence chain p at common block comno + comoffset */ + +LOCAL eqvcommon(p, comno, comoffset) +struct Equivblock *p; +int comno; +ftnint comoffset; +{ + int ovarno; + ftnint k, offq; + register Namep np; + register struct Eqvchain *q; + + if(comoffset + p->eqvbottom < 0) + { + errstr("attempt to extend common %s backward", + extsymtab[comno].fextname); + freqchain(p); + return; + } + + if( (k = comoffset + p->eqvtop) > extsymtab[comno].extleng) + extsymtab[comno].extleng = k; + + + for(q = p->equivs ; q ; q = q->eqvnextp) + if(np = q->eqvitem.eqvname) + { + switch(np->vstg) + { + case STGUNKNOWN: + case STGBSS: + np->vstg = STGCOMMON; + np->vcommequiv = 1; + np->vardesc.varno = comno; + +/* np -> voffset will point to the base of the array */ + + np->voffset = comoffset - q->eqvoffset; + break; + + case STGEQUIV: + ovarno = np->vardesc.varno; + +/* offq will point to the current element, even if it's in an array */ + + offq = comoffset - q->eqvoffset - np->voffset; + np->vstg = STGCOMMON; + np->vcommequiv = 1; + np->vardesc.varno = comno; + +/* np -> voffset will point to the base of the array */ + + np->voffset = comoffset - q->eqvoffset; + if(ovarno != (p - eqvclass)) + eqvcommon(&eqvclass[ovarno], comno, offq); + break; + + case STGCOMMON: + if(comno != np->vardesc.varno || + comoffset != np->voffset+q->eqvoffset) + dclerr("inconsistent common usage", np); + break; + + + default: + badstg("eqvcommon", np->vstg); + } + } + + freqchain(p); + p->eqvbottom = p->eqvtop = 0; +} + + +/* Move all items on ovarno chain to the front of nvarno chain. + * adjust offsets of ovarno elements and top and bottom of nvarno chain + */ + +LOCAL eqveqv(nvarno, ovarno, delta) +int ovarno, nvarno; +ftnint delta; +{ + register struct Equivblock *neweqv, *oldeqv; + register Namep np; + struct Eqvchain *q, *q1; + + neweqv = eqvclass + nvarno; + oldeqv = eqvclass + ovarno; + neweqv->eqvbottom = lmin(neweqv->eqvbottom, oldeqv->eqvbottom - delta); + neweqv->eqvtop = lmax(neweqv->eqvtop, oldeqv->eqvtop - delta); + oldeqv->eqvbottom = oldeqv->eqvtop = 0; + + for(q = oldeqv->equivs ; q ; q = q1) + { + q1 = q->eqvnextp; + if( (np = q->eqvitem.eqvname) && np->vardesc.varno==ovarno) + { + q->eqvnextp = neweqv->equivs; + neweqv->equivs = q; + q->eqvoffset -= delta; + np->vardesc.varno = nvarno; + np->voffset -= delta; + } + else free( (charptr) q); + } + oldeqv->equivs = NULL; +} + + + + +freqchain(p) +register struct Equivblock *p; +{ + register struct Eqvchain *q, *oq; + + for(q = p->equivs ; q ; q = oq) + { + oq = q->eqvnextp; + free( (charptr) q); + } + p->equivs = NULL; +} + + + + + +/* nsubs -- number of subscripts in this arglist (just the length of the + list) */ + +LOCAL nsubs(p) +register struct Listblock *p; +{ + register int n; + register chainp q; + + n = 0; + if(p) + for(q = p->listp ; q ; q = q->nextp) + ++n; + + return(n); +} diff --git a/sources/f2c/error.c b/sources/f2c/error.c new file mode 100644 index 0000000..d8118a6 --- /dev/null +++ b/sources/f2c/error.c @@ -0,0 +1,245 @@ +/**************************************************************** +Copyright 1990 by AT&T Bell Laboratories and Bellcore. + +Permission to use, copy, modify, and distribute this software +and its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the names of AT&T Bell Laboratories or +Bellcore or any of their entities not be used in advertising or +publicity pertaining to distribution of the software without +specific, written prior permission. + +AT&T and Bellcore disclaim all warranties with regard to this +software, including all implied warranties of merchantability +and fitness. In no event shall AT&T or Bellcore be liable for +any special, indirect or consequential damages or any damages +whatsoever resulting from loss of use, data or profits, whether +in an action of contract, negligence or other tortious action, +arising out of or in connection with the use or performance of +this software. +****************************************************************/ + +#include "defs.h" + +warni(s,t) + char *s; + int t; +{ + char buf[100]; + sprintf(buf,s,t); + warn(buf); + } + +warn1(s,t) +char *s, *t; +{ + char buff[100]; + sprintf(buff, s, t); + warn(buff); +} + + +warn(s) +char *s; +{ + if(nowarnflag) + return; + if (infname && *infname) + fprintf(diagfile, "Warning on line %ld of %s: %s\n", + lineno, infname, s); + else + fprintf(diagfile, "Warning on line %ld: %s\n", lineno, s); + fflush(diagfile); + ++nwarn; +} + + +errstr(s, t) +char *s, *t; +{ + char buff[100]; + sprintf(buff, s, t); + err(buff); +} + + + +erri(s,t) +char *s; +int t; +{ + char buff[100]; + sprintf(buff, s, t); + err(buff); +} + +errl(s,t) +char *s; +long t; +{ + char buff[100]; + sprintf(buff, s, t); + err(buff); +} + + + +err(s) +char *s; +{ + if (infname && *infname) + fprintf(diagfile, "Error on line %ld of %s: %s\n", + lineno, infname, s); + else + fprintf(diagfile, "Error on line %ld: %s\n", lineno, s); + fflush(diagfile); + ++nerr; +} + + +yyerror(s) +char *s; +{ + err(s); +} + + + +dclerr(s, v) +char *s; +Namep v; +{ + char buff[100]; + + if(v) + { + sprintf(buff, "Declaration error for %s: %s", v->fvarname, s); + err(buff); + } + else + errstr("Declaration error %s", s); +} + + + +execerr(s, n) +char *s, *n; +{ + char buf1[100], buf2[100]; + + sprintf(buf1, "Execution error %s", s); + sprintf(buf2, buf1, n); + err(buf2); +} + + +Fatal(t) +char *t; +{ + fprintf(diagfile, "Compiler error line %ld of %s: %s\n", lineno, infname, t); + done(3); +} + + + + +fatalstr(t,s) +char *t, *s; +{ + char buff[100]; + sprintf(buff, t, s); + Fatal(buff); +} + + + +fatali(t,d) +char *t; +int d; +{ + char buff[100]; + sprintf(buff, t, d); + Fatal(buff); +} + + + +badthing(thing, r, t) +char *thing, *r; +int t; +{ + char buff[50]; + sprintf(buff, "Impossible %s %d in routine %s", thing, t, r); + Fatal(buff); +} + + + +badop(r, t) +char *r; +int t; +{ + badthing("opcode", r, t); +} + + + +badtag(r, t) +char *r; +int t; +{ + badthing("tag", r, t); +} + + + + + +badstg(r, t) +char *r; +int t; +{ + badthing("storage class", r, t); +} + + + + +badtype(r, t) +char *r; +int t; +{ + badthing("type", r, t); +} + + +many(s, c, n) +char *s, c; +int n; +{ + char buff[250]; + + sprintf(buff, + "Too many %s.\nTable limit now %d.\nTry recompiling using the -N%c%d option\n", + s, n, c, 2*n); + Fatal(buff); +} + + +err66(s) +char *s; +{ + errstr("Fortran 77 feature used: %s", s); + --nerr; +} + + + +errext(s) +char *s; +{ + errstr("F77 compiler extension used: %s", s); + --nerr; +} diff --git a/sources/f2c/exec.c b/sources/f2c/exec.c new file mode 100644 index 0000000..d26e9c7 --- /dev/null +++ b/sources/f2c/exec.c @@ -0,0 +1,816 @@ +/**************************************************************** +Copyright 1990 by AT&T Bell Laboratories and Bellcore. + +Permission to use, copy, modify, and distribute this software +and its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the names of AT&T Bell Laboratories or +Bellcore or any of their entities not be used in advertising or +publicity pertaining to distribution of the software without +specific, written prior permission. + +AT&T and Bellcore disclaim all warranties with regard to this +software, including all implied warranties of merchantability +and fitness. In no event shall AT&T or Bellcore be liable for +any special, indirect or consequential damages or any damages +whatsoever resulting from loss of use, data or profits, whether +in an action of contract, negligence or other tortious action, +arising out of or in connection with the use or performance of +this software. +****************************************************************/ + +#include "defs.h" +#include "p1defs.h" +#include "names.h" + +LOCAL void exar2(), popctl(), pushctl(); + +/* Logical IF codes +*/ + + +exif(p) +expptr p; +{ + pushctl(CTLIF); + putif(p, 0); /* 0 => if, not elseif */ +} + + + +exelif(p) +expptr p; +{ + if (ctlstack->ctltype == CTLIF) + putif(p, 1); /* 1 ==> elseif */ + else + execerr("elseif out of place", CNULL); +} + + + + + +exelse() +{ + if(ctlstack->ctltype==CTLIF) { + p1_else (); + ctlstack->ctltype = CTLELSE; + } + else + execerr("else out of place", CNULL); +} + + +exendif() +{ + if(ctlstack->ctltype == CTLIF) { + popctl(); + p1_endif (); + } else if(ctlstack->ctltype == CTLELSE) { + popctl(); + p1else_end (); + } else + execerr("endif out of place", CNULL); +} + + + +/* pushctl -- Start a new control construct, initialize the labels (to + zero) */ + + LOCAL void +pushctl(code) + int code; +{ + register int i; + + if(++ctlstack >= lastctl) + many("loops or if-then-elses", 'c', maxctl); + ctlstack->ctltype = code; + for(i = 0 ; i < 4 ; ++i) + ctlstack->ctlabels[i] = 0; + ctlstack->dowhile = 0; + ++blklevel; +} + + + LOCAL void +popctl() +{ + if( ctlstack-- < ctls ) + Fatal("control stack empty"); + --blklevel; +} + + + +/* poplab -- update the flags in labeltab */ + +LOCAL poplab() +{ + register struct Labelblock *lp; + + for(lp = labeltab ; lp < highlabtab ; ++lp) + if(lp->labdefined) + { + /* mark all labels in inner blocks unreachable */ + if(lp->blklevel > blklevel) + lp->labinacc = YES; + } + else if(lp->blklevel > blklevel) + { + /* move all labels referred to in inner blocks out a level */ + lp->blklevel = blklevel; + } +} + + +/* BRANCHING CODE +*/ + +exgoto(lab) +struct Labelblock *lab; +{ + lab->labused = 1; + p1_goto (lab -> stateno); +} + + + + + + + +exequals(lp, rp) +register struct Primblock *lp; +register expptr rp; +{ + if(lp->tag != TPRIM) + { + err("assignment to a non-variable"); + frexpr((expptr)lp); + frexpr(rp); + } + else if(lp->namep->vclass!=CLVAR && lp->argsp) + { + if(parstate >= INEXEC) + err("statement function amid executables"); + mkstfunct(lp, rp); + } + else + { + expptr new_lp, new_rp; + + if(parstate < INDATA) + enddcl(); + new_lp = mklhs (lp); + new_rp = fixtype (rp); + puteq(new_lp, new_rp); + } +} + + + +/* Make Statement Function */ + +long laststfcn = -1, thisstno; +int doing_stmtfcn; + +mkstfunct(lp, rp) +struct Primblock *lp; +expptr rp; +{ + register struct Primblock *p; + register Namep np; + chainp args; + + laststfcn = thisstno; + np = lp->namep; + if(np->vclass == CLUNKNOWN) + np->vclass = CLPROC; + else + { + dclerr("redeclaration of statement function", np); + return; + } + np->vprocclass = PSTFUNCT; + np->vstg = STGSTFUNCT; + +/* Set the type of the function */ + + impldcl(np); + args = (lp->argsp ? lp->argsp->listp : CHNULL); + np->varxptr.vstfdesc = mkchain((char *)args, (chainp)rp); + + for(doing_stmtfcn = 1 ; args ; args = args->nextp) + +/* It is an error for the formal parameters to have arguments or + subscripts */ + + if( ((tagptr)(args->datap))->tag!=TPRIM || + (p = (struct Primblock *)(args->datap) )->argsp || + p->fcharp || p->lcharp ) + err("non-variable argument in statement function definition"); + else + { + +/* Replace the name on the left-hand side */ + + args->datap = (char *)p->namep; + vardcl(p -> namep); + free((char *)p); + } + doing_stmtfcn = 0; +} + + static void +mixed_type(np) + Namep np; +{ + char buf[128]; + sprintf(buf, "%s function %.90s invoked as subroutine", + ftn_types[np->vtype], np->fvarname); + warn(buf); + } + + +excall(name, args, nstars, labels) +Namep name; +struct Listblock *args; +int nstars; +struct Labelblock *labels[ ]; +{ + register expptr p; + extern void saveargtypes(); + + if (name->vtype != TYSUBR) { + if (name->vinfproc && !name->vcalled) { + name->vtype = TYSUBR; + frexpr(name->vleng); + name->vleng = 0; + } + else if (!name->vimpltype && name->vtype != TYUNKNOWN) + mixed_type(name); + else + settype(name, TYSUBR, (ftnint)0); + } + p = mkfunct( mkprim(name, args, CHNULL) ); + +/* Subroutines and their identifiers acquire the type INT */ + + p->exprblock.vtype = p->exprblock.leftp->headblock.vtype = TYINT; + +/* Handle the alternate return mechanism */ + + if(nstars > 0) { + saveargtypes((Exprp)p); + putcmgo(p, nstars, labels); + } else { + putexpr(p); + } /* else */ +} + + + +exstop(stop, p) +int stop; +register expptr p; +{ + char *str; + int n; + expptr mkstrcon(); + + if(p) + { + if( ! ISCONST(p) ) + { + execerr("pause/stop argument must be constant", CNULL); + frexpr(p); + p = mkstrcon(0, CNULL); + } + else if( ISINT(p->constblock.vtype) ) + { + str = convic(p->constblock.Const.ci); + n = strlen(str); + if(n > 0) + { + p->constblock.Const.ccp = copyn(n, str); + p->constblock.Const.ccp1.blanks = 0; + p->constblock.vtype = TYCHAR; + p->constblock.vleng = (expptr) ICON(n); + } + else + p = (expptr) mkstrcon(0, CNULL); + } + else if(p->constblock.vtype != TYCHAR) + { + execerr("pause/stop argument must be integer or string", CNULL); + p = (expptr) mkstrcon(0, CNULL); + } + } + else p = (expptr) mkstrcon(0, CNULL); + + { + expptr subr_call; + + subr_call = call1(TYSUBR, (stop ? "s_stop" : "s_paus"), p); + putexpr( subr_call ); + } +} + +/* DO LOOP CODE */ + +#define DOINIT par[0] +#define DOLIMIT par[1] +#define DOINCR par[2] + + +/* Macros for ctlstack -> dostepsign */ + +#define VARSTEP 0 +#define POSSTEP 1 +#define NEGSTEP 2 + + +/* exdo -- generate DO loop code. In the case of a variable increment, + positive increment tests are placed above the body, negative increment + tests are placed below (see enddo() ) */ + +exdo(range, loopname, spec) +int range; /* end label */ +Namep loopname; +chainp spec; /* input spec must have at least 2 exprs */ +{ + register expptr p; + register Namep np; + chainp cp; /* loops over the fields in spec */ + register int i; + int dotype; /* type of the index variable */ + int incsign; /* sign of the increment, if it's constant + */ + Addrp dovarp; /* loop index variable */ + expptr doinit; /* constant or register for init param */ + expptr par[3]; /* local specification parameters */ + + expptr init, test, inc; /* Expressions in the resulting FOR loop */ + + + test = ENULL; + + pushctl(CTLDO); + dorange = ctlstack->dolabel = range; + ctlstack->loopname = loopname; + +/* Declare the loop index */ + + np = (Namep)spec->datap; + ctlstack->donamep = NULL; + if (!np) { /* do while */ + ctlstack->dowhile = 1; +#if 0 + if (loopname) { + if (loopname->vtype == TYUNKNOWN) { + loopname->vdcldone = 1; + loopname->vclass = CLLABEL; + loopname->vprocclass = PLABEL; + loopname->vtype = TYLABEL; + } + if (loopname->vtype == TYLABEL) + if (loopname->vdovar) + dclerr("already in use as a loop name", + loopname); + else + loopname->vdovar = 1; + else + dclerr("already declared; cannot be a loop name", + loopname); + } +#endif + putwhile((expptr)spec->nextp); + NOEXT("do while"); + spec->nextp = 0; + frchain(&spec); + return; + } + if(np->vdovar) + { + errstr("nested loops with variable %s", np->fvarname); + ctlstack->donamep = NULL; + return; + } + +/* Create a memory-resident version of the index variable */ + + dovarp = mkplace(np); + if( ! ONEOF(dovarp->vtype, MSKINT|MSKREAL) ) + { + err("bad type on do variable"); + return; + } + ctlstack->donamep = np; + + np->vdovar = YES; + +/* Now dovarp points to the index to be used within the loop, dostgp + points to the one which may need to be stored */ + + dotype = dovarp->vtype; + +/* Count the input specifications and type-check each one independently; + this just eliminates non-numeric values from the specification */ + + for(i=0 , cp = spec->nextp ; cp!=NULL && i<3 ; cp = cp->nextp) + { + p = par[i++] = fixtype((tagptr)cp->datap); + if( ! ONEOF(p->headblock.vtype, MSKINT|MSKREAL) ) + { + err("bad type on DO parameter"); + return; + } + } + + frchain(&spec); + switch(i) + { + case 0: + case 1: + err("too few DO parameters"); + return; + + default: + err("too many DO parameters"); + return; + + case 2: + DOINCR = (expptr) ICON(1); + + case 3: + break; + } + + +/* Now all of the local specification fields are set, but their types are + not yet consistent */ + +/* Declare the loop initialization value, casting it properly and declaring a + register if need be */ + + if (ISCONST (DOINIT) || !onetripflag) +/* putx added 6-29-89 (mwm), not sure if fixtype is required, but I doubt it + since mkconv is called just before */ + doinit = putx (mkconv (dotype, DOINIT)); + else { + doinit = (expptr) Mktemp(dotype, ENULL); + puteq (cpexpr (doinit), DOINIT); + } /* else */ + +/* Declare the loop ending value, casting it to the type of the index + variable */ + + if( ISCONST(DOLIMIT) ) + ctlstack->domax = mkconv(dotype, DOLIMIT); + else { + ctlstack->domax = (expptr) mktmp0(dotype, ENULL); + puteq (cpexpr (ctlstack -> domax), DOLIMIT); + } /* else */ + +/* Declare the loop increment value, casting it to the type of the index + variable */ + + if( ISCONST(DOINCR) ) + { + ctlstack->dostep = mkconv(dotype, DOINCR); + if( (incsign = conssgn(ctlstack->dostep)) == 0) + err("zero DO increment"); + ctlstack->dostepsign = (incsign > 0 ? POSSTEP : NEGSTEP); + } + else + { + ctlstack->dostep = (expptr) mktmp0(dotype, ENULL); + ctlstack->dostepsign = VARSTEP; + puteq (cpexpr (ctlstack -> dostep), DOINCR); + } + +/* All data is now properly typed and in the ctlstack, except for the + initial value. Assignments of temps have been generated already */ + + switch (ctlstack -> dostepsign) { + case VARSTEP: + test = mkexpr (OPQUEST, mkexpr (OPLT, + cpexpr (ctlstack -> dostep), ICON(0)), + mkexpr (OPCOLON, + mkexpr (OPGE, cpexpr((expptr)dovarp), + cpexpr (ctlstack -> domax)), + mkexpr (OPLE, cpexpr((expptr)dovarp), + cpexpr (ctlstack -> domax)))); + break; + case POSSTEP: + test = mkexpr (OPLE, cpexpr((expptr)dovarp), + cpexpr (ctlstack -> domax)); + break; + case NEGSTEP: + test = mkexpr (OPGE, cpexpr((expptr)dovarp), + cpexpr (ctlstack -> domax)); + break; + default: + erri ("exdo: bad dostepsign '%d'", ctlstack -> dostepsign); + break; + } /* switch (ctlstack -> dostepsign) */ + + if (onetripflag) + test = mkexpr (OPOR, test, + mkexpr (OPEQ, cpexpr((expptr)dovarp), cpexpr (doinit))); + init = mkexpr (OPASSIGN, cpexpr((expptr)dovarp), doinit); + inc = mkexpr (OPPLUSEQ, (expptr)dovarp, cpexpr (ctlstack -> dostep)); + + if (!onetripflag && ISCONST (ctlstack -> domax) && ISCONST (doinit) + && ctlstack -> dostepsign != VARSTEP) { + expptr tester; + + tester = mkexpr (OPMINUS, cpexpr (doinit), + cpexpr (ctlstack -> domax)); + if (incsign == conssgn (tester)) + warn ("DO range never executed"); + frexpr (tester); + } /* if !onetripflag && */ + + p1_for (init, test, inc); +} + +exenddo(np) + Namep np; +{ + Namep np1; + int here; + struct Ctlframe *cf; + + if( ctlstack < ctls ) + Fatal("control stack empty"); + here = ctlstack->dolabel; + if (ctlstack->ctltype != CTLDO || here >= 0) { + err("misplaced ENDDO"); + return; + } + if (np != ctlstack->loopname) { + if (np1 = ctlstack->loopname) + errstr("expected \"enddo %s\"", np1->fvarname); + else + err("expected unnamed ENDDO"); + for(cf = ctls; cf < ctlstack; cf++) + if (cf->ctltype == CTLDO && cf->loopname == np) { + here = cf->dolabel; + break; + } + } + enddo(here); + } + + +enddo(here) +int here; +{ + register struct Ctlframe *q; + Namep np; /* name of the current DO index */ + Addrp ap; + register int i; + register expptr e; + +/* Many DO's can end at the same statement, so keep looping over all + nested indicies */ + + while(here == dorange) + { + if(np = ctlstack->donamep) + { + p1for_end (); + +/* Now we're done with all of the tests, and the loop has terminated. + Store the index value back in long-term memory */ + + if(ap = memversion(np)) + puteq((expptr)ap, (expptr)mkplace(np)); + for(i = 0 ; i < 4 ; ++i) + ctlstack->ctlabels[i] = 0; + deregister(ctlstack->donamep); + ctlstack->donamep->vdovar = NO; + e = ctlstack->dostep; + if (e->tag == TADDR && e->addrblock.istemp) + frtemp((Addrp)e); + else + frexpr(e); + e = ctlstack->domax; + if (e->tag == TADDR && e->addrblock.istemp) + frtemp((Addrp)e); + else + frexpr(e); + } + else if (ctlstack->dowhile) + p1for_end (); + +/* Set dorange to the closing label of the next most enclosing DO loop + */ + + popctl(); + poplab(); + dorange = 0; + for(q = ctlstack ; q>=ctls ; --q) + if(q->ctltype == CTLDO) + { + dorange = q->dolabel; + break; + } + } +} + +exassign(vname, labelval) + register Namep vname; +struct Labelblock *labelval; +{ + Addrp p; + expptr mkaddcon(); + register Addrp q; + static char nullstr[] = ""; + char *fs; + register chainp cp, cpprev; + register ftnint k, stno; + + p = mkplace(vname); + if( ! ONEOF(p->vtype, MSKINT|MSKADDR) ) { + err("noninteger assign variable"); + return; + } + + /* If the label hasn't been defined, then we do things twice: + * once for an executable stmt label, once for a format + */ + + /* code for executable label... */ + +/* Now store the assigned value in a list associated with this variable. + This will be used later to generate a switch() statement in the C output */ + + if (!labelval->labdefined || !labelval->fmtstring) { + + if (vname -> vis_assigned == 0) { + vname -> varxptr.assigned_values = CHNULL; + vname -> vis_assigned = 1; + } + + /* don't duplicate labels... */ + + stno = labelval->stateno; + cpprev = 0; + for(k = 0, cp = vname->varxptr.assigned_values; + cp; cpprev = cp, cp = cp->nextp, k++) + if ((ftnint)cp->datap == stno) + break; + if (!cp) { + cp = mkchain((char *)stno, CHNULL); + if (cpprev) + cpprev->nextp = cp; + else + vname->varxptr.assigned_values = cp; + labelval->labused = 1; + } + putout(mkexpr(OPASSIGN, (expptr)p, mkintcon(k))); + } + + /* Code for FORMAT label... */ + + fs = labelval->fmtstring; + if (!labelval->labdefined || fs && fs != nullstr) { + extern void fmtname(); + + if (!fs) + labelval->fmtstring = nullstr; + labelval->fmtlabused = 1; + p = ALLOC(Addrblock); + p->tag = TADDR; + p->vtype = TYCHAR; + p->vstg = STGAUTO; + p->memoffset = ICON(0); + fmtname(vname, p); + q = ALLOC(Addrblock); + q->tag = TADDR; + q->vtype = TYCHAR; + q->vstg = STGAUTO; + q->ntempelt = 1; + q->memoffset = ICON(0); + q->uname_tag = UNAM_IDENT; + sprintf(q->user.ident, "fmt_%ld", labelval->stateno); + putout(mkexpr(OPASSIGN, (expptr)p, (expptr)q)); + } + +} /* exassign */ + + + +exarif(expr, neglab, zerlab, poslab) +expptr expr; +struct Labelblock *neglab, *zerlab, *poslab; +{ + register int lm, lz, lp; + + lm = neglab->stateno; + lz = zerlab->stateno; + lp = poslab->stateno; + expr = fixtype(expr); + + if( ! ONEOF(expr->headblock.vtype, MSKINT|MSKREAL) ) + { + err("invalid type of arithmetic if expression"); + frexpr(expr); + } + else + { + if (lm == lz && lz == lp) + exgoto (neglab); + else if(lm == lz) + exar2(OPLE, expr, neglab, poslab); + else if(lm == lp) + exar2(OPNE, expr, neglab, zerlab); + else if(lz == lp) + exar2(OPGE, expr, zerlab, neglab); + else { + expptr t; + + if (!addressable (expr)) { + t = (expptr) Mktemp(expr -> headblock.vtype, ENULL); + expr = mkexpr (OPASSIGN, cpexpr (t), expr); + } else + t = (expptr) cpexpr (expr); + + p1_if(putx(fixtype(mkexpr (OPLT, expr, ICON (0))))); + exgoto(neglab); + p1_elif (mkexpr (OPEQ, t, ICON (0))); + exgoto(zerlab); + p1_else (); + exgoto(poslab); + p1else_end (); + } /* else */ + } +} + + + +/* exar2 -- Do arithmetic IF for only 2 distinct labels; if !(e.op.0) + goto l2 else goto l1. If this seems backwards, that's because it is, + in order to make the 1 pass algorithm work. */ + + LOCAL void +exar2(op, e, l1, l2) + int op; + expptr e; + struct Labelblock *l1, *l2; +{ + expptr comp; + + comp = mkexpr (op, e, ICON (0)); + p1_if(putx(fixtype(comp))); + exgoto(l1); + p1_else (); + exgoto(l2); + p1else_end (); +} + + +/* exreturn -- return the value in p from a SUBROUTINE call -- used to + implement the alternate return mechanism */ + +exreturn(p) +register expptr p; +{ + if(procclass != CLPROC) + warn("RETURN statement in main or block data"); + if(p && (proctype!=TYSUBR || procclass!=CLPROC) ) + { + err("alternate return in nonsubroutine"); + p = 0; + } + + if (p || proctype == TYSUBR) { + if (p == ENULL) p = ICON (0); + p = mkconv (TYLONG, fixtype (p)); + p1_subr_ret (p); + } /* if p || proctype == TYSUBR */ + else + p1_subr_ret((expptr)retslot); +} + + +exasgoto(labvar) +Namep labvar; +{ + register Addrp p; + void p1_asgoto(); + + p = mkplace(labvar); + if( ! ISINT(p->vtype) ) + err("assigned goto variable must be integer"); + else { + p1_asgoto (p); + } /* else */ +} diff --git a/sources/f2c/expr.c b/sources/f2c/expr.c new file mode 100644 index 0000000..be6309c --- /dev/null +++ b/sources/f2c/expr.c @@ -0,0 +1,2822 @@ +/**************************************************************** +Copyright 1990 by AT&T Bell Laboratories and Bellcore. + +Permission to use, copy, modify, and distribute this software +and its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the names of AT&T Bell Laboratories or +Bellcore or any of their entities not be used in advertising or +publicity pertaining to distribution of the software without +specific, written prior permission. + +AT&T and Bellcore disclaim all warranties with regard to this +software, including all implied warranties of merchantability +and fitness. In no event shall AT&T or Bellcore be liable for +any special, indirect or consequential damages or any damages +whatsoever resulting from loss of use, data or profits, whether +in an action of contract, negligence or other tortious action, +arising out of or in connection with the use or performance of +this software. +****************************************************************/ + +#include "defs.h" +#include "output.h" +#include "names.h" + +LOCAL void conspower(), consbinop(), zdiv(); +LOCAL expptr fold(), mkpower(), stfcall(); + +typedef struct { double dreal, dimag; } dcomplex; + +extern char dflttype[26]; + +/* little routines to create constant blocks */ + +Constp mkconst(t) +register int t; +{ + register Constp p; + + p = ALLOC(Constblock); + p->tag = TCONST; + p->vtype = t; + return(p); +} + + +/* mklogcon -- Make Logical Constant */ + +expptr mklogcon(l) +register int l; +{ + register Constp p; + + p = mkconst(TYLOGICAL); + p->Const.ci = l; + return( (expptr) p ); +} + + + +/* mkintcon -- Make Integer Constant */ + +expptr mkintcon(l) +ftnint l; +{ + register Constp p; + + p = mkconst(tyint); + p->Const.ci = l; +#ifdef MAXSHORT + if(l >= -MAXSHORT && l <= MAXSHORT) + p->vtype = TYSHORT; +#endif + return( (expptr) p ); +} + + + + +/* mkaddcon -- Make Address Constant, given integer value */ + +expptr mkaddcon(l) +register long l; +{ + register Constp p; + + p = mkconst(TYADDR); + p->Const.ci = l; + return( (expptr) p ); +} + + + +/* mkrealcon -- Make Real Constant. The type t is assumed + to be TYREAL or TYDREAL */ + +expptr mkrealcon(t, d) + register int t; + char *d; +{ + register Constp p; + + p = mkconst(t); + p->Const.cds[0] = cds(d,CNULL); + p->vstg = 1; + return( (expptr) p ); +} + + +/* mkbitcon -- Make bit constant. Reads the input string, which is + assumed to correctly specify a number in base 2^shift (where shift + is the input parameter). shift may not exceed 4, i.e. only binary, + quad, octal and hex bases may be input. Constants may not exceed 32 + bits, or whatever the size of (struct Constblock).ci may be. */ + +expptr mkbitcon(shift, leng, s) +int shift; +int leng; +char *s; +{ + register Constp p; + register long x; + + p = mkconst(TYLONG); + x = 0; + while(--leng >= 0) + if(*s != ' ') + x = (x << shift) | hextoi(*s++); + /* mwm wanted to change the type to short for short constants, + * but this is dangerous -- there is no syntax for long constants + * with small values. + */ + p->Const.ci = x; + return( (expptr) p ); +} + + + + + +/* mkstrcon -- Make string constant. Allocates storage and initializes + the memory for a copy of the input Fortran-string. */ + +expptr mkstrcon(l,v) +int l; +register char *v; +{ + register Constp p; + register char *s; + + p = mkconst(TYCHAR); + p->vleng = ICON(l); + p->Const.ccp = s = (char *) ckalloc(l+1); + p->Const.ccp1.blanks = 0; + while(--l >= 0) + *s++ = *v++; + *s = '\0'; + return( (expptr) p ); +} + + + +/* mkcxcon -- Make complex contsant. A complex number is a pair of + values, each of which may be integer, real or double. */ + +expptr mkcxcon(realp,imagp) +register expptr realp, imagp; +{ + int rtype, itype; + register Constp p; + expptr errnode(); + + rtype = realp->headblock.vtype; + itype = imagp->headblock.vtype; + + if( ISCONST(realp) && ISNUMERIC(rtype) && ISCONST(imagp) && ISNUMERIC(itype) ) + { + p = mkconst( (rtype==TYDREAL||itype==TYDREAL) + ? TYDCOMPLEX : TYCOMPLEX); + if (realp->constblock.vstg || imagp->constblock.vstg) { + p->vstg = 1; + p->Const.cds[0] = ISINT(rtype) + ? string_num("", realp->constblock.Const.ci) + : realp->constblock.vstg + ? realp->constblock.Const.cds[0] + : dtos(realp->constblock.Const.cd[0]); + p->Const.cds[1] = ISINT(itype) + ? string_num("", imagp->constblock.Const.ci) + : imagp->constblock.vstg + ? imagp->constblock.Const.cds[0] + : dtos(imagp->constblock.Const.cd[0]); + } + else { + p->Const.cd[0] = ISINT(rtype) + ? realp->constblock.Const.ci + : realp->constblock.Const.cd[0]; + p->Const.cd[1] = ISINT(itype) + ? imagp->constblock.Const.ci + : imagp->constblock.Const.cd[0]; + } + } + else + { + err("invalid complex constant"); + p = (Constp)errnode(); + } + + frexpr(realp); + frexpr(imagp); + return( (expptr) p ); +} + + +/* errnode -- Allocate a new error block */ + +expptr errnode() +{ + struct Errorblock *p; + p = ALLOC(Errorblock); + p->tag = TERROR; + p->vtype = TYERROR; + return( (expptr) p ); +} + + + + + +/* mkconv -- Make type conversion. Cast expression p into type t. + Note that casting to a character copies only the first sizeof(char) + bytes. */ + +expptr mkconv(t, p) +register int t; +register expptr p; +{ + register expptr q; + register int pt; + expptr opconv(); + + if(t==TYUNKNOWN || t==TYERROR) + badtype("mkconv", t); + pt = p->headblock.vtype; + +/* Casting to the same type is a no-op */ + + if(t == pt) + return(p); + +/* If we're casting a constant which is not in the literal table ... */ + + else if( ISCONST(p) && pt!=TYADDR) + { + if (ISINT(t) && ISINT(pt) || ISREAL(t) && ISREAL(pt)) { + /* avoid trouble with -i2 */ + p->headblock.vtype = t; + return p; + } + q = (expptr) mkconst(t); + consconv(t, &q->constblock, &p->constblock ); + frexpr(p); + } + else + q = opconv(p, t); + + if(t == TYCHAR) + q->constblock.vleng = ICON(1); + return(q); +} + + + +/* opconv -- Convert expression p to type t using the main + expression evaluator; returns an OPCONV expression, I think 14-jun-88 mwm */ + +expptr opconv(p, t) +expptr p; +int t; +{ + register expptr q; + + q = mkexpr(OPCONV, p, ENULL); + q->headblock.vtype = t; + return(q); +} + + + +/* addrof -- Create an ADDR expression operation */ + +expptr addrof(p) +expptr p; +{ + return( mkexpr(OPADDR, p, ENULL) ); +} + + + +/* cpexpr - Returns a new copy of input expression p */ + +tagptr cpexpr(p) +register tagptr p; +{ + register tagptr e; + int tag; + register chainp ep, pp; + tagptr cpblock(); + +/* This table depends on the ordering of the TY macros, e.g. TYUNKNOWN */ + + static int blksize[ ] = + { + 0, + sizeof(struct Nameblock), + sizeof(struct Constblock), + sizeof(struct Exprblock), + sizeof(struct Addrblock), + sizeof(struct Primblock), + sizeof(struct Listblock), + sizeof(struct Errorblock) + }; + + if(p == NULL) + return(NULL); + +/* TNAMEs are special, and don't get copied. Each name in the current + symbol table has a unique TNAME structure. */ + + if( (tag = p->tag) == TNAME) + return(p); + + e = cpblock(blksize[p->tag], (char *)p); + + switch(tag) + { + case TCONST: + if(e->constblock.vtype == TYCHAR) + { + e->constblock.Const.ccp = + copyn((int)e->constblock.vleng->constblock.Const.ci+1, + e->constblock.Const.ccp); + e->constblock.vleng = + (expptr) cpexpr(e->constblock.vleng); + } + case TERROR: + break; + + case TEXPR: + e->exprblock.leftp = (expptr) cpexpr(p->exprblock.leftp); + e->exprblock.rightp = (expptr) cpexpr(p->exprblock.rightp); + break; + + case TLIST: + if(pp = p->listblock.listp) + { + ep = e->listblock.listp = + mkchain((char *)cpexpr((tagptr)pp->datap), CHNULL); + for(pp = pp->nextp ; pp ; pp = pp->nextp) + ep = ep->nextp = + mkchain((char *)cpexpr((tagptr)pp->datap), + CHNULL); + } + break; + + case TADDR: + e->addrblock.vleng = (expptr) cpexpr(e->addrblock.vleng); + e->addrblock.memoffset = (expptr)cpexpr(e->addrblock.memoffset); + e->addrblock.istemp = NO; + break; + + case TPRIM: + e->primblock.argsp = (struct Listblock *) + cpexpr((expptr)e->primblock.argsp); + e->primblock.fcharp = (expptr) cpexpr(e->primblock.fcharp); + e->primblock.lcharp = (expptr) cpexpr(e->primblock.lcharp); + break; + + default: + badtag("cpexpr", tag); + } + + return(e); +} + +/* frexpr -- Free expression -- frees up memory used by expression p */ + +frexpr(p) +register tagptr p; +{ + register chainp q; + + if(p == NULL) + return; + + switch(p->tag) + { + case TCONST: + if( ISCHAR(p) ) + { + free( (charptr) (p->constblock.Const.ccp) ); + frexpr(p->constblock.vleng); + } + break; + + case TADDR: + if (p->addrblock.vtype > TYERROR) /* i/o block */ + break; + frexpr(p->addrblock.vleng); + frexpr(p->addrblock.memoffset); + break; + + case TERROR: + break; + +/* TNAME blocks don't get free'd - probably because they're pointed to in + the hash table. 14-Jun-88 -- mwm */ + + case TNAME: + return; + + case TPRIM: + frexpr((expptr)p->primblock.argsp); + frexpr(p->primblock.fcharp); + frexpr(p->primblock.lcharp); + break; + + case TEXPR: + frexpr(p->exprblock.leftp); + if(p->exprblock.rightp) + frexpr(p->exprblock.rightp); + break; + + case TLIST: + for(q = p->listblock.listp ; q ; q = q->nextp) + frexpr((tagptr)q->datap); + frchain( &(p->listblock.listp) ); + break; + + default: + badtag("frexpr", p->tag); + } + + free( (charptr) p ); +} + + void +wronginf(np) + Namep np; +{ + int c, k; + warn1("fixing wrong type inferred for %.65s", np->fvarname); + np->vinftype = 0; + c = letter(np->fvarname[0]); + if ((np->vtype = impltype[c]) == TYCHAR + && (k = implleng[c])) + np->vleng = ICON(k); + } + +/* fix up types in expression; replace subtrees and convert + names to address blocks */ + +expptr fixtype(p) +register tagptr p; +{ + + if(p == 0) + return(0); + + switch(p->tag) + { + case TCONST: + if(ONEOF(p->constblock.vtype,MSKINT|MSKLOGICAL|MSKADDR| + MSKREAL) ) + return( (expptr) p); + + return( (expptr) putconst((Constp)p) ); + + case TADDR: + p->addrblock.memoffset = fixtype(p->addrblock.memoffset); + return( (expptr) p); + + case TERROR: + return( (expptr) p); + + default: + badtag("fixtype", p->tag); + +/* This case means that fixexpr can't call fixtype with any expr, + only a subexpr of its parameter. */ + + case TEXPR: + return( fixexpr((Exprp)p) ); + + case TLIST: + return( (expptr) p ); + + case TPRIM: + if(p->primblock.argsp && p->primblock.namep->vclass!=CLVAR) + { + if(p->primblock.namep->vtype == TYSUBR) + { + err("function invocation of subroutine"); + return( errnode() ); + } + else { + if (p->primblock.namep->vinftype) + wronginf(p->primblock.namep); + return( mkfunct(p) ); + } + } + +/* The lack of args makes p a function name, substring reference + or variable name. */ + + else return( mklhs((struct Primblock *) p) ); + } +} + + + +/* special case tree transformations and cleanups of expression trees. + Parameter p should have a TEXPR tag at its root, else an error is + returned */ + +expptr fixexpr(p) +register Exprp p; +{ + expptr lp; + register expptr rp; + register expptr q; + int opcode, ltype, rtype, ptype, mtype; + + if( ISERROR(p) ) + return( (expptr) p ); + else if(p->tag != TEXPR) + badtag("fixexpr", p->tag); + opcode = p->opcode; + +/* First set the types of the left and right subexpressions */ + + lp = p->leftp = fixtype(p->leftp); + ltype = lp->headblock.vtype; + + if(opcode==OPASSIGN && lp->tag!=TADDR) + { + err("left side of assignment must be variable"); + frexpr((expptr)p); + return( errnode() ); + } + + if(p->rightp) + { + rp = p->rightp = fixtype(p->rightp); + rtype = rp->headblock.vtype; + } + else + { + rp = NULL; + rtype = 0; + } + + if(ltype==TYERROR || rtype==TYERROR) + { + frexpr((expptr)p); + return( errnode() ); + } + +/* Now work on the whole expression */ + + /* force folding if possible */ + + if( ISCONST(lp) && (rp==NULL || ISCONST(rp)) ) + { + q = mkexpr(opcode, lp, rp); + +/* mkexpr is expected to reduce constant expressions */ + + if( ISCONST(q) ) + return(q); + free( (charptr) q ); /* constants did not fold */ + } + + if( (ptype = cktype(opcode, ltype, rtype)) == TYERROR) + { + frexpr((expptr)p); + return( errnode() ); + } + + switch(opcode) + { + case OPCONCAT: + if(p->vleng == NULL) + p->vleng = mkexpr(OPPLUS, + cpexpr(lp->headblock.vleng), + cpexpr(rp->headblock.vleng) ); + break; + + case OPASSIGN: + if (rtype == TYREAL) + break; + case OPPLUSEQ: + case OPSTAREQ: + if(ltype == rtype) + break; + if( ! ISCONST(rp) && ISREAL(ltype) && ISREAL(rtype) ) + break; + if( ISCOMPLEX(ltype) || ISCOMPLEX(rtype) ) + break; + if( ONEOF(ltype, MSKADDR|MSKINT) && ONEOF(rtype, MSKADDR|MSKINT) + && typesize[ltype]>=typesize[rtype] ) + break; + +/* Cast the right hand side to match the type of the expression */ + + p->rightp = fixtype( mkconv(ptype, rp) ); + break; + + case OPSLASH: + if( ISCOMPLEX(rtype) ) + { + p = (Exprp) call2(ptype, + +/* Handle double precision complex variables */ + + ptype == TYCOMPLEX ? "c_div" : "z_div", + mkconv(ptype, lp), mkconv(ptype, rp) ); + break; + } + case OPPLUS: + case OPMINUS: + case OPSTAR: + case OPMOD: + if(ptype==TYDREAL && ( (ltype==TYREAL && ! ISCONST(lp) ) || + (rtype==TYREAL && ! ISCONST(rp) ) )) + break; + if( ISCOMPLEX(ptype) ) + break; + +/* Cast both sides of the expression to match the type of the whole + expression. */ + + if(ltype != ptype && (ltype < TYSHORT || ptype > TYDREAL)) + p->leftp = fixtype(mkconv(ptype,lp)); + if(rtype != ptype && (rtype < TYSHORT || ptype > TYDREAL)) + p->rightp = fixtype(mkconv(ptype,rp)); + break; + + case OPPOWER: + return( mkpower((expptr)p) ); + + case OPLT: + case OPLE: + case OPGT: + case OPGE: + case OPEQ: + case OPNE: + if(ltype == rtype) + break; + mtype = cktype(OPMINUS, ltype, rtype); + if(mtype==TYDREAL && ( (ltype==TYREAL && ! ISCONST(lp)) || + (rtype==TYREAL && ! ISCONST(rp)) )) + break; + if( ISCOMPLEX(mtype) ) + break; + if(ltype != mtype) + p->leftp = fixtype(mkconv(mtype,lp)); + if(rtype != mtype) + p->rightp = fixtype(mkconv(mtype,rp)); + break; + + case OPCONV: + ptype = cktype(OPCONV, p->vtype, ltype); + if(lp->tag==TEXPR && lp->exprblock.opcode==OPCOMMA) + { + lp->exprblock.rightp = + fixtype( mkconv(ptype, lp->exprblock.rightp) ); + free( (charptr) p ); + p = (Exprp) lp; + } + break; + + case OPADDR: + if(lp->tag==TEXPR && lp->exprblock.opcode==OPADDR) + Fatal("addr of addr"); + break; + + case OPCOMMA: + case OPQUEST: + case OPCOLON: + break; + + case OPMIN: + case OPMAX: + case OPMIN2: + case OPMAX2: + case OPDMIN: + case OPDMAX: + case OPABS: + case OPDABS: + ptype = p->vtype; + break; + + default: + break; + } + + p->vtype = ptype; + return((expptr) p); +} + + +/* fix an argument list, taking due care for special first level cases */ + +fixargs(doput, p0) +int doput; /* doput is true if constants need to be passed by reference */ +struct Listblock *p0; +{ + register chainp p; + register tagptr q, t; + register int qtag; + int nargs; + Addrp mkscalar(); + + nargs = 0; + if(p0) + for(p = p0->listp ; p ; p = p->nextp) + { + ++nargs; + q = (tagptr)p->datap; + qtag = q->tag; + if(qtag == TCONST) + { + if(q->constblock.vtype == TYSHORT) + q = (tagptr) mkconv(tyint, q); +/* leave constant arguments of intrinsics alone -- + * the expression might still simplify. + */ + +/* Call putconst() to store values in a constant table. Since even + constants must be passed by reference, this can optimize on the storage + required */ + + p->datap = doput ? (char *)putconst((Constp)q) + : (char *)q; + } + +/* Take a function name and turn it into an Addr. This only happens when + nothing else has figured out the function beforehand */ + + else if(qtag==TPRIM && q->primblock.argsp==0 && + q->primblock.namep->vclass==CLPROC && + q->primblock.namep->vprocclass != PTHISPROC) + p->datap = (char *)mkaddr(q->primblock.namep); + + else if(qtag==TPRIM && q->primblock.argsp==0 && + q->primblock.namep->vdim!=NULL) + p->datap = (char *)mkscalar(q->primblock.namep); + + else if(qtag==TPRIM && q->primblock.argsp==0 && + q->primblock.namep->vdovar && + (t = (tagptr) memversion(q->primblock.namep)) ) + p->datap = (char *)fixtype(t); + else + p->datap = (char *)fixtype(q); + } + return(nargs); +} + + + +/* mkscalar -- only called by fixargs above, and by some routines in + io.c */ + +Addrp mkscalar(np) +register Namep np; +{ + register Addrp ap; + + vardcl(np); + ap = mkaddr(np); + + /* The prolog causes array arguments to point to the + * (0,...,0) element, unless subscript checking is on. + */ + if( !checksubs && np->vstg==STGARG) + { + register struct Dimblock *dp; + dp = np->vdim; + frexpr(ap->memoffset); + ap->memoffset = mkexpr(OPSTAR, + (np->vtype==TYCHAR ? + cpexpr(np->vleng) : + (tagptr)ICON(typesize[np->vtype]) ), + cpexpr(dp->baseoffset) ); + } + return(ap); +} + + + static void +adjust_arginfo(np) /* adjust arginfo to omit the length arg for the + arg that we now know to be a character-valued + function */ + register Namep np; +{ + struct Entrypoint *ep; + register chainp args; + Argtypes *at; + + for(ep = entries; ep; ep = ep->entnextp) + for(args = ep->arglist; args; args = args->nextp) + if (np == (Namep)args->datap + && (at = ep->entryname->arginfo)) + --at->nargs; + } + + + +expptr mkfunct(p0) + expptr p0; +{ + register struct Primblock *p = (struct Primblock *)p0; + struct Entrypoint *ep; + Addrp ap; + Extsym *extp; + register Namep np; + register expptr q; + expptr intrcall(); + extern chainp new_procs; + int k, nargs; + int class; + + if(p->tag != TPRIM) + return( errnode() ); + + np = p->namep; + class = np->vclass; + + + if(class == CLUNKNOWN) + { + np->vclass = class = CLPROC; + if(np->vstg == STGUNKNOWN) + { + if(np->vtype!=TYSUBR && (k = intrfunct(np->fvarname)) + && (zflag || !(*(struct Intrpacked *)&k).f4 + || dcomplex_seen)) + { + np->vstg = STGINTR; + np->vardesc.varno = k; + np->vprocclass = PINTRINSIC; + } + else + { + extp = mkext(np->fvarname, + addunder(np->cvarname)); + extp->extstg = STGEXT; + np->vstg = STGEXT; + np->vardesc.varno = extp - extsymtab; + np->vprocclass = PEXTERNAL; + } + } + else if(np->vstg==STGARG) + { + if(np->vtype == TYCHAR) { + adjust_arginfo(np); + if (np->vpassed) { + char wbuf[160], *who; + who = np->fvarname; + sprintf(wbuf, "%s%s%s\n\t%s%s%s", + "Character-valued dummy procedure ", + who, " not declared EXTERNAL.", + "Code may be wrong for previous function calls having ", + who, " as a parameter."); + warn(wbuf); + } + } + np->vprocclass = PEXTERNAL; + } + } + + if(class != CLPROC) + fatali("invalid class code %d for function", class); + +/* F77 doesn't allow subscripting of function calls */ + + if(p->fcharp || p->lcharp) + { + err("no substring of function call"); + goto error; + } + impldcl(np); + np->vimpltype = 0; /* invoking as function ==> inferred type */ + np->vcalled = 1; + nargs = fixargs( np->vprocclass!=PINTRINSIC, p->argsp); + + switch(np->vprocclass) + { + case PEXTERNAL: + if(np->vtype == TYUNKNOWN) + { + dclerr("attempt to use untyped function", np); + np->vtype = dflttype[letter(np->fvarname[0])]; + } + ap = mkaddr(np); + if (!extsymtab[np->vardesc.varno].extseen) { + new_procs = mkchain((char *)np, new_procs); + extsymtab[np->vardesc.varno].extseen = 1; + } +call: + q = mkexpr(OPCALL, (expptr)ap, (expptr)p->argsp); + q->exprblock.vtype = np->vtype; + if(np->vleng) + q->exprblock.vleng = (expptr) cpexpr(np->vleng); + break; + + case PINTRINSIC: + q = intrcall(np, p->argsp, nargs); + break; + + case PSTFUNCT: + q = stfcall(np, p->argsp); + break; + + case PTHISPROC: + warn("recursive call"); + +/* entries is the list of multiple entry points */ + + for(ep = entries ; ep ; ep = ep->entnextp) + if(ep->enamep == np) + break; + if(ep == NULL) + Fatal("mkfunct: impossible recursion"); + + ap = builtin(np->vtype, ep->entryname->cextname, -2); + /* the negative last arg prevents adding */ + /* this name to the list of used builtins */ + goto call; + + default: + fatali("mkfunct: impossible vprocclass %d", + (int) (np->vprocclass) ); + } + free( (charptr) p ); + return(q); + +error: + frexpr((expptr)p); + return( errnode() ); +} + + + +LOCAL expptr stfcall(np, actlist) +Namep np; +struct Listblock *actlist; +{ + register chainp actuals; + int nargs; + chainp oactp, formals; + int type; + expptr q, rhs, ap; + Namep tnp; + register struct Rplblock *rp; + struct Rplblock *tlist; + + if(actlist) + { + actuals = actlist->listp; + free( (charptr) actlist); + } + else + actuals = NULL; + oactp = actuals; + + nargs = 0; + tlist = NULL; + if( (type = np->vtype) == TYUNKNOWN) + { + dclerr("attempt to use untyped statement function", np); + type = np->vtype = dflttype[letter(np->fvarname[0])]; + } + formals = (chainp) np->varxptr.vstfdesc->datap; + rhs = (expptr) (np->varxptr.vstfdesc->nextp); + + /* copy actual arguments into temporaries */ + while(actuals!=NULL && formals!=NULL) + { + rp = ALLOC(Rplblock); + rp->rplnp = tnp = (Namep) formals->datap; + ap = fixtype((tagptr)actuals->datap); + if(tnp->vtype==ap->headblock.vtype && tnp->vtype!=TYCHAR + && (ap->tag==TCONST || ap->tag==TADDR) ) + { + +/* If actuals are constants or variable names, no temporaries are required */ + rp->rplvp = (expptr) ap; + rp->rplxp = NULL; + rp->rpltag = ap->tag; + } + else { + rp->rplvp = (expptr) Mktemp(tnp->vtype, tnp->vleng); + rp -> rplxp = NULL; + putexpr ( mkexpr(OPASSIGN, cpexpr(rp->rplvp), ap)); + if((rp->rpltag = rp->rplvp->tag) == TERROR) + err("disagreement of argument types in statement function call"); + } + rp->rplnextp = tlist; + tlist = rp; + actuals = actuals->nextp; + formals = formals->nextp; + ++nargs; + } + + if(actuals!=NULL || formals!=NULL) + err("statement function definition and argument list differ"); + + /* + now push down names involved in formal argument list, then + evaluate rhs of statement function definition in this environment +*/ + + if(tlist) /* put tlist in front of the rpllist */ + { + for(rp = tlist; rp->rplnextp; rp = rp->rplnextp) + ; + rp->rplnextp = rpllist; + rpllist = tlist; + } + +/* So when the expression finally gets evaled, that evaluator must read + from the globl rpllist 14-jun-88 mwm */ + + q = (expptr) mkconv(type, fixtype(cpexpr(rhs)) ); + + /* now generate the tree ( t1=a1, (t2=a2,... , f))))) */ + while(--nargs >= 0) + { + if(rpllist->rplxp) + q = mkexpr(OPCOMMA, rpllist->rplxp, q); + rp = rpllist->rplnextp; + frexpr(rpllist->rplvp); + free((char *)rpllist); + rpllist = rp; + } + frchain( &oactp ); + return(q); +} + + +static int replaced; + +/* mkplace -- Figure out the proper storage class for the input name and + return an addrp with the appropriate stuff */ + +Addrp mkplace(np) +register Namep np; +{ + register Addrp s; + register struct Rplblock *rp; + int regn; + + /* is name on the replace list? */ + + for(rp = rpllist ; rp ; rp = rp->rplnextp) + { + if(np == rp->rplnp) + { + replaced = 1; + if(rp->rpltag == TNAME) + { + np = (Namep) (rp->rplvp); + break; + } + else return( (Addrp) cpexpr(rp->rplvp) ); + } + } + + /* is variable a DO index in a register ? */ + + if(np->vdovar && ( (regn = inregister(np)) >= 0) ) + if(np->vtype == TYERROR) + return((Addrp) errnode() ); + else + { + s = ALLOC(Addrblock); + s->tag = TADDR; + s->vstg = STGREG; + s->vtype = TYIREG; + s->memno = regn; + s->memoffset = ICON(0); + s -> uname_tag = UNAM_NAME; + s -> user.name = np; + return(s); + } + + vardcl(np); + return(mkaddr(np)); +} + + + static int doing_vleng; + +/* mklhs -- Compute the actual address of the given expression; account + for array subscripts, stack offset, and substring offsets. The f -> C + translator will need this only to worry about the subscript stuff */ + +expptr mklhs(p) +register struct Primblock *p; +{ + expptr suboffset(); + register Addrp s; + Namep np; + + if(p->tag != TPRIM) + return( (expptr) p ); + np = p->namep; + + replaced = 0; + s = mkplace(np); + if(s->tag!=TADDR || s->vstg==STGREG) + { + free( (charptr) p ); + return( (expptr) s ); + } + + /* compute the address modified by subscripts */ + + if (!replaced) + s->memoffset = mkexpr(OPPLUS, s->memoffset, suboffset(p) ); + frexpr((expptr)p->argsp); + p->argsp = NULL; + + /* now do substring part */ + + if(p->fcharp || p->lcharp) + { + if(np->vtype != TYCHAR) + errstr("substring of noncharacter %s", np->fvarname); + else { + if(p->lcharp == NULL) + p->lcharp = (expptr) cpexpr(s->vleng); + if(p->fcharp) { + doing_vleng = 1; + s->vleng = fixtype(mkexpr(OPMINUS, + p->lcharp, + mkexpr(OPMINUS, p->fcharp, ICON(1) ))); + doing_vleng = 0; + } + else { + frexpr(s->vleng); + s->vleng = p->lcharp; + } + } + } + + s->vleng = fixtype( s->vleng ); + s->memoffset = fixtype( s->memoffset ); + free( (charptr) p ); + return( (expptr) s ); +} + + + + + +/* deregister -- remove a register allocation from the list; assumes that + names are deregistered in stack order (LIFO order - Last In First Out) */ + +deregister(np) +Namep np; +{ + if(nregvar>0 && regnamep[nregvar-1]==np) + { + --nregvar; + } +} + + + + +/* memversion -- moves a DO index REGISTER into a memory location; other + objects are passed through untouched */ + +Addrp memversion(np) +register Namep np; +{ + register Addrp s; + + if(np->vdovar==NO || (inregister(np)<0) ) + return(NULL); + np->vdovar = NO; + s = mkplace(np); + np->vdovar = YES; + return(s); +} + + + +/* inregister -- looks for the input name in the global list regnamep */ + +inregister(np) +register Namep np; +{ + register int i; + + for(i = 0 ; i < nregvar ; ++i) + if(regnamep[i] == np) + return( regnum[i] ); + return(-1); +} + + + +/* suboffset -- Compute the offset from the start of the array, given the + subscripts as arguments */ + +expptr suboffset(p) +register struct Primblock *p; +{ + int n; + expptr si, size; + chainp cp; + expptr offp, prod; + expptr subcheck(); + struct Dimblock *dimp; + expptr sub[MAXDIM+1]; + register Namep np; + + np = p->namep; + offp = ICON(0); + n = 0; + if(p->argsp) + for(cp = p->argsp->listp ; cp ; cp = cp->nextp) + { + si = fixtype(cpexpr((tagptr)cp->datap)); + if (!ISINT(si->headblock.vtype)) { + NOEXT("non-integer subscript"); + si = mkconv(TYLONG, si); + } + sub[n++] = si; + if(n > maxdim) + { + erri("more than %d subscripts", maxdim); + break; + } + } + + dimp = np->vdim; + if(n>0 && dimp==NULL) + err("subscripts on scalar variable"); + else if(dimp && dimp->ndim!=n) + errstr("wrong number of subscripts on %s", np->fvarname); + else if(n > 0) + { + prod = sub[--n]; + while( --n >= 0) + prod = mkexpr(OPPLUS, sub[n], + mkexpr(OPSTAR, prod, cpexpr(dimp->dims[n].dimsize)) ); + if(checksubs || np->vstg!=STGARG) + prod = mkexpr(OPMINUS, prod, cpexpr(dimp->baseoffset)); + +/* Add in the run-time bounds check */ + + if(checksubs) + prod = subcheck(np, prod); + size = np->vtype == TYCHAR ? + (expptr) cpexpr(np->vleng) : ICON(typesize[np->vtype]); + prod = mkexpr(OPSTAR, prod, size); + offp = mkexpr(OPPLUS, offp, prod); + } + +/* Check for substring indicator */ + + if(p->fcharp && np->vtype==TYCHAR) + offp = mkexpr(OPPLUS, offp, mkexpr(OPMINUS, cpexpr(p->fcharp), ICON(1) )); + + return(offp); +} + + + + +expptr subcheck(np, p) +Namep np; +register expptr p; +{ + struct Dimblock *dimp; + expptr t, checkvar, checkcond, badcall; + + dimp = np->vdim; + if(dimp->nelt == NULL) + return(p); /* don't check arrays with * bounds */ + np->vlastdim = 0; + if( ISICON(p) ) + { + +/* check for negative (constant) offset */ + + if(p->constblock.Const.ci < 0) + goto badsub; + if( ISICON(dimp->nelt) ) + +/* see if constant offset exceeds the array declaration */ + + if(p->constblock.Const.ci < dimp->nelt->constblock.Const.ci) + return(p); + else + goto badsub; + } + +/* We know that the subscript offset p or dimp -> nelt is not a constant. + Now find a register to use for run-time bounds checking */ + + if(p->tag==TADDR && p->addrblock.vstg==STGREG) + { + checkvar = (expptr) cpexpr(p); + t = p; + } + else { + checkvar = (expptr) Mktemp(p->headblock.vtype, ENULL); + t = mkexpr(OPASSIGN, cpexpr(checkvar), p); + } + checkcond = mkexpr(OPLT, t, cpexpr(dimp->nelt) ); + if( ! ISICON(p) ) + checkcond = mkexpr(OPAND, checkcond, + mkexpr(OPLE, ICON(0), cpexpr(checkvar)) ); + +/* Construct the actual test */ + + badcall = call4(p->headblock.vtype, "s_rnge", + mkstrcon(strlen(np->fvarname), np->fvarname), + mkconv(TYLONG, cpexpr(checkvar)), + mkstrcon(strlen(procname), procname), + ICON(lineno) ); + badcall->exprblock.opcode = OPCCALL; + p = mkexpr(OPQUEST, checkcond, + mkexpr(OPCOLON, checkvar, badcall)); + + return(p); + +badsub: + frexpr(p); + errstr("subscript on variable %s out of range", np->fvarname); + return ( ICON(0) ); +} + + + + +Addrp mkaddr(p) +register Namep p; +{ + Extsym *extp; + register Addrp t; + Addrp intraddr(); + int k; + + switch( p->vstg) + { + case STGAUTO: + if(p->vclass == CLPROC && p->vprocclass == PTHISPROC) + return (Addrp) cpexpr((expptr)xretslot[p->vtype]); + goto other; + + case STGUNKNOWN: + if(p->vclass != CLPROC) + break; /* Error */ + extp = mkext(p->fvarname, addunder(p->cvarname)); + extp->extstg = STGEXT; + p->vstg = STGEXT; + p->vardesc.varno = extp - extsymtab; + p->vprocclass = PEXTERNAL; + if ((extp->exproto || infertypes) + && (p->vtype == TYUNKNOWN || p->vimpltype) + && (k = extp->extype)) + inferdcl(p, k); + + + case STGCOMMON: + case STGEXT: + case STGBSS: + case STGINIT: + case STGEQUIV: + case STGARG: + case STGLENG: + other: + t = ALLOC(Addrblock); + t->tag = TADDR; + + t->vclass = p->vclass; + t->vtype = p->vtype; + t->vstg = p->vstg; + t->memno = p->vardesc.varno; + t->memoffset = ICON(p->voffset); + if (p->vdim) + t->isarray = 1; + if(p->vleng) + { + t->vleng = (expptr) cpexpr(p->vleng); + if( ISICON(t->vleng) ) + t->varleng = t->vleng->constblock.Const.ci; + } + +/* Keep the original name around for the C code generation */ + + t -> uname_tag = UNAM_NAME; + t -> user.name = p; + return(t); + + case STGINTR: + + return ( intraddr (p)); + } + badstg("mkaddr", p->vstg); + /* NOT REACHED */ return 0; +} + + + + +/* mkarg -- create storage for a new parameter. This is called when a + function returns a string (for the return value, which is the first + parameter), or when a variable-length string is passed to a function. */ + +Addrp mkarg(type, argno) +int type, argno; +{ + register Addrp p; + + p = ALLOC(Addrblock); + p->tag = TADDR; + p->vtype = type; + p->vclass = CLVAR; + +/* TYLENG is the type of the field holding the length of a character string */ + + p->vstg = (type==TYLENG ? STGLENG : STGARG); + p->memno = argno; + return(p); +} + + + + +/* mkprim -- Create a PRIM (primary/primitive) block consisting of a + Nameblock (or Paramblock), arguments (actual params or array + subscripts) and substring bounds. Requires that v have lots of + extra (uninitialized) storage, since it could be a paramblock or + nameblock */ + +expptr mkprim(v0, args, substr) + Namep v0; + struct Listblock *args; + chainp substr; +{ + typedef union { + struct Paramblock paramblock; + struct Nameblock nameblock; + struct Headblock headblock; + } *Primu; + register Primu v = (Primu)v0; + register struct Primblock *p; + + if(v->headblock.vclass == CLPARAM) + { + +/* v is to be a Paramblock */ + + if(args || substr) + { + errstr("no qualifiers on parameter name %s", + v->paramblock.fvarname); + frexpr((expptr)args); + if(substr) + { + frexpr((tagptr)substr->datap); + frexpr((tagptr)substr->nextp->datap); + frchain(&substr); + } + frexpr((expptr)v); + return( errnode() ); + } + return( (expptr) cpexpr(v->paramblock.paramval) ); + } + + p = ALLOC(Primblock); + p->tag = TPRIM; + p->vtype = v->nameblock.vtype; + +/* v is to be a Nameblock */ + + p->namep = (Namep) v; + p->argsp = args; + if(substr) + { + p->fcharp = (expptr) substr->datap; + p->lcharp = (expptr) substr->nextp->datap; + frchain(&substr); + } + return( (expptr) p); +} + + + +/* vardcl -- attempt to fill out the Name template for variable v. + This function is called on identifiers known to be variables or + recursive references to the same function */ + +vardcl(v) +register Namep v; +{ + struct Dimblock *t; + expptr neltp; + extern int doing_stmtfcn; + + if(v->vclass == CLUNKNOWN) + v->vclass = CLVAR; + if(v->vdcldone) + return; + if(v->vclass == CLNAMELIST) + return; + + if(v->vtype == TYUNKNOWN) + impldcl(v); + else if(v->vclass!=CLVAR && v->vprocclass!=PTHISPROC) + { + dclerr("used as variable", v); + return; + } + if(v->vstg==STGUNKNOWN) { + if (doing_stmtfcn) { + /* neither declare this variable if its only use */ + /* is in defining a stmt function, nor complain */ + /* that it is never used */ + v->vimpldovar = 1; + return; + } + v->vstg = implstg[ letter(v->fvarname[0]) ]; + v->vimplstg = 1; + } + +/* Compute the actual storage location, i.e. offsets from base addresses, + possibly the stack pointer */ + + switch(v->vstg) + { + case STGBSS: + v->vardesc.varno = ++lastvarno; + break; + case STGAUTO: + if(v->vclass==CLPROC && v->vprocclass==PTHISPROC) + break; + if(t = v->vdim) + if( (neltp = t->nelt) && ISCONST(neltp) ) ; + else + dclerr("adjustable automatic array", v); + break; + + default: + break; + } + v->vdcldone = YES; +} + + + +/* Set the implicit type declaration of parameter p based on its first + letter */ + +impldcl(p) +register Namep p; +{ + register int k; + int type; + ftnint leng; + + if(p->vdcldone || (p->vclass==CLPROC && p->vprocclass==PINTRINSIC) ) + return; + if(p->vtype == TYUNKNOWN) + { + k = letter(p->fvarname[0]); + type = impltype[ k ]; + leng = implleng[ k ]; + if(type == TYUNKNOWN) + { + if(p->vclass == CLPROC) + return; + dclerr("attempt to use undefined variable", p); + type = dflttype[k]; + leng = 0; + } + settype(p, type, leng); + p->vimpltype = 1; + } +} + + void +inferdcl(np,type) + Namep np; + int type; +{ + int k = impltype[letter(np->fvarname[0])]; + if (k != type) { + np->vinftype = 1; + np->vtype = type; + frexpr(np->vleng); + np->vleng = 0; + } + np->vimpltype = 0; + np->vinfproc = 1; + } + + +#define ICONEQ(z, c) (ISICON(z) && z->constblock.Const.ci==c) +#define COMMUTE { e = lp; lp = rp; rp = e; } + + + +/* mkexpr -- Make expression, and simplify constant subcomponents (tree + order is not preserved). Assumes that lp is nonempty, and uses + fold() to simplify adjacent constants */ + +expptr mkexpr(opcode, lp, rp) +int opcode; +register expptr lp, rp; +{ + register expptr e, e1; + int etype; + int ltype, rtype; + int ltag, rtag; + long L; + + ltype = lp->headblock.vtype; + ltag = lp->tag; + if(rp && opcode!=OPCALL && opcode!=OPCCALL) + { + rtype = rp->headblock.vtype; + rtag = rp->tag; + } + else rtype = 0; + + etype = cktype(opcode, ltype, rtype); + if(etype == TYERROR) + goto error; + + switch(opcode) + { + /* check for multiplication by 0 and 1 and addition to 0 */ + + case OPSTAR: + if( ISCONST(lp) ) + COMMUTE + + if( ISICON(rp) ) + { + if(rp->constblock.Const.ci == 0) + goto retright; + goto mulop; + } + break; + + case OPSLASH: + case OPMOD: + if( ICONEQ(rp, 0) ) + { + err("attempted division by zero"); + rp = ICON(1); + break; + } + if(opcode == OPMOD) + break; + +/* Handle multiplying or dividing by 1, -1 */ + +mulop: + if( ISICON(rp) ) + { + if(rp->constblock.Const.ci == 1) + goto retleft; + + if(rp->constblock.Const.ci == -1) + { + frexpr(rp); + return( mkexpr(OPNEG, lp, ENULL) ); + } + } + +/* Group all constants together. In particular, + + (x * CONST1) * CONST2 ==> x * (CONST1 * CONST2) + (x * CONST1) / CONST2 ==> x * (CONST1 / CONST2) +*/ + + if (lp->tag != TEXPR || !lp->exprblock.rightp + || !ISICON(lp->exprblock.rightp)) + break; + + if (lp->exprblock.opcode == OPLSHIFT) { + L = 1 << lp->exprblock.rightp->constblock.Const.ci; + if (opcode == OPSTAR || ISICON(rp) && + !(L % rp->constblock.Const.ci)) { + lp->exprblock.opcode = OPSTAR; + lp->exprblock.rightp->constblock.Const.ci = L; + } + } + + if (lp->exprblock.opcode == OPSTAR) { + if(opcode == OPSTAR) + e = mkexpr(OPSTAR, lp->exprblock.rightp, rp); + else if(ISICON(rp) && + (lp->exprblock.rightp->constblock.Const.ci % + rp->constblock.Const.ci) == 0) + e = mkexpr(OPSLASH, lp->exprblock.rightp, rp); + else break; + + e1 = lp->exprblock.leftp; + free( (charptr) lp ); + return( mkexpr(OPSTAR, e1, e) ); + } + break; + + + case OPPLUS: + if( ISCONST(lp) ) + COMMUTE + goto addop; + + case OPMINUS: + if( ICONEQ(lp, 0) ) + { + frexpr(lp); + return( mkexpr(OPNEG, rp, ENULL) ); + } + + if( ISCONST(rp) && is_negatable((Constp)rp)) + { + opcode = OPPLUS; + consnegop((Constp)rp); + } + +/* Group constants in an addition expression (also subtraction, since the + subtracted value was negated above). In particular, + + (x + CONST1) + CONST2 ==> x + (CONST1 + CONST2) +*/ + +addop: + if( ISICON(rp) ) + { + if(rp->constblock.Const.ci == 0) + goto retleft; + if( ISPLUSOP(lp) && ISICON(lp->exprblock.rightp) ) + { + e = mkexpr(OPPLUS, lp->exprblock.rightp, rp); + e1 = lp->exprblock.leftp; + free( (charptr) lp ); + return( mkexpr(OPPLUS, e1, e) ); + } + } + if (opcode == OPMINUS && (ISINT(etype) || doing_vleng)) { + /* check for (i [+const]) - (i [+const]) */ + if (lp->tag == TPRIM) + e = lp; + else if (lp->tag == TEXPR && lp->exprblock.opcode == OPPLUS + && lp->exprblock.rightp->tag == TCONST) { + e = lp->exprblock.leftp; + if (e->tag != TPRIM) + break; + } + else + break; + if (e->primblock.argsp) + break; + if (rp->tag == TPRIM) + e1 = rp; + else if (rp->tag == TEXPR && rp->exprblock.opcode == OPPLUS + && rp->exprblock.rightp->tag == TCONST) { + e1 = rp->exprblock.leftp; + if (e1->tag != TPRIM) + break; + } + else + break; + if (e->primblock.namep != e1->primblock.namep + || e1->primblock.argsp) + break; + L = e == lp ? 0 : lp->exprblock.rightp->constblock.Const.ci; + if (e1 != rp) + L -= rp->exprblock.rightp->constblock.Const.ci; + frexpr(lp); + frexpr(rp); + return ICON(L); + } + + break; + + + case OPPOWER: + break; + +/* Eliminate outermost double negations */ + + case OPNEG: + case OPNEG1: + if(ltag==TEXPR && lp->exprblock.opcode==OPNEG) + { + e = lp->exprblock.leftp; + free( (charptr) lp ); + return(e); + } + break; + +/* Eliminate outermost double NOTs */ + + case OPNOT: + if(ltag==TEXPR && lp->exprblock.opcode==OPNOT) + { + e = lp->exprblock.leftp; + free( (charptr) lp ); + return(e); + } + break; + + case OPCALL: + case OPCCALL: + etype = ltype; + if(rp!=NULL && rp->listblock.listp==NULL) + { + free( (charptr) rp ); + rp = NULL; + } + break; + + case OPAND: + case OPOR: + if( ISCONST(lp) ) + COMMUTE + + if( ISCONST(rp) ) + { + if(rp->constblock.Const.ci == 0) + if(opcode == OPOR) + goto retleft; + else + goto retright; + else if(opcode == OPOR) + goto retright; + else + goto retleft; + } + case OPEQV: + case OPNEQV: + + case OPBITAND: + case OPBITOR: + case OPBITXOR: + case OPBITNOT: + case OPLSHIFT: + case OPRSHIFT: + + case OPLT: + case OPGT: + case OPLE: + case OPGE: + case OPEQ: + case OPNE: + + case OPCONCAT: + break; + case OPMIN: + case OPMAX: + case OPMIN2: + case OPMAX2: + case OPDMIN: + case OPDMAX: + + case OPASSIGN: + case OPASSIGNI: + case OPPLUSEQ: + case OPSTAREQ: + case OPMINUSEQ: + case OPSLASHEQ: + case OPMODEQ: + case OPLSHIFTEQ: + case OPRSHIFTEQ: + case OPBITANDEQ: + case OPBITXOREQ: + case OPBITOREQ: + + case OPCONV: + case OPADDR: + case OPWHATSIN: + + case OPCOMMA: + case OPCOMMA_ARG: + case OPQUEST: + case OPCOLON: + case OPDOT: + case OPARROW: + case OPIDENTITY: + case OPCHARCAST: + case OPABS: + case OPDABS: + break; + + default: + badop("mkexpr", opcode); + } + + e = (expptr) ALLOC(Exprblock); + e->exprblock.tag = TEXPR; + e->exprblock.opcode = opcode; + e->exprblock.vtype = etype; + e->exprblock.leftp = lp; + e->exprblock.rightp = rp; + if(ltag==TCONST && (rp==0 || rtag==TCONST) ) + e = fold(e); + return(e); + +retleft: + frexpr(rp); + return(lp); + +retright: + frexpr(lp); + return(rp); + +error: + frexpr(lp); + if(rp && opcode!=OPCALL && opcode!=OPCCALL) + frexpr(rp); + return( errnode() ); +} + +#define ERR(s) { errs = s; goto error; } + +/* cktype -- Check and return the type of the expression */ + +cktype(op, lt, rt) +register int op, lt, rt; +{ + char *errs; + + if(lt==TYERROR || rt==TYERROR) + goto error1; + + if(lt==TYUNKNOWN) + return(TYUNKNOWN); + if(rt==TYUNKNOWN) + +/* If not unary operation, return UNKNOWN */ + + if(!is_unary_op (op) && op != OPCALL && op != OPCCALL) + return(TYUNKNOWN); + + switch(op) + { + case OPPLUS: + case OPMINUS: + case OPSTAR: + case OPSLASH: + case OPPOWER: + case OPMOD: + if( ISNUMERIC(lt) && ISNUMERIC(rt) ) + return( maxtype(lt, rt) ); + ERR("nonarithmetic operand of arithmetic operator") + + case OPNEG: + case OPNEG1: + if( ISNUMERIC(lt) ) + return(lt); + ERR("nonarithmetic operand of negation") + + case OPNOT: + if(lt == TYLOGICAL) + return(TYLOGICAL); + ERR("NOT of nonlogical") + + case OPAND: + case OPOR: + case OPEQV: + case OPNEQV: + if(lt==TYLOGICAL && rt==TYLOGICAL) + return(TYLOGICAL); + ERR("nonlogical operand of logical operator") + + case OPLT: + case OPGT: + case OPLE: + case OPGE: + case OPEQ: + case OPNE: + if(lt==TYCHAR || rt==TYCHAR || lt==TYLOGICAL || rt==TYLOGICAL) + { + if(lt != rt) + ERR("illegal comparison") + } + + else if( ISCOMPLEX(lt) || ISCOMPLEX(rt) ) + { + if(op!=OPEQ && op!=OPNE) + ERR("order comparison of complex data") + } + + else if( ! ISNUMERIC(lt) || ! ISNUMERIC(rt) ) + ERR("comparison of nonarithmetic data") + return(TYLOGICAL); + + case OPCONCAT: + if(lt==TYCHAR && rt==TYCHAR) + return(TYCHAR); + ERR("concatenation of nonchar data") + + case OPCALL: + case OPCCALL: + case OPIDENTITY: + return(lt); + + case OPADDR: + case OPCHARCAST: + return(TYADDR); + + case OPCONV: + if(rt == 0) + return(0); + if(lt==TYCHAR && ISINT(rt) ) + return(TYCHAR); + case OPASSIGN: + case OPASSIGNI: + case OPMINUSEQ: + case OPPLUSEQ: + case OPSTAREQ: + case OPSLASHEQ: + case OPMODEQ: + case OPLSHIFTEQ: + case OPRSHIFTEQ: + case OPBITANDEQ: + case OPBITXOREQ: + case OPBITOREQ: + if( ISINT(lt) && rt==TYCHAR) + return(lt); + if(lt==TYCHAR || rt==TYCHAR || lt==TYLOGICAL || rt==TYLOGICAL) + if((op!=OPASSIGN && op != OPPLUSEQ && op != OPMINUSEQ) + || (lt!=rt)) + { + ERR("impossible conversion") + } + return(lt); + + case OPMIN: + case OPMAX: + case OPDMIN: + case OPDMAX: + case OPMIN2: + case OPMAX2: + case OPBITOR: + case OPBITAND: + case OPBITXOR: + case OPBITNOT: + case OPLSHIFT: + case OPRSHIFT: + case OPWHATSIN: + case OPABS: + case OPDABS: + return(lt); + + case OPCOMMA: + case OPCOMMA_ARG: + case OPQUEST: + case OPCOLON: /* Only checks the rightmost type because + of C language definition (rightmost + comma-expr is the value of the expr) */ + return(rt); + + case OPDOT: + case OPARROW: + return (lt); + break; + default: + badop("cktype", op); + } +error: + err(errs); +error1: + return(TYERROR); +} + +/* fold -- simplifies constant expressions; it assumes that e -> leftp and + e -> rightp are TCONST or NULL */ + + LOCAL expptr +fold(e) + register expptr e; +{ + Constp p; + register expptr lp, rp; + int etype, mtype, ltype, rtype, opcode; + int i, ll, lr; + char *q, *s; + struct Constblock lcon, rcon; + long L; + double d; + + opcode = e->exprblock.opcode; + etype = e->exprblock.vtype; + + lp = e->exprblock.leftp; + ltype = lp->headblock.vtype; + rp = e->exprblock.rightp; + + if(rp == 0) + switch(opcode) + { + case OPNOT: + lp->constblock.Const.ci = ! lp->constblock.Const.ci; + retlp: + e->exprblock.leftp = 0; + frexpr(e); + return(lp); + + case OPBITNOT: + lp->constblock.Const.ci = ~ lp->constblock.Const.ci; + goto retlp; + + case OPNEG: + case OPNEG1: + consnegop((Constp)lp); + goto retlp; + + case OPCONV: + case OPADDR: + return(e); + + case OPABS: + case OPDABS: + switch(ltype) { + case TYSHORT: + case TYLONG: + if ((L = lp->constblock.Const.ci) < 0) + lp->constblock.Const.ci = -L; + goto retlp; + case TYREAL: + case TYDREAL: + if (lp->constblock.vstg) { + s = lp->constblock.Const.cds[0]; + if (*s == '-') + lp->constblock.Const.cds[0] = s + 1; + goto retlp; + } + if ((d = lp->constblock.Const.cd[0]) < 0.) + lp->constblock.Const.cd[0] = -d; + case TYCOMPLEX: + case TYDCOMPLEX: + return e; /* lazy way out */ + } + default: + badop("fold", opcode); + } + + rtype = rp->headblock.vtype; + + p = ALLOC(Constblock); + p->tag = TCONST; + p->vtype = etype; + p->vleng = e->exprblock.vleng; + + switch(opcode) + { + case OPCOMMA: + case OPCOMMA_ARG: + case OPQUEST: + case OPCOLON: + return(e); + + case OPAND: + p->Const.ci = lp->constblock.Const.ci && + rp->constblock.Const.ci; + break; + + case OPOR: + p->Const.ci = lp->constblock.Const.ci || + rp->constblock.Const.ci; + break; + + case OPEQV: + p->Const.ci = lp->constblock.Const.ci == + rp->constblock.Const.ci; + break; + + case OPNEQV: + p->Const.ci = lp->constblock.Const.ci != + rp->constblock.Const.ci; + break; + + case OPBITAND: + p->Const.ci = lp->constblock.Const.ci & + rp->constblock.Const.ci; + break; + + case OPBITOR: + p->Const.ci = lp->constblock.Const.ci | + rp->constblock.Const.ci; + break; + + case OPBITXOR: + p->Const.ci = lp->constblock.Const.ci ^ + rp->constblock.Const.ci; + break; + + case OPLSHIFT: + p->Const.ci = lp->constblock.Const.ci << + rp->constblock.Const.ci; + break; + + case OPRSHIFT: + p->Const.ci = lp->constblock.Const.ci >> + rp->constblock.Const.ci; + break; + + case OPCONCAT: + ll = lp->constblock.vleng->constblock.Const.ci; + lr = rp->constblock.vleng->constblock.Const.ci; + p->Const.ccp = q = (char *) ckalloc(ll+lr); + p->Const.ccp1.blanks = 0; + p->vleng = ICON(ll+lr); + s = lp->constblock.Const.ccp; + for(i = 0 ; i < ll ; ++i) + *q++ = *s++; + s = rp->constblock.Const.ccp; + for(i = 0; i < lr; ++i) + *q++ = *s++; + break; + + + case OPPOWER: + if( ! ISINT(rtype) ) + return(e); + conspower(p, (Constp)lp, rp->constblock.Const.ci); + break; + + + default: + if(ltype == TYCHAR) + { + lcon.Const.ci = cmpstr(lp->constblock.Const.ccp, + rp->constblock.Const.ccp, + lp->constblock.vleng->constblock.Const.ci, + rp->constblock.vleng->constblock.Const.ci); + rcon.Const.ci = 0; + mtype = tyint; + } + else { + mtype = maxtype(ltype, rtype); + consconv(mtype, &lcon, &lp->constblock); + consconv(mtype, &rcon, &rp->constblock); + } + consbinop(opcode, mtype, p, &lcon, &rcon); + break; + } + + frexpr(e); + return( (expptr) p ); +} + + + +/* assign constant l = r , doing coercion */ + +consconv(lt, lc, rc) + int lt; + register Constp lc, rc; +{ + int rt = rc->vtype; + register union Constant *lv = &lc->Const, *rv = &rc->Const; + + lc->vtype = lt; + if (ONEOF(lt, MSKREAL|MSKCOMPLEX) && ONEOF(rt, MSKREAL|MSKCOMPLEX)) { + memcpy((char *)lv, (char *)rv, sizeof(union Constant)); + lc->vstg = rc->vstg; + if (ISCOMPLEX(lt) && ISREAL(rt)) { + if (rc->vstg) + lv->cds[1] = cds("0",CNULL); + else + lv->cd[1] = 0.; + } + return; + } + lc->vstg = 0; + + switch(lt) + { + +/* Casting to character means just copying the first sizeof (character) + bytes into a new 1 character string. This is weird. */ + + case TYCHAR: + *(lv->ccp = (char *) ckalloc(1)) = rv->ci; + lv->ccp1.blanks = 0; + break; + + case TYSHORT: + case TYLONG: + if(rt == TYCHAR) + lv->ci = rv->ccp[0]; + else if( ISINT(rt) ) + lv->ci = rv->ci; + else lv->ci = rc->vstg ? atof(rv->cds[0]) : rv->cd[0]; + + break; + + case TYCOMPLEX: + case TYDCOMPLEX: + lv->cd[1] = 0.; + lv->cd[0] = rv->ci; + break; + + case TYREAL: + case TYDREAL: + lv->cd[0] = rv->ci; + break; + + case TYLOGICAL: + lv->ci = rv->ci; + break; + } +} + + + +/* Negate constant value -- changes the input node's value */ + +consnegop(p) +register Constp p; +{ + register char *s; + + if (p->vstg) { + if (ISCOMPLEX(p->vtype)) { + s = p->Const.cds[1]; + p->Const.cds[1] = *s == '-' ? s+1 + : *s == '0' ? s : s-1; + } + s = p->Const.cds[0]; + p->Const.cds[0] = *s == '-' ? s+1 + : *s == '0' ? s : s-1; + return; + } + switch(p->vtype) + { + case TYSHORT: + case TYLONG: + p->Const.ci = - p->Const.ci; + break; + + case TYCOMPLEX: + case TYDCOMPLEX: + p->Const.cd[1] = - p->Const.cd[1]; + /* fall through and do the real parts */ + case TYREAL: + case TYDREAL: + p->Const.cd[0] = - p->Const.cd[0]; + break; + default: + badtype("consnegop", p->vtype); + } +} + + + +/* conspower -- Expand out an exponentiation */ + + LOCAL void +conspower(p, ap, n) + Constp p, ap; + ftnint n; +{ + register union Constant *powp = &p->Const; + register int type; + struct Constblock x, x0; + + if (n == 1) { + memcpy((char *)powp, (char *)&ap->Const, sizeof(ap->Const)); + return; + } + + switch(type = ap->vtype) /* pow = 1 */ + { + case TYSHORT: + case TYLONG: + powp->ci = 1; + break; + case TYCOMPLEX: + case TYDCOMPLEX: + powp->cd[1] = 0; + case TYREAL: + case TYDREAL: + powp->cd[0] = 1; + break; + default: + badtype("conspower", type); + } + + if(n == 0) + return; + switch(type) /* x0 = ap */ + { + case TYSHORT: + case TYLONG: + x0.Const.ci = ap->Const.ci; + break; + case TYCOMPLEX: + case TYDCOMPLEX: + x0.Const.cd[1] = + ap->vstg ? atof(ap->Const.cds[1]) : ap->Const.cd[1]; + case TYREAL: + case TYDREAL: + x0.Const.cd[0] = + ap->vstg ? atof(ap->Const.cds[0]) : ap->Const.cd[0]; + break; + } + x0.vtype = type; + x0.vstg = 0; + if(n < 0) + { + if( ISINT(type) ) + { + err("integer ** negative number"); + return; + } + else if (!x0.Const.cd[0] + && (!ISCOMPLEX(type) || !x0.Const.cd[1])) { + err("0.0 ** negative number"); + return; + } + n = -n; + consbinop(OPSLASH, type, &x, p, &x0); + } + else + consbinop(OPSTAR, type, &x, p, &x0); + + for( ; ; ) + { + if(n & 01) + consbinop(OPSTAR, type, p, p, &x); + if(n >>= 1) + consbinop(OPSTAR, type, &x, &x, &x); + else + break; + } +} + + + +/* do constant operation cp = a op b -- assumes that ap and bp have data + matching the input type */ + + + LOCAL void +consbinop(opcode, type, cpp, app, bpp) + int opcode, type; + Constp cpp, app, bpp; +{ + register union Constant *ap = &app->Const, + *bp = &bpp->Const, + *cp = &cpp->Const; + int k; + double ad[2], bd[2], temp; + + cpp->vstg = 0; + + if (ONEOF(type, MSKREAL|MSKCOMPLEX)) { + ad[0] = app->vstg ? atof(ap->cds[0]) : ap->cd[0]; + bd[0] = bpp->vstg ? atof(bp->cds[0]) : bp->cd[0]; + if (ISCOMPLEX(type)) { + ad[1] = app->vstg ? atof(ap->cds[1]) : ap->cd[1]; + bd[1] = bpp->vstg ? atof(bp->cds[1]) : bp->cd[1]; + } + } + switch(opcode) + { + case OPPLUS: + switch(type) + { + case TYSHORT: + case TYLONG: + cp->ci = ap->ci + bp->ci; + break; + case TYCOMPLEX: + case TYDCOMPLEX: + cp->cd[1] = ad[1] + bd[1]; + case TYREAL: + case TYDREAL: + cp->cd[0] = ad[0] + bd[0]; + break; + } + break; + + case OPMINUS: + switch(type) + { + case TYSHORT: + case TYLONG: + cp->ci = ap->ci - bp->ci; + break; + case TYCOMPLEX: + case TYDCOMPLEX: + cp->cd[1] = ad[1] - bd[1]; + case TYREAL: + case TYDREAL: + cp->cd[0] = ad[0] - bd[0]; + break; + } + break; + + case OPSTAR: + switch(type) + { + case TYSHORT: + case TYLONG: + cp->ci = ap->ci * bp->ci; + break; + case TYREAL: + case TYDREAL: + cp->cd[0] = ad[0] * bd[0]; + break; + case TYCOMPLEX: + case TYDCOMPLEX: + temp = ad[0] * bd[0] - ad[1] * bd[1] ; + cp->cd[1] = ad[0] * bd[1] + ad[1] * bd[0] ; + cp->cd[0] = temp; + break; + } + break; + case OPSLASH: + switch(type) + { + case TYSHORT: + case TYLONG: + cp->ci = ap->ci / bp->ci; + break; + case TYREAL: + case TYDREAL: + cp->cd[0] = ad[0] / bd[0]; + break; + case TYCOMPLEX: + case TYDCOMPLEX: + zdiv((dcomplex*)cp, (dcomplex*)ad, (dcomplex*)bd); + break; + } + break; + + case OPMOD: + if( ISINT(type) ) + { + cp->ci = ap->ci % bp->ci; + break; + } + else + Fatal("inline mod of noninteger"); + + case OPMIN2: + case OPDMIN: + switch(type) + { + case TYSHORT: + case TYLONG: + cp->ci = ap->ci <= bp->ci ? ap->ci : bp->ci; + break; + case TYREAL: + case TYDREAL: + cp->cd[0] = ad[0] <= bd[0] ? ad[0] : bd[0]; + break; + default: + Fatal("inline min of exected type"); + } + break; + + case OPMAX2: + case OPDMAX: + switch(type) + { + case TYSHORT: + case TYLONG: + cp->ci = ap->ci >= bp->ci ? ap->ci : bp->ci; + break; + case TYREAL: + case TYDREAL: + cp->cd[0] = ad[0] >= bd[0] ? ad[0] : bd[0]; + break; + default: + Fatal("inline max of exected type"); + } + break; + + default: /* relational ops */ + switch(type) + { + case TYSHORT: + case TYLONG: + if(ap->ci < bp->ci) + k = -1; + else if(ap->ci == bp->ci) + k = 0; + else k = 1; + break; + case TYREAL: + case TYDREAL: + if(ad[0] < bd[0]) + k = -1; + else if(ad[0] == bd[0]) + k = 0; + else k = 1; + break; + case TYCOMPLEX: + case TYDCOMPLEX: + if(ad[0] == bd[0] && + ad[1] == bd[1] ) + k = 0; + else k = 1; + break; + } + + switch(opcode) + { + case OPEQ: + cp->ci = (k == 0); + break; + case OPNE: + cp->ci = (k != 0); + break; + case OPGT: + cp->ci = (k == 1); + break; + case OPLT: + cp->ci = (k == -1); + break; + case OPGE: + cp->ci = (k >= 0); + break; + case OPLE: + cp->ci = (k <= 0); + break; + } + break; + } +} + + + +/* conssgn - returns the sign of a Fortran constant */ + +conssgn(p) +register expptr p; +{ + register char *s; + + if( ! ISCONST(p) ) + Fatal( "sgn(nonconstant)" ); + + switch(p->headblock.vtype) + { + case TYSHORT: + case TYLONG: + if(p->constblock.Const.ci > 0) return(1); + if(p->constblock.Const.ci < 0) return(-1); + return(0); + + case TYREAL: + case TYDREAL: + if (p->constblock.vstg) { + s = p->constblock.Const.cds[0]; + if (*s == '-') + return -1; + if (*s == '0') + return 0; + return 1; + } + if(p->constblock.Const.cd[0] > 0) return(1); + if(p->constblock.Const.cd[0] < 0) return(-1); + return(0); + + +/* The sign of a complex number is 0 iff the number is 0 + 0i, else it's 1 */ + + case TYCOMPLEX: + case TYDCOMPLEX: + if (p->constblock.vstg) + return *p->constblock.Const.cds[0] != '0' + && *p->constblock.Const.cds[1] != '0'; + return(p->constblock.Const.cd[0]!=0 || p->constblock.Const.cd[1]!=0); + + default: + badtype( "conssgn", p->constblock.vtype); + } + /* NOT REACHED */ return 0; +} + +char *powint[ ] = { + "pow_ii", "pow_ri", "pow_di", "pow_ci", "pow_zi" }; + +LOCAL expptr mkpower(p) +register expptr p; +{ + register expptr q, lp, rp; + int ltype, rtype, mtype, tyi; + + lp = p->exprblock.leftp; + rp = p->exprblock.rightp; + ltype = lp->headblock.vtype; + rtype = rp->headblock.vtype; + + if(ISICON(rp)) + { + if(rp->constblock.Const.ci == 0) + { + frexpr(p); + if( ISINT(ltype) ) + return( ICON(1) ); + else if (ISREAL (ltype)) + return mkconv (ltype, ICON (1)); + else + return( (expptr) putconst((Constp) + mkconv(ltype, ICON(1))) ); + } + if(rp->constblock.Const.ci < 0) + { + if( ISINT(ltype) ) + { + frexpr(p); + err("integer**negative"); + return( errnode() ); + } + rp->constblock.Const.ci = - rp->constblock.Const.ci; + p->exprblock.leftp = lp + = fixexpr((Exprp)mkexpr(OPSLASH, ICON(1), lp)); + } + if(rp->constblock.Const.ci == 1) + { + frexpr(rp); + free( (charptr) p ); + return(lp); + } + + if( ONEOF(ltype, MSKINT|MSKREAL) && !doin_setbound) { + p->exprblock.vtype = ltype; + return(p); + } + } + if( ISINT(rtype) ) + { + if(ltype==TYSHORT && rtype==TYSHORT && (!ISCONST(lp) || tyint==TYSHORT) ) + q = call2(TYSHORT, "pow_hh", lp, rp); + else { + if(ltype == TYSHORT) + { + ltype = TYLONG; + lp = mkconv(TYLONG,lp); + } + rp = mkconv(TYLONG,rp); + if (ISCONST(rp)) { + tyi = tyint; + tyint = TYLONG; + rp = (expptr)putconst((Constp)rp); + tyint = tyi; + } + q = call2(ltype, powint[ltype-TYLONG], lp, rp); + } + } + else if( ISREAL( (mtype = maxtype(ltype,rtype)) )) { + extern int callk_kludge; + callk_kludge = TYDREAL; + q = call2(mtype, "pow_dd", mkconv(TYDREAL,lp), mkconv(TYDREAL,rp)); + callk_kludge = 0; + } + else { + q = call2(TYDCOMPLEX, "pow_zz", + mkconv(TYDCOMPLEX,lp), mkconv(TYDCOMPLEX,rp)); + if(mtype == TYCOMPLEX) + q = mkconv(TYCOMPLEX, q); + } + free( (charptr) p ); + return(q); +} + + +/* Complex Division. Same code as in Runtime Library +*/ + + + LOCAL void +zdiv(c, a, b) + register dcomplex *a, *b, *c; +{ + double ratio, den; + double abr, abi; + + if( (abr = b->dreal) < 0.) + abr = - abr; + if( (abi = b->dimag) < 0.) + abi = - abi; + if( abr <= abi ) + { + if(abi == 0) + Fatal("complex division by zero"); + ratio = b->dreal / b->dimag ; + den = b->dimag * (1 + ratio*ratio); + c->dreal = (a->dreal*ratio + a->dimag) / den; + c->dimag = (a->dimag*ratio - a->dreal) / den; + } + + else + { + ratio = b->dimag / b->dreal ; + den = b->dreal * (1 + ratio*ratio); + c->dreal = (a->dreal + a->dimag*ratio) / den; + c->dimag = (a->dimag - a->dreal*ratio) / den; + } +} diff --git a/sources/f2c/f2c.1 b/sources/f2c/f2c.1 new file mode 100644 index 0000000..a427302 --- /dev/null +++ b/sources/f2c/f2c.1 @@ -0,0 +1,161 @@ + + F2C(1) F2C(1) + + NAME + f2c - Convert Fortran 77 to C or C++ + + SYNOPSIS + f2c [ option ... ] file ... + + DESCRIPTION + F2c converts Fortran 77 source code in files with names end- + ing in `.f' or `.F' to C (or C++) source files in the + current directory, with `.c' substituted for the final `.f' + or `.F'. If no Fortran files are named, f2c reads Fortran + from standard input and writes C on standard output. File + names that end with `.p' or `.P' are taken to be prototype + files, as produced by option `-P', and are read first. + + The following options have the same meaning as in f77(1). + + -C Compile code to check that subscripts are within + declared array bounds. + + -I2 Render INTEGER and LOGICAL as short, INTEGER*4 as long + int. Assume the default libF77 and libI77: allow only + INTEGER*4 (and no LOGICAL) variables in INQUIREs. + Option `-I4' confirms the default rendering of INTEGER + as long int. + + -onetrip + Compile DO loops that are performed at least once if + reached. (Fortran 77 DO loops are not performed at all + if the upper limit is smaller than the lower limit.) + + -U Honor the case of variable and external names. Fortran + keywords must be in lower case. + + -u Make the default type of a variable `undefined' rather + than using the default Fortran rules. + + -w Suppress all warning messages. If the option is + `-w66', only Fortran 66 compatibility warnings are + suppressed. + + The following options are peculiar to f2c. + + -A Produce ANSI C. Default is old-style C. + + -a Make local variables automatic rather than static + unless they appear in a DATA, EQUIVALENCE, NAMELIST, or + SAVE statement. + + -C++ Output C++ code. + + -c Include original Fortran source as comments. + + Page 1 Tenth Edition (printed 1/28/90) + + F2C(1) F2C(1) + + -E Declare uninitialized COMMON to be Extern (overridably + defined in f2c.h as extern). + + -ec Place uninitialized COMMON blocks in separate files: + COMMON /ABC/ appears in file abc_com.c. Option `-e1c' + bundles the separate files into the output file, with + comments that give an unbundling sed(1) script. + + -ext Complain about f77(1) extensions. + + -g Include original Fortran line numbers as comments. + + -i2 Similar to -I2, but assume a modified libF77 and libI77 + (compiled with -Df2c_i2), so INTEGER and LOGICAL vari- + ables may be assigned by INQUIRE. + + -P Write a file.P of ANSI (or C++) prototypes for pro- + cedures defined in each input file.f or file.F. When + reading Fortran from standard input, write prototypes + at the beginning of standard output. Implies -A unless + option `-C++' is present. Option -Ps implies -P , and + gives exit status 4 if rerunning f2c may change proto- + types or declarations. + + -p Supply preprocessor definitions to make common-block + members look like local variables. + + -R Do not promote REAL functions and operations to DOUBLE + PRECISION. Option `-!R' confirms the default, which + imitates f77. + + -r8 Promote REAL to DOUBLE PRECISION, COMPLEX to DOUBLE + COMPLEX. + + -Tdir + Put temporary files in directory dir. + + -w8 Suppress warnings when COMMON or EQUIVALENCE forces + odd-word alignment of doubles. + + -Wn Assume n characters/word (default 4) when initializing + numeric variables with character data. + + -z Do not implicitly recognize DOUBLE COMPLEX. + + -!c Inhibit C output, but produce -P output. + + -!I Reject include statements. + + -!it Don't infer types of untyped EXTERNAL procedures from + use as parameters to previously defined or prototyped + procedures. + + Page 2 Tenth Edition (printed 1/28/90) + + F2C(1) F2C(1) + + -!P Do not attempt to infer ANSI or C++ prototypes from + usage. + + The resulting C invokes the support routines of f77; object + code should be loaded by f77 or with ld(1) or cc(1) options + -lF77 -lI77 -lm. Calling conventions are those of f77: see + the reference below. + + FILES + file.[fF] + input file + + *.c output file + + /usr/include/f2c.h + header file + + /usr/lib/libF77.a + intrinsic function library + + /usr/lib/libI77.a + Fortran I/O library + + /lib/libc.a + C library, see section 3 + + SEE ALSO + S. I. Feldman and P. J. Weinberger, `A Portable Fortran 77 + Compiler', UNIX Time Sharing System Programmer's Manual, + Tenth Edition, Volume 2, AT&T Bell Laboratories, 1990. + + DIAGNOSTICS + The diagnostics produced by f2c are intended to be self- + explanatory. + + BUGS + Floating-point constant expressions are simplified in the + floating-point arithmetic of the machine running f2c, so + they are typically accurate to at most 16 or 17 decimal + places. + Untypable EXTERNAL functions are declared int. + + Page 3 Tenth Edition (printed 1/28/90) + diff --git a/sources/f2c/f2c.h b/sources/f2c/f2c.h new file mode 100644 index 0000000..23b2df7 --- /dev/null +++ b/sources/f2c/f2c.h @@ -0,0 +1,209 @@ +/* f2c.h -- Standard Fortran to C header file */ + +/** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." + + - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ + +#ifndef F2C_INCLUDE +#define F2C_INCLUDE + +typedef long int integer; +typedef char *address; +typedef short int shortint; +typedef float real; +typedef double doublereal; +typedef struct { real r, i; } complex; +typedef struct { doublereal r, i; } doublecomplex; +typedef long int logical; +typedef short int shortlogical; + +#define TRUE_ (1) +#define FALSE_ (0) + +/* Extern is for use with -E */ +#ifndef Extern +#define Extern extern +#endif + +/* I/O stuff */ + +#ifdef f2c_i2 +/* for -i2 */ +typedef short flag; +typedef short ftnlen; +typedef short ftnint; +#else +typedef long flag; +typedef long ftnlen; +typedef long ftnint; +#endif + +/*external read, write*/ +typedef struct +{ flag cierr; + ftnint ciunit; + flag ciend; + char *cifmt; + ftnint cirec; +} cilist; + +/*internal read, write*/ +typedef struct +{ flag icierr; + char *iciunit; + flag iciend; + char *icifmt; + ftnint icirlen; + ftnint icirnum; +} icilist; + +/*open*/ +typedef struct +{ flag oerr; + ftnint ounit; + char *ofnm; + ftnlen ofnmlen; + char *osta; + char *oacc; + char *ofm; + ftnint orl; + char *oblnk; +} olist; + +/*close*/ +typedef struct +{ flag cerr; + ftnint cunit; + char *csta; +} cllist; + +/*rewind, backspace, endfile*/ +typedef struct +{ flag aerr; + ftnint aunit; +} alist; + +/* inquire */ +typedef struct +{ flag inerr; + ftnint inunit; + char *infile; + ftnlen infilen; + ftnint *inex; /*parameters in standard's order*/ + ftnint *inopen; + ftnint *innum; + ftnint *innamed; + char *inname; + ftnlen innamlen; + char *inacc; + ftnlen inacclen; + char *inseq; + ftnlen inseqlen; + char *indir; + ftnlen indirlen; + char *infmt; + ftnlen infmtlen; + char *inform; + ftnint informlen; + char *inunf; + ftnlen inunflen; + ftnint *inrecl; + ftnint *innrec; + char *inblank; + ftnlen inblanklen; +} inlist; + +#define VOID void + +union Multitype { /* for multiple entry points */ + shortint h; + integer i; + real r; + doublereal d; + complex c; + doublecomplex z; + }; + +typedef union Multitype Multitype; + +typedef long Long; + +struct Vardesc { /* for Namelist */ + char *name; + char *addr; + Long *dims; + int type; + }; +typedef struct Vardesc Vardesc; + +struct Namelist { + char *name; + Vardesc **vars; + int nvars; + }; +typedef struct Namelist Namelist; + +#define abs(x) ((x) >= 0 ? (x) : -(x)) +#define dabs(x) (doublereal)abs(x) +#define min(a,b) ((a) <= (b) ? (a) : (b)) +#define max(a,b) ((a) >= (b) ? (a) : (b)) +#define dmin(a,b) (doublereal)min(a,b) +#define dmax(a,b) (doublereal)max(a,b) + +/* procedure parameter types for -A and -C++ */ + +#define F2C_proc_par_types 1 +#ifdef __cplusplus +typedef int /* Unknown procedure type */ (*U_fp)(...); +typedef shortint (*J_fp)(...); +typedef integer (*I_fp)(...); +typedef real (*R_fp)(...); +typedef doublereal (*D_fp)(...), (*E_fp)(...); +typedef /* Complex */ VOID (*C_fp)(...); +typedef /* Double Complex */ VOID (*Z_fp)(...); +typedef logical (*L_fp)(...); +typedef shortlogical (*K_fp)(...); +typedef /* Character */ VOID (*H_fp)(...); +typedef /* Subroutine */ int (*S_fp)(...); +#else +typedef int /* Unknown procedure type */ (*U_fp)(); +typedef shortint (*J_fp)(); +typedef integer (*I_fp)(); +typedef real (*R_fp)(); +typedef doublereal (*D_fp)(), (*E_fp)(); +typedef /* Complex */ VOID (*C_fp)(); +typedef /* Double Complex */ VOID (*Z_fp)(); +typedef logical (*L_fp)(); +typedef shortlogical (*K_fp)(); +typedef /* Character */ VOID (*H_fp)(); +typedef /* Subroutine */ int (*S_fp)(); +#endif +/* E_fp is for real functions when -R is not specified */ +typedef VOID C_f; /* complex function */ +typedef VOID H_f; /* character function */ +typedef VOID Z_f; /* double complex function */ +typedef doublereal E_f; /* real function with -R not specified */ + +/* undef any lower-case symbols that your C compiler predefines, e.g.: */ + +#ifndef Skip_f2c_Undefs +#undef cray +#undef gcos +#undef mc68010 +#undef mc68020 +#undef mips +#undef pdp11 +#undef sgi +#undef sparc +#undef sun +#undef sun2 +#undef sun3 +#undef sun4 +#undef u370 +#undef u3b +#undef u3b2 +#undef u3b5 +#undef unix +#undef vax +#endif +#endif diff --git a/sources/f2c/format.c b/sources/f2c/format.c new file mode 100644 index 0000000..51bb7cf --- /dev/null +++ b/sources/f2c/format.c @@ -0,0 +1,2094 @@ +/**************************************************************** +Copyright 1990 by AT&T Bell Laboratories and Bellcore. + +Permission to use, copy, modify, and distribute this software +and its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the names of AT&T Bell Laboratories or +Bellcore or any of their entities not be used in advertising or +publicity pertaining to distribution of the software without +specific, written prior permission. + +AT&T and Bellcore disclaim all warranties with regard to this +software, including all implied warranties of merchantability +and fitness. In no event shall AT&T or Bellcore be liable for +any special, indirect or consequential damages or any damages +whatsoever resulting from loss of use, data or profits, whether +in an action of contract, negligence or other tortious action, +arising out of or in connection with the use or performance of +this software. +****************************************************************/ + +/* Format.c -- this file takes an intermediate file (generated by pass 1 + of the translator) and some state information about the contents of that + file, and generates C program text. */ + +#include "defs.h" +#include "p1defs.h" +#include "format.h" +#include "output.h" +#include "names.h" +#include "iob.h" + +int c_output_line_length = DEF_C_LINE_LENGTH; + +int last_was_label; /* Boolean used to generate semicolons + when a label terminates a block */ +static char this_proc_name[52]; /* Name of the current procedure. This is + probably too simplistic to handle + multiple entry points */ + +static int p1getd(), p1gets(), p1getf(), get_p1_token(); +static int p1get_const(), p1getn(); +static expptr do_format(), do_p1_name_pointer(), do_p1_const(); +static expptr do_p1_expr(), do_p1_ident(), do_p1_charp(), do_p1_extern(); +static expptr do_p1_head(), do_p1_list(), do_p1_literal(); +static void do_p1_label(), do_p1_asgoto(), do_p1_goto(); +static void do_p1_if(), do_p1_else(), do_p1_elif(), do_p1_endif(); +static void do_p1_endelse(), do_p1_subr_ret(), do_p1_comp_goto(); +static void do_p1_for(), do_p1_end_for(), do_p1_fortran(); +static void do_p1_1while(), do_p1_2while(); +static void do_p1_comment(), do_p1_set_line(); +static expptr do_p1_addr(), expand_structure_refs(); +static void proto(); +void list_arg_types(); +chainp length_comp(); +void listargs(); +extern chainp assigned_fmts; +static long old_lineno; +static char filename[P1_FILENAME_MAX]; +extern int gflag; +extern char *parens; + +#define is_end_token(x) ((x) == P1_ENDIF || (x) == P1_ENDELSE || (x) == P1_ENDFOR) + +start_formatting () +{ + FILE *infile; + static int wrote_one = 0; + extern int usedefsforcommon; + extern char *p1_file, *p1_bakfile; + + this_proc_name[0] = '\0'; + last_was_label = 0; + old_lineno = lineno; + wh_next = wh_first; + + (void) fclose (pass1_file); + if ((infile = fopen (p1_file, binread)) == NULL) + Fatal("start_formatting: couldn't open the intermediate file\n"); + + if (wrote_one) + nice_printf (c_file, "\n"); + + while (!feof (infile)) { + expptr this_expr; + + this_expr = do_format (infile, c_file); + if (this_expr) { + out_and_free_statement (c_file, this_expr); + } /* if this_expr */ + } /* while !feof infile */ + + (void) fclose (infile); + + if (last_was_label) + nice_printf (c_file, ";\n"); + + prev_tab (c_file); + if (this_proc_name[0]) + nice_printf (c_file, "} /* %s */\n", this_proc_name); + + +/* Write the #undefs for common variable reference */ + + if (usedefsforcommon) { + Extsym *ext; + int did_one = 0; + + for (ext = extsymtab; ext < nextext; ext++) + if (ext -> extstg == STGCOMMON && ext -> used_here) { + ext -> used_here = 0; + if (!did_one) + nice_printf (c_file, "\n"); + wr_abbrevs(c_file, 0, ext->extp); + did_one = 1; + ext -> extp = CHNULL; + } /* if */ + + if (did_one) + nice_printf (c_file, "\n"); + } /* if usedefsforcommon */ + + other_undefs(c_file); + + wrote_one = 1; + +/* For debugging only */ + + if (debugflag && (pass1_file = fopen (p1_bakfile, binwrite))) + if (infile = fopen (p1_file, binread)) { + ffilecopy (infile, pass1_file); + fclose (infile); + fclose (pass1_file); + } /* if infile */ + +/* End of "debugging only" */ + + if ((pass1_file = fopen (p1_file, binwrite)) == NULL) + err ("start_formatting: couldn't reopen the pass1 file"); + +} /* start_formatting */ + + +static expptr expand_structure_refs (e) +expptr e; +{ + if (e == ENULL) + return ENULL; + else if (e -> tag == TADDR) + if (e -> addrblock.Field == NULL) + return e; + else { + Constp mkconst (); + Constp p = mkconst(TYCHAR); + + p -> vleng = ICON (strlen (e -> addrblock.Field)); + p -> Const.ccp = e -> addrblock.Field; + p -> Const.ccp1.blanks = 0; + e -> addrblock.Field = NULL; + return mkexpr(OPDOT, e, (expptr)p); + } /* else */ + else if (e -> tag != TEXPR) + return e; + else { + e -> exprblock.leftp = expand_structure_refs (e -> exprblock.leftp); + e -> exprblock.rightp = expand_structure_refs (e -> exprblock.rightp); + return e; + } /* else */ +} /* expand_structure_refs */ + + +/* do_format -- takes an input stream (a file in pass1 format) and writes + the appropriate C code to outfile when possible. When reading an + expression, the expression tree is returned instead. */ + +static expptr do_format (infile, outfile) +FILE *infile, *outfile; +{ + int gsave, token_type, was_c_token; + expptr retval = ENULL; + + token_type = get_p1_token (infile); + if (is_end_token (token_type) && last_was_label) { + nice_printf (outfile, ";"); + last_was_label = 0; + } + + was_c_token = 1; + switch (token_type) { + case P1_COMMENT: + do_p1_comment (infile, outfile); + was_c_token = 0; + break; + case P1_SET_LINE: + do_p1_set_line (infile); + was_c_token = 0; + break; + case P1_FILENAME: + p1gets(infile, filename, P1_FILENAME_MAX); + was_c_token = 0; + break; + case P1_NAME_POINTER: + retval = do_p1_name_pointer (infile); + break; + case P1_CONST: + retval = do_p1_const (infile); + break; + case P1_EXPR: + retval = do_p1_expr (infile, outfile); + break; + case P1_IDENT: + retval = do_p1_ident(infile); + break; + case P1_CHARP: + retval = do_p1_charp(infile); + break; + case P1_EXTERN: + retval = do_p1_extern (infile); + break; + case P1_HEAD: + gsave = gflag; + gflag = 0; + retval = do_p1_head (infile, outfile); + gflag = gsave; + break; + case P1_LIST: + retval = do_p1_list (infile, outfile); + break; + case P1_LITERAL: + retval = do_p1_literal (infile); + break; + case P1_LABEL: + do_p1_label (infile, outfile); + /* last_was_label = 1; -- now set in do_p1_label */ + was_c_token = 0; + break; + case P1_ASGOTO: + do_p1_asgoto (infile, outfile); + break; + case P1_GOTO: + do_p1_goto (infile, outfile); + break; + case P1_IF: + do_p1_if (infile, outfile); + break; + case P1_ELSE: + do_p1_else (outfile); + break; + case P1_ELIF: + do_p1_elif (infile, outfile); + break; + case P1_ENDIF: + do_p1_endif (outfile); + break; + case P1_ENDELSE: + do_p1_endelse (outfile); + break; + case P1_ADDR: + retval = do_p1_addr (infile, outfile); + break; + case P1_SUBR_RET: + do_p1_subr_ret (infile, outfile); + break; + case P1_COMP_GOTO: + do_p1_comp_goto (infile, outfile); + break; + case P1_FOR: + do_p1_for (infile, outfile); + break; + case P1_ENDFOR: + do_p1_end_for (outfile); + break; + case P1_WHILE1START: + do_p1_1while(outfile); + break; + case P1_WHILE2START: + do_p1_2while(infile, outfile); + break; + case P1_PROCODE: + procode(outfile); + break; + case P1_FORTRAN: + do_p1_fortran(infile, outfile); + /* no break; */ + case P1_EOF: + was_c_token = 0; + break; + case P1_UNKNOWN: + Fatal("do_format: Unknown token type in intermediate file"); + break; + default: + Fatal("do_format: Bad token type in intermediate file"); + break; + } /* switch */ + + if (was_c_token) + last_was_label = 0; + return retval; +} /* do_format */ + + + static void +do_p1_comment (infile, outfile) +FILE *infile, *outfile; +{ + extern int c_output_line_length, in_comment; + + char storage[COMMENT_BUFFER_SIZE + 1]; + int length; + + if (!p1gets(infile, storage, COMMENT_BUFFER_SIZE + 1)) + return; + + length = strlen (storage); + + in_comment = 1; + if (length > c_output_line_length - 6) + margin_printf (outfile, "/*%s*/\n", storage); + else + margin_printf (outfile, length ? "/* %s */\n" : "\n", storage); + in_comment = 0; +} /* do_p1_comment */ + + static void +do_p1_set_line (infile) +FILE *infile; +{ + int status; + long new_line_number = -1; + + status = p1getd (infile, &new_line_number); + + if (status == EOF) + err ("do_p1_set_line: Missing line number at end of file\n"); + else if (status == 0 || new_line_number == -1) + errl("do_p1_set_line: Illegal line number in intermediate file: %ld\n", + new_line_number); + else { + lineno = new_line_number; + if (gflag) + fprintf(c_file, "/*# %ld \"%s\"*/\n", lineno, filename); + } +} /* do_p1_set_line */ + + +static expptr do_p1_name_pointer (infile) +FILE *infile; +{ + Namep namep = (Namep) NULL; + int status; + + status = p1getd (infile, (long *) &namep); + + if (status == EOF) + err ("do_p1_name_pointer: Missing pointer at end of file\n"); + else if (status == 0 || namep == (Namep) NULL) + erri ("do_p1_name_pointer: Illegal name pointer in p1 file: '%x'\n", + (int) namep); + + return (expptr) namep; +} /* do_p1_name_pointer */ + + + +static expptr do_p1_const (infile) +FILE *infile; +{ + struct Constblock *c = (struct Constblock *) NULL; + long type = -1; + int status; + + status = p1getd (infile, &type); + + if (status == EOF) + err ("do_p1_const: Missing constant type at end of file\n"); + else if (status == 0) + errl("do_p1_const: Illegal constant type in p1 file: %ld\n", type); + else { + status = p1get_const (infile, (int)type, &c); + + if (status == EOF) { + err ("do_p1_const: Missing constant value at end of file\n"); + c = (struct Constblock *) NULL; + } else if (status == 0) { + err ("do_p1_const: Illegal constant value in p1 file\n"); + c = (struct Constblock *) NULL; + } /* else */ + } /* else */ + return (expptr) c; +} /* do_p1_const */ + + +static expptr do_p1_literal (infile) +FILE *infile; +{ + int status; + long memno; + Addrp addrp; + + status = p1getd (infile, &memno); + + if (status == EOF) + err ("do_p1_literal: Missing memno at end of file"); + else if (status == 0) + err ("do_p1_literal: Missing memno in p1 file"); + else { + struct Literal *litp, *lastlit; + extern struct Literal litpool[]; + extern int nliterals; + + addrp = ALLOC (Addrblock); + addrp -> tag = TADDR; + addrp -> vtype = TYUNKNOWN; + addrp -> Field = NULL; + + lastlit = litpool + nliterals; + for (litp = litpool; litp < lastlit; litp++) + if (litp -> litnum == memno) { + addrp -> vtype = litp -> littype; + *((union Constant *) &(addrp -> user)) = + *((union Constant *) &(litp -> litval)); + break; + } /* if litp -> litnum == memno */ + + addrp -> memno = memno; + addrp -> vstg = STGMEMNO; + addrp -> uname_tag = UNAM_CONST; + } /* else */ + + return (expptr) addrp; +} /* do_p1_literal */ + + +static void do_p1_label (infile, outfile) +FILE *infile, *outfile; +{ + int status; + ftnint stateno; + char *user_label (); + struct Labelblock *L; + char *fmt; + + status = p1getd (infile, &stateno); + + if (status == EOF) + err ("do_p1_label: Missing label at end of file"); + else if (status == 0) + err ("do_p1_label: Missing label in p1 file "); + else if (stateno < 0) { /* entry */ + margin_printf(outfile, "\n%s:\n", user_label(stateno)); + last_was_label = 1; + } + else { + L = labeltab + stateno; + if (L->labused) { + fmt = "%s:\n"; + last_was_label = 1; + } + else + fmt = "/* %s: */\n"; + margin_printf(outfile, fmt, user_label(L->stateno)); + } /* else */ +} /* do_p1_label */ + + + +static void do_p1_asgoto (infile, outfile) +FILE *infile, *outfile; +{ + expptr expr; + + expr = do_format (infile, outfile); + out_asgoto (outfile, expr); + +} /* do_p1_asgoto */ + + +static void do_p1_goto (infile, outfile) +FILE *infile, *outfile; +{ + int status; + long stateno; + char *user_label (); + + status = p1getd (infile, &stateno); + + if (status == EOF) + err ("do_p1_goto: Missing goto label at end of file"); + else if (status == 0) + err ("do_p1_goto: Missing goto label in p1 file"); + else { + nice_printf (outfile, "goto %s;\n", user_label (stateno)); + } /* else */ +} /* do_p1_goto */ + + +static void do_p1_if (infile, outfile) +FILE *infile, *outfile; +{ + expptr cond; + + do { + cond = do_format (infile, outfile); + } while (cond == ENULL); + + out_if (outfile, cond); +} /* do_p1_if */ + + +static void do_p1_else (outfile) +FILE *outfile; +{ + out_else (outfile); +} /* do_p1_else */ + + +static void do_p1_elif (infile, outfile) +FILE *infile, *outfile; +{ + expptr cond; + + do { + cond = do_format (infile, outfile); + } while (cond == ENULL); + + elif_out (outfile, cond); +} /* do_p1_elif */ + +static void do_p1_endif (outfile) +FILE *outfile; +{ + endif_out (outfile); +} /* do_p1_endif */ + + +static void do_p1_endelse (outfile) +FILE *outfile; +{ + end_else_out (outfile); +} /* do_p1_endelse */ + + +static expptr do_p1_addr (infile, outfile) +FILE *infile, *outfile; +{ + Addrp addrp = (Addrp) NULL; + int status; + + status = p1getn (infile, sizeof (struct Addrblock), (char **) &addrp); + + if (status == EOF) + err ("do_p1_addr: Missing Addrp at end of file"); + else if (status == 0) + err ("do_p1_addr: Missing Addrp in p1 file"); + else if (addrp == (Addrp) NULL) + err ("do_p1_addr: Null addrp in p1 file"); + else if (addrp -> tag != TADDR) + erri ("do_p1_addr: bad tag in p1 file '%d'", addrp -> tag); + else { + addrp -> vleng = do_format (infile, outfile); + addrp -> memoffset = do_format (infile, outfile); + } + + return (expptr) addrp; +} /* do_p1_addr */ + + + +static void do_p1_subr_ret (infile, outfile) +FILE *infile, *outfile; +{ + expptr retval; + + nice_printf (outfile, "return "); + retval = do_format (infile, outfile); + if (!multitype) + if (retval) + expr_out (outfile, retval); + + nice_printf (outfile, ";\n"); +} /* do_p1_subr_ret */ + + + +static void do_p1_comp_goto (infile, outfile) +FILE *infile, *outfile; +{ + expptr index; + expptr labels; + + index = do_format (infile, outfile); + + if (index == ENULL) { + err ("do_p1_comp_goto: no expression for computed goto"); + return; + } /* if index == ENULL */ + + labels = do_format (infile, outfile); + + if (labels && labels -> tag != TLIST) + erri ("do_p1_comp_goto: expected list, got tag '%d'", labels -> tag); + else + compgoto_out (outfile, index, labels); +} /* do_p1_comp_goto */ + + +static void do_p1_for (infile, outfile) +FILE *infile, *outfile; +{ + expptr init, test, inc; + + init = do_format (infile, outfile); + test = do_format (infile, outfile); + inc = do_format (infile, outfile); + + out_for (outfile, init, test, inc); +} /* do_p1_for */ + +static void do_p1_end_for (outfile) +FILE *outfile; +{ + out_end_for (outfile); +} /* do_p1_end_for */ + + + static void +do_p1_fortran(infile, outfile) + FILE *infile, *outfile; +{ + char buf[P1_STMTBUFSIZE]; + if (!p1gets(infile, buf, P1_STMTBUFSIZE)) + return; + /* bypass nice_printf nonsense */ + fprintf(outfile, "/*< %s >*/\n", buf+1); /* + 1 to skip by '$' */ + } + + +static expptr do_p1_expr (infile, outfile) +FILE *infile, *outfile; +{ + int status; + long opcode, type; + struct Exprblock *result = (struct Exprblock *) NULL; + + status = p1getd (infile, &opcode); + + if (status == EOF) + err ("do_p1_expr: Missing expr opcode at end of file"); + else if (status == 0) + err ("do_p1_expr: Missing expr opcode in p1 file"); + else { + + status = p1getd (infile, &type); + + if (status == EOF) + err ("do_p1_expr: Missing expr type at end of file"); + else if (status == 0) + err ("do_p1_expr: Missing expr type in p1 file"); + else if (opcode == 0) + return ENULL; + else { + result = ALLOC (Exprblock); + + result -> tag = TEXPR; + result -> vtype = type; + result -> opcode = opcode; + result -> vleng = do_format (infile, outfile); + + if (is_unary_op (opcode)) + result -> leftp = do_format (infile, outfile); + else if (is_binary_op (opcode)) { + result -> leftp = do_format (infile, outfile); + result -> rightp = do_format (infile, outfile); + } else + errl("do_p1_expr: Illegal opcode %ld", opcode); + } /* else */ + } /* else */ + + return (expptr) result; +} /* do_p1_expr */ + + +static expptr do_p1_ident(infile) +FILE *infile; +{ + Addrp addrp; + int status; + long vtype, vstg; + + addrp = ALLOC (Addrblock); + addrp -> tag = TADDR; + + status = p1getd (infile, &vtype); + if (status == EOF) + err ("do_p1_ident: Missing identifier type at end of file\n"); + else if (status == 0 || vtype < 0 || vtype >= NTYPES) + errl("do_p1_ident: Bad type in intermediate file: %ld\n", vtype); + else + addrp -> vtype = vtype; + + status = p1getd (infile, &vstg); + if (status == EOF) + err ("do_p1_ident: Missing identifier storage at end of file\n"); + else if (status == 0 || vstg < 0 || vstg > STGNULL) + errl("do_p1_ident: Bad storage in intermediate file: %ld\n", vtype); + else + addrp -> vstg = vstg; + + status = p1gets(infile, addrp->user.ident, IDENT_LEN); + + if (status == EOF) + err ("do_p1_ident: Missing ident string at end of file"); + else if (status == 0) + err ("do_p1_ident: Missing ident string in intermediate file"); + addrp->uname_tag = UNAM_IDENT; + return (expptr) addrp; +} /* do_p1_ident */ + +static expptr do_p1_charp(infile) +FILE *infile; +{ + Addrp addrp; + int status; + long vtype, vstg; + char buf[64]; + + addrp = ALLOC (Addrblock); + addrp -> tag = TADDR; + + status = p1getd (infile, &vtype); + if (status == EOF) + err ("do_p1_ident: Missing identifier type at end of file\n"); + else if (status == 0 || vtype < 0 || vtype >= NTYPES) + errl("do_p1_ident: Bad type in intermediate file: %ld\n", vtype); + else + addrp -> vtype = vtype; + + status = p1getd (infile, &vstg); + if (status == EOF) + err ("do_p1_ident: Missing identifier storage at end of file\n"); + else if (status == 0 || vstg < 0 || vstg > STGNULL) + errl("do_p1_ident: Bad storage in intermediate file: %ld\n", vtype); + else + addrp -> vstg = vstg; + + status = p1gets(infile, buf, sizeof(buf)); + + if (status == EOF) + err ("do_p1_ident: Missing charp ident string at end of file"); + else if (status == 0) + err ("do_p1_ident: Missing charp ident string in intermediate file"); + addrp->uname_tag = UNAM_CHARP; + addrp->user.Charp = strcpy(mem(strlen(buf)+1,0), buf); + return (expptr) addrp; +} + + +static expptr do_p1_extern (infile) +FILE *infile; +{ + Addrp addrp; + + addrp = ALLOC (Addrblock); + if (addrp) { + int status; + + addrp->tag = TADDR; + addrp->vstg = STGEXT; + addrp->uname_tag = UNAM_EXTERN; + status = p1getd (infile, &(addrp -> memno)); + if (status == EOF) + err ("do_p1_extern: Missing memno at end of file"); + else if (status == 0) + err ("do_p1_extern: Missing memno in intermediate file"); + if (addrp->vtype = extsymtab[addrp->memno].extype) + addrp->vclass = CLPROC; + } /* if addrp */ + + return (expptr) addrp; +} /* do_p1_extern */ + + + +static expptr do_p1_head (infile, outfile) +FILE *infile, *outfile; +{ + int status; + int add_n_; + long class; + char storage[256]; + + status = p1getd (infile, &class); + if (status == EOF) + err ("do_p1_head: missing header class at end of file"); + else if (status == 0) + err ("do_p1_head: missing header class in p1 file"); + else { + status = p1gets (infile, storage, sizeof(storage)); + if (status == EOF || status == 0) + storage[0] = '\0'; + } /* else */ + + if (class == CLPROC || class == CLMAIN) { + chainp lengths; + + add_n_ = nentry > 1; + lengths = length_comp(entries, add_n_); + + if (!add_n_ && protofile && class != CLMAIN) + protowrite(protofile, proctype, storage, entries, lengths); + + if (class == CLMAIN) + nice_printf (outfile, "/* Main program */ "); + else + nice_printf(outfile, "%s ", multitype ? "VOID" + : c_type_decl(proctype, 1)); + + nice_printf(outfile, add_n_ ? "%s0_" : "%s", storage); + if (!Ansi) { + listargs(outfile, entries, add_n_, lengths); + nice_printf (outfile, "\n"); + } + list_arg_types (outfile, entries, lengths, add_n_, "\n"); + nice_printf (outfile, "{\n"); + frchain(&lengths); + next_tab (outfile); + strcpy(this_proc_name, storage); + list_decls (outfile); + + } else if (class == CLBLOCK) + next_tab (outfile); + else + errl("do_p1_head: got class %ld", class); + + return NULL; +} /* do_p1_head */ + + +static expptr do_p1_list (infile, outfile) +FILE *infile, *outfile; +{ + long tag, type, count; + int status; + expptr result; + + status = p1getd (infile, &tag); + if (status == EOF) + err ("do_p1_list: missing list tag at end of file"); + else if (status == 0) + err ("do_p1_list: missing list tag in p1 file"); + else { + status = p1getd (infile, &type); + if (status == EOF) + err ("do_p1_list: missing list type at end of file"); + else if (status == 0) + err ("do_p1_list: missing list type in p1 file"); + else { + status = p1getd (infile, &count); + if (status == EOF) + err ("do_p1_list: missing count at end of file"); + else if (status == 0) + err ("do_p1_list: missing count in p1 file"); + } /* else */ + } /* else */ + + result = (expptr) ALLOC (Listblock); + if (result) { + chainp pointer; + + result -> tag = tag; + result -> listblock.vtype = type; + +/* Assume there will be enough data */ + + if (count--) { + pointer = result->listblock.listp = + mkchain((char *)do_format(infile, outfile), CHNULL); + while (count--) { + pointer -> nextp = + mkchain((char *)do_format(infile, outfile), CHNULL); + pointer = pointer -> nextp; + } /* while (count--) */ + } /* if (count) */ + } /* if (result) */ + + return result; +} /* do_p1_list */ + + +chainp length_comp(e, add_n) /* get lengths of characters args */ + struct Entrypoint *e; + int add_n; +{ + chainp lengths; + chainp args, args1; + Namep arg, np; + int nchargs; + Argtypes *at; + Atype *a; + + args = args1 = add_n ? allargs : e->arglist; + nchargs = 0; + for (lengths = NULL; args; args = args -> nextp) + if ((arg = (Namep)args->datap) + && arg->vtype == TYCHAR + && arg->vclass != CLPROC) { + lengths = mkchain((char *)arg, lengths); + nchargs++; + } + if (!add_n && (np = e->enamep)) { + /* one last check -- by now we know all we ever will + * about external args... + */ + save_argtypes(e->arglist, &e->entryname->arginfo, + &np->arginfo, 0, np->fvarname, STGEXT, nchargs, + np->vtype); + at = e->entryname->arginfo; + for(a = at->atypes; args1; a++, args1 = args1->nextp) { + frchain(&a->cp); + if (arg = (Namep)args1->datap) + switch(arg->vclass) { + case CLPROC: + if (arg->vimpltype + && a->type >= 300) + a->type = TYUNKNOWN + 200; + break; + case CLUNKNOWN: + a->type %= 100; + } + } + } + return revchain(lengths); + } + +void listargs(outfile, entryp, add_n_, lengths) + FILE *outfile; + struct Entrypoint *entryp; + int add_n_; + chainp lengths; +{ + chainp args; + char *s; + Namep arg; + int did_one = 0; + + nice_printf (outfile, "("); + + if (add_n_) { + nice_printf(outfile, "n__"); + did_one = 1; + args = allargs; + } + else + args = entryp->arglist; + + if (multitype) + { + nice_printf(outfile, ", ret_val"); + did_one = 1; + args = allargs; + } + else if (ONEOF(proctype, MSKCOMPLEX|MSKCHAR)) + { + s = xretslot[proctype]->user.ident; + nice_printf(outfile, did_one ? ", %s" : "%s", + *s == '(' /*)*/ ? "r_v" : s); + did_one = 1; + if (proctype == TYCHAR) + nice_printf (outfile, ", ret_val_len"); + } + for (; args; args = args -> nextp) + if (arg = (Namep)args->datap) { + nice_printf (outfile, "%s", did_one ? ", " : ""); + out_name (outfile, arg); + did_one = 1; + } + + for (args = lengths; args; args = args -> nextp) + nice_printf(outfile, ", %s", + new_arg_length((Namep)args->datap)); + nice_printf (outfile, ")"); +} /* listargs */ + + +void list_arg_types(outfile, entryp, lengths, add_n_, finalnl) +FILE *outfile; +struct Entrypoint *entryp; +chainp lengths; +int add_n_; +char *finalnl; +{ + chainp args; + int last_type = -1, last_class = -1; + int did_one = 0, done_one; + char *s, *sep = "", *sep1; + + if (outfile == (FILE *) NULL) { + err ("list_arg_types: null output file"); + return; + } else if (entryp == (struct Entrypoint *) NULL) { + err ("list_arg_types: null procedure entry pointer"); + return; + } /* else */ + + if (Ansi) { + done_one = 0; + sep1 = ", "; + nice_printf(outfile, "(" /*)*/); + } + else { + done_one = 1; + sep1 = ";\n"; + } + args = entryp->arglist; + if (add_n_) { + nice_printf(outfile, "int n__"); + did_one = done_one; + sep = sep1; + args = allargs; + } + if (multitype) { + nice_printf(outfile, "%sMultitype *ret_val", sep); + did_one = done_one; + sep = sep1; + } + else if (ONEOF (proctype, MSKCOMPLEX|MSKCHAR)) { + s = xretslot[proctype]->user.ident; + nice_printf(outfile, "%s%s *%s", sep, c_type_decl(proctype, 0), + *s == '(' /*)*/ ? "r_v" : s); + did_one = done_one; + sep = sep1; + if (proctype == TYCHAR) + nice_printf (outfile, "%sftnlen ret_val_len", sep); + } /* if ONEOF proctype */ + for (; args; args = args -> nextp) { + Namep arg = (Namep) args->datap; + +/* Scalars are passed by reference, and arrays will have their lower bound + adjusted, so nearly everything is printed with a star in front. The + exception is character lengths, which are passed by value. */ + + if (arg) { + int type = arg -> vtype, class = arg -> vclass; + + if (class == CLPROC) + if (arg->vimpltype) + type = Castargs ? TYUNKNOWN : TYSUBR; + else if (type == TYREAL && forcedouble && !Castargs) + type = TYDREAL; + + if (type == last_type && class == last_class && did_one) + nice_printf (outfile, ", "); + else + if (class == CLPROC && Castargs) + nice_printf(outfile, "%s%s ", sep, + usedcasts[type] = casttypes[type]); + else + nice_printf(outfile, "%s%s ", sep, + c_type_decl(type, 0)); + if (class == CLPROC) + if (Castargs) + out_name(outfile, arg); + else { + nice_printf(outfile, "(*"); + out_name(outfile, arg); + nice_printf(outfile, ") %s", parens); + } + else { + nice_printf (outfile, "*"); + out_name (outfile, arg); + } + + last_type = type; + last_class = class; + did_one = done_one; + sep = sep1; + } /* if (arg) */ + } /* for args = entryp -> arglist */ + + for (args = lengths; args; args = args -> nextp) + nice_printf(outfile, "%sftnlen %s", sep, + new_arg_length((Namep)args->datap)); + if (did_one) + nice_printf (outfile, ";\n"); + else if (Ansi) + nice_printf(outfile, + /*((*/ sep != sep1 && Ansi == 1 ? "void)%s" : ")%s", + finalnl); +} /* list_arg_types */ + + static void +write_formats(outfile) + FILE *outfile; +{ + register struct Labelblock *lp; + int first = 1; + extern int in_string; + char *fs; + + for(lp = labeltab ; lp < highlabtab ; ++lp) + if (lp->fmtlabused) { + if (first) { + first = 0; + nice_printf(outfile, "/* Format strings */\n"); + } + nice_printf(outfile, "static char fmt_%ld[] = \"", + lp->stateno); + in_string = 1; + if (!(fs = lp->fmtstring)) + fs = ""; + nice_printf(outfile, "%s\"", fs); + in_string = 0; + nice_printf(outfile, ";\n"); + } + if (!first) + nice_printf(outfile, "\n"); + } + + static void +write_ioblocks(outfile) + FILE *outfile; +{ + register iob_data *L; + register char *f, **s, *sep; + + nice_printf(outfile, "/* Fortran I/O blocks */\n"); + L = iob_list = (iob_data *)revchain((chainp)iob_list); + do { + nice_printf(outfile, "static %s %s = { ", + L->type, L->name); + sep = 0; + for(s = L->fields; f = *s; s++) { + if (sep) + nice_printf(outfile, sep); + sep = ", "; + if (*f == '"') { /* kludge */ + nice_printf(outfile, "\""); + in_string = 1; + nice_printf(outfile, "%s\"", f+1); + in_string = 0; + } + else + nice_printf(outfile, "%s", f); + } + nice_printf(outfile, " };\n"); + } + while(L = L->next); + nice_printf(outfile, "\n\n"); + } + + static void +write_assigned_fmts(outfile) + FILE *outfile; +{ + register chainp cp; + Namep np; + int did_one = 0; + + cp = assigned_fmts = revchain(assigned_fmts); + nice_printf(outfile, "/* Assigned format variables */\nchar "); + do { + np = (Namep)cp->datap; + if (did_one) + nice_printf(outfile, ", "); + did_one = 1; + nice_printf(outfile, "*%s_fmt", np->fvarname); + } + while(cp = cp->nextp); + nice_printf(outfile, ";\n\n"); + } + + static char * +to_upper(s) + register char *s; +{ + static char buf[64]; + register char *t = buf; + register int c; + while(*t++ = (c = *s++) >= 'a' && c <= 'z' ? c + 'A' - 'a' : c); + return buf; + } + + +/* This routine creates static structures representing a namelist. + Declarations of the namelist and related structures are: + + struct Vardesc { + char *name; + char *addr; + Long *dims; /* laid out as struct dimensions below *//* + int type; + }; + typedef struct Vardesc Vardesc; + + struct Namelist { + char *name; + Vardesc **vars; + int nvars; + }; + + struct dimensions + { + long numberofdimensions; + long numberofelements + long baseoffset; + long span[numberofdimensions-1]; + }; + + If dims is not null, then the corner element of the array is at + addr. However, the element with subscripts (i1,...,in) is at + addr + sizeoftype * (i1+span[0]*(i2+span[1]*...) - dimp->baseoffset) +*/ + + static void +write_namelists(nmch, outfile) + chainp nmch; + FILE *outfile; +{ + Namep var; + struct Hashentry *entry; + struct Dimblock *dimp; + int i, nd, type; + char *comma, *name; + register chainp q; + register Namep v; + + nice_printf(outfile, "/* Namelist stuff */\n\n"); + for (entry = hashtab; entry < lasthash; ++entry) { + if (!(v = entry->varp) || !v->vnamelist) + continue; + type = v->vtype; + name = v->cvarname; + if (dimp = v->vdim) { + nd = dimp->ndim; + nice_printf(outfile, + "static Long %s_dims[] = { %d, %ld, %ld", + name, nd, + dimp->nelt->constblock.Const.ci, + dimp->baseoffset->constblock.Const.ci); + for(i = 0, --nd; i < nd; i++) + nice_printf(outfile, ", %ld", + dimp->dims[i].dimsize->constblock.Const.ci); + nice_printf(outfile, " };\n"); + } + nice_printf(outfile, "static Vardesc %s_dv = { \"%s\", %s", + name, to_upper(name), + type == TYCHAR ? "" : dimp ? "(char *)" : "(char *)&"); + out_name(outfile, v); + nice_printf(outfile, dimp ? ", %s_dims" : ", (Long *)0", name); + nice_printf(outfile, ", %ld };\n", + type != TYCHAR ? (long)type + : -v->vleng->constblock.Const.ci); + } + + do { + var = (Namep)nmch->datap; + name = var->cvarname; + nice_printf(outfile, "\nstatic Vardesc *%s_vl[] = ", name); + comma = "{"; + i = 0; + for(q = var->varxptr.namelist ; q ; q = q->nextp) { + v = (Namep)q->datap; + if (!v->vnamelist) + continue; + i++; + nice_printf(outfile, "%s &%s_dv", comma, v->cvarname); + comma = ","; + } + nice_printf(outfile, " };\n"); + nice_printf(outfile, + "static Namelist %s = { \"%s\", %s_vl, %d };\n", + name, to_upper(name), name, i); + } + while(nmch = nmch->nextp); + nice_printf(outfile, "\n"); + } + +/* fixextype tries to infer from usage in previous procedures + the type of an external procedure declared + external and passed as an argument but never typed or invoked. + */ + + static int +fixexttype(var) + Namep var; +{ + Extsym *e; + int type, type1; + extern void changedtype(); + + type = var->vtype; + e = &extsymtab[var->vardesc.varno]; + if ((type1 = e->extype) && type == TYUNKNOWN) + return var->vtype = type1; + if (var->visused) { + if (e->exused && type != type1) + changedtype(var); + e->exused = 1; + e->extype = type; + } + return type; + } + +list_decls (outfile) +FILE *outfile; +{ + extern chainp used_builtins; + extern struct Hashentry *hashtab; + extern void wr_char_len(); + struct Hashentry *entry; + int write_header = 1; + int last_class = -1, last_stg = -1; + Namep var; + int Alias, Define, did_one, last_type, type; + extern int def_equivs, useauto; + extern chainp new_vars; /* Compiler-generated locals */ + chainp namelists = 0; + char *ctype; + long lineno_save = lineno; + int useauto1 = useauto && !saveall; + + lineno = old_lineno; + +/* First write out the statically initialized data */ + + if (initfile) + list_init_data(&initfile, initfname, outfile); + +/* Next come formats */ + write_formats(outfile); + +/* Now write out the system-generated identifiers */ + + if (new_vars || nequiv) { + chainp args, next_var, this_var; + chainp nv[TYVOID], nv1[TYVOID]; + int i, j; + Addrp Var; + Namep arg; + + /* zap unused dimension variables */ + + for(args = allargs; args; args = args->nextp) { + arg = (Namep)args->datap; + if (this_var = arg->vlastdim) { + frexpr((tagptr)this_var->datap); + this_var->datap = 0; + } + } + + /* sort new_vars by type, skipping entries just zapped */ + + for(i = TYADDR; i < TYVOID; i++) + nv[i] = 0; + for(this_var = new_vars; this_var; this_var = next_var) { + next_var = this_var->nextp; + if (Var = (Addrp)this_var->datap) { + if (!(this_var->nextp = nv[j = Var->vtype])) + nv1[j] = this_var; + nv[j] = this_var; + } + else { + this_var->nextp = 0; + frchain(&this_var); + } + } + new_vars = 0; + for(i = TYVOID; --i >= TYADDR;) + if (this_var = nv[i]) { + nv1[i]->nextp = new_vars; + new_vars = this_var; + } + + /* write the declarations */ + + did_one = 0; + last_type = -1; + + for (this_var = new_vars; this_var; this_var = this_var -> nextp) { + Var = (Addrp) this_var->datap; + + if (Var == (Addrp) NULL) + err ("list_decls: null variable"); + else if (Var -> tag != TADDR) + erri ("list_decls: bad tag on new variable '%d'", + Var -> tag); + + type = nv_type (Var); + if (Var->vstg == STGINIT + || Var->uname_tag == UNAM_IDENT + && *Var->user.ident == ' ' + && multitype) + continue; + if (!did_one) + nice_printf (outfile, "/* System generated locals */\n"); + + if (last_type == type && did_one) + nice_printf (outfile, ", "); + else { + if (did_one) + nice_printf (outfile, ";\n"); + nice_printf (outfile, "%s ", + c_type_decl (type, Var -> vclass == CLPROC)); + } /* else */ + +/* Character type is really a string type. Put out a '*' for parameters + with unknown length and functions returning character */ + + if (Var -> vtype == TYCHAR && (!ISICON ((Var -> vleng)) + || Var -> vclass == CLPROC)) + nice_printf (outfile, "*"); + + write_nv_ident(outfile, (Addrp)this_var->datap); + if (Var -> vtype == TYCHAR && Var->vclass != CLPROC && + ISICON((Var -> vleng)) + && (i = Var->vleng->constblock.Const.ci) > 0) + nice_printf (outfile, "[%d]", i); + + did_one = 1; + last_type = nv_type (Var); + } /* for this_var */ + +/* Handle the uninitialized equivalences */ + + do_uninit_equivs (outfile, &did_one); + + if (did_one) + nice_printf (outfile, ";\n\n"); + } /* if new_vars */ + +/* Write out builtin declarations */ + + if (used_builtins) { + chainp cp; + Extsym *es; + + last_type = -1; + did_one = 0; + + nice_printf (outfile, "/* Builtin functions */"); + + for (cp = used_builtins; cp; cp = cp -> nextp) { + Addrp e = (Addrp)cp->datap; + + switch(type = e->vtype) { + case TYDREAL: + case TYREAL: + /* if (forcedouble || e->dbl_builtin) */ + /* libF77 currently assumes everything double */ + type = TYDREAL; + ctype = "double"; + break; + case TYCOMPLEX: + case TYDCOMPLEX: + type = TYVOID; + /* no break */ + default: + ctype = c_type_decl(type, 0); + } + + if (did_one && last_type == type) + nice_printf(outfile, ", "); + else + nice_printf(outfile, "%s\n%s ", did_one ? ";" : "", ctype); + + extern_out(outfile, es = &extsymtab[e -> memno]); + proto(outfile, es->arginfo, es->fextname); + last_type = type; + did_one = 1; + } /* for cp = used_builtins */ + + nice_printf (outfile, ";\n\n"); + } /* if used_builtins */ + + last_type = -1; + for (entry = hashtab; entry < lasthash; ++entry) { + var = entry -> varp; + + if (var) { + int procclass = var -> vprocclass; + char *comment = NULL; + int stg = var -> vstg; + int class = var -> vclass; + type = var -> vtype; + + if (ONEOF(stg, M(STGARG)|M(STGLENG)|M(STGINIT))) + continue; + + if (useauto1 && stg == STGBSS && !var->vsave) + stg = STGAUTO; + + switch (class) { + case CLVAR: + break; + case CLPROC: + switch(procclass) { + case PTHISPROC: + extsymtab[var->vardesc.varno].extype = type; + continue; + case PSTFUNCT: + case PINTRINSIC: + continue; + case PUNKNOWN: + err ("list_decls: unknown procedure class"); + continue; + case PEXTERNAL: + if (stg == STGUNKNOWN) { + warn1( + "%.64s declared EXTERNAL but never used.", + var->fvarname); + /* to retain names declared EXTERNAL */ + /* but not referenced, change + /* "continue" to "stg = STGEXT" */ + continue; + } + else + type = fixexttype(var); + } + break; + case CLUNKNOWN: + /* declared but never used */ + continue; + case CLPARAM: + continue; + case CLNAMELIST: + if (var->visused) + namelists = mkchain((char *)var, namelists); + continue; + default: + erri("list_decls: can't handle class '%d' yet", + class); + Fatal(var->fvarname); + continue; + } /* switch */ + + /* Might be equivalenced to a common. If not, don't process */ + if (stg == STGCOMMON && !var->vcommequiv) + continue; + +/* Only write the header if system-generated locals, builtins, or + uninitialized equivs were already output */ + + if (write_header == 1 && (new_vars || nequiv || used_builtins) + && oneof_stg ( var, stg, + M(STGBSS)|M(STGEXT)|M(STGAUTO)|M(STGCOMMON)|M(STGEQUIV))) { + nice_printf (outfile, "/* Local variables */\n"); + write_header = 2; + } + + + Alias = oneof_stg(var, stg, M(STGEQUIV)|M(STGCOMMON)); + if (Define = Alias && def_equivs) { + if (!write_header) + nice_printf(outfile, ";\n"); + def_start(outfile, var->cvarname, CNULL, "("); + goto Alias1; + } + else if (type == last_type && class == last_class && + stg == last_stg && !write_header) + nice_printf (outfile, ", "); + else { + if (!write_header && ONEOF(stg, M(STGBSS)| + M(STGEXT)|M(STGAUTO)|M(STGEQUIV)|M(STGCOMMON))) + nice_printf (outfile, ";\n"); + + switch (stg) { + case STGARG: + case STGLENG: + /* Part of the argument list, don't write them out + again */ + continue; /* Go back to top of the loop */ + case STGBSS: + case STGEQUIV: + case STGCOMMON: + nice_printf (outfile, "static "); + break; + case STGEXT: + nice_printf (outfile, "extern "); + break; + case STGAUTO: + break; + case STGINIT: + case STGUNKNOWN: + /* Don't want to touch the initialized data, that will + be handled elsewhere. Unknown data have + already been complained about, so skip them */ + continue; + default: + erri("list_decls: can't handle storage class %d", + var->vstg); + continue; + } /* switch */ + + nice_printf (outfile, "%s ", c_type_decl (var -> vtype, var -> + vclass == CLPROC)); + } /* else */ + +/* Character type is really a string type. Put out a '*' for variable + length strings, and also for equivalences */ + + if (var -> vtype == TYCHAR && var -> vclass != CLPROC + && (!var->vleng || !ISICON (var -> vleng)) + || oneof_stg(var, stg, M(STGEQUIV)|M(STGCOMMON))) + nice_printf (outfile, "*%s", var->cvarname); + else { + nice_printf (outfile, "%s", var->cvarname); + if (var -> vclass == CLPROC) + proto(outfile, var->arginfo, var->fvarname); + else if (var -> vtype == TYCHAR && ISICON ((var -> vleng))) + wr_char_len(outfile, var->vdim, + (int)var->vleng->constblock.Const.ci, 0); + else if (var -> vdim && + !oneof_stg (var, stg, M(STGEQUIV)|M(STGCOMMON))) + comment = wr_ardecls(outfile, var->vdim, 1L); + } + + if (comment) + nice_printf (outfile, "%s", comment); + Alias1: + if (Alias) { + char *amp, *lp, *name, *rp; + char *equiv_name (); + ftnint voff = var -> voffset; + int et0, expr_type, k; + Extsym *E; + struct Equivblock *eb; + char buf[16]; + +/* We DON'T want to use oneof_stg here, because we need to distinguish + between them */ + + if (stg == STGEQUIV) { + name = equiv_name(k = var->vardesc.varno, CNULL); + eb = eqvclass + k; + if (eb->eqvinit) { + amp = "&"; + et0 = TYERROR; + } + else { + amp = ""; + et0 = eb->eqvtype; + } + expr_type = et0; + } + else { + E = &extsymtab[var->vardesc.varno]; + sprintf(name = buf, "%s%d", E->cextname, E->curno); + expr_type = type; + et0 = -1; + amp = "&"; + } /* else */ + + if (!Define) + nice_printf (outfile, " = "); + if (voff) { + k = typesize[type]; + switch((int)(voff % k)) { + case 0: + voff /= k; + expr_type = type; + break; + case SZSHORT: + case SZSHORT+SZLONG: + expr_type = TYSHORT; + voff /= SZSHORT; + break; + case SZLONG: + expr_type = TYLONG; + voff /= SZLONG; + break; + default: + expr_type = TYCHAR; + } + } + + if (expr_type == type) { + lp = rp = ""; + if (et0 == -1 && !voff) + goto cast; + } + else { + lp = "("; + rp = ")"; + cast: + nice_printf(outfile, "(%s *)", c_type_decl(type, 0)); + } + +/* Now worry about computing the offset */ + + if (voff) { + if (expr_type == et0) + nice_printf (outfile, "%s%s + %ld%s", + lp, name, voff, rp); + else + nice_printf(outfile, "%s(%s *)%s%s + %ld%s", lp, + c_type_decl (expr_type, 0), amp, + name, voff, rp); + } else + nice_printf(outfile, "%s%s", amp, name); +/* Always put these at the end of the line */ + last_type = last_class = last_stg = -1; + write_header = 0; + if (Define) { + ind_printf(0, outfile, ")\n"); + write_header = 2; + } + continue; + } /* if oneof_stg (var, stg, M(STGEQUIV)|M(STGCOMMON)) */ + write_header = 0; + last_type = type; + last_class = class; + last_stg = stg; + } /* if (var) */ + } /* for (entry = hashtab */ + + if (!write_header) + nice_printf (outfile, ";\n\n"); + else if (write_header == 2) + nice_printf(outfile, "\n"); + +/* Next, namelists, which may reference equivs */ + + if (namelists) { + write_namelists(namelists = revchain(namelists), outfile); + frchain(&namelists); + } + +/* Finally, ioblocks (which may reference equivs and namelists) */ + if (iob_list) + write_ioblocks(outfile); + if (assigned_fmts) + write_assigned_fmts(outfile); + lineno = lineno_save; +} /* list_decls */ + +do_uninit_equivs (outfile, did_one) +FILE *outfile; +int *did_one; +{ + extern int nequiv; + struct Equivblock *eqv, *lasteqv = eqvclass + nequiv; + int k, last_type = -1, t; + + for (eqv = eqvclass; eqv < lasteqv; eqv++) + if (!eqv -> eqvinit && eqv -> eqvtop != eqv -> eqvbottom) { + if (!*did_one) + nice_printf (outfile, "/* System generated locals */\n"); + t = eqv->eqvtype; + if (last_type == t) + nice_printf (outfile, ", "); + else { + if (*did_one) + nice_printf (outfile, ";\n"); + nice_printf (outfile, "static %s ", c_type_decl(t, 0)); + k = typesize[t]; + } /* else */ + nice_printf(outfile, "%s", equiv_name(eqv - eqvclass, CNULL)); + nice_printf(outfile, "[%ld]", + (eqv->eqvtop - eqv->eqvbottom + k - 1) / k); + last_type = t; + *did_one = 1; + } /* if !eqv -> eqvinit */ +} /* do_uninit_equivs */ + + +/* wr_ardecls -- Writes the brackets and size for an array + declaration. Because of the inner workings of the compiler, + multi-dimensional arrays get mapped directly into a one-dimensional + array, so we have to compute the size of the array here. When the + dimension is greater than 1, a string comment about the original size + is returned */ + +char *wr_ardecls(outfile, dimp, size) +FILE *outfile; +struct Dimblock *dimp; +long size; +{ + int i, k; + static char buf[1000]; + + if (dimp == (struct Dimblock *) NULL) + return NULL; + + sprintf(buf, "\t/* was "); /* would like to say k = sprintf(...), but */ + k = strlen(buf); /* BSD doesn't return char transmitted count */ + + for (i = 0; i < dimp -> ndim; i++) { + expptr this_size = dimp -> dims[i].dimsize; + + if (!ISICON (this_size)) + err ("wr_ardecls: nonconstant array size"); + else { + size *= this_size -> constblock.Const.ci; + sprintf(buf+k, "[%ld]", this_size -> constblock.Const.ci); + k += strlen(buf+k); /* BSD prevents combining this with prev stmt */ + } /* else */ + } /* for i = 0 */ + + nice_printf (outfile, "[%ld]", size); + strcat(buf+k, " */"); + + return (i > 1) ? buf : NULL; +} /* wr_ardecls */ + + + +/* ---------------------------------------------------------------------- + + The following routines read from the p1 intermediate file. If + that format changes, only these routines need be changed + + ---------------------------------------------------------------------- */ + +static int get_p1_token (infile) +FILE *infile; +{ + int token = P1_UNKNOWN; + +/* NOT PORTABLE!! */ + + if (fscanf (infile, "%d", &token) == EOF) + return P1_EOF; + +/* Skip over the ": " */ + + if (getc (infile) != '\n') + getc (infile); + + return token; +} /* get_p1_token */ + + + +/* Returns a (null terminated) string from the input file */ + +static int p1gets (fp, str, size) +FILE *fp; +char *str; +int size; +{ + char *fgets (); + char c; + + if (str == NULL) + return 0; + + if ((c = getc (fp)) != ' ') + ungetc (c, fp); + + if (fgets (str, size, fp)) { + int length; + + str[size - 1] = '\0'; + length = strlen (str); + +/* Get rid of the newline */ + + if (str[length - 1] == '\n') + str[length - 1] = '\0'; + return 1; + + } else if (feof (fp)) + return EOF; + else + return 0; +} /* p1gets */ + + +static int p1get_const (infile, type, resultp) +FILE *infile; +int type; +struct Constblock **resultp; +{ + int status; + struct Constblock *result; + + if (type != TYCHAR) { + *resultp = result = ALLOC(Constblock); + result -> tag = TCONST; + result -> vtype = type; + } + + switch (type) { + case TYSHORT: + case TYLONG: + case TYLOGICAL: + status = p1getd (infile, &(result -> Const.ci)); + break; + case TYREAL: + case TYDREAL: + status = p1getf(infile, &result->Const.cds[0]); + result->vstg = 1; + break; + case TYCOMPLEX: + case TYDCOMPLEX: + status = p1getf(infile, &result->Const.cds[0]); + if (status && status != EOF) + status = p1getf(infile, &result->Const.cds[1]); + result->vstg = 1; + break; + case TYCHAR: + status = fscanf(infile, "%lx", resultp); + break; + default: + erri ("p1get_const: bad constant type '%d'", type); + status = 0; + break; + } /* switch */ + + return status; +} /* p1get_const */ + +static int p1getd (infile, result) +FILE *infile; +long *result; +{ + return fscanf (infile, "%ld", result); +} /* p1getd */ + + static int +p1getf(infile, result) + FILE *infile; + char **result; +{ + + char buf[1324]; + register int k; + + k = fscanf (infile, "%s", buf); + if (k < 1) + k = EOF; + else + strcpy(*result = mem(strlen(buf)+1,0), buf); + return k; +} + +static int p1getn (infile, count, result) +FILE *infile; +int count; +char **result; +{ + + char *bufptr; + extern ptr ckalloc (); + + bufptr = (char *) ckalloc (count); + + if (result) + *result = bufptr; + + for (; !feof (infile) && count > 0; count--) + *bufptr++ = getc (infile); + + return feof (infile) ? EOF : 1; +} /* p1getn */ + + static void +proto(outfile, at, fname) + FILE *outfile; + Argtypes *at; + char *fname; +{ + int i, j, k, n; + char *comma; + Atype *atypes; + Namep np; + chainp cp; + extern void bad_atypes(); + + if (at) { + /* Correct types that we learn on the fly, e.g. + subroutine gotcha(foo) + external foo + call zap(...,foo,...) + call foo(...) + */ + atypes = at->atypes; + n = at->nargs; + for(i = 0; i++ < n; atypes++) { + if (!(cp = atypes->cp)) + continue; + j = atypes->type; + do { + np = (Namep)cp->datap; + k = np->vtype; + if (np->vclass == CLPROC) { + if (!np->vimpltype && k) + k += 200; + else { + if (j >= 300) + j = TYUNKNOWN + 200; + continue; + } + } + if (j == k) + continue; + if (j >= 300 + || j == 200 && k >= 200) + j = k; + else { + bad_atypes(at,fname,i,j,k,""," and"); + goto break2; + } + } + while(cp = cp->nextp); + atypes->type = j; + frchain(&atypes->cp); + } + } + break2: + if (parens) { + nice_printf(outfile, parens); + return; + } + + if (!at || (n = at->nargs) < 0) { + nice_printf(outfile, Ansi == 1 ? "()" : "(...)"); + return; + } + + if (n == 0) { + nice_printf(outfile, Ansi == 1 ? "(void)" : "()"); + return; + } + + atypes = at->atypes; + nice_printf(outfile, "("); + comma = ""; + for(; --n >= 0; atypes++) { + k = atypes->type; + if (k == TYADDR) + nice_printf(outfile, "%schar **", comma); + else if (k >= 200) { + k -= 200; + nice_printf(outfile, "%s%s", comma, + usedcasts[k] = casttypes[k]); + } + else if (k >= 100) + nice_printf(outfile, "%s%s", comma, + c_type_decl(k-100, 0)); + else + nice_printf(outfile, "%s%s *", comma, + c_type_decl(k, 0)); + comma = ", "; + } + nice_printf(outfile, ")"); + } + + void +protowrite(protofile, type, name, e, lengths) + FILE *protofile; + char *name; + struct Entrypoint *e; + chainp lengths; +{ + extern char used_rets[]; + + nice_printf(protofile, "extern %s %s", protorettypes[type], name); + list_arg_types(protofile, e, lengths, 0, ";\n"); + used_rets[type] = 1; + } + + static void +do_p1_1while(outfile) + FILE *outfile; +{ + if (*wh_next) { + nice_printf(outfile, + "for(;;) { /* while(complicated condition) */\n" /*}*/ ); + next_tab(outfile); + } + else + nice_printf(outfile, "while(" /*)*/ ); + } + + static void +do_p1_2while(infile, outfile) + FILE *infile, *outfile; +{ + expptr test; + + test = do_format(infile, outfile); + if (*wh_next) + nice_printf(outfile, "if (!("); + expr_out(outfile, test); + if (*wh_next++) + nice_printf(outfile, "))\n\tbreak;\n"); + else { + nice_printf(outfile, /*(*/ ") {\n"); + next_tab(outfile); + } + } diff --git a/sources/f2c/format.h b/sources/f2c/format.h new file mode 100644 index 0000000..a88c038 --- /dev/null +++ b/sources/f2c/format.h @@ -0,0 +1,10 @@ +#define DEF_C_LINE_LENGTH 77 +/* actual max will be 79 */ + +extern int c_output_line_length; /* max # chars per line in C source + code */ + +char *wr_ardecls (/* FILE *, struct Dimblock * */); +void list_init_data (), wr_one_init (), wr_output_values (); +int do_init_data (); +chainp data_value (); diff --git a/sources/f2c/formatd.c b/sources/f2c/formatd.c new file mode 100644 index 0000000..4f85fe0 --- /dev/null +++ b/sources/f2c/formatd.c @@ -0,0 +1,1015 @@ +/**************************************************************** +Copyright 1990 by AT&T Bell Laboratories and Bellcore. + +Permission to use, copy, modify, and distribute this software +and its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the names of AT&T Bell Laboratories or +Bellcore or any of their entities not be used in advertising or +publicity pertaining to distribution of the software without +specific, written prior permission. + +AT&T and Bellcore disclaim all warranties with regard to this +software, including all implied warranties of merchantability +and fitness. In no event shall AT&T or Bellcore be liable for +any special, indirect or consequential damages or any damages +whatsoever resulting from loss of use, data or profits, whether +in an action of contract, negligence or other tortious action, +arising out of or in connection with the use or performance of +this software. +****************************************************************/ + +#include "defs.h" +#include "output.h" +#include "names.h" +#include "format.h" + +#define MAX_INIT_LINE 100 +#define NAME_MAX 64 + +static int memno2info(); + +extern int in_string; +extern char *str_fmt[], *initbname; +extern void def_start(); + +void list_init_data(Infile, Inname, outfile) + FILE **Infile, *outfile; + char *Inname; +{ + FILE *sortfp; + int status; + + fclose(*Infile); + *Infile = 0; + + if (status = dsort(Inname, sortfname)) + fatali ("sort failed, status %d", status); + + if ((sortfp = fopen(sortfname, textread)) == NULL) + Fatal("Couldn't open sorted initialization data"); + + do_init_data(outfile, sortfp); + fclose(sortfp); + +/* Insert a blank line after any initialized data */ + + nice_printf (outfile, "\n"); + + if (debugflag && infname) + /* don't back block data file up -- it won't be overwritten */ + backup(initfname, initbname); +} /* list_init_data */ + + + +/* do_init_data -- returns YES when at least one declaration has been + written */ + +int do_init_data(outfile, infile) +FILE *outfile, *infile; +{ + char varname[NAME_MAX], ovarname[NAME_MAX]; + ftnint offset; + ftnint type; + int vargroup; /* 0 --> init, 1 --> equiv, 2 --> common */ + int did_one = 0; /* True when one has been output */ + chainp values = CHNULL; /* Actual data values */ + int keepit = 0; + Namep np; + + ovarname[0] = '\0'; + + while (rdname (infile, &vargroup, varname) && rdlong (infile, &offset) + && rdlong (infile, &type)) { + if (strcmp (varname, ovarname)) { + + /* If this is a new variable name, the old initialization has been + completed */ + + wr_one_init(outfile, ovarname, &values, keepit); + + strcpy (ovarname, varname); + values = CHNULL; + if (vargroup == 0) { + if (memno2info(atoi(varname+2), &np)) { + if (((Addrp)np)->uname_tag != UNAM_NAME) { + err("do_init_data: expected NAME"); + goto Keep; + } + np = ((Addrp)np)->user.name; + } + if (!(keepit = np->visused) && !np->vimpldovar) + warn1("local variable %s never used", + np->fvarname); + } + else { + Keep: + keepit = 1; + } + if (keepit && !did_one) { + nice_printf (outfile, "/* Initialized data */\n\n"); + did_one = YES; + } + } /* if strcmp */ + + values = mkchain((char *)data_value(infile, offset, (int)type), values); + } /* while */ + +/* Write out the last declaration */ + + wr_one_init (outfile, ovarname, &values, keepit); + + return did_one; +} /* do_init_data */ + + + void +wr_char_len(outfile, dimp, n, extra1) + FILE *outfile; + int n; + struct Dimblock *dimp; + int extra1; +{ + int i, nd; + expptr e; + + if (!dimp) { + nice_printf (outfile, extra1 ? "[%d+1]" : "[%d]", n); + return; + } + nice_printf(outfile, "[%d", n); + nd = dimp->ndim; + for(i = 0; i < nd; i++) { + e = dimp->dims[i].dimsize; + if (!ISICON (e)) + err ("wr_char_len: nonconstant array size"); + else + nice_printf(outfile, "*%ld", e->constblock.Const.ci); + } + /* extra1 allows for stupid C compilers that complain about + * too many initializers in + * char x[2] = "ab"; + */ + nice_printf(outfile, extra1 ? "+1]" : "]"); + } + + static int ch_ar_dim = -1; /* length of each element of char string array */ + static int eqvmemno; /* kludge */ + + static void +write_char_init(outfile, Values, namep) + FILE *outfile; + chainp *Values; + Namep namep; +{ + struct Equivblock *eqv; + long size; + struct Dimblock *dimp; + int i, nd, type; + expptr ds; + + if (!namep) + return; + if(nequiv >= maxequiv) + many("equivalences", 'q', maxequiv); + eqv = &eqvclass[nequiv]; + eqv->eqvbottom = 0; + type = namep->vtype; + size = type == TYCHAR + ? namep->vleng->constblock.Const.ci + : typesize[type]; + if (dimp = namep->vdim) + for(i = 0, nd = dimp->ndim; i < nd; i++) { + ds = dimp->dims[i].dimsize; + if (!ISICON(ds)) + err("write_char_values: nonconstant array size"); + else + size *= ds->constblock.Const.ci; + } + *Values = revchain(*Values); + eqv->eqvtop = size; + eqvmemno = ++lastvarno; + eqv->eqvtype = type; + wr_equiv_init(outfile, nequiv, Values, 0); + def_start(outfile, namep->cvarname, CNULL, ""); + if (type == TYCHAR) + ind_printf(0, outfile, "((char *)&equiv_%d)\n\n", eqvmemno); + else + ind_printf(0, outfile, dimp + ? "((%s *)&equiv_%d)\n\n" : "(*(%s *)&equiv_%d)\n\n", + c_type_decl(type,0), eqvmemno); + } + +/* wr_one_init -- outputs the initialization of the variable pointed to + by info. When is_addr is true, info is an Addrp; otherwise, + treat it as a Namep */ + +void wr_one_init (outfile, varname, Values, keepit) +FILE *outfile; +char *varname; +chainp *Values; +int keepit; +{ + static int memno; + static union { + Namep name; + Addrp addr; + } info; + Namep namep; + int is_addr, size; + ftnint last, loc; + int is_scalar = 0; + char *array_comment = NULL; + chainp cp, values; + extern char datachar[]; + static int e1[3] = {1, 0, 1}; + + if (!keepit) + goto done; + if (varname == NULL || varname[1] != '.') + goto badvar; + +/* Get back to a meaningful representation; find the given memno in one + of the appropriate tables (user-generated variables in the hash table, + system-generated variables in a separate list */ + + memno = atoi(varname + 2); + switch(varname[0]) { + case 'q': + /* Must subtract eqvstart when the source file + * contains more than one procedure. + */ + wr_equiv_init(outfile, eqvmemno = memno - eqvstart, Values, 0); + goto done; + case 'Q': + /* COMMON initialization (BLOCK DATA) */ + wr_equiv_init(outfile, memno, Values, 1); + goto done; + case 'v': + break; + default: + badvar: + errstr("wr_one_init: unknown variable name '%s'", varname); + goto done; + } + + is_addr = memno2info (memno, &info.name); + if (info.name == (Namep) NULL) { + err ("wr_one_init -- unknown variable"); + return; + } + if (is_addr) { + if (info.addr -> uname_tag != UNAM_NAME) { + erri ("wr_one_init -- couldn't get name pointer; tag is %d", + info.addr -> uname_tag); + namep = (Namep) NULL; + nice_printf (outfile, " /* bad init data */"); + } else + namep = info.addr -> user.name; + } else + namep = info.name; + + /* check for character initialization */ + + *Values = values = revchain(*Values); + if (info.name->vtype == TYCHAR) { + for(last = 1; values; values = values->nextp) { + cp = (chainp)values->datap; + loc = (ftnint)cp->datap; + if (loc > last) { + write_char_init(outfile, Values, namep); + goto done; + } + last = (int)cp->nextp->datap == TYBLANK + ? loc + (int)cp->nextp->nextp->datap + : loc + 1; + } + } + else { + size = typesize[info.name->vtype]; + loc = 0; + for(; values; values = values->nextp) { + if ((int)((chainp)values->datap)->nextp->datap == TYCHAR) { + write_char_init(outfile, Values, namep); + goto done; + } + last = ((long) ((chainp) values->datap)->datap) / size; + if (last - loc > 4) { + write_char_init(outfile, Values, namep); + goto done; + } + loc = last; + } + } + values = *Values; + + nice_printf (outfile, "static %s ", c_type_decl (info.name -> vtype, 0)); + + if (is_addr) + write_nv_ident (outfile, info.addr); + else + out_name (outfile, info.name); + + if (namep) + is_scalar = namep -> vdim == (struct Dimblock *) NULL; + + if (namep && !is_scalar) + array_comment = info.name->vtype == TYCHAR + ? 0 : wr_ardecls(outfile, namep->vdim, 1L); + + if (info.name -> vtype == TYCHAR) + if (ISICON (info.name -> vleng)) + +/* We'll make single strings one character longer, so that we can use the + standard C initialization. All this does is pad an extra zero onto the + end of the string */ + wr_char_len(outfile, namep->vdim, ch_ar_dim = + info.name -> vleng -> constblock.Const.ci, e1[Ansi]); + else + err ("variable length character initialization"); + + if (array_comment) + nice_printf (outfile, "%s", array_comment); + + nice_printf (outfile, " = "); + wr_output_values (outfile, namep, values); + ch_ar_dim = -1; + nice_printf (outfile, ";\n"); + done: + frchain(Values); +} /* wr_one_init */ + + + + +chainp data_value (infile, offset, type) +FILE *infile; +ftnint offset; +int type; +{ + char line[MAX_INIT_LINE + 1], *pointer; + chainp vals, prev_val; + long atol(); + char *newval; + + if (fgets (line, MAX_INIT_LINE, infile) == NULL) { + err ("data_value: error reading from intermediate file"); + return CHNULL; + } /* if fgets */ + +/* Get rid of the trailing newline */ + + if (line[0]) + line[strlen (line) - 1] = '\0'; + +#define iswhite(x) (isspace (x) || (x) == ',') + + pointer = line; + prev_val = vals = CHNULL; + + while (*pointer) { + register char *end_ptr, old_val; + +/* Move pointer to the start of the next word */ + + while (*pointer && iswhite (*pointer)) + pointer++; + if (*pointer == '\0') + break; + +/* Move end_ptr to the end of the current word */ + + for (end_ptr = pointer + 1; *end_ptr && !iswhite (*end_ptr); + end_ptr++) + ; + + old_val = *end_ptr; + *end_ptr = '\0'; + +/* Add this value to the end of the list */ + + if (ONEOF(type, MSKREAL|MSKCOMPLEX)) + newval = cpstring(pointer); + else + newval = (char *)atol(pointer); + if (vals) { + prev_val->nextp = mkchain(newval, CHNULL); + prev_val = prev_val -> nextp; + } else + prev_val = vals = mkchain(newval, CHNULL); + *end_ptr = old_val; + pointer = end_ptr; + } /* while *pointer */ + + return mkchain((char *)offset, mkchain((char *)type, vals)); +} /* data_value */ + + static void +overlapping() +{ + extern char *filename0; + static int warned = 0; + + if (warned) + return; + warned = 1; + + fprintf(stderr, "Error"); + if (filename0) + fprintf(stderr, " in file %s", filename0); + fprintf(stderr, ": overlapping initializations\n"); + nerr++; + } + + static void make_one_const(); + static long charlen; + +void wr_output_values (outfile, namep, values) +FILE *outfile; +Namep namep; +chainp values; +{ + int type = TYUNKNOWN; + struct Constblock Const; + static expptr Vlen; + + if (namep) + type = namep -> vtype; + +/* Handle array initializations away from scalars */ + + if (namep && namep -> vdim) + wr_array_init (outfile, namep -> vtype, values); + + else if (values->nextp && type != TYCHAR) + overlapping(); + + else { + make_one_const(type, &Const.Const, values); + Const.vtype = type; + Const.vstg = ONEOF(type, MSKREAL|MSKCOMPLEX); + if (type== TYCHAR) { + if (!Vlen) + Vlen = ICON(0); + Const.vleng = Vlen; + Vlen->constblock.Const.ci = charlen; + out_const (outfile, &Const); + free (Const.Const.ccp); + } + else + out_const (outfile, &Const); + } + } + + +wr_array_init (outfile, type, values) +FILE *outfile; +int type; +chainp values; +{ + int size = typesize[type]; + long index, main_index = 0; + int k; + + if (type == TYCHAR) { + nice_printf(outfile, "\""); + in_string = 1; + k = 0; + if (Ansi != 1) + ch_ar_dim = -1; + } + else + nice_printf (outfile, "{ "); + while (values) { + struct Constblock Const; + + index = ((long) ((chainp) values->datap)->datap) / size; + while (index > main_index) { + +/* Fill with zeros. The structure shorthand works because the compiler + will expand the "0" in braces to fill the size of the entire structure + */ + + switch (type) { + case TYREAL: + case TYDREAL: + nice_printf (outfile, "0.0,"); + break; + case TYCOMPLEX: + case TYDCOMPLEX: + nice_printf (outfile, "{0},"); + break; + case TYCHAR: + nice_printf(outfile, " "); + break; + default: + nice_printf (outfile, "0,"); + break; + } /* switch */ + main_index++; + } /* while index > main_index */ + + if (index < main_index) + overlapping(); + else switch (type) { + case TYCHAR: + { int this_char; + + if (k == ch_ar_dim) { + nice_printf(outfile, "\""); + in_string = 0; + nice_printf(outfile, " \""); + in_string = 1; + k = 0; + } + this_char = (int) ((chainp) values->datap)-> + nextp->nextp->datap; + if ((int)((chainp)values->datap)->nextp->datap == TYBLANK) { + main_index += this_char; + k += this_char; + while(--this_char >= 0) + nice_printf(outfile, " "); + values = values -> nextp; + continue; + } + nice_printf(outfile, + str_fmt[this_char & 0x7f], + this_char); + k++; + } /* case TYCHAR */ + break; + + case TYSHORT: + case TYLONG: + case TYREAL: + case TYDREAL: + case TYLOGICAL: + case TYCOMPLEX: + case TYDCOMPLEX: + make_one_const(type, &Const.Const, values); + Const.vtype = type; + Const.vstg = ONEOF(type, MSKREAL|MSKCOMPLEX); + out_const(outfile, &Const); + break; + default: + erri("wr_array_init: bad type '%d'", type); + break; + } /* switch */ + values = values->nextp; + + main_index++; + if (values && type != TYCHAR) + nice_printf (outfile, ","); + } /* while values */ + + if (type == TYCHAR) { + nice_printf(outfile, "\""); + in_string = 0; + } + else + nice_printf (outfile, " }"); +} /* wr_array_init */ + + + static void +make_one_const(type, storage, values) + int type; + union Constant *storage; + chainp values; +{ + union Constant *Const; + register char **L; + + if (type == TYCHAR) { + char *str, *str_ptr, *Alloc (); + chainp v, prev; + int b = 0, k, main_index = 0; + +/* Find the max length of init string, by finding the highest offset + value stored in the list of initial values */ + + for(k = 1, prev = CHNULL, v = values; v; prev = v, v = v->nextp) + ; + if (prev != CHNULL) + k = ((int) (((chainp) prev->datap)->datap)) + 2; + /* + 2 above for null char at end */ + str = Alloc (k); + for (str_ptr = str; values; str_ptr++) { + int index = (int) (((chainp) values->datap)->datap); + + if (index < main_index) + overlapping(); + while (index > main_index++) + *str_ptr++ = ' '; + + k = (int) (((chainp) values->datap)->nextp->nextp->datap); + if ((int)((chainp)values->datap)->nextp->datap == TYBLANK) { + b = k; + break; + } + *str_ptr = k; + values = values -> nextp; + } /* for str_ptr */ + *str_ptr = '\0'; + Const = storage; + Const -> ccp = str; + Const -> ccp1.blanks = b; + charlen = str_ptr - str; + } else { + int i = 0; + chainp vals; + + vals = ((chainp)values->datap)->nextp->nextp; + if (vals) { + L = (char **)storage; + do L[i++] = vals->datap; + while(vals = vals->nextp); + } + + } /* else */ + +} /* make_one_const */ + + + +rdname (infile, vargroupp, name) +FILE *infile; +int *vargroupp; +char *name; +{ + register int i, c; + + c = getc (infile); + + if (feof (infile)) + return NO; + + *vargroupp = c - '0'; + for (i = 1;; i++) { + if (i >= NAME_MAX) + Fatal("rdname: oversize name"); + c = getc (infile); + if (feof (infile)) + return NO; + if (c == '\t') + break; + *name++ = c; + } + *name = 0; + return YES; +} /* rdname */ + +rdlong (infile, n) +FILE *infile; +ftnint *n; +{ + register int c; + + for (c = getc (infile); !feof (infile) && isspace (c); c = getc (infile)) + ; + + if (feof (infile)) + return NO; + + for (*n = 0; isdigit (c); c = getc (infile)) + *n = 10 * (*n) + c - '0'; + return YES; +} /* rdlong */ + + + static int +memno2info (memno, info) + int memno; + Namep *info; +{ + chainp this_var; + extern chainp new_vars; + extern struct Hashentry *hashtab, *lasthash; + struct Hashentry *entry; + + for (this_var = new_vars; this_var; this_var = this_var -> nextp) { + Addrp var = (Addrp) this_var->datap; + + if (var == (Addrp) NULL) + Fatal("memno2info: null variable"); + else if (var -> tag != TADDR) + Fatal("memno2info: bad tag"); + if (memno == var -> memno) { + *info = (Namep) var; + return 1; + } /* if memno == var -> memno */ + } /* for this_var = new_vars */ + + for (entry = hashtab; entry < lasthash; ++entry) { + Namep var = entry -> varp; + + if (var && var -> vardesc.varno == memno && var -> vstg == STGINIT) { + *info = (Namep) var; + return 0; + } /* if entry -> vardesc.varno == memno */ + } /* for entry = hashtab */ + + Fatal("memno2info: couldn't find memno"); + return 0; +} /* memno2info */ + + static chainp +do_string(outfile, v, nloc) + FILEP outfile; + register chainp v; + ftnint *nloc; +{ + register chainp cp, v0; + ftnint dloc, k, loc; + extern char *chr_fmt[]; + unsigned long uk; + char buf[8], *comma; + + nice_printf(outfile, "{"); + cp = (chainp)v->datap; + loc = (ftnint)cp->datap; + comma = ""; + for(v0 = v;;) { + switch((int)cp->nextp->datap) { + case TYBLANK: + k = (ftnint)cp->nextp->nextp->datap; + loc += k; + while(--k >= 0) { + nice_printf(outfile, "%s' '", comma); + comma = ", "; + } + break; + case TYCHAR: + uk = (ftnint)cp->nextp->nextp->datap; + sprintf(buf, chr_fmt[uk < 0x7f ? uk : 0x7f], uk); + nice_printf(outfile, "%s'%s'", comma, buf); + comma = ", "; + loc++; + break; + default: + goto done; + } + v0 = v; + if (!(v = v->nextp)) + break; + cp = (chainp)v->datap; + dloc = (ftnint)cp->datap; + if (loc != dloc) + break; + } + done: + nice_printf(outfile, "}"); + *nloc = loc; + return v0; + } + + static chainp +Ado_string(outfile, v, nloc) + FILEP outfile; + register chainp v; + ftnint *nloc; +{ + register chainp cp, v0; + ftnint dloc, k, loc; + + nice_printf(outfile, "\""); + in_string = 1; + cp = (chainp)v->datap; + loc = (ftnint)cp->datap; + for(v0 = v;;) { + switch((int)cp->nextp->datap) { + case TYBLANK: + k = (ftnint)cp->nextp->nextp->datap; + loc += k; + while(--k >= 0) + nice_printf(outfile, " "); + break; + case TYCHAR: + k = (ftnint)cp->nextp->nextp->datap; + nice_printf(outfile, str_fmt[k & 0x7f], k); + loc++; + break; + default: + goto done; + } + v0 = v; + if (!(v = v->nextp)) + break; + cp = (chainp)v->datap; + dloc = (ftnint)cp->datap; + if (loc != dloc) + break; + } + done: + nice_printf(outfile, "\""); + in_string = 0; + *nloc = loc; + return v0; + } + + static char * +Len(L) + long L; +{ + static char buf[24]; + if (L == 1) + return ""; + sprintf(buf, "[%ld]", L); + return buf; + } + +wr_equiv_init(outfile, memno, Values, iscomm) + FILE *outfile; + int memno; + chainp *Values; + int iscomm; +{ + struct Equivblock *eqv; + char *equiv_name (); + int curtype, dtype, filltype, filltype1, j, k, wasblank, xtype; + static char Blank[] = ""; + register char *comma = Blank; + register chainp cp, v; + chainp sentinel, values, v1; + ftnint L, L1, dL, dloc, loc, loc0; + union Constant Const; + char imag_buf[50], real_buf[50]; + int szshort = typesize[TYSHORT]; + static char typepref[] = {0, 0, TYSHORT, TYLONG, TYREAL, TYDREAL, + TYREAL, TYDREAL, TYLOGICAL, TYCHAR}; + char *z; + + /* add sentinel */ + if (iscomm) { + L = extsymtab[memno].maxleng; + xtype = extsymtab[memno].extype; + } + else { + eqv = &eqvclass[memno]; + L = eqv->eqvtop - eqv->eqvbottom; + xtype = eqv->eqvtype; + } + + if (xtype != TYCHAR) { + + /* unless the data include a value of the appropriate + * type, we add an extra element in an attempt + * to force correct alignment */ + + for(v = *Values;;v = v->nextp) { + if (!v) { + dtype = typepref[xtype]; + z = ISREAL(dtype) ? cpstring("0.") : (char *)0; + k = typesize[dtype]; + if (j = L % k) + L += k - j; + v = mkchain((char *)L, + mkchain((char *)dtype, + mkchain(z, CHNULL))); + *Values = mkchain((char *)v, *Values); + L += k; + break; + } + if ((int)((chainp)v->datap)->nextp->datap == xtype) + break; + } + } + + sentinel = mkchain((char *)L, mkchain((char *)TYERROR,CHNULL)); + *Values = values = revchain(mkchain((char *)sentinel, *Values)); + + /* use doublereal fillers only if there are doublereal values */ + + k = TYLONG; + for(v = values; v; v = v->nextp) + if (ONEOF((int)((chainp)v->datap)->nextp->datap, + M(TYDREAL)|M(TYDCOMPLEX))) { + k = TYDREAL; + break; + } + type_choice[0] = k; + + nice_printf(outfile, "%sstruct {\n", iscomm ? "" : "static "); + next_tab(outfile); + loc = loc0 = k = 0; + curtype = -1; + for(v = values; v; v = v->nextp) { + cp = (chainp)v->datap; + dloc = (ftnint)cp->datap; + L = dloc - loc; + if (L < 0) { + overlapping(); + v1 = cp; + frchain(&v1); + v->datap = 0; + continue; + } + dtype = (int)cp->nextp->datap; + if (dtype == TYBLANK) { + dtype = TYCHAR; + wasblank = 1; + } + else + wasblank = 0; + if (curtype != dtype || L > 0) { + if (curtype != -1) { + L1 = (loc - loc0)/dL; + nice_printf(outfile, "%s e_%d%s;\n", + typename[curtype], ++k, Len(L1)); + } + curtype = dtype; + loc0 = dloc; + } + if (L > 0) { + if (xtype == TYCHAR) + filltype = TYCHAR; + else { + filltype = L % szshort ? TYCHAR + : type_choice[L/szshort % 4]; + filltype1 = loc % szshort ? TYCHAR + : type_choice[loc/szshort % 4]; + if (typesize[filltype] > typesize[filltype1]) + filltype = filltype1; + } + nice_printf(outfile, "struct { %s filler%s; } e_%d;\n", + typename[filltype], + Len(L/typesize[filltype]), ++k); + loc = dloc; + } + if (wasblank) { + loc += (ftnint)cp->nextp->nextp->datap; + dL = 1; + } + else { + dL = typesize[dtype]; + loc += dL; + } + } + nice_printf(outfile, "} %s = { ", iscomm + ? extsymtab[memno].cextname + : equiv_name(eqvmemno, CNULL)); + loc = 0; + for(v = values; ; v = v->nextp) { + cp = (chainp)v->datap; + if (!cp) + continue; + dtype = (int)cp->nextp->datap; + if (dtype == TYERROR) + break; + dloc = (ftnint)cp->datap; + if (dloc > loc) { + nice_printf(outfile, "%s{0}", comma); + comma = ", "; + loc = dloc; + } + if (comma != Blank) + nice_printf(outfile, ", "); + comma = ", "; + if (dtype == TYCHAR || dtype == TYBLANK) { + v = Ansi == 1 ? Ado_string(outfile, v, &loc) + : do_string(outfile, v, &loc); + continue; + } + make_one_const(dtype, &Const, v); + switch(dtype) { + case TYLOGICAL: + if (Const.ci < 0 || Const.ci > 1) + errl( + "wr_equiv_init: unexpected logical value %ld", + Const.ci); + nice_printf(outfile, + Const.ci ? "TRUE_" : "FALSE_"); + break; + case TYSHORT: + case TYLONG: + nice_printf(outfile, "%ld", Const.ci); + break; + case TYREAL: + nice_printf(outfile, "%s", + flconst(real_buf, Const.cds[0])); + break; + case TYDREAL: + nice_printf(outfile, "%s", Const.cds[0]); + break; + case TYCOMPLEX: + nice_printf(outfile, "%s, %s", + flconst(real_buf, Const.cds[0]), + flconst(imag_buf, Const.cds[1])); + break; + case TYDCOMPLEX: + nice_printf(outfile, "%s, %s", + Const.cds[0], Const.cds[1]); + break; + default: + erri("unexpected type %d in wr_equiv_init", + dtype); + } + loc += typesize[dtype]; + } + nice_printf(outfile, " };\n\n"); + prev_tab(outfile); + frchain(&sentinel); + } diff --git a/sources/f2c/ftypes.h b/sources/f2c/ftypes.h new file mode 100644 index 0000000..c8eb9b4 --- /dev/null +++ b/sources/f2c/ftypes.h @@ -0,0 +1,39 @@ + +/* variable types (stored in the vtype field of expptr) + * numeric assumptions: + * int < reals < complexes + * TYDREAL-TYREAL = TYDCOMPLEX-TYCOMPLEX + */ + +#define TYUNKNOWN 0 +#define TYADDR 1 +#define TYSHORT 2 +#define TYLONG 3 +#define TYREAL 4 +#define TYDREAL 5 +#define TYCOMPLEX 6 +#define TYDCOMPLEX 7 +#define TYLOGICAL 8 +#define TYCHAR 9 +#define TYSUBR 10 +#define TYERROR 11 +#define TYCILIST 12 +#define TYICILIST 13 +#define TYOLIST 14 +#define TYCLLIST 15 +#define TYALIST 16 +#define TYINLIST 17 +#define TYVOID 18 +#define TYLABEL 19 +#define TYFTNLEN 20 +/* TYVOID is not in any tables. */ + +/* NTYPES, NTYPES0 -- Total number of types, used to allocate tables indexed by + type. Such tables can include the size (in bytes) of objects of a given + type, or labels for returning objects of different types from procedures + (see array rtvlabels) */ + +#define NTYPES TYVOID +#define NTYPES0 TYCILIST +#define TYBLANK TYSUBR /* Huh? */ + diff --git a/sources/f2c/gram.c b/sources/f2c/gram.c new file mode 100644 index 0000000..18869f3 --- /dev/null +++ b/sources/f2c/gram.c @@ -0,0 +1,2486 @@ +# define SEOS 1 +# define SCOMMENT 2 +# define SLABEL 3 +# define SUNKNOWN 4 +# define SHOLLERITH 5 +# define SICON 6 +# define SRCON 7 +# define SDCON 8 +# define SBITCON 9 +# define SOCTCON 10 +# define SHEXCON 11 +# define STRUE 12 +# define SFALSE 13 +# define SNAME 14 +# define SNAMEEQ 15 +# define SFIELD 16 +# define SSCALE 17 +# define SINCLUDE 18 +# define SLET 19 +# define SASSIGN 20 +# define SAUTOMATIC 21 +# define SBACKSPACE 22 +# define SBLOCK 23 +# define SCALL 24 +# define SCHARACTER 25 +# define SCLOSE 26 +# define SCOMMON 27 +# define SCOMPLEX 28 +# define SCONTINUE 29 +# define SDATA 30 +# define SDCOMPLEX 31 +# define SDIMENSION 32 +# define SDO 33 +# define SDOUBLE 34 +# define SELSE 35 +# define SELSEIF 36 +# define SEND 37 +# define SENDFILE 38 +# define SENDIF 39 +# define SENTRY 40 +# define SEQUIV 41 +# define SEXTERNAL 42 +# define SFORMAT 43 +# define SFUNCTION 44 +# define SGOTO 45 +# define SASGOTO 46 +# define SCOMPGOTO 47 +# define SARITHIF 48 +# define SLOGIF 49 +# define SIMPLICIT 50 +# define SINQUIRE 51 +# define SINTEGER 52 +# define SINTRINSIC 53 +# define SLOGICAL 54 +# define SNAMELIST 55 +# define SOPEN 56 +# define SPARAM 57 +# define SPAUSE 58 +# define SPRINT 59 +# define SPROGRAM 60 +# define SPUNCH 61 +# define SREAD 62 +# define SREAL 63 +# define SRETURN 64 +# define SREWIND 65 +# define SSAVE 66 +# define SSTATIC 67 +# define SSTOP 68 +# define SSUBROUTINE 69 +# define STHEN 70 +# define STO 71 +# define SUNDEFINED 72 +# define SWRITE 73 +# define SLPAR 74 +# define SRPAR 75 +# define SEQUALS 76 +# define SCOLON 77 +# define SCOMMA 78 +# define SCURRENCY 79 +# define SPLUS 80 +# define SMINUS 81 +# define SSTAR 82 +# define SSLASH 83 +# define SPOWER 84 +# define SCONCAT 85 +# define SAND 86 +# define SOR 87 +# define SNEQV 88 +# define SEQV 89 +# define SNOT 90 +# define SEQ 91 +# define SLT 92 +# define SGT 93 +# define SLE 94 +# define SGE 95 +# define SNE 96 +# define SENDDO 97 +# define SWHILE 98 +# define SSLASHD 99 + +/* # line 124 "gram.in" */ +# include "defs.h" +# include "p1defs.h" + +static int nstars; /* Number of labels in an + alternate return CALL */ +static int ndim; +static int vartype; +int new_dcl; +static ftnint varleng; +static struct { expptr lb, ub; } dims[MAXDIM+1]; +static struct Labelblock *labarray[MAXLABLIST]; /* Labels in an alternate + return CALL */ + +/* The next two variables are used to verify that each statement might be reached + during runtime. lastwasbranch is tested only in the defintion of the + stat: nonterminal. */ + +int lastwasbranch = NO; +static int thiswasbranch = NO; +extern ftnint yystno; +extern flag intonly; +static chainp datastack; +extern long laststfcn, thisstno; +extern int can_include; /* for netlib */ + +ftnint convci(); +Addrp nextdata(); +expptr mklogcon(), mkaddcon(), mkrealcon(), mkstrcon(), mkbitcon(); +expptr mkcxcon(); +struct Listblock *mklist(); +struct Listblock *mklist(); +struct Impldoblock *mkiodo(); +Extsym *comblock(); +#define ESNULL (Extsym *)0 +#define NPNULL (Namep)0 +#define LBNULL (struct Listblock *)0 +extern void freetemps(), make_param(); + + static void +pop_datastack() { + chainp d0 = datastack; + if (d0->datap) + curdtp = (chainp)d0->datap; + datastack = d0->nextp; + d0->nextp = 0; + frchain(&d0); + } + + +/* # line 176 "gram.in" */ +typedef union { + int ival; + ftnint lval; + char *charpval; + chainp chval; + tagptr tagval; + expptr expval; + struct Labelblock *labval; + struct Nameblock *namval; + struct Eqvchain *eqvval; + Extsym *extval; + } YYSTYPE; +#define yyclearin yychar = -1 +#define yyerrok yyerrflag = 0 +extern int yychar; +extern int yyerrflag; +#ifndef YYMAXDEPTH +#define YYMAXDEPTH 150 +#endif +YYSTYPE yylval, yyval; +typedef int yytabelem; +# define YYERRCODE 256 +yytabelem yyexca[] ={ +-1, 1, + 0, -1, + -2, 0, +-1, 20, + 1, 38, + -2, 228, +-1, 24, + 1, 42, + -2, 228, +-1, 122, + 6, 240, + -2, 228, +-1, 150, + 1, 244, + -2, 188, +-1, 174, + 1, 265, + 78, 265, + -2, 188, +-1, 223, + 77, 173, + -2, 139, +-1, 245, + 74, 228, + -2, 225, +-1, 271, + 1, 286, + -2, 143, +-1, 275, + 1, 295, + 78, 295, + -2, 145, +-1, 328, + 77, 174, + -2, 141, +-1, 358, + 1, 267, + 14, 267, + 74, 267, + 78, 267, + -2, 189, +-1, 436, + 91, 0, + 92, 0, + 93, 0, + 94, 0, + 95, 0, + 96, 0, + -2, 153, +-1, 453, + 1, 289, + 78, 289, + -2, 143, +-1, 455, + 1, 291, + 78, 291, + -2, 143, +-1, 457, + 1, 293, + 78, 293, + -2, 143, +-1, 459, + 1, 296, + 78, 296, + -2, 144, +-1, 504, + 78, 289, + -2, 143, + }; +# define YYNPROD 301 +# define YYLAST 1346 +yytabelem yyact[]={ + + 237, 274, 471, 317, 316, 412, 420, 297, 470, 399, + 413, 397, 386, 357, 398, 266, 128, 356, 273, 252, + 292, 5, 116, 295, 326, 303, 222, 99, 184, 121, + 195, 229, 17, 203, 270, 304, 313, 199, 201, 118, + 94, 202, 396, 104, 210, 183, 236, 101, 106, 234, + 264, 103, 111, 336, 260, 95, 96, 97, 165, 166, + 334, 335, 336, 395, 105, 311, 309, 190, 130, 131, + 132, 133, 120, 135, 119, 114, 157, 129, 157, 475, + 103, 272, 334, 335, 336, 396, 521, 103, 278, 483, + 535, 165, 166, 334, 335, 336, 342, 341, 340, 339, + 338, 137, 343, 345, 344, 347, 346, 348, 450, 258, + 259, 260, 539, 165, 166, 258, 259, 260, 261, 525, + 102, 522, 155, 409, 155, 186, 187, 103, 408, 117, + 165, 166, 258, 259, 260, 318, 100, 527, 484, 188, + 446, 185, 480, 230, 240, 240, 194, 193, 290, 120, + 211, 119, 462, 481, 157, 294, 482, 257, 157, 243, + 468, 214, 463, 469, 461, 464, 460, 239, 241, 220, + 215, 218, 157, 219, 213, 165, 166, 334, 335, 336, + 342, 341, 340, 157, 371, 452, 343, 345, 344, 347, + 346, 348, 443, 428, 377, 294, 102, 102, 102, 102, + 155, 189, 447, 149, 155, 446, 192, 103, 98, 196, + 197, 198, 277, 376, 320, 321, 206, 288, 155, 289, + 300, 375, 299, 324, 315, 328, 275, 275, 330, 155, + 310, 333, 196, 216, 217, 350, 269, 207, 308, 352, + 353, 333, 100, 177, 354, 349, 323, 112, 245, 257, + 247, 110, 157, 417, 286, 287, 418, 362, 157, 157, + 157, 157, 157, 257, 257, 109, 108, 268, 279, 280, + 281, 265, 107, 355, 4, 333, 427, 465, 378, 370, + 170, 172, 176, 257, 165, 166, 258, 259, 260, 261, + 102, 406, 232, 293, 407, 381, 422, 390, 155, 400, + 391, 223, 419, 422, 155, 155, 155, 155, 155, 117, + 221, 314, 392, 319, 387, 359, 372, 196, 360, 373, + 374, 333, 333, 536, 350, 333, 275, 250, 424, 333, + 405, 333, 410, 532, 230, 432, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 403, 331, 156, 401, 332, + 531, 333, 530, 333, 333, 333, 388, 526, 380, 529, + 524, 157, 257, 333, 431, 492, 257, 257, 257, 257, + 257, 382, 383, 235, 426, 384, 358, 494, 296, 333, + 448, 165, 166, 258, 259, 260, 261, 451, 165, 166, + 258, 259, 260, 261, 103, 445, 472, 400, 421, 191, + 402, 196, 103, 150, 307, 174, 285, 155, 474, 246, + 476, 416, 467, 466, 242, 226, 223, 200, 212, 136, + 209, 486, 171, 488, 490, 275, 275, 275, 141, 240, + 496, 429, 329, 333, 333, 333, 333, 333, 333, 333, + 333, 333, 333, 403, 497, 479, 401, 403, 487, 154, + 257, 154, 495, 493, 306, 485, 502, 454, 456, 458, + 500, 491, 268, 499, 505, 506, 507, 103, 451, 271, + 271, 472, 30, 333, 414, 501, 400, 508, 511, 509, + 387, 244, 208, 510, 516, 514, 515, 333, 517, 333, + 513, 333, 520, 293, 518, 225, 240, 333, 402, 523, + 92, 248, 402, 528, 6, 262, 123, 249, 81, 80, + 275, 275, 275, 79, 534, 533, 479, 78, 173, 263, + 314, 77, 403, 76, 537, 401, 351, 154, 75, 333, + 282, 154, 60, 49, 48, 333, 45, 33, 333, 538, + 113, 205, 454, 456, 458, 154, 267, 165, 166, 334, + 335, 336, 342, 540, 503, 411, 154, 204, 394, 393, + 298, 478, 503, 503, 503, 134, 389, 312, 115, 379, + 26, 25, 24, 23, 302, 22, 305, 402, 21, 385, + 284, 9, 503, 8, 7, 2, 519, 301, 20, 319, + 164, 51, 489, 291, 228, 327, 325, 415, 91, 361, + 255, 53, 337, 19, 55, 365, 366, 367, 368, 369, + 37, 224, 3, 1, 0, 351, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 154, 0, 0, 0, 0, + 0, 154, 154, 154, 154, 154, 0, 0, 0, 267, + 0, 512, 267, 267, 165, 166, 334, 335, 336, 342, + 341, 340, 339, 338, 0, 343, 345, 344, 347, 346, + 348, 165, 166, 334, 335, 336, 342, 341, 453, 455, + 457, 0, 343, 345, 344, 347, 346, 348, 0, 0, + 305, 0, 459, 0, 0, 0, 0, 165, 166, 334, + 335, 336, 342, 341, 340, 339, 338, 351, 343, 345, + 344, 347, 346, 348, 444, 0, 0, 0, 449, 165, + 166, 334, 335, 336, 342, 341, 340, 339, 338, 0, + 343, 345, 344, 347, 346, 348, 165, 166, 334, 335, + 336, 342, 0, 0, 154, 0, 498, 343, 345, 344, + 347, 346, 348, 0, 0, 267, 0, 0, 0, 0, + 0, 442, 0, 504, 455, 457, 165, 166, 334, 335, + 336, 342, 341, 340, 339, 338, 0, 343, 345, 344, + 347, 346, 348, 0, 0, 0, 0, 0, 0, 430, + 0, 477, 0, 305, 165, 166, 334, 335, 336, 342, + 341, 340, 339, 338, 0, 343, 345, 344, 347, 346, + 348, 423, 0, 0, 0, 0, 165, 166, 334, 335, + 336, 342, 341, 340, 339, 338, 0, 343, 345, 344, + 347, 346, 348, 0, 0, 0, 267, 0, 0, 0, + 0, 165, 166, 334, 335, 336, 342, 341, 340, 339, + 338, 12, 343, 345, 344, 347, 346, 348, 0, 0, + 0, 0, 0, 0, 305, 10, 56, 46, 73, 85, + 14, 61, 70, 90, 38, 66, 47, 42, 68, 72, + 31, 67, 35, 34, 11, 87, 36, 18, 41, 39, + 28, 16, 57, 58, 59, 50, 54, 43, 88, 64, + 40, 69, 44, 89, 29, 62, 84, 13, 0, 82, + 65, 52, 86, 27, 74, 63, 15, 0, 0, 71, + 83, 160, 161, 162, 163, 169, 168, 167, 158, 159, + 103, 0, 160, 161, 162, 163, 169, 168, 167, 158, + 159, 103, 0, 0, 32, 160, 161, 162, 163, 169, + 168, 167, 158, 159, 103, 0, 160, 161, 162, 163, + 169, 168, 167, 158, 159, 103, 0, 160, 161, 162, + 163, 169, 168, 167, 158, 159, 103, 0, 160, 161, + 162, 163, 169, 168, 167, 158, 159, 103, 0, 0, + 233, 0, 0, 0, 0, 0, 165, 166, 363, 0, + 364, 233, 227, 0, 0, 0, 238, 165, 166, 231, + 0, 0, 0, 0, 233, 0, 0, 238, 0, 0, + 165, 166, 473, 0, 0, 233, 0, 0, 0, 0, + 238, 165, 166, 231, 0, 0, 233, 0, 0, 0, + 0, 238, 165, 166, 425, 0, 0, 233, 0, 0, + 0, 0, 238, 165, 166, 0, 0, 0, 0, 0, + 0, 0, 0, 238, 160, 161, 162, 163, 169, 168, + 167, 158, 159, 103, 0, 160, 161, 162, 163, 169, + 168, 167, 158, 159, 103, 160, 161, 162, 163, 169, + 168, 167, 158, 159, 103, 0, 0, 0, 160, 161, + 162, 163, 169, 168, 167, 158, 159, 103, 256, 0, + 93, 160, 161, 162, 163, 169, 168, 167, 158, 159, + 103, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 276, 0, 0, 0, 0, 0, 165, + 166, 0, 122, 0, 322, 125, 126, 127, 0, 238, + 165, 166, 0, 0, 0, 0, 0, 138, 139, 0, + 238, 140, 0, 142, 143, 144, 0, 251, 145, 146, + 147, 0, 148, 165, 166, 253, 0, 254, 0, 0, + 153, 0, 0, 0, 0, 0, 165, 166, 151, 0, + 152, 178, 179, 180, 181, 182, 160, 161, 162, 163, + 169, 168, 167, 158, 159, 103, 160, 161, 162, 163, + 169, 168, 167, 158, 159, 103, 160, 161, 162, 163, + 169, 168, 167, 158, 159, 103, 160, 161, 162, 163, + 169, 168, 167, 158, 159, 103, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 251, 0, 0, 0, 0, + 0, 165, 166, 283, 0, 153, 0, 0, 0, 0, + 0, 165, 166, 175, 0, 404, 0, 0, 0, 0, + 0, 165, 166, 56, 46, 251, 85, 0, 61, 0, + 90, 165, 166, 47, 73, 0, 0, 0, 70, 0, + 0, 66, 87, 0, 68, 72, 0, 67, 0, 57, + 58, 59, 50, 0, 0, 88, 0, 0, 0, 0, + 89, 0, 62, 84, 0, 64, 82, 69, 52, 86, + 0, 0, 63, 0, 124, 0, 65, 83, 0, 0, + 74, 0, 0, 0, 0, 71 }; +yytabelem yypact[]={ + + -1000, 18, 503, 837, -1000, -1000, -1000, -1000, -1000, -1000, + 495, -1000, -1000, -1000, -1000, -1000, -1000, 164, 453, -35, + 194, 188, 187, 173, 58, 169, -8, 66, -1000, -1000, + -1000, -1000, -1000, 1264, -1000, -1000, -1000, -5, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, 453, -1000, -1000, -1000, -1000, + -1000, 354, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, 1096, 348, 1191, 348, 165, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, 453, 453, 453, 453, -1000, 453, + -1000, 325, -1000, -1000, 453, -1000, -11, 453, 453, 453, + 343, -1000, -1000, -1000, 453, 159, -1000, -1000, -1000, -1000, + 468, 346, 58, -1000, -1000, 344, -1000, -1000, -1000, -1000, + 66, 453, 453, 343, -1000, -1000, 234, 342, 489, -1000, + 341, 917, 963, 963, 340, 475, 453, 335, 453, -1000, + -1000, -1000, -1000, 1083, -1000, -1000, 308, 1211, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, 1083, 193, 158, -1000, -1000, 1049, 1049, -1000, -1000, + -1000, -1000, 1181, 332, -1000, -1000, 325, 325, 453, -1000, + -1000, 73, 304, -1000, 58, -1000, 304, -1000, -1000, -1000, + 453, -1000, 380, -1000, 330, 1273, -17, 66, -18, 453, + 475, 37, 963, 1060, -1000, 453, -1000, -1000, -1000, -1000, + -1000, 963, -1000, 963, 361, -1000, 963, -1000, 271, -1000, + 751, 475, -1000, 963, -1000, -1000, -1000, 963, 963, -1000, + 751, -1000, 963, -1000, -1000, 58, 475, -1000, 301, 240, + -1000, 1211, -1000, -1000, -1000, 906, -1000, 1211, 1211, 1211, + 1211, 1211, -30, 204, 106, 388, -1000, -1000, 388, 388, + -1000, 143, 135, 116, 751, -1000, 1049, -1000, -1000, -1000, + -1000, -1000, 308, -1000, -1000, 300, -1000, -1000, 325, -1000, + -1000, 222, -1000, -1000, -1000, -5, -1000, -36, 1201, 453, + -1000, 216, -1000, 45, -1000, -1000, 380, 460, -1000, 453, + -1000, -1000, 178, -1000, 226, -1000, -1000, -1000, 324, 220, + 726, 751, 952, -1000, 751, 299, 199, 115, 751, 453, + 704, -1000, 941, 963, 963, 963, 963, 963, 963, 963, + 963, 963, 963, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + 676, 114, -31, 646, 629, 321, 127, -1000, -1000, -1000, + 1083, 33, 751, -1000, -1000, 27, -30, -30, -30, 50, + -1000, 388, 106, 107, 106, 1049, 1049, 1049, 607, 88, + 86, 74, -1000, -1000, -1000, 87, -1000, 201, -1000, 304, + -1000, 113, -1000, 85, 930, -1000, 1201, -1000, -1000, -3, + 1070, -1000, -1000, -1000, 963, -1000, -1000, 453, -1000, 380, + 64, 78, -1000, 8, -1000, 60, -1000, -1000, 453, 963, + 58, 963, 963, 391, -1000, 290, 303, 963, 963, -1000, + 475, -1000, 0, -31, -31, -31, 467, 95, 95, 581, + 646, -22, -1000, 963, -1000, 475, 475, 58, -1000, 308, + -1000, -1000, 388, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + 1049, 1049, 1049, -1000, 466, 465, -5, -1000, -1000, 930, + -1000, -1000, 564, -1000, -1000, 1201, -1000, -1000, -1000, -1000, + 380, -1000, 460, 460, 453, -1000, 751, 37, 11, 43, + 751, -1000, -1000, -1000, 963, 285, 751, 41, 282, 62, + -1000, 963, 284, 227, 282, 277, 275, 258, -1000, -1000, + -1000, -1000, 930, -1000, -1000, 7, 248, -1000, -1000, -1000, + -1000, -1000, 963, -1000, -1000, 475, -1000, -1000, 751, -1000, + -1000, -1000, -1000, -1000, 751, -1000, -1000, 751, 34, 475, + -1000 }; +yytabelem yypgo[]={ + + 0, 613, 612, 13, 611, 81, 15, 32, 610, 604, + 603, 10, 0, 602, 601, 600, 16, 598, 35, 25, + 597, 596, 595, 3, 4, 594, 67, 593, 592, 50, + 34, 18, 26, 101, 20, 591, 30, 373, 1, 292, + 24, 347, 327, 2, 9, 14, 31, 49, 46, 590, + 588, 39, 28, 45, 587, 585, 584, 583, 581, 1100, + 40, 580, 579, 12, 578, 575, 573, 572, 571, 570, + 568, 29, 567, 27, 566, 23, 41, 7, 44, 6, + 37, 565, 38, 561, 560, 11, 22, 36, 559, 558, + 8, 17, 33, 557, 555, 541, 5, 540, 472, 537, + 536, 534, 533, 532, 528, 203, 523, 521, 518, 517, + 513, 509, 88, 508, 507, 19 }; +yytabelem yyr1[]={ + + 0, 1, 1, 55, 55, 55, 55, 55, 55, 55, + 2, 56, 56, 56, 56, 56, 56, 56, 60, 52, + 33, 53, 53, 61, 61, 62, 62, 63, 63, 26, + 26, 26, 27, 27, 34, 34, 17, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, 57, 10, + 10, 10, 74, 7, 8, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 16, 16, 16, 50, + 50, 50, 50, 51, 51, 64, 64, 65, 65, 66, + 66, 80, 54, 54, 67, 67, 81, 82, 76, 83, + 84, 77, 77, 85, 85, 45, 45, 45, 70, 70, + 86, 86, 72, 72, 87, 36, 18, 18, 19, 19, + 75, 75, 89, 88, 88, 90, 90, 43, 43, 91, + 91, 3, 68, 68, 92, 92, 95, 93, 94, 94, + 96, 96, 11, 69, 69, 97, 20, 20, 71, 21, + 21, 22, 22, 38, 38, 38, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 12, 12, 13, 13, 13, 13, 13, 13, 37, 37, + 37, 37, 32, 40, 40, 44, 44, 48, 48, 48, + 48, 48, 48, 48, 47, 49, 49, 49, 41, 41, + 42, 42, 42, 42, 42, 42, 42, 42, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 99, 23, 24, + 24, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 4, 100, 101, 101, 101, 101, 73, 73, + 35, 25, 25, 46, 46, 14, 14, 28, 28, 59, + 78, 79, 102, 103, 103, 103, 103, 103, 103, 103, + 103, 103, 103, 103, 103, 103, 103, 104, 111, 111, + 111, 106, 113, 113, 113, 108, 108, 105, 105, 114, + 114, 115, 115, 115, 115, 115, 115, 15, 107, 109, + 110, 110, 29, 29, 6, 6, 30, 30, 30, 31, + 31, 31, 31, 31, 31, 5, 5, 5, 5, 5, + 112 }; +yytabelem yyr2[]={ + + 0, 0, 6, 5, 4, 5, 7, 7, 5, 3, + 3, 7, 9, 7, 9, 9, 11, 7, 1, 3, + 3, 1, 2, 4, 6, 2, 6, 2, 6, 1, + 5, 7, 3, 7, 3, 3, 3, 2, 2, 2, + 2, 2, 2, 2, 2, 3, 5, 3, 11, 15, + 11, 11, 1, 5, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 1, 9, 13, 7, + 9, 11, 7, 3, 7, 7, 7, 7, 7, 6, + 6, 7, 3, 7, 6, 6, 1, 13, 1, 1, + 1, 4, 6, 3, 7, 2, 5, 2, 2, 6, + 3, 2, 2, 6, 7, 5, 3, 11, 3, 7, + 1, 6, 1, 4, 6, 3, 7, 3, 2, 3, + 7, 3, 7, 6, 8, 3, 1, 4, 2, 6, + 3, 7, 3, 2, 4, 9, 3, 7, 1, 1, + 2, 3, 7, 2, 7, 2, 2, 2, 7, 7, + 7, 7, 5, 7, 7, 7, 7, 7, 5, 7, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, + 9, 11, 11, 1, 2, 3, 2, 3, 3, 3, + 3, 3, 3, 2, 11, 3, 3, 3, 2, 7, + 2, 2, 7, 7, 7, 7, 5, 7, 2, 15, + 9, 3, 5, 4, 13, 5, 5, 11, 7, 2, + 9, 9, 11, 4, 2, 3, 21, 3, 7, 9, + 7, 7, 3, 3, 7, 7, 15, 15, 0, 2, + 7, 3, 7, 2, 5, 3, 3, 3, 7, 1, + 1, 1, 3, 4, 5, 5, 5, 4, 5, 5, + 7, 9, 9, 5, 7, 3, 7, 6, 3, 3, + 3, 6, 3, 3, 3, 3, 3, 7, 7, 2, + 6, 3, 3, 3, 5, 5, 5, 3, 7, 7, + 9, 9, 3, 7, 3, 11, 3, 3, 2, 7, + 7, 7, 7, 7, 7, 3, 7, 11, 11, 11, + 1 }; +yytabelem yychk[]={ + + -1000, -1, -55, -2, 256, 3, 1, -56, -57, -58, + 18, 37, 4, 60, 23, 69, 44, -7, 40, -10, + -50, -64, -65, -66, -67, -68, -69, 66, 43, 57, + -98, 33, 97, -99, 36, 35, 39, -8, 27, 42, + 53, 41, 30, 50, 55, -100, 20, 29, -101, -102, + 48, -35, 64, -14, 49, -9, 19, 45, 46, 47, + -103, 24, 58, 68, 52, 63, 28, 34, 31, 54, + 25, 72, 32, 21, 67, -104, -106, -107, -109, -110, + -111, -113, 62, 73, 59, 22, 65, 38, 51, 56, + 26, -17, 5, -59, -60, -60, -60, -60, 44, -73, + 78, -52, -33, 14, 78, 99, -73, 78, 78, 78, + 78, -73, 78, -97, 83, -70, -86, -33, -51, 85, + 83, -71, -59, -98, 70, -59, -59, -59, -16, 82, + -71, -71, -71, -71, -81, -71, -37, -33, -59, -59, + -59, 74, -59, -59, -59, -59, -59, -59, -59, -105, + -42, 82, 84, 74, -37, -48, -41, -12, 12, 13, + 5, 6, 7, 8, -49, 80, 81, 11, 10, 9, + -105, 74, -105, -108, -42, 82, -105, 78, -59, -59, + -59, -59, -59, -53, -52, -53, -52, -52, -60, -33, + -26, 74, -33, -76, -51, -36, -33, -33, -33, -80, + 74, -82, -76, -92, -93, -95, -33, 78, 14, 74, + -78, -73, 74, -78, -36, -51, -33, -33, -80, -82, + -92, 76, -32, 74, -4, 6, 74, 75, -25, -46, + -38, 82, -39, 74, -47, -37, -48, -12, 90, -40, + -38, -40, 74, -3, 6, -33, 74, -33, -41, -114, + -42, 74, -115, 82, 84, -15, 15, -12, 82, 83, + 84, 85, -41, -41, -29, 78, -6, -37, 74, 78, + -30, -39, -5, -31, -38, -47, 74, -30, -112, -112, + -112, -112, -41, 82, -61, 74, -26, -26, -52, -71, + 75, -27, -34, -33, 82, -75, 74, -77, -84, -73, + -75, -54, -37, -19, -18, -37, 74, 74, -7, 83, + -86, 83, -72, -87, -33, -3, -24, -23, 98, -33, + -38, -38, 74, -36, -38, -21, -40, -22, -38, 71, + -38, 75, 78, -12, 82, 83, 84, -13, 89, 88, + 87, 86, 85, 91, 93, 92, 95, 94, 96, -3, + -38, -39, -38, -38, -38, -73, -91, -3, 75, 75, + 78, -41, -38, 82, 84, -41, -41, -41, -41, -41, + 75, 78, -29, -29, -29, 78, 78, 78, -38, -39, + -5, -31, -112, -112, 75, -62, -63, 14, -26, -74, + 75, 78, -16, -88, -89, 99, 78, -85, -45, -44, + -12, -47, -33, -48, 74, -36, 75, 78, 83, 78, + -19, -94, -96, -11, 14, -20, -33, 75, 78, 76, + -79, 74, 76, 75, -79, 82, 75, 77, 78, -33, + 75, -46, -38, -38, -38, -38, -38, -38, -38, -38, + -38, -38, 75, 78, 75, 74, 78, 75, -115, -41, + 75, -6, 78, -39, -5, -39, -5, -39, -5, 75, + 78, 78, 78, 75, 78, 76, -75, -34, 75, 78, + -90, -43, -38, 82, -85, 82, -44, -37, -83, -18, + 78, 75, 78, 81, 78, -87, -38, -73, -38, -28, + -38, 70, 75, -32, 74, -40, -38, -3, -39, -91, + -3, -73, -23, -33, -39, -23, -23, -23, -63, 14, + -16, -90, 77, -45, -44, -77, -23, -96, -11, -33, + -24, 75, 78, -79, 75, 78, 75, 75, -38, 75, + 75, 75, 75, -43, -38, 83, 75, -38, -3, 78, + -3 }; +yytabelem yydef[]={ + + 1, -2, 0, 0, 9, 10, 2, 3, 4, 5, + 0, 239, 8, 18, 18, 18, 18, 228, 0, 37, + -2, 39, 40, 41, -2, 43, 44, 45, 47, 138, + 198, 239, 201, 0, 239, 239, 239, 66, 138, 138, + 138, 138, 86, 138, 133, 0, 239, 239, 214, 215, + 239, 217, 239, 239, 239, 54, 223, 239, 239, 239, + 242, 239, 235, 236, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 0, 0, 0, 0, 255, + 239, 239, 239, 239, 239, 258, 259, 260, 262, 263, + 264, 6, 36, 7, 21, 21, 0, 0, 18, 0, + 229, 29, 19, 20, 0, 88, 0, 229, 0, 0, + 0, 88, 126, 134, 0, 46, 98, 100, 101, 73, + 0, 0, -2, 202, 203, 0, 205, 206, 53, 240, + 0, 0, 0, 0, 88, 126, 0, 168, 0, 213, + 0, 0, 173, 173, 0, 0, 0, 0, 0, 243, + -2, 245, 246, 0, 190, 191, 0, 0, 177, 178, + 179, 180, 181, 182, 183, 160, 161, 185, 186, 187, + 247, 0, 248, 249, -2, 266, 253, 0, 300, 300, + 300, 300, 0, 11, 22, 13, 29, 29, 0, 138, + 17, 0, 110, 90, 228, 72, 110, 76, 78, 80, + 0, 85, 0, 123, 125, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 69, 0, 75, 77, 79, 84, + 122, 0, 169, -2, 0, 222, 0, 218, 0, 231, + 233, 0, 143, 0, 145, 146, 147, 0, 0, 220, + 174, 221, 0, 224, 121, -2, 0, 230, 271, 0, + 188, 0, 269, 272, 273, 0, 277, 0, 0, 0, + 0, 0, 196, 271, 250, 0, 282, 284, 0, 0, + 254, -2, 287, 288, 0, -2, 0, 256, 257, 261, + 278, 279, 300, 300, 12, 0, 14, 15, 29, 52, + 30, 0, 32, 34, 35, 66, 112, 0, 0, 0, + 105, 0, 82, 0, 108, 106, 0, 0, 127, 0, + 99, 74, 0, 102, 0, 241, 200, 209, 0, 0, + 0, 241, 0, 70, 211, 0, 0, 140, -2, 0, + 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 162, 163, 164, 165, 166, 167, 234, + 0, 143, 152, 158, 0, 0, 0, 119, -2, 268, + 0, 0, 274, 275, 276, 192, 193, 194, 195, 197, + 267, 0, 252, 0, 251, 0, 0, 0, 0, 143, + 0, 0, 280, 281, 23, 0, 25, 27, 16, 110, + 31, 0, 50, 0, 0, 51, 0, 91, 93, 95, + 0, 97, 175, 176, 0, 71, 81, 0, 89, 0, + 0, 0, 128, 130, 132, 135, 136, 48, 0, 0, + 228, 0, 0, 0, 67, 0, 170, 173, 0, 212, + 0, 232, 148, 149, 150, 151, -2, 154, 155, 156, + 157, 159, 144, 0, 207, 0, 0, 228, 270, 271, + 189, 283, 0, -2, 290, -2, 292, -2, 294, -2, + 0, 0, 0, 24, 0, 0, 66, 33, 111, 0, + 113, 115, 118, 117, 92, 0, 96, 83, 90, 109, + 0, 124, 0, 0, 0, 103, 104, 0, 0, 208, + 237, 204, 241, 171, 173, 0, 142, 0, 143, 0, + 120, 0, 0, 168, -2, 0, 0, 0, 26, 28, + 49, 114, 0, 94, 95, 0, 0, 129, 131, 137, + 199, 210, 0, 68, 172, 0, 184, 226, 227, 285, + 297, 298, 299, 116, 118, 87, 107, 238, 0, 0, + 216 }; +typedef struct { char *t_name; int t_val; } yytoktype; +#ifndef YYDEBUG +# define YYDEBUG 0 /* don't allow debugging */ +#endif + +#if YYDEBUG + +yytoktype yytoks[] = +{ + "SEOS", 1, + "SCOMMENT", 2, + "SLABEL", 3, + "SUNKNOWN", 4, + "SHOLLERITH", 5, + "SICON", 6, + "SRCON", 7, + "SDCON", 8, + "SBITCON", 9, + "SOCTCON", 10, + "SHEXCON", 11, + "STRUE", 12, + "SFALSE", 13, + "SNAME", 14, + "SNAMEEQ", 15, + "SFIELD", 16, + "SSCALE", 17, + "SINCLUDE", 18, + "SLET", 19, + "SASSIGN", 20, + "SAUTOMATIC", 21, + "SBACKSPACE", 22, + "SBLOCK", 23, + "SCALL", 24, + "SCHARACTER", 25, + "SCLOSE", 26, + "SCOMMON", 27, + "SCOMPLEX", 28, + "SCONTINUE", 29, + "SDATA", 30, + "SDCOMPLEX", 31, + "SDIMENSION", 32, + "SDO", 33, + "SDOUBLE", 34, + "SELSE", 35, + "SELSEIF", 36, + "SEND", 37, + "SENDFILE", 38, + "SENDIF", 39, + "SENTRY", 40, + "SEQUIV", 41, + "SEXTERNAL", 42, + "SFORMAT", 43, + "SFUNCTION", 44, + "SGOTO", 45, + "SASGOTO", 46, + "SCOMPGOTO", 47, + "SARITHIF", 48, + "SLOGIF", 49, + "SIMPLICIT", 50, + "SINQUIRE", 51, + "SINTEGER", 52, + "SINTRINSIC", 53, + "SLOGICAL", 54, + "SNAMELIST", 55, + "SOPEN", 56, + "SPARAM", 57, + "SPAUSE", 58, + "SPRINT", 59, + "SPROGRAM", 60, + "SPUNCH", 61, + "SREAD", 62, + "SREAL", 63, + "SRETURN", 64, + "SREWIND", 65, + "SSAVE", 66, + "SSTATIC", 67, + "SSTOP", 68, + "SSUBROUTINE", 69, + "STHEN", 70, + "STO", 71, + "SUNDEFINED", 72, + "SWRITE", 73, + "SLPAR", 74, + "SRPAR", 75, + "SEQUALS", 76, + "SCOLON", 77, + "SCOMMA", 78, + "SCURRENCY", 79, + "SPLUS", 80, + "SMINUS", 81, + "SSTAR", 82, + "SSLASH", 83, + "SPOWER", 84, + "SCONCAT", 85, + "SAND", 86, + "SOR", 87, + "SNEQV", 88, + "SEQV", 89, + "SNOT", 90, + "SEQ", 91, + "SLT", 92, + "SGT", 93, + "SLE", 94, + "SGE", 95, + "SNE", 96, + "SENDDO", 97, + "SWHILE", 98, + "SSLASHD", 99, + "-unknown-", -1 /* ends search */ +}; + +char * yyreds[] = +{ + "-no such reduction-", + "program : /* empty */", + "program : program stat SEOS", + "stat : thislabel entry", + "stat : thislabel spec", + "stat : thislabel exec", + "stat : thislabel SINCLUDE filename", + "stat : thislabel SEND end_spec", + "stat : thislabel SUNKNOWN", + "stat : error", + "thislabel : SLABEL", + "entry : SPROGRAM new_proc progname", + "entry : SPROGRAM new_proc progname progarglist", + "entry : SBLOCK new_proc progname", + "entry : SSUBROUTINE new_proc entryname arglist", + "entry : SFUNCTION new_proc entryname arglist", + "entry : type SFUNCTION new_proc entryname arglist", + "entry : SENTRY entryname arglist", + "new_proc : /* empty */", + "entryname : name", + "name : SNAME", + "progname : /* empty */", + "progname : entryname", + "progarglist : SLPAR SRPAR", + "progarglist : SLPAR progargs SRPAR", + "progargs : progarg", + "progargs : progargs SCOMMA progarg", + "progarg : SNAME", + "progarg : SNAME SEQUALS SNAME", + "arglist : /* empty */", + "arglist : SLPAR SRPAR", + "arglist : SLPAR args SRPAR", + "args : arg", + "args : args SCOMMA arg", + "arg : name", + "arg : SSTAR", + "filename : SHOLLERITH", + "spec : dcl", + "spec : common", + "spec : external", + "spec : intrinsic", + "spec : equivalence", + "spec : data", + "spec : implicit", + "spec : namelist", + "spec : SSAVE", + "spec : SSAVE savelist", + "spec : SFORMAT", + "spec : SPARAM in_dcl SLPAR paramlist SRPAR", + "dcl : type opt_comma name in_dcl new_dcl dims lengspec", + "dcl : dcl SCOMMA name dims lengspec", + "dcl : dcl SSLASHD datainit vallist SSLASHD", + "new_dcl : /* empty */", + "type : typespec lengspec", + "typespec : typename", + "typename : SINTEGER", + "typename : SREAL", + "typename : SCOMPLEX", + "typename : SDOUBLE", + "typename : SDCOMPLEX", + "typename : SLOGICAL", + "typename : SCHARACTER", + "typename : SUNDEFINED", + "typename : SDIMENSION", + "typename : SAUTOMATIC", + "typename : SSTATIC", + "lengspec : /* empty */", + "lengspec : SSTAR intonlyon expr intonlyoff", + "lengspec : SSTAR intonlyon SLPAR SSTAR SRPAR intonlyoff", + "common : SCOMMON in_dcl var", + "common : SCOMMON in_dcl comblock var", + "common : common opt_comma comblock opt_comma var", + "common : common SCOMMA var", + "comblock : SCONCAT", + "comblock : SSLASH SNAME SSLASH", + "external : SEXTERNAL in_dcl name", + "external : external SCOMMA name", + "intrinsic : SINTRINSIC in_dcl name", + "intrinsic : intrinsic SCOMMA name", + "equivalence : SEQUIV in_dcl equivset", + "equivalence : equivalence SCOMMA equivset", + "equivset : SLPAR equivlist SRPAR", + "equivlist : lhs", + "equivlist : equivlist SCOMMA lhs", + "data : SDATA in_data datalist", + "data : data opt_comma datalist", + "in_data : /* empty */", + "datalist : datainit datavarlist SSLASH datapop vallist SSLASH", + "datainit : /* empty */", + "datapop : /* empty */", + "vallist : /* empty */", + "vallist : val", + "vallist : vallist SCOMMA val", + "val : value", + "val : simple SSTAR value", + "value : simple", + "value : addop simple", + "value : complex_const", + "savelist : saveitem", + "savelist : savelist SCOMMA saveitem", + "saveitem : name", + "saveitem : comblock", + "paramlist : paramitem", + "paramlist : paramlist SCOMMA paramitem", + "paramitem : name SEQUALS expr", + "var : name dims", + "datavar : lhs", + "datavar : SLPAR datavarlist SCOMMA dospec SRPAR", + "datavarlist : datavar", + "datavarlist : datavarlist SCOMMA datavar", + "dims : /* empty */", + "dims : SLPAR dimlist SRPAR", + "dimlist : /* empty */", + "dimlist : dim", + "dimlist : dimlist SCOMMA dim", + "dim : ubound", + "dim : expr SCOLON ubound", + "ubound : SSTAR", + "ubound : expr", + "labellist : label", + "labellist : labellist SCOMMA label", + "label : SICON", + "implicit : SIMPLICIT in_dcl implist", + "implicit : implicit SCOMMA implist", + "implist : imptype SLPAR letgroups SRPAR", + "implist : imptype", + "imptype : /* empty */", + "imptype : type", + "letgroups : letgroup", + "letgroups : letgroups SCOMMA letgroup", + "letgroup : letter", + "letgroup : letter SMINUS letter", + "letter : SNAME", + "namelist : SNAMELIST", + "namelist : namelist namelistentry", + "namelistentry : SSLASH name SSLASH namelistlist", + "namelistlist : name", + "namelistlist : namelistlist SCOMMA name", + "in_dcl : /* empty */", + "funarglist : /* empty */", + "funarglist : funargs", + "funargs : expr", + "funargs : funargs SCOMMA expr", + "expr : uexpr", + "expr : SLPAR expr SRPAR", + "expr : complex_const", + "uexpr : lhs", + "uexpr : simple_const", + "uexpr : expr addop expr", + "uexpr : expr SSTAR expr", + "uexpr : expr SSLASH expr", + "uexpr : expr SPOWER expr", + "uexpr : addop expr", + "uexpr : expr relop expr", + "uexpr : expr SEQV expr", + "uexpr : expr SNEQV expr", + "uexpr : expr SOR expr", + "uexpr : expr SAND expr", + "uexpr : SNOT expr", + "uexpr : expr SCONCAT expr", + "addop : SPLUS", + "addop : SMINUS", + "relop : SEQ", + "relop : SGT", + "relop : SLT", + "relop : SGE", + "relop : SLE", + "relop : SNE", + "lhs : name", + "lhs : name substring", + "lhs : name SLPAR funarglist SRPAR", + "lhs : name SLPAR funarglist SRPAR substring", + "substring : SLPAR opt_expr SCOLON opt_expr SRPAR", + "opt_expr : /* empty */", + "opt_expr : expr", + "simple : name", + "simple : simple_const", + "simple_const : STRUE", + "simple_const : SFALSE", + "simple_const : SHOLLERITH", + "simple_const : SICON", + "simple_const : SRCON", + "simple_const : SDCON", + "simple_const : bit_const", + "complex_const : SLPAR uexpr SCOMMA uexpr SRPAR", + "bit_const : SHEXCON", + "bit_const : SOCTCON", + "bit_const : SBITCON", + "fexpr : unpar_fexpr", + "fexpr : SLPAR fexpr SRPAR", + "unpar_fexpr : lhs", + "unpar_fexpr : simple_const", + "unpar_fexpr : fexpr addop fexpr", + "unpar_fexpr : fexpr SSTAR fexpr", + "unpar_fexpr : fexpr SSLASH fexpr", + "unpar_fexpr : fexpr SPOWER fexpr", + "unpar_fexpr : addop fexpr", + "unpar_fexpr : fexpr SCONCAT fexpr", + "exec : iffable", + "exec : SDO end_spec intonlyon label intonlyoff opt_comma dospecw", + "exec : SDO end_spec opt_comma dospecw", + "exec : SENDDO", + "exec : logif iffable", + "exec : logif STHEN", + "exec : SELSEIF end_spec SLPAR expr SRPAR STHEN", + "exec : SELSE end_spec", + "exec : SENDIF end_spec", + "logif : SLOGIF end_spec SLPAR expr SRPAR", + "dospec : name SEQUALS exprlist", + "dospecw : dospec", + "dospecw : SWHILE SLPAR expr SRPAR", + "iffable : let lhs SEQUALS expr", + "iffable : SASSIGN end_spec assignlabel STO name", + "iffable : SCONTINUE end_spec", + "iffable : goto", + "iffable : io", + "iffable : SARITHIF end_spec SLPAR expr SRPAR label SCOMMA label SCOMMA label", + "iffable : call", + "iffable : call SLPAR SRPAR", + "iffable : call SLPAR callarglist SRPAR", + "iffable : SRETURN end_spec opt_expr", + "iffable : stop end_spec opt_expr", + "assignlabel : SICON", + "let : SLET", + "goto : SGOTO end_spec label", + "goto : SASGOTO end_spec name", + "goto : SASGOTO end_spec name opt_comma SLPAR labellist SRPAR", + "goto : SCOMPGOTO end_spec SLPAR labellist SRPAR opt_comma expr", + "opt_comma : /* empty */", + "opt_comma : SCOMMA", + "call : SCALL end_spec name", + "callarglist : callarg", + "callarglist : callarglist SCOMMA callarg", + "callarg : expr", + "callarg : SSTAR label", + "stop : SPAUSE", + "stop : SSTOP", + "exprlist : expr", + "exprlist : exprlist SCOMMA expr", + "end_spec : /* empty */", + "intonlyon : /* empty */", + "intonlyoff : /* empty */", + "io : io1", + "io1 : iofmove ioctl", + "io1 : iofmove unpar_fexpr", + "io1 : iofmove SSTAR", + "io1 : iofmove SPOWER", + "io1 : iofctl ioctl", + "io1 : read ioctl", + "io1 : read infmt", + "io1 : read ioctl inlist", + "io1 : read infmt SCOMMA inlist", + "io1 : read ioctl SCOMMA inlist", + "io1 : write ioctl", + "io1 : write ioctl outlist", + "io1 : print", + "io1 : print SCOMMA outlist", + "iofmove : fmkwd end_spec in_ioctl", + "fmkwd : SBACKSPACE", + "fmkwd : SREWIND", + "fmkwd : SENDFILE", + "iofctl : ctlkwd end_spec in_ioctl", + "ctlkwd : SINQUIRE", + "ctlkwd : SOPEN", + "ctlkwd : SCLOSE", + "infmt : unpar_fexpr", + "infmt : SSTAR", + "ioctl : SLPAR fexpr SRPAR", + "ioctl : SLPAR ctllist SRPAR", + "ctllist : ioclause", + "ctllist : ctllist SCOMMA ioclause", + "ioclause : fexpr", + "ioclause : SSTAR", + "ioclause : SPOWER", + "ioclause : nameeq expr", + "ioclause : nameeq SSTAR", + "ioclause : nameeq SPOWER", + "nameeq : SNAMEEQ", + "read : SREAD end_spec in_ioctl", + "write : SWRITE end_spec in_ioctl", + "print : SPRINT end_spec fexpr in_ioctl", + "print : SPRINT end_spec SSTAR in_ioctl", + "inlist : inelt", + "inlist : inlist SCOMMA inelt", + "inelt : lhs", + "inelt : SLPAR inlist SCOMMA dospec SRPAR", + "outlist : uexpr", + "outlist : other", + "outlist : out2", + "out2 : uexpr SCOMMA uexpr", + "out2 : uexpr SCOMMA other", + "out2 : other SCOMMA uexpr", + "out2 : other SCOMMA other", + "out2 : out2 SCOMMA uexpr", + "out2 : out2 SCOMMA other", + "other : complex_const", + "other : SLPAR expr SRPAR", + "other : SLPAR uexpr SCOMMA dospec SRPAR", + "other : SLPAR other SCOMMA dospec SRPAR", + "other : SLPAR out2 SCOMMA dospec SRPAR", + "in_ioctl : /* empty */", +}; +#endif /* YYDEBUG */ +/* + * @(#) yaccpar 1.4 88/11/11 + * + * UNIX is a registered trademark of AT&T + * Portions Copyright 1976-1989 AT&T + * Portions Copyright 1980-1989 Microsoft Corporation + * Portions Copyright 1983-1989 The Santa Cruz Operation, Inc + * All Rights Reserved + */ +#ident "@(#)yacc:yaccpar 1.10" + +/* +** Skeleton parser driver for yacc output +*/ + +/* +** yacc user known macros and defines +*/ +#define YYERROR goto yyerrlab +#define YYACCEPT return(0) +#define YYABORT return(1) +#define YYBACKUP( newtoken, newvalue )\ +{\ + if ( yychar >= 0 || ( yyr2[ yytmp ] >> 1 ) != 1 )\ + {\ + yyerror( "syntax error - cannot backup" );\ + goto yyerrlab;\ + }\ + yychar = newtoken;\ + yystate = *yyps;\ + yylval = newvalue;\ + goto yynewstate;\ +} +#define YYRECOVERING() (!!yyerrflag) +#ifndef YYDEBUG +# define YYDEBUG 1 /* make debugging available */ +#endif + +/* +** user known globals +*/ +int yydebug; /* set to 1 to get debugging */ + +/* +** driver internal defines +*/ +#define YYFLAG (-1000) + +/* +** global variables used by the parser +*/ +YYSTYPE yyv[ YYMAXDEPTH ]; /* value stack */ +int yys[ YYMAXDEPTH ]; /* state stack */ + +YYSTYPE *yypv; /* top of value stack */ +int *yyps; /* top of state stack */ + +int yystate; /* current state */ +int yytmp; /* extra var (lasts between blocks) */ + +int yynerrs; /* number of errors */ +int yyerrflag; /* error recovery flag */ +int yychar; /* current input token number */ + + + +/* +** yyparse - return 0 if worked, 1 if syntax error not recovered from +*/ +int +yyparse() +{ + register YYSTYPE *yypvt; /* top of value stack for $vars */ + + /* + ** Initialize externals - yyparse may be called more than once + */ + yypv = &yyv[-1]; + yyps = &yys[-1]; + yystate = 0; + yytmp = 0; + yynerrs = 0; + yyerrflag = 0; + yychar = -1; + + goto yystack; + { + register YYSTYPE *yy_pv; /* top of value stack */ + register int *yy_ps; /* top of state stack */ + register int yy_state; /* current state */ + register int yy_n; /* internal state number info */ + + /* + ** get globals into registers. + ** branch to here only if YYBACKUP was called. + */ + yynewstate: + yy_pv = yypv; + yy_ps = yyps; + yy_state = yystate; + goto yy_newstate; + + /* + ** get globals into registers. + ** either we just started, or we just finished a reduction + */ + yystack: + yy_pv = yypv; + yy_ps = yyps; + yy_state = yystate; + + /* + ** top of for (;;) loop while no reductions done + */ + yy_stack: + /* + ** put a state and value onto the stacks + */ +#if YYDEBUG + /* + ** if debugging, look up token value in list of value vs. + ** name pairs. 0 and negative (-1) are special values. + ** Note: linear search is used since time is not a real + ** consideration while debugging. + */ + if ( yydebug ) + { + register int yy_i; + + printf( "State %d, token ", yy_state ); + if ( yychar == 0 ) + printf( "end-of-file\n" ); + else if ( yychar < 0 ) + printf( "-none-\n" ); + else + { + for ( yy_i = 0; yytoks[yy_i].t_val >= 0; + yy_i++ ) + { + if ( yytoks[yy_i].t_val == yychar ) + break; + } + printf( "%s\n", yytoks[yy_i].t_name ); + } + } +#endif /* YYDEBUG */ + if ( ++yy_ps >= &yys[ YYMAXDEPTH ] ) /* room on stack? */ + { + yyerror( "yacc stack overflow" ); + YYABORT; + } + *yy_ps = yy_state; + *++yy_pv = yyval; + + /* + ** we have a new state - find out what to do + */ + yy_newstate: + if ( ( yy_n = yypact[ yy_state ] ) <= YYFLAG ) + goto yydefault; /* simple state */ +#if YYDEBUG + /* + ** if debugging, need to mark whether new token grabbed + */ + yytmp = yychar < 0; +#endif + if ( ( yychar < 0 ) && ( ( yychar = yylex() ) < 0 ) ) + yychar = 0; /* reached EOF */ +#if YYDEBUG + if ( yydebug && yytmp ) + { + register int yy_i; + + printf( "Received token " ); + if ( yychar == 0 ) + printf( "end-of-file\n" ); + else if ( yychar < 0 ) + printf( "-none-\n" ); + else + { + for ( yy_i = 0; yytoks[yy_i].t_val >= 0; + yy_i++ ) + { + if ( yytoks[yy_i].t_val == yychar ) + break; + } + printf( "%s\n", yytoks[yy_i].t_name ); + } + } +#endif /* YYDEBUG */ + if ( ( ( yy_n += yychar ) < 0 ) || ( yy_n >= YYLAST ) ) + goto yydefault; + if ( yychk[ yy_n = yyact[ yy_n ] ] == yychar ) /*valid shift*/ + { + yychar = -1; + yyval = yylval; + yy_state = yy_n; + if ( yyerrflag > 0 ) + yyerrflag--; + goto yy_stack; + } + + yydefault: + if ( ( yy_n = yydef[ yy_state ] ) == -2 ) + { +#if YYDEBUG + yytmp = yychar < 0; +#endif + if ( ( yychar < 0 ) && ( ( yychar = yylex() ) < 0 ) ) + yychar = 0; /* reached EOF */ +#if YYDEBUG + if ( yydebug && yytmp ) + { + register int yy_i; + + printf( "Received token " ); + if ( yychar == 0 ) + printf( "end-of-file\n" ); + else if ( yychar < 0 ) + printf( "-none-\n" ); + else + { + for ( yy_i = 0; + yytoks[yy_i].t_val >= 0; + yy_i++ ) + { + if ( yytoks[yy_i].t_val + == yychar ) + { + break; + } + } + printf( "%s\n", yytoks[yy_i].t_name ); + } + } +#endif /* YYDEBUG */ + /* + ** look through exception table + */ + { + register int *yyxi = yyexca; + + while ( ( *yyxi != -1 ) || + ( yyxi[1] != yy_state ) ) + { + yyxi += 2; + } + while ( ( *(yyxi += 2) >= 0 ) && + ( *yyxi != yychar ) ) + ; + if ( ( yy_n = yyxi[1] ) < 0 ) + YYACCEPT; + } + } + + /* + ** check for syntax error + */ + if ( yy_n == 0 ) /* have an error */ + { + /* no worry about speed here! */ + switch ( yyerrflag ) + { + case 0: /* new error */ + yyerror( "syntax error" ); + goto skip_init; + yyerrlab: + /* + ** get globals into registers. + ** we have a user generated syntax type error + */ + yy_pv = yypv; + yy_ps = yyps; + yy_state = yystate; + yynerrs++; + skip_init: + case 1: + case 2: /* incompletely recovered error */ + /* try again... */ + yyerrflag = 3; + /* + ** find state where "error" is a legal + ** shift action + */ + while ( yy_ps >= yys ) + { + yy_n = yypact[ *yy_ps ] + YYERRCODE; + if ( yy_n >= 0 && yy_n < YYLAST && + yychk[yyact[yy_n]] == YYERRCODE) { + /* + ** simulate shift of "error" + */ + yy_state = yyact[ yy_n ]; + goto yy_stack; + } + /* + ** current state has no shift on + ** "error", pop stack + */ +#if YYDEBUG +# define _POP_ "Error recovery pops state %d, uncovers state %d\n" + if ( yydebug ) + printf( _POP_, *yy_ps, + yy_ps[-1] ); +# undef _POP_ +#endif + yy_ps--; + yy_pv--; + } + /* + ** there is no state on stack with "error" as + ** a valid shift. give up. + */ + YYABORT; + case 3: /* no shift yet; eat a token */ +#if YYDEBUG + /* + ** if debugging, look up token in list of + ** pairs. 0 and negative shouldn't occur, + ** but since timing doesn't matter when + ** debugging, it doesn't hurt to leave the + ** tests here. + */ + if ( yydebug ) + { + register int yy_i; + + printf( "Error recovery discards " ); + if ( yychar == 0 ) + printf( "token end-of-file\n" ); + else if ( yychar < 0 ) + printf( "token -none-\n" ); + else + { + for ( yy_i = 0; + yytoks[yy_i].t_val >= 0; + yy_i++ ) + { + if ( yytoks[yy_i].t_val + == yychar ) + { + break; + } + } + printf( "token %s\n", + yytoks[yy_i].t_name ); + } + } +#endif /* YYDEBUG */ + if ( yychar == 0 ) /* reached EOF. quit */ + YYABORT; + yychar = -1; + goto yy_newstate; + } + }/* end if ( yy_n == 0 ) */ + /* + ** reduction by production yy_n + ** put stack tops, etc. so things right after switch + */ +#if YYDEBUG + /* + ** if debugging, print the string that is the user's + ** specification of the reduction which is just about + ** to be done. + */ + if ( yydebug ) + printf( "Reduce by (%d) \"%s\"\n", + yy_n, yyreds[ yy_n ] ); +#endif + yytmp = yy_n; /* value to switch over */ + yypvt = yy_pv; /* $vars top of value stack */ + /* + ** Look in goto table for next state + ** Sorry about using yy_state here as temporary + ** register variable, but why not, if it works... + ** If yyr2[ yy_n ] doesn't have the low order bit + ** set, then there is no action to be done for + ** this reduction. So, no saving & unsaving of + ** registers done. The only difference between the + ** code just after the if and the body of the if is + ** the goto yy_stack in the body. This way the test + ** can be made before the choice of what to do is needed. + */ + { + /* length of production doubled with extra bit */ + register int yy_len = yyr2[ yy_n ]; + + if ( !( yy_len & 01 ) ) + { + yy_len >>= 1; + yyval = ( yy_pv -= yy_len )[1]; /* $$ = $1 */ + yy_state = yypgo[ yy_n = yyr1[ yy_n ] ] + + *( yy_ps -= yy_len ) + 1; + if ( yy_state >= YYLAST || + yychk[ yy_state = + yyact[ yy_state ] ] != -yy_n ) + { + yy_state = yyact[ yypgo[ yy_n ] ]; + } + goto yy_stack; + } + yy_len >>= 1; + yyval = ( yy_pv -= yy_len )[1]; /* $$ = $1 */ + yy_state = yypgo[ yy_n = yyr1[ yy_n ] ] + + *( yy_ps -= yy_len ) + 1; + if ( yy_state >= YYLAST || + yychk[ yy_state = yyact[ yy_state ] ] != -yy_n ) + { + yy_state = yyact[ yypgo[ yy_n ] ]; + } + } + /* save until reenter driver code */ + yystate = yy_state; + yyps = yy_ps; + yypv = yy_pv; + } + /* + ** code supplied by user is placed in this switch + */ + switch( yytmp ) + { + +case 3: +/* # line 224 "gram.in" */ +{ +/* stat: is the nonterminal for Fortran statements */ + + lastwasbranch = NO; } break; +case 5: +/* # line 230 "gram.in" */ +{ /* forbid further statement function definitions... */ + if (parstate == INDATA && laststfcn != thisstno) + parstate = INEXEC; + thisstno++; + if(yypvt[-1].labval && (yypvt[-1].labval->labelno==dorange)) + enddo(yypvt[-1].labval->labelno); + if(lastwasbranch && thislabel==NULL) + warn("statement cannot be reached"); + lastwasbranch = thiswasbranch; + thiswasbranch = NO; + if(yypvt[-1].labval) + { + if(yypvt[-1].labval->labtype == LABFORMAT) + err("label already that of a format"); + else + yypvt[-1].labval->labtype = LABEXEC; + } + freetemps(); + } break; +case 6: +/* # line 250 "gram.in" */ +{ if (can_include) + doinclude( yypvt[-0].charpval ); + else { + fprintf(diagfile, "Cannot open file %s\n", yypvt[-0].charpval); + done(1); + } + } break; +case 7: +/* # line 258 "gram.in" */ +{ if (yypvt[-2].labval) + lastwasbranch = NO; + endproc(); /* lastwasbranch = NO; -- set in endproc() */ + } break; +case 8: +/* # line 263 "gram.in" */ +{ extern void unclassifiable(); + unclassifiable(); + +/* flline flushes the current line, ignoring the rest of the text there */ + + flline(); } break; +case 9: +/* # line 270 "gram.in" */ +{ flline(); needkwd = NO; inioctl = NO; + yyerrok; yyclearin; } break; +case 10: +/* # line 275 "gram.in" */ +{ + if(yystno != 0) + { + yyval.labval = thislabel = mklabel(yystno); + if( ! headerdone ) { + if (procclass == CLUNKNOWN) + procclass = CLMAIN; + puthead(CNULL, procclass); + } + if(thislabel->labdefined) + execerr("label %s already defined", + convic(thislabel->stateno) ); + else { + if(thislabel->blklevel!=0 && thislabel->blklevellabtype!=LABFORMAT) + warn1("there is a branch to label %s from outside block", + convic( (ftnint) (thislabel->stateno) ) ); + thislabel->blklevel = blklevel; + thislabel->labdefined = YES; + if(thislabel->labtype != LABFORMAT) + p1_label((long)(thislabel - labeltab)); + } + } + else yyval.labval = thislabel = NULL; + } break; +case 11: +/* # line 303 "gram.in" */ +{startproc(yypvt[-0].extval, CLMAIN); } break; +case 12: +/* # line 305 "gram.in" */ +{ warn("ignoring arguments to main program"); + /* hashclear(); */ + startproc(yypvt[-1].extval, CLMAIN); } break; +case 13: +/* # line 309 "gram.in" */ +{ if(yypvt[-0].extval) NO66("named BLOCKDATA"); + startproc(yypvt[-0].extval, CLBLOCK); } break; +case 14: +/* # line 312 "gram.in" */ +{ entrypt(CLPROC, TYSUBR, (ftnint) 0, yypvt[-1].extval, yypvt[-0].chval); } break; +case 15: +/* # line 314 "gram.in" */ +{ entrypt(CLPROC, TYUNKNOWN, (ftnint) 0, yypvt[-1].extval, yypvt[-0].chval); } break; +case 16: +/* # line 316 "gram.in" */ +{ entrypt(CLPROC, yypvt[-4].ival, varleng, yypvt[-1].extval, yypvt[-0].chval); } break; +case 17: +/* # line 318 "gram.in" */ +{ if(parstate==OUTSIDE || procclass==CLMAIN + || procclass==CLBLOCK) + execerr("misplaced entry statement", CNULL); + entrypt(CLENTRY, 0, (ftnint) 0, yypvt[-1].extval, yypvt[-0].chval); + } break; +case 18: +/* # line 326 "gram.in" */ +{ newproc(); } break; +case 19: +/* # line 330 "gram.in" */ +{ yyval.extval = newentry(yypvt[-0].namval, 1); } break; +case 20: +/* # line 334 "gram.in" */ +{ yyval.namval = mkname(token); } break; +case 21: +/* # line 337 "gram.in" */ +{ yyval.extval = NULL; } break; +case 29: +/* # line 355 "gram.in" */ +{ yyval.chval = 0; } break; +case 30: +/* # line 357 "gram.in" */ +{ NO66(" () argument list"); + yyval.chval = 0; } break; +case 31: +/* # line 360 "gram.in" */ +{yyval.chval = yypvt[-1].chval; } break; +case 32: +/* # line 364 "gram.in" */ +{ yyval.chval = (yypvt[-0].namval ? mkchain((char *)yypvt[-0].namval,CHNULL) : CHNULL ); } break; +case 33: +/* # line 366 "gram.in" */ +{ if(yypvt[-0].namval) yypvt[-2].chval = yyval.chval = mkchain((char *)yypvt[-0].namval, yypvt[-2].chval); } break; +case 34: +/* # line 370 "gram.in" */ +{ if(yypvt[-0].namval->vstg!=STGUNKNOWN && yypvt[-0].namval->vstg!=STGARG) + dclerr("name declared as argument after use", yypvt[-0].namval); + yypvt[-0].namval->vstg = STGARG; + } break; +case 35: +/* # line 375 "gram.in" */ +{ NO66("altenate return argument"); + +/* substars means that '*'ed formal parameters should be replaced. + This is used to specify alternate return labels; in theory, only + parameter slots which have '*' should accept the statement labels. + This compiler chooses to ignore the '*'s in the formal declaration, and + always return the proper value anyway. + + This variable is only referred to in proc.c */ + + yyval.namval = 0; substars = YES; } break; +case 36: +/* # line 391 "gram.in" */ +{ + char *s; + s = copyn(toklen+1, token); + s[toklen] = '\0'; + yyval.charpval = s; + } break; +case 45: +/* # line 407 "gram.in" */ +{ NO66("SAVE statement"); + saveall = YES; } break; +case 46: +/* # line 410 "gram.in" */ +{ NO66("SAVE statement"); } break; +case 47: +/* # line 412 "gram.in" */ +{ fmtstmt(thislabel); setfmt(thislabel); } break; +case 48: +/* # line 414 "gram.in" */ +{ NO66("PARAMETER statement"); } break; +case 49: +/* # line 418 "gram.in" */ +{ settype(yypvt[-4].namval, yypvt[-6].ival, yypvt[-0].lval); + if(ndim>0) setbound(yypvt[-4].namval,ndim,dims); + } break; +case 50: +/* # line 422 "gram.in" */ +{ settype(yypvt[-2].namval, yypvt[-4].ival, yypvt[-0].lval); + if(ndim>0) setbound(yypvt[-2].namval,ndim,dims); + } break; +case 51: +/* # line 426 "gram.in" */ +{ if (new_dcl == 2) { + err("attempt to give DATA in type-declaration"); + new_dcl = 1; + } + } break; +case 52: +/* # line 433 "gram.in" */ +{ new_dcl = 2; } break; +case 53: +/* # line 436 "gram.in" */ +{ varleng = yypvt[-0].lval; + if (vartype == TYLOGICAL && varleng == 1) { + varleng = 0; + err("treating LOGICAL*1 as LOGICAL"); + --nerr; /* allow generation of .c file */ + } + } break; +case 54: +/* # line 446 "gram.in" */ +{ varleng = (yypvt[-0].ival<0 || yypvt[-0].ival==TYLONG ? 0 : typesize[yypvt[-0].ival]); + vartype = yypvt[-0].ival; } break; +case 55: +/* # line 450 "gram.in" */ +{ yyval.ival = TYLONG; } break; +case 56: +/* # line 451 "gram.in" */ +{ yyval.ival = tyreal; } break; +case 57: +/* # line 452 "gram.in" */ +{ ++complex_seen; yyval.ival = TYCOMPLEX; } break; +case 58: +/* # line 453 "gram.in" */ +{ yyval.ival = TYDREAL; } break; +case 59: +/* # line 454 "gram.in" */ +{ ++dcomplex_seen; NOEXT("DOUBLE COMPLEX statement"); yyval.ival = TYDCOMPLEX; } break; +case 60: +/* # line 455 "gram.in" */ +{ yyval.ival = TYLOGICAL; } break; +case 61: +/* # line 456 "gram.in" */ +{ NO66("CHARACTER statement"); yyval.ival = TYCHAR; } break; +case 62: +/* # line 457 "gram.in" */ +{ yyval.ival = TYUNKNOWN; } break; +case 63: +/* # line 458 "gram.in" */ +{ yyval.ival = TYUNKNOWN; } break; +case 64: +/* # line 459 "gram.in" */ +{ NOEXT("AUTOMATIC statement"); yyval.ival = - STGAUTO; } break; +case 65: +/* # line 460 "gram.in" */ +{ NOEXT("STATIC statement"); yyval.ival = - STGBSS; } break; +case 66: +/* # line 464 "gram.in" */ +{ yyval.lval = varleng; } break; +case 67: +/* # line 466 "gram.in" */ +{ + expptr p; + p = yypvt[-1].expval; + NO66("length specification *n"); + if( ! ISICON(p) || p->constblock.Const.ci<0 ) + { + yyval.lval = 0; + dclerr("length must be a positive integer constant", + NPNULL); + } + else { + if (vartype == TYCHAR) + yyval.lval = p->constblock.Const.ci; + else switch((int)p->constblock.Const.ci) { + case 1: yyval.lval = 1; break; + case 2: yyval.lval = typesize[TYSHORT]; break; + case 4: yyval.lval = typesize[TYLONG]; break; + case 8: yyval.lval = typesize[TYDREAL]; break; + case 16: yyval.lval = typesize[TYDCOMPLEX]; break; + default: + dclerr("invalid length",NPNULL); + yyval.lval = varleng; + } + } + } break; +case 68: +/* # line 492 "gram.in" */ +{ NO66("length specification *(*)"); yyval.lval = -1; } break; +case 69: +/* # line 496 "gram.in" */ +{ incomm( yyval.extval = comblock("") , yypvt[-0].namval ); } break; +case 70: +/* # line 498 "gram.in" */ +{ yyval.extval = yypvt[-1].extval; incomm(yypvt[-1].extval, yypvt[-0].namval); } break; +case 71: +/* # line 500 "gram.in" */ +{ yyval.extval = yypvt[-2].extval; incomm(yypvt[-2].extval, yypvt[-0].namval); } break; +case 72: +/* # line 502 "gram.in" */ +{ incomm(yypvt[-2].extval, yypvt[-0].namval); } break; +case 73: +/* # line 506 "gram.in" */ +{ yyval.extval = comblock(""); } break; +case 74: +/* # line 508 "gram.in" */ +{ yyval.extval = comblock(token); } break; +case 75: +/* # line 512 "gram.in" */ +{ setext(yypvt[-0].namval); } break; +case 76: +/* # line 514 "gram.in" */ +{ setext(yypvt[-0].namval); } break; +case 77: +/* # line 518 "gram.in" */ +{ NO66("INTRINSIC statement"); setintr(yypvt[-0].namval); } break; +case 78: +/* # line 520 "gram.in" */ +{ setintr(yypvt[-0].namval); } break; +case 81: +/* # line 528 "gram.in" */ +{ + struct Equivblock *p; + if(nequiv >= maxequiv) + many("equivalences", 'q', maxequiv); + p = & eqvclass[nequiv++]; + p->eqvinit = NO; + p->eqvbottom = 0; + p->eqvtop = 0; + p->equivs = yypvt[-1].eqvval; + } break; +case 82: +/* # line 541 "gram.in" */ +{ yyval.eqvval=ALLOC(Eqvchain); + yyval.eqvval->eqvitem.eqvlhs = (struct Primblock *)yypvt[-0].expval; + } break; +case 83: +/* # line 545 "gram.in" */ +{ yyval.eqvval=ALLOC(Eqvchain); + yyval.eqvval->eqvitem.eqvlhs = (struct Primblock *) yypvt[-0].expval; + yyval.eqvval->eqvnextp = yypvt[-2].eqvval; + } break; +case 86: +/* # line 556 "gram.in" */ +{ if(parstate == OUTSIDE) + { + newproc(); + startproc(ESNULL, CLMAIN); + } + if(parstate < INDATA) + { + enddcl(); + parstate = INDATA; + } + } break; +case 87: +/* # line 570 "gram.in" */ +{ ftnint junk; + if(nextdata(&junk) != NULL) + err("too few initializers"); + frdata(yypvt[-4].chval); + frrpl(); + } break; +case 88: +/* # line 578 "gram.in" */ +{ frchain(&datastack); curdtp = 0; } break; +case 89: +/* # line 580 "gram.in" */ +{ pop_datastack(); } break; +case 90: +/* # line 582 "gram.in" */ +{ toomanyinit = NO; } break; +case 93: +/* # line 587 "gram.in" */ +{ dataval(ENULL, yypvt[-0].expval); } break; +case 94: +/* # line 589 "gram.in" */ +{ dataval(yypvt[-2].expval, yypvt[-0].expval); } break; +case 96: +/* # line 594 "gram.in" */ +{ if( yypvt[-1].ival==OPMINUS && ISCONST(yypvt[-0].expval) ) + consnegop((Constp)yypvt[-0].expval); + yyval.expval = yypvt[-0].expval; + } break; +case 100: +/* # line 606 "gram.in" */ +{ int k; + yypvt[-0].namval->vsave = YES; + k = yypvt[-0].namval->vstg; + if( ! ONEOF(k, M(STGUNKNOWN)|M(STGBSS)|M(STGINIT)) ) + dclerr("can only save static variables", yypvt[-0].namval); + } break; +case 104: +/* # line 620 "gram.in" */ +{ if(yypvt[-2].namval->vclass == CLUNKNOWN) + make_param((struct Paramblock *)yypvt[-2].namval, yypvt[-0].expval); + else dclerr("cannot make into parameter", yypvt[-2].namval); + } break; +case 105: +/* # line 627 "gram.in" */ +{ if(ndim>0) setbound(yypvt[-1].namval, ndim, dims); } break; +case 106: +/* # line 631 "gram.in" */ +{ Namep np; + np = ( (struct Primblock *) yypvt[-0].expval) -> namep; + vardcl(np); + if(np->vstg == STGCOMMON) + extsymtab[np->vardesc.varno].extinit = YES; + else if(np->vstg==STGEQUIV) + eqvclass[np->vardesc.varno].eqvinit = YES; + else if(np->vstg!=STGINIT && np->vstg!=STGBSS) + dclerr("inconsistent storage classes", np); + yyval.chval = mkchain((char *)yypvt[-0].expval, CHNULL); + } break; +case 107: +/* # line 643 "gram.in" */ +{ chainp p; struct Impldoblock *q; + pop_datastack(); + q = ALLOC(Impldoblock); + q->tag = TIMPLDO; + (q->varnp = (Namep) (yypvt[-1].chval->datap))->vimpldovar = 1; + p = yypvt[-1].chval->nextp; + if(p) { q->implb = (expptr)(p->datap); p = p->nextp; } + if(p) { q->impub = (expptr)(p->datap); p = p->nextp; } + if(p) { q->impstep = (expptr)(p->datap); } + frchain( & (yypvt[-1].chval) ); + yyval.chval = mkchain((char *)q, CHNULL); + q->datalist = hookup(yypvt[-3].chval, yyval.chval); + } break; +case 108: +/* # line 659 "gram.in" */ +{ if (!datastack) + curdtp = 0; + datastack = mkchain((char *)curdtp, datastack); + curdtp = yypvt[-0].chval; curdtelt = 0; + } break; +case 109: +/* # line 665 "gram.in" */ +{ yyval.chval = hookup(yypvt[-2].chval, yypvt[-0].chval); } break; +case 110: +/* # line 669 "gram.in" */ +{ ndim = 0; } break; +case 112: +/* # line 673 "gram.in" */ +{ ndim = 0; } break; +case 115: +/* # line 678 "gram.in" */ +{ + if(ndim == maxdim) + err("too many dimensions"); + else if(ndim < maxdim) + { dims[ndim].lb = 0; + dims[ndim].ub = yypvt[-0].expval; + } + ++ndim; + } break; +case 116: +/* # line 688 "gram.in" */ +{ + if(ndim == maxdim) + err("too many dimensions"); + else if(ndim < maxdim) + { dims[ndim].lb = yypvt[-2].expval; + dims[ndim].ub = yypvt[-0].expval; + } + ++ndim; + } break; +case 117: +/* # line 700 "gram.in" */ +{ yyval.expval = 0; } break; +case 119: +/* # line 705 "gram.in" */ +{ nstars = 1; labarray[0] = yypvt[-0].labval; } break; +case 120: +/* # line 707 "gram.in" */ +{ if(nstars < MAXLABLIST) labarray[nstars++] = yypvt[-0].labval; } break; +case 121: +/* # line 711 "gram.in" */ +{ yyval.labval = execlab( convci(toklen, token) ); } break; +case 122: +/* # line 715 "gram.in" */ +{ NO66("IMPLICIT statement"); } break; +case 125: +/* # line 721 "gram.in" */ +{ if (vartype != TYUNKNOWN) + dclerr("-- expected letter range",NPNULL); + setimpl(vartype, varleng, 'a', 'z'); } break; +case 126: +/* # line 726 "gram.in" */ +{ needkwd = 1; } break; +case 130: +/* # line 735 "gram.in" */ +{ setimpl(vartype, varleng, yypvt[-0].ival, yypvt[-0].ival); } break; +case 131: +/* # line 737 "gram.in" */ +{ setimpl(vartype, varleng, yypvt[-2].ival, yypvt[-0].ival); } break; +case 132: +/* # line 741 "gram.in" */ +{ if(toklen!=1 || token[0]<'a' || token[0]>'z') + { + dclerr("implicit item must be single letter", NPNULL); + yyval.ival = 0; + } + else yyval.ival = token[0]; + } break; +case 135: +/* # line 755 "gram.in" */ +{ + if(yypvt[-2].namval->vclass == CLUNKNOWN) + { + yypvt[-2].namval->vclass = CLNAMELIST; + yypvt[-2].namval->vtype = TYINT; + yypvt[-2].namval->vstg = STGBSS; + yypvt[-2].namval->varxptr.namelist = yypvt[-0].chval; + yypvt[-2].namval->vardesc.varno = ++lastvarno; + } + else dclerr("cannot be a namelist name", yypvt[-2].namval); + } break; +case 136: +/* # line 769 "gram.in" */ +{ yyval.chval = mkchain((char *)yypvt[-0].namval, CHNULL); } break; +case 137: +/* # line 771 "gram.in" */ +{ yyval.chval = hookup(yypvt[-2].chval, mkchain((char *)yypvt[-0].namval, CHNULL)); } break; +case 138: +/* # line 775 "gram.in" */ +{ switch(parstate) + { + case OUTSIDE: newproc(); + startproc(ESNULL, CLMAIN); + case INSIDE: parstate = INDCL; + case INDCL: break; + + case INDATA: + errstr( + "Statement order error: declaration after DATA", + CNULL); + break; + + default: + dclerr("declaration among executables", NPNULL); + } + } break; +case 139: +/* # line 794 "gram.in" */ +{ yyval.chval = 0; } break; +case 141: +/* # line 799 "gram.in" */ +{ yyval.chval = mkchain((char *)yypvt[-0].expval, CHNULL); } break; +case 142: +/* # line 801 "gram.in" */ +{ yyval.chval = hookup(yypvt[-2].chval, mkchain((char *)yypvt[-0].expval,CHNULL) ); } break; +case 144: +/* # line 806 "gram.in" */ +{ yyval.expval = yypvt[-1].expval; } break; +case 148: +/* # line 813 "gram.in" */ +{ yyval.expval = mkexpr(yypvt[-1].ival, yypvt[-2].expval, yypvt[-0].expval); } break; +case 149: +/* # line 815 "gram.in" */ +{ yyval.expval = mkexpr(OPSTAR, yypvt[-2].expval, yypvt[-0].expval); } break; +case 150: +/* # line 817 "gram.in" */ +{ yyval.expval = mkexpr(OPSLASH, yypvt[-2].expval, yypvt[-0].expval); } break; +case 151: +/* # line 819 "gram.in" */ +{ yyval.expval = mkexpr(OPPOWER, yypvt[-2].expval, yypvt[-0].expval); } break; +case 152: +/* # line 821 "gram.in" */ +{ if(yypvt[-1].ival == OPMINUS) + yyval.expval = mkexpr(OPNEG, yypvt[-0].expval, ENULL); + else yyval.expval = yypvt[-0].expval; + } break; +case 153: +/* # line 826 "gram.in" */ +{ yyval.expval = mkexpr(yypvt[-1].ival, yypvt[-2].expval, yypvt[-0].expval); } break; +case 154: +/* # line 828 "gram.in" */ +{ NO66(".EQV. operator"); + yyval.expval = mkexpr(OPEQV, yypvt[-2].expval,yypvt[-0].expval); } break; +case 155: +/* # line 831 "gram.in" */ +{ NO66(".NEQV. operator"); + yyval.expval = mkexpr(OPNEQV, yypvt[-2].expval, yypvt[-0].expval); } break; +case 156: +/* # line 834 "gram.in" */ +{ yyval.expval = mkexpr(OPOR, yypvt[-2].expval, yypvt[-0].expval); } break; +case 157: +/* # line 836 "gram.in" */ +{ yyval.expval = mkexpr(OPAND, yypvt[-2].expval, yypvt[-0].expval); } break; +case 158: +/* # line 838 "gram.in" */ +{ yyval.expval = mkexpr(OPNOT, yypvt[-0].expval, ENULL); } break; +case 159: +/* # line 840 "gram.in" */ +{ NO66("concatenation operator //"); + yyval.expval = mkexpr(OPCONCAT, yypvt[-2].expval, yypvt[-0].expval); } break; +case 160: +/* # line 844 "gram.in" */ +{ yyval.ival = OPPLUS; } break; +case 161: +/* # line 845 "gram.in" */ +{ yyval.ival = OPMINUS; } break; +case 162: +/* # line 848 "gram.in" */ +{ yyval.ival = OPEQ; } break; +case 163: +/* # line 849 "gram.in" */ +{ yyval.ival = OPGT; } break; +case 164: +/* # line 850 "gram.in" */ +{ yyval.ival = OPLT; } break; +case 165: +/* # line 851 "gram.in" */ +{ yyval.ival = OPGE; } break; +case 166: +/* # line 852 "gram.in" */ +{ yyval.ival = OPLE; } break; +case 167: +/* # line 853 "gram.in" */ +{ yyval.ival = OPNE; } break; +case 168: +/* # line 857 "gram.in" */ +{ yyval.expval = mkprim(yypvt[-0].namval, LBNULL, CHNULL); } break; +case 169: +/* # line 859 "gram.in" */ +{ NO66("substring operator :"); + yyval.expval = mkprim(yypvt[-1].namval, LBNULL, yypvt[-0].chval); } break; +case 170: +/* # line 862 "gram.in" */ +{ yyval.expval = mkprim(yypvt[-3].namval, mklist(yypvt[-1].chval), CHNULL); } break; +case 171: +/* # line 864 "gram.in" */ +{ NO66("substring operator :"); + yyval.expval = mkprim(yypvt[-4].namval, mklist(yypvt[-2].chval), yypvt[-0].chval); } break; +case 172: +/* # line 869 "gram.in" */ +{ yyval.chval = mkchain((char *)yypvt[-3].expval, mkchain((char *)yypvt[-1].expval,CHNULL)); } break; +case 173: +/* # line 873 "gram.in" */ +{ yyval.expval = 0; } break; +case 175: +/* # line 878 "gram.in" */ +{ if(yypvt[-0].namval->vclass == CLPARAM) + yyval.expval = (expptr) cpexpr( + ( (struct Paramblock *) (yypvt[-0].namval) ) -> paramval); + } break; +case 177: +/* # line 885 "gram.in" */ +{ yyval.expval = mklogcon(1); } break; +case 178: +/* # line 886 "gram.in" */ +{ yyval.expval = mklogcon(0); } break; +case 179: +/* # line 887 "gram.in" */ +{ yyval.expval = mkstrcon(toklen, token); } break; +case 180: +/* # line 888 "gram.in" */ + { yyval.expval = mkintcon( convci(toklen, token) ); } break; +case 181: +/* # line 889 "gram.in" */ + { yyval.expval = mkrealcon(tyreal, token); } break; +case 182: +/* # line 890 "gram.in" */ + { yyval.expval = mkrealcon(TYDREAL, token); } break; +case 184: +/* # line 895 "gram.in" */ +{ yyval.expval = mkcxcon(yypvt[-3].expval,yypvt[-1].expval); } break; +case 185: +/* # line 899 "gram.in" */ +{ NOEXT("hex constant"); + yyval.expval = mkbitcon(4, toklen, token); } break; +case 186: +/* # line 902 "gram.in" */ +{ NOEXT("octal constant"); + yyval.expval = mkbitcon(3, toklen, token); } break; +case 187: +/* # line 905 "gram.in" */ +{ NOEXT("binary constant"); + yyval.expval = mkbitcon(1, toklen, token); } break; +case 189: +/* # line 911 "gram.in" */ +{ yyval.expval = yypvt[-1].expval; } break; +case 192: +/* # line 917 "gram.in" */ +{ yyval.expval = mkexpr(yypvt[-1].ival, yypvt[-2].expval, yypvt[-0].expval); } break; +case 193: +/* # line 919 "gram.in" */ +{ yyval.expval = mkexpr(OPSTAR, yypvt[-2].expval, yypvt[-0].expval); } break; +case 194: +/* # line 921 "gram.in" */ +{ yyval.expval = mkexpr(OPSLASH, yypvt[-2].expval, yypvt[-0].expval); } break; +case 195: +/* # line 923 "gram.in" */ +{ yyval.expval = mkexpr(OPPOWER, yypvt[-2].expval, yypvt[-0].expval); } break; +case 196: +/* # line 925 "gram.in" */ +{ if(yypvt[-1].ival == OPMINUS) + yyval.expval = mkexpr(OPNEG, yypvt[-0].expval, ENULL); + else yyval.expval = yypvt[-0].expval; + } break; +case 197: +/* # line 930 "gram.in" */ +{ NO66("concatenation operator //"); + yyval.expval = mkexpr(OPCONCAT, yypvt[-2].expval, yypvt[-0].expval); } break; +case 199: +/* # line 935 "gram.in" */ +{ + if(yypvt[-3].labval->labdefined) + execerr("no backward DO loops", CNULL); + yypvt[-3].labval->blklevel = blklevel+1; + exdo(yypvt[-3].labval->labelno, NPNULL, yypvt[-0].chval); + } break; +case 200: +/* # line 942 "gram.in" */ +{ + exdo(ctls - ctlstack - 2, NPNULL, yypvt[-0].chval); + NOEXT("DO without label"); + } break; +case 201: +/* # line 947 "gram.in" */ +{ exenddo(NPNULL); } break; +case 202: +/* # line 949 "gram.in" */ +{ exendif(); thiswasbranch = NO; } break; +case 204: +/* # line 952 "gram.in" */ +{ exelif(yypvt[-2].expval); lastwasbranch = NO; } break; +case 205: +/* # line 954 "gram.in" */ +{ exelse(); lastwasbranch = NO; } break; +case 206: +/* # line 956 "gram.in" */ +{ exendif(); lastwasbranch = NO; } break; +case 207: +/* # line 960 "gram.in" */ +{ exif(yypvt[-1].expval); } break; +case 208: +/* # line 964 "gram.in" */ +{ yyval.chval = mkchain((char *)yypvt[-2].namval, yypvt[-0].chval); } break; +case 210: +/* # line 969 "gram.in" */ +{ yyval.chval = mkchain(CNULL, (chainp)yypvt[-1].expval); } break; +case 211: +/* # line 973 "gram.in" */ +{ exequals((struct Primblock *)yypvt[-2].expval, yypvt[-0].expval); } break; +case 212: +/* # line 975 "gram.in" */ +{ exassign(yypvt[-0].namval, yypvt[-2].labval); } break; +case 215: +/* # line 979 "gram.in" */ +{ inioctl = NO; } break; +case 216: +/* # line 981 "gram.in" */ +{ exarif(yypvt[-6].expval, yypvt[-4].labval, yypvt[-2].labval, yypvt[-0].labval); thiswasbranch = YES; } break; +case 217: +/* # line 983 "gram.in" */ +{ excall(yypvt[-0].namval, LBNULL, 0, labarray); } break; +case 218: +/* # line 985 "gram.in" */ +{ excall(yypvt[-2].namval, LBNULL, 0, labarray); } break; +case 219: +/* # line 987 "gram.in" */ +{ if(nstars < MAXLABLIST) + excall(yypvt[-3].namval, mklist(yypvt[-1].chval), nstars, labarray); + else + err("too many alternate returns"); + } break; +case 220: +/* # line 993 "gram.in" */ +{ exreturn(yypvt[-0].expval); thiswasbranch = YES; } break; +case 221: +/* # line 995 "gram.in" */ +{ exstop(yypvt[-2].ival, yypvt[-0].expval); thiswasbranch = yypvt[-2].ival; } break; +case 222: +/* # line 999 "gram.in" */ +{ yyval.labval = mklabel( convci(toklen, token) ); } break; +case 223: +/* # line 1003 "gram.in" */ +{ if(parstate == OUTSIDE) + { + newproc(); + startproc(ESNULL, CLMAIN); + } + } break; +case 224: +/* # line 1012 "gram.in" */ +{ exgoto(yypvt[-0].labval); thiswasbranch = YES; } break; +case 225: +/* # line 1014 "gram.in" */ +{ exasgoto(yypvt[-0].namval); thiswasbranch = YES; } break; +case 226: +/* # line 1016 "gram.in" */ +{ exasgoto(yypvt[-4].namval); thiswasbranch = YES; } break; +case 227: +/* # line 1018 "gram.in" */ +{ if(nstars < MAXLABLIST) + putcmgo(putx(fixtype(yypvt[-0].expval)), nstars, labarray); + else + err("computed GOTO list too long"); + } break; +case 230: +/* # line 1030 "gram.in" */ +{ nstars = 0; yyval.namval = yypvt[-0].namval; } break; +case 231: +/* # line 1034 "gram.in" */ +{ yyval.chval = (yypvt[-0].expval ? mkchain((char *)yypvt[-0].expval,CHNULL) : CHNULL); } break; +case 232: +/* # line 1036 "gram.in" */ +{ if(yypvt[-0].expval) + if(yypvt[-2].chval) yyval.chval = hookup(yypvt[-2].chval, mkchain((char *)yypvt[-0].expval,CHNULL)); + else yyval.chval = mkchain((char *)yypvt[-0].expval,CHNULL); + else + yyval.chval = yypvt[-2].chval; + } break; +case 234: +/* # line 1046 "gram.in" */ +{ if(nstars0) setbound($3,ndim,dims); + } + | dcl SCOMMA name dims lengspec + { settype($3, $1, $5); + if(ndim>0) setbound($3,ndim,dims); + } + | dcl SSLASHD datainit vallist SSLASHD + { if (new_dcl == 2) { + err("attempt to give DATA in type-declaration"); + new_dcl = 1; + } + } + ; + +new_dcl: { new_dcl = 2; } + +type: typespec lengspec + { varleng = $2; + if (vartype == TYLOGICAL && varleng == 1) { + varleng = 0; + err("treating LOGICAL*1 as LOGICAL"); + --nerr; /* allow generation of .c file */ + } + } + ; + +typespec: typename + { varleng = ($1<0 || $1==TYLONG ? 0 : typesize[$1]); + vartype = $1; } + ; + +typename: SINTEGER { $$ = TYLONG; } + | SREAL { $$ = tyreal; } + | SCOMPLEX { ++complex_seen; $$ = TYCOMPLEX; } + | SDOUBLE { $$ = TYDREAL; } + | SDCOMPLEX { ++dcomplex_seen; NOEXT("DOUBLE COMPLEX statement"); $$ = TYDCOMPLEX; } + | SLOGICAL { $$ = TYLOGICAL; } + | SCHARACTER { NO66("CHARACTER statement"); $$ = TYCHAR; } + | SUNDEFINED { $$ = TYUNKNOWN; } + | SDIMENSION { $$ = TYUNKNOWN; } + | SAUTOMATIC { NOEXT("AUTOMATIC statement"); $$ = - STGAUTO; } + | SSTATIC { NOEXT("STATIC statement"); $$ = - STGBSS; } + ; + +lengspec: + { $$ = varleng; } + | SSTAR intonlyon expr intonlyoff + { + expptr p; + p = $3; + NO66("length specification *n"); + if( ! ISICON(p) || p->constblock.Const.ci<0 ) + { + $$ = 0; + dclerr("length must be a positive integer constant", + NPNULL); + } + else { + if (vartype == TYCHAR) + $$ = p->constblock.Const.ci; + else switch((int)p->constblock.Const.ci) { + case 1: $$ = 1; break; + case 2: $$ = typesize[TYSHORT]; break; + case 4: $$ = typesize[TYLONG]; break; + case 8: $$ = typesize[TYDREAL]; break; + case 16: $$ = typesize[TYDCOMPLEX]; break; + default: + dclerr("invalid length",NPNULL); + $$ = varleng; + } + } + } + | SSTAR intonlyon SLPAR SSTAR SRPAR intonlyoff + { NO66("length specification *(*)"); $$ = -1; } + ; + +common: SCOMMON in_dcl var + { incomm( $$ = comblock("") , $3 ); } + | SCOMMON in_dcl comblock var + { $$ = $3; incomm($3, $4); } + | common opt_comma comblock opt_comma var + { $$ = $3; incomm($3, $5); } + | common SCOMMA var + { incomm($1, $3); } + ; + +comblock: SCONCAT + { $$ = comblock(""); } + | SSLASH SNAME SSLASH + { $$ = comblock(token); } + ; + +external: SEXTERNAL in_dcl name + { setext($3); } + | external SCOMMA name + { setext($3); } + ; + +intrinsic: SINTRINSIC in_dcl name + { NO66("INTRINSIC statement"); setintr($3); } + | intrinsic SCOMMA name + { setintr($3); } + ; + +equivalence: SEQUIV in_dcl equivset + | equivalence SCOMMA equivset + ; + +equivset: SLPAR equivlist SRPAR + { + struct Equivblock *p; + if(nequiv >= maxequiv) + many("equivalences", 'q', maxequiv); + p = & eqvclass[nequiv++]; + p->eqvinit = NO; + p->eqvbottom = 0; + p->eqvtop = 0; + p->equivs = $2; + } + ; + +equivlist: lhs + { $$=ALLOC(Eqvchain); + $$->eqvitem.eqvlhs = (struct Primblock *)$1; + } + | equivlist SCOMMA lhs + { $$=ALLOC(Eqvchain); + $$->eqvitem.eqvlhs = (struct Primblock *) $3; + $$->eqvnextp = $1; + } + ; + +data: SDATA in_data datalist + | data opt_comma datalist + ; + +in_data: + { if(parstate == OUTSIDE) + { + newproc(); + startproc(ESNULL, CLMAIN); + } + if(parstate < INDATA) + { + enddcl(); + parstate = INDATA; + } + } + ; + +datalist: datainit datavarlist SSLASH datapop vallist SSLASH + { ftnint junk; + if(nextdata(&junk) != NULL) + err("too few initializers"); + frdata($2); + frrpl(); + } + ; + +datainit: /* nothing */ { frchain(&datastack); curdtp = 0; } + +datapop: /* nothing */ { pop_datastack(); } + +vallist: { toomanyinit = NO; } val + | vallist SCOMMA val + ; + +val: value + { dataval(ENULL, $1); } + | simple SSTAR value + { dataval($1, $3); } + ; + +value: simple + | addop simple + { if( $1==OPMINUS && ISCONST($2) ) + consnegop((Constp)$2); + $$ = $2; + } + | complex_const + ; + +savelist: saveitem + | savelist SCOMMA saveitem + ; + +saveitem: name + { int k; + $1->vsave = YES; + k = $1->vstg; + if( ! ONEOF(k, M(STGUNKNOWN)|M(STGBSS)|M(STGINIT)) ) + dclerr("can only save static variables", $1); + } + | comblock + ; + +paramlist: paramitem + | paramlist SCOMMA paramitem + ; + +paramitem: name SEQUALS expr + { if($1->vclass == CLUNKNOWN) + make_param((struct Paramblock *)$1, $3); + else dclerr("cannot make into parameter", $1); + } + ; + +var: name dims + { if(ndim>0) setbound($1, ndim, dims); } + ; + +datavar: lhs + { Namep np; + np = ( (struct Primblock *) $1) -> namep; + vardcl(np); + if(np->vstg == STGCOMMON) + extsymtab[np->vardesc.varno].extinit = YES; + else if(np->vstg==STGEQUIV) + eqvclass[np->vardesc.varno].eqvinit = YES; + else if(np->vstg!=STGINIT && np->vstg!=STGBSS) + dclerr("inconsistent storage classes", np); + $$ = mkchain((char *)$1, CHNULL); + } + | SLPAR datavarlist SCOMMA dospec SRPAR + { chainp p; struct Impldoblock *q; + pop_datastack(); + q = ALLOC(Impldoblock); + q->tag = TIMPLDO; + (q->varnp = (Namep) ($4->datap))->vimpldovar = 1; + p = $4->nextp; + if(p) { q->implb = (expptr)(p->datap); p = p->nextp; } + if(p) { q->impub = (expptr)(p->datap); p = p->nextp; } + if(p) { q->impstep = (expptr)(p->datap); } + frchain( & ($4) ); + $$ = mkchain((char *)q, CHNULL); + q->datalist = hookup($2, $$); + } + ; + +datavarlist: datavar + { if (!datastack) + curdtp = 0; + datastack = mkchain((char *)curdtp, datastack); + curdtp = $1; curdtelt = 0; + } + | datavarlist SCOMMA datavar + { $$ = hookup($1, $3); } + ; + +dims: + { ndim = 0; } + | SLPAR dimlist SRPAR + ; + +dimlist: { ndim = 0; } dim + | dimlist SCOMMA dim + ; + +dim: ubound + { + if(ndim == maxdim) + err("too many dimensions"); + else if(ndim < maxdim) + { dims[ndim].lb = 0; + dims[ndim].ub = $1; + } + ++ndim; + } + | expr SCOLON ubound + { + if(ndim == maxdim) + err("too many dimensions"); + else if(ndim < maxdim) + { dims[ndim].lb = $1; + dims[ndim].ub = $3; + } + ++ndim; + } + ; + +ubound: SSTAR + { $$ = 0; } + | expr + ; + +labellist: label + { nstars = 1; labarray[0] = $1; } + | labellist SCOMMA label + { if(nstars < MAXLABLIST) labarray[nstars++] = $3; } + ; + +label: SICON + { $$ = execlab( convci(toklen, token) ); } + ; + +implicit: SIMPLICIT in_dcl implist + { NO66("IMPLICIT statement"); } + | implicit SCOMMA implist + ; + +implist: imptype SLPAR letgroups SRPAR + | imptype + { if (vartype != TYUNKNOWN) + dclerr("-- expected letter range",NPNULL); + setimpl(vartype, varleng, 'a', 'z'); } + ; + +imptype: { needkwd = 1; } type + /* { vartype = $2; } */ + ; + +letgroups: letgroup + | letgroups SCOMMA letgroup + ; + +letgroup: letter + { setimpl(vartype, varleng, $1, $1); } + | letter SMINUS letter + { setimpl(vartype, varleng, $1, $3); } + ; + +letter: SNAME + { if(toklen!=1 || token[0]<'a' || token[0]>'z') + { + dclerr("implicit item must be single letter", NPNULL); + $$ = 0; + } + else $$ = token[0]; + } + ; + +namelist: SNAMELIST + | namelist namelistentry + ; + +namelistentry: SSLASH name SSLASH namelistlist + { + if($2->vclass == CLUNKNOWN) + { + $2->vclass = CLNAMELIST; + $2->vtype = TYINT; + $2->vstg = STGBSS; + $2->varxptr.namelist = $4; + $2->vardesc.varno = ++lastvarno; + } + else dclerr("cannot be a namelist name", $2); + } + ; + +namelistlist: name + { $$ = mkchain((char *)$1, CHNULL); } + | namelistlist SCOMMA name + { $$ = hookup($1, mkchain((char *)$3, CHNULL)); } + ; + +in_dcl: + { switch(parstate) + { + case OUTSIDE: newproc(); + startproc(ESNULL, CLMAIN); + case INSIDE: parstate = INDCL; + case INDCL: break; + + case INDATA: + errstr( + "Statement order error: declaration after DATA", + CNULL); + break; + + default: + dclerr("declaration among executables", NPNULL); + } + } + ; diff --git a/sources/f2c/gram.exe b/sources/f2c/gram.exe new file mode 100644 index 0000000..a14d4e3 --- /dev/null +++ b/sources/f2c/gram.exe @@ -0,0 +1,148 @@ +exec: iffable + | SDO end_spec intonlyon label intonlyoff opt_comma dospecw + { + if($4->labdefined) + execerr("no backward DO loops", CNULL); + $4->blklevel = blklevel+1; + exdo($4->labelno, NPNULL, $7); + } + | SDO end_spec opt_comma dospecw + { + exdo(ctls - ctlstack - 2, NPNULL, $4); + NOEXT("DO without label"); + } + | SENDDO + { exenddo(NPNULL); } + | logif iffable + { exendif(); thiswasbranch = NO; } + | logif STHEN + | SELSEIF end_spec SLPAR expr SRPAR STHEN + { exelif($4); lastwasbranch = NO; } + | SELSE end_spec + { exelse(); lastwasbranch = NO; } + | SENDIF end_spec + { exendif(); lastwasbranch = NO; } + ; + +logif: SLOGIF end_spec SLPAR expr SRPAR + { exif($4); } + ; + +dospec: name SEQUALS exprlist + { $$ = mkchain((char *)$1, $3); } + ; + +dospecw: dospec + | SWHILE SLPAR expr SRPAR + { $$ = mkchain(CNULL, (chainp)$3); } + ; + +iffable: let lhs SEQUALS expr + { exequals((struct Primblock *)$2, $4); } + | SASSIGN end_spec assignlabel STO name + { exassign($5, $3); } + | SCONTINUE end_spec + | goto + | io + { inioctl = NO; } + | SARITHIF end_spec SLPAR expr SRPAR label SCOMMA label SCOMMA label + { exarif($4, $6, $8, $10); thiswasbranch = YES; } + | call + { excall($1, LBNULL, 0, labarray); } + | call SLPAR SRPAR + { excall($1, LBNULL, 0, labarray); } + | call SLPAR callarglist SRPAR + { if(nstars < MAXLABLIST) + excall($1, mklist($3), nstars, labarray); + else + err("too many alternate returns"); + } + | SRETURN end_spec opt_expr + { exreturn($3); thiswasbranch = YES; } + | stop end_spec opt_expr + { exstop($1, $3); thiswasbranch = $1; } + ; + +assignlabel: SICON + { $$ = mklabel( convci(toklen, token) ); } + ; + +let: SLET + { if(parstate == OUTSIDE) + { + newproc(); + startproc(ESNULL, CLMAIN); + } + } + ; + +goto: SGOTO end_spec label + { exgoto($3); thiswasbranch = YES; } + | SASGOTO end_spec name + { exasgoto($3); thiswasbranch = YES; } + | SASGOTO end_spec name opt_comma SLPAR labellist SRPAR + { exasgoto($3); thiswasbranch = YES; } + | SCOMPGOTO end_spec SLPAR labellist SRPAR opt_comma expr + { if(nstars < MAXLABLIST) + putcmgo(putx(fixtype($7)), nstars, labarray); + else + err("computed GOTO list too long"); + } + ; + +opt_comma: + | SCOMMA + ; + +call: SCALL end_spec name + { nstars = 0; $$ = $3; } + ; + +callarglist: callarg + { $$ = ($1 ? mkchain((char *)$1,CHNULL) : CHNULL); } + | callarglist SCOMMA callarg + { if($3) + if($1) $$ = hookup($1, mkchain((char *)$3,CHNULL)); + else $$ = mkchain((char *)$3,CHNULL); + else + $$ = $1; + } + ; + +callarg: expr + | SSTAR label + { if(nstarsvclass == CLPARAM) + $$ = (expptr) cpexpr( + ( (struct Paramblock *) ($1) ) -> paramval); + } + | simple_const + ; + +simple_const: STRUE { $$ = mklogcon(1); } + | SFALSE { $$ = mklogcon(0); } + | SHOLLERITH { $$ = mkstrcon(toklen, token); } + | SICON = { $$ = mkintcon( convci(toklen, token) ); } + | SRCON = { $$ = mkrealcon(tyreal, token); } + | SDCON = { $$ = mkrealcon(TYDREAL, token); } + | bit_const + ; + +complex_const: SLPAR uexpr SCOMMA uexpr SRPAR + { $$ = mkcxcon($2,$4); } + ; + +bit_const: SHEXCON + { NOEXT("hex constant"); + $$ = mkbitcon(4, toklen, token); } + | SOCTCON + { NOEXT("octal constant"); + $$ = mkbitcon(3, toklen, token); } + | SBITCON + { NOEXT("binary constant"); + $$ = mkbitcon(1, toklen, token); } + ; + +fexpr: unpar_fexpr + | SLPAR fexpr SRPAR + { $$ = $2; } + ; + +unpar_fexpr: lhs + | simple_const + | fexpr addop fexpr %prec SPLUS + { $$ = mkexpr($2, $1, $3); } + | fexpr SSTAR fexpr + { $$ = mkexpr(OPSTAR, $1, $3); } + | fexpr SSLASH fexpr + { $$ = mkexpr(OPSLASH, $1, $3); } + | fexpr SPOWER fexpr + { $$ = mkexpr(OPPOWER, $1, $3); } + | addop fexpr %prec SSTAR + { if($1 == OPMINUS) + $$ = mkexpr(OPNEG, $2, ENULL); + else $$ = $2; + } + | fexpr SCONCAT fexpr + { NO66("concatenation operator //"); + $$ = mkexpr(OPCONCAT, $1, $3); } + ; diff --git a/sources/f2c/gram.hd b/sources/f2c/gram.hd new file mode 100644 index 0000000..201763c --- /dev/null +++ b/sources/f2c/gram.hd @@ -0,0 +1,298 @@ +/**************************************************************** +Copyright 1990 by AT&T Bell Laboratories, Bellcore. + +Permission to use, copy, modify, and distribute this software +and its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the names of AT&T Bell Laboratories or +Bellcore or any of their entities not be used in advertising or +publicity pertaining to distribution of the software without +specific, written prior permission. + +AT&T and Bellcore disclaim all warranties with regard to this +software, including all implied warranties of merchantability +and fitness. In no event shall AT&T or Bellcore be liable for +any special, indirect or consequential damages or any damages +whatsoever resulting from loss of use, data or profits, whether +in an action of contract, negligence or other tortious action, +arising out of or in connection with the use or performance of +this software. +****************************************************************/ + +%{ +# include "defs.h" +# include "p1defs.h" + +static int nstars; /* Number of labels in an + alternate return CALL */ +static int ndim; +static int vartype; +int new_dcl; +static ftnint varleng; +static struct { expptr lb, ub; } dims[MAXDIM+1]; +static struct Labelblock *labarray[MAXLABLIST]; /* Labels in an alternate + return CALL */ + +/* The next two variables are used to verify that each statement might be reached + during runtime. lastwasbranch is tested only in the defintion of the + stat: nonterminal. */ + +int lastwasbranch = NO; +static int thiswasbranch = NO; +extern ftnint yystno; +extern flag intonly; +static chainp datastack; +extern long laststfcn, thisstno; +extern int can_include; /* for netlib */ + +ftnint convci(); +Addrp nextdata(); +expptr mklogcon(), mkaddcon(), mkrealcon(), mkstrcon(), mkbitcon(); +expptr mkcxcon(); +struct Listblock *mklist(); +struct Listblock *mklist(); +struct Impldoblock *mkiodo(); +Extsym *comblock(); +#define ESNULL (Extsym *)0 +#define NPNULL (Namep)0 +#define LBNULL (struct Listblock *)0 +extern void freetemps(), make_param(); + + static void +pop_datastack() { + chainp d0 = datastack; + if (d0->datap) + curdtp = (chainp)d0->datap; + datastack = d0->nextp; + d0->nextp = 0; + frchain(&d0); + } + +%} + +/* Specify precedences and associativities. */ + +%union { + int ival; + ftnint lval; + char *charpval; + chainp chval; + tagptr tagval; + expptr expval; + struct Labelblock *labval; + struct Nameblock *namval; + struct Eqvchain *eqvval; + Extsym *extval; + } + +%left SCOMMA +%nonassoc SCOLON +%right SEQUALS +%left SEQV SNEQV +%left SOR +%left SAND +%left SNOT +%nonassoc SLT SGT SLE SGE SEQ SNE +%left SCONCAT +%left SPLUS SMINUS +%left SSTAR SSLASH +%right SPOWER + +%start program +%type thislabel label assignlabel +%type other inelt +%type type typespec typename dcl letter addop relop stop nameeq +%type lengspec +%type filename +%type datavar datavarlist namelistlist funarglist funargs +%type dospec dospecw +%type callarglist arglist args exprlist inlist outlist out2 substring +%type name arg call var +%type lhs expr uexpr opt_expr fexpr unpar_fexpr +%type ubound simple value callarg complex_const simple_const bit_const +%type common comblock entryname progname +%type equivlist + +%% + +program: + | program stat SEOS + ; + +stat: thislabel entry + { +/* stat: is the nonterminal for Fortran statements */ + + lastwasbranch = NO; } + | thislabel spec + | thislabel exec + { /* forbid further statement function definitions... */ + if (parstate == INDATA && laststfcn != thisstno) + parstate = INEXEC; + thisstno++; + if($1 && ($1->labelno==dorange)) + enddo($1->labelno); + if(lastwasbranch && thislabel==NULL) + warn("statement cannot be reached"); + lastwasbranch = thiswasbranch; + thiswasbranch = NO; + if($1) + { + if($1->labtype == LABFORMAT) + err("label already that of a format"); + else + $1->labtype = LABEXEC; + } + freetemps(); + } + | thislabel SINCLUDE filename + { if (can_include) + doinclude( $3 ); + else { + fprintf(diagfile, "Cannot open file %s\n", $3); + done(1); + } + } + | thislabel SEND end_spec + { if ($1) + lastwasbranch = NO; + endproc(); /* lastwasbranch = NO; -- set in endproc() */ + } + | thislabel SUNKNOWN + { extern void unclassifiable(); + unclassifiable(); + +/* flline flushes the current line, ignoring the rest of the text there */ + + flline(); }; + | error + { flline(); needkwd = NO; inioctl = NO; + yyerrok; yyclearin; } + ; + +thislabel: SLABEL + { + if(yystno != 0) + { + $$ = thislabel = mklabel(yystno); + if( ! headerdone ) { + if (procclass == CLUNKNOWN) + procclass = CLMAIN; + puthead(CNULL, procclass); + } + if(thislabel->labdefined) + execerr("label %s already defined", + convic(thislabel->stateno) ); + else { + if(thislabel->blklevel!=0 && thislabel->blklevellabtype!=LABFORMAT) + warn1("there is a branch to label %s from outside block", + convic( (ftnint) (thislabel->stateno) ) ); + thislabel->blklevel = blklevel; + thislabel->labdefined = YES; + if(thislabel->labtype != LABFORMAT) + p1_label((long)(thislabel - labeltab)); + } + } + else $$ = thislabel = NULL; + } + ; + +entry: SPROGRAM new_proc progname + {startproc($3, CLMAIN); } + | SPROGRAM new_proc progname progarglist + { warn("ignoring arguments to main program"); + /* hashclear(); */ + startproc($3, CLMAIN); } + | SBLOCK new_proc progname + { if($3) NO66("named BLOCKDATA"); + startproc($3, CLBLOCK); } + | SSUBROUTINE new_proc entryname arglist + { entrypt(CLPROC, TYSUBR, (ftnint) 0, $3, $4); } + | SFUNCTION new_proc entryname arglist + { entrypt(CLPROC, TYUNKNOWN, (ftnint) 0, $3, $4); } + | type SFUNCTION new_proc entryname arglist + { entrypt(CLPROC, $1, varleng, $4, $5); } + | SENTRY entryname arglist + { if(parstate==OUTSIDE || procclass==CLMAIN + || procclass==CLBLOCK) + execerr("misplaced entry statement", CNULL); + entrypt(CLENTRY, 0, (ftnint) 0, $2, $3); + } + ; + +new_proc: + { newproc(); } + ; + +entryname: name + { $$ = newentry($1, 1); } + ; + +name: SNAME + { $$ = mkname(token); } + ; + +progname: { $$ = NULL; } + | entryname + ; + +progarglist: + SLPAR SRPAR + | SLPAR progargs SRPAR + ; + +progargs: progarg + | progargs SCOMMA progarg + ; + +progarg: SNAME + | SNAME SEQUALS SNAME + ; + +arglist: + { $$ = 0; } + | SLPAR SRPAR + { NO66(" () argument list"); + $$ = 0; } + | SLPAR args SRPAR + {$$ = $2; } + ; + +args: arg + { $$ = ($1 ? mkchain((char *)$1,CHNULL) : CHNULL ); } + | args SCOMMA arg + { if($3) $1 = $$ = mkchain((char *)$3, $1); } + ; + +arg: name + { if($1->vstg!=STGUNKNOWN && $1->vstg!=STGARG) + dclerr("name declared as argument after use", $1); + $1->vstg = STGARG; + } + | SSTAR + { NO66("altenate return argument"); + +/* substars means that '*'ed formal parameters should be replaced. + This is used to specify alternate return labels; in theory, only + parameter slots which have '*' should accept the statement labels. + This compiler chooses to ignore the '*'s in the formal declaration, and + always return the proper value anyway. + + This variable is only referred to in proc.c */ + + $$ = 0; substars = YES; } + ; + + + +filename: SHOLLERITH + { + char *s; + s = copyn(toklen+1, token); + s[toklen] = '\0'; + $$ = s; + } + ; diff --git a/sources/f2c/gram.io b/sources/f2c/gram.io new file mode 100644 index 0000000..35791d4 --- /dev/null +++ b/sources/f2c/gram.io @@ -0,0 +1,173 @@ + /* Input/Output Statements */ + +io: io1 + { endio(); } + ; + +io1: iofmove ioctl + | iofmove unpar_fexpr + { ioclause(IOSUNIT, $2); endioctl(); } + | iofmove SSTAR + { ioclause(IOSUNIT, ENULL); endioctl(); } + | iofmove SPOWER + { ioclause(IOSUNIT, IOSTDERR); endioctl(); } + | iofctl ioctl + | read ioctl + { doio(CHNULL); } + | read infmt + { doio(CHNULL); } + | read ioctl inlist + { doio($3); } + | read infmt SCOMMA inlist + { doio($4); } + | read ioctl SCOMMA inlist + { doio($4); } + | write ioctl + { doio(CHNULL); } + | write ioctl outlist + { doio($3); } + | print + { doio(CHNULL); } + | print SCOMMA outlist + { doio($3); } + ; + +iofmove: fmkwd end_spec in_ioctl + ; + +fmkwd: SBACKSPACE + { iostmt = IOBACKSPACE; } + | SREWIND + { iostmt = IOREWIND; } + | SENDFILE + { iostmt = IOENDFILE; } + ; + +iofctl: ctlkwd end_spec in_ioctl + ; + +ctlkwd: SINQUIRE + { iostmt = IOINQUIRE; } + | SOPEN + { iostmt = IOOPEN; } + | SCLOSE + { iostmt = IOCLOSE; } + ; + +infmt: unpar_fexpr + { + ioclause(IOSUNIT, ENULL); + ioclause(IOSFMT, $1); + endioctl(); + } + | SSTAR + { + ioclause(IOSUNIT, ENULL); + ioclause(IOSFMT, ENULL); + endioctl(); + } + ; + +ioctl: SLPAR fexpr SRPAR + { + ioclause(IOSUNIT, $2); + endioctl(); + } + | SLPAR ctllist SRPAR + { endioctl(); } + ; + +ctllist: ioclause + | ctllist SCOMMA ioclause + ; + +ioclause: fexpr + { ioclause(IOSPOSITIONAL, $1); } + | SSTAR + { ioclause(IOSPOSITIONAL, ENULL); } + | SPOWER + { ioclause(IOSPOSITIONAL, IOSTDERR); } + | nameeq expr + { ioclause($1, $2); } + | nameeq SSTAR + { ioclause($1, ENULL); } + | nameeq SPOWER + { ioclause($1, IOSTDERR); } + ; + +nameeq: SNAMEEQ + { $$ = iocname(); } + ; + +read: SREAD end_spec in_ioctl + { iostmt = IOREAD; } + ; + +write: SWRITE end_spec in_ioctl + { iostmt = IOWRITE; } + ; + +print: SPRINT end_spec fexpr in_ioctl + { + iostmt = IOWRITE; + ioclause(IOSUNIT, ENULL); + ioclause(IOSFMT, $3); + endioctl(); + } + | SPRINT end_spec SSTAR in_ioctl + { + iostmt = IOWRITE; + ioclause(IOSUNIT, ENULL); + ioclause(IOSFMT, ENULL); + endioctl(); + } + ; + +inlist: inelt + { $$ = mkchain((char *)$1, CHNULL); } + | inlist SCOMMA inelt + { $$ = hookup($1, mkchain((char *)$3, CHNULL)); } + ; + +inelt: lhs + { $$ = (tagptr) $1; } + | SLPAR inlist SCOMMA dospec SRPAR + { $$ = (tagptr) mkiodo($4,$2); } + ; + +outlist: uexpr + { $$ = mkchain((char *)$1, CHNULL); } + | other + { $$ = mkchain((char *)$1, CHNULL); } + | out2 + ; + +out2: uexpr SCOMMA uexpr + { $$ = mkchain((char *)$1, mkchain((char *)$3, CHNULL) ); } + | uexpr SCOMMA other + { $$ = mkchain((char *)$1, mkchain((char *)$3, CHNULL) ); } + | other SCOMMA uexpr + { $$ = mkchain((char *)$1, mkchain((char *)$3, CHNULL) ); } + | other SCOMMA other + { $$ = mkchain((char *)$1, mkchain((char *)$3, CHNULL) ); } + | out2 SCOMMA uexpr + { $$ = hookup($1, mkchain((char *)$3, CHNULL) ); } + | out2 SCOMMA other + { $$ = hookup($1, mkchain((char *)$3, CHNULL) ); } + ; + +other: complex_const + { $$ = (tagptr) $1; } + | SLPAR expr SRPAR + { $$ = (tagptr) $2; } + | SLPAR uexpr SCOMMA dospec SRPAR + { $$ = (tagptr) mkiodo($4, mkchain((char *)$2, CHNULL) ); } + | SLPAR other SCOMMA dospec SRPAR + { $$ = (tagptr) mkiodo($4, mkchain((char *)$2, CHNULL) ); } + | SLPAR out2 SCOMMA dospec SRPAR + { $$ = (tagptr) mkiodo($4, $2); } + ; + +in_ioctl: + { startioctl(); } + ; diff --git a/sources/f2c/init.c b/sources/f2c/init.c new file mode 100644 index 0000000..9e58a81 --- /dev/null +++ b/sources/f2c/init.c @@ -0,0 +1,434 @@ +/**************************************************************** +Copyright 1990 by AT&T Bell Laboratories and Bellcore. + +Permission to use, copy, modify, and distribute this software +and its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the names of AT&T Bell Laboratories or +Bellcore or any of their entities not be used in advertising or +publicity pertaining to distribution of the software without +specific, written prior permission. + +AT&T and Bellcore disclaim all warranties with regard to this +software, including all implied warranties of merchantability +and fitness. In no event shall AT&T or Bellcore be liable for +any special, indirect or consequential damages or any damages +whatsoever resulting from loss of use, data or profits, whether +in an action of contract, negligence or other tortious action, +arising out of or in connection with the use or performance of +this software. +****************************************************************/ + +#include "defs.h" +#include "output.h" +#include "iob.h" + +/* State required for the C output */ +char *fl_fmt_string; /* Float format string */ +char *db_fmt_string; /* Double format string */ +char *cm_fmt_string; /* Complex format string */ +char *dcm_fmt_string; /* Double complex format string */ + +chainp new_vars = CHNULL; /* List of newly created locals in this + function. These may have identifiers + which have underscores and more than VL + characters */ +chainp used_builtins = CHNULL; /* List of builtins used by this function. + These are all Addrps with UNAM_EXTERN + */ +chainp assigned_fmts = CHNULL; /* assigned formats */ +chainp allargs; /* union of args in all entry points */ +chainp earlylabs; /* labels seen before enddcl() */ +char main_alias[52]; /* PROGRAM name, if any is given */ +int tab_size = 4; + + +FILEP infile; +FILEP diagfile; + +FILEP c_file; +FILEP pass1_file; +FILEP initfile; +FILEP blkdfile; + + +char token[MAXTOKENLEN]; +int toklen; +long lineno; /* Current line in the input file, NOT the + Fortran statement label number */ +char *infname; +int needkwd; +struct Labelblock *thislabel = NULL; +int nerr; +int nwarn; + +flag saveall; +flag substars; +int parstate = OUTSIDE; +flag headerdone = NO; +int blklevel; +int doin_setbound; +int impltype[26]; +ftnint implleng[26]; +int implstg[26]; + +int tyint = TYLONG ; +int tylogical = TYLONG; +int typesize[NTYPES] = { + 1, SZADDR, SZSHORT, SZLONG, SZLONG, 2*SZLONG, + 2*SZLONG, 4*SZLONG, SZLONG, 1, 1, 0, + 4*SZLONG + SZADDR, /* sizeof(cilist) */ + 4*SZLONG + 2*SZADDR, /* sizeof(icilist) */ + 4*SZLONG + 5*SZADDR, /* sizeof(olist) */ + 2*SZLONG + SZADDR, /* sizeof(cllist) */ + 2*SZLONG, /* sizeof(alist) */ + 11*SZLONG + 15*SZADDR /* sizeof(inlist) */ + }; + +int typealign[NTYPES] = { + 1, ALIADDR, ALISHORT, ALILONG, ALILONG, ALIDOUBLE, + ALILONG, ALIDOUBLE, ALILONG, 1, 1, 1, + ALILONG, ALILONG, ALILONG, ALILONG, ALILONG, ALILONG}; + +int type_choice[4] = { TYDREAL, TYSHORT, TYLONG, TYSHORT }; + +char *typename[] = { + "<>", + "address", + "shortint", + "integer", + "real", + "doublereal", + "complex", + "doublecomplex", + "logical", + "char" /* character */ + }; + +int type_pref[NTYPES] = { 0, 0, 2, 4, 5, 7, 6, 8, 3, 1 }; + +char *protorettypes[] = { + "?", "??", "shortint", "integer", "real", "doublereal", + "C_f", "Z_f", "logical", "H_f", "int" + }; + +char *casttypes[TYSUBR+1] = { + "U_fp", "??bug??", + "J_fp", "I_fp", "R_fp", + "D_fp", "C_fp", "Z_fp", + "L_fp", "H_fp", "S_fp" + }; +char *usedcasts[TYSUBR+1]; + +char *dfltarg[] = { + 0, 0, + "(shortint *)0", "(integer *)0", "(real *)0", + "(doublereal *)0", "(complex *)0", "(doublecomplex *)0", + "(logical *)0", "(char *)0" + }; + +static char *dflt0proc[] = { + 0, 0, + "(shortint (*)())0", "(integer (*)())0", "(real (*)())0", + "(doublereal (*)())0", "(complex (*)())0", "(doublecomplex (*)())0", + "(logical (*)())0", "(char (*)())0", "(int (*)())0" + }; + +char *dflt1proc[] = { "(U_fp)0", "(??bug??)0", + "(J_fp)0", "(I_fp)0", "(R_fp)0", + "(D_fp)0", "(C_fp)0", "(Z_fp)0", + "(L_fp)0", "(H_fp)0", "(S_fp)0" + }; + +char **dfltproc = dflt0proc; + +char *ftn_types[] = { "external", "??", + "integer*2", "integer", "real", + "double precision", "complex", "double complex", + "logical", "character", "subroutine" + }; + +int proctype = TYUNKNOWN; +char *procname; +int rtvlabel[NTYPES0]; +Addrp retslot; /* Holds automatic variable which was + allocated the function return value + */ +Addrp xretslot[NTYPES0]; /* for multiple entry points */ +int cxslot = -1; +int chslot = -1; +int chlgslot = -1; +int procclass = CLUNKNOWN; +int nentry; +int nallargs; +int nallchargs; +flag multitype; +ftnint procleng; +long lastiolabno; +int lastlabno; +int lastvarno; +int lastargslot; +int autonum[TYVOID]; +char *av_pfix[TYVOID] = {"??TYUNKNOWN??", "a","s","i","r","d","q","z","L","ch", + "??TYSUBR??", "??TYERROR??","ci", "ici", + "o", "cl", "al", "ioin" }; + +extern int maxctl; +struct Ctlframe *ctls; +struct Ctlframe *ctlstack; +struct Ctlframe *lastctl; + +Namep regnamep[MAXREGVAR]; +int highregvar; +int nregvar; + +extern int maxext; +Extsym *extsymtab; +Extsym *nextext; +Extsym *lastext; + +extern int maxequiv; +struct Equivblock *eqvclass; + +extern int maxhash; +struct Hashentry *hashtab; +struct Hashentry *lasthash; + +extern int maxstno; /* Maximum number of statement labels */ +struct Labelblock *labeltab; +struct Labelblock *labtabend; +struct Labelblock *highlabtab; + +int maxdim = MAXDIM; +struct Rplblock *rpllist = NULL; +struct Chain *curdtp = NULL; +flag toomanyinit; +ftnint curdtelt; +chainp templist[TYVOID]; +chainp holdtemps; +int dorange = 0; +struct Entrypoint *entries = NULL; + +chainp chains = NULL; + +flag inioctl; +int iostmt; +int nioctl; +int nequiv = 0; +int eqvstart = 0; +int nintnames = 0; + +struct Literal litpool[MAXLITERALS]; +int nliterals; + +char dflttype[26]; +char hextoi_tab[256], Letters[256]; +char *wh_first, *wh_next, *wh_last; + +#define ALLOCN(n,x) (struct x *) ckalloc((n)*sizeof(struct x)) + +fileinit() +{ + register char *s; + register int i, j; + + lastiolabno = 100000; + lastlabno = 0; + lastvarno = 0; + nliterals = 0; + nerr = 0; + + infile = stdin; + + memset(dflttype, tyreal, 26); + memset(dflttype + 'i' - 'a', tyint, 6); + memset(hextoi_tab, 16, sizeof(hextoi_tab)); + for(i = 0, s = "0123456789abcdef"; *s; i++, s++) + hextoi(*s) = i; + for(i = 10, s = "ABCDEF"; *s; i++, s++) + hextoi(*s) = i; + for(j = 0, s = "abcdefghijklmnopqrstuvwxyz"; i = *s++; j++) + Letters[i] = Letters[i+'A'-'a'] = j; + + ctls = ALLOCN(maxctl+1, Ctlframe); + extsymtab = ALLOCN(maxext, Extsym); + eqvclass = ALLOCN(maxequiv, Equivblock); + hashtab = ALLOCN(maxhash, Hashentry); + labeltab = ALLOCN(maxstno, Labelblock); + + ctlstack = ctls++; + lastctl = ctls + maxctl; + nextext = extsymtab; + lastext = extsymtab + maxext; + lasthash = hashtab + maxhash; + labtabend = labeltab + maxstno; + highlabtab = labeltab; + main_alias[0] = '\0'; + if (forcedouble) + dfltproc[TYREAL] = dfltproc[TYDREAL]; + +/* Initialize the routines for providing C output */ + + out_init (); +} + +hashclear() /* clear hash table */ +{ + register struct Hashentry *hp; + register Namep p; + register struct Dimblock *q; + register int i; + + for(hp = hashtab ; hp < lasthash ; ++hp) + if(p = hp->varp) + { + frexpr(p->vleng); + if(q = p->vdim) + { + for(i = 0 ; i < q->ndim ; ++i) + { + frexpr(q->dims[i].dimsize); + frexpr(q->dims[i].dimexpr); + } + frexpr(q->nelt); + frexpr(q->baseoffset); + frexpr(q->basexpr); + free( (charptr) q); + } + if(p->vclass == CLNAMELIST) + frchain( &(p->varxptr.namelist) ); + free( (charptr) p); + hp->varp = NULL; + } + } + +procinit() +{ + register struct Labelblock *lp; + struct Chain *cp; + int i; + extern struct memblock *curmemblock, *firstmemblock; + extern char *mem_first, *mem_next, *mem_last, *mem0_last; + extern void frexchain(); + + curmemblock = firstmemblock; + mem_next = mem_first; + mem_last = mem0_last; + wh_next = wh_first = wh_last = 0; + iob_list = 0; + for(i = 0; i < 9; i++) + io_structs[i] = 0; + + parstate = OUTSIDE; + headerdone = NO; + blklevel = 1; + saveall = NO; + substars = NO; + nwarn = 0; + thislabel = NULL; + needkwd = 0; + + proctype = TYUNKNOWN; + procname = "MAIN_"; + procclass = CLUNKNOWN; + nentry = 0; + nallargs = nallchargs = 0; + multitype = NO; + retslot = NULL; + for(i = 0; i < NTYPES0; i++) { + frexpr((expptr)xretslot[i]); + xretslot[i] = 0; + } + cxslot = -1; + chslot = -1; + chlgslot = -1; + procleng = 0; + blklevel = 1; + lastargslot = 0; + + for(lp = labeltab ; lp < labtabend ; ++lp) + lp->stateno = 0; + + hashclear(); + +/* Clear the list of newly generated identifiers from the previous + function */ + + frexchain(&new_vars); + frexchain(&used_builtins); + frchain(&assigned_fmts); + frchain(&allargs); + frchain(&earlylabs); + + nintnames = 0; + highlabtab = labeltab; + + ctlstack = ctls - 1; + for(i = TYADDR; i < TYVOID; i++) { + for(cp = templist[i]; cp ; cp = cp->nextp) + free( (charptr) (cp->datap) ); + frchain(templist + i); + autonum[i] = 0; + } + holdtemps = NULL; + dorange = 0; + nregvar = 0; + highregvar = 0; + entries = NULL; + rpllist = NULL; + inioctl = NO; + eqvstart += nequiv; + nequiv = 0; + dcomplex_seen = 0; + + for(i = 0 ; i c2) { + sprintf(buff, "characters out of order in implicit:%c-%c", c1, c2); + err(buff); + } + else { + c1 = letter(c1); + c2 = letter(c2); + if(type < 0) + for(i = c1 ; i<=c2 ; ++i) + implstg[i] = - type; + else { + type = lengtype(type, length); + if(type != TYCHAR) + length = 0; + for(i = c1 ; i<=c2 ; ++i) { + impltype[i] = type; + implleng[i] = length; + } + } + } + } diff --git a/sources/f2c/intr.c b/sources/f2c/intr.c new file mode 100644 index 0000000..24c94c8 --- /dev/null +++ b/sources/f2c/intr.c @@ -0,0 +1,846 @@ +/**************************************************************** +Copyright 1990 by AT&T Bell Laboratories and Bellcore. + +Permission to use, copy, modify, and distribute this software +and its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the names of AT&T Bell Laboratories or +Bellcore or any of their entities not be used in advertising or +publicity pertaining to distribution of the software without +specific, written prior permission. + +AT&T and Bellcore disclaim all warranties with regard to this +software, including all implied warranties of merchantability +and fitness. In no event shall AT&T or Bellcore be liable for +any special, indirect or consequential damages or any damages +whatsoever resulting from loss of use, data or profits, whether +in an action of contract, negligence or other tortious action, +arising out of or in connection with the use or performance of +this software. +****************************************************************/ + +#include "defs.h" +#include "names.h" + +void cast_args (); + +union + { + int ijunk; + struct Intrpacked bits; + } packed; + +struct Intrbits + { + char intrgroup /* :3 */; + char intrstuff /* result type or number of generics */; + char intrno /* :7 */; + char dblcmplx; + char dblintrno; /* for -r8 */ + }; + +/* List of all intrinsic functions. */ + +LOCAL struct Intrblock + { + char intrfname[8]; + struct Intrbits intrval; + } intrtab[ ] = +{ +"int", { INTRCONV, TYLONG }, +"real", { INTRCONV, TYREAL, 1 }, + /* 1 ==> real(TYDCOMPLEX) yields TYDREAL */ +"dble", { INTRCONV, TYDREAL }, +"cmplx", { INTRCONV, TYCOMPLEX }, +"dcmplx", { INTRCONV, TYDCOMPLEX, 0, 1 }, +"ifix", { INTRCONV, TYLONG }, +"idint", { INTRCONV, TYLONG }, +"float", { INTRCONV, TYREAL }, +"dfloat", { INTRCONV, TYDREAL }, +"sngl", { INTRCONV, TYREAL }, +"ichar", { INTRCONV, TYLONG }, +"iachar", { INTRCONV, TYLONG }, +"char", { INTRCONV, TYCHAR }, +"achar", { INTRCONV, TYCHAR }, + +/* any MAX or MIN can be used with any types; the compiler will cast them + correctly. So rules against bad syntax in these expressions are not + enforced */ + +"max", { INTRMAX, TYUNKNOWN }, +"max0", { INTRMAX, TYLONG }, +"amax0", { INTRMAX, TYREAL }, +"max1", { INTRMAX, TYLONG }, +"amax1", { INTRMAX, TYREAL }, +"dmax1", { INTRMAX, TYDREAL }, + +"and", { INTRBOOL, TYUNKNOWN, OPBITAND }, +"or", { INTRBOOL, TYUNKNOWN, OPBITOR }, +"xor", { INTRBOOL, TYUNKNOWN, OPBITXOR }, +"not", { INTRBOOL, TYUNKNOWN, OPBITNOT }, +"lshift", { INTRBOOL, TYUNKNOWN, OPLSHIFT }, +"rshift", { INTRBOOL, TYUNKNOWN, OPRSHIFT }, + +"min", { INTRMIN, TYUNKNOWN }, +"min0", { INTRMIN, TYLONG }, +"amin0", { INTRMIN, TYREAL }, +"min1", { INTRMIN, TYLONG }, +"amin1", { INTRMIN, TYREAL }, +"dmin1", { INTRMIN, TYDREAL }, + +"aint", { INTRGEN, 2, 0 }, +"dint", { INTRSPEC, TYDREAL, 1 }, + +"anint", { INTRGEN, 2, 2 }, +"dnint", { INTRSPEC, TYDREAL, 3 }, + +"nint", { INTRGEN, 4, 4 }, +"idnint", { INTRGEN, 2, 6 }, + +"abs", { INTRGEN, 6, 8 }, +"iabs", { INTRGEN, 2, 9 }, +"dabs", { INTRSPEC, TYDREAL, 11 }, +"cabs", { INTRSPEC, TYREAL, 12, 0, 13 }, +"zabs", { INTRSPEC, TYDREAL, 13, 1 }, + +"mod", { INTRGEN, 4, 14 }, +"amod", { INTRSPEC, TYREAL, 16, 0, 17 }, +"dmod", { INTRSPEC, TYDREAL, 17 }, + +"sign", { INTRGEN, 4, 18 }, +"isign", { INTRGEN, 2, 19 }, +"dsign", { INTRSPEC, TYDREAL, 21 }, + +"dim", { INTRGEN, 4, 22 }, +"idim", { INTRGEN, 2, 23 }, +"ddim", { INTRSPEC, TYDREAL, 25 }, + +"dprod", { INTRSPEC, TYDREAL, 26 }, + +"len", { INTRSPEC, TYLONG, 27 }, +"index", { INTRSPEC, TYLONG, 29 }, + +"imag", { INTRGEN, 2, 31 }, +"aimag", { INTRSPEC, TYREAL, 31, 0, 32 }, +"dimag", { INTRSPEC, TYDREAL, 32 }, + +"conjg", { INTRGEN, 2, 33 }, +"dconjg", { INTRSPEC, TYDCOMPLEX, 34, 1 }, + +"sqrt", { INTRGEN, 4, 35 }, +"dsqrt", { INTRSPEC, TYDREAL, 36 }, +"csqrt", { INTRSPEC, TYCOMPLEX, 37, 0, 38 }, +"zsqrt", { INTRSPEC, TYDCOMPLEX, 38, 1 }, + +"exp", { INTRGEN, 4, 39 }, +"dexp", { INTRSPEC, TYDREAL, 40 }, +"cexp", { INTRSPEC, TYCOMPLEX, 41, 0, 42 }, +"zexp", { INTRSPEC, TYDCOMPLEX, 42, 1 }, + +"log", { INTRGEN, 4, 43 }, +"alog", { INTRSPEC, TYREAL, 43, 0, 44 }, +"dlog", { INTRSPEC, TYDREAL, 44 }, +"clog", { INTRSPEC, TYCOMPLEX, 45, 0, 46 }, +"zlog", { INTRSPEC, TYDCOMPLEX, 46, 1 }, + +"log10", { INTRGEN, 2, 47 }, +"alog10", { INTRSPEC, TYREAL, 47, 0, 48 }, +"dlog10", { INTRSPEC, TYDREAL, 48 }, + +"sin", { INTRGEN, 4, 49 }, +"dsin", { INTRSPEC, TYDREAL, 50 }, +"csin", { INTRSPEC, TYCOMPLEX, 51, 0, 52 }, +"zsin", { INTRSPEC, TYDCOMPLEX, 52, 1 }, + +"cos", { INTRGEN, 4, 53 }, +"dcos", { INTRSPEC, TYDREAL, 54 }, +"ccos", { INTRSPEC, TYCOMPLEX, 55, 0, 56 }, +"zcos", { INTRSPEC, TYDCOMPLEX, 56, 1 }, + +"tan", { INTRGEN, 2, 57 }, +"dtan", { INTRSPEC, TYDREAL, 58 }, + +"asin", { INTRGEN, 2, 59 }, +"dasin", { INTRSPEC, TYDREAL, 60 }, + +"acos", { INTRGEN, 2, 61 }, +"dacos", { INTRSPEC, TYDREAL, 62 }, + +"atan", { INTRGEN, 2, 63 }, +"datan", { INTRSPEC, TYDREAL, 64 }, + +"atan2", { INTRGEN, 2, 65 }, +"datan2", { INTRSPEC, TYDREAL, 66 }, + +"sinh", { INTRGEN, 2, 67 }, +"dsinh", { INTRSPEC, TYDREAL, 68 }, + +"cosh", { INTRGEN, 2, 69 }, +"dcosh", { INTRSPEC, TYDREAL, 70 }, + +"tanh", { INTRGEN, 2, 71 }, +"dtanh", { INTRSPEC, TYDREAL, 72 }, + +"lge", { INTRSPEC, TYLOGICAL, 73}, +"lgt", { INTRSPEC, TYLOGICAL, 75}, +"lle", { INTRSPEC, TYLOGICAL, 77}, +"llt", { INTRSPEC, TYLOGICAL, 79}, + +#if 0 +"epbase", { INTRCNST, 4, 0 }, +"epprec", { INTRCNST, 4, 4 }, +"epemin", { INTRCNST, 2, 8 }, +"epemax", { INTRCNST, 2, 10 }, +"eptiny", { INTRCNST, 2, 12 }, +"ephuge", { INTRCNST, 4, 14 }, +"epmrsp", { INTRCNST, 2, 18 }, +#endif + +"fpexpn", { INTRGEN, 4, 81 }, +"fpabsp", { INTRGEN, 2, 85 }, +"fprrsp", { INTRGEN, 2, 87 }, +"fpfrac", { INTRGEN, 2, 89 }, +"fpmake", { INTRGEN, 2, 91 }, +"fpscal", { INTRGEN, 2, 93 }, + +"" }; + + +LOCAL struct Specblock + { + char atype; /* Argument type; every arg must have + this type */ + char rtype; /* Result type */ + char nargs; /* Number of arguments */ + char spxname[8]; /* Name of the function in Fortran */ + char othername; /* index into callbyvalue table */ + } spectab[ ] = +{ + { TYREAL,TYREAL,1,"r_int" }, + { TYDREAL,TYDREAL,1,"d_int" }, + + { TYREAL,TYREAL,1,"r_nint" }, + { TYDREAL,TYDREAL,1,"d_nint" }, + + { TYREAL,TYSHORT,1,"h_nint" }, + { TYREAL,TYLONG,1,"i_nint" }, + + { TYDREAL,TYSHORT,1,"h_dnnt" }, + { TYDREAL,TYLONG,1,"i_dnnt" }, + + { TYREAL,TYREAL,1,"r_abs" }, + { TYSHORT,TYSHORT,1,"h_abs" }, + { TYLONG,TYLONG,1,"i_abs" }, + { TYDREAL,TYDREAL,1,"d_abs" }, + { TYCOMPLEX,TYREAL,1,"c_abs" }, + { TYDCOMPLEX,TYDREAL,1,"z_abs" }, + + { TYSHORT,TYSHORT,2,"h_mod" }, + { TYLONG,TYLONG,2,"i_mod" }, + { TYREAL,TYREAL,2,"r_mod" }, + { TYDREAL,TYDREAL,2,"d_mod" }, + + { TYREAL,TYREAL,2,"r_sign" }, + { TYSHORT,TYSHORT,2,"h_sign" }, + { TYLONG,TYLONG,2,"i_sign" }, + { TYDREAL,TYDREAL,2,"d_sign" }, + + { TYREAL,TYREAL,2,"r_dim" }, + { TYSHORT,TYSHORT,2,"h_dim" }, + { TYLONG,TYLONG,2,"i_dim" }, + { TYDREAL,TYDREAL,2,"d_dim" }, + + { TYREAL,TYDREAL,2,"d_prod" }, + + { TYCHAR,TYSHORT,1,"h_len" }, + { TYCHAR,TYLONG,1,"i_len" }, + + { TYCHAR,TYSHORT,2,"h_indx" }, + { TYCHAR,TYLONG,2,"i_indx" }, + + { TYCOMPLEX,TYREAL,1,"r_imag" }, + { TYDCOMPLEX,TYDREAL,1,"d_imag" }, + { TYCOMPLEX,TYCOMPLEX,1,"r_cnjg" }, + { TYDCOMPLEX,TYDCOMPLEX,1,"d_cnjg" }, + + { TYREAL,TYREAL,1,"r_sqrt", 1 }, + { TYDREAL,TYDREAL,1,"d_sqrt", 1 }, + { TYCOMPLEX,TYCOMPLEX,1,"c_sqrt" }, + { TYDCOMPLEX,TYDCOMPLEX,1,"z_sqrt" }, + + { TYREAL,TYREAL,1,"r_exp", 2 }, + { TYDREAL,TYDREAL,1,"d_exp", 2 }, + { TYCOMPLEX,TYCOMPLEX,1,"c_exp" }, + { TYDCOMPLEX,TYDCOMPLEX,1,"z_exp" }, + + { TYREAL,TYREAL,1,"r_log", 3 }, + { TYDREAL,TYDREAL,1,"d_log", 3 }, + { TYCOMPLEX,TYCOMPLEX,1,"c_log" }, + { TYDCOMPLEX,TYDCOMPLEX,1,"z_log" }, + + { TYREAL,TYREAL,1,"r_lg10" }, + { TYDREAL,TYDREAL,1,"d_lg10" }, + + { TYREAL,TYREAL,1,"r_sin", 4 }, + { TYDREAL,TYDREAL,1,"d_sin", 4 }, + { TYCOMPLEX,TYCOMPLEX,1,"c_sin" }, + { TYDCOMPLEX,TYDCOMPLEX,1,"z_sin" }, + + { TYREAL,TYREAL,1,"r_cos", 5 }, + { TYDREAL,TYDREAL,1,"d_cos", 5 }, + { TYCOMPLEX,TYCOMPLEX,1,"c_cos" }, + { TYDCOMPLEX,TYDCOMPLEX,1,"z_cos" }, + + { TYREAL,TYREAL,1,"r_tan", 6 }, + { TYDREAL,TYDREAL,1,"d_tan", 6 }, + + { TYREAL,TYREAL,1,"r_asin", 7 }, + { TYDREAL,TYDREAL,1,"d_asin", 7 }, + + { TYREAL,TYREAL,1,"r_acos", 8 }, + { TYDREAL,TYDREAL,1,"d_acos", 8 }, + + { TYREAL,TYREAL,1,"r_atan", 9 }, + { TYDREAL,TYDREAL,1,"d_atan", 9 }, + + { TYREAL,TYREAL,2,"r_atn2", 10 }, + { TYDREAL,TYDREAL,2,"d_atn2", 10 }, + + { TYREAL,TYREAL,1,"r_sinh", 11 }, + { TYDREAL,TYDREAL,1,"d_sinh", 11 }, + + { TYREAL,TYREAL,1,"r_cosh", 12 }, + { TYDREAL,TYDREAL,1,"d_cosh", 12 }, + + { TYREAL,TYREAL,1,"r_tanh", 13 }, + { TYDREAL,TYDREAL,1,"d_tanh", 13 }, + + { TYCHAR,TYLOGICAL,2,"hl_ge" }, + { TYCHAR,TYLOGICAL,2,"l_ge" }, + + { TYCHAR,TYLOGICAL,2,"hl_gt" }, + { TYCHAR,TYLOGICAL,2,"l_gt" }, + + { TYCHAR,TYLOGICAL,2,"hl_le" }, + { TYCHAR,TYLOGICAL,2,"l_le" }, + + { TYCHAR,TYLOGICAL,2,"hl_lt" }, + { TYCHAR,TYLOGICAL,2,"l_lt" }, + + { TYREAL,TYSHORT,1,"hr_expn" }, + { TYREAL,TYLONG,1,"ir_expn" }, + { TYDREAL,TYSHORT,1,"hd_expn" }, + { TYDREAL,TYLONG,1,"id_expn" }, + + { TYREAL,TYREAL,1,"r_absp" }, + { TYDREAL,TYDREAL,1,"d_absp" }, + + { TYREAL,TYDREAL,1,"r_rrsp" }, + { TYDREAL,TYDREAL,1,"d_rrsp" }, + + { TYREAL,TYREAL,1,"r_frac" }, + { TYDREAL,TYDREAL,1,"d_frac" }, + + { TYREAL,TYREAL,2,"r_make" }, + { TYDREAL,TYDREAL,2,"d_make" }, + + { TYREAL,TYREAL,2,"r_scal" }, + { TYDREAL,TYDREAL,2,"d_scal" }, + { 0 } +} ; + +#if 0 +LOCAL struct Incstblock + { + char atype; + char rtype; + char constno; + } consttab[ ] = +{ + { TYSHORT, TYLONG, 0 }, + { TYLONG, TYLONG, 1 }, + { TYREAL, TYLONG, 2 }, + { TYDREAL, TYLONG, 3 }, + + { TYSHORT, TYLONG, 4 }, + { TYLONG, TYLONG, 5 }, + { TYREAL, TYLONG, 6 }, + { TYDREAL, TYLONG, 7 }, + + { TYREAL, TYLONG, 8 }, + { TYDREAL, TYLONG, 9 }, + + { TYREAL, TYLONG, 10 }, + { TYDREAL, TYLONG, 11 }, + + { TYREAL, TYREAL, 0 }, + { TYDREAL, TYDREAL, 1 }, + + { TYSHORT, TYLONG, 12 }, + { TYLONG, TYLONG, 13 }, + { TYREAL, TYREAL, 2 }, + { TYDREAL, TYDREAL, 3 }, + + { TYREAL, TYREAL, 4 }, + { TYDREAL, TYDREAL, 5 } +}; +#endif + +char *callbyvalue[ ] = + {0, + "sqrt", + "exp", + "log", + "sin", + "cos", + "tan", + "asin", + "acos", + "atan", + "atan2", + "sinh", + "cosh", + "tanh" + }; + + void +r8fix() /* adjust tables for -r8 */ +{ + register struct Intrblock *I; + register struct Specblock *S; + + for(I = intrtab; I->intrfname[0]; I++) + if (I->intrval.intrgroup != INTRGEN) + switch(I->intrval.intrstuff) { + case TYREAL: + I->intrval.intrstuff = TYDREAL; + I->intrval.intrno = I->intrval.dblintrno; + break; + case TYCOMPLEX: + I->intrval.intrstuff = TYDCOMPLEX; + I->intrval.intrno = I->intrval.dblintrno; + I->intrval.dblcmplx = 1; + } + + for(S = spectab; S->atype; S++) + switch(S->atype) { + case TYCOMPLEX: + S->atype = TYDCOMPLEX; + if (S->rtype == TYREAL) + S->rtype = TYDREAL; + else if (S->rtype == TYCOMPLEX) + S->rtype = TYDCOMPLEX; + switch(S->spxname[0]) { + case 'r': + S->spxname[0] = 'd'; + break; + case 'c': + S->spxname[0] = 'z'; + break; + default: + Fatal("r8fix bug"); + } + break; + case TYREAL: + S->atype = TYDREAL; + switch(S->rtype) { + case TYREAL: + S->rtype = TYDREAL; + if (S->spxname[0] != 'r') + Fatal("r8fix bug"); + S->spxname[0] = 'd'; + case TYDREAL: /* d_prod */ + break; + + case TYSHORT: + if (!strcmp(S->spxname, "hr_expn")) + S->spxname[1] = 'd'; + else if (!strcmp(S->spxname, "h_nint")) + strcpy(S->spxname, "h_dnnt"); + else Fatal("r8fix bug"); + break; + + case TYLONG: + if (!strcmp(S->spxname, "ir_expn")) + S->spxname[1] = 'd'; + else if (!strcmp(S->spxname, "i_nint")) + strcpy(S->spxname, "i_dnnt"); + else Fatal("r8fix bug"); + break; + + default: + Fatal("r8fix bug"); + } + } + } + +expptr intrcall(np, argsp, nargs) +Namep np; +struct Listblock *argsp; +int nargs; +{ + int i, rettype; + Addrp ap; + register struct Specblock *sp; + register struct Chain *cp; + expptr Inline(), mkcxcon(), mkrealcon(); + expptr q, ep; + int mtype; + int op; + int f1field, f2field, f3field; + + packed.ijunk = np->vardesc.varno; + f1field = packed.bits.f1; + f2field = packed.bits.f2; + f3field = packed.bits.f3; + if(nargs == 0) + goto badnargs; + + mtype = 0; + for(cp = argsp->listp ; cp ; cp = cp->nextp) + { + ep = (expptr)cp->datap; + if( ISCONST(ep) && ep->headblock.vtype==TYSHORT ) + cp->datap = (char *) mkconv(tyint, ep); + mtype = maxtype(mtype, ep->headblock.vtype); + } + + switch(f1field) + { + case INTRBOOL: + op = f3field; + if( ! ONEOF(mtype, MSKINT|MSKLOGICAL) ) + goto badtype; + if(op == OPBITNOT) + { + if(nargs != 1) + goto badnargs; + q = mkexpr(OPBITNOT, (expptr)argsp->listp->datap, ENULL); + } + else + { + if(nargs != 2) + goto badnargs; + q = mkexpr(op, (expptr)argsp->listp->datap, + (expptr)argsp->listp->nextp->datap); + } + frchain( &(argsp->listp) ); + free( (charptr) argsp); + return(q); + + case INTRCONV: + rettype = f2field; + if(rettype == TYLONG) + rettype = tyint; + if( ISCOMPLEX(rettype) && nargs==2) + { + expptr qr, qi; + qr = (expptr) argsp->listp->datap; + qi = (expptr) argsp->listp->nextp->datap; + if(ISCONST(qr) && ISCONST(qi)) + q = mkcxcon(qr,qi); + else q = mkexpr(OPCONV,mkconv(rettype-2,qr), + mkconv(rettype-2,qi)); + } + else if(nargs == 1) { + if (f3field && ((Exprp)argsp->listp->datap)->vtype + == TYDCOMPLEX) + rettype = TYDREAL; + q = mkconv(rettype, (expptr)argsp->listp->datap); + } + else goto badnargs; + + q->headblock.vtype = rettype; + frchain(&(argsp->listp)); + free( (charptr) argsp); + return(q); + + +#if 0 + case INTRCNST: + +/* Machine-dependent f77 stuff that f2c omits: + +intcon contains + radix for short int + radix for long int + radix for single precision + radix for double precision + precision for short int + precision for long int + precision for single precision + precision for double precision + emin for single precision + emin for double precision + emax for single precision + emax for double prcision + largest short int + largest long int + +realcon contains + tiny for single precision + tiny for double precision + huge for single precision + huge for double precision + mrsp (epsilon) for single precision + mrsp (epsilon) for double precision +*/ + { register struct Incstblock *cstp; + extern ftnint intcon[14]; + extern double realcon[6]; + + cstp = consttab + f3field; + for(i=0 ; iatype == mtype) + goto foundconst; + else + ++cstp; + goto badtype; + +foundconst: + switch(cstp->rtype) + { + case TYLONG: + return(mkintcon(intcon[cstp->constno])); + + case TYREAL: + case TYDREAL: + return(mkrealcon(cstp->rtype, + realcon[cstp->constno]) ); + + default: + Fatal("impossible intrinsic constant"); + } + } +#endif + + case INTRGEN: + sp = spectab + f3field; + if(no66flag) + if(sp->atype == mtype) + goto specfunct; + else err66("generic function"); + + for(i=0; iatype == mtype) + goto specfunct; + else + ++sp; + warn1 ("bad argument type to intrinsic %s", np->fvarname); + +/* Made this a warning rather than an error so things like "log (5) ==> + log (5.0)" can be accommodated. When none of these cases matches, the + argument is cast up to the first type in the spectab list; this first + type is assumed to be the "smallest" type, e.g. REAL before DREAL + before COMPLEX, before DCOMPLEX */ + + sp = spectab + f3field; + mtype = sp -> atype; + goto specfunct; + + case INTRSPEC: + sp = spectab + f3field; +specfunct: + if(tyint==TYLONG && ONEOF(sp->rtype,M(TYSHORT)|M(TYLOGICAL)) + && (sp+1)->atype==sp->atype) + ++sp; + + if(nargs != sp->nargs) + goto badnargs; + if(mtype != sp->atype) + goto badtype; + +/* NOTE!! I moved fixargs (YES) into the ELSE branch so that constants in + the inline expression wouldn't get put into the constant table */ + + fixargs (NO, argsp); + cast_args (mtype, argsp -> listp); + + if(q = Inline(sp-spectab, mtype, argsp->listp)) + { + frchain( &(argsp->listp) ); + free( (charptr) argsp); + } else { + + if(sp->othername) { + /* C library routines that return double... */ + /* sp->rtype might be TYREAL */ + ap = builtin(sp->rtype, + callbyvalue[sp->othername], 1); + q = fixexpr((Exprp) + mkexpr(OPCCALL, (expptr)ap, (expptr)argsp) ); + } else { + fixargs(YES, argsp); + ap = builtin(sp->rtype, sp->spxname, 0); + q = fixexpr((Exprp) + mkexpr(OPCALL, (expptr)ap, (expptr)argsp) ); + } /* else */ + } /* else */ + return(q); + + case INTRMIN: + case INTRMAX: + if(nargs < 2) + goto badnargs; + if( ! ONEOF(mtype, MSKINT|MSKREAL) ) + goto badtype; + argsp->vtype = mtype; + q = mkexpr( (f1field==INTRMIN ? OPMIN : OPMAX), (expptr)argsp, ENULL); + + q->headblock.vtype = mtype; + rettype = f2field; + if(rettype == TYLONG) + rettype = tyint; + else if(rettype == TYUNKNOWN) + rettype = mtype; + return( mkconv(rettype, q) ); + + default: + fatali("intrcall: bad intrgroup %d", f1field); + } +badnargs: + errstr("bad number of arguments to intrinsic %s", np->fvarname); + goto bad; + +badtype: + errstr("bad argument type to intrinsic %s", np->fvarname); + +bad: + return( errnode() ); +} + + + + +intrfunct(s) +char *s; +{ + register struct Intrblock *p; + + for(p = intrtab; p->intrval.intrgroup!=INTREND ; ++p) + { + if( !strcmp(s, p->intrfname) ) + { + packed.bits.f1 = p->intrval.intrgroup; + packed.bits.f2 = p->intrval.intrstuff; + packed.bits.f3 = p->intrval.intrno; + packed.bits.f4 = p->intrval.dblcmplx; + return(packed.ijunk); + } + } + + return(0); +} + + + + + +Addrp intraddr(np) +Namep np; +{ + Addrp q; + register struct Specblock *sp; + int f3field; + + if(np->vclass!=CLPROC || np->vprocclass!=PINTRINSIC) + fatalstr("intraddr: %s is not intrinsic", np->fvarname); + packed.ijunk = np->vardesc.varno; + f3field = packed.bits.f3; + + switch(packed.bits.f1) + { + case INTRGEN: + /* imag, log, and log10 arent specific functions */ + if(f3field==31 || f3field==43 || f3field==47) + goto bad; + + case INTRSPEC: + sp = spectab + f3field; + if(tyint==TYLONG && sp->rtype==TYSHORT) + ++sp; + q = builtin(sp->rtype, sp->spxname, + sp->othername ? 1 : 0); + return(q); + + case INTRCONV: + case INTRMIN: + case INTRMAX: + case INTRBOOL: + case INTRCNST: +bad: + errstr("cannot pass %s as actual", np->fvarname); + return((Addrp)errnode()); + } + fatali("intraddr: impossible f1=%d\n", (int) packed.bits.f1); + /* NOT REACHED */ return 0; +} + + + +void cast_args (maxtype, args) +int maxtype; +chainp args; +{ + for (; args; args = args -> nextp) { + expptr e = (expptr) args->datap; + if (e -> headblock.vtype != maxtype) + if (e -> tag == TCONST) + args->datap = (char *) mkconv(maxtype, e); + else { + Addrp temp = Mktemp(maxtype, ENULL); + + puteq(cpexpr((expptr)temp), e); + args->datap = (char *)temp; + } /* else */ + } /* for */ +} /* cast_args */ + + + +expptr Inline(fno, type, args) +int fno; +int type; +struct Chain *args; +{ + register expptr q, t, t1; + + switch(fno) + { + case 8: /* real abs */ + case 9: /* short int abs */ + case 10: /* long int abs */ + case 11: /* double precision abs */ + if( addressable(q = (expptr) args->datap) ) + { + t = q; + q = NULL; + } + else + t = (expptr) Mktemp(type,ENULL); + t1 = mkexpr(type == TYREAL && forcedouble ? OPDABS : OPABS, + cpexpr(t), ENULL); + if(q) + t1 = mkexpr(OPCOMMA, mkexpr(OPASSIGN, cpexpr(t),q), t1); + frexpr(t); + return(t1); + + case 26: /* dprod */ + q = mkexpr(OPSTAR, mkconv(TYDREAL,(expptr)args->datap), + (expptr)args->nextp->datap); + return(q); + + case 27: /* len of character string */ + q = (expptr) cpexpr(((tagptr)args->datap)->headblock.vleng); + frexpr((expptr)args->datap); + return(q); + + case 14: /* half-integer mod */ + case 15: /* mod */ + return mkexpr(OPMOD, (expptr) args->datap, + (expptr) args->nextp->datap); + } + return(NULL); +} diff --git a/sources/f2c/io.c b/sources/f2c/io.c new file mode 100644 index 0000000..cb14500 --- /dev/null +++ b/sources/f2c/io.c @@ -0,0 +1,1357 @@ +/**************************************************************** +Copyright 1990 by AT&T Bell Laboratories and Bellcore. + +Permission to use, copy, modify, and distribute this software +and its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the names of AT&T Bell Laboratories or +Bellcore or any of their entities not be used in advertising or +publicity pertaining to distribution of the software without +specific, written prior permission. + +AT&T and Bellcore disclaim all warranties with regard to this +software, including all implied warranties of merchantability +and fitness. In no event shall AT&T or Bellcore be liable for +any special, indirect or consequential damages or any damages +whatsoever resulting from loss of use, data or profits, whether +in an action of contract, negligence or other tortious action, +arising out of or in connection with the use or performance of +this software. +****************************************************************/ + +/* Routines to generate code for I/O statements. + Some corrections and improvements due to David Wasley, U. C. Berkeley +*/ + +/* TEMPORARY */ +#define TYIOINT TYLONG +#define SZIOINT SZLONG + +#include "defs.h" +#include "names.h" +#include "iob.h" + +extern int inqmask; + +LOCAL void dofclose(), dofinquire(), dofinquire(), dofmove(), dofopen(), + doiolist(), ioset(), ioseta(), iosetc(), iosetip(), iosetlc(), + putio(), putiocall(); + +iob_data *iob_list; +Addrp io_structs[9]; + +LOCAL char ioroutine[12]; + +LOCAL long ioendlab; +LOCAL long ioerrlab; +LOCAL int endbit; +LOCAL int errbit; +LOCAL long jumplab; +LOCAL long skiplab; +LOCAL int ioformatted; +LOCAL int statstruct = NO; +LOCAL struct Labelblock *skiplabel; +Addrp ioblkp; + +#define UNFORMATTED 0 +#define FORMATTED 1 +#define LISTDIRECTED 2 +#define NAMEDIRECTED 3 + +#define V(z) ioc[z].iocval + +#define IOALL 07777 + +LOCAL struct Ioclist +{ + char *iocname; + int iotype; + expptr iocval; +} +ioc[ ] = +{ + { "", 0 }, + { "unit", IOALL }, + { "fmt", M(IOREAD) | M(IOWRITE) }, + { "err", IOALL }, + { "end", M(IOREAD) }, + { "iostat", IOALL }, + { "rec", M(IOREAD) | M(IOWRITE) }, + { "recl", M(IOOPEN) | M(IOINQUIRE) }, + { "file", M(IOOPEN) | M(IOINQUIRE) }, + { "status", M(IOOPEN) | M(IOCLOSE) }, + { "access", M(IOOPEN) | M(IOINQUIRE) }, + { "form", M(IOOPEN) | M(IOINQUIRE) }, + { "blank", M(IOOPEN) | M(IOINQUIRE) }, + { "exist", M(IOINQUIRE) }, + { "opened", M(IOINQUIRE) }, + { "number", M(IOINQUIRE) }, + { "named", M(IOINQUIRE) }, + { "name", M(IOINQUIRE) }, + { "sequential", M(IOINQUIRE) }, + { "direct", M(IOINQUIRE) }, + { "formatted", M(IOINQUIRE) }, + { "unformatted", M(IOINQUIRE) }, + { "nextrec", M(IOINQUIRE) } +}; + +#define NIOS (sizeof(ioc)/sizeof(struct Ioclist) - 1) +#define MAXIO SZFLAG + 10*SZIOINT + 15*SZADDR + +/* #define IOSUNIT 1 */ +/* #define IOSFMT 2 */ +#define IOSERR 3 +#define IOSEND 4 +#define IOSIOSTAT 5 +#define IOSREC 6 +#define IOSRECL 7 +#define IOSFILE 8 +#define IOSSTATUS 9 +#define IOSACCESS 10 +#define IOSFORM 11 +#define IOSBLANK 12 +#define IOSEXISTS 13 +#define IOSOPENED 14 +#define IOSNUMBER 15 +#define IOSNAMED 16 +#define IOSNAME 17 +#define IOSSEQUENTIAL 18 +#define IOSDIRECT 19 +#define IOSFORMATTED 20 +#define IOSUNFORMATTED 21 +#define IOSNEXTREC 22 + +#define IOSTP V(IOSIOSTAT) + + +/* offsets in generated structures */ + +#define SZFLAG SZIOINT + +/* offsets for external READ and WRITE statements */ + +#define XERR 0 +#define XUNIT SZFLAG +#define XEND SZFLAG + SZIOINT +#define XFMT 2*SZFLAG + SZIOINT +#define XREC 2*SZFLAG + SZIOINT + SZADDR +#define XRLEN 2*SZFLAG + 2*SZADDR +#define XRNUM 2*SZFLAG + 2*SZADDR + SZIOINT + +/* offsets for internal READ and WRITE statements */ + +#define XIERR 0 +#define XIUNIT SZFLAG +#define XIEND SZFLAG + SZADDR +#define XIFMT 2*SZFLAG + SZADDR +#define XIRLEN 2*SZFLAG + 2*SZADDR +#define XIRNUM 2*SZFLAG + 2*SZADDR + SZIOINT +#define XIREC 2*SZFLAG + 2*SZADDR + 2*SZIOINT + +/* offsets for OPEN statements */ + +#define XFNAME SZFLAG + SZIOINT +#define XFNAMELEN SZFLAG + SZIOINT + SZADDR +#define XSTATUS SZFLAG + 2*SZIOINT + SZADDR +#define XACCESS SZFLAG + 2*SZIOINT + 2*SZADDR +#define XFORMATTED SZFLAG + 2*SZIOINT + 3*SZADDR +#define XRECLEN SZFLAG + 2*SZIOINT + 4*SZADDR +#define XBLANK SZFLAG + 3*SZIOINT + 4*SZADDR + +/* offset for CLOSE statement */ + +#define XCLSTATUS SZFLAG + SZIOINT + +/* offsets for INQUIRE statement */ + +#define XFILE SZFLAG + SZIOINT +#define XFILELEN SZFLAG + SZIOINT + SZADDR +#define XEXISTS SZFLAG + 2*SZIOINT + SZADDR +#define XOPEN SZFLAG + 2*SZIOINT + 2*SZADDR +#define XNUMBER SZFLAG + 2*SZIOINT + 3*SZADDR +#define XNAMED SZFLAG + 2*SZIOINT + 4*SZADDR +#define XNAME SZFLAG + 2*SZIOINT + 5*SZADDR +#define XNAMELEN SZFLAG + 2*SZIOINT + 6*SZADDR +#define XQACCESS SZFLAG + 3*SZIOINT + 6*SZADDR +#define XQACCLEN SZFLAG + 3*SZIOINT + 7*SZADDR +#define XSEQ SZFLAG + 4*SZIOINT + 7*SZADDR +#define XSEQLEN SZFLAG + 4*SZIOINT + 8*SZADDR +#define XDIRECT SZFLAG + 5*SZIOINT + 8*SZADDR +#define XDIRLEN SZFLAG + 5*SZIOINT + 9*SZADDR +#define XFORM SZFLAG + 6*SZIOINT + 9*SZADDR +#define XFORMLEN SZFLAG + 6*SZIOINT + 10*SZADDR +#define XFMTED SZFLAG + 7*SZIOINT + 10*SZADDR +#define XFMTEDLEN SZFLAG + 7*SZIOINT + 11*SZADDR +#define XUNFMT SZFLAG + 8*SZIOINT + 11*SZADDR +#define XUNFMTLEN SZFLAG + 8*SZIOINT + 12*SZADDR +#define XQRECL SZFLAG + 9*SZIOINT + 12*SZADDR +#define XNEXTREC SZFLAG + 9*SZIOINT + 13*SZADDR +#define XQBLANK SZFLAG + 9*SZIOINT + 14*SZADDR +#define XQBLANKLEN SZFLAG + 9*SZIOINT + 15*SZADDR + +LOCAL char *cilist_names[] = { + "cilist", + "cierr", + "ciunit", + "ciend", + "cifmt", + "cirec" + }; +LOCAL char *icilist_names[] = { + "icilist", + "icierr", + "iciunit", + "iciend", + "icifmt", + "icirlen", + "icirnum" + }; +LOCAL char *olist_names[] = { + "olist", + "oerr", + "ounit", + "ofnm", + "ofnmlen", + "osta", + "oacc", + "ofm", + "orl", + "oblnk" + }; +LOCAL char *cllist_names[] = { + "cllist", + "cerr", + "cunit", + "csta" + }; +LOCAL char *alist_names[] = { + "alist", + "aerr", + "aunit" + }; +LOCAL char *inlist_names[] = { + "inlist", + "inerr", + "inunit", + "infile", + "infilen", + "inex", + "inopen", + "innum", + "innamed", + "inname", + "innamlen", + "inacc", + "inacclen", + "inseq", + "inseqlen", + "indir", + "indirlen", + "infmt", + "infmtlen", + "inform", + "informlen", + "inunf", + "inunflen", + "inrecl", + "innrec", + "inblank", + "inblanklen" + }; + +LOCAL char **io_fields; + +#define zork(n,t) n, sizeof(n)/sizeof(char *) - 1, t + +LOCAL io_setup io_stuff[] = { + zork(cilist_names, TYCILIST), /* external read/write */ + zork(inlist_names, TYINLIST), /* inquire */ + zork(olist_names, TYOLIST), /* open */ + zork(cllist_names, TYCLLIST), /* close */ + zork(alist_names, TYALIST), /* rewind */ + zork(alist_names, TYALIST), /* backspace */ + zork(alist_names, TYALIST), /* endfile */ + zork(icilist_names,TYICILIST), /* internal read */ + zork(icilist_names,TYICILIST) /* internal write */ + }; + +#undef zork + + +fmtstmt(lp) +register struct Labelblock *lp; +{ + if(lp == NULL) + { + execerr("unlabeled format statement" , CNULL); + return(-1); + } + if(lp->labtype == LABUNKNOWN) + { + lp->labtype = LABFORMAT; + lp->labelno = newlabel(); + } + else if(lp->labtype != LABFORMAT) + { + execerr("bad format number", CNULL); + return(-1); + } + return(lp->labelno); +} + + +setfmt(lp) +struct Labelblock *lp; +{ + int n; + char *s0, *lexline(); + register char *s, *se, *t; + register k; + + s0 = s = lexline(&n); + se = t = s + n; + + /* warn of trivial errors, e.g. " 11 CONTINUE" (one too few spaces) */ + /* following FORMAT... */ + + if (n <= 0) + warn("No (...) after FORMAT"); + else if (*s != '(') + warni("%c rather than ( after FORMAT", *s); + else if (se[-1] != ')') { + *se = 0; + while(--t > s && *t != ')') ; + if (t <= s) + warn("No ) at end of FORMAT statement"); + else if (se - t > 30) + warn1("Extraneous text at end of FORMAT: ...%s", se-12); + else + warn1("Extraneous text at end of FORMAT: %s", t+1); + t = se; + } + + /* fix MYQUOTES (\002's) and \\'s */ + + while(s < se) + switch(*s++) { + case 2: + t += 3; break; + case '"': + case '\\': + t++; break; + } + s = s0; + lp->fmtstring = t = mem(t - s + 1, 0); + while(s < se) + switch(k = *s++) { + case 2: + t[0] = '\\'; + t[1] = '0'; + t[2] = '0'; + t[3] = '2'; + t += 4; + break; + case '"': + case '\\': + *t++ = '\\'; + /* no break */ + default: + *t++ = k; + } + *t = 0; + flline(); +} + + + +startioctl() +{ + register int i; + + inioctl = YES; + nioctl = 0; + ioformatted = UNFORMATTED; + for(i = 1 ; i<=NIOS ; ++i) + V(i) = NULL; +} + + static long +newiolabel() { + long rv; + rv = ++lastiolabno; + skiplabel = mklabel(rv); + skiplabel->labdefined = 1; + return rv; + } + + +endioctl() +{ + int i; + expptr p; + struct io_setup *ios; + + inioctl = NO; + + /* set up for error recovery */ + + ioerrlab = ioendlab = skiplab = jumplab = 0; + + if(p = V(IOSEND)) + if(ISICON(p)) + execlab(ioendlab = p->constblock.Const.ci); + else + err("bad end= clause"); + + if(p = V(IOSERR)) + if(ISICON(p)) + execlab(ioerrlab = p->constblock.Const.ci); + else + err("bad err= clause"); + + if(IOSTP) + if(IOSTP->tag!=TADDR || ! ISINT(IOSTP->addrblock.vtype) ) + { + err("iostat must be an integer variable"); + frexpr(IOSTP); + IOSTP = NULL; + } + + if(iostmt == IOREAD) + { + if(IOSTP) + { + if(ioerrlab && ioendlab && ioerrlab==ioendlab) + jumplab = ioerrlab; + else + skiplab = jumplab = newiolabel(); + } + else { + if(ioerrlab && ioendlab && ioerrlab!=ioendlab) + { + IOSTP = (expptr) Mktemp(TYINT, ENULL); + skiplab = jumplab = newiolabel(); + } + else + jumplab = (ioerrlab ? ioerrlab : ioendlab); + } + } + else if(iostmt == IOWRITE) + { + if(IOSTP && !ioerrlab) + skiplab = jumplab = newiolabel(); + else + jumplab = ioerrlab; + } + else + jumplab = ioerrlab; + + endbit = IOSTP!=NULL || ioendlab!=0; /* for use in startrw() */ + errbit = IOSTP!=NULL || ioerrlab!=0; + if (jumplab && !IOSTP) + IOSTP = (expptr) Mktemp(TYINT, ENULL); + + if(iostmt!=IOREAD && iostmt!=IOWRITE) + { + ios = io_stuff + iostmt; + io_fields = ios->fields; + ioblkp = io_structs[iostmt]; + if(ioblkp == NULL) + io_structs[iostmt] = ioblkp = + autovar(1, ios->type, ENULL, ""); + ioset(TYIOINT, XERR, ICON(errbit)); + } + + switch(iostmt) + { + case IOOPEN: + dofopen(); + break; + + case IOCLOSE: + dofclose(); + break; + + case IOINQUIRE: + dofinquire(); + break; + + case IOBACKSPACE: + dofmove("f_back"); + break; + + case IOREWIND: + dofmove("f_rew"); + break; + + case IOENDFILE: + dofmove("f_end"); + break; + + case IOREAD: + case IOWRITE: + startrw(); + break; + + default: + fatali("impossible iostmt %d", iostmt); + } + for(i = 1 ; i<=NIOS ; ++i) + if(i!=IOSIOSTAT && V(i)!=NULL) + frexpr(V(i)); +} + + + +iocname() +{ + register int i; + int found, mask; + + found = 0; + mask = M(iostmt); + for(i = 1 ; i <= NIOS ; ++i) + if(toklen==strlen(ioc[i].iocname) && eqn(toklen, token, ioc[i].iocname)) + if(ioc[i].iotype & mask) + return(i); + else found = i; + if(found) + errstr("invalid control %s for statement", ioc[found].iocname); + else + errstr("unknown iocontrol %s", token); + return(IOSBAD); +} + + +ioclause(n, p) +register int n; +register expptr p; +{ + struct Ioclist *iocp; + + ++nioctl; + if(n == IOSBAD) + return; + if(n == IOSPOSITIONAL) + { + n = nioctl; + if (nioctl == IOSFMT) { + if (iostmt == IOOPEN) { + n = IOSFILE; + NOEXT("file= specifier omitted from open"); + } + else if (iostmt < IOREAD) + goto illegal; + } + else if(nioctl > IOSFMT) + { + illegal: + err("illegal positional iocontrol"); + return; + } + } + + if(p == NULL) + { + if(n == IOSUNIT) + p = (expptr) (iostmt==IOREAD ? IOSTDIN : IOSTDOUT); + else if(n != IOSFMT) + { + err("illegal * iocontrol"); + return; + } + } + if(n == IOSFMT) + ioformatted = (p==NULL ? LISTDIRECTED : FORMATTED); + + iocp = & ioc[n]; + if(iocp->iocval == NULL) + { + if(n!=IOSFMT && ( n!=IOSUNIT || (p!=NULL && p->headblock.vtype!=TYCHAR) ) ) + p = fixtype(p); + iocp->iocval = p; + } + else + errstr("iocontrol %s repeated", iocp->iocname); +} + +/* io list item */ + +doio(list) +chainp list; +{ + expptr call0(); + + if(ioformatted == NAMEDIRECTED) + { + if(list) + err("no I/O list allowed in NAMELIST read/write"); + } + else + { + doiolist(list); + ioroutine[0] = 'e'; + jumplab = 0; + putiocall( call0(TYINT, ioroutine) ); + } +} + + + + + + LOCAL void +doiolist(p0) + chainp p0; +{ + chainp p; + register tagptr q; + register expptr qe; + register Namep qn; + Addrp tp, mkscalar(); + int range; + + for (p = p0 ; p ; p = p->nextp) + { + q = (tagptr)p->datap; + if(q->tag == TIMPLDO) + { + exdo(range=newlabel(), (Namep)0, + q->impldoblock.impdospec); + doiolist(q->impldoblock.datalist); + enddo(range); + free( (charptr) q); + } + else { + if(q->tag==TPRIM && q->primblock.argsp==NULL + && q->primblock.namep->vdim!=NULL) + { + vardcl(qn = q->primblock.namep); + if(qn->vdim->nelt) { + putio( fixtype(cpexpr(qn->vdim->nelt)), + (expptr)mkscalar(qn) ); + qn->vlastdim = 0; + } + else + err("attempt to i/o array of unknown size"); + } + else if(q->tag==TPRIM && q->primblock.argsp==NULL && + (qe = (expptr) memversion(q->primblock.namep)) ) + putio(ICON(1),qe); + else if(((qe = fixtype(cpexpr(q)))->tag==TADDR && + (qe->addrblock.uname_tag != UNAM_CONST || + !ISCOMPLEX(qe -> addrblock.vtype))) || + (qe -> tag == TCONST && !ISCOMPLEX(qe -> + headblock.vtype))) { + if (qe -> tag == TCONST) + qe = (expptr) putconst((Constp)qe); + putio(ICON(1), qe); + } + else if(qe->headblock.vtype != TYERROR) + { + if(iostmt == IOWRITE) + { + ftnint lencat(); + expptr qvl; + qvl = NULL; + if( ISCHAR(qe) ) + { + qvl = (expptr) + cpexpr(qe->headblock.vleng); + tp = Mktemp(qe->headblock.vtype, + ICON(lencat(qe))); + } + else + tp = Mktemp(qe->headblock.vtype, + qe->headblock.vleng); + puteq( cpexpr((expptr)tp), qe); + if(qvl) /* put right length on block */ + { + frexpr(tp->vleng); + tp->vleng = qvl; + } + putio(ICON(1), (expptr)tp); + } + else + err("non-left side in READ list"); + } + frexpr(q); + } + } + frchain( &p0 ); +} + + int iocalladdr = TYADDR; /* for fixing TYADDR in saveargtypes */ + + LOCAL void +putio(nelt, addr) + expptr nelt; + register expptr addr; +{ + int type; + register expptr q; + extern Constp mkconst(); + register Addrp c = 0; + + type = addr->headblock.vtype; + if(ioformatted!=LISTDIRECTED && ISCOMPLEX(type) ) + { + nelt = mkexpr(OPSTAR, ICON(2), nelt); + type -= (TYCOMPLEX-TYREAL); + } + + /* pass a length with every item. for noncharacter data, fake one */ + if(type != TYCHAR) + { + + if( ISCONST(addr) ) + addr = (expptr) putconst((Constp)addr); + c = ALLOC(Addrblock); + c->tag = TADDR; + c->vtype = TYLENG; + c->vstg = STGAUTO; + c->ntempelt = 1; + c->isarray = 1; + c->memoffset = ICON(0); + c->uname_tag = UNAM_IDENT; + c->charleng = 1; + sprintf(c->user.ident, "(ftnlen)sizeof(%s)", typename[type]); + addr = mkexpr(OPCHARCAST, addr, ENULL); + } + + nelt = fixtype( mkconv(TYLENG,nelt) ); + if(ioformatted == LISTDIRECTED) { + expptr mc = mkconv(TYLONG, ICON(type)); + q = c ? call4(TYINT, "do_lio", mc, nelt, addr, (expptr)c) + : call3(TYINT, "do_lio", mc, nelt, addr); + } + else { + char *s = ioformatted==FORMATTED ? "do_fio" : "do_uio"; + q = c ? call3(TYINT, s, nelt, addr, (expptr)c) + : call2(TYINT, s, nelt, addr); + } + iocalladdr = TYCHAR; + putiocall(q); + iocalladdr = TYADDR; +} + + + + +endio() +{ + extern void p1_label(); + + if(skiplab) + { + p1_label((long)(skiplabel - labeltab)); + if(ioendlab) { + exif( mkexpr(OPLT, cpexpr(IOSTP), ICON(0))); + exgoto(execlab(ioendlab)); + exendif(); + } + if(ioerrlab) { + exif( mkexpr(iostmt==IOREAD||iostmt==IOWRITE + ? OPGT : OPNE, + cpexpr(IOSTP), ICON(0))); + exgoto(execlab(ioerrlab)); + exendif(); + } + } + + if(IOSTP) + frexpr(IOSTP); +} + + + + LOCAL void +putiocall(q) + register expptr q; +{ + int tyintsave; + + tyintsave = tyint; + tyint = tyioint; /* for -I2 and -i2 */ + + if(IOSTP) + { + q->headblock.vtype = TYINT; + q = fixexpr((Exprp)mkexpr(OPASSIGN, cpexpr(IOSTP), q)); + } + putexpr(q); + if(jumplab) { + exif(mkexpr(OPNE, cpexpr(IOSTP), ICON(0))); + exgoto(execlab(jumplab)); + exendif(); + } + tyint = tyintsave; +} + + void +fmtname(np, q) + Namep np; + register Addrp q; +{ + register int k; + register char *s, *t; + extern chainp assigned_fmts; + + if (!np->vfmt_asg) { + np->vfmt_asg = 1; + assigned_fmts = mkchain((char *)np, assigned_fmts); + } + k = strlen(s = np->fvarname); + if (k < IDENT_LEN - 4) { + q->uname_tag = UNAM_IDENT; + t = q->user.ident; + } + else { + q->uname_tag = UNAM_CHARP; + q->user.Charp = t = mem(k + 5,0); + } + sprintf(t, "%s_fmt", s); + } + +LOCAL Addrp asg_addr(p) + union Expression *p; +{ + register Addrp q; + + if (p->tag != TPRIM) + badtag("asg_addr", p->tag); + q = ALLOC(Addrblock); + q->tag = TADDR; + q->vtype = TYCHAR; + q->vstg = STGAUTO; + q->ntempelt = 1; + q->isarray = 0; + q->memoffset = ICON(0); + fmtname(p->primblock.namep, q); + return q; + } + +startrw() +{ + register expptr p; + register Namep np; + register Addrp unitp, fmtp, recp; + register expptr nump; + Addrp mkscalar(); + expptr mkaddcon(); + int iostmt1; + flag intfile, sequential, ok, varfmt; + struct io_setup *ios; + + /* First look at all the parameters and determine what is to be done */ + + ok = YES; + statstruct = YES; + + intfile = NO; + if(p = V(IOSUNIT)) + { + if( ISINT(p->headblock.vtype) ) + unitp = (Addrp) cpexpr(p); + else if(p->headblock.vtype == TYCHAR) + { + intfile = YES; + if(p->tag==TPRIM && p->primblock.argsp==NULL && + (np = p->primblock.namep)->vdim!=NULL) + { + vardcl(np); + if(np->vdim->nelt) + { + nump = (expptr) cpexpr(np->vdim->nelt); + if( ! ISCONST(nump) ) + statstruct = NO; + } + else + { + err("attempt to use internal unit array of unknown size"); + ok = NO; + nump = ICON(1); + } + unitp = mkscalar(np); + } + else { + nump = ICON(1); + unitp = (Addrp /*pjw */) fixtype(cpexpr(p)); + } + if(! isstatic((expptr)unitp) ) + statstruct = NO; + } + } + else + { + err("bad unit specifier"); + ok = NO; + } + + sequential = YES; + if(p = V(IOSREC)) + if( ISINT(p->headblock.vtype) ) + { + recp = (Addrp) cpexpr(p); + sequential = NO; + } + else { + err("bad REC= clause"); + ok = NO; + } + else + recp = NULL; + + + varfmt = YES; + fmtp = NULL; + if(p = V(IOSFMT)) + { + if(p->tag==TPRIM && p->primblock.argsp==NULL) + { + np = p->primblock.namep; + if(np->vclass == CLNAMELIST) + { + ioformatted = NAMEDIRECTED; + fmtp = (Addrp) fixtype(p); + V(IOSFMT) = (expptr)fmtp; + goto endfmt; + } + vardcl(np); + if(np->vdim) + { + if( ! ONEOF(np->vstg, MSKSTATIC) ) + statstruct = NO; + fmtp = mkscalar(np); + goto endfmt; + } + if( ISINT(np->vtype) ) /* ASSIGNed label */ + { + statstruct = NO; + varfmt = YES; + fmtp = asg_addr(p); + goto endfmt; + } + } + p = V(IOSFMT) = fixtype(p); + if(p->headblock.vtype == TYCHAR + /* Since we allow write(6,n) */ + /* we may as well allow write(6,n(2)) */ + || p->tag == TADDR && ISINT(p->addrblock.vtype)) + { + if( ! isstatic(p) ) + statstruct = NO; + fmtp = (Addrp) cpexpr(p); + } + else if( ISICON(p) ) + { + struct Labelblock *lp; + lp = mklabel(p->constblock.Const.ci); + if (fmtstmt(lp) > 0) + { + fmtp = (Addrp)mkaddcon(lp->stateno); + /* lp->stateno for names fmt_nnn */ + lp->fmtlabused = 1; + varfmt = NO; + } + else + ioformatted = UNFORMATTED; + } + else { + err("bad format descriptor"); + ioformatted = UNFORMATTED; + ok = NO; + } + } + else + fmtp = NULL; + +endfmt: + if(intfile) { + if (ioformatted==UNFORMATTED) { + err("unformatted internal I/O not allowed"); + ok = NO; + } + if (recp) { + err("direct internal I/O not allowed"); + ok = NO; + } + } + if(!sequential && ioformatted==LISTDIRECTED) + { + err("direct list-directed I/O not allowed"); + ok = NO; + } + if(!sequential && ioformatted==NAMEDIRECTED) + { + err("direct namelist I/O not allowed"); + ok = NO; + } + + if( ! ok ) + return; + + /* + Now put out the I/O structure, statically if all the clauses + are constants, dynamically otherwise +*/ + + if (intfile) { + ios = io_stuff + iostmt; + iostmt1 = IOREAD; + } + else { + ios = io_stuff; + iostmt1 = 0; + } + io_fields = ios->fields; + if(statstruct) + { + ioblkp = ALLOC(Addrblock); + ioblkp->tag = TADDR; + ioblkp->vtype = ios->type; + ioblkp->vclass = CLVAR; + ioblkp->vstg = STGINIT; + ioblkp->memno = ++lastvarno; + ioblkp->memoffset = ICON(0); + ioblkp -> uname_tag = UNAM_IDENT; + new_iob_data(ios, + temp_name("io_", lastvarno, ioblkp->user.ident)); } + else if(!(ioblkp = io_structs[iostmt1])) + io_structs[iostmt1] = ioblkp = + autovar(1, ios->type, ENULL, ""); + + ioset(TYIOINT, XERR, ICON(errbit)); + if(iostmt == IOREAD) + ioset(TYIOINT, (intfile ? XIEND : XEND), ICON(endbit) ); + + if(intfile) + { + ioset(TYIOINT, XIRNUM, nump); + ioset(TYIOINT, XIRLEN, cpexpr(unitp->vleng) ); + ioseta(XIUNIT, unitp); + } + else + ioset(TYIOINT, XUNIT, (expptr) unitp); + + if(recp) + ioset(TYIOINT, /* intfile ? XIREC : */ XREC, (expptr) recp); + + if(varfmt) + ioseta( intfile ? XIFMT : XFMT , fmtp); + else + ioset(TYADDR, intfile ? XIFMT : XFMT, (expptr) fmtp); + + ioroutine[0] = 's'; + ioroutine[1] = '_'; + ioroutine[2] = iostmt==IOREAD ? 'r' : 'w'; + ioroutine[3] = "ds"[sequential]; + ioroutine[4] = "ufln"[ioformatted]; + ioroutine[5] = "ei"[intfile]; + ioroutine[6] = '\0'; + + putiocall( call1(TYINT, ioroutine, cpexpr((expptr)ioblkp) )); + + if(statstruct) + { + frexpr((expptr)ioblkp); + statstruct = NO; + ioblkp = 0; /* unnecessary */ + } +} + + + + LOCAL void +dofopen() +{ + register expptr p; + + if( (p = V(IOSUNIT)) && ISINT(p->headblock.vtype) ) + ioset(TYIOINT, XUNIT, cpexpr(p) ); + else + err("bad unit in open"); + if( (p = V(IOSFILE)) ) + if(p->headblock.vtype == TYCHAR) + ioset(TYIOINT, XFNAMELEN, cpexpr(p->headblock.vleng) ); + else + err("bad file in open"); + + iosetc(XFNAME, p); + + if(p = V(IOSRECL)) + if( ISINT(p->headblock.vtype) ) + ioset(TYIOINT, XRECLEN, cpexpr(p) ); + else + err("bad recl"); + else + ioset(TYIOINT, XRECLEN, ICON(0) ); + + iosetc(XSTATUS, V(IOSSTATUS)); + iosetc(XACCESS, V(IOSACCESS)); + iosetc(XFORMATTED, V(IOSFORM)); + iosetc(XBLANK, V(IOSBLANK)); + + putiocall( call1(TYINT, "f_open", cpexpr((expptr)ioblkp) )); +} + + + LOCAL void +dofclose() +{ + register expptr p; + + if( (p = V(IOSUNIT)) && ISINT(p->headblock.vtype) ) + { + ioset(TYIOINT, XUNIT, cpexpr(p) ); + iosetc(XCLSTATUS, V(IOSSTATUS)); + putiocall( call1(TYINT, "f_clos", cpexpr((expptr)ioblkp)) ); + } + else + err("bad unit in close statement"); +} + + + LOCAL void +dofinquire() +{ + register expptr p; + if(p = V(IOSUNIT)) + { + if( V(IOSFILE) ) + err("inquire by unit or by file, not both"); + ioset(TYIOINT, XUNIT, cpexpr(p) ); + } + else if( ! V(IOSFILE) ) + err("must inquire by unit or by file"); + iosetlc(IOSFILE, XFILE, XFILELEN); + iosetip(IOSEXISTS, XEXISTS); + iosetip(IOSOPENED, XOPEN); + iosetip(IOSNUMBER, XNUMBER); + iosetip(IOSNAMED, XNAMED); + iosetlc(IOSNAME, XNAME, XNAMELEN); + iosetlc(IOSACCESS, XQACCESS, XQACCLEN); + iosetlc(IOSSEQUENTIAL, XSEQ, XSEQLEN); + iosetlc(IOSDIRECT, XDIRECT, XDIRLEN); + iosetlc(IOSFORM, XFORM, XFORMLEN); + iosetlc(IOSFORMATTED, XFMTED, XFMTEDLEN); + iosetlc(IOSUNFORMATTED, XUNFMT, XUNFMTLEN); + iosetip(IOSRECL, XQRECL); + iosetip(IOSNEXTREC, XNEXTREC); + iosetlc(IOSBLANK, XQBLANK, XQBLANKLEN); + + putiocall( call1(TYINT, "f_inqu", cpexpr((expptr)ioblkp) )); +} + + + + LOCAL void +dofmove(subname) + char *subname; +{ + register expptr p; + + if( (p = V(IOSUNIT)) && ISINT(p->headblock.vtype) ) + { + ioset(TYIOINT, XUNIT, cpexpr(p) ); + putiocall( call1(TYINT, subname, cpexpr((expptr)ioblkp) )); + } + else + err("bad unit in I/O motion statement"); +} + +static int ioset_assign = OPASSIGN; + + LOCAL void +ioset(type, offset, p) + int type, offset; + register expptr p; +{ + offset /= SZLONG; + if(statstruct && ISCONST(p)) { + register char *s; + switch(type) { + case TYADDR: /* stmt label */ + s = "fmt_"; + break; + case TYIOINT: + s = ""; + break; + default: + badtype("ioset", type); + } + iob_list->fields[offset] = + string_num(s, p->constblock.Const.ci); + frexpr(p); + } + else { + register Addrp q; + + q = ALLOC(Addrblock); + q->tag = TADDR; + q->vtype = type; + q->vstg = STGAUTO; + q->ntempelt = 1; + q->isarray = 0; + q->memoffset = ICON(0); + q->uname_tag = UNAM_IDENT; + sprintf(q->user.ident, "%s.%s", + statstruct ? iob_list->name : ioblkp->user.ident, + io_fields[offset + 1]); + if (type == TYADDR && p->tag == TCONST + && p->constblock.vtype == TYADDR) { + /* kludge */ + register Addrp p1; + p1 = ALLOC(Addrblock); + p1->tag = TADDR; + p1->vtype = type; + p1->vstg = STGAUTO; /* wrong, but who cares? */ + p1->ntempelt = 1; + p1->isarray = 0; + p1->memoffset = ICON(0); + p1->uname_tag = UNAM_IDENT; + sprintf(p1->user.ident, "fmt_%ld", + p->constblock.Const.ci); + frexpr(p); + p = (expptr)p1; + } + if (type == TYADDR && p->headblock.vtype == TYCHAR) + q->vtype = TYCHAR; + putexpr(mkexpr(ioset_assign, (expptr)q, p)); + } +} + + + + + LOCAL void +iosetc(offset, p) + int offset; + register expptr p; +{ + if(p == NULL) + ioset(TYADDR, offset, ICON(0) ); + else if(p->headblock.vtype == TYCHAR) + ioset(TYADDR, offset, addrof(cpexpr(p) )); + else + err("non-character control clause"); +} + + + + LOCAL void +ioseta(offset, p) + int offset; + register Addrp p; +{ + char *s, *s1; + static char who[] = "ioseta"; + expptr e, mo; + Namep np; + ftnint ci; + int k; + char buf[24], buf1[24]; + Extsym *comm; + + if(statstruct) + { + if (!p) + return; + if (p->tag != TADDR) + badtag(who, p->tag); + offset /= SZLONG; + switch(p->uname_tag) { + case UNAM_NAME: + mo = p->memoffset; + if (mo->tag != TCONST) + badtag("ioseta/memoffset", mo->tag); + np = p->user.name; + np->visused = 1; + ci = mo->constblock.Const.ci - np->voffset; + if (np->vstg == STGCOMMON && !np->vcommequiv) { + comm = &extsymtab[np->vardesc.varno]; + sprintf(buf, "%d.", comm->curno); + k = strlen(buf) + strlen(comm->cextname) + + strlen(np->cvarname); + if (ci) { + sprintf(buf1, "+%ld", ci); + k += strlen(buf1); + } + else + buf1[0] = 0; + s = mem(k + 1, 0); + sprintf(s, "%s%s%s%s", comm->cextname, buf, + np->cvarname, buf1); + } + else if (ci) { + sprintf(buf,"%ld", ci); + s1 = p->user.name->cvarname; + k = strlen(buf) + strlen(s1); + sprintf(s = mem(k+2,0), "%s+%s", s1, buf); + } + else + s = cpstring(p->user.name->cvarname); + break; + case UNAM_CONST: + s = tostring(p->user.Const.ccp1.ccp0, + (int)p->vleng->constblock.Const.ci); + break; + default: + badthing("uname_tag", who, p->uname_tag); + } + /* kludge for Hollerith */ + if (p->vtype != TYCHAR) { + s1 = mem(strlen(s)+10,0); + sprintf(s1, "(char *)%s%s", p->isarray ? "" : "&", s); + s = s1; + } + iob_list->fields[offset] = s; + } + else { + if (!p) + e = ICON(0); + else if (p->vtype != TYCHAR) { + NOEXT("non-character variable as format or internal unit"); + e = mkexpr(OPCHARCAST, (expptr)p, ENULL); + } + else + e = addrof((expptr)p); + ioset(TYADDR, offset, e); + } +} + + + + + LOCAL void +iosetip(i, offset) + int i, offset; +{ + register expptr p; + + if(p = V(i)) + if(p->tag==TADDR && + ONEOF(p->addrblock.vtype, inqmask) ) { + ioset_assign = OPASSIGNI; + ioset(TYADDR, offset, addrof(cpexpr(p)) ); + ioset_assign = OPASSIGN; + } + else + errstr("impossible inquire parameter %s", ioc[i].iocname); + else + ioset(TYADDR, offset, ICON(0) ); +} + + + + LOCAL void +iosetlc(i, offp, offl) + int i, offp, offl; +{ + register expptr p; + if( (p = V(i)) && p->headblock.vtype==TYCHAR) + ioset(TYIOINT, offl, cpexpr(p->headblock.vleng) ); + iosetc(offp, p); +} diff --git a/sources/f2c/iob.h b/sources/f2c/iob.h new file mode 100644 index 0000000..9f2269b --- /dev/null +++ b/sources/f2c/iob.h @@ -0,0 +1,24 @@ +struct iob_data { + struct iob_data *next; + char *type; + char *name; + char *fields[1]; + }; +struct io_setup { + char **fields; + int nelt, type; + }; + +struct defines { + struct defines *next; + char defname[1]; + }; + +typedef struct iob_data iob_data; +typedef struct io_setup io_setup; +typedef struct defines defines; + +extern iob_data *iob_list; +extern struct Addrblock *io_structs[9]; +extern void def_start(), new_iob_data(), other_undefs(); +extern char *tostring(); diff --git a/sources/f2c/lex.c b/sources/f2c/lex.c new file mode 100644 index 0000000..387cbe6 --- /dev/null +++ b/sources/f2c/lex.c @@ -0,0 +1,1456 @@ +/**************************************************************** +Copyright 1990 by AT&T Bell Laboratories and Bellcore. + +Permission to use, copy, modify, and distribute this software +and its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the names of AT&T Bell Laboratories or +Bellcore or any of their entities not be used in advertising or +publicity pertaining to distribution of the software without +specific, written prior permission. + +AT&T and Bellcore disclaim all warranties with regard to this +software, including all implied warranties of merchantability +and fitness. In no event shall AT&T or Bellcore be liable for +any special, indirect or consequential damages or any damages +whatsoever resulting from loss of use, data or profits, whether +in an action of contract, negligence or other tortious action, +arising out of or in connection with the use or performance of +this software. +****************************************************************/ + +#include "defs.h" +#include "tokdefs.h" +#include "p1defs.h" + +# define BLANK ' ' +# define MYQUOTE (2) +# define SEOF 0 + +/* card types */ + +# define STEOF 1 +# define STINITIAL 2 +# define STCONTINUE 3 + +/* lex states */ + +#define NEWSTMT 1 +#define FIRSTTOKEN 2 +#define OTHERTOKEN 3 +#define RETEOS 4 + + +LOCAL int stkey; /* Type of the current statement (DO, END, IF, etc) */ +extern char token[]; /* holds the actual token text */ +static int needwkey; +ftnint yystno; +flag intonly; +extern int new_dcl; +LOCAL long int stno; +LOCAL long int nxtstno; /* Statement label */ +LOCAL int parlev; /* Parentheses level */ +LOCAL int parseen; +LOCAL int expcom; +LOCAL int expeql; +LOCAL char *nextch; +LOCAL char *lastch; +LOCAL char *nextcd = NULL; +LOCAL char *endcd; +LOCAL long prevlin; +LOCAL long thislin; +LOCAL int code; /* Card type; INITIAL, CONTINUE or EOF */ +LOCAL int lexstate = NEWSTMT; +LOCAL char sbuf[1390]; /* Main buffer for Fortran source input. The number + comes from lines of at most 66 characters, with at + most 20 continuation cards (or something); this is + part of the defn of the standard */ +LOCAL char *send = sbuf+20*66; +LOCAL int nincl = 0; /* Current number of include files */ +LOCAL long firstline; +LOCAL char *laststb, *stb0; +extern int addftnsrc; +#define CONTMAX 100 /* max continuation lines for ! processing */ +char *linestart[CONTMAX]; +LOCAL int ncont; +LOCAL char comstart[256]; +#define USC (unsigned char *) + +static char anum_buf[256]; +#define isalnum_(x) anum_buf[x] +#define isalpha_(x) (anum_buf[x] == 1) + +#define COMMENT_BUF_STORE 4088 + +typedef struct comment_buf { + struct comment_buf *next; + char *last; + char buf[COMMENT_BUF_STORE]; + } comment_buf; +static comment_buf *cbfirst, *cbcur; +static char *cbinit, *cbnext, *cblast; +static void flush_comments(); + + +/* Comment buffering data + + Comments are kept in a list until the statement before them has + been parsed. This list is implemented with the above comment_buf + structure and the pointers cbnext and cblast. + + The comments are stored with terminating NULL, and no other + intervening space. The last few bytes of each block are likely to + remain unused. +*/ + +/* struct Inclfile holds the state information for each include file */ +struct Inclfile +{ + struct Inclfile *inclnext; + FILEP inclfp; + char *inclname; + int incllno; + char *incllinp; + int incllen; + int inclcode; + ftnint inclstno; +}; + +LOCAL struct Inclfile *inclp = NULL; +LOCAL struct Keylist { + char *keyname; + int keyval; + char notinf66; +}; +LOCAL struct Punctlist { + char punchar; + int punval; +}; +LOCAL struct Fmtlist { + char fmtchar; + int fmtval; +}; +struct Dotlist { + char *dotname; + int dotval; + }; +LOCAL struct Keylist *keystart[26], *keyend[26]; + +/* KEYWORD AND SPECIAL CHARACTER TABLES +*/ + +static struct Punctlist puncts[ ] = +{ + '(', SLPAR, + ')', SRPAR, + '=', SEQUALS, + ',', SCOMMA, + '+', SPLUS, + '-', SMINUS, + '*', SSTAR, + '/', SSLASH, + '$', SCURRENCY, + ':', SCOLON, + '<', SLT, + '>', SGT, + 0, 0 }; + +LOCAL struct Dotlist dots[ ] = +{ + "and.", SAND, + "or.", SOR, + "not.", SNOT, + "true.", STRUE, + "false.", SFALSE, + "eq.", SEQ, + "ne.", SNE, + "lt.", SLT, + "le.", SLE, + "gt.", SGT, + "ge.", SGE, + "neqv.", SNEQV, + "eqv.", SEQV, + 0, 0 }; + +LOCAL struct Keylist keys[ ] = +{ + { "assign", SASSIGN }, + { "automatic", SAUTOMATIC, YES }, + { "backspace", SBACKSPACE }, + { "blockdata", SBLOCK }, + { "call", SCALL }, + { "character", SCHARACTER, YES }, + { "close", SCLOSE, YES }, + { "common", SCOMMON }, + { "complex", SCOMPLEX }, + { "continue", SCONTINUE }, + { "data", SDATA }, + { "dimension", SDIMENSION }, + { "doubleprecision", SDOUBLE }, + { "doublecomplex", SDCOMPLEX, YES }, + { "elseif", SELSEIF, YES }, + { "else", SELSE, YES }, + { "endfile", SENDFILE }, + { "endif", SENDIF, YES }, + { "enddo", SENDDO, YES }, + { "end", SEND }, + { "entry", SENTRY, YES }, + { "equivalence", SEQUIV }, + { "external", SEXTERNAL }, + { "format", SFORMAT }, + { "function", SFUNCTION }, + { "goto", SGOTO }, + { "implicit", SIMPLICIT, YES }, + { "include", SINCLUDE, YES }, + { "inquire", SINQUIRE, YES }, + { "intrinsic", SINTRINSIC, YES }, + { "integer", SINTEGER }, + { "logical", SLOGICAL }, + { "namelist", SNAMELIST, YES }, + { "none", SUNDEFINED, YES }, + { "open", SOPEN, YES }, + { "parameter", SPARAM, YES }, + { "pause", SPAUSE }, + { "print", SPRINT }, + { "program", SPROGRAM, YES }, + { "punch", SPUNCH, YES }, + { "read", SREAD }, + { "real", SREAL }, + { "return", SRETURN }, + { "rewind", SREWIND }, + { "save", SSAVE, YES }, + { "static", SSTATIC, YES }, + { "stop", SSTOP }, + { "subroutine", SSUBROUTINE }, + { "then", STHEN, YES }, + { "undefined", SUNDEFINED, YES }, + { "while", SWHILE, YES }, + { "write", SWRITE }, + { 0, 0 } +}; + +LOCAL void analyz(), crunch(), store_comment(); +LOCAL int getcd(), getcds(), getkwd(), gettok(); + +inilex(name) +char *name; +{ + nincl = 0; + inclp = NULL; + doinclude(name); + lexstate = NEWSTMT; + return(NO); +} + + + +/* throw away the rest of the current line */ +flline() +{ + lexstate = RETEOS; +} + + + +char *lexline(n) +int *n; +{ + *n = (lastch - nextch) + 1; + return(nextch); +} + + + + + +doinclude(name) +char *name; +{ + FILEP fp; + struct Inclfile *t; + + if(inclp) + { + inclp->incllno = thislin; + inclp->inclcode = code; + inclp->inclstno = nxtstno; + if(nextcd) + inclp->incllinp = copyn(inclp->incllen = endcd-nextcd , nextcd); + else + inclp->incllinp = 0; + } + nextcd = NULL; + + if(++nincl >= MAXINCLUDES) + Fatal("includes nested too deep"); + if(name[0] == '\0') + fp = stdin; + else + fp = fopen(name, textread); + if (fp) + { + t = inclp; + inclp = ALLOC(Inclfile); + inclp->inclnext = t; + prevlin = thislin = 0; + infname = inclp->inclname = name; + infile = inclp->inclfp = fp; + } + else + { + fprintf(diagfile, "Cannot open file %s\n", name); + done(1); + } +} + + + + +LOCAL popinclude() +{ + struct Inclfile *t; + register char *p; + register int k; + + if(infile != stdin) + clf(&infile, infname, 1); /* Close the input file */ + free(infname); + + --nincl; + t = inclp->inclnext; + free( (charptr) inclp); + inclp = t; + if(inclp == NULL) { + infname = 0; + return(NO); + } + + infile = inclp->inclfp; + infname = inclp->inclname; + prevlin = thislin = inclp->incllno; + code = inclp->inclcode; + stno = nxtstno = inclp->inclstno; + if(inclp->incllinp) + { + endcd = nextcd = sbuf; + k = inclp->incllen; + p = inclp->incllinp; + while(--k >= 0) + *endcd++ = *p++; + free( (charptr) (inclp->incllinp) ); + } + else + nextcd = NULL; + return(YES); +} + + static void +putlineno() +{ + static long lastline; + static char *lastfile = "??", *lastfile0 = "?"; + static char fbuf[P1_FILENAME_MAX]; + extern int gflag; + register char *s0, *s1; + + if (gflag) { + if (lastline) { + if (lastfile != lastfile0) { + p1puts(P1_FILENAME, fbuf); + lastfile0 = lastfile; + } + p1_line_number(lastline); + } + lastline = firstline; + if (lastfile != infname) + if (lastfile = infname) { + strncpy(fbuf, lastfile, sizeof(fbuf)); + fbuf[sizeof(fbuf)-1] = 0; + } + else + fbuf[0] = 0; + } + if (addftnsrc) { + if (laststb && *laststb) { + for(s1 = laststb; *s1; s1++) { + for(s0 = s1; *s1 != '\n'; s1++) + if (*s1 == '*' && s1[1] == '/') + *s1 = '+'; + *s1 = 0; + p1puts(P1_FORTRAN, s0); + } + *laststb = 0; /* prevent trouble after EOF */ + } + laststb = stb0; + } + } + + +yylex() +{ + static int tokno; + int retval; + + switch(lexstate) + { + case NEWSTMT : /* need a new statement */ + retval = getcds(); + putlineno(); + if(retval == STEOF) { + retval = SEOF; + break; + } /* if getcds() == STEOF */ + crunch(); + tokno = 0; + lexstate = FIRSTTOKEN; + yystno = stno; + stno = nxtstno; + toklen = 0; + retval = SLABEL; + break; + +first: + case FIRSTTOKEN : /* first step on a statement */ + analyz(); + lexstate = OTHERTOKEN; + tokno = 1; + retval = stkey; + break; + + case OTHERTOKEN : /* return next token */ + if(nextch > lastch) + goto reteos; + ++tokno; + if( (stkey==SLOGIF || stkey==SELSEIF) && parlev==0 && tokno>3) + goto first; + + if(stkey==SASSIGN && tokno==3 && nextch sbuf) + { + q = nextcd; + p = sbuf; + while(q < endcd) + *p++ = *q++; + endcd = p; + } + +/* Be aware that the input (i.e. the string at the address nextcd) is NOT + NULL-terminated */ + +/* This loop merges all continuations into one long statement, AND puts the next + card to be read at the end of the buffer (i.e. it stores the look-ahead card + when there's room) */ + + ncont = 0; + do { + nextcd = endcd; + if (ncont < CONTMAX) + linestart[ncont++] = nextcd; + } + while(nextcd+66<=send && (code = getcd(nextcd,0))==STCONTINUE); + nextch = sbuf; + lastch = nextcd - 1; + +/* Handle buffer overflow by zeroing the 'next' pointer (nextcd) so that + the top of this function will initialize it next time it is called */ + + if(nextcd >= send) + nextcd = NULL; + lineno = prevlin; + prevlin = thislin; + return(STINITIAL); +} + + static void +bang(a,b,c,d,e) /* save ! comments */ + char *a, *b, *c; + register char *d, *e; +{ + char buf[COMMENT_BUFFER_SIZE + 1]; + register char *p, *pe; + + p = buf; + pe = buf + COMMENT_BUFFER_SIZE; + *pe = 0; + while(a < b) + if (!(*p++ = *a++)) + p[-1] = 0; + if (b < c) + *p++ = '\t'; + while(d < e) { + if (!(*p++ = *d++)) + p[-1] = ' '; + if (p == pe) { + store_comment(buf); + p = buf; + } + } + if (p > buf) { + while(--p >= buf && *p == ' '); + p[1] = 0; + store_comment(buf); + } + } + +/* getcd - Get next input card + + This function reads the next input card from global file pointer infile. +It assumes that b points to currently empty storage somewhere in sbuf */ + + LOCAL int +getcd(b, nocont) + register char *b; +{ + register int c; + register char *p, *bend; + int speclin; /* Special line - true when the line is allowed + to have more than 66 characters (e.g. the + "&" shorthand for continuation, use of a "\t" + to skip part of the label columns) */ + static char a[6]; /* Statement label buffer */ + static char *aend = a+6; + static char stbuf[3][P1_STMTBUFSIZE], *stb, *stbend; + static int nst; + char *atend, *endcd0; + int amp; + char storage[COMMENT_BUFFER_SIZE + 1]; + char *pointer; + +top: + endcd = b; + bend = b+66; + amp = speclin = NO; + atend = aend; + +/* Handle the continuation shorthand of "&" in the first column, which stands + for " x" */ + + if( (c = getc(infile)) == '&') + { + a[0] = c; + a[1] = 0; + a[5] = 'x'; + amp = speclin = YES; + bend = send; + p = aend; + } + +/* Handle the Comment cards (a 'C', 'c', '*', or '!' in the first column). */ + + else if(comstart[c & 0xff]) + { + if (feof (infile)) + return STEOF; + + storage[COMMENT_BUFFER_SIZE] = c = '\0'; + pointer = storage; + while( !feof (infile) && (*pointer++ = c = getc(infile)) != '\n') { + +/* Handle obscure end of file conditions on many machines */ + + if (feof (infile) && (c == '\377' || c == EOF)) { + pointer--; + break; + } /* if (feof (infile)) */ + + if (c == '\0') + *(pointer - 1) = ' '; + + if (pointer == &storage[COMMENT_BUFFER_SIZE]) { + store_comment (storage); + pointer = storage; + } /* if (pointer == BUFFER_SIZE) */ + } /* while */ + + if (pointer > storage) { + if (c == '\n') + +/* Get rid of the newline */ + + pointer[-1] = 0; + else + *pointer = 0; + + store_comment (storage); + } /* if */ + + if (feof (infile)) + if (c != '\n') /* To allow the line index to + increment correctly */ + return STEOF; + + ++thislin; + goto top; + } + + else if(c != EOF) + { + +/* Load buffer a with the statement label */ + + /* a tab in columns 1-6 skips to column 7 */ + ungetc(c, infile); + for(p=a; p stb + 7) { /* otherwise forget col 1-6 */ + /* kludge around funny p1gets behavior */ + *stb++ = '$'; + if (amp) + *stb++ = '&'; + else + for(p = a; p < atend;) + *stb++ = *p++; + } + if (endcd0 - b > stbend - stb) { + if (stb > stbend) + stb = stbend; + endcd0 = b + (stbend - stb); + } + for(p = b; p < endcd0;) + *stb++ = *p++; + *stb++ = '\n'; + *stb = 0; + } + if (nocont) { + lineno = thislin; + errstr("illegal continuation card (starts \"%.6s\")",a); + } + else if (!amp && strncmp(a," ",5)) { + lineno = thislin; + errstr("labeled continuation line (starts \"%.6s\")",a); + } + return(STCONTINUE); + } +initcheck: + for(p=a; p= linestart[k]) + if (++k >= CONTMAX) + Fatal("too many continuations\n"); + j0 = linestart[k]; + if (!addftnsrc) + bang(sbuf,sbuf,sbuf,i+1,j0); + i = j0-1; + continue; + } + +/* Keep everything in a quoted string */ + + if(*i=='\'' || *i=='"') + { + int len = 0; + + quote = *i; + *j = MYQUOTE; /* special marker */ + for(;;) + { + if(++i > lastch) + { + err("unbalanced quotes; closing quote supplied"); + if (j >= lastch) + j = lastch - 1; + break; + } + if(*i == quote) + if(iprvstr) /* test for Hollerith strings */ + { + j0 = j - 1; + if( ! isdigit(*j0)) goto copychar; + nh = *j0 - '0'; + ten = 10; + j1 = prvstr; + if (j1+4 < j) + j1 = j-4; + for(;;) { + if (j0-- <= j1) + goto copychar; + if( ! isdigit(*j0 ) ) break; + nh += ten * (*j0-'0'); + ten*=10; + } + /* a hollerith must be preceded by a punctuation mark. + '*' is possible only as repetition factor in a data statement + not, in particular, in character*2h +*/ + + if( !(*j0=='*'&&sbuf[0]=='d') && *j0!='/' + && *j0!='(' && *j0!=',' && *j0!='=' && *j0!='.') + goto copychar; + if(i+nh > lastch || nh + 2 > MAXTOKENLEN) + { + erri("%dH too big", nh); + nh = lastch - i; + } + j0[1] = MYQUOTE; /* special marker */ + j = j0 + 1; + while(nh-- > 0) + { + if(*++i == '\\') + switch(*++i) + { + case 't': + *i = '\t'; + break; + case 'b': + *i = '\b'; + break; + case 'n': + *i = '\n'; + break; + case 'f': + *i = '\f'; + break; + case '0': + *i = '\0'; + break; + default: + break; + } + *++j = *i; + } + j[1] = MYQUOTE; + j+=2; + prvstr = j; + } + else { + if(*i == '(') parseen = ++parlev; + else if(*i == ')') --parlev; + else if(parlev == 0) + if(*i == '=') expeql = 1; + else if(*i == ',') expcom = 1; +copychar: /*not a string or space -- copy, shifting case if necessary */ + if(shiftcase && isupper(*i)) + *j++ = tolower(*i); + else *j++ = *i; + } + } + lastch = j - 1; + nextch = sbuf; +} + + LOCAL void +analyz() +{ + register char *i; + + if(parlev != 0) + { + err("unbalanced parentheses, statement skipped"); + stkey = SUNKNOWN; + lastch = sbuf - 1; /* prevent double error msg */ + return; + } + if(nextch+2<=lastch && nextch[0]=='i' && nextch[1]=='f' && nextch[2]=='(') + { + /* assignment or if statement -- look at character after balancing paren */ + parlev = 1; + for(i=nextch+3 ; i<=lastch; ++i) + if(*i == (MYQUOTE)) + { + while(*++i != MYQUOTE) + ; + } + else if(*i == '(') + ++parlev; + else if(*i == ')') + { + if(--parlev == 0) + break; + } + if(i >= lastch) + stkey = SLOGIF; + else if(i[1] == '=') + stkey = SLET; + else if( isdigit(i[1]) ) + stkey = SARITHIF; + else stkey = SLOGIF; + if(stkey != SLET) + nextch += 2; + } + else if(expeql) /* may be an assignment */ + { + if(expcom && nextch= '0' && nextch[2] <= '9') + || nextch[2] == ',' + || nextch[2] == 'w')) + { + stkey = SDO; + nextch += 2; + needwkey = 1; + } + /* otherwise search for keyword */ + else { + stkey = getkwd(); + if(stkey==SGOTO && lastch>=nextch) + if(nextch[0]=='(') + stkey = SCOMPGOTO; + else if(isalpha(nextch[0])) + stkey = SASGOTO; + } + parlev = 0; +} + + + + LOCAL int +getkwd() +{ + register char *i, *j; + register struct Keylist *pk, *pend; + int k; + + if(! isalpha(nextch[0]) ) + return(SUNKNOWN); + k = letter(nextch[0]); + if(pk = keystart[k]) + for(pend = keyend[k] ; pk<=pend ; ++pk ) + { + i = pk->keyname; + j = nextch; + while(*++i==*++j && *i!='\0') + ; + if(*i=='\0' && j<=lastch+1) + { + nextch = j; + if(no66flag && pk->notinf66) + errstr("Not a Fortran 66 keyword: %s", + pk->keyname); + return(pk->keyval); + } + } + return(SUNKNOWN); +} + +initkey() +{ + register struct Keylist *p; + register int i,j; + register char *s; + + for(i = 0 ; i<26 ; ++i) + keystart[i] = NULL; + + for(p = keys ; p->keyname ; ++p) { + j = letter(p->keyname[0]); + if(keystart[j] == NULL) + keystart[j] = p; + keyend[j] = p; + } + comstart['c'] = comstart['C'] = comstart['*'] = comstart['!'] = 1; + s = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_"; + while(i = *s++) + anum_buf[i] = 1; + s = "0123456789"; + while(i = *s++) + anum_buf[i] = 2; + } + +/* gettok -- moves the right amount of text from nextch into the token + buffer. token initially contains garbage (leftovers from the prev token) */ + + LOCAL int +gettok() +{ + int havdot, havexp, havdbl; + int radix, val; + struct Punctlist *pp; + struct Dotlist *pd; + register int ch; + + char *i, *j, *n1, *p; + + ch = * USC nextch; + if(ch == (MYQUOTE)) + { + ++nextch; + p = token; + while(*nextch != MYQUOTE) + *p++ = *nextch++; + ++nextch; + toklen = p - token; + *p = 0; + return (SHOLLERITH); + } + /* The next 40 lines or so were an early attempt to parse FORMAT + statements. They have been deleted */ + +/* Not a format statement */ + + if(needkwd) + { + needkwd = 0; + return( getkwd() ); + } + + for(pp=puncts; pp->punchar; ++pp) + if(ch == pp->punchar) { + val = pp->punval; + if (++nextch <= lastch) + switch(ch) { + case '/': + if (*nextch == '/') { + nextch++; + val = SCONCAT; + } + else if (new_dcl && parlev == 0) + val = SSLASHD; + return val; + case '*': + if (*nextch == '*') { + nextch++; + return SPOWER; + } + break; + case '<': + if (*nextch == '=') { + nextch++; + val = SLE; + } + if (*nextch == '>') { + nextch++; + val = SNE; + } + goto extchk; + case '=': + if (*nextch == '=') { + nextch++; + val = SEQ; + goto extchk; + } + break; + case '>': + if (*nextch == '=') { + nextch++; + val = SGE; + } + extchk: + NOEXT("Fortran 8x comparison operator"); + return val; + } + else if (ch == '/' && new_dcl && parlev == 0) + return SSLASHD; + switch(val) { + case SLPAR: + ++parlev; + break; + case SRPAR: + --parlev; + } + return(val); + } + if(ch == '.') + if(nextch >= lastch) goto badchar; + else if(isdigit(nextch[1])) goto numconst; + else { + for(pd=dots ; (j=pd->dotname) ; ++pd) + { + for(i=nextch+1 ; i<=lastch ; ++i) + if(*i != *j) break; + else if(*i != '.') ++j; + else { + nextch = i+1; + return(pd->dotval); + } + } + goto badchar; + } + if( isalpha(ch) ) + { + p = token; + *p++ = *nextch++; + while(nextch<=lastch) + if( isalnum_(* USC nextch) ) + *p++ = *nextch++; + else break; + toklen = p - token; + *p = 0; + if (needwkey) { + needwkey = 0; + if (toklen == 5 + && nextch <= lastch && *nextch == '(' /*)*/ + && !strcmp(token,"while")) + return(SWHILE); + } + if(inioctl && nextch<=lastch && *nextch=='=') + { + ++nextch; + return(SNAMEEQ); + } + if(toklen>8 && eqn(8,token,"function") && isalpha(token[8]) && + nextch 50) + { + char buff[100]; + sprintf(buff, toklen >= 60 + ? "name %.56s... too long, truncated to %.*s" + : "name %s too long, truncated to %.*s", + token, 50, token); + err(buff); + toklen = 50; + token[50] = '\0'; + } + if(toklen==1 && *nextch==MYQUOTE) + { + switch(token[0]) + { + case 'z': + case 'Z': + case 'x': + case 'X': + radix = 16; + break; + case 'o': + case 'O': + radix = 8; + break; + case 'b': + case 'B': + radix = 2; + break; + default: + err("bad bit identifier"); + return(SNAME); + } + ++nextch; + for(p = token ; *nextch!=MYQUOTE ; ) + if( hextoi(*p++ = *nextch++) >= radix) + { + err("invalid binary character"); + break; + } + ++nextch; + toklen = p - token; + *p = 0; + return( radix==16 ? SHEXCON : + (radix==8 ? SOCTCON : SBITCON) ); + } + return(SNAME); + } + + if (isdigit(ch)) { + + /* Check for NAG's special hex constant */ + + if (nextch[1] == '#' + || nextch[2] == '#' && isdigit(nextch[1])) { + + radix = atoi (nextch); + if (*++nextch != '#') + nextch++; + if (radix != 2 && radix != 8 && radix != 16) { + erri("invalid base %d for constant, defaulting to hex", + radix); + radix = 16; + } /* if */ + if (++nextch > lastch) + goto badchar; + for (p = token; hextoi(*nextch) < radix;) { + *p++ = *nextch++; + if (nextch > lastch) + break; + } + toklen = p - token; + *p = 0; + return (radix == 16) ? SHEXCON : ((radix == 8) ? SOCTCON : + SBITCON); + } + } + else + goto badchar; +numconst: + havdot = NO; + havexp = NO; + havdbl = NO; + for(n1 = nextch ; nextch<=lastch ; ++nextch) + { + if(*nextch == '.') + if(havdot) break; + else if(nextch+2<=lastch && isalpha(nextch[1]) + && isalpha(nextch[2])) + break; + else havdot = YES; + else if( !intonly && (*nextch=='d' || *nextch=='e') ) + { + p = nextch; + havexp = YES; + if(*nextch == 'd') + havdbl = YES; + if(nextch cblast) { + if (!cbcur || !(ncb = cbcur->next)) { + ncb = (comment_buf *) Alloc(sizeof(comment_buf)); + if (cbcur) { + cbcur->last = cbnext; + cbcur->next = ncb; + } + else { + cbfirst = ncb; + cbinit = ncb->buf; + } + ncb->next = 0; + } + cbcur = ncb; + cbnext = ncb->buf; + cblast = cbnext + COMMENT_BUF_STORE; + } + strcpy(cbnext, str); + cbnext += len; + } + + static void +flush_comments() +{ + register char *s, *s1; + register comment_buf *cb; + if (cbnext == cbinit) + return; + cbcur->last = cbnext; + for(cb = cbfirst;; cb = cb->next) { + for(s = cb->buf; s < cb->last; s = s1) { + /* compute s1 = new s value first, since */ + /* p1_comment may insert nulls into s */ + s1 = s + strlen(s) + 1; + p1_comment(s); + } + if (cb == cbcur) + break; + } + cbcur = cbfirst; + cbnext = cbinit; + cblast = cbnext + COMMENT_BUF_STORE; + } + + void +unclassifiable() +{ + register char *s, *se; + + s = sbuf; + se = lastch; + if (se < sbuf) + return; + lastch = s - 1; + if (se - s > 10) + se = s + 10; + for(; s < se; s++) + if (*s == MYQUOTE) { + se = s; + break; + } + *se = 0; + errstr("unclassifiable statment (starts \"%s\")", sbuf); + } diff --git a/sources/f2c/link.lnk b/sources/f2c/link.lnk new file mode 100644 index 0000000..7163747 --- /dev/null +++ b/sources/f2c/link.lnk @@ -0,0 +1,2 @@ +main.o init.o gram.o lex.o proc.o equiv.o data.o format.o expr.o exec.o intr.o io.o misc.o error.o mem.o names.o output.o p1output.o pread.o put.o putpcc.o vax.o formatd.o safstrcp.o parsearg.o nicepr.o cds.o sysdep.o version.o + diff --git a/sources/f2c/machdefs.h b/sources/f2c/machdefs.h new file mode 100644 index 0000000..3ab8961 --- /dev/null +++ b/sources/f2c/machdefs.h @@ -0,0 +1,31 @@ +#define TYLENG TYLONG /* char string length field */ + +#define TYINT TYLONG +#define SZADDR 4 +#define SZSHORT 2 +#define SZINT 4 + +#define SZLONG 4 +#define SZLENG SZLONG + +#define SZDREAL 8 + +/* Alignment restrictions */ + +#define ALIADDR SZADDR +#define ALISHORT SZSHORT +#define ALILONG 4 +#define ALIDOUBLE 8 +#define ALIINT ALILONG +#define ALILENG ALILONG + +#define BLANKCOMMON "_BLNK__" /* Name for the unnamed + common block; this is unique + because of underscores */ + +#define LABELFMT "%s:\n" + +#define MAXREGVAR 4 +#define TYIREG TYLONG +#define MSKIREG (M(TYSHORT)|M(TYLONG)) /* allowed types of DO indicies + which can be put in registers */ diff --git a/sources/f2c/main.c b/sources/f2c/main.c new file mode 100644 index 0000000..1c2eb9d --- /dev/null +++ b/sources/f2c/main.c @@ -0,0 +1,561 @@ +/**************************************************************** +Copyright 1990 by AT&T Bell Laboratories and Bellcore. + +Permission to use, copy, modify, and distribute this software +and its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the names of AT&T Bell Laboratories or +Bellcore or any of their entities not be used in advertising or +publicity pertaining to distribution of the software without +specific, written prior permission. + +AT&T and Bellcore disclaim all warranties with regard to this +software, including all implied warranties of merchantability +and fitness. In no event shall AT&T or Bellcore be liable for +any special, indirect or consequential damages or any damages +whatsoever resulting from loss of use, data or profits, whether +in an action of contract, negligence or other tortious action, +arising out of or in connection with the use or performance of +this software. +****************************************************************/ + +extern char F2C_version[]; + +#include "defs.h" +#include "parse.h" + +int complex_seen, dcomplex_seen; + +LOCAL int Max_ftn_files; + +char **ftn_files; +int current_ftn_file = 0; + +flag ftn66flag = NO; +flag nowarnflag = NO; +flag noextflag = NO; +flag no66flag = NO; /* Must also set noextflag to this + same value */ +flag zflag = YES; /* recognize double complex intrinsics */ +flag debugflag = NO; +flag onetripflag = NO; +flag shiftcase = YES; +flag undeftype = NO; +flag checksubs = NO; +flag r8flag = NO; +int tyreal = TYREAL; +extern void r8fix(), read_Pfiles(); + +int maxregvar = MAXREGVAR; /* if maxregvar > MAXREGVAR, error */ +int maxequiv = MAXEQUIV; +int maxext = MAXEXT; +int maxstno = MAXSTNO; +int maxctl = MAXCTL; +int maxhash = MAXHASH; +int extcomm, ext1comm, useauto; +int can_include = YES; /* so we can disable includes for netlib */ + +static char *def_i2 = ""; + +static int useshortints = NO; /* YES => tyint = TYSHORT */ +static int uselongints = NO; /* YES => tyint = TYLONG */ +int addftnsrc = NO; /* Include ftn source in output */ +int usedefsforcommon = NO; /* Use #defines for common reference */ +int forcedouble = YES; /* force real functions to double */ +int Ansi = NO; +int def_equivs = YES; +int tyioint = TYLONG; +int szleng = SZLENG; +int inqmask = M(TYLONG)|M(TYLOGICAL); +int wordalign = NO; +static int skipC, skipversion; +char *filename0, *parens; +int Castargs = 1; +static int typedefs = 0; +int chars_per_wd, gflag, protostatus; +int infertypes = 1; +char used_rets[TYSUBR+1]; +extern char *tmpdir; + +#define f2c_entry(swit,count,type,store,size) \ + p_entry ("-", swit, 0, count, type, store, size) + +static arg_info table[] = { + f2c_entry ("w66", P_NO_ARGS, P_INT, &ftn66flag, YES), + f2c_entry ("w", P_NO_ARGS, P_INT, &nowarnflag, YES), + f2c_entry ("66", P_NO_ARGS, P_INT, &no66flag, YES), + f2c_entry ("d", P_ONE_ARG, P_INT, &debugflag, YES), + f2c_entry ("1", P_NO_ARGS, P_INT, &onetripflag, YES), + f2c_entry ("onetrip", P_NO_ARGS, P_INT, &onetripflag, YES), + f2c_entry ("I2", P_NO_ARGS, P_INT, &useshortints, YES), + f2c_entry ("I4", P_NO_ARGS, P_INT, &uselongints, YES), + f2c_entry ("U", P_NO_ARGS, P_INT, &shiftcase, NO), + f2c_entry ("u", P_NO_ARGS, P_INT, &undeftype, YES), + f2c_entry ("O", P_ONE_ARG, P_INT, &maxregvar, 0), + f2c_entry ("C", P_NO_ARGS, P_INT, &checksubs, YES), + f2c_entry ("Nq", P_ONE_ARG, P_INT, &maxequiv, 0), + f2c_entry ("Nx", P_ONE_ARG, P_INT, &maxext, 0), + f2c_entry ("Ns", P_ONE_ARG, P_INT, &maxstno, 0), + f2c_entry ("Nc", P_ONE_ARG, P_INT, &maxctl, 0), + f2c_entry ("Nn", P_ONE_ARG, P_INT, &maxhash, 0), + f2c_entry ("c", P_NO_ARGS, P_INT, &addftnsrc, YES), + f2c_entry ("p", P_NO_ARGS, P_INT, &usedefsforcommon, YES), + f2c_entry ("R", P_NO_ARGS, P_INT, &forcedouble, NO), + f2c_entry ("!R", P_NO_ARGS, P_INT, &forcedouble, YES), + f2c_entry ("A", P_NO_ARGS, P_INT, &Ansi, YES), + f2c_entry ("ext", P_NO_ARGS, P_INT, &noextflag, YES), + f2c_entry ("z", P_NO_ARGS, P_INT, &zflag, NO), + f2c_entry ("a", P_NO_ARGS, P_INT, &useauto, YES), + f2c_entry ("r8", P_NO_ARGS, P_INT, &r8flag, YES), + f2c_entry ("i2", P_NO_ARGS, P_INT, &tyioint, NO), + f2c_entry ("w8", P_NO_ARGS, P_INT, &wordalign, YES), + f2c_entry ("!I", P_NO_ARGS, P_INT, &can_include, NO), + f2c_entry ("W", P_ONE_ARG, P_INT, &chars_per_wd, 0), + f2c_entry ("g", P_NO_ARGS, P_INT, &gflag, YES), + f2c_entry ("T", P_ONE_ARG, P_STRING, &tmpdir, 0), + f2c_entry ("E", P_NO_ARGS, P_INT, &extcomm, 1), + f2c_entry ("e1c", P_NO_ARGS, P_INT, &ext1comm, 1), + f2c_entry ("ec", P_NO_ARGS, P_INT, &ext1comm, 2), + f2c_entry ("C++", P_NO_ARGS, P_INT, &Ansi, 2), + f2c_entry ("P", P_NO_ARGS, P_INT, &Castargs, 3), + f2c_entry ("Ps", P_NO_ARGS, P_INT, &protostatus, 1), + f2c_entry ("!P", P_NO_ARGS, P_INT, &Castargs, 0), + f2c_entry ("!c", P_NO_ARGS, P_INT, &skipC, 1), + f2c_entry ("!it", P_NO_ARGS, P_INT, &infertypes, 0), + + /* options omitted from man pages */ + + /* -ev ==> implement equivalence with initialized pointers */ + f2c_entry ("ev", P_NO_ARGS, P_INT, &def_equivs, NO), + + /* -!it used to be the default when -it was more agressive */ + + f2c_entry ("it", P_NO_ARGS, P_INT, &infertypes, 1), + + /* -Pd is similar to -P, but omits :ref: lines */ + f2c_entry ("Pd", P_NO_ARGS, P_INT, &Castargs, 2), + + /* -t ==> emit typedefs (under -A or -C++) for procedure + argument types used. This is meant for netlib's + f2c service, so -A and -C++ will work with older + versions of f2c.h + */ + f2c_entry ("t", P_NO_ARGS, P_INT, &typedefs, 1), + + /* -!V ==> omit version msg (to facilitate using diff in + regression testing) + */ + f2c_entry ("!V", P_NO_ARGS, P_INT, &skipversion, 1) + +}; /* table */ + +extern char *c_functions; /* "c_functions" */ +extern char *coutput; /* "c_output" */ +extern char *initfname; /* "raw_data" */ +extern char *blkdfname; /* "block_data" */ +extern char *p1_file; /* "p1_file" */ +extern char *p1_bakfile; /* "p1_file.BAK" */ +extern char *sortfname; /* "init_file" */ +static char *proto_fname; /* "proto_file" */ +FILE *protofile; + +extern void list_init_data(), set_tmp_names(), sigcatch(), Un_link_all(); +extern char *c_name(); + + +set_externs () +{ +/* Adjust the global flags according to the command line parameters */ + + if (chars_per_wd > 0) { + typesize[TYADDR] = typesize[TYLONG] = typesize[TYREAL] = + typesize[TYLOGICAL] = chars_per_wd; + typesize[TYDREAL] = typesize[TYCOMPLEX] = chars_per_wd << 1; + typesize[TYDCOMPLEX] = chars_per_wd << 2; + typesize[TYSHORT] = chars_per_wd >> 1; + typesize[TYCILIST] = 5*chars_per_wd; + typesize[TYICILIST] = 6*chars_per_wd; + typesize[TYOLIST] = 9*chars_per_wd; + typesize[TYCLLIST] = 3*chars_per_wd; + typesize[TYALIST] = 2*chars_per_wd; + typesize[TYINLIST] = 26*chars_per_wd; + } + + if (wordalign) + typealign[TYDREAL] = typealign[TYDCOMPLEX] = typealign[TYREAL]; + if (!tyioint) { + tyioint = TYSHORT; + szleng = typesize[TYSHORT]; + def_i2 = "#define f2c_i2 1\n"; + inqmask = M(TYSHORT)|M(TYLOGICAL); + goto checklong; + } + else + szleng = typesize[TYLONG]; + if (useshortints) { + inqmask = M(TYLONG); + checklong: + protorettypes[TYLOGICAL] = typename[TYLOGICAL] = "shortlogical"; + typesize[TYLOGICAL] = typesize[TYSHORT]; + casttypes[TYLOGICAL] = "K_fp"; + if (uselongints) + err ("Can't use both long and short ints"); + else + tyint = tylogical = TYSHORT; + } + else if (uselongints) + tyint = TYLONG; + + if (no66flag) + noextflag = no66flag; + if (noextflag) + zflag = 0; + + if (r8flag) { + tyreal = TYDREAL; + r8fix(); + } + if (forcedouble) { + protorettypes[TYREAL] = "E_f"; + casttypes[TYREAL] = "E_fp"; + } + + if (maxregvar > MAXREGVAR) { + warni("-O%d: too many register variables", maxregvar); + maxregvar = MAXREGVAR; + } /* if maxregvar > MAXREGVAR */ + +/* Check the list of input files */ + + { + int bad, i, cur_max = Max_ftn_files; + + for (i = bad = 0; i < cur_max && ftn_files[i]; i++) + if (ftn_files[i][0] == '-') { + errstr ("Invalid flag '%s'", ftn_files[i]); + bad++; + } + if (bad) + exit(1); + + } /* block */ +} /* set_externs */ + + + static int +comm2dcl() +{ + Extsym *ext; + if (ext1comm) + for(ext = extsymtab; ext < nextext; ext++) + if (ext->extstg == STGCOMMON && !ext->extinit) + return ext1comm; + return 0; + } + + static void +write_typedefs(outfile) + FILE *outfile; +{ + register int i; + register char *s, *p = 0; + static char st[4] = { TYREAL, TYCOMPLEX, TYDCOMPLEX, TYCHAR }; + static char stl[4] = { 'E', 'C', 'Z', 'H' }; + + for(i = 0; i <= TYSUBR; i++) + if (s = usedcasts[i]) { + if (!p) { + p = Ansi == 1 ? "()" : "(...)"; + nice_printf(outfile, + "/* Types for casting procedure arguments: */\ +\n\n#ifndef F2C_proc_par_types\n"); + if (i == 0) { + nice_printf(outfile, + "typedef int /* Unknown procedure type */ (*%s)%s;\n", + s, p); + continue; + } + } + nice_printf(outfile, "typedef %s (*%s)%s;\n", + c_type_decl(i,1), s, p); + } + for(i = !forcedouble; i < 4; i++) + if (used_rets[st[i]]) + nice_printf(outfile, + "typedef %s %c_f; /* %s function */\n", + p = i ? "VOID" : "doublereal", + stl[i], ftn_types[st[i]]); + if (p) + nice_printf(outfile, "#endif\n\n"); + } + + static void +commonprotos(outfile) + register FILE *outfile; +{ + register Extsym *e, *ee; + register Argtypes *at; + Atype *a, *ae; + int k; + extern int proc_protochanges; + + if (!outfile) + return; + for (e = extsymtab, ee = nextext; e < ee; e++) + if (e->extstg == STGCOMMON && e->allextp) + nice_printf(outfile, "/* comlen %s %ld */\n", + e->cextname, e->maxleng); + if (Castargs < 3) + return; + + /* -Pr: special comments conveying current knowledge + of external references */ + + k = proc_protochanges; + for (e = extsymtab, ee = nextext; e < ee; e++) + if (e->extstg == STGEXT + && e->cextname != e->fextname) /* not a library function */ + if (at = e->arginfo) { + if ((!e->extinit || at->changes & 1) + /* not defined here or + changed since definition */ + && at->nargs >= 0) { + nice_printf(outfile, "/*:ref: %s %d %d", + e->cextname, e->extype, at->nargs); + a = at->atypes; + for(ae = a + at->nargs; a < ae; a++) + nice_printf(outfile, " %d", a->type); + nice_printf(outfile, " */\n"); + if (at->changes & 1) + k++; + } + } + else if (e->extype) + /* typyed external, never invoked */ + nice_printf(outfile, "/*:ref: %s %d :*/\n", + e->cextname, e->extype); + if (k) { + nice_printf(outfile, + "/* Rerunning f2c -P may change prototypes or declarations. */\n"); + if (nerr) + return; + if (protostatus) + done(4); + if (protofile != stdout) { + fprintf(diagfile, + "Rerunning \"f2c -P ... %s %s\" may change prototypes or declarations.\n", + filename0, proto_fname); + fflush(diagfile); + } + } + } + + int retcode = 0; + +main(argc, argv) +int argc; +char **argv; +{ + int c2d, k; + FILE *c_output; + char *filename, *cdfilename; + static char stderrbuf[BUFSIZ]; + extern void def_commons(); + extern char **dfltproc, *dflt1proc[]; + + diagfile = stderr; + setbuf(stderr, stderrbuf); /* arrange for fast error msgs */ + + Max_ftn_files = argc - 1; + ftn_files = (char **)ckalloc((argc+1)*sizeof(char *)); + + parse_args (argc, argv, table, sizeof(table)/sizeof(arg_info), + ftn_files, Max_ftn_files); + if (!can_include && ext1comm == 2) + ext1comm = 1; + if (ext1comm && !extcomm) + extcomm = 2; + if (protostatus) + Castargs = 3; + else if (Castargs == 1 && !Ansi) + Castargs = 0; + if (Castargs >= 2 && !Ansi) + Ansi = 1; + + if (!Ansi) + parens = "()"; + else if (!Castargs) + parens = Ansi == 1 ? "()" : "(...)"; + else + dfltproc = dflt1proc; + + set_externs(); + fileinit(); + read_Pfiles(ftn_files); + + for(k = 1; ftn_files[k]; k++) + if (dofork()) + break; + filename0 = filename = ftn_files[current_ftn_file = k - 1]; + + set_tmp_names(); + sigcatch(); + + c_file = opf(c_functions, textwrite); + pass1_file=opf(p1_file, binwrite); + initkey(); + if (filename && *filename) { + if (debugflag != 1) { + coutput = c_name(filename,'c'); + if (Castargs >= 2) + proto_fname = c_name(filename,'P'); + } + cdfilename = coutput; + if (Castargs >= 2 + && !(protofile = fopen(proto_fname, textwrite))) + fatalstr("Can't open %.84s\n", proto_fname); + } + else { + filename = ""; + cdfilename = "f2c_out.c"; + c_output = stdout; + coutput = 0; + if (Castargs >= 2) { + protofile = stdout; + if (!skipC) + printf("#ifdef P_R_O_T_O_T_Y_P_E_S\n"); + } + } + + if(inilex( copys(filename) )) + done(1); + if (filename0) { + fprintf(diagfile, "%s:\n", filename); + fflush(diagfile); + } + + procinit(); + if(k = yyparse()) + { + fprintf(diagfile, "Bad parse, return code %d\n", k); + done(1); + } + + commonprotos(protofile); + if (protofile == stdout && !skipC) + printf("#endif\n\n"); + + if(nerr) + done(1); + + if (skipC) + goto C_skipped; + + if (filename0 + && (c_output = fopen (coutput, textwrite)) == (FILE *) NULL) + fatalstr("can't open %.86s", coutput); + + +/* Write out the declarations which are global to this file */ + + if ((c2d = comm2dcl()) == 1) + nice_printf(c_output, "/*>>>'/dev/null'<<<*/\n\n\ +/* Split this into several files by piping it through\n\n\ +sed \"s/^\\/\\*>>>'\\(.*\\)'<<<\\*\\/\\$/cat >'\\1' <<'\\/*<<<\\1>>>*\\/'/\" | /bin/sh\n\ + */\n\ +/*<<>>*/\n\ +/*>>>'%s'<<<*/\n", cdfilename); + if (!skipversion) { + nice_printf (c_output, "/* %s -- translated by f2c ", filename); + nice_printf (c_output, "(version of %s).\n", F2C_version); + nice_printf (c_output, + " You must link the resulting object file with the libraries:\n\ + -lF77 -lI77 -lm -lc (in that order)\n*/\n\n"); + } + if (Ansi == 2) + nice_printf(c_output, + "#ifdef __cplusplus\nextern \"C\" {\n#endif\n"); + nice_printf (c_output, "%s#include \"f2c.h\"\n\n", def_i2); + if (Castargs && typedefs) + write_typedefs(c_output); + nice_printf (c_file, "\n"); + fclose (c_file); + c_file = c_output; /* HACK to get the next indenting + to work */ + wr_common_decls (c_output); + if (blkdfile) + list_init_data(&blkdfile, blkdfname, c_output); + wr_globals (c_output); + if ((c_file = fopen (c_functions, textread)) == (FILE *) NULL) + Fatal("main - couldn't reopen c_functions"); + ffilecopy (c_file, c_output); + if (*main_alias) { + nice_printf (c_output, "/* Main program alias */ "); + nice_printf (c_output, "int %s () { MAIN__ (); }\n", + main_alias); + } + if (Ansi == 2) + nice_printf(c_output, + "#ifdef __cplusplus\n\t}\n#endif\n"); + if (c2d) { + if (c2d == 1) + fprintf(c_output, "/*<<<%s>>>*/\n", cdfilename); + else + fclose(c_output); + def_commons(c_output); + } + if (c2d != 2) + fclose (c_output); + + C_skipped: + if(parstate != OUTSIDE) + { + warn("missing END statement"); + endproc(); + } + done(nerr ? 1 : 0); +} + + +FILEP opf(fn, mode) +char *fn, *mode; +{ + FILEP fp; + if( fp = fopen(fn, mode) ) + return(fp); + + fatalstr("cannot open intermediate file %s", fn); + /* NOT REACHED */ return 0; +} + + +clf(p, what, quit) + FILEP *p; + char *what; + int quit; +{ + if(p!=NULL && *p!=NULL && *p!=stdout) + { + if(ferror(*p)) { + fprintf(stderr, "I/O error on %s\n", what); + if (quit) + done(3); + retcode = 3; + } + fclose(*p); + } + *p = NULL; +} + + +done(k) +int k; +{ + clf(&initfile, "initfile", 0); + clf(&c_file, "c_file", 0); + clf(&pass1_file, "pass1_file", 0); + Un_link_all(k); + exit(k|retcode); +} diff --git a/sources/f2c/makefile b/sources/f2c/makefile new file mode 100644 index 0000000..d9a21f4 --- /dev/null +++ b/sources/f2c/makefile @@ -0,0 +1,71 @@ +CFLAGS = -O +CC = cc + +YFLAGS = -Sr600 # SCO +#YFLAGS = # SUN + +OBJECTSd = main.o init.o gram.o lex.o proc.o equiv.o data.o format.o \ + expr.o exec.o intr.o io.o misc.o error.o mem.o names.o \ + output.o p1output.o pread.o put.o putpcc.o vax.o formatd.o \ + safstrcp.o parsearg.o nicepr.o cds.o sysdep.o version.o +OBJECTS = $(OBJECTSd) malloc.o + +target : f2c + +f2c.exe: $(OBJECTS) + gcc @link.lnk -o f2c.out + strip f2c.out + aout2exe f2c.out + del f2c.out + +f2c: $(OBJECTS) + $(CC) $(CFLAGS) $(LDFLAGS) $(OBJECTS) -o f2c + strip f2c + mv f2c $(HOME)/bin + +#gram.c : gram.hd gram.dcl gram.exp gram.exe gram.io defs.h tokdefs.h +# ( sed gram.in +# $(YACC) $(YFLAGS) gram.in +# echo "(expect 4 shift/reduce)" +# sed 's/^# line.*/\/* & *\//' y.tab.c >gram.c +# rm -f gram.in y.tab.c + +#tokdefs.h : tokens +# grep -n . tokdefs.h + +$(OBJECTSd): defs.h +defs.h: ftypes.h defines.h machdefs.h +exec.o: p1defs.h names.h +expr.o: output.h nicepr.h names.h +format.o: p1defs.h format.h output.h nicepr.h names.h iob.h +formatd.o: format.h output.h nicepr.h names.h +gram.o: p1defs.h +init.o: output.h nicepr.h iob.h +intr.o: names.h +io.o: names.h iob.h +lex.o : tokdefs.h p1defs.h +main.o: parse.h usignal.h +mem.o: iob.h +names.o: iob.h names.h output.h nicepr.h +nicepr.o: defs.h names.h output.h nicepr.h +output.o: output.h nicepr.h names.h +p1output.o: p1defs.h output.h nicepr.h names.h +parsearg.o: parse.h +proc.o: tokdefs.h names.h nicepr.h output.h p1defs.h +put.o: names.h pccdefs.h p1defs.h +putpcc.o: names.h +vax.o: defs.h output.h pccdefs.h +output.h: nicepr.h +defs.h: ftypes.h defines.h machdefs.h +put.o putpcc.o: pccdefs.h + +f2c.t: f2c.1t + troff -man f2c.1t >f2c.t + +f2c.1: f2c.1t + nroff -man f2c.1t | col -b | uniq >f2c.1 + +clean: + -rm -f *.o +CFLAGS = -O diff --git a/sources/f2c/makefile.bak b/sources/f2c/makefile.bak new file mode 100644 index 0000000..d9a21f4 --- /dev/null +++ b/sources/f2c/makefile.bak @@ -0,0 +1,71 @@ +CFLAGS = -O +CC = cc + +YFLAGS = -Sr600 # SCO +#YFLAGS = # SUN + +OBJECTSd = main.o init.o gram.o lex.o proc.o equiv.o data.o format.o \ + expr.o exec.o intr.o io.o misc.o error.o mem.o names.o \ + output.o p1output.o pread.o put.o putpcc.o vax.o formatd.o \ + safstrcp.o parsearg.o nicepr.o cds.o sysdep.o version.o +OBJECTS = $(OBJECTSd) malloc.o + +target : f2c + +f2c.exe: $(OBJECTS) + gcc @link.lnk -o f2c.out + strip f2c.out + aout2exe f2c.out + del f2c.out + +f2c: $(OBJECTS) + $(CC) $(CFLAGS) $(LDFLAGS) $(OBJECTS) -o f2c + strip f2c + mv f2c $(HOME)/bin + +#gram.c : gram.hd gram.dcl gram.exp gram.exe gram.io defs.h tokdefs.h +# ( sed gram.in +# $(YACC) $(YFLAGS) gram.in +# echo "(expect 4 shift/reduce)" +# sed 's/^# line.*/\/* & *\//' y.tab.c >gram.c +# rm -f gram.in y.tab.c + +#tokdefs.h : tokens +# grep -n . tokdefs.h + +$(OBJECTSd): defs.h +defs.h: ftypes.h defines.h machdefs.h +exec.o: p1defs.h names.h +expr.o: output.h nicepr.h names.h +format.o: p1defs.h format.h output.h nicepr.h names.h iob.h +formatd.o: format.h output.h nicepr.h names.h +gram.o: p1defs.h +init.o: output.h nicepr.h iob.h +intr.o: names.h +io.o: names.h iob.h +lex.o : tokdefs.h p1defs.h +main.o: parse.h usignal.h +mem.o: iob.h +names.o: iob.h names.h output.h nicepr.h +nicepr.o: defs.h names.h output.h nicepr.h +output.o: output.h nicepr.h names.h +p1output.o: p1defs.h output.h nicepr.h names.h +parsearg.o: parse.h +proc.o: tokdefs.h names.h nicepr.h output.h p1defs.h +put.o: names.h pccdefs.h p1defs.h +putpcc.o: names.h +vax.o: defs.h output.h pccdefs.h +output.h: nicepr.h +defs.h: ftypes.h defines.h machdefs.h +put.o putpcc.o: pccdefs.h + +f2c.t: f2c.1t + troff -man f2c.1t >f2c.t + +f2c.1: f2c.1t + nroff -man f2c.1t | col -b | uniq >f2c.1 + +clean: + -rm -f *.o +CFLAGS = -O diff --git a/sources/f2c/makefile.txt b/sources/f2c/makefile.txt new file mode 100644 index 0000000..d9a21f4 --- /dev/null +++ b/sources/f2c/makefile.txt @@ -0,0 +1,71 @@ +CFLAGS = -O +CC = cc + +YFLAGS = -Sr600 # SCO +#YFLAGS = # SUN + +OBJECTSd = main.o init.o gram.o lex.o proc.o equiv.o data.o format.o \ + expr.o exec.o intr.o io.o misc.o error.o mem.o names.o \ + output.o p1output.o pread.o put.o putpcc.o vax.o formatd.o \ + safstrcp.o parsearg.o nicepr.o cds.o sysdep.o version.o +OBJECTS = $(OBJECTSd) malloc.o + +target : f2c + +f2c.exe: $(OBJECTS) + gcc @link.lnk -o f2c.out + strip f2c.out + aout2exe f2c.out + del f2c.out + +f2c: $(OBJECTS) + $(CC) $(CFLAGS) $(LDFLAGS) $(OBJECTS) -o f2c + strip f2c + mv f2c $(HOME)/bin + +#gram.c : gram.hd gram.dcl gram.exp gram.exe gram.io defs.h tokdefs.h +# ( sed gram.in +# $(YACC) $(YFLAGS) gram.in +# echo "(expect 4 shift/reduce)" +# sed 's/^# line.*/\/* & *\//' y.tab.c >gram.c +# rm -f gram.in y.tab.c + +#tokdefs.h : tokens +# grep -n . tokdefs.h + +$(OBJECTSd): defs.h +defs.h: ftypes.h defines.h machdefs.h +exec.o: p1defs.h names.h +expr.o: output.h nicepr.h names.h +format.o: p1defs.h format.h output.h nicepr.h names.h iob.h +formatd.o: format.h output.h nicepr.h names.h +gram.o: p1defs.h +init.o: output.h nicepr.h iob.h +intr.o: names.h +io.o: names.h iob.h +lex.o : tokdefs.h p1defs.h +main.o: parse.h usignal.h +mem.o: iob.h +names.o: iob.h names.h output.h nicepr.h +nicepr.o: defs.h names.h output.h nicepr.h +output.o: output.h nicepr.h names.h +p1output.o: p1defs.h output.h nicepr.h names.h +parsearg.o: parse.h +proc.o: tokdefs.h names.h nicepr.h output.h p1defs.h +put.o: names.h pccdefs.h p1defs.h +putpcc.o: names.h +vax.o: defs.h output.h pccdefs.h +output.h: nicepr.h +defs.h: ftypes.h defines.h machdefs.h +put.o putpcc.o: pccdefs.h + +f2c.t: f2c.1t + troff -man f2c.1t >f2c.t + +f2c.1: f2c.1t + nroff -man f2c.1t | col -b | uniq >f2c.1 + +clean: + -rm -f *.o +CFLAGS = -O diff --git a/sources/f2c/malloc.c b/sources/f2c/malloc.c new file mode 100644 index 0000000..34cca2d --- /dev/null +++ b/sources/f2c/malloc.c @@ -0,0 +1,142 @@ +/**************************************************************** +Copyright 1990 by AT&T Bell Laboratories and Bellcore. + +Permission to use, copy, modify, and distribute this software +and its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the names of AT&T Bell Laboratories or +Bellcore or any of their entities not be used in advertising or +publicity pertaining to distribution of the software without +specific, written prior permission. + +AT&T and Bellcore disclaim all warranties with regard to this +software, including all implied warranties of merchantability +and fitness. In no event shall AT&T or Bellcore be liable for +any special, indirect or consequential damages or any damages +whatsoever resulting from loss of use, data or profits, whether +in an action of contract, negligence or other tortious action, +arising out of or in connection with the use or performance of +this software. +****************************************************************/ + +#ifndef CRAY +#define STACKMIN 512 +#define MINBLK (2*sizeof(struct mem) + 16) +#define MSTUFF _malloc_stuff_ +#define F MSTUFF.free +#define B MSTUFF.busy +#define SBGULP 8192 +void *memcpy(); + +struct mem { + struct mem *next; + unsigned len; + }; + +struct { + struct mem *free; + char *busy; + } MSTUFF; + +char * +malloc(size) +register unsigned size; +{ + struct mem *p, *q, *r, *s; + unsigned k, m; + extern char *sbrk(); + char *top, *top1; + + size = (size+7) & ~7; + r = (struct mem *) &F; + for (p = F, q = 0; p; r = p, p = p->next) { + if ((k = p->len) >= size && (!q || m > k)) { m = k; q = p; s = r; } + } + if (q) { + if (q->len - size >= MINBLK) { /* split block */ + p = (struct mem *) (((char *) (q+1)) + size); + p->next = q->next; + p->len = q->len - size - sizeof(struct mem); + s->next = p; + q->len = size; + } + else s->next = q->next; + } + else { + top = B ? B : sbrk(0); + if (F && (char *)(F+1) + F->len == B) + { q = F; F = F->next; } + else q = (struct mem *) top; + top1 = (char *)(q+1) + size; + if (top1 > top) { + if (sbrk(top1-top+SBGULP) == (char *) -1) + return 0; + r = (struct mem *)top1; + r->len = SBGULP - sizeof(struct mem); + r->next = F; + F = r; + top1 += SBGULP; + } + q->len = size; + B = top1; + } + return (char *) (q+1); + } + +free(f) +char *f; +{ + struct mem *p, *q, *r; + char *pn, *qn; + + if (!f) return; + q = (struct mem *) (f - sizeof(struct mem)); + qn = f + q->len; + for (p = F, r = (struct mem *) &F; ; r = p, p = p->next) { + if (qn == (char *) p) { + q->len += p->len + sizeof(struct mem); + p = p->next; + } + pn = p ? ((char *) (p+1)) + p->len : 0; + if (pn == (char *) q) { + p->len += sizeof(struct mem) + q->len; + q->len = 0; + q->next = p; + r->next = p; + break; + } + if (pn < (char *) q) { + r->next = q; + q->next = p; + break; + } + } + } + +char * +realloc(f, size) +char *f; +unsigned size; +{ + struct mem *p; + char *q, *f1; + unsigned s1; + + if (!f) return malloc(size); + p = (struct mem *) (f - sizeof(struct mem)); + s1 = p->len; + free(f); + if (s1 > size) s1 = size + 7 & ~7; + if (!p->len) { + f1 = (char *)(p->next + 1); + memcpy(f1, f, s1); + f = f1; + } + q = malloc(size); + if (q && q != f) + memcpy(q, f, s1); + return q; + } +#endif diff --git a/sources/f2c/mem.c b/sources/f2c/mem.c new file mode 100644 index 0000000..2f9365b --- /dev/null +++ b/sources/f2c/mem.c @@ -0,0 +1,222 @@ +/**************************************************************** +Copyright 1990 by AT&T Bell Laboratories and Bellcore. + +Permission to use, copy, modify, and distribute this software +and its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the names of AT&T Bell Laboratories or +Bellcore or any of their entities not be used in advertising or +publicity pertaining to distribution of the software without +specific, written prior permission. + +AT&T and Bellcore disclaim all warranties with regard to this +software, including all implied warranties of merchantability +and fitness. In no event shall AT&T or Bellcore be liable for +any special, indirect or consequential damages or any damages +whatsoever resulting from loss of use, data or profits, whether +in an action of contract, negligence or other tortious action, +arising out of or in connection with the use or performance of +this software. +****************************************************************/ + +#include +#include "iob.h" +#include "string.h" + +#define MEMBSIZE 32000 +#define GMEMBSIZE 16000 + + extern char *Alloc(); + extern void exit(); + + char * +gmem(n, round) + int n, round; +{ + static char *last, *next; + char *rv; + if (round) + next = +#ifdef CRAY + (long)next & 0xe000000000000000 + ? (char *)(((long)next & 0x1fffffffffffffff) + 1) + : next; +#else + (char *)(((long)next + sizeof(char *)-1) + & ~(sizeof(char *)-1)); +#endif + rv = next; + if ((next += n) > last) { + rv = Alloc(n + GMEMBSIZE); + + next = rv + n; + last = next + GMEMBSIZE; + } + return rv; + } + + struct memblock { + struct memblock *next; + char buf[MEMBSIZE]; + }; + typedef struct memblock memblock; + + static memblock mem0; + memblock *curmemblock = &mem0, *firstmemblock = &mem0; + + char *mem_first = mem0.buf, + *mem_next = mem0.buf, + *mem_last = mem0.buf + sizeof(mem0.buf), + *mem0_last = mem0.buf + sizeof(mem0.buf); + + char * +mem(n, round) + int n, round; +{ + memblock *b; + register char *rv, *s; + + if (round) + mem_next = +#ifdef CRAY + (long)mem_next & 0xe000000000000000 + ? (char *)(((long)mem_next & 0x1fffffffffffffff) + 1) + : mem_next; +#else + (char *)(((long)mem_next + sizeof(char *)-1) + & ~(sizeof(char *)-1)); +#endif + rv = mem_next; + s = rv + n; + if (s >= mem_last) { + if (n > sizeof(mem0.buf)) { + fprintf(stderr, "mem(%d) failure!\n", n); + exit(1); + } + if (!(b = curmemblock->next)) { + b = (memblock *)Alloc(sizeof(memblock)); + curmemblock->next = b; + b->next = 0; + } + curmemblock = b; + rv = b->buf; + mem_last = rv + sizeof(b->buf); + s = rv + n; + } + mem_next = s; + return rv; + } + + char * +tostring(s,n) + register char *s; + int n; +{ + register char *s1, *se, **sf; + extern char *str_fmt[]; + char *rv, *s0, *s2; + register int k = n + 2, t; + + sf = str_fmt; + sf['%'] = "%"; + s0 = s; + se = s + n; + for(; s < se; s++) { + t = *(unsigned char *)s; + s1 = sf[t < 127 ? t : 127]; + while(*++s1) + k++; + } + rv = s1 = mem(k,0); + *s1++ = '"'; + for(s = s0; s < se; s++) { + t = *(unsigned char *)s; + if (t < 127) + for(s2 = sf[t]; *s1 = *s2++; s1++); + else { + sprintf(s1, sf[127], t); + s1 += strlen(s1); + } + } + *s1 = 0; + sf['%'] = "%%"; + return rv; + } + + char * +cpstring(s) + register char *s; +{ + return strcpy(mem(strlen(s)+1,0), s); + } + + void +new_iob_data(ios, name) + register io_setup *ios; + char *name; +{ + register iob_data *iod; + register char **s, **se; + + iod = (iob_data *) + mem(sizeof(iob_data) + ios->nelt*sizeof(char *), 1); + iod->next = iob_list; + iob_list = iod; + iod->type = ios->fields[0]; + iod->name = cpstring(name); + s = iod->fields; + se = s + ios->nelt; + while(s < se) + *s++ = "0"; + *s = 0; + } + + char * +string_num(pfx, n) + char *pfx; + long n; +{ + char buf[32]; + sprintf(buf, "%s%ld", pfx, n); + /* can't trust return type of sprintf -- BSD gets it wrong */ + return strcpy(mem(strlen(buf)+1,0), buf); + } + +static defines *define_list; + + void +def_start(outfile, s1, s2, post) + FILE *outfile; + char *s1, *s2, *post; +{ + defines *d; + int n, n1; + + n = n1 = strlen(s1); + if (s2) + n += strlen(s2); + d = (defines *)mem(sizeof(defines)+n, 1); + d->next = define_list; + define_list = d; + strcpy(d->defname, s1); + if (s2) + strcpy(d->defname + n1, s2); + nice_printf(outfile, "#define %s %s", d->defname, post); + } + + void +other_undefs(outfile) + FILE *outfile; +{ + defines *d; + if (d = define_list) { + define_list = 0; + nice_printf(outfile, "\n"); + do + nice_printf(outfile, "#undef %s\n", d->defname); + while(d = d->next); + nice_printf(outfile, "\n"); + } + } diff --git a/sources/f2c/memset.c b/sources/f2c/memset.c new file mode 100644 index 0000000..98a7ce7 --- /dev/null +++ b/sources/f2c/memset.c @@ -0,0 +1,66 @@ +/**************************************************************** +Copyright 1990 by AT&T Bell Laboratories and Bellcore. + +Permission to use, copy, modify, and distribute this software +and its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the names of AT&T Bell Laboratories or +Bellcore or any of their entities not be used in advertising or +publicity pertaining to distribution of the software without +specific, written prior permission. + +AT&T and Bellcore disclaim all warranties with regard to this +software, including all implied warranties of merchantability +and fitness. In no event shall AT&T or Bellcore be liable for +any special, indirect or consequential damages or any damages +whatsoever resulting from loss of use, data or profits, whether +in an action of contract, negligence or other tortious action, +arising out of or in connection with the use or performance of +this software. +****************************************************************/ + +/* This is for the benefit of people whose systems don't provide + * memset, memcpy, and memcmp. If yours is such a system, adjust + * the makefile by adding memset.o to the "OBJECTS =" assignment. + * WARNING: the memcpy below is adequate for f2c, but is not a + * general memcpy routine (which must correctly handle overlapping + * fields). + */ + + int +memcmp(s1, s2, n) + register char *s1, *s2; + int n; +{ + register char *se; + + for(se = s1 + n; s1 < se; s1++, s2++) + if (*s1 != *s2) + return *s1 - *s2; + return 0; + } + + char * +memcpy(s1, s2, n) + register char *s1, *s2; + int n; +{ + register char *s0 = s1, *se = s1 + n; + + while(s1 < se) + *s1++ = *s2++; + return s0; + } + +memset(s, c, n) + register char *s; + register int c; + int n; +{ + register char *se = s + n; + + while(s < se) + *s++ = c; + } diff --git a/sources/f2c/misc.c b/sources/f2c/misc.c new file mode 100644 index 0000000..8a72c1e --- /dev/null +++ b/sources/f2c/misc.c @@ -0,0 +1,1050 @@ +/**************************************************************** +Copyright 1990 by AT&T Bell Laboratories and Bellcore. + +Permission to use, copy, modify, and distribute this software +and its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the names of AT&T Bell Laboratories or +Bellcore or any of their entities not be used in advertising or +publicity pertaining to distribution of the software without +specific, written prior permission. + +AT&T and Bellcore disclaim all warranties with regard to this +software, including all implied warranties of merchantability +and fitness. In no event shall AT&T or Bellcore be liable for +any special, indirect or consequential damages or any damages +whatsoever resulting from loss of use, data or profits, whether +in an action of contract, negligence or other tortious action, +arising out of or in connection with the use or performance of +this software. +****************************************************************/ + +#include "defs.h" + +int oneof_stg (name, stg, mask) + Namep name; + int stg, mask; +{ + if (stg == STGCOMMON && name) { + if ((mask & M(STGEQUIV))) + return name->vcommequiv; + if ((mask & M(STGCOMMON))) + return !name->vcommequiv; + } + return ONEOF(stg, mask); + } + + +/* op_assign -- given a binary opcode, return the associated assignment + operator */ + +int op_assign (opcode) +int opcode; +{ + int retval = -1; + + switch (opcode) { + case OPPLUS: retval = OPPLUSEQ; break; + case OPMINUS: retval = OPMINUSEQ; break; + case OPSTAR: retval = OPSTAREQ; break; + case OPSLASH: retval = OPSLASHEQ; break; + case OPMOD: retval = OPMODEQ; break; + case OPLSHIFT: retval = OPLSHIFTEQ; break; + case OPRSHIFT: retval = OPRSHIFTEQ; break; + case OPBITAND: retval = OPBITANDEQ; break; + case OPBITXOR: retval = OPBITXOREQ; break; + case OPBITOR: retval = OPBITOREQ; break; + default: + erri ("op_assign: bad opcode '%d'", opcode); + break; + } /* switch */ + + return retval; +} /* op_assign */ + + + char * +Alloc(n) /* error-checking version of malloc */ + /* ckalloc initializes memory to 0; Alloc does not */ + int n; +{ + extern char *malloc(); + char errbuf[32]; + register char *rv; + + rv = malloc(n); + if (!rv) { + sprintf(errbuf, "malloc(%d) failure!", n); + Fatal(errbuf); + } + return rv; + } + + +cpn(n, a, b) +register int n; +register char *a, *b; +{ + while(--n >= 0) + *b++ = *a++; +} + + + +eqn(n, a, b) +register int n; +register char *a, *b; +{ + while(--n >= 0) + if(*a++ != *b++) + return(NO); + return(YES); +} + + + + + + + +cmpstr(a, b, la, lb) /* compare two strings */ +register char *a, *b; +ftnint la, lb; +{ + register char *aend, *bend; + aend = a + la; + bend = b + lb; + + + if(la <= lb) + { + while(a < aend) + if(*a != *b) + return( *a - *b ); + else + { + ++a; + ++b; + } + + while(b < bend) + if(*b != ' ') + return(' ' - *b); + else + ++b; + } + + else + { + while(b < bend) + if(*a != *b) + return( *a - *b ); + else + { + ++a; + ++b; + } + while(a < aend) + if(*a != ' ') + return(*a - ' '); + else + ++a; + } + return(0); +} + + +/* hookup -- Same as LISP NCONC, that is a destructive append of two lists */ + +chainp hookup(x,y) +register chainp x, y; +{ + register chainp p; + + if(x == NULL) + return(y); + + for(p = x ; p->nextp ; p = p->nextp) + ; + p->nextp = y; + return(x); +} + + + +struct Listblock *mklist(p) +chainp p; +{ + register struct Listblock *q; + + q = ALLOC(Listblock); + q->tag = TLIST; + q->listp = p; + return(q); +} + + +chainp mkchain(p,q) +register char * p; +register chainp q; +{ + register chainp r; + + if(chains) + { + r = chains; + chains = chains->nextp; + } + else + r = ALLOC(Chain); + + r->datap = p; + r->nextp = q; + return(r); +} + + chainp +revchain(next) + register chainp next; +{ + register chainp p, prev = 0; + + while(p = next) { + next = p->nextp; + p->nextp = prev; + prev = p; + } + return prev; + } + + +/* addunder -- turn a cvarname into an external name */ +/* The cvarname may already end in _ (to avoid C keywords); */ +/* if not, it has room for appending an _. */ + + char * +addunder(s) + register char *s; +{ + register int c, i; + char *s0 = s; + + i = 0; + while(c = *s++) + if (c == '_') + i++; + else + i = 0; + if (!i) { + *s-- = 0; + *s = '_'; + } + return( s0 ); + } + + +/* copyn -- return a new copy of the input Fortran-string */ + +char *copyn(n, s) +register int n; +register char *s; +{ + register char *p, *q; + + p = q = (char *) Alloc(n); + while(--n >= 0) + *q++ = *s++; + return(p); +} + + + +/* copys -- return a new copy of the input C-string */ + +char *copys(s) +char *s; +{ + return( copyn( strlen(s)+1 , s) ); +} + + + +/* convci -- Convert Fortran-string to integer; assumes that input is a + legal number, with no trailing blanks */ + +ftnint convci(n, s) +register int n; +register char *s; +{ + ftnint sum; + sum = 0; + while(n-- > 0) + sum = 10*sum + (*s++ - '0'); + return(sum); +} + +/* convic - Convert Integer constant to string */ + +char *convic(n) +ftnint n; +{ + static char s[20]; + register char *t; + + s[19] = '\0'; + t = s+19; + + do { + *--t = '0' + n%10; + n /= 10; + } while(n > 0); + + return(t); +} + + + +/* mkname -- add a new identifier to the environment, including the closed + hash table. There is a BAD assumption that strlen (s) < VL */ + +Namep mkname(s) +register char *s; +{ + struct Hashentry *hp; + register Namep q; + register int c, hash, i; + register char *t; + char *s0; + char errbuf[64]; + + hash = i = 0; + s0 = s; + while(c = *s++) { + hash += c; + if (c == '_') + i = 1; + } + hash %= maxhash; + +/* Add the name to the closed hash table */ + + hp = hashtab + hash; + + while(q = hp->varp) + if( hash == hp->hashval && !strcmp(s0,q->fvarname) ) + return(q); + else if(++hp >= lasthash) + hp = hashtab; + + if(++nintnames >= maxhash-1) + many("names", 'n', maxhash); /* Fatal error */ + hp->varp = q = ALLOC(Nameblock); + hp->hashval = hash; + q->tag = TNAME; /* TNAME means the tag type is NAME */ + c = s - s0; + if (c > 7 && noextflag) { + sprintf(errbuf, "\"%.35s%s\" over 6 characters long", s0, + c > 36 ? "..." : ""); + errext(errbuf); + } + q->fvarname = strcpy(mem(c,0), s0); + t = q->cvarname = mem(c + i + 1, 0); + s = s0; + /* add __ to the end of any name containing _ */ + while(*t = *s++) + t++; + if (i) { + t[0] = t[1] = '_'; + t[2] = 0; + } + else if (in_vector(s0) >= 0) { + t[0] = '_'; + t[1] = 0; + } + return(q); +} + + +struct Labelblock *mklabel(l) +ftnint l; +{ + register struct Labelblock *lp; + + if(l <= 0) + return(NULL); + + for(lp = labeltab ; lp < highlabtab ; ++lp) + if(lp->stateno == l) + return(lp); + + if(++highlabtab > labtabend) + many("statement labels", 's', maxstno); + + lp->stateno = l; + lp->labelno = newlabel(); + lp->blklevel = 0; + lp->labused = NO; + lp->fmtlabused = NO; + lp->labdefined = NO; + lp->labinacc = NO; + lp->labtype = LABUNKNOWN; + lp->fmtstring = 0; + return(lp); +} + + +newlabel() +{ + return( ++lastlabno ); +} + + +/* this label appears in a branch context */ + +struct Labelblock *execlab(stateno) +ftnint stateno; +{ + register struct Labelblock *lp; + + if(lp = mklabel(stateno)) + { + if(lp->labinacc) + warn1("illegal branch to inner block, statement label %s", + convic(stateno) ); + else if(lp->labdefined == NO) + lp->blklevel = blklevel; + if(lp->labtype == LABFORMAT) + err("may not branch to a format"); + else + lp->labtype = LABEXEC; + } + else + execerr("illegal label %s", convic(stateno)); + + return(lp); +} + + +/* find or put a name in the external symbol table */ + +Extsym *mkext(f,s) +char *f, *s; +{ + Extsym *p; + + for(p = extsymtab ; pcextname)) + return( p ); + + if(nextext >= lastext) + many("external symbols", 'x', maxext); + + nextext->fextname = strcpy(gmem(strlen(f)+1,0), f); + nextext->cextname = f == s + ? nextext->fextname + : strcpy(gmem(strlen(s)+1,0), s); + nextext->extstg = STGUNKNOWN; + nextext->extp = 0; + nextext->allextp = 0; + nextext->extleng = 0; + nextext->maxleng = 0; + nextext->extinit = 0; + nextext->curno = nextext->maxno = 0; + return( nextext++ ); +} + + +Addrp builtin(t, s, dbi) +int t, dbi; +char *s; +{ + register Extsym *p; + register Addrp q; + extern chainp used_builtins; + + p = mkext(s,s); + if(p->extstg == STGUNKNOWN) + p->extstg = STGEXT; + else if(p->extstg != STGEXT) + { + errstr("improper use of builtin %s", s); + return(0); + } + + q = ALLOC(Addrblock); + q->tag = TADDR; + q->vtype = t; + q->vclass = CLPROC; + q->vstg = STGEXT; + q->memno = p - extsymtab; + q->dbl_builtin = dbi; + +/* A NULL pointer here tells you to use memno to check the external + symbol table */ + + q -> uname_tag = UNAM_EXTERN; + +/* Add to the list of used builtins */ + + if (dbi >= 0) + add_extern_to_list (q, &used_builtins); + return(q); +} + + + +add_extern_to_list (addr, list_store) +Addrp addr; +chainp *list_store; +{ + chainp last = CHNULL; + chainp list; + int memno; + + if (list_store == (chainp *) NULL || addr == (Addrp) NULL) + return; + + list = *list_store; + memno = addr -> memno; + + for (;list; last = list, list = list -> nextp) { + Addrp this = (Addrp) (list -> datap); + + if (this -> tag == TADDR && this -> uname_tag == UNAM_EXTERN && + this -> memno == memno) + return; + } /* for */ + + if (*list_store == CHNULL) + *list_store = mkchain((char *)cpexpr((expptr)addr), CHNULL); + else + last->nextp = mkchain((char *)cpexpr((expptr)addr), CHNULL); + +} /* add_extern_to_list */ + + +frchain(p) +register chainp *p; +{ + register chainp q; + + if(p==0 || *p==0) + return; + + for(q = *p; q->nextp ; q = q->nextp) + ; + q->nextp = chains; + chains = *p; + *p = 0; +} + + void +frexchain(p) + register chainp *p; +{ + register chainp q, r; + + if (q = *p) { + for(;;q = r) { + frexpr((expptr)q->datap); + if (!(r = q->nextp)) + break; + } + q->nextp = chains; + chains = *p; + *p = 0; + } + } + + +tagptr cpblock(n,p) +register int n; +register char * p; +{ + register ptr q; + + memcpy((char *)(q = ckalloc(n)), (char *)p, n); + return( (tagptr) q); +} + + + +max(a,b) +int a,b; +{ + return( a>b ? a : b); +} + + +ftnint lmax(a, b) +ftnint a, b; +{ + return( a>b ? a : b); +} + +ftnint lmin(a, b) +ftnint a, b; +{ + return(a < b ? a : b); +} + + + + +maxtype(t1, t2) +int t1, t2; +{ + int t; + + t = max(t1, t2); + if(t==TYCOMPLEX && (t1==TYDREAL || t2==TYDREAL) ) + t = TYDCOMPLEX; + return(t); +} + + + +/* return log base 2 of n if n a power of 2; otherwise -1 */ +log_2(n) +ftnint n; +{ + int k; + + /* trick based on binary representation */ + + if(n<=0 || (n & (n-1))!=0) + return(-1); + + for(k = 0 ; n >>= 1 ; ++k) + ; + return(k); +} + + + +frrpl() +{ + struct Rplblock *rp; + + while(rpllist) + { + rp = rpllist->rplnextp; + free( (charptr) rpllist); + rpllist = rp; + } +} + + + +/* Call a Fortran function with an arbitrary list of arguments */ + +int callk_kludge; + +expptr callk(type, name, args) +int type; +char *name; +chainp args; +{ + register expptr p; + + p = mkexpr(OPCALL, + (expptr)builtin(callk_kludge ? callk_kludge : type, name, 0), + (expptr)args); + p->exprblock.vtype = type; + return(p); +} + + + +expptr call4(type, name, arg1, arg2, arg3, arg4) +int type; +char *name; +expptr arg1, arg2, arg3, arg4; +{ + struct Listblock *args; + args = mklist( mkchain((char *)arg1, + mkchain((char *)arg2, + mkchain((char *)arg3, + mkchain((char *)arg4, CHNULL)) ) ) ); + return( callk(type, name, (chainp)args) ); +} + + + + +expptr call3(type, name, arg1, arg2, arg3) +int type; +char *name; +expptr arg1, arg2, arg3; +{ + struct Listblock *args; + args = mklist( mkchain((char *)arg1, + mkchain((char *)arg2, + mkchain((char *)arg3, CHNULL) ) ) ); + return( callk(type, name, (chainp)args) ); +} + + + + + +expptr call2(type, name, arg1, arg2) +int type; +char *name; +expptr arg1, arg2; +{ + struct Listblock *args; + + args = mklist( mkchain((char *)arg1, mkchain((char *)arg2, CHNULL) ) ); + return( callk(type,name, (chainp)args) ); +} + + + + +expptr call1(type, name, arg) +int type; +char *name; +expptr arg; +{ + return( callk(type,name, (chainp)mklist(mkchain((char *)arg,CHNULL)) )); +} + + +expptr call0(type, name) +int type; +char *name; +{ + return( callk(type, name, CHNULL) ); +} + + + +struct Impldoblock *mkiodo(dospec, list) +chainp dospec, list; +{ + register struct Impldoblock *q; + + q = ALLOC(Impldoblock); + q->tag = TIMPLDO; + q->impdospec = dospec; + q->datalist = list; + return(q); +} + + + + +/* ckalloc -- Allocate 1 memory unit of size n, checking for out of + memory error */ + +ptr ckalloc(n) +register int n; +{ + register ptr p; + char *calloc(); + if( p = (ptr)calloc(1, (unsigned) n) ) + return(p); + fprintf(stderr, "failing to get %d bytes\n",n); + Fatal("out of memory"); + /* NOT REACHED */ return 0; +} + + + +isaddr(p) +register expptr p; +{ + if(p->tag == TADDR) + return(YES); + if(p->tag == TEXPR) + switch(p->exprblock.opcode) + { + case OPCOMMA: + return( isaddr(p->exprblock.rightp) ); + + case OPASSIGN: + case OPASSIGNI: + case OPPLUSEQ: + case OPMINUSEQ: + case OPSLASHEQ: + case OPMODEQ: + case OPLSHIFTEQ: + case OPRSHIFTEQ: + case OPBITANDEQ: + case OPBITXOREQ: + case OPBITOREQ: + return( isaddr(p->exprblock.leftp) ); + } + return(NO); +} + + + + +isstatic(p) +register expptr p; +{ + if(p->headblock.vleng && !ISCONST(p->headblock.vleng)) + return(NO); + + switch(p->tag) + { + case TCONST: + return(YES); + + case TADDR: + if(ONEOF(p->addrblock.vstg,MSKSTATIC) && + ISCONST(p->addrblock.memoffset)) + return(YES); + + default: + return(NO); + } +} + + + +/* addressable -- return True iff it is a constant value, or can be + referenced by constant values */ + +addressable(p) +register expptr p; +{ + switch(p->tag) + { + case TCONST: + return(YES); + + case TADDR: + return( addressable(p->addrblock.memoffset) ); + + default: + return(NO); + } +} + + +/* isnegative_const -- returns true if the constant is negative. Returns + false for imaginary and nonnumeric constants */ + +int isnegative_const (cp) +struct Constblock *cp; +{ + int retval; + + if (cp == NULL) + return 0; + + switch (cp -> vtype) { + case TYSHORT: + case TYLONG: + retval = cp -> Const.ci < 0; + break; + case TYREAL: + case TYDREAL: + retval = cp->vstg ? *cp->Const.cds[0] == '-' + : cp->Const.cd[0] < 0.0; + break; + default: + + retval = 0; + break; + } /* switch */ + + return retval; +} /* isnegative_const */ + +negate_const(cp) + Constp cp; +{ + if (cp == (struct Constblock *) NULL) + return; + + switch (cp -> vtype) { + case TYSHORT: + case TYLONG: + cp -> Const.ci = - cp -> Const.ci; + break; + case TYCOMPLEX: + case TYDCOMPLEX: + if (cp->vstg) + switch(*cp->Const.cds[1]) { + case '-': + ++cp->Const.cds[1]; + break; + case '0': + break; + default: + --cp->Const.cds[1]; + } + else + cp->Const.cd[1] = -cp->Const.cd[1]; + /* no break */ + case TYREAL: + case TYDREAL: + if (cp->vstg) + switch(*cp->Const.cds[0]) { + case '-': + ++cp->Const.cds[0]; + break; + case '0': + break; + default: + --cp->Const.cds[0]; + } + else + cp->Const.cd[0] = -cp->Const.cd[0]; + break; + case TYCHAR: + case TYLOGICAL: + erri ("negate_const: can't negate type '%d'", cp -> vtype); + break; + default: + erri ("negate_const: bad type '%d'", + cp -> vtype); + break; + } /* switch */ +} /* negate_const */ + +ffilecopy (infp, outfp) +FILE *infp, *outfp; +{ + while (!feof (infp)) { + register c = getc (infp); + if (!feof (infp)) + putc (c, outfp); + } /* while */ +} /* ffilecopy */ + + +#define NOT_IN_VECTOR -1 + +/* in_vector -- verifies whether str is in c_keywords. + If so, the index is returned else NOT_IN_VECTOR is returned. + c_keywords must be in alphabetical order (as defined by strcmp). +*/ + +int in_vector(str) +char *str; +{ + extern int n_keywords; + extern char *c_keywords[]; + register int n = n_keywords; + register char **K = c_keywords; + register int n1, t; + extern int strcmp(); + + do { + n1 = n >> 1; + if (!(t = strcmp(str, K[n1]))) + return K - c_keywords + n1; + if (t < 0) + n = n1; + else { + n -= ++n1; + K += n1; + } + } + while(n > 0); + + return NOT_IN_VECTOR; + } /* in_vector */ + + +int is_negatable (Const) +Constp Const; +{ + int retval = 0; + if (Const != (Constp) NULL) + switch (Const -> vtype) { + case TYSHORT: + retval = Const -> Const.ci >= -BIGGEST_SHORT; + break; + case TYLONG: + retval = Const -> Const.ci >= -BIGGEST_LONG; + break; + case TYREAL: + case TYDREAL: + case TYCOMPLEX: + case TYDCOMPLEX: + retval = 1; + break; + case TYLOGICAL: + case TYCHAR: + case TYSUBR: + default: + retval = 0; + break; + } /* switch */ + + return retval; +} /* is_negatable */ + +backup(fname, bname) + char *fname, *bname; +{ + FILE *b, *f; + static char couldnt[] = "Couldn't open %.80s"; + + if (!(f = fopen(fname, binread))) { + warn1(couldnt, fname); + return; + } + if (!(b = fopen(bname, binwrite))) { + warn1(couldnt, bname); + return; + } + ffilecopy(f, b); + fclose(f); + fclose(b); + } + + +/* struct_eq -- returns YES if structures have the same field names and + types, NO otherwise */ + +int struct_eq (s1, s2) +chainp s1, s2; +{ + struct Dimblock *d1, *d2; + Constp cp1, cp2; + + if (s1 == CHNULL && s2 == CHNULL) + return YES; + for(; s1 && s2; s1 = s1->nextp, s2 = s2->nextp) { + register Namep v1 = (Namep) s1 -> datap; + register Namep v2 = (Namep) s2 -> datap; + + if (v1 == (Namep) NULL || v1 -> tag != TNAME || + v2 == (Namep) NULL || v2 -> tag != TNAME) + return NO; + + if (v1->vtype != v2->vtype || v1->vclass != v2->vclass + || strcmp(v1->fvarname, v2->fvarname)) + return NO; + + /* compare dimensions (needed for comparing COMMON blocks) */ + + if (d1 = v1->vdim) { + if (!(cp1 = (Constp)d1->nelt) || cp1->tag != TCONST) + return NO; + if (!(d2 = v2->vdim)) + if (cp1->Const.ci == 1) + continue; + else + return NO; + if (!(cp2 = (Constp)d2->nelt) || cp2->tag != TCONST + || cp1->Const.ci != cp2->Const.ci) + return NO; + } + else if ((d2 = v2->vdim) && (!(cp2 = (Constp)d2->nelt) + || cp2->tag != TCONST + || cp2->Const.ci != 1)) + return NO; + } /* while s1 != CHNULL && s2 != CHNULL */ + + return s1 == CHNULL && s2 == CHNULL; +} /* struct_eq */ diff --git a/sources/f2c/names.c b/sources/f2c/names.c new file mode 100644 index 0000000..f685424 --- /dev/null +++ b/sources/f2c/names.c @@ -0,0 +1,688 @@ +/**************************************************************** +Copyright 1990 by AT&T Bell Laboratories and Bellcore. + +Permission to use, copy, modify, and distribute this software +and its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the names of AT&T Bell Laboratories or +Bellcore or any of their entities not be used in advertising or +publicity pertaining to distribution of the software without +specific, written prior permission. + +AT&T and Bellcore disclaim all warranties with regard to this +software, including all implied warranties of merchantability +and fitness. In no event shall AT&T or Bellcore be liable for +any special, indirect or consequential damages or any damages +whatsoever resulting from loss of use, data or profits, whether +in an action of contract, negligence or other tortious action, +arising out of or in connection with the use or performance of +this software. +****************************************************************/ + +#include "defs.h" +#include "output.h" +#include "names.h" +#include "iob.h" + + +/* Names generated by the translator are guaranteed to be unique from the + Fortan names because Fortran does not allow underscores in identifiers, + and all of the system generated names do have underscores. The various + naming conventions are outlined below: + + FORMAT APPLICATION + ---------------------------------------------------------------------- + io_# temporaries generated by IO calls; these will + contain the device number (e.g. 5, 6, 0) + ret_val function return value, required for complex and + character functions. + ret_val_len length of the return value in character functions + + ssss_len length of character argument "ssss" + + c_# member of the literal pool, where # is an + arbitrary label assigned by the system + cs_# short integer constant in the literal pool + t_# expression temporary, # is the depth of arguments + on the stack. + L# label "#", given by user in the Fortran program. + This is unique because Fortran labels are numeric + pad_# label on an init field required for alignment + xxx_init label on a common block union, if a block data + requires a separate declaration +*/ + +/* generate variable references */ + +char *c_type_decl (type, is_extern) +int type, is_extern; +{ + static char buff[100]; + + switch (type) { + case TYADDR: strcpy (buff, "address"); break; + case TYSHORT: strcpy (buff, "shortint"); break; + case TYLONG: strcpy (buff, "integer"); break; + case TYREAL: if (!is_extern || !forcedouble) + { strcpy (buff, "real");break; } + case TYDREAL: strcpy (buff, "doublereal"); break; + case TYCOMPLEX: if (is_extern) + strcpy (buff, Ansi ? "/* Complex */ VOID" + : "/* Complex */ int"); + else + strcpy (buff, "complex"); + break; + case TYDCOMPLEX:if (is_extern) + strcpy (buff, Ansi ? "/* Double Complex */ VOID" + : "/* Double Complex */ int"); + else + strcpy (buff, "doublecomplex"); + break; + case TYLOGICAL: strcpy(buff, typename[TYLOGICAL]); + break; + case TYCHAR: if (is_extern) + strcpy (buff, Ansi ? "/* Character */ VOID" + : "/* Character */ int"); + else + strcpy (buff, "char"); + break; + + case TYUNKNOWN: strcpy (buff, "UNKNOWN"); + +/* If a procedure's type is unknown, assume it's a subroutine */ + + if (!is_extern) + break; + +/* Subroutines must return an INT, because they might return a label + value. Even if one doesn't, the caller will EXPECT it to. */ + + case TYSUBR: strcpy (buff, "/* Subroutine */ int"); + break; + case TYERROR: strcpy (buff, "ERROR"); break; + case TYVOID: strcpy (buff, "void"); break; + case TYCILIST: strcpy (buff, "cilist"); break; + case TYICILIST: strcpy (buff, "icilist"); break; + case TYOLIST: strcpy (buff, "olist"); break; + case TYCLLIST: strcpy (buff, "cllist"); break; + case TYALIST: strcpy (buff, "alist"); break; + case TYINLIST: strcpy (buff, "inlist"); break; + case TYFTNLEN: strcpy (buff, "ftnlen"); break; + default: sprintf (buff, "BAD DECL '%d'", type); + break; + } /* switch */ + + return buff; +} /* c_type_decl */ + + +char *new_func_length() +{ return "ret_val_len"; } + +char *new_arg_length(arg) + Namep arg; +{ + static char buf[64]; + sprintf (buf, "%s_len", arg->fvarname); + + return buf; +} /* new_arg_length */ + + +/* declare_new_addr -- Add a new local variable to the function, given a + pointer to an Addrblock structure (which must have the uname_tag set) + This list of idents will be printed in reverse (i.e., chronological) + order */ + + void +declare_new_addr (addrp) +struct Addrblock *addrp; +{ + extern chainp new_vars; + + new_vars = mkchain((char *)cpexpr((expptr)addrp), new_vars); +} /* declare_new_addr */ + + +wr_nv_ident_help (outfile, addrp) +FILE *outfile; +struct Addrblock *addrp; +{ + int eltcount = 0; + + if (addrp == (struct Addrblock *) NULL) + return; + + if (addrp -> isarray) { + frexpr (addrp -> memoffset); + addrp -> memoffset = ICON(0); + eltcount = addrp -> ntempelt; + addrp -> ntempelt = 0; + addrp -> isarray = 0; + } /* if */ + out_addr (outfile, addrp); + if (eltcount) + nice_printf (outfile, "[%d]", eltcount); +} /* wr_nv_ident_help */ + +int nv_type_help (addrp) +struct Addrblock *addrp; +{ + if (addrp == (struct Addrblock *) NULL) + return -1; + + return addrp -> vtype; +} /* nv_type_help */ + + +/* lit_name -- returns a unique identifier for the given literal. Make + the label useful, when possible. For example: + + 1 -> c_1 (constant 1) + 2 -> c_2 (constant 2) + 1000 -> c_1000 (constant 1000) + 1000000 -> c_b (big constant number) + 1.2 -> c_1_2 (constant 1.2) + 1.234345 -> c_b (big constant number) + -1 -> c_n1 (constant -1) + -1.0 -> c_n1_0 (constant -1.0) + .true. -> c_true (constant true) + .false. -> c_false (constant false) + default -> c_b (default label) +*/ + +char *lit_name (litp) +struct Literal *litp; +{ + static char buf[CONST_IDENT_MAX]; + + if (litp == (struct Literal *) NULL) + return NULL; + + switch (litp -> littype) { + case TYSHORT: + if (litp -> litval.litival < 32768 && + litp -> litval.litival > -32769) { + ftnint val = litp -> litval.litival; + + if (val < 0) + sprintf (buf, "cs_n%ld", -val); + else + sprintf (buf, "cs__%ld", val); + } else + sprintf (buf, "c_b%d", litp -> litnum); + break; + case TYLONG: + if (litp -> litval.litival < 100000 && + litp -> litval.litival > -10000) { + ftnint val = litp -> litval.litival; + + if (val < 0) + sprintf (buf, "c_n%ld", -val); + else + sprintf (buf, "c__%ld", val); + } else + sprintf (buf, "c_b%d", litp -> litnum); + break; + case TYLOGICAL: + sprintf (buf, "c_%s", (litp -> litval.litival ? "true" : "false")); + break; + case TYREAL: + case TYDREAL: + /* Given a limit of 6 or 8 character on external names, */ + /* few f.p. values can be meaningfully encoded in the */ + /* constant name. Just going with the default cb_# */ + /* seems to be the best course for floating-point */ + /* constants. */ + case TYCHAR: + /* Shouldn't be any of these */ + case TYADDR: + case TYCOMPLEX: + case TYDCOMPLEX: + case TYSUBR: + default: + sprintf (buf, "c_b%d", litp -> litnum); + break; + } /* switch */ + return buf; +} /* lit_name */ + + + + char * +comm_union_name(count) + int count; +{ + static char buf[12]; + + sprintf(buf, "%d", count); + return buf; + } + + + + +/* wr_globals -- after every function has been translated, we need to + output the global declarations, such as the static table of constant + values */ + +wr_globals (outfile) +FILE *outfile; +{ + struct Literal *litp, *lastlit; + extern struct Literal litpool[]; /* Table of constant values */ + extern int nliterals; /* Number of constants in table */ + extern char *lit_name (); + int did_one, t; + struct Constblock cb; + + if (nliterals == 0) + return; + + lastlit = litpool + nliterals; + did_one = 0; + for (litp = litpool; litp < lastlit; litp++) { + if (!litp->lituse) + continue; + if (!did_one) { + margin_printf(outfile, "/* Table of constant values */\n\n"); + did_one = 1; + } + nice_printf (outfile, "static %s %s%s = ", c_type_decl (litp -> littype, + 0), litp -> littype == TYCHAR ? "*" : "", lit_name (litp)); + + t = litp->littype; + if (ONEOF(t, MSKREAL|MSKCOMPLEX)) { + cb.vstg = 1; + cb.Const.cds[0] = litp->cds[0]; + cb.Const.cds[1] = litp->cds[1]; + } + else { + memcpy((char *)&cb.Const, (char *)&litp->litval, + sizeof(cb.Const)); + cb.vstg = 0; + } + cb.vtype = litp->littype; + out_const (outfile, &cb); + + nice_printf (outfile, ";\n"); + } /* for */ + if (did_one) + nice_printf (outfile, "\n"); +} /* wr_globals */ + + ftnint +commlen(vl) + register chainp vl; +{ + ftnint size; + int type; + struct Dimblock *t; + Namep v; + + while(vl->nextp) + vl = vl->nextp; + v = (Namep)vl->datap; + type = v->vtype; + if (type == TYCHAR) + size = v->vleng->constblock.Const.ci; + else + size = typesize[type]; + if ((t = v->vdim) && ISCONST(t->nelt)) + size *= t->nelt->constblock.Const.ci; + return size + v->voffset; + } + + static void /* Pad common block if an EQUIVALENCE extended it. */ +pad_common(c) + Extsym *c; +{ + register chainp cvl; + register Namep v; + long L = c->maxleng; + int type; + struct Dimblock *t; + int szshort = typesize[TYSHORT]; + + for(cvl = c->allextp; cvl; cvl = cvl->nextp) + if (commlen((chainp)cvl->datap) >= L) + return; + v = ALLOC(Nameblock); + v->vtype = type = L % szshort ? TYCHAR + : type_choice[L/szshort % 4]; + v->vstg = STGCOMMON; + v->vclass = CLVAR; + v->tag = TNAME; + v->vdim = t = ALLOC(Dimblock); + t->ndim = 1; + t->dims[0].dimsize = ICON(L / typesize[type]); + v->fvarname = v->cvarname = "eqv_pad"; + c->allextp = mkchain((char *)mkchain((char *)v, CHNULL), c->allextp); + } + + +/* wr_common_decls -- outputs the common declarations in one of three + formats. If all references to a common block look the same (field + names and types agree), only one actual declaration will appear. + Otherwise, the same block will require many structs. If there is no + block data, these structs will be union'ed together (so the linker + knows the size of the largest one). If there IS a block data, only + that version will be associated with the variable, others will only be + defined as types, so the pointer can be cast to it. e.g. + + FORTRAN C +---------------------------------------------------------------------- + common /com1/ a, b, c struct { real a, b, c; } com1_; + + common /com1/ a, b, c union { + common /com1/ i, j, k struct { real a, b, c; } _1; + struct { integer i, j, k; } _2; + } com1_; + + common /com1/ a, b, c struct com1_1_ { real a, b, c; }; + block data struct { integer i, j, k; } com1_ = + common /com1/ i, j, k { 1, 2, 3 }; + data i/1/, j/2/, k/3/ + + + All of these versions will be followed by #defines, since the code in + the function bodies can't know ahead of time which of these options + will be taken */ + +/* Macros for deciding the output type */ + +#define ONE_STRUCT 1 +#define UNION_STRUCT 2 +#define INIT_STRUCT 3 + +wr_common_decls(outfile) + FILE *outfile; +{ + Extsym *ext; + extern int extcomm; + static char *Extern[4] = {"", "Extern ", "extern "}; + char *E, *E0 = Extern[extcomm]; + int did_one = 0; + + for (ext = extsymtab; ext < nextext; ext++) { + if (ext -> extstg == STGCOMMON && ext->allextp) { + chainp comm; + int count = 1; + int which; /* which display to use; + ONE_STRUCT, UNION or INIT */ + + if (!did_one) + nice_printf (outfile, "/* Common Block Declarations */\n\n"); + + pad_common(ext); + +/* Construct the proper, condensed list of structs; eliminate duplicates + from the initial list ext -> allextp */ + + comm = ext->allextp = revchain(ext->allextp); + + if (ext -> extinit) + which = INIT_STRUCT; + else if (comm->nextp) { + which = UNION_STRUCT; + nice_printf (outfile, "%sunion {\n", E0); + next_tab (outfile); + E = ""; + } + else { + which = ONE_STRUCT; + E = E0; + } + + for (; comm; comm = comm -> nextp, count++) { + + if (which == INIT_STRUCT) + nice_printf (outfile, "struct %s%d_ {\n", + ext->cextname, count); + else + nice_printf (outfile, "%sstruct {\n", E); + + next_tab (c_file); + + wr_struct (outfile, (chainp) comm -> datap); + + prev_tab (c_file); + if (which == UNION_STRUCT) + nice_printf (outfile, "} _%d;\n", count); + else if (which == ONE_STRUCT) + nice_printf (outfile, "} %s;\n", ext->cextname); + else + nice_printf (outfile, "};\n"); + } /* for */ + + if (which == UNION_STRUCT) { + prev_tab (c_file); + nice_printf (outfile, "} %s;\n", ext->cextname); + } /* if */ + did_one = 1; + nice_printf (outfile, "\n"); + + for (count = 1, comm = ext -> allextp; comm; + comm = comm -> nextp, count++) { + def_start(outfile, ext->cextname, + comm_union_name(count), ""); + switch (which) { + case ONE_STRUCT: + extern_out (outfile, ext); + break; + case UNION_STRUCT: + nice_printf (outfile, "("); + extern_out (outfile, ext); + nice_printf(outfile, "._%d)", count); + break; + case INIT_STRUCT: + nice_printf (outfile, "(*(struct "); + extern_out (outfile, ext); + nice_printf (outfile, "%d_ *) &", count); + extern_out (outfile, ext); + nice_printf (outfile, ")"); + break; + } /* switch */ + nice_printf (outfile, "\n"); + } /* for count = 1, comm = ext -> allextp */ + nice_printf (outfile, "\n"); + } /* if ext -> extstg == STGCOMMON */ + } /* for ext = extsymtab */ +} /* wr_common_decls */ + + +wr_struct (outfile, var_list) +FILE *outfile; +chainp var_list; +{ + int last_type = -1; + int did_one = 0; + chainp this_var; + + for (this_var = var_list; this_var; this_var = this_var -> nextp) { + Namep var = (Namep) this_var -> datap; + int type; + char *comment = NULL, *wr_ardecls (); + + if (var == (Namep) NULL) + err ("wr_struct: null variable"); + else if (var -> tag != TNAME) + erri ("wr_struct: bad tag on variable '%d'", + var -> tag); + + type = var -> vtype; + + if (last_type == type && did_one) + nice_printf (outfile, ", "); + else { + if (did_one) + nice_printf (outfile, ";\n"); + nice_printf (outfile, "%s ", + c_type_decl (type, var -> vclass == CLPROC)); + } /* else */ + +/* Character type is really a string type. Put out a '*' for parameters + with unknown length and functions returning character */ + + if (var -> vtype == TYCHAR && (!ISICON ((var -> vleng)) + || var -> vclass == CLPROC)) + nice_printf (outfile, "*"); + + var -> vstg = STGAUTO; + out_name (outfile, var); + if (var -> vclass == CLPROC) + nice_printf (outfile, "()"); + else if (var -> vdim) + comment = wr_ardecls(outfile, var->vdim, + var->vtype == TYCHAR && ISICON(var->vleng) + ? var->vleng->constblock.Const.ci : 1L); + else if (var -> vtype == TYCHAR && var -> vclass != CLPROC && + ISICON ((var -> vleng))) + nice_printf (outfile, "[%ld]", + var -> vleng -> constblock.Const.ci); + + if (comment) + nice_printf (outfile, "%s", comment); + did_one = 1; + last_type = type; + } /* for this_var */ + + if (did_one) + nice_printf (outfile, ";\n"); +} /* wr_struct */ + + +char *user_label(stateno) +ftnint stateno; +{ + static char buf[USER_LABEL_MAX + 1]; + + if (stateno >= 0) + sprintf(buf, "L%ld", stateno); + else + sprintf(buf, "L_%s", extsymtab[-1-stateno].fextname); + return buf; +} /* user_label */ + + +char *temp_name (starter, num, storage) +char *starter; +int num; +char *storage; +{ + static char buf[IDENT_LEN]; + char *pointer = buf; + char *prefix = "t"; + + if (storage) + pointer = storage; + + if (starter && *starter) + prefix = starter; + + sprintf (pointer, "%s_%d", prefix, num); + return pointer; +} /* temp_name */ + + +char *equiv_name (memno, store) +int memno; +char *store; +{ + static char buf[IDENT_LEN]; + char *pointer = buf; + + if (store) + pointer = store; + + sprintf (pointer, "%s_%d", EQUIV_INIT_NAME, memno); + return pointer; +} /* equiv_name */ + + void +def_commons(of) + FILE *of; +{ + Extsym *ext; + int c, onefile, Union; + char buf[64]; + chainp comm; + extern int ext1comm; + + if (ext1comm == 1) { + onefile = 1; + c_file = of; + fprintf(of, "/*>>>'/dev/null'<<<*/\n\ +#ifdef Define_COMMONs\n\ +/*<<>>*/\n"); + } + else + onefile = 0; + for(ext = extsymtab; ext < nextext; ext++) + if (ext->extstg == STGCOMMON && !ext->extinit) { + sprintf(buf, "%scom.c", ext->cextname); + if (onefile) + fprintf(of, "/*>>>'%s'<<<*/\n", + buf); + else { + c_file = of = fopen(buf,textwrite); + if (!of) + fatalstr("can't open %s", buf); + } + fprintf(of, "#include \"f2c.h\"\n"); + comm = ext->allextp; + if (comm->nextp) { + Union = 1; + nice_printf(of, "union {\n"); + next_tab(of); + } + else + Union = 0; + for(c = 1; comm; comm = comm->nextp) { + nice_printf(of, "struct {\n"); + next_tab(of); + wr_struct(of, (chainp)comm->datap); + prev_tab(of); + if (Union) + nice_printf(of, "} _%d;\n", c++); + } + if (Union) + prev_tab(of); + nice_printf(of, "} %s;\n", ext->cextname); + if (onefile) + fprintf(of, "/*<<<%s>>>*/\n", buf); + else + fclose(of); + } + if (onefile) + fprintf(of, "/*>>>'/dev/null'<<<*/\n#endif\n\ +/*<<>>*/\n"); + } + +/* C Language keywords. Needed to filter unwanted fortran identifiers like + * "int", etc. Source: Kernighan & Ritchie, eds. 1 and 2; Stroustrup. + * Also includes C++ keywords and types used for I/O in f2c.h . + * These keywords must be in alphabetical order (as defined by strcmp()). + */ + +char *c_keywords[] = { + "abs", "acos", "alist", "asin", "asm", "atan", "atan2", "auto", + "break", "case", "catch", "char", "cilist", "class", "cllist", + "const", "continue", "cos", "cosh", + "dabs", "default", "defined", "delete", + "dmax", "dmin", "do", "double", + "else", "entry", "enum", "exp", "extern", + "flag", "float", "for", "friend", "ftnint", "ftnlen", "goto", + "icilist", "if", "include", "inline", "inlist", "int", + "log", "long", "max", "min", "new", + "olist", "operator", "overload", "private", "protected", "public", + "register", "return", + "short", "signed", "sin", "sinh", "sizeof", "sqrt", + "static", "struct", "switch", + "tan", "tanh", "template", "this", "try", "typedef", + "union", "unsigned", "virtual", "void", "volatile", "while" +}; /* c_keywords */ + +int n_keywords = sizeof(c_keywords)/sizeof(char *); diff --git a/sources/f2c/names.h b/sources/f2c/names.h new file mode 100644 index 0000000..f80ec2f --- /dev/null +++ b/sources/f2c/names.h @@ -0,0 +1,23 @@ +#define CONST_IDENT_MAX 30 +#define IO_IDENT_MAX 30 +#define ARGUMENT_MAX 30 +#define USER_LABEL_MAX 30 + +#define EQUIV_INIT_NAME "equiv" + +#define write_nv_ident(fp,a) wr_nv_ident_help ((fp), (struct Addrblock *) (a)) +#define nv_type(x) nv_type_help ((struct Addrblock *) x) + +extern char *c_keywords[]; + +char *new_io_ident (/* char * */); +char *new_func_retval (/* char * */); +char *new_func_length (/* char * */); +char *new_arg_length (/* Namep */); +void declare_new_addr (/* struct Addrblock * */); +char *nv_ident_help (/* struct Addrblock * */); +int nv_type_help (/* struct Addrblock */); +char *user_label (/* int */); +char *temp_name (/* int, char */); +char *c_type_decl (/* int, int */); +char *equiv_name (/* int, char * */); diff --git a/sources/f2c/nicepr.c b/sources/f2c/nicepr.c new file mode 100644 index 0000000..a68178e --- /dev/null +++ b/sources/f2c/nicepr.c @@ -0,0 +1,324 @@ +/**************************************************************** +Copyright 1990 by AT&T Bell Laboratories and Bellcore. + +Permission to use, copy, modify, and distribute this software +and its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the names of AT&T Bell Laboratories or +Bellcore or any of their entities not be used in advertising or +publicity pertaining to distribution of the software without +specific, written prior permission. + +AT&T and Bellcore disclaim all warranties with regard to this +software, including all implied warranties of merchantability +and fitness. In no event shall AT&T or Bellcore be liable for +any special, indirect or consequential damages or any damages +whatsoever resulting from loss of use, data or profits, whether +in an action of contract, negligence or other tortious action, +arising out of or in connection with the use or performance of +this software. +****************************************************************/ + +#include "defs.h" +#include "names.h" +#include "output.h" + +#define TOO_LONG_INDENT (2 * tab_size) +#define MAX_INDENT 44 +#define MIN_INDENT 22 +static int last_was_newline = 0; +int indent = 0; +int in_comment = 0; + + static int +write_indent(fp, use_indent, extra_indent, start, end) + FILE *fp; + int use_indent, extra_indent; + char *start, *end; +{ + int ind, tab; + + if (last_was_newline && use_indent) { + if (*start == '\n') do { + putc('\n', fp); + if (++start > end) + return; + } + while(*start == '\n'); + + ind = indent <= MAX_INDENT + ? indent + : MIN_INDENT + indent % (MAX_INDENT - MIN_INDENT); + + tab = ind + extra_indent; + + while (tab > 7) { + putc ('\t', fp); + tab -= 8; + } /* while */ + + while (tab-- > 0) + putc (' ', fp); + } /* if last_was_newline */ + + while (start <= end) + putc (*start++, fp); +} /* write_indent */ + + +/*VARARGS2*/ +int margin_printf (fp, a, b, c, d, e, f, g) +FILE *fp; +char *a; +long b, c, d, e, f, g; +{ + ind_printf (0, fp, a, b, c, d, e, f, g); +} /* margin_printf */ + +/*VARARGS2*/ +int nice_printf (fp, a, b, c, d, e, f, g) +FILE *fp; +char *a; +long b, c, d, e, f, g; +{ + ind_printf (1, fp, a, b, c, d, e, f, g); +} /* nice_printf */ + + +#define max_line_len c_output_line_length + /* 74Number of characters allowed on an output + line. This assumes newlines are handled + nicely, i.e. a newline after a full text + line on a terminal is ignored */ + +/* output_buf holds the text of the next line to be printed. It gets + flushed when a newline is printed. next_slot points to the next + available location in the output buffer, i.e. where the next call to + nice_printf will have its output stored */ + +static char output_buf[MAX_OUTPUT_SIZE] = ""; +static char *next_slot = output_buf; +static char *string_start; + +static char *word_start = NULL; +static int in_char = 0; +static int cursor_pos = 0; + + static char * +adjust_pointer_in_string(pointer) + register char *pointer; +{ + register char *s, *s1, *se, *s0; + + /* arrange not to break \002 */ + s1 = string_start ? string_start : output_buf; + for(s = s1; s < pointer; s++) { + s0 = s1; + s1 = s; + if (*s == '\\') { + se = s++ + 4; + if (se > pointer) + break; + if (*s < '0' || *s > '7') + continue; + while(++s < se) + if (*s < '0' || *s > '7') + break; + --s; + } + } + return s0 - 1; + } + +/* isident -- true iff character could belong to a unit. C allows + letters, numbers and underscores in identifiers. This also doubles as + a check for numeric constants, since we include the decimal point and + minus sign. The minus has to be here, since the constant "10e-2" + cannot be broken up. The '.' also prevents structure references from + being broken, which is a quite acceptable side effect */ + +#define isident(x) (Tr[x] & 1) +#define isntident(x) (!Tr[x]) + +int ind_printf (use_indent, fp, a, b, c, d, e, f, g) +int use_indent; +FILE *fp; +char *a; +long b, c, d, e, f, g; +{ + extern int max_line_len; + extern FILEP c_file; + extern char tr_tab[]; /* in output.c */ + register char *Tr = tr_tab; + int ind; + static int extra_indent, last_indent, set_cursor = 1; + + cursor_pos += indent - last_indent; + last_indent = indent; + sprintf (next_slot, a, b, c, d, e, f, g); + + if (fp != c_file) { + fprintf (fp,"%s", next_slot); + return 1; + } /* if fp != c_file */ + + do { + char *pointer; + +/* The for loop will parse one output line */ + + if (set_cursor) { + ind = indent <= MAX_INDENT + ? indent + : MIN_INDENT + indent % (MAX_INDENT - MIN_INDENT); + cursor_pos = ind + extra_indent; + set_cursor = 0; + } + if (in_string) + for (pointer = next_slot; *pointer && *pointer != '\n' && + cursor_pos <= max_line_len; pointer++) + cursor_pos++; + else + for (pointer = next_slot; *pointer && *pointer != '\n' && + cursor_pos <= max_line_len; pointer++) { + + /* Update state variables here */ + + switch (*pointer) { + case '"': + if (!in_char && !in_comment) + /* Ignore double quotes in char constants */ + string_start = word_start = pointer; + break; + case '\'': + if (!in_comment) { + word_start = in_char ? NULL : pointer; + in_char = !in_char; + } + break; + case '\\': + if (in_char) { + pointer++; + cursor_pos++; + } + break; + case '\t': + cursor_pos = 8 * ((cursor_pos + 8) / 8) - 1; + break; + default: { + + if (in_char) + break; + +/* HACK Assumes that all characters in an atomic C token will be written + at the same time. Must check for tokens first, since '-' is considered + part of an identifier; checking isident first would mean breaking up "->" */ + + if (!word_start && isident(*(unsigned char *)pointer)) + word_start = pointer; + else if (word_start && isntident(*(unsigned char *)pointer)) + word_start = NULL; + break; + } /* default */ + } /* switch */ + cursor_pos++; + } /* for pointer = next_slot */ + if (*pointer == '\0') { + +/* The output line is not complete, so break out and don't output + anything. The current line fragment will be stored in the buffer */ + + next_slot = pointer; + break; + } else { + char *safe_strncpy (); + char last_char; + int in_string0 = in_string; + +/* If the line was too long, move pointer back to the character before + the current word. This allows line breaking on word boundaries. Make + sure that 80 character comment lines get broken up somehow. We assume + that any non-string 80 character identifier must be in a comment. +*/ + + if (word_start && *pointer != '\n' && word_start > output_buf) + if (in_string) + if (string_start && pointer - string_start < 5) + pointer = string_start - 1; + else { + pointer = adjust_pointer_in_string(pointer); + string_start = 0; + } + else if (word_start == string_start) { + pointer = adjust_pointer_in_string(next_slot); + in_string = 1; + string_start = 0; + } + else + pointer = word_start - 1; + else if (cursor_pos > max_line_len) { + extern char *strchr(); + if (in_string) + pointer = adjust_pointer_in_string(pointer); + else if (strchr("&*+-/<=>|", *pointer) + && strchr("!%&*+-/<=>^|", pointer[-1])) { + pointer -= 2; + if (strchr("<>", *pointer)) /* <<=, >>= */ + pointer--; + } + else + pointer--; + } + last_char = *pointer; + write_indent(fp, use_indent, extra_indent, output_buf, pointer); + next_slot = output_buf; + if (in_string && !string_start && Ansi == 1 && last_char != '\n') + *next_slot++ = '"'; + (void) safe_strncpy (next_slot, pointer + 1, sizeof(output_buf)-1); + in_char = 0; + +/* insert a line break */ + + if (last_char == '\n') { + if (in_string) + last_was_newline = 0; + else { + last_was_newline = 1; + extra_indent = 0; + } + } + else { + extra_indent = TOO_LONG_INDENT; + if (in_string && !string_start) { + if (Ansi == 1) { + fprintf(fp, "\"\n"); + use_indent = 1; + last_was_newline = 1; + } + else { + fprintf(fp, "\\\n"); + last_was_newline = 0; + } + in_string = in_string0; + } + else { + putc ('\n', fp); + last_was_newline = 1; + } + } /* if *pointer != '\n' */ + + if (in_string && Ansi != 1 && !string_start) + cursor_pos = 0; + else + set_cursor = 1; + + string_start = word_start = NULL; + + } /* else */ + + } while (*next_slot); + + return 0; +} /* ind_printf */ diff --git a/sources/f2c/nicepr.h b/sources/f2c/nicepr.h new file mode 100644 index 0000000..24c65d4 --- /dev/null +++ b/sources/f2c/nicepr.h @@ -0,0 +1,16 @@ +/* niceprintf.h -- contains constants and macros from the output filter + for the generated C code. We use macros for increased speed, less + function overhead. */ + +#define MAX_OUTPUT_SIZE 6000 /* Number of chars on one output line PLUS + the length of the longest string + printed using nice_printf */ + + + +#define next_tab(fp) (indent += tab_size) + +#define prev_tab(fp) (indent -= tab_size) + + + diff --git a/sources/f2c/notice b/sources/f2c/notice new file mode 100644 index 0000000..cdee9a2 --- /dev/null +++ b/sources/f2c/notice @@ -0,0 +1,23 @@ +/**************************************************************** +Copyright 1990 by AT&T Bell Laboratories and Bellcore. + +Permission to use, copy, modify, and distribute this software +and its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the names of AT&T Bell Laboratories or +Bellcore or any of their entities not be used in advertising or +publicity pertaining to distribution of the software without +specific, written prior permission. + +AT&T and Bellcore disclaim all warranties with regard to this +software, including all implied warranties of merchantability +and fitness. In no event shall AT&T or Bellcore be liable for +any special, indirect or consequential damages or any damages +whatsoever resulting from loss of use, data or profits, whether +in an action of contract, negligence or other tortious action, +arising out of or in connection with the use or performance of +this software. +****************************************************************/ + diff --git a/sources/f2c/output.c b/sources/f2c/output.c new file mode 100644 index 0000000..cc39a3e --- /dev/null +++ b/sources/f2c/output.c @@ -0,0 +1,1443 @@ +/**************************************************************** +Copyright 1990 by AT&T Bell Laboratories and Bellcore. + +Permission to use, copy, modify, and distribute this software +and its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the names of AT&T Bell Laboratories or +Bellcore or any of their entities not be used in advertising or +publicity pertaining to distribution of the software without +specific, written prior permission. + +AT&T and Bellcore disclaim all warranties with regard to this +software, including all implied warranties of merchantability +and fitness. In no event shall AT&T or Bellcore be liable for +any special, indirect or consequential damages or any damages +whatsoever resulting from loss of use, data or profits, whether +in an action of contract, negligence or other tortious action, +arising out of or in connection with the use or performance of +this software. +****************************************************************/ + +#include "defs.h" +#include "names.h" +#include "output.h" + +#ifndef TRUE +# define TRUE 1 +#endif +#ifndef FALSE +# define FALSE 0 +#endif + +char _assoc_table[] = { 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0 }; + +/* Opcode table -- This array is indexed by the OP_____ macros defined in + defines.h; these macros are expected to be adjacent integers, so that + this table is as small as possible. */ + +table_entry opcode_table[] = { + { 0, 0, NULL }, + /* OPPLUS 1 */ { BINARY_OP, 12, "%l + %r" }, + /* OPMINUS 2 */ { BINARY_OP, 12, "%l - %r" }, + /* OPSTAR 3 */ { BINARY_OP, 13, "%l * %r" }, + /* OPSLASH 4 */ { BINARY_OP, 13, "%l / %r" }, + /* OPPOWER 5 */ { BINARY_OP, 0, "power (%l, %r)" }, + /* OPNEG 6 */ { UNARY_OP, 14, "-%l" }, + /* OPOR 7 */ { BINARY_OP, 4, "%l || %r" }, + /* OPAND 8 */ { BINARY_OP, 5, "%l && %r" }, + /* OPEQV 9 */ { BINARY_OP, 9, "%l == %r" }, + /* OPNEQV 10 */ { BINARY_OP, 9, "%l != %r" }, + /* OPNOT 11 */ { UNARY_OP, 14, "! %l" }, + +/* Have to find out more about CONCAT before it can be implemented */ + + /* OPCONCAT 12 */ { BINARY_OP, 0, "concat (%l, %r)" }, + /* OPLT 13 */ { BINARY_OP, 10, "%l < %r" }, + /* OPEQ 14 */ { BINARY_OP, 9, "%l == %r" }, + /* OPGT 15 */ { BINARY_OP, 10, "%l > %r" }, + /* OPLE 16 */ { BINARY_OP, 10, "%l <= %r" }, + /* OPNE 17 */ { BINARY_OP, 9, "%l != %r" }, + /* OPGE 18 */ { BINARY_OP, 10, "%l >= %r" }, + +/* Have to find out more about CALL before it can be implemented */ + + /* OPCALL 19 */ { BINARY_OP, 0, SPECIAL_FMT }, + /* OPCCALL 20 */ { BINARY_OP, 0, SPECIAL_FMT }, + +/* Left hand side of an assignment cannot have outermost parens */ + + /* OPASSIGN 21 */ { BINARY_OP, 2, "%l = %r" }, + /* OPPLUSEQ 22 */ { BINARY_OP, 2, "%l += %r" }, + /* OPSTAREQ 23 */ { BINARY_OP, 2, "%l *= %r" }, + +/* Why is this a binary operator? 15-jun-88 mwm */ + + /* OPCONV 24 */ { BINARY_OP, 14, "%l" }, + /* OPLSHIFT 25 */ { BINARY_OP, 11, "%l << %r" }, + /* OPMOD 26 */ { BINARY_OP, 13, "%l %% %r" }, + /* OPCOMMA 27 */ { BINARY_OP, 1, "%l, %r" }, + +/* Don't want to nest the colon operator in parens */ + + /* OPQUEST 28 */ { BINARY_OP, 3, "%l ? %r" }, + /* OPCOLON 29 */ { BINARY_OP, 3, "%l : %r" }, + /* OPABS 30 */ { UNARY_OP, 0, "abs(%l)" }, + /* OPMIN 31 */ { BINARY_OP, 0, SPECIAL_FMT }, + /* OPMAX 32 */ { BINARY_OP, 0, SPECIAL_FMT }, + /* OPADDR 33 */ { UNARY_OP, 14, "&%l" }, + + /* OPCOMMA_ARG 34 */ { BINARY_OP, 15, SPECIAL_FMT }, + /* OPBITOR 35 */ { BINARY_OP, 6, "%l | %r" }, + /* OPBITAND 36 */ { BINARY_OP, 8, "%l & %r" }, + /* OPBITXOR 37 */ { BINARY_OP, 7, "%l ^ %r" }, + /* OPBITNOT 38 */ { UNARY_OP, 14, "~ %l" }, + /* OPRSHIFT 39 */ { BINARY_OP, 11, "%l >> %r" }, + +/* This isn't quite right -- it doesn't handle arrays, for instance */ + + /* OPWHATSIN 40 */ { UNARY_OP, 14, "*%l" }, + /* OPMINUSEQ 41 */ { BINARY_OP, 2, "%l -= %r" }, + /* OPSLASHEQ 42 */ { BINARY_OP, 2, "%l /= %r" }, + /* OPMODEQ 43 */ { BINARY_OP, 2, "%l %%= %r" }, + /* OPLSHIFTEQ 44 */ { BINARY_OP, 2, "%l <<= %r" }, + /* OPRSHIFTEQ 45 */ { BINARY_OP, 2, "%l >>= %r" }, + /* OPBITANDEQ 46 */ { BINARY_OP, 2, "%l &= %r" }, + /* OPBITXOREQ 47 */ { BINARY_OP, 2, "%l ^= %r" }, + /* OPBITOREQ 48 */ { BINARY_OP, 2, "%l |= %r" }, + /* OPPREINC 49 */ { UNARY_OP, 14, "++%l" }, + /* OPPREDEC 50 */ { UNARY_OP, 14, "--%l" }, + /* OPDOT 51 */ { BINARY_OP, 15, "%l.%r" }, + /* OPARROW 52 */ { BINARY_OP, 15, "%l -> %r"}, + /* OPNEG1 53 */ { UNARY_OP, 14, "-%l" }, + /* OPDMIN 54 */ { BINARY_OP, 0, "dmin(%l,%r)" }, + /* OPDMAX 55 */ { BINARY_OP, 0, "dmax(%l,%r)" }, + /* OPASSIGNI 56 */ { BINARY_OP, 2, "%l = &%r" }, + /* OPIDENTITY 57 */ { UNARY_OP, 15, "%l" }, + /* OPCHARCAST 58 */ { UNARY_OP, 14, "(char *)&%l" }, + /* OPDABS 59 */ { UNARY_OP, 0, "dabs(%l)" }, + /* OPMIN2 60 */ { BINARY_OP, 0, "min(%l,%r)" }, + /* OPMAX2 61 */ { BINARY_OP, 0, "max(%l,%r)" }, + +/* kludge to imitate (under forcedouble) f77's bizarre treatement of OPNEG... */ + + /* OPNEG KLUDGE */ { UNARY_OP, 14, "-(doublereal)%l" } +}; /* opcode_table */ + +#define OPNEG_KLUDGE (sizeof(opcode_table)/sizeof(table_entry) - 1) + +static char opeqable[sizeof(opcode_table)/sizeof(table_entry)]; + + +static void output_prim (); +static void output_unary (), output_binary (), output_arg_list (); +static void output_list (), output_literal (); + + + +void expr_out (fp, e) +FILE *fp; +expptr e; +{ + if (e == (expptr) NULL) + return; + + switch (e -> tag) { + case TNAME: out_name (fp, (struct Nameblock *) e); + return; + + case TCONST: out_const(fp, &e->constblock); + return; + case TEXPR: + break; + + case TADDR: out_addr (fp, &(e -> addrblock)); + return; + + case TPRIM: warn ("expr_out: got TPRIM"); + output_prim (fp, &(e -> primblock)); + return; + + case TLIST: output_list (fp, &(e -> listblock)); + return; + + case TIMPLDO: err ("expr_out: got TIMPLDO"); + return; + + case TERROR: + default: + erri ("expr_out: bad tag '%d'", e -> tag); + } /* switch */ + +/* Now we know that the tag is TEXPR */ + +/* Optimize on simple expressions, such as "a = a + b" ==> "a += b" */ + + if (e -> exprblock.opcode == OPASSIGN && e -> exprblock.rightp && + e -> exprblock.rightp -> tag == TEXPR) { + int opcode; + + opcode = e -> exprblock.rightp -> exprblock.opcode; + + if (opeqable[opcode]) { + expptr leftp, rightp; + + if ((leftp = e -> exprblock.leftp) && + (rightp = e -> exprblock.rightp -> exprblock.leftp)) { + + if (same_ident (leftp, rightp)) { + expptr temp = e -> exprblock.rightp; + + e -> exprblock.opcode = op_assign(opcode); + + e -> exprblock.rightp = temp -> exprblock.rightp; + temp->exprblock.rightp = 0; + frexpr(temp); + } /* if same_ident (leftp, rightp) */ + } /* if leftp && rightp */ + } /* if opcode == OPPLUS || */ + } /* if e -> exprblock.opcode == OPASSIGN */ + + +/* Optimize on increment or decrement by 1 */ + + { + int opcode = e -> exprblock.opcode; + expptr leftp = e -> exprblock.leftp; + expptr rightp = e -> exprblock.rightp; + + if (leftp && rightp && (leftp -> headblock.vstg == STGARG || + ISINT (leftp -> headblock.vtype)) && + (opcode == OPPLUSEQ || opcode == OPMINUSEQ) && + ISINT (rightp -> headblock.vtype) && + ISICON (e -> exprblock.rightp) && + (ISONE (e -> exprblock.rightp) || + e -> exprblock.rightp -> constblock.Const.ci == -1)) { + +/* Allow for the '-1' constant value */ + + if (!ISONE (e -> exprblock.rightp)) + opcode = (opcode == OPPLUSEQ) ? OPMINUSEQ : OPPLUSEQ; + +/* replace the existing opcode */ + + if (opcode == OPPLUSEQ) + e -> exprblock.opcode = OPPREINC; + else + e -> exprblock.opcode = OPPREDEC; + +/* Free up storage used by the right hand side */ + + frexpr (e -> exprblock.rightp); + e->exprblock.rightp = 0; + } /* if opcode == OPPLUS */ + } /* block */ + + + if (is_unary_op (e -> exprblock.opcode)) + output_unary (fp, &(e -> exprblock)); + else if (is_binary_op (e -> exprblock.opcode)) + output_binary (fp, &(e -> exprblock)); + else + erri ("expr_out: bad opcode '%d'", (int) e -> exprblock.opcode); + +} /* expr_out */ + + +void out_and_free_statement (outfile, expr) +FILE *outfile; +expptr expr; +{ + if (expr) + expr_out (outfile, expr); + + nice_printf (outfile, ";\n"); +} /* out_and_free_statement */ + + + +int same_ident (left, right) +expptr left, right; +{ + if (!left || !right) + return 0; + + if (left -> tag == TNAME && right -> tag == TNAME && left == right) + return 1; + + if (left -> tag == TADDR && right -> tag == TADDR && + left -> addrblock.uname_tag == right -> addrblock.uname_tag) + switch (left -> addrblock.uname_tag) { + case UNAM_NAME: + +/* Check for array subscripts */ + + if (left -> addrblock.user.name -> vdim || + right -> addrblock.user.name -> vdim) + if (left -> addrblock.user.name != + right -> addrblock.user.name || + !same_expr (left -> addrblock.memoffset, + right -> addrblock.memoffset)) + return 0; + + return same_ident ((expptr) (left -> addrblock.user.name), + (expptr) right -> addrblock.user.name); + case UNAM_IDENT: + return strcmp(left->addrblock.user.ident, + right->addrblock.user.ident) == 0; + case UNAM_CHARP: + return strcmp(left->addrblock.user.Charp, + right->addrblock.user.Charp) == 0; + default: + return 0; + } /* switch */ + + if (left->tag == TEXPR && left->exprblock.opcode == OPWHATSIN + && right->tag == TEXPR && right->exprblock.opcode == OPWHATSIN) + return same_ident(left->exprblock.leftp, + right->exprblock.leftp); + + return 0; +} /* same_ident */ + + static int +samefpconst(c1, c2, n) + register Constp c1, c2; + register int n; +{ + char *s1, *s2; + if (!c1->vstg && !c2->vstg) + return c1->Const.cd[n] == c2->Const.cd[n]; + s1 = c1->vstg ? c1->Const.cds[n] : dtos(c1->Const.cd[n]); + s2 = c2->vstg ? c2->Const.cds[n] : dtos(c2->Const.cd[n]); + return !strcmp(s1, s2); + } + + static int +sameconst(c1, c2) + register Constp c1, c2; +{ + switch(c1->vtype) { + case TYCOMPLEX: + case TYDCOMPLEX: + if (!samefpconst(c1,c2,1)) + return 0; + case TYREAL: + case TYDREAL: + return samefpconst(c1,c2,0); + case TYCHAR: + return c1->Const.ccp1.blanks == c2->Const.ccp1.blanks + && c1->vleng->constblock.Const.ci + == c2->vleng->constblock.Const.ci + && !memcmp(c1->Const.ccp, c2->Const.ccp, + (int)c1->vleng->constblock.Const.ci); + case TYSHORT: + case TYINT: + case TYLOGICAL: + return c1->Const.ci == c2->Const.ci; + } + err("unexpected type in sameconst"); + return 0; + } + +/* same_expr -- Returns true only if e1 and e2 match. This is + somewhat pessimistic, but can afford to be because it's just used to + optimize on the assignment operators (+=, -=, etc). */ + +int same_expr (e1, e2) +expptr e1, e2; +{ + if (!e1 || !e2) + return !e1 && !e2; + + if (e1 -> tag != e2 -> tag || e1 -> headblock.vtype != e2 -> headblock.vtype) + return 0; + + switch (e1 -> tag) { + case TEXPR: + if (e1 -> exprblock.opcode != e2 -> exprblock.opcode) + return 0; + + return same_expr (e1 -> exprblock.leftp, e2 -> exprblock.leftp) && + same_expr (e1 -> exprblock.rightp, e2 -> exprblock.rightp); + case TNAME: + case TADDR: + return same_ident (e1, e2); + case TCONST: + return sameconst(&e1->constblock, &e2->constblock); + default: + return 0; + } /* switch */ +} /* same_expr */ + + + +void out_name (fp, namep) + FILE *fp; + Namep namep; +{ + extern int usedefsforcommon; + Extsym *comm; + + if (namep == NULL) + return; + +/* DON'T want to use oneof_stg() here; need to find the right common name + */ + + if (namep->vstg == STGCOMMON && !namep->vcommequiv && !usedefsforcommon) { + comm = &extsymtab[namep->vardesc.varno]; + extern_out(fp, comm); + nice_printf(fp, "%d.", comm->curno); + } /* if namep -> vstg == STGCOMMON */ + + if (namep->vprocclass == PTHISPROC && namep->vtype != TYSUBR) + nice_printf(fp, xretslot[namep->vtype]->user.ident); + else + nice_printf (fp, "%s", namep->cvarname); +} /* out_name */ + + +int in_string; +char *str_fmt[128] = { + "\\x00", "\\x01", "\\x02", "\\x03", "\\x04", "\\x05", "\\x06", "\\x07", + "\\b", "\\t", "\\n", "\\v", "\\f", "\\r", "\\x0e", "\\x0f", + "\\x10", "\\x11", "\\x12", "\\x13", "\\x14", "\\x15", "\\x16", "\\x17", + "\\x18", "\\x19", "\\x1a", "\\x1b", "\\x1c", "\\x1d", "\\x1e", "\\x1f", + " ", "!", "\\\"", "#", "$", "%%", "&", "'", + "(", ")", "*", "+", ",", "-", ".", "/", + "0", "1", "2", "3", "4", "5", "6", "7", + "8", "9", ":", ";", "<", "=", ">", "?", + "@", "A", "B", "C", "D", "E", "F", "G", + "H", "I", "J", "K", "L", "M", "N", "O", + "P", "Q", "R", "S", "T", "U", "V", "W", + "X", "Y", "Z", "[", "\\\\", "]", "^", "_", + "`", "a", "b", "c", "d", "e", "f", "g", + "h", "i", "j", "k", "l", "m", "n", "o", + "p", "q", "r", "s", "t", "u", "v", "w", + "x", "y", "z", "{", "|", "}", "~", "\\x%02x" + }; +char *chr_fmt[128] = { + "\\x00", "\\x01", "\\x02", "\\x03", "\\x04", "\\x05", "\\x06", "\\x07", + "\\b", "\\t", "\\n", "\\v", "\\f", "\\r", "\\x0e", "\\x0f", + "\\x10", "\\x11", "\\x12", "\\x13", "\\x14", "\\x15", "\\x16", "\\x17", + "\\x18", "\\x19", "\\x1a", "\\x1b", "\\x1c", "\\x1d", "\\x1e", "\\x1f", + " ", "!", "\"", "#", "$", "%%", "&", "\\'", + "(", ")", "*", "+", ",", "-", ".", "/", + "0", "1", "2", "3", "4", "5", "6", "7", + "8", "9", ":", ";", "<", "=", ">", "?", + "@", "A", "B", "C", "D", "E", "F", "G", + "H", "I", "J", "K", "L", "M", "N", "O", + "P", "Q", "R", "S", "T", "U", "V", "W", + "X", "Y", "Z", "[", "\\\\", "]", "^", "_", + "`", "a", "b", "c", "d", "e", "f", "g", + "h", "i", "j", "k", "l", "m", "n", "o", + "p", "q", "r", "s", "t", "u", "v", "w", + "x", "y", "z", "{", "|", "}", "~", "\\x%02x" + }; + +static char *Longfmt = "%ld"; + +#define cpd(n) cp->vstg ? cp->Const.cds[n] : dtos(cp->Const.cd[n]) + +void out_const(fp, cp) + FILE *fp; + register Constp cp; +{ + static char real_buf[50], imag_buf[50]; + unsigned int k; + int type = cp->vtype; + + switch (type) { + case TYSHORT: + nice_printf (fp, "%ld", cp->Const.ci); /* don't cast ci! */ + break; + case TYLONG: + nice_printf (fp, Longfmt, cp->Const.ci); /* don't cast ci! */ + break; + case TYREAL: + nice_printf(fp, "%s", flconst(real_buf, cpd(0))); + break; + case TYDREAL: + nice_printf(fp, "%s", cpd(0)); + break; + case TYCOMPLEX: + nice_printf(fp, cm_fmt_string, flconst(real_buf, cpd(0)), + flconst(imag_buf, cpd(1))); + break; + case TYDCOMPLEX: + nice_printf(fp, dcm_fmt_string, cpd(0), cpd(1)); + break; + case TYLOGICAL: + nice_printf (fp, "%s", cp->Const.ci ? "TRUE_" : "FALSE_"); + break; + case TYCHAR: { + char *c = cp->Const.ccp, *ce; + + if (c == NULL) { + nice_printf (fp, "\"\""); + break; + } /* if c == NULL */ + + nice_printf (fp, "\""); + in_string = 1; + ce = c + cp->vleng->constblock.Const.ci; + while(c < ce) { + k = *(unsigned char *)c++; + nice_printf(fp, str_fmt[k < 127 ? k : 127], k); + } + for(k = cp->Const.ccp1.blanks; k > 0; k--) + nice_printf(fp, " "); + nice_printf (fp, "\""); + in_string = 0; + break; + } /* case TYCHAR */ + default: + erri ("out_const: bad type '%d'", (int) type); + break; + } /* switch */ + +} /* out_const */ +#undef cpd + + +/* out_addr -- this routine isn't local because it is called by the + system-generated identifier printing routines */ + +void out_addr (fp, addrp) +FILE *fp; +struct Addrblock *addrp; +{ + extern Extsym *extsymtab; + int was_array = 0; + char *s; + + + if (addrp == NULL) + return; + if (doin_setbound + && addrp->vstg == STGARG + && addrp->vtype != TYCHAR + && ISICON(addrp->memoffset) + && !addrp->memoffset->constblock.Const.ci) + nice_printf(fp, "*"); + + switch (addrp -> uname_tag) { + case UNAM_NAME: + out_name (fp, addrp -> user.name); + break; + case UNAM_IDENT: + if (*(s = addrp->user.ident) == ' ') { + if (multitype) + nice_printf(fp, "%s", + xretslot[addrp->vtype]->user.ident); + else + nice_printf(fp, "%s", s+1); + } + else { + nice_printf(fp, "%s", s); + } + break; + case UNAM_CHARP: + nice_printf(fp, "%s", addrp->user.Charp); + break; + case UNAM_EXTERN: + extern_out (fp, &extsymtab[addrp -> memno]); + break; + case UNAM_CONST: + switch(addrp->vstg) { + case STGCONST: + out_const(fp, (Constp)addrp); + break; + case STGMEMNO: + output_literal (fp, (int)addrp->memno, + (Constp)addrp); + break; + default: + Fatal("unexpected vstg in out_addr"); + } + break; + case UNAM_UNKNOWN: + default: + nice_printf (fp, "Unknown Addrp"); + break; + } /* switch */ + +/* It's okay to just throw in the brackets here because they have a + precedence level of 15, the highest value. */ + + if ((addrp->uname_tag == UNAM_NAME && addrp->user.name->vdim + || addrp->ntempelt > 1 || addrp->isarray) + && addrp->vtype != TYCHAR) { + expptr offset; + + was_array = 1; + + offset = addrp -> memoffset; + if (ONEOF(addrp->vstg, M(STGCOMMON)|M(STGEQUIV)) && + addrp -> uname_tag == UNAM_NAME) + offset = mkexpr (OPMINUS, offset, mkintcon ( + addrp -> user.name -> voffset)); + + nice_printf (fp, "["); + + offset = mkexpr (OPSLASH, offset, + ICON (typesize[addrp -> vtype] * (addrp -> Field ? 2 : 1))); + expr_out (fp, offset); + nice_printf (fp, "]"); + } + +/* Check for structure field reference */ + + if (addrp -> Field && addrp -> uname_tag != UNAM_CONST && + addrp -> uname_tag != UNAM_UNKNOWN) { + if (oneof_stg((addrp -> uname_tag == UNAM_NAME ? addrp -> user.name : + (Namep) NULL), addrp -> vstg, M(STGARG)|M(STGEQUIV)) + && !was_array && (addrp->vclass != CLPROC || !multitype)) + nice_printf (fp, "->%s", addrp -> Field); + else + nice_printf (fp, ".%s", addrp -> Field); + } /* if */ + +/* Check for character subscripting */ + + if (addrp->vtype == TYCHAR && + (addrp->vclass != CLPROC || addrp->uname_tag == UNAM_NAME + && addrp->user.name->vprocclass == PTHISPROC) && + addrp -> memoffset && + (addrp -> uname_tag != UNAM_NAME || + addrp -> user.name -> vtype == TYCHAR) && + (!ISICON (addrp -> memoffset) || + (addrp -> memoffset -> constblock.Const.ci))) { + + int use_paren = 0; + expptr e = addrp -> memoffset; + + if (!e) + return; + + if (ONEOF(addrp->vstg, M(STGCOMMON)|M(STGEQUIV)) + && addrp -> uname_tag == UNAM_NAME) { + e = mkexpr (OPMINUS, e, mkintcon (addrp -> user.name -> voffset)); + +/* mkexpr will simplify it to zero if possible */ + if (e->tag == TCONST && e->constblock.Const.ci == 0) + return; + } /* if addrp -> vstg == STGCOMMON */ + +/* In the worst case, parentheses might be needed OUTSIDE the expression, + too. But since I think this subscripting can only appear as a + parameter in a procedure call, I don't think outside parens will ever + be needed. INSIDE parens are handled below */ + + nice_printf (fp, " + "); + if (e -> tag == TEXPR) { + int arg_prec = op_precedence (e -> exprblock.opcode); + int prec = op_precedence (OPPLUS); + use_paren = arg_prec && (arg_prec < prec || (arg_prec == prec && + is_left_assoc (OPPLUS))); + } /* if e -> tag == TEXPR */ + if (use_paren) nice_printf (fp, "("); + expr_out (fp, e); + if (use_paren) nice_printf (fp, ")"); + } /* if */ +} /* out_addr */ + + +static void output_literal (fp, memno, cp) + FILE *fp; + int memno; + Constp cp; +{ + struct Literal *litp, *lastlit; + extern struct Literal litpool[]; + extern int nliterals; + extern char *lit_name (); + + lastlit = litpool + nliterals; + + for (litp = litpool; litp < lastlit; litp++) { + if (litp -> litnum == memno) + break; + } /* for litp */ + + if (litp >= lastlit) + out_const (fp, cp); + else { + nice_printf (fp, "%s", lit_name (litp)); + litp->lituse++; + } +} /* output_literal */ + + +static void output_prim (fp, primp) +FILE *fp; +struct Primblock *primp; +{ + if (primp == NULL) + return; + + out_name (fp, primp -> namep); + if (primp -> argsp) + output_arg_list (fp, primp -> argsp); + + if (primp -> fcharp != (expptr) NULL || primp -> lcharp != (expptr) NULL) + nice_printf (fp, "Sorry, no substrings yet"); +} + + + +static void output_arg_list (fp, listp) +FILE *fp; +struct Listblock *listp; +{ + chainp arg_list; + + if (listp == (struct Listblock *) NULL || listp -> listp == (chainp) NULL) + return; + + nice_printf (fp, "("); + + for (arg_list = listp -> listp; arg_list; arg_list = arg_list -> nextp) { + expr_out (fp, (expptr) arg_list -> datap); + if (arg_list -> nextp != (chainp) NULL) + +/* Might want to add a hook in here to accomodate the style setting which + wants spaces after commas */ + + nice_printf (fp, ","); + } /* for arg_list */ + + nice_printf (fp, ")"); +} /* output_arg_list */ + + + +static void output_unary (fp, e) +FILE *fp; +struct Exprblock *e; +{ + if (e == NULL) + return; + + switch (e -> opcode) { + case OPNEG: + if (e->vtype == TYREAL && forcedouble) { + e->opcode = OPNEG_KLUDGE; + output_binary(fp,e); + e->opcode = OPNEG; + break; + } + case OPNEG1: + case OPNOT: + case OPABS: + case OPBITNOT: + case OPWHATSIN: + case OPPREINC: + case OPPREDEC: + case OPADDR: + case OPIDENTITY: + case OPCHARCAST: + case OPDABS: + output_binary (fp, e); + break; + case OPCALL: + case OPCCALL: + nice_printf (fp, "Sorry, no OPCALL yet"); + break; + default: + erri ("output_unary: bad opcode", (int) e -> opcode); + break; + } /* switch */ +} /* output_unary */ + + + static int +opconv_fudge(fp,e) + FILE *fp; + struct Exprblock *e; +{ + /* special handling for ichar and character*1 */ + register expptr lp = e->leftp; + register union Expression *Offset; + int lt = lp->headblock.vtype; + char buf[8]; + unsigned int k; + Namep np; + + if (lp->addrblock.vtype == TYCHAR) { + switch(lp->tag) { + case TNAME: + nice_printf(fp, "*"); + out_name(fp, (Namep)lp); + return 1; + case TCONST: + tconst: + k = *(unsigned char *)lp->constblock.Const.ccp; + sprintf(buf, chr_fmt[k < 127 ? k : 127], k); + nice_printf(fp, "'%s'", buf); + return 1; + case TADDR: + if (lp->addrblock.vstg == STGCONST) + goto tconst; + lt = lp->addrblock.vtype = tyint; + Offset = lp->addrblock.memoffset; + if (lp->addrblock.uname_tag == UNAM_NAME) { + np = lp->addrblock.user.name; + if (ONEOF(np->vstg, + M(STGCOMMON)|M(STGEQUIV))) + Offset = mkexpr(OPMINUS, Offset, + ICON(np->voffset)); + } + lp->addrblock.memoffset = Offset ? + mkexpr(OPSTAR, Offset, + ICON(typesize[tyint])) + : ICON(0); + lp->addrblock.isarray = 1; + /* STGCOMMON or STGEQUIV would cause */ + /* voffset to be added in a second time */ + lp->addrblock.vstg = STGUNKNOWN; + break; + default: + badtag("opconv_fudge", lp->tag); + } + } + if (lt != e->vtype) + nice_printf(fp, "(%s) ", + c_type_decl(e->vtype, 0)); + return 0; + } + + +static void output_binary (fp, e) +FILE *fp; +struct Exprblock *e; +{ + char *format; + extern table_entry opcode_table[]; + int prec; + + if (e == NULL || e -> tag != TEXPR) + return; + +/* Instead of writing a huge switch, I've incorporated the output format + into a table. Things like "%l" and "%r" stand for the left and + right subexpressions. This should allow both prefix and infix + functions to be specified (e.g. "(%l * %r", "z_div (%l, %r"). Of + course, I should REALLY think out the ramifications of writing out + straight text, as opposed to some intermediate format, which could + figure out and optimize on the the number of required blanks (we don't + want "x - (-y)" to become "x --y", for example). Special cases (such as + incomplete implementations) could still be implemented as part of the + switch, they will just have some dummy value instead of the string + pattern. Another difficulty is the fact that the complex functions + will differ from the integer and real ones */ + +/* Handle a special case. We don't want to output "x + - 4", or "y - - 3" +*/ + if ((e -> opcode == OPPLUS || e -> opcode == OPMINUS) && + e -> rightp && e -> rightp -> tag == TCONST && + isnegative_const (&(e -> rightp -> constblock)) && + is_negatable (&(e -> rightp -> constblock))) { + + e -> opcode = (e -> opcode == OPPLUS) ? OPMINUS : OPPLUS; + negate_const (&(e -> rightp -> constblock)); + } /* if e -> opcode == PLUS or MINUS */ + + prec = op_precedence (e -> opcode); + format = op_format (e -> opcode); + + if (format != SPECIAL_FMT) { + while (*format) { + if (*format == '%') { + int arg_prec, use_paren = 0; + expptr lp, rp; + + switch (*(format + 1)) { + case 'l': + lp = e->leftp; + if (lp && lp->tag == TEXPR) { + arg_prec = op_precedence(lp->exprblock.opcode); + + use_paren = arg_prec && + (arg_prec < prec || (arg_prec == prec && + is_right_assoc (prec))); + } /* if e -> leftp */ + if (e->opcode == OPCONV && opconv_fudge(fp,e)) + break; + if (use_paren) + nice_printf (fp, "("); + expr_out(fp, lp); + if (use_paren) + nice_printf (fp, ")"); + break; + case 'r': + rp = e->rightp; + if (rp && rp->tag == TEXPR) { + arg_prec = op_precedence(rp->exprblock.opcode); + + use_paren = arg_prec && + (arg_prec < prec || (arg_prec == prec && + is_left_assoc (prec))); + use_paren = use_paren || + (rp->exprblock.opcode == OPNEG + && prec >= op_precedence(OPMINUS)); + } /* if e -> rightp */ + if (use_paren) + nice_printf (fp, "("); + expr_out(fp, rp); + if (use_paren) + nice_printf (fp, ")"); + break; + case '\0': + case '%': + nice_printf (fp, "%%"); + break; + default: + erri ("output_binary: format err: '%%%c' illegal", + (int) *(format + 1)); + break; + } /* switch */ + format += 2; + } else + nice_printf (fp, "%c", *format++); + } /* while *format */ + } else { + +/* Handle Special cases of formatting */ + + switch (e -> opcode) { + case OPCCALL: + case OPCALL: + out_call (fp, (int) e -> opcode, e -> vtype, + e -> vleng, e -> leftp, e -> rightp); + break; + + case OPCOMMA_ARG: + doin_setbound = 1; + nice_printf(fp, "("); + expr_out(fp, e->leftp); + nice_printf(fp, ", &"); + doin_setbound = 0; + expr_out(fp, e->rightp); + nice_printf(fp, ")"); + break; + + case OPADDR: + default: + nice_printf (fp, "Sorry, can't format OPCODE '%d'", + e -> opcode); + break; + } + + } /* else */ +} /* output_binary */ + + +out_call (outfile, op, ftype, len, name, args) +FILE *outfile; +int op, ftype; +expptr len, name, args; +{ + chainp arglist; /* Pointer to any actual arguments */ + chainp cp; /* Iterator over argument lists */ + Addrp ret_val = (Addrp) NULL; + /* Function return value buffer, if any is + required */ + int byvalue; /* True iff we're calling a C library + routine */ + int done_once; /* Used for writing commas to outfile */ + int narg, t; + register expptr q; + long L; + Argtypes *at; + Atype *A; + Namep np; + +/* Don't use addresses if we're calling a C function */ + + byvalue = op == OPCCALL; + + if (args) + arglist = args -> listblock.listp; + else + arglist = CHNULL; + +/* If this is a CHARACTER function, the first argument is the result */ + + if (ftype == TYCHAR) + if (ISICON (len)) { + ret_val = (Addrp) (arglist -> datap); + arglist = arglist -> nextp; + } else { + err ("adjustable character function"); + return; + } /* else */ + +/* If this is a COMPLEX function, the first argument is the result */ + + else if (ISCOMPLEX (ftype)) { + ret_val = (Addrp) (arglist -> datap); + arglist = arglist -> nextp; + } /* if ISCOMPLEX */ + +/* Now we can actually start to write out the function invocation */ + + if (name -> tag == TEXPR && name -> exprblock.opcode == OPWHATSIN) { + nice_printf (outfile, "("); + expr_out (outfile, name); + nice_printf (outfile, ")"); + np = (Namep)name->exprblock.leftp; + } + else { + np = (Namep)name; + expr_out(outfile, name); + } + + /* prepare to cast procedure parameters -- set A if we know how */ + + A = np->tag == TNAME && (at = np->arginfo) && at->nargs > 0 + ? at->atypes : 0; + + nice_printf(outfile, "("); + + if (ret_val) { + if (ISCOMPLEX (ftype)) + nice_printf (outfile, "&"); + expr_out (outfile, (expptr) ret_val); + +/* The length of the result of a character function is the second argument */ +/* It should be in place from putcall(), so we won't touch it explicitly */ + + } /* if ret_val */ + done_once = ret_val ? TRUE : FALSE; + +/* Now run through the named arguments */ + + narg = -1; + for (cp = arglist; cp; cp = cp -> nextp, done_once = TRUE) { + + if (done_once) + nice_printf (outfile, ", "); + narg++; + + if (!( q = (expptr)cp->datap) ) + continue; + + if (q->tag == TADDR) { + if (q->addrblock.vtype > TYERROR) { + /* I/O block */ + nice_printf(outfile, "&%s", q->addrblock.user.ident); + continue; + } + if (!byvalue && q->addrblock.isarray + && q->addrblock.vtype != TYCHAR + && q->addrblock.memoffset->tag == TCONST) { + + /* check for 0 offset -- after */ + /* correcting for equivalence. */ + L = q->addrblock.memoffset->constblock.Const.ci; + if (ONEOF(q->addrblock.vstg, M(STGCOMMON)|M(STGEQUIV)) + && q->addrblock.uname_tag == UNAM_NAME) + L -= q->addrblock.user.name->voffset; + if (L) + goto skip_deref; + + /* &x[0] == x */ + /* This also prevents &sizeof(doublereal)[0] */ + switch(q->addrblock.uname_tag) { + case UNAM_NAME: + out_name(outfile, q->addrblock.user.name); + continue; + case UNAM_IDENT: + nice_printf(outfile, "%s", + q->addrblock.user.ident); + continue; + case UNAM_CHARP: + nice_printf(outfile, "%s", + q->addrblock.user.Charp); + continue; + case UNAM_EXTERN: + extern_out(outfile, + &extsymtab[q->addrblock.memno]); + continue; + } + } + } + +/* Skip over the dereferencing operator generated only for the + intermediate file */ + skip_deref: + if (q -> tag == TEXPR && q -> exprblock.opcode == OPWHATSIN) + q = q -> exprblock.leftp; + + if (q->headblock.vclass == CLPROC + && Castargs + && (q->tag != TNAME + || q->nameblock.vprocclass != PTHISPROC)) + { + if (A && (t = A[narg].type) >= 200) + t %= 100; + else { + t = q->headblock.vtype; + if (q->tag == TNAME && q->nameblock.vimpltype) + t = TYUNKNOWN; + } + nice_printf(outfile, "(%s)", usedcasts[t] = casttypes[t]); + } + + if ((q -> tag == TADDR || q-> tag == TNAME) && + (byvalue || q -> headblock.vstg != STGREG)) { + if (byvalue && q -> headblock.vtype != TYCHAR) { + +/* Think about array access, too! Don't just think about argument storage + */ + + if (q -> tag == TADDR && + !(q -> addrblock.uname_tag == UNAM_NAME && + q -> addrblock.user.name -> vdim) && + oneof_stg(q -> addrblock.user.name, q -> addrblock.vstg, + M(STGARG)|M(STGEQUIV))) + + nice_printf (outfile, "*"); + else if (q -> tag == TNAME + && oneof_stg(&q->nameblock, q -> nameblock.vstg, + M(STGARG)|M(STGEQUIV)) + && !(q -> nameblock.vdim)) + nice_printf (outfile, "*"); + + } else if (q->headblock.vtype != TYCHAR) { + expptr memoffset; + + if (q->tag == TADDR && + !ONEOF (q -> addrblock.vstg, M(STGEXT)|M(STGLENG)) + && ( + ONEOF(q->addrblock.vstg, + M(STGCOMMON)|M(STGEQUIV)|M(STGMEMNO)) + || ((memoffset = q->addrblock.memoffset) + && (!ISICON(memoffset) + || memoffset->constblock.Const.ci))) + || ONEOF(q->addrblock.vstg, + M(STGINIT)|M(STGAUTO)|M(STGBSS)) + && !q->addrblock.isarray) + nice_printf (outfile, "&"); + else if (q -> tag == TNAME + && !oneof_stg(&q->nameblock, q -> nameblock.vstg, + M(STGARG)|M(STGEXT)|M(STGEQUIV))) + nice_printf (outfile, "&"); + } /* else */ + + expr_out (outfile, q); + } /* if q -> tag == TADDR || q -> tag == TNAME */ + +/* Might be a Constant expression, e.g. string length, character constants */ + + else if (q -> tag == TCONST) { + if (tyioint == TYLONG) + Longfmt = "%ldL"; + out_const(outfile, &q->constblock); + Longfmt = "%ld"; + } + +/* Must be some other kind of expression, or register var, or constant. + In particular, this is likely to be a temporary variable assignment + which was generated in p1put_call */ + + else if (!ISCOMPLEX (q -> headblock.vtype) && !ISCHAR (q)){ + int use_paren = q -> tag == TEXPR && + op_precedence (q -> exprblock.opcode) <= + op_precedence (OPCOMMA); + + if (use_paren) nice_printf (outfile, "("); + expr_out (outfile, q); + if (use_paren) nice_printf (outfile, ")"); + } /* if !ISCOMPLEX */ + else + err ("out_call: unknown parameter"); + + } /* for (cp = arglist */ + + if (arglist) + frchain (&arglist); + + nice_printf (outfile, ")"); + +} /* out_call */ + + + char * +flconst(buf, x) + char *buf, *x; +{ + sprintf(buf, fl_fmt_string, x); + return buf; + } + + char * +dtos(x) + double x; +{ + static char buf[64]; + sprintf(buf, db_fmt_string, x); + return buf; + } + +char tr_tab[256]; /* machine dependent */ + +/* out_init -- Initialize the data structures used by the routines in + output.c. These structures include the output format to be used for + Float, Double, Complex, and Double Complex constants. */ + +void out_init () +{ + extern int tab_size; + register char *s; + + s = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_+-."; + while(*s) + tr_tab[*s++] = 3; + tr_tab['>'] = 1; + + opeqable[OPPLUS] = 1; + opeqable[OPMINUS] = 1; + opeqable[OPSTAR] = 1; + opeqable[OPSLASH] = 1; + opeqable[OPMOD] = 1; + opeqable[OPLSHIFT] = 1; + opeqable[OPBITAND] = 1; + opeqable[OPBITXOR] = 1; + opeqable[OPBITOR ] = 1; + + +/* Set the output format for both types of floating point constants */ + + if (fl_fmt_string == NULL || *fl_fmt_string == '\0') + fl_fmt_string = Ansi == 1 ? "%sf" : "(float)%s"; + + if (db_fmt_string == NULL || *db_fmt_string == '\0') + db_fmt_string = "%.17g"; + +/* Set the output format for both types of complex constants. They will + have string parameters rather than float or double so that the decimal + point may be added to the strings generated by the {db,fl}_fmt_string + formats above */ + + if (cm_fmt_string == NULL || *cm_fmt_string == '\0') { + cm_fmt_string = "{%s,%s}"; + } /* if cm_fmt_string == NULL */ + + if (dcm_fmt_string == NULL || *dcm_fmt_string == '\0') { + dcm_fmt_string = "{%s,%s}"; + } /* if dcm_fmt_string == NULL */ + + tab_size = 4; +} /* out_init */ + + +void extern_out (fp, extsym) +FILE *fp; +Extsym *extsym; +{ + if (extsym == (Extsym *) NULL) + return; + + nice_printf (fp, "%s", extsym->cextname); + +} /* extern_out */ + + + +static void output_list (fp, listp) +FILE *fp; +struct Listblock *listp; +{ + int did_one = 0; + chainp elts; + + nice_printf (fp, "("); + if (listp) + for (elts = listp -> listp; elts; elts = elts -> nextp) { + if (elts -> datap) { + if (did_one) + nice_printf (fp, ", "); + expr_out (fp, (expptr) elts -> datap); + did_one = 1; + } /* if elts -> datap */ + } /* for elts */ + nice_printf (fp, ")"); +} /* output_list */ + + +void out_asgoto (outfile, expr) +FILE *outfile; +expptr expr; +{ + char *user_label(); + chainp value; + Namep namep; + int k; + + if (expr == (expptr) NULL) { + err ("out_asgoto: NULL variable expr"); + return; + } /* if expr */ + + nice_printf (outfile, "switch ("); + expr_out (outfile, expr); + nice_printf (outfile, ") {\n"); + next_tab (outfile); + +/* The initial addrp value will be stored as a namep pointer */ + + switch(expr->tag) { + case TNAME: + /* local variable */ + namep = &expr->nameblock; + break; + case TEXPR: + if (expr->exprblock.opcode == OPWHATSIN + && expr->exprblock.leftp->tag == TNAME) + /* argument */ + namep = &expr->exprblock.leftp->nameblock; + else + goto bad; + break; + case TADDR: + if (expr->addrblock.uname_tag == UNAM_NAME) { + /* initialized local variable */ + namep = expr->addrblock.user.name; + break; + } + default: + bad: + err("out_asgoto: bad expr"); + return; + } + + for(k = 0, value = namep -> varxptr.assigned_values; value; + value = value->nextp, k++) { + nice_printf (outfile, "case %d: goto %s;\n", k, + user_label((long)value->datap)); + } /* for value */ + prev_tab (outfile); + + nice_printf (outfile, "}\n"); +} /* out_asgoto */ + +void out_if (outfile, expr) +FILE *outfile; +expptr expr; +{ + nice_printf (outfile, "if ("); + expr_out (outfile, expr); + nice_printf (outfile, ") {\n"); + next_tab (outfile); +} /* out_if */ + + static void +output_rbrace(outfile, s) + FILE *outfile; + char *s; +{ + extern int last_was_label; + register char *fmt; + + if (last_was_label) { + last_was_label = 0; + fmt = ";%s"; + } + else + fmt = "%s"; + nice_printf(outfile, fmt, s); + } + +void out_else (outfile) +FILE *outfile; +{ + prev_tab (outfile); + output_rbrace(outfile, "} else {\n"); + next_tab (outfile); +} /* out_else */ + +void elif_out (outfile, expr) +FILE *outfile; +expptr expr; +{ + prev_tab (outfile); + output_rbrace(outfile, "} else "); + out_if (outfile, expr); +} /* elif_out */ + +void endif_out (outfile) +FILE *outfile; +{ + prev_tab (outfile); + output_rbrace(outfile, "}\n"); +} /* endif_out */ + +void end_else_out (outfile) +FILE *outfile; +{ + prev_tab (outfile); + output_rbrace(outfile, "}\n"); +} /* end_else_out */ + + + +void compgoto_out (outfile, index, labels) +FILE *outfile; +expptr index, labels; +{ + if (index == ENULL) + err ("compgoto_out: null index for computed goto"); + else if (labels && labels -> tag != TLIST) + erri ("compgoto_out: expected label list, got tag '%d'", + labels -> tag); + else { + extern char *user_label (); + chainp elts; + int i = 1; + + nice_printf (outfile, "switch ("); + expr_out (outfile, index); + nice_printf (outfile, ") {\n"); + next_tab (outfile); + + for (elts = labels -> listblock.listp; elts; elts = elts -> nextp, i++) { + if (elts -> datap) { + if (ISICON(((expptr) (elts -> datap)))) + nice_printf (outfile, "case %d: goto %s;\n", i, + user_label(((expptr)(elts->datap))->constblock.Const.ci)); + else + err ("compgoto_out: bad label in label list"); + } /* if (elts -> datap) */ + } /* for elts */ + prev_tab (outfile); + nice_printf (outfile, "}\n"); + } /* else */ +} /* compgoto_out */ + + +void out_for (outfile, init, test, inc) +FILE *outfile; +expptr init, test, inc; +{ + nice_printf (outfile, "for ("); + expr_out (outfile, init); + nice_printf (outfile, "; "); + expr_out (outfile, test); + nice_printf (outfile, "; "); + expr_out (outfile, inc); + nice_printf (outfile, ") {\n"); + next_tab (outfile); +} /* out_for */ + + +void out_end_for (outfile) +FILE *outfile; +{ + prev_tab (outfile); + nice_printf (outfile, "}\n"); +} /* out_end_for */ diff --git a/sources/f2c/output.h b/sources/f2c/output.h new file mode 100644 index 0000000..9b0180f --- /dev/null +++ b/sources/f2c/output.h @@ -0,0 +1,65 @@ +/* nice_printf -- same arguments as fprintf. + + All output which is to become C code must be directed through this + function. For now, no buffering is done. Later on, every line of + output will be filtered to accomodate the style definitions (e.g. one + statement per line, spaces between function names and argument lists, + etc.) +*/ +#include "nicepr.h" + +extern int nice_printf (); + + +/* Definitions for the opcode table. The table is indexed by the macros + which are #defined in defines.h */ + +#define UNARY_OP 01 +#define BINARY_OP 02 + +#define SPECIAL_FMT NULL + +#define is_unary_op(x) (opcode_table[x].type == UNARY_OP) +#define is_binary_op(x) (opcode_table[x].type == BINARY_OP) +#define op_precedence(x) (opcode_table[x].prec) +#define op_format(x) (opcode_table[x].format) + +/* _assoc_table -- encodes left-associativity and right-associativity + information; indexed by precedence level. Only 2, 3, 14 are + right-associative. Source: Kernighan & Ritchie, p. 49 */ + +extern char _assoc_table[]; + +#define is_right_assoc(x) (_assoc_table [x]) +#define is_left_assoc(x) (! _assoc_table [x]) + + +typedef struct { + int type; /* UNARY_OP or BINARY_OP */ + int prec; /* Precedence level, useful for adjusting + number of parens to insert. Zero is a + special level, and 2, 3, 14 are + right-associative */ + char *format; +} table_entry; + + +extern char *fl_fmt_string; /* Float constant format string */ +extern char *db_fmt_string; /* Double constant format string */ +extern char *cm_fmt_string; /* Complex constant format string */ +extern char *dcm_fmt_string; /* Double Complex constant format string */ + +extern int indent; /* Number of spaces to indent; this is a + temporary fix */ +extern int tab_size; /* Number of spaces in each tab */ +extern int in_string; + +extern table_entry opcode_table[]; + + +void expr_out (), out_init (), out_addr (), out_const (); +void out_name (), extern_out (), out_asgoto (); +void out_if (), out_else (), elif_out (); +void endif_out (), end_else_out (); +void compgoto_out (), out_for (); +void out_end_for (), out_and_free_statement (); diff --git a/sources/f2c/p1defs.h b/sources/f2c/p1defs.h new file mode 100644 index 0000000..d3aebcf --- /dev/null +++ b/sources/f2c/p1defs.h @@ -0,0 +1,158 @@ +#define P1_UNKNOWN 0 +#define P1_COMMENT 1 /* Fortan comment string */ +#define P1_EOF 2 /* End of file dummy token */ +#define P1_SET_LINE 3 /* Reset the line counter */ +#define P1_FILENAME 4 /* Name of current input file */ +#define P1_NAME_POINTER 5 /* Pointer to hash table entry */ +#define P1_CONST 6 /* Some constant value */ +#define P1_EXPR 7 /* Followed by opcode */ + +/* The next two tokens could be grouped together, since they always come + from an Addr structure */ + +#define P1_IDENT 8 /* Char string identifier in addrp->user + field */ +#define P1_EXTERN 9 /* Pointer to external symbol entry */ + +#define P1_HEAD 10 /* Function header info */ +#define P1_LIST 11 /* A list of data (e.g. arguments) will + follow the tag, type, and count */ +#define P1_LITERAL 12 /* Hold the index into the literal pool */ +#define P1_LABEL 13 /* label value */ +#define P1_ASGOTO 14 /* Store the hash table pointer of + variable used in assigned goto */ +#define P1_GOTO 15 /* Store the statement number */ +#define P1_IF 16 /* store the condition as an expression */ +#define P1_ELSE 17 /* No data */ +#define P1_ELIF 18 /* store the condition as an expression */ +#define P1_ENDIF 19 /* Marks the end of a block IF */ +#define P1_ENDELSE 20 /* Marks the end of a block ELSE */ +#define P1_ADDR 21 /* Addr data; used for arrays, common and + equiv addressing, NOT for names, idents + or externs */ +#define P1_SUBR_RET 22 /* Subroutine return; the return expression + follows */ +#define P1_COMP_GOTO 23 /* Computed goto; has expr, label list */ +#define P1_FOR 24 /* C FOR loop; three expressions follow */ +#define P1_ENDFOR 25 /* End of C FOR loop */ +#define P1_FORTRAN 26 /* original Fortran source */ +#define P1_CHARP 27 /* user.Charp field -- for long names */ +#define P1_WHILE1START 28 /* start of DO WHILE */ +#define P1_WHILE2START 29 /* rest of DO WHILE */ +#define P1_PROCODE 30 /* invoke procode() -- to adjust params */ + +#define P1_FILENAME_MAX 256 /* max filename length to retain (for -g) */ +#define P1_STMTBUFSIZE 1400 + + + +#define COMMENT_BUFFER_SIZE 255 /* max number of chars in each comment */ +#define CONSTANT_STR_MAX 1000 /* max number of chars in string constant */ + +extern void p1put (/* int */); +extern void p1_comment (/* char * */); +extern void p1_label (/* int */); +extern void p1_line_number (/* int */); +extern void p1put_filename(); +extern void p1_expr (/* expptr */); +extern void p1_head (/* int, char * */); +extern void p1_if (/* expptr */); +extern void p1_else (); +extern void p1_elif (/* expptr */); +extern void p1_endif (); +extern void p1else_end (); +extern void p1_subr_ret (/* expptr */); +extern void p1_goto(/* long */); +extern void p1comp_goto (/* expptr, int, struct Labelblock *[] */); +extern void p1_for (/* expptr, expptr, expptr */); +extern void p1for_end (); + + +extern void p1puts (/* int, char * */); + +/* The pass 1 intermediate file has the following format: + + [ : [ [ ]]] \n + + e.g. 1: This is a comment + + This format is destined to change in the future, but for now a readable + form is more desirable than a compact form. + + NOTES ABOUT THE P1 FORMAT + ---------------------------------------------------------------------- + + P1_COMMENT: The comment string (in ) may be at most + COMMENT_BUFFER_SIZE bytes long. It must contain no newlines + or null characters. A side effect of the way comments are + read in lex.c is that no '\377' chars may be in a + comment either. + + P1_SET_LINE: holds the line number in the current source file. + + P1_INC_LINE: Increment the source line number; is empty. + + P1_NAME_POINTER: holds the integer representation of a + pointer into a hash table entry. + + P1_CONST: the first field in is a type tag (one of the + TYxxxx macros), the next field holds the constant + value + + P1_EXPR: holds the opcode number of the expression, + followed by the type of the expression (required for + OPCONV). Next is the value of vleng. + The type of operation represented by the + opcode determines how many of the following data items + are part of this expression. + + P1_IDENT: holds the type, then storage, then the + char string identifier in the addrp->user field. + + P1_EXTERN: holds an offset into the external symbol + table entry + + P1_HEAD: the first field in is the procedure class, the + second is the name of the procedure + + P1_LIST: the first field in is the tag, the second the + type of the list, the third the number of elements in + the list + + P1_LITERAL: holds the litnum of a value in the + literal pool. + + P1_LABEL: holds the statement number of the current + line + + P1_ASGOTO: holds the hash table pointer of the variable + + P1_GOTO: holds the statement number to jump to + + P1_IF: is empty, the following expression is the IF + condition. + + P1_ELSE: is empty. + + P1_ELIF: is empty, the following expression is the IF + condition. + + P1_ENDIF: is empty. + + P1_ENDELSE: is empty. + + P1_ADDR: holds a direct copy of the structure. The + next expression is a copy of vleng, and the next a + copy of memoffset. + + P1_SUBR_RET: The next token is an expression for the return value. + + P1_COMP_GOTO: The next token is an integer expression, the + following one a list of labels. + + P1_FOR: The next three expressions are the Init, Test, and + Increment expressions of a C FOR loop. + + P1_ENDFOR: Marks the end of the body of a FOR loop + +*/ diff --git a/sources/f2c/p1output.c b/sources/f2c/p1output.c new file mode 100644 index 0000000..68830e1 --- /dev/null +++ b/sources/f2c/p1output.c @@ -0,0 +1,564 @@ +/**************************************************************** +Copyright 1990 by AT&T Bell Laboratories and Bellcore. + +Permission to use, copy, modify, and distribute this software +and its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the names of AT&T Bell Laboratories or +Bellcore or any of their entities not be used in advertising or +publicity pertaining to distribution of the software without +specific, written prior permission. + +AT&T and Bellcore disclaim all warranties with regard to this +software, including all implied warranties of merchantability +and fitness. In no event shall AT&T or Bellcore be liable for +any special, indirect or consequential damages or any damages +whatsoever resulting from loss of use, data or profits, whether +in an action of contract, negligence or other tortious action, +arising out of or in connection with the use or performance of +this software. +****************************************************************/ + +#include "defs.h" +#include "p1defs.h" +#include "output.h" +#include "names.h" + + +static void p1_addr(), p1_big_addr(), p1_binary(), p1_const(), p1_list(), + p1_literal(), p1_name(), p1_unary(), p1putn(); +static void p1putd (/* int, int */); +static void p1putds (/* int, int, char * */); +static void p1putdds (/* int, int, int, char * */); +static void p1putdd (/* int, int, int */); +static void p1putddd (/* int, int, int, int */); + + +/* p1_comment -- save the text of a Fortran comment in the intermediate + file. Make sure that there are no spurious "/ *" or "* /" characters by + mapping them onto "/+" and "+/". str is assumed to hold no newlines and be + null terminated; it may be modified by this function. */ + +void p1_comment (str) +char *str; +{ + register unsigned char *pointer, *ustr; + + if (!str) + return; + +/* Get rid of any open or close comment combinations that may be in the + Fortran input */ + + ustr = (unsigned char *)str; + for(pointer = ustr; *pointer; pointer++) + if (*pointer == '*' && pointer[1] == '/') + *pointer = '+'; + /* trim trailing white space */ +#ifdef isascii + while(--pointer >= ustr && (!isascii(*pointer) || isspace(*pointer))); +#else + while(--pointer >= ustr && isspace(*pointer)); +#endif + pointer[1] = 0; + p1puts (P1_COMMENT, str); +} /* p1_comment */ + +void p1_line_number (line_number) +long line_number; +{ + + p1putd (P1_SET_LINE, line_number); +} /* p1_line_number */ + +/* p1_name -- Writes the address of a hash table entry into the + intermediate file */ + +static void p1_name (namep) +Namep namep; +{ + p1putd (P1_NAME_POINTER, (long) namep); + namep->visused = 1; +} /* p1_name */ + + + +void p1_expr (expr) +expptr expr; +{ +/* An opcode of 0 means a null entry */ + + if (expr == ENULL) { + p1putdd (P1_EXPR, 0, TYUNKNOWN); /* Should this be TYERROR? */ + return; + } /* if (expr == ENULL) */ + + switch (expr -> tag) { + case TNAME: + p1_name ((Namep) expr); + return; + case TCONST: + p1_const(&expr->constblock); + return; + case TEXPR: + /* Fall through the switch */ + break; + case TADDR: + p1_addr (&(expr -> addrblock)); + return; + case TPRIM: + warn ("p1_expr: got TPRIM"); + return; + case TLIST: + p1_list (&(expr -> listblock)); + return; + case TERROR: + return; + default: + erri ("p1_expr: bad tag '%d'", (int) (expr -> tag)); + return; + } /* switch */ + +/* Now we know that the tag is TEXPR */ + + if (is_unary_op (expr -> exprblock.opcode)) + p1_unary (&(expr -> exprblock)); + else if (is_binary_op (expr -> exprblock.opcode)) + p1_binary (&(expr -> exprblock)); + else + erri ("p1_expr: bad opcode '%d'", (int) expr -> exprblock.opcode); + +} /* p1_expr */ + + + +static void p1_const(cp) + register Constp cp; +{ + int type = cp->vtype; + expptr vleng = cp->vleng; + union Constant *c = &cp->Const; + char cdsbuf0[64], cdsbuf1[64]; + char *cds0, *cds1; + + switch (type) { + case TYSHORT: + case TYLONG: + case TYLOGICAL: + p1putdd (P1_CONST, type, (int)c -> ci); + break; + case TYREAL: + case TYDREAL: + fprintf(pass1_file, "%d: %d %s\n", P1_CONST, type, + cp->vstg ? c->cds[0] : cds(dtos(c->cd[0]), cdsbuf0)); + break; + case TYCOMPLEX: + case TYDCOMPLEX: + if (cp->vstg) { + cds0 = c->cds[0]; + cds1 = c->cds[1]; + } + else { + cds0 = cds(dtos(c->cd[0]), cdsbuf0); + cds1 = cds(dtos(c->cd[1]), cdsbuf1); + } + fprintf(pass1_file, "%d: %d %s %s\n", P1_CONST, type, + cds0, cds1); + break; + case TYCHAR: + if (vleng && !ISICON (vleng)) + erri("p1_const: bad vleng '%d'\n", (int) vleng); + else + fprintf(pass1_file, "%d: %d %lx\n", P1_CONST, type, + cpexpr((expptr)cp)); + break; + default: + erri ("p1_const: bad constant type '%d'", type); + break; + } /* switch */ +} /* p1_const */ + + +void p1_asgoto (addrp) +Addrp addrp; +{ + p1put (P1_ASGOTO); + p1_addr (addrp); +} /* p1_asgoto */ + + +void p1_goto (stateno) +ftnint stateno; +{ + p1putd (P1_GOTO, stateno); +} /* p1_goto */ + + +static void p1_addr (addrp) + register struct Addrblock *addrp; +{ + int stg; + + if (addrp == (struct Addrblock *) NULL) + return; + + stg = addrp -> vstg; + + if (ONEOF(stg, M(STGINIT)|M(STGREG)) + || ONEOF(stg, M(STGCOMMON)|M(STGEQUIV)) && + (!ISICON(addrp->memoffset) + || (addrp->uname_tag == UNAM_NAME + ? addrp->memoffset->constblock.Const.ci + != addrp->user.name->voffset + : addrp->memoffset->constblock.Const.ci)) + || ONEOF(stg, M(STGBSS)|M(STGINIT)|M(STGAUTO)|M(STGARG)) && + (!ISICON(addrp->memoffset) + || addrp->memoffset->constblock.Const.ci) + || addrp->Field || addrp->isarray || addrp->vstg == STGLENG) + { + p1_big_addr (addrp); + return; + } + +/* Write out a level of indirection for non-array arguments, which have + addrp -> memoffset set and are handled by p1_big_addr(). + Lengths are passed by value, so don't check STGLENG + 28-Jun-89 (dmg) Added the check for != TYCHAR + */ + + if (oneof_stg ( addrp -> uname_tag == UNAM_NAME ? addrp -> user.name : NULL, + stg, M(STGARG)|M(STGEQUIV)) && addrp->vtype != TYCHAR) { + p1putdd (P1_EXPR, OPWHATSIN, addrp -> vtype); + p1_expr (ENULL); /* Put dummy vleng */ + } /* if stg == STGARG */ + + switch (addrp -> uname_tag) { + case UNAM_NAME: + p1_name (addrp -> user.name); + break; + case UNAM_IDENT: + p1putdds(P1_IDENT, addrp->vtype, addrp->vstg, + addrp->user.ident); + break; + case UNAM_CHARP: + p1putdds(P1_CHARP, addrp->vtype, addrp->vstg, + addrp->user.Charp); + break; + case UNAM_EXTERN: + p1putd (P1_EXTERN, (long) addrp -> memno); + if (addrp->vclass == CLPROC) + extsymtab[addrp->memno].extype = addrp->vtype; + break; + case UNAM_CONST: + if (addrp -> memno != BAD_MEMNO) + p1_literal (addrp -> memno); + else + p1_const((struct Constblock *)addrp); + break; + case UNAM_UNKNOWN: + default: + erri ("p1_addr: unknown uname_tag '%d'", addrp -> uname_tag); + break; + } /* switch */ +} /* p1_addr */ + + +static void p1_list (listp) +struct Listblock *listp; +{ + chainp lis; + int count = 0; + + if (listp == (struct Listblock *) NULL) + return; + +/* Count the number of parameters in the list */ + + for (lis = listp -> listp; lis; lis = lis -> nextp) + count++; + + p1putddd (P1_LIST, listp -> tag, listp -> vtype, count); + + for (lis = listp -> listp; lis; lis = lis -> nextp) + p1_expr ((expptr) lis -> datap); + +} /* p1_list */ + + +void p1_label (lab) +long lab; +{ + if (parstate < INDATA) + earlylabs = mkchain((char *)lab, earlylabs); + else + p1putd (P1_LABEL, lab); + } + + + +static void p1_literal (memno) +long memno; +{ + p1putd (P1_LITERAL, memno); +} /* p1_literal */ + + +void p1_if (expr) +expptr expr; +{ + p1put (P1_IF); + p1_expr (expr); +} /* p1_if */ + + + + +void p1_elif (expr) +expptr expr; +{ + p1put (P1_ELIF); + p1_expr (expr); +} /* p1_elif */ + + + + +void p1_else () +{ + p1put (P1_ELSE); +} /* p1_else */ + + + + +void p1_endif () +{ + p1put (P1_ENDIF); +} /* p1_endif */ + + + + +void p1else_end () +{ + p1put (P1_ENDELSE); +} /* p1else_end */ + + +static void p1_big_addr (addrp) +Addrp addrp; +{ + if (addrp == (Addrp) NULL) + return; + + p1putn (P1_ADDR, sizeof (struct Addrblock), (char *) addrp); + p1_expr (addrp -> vleng); + p1_expr (addrp -> memoffset); + if (addrp->uname_tag == UNAM_NAME) + addrp->user.name->visused = 1; +} /* p1_big_addr */ + + + +static void p1_unary (e) +struct Exprblock *e; +{ + if (e == (struct Exprblock *) NULL) + return; + + p1putdd (P1_EXPR, (int) e -> opcode, e -> vtype); + p1_expr (e -> vleng); + + switch (e -> opcode) { + case OPNEG: + case OPNEG1: + case OPNOT: + case OPABS: + case OPBITNOT: + case OPPREINC: + case OPPREDEC: + case OPADDR: + case OPIDENTITY: + case OPCHARCAST: + case OPDABS: + p1_expr(e -> leftp); + break; + default: + erri ("p1_unary: bad opcode '%d'", (int) e -> opcode); + break; + } /* switch */ + +} /* p1_unary */ + + +static void p1_binary (e) +struct Exprblock *e; +{ + if (e == (struct Exprblock *) NULL) + return; + + p1putdd (P1_EXPR, e -> opcode, e -> vtype); + p1_expr (e -> vleng); + p1_expr (e -> leftp); + p1_expr (e -> rightp); +} /* p1_binary */ + + +void p1_head (class, name) +int class; +char *name; +{ + p1putds (P1_HEAD, class, name); +} /* p1_head */ + + +void p1_subr_ret (retexp) +expptr retexp; +{ + + p1put (P1_SUBR_RET); + p1_expr (retexp); +} /* p1_subr_ret */ + + + +void p1comp_goto (index, count, labels) +expptr index; +int count; +struct Labelblock *labels[]; +{ + struct Constblock c; + int i; + register struct Labelblock *L; + + p1put (P1_COMP_GOTO); + p1_expr (index); + +/* Write out a P1_LIST directly, to avoid the overhead of allocating a + list before it's needed HACK HACK HACK */ + + p1putddd (P1_LIST, TLIST, TYUNKNOWN, count); + c.vtype = TYLONG; + c.vleng = 0; + + for (i = 0; i < count; i++) { + L = labels[i]; + L->labused = 1; + c.Const.ci = L->stateno; + p1_const(&c); + } /* for i = 0 */ +} /* p1comp_goto */ + + + +void p1_for (init, test, inc) +expptr init, test, inc; +{ + p1put (P1_FOR); + p1_expr (init); + p1_expr (test); + p1_expr (inc); +} /* p1_for */ + + +void p1for_end () +{ + p1put (P1_ENDFOR); +} /* p1for_end */ + + + + +/* ---------------------------------------------------------------------- + The intermediate file actually gets written ONLY by the routines below. + To change the format of the file, you need only change these routines. + ---------------------------------------------------------------------- +*/ + + +/* p1puts -- Put a typed string into the Pass 1 intermediate file. Assumes that + str contains no newlines and is null-terminated. */ + +void p1puts (type, str) +int type; +char *str; +{ + fprintf (pass1_file, "%d: %s\n", type, str); +} /* p1puts */ + + +/* p1putd -- Put a typed integer into the Pass 1 intermediate file. */ + +static void p1putd (type, value) +int type; +long value; +{ + fprintf (pass1_file, "%d: %ld\n", type, value); +} /* p1_putd */ + + +/* p1putdd -- Put a typed pair of integers into the intermediate file. */ + +static void p1putdd (type, v1, v2) +int type, v1, v2; +{ + fprintf (pass1_file, "%d: %d %d\n", type, v1, v2); +} /* p1putdd */ + + +/* p1putddd -- Put a typed triple of integers into the intermediate file. */ + +static void p1putddd (type, v1, v2, v3) +int type, v1, v2, v3; +{ + fprintf (pass1_file, "%d: %d %d %d\n", type, v1, v2, v3); +} /* p1putddd */ + + union dL { + double d; + long L[2]; + }; + +static void p1putn (type, count, str) +int type, count; +char *str; +{ + int i; + + fprintf (pass1_file, "%d: ", type); + + for (i = 0; i < count; i++) + putc (str[i], pass1_file); + + putc ('\n', pass1_file); +} /* p1putn */ + + + +/* p1put -- Put a type marker into the intermediate file. */ + +void p1put(type) +int type; +{ + fprintf (pass1_file, "%d:\n", type); +} /* p1put */ + + + +static void p1putds (type, i, str) +int type; +int i; +char *str; +{ + fprintf (pass1_file, "%d: %d %s\n", type, i, str); +} /* p1putds */ + + +static void p1putdds (token, type, stg, str) +int token, type, stg; +char *str; +{ + fprintf (pass1_file, "%d: %d %d %s\n", token, type, stg, str); +} /* p1putdds */ diff --git a/sources/f2c/parse.h b/sources/f2c/parse.h new file mode 100644 index 0000000..0c386e8 --- /dev/null +++ b/sources/f2c/parse.h @@ -0,0 +1,39 @@ +#ifndef PARSE_INCLUDE +# define PARSE_INCLUDE + +/* macros for the parse_args routine */ + +#define P_STRING 1 /* Macros for the result_type attribute */ +#define P_CHAR 2 +#define P_SHORT 3 +#define P_LONG 4 +#define P_INT P_LONG +#define P_FILE 5 +#define P_OLD_FILE 6 +#define P_NEW_FILE 7 +#define P_FLOAT 8 +#define P_DOUBLE 9 + +#define P_CASE_INSENSITIVE 01 /* Macros for the flags attribute */ +#define P_REQUIRED_PREFIX 02 + +#define P_NO_ARGS 0 /* Macros for the arg_count attribute */ +#define P_ONE_ARG 1 +#define P_INFINITE_ARGS 2 + +#define p_entry(pref,swit,flag,count,type,store,size) \ + { (pref), (swit), (flag), (count), (type), (int *) (store), (size) } + +typedef struct { + char *prefix; + char *string; + int flags; + int count; + int result_type; + int *result_ptr; + int table_size; +} arg_info; + +extern int parse_args (); + +#endif diff --git a/sources/f2c/parsearg.c b/sources/f2c/parsearg.c new file mode 100644 index 0000000..c89252a --- /dev/null +++ b/sources/f2c/parsearg.c @@ -0,0 +1,508 @@ +/**************************************************************** +Copyright 1990 by AT&T Bell Laboratories and Bellcore. + +Permission to use, copy, modify, and distribute this software +and its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the names of AT&T Bell Laboratories or +Bellcore or any of their entities not be used in advertising or +publicity pertaining to distribution of the software without +specific, written prior permission. + +AT&T and Bellcore disclaim all warranties with regard to this +software, including all implied warranties of merchantability +and fitness. In no event shall AT&T or Bellcore be liable for +any special, indirect or consequential damages or any damages +whatsoever resulting from loss of use, data or profits, whether +in an action of contract, negligence or other tortious action, +arising out of or in connection with the use or performance of +this software. +****************************************************************/ + +/* parse_args + + This function will parse command line input into appropriate data + structures, output error messages when appropriate and provide some + minimal type conversion. + + Input to the function consists of the standard argc,argv + values, and a table which directs the parser. Each table entry has the + following components: + + prefix -- the (optional) switch character string, e.g. "-" "/" "=" + switch -- the command string, e.g. "o" "data" "file" "F" + flags -- control flags, e.g. CASE_INSENSITIVE, REQUIRED_PREFIX + arg_count -- number of arguments this command requires, e.g. 0 for + booleans, 1 for filenames, INFINITY for input files + result_type -- how to interpret the switch arguments, e.g. STRING, + CHAR, FILE, OLD_FILE, NEW_FILE + result_ptr -- pointer to storage for the result, be it a table or + a string or whatever + table_size -- if the arguments fill a table, the maximum number of + entries; if there are no arguments, the value to + load into the result storage + + Although the table can be used to hold a list of filenames, only + scalar values (e.g. pointers) can be stored in the table. No vector + processing will be done, only pointers to string storage will be moved. + + An example entry, which could be used to parse input filenames, is: + + "-", "o", 0, oo, OLD_FILE, infilenames, INFILE_TABLE_SIZE + +*/ + +#include +#ifndef NULL +/* ANSI C */ +#include +#endif +#include "parse.h" +#include /* For atof */ +#include + +#define MAX_INPUT_SIZE 1000 + +#define arg_prefix(x) ((x).prefix) +#define arg_string(x) ((x).string) +#define arg_flags(x) ((x).flags) +#define arg_count(x) ((x).count) +#define arg_result_type(x) ((x).result_type) +#define arg_result_ptr(x) ((x).result_ptr) +#define arg_table_size(x) ((x).table_size) + +#ifndef TRUE +#define TRUE 1 +#endif +#ifndef FALSE +#define FALSE 0 +#endif +typedef int boolean; + + +char *lower_string (/* char [], char * */); + +static char *this_program = ""; + +extern long atol(); +static int arg_parse (/* char *, arg_info * */); + + +boolean parse_args (argc, argv, table, entries, others, other_count) +int argc; +char *argv[]; +arg_info table[]; +int entries; +char *others[]; +int other_count; +{ + boolean arg_verify (/* argv, table, entries */); + void init_store (/* table, entries */); + + boolean result; + + if (argv) + this_program = argv[0]; + +/* Check the validity of the table and its parameters */ + + result = arg_verify (argv, table, entries); + +/* Initialize the storage values */ + + init_store (table, entries); + + if (result) { + boolean use_prefix = TRUE; + + argc--; + argv++; + while (argc) { + int index, length; + + index = match_table (*argv, table, entries, use_prefix, &length); + if (index < 0) { + +/* The argument doesn't match anything in the table */ + + if (others) { + +/* Might want to filter out those strings which appear after earlier + switches in the current word. That is, only treat argv as valid if + use_prefix is true. Right now, any extra chars will be passed on */ + + if (other_count > 0) { + *others++ = *argv; + other_count--; + } else { + fprintf (stderr, "%s: too many parameters: ", + this_program); + fprintf (stderr, "'%s' ignored\n", *argv); + } /* else */ + } /* if (others) */ + argv++; + argc--; + } else { + +/* A match was found */ + + if (length >= strlen (*argv)) { + argc--; + argv++; + use_prefix = TRUE; + } else { + (*argv) += length; + use_prefix = FALSE; + } /* else */ + +/* Parse any necessary arguments */ + + if (arg_count (table[index]) != P_NO_ARGS) { + +/* Now length will be used to store the number of parsed characters */ + + length = arg_parse(*argv, &table[index]); + if (*argv == NULL) + argc = 0; + else if (length >= strlen (*argv)) { + argc--; + argv++; + use_prefix = TRUE; + } else { + (*argv) += length; + use_prefix = FALSE; + } /* else */ + } /* if (argv_count != P_NO_ARGS) */ + else + *arg_result_ptr(table[index]) = + arg_table_size(table[index]); + } /* else */ + } /* while (argc) */ + } /* if (result) */ + + return result; +} /* parse_args */ + + +boolean arg_verify (argv, table, entries) +char *argv[]; +arg_info table[]; +int entries; +{ + int i; + char *this_program = ""; + + if (argv) + this_program = argv[0]; + + for (i = 0; i < entries; i++) { + arg_info *arg = &table[i]; + +/* Check the argument flags */ + + if (arg_flags (*arg) & ~(P_CASE_INSENSITIVE | P_REQUIRED_PREFIX)) { + fprintf (stderr, "%s [arg_verify]: too many ", this_program); + fprintf (stderr, "flags in entry %d: '%x' (hex)\n", i, + arg_flags (*arg)); + } /* if */ + +/* Check the argument count */ + + { int count = arg_count (*arg); + + if (count != P_NO_ARGS && count != P_ONE_ARG && count != + P_INFINITE_ARGS) { + fprintf (stderr, "%s [arg_verify]: invalid ", this_program); + fprintf (stderr, "argument count in entry %d: '%d'\n", i, + count); + } /* if count != P_NO_ARGS ... */ + +/* Check the result field; want to be able to store results */ + + else + if (arg_result_ptr (*arg) == (int *) NULL) { + fprintf (stderr, "%s [arg_verify]: ", this_program); + fprintf (stderr, "no argument storage given for "); + fprintf (stderr, "entry %d\n", i); + } /* if arg_result_ptr */ + } + +/* Check the argument type */ + + { int type = arg_result_type (*arg); + + if (type != P_STRING && + type != P_CHAR && + type != P_SHORT && + type != P_LONG && + type != P_INT && + type != P_FILE && + type != P_OLD_FILE && + type != P_NEW_FILE && + type != P_FLOAT && + type != P_DOUBLE) { + fprintf (stderr, "%s [arg_verify]: bad ", this_program); + fprintf (stderr, "arg type in entry %d: '%d'\n", i, + type); + } /* if type != .... */ + } + +/* Check table size */ + + { int size = arg_table_size (*arg); + + if (arg_count (*arg) == P_INFINITE_ARGS && size < 1) { + fprintf (stderr, "%s [arg_verify]: bad ", this_program); + fprintf (stderr, "table size in entry %d: '%d'\n", i, + size); + } /* if (arg_count == P_INFINITE_ARGS && size < 1) */ + } + + } /* for i = 0 */ + + return TRUE; +} /* arg_verify */ + + +/* match_table -- returns the index of the best entry matching the input, + -1 if no match. The best match is the one of longest length which + appears lowest in the table. The length of the match will be returned + in length ONLY IF a match was found. */ + +int match_table (norm_input, table, entries, use_prefix, length) +register char *norm_input; +arg_info table[]; +int entries; +boolean use_prefix; +int *length; +{ + extern int match (/* char *, char *, arg_info *, boolean */); + + char low_input[MAX_INPUT_SIZE]; + register int i; + int best_index = -1, best_length = 0; + +/* FUNCTION BODY */ + + (void) lower_string (low_input, norm_input); + + for (i = 0; i < entries; i++) { + int this_length = match (norm_input, low_input, &table[i], use_prefix); + + if (this_length > best_length) { + best_index = i; + best_length = this_length; + } /* if (this_length > best_length) */ + } /* for (i = 0) */ + + if (best_index > -1 && length != (int *) NULL) + *length = best_length; + + return best_index; +} /* match_table */ + + +/* match -- takes an input string and table entry, and returns the length + of the longer match. + + 0 ==> input doesn't match + + For example: + + INPUT PREFIX STRING RESULT +---------------------------------------------------------------------- + "abcd" "-" "d" 0 + "-d" "-" "d" 2 (i.e. "-d") + "dout" "-" "d" 1 (i.e. "d") + "-d" "" "-d" 2 (i.e. "-d") + "dd" "d" "d" 2 <= here's the weird one +*/ + +int match (norm_input, low_input, entry, use_prefix) +char *norm_input, *low_input; +arg_info *entry; +boolean use_prefix; +{ + char *norm_prefix = arg_prefix (*entry); + char *norm_string = arg_string (*entry); + boolean prefix_match = FALSE, string_match = FALSE; + int result = 0; + +/* Buffers for the lowercased versions of the strings being compared. + These are used when the switch is to be case insensitive */ + + static char low_prefix[MAX_INPUT_SIZE]; + static char low_string[MAX_INPUT_SIZE]; + int prefix_length = strlen (norm_prefix); + int string_length = strlen (norm_string); + +/* Pointers for the required strings (lowered or nonlowered) */ + + register char *input, *prefix, *string; + +/* FUNCTION BODY */ + +/* Use the appropriate strings to handle case sensitivity */ + + if (arg_flags (*entry) & P_CASE_INSENSITIVE) { + input = low_input; + prefix = lower_string (low_prefix, norm_prefix); + string = lower_string (low_string, norm_string); + } else { + input = norm_input; + prefix = norm_prefix; + string = norm_string; + } /* else */ + +/* First, check the string formed by concatenating the prefix onto the + switch string, but only when the prefix is not being ignored */ + + if (use_prefix && prefix != NULL && *prefix != '\0') + prefix_match = (strncmp (input, prefix, prefix_length) == 0) && + (strncmp (input + prefix_length, string, string_length) == 0); + +/* Next, check just the switch string, if that's allowed */ + + if (!use_prefix && (arg_flags (*entry) & P_REQUIRED_PREFIX) == 0) + string_match = strncmp (input, string, string_length) == 0; + + if (prefix_match) + result = prefix_length + string_length; + else if (string_match) + result = string_length; + + return result; +} /* match */ + + +char *lower_string (dest, src) +char *dest, *src; +{ + char *result = dest; + register int c; + + if (dest == NULL || src == NULL) + result = NULL; + else + while (*dest++ = (c = *src++) >= 'A' && c <= 'Z' ? tolower(c) : c); + + return result; +} /* lower_string */ + + +/* arg_parse -- returns the number of characters parsed for this entry */ + +static int arg_parse (str, entry) +char *str; +arg_info *entry; +{ + int length = 0; + + if (arg_count (*entry) == P_ONE_ARG) { + char **store = (char **) arg_result_ptr (*entry); + + length = put_one_arg (arg_result_type (*entry), str, store, + arg_prefix (*entry), arg_string (*entry)); + + } /* if (arg_count == P_ONE_ARG) */ + else { /* Must be a table of arguments */ + char **store = (char **) arg_result_ptr (*entry); + + if (store) { + while (*store) + store++; + + length = put_one_arg (arg_result_type (*entry), str, store++, + arg_prefix (*entry), arg_string (*entry)); + + *store = (char *) NULL; + } /* if (store) */ + } /* else */ + + return length; +} /* arg_parse */ + + +int put_one_arg (type, str, store, prefix, string) +int type; +char *str; +char **store; +char *prefix, *string; +{ + int length = 0; + + if (store) { + switch (type) { + case P_STRING: + case P_FILE: + case P_OLD_FILE: + case P_NEW_FILE: + *store = str; + if (str == NULL) + fprintf (stderr, "%s: Missing argument after '%s%s'\n", + this_program, prefix, string); + length = str ? strlen (str) : 0; + break; + case P_CHAR: + *((char *) store) = *str; + length = 1; + break; + case P_SHORT: { + long int i = atol(str); + + *((short *) store) = (short) i; + if (i > 32767 || i < -32768) { + fprintf (stderr, "%s%s parameter '%ld' is not a ", + prefix, string, i); + fprintf (stderr, "SHORT INT (truncating to %d)\n", + (short) (*store)); + } /* if i > 32767 || i < -32768 */ + +/* This is pessimistic, and should change */ + + length = strlen (str); + break; } + case P_LONG: + *((int *) store) = atol(str); + +/* This is pessimistic too */ + + length = strlen (str); + break; + case P_FLOAT: + *((float *) store) = (float) atof (str); + length = strlen (str); + break; + case P_DOUBLE: + *((double *) store) = (double) atof (str); + length = strlen (str); + break; + default: + fprintf (stderr, "put_one_arg: bad type '%d'\n", + type); + break; + } /* switch */ + } /* if (store) */ + + return length; +} /* put_one_arg */ + + +void init_store (table, entries) +arg_info *table; +int entries; +{ + int index; + + for (index = 0; index < entries; index++) + if (arg_count (table[index]) == P_INFINITE_ARGS) { + char **place = (char **) arg_result_ptr (table[index]); + + if (place) + *place = (char *) NULL; + } /* if arg_count == P_INFINITE_ARGS */ + +} /* init_store */ + diff --git a/sources/f2c/pccdefs.h b/sources/f2c/pccdefs.h new file mode 100644 index 0000000..bde8117 --- /dev/null +++ b/sources/f2c/pccdefs.h @@ -0,0 +1,64 @@ +/* The following numbers are strange, and implementation-dependent */ + +#define P2BAD -1 +#define P2NAME 2 +#define P2ICON 4 /* Integer constant */ +#define P2PLUS 6 +#define P2PLUSEQ 7 +#define P2MINUS 8 +#define P2NEG 10 +#define P2STAR 11 +#define P2STAREQ 12 +#define P2INDIRECT 13 +#define P2BITAND 14 +#define P2BITOR 17 +#define P2BITXOR 19 +#define P2QUEST 21 +#define P2COLON 22 +#define P2ANDAND 23 +#define P2OROR 24 +#define P2GOTO 37 +#define P2LISTOP 56 +#define P2ASSIGN 58 +#define P2COMOP 59 +#define P2SLASH 60 +#define P2MOD 62 +#define P2LSHIFT 64 +#define P2RSHIFT 66 +#define P2CALL 70 +#define P2CALL0 72 + +#define P2NOT 76 +#define P2BITNOT 77 +#define P2EQ 80 +#define P2NE 81 +#define P2LE 82 +#define P2LT 83 +#define P2GE 84 +#define P2GT 85 +#define P2REG 94 +#define P2OREG 95 +#define P2CONV 104 +#define P2FORCE 108 +#define P2CBRANCH 109 + +/* special operators included only for fortran's use */ + +#define P2PASS 200 +#define P2STMT 201 +#define P2SWITCH 202 +#define P2LBRACKET 203 +#define P2RBRACKET 204 +#define P2EOF 205 +#define P2ARIF 206 +#define P2LABEL 207 + +#define P2SHORT 3 +#define P2INT 4 +#define P2LONG 4 + +#define P2CHAR 2 +#define P2REAL 6 +#define P2DREAL 7 +#define P2PTR 020 +#define P2FUNCT 040 diff --git a/sources/f2c/pread.c b/sources/f2c/pread.c new file mode 100644 index 0000000..271f9a7 --- /dev/null +++ b/sources/f2c/pread.c @@ -0,0 +1,882 @@ +/**************************************************************** +Copyright 1990 by AT&T Bell Laboratories and Bellcore. + +Permission to use, copy, modify, and distribute this software +and its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the names of AT&T Bell Laboratories or +Bellcore or any of their entities not be used in advertising or +publicity pertaining to distribution of the software without +specific, written prior permission. + +AT&T and Bellcore disclaim all warranties with regard to this +software, including all implied warranties of merchantability +and fitness. In no event shall AT&T or Bellcore be liable for +any special, indirect or consequential damages or any damages +whatsoever resulting from loss of use, data or profits, whether +in an action of contract, negligence or other tortious action, +arising out of or in connection with the use or performance of +this software. +****************************************************************/ + +#include "defs.h" + + static char Ptok[128], Pct[256]; + static char *Pfname; + static long Plineno; + static int Pbad; + static int *tfirst, *tlast, *tnext, tmax; + +#define P_space 1 +#define P_anum 2 +#define P_delim 3 +#define P_slash 4 + +#define TGULP 100 + + static void +trealloc() +{ + char *realloc(); + int k = tmax; + tfirst = (int *)realloc((char *)tfirst, + (tmax += TGULP)*sizeof(int)); + if (!tfirst) { + fprintf(stderr, + "Pfile: realloc failure!\n"); + exit(2); + } + tlast = tfirst + tmax; + tnext = tfirst + k; + } + + static void +badchar(c) + int c; +{ + fprintf(stderr, + "unexpected character 0x%.2x = '%c' on line %ld of %s\n", + c, c, Plineno, Pfname); + exit(2); + } + + static void +bad_type() +{ + fprintf(stderr, + "unexpected type \"%s\" on line %ld of %s\n", + Ptok, Plineno, Pfname); + exit(2); + } + + static void +badflag(tname, option) + char *tname, *option; +{ + fprintf(stderr, "%s type from `f2c -%s` on line %ld of %s\n", + tname, option, Plineno, Pfname); + Pbad++; + } + + static void +detected(msg) + char *msg; +{ + fprintf(stderr, + "%sdetected on line %ld of %s\n", msg, Plineno, Pfname); + Pbad++; + } + + static void +checklogical(k) + int k; +{ + static int lastmsg = 0; + static int seen[2] = {0,0}; + + seen[k] = 1; + if (seen[1-k]) { + if (lastmsg < 3) { + lastmsg = 3; + detected( + "Illegal combination of LOGICAL types -- mixing -I4 with -I2 or -i2\n\t"); + } + return; + } + if (k) { + if (tylogical == TYLONG || lastmsg >= 2) + return; + if (!lastmsg) { + lastmsg = 2; + badflag("LOGICAL", "I4"); + } + } + else { + if (tylogical == TYSHORT || lastmsg & 1) + return; + if (!lastmsg) { + lastmsg = 1; + badflag("LOGICAL", "i2` or `f2c -I2"); + } + } + } + + static void +checkreal(k) +{ + static int warned = 0; + static int seen[2] = {0,0}; + + seen[k] = 1; + if (seen[1-k]) { + if (warned < 2) + detected("Illegal mixture of -R and -!R "); + warned = 2; + return; + } + if (k == forcedouble || warned) + return; + warned = 1; + badflag("REAL return", k ? "!R" : "R"); + } + + static void +Pnotboth(e) + Extsym *e; +{ + if (e->curno) + return; + Pbad++; + e->curno = 1; + fprintf(stderr, + "%s cannot be both a procedure and a common block (line %ld of %s)\n", + e->fextname, Plineno, Pfname); + } + + static int +numread(pf, n) + register FILE *pf; + int *n; +{ + register int c, k; + + if ((c = getc(pf)) < '0' || c > '9') + return c; + k = c - '0'; + for(;;) { + if ((c = getc(pf)) == ' ') { + *n = k; + return c; + } + if (c < '0' || c > '9') + break; + k = 10*k + c - '0'; + } + return c; + } + + static void argverify(), Pbadret(); + + static int +readref(pf, e, ftype) + register FILE *pf; + Extsym *e; + int ftype; +{ + register int c, *t; + int i, nargs, type; + Argtypes *at; + Atype *a, *ae; + + if (ftype > TYSUBR) + return 0; + if ((c = numread(pf, &nargs)) != ' ') { + if (c != ':') + return c == EOF; + /* just a typed external */ + if (e->extstg == STGUNKNOWN) { + at = 0; + goto justsym; + } + if (e->extstg == STGEXT) { + if (e->extype != ftype) + Pbadret(ftype, e); + } + else + Pnotboth(e); + return 0; + } + + tnext = tfirst; + for(i = 0; i < nargs; i++) { + if ((c = numread(pf, &type)) != ' ' + || type >= 500 + || type != TYFTNLEN + 100 && type % 100 > TYSUBR) + return c == EOF; + if (tnext >= tlast) + trealloc(); + *tnext++ = type; + } + + if (e->extstg == STGUNKNOWN) { + save_at: + at = (Argtypes *) + gmem(sizeof(Argtypes) + (nargs-1)*sizeof(Atype), 1); + at->nargs = nargs; + at->changes = 0; + t = tfirst; + a = at->atypes; + for(ae = a + nargs; a < ae; a++) { + a->type = *t++; + a->cp = 0; + } + justsym: + e->extstg = STGEXT; + e->extype = ftype; + e->arginfo = at; + } + else if (e->extstg != STGEXT) { + Pnotboth(e); + } + else if (!e->arginfo) { + if (e->extype != ftype) + Pbadret(ftype, e); + else + goto save_at; + } + else + argverify(ftype, e); + return 0; + } + + static int +comlen(pf) + register FILE *pf; +{ + register int c; + register char *s, *se; + char buf[128], cbuf[128]; + int refread; + long L; + Extsym *e; + + if ((c = getc(pf)) == EOF) + return 1; + if (c == ' ') { + refread = 0; + s = "comlen "; + } + else if (c == ':') { + refread = 1; + s = "ref: "; + } + else { + ret0: + if (c == '*') + ungetc(c,pf); + return 0; + } + while(*s) { + if ((c = getc(pf)) == EOF) + return 1; + if (c != *s++) + goto ret0; + } + s = buf; + se = buf + sizeof(buf) - 1; + for(;;) { + if ((c = getc(pf)) == EOF) + return 1; + if (c == ' ') + break; + if (s >= se || Pct[c] != P_anum) + goto ret0; + *s++ = c; + } + *s-- = 0; + if (s <= buf || *s != '_') + return 0; + strcpy(cbuf,buf); + *s-- = 0; + if (*s == '_') { + *s-- = 0; + if (s <= buf) + return 0; + } + for(L = 0;;) { + if ((c = getc(pf)) == EOF) + return 1; + if (c == ' ') + break; + if (c < '0' && c > '9') + goto ret0; + L = 10*L + c - '0'; + } + if (!L && !refread) + return 0; + e = mkext(buf, cbuf); + if (refread) + return readref(pf, e, (int)L); + if (e->extstg == STGUNKNOWN) { + e->extstg = STGCOMMON; + e->maxleng = L; + } + else if (e->extstg != STGCOMMON) + Pnotboth(e); + else if (e->maxleng != L) { + fprintf(stderr, + "incompatible lengths for common block %s (line %ld of %s)\n", + buf, Plineno, Pfname); + if (e->maxleng < L) + e->maxleng = L; + } + return 0; + } + + static int +Ptoken(pf, canend) + FILE *pf; + int canend; +{ + register int c; + register char *s, *se; + + top: + for(;;) { + c = getc(pf); + if (c == EOF) { + if (canend) + return 0; + goto badeof; + } + if (Pct[c] != P_space) + break; + if (c == '\n') + Plineno++; + } + switch(Pct[c]) { + case P_anum: + if (c == '_') + badchar(c); + s = Ptok; + se = s + sizeof(Ptok) - 1; + do { + if (s < se) + *s++ = c; + if ((c = getc(pf)) == EOF) { + badeof: + fprintf(stderr, + "unexpected end of file in %s\n", + Pfname); + exit(2); + } + } + while(Pct[c] == P_anum); + ungetc(c,pf); + *s = 0; + return P_anum; + + case P_delim: + return c; + + case P_slash: + if ((c = getc(pf)) != '*') { + if (c == EOF) + goto badeof; + badchar('/'); + } + if (canend && comlen(pf)) + goto badeof; + for(;;) { + while((c = getc(pf)) != '*') { + if (c == EOF) + goto badeof; + if (c == '\n') + Plineno++; + } + slashseek: + switch(getc(pf)) { + case '/': + goto top; + case EOF: + goto badeof; + case '*': + goto slashseek; + } + } + default: + badchar(c); + } + /* NOT REACHED */ + return 0; + } + + static int +Pftype() +{ + switch(Ptok[0]) { + case 'C': + if (!strcmp(Ptok+1, "_f")) + return TYCOMPLEX; + break; + case 'E': + if (!strcmp(Ptok+1, "_f")) { + /* TYREAL under forcedouble */ + checkreal(1); + return TYREAL; + } + break; + case 'H': + if (!strcmp(Ptok+1, "_f")) + return TYCHAR; + break; + case 'Z': + if (!strcmp(Ptok+1, "_f")) + return TYDCOMPLEX; + break; + case 'd': + if (!strcmp(Ptok+1, "oublereal")) + return TYDREAL; + break; + case 'i': + if (!strcmp(Ptok+1, "nt")) + return TYSUBR; + if (!strcmp(Ptok+1, "nteger")) + return TYLONG; + break; + case 'l': + if (!strcmp(Ptok+1, "ogical")) { + checklogical(1); + return TYLOGICAL; + } + break; + case 'r': + if (!strcmp(Ptok+1, "eal")) { + checkreal(0); + return TYREAL; + } + break; + case 's': + if (!strcmp(Ptok+1, "hortint")) + return TYSHORT; + if (!strcmp(Ptok+1, "hortlogical")) { + checklogical(0); + return TYLOGICAL; + } + break; + } + bad_type(); + /* NOT REACHED */ + return 0; + } + + static void +wanted(i, what) + int i; + char *what; +{ + if (i != P_anum) { + Ptok[0] = i; + Ptok[1] = 0; + } + fprintf(stderr,"Error: expected %s, not \"%s\" (line %ld of %s)\n", + what, Ptok, Plineno, Pfname); + exit(2); + } + + static int +Ptype(pf) + FILE *pf; +{ + int i, rv; + + i = Ptoken(pf,0); + if (i == ')') + return 0; + if (i != P_anum) + badchar(i); + + rv = 0; + switch(Ptok[0]) { + case 'C': + if (!strcmp(Ptok+1, "_fp")) + rv = TYCOMPLEX+200; + break; + case 'D': + if (!strcmp(Ptok+1, "_fp")) + rv = TYDREAL+200; + break; + case 'E': + case 'R': + if (!strcmp(Ptok+1, "_fp")) + rv = TYREAL+200; + break; + case 'H': + if (!strcmp(Ptok+1, "_fp")) + rv = TYCHAR+200; + break; + case 'I': + if (!strcmp(Ptok+1, "_fp")) + rv = TYLONG+200; + break; + case 'J': + if (!strcmp(Ptok+1, "_fp")) + rv = TYSHORT+200; + break; + case 'K': + checklogical(0); + goto Logical; + case 'L': + checklogical(1); + Logical: + if (!strcmp(Ptok+1, "_fp")) + rv = TYLOGICAL+200; + break; + case 'S': + if (!strcmp(Ptok+1, "_fp")) + rv = TYSUBR+200; + break; + case 'U': + if (!strcmp(Ptok+1, "_fp")) + rv = TYUNKNOWN+300; + break; + case 'Z': + if (!strcmp(Ptok+1, "_fp")) + rv = TYDCOMPLEX+200; + break; + case 'c': + if (!strcmp(Ptok+1, "har")) + rv = TYCHAR; + else if (!strcmp(Ptok+1, "omplex")) + rv = TYCOMPLEX; + break; + case 'd': + if (!strcmp(Ptok+1, "oublereal")) + rv = TYDREAL; + else if (!strcmp(Ptok+1, "oublecomplex")) + rv = TYDCOMPLEX; + break; + case 'f': + if (!strcmp(Ptok+1, "tnlen")) + rv = TYFTNLEN+100; + break; + case 'i': + if (!strcmp(Ptok+1, "nteger")) + rv = TYLONG; + break; + case 'l': + if (!strcmp(Ptok+1, "ogical")) { + checklogical(1); + rv = TYLOGICAL; + } + break; + case 'r': + if (!strcmp(Ptok+1, "eal")) + rv = TYREAL; + break; + case 's': + if (!strcmp(Ptok+1, "hortint")) + rv = TYSHORT; + else if (!strcmp(Ptok+1, "hortlogical")) { + checklogical(0); + rv = TYLOGICAL; + } + break; + case 'v': + if (tnext == tfirst && !strcmp(Ptok+1, "oid")) { + if ((i = Ptoken(pf,0)) != /*(*/ ')') + wanted(i, /*(*/ "\")\""); + return 0; + } + } + if (!rv) + bad_type(); + if (rv < 100 && (i = Ptoken(pf,0)) != '*') + wanted(i, "\"*\""); + if ((i = Ptoken(pf,0)) == P_anum) + i = Ptoken(pf,0); /* skip variable name */ + switch(i) { + case ')': + ungetc(i,pf); + break; + case ',': + break; + default: + wanted(i, "\",\" or \")\""); + } + return rv; + } + + static char * +trimunder() +{ + register char *s; + register int n; + static char buf[128]; + + s = Ptok + strlen(Ptok) - 1; + if (*s != '_') { + fprintf(stderr, + "warning: %s does not end in _ (line %ld of %s)\n", + Ptok, Plineno, Pfname); + return Ptok; + } + if (s[-1] == '_') + s--; + strncpy(buf, Ptok, n = s - Ptok); + buf[n] = 0; + return buf; + } + + static void +Pbadmsg(msg, p) + char *msg; + Extsym *p; +{ + Pbad++; + fprintf(stderr, "%s for %s (line %ld of %s):\n\t", msg, + p->fextname, Plineno, Pfname); + p->arginfo->nargs = -1; + } + + char *Argtype(); + + static void +Pbadret(ftype, p) + int ftype; + Extsym *p; +{ + char buf1[32], buf2[32]; + + Pbadmsg("inconsistent types",p); + fprintf(stderr, "here %s, previously %s\n", + Argtype(ftype+200,buf1), + Argtype(p->extype+200,buf2)); + } + + static void +argverify(ftype, p) + int ftype; + Extsym *p; +{ + Argtypes *at; + register Atype *aty; + int i, j, k; + register int *t, *te; + char buf1[32], buf2[32]; + int type_fixup(); + + at = p->arginfo; + if (at->nargs < 0) + return; + if (p->extype != ftype) { + Pbadret(ftype, p); + return; + } + t = tfirst; + te = tnext; + i = te - t; + if (at->nargs != i) { + j = at->nargs; + Pbadmsg("differing numbers of arguments",p); + fprintf(stderr, "here %d, previously %d\n", + i, j); + return; + } + for(aty = at->atypes; t < te; t++, aty++) { + if (*t == aty->type) + continue; + j = aty->type; + k = *t; + if (k >= 300 || k == j) + continue; + if (j >= 300) { + if (k >= 200) { + if (k == TYUNKNOWN + 200) + continue; + if (j % 100 != k - 200 + && k != TYSUBR + 200 + && j != TYUNKNOWN + 300 + && !type_fixup(at,aty,k)) + goto badtypes; + } + else if (j % 100 % TYSUBR != k % TYSUBR + && !type_fixup(at,aty,k)) + goto badtypes; + } + else if (k < 200 || j < 200) + goto badtypes; + else if (k == TYUNKNOWN+200) + continue; + else if (j != TYUNKNOWN+200) + { + badtypes: + Pbadmsg("differing calling sequences",p); + i = t - tfirst + 1; + fprintf(stderr, + "arg %d: here %s, prevously %s\n", + i, Argtype(k,buf1), Argtype(j,buf2)); + return; + } + /* We've subsequently learned the right type, + as in the call on zoo below... + + subroutine foo(x, zap) + external zap + call goo(zap) + x = zap(3) + call zoo(zap) + end + */ + aty->type = k; + at->changes = 1; + } + } + + static void +newarg(ftype, p) + int ftype; + Extsym *p; +{ + Argtypes *at; + register Atype *aty; + register int *t, *te; + int i, k; + + if (p->extstg == STGCOMMON) { + Pnotboth(p); + return; + } + p->extstg = STGEXT; + p->extype = ftype; + p->exproto = 1; + t = tfirst; + te = tnext; + i = te - t; + k = sizeof(Argtypes) + (i-1)*sizeof(Atype); + at = p->arginfo = (Argtypes *)gmem(k,1); + at->nargs = i; + at->changes = 0; + for(aty = at->atypes; t < te; aty++) { + aty->type = *t++; + aty->cp = 0; + } + } + + static int +Pfile(fname) + char *fname; +{ + char *s; + int ftype, i; + FILE *pf; + Extsym *p; + + for(s = fname; *s; s++); + if (s - fname < 2 + || s[-2] != '.' + || (s[-1] != 'P' && s[-1] != 'p')) + return 0; + + if (!(pf = fopen(fname, textread))) { + fprintf(stderr, "can't open %s\n", fname); + exit(2); + } + Pfname = fname; + Plineno = 1; + if (!Pct[' ']) { + for(s = " \t\n\r\v\f"; *s; s++) + Pct[*s] = P_space; + for(s = "*,();"; *s; s++) + Pct[*s] = P_delim; + for(i = '0'; i <= '9'; i++) + Pct[i] = P_anum; + for(s = "abcdefghijklmnopqrstuvwxyz"; i = *s; s++) + Pct[i] = Pct[i+'A'-'a'] = P_anum; + Pct['_'] = P_anum; + Pct['/'] = P_slash; + } + + for(;;) { + if (!(i = Ptoken(pf,1))) + break; + if (i != P_anum + || !strcmp(Ptok, "extern") + && (i = Ptoken(pf,0)) != P_anum) + badchar(i); + ftype = Pftype(); + getname: + if ((i = Ptoken(pf,0)) != P_anum) + badchar(i); + p = mkext(trimunder(), Ptok); + + if ((i = Ptoken(pf,0)) != '(') + badchar(i); + tnext = tfirst; + while(i = Ptype(pf)) { + if (tnext >= tlast) + trealloc(); + *tnext++ = i; + } + if (p->arginfo) + argverify(ftype, p); + else + newarg(ftype, p); + i = Ptoken(pf,0); + switch(i) { + case ';': + break; + case ',': + goto getname; + default: + wanted(i, "\";\" or \",\""); + } + } + fclose(pf); + return 1; + } + + void +read_Pfiles(ffiles) + char **ffiles; +{ + char **f1files, **f1files0, *s; + int k; + register Extsym *e, *ee; + register Argtypes *at; + extern int retcode; + + f1files0 = f1files = ffiles; + while(s = *ffiles++) + if (!Pfile(s)) + *f1files++ = s; + if (Pbad) + retcode = 8; + if (tfirst) { + free((char *)tfirst); + /* following should be unnecessary, as we won't be back here */ + tfirst = tnext = tlast = 0; + tmax = 0; + } + *f1files = 0; + if (f1files == f1files0) + f1files[1] = 0; + + k = 0; + ee = nextext; + for (e = extsymtab; e < ee; e++) + if (e->extstg == STGEXT + && (at = e->arginfo)) { + if (at->nargs < 0 || at->changes) + k++; + at->changes = 2; + } + if (k) { + fprintf(diagfile, + "%d prototype%s updated while reading prototypes.\n", k, + k > 1 ? "s" : ""); + } + fflush(diagfile); + } diff --git a/sources/f2c/proc.c b/sources/f2c/proc.c new file mode 100644 index 0000000..83218ce --- /dev/null +++ b/sources/f2c/proc.c @@ -0,0 +1,1518 @@ +/**************************************************************** +Copyright 1990 by AT&T Bell Laboratories and Bellcore. + +Permission to use, copy, modify, and distribute this software +and its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the names of AT&T Bell Laboratories or +Bellcore or any of their entities not be used in advertising or +publicity pertaining to distribution of the software without +specific, written prior permission. + +AT&T and Bellcore disclaim all warranties with regard to this +software, including all implied warranties of merchantability +and fitness. In no event shall AT&T or Bellcore be liable for +any special, indirect or consequential damages or any damages +whatsoever resulting from loss of use, data or profits, whether +in an action of contract, negligence or other tortious action, +arising out of or in connection with the use or performance of +this software. +****************************************************************/ + +#include "defs.h" +#include "names.h" +#include "output.h" +#include "p1defs.h" + +#define EXNULL (union Expression *)0 + +LOCAL dobss(), docomleng(), docommon(), doentry(), + epicode(), nextarg(), retval(); + +static char Blank[] = BLANKCOMMON; + + static char *postfix[] = { "h", "i", "r", "d", "c", "z", "i" }; + + chainp new_procs; + int prev_proc, proc_argchanges, proc_protochanges; + + void +changedtype(q) + Namep q; +{ + char buf[200]; + int qtype, type1; + register Extsym *e; + Argtypes *at; + + if (q->vtypewarned) + return; + q->vtypewarned = 1; + qtype = q->vtype; + e = &extsymtab[q->vardesc.varno]; + if (!(at = e->arginfo)) { + if (!e->exused) + return; + } + else if (at->changes & 2 && qtype != TYUNKNOWN) + proc_protochanges++; + type1 = e->extype; + if (type1 == TYUNKNOWN) + return; + if (qtype == TYUNKNOWN) + /* e.g., + subroutine foo + end + external foo + call goo(foo) + end + */ + return; + sprintf(buf, "%.90s: inconsistent declarations:\n\ + here %s%s, previously %s%s.", q->fvarname, ftn_types[qtype], + qtype == TYSUBR ? "" : " function", + ftn_types[type1], type1 == TYSUBR ? "" : " function"); + warn(buf); + } + + void +unamstring(q, s) + register Addrp q; + register char *s; +{ + register int k; + register char *t; + + k = strlen(s); + if (k < IDENT_LEN) { + q->uname_tag = UNAM_IDENT; + t = q->user.ident; + } + else { + q->uname_tag = UNAM_CHARP; + q->user.Charp = t = mem(k+1, 0); + } + strcpy(t, s); + } + + static void +fix_entry_returns() /* for multiple entry points */ +{ + Addrp a; + int i; + struct Entrypoint *e; + Namep np; + + e = entries = (struct Entrypoint *)revchain((chainp)entries); + allargs = revchain(allargs); + if (!multitype) + return; + + /* TYLOGICAL should have been turned into TYLONG or TYSHORT by now */ + + for(i = TYSHORT; i <= TYLOGICAL; i++) + if (a = xretslot[i]) + sprintf(a->user.ident, "(*ret_val).%s", + postfix[i-TYSHORT]); + + do { + np = e->enamep; + switch(np->vtype) { + case TYSHORT: + case TYLONG: + case TYREAL: + case TYDREAL: + case TYCOMPLEX: + case TYDCOMPLEX: + case TYLOGICAL: + np->vstg = STGARG; + } + } + while(e = e->entnextp); + } + + static void +putentries(outfile) /* put out wrappers for multiple entries */ + FILE *outfile; +{ + char base[IDENT_LEN]; + struct Entrypoint *e; + Namep *A, *Ae, *Ae1, **Alp, *a, **a1, np; + chainp args, lengths, length_comp(); + void listargs(), list_arg_types(); + int i, k, mt, nL, type; + extern char *dfltarg[], **dfltproc; + + nL = (nallargs + nallchargs) * sizeof(Namep *); + A = (Namep *)ckalloc(nL + nallargs*sizeof(Namep **)); + Ae = A + nallargs; + Alp = (Namep **)(Ae1 = Ae + nallchargs); + i = k = 0; + for(a1 = Alp, args = allargs; args; a1++, args = args->nextp) { + np = (Namep)args->datap; + if (np->vtype == TYCHAR && np->vclass != CLPROC) + *a1 = &Ae[i++]; + } + + e = entries; + mt = multitype; + multitype = 0; + sprintf(base, "%s0_", e->enamep->cvarname); + do { + np = e->enamep; + lengths = length_comp(e, 0); + proctype = type = np->vtype; + if (protofile) + protowrite(protofile, type, np->cvarname, e, lengths); + nice_printf(outfile, "\n%s ", c_type_decl(type, 1)); + nice_printf(outfile, "%s", np->cvarname); + if (!Ansi) { + listargs(outfile, e, 0, lengths); + nice_printf(outfile, "\n"); + } + list_arg_types(outfile, e, lengths, 0, "\n"); + nice_printf(outfile, "{\n"); + frchain(&lengths); + next_tab(outfile); + if (mt) + nice_printf(outfile, + "Multitype ret_val;\n%s(%d, &ret_val", + base, k); /*)*/ + else if (ISCOMPLEX(type)) + nice_printf(outfile, "%s(%d,%s", base, k, + xretslot[type]->user.ident); /*)*/ + else if (type == TYCHAR) + nice_printf(outfile, + "%s(%d, ret_val, ret_val_len", base, k); /*)*/ + else + nice_printf(outfile, "return %s(%d", base, k); /*)*/ + k++; + memset((char *)A, 0, nL); + for(args = e->arglist; args; args = args->nextp) { + np = (Namep)args->datap; + A[np->argno] = np; + if (np->vtype == TYCHAR && np->vclass != CLPROC) + *Alp[np->argno] = np; + } + args = allargs; + for(a = A; a < Ae; a++, args = args->nextp) + nice_printf(outfile, ", %s", (np = *a) + ? np->cvarname + : ((Namep)args->datap)->vclass == CLPROC + ? dfltproc[((Namep)args->datap)->vtype] + : dfltarg[((Namep)args->datap)->vtype]); + for(; a < Ae1; a++) + if (np = *a) + nice_printf(outfile, ", %s_len", np->cvarname); + else + nice_printf(outfile, ", (ftnint)0"); + nice_printf(outfile, /*(*/ ");\n"); + if (mt) { + if (type == TYCOMPLEX) + nice_printf(outfile, + "r_v->r = ret_val.c.r; r_v->i = ret_val.c.i;\nreturn 0;\n"); + else if (type == TYDCOMPLEX) + nice_printf(outfile, + "r_v->r = ret_val.z.r; r_v->i = ret_val.z.i;\nreturn 0;\n"); + else nice_printf(outfile, "return ret_val.%s;\n", + postfix[type-TYSHORT]); + } + else if (ONEOF(type, M(TYCHAR)|M(TYCOMPLEX)|M(TYDCOMPLEX))) + nice_printf(outfile, "return 0;\n"); + nice_printf(outfile, "}\n"); + prev_tab(outfile); + } + while(e = e->entnextp); + free((char *)A); + } + + static void +entry_goto(outfile) + FILEP outfile; +{ + struct Entrypoint *e = entries; + int k = 0; + + nice_printf(outfile, "switch(n__) {\n"); + next_tab(outfile); + while(e = e->entnextp) + nice_printf(outfile, "case %d: goto %s;\n", ++k, + user_label((long)(extsymtab - e->entryname - 1))); + nice_printf(outfile, "}\n\n"); + prev_tab(outfile); + } + +/* start a new procedure */ + +newproc() +{ + if(parstate != OUTSIDE) + { + execerr("missing end statement", CNULL); + endproc(); + } + + parstate = INSIDE; + procclass = CLMAIN; /* default */ +} + + static void +zap_changes() +{ + register chainp cp; + register Argtypes *at; + + /* arrange to get correct count of prototypes that would + change by running f2c again */ + + if (prev_proc && proc_argchanges) + proc_protochanges++; + prev_proc = proc_argchanges = 0; + for(cp = new_procs; cp; cp = cp->nextp) + if (at = ((Namep)cp->datap)->arginfo) + at->changes &= ~1; + frchain(&new_procs); + } + +/* end of procedure. generate variables, epilogs, and prologs */ + +endproc() +{ + struct Labelblock *lp; + Extsym *ext; + + if(parstate < INDATA) + enddcl(); + if(ctlstack >= ctls) + err("DO loop or BLOCK IF not closed"); + for(lp = labeltab ; lp < labtabend ; ++lp) + if(lp->stateno!=0 && lp->labdefined==NO) + errstr("missing statement label %s", + convic(lp->stateno) ); + +/* Save copies of the common variables in extptr -> allextp */ + + for (ext = extsymtab; ext < nextext; ext++) + if (ext -> extstg == STGCOMMON && ext -> extp) { + extern int usedefsforcommon; + +/* Write out the abbreviations for common block reference */ + + copy_data (ext -> extp); + if (usedefsforcommon) { + wr_abbrevs (c_file, 1, ext -> extp); + ext -> used_here = 1; + } + else + ext -> extp = CHNULL; + + } + + if (nentry > 1) + fix_entry_returns(); + epicode(); + donmlist(); + dobss(); + start_formatting (); + if (nentry > 1) + putentries(c_file); + + zap_changes(); + procinit(); /* clean up for next procedure */ +} + + + +/* End of declaration section of procedure. Allocate storage. */ + +enddcl() +{ + register struct Entrypoint *ep; + struct Entrypoint *ep0; + extern void freetemps(); + chainp cp; + + docommon(); + +/* Now the hash table entries for fields of common blocks have STGCOMMON, + vdcldone, voffset, and varno. And the common blocks themselves have + their full sizes in extleng. */ + + doequiv(); + docomleng(); + +/* This implies that entry points in the declarations are buffered in + entries but not written out */ + + if (ep = ep0 = (struct Entrypoint *)revchain((chainp)entries)) { + /* entries could be 0 in case of an error */ + do doentry(ep); + while(ep = ep->entnextp); + entries = (struct Entrypoint *)revchain((chainp)ep0); + } + parstate = INEXEC; + p1put(P1_PROCODE); + freetemps(); + if (earlylabs) { + for(cp = earlylabs = revchain(earlylabs); cp; cp = cp->nextp) + p1_label((long)cp->datap); + frchain(&earlylabs); + } +} + +/* ROUTINES CALLED WHEN ENCOUNTERING ENTRY POINTS */ + +/* Main program or Block data */ + +startproc(progname, class) +Extsym * progname; +int class; +{ + register struct Entrypoint *p; + + p = ALLOC(Entrypoint); + if(class == CLMAIN) { + puthead(CNULL, CLMAIN); + if (progname) + strcpy (main_alias, progname->cextname); + } else + puthead(CNULL, CLBLOCK); + if(class == CLMAIN) + newentry( mkname(" MAIN"), 0 )->extinit = 1; + p->entryname = progname; + entries = p; + + procclass = class; + fprintf(diagfile, " %s", (class==CLMAIN ? "MAIN" : "BLOCK DATA") ); + if(progname) { + fprintf(diagfile, " %s", progname->fextname); + procname = progname->cextname; + } + fprintf(diagfile, ":\n"); + fflush(diagfile); +} + +/* subroutine or function statement */ + +Extsym *newentry(v, substmsg) + register Namep v; + int substmsg; +{ + register Extsym *p; + char buf[128], badname[64]; + static int nbad = 0; + static char already[] = "external name already used"; + + p = mkext(v->fvarname, addunder(v->cvarname)); + + if(p->extinit || ! ONEOF(p->extstg, M(STGUNKNOWN)|M(STGEXT)) ) + { + sprintf(badname, "%s_bad%d", v->fvarname, ++nbad); + if (substmsg) { + sprintf(buf,"%s\n\tsubstituting \"%s\"", + already, badname); + dclerr(buf, v); + } + else + dclerr(already, v); + p = mkext(v->fvarname, badname); + } + v->vstg = STGAUTO; + v->vprocclass = PTHISPROC; + v->vclass = CLPROC; + if (p->extstg == STGEXT) + prev_proc = 1; + else + p->extstg = STGEXT; + p->extinit = YES; + v->vardesc.varno = p - extsymtab; + return(p); +} + + +entrypt(class, type, length, entry, args) +int class, type; +ftnint length; +Extsym *entry; +chainp args; +{ + register Namep q; + register struct Entrypoint *p; + extern int types3[]; + + if(class != CLENTRY) + puthead( procname = entry->cextname, class); + if(class == CLENTRY) + fprintf(diagfile, " entry "); + fprintf(diagfile, " %s:\n", entry->fextname); + fflush(diagfile); + q = mkname(entry->fextname); + if (type == TYSUBR) + q->vstg = STGEXT; + + if( (type = lengtype(type, length)) != TYCHAR) + length = 0; + if(class == CLPROC) + { + procclass = CLPROC; + proctype = type; + procleng = length; + } + + p = ALLOC(Entrypoint); + + p->entnextp = entries; + entries = p; + + p->entryname = entry; + p->arglist = revchain(args); + p->enamep = q; + + if(class == CLENTRY) + { + class = CLPROC; + if(proctype == TYSUBR) + type = TYSUBR; + } + + q->vclass = class; + q->vprocclass = PTHISPROC; + settype(q, type, length); + /* hold all initial entry points till end of declarations */ + if(parstate >= INDATA) + doentry(p); +} + +/* generate epilogs */ + +/* epicode -- write out the proper function return mechanism at the end of + the procedure declaration. Handles multiple return value types, as + well as cooercion into the proper value */ + +LOCAL epicode() +{ + extern int lastwasbranch; + + if(procclass==CLPROC) + { + if(proctype==TYSUBR) + { + +/* Return a zero only when the alternate return mechanism has been + specified in the function header */ + + if (substars && lastwasbranch == NO) + p1_subr_ret (ICON(0)); + } + else if (!multitype && lastwasbranch == NO) + retval(proctype); + } + lastwasbranch = NO; +} + + +/* generate code to return value of type t */ + +LOCAL retval(t) +register int t; +{ + register Addrp p; + + switch(t) + { + case TYCHAR: + case TYCOMPLEX: + case TYDCOMPLEX: + break; + + case TYLOGICAL: + t = tylogical; + case TYADDR: + case TYSHORT: + case TYLONG: + case TYREAL: + case TYDREAL: + p = (Addrp) cpexpr((expptr)retslot); + p->vtype = t; + p1_subr_ret (mkconv (t, fixtype((expptr)p))); + break; + + default: + badtype("retval", t); + } +} + + +/* Do parameter adjustments */ + +procode(outfile) +FILE *outfile; +{ + prolog(outfile, allargs); + + if (nentry > 1) + entry_goto(outfile); + } + +/* Finish bound computations now that all variables are declared. + * This used to be in setbound(), but under -u the following incurred + * an erroneous error message: + * subroutine foo(x,n) + * real x(n) + * integer n + */ + + static void +dim_finish(v) + Namep v; +{ + register struct Dimblock *p; + register expptr q; + register int i, nd; + extern expptr make_int_expr(); + + p = v->vdim; + v->vdimfinish = 0; + nd = p->ndim; + doin_setbound = 1; + for(i = 0; i < nd; i++) + if (q = p->dims[i].dimexpr) + p->dims[i].dimexpr = make_int_expr(putx(fixtype(q))); + if (q = p->basexpr) + p->basexpr = make_int_expr(putx(fixtype(q))); + doin_setbound = 0; + } + + static void +duparg(q) + Namep q; +{ errstr("duplicate argument %.80s", q->fvarname); } + +/* + manipulate argument lists (allocate argument slot positions) + * keep track of return types and labels + */ + +LOCAL doentry(ep) +struct Entrypoint *ep; +{ + register int type; + register Namep np; + chainp p, p1; + register Namep q; + Addrp mkarg(), rs; + int it, k; + Extsym *entryname = ep->entryname; + + if (++nentry > 1) + p1_label((long)(extsymtab - entryname - 1)); + +/* The main program isn't allowed to have parameters, so any given + parameters are ignored */ + + if(procclass == CLMAIN || procclass == CLBLOCK) + return; + +/* So now we're working with something other than CLMAIN or CLBLOCK. + Determine the type of its return value. */ + + impldcl( np = mkname(entryname->fextname) ); + type = np->vtype; + proc_argchanges = prev_proc && type != entryname->extype; + entryname->extseen = 1; + if(proctype == TYUNKNOWN) + if( (proctype = type) == TYCHAR) + procleng = np->vleng ? np->vleng->constblock.Const.ci + : (ftnint) (-1); + + if(proctype == TYCHAR) + { + if(type != TYCHAR) + err("noncharacter entry of character function"); + +/* Functions returning type char can only have multiple entries if all + entries return the same length */ + + else if( (np->vleng ? np->vleng->constblock.Const.ci : + (ftnint) (-1)) != procleng) + err("mismatched character entry lengths"); + } + else if(type == TYCHAR) + err("character entry of noncharacter function"); + else if(type != proctype) + multitype = YES; + if(rtvlabel[type] == 0) + rtvlabel[type] = newlabel(); + ep->typelabel = rtvlabel[type]; + + if(type == TYCHAR) + { + if(chslot < 0) + { + chslot = nextarg(TYADDR); + chlgslot = nextarg(TYLENG); + } + np->vstg = STGARG; + +/* Put a new argument in the function, one which will hold the result of + a character function. This will have to be named sometime, probably in + mkarg(). */ + + if(procleng < 0) { + np->vleng = (expptr) mkarg(TYLENG, chlgslot); + np->vleng->addrblock.uname_tag = UNAM_IDENT; + strcpy (np -> vleng -> addrblock.user.ident, + new_func_length()); + } + if (!xretslot[TYCHAR]) { + xretslot[TYCHAR] = rs = + autovar(0, type, ISCONST(np->vleng) + ? np->vleng : ICON(0), ""); + strcpy(rs->user.ident, "ret_val"); + } + } + +/* Handle a complex return type -- declare a new parameter (pointer to + a complex value) */ + + else if( ISCOMPLEX(type) ) { + if (!xretslot[type]) + xretslot[type] = + autovar(0, type, EXNULL, " ret_val"); + /* the blank is for use in out_addr */ + np->vstg = STGARG; + if(cxslot < 0) + cxslot = nextarg(TYADDR); + } + else if (type != TYSUBR) { + if (!xretslot[type]) + xretslot[type] = retslot = + autovar(1, type, EXNULL, " ret_val"); + /* the blank is for use in out_addr */ + np->vstg = STGAUTO; + } + + for(p = ep->arglist ; p ; p = p->nextp) + if(! (( q = (Namep) (p->datap) )->vknownarg) ) { + q->vknownarg = 1; + q->vardesc.varno = nextarg(TYADDR); + allargs = mkchain((char *)q, allargs); + q->argno = nallargs++; + } + else if (nentry == 1) + duparg(q); + else for(p1 = ep->arglist ; p1 != p; p1 = p1->nextp) + if ((Namep)p1->datap == q) + duparg(q); + + k = 0; + for(p = ep->arglist ; p ; p = p->nextp) { + if(! (( q = (Namep) (p->datap) )->vdcldone) ) + { + impldcl(q); + q->vdcldone = YES; + if(q->vtype == TYCHAR) + { + +/* If we don't know the length of a char*(*) (i.e. a string), we must add + in this additional length argument. */ + + ++nallchargs; + if (q->vclass == CLPROC) + nallchargs--; + else if (q->vleng == NULL) { + /* character*(*) */ + q->vleng = (expptr) + mkarg(TYLENG, nextarg(TYLENG) ); + unamstring((Addrp)q->vleng, + new_arg_length(q)); + } + } + } + if (q->vdimfinish) + dim_finish(q); + if (q->vtype == TYCHAR && q->vclass != CLPROC) + k++; + } + + if (entryname->extype != type) + changedtype(np); + + /* save information for checking consistency of arg lists */ + + it = infertypes; + if (entryname->exproto) + infertypes = 1; + save_argtypes(ep->arglist, &entryname->arginfo, &np->arginfo, + 0, np->fvarname, STGEXT, k, np->vtype); + infertypes = it; +} + + + +LOCAL nextarg(type) +int type; +{ + int k; + k = lastargslot; + lastargslot += typesize[type]; + return(k); +} + +LOCAL dobss() +{ + register struct Hashentry *p; + register Namep q; + int qstg, qclass, qtype; + Extsym *e; + + for(p = hashtab ; pvarp) + { + qstg = q->vstg; + qtype = q->vtype; + qclass = q->vclass; + + if( (qclass==CLUNKNOWN && qstg!=STGARG) || + (qclass==CLVAR && qstg==STGUNKNOWN) ) { + if (!(q->vis_assigned | q->vimpldovar)) + warn1("local variable %s never used", + q->fvarname); + } + else if(qclass==CLVAR && qstg==STGBSS) + { ; } + +/* Give external procedures the proper storage class */ + + else if(qclass==CLPROC && q->vprocclass==PEXTERNAL + && qstg!=STGARG) { + e = mkext(q->fvarname,addunder(q->cvarname)); + e->extstg = STGEXT; + q->vardesc.varno = e - extsymtab; + if (e->extype != qtype) + changedtype(q); + } + if(qclass==CLVAR) { + if (qstg!=STGARG) { + if(q->vdim && !ISICON(q->vdim->nelt) ) + dclerr("adjustable dimension on non-argument", q); + if(qtype==TYCHAR && (q->vleng==NULL || !ISICON(q->vleng))) + dclerr("adjustable leng on nonargument", q); + } /* if qstg != STGARG */ + } /* if qclass == CLVAR */ + } + +} + + + +donmlist() +{ + register struct Hashentry *p; + register Namep q; + + for(p=hashtab; pvarp) && q->vclass==CLNAMELIST) + namelist(q); +} + + +/* iarrlen -- Returns the size of the array in bytes, or -1 */ + +ftnint iarrlen(q) +register Namep q; +{ + ftnint leng; + + leng = typesize[q->vtype]; + if(leng <= 0) + return(-1); + if(q->vdim) + if( ISICON(q->vdim->nelt) ) + leng *= q->vdim->nelt->constblock.Const.ci; + else return(-1); + if(q->vleng) + if( ISICON(q->vleng) ) + leng *= q->vleng->constblock.Const.ci; + else return(-1); + return(leng); +} + +namelist(np) +Namep np; +{ + register chainp q; + register Namep v; + int y; + + if (!np->visused) + return; + y = 0; + + for(q = np->varxptr.namelist ; q ; q = q->nextp) + { + vardcl( v = (Namep) (q->datap) ); + if( !ONEOF(v->vstg, MSKSTATIC) ) + dclerr("may not appear in namelist", v); + else { + v->vnamelist = 1; + v->visused = 1; + v->vsave = 1; + y = 1; + } + np->visused = y; + } +} + +/* docommon -- called at the end of procedure declarations, before + equivalences and the procedure body */ + +LOCAL docommon() +{ + register Extsym *extptr; + register chainp q, q1; + struct Dimblock *t; + expptr neltp; + register Namep comvar; + ftnint size; + int i, k, pref, type; + extern int type_pref[]; + + for(extptr = extsymtab ; extptrextstg == STGCOMMON && (q = extptr->extp)) { + +/* If a common declaration also had a list of variables ... */ + + q = extptr->extp = revchain(q); + pref = 1; + for(k = TYCHAR; q ; q = q->nextp) + { + comvar = (Namep) (q->datap); + + if(comvar->vdcldone == NO) + vardcl(comvar); + type = comvar->vtype; + if (pref < type_pref[type]) + pref = type_pref[k = type]; + if(extptr->extleng % typealign[type] != 0) { + dclerr("common alignment", comvar); + --nerr; /* don't give bad return code for this */ +#if 0 + extptr->extleng = roundup(extptr->extleng, typealign[type]); +#endif + } /* if extptr -> extleng % */ + +/* Set the offset into the common block */ + + comvar->voffset = extptr->extleng; + comvar->vardesc.varno = extptr - extsymtab; + if(type == TYCHAR) + size = comvar->vleng->constblock.Const.ci; + else + size = typesize[type]; + if(t = comvar->vdim) + if( (neltp = t->nelt) && ISCONST(neltp) ) + size *= neltp->constblock.Const.ci; + else + dclerr("adjustable array in common", comvar); + +/* Adjust the length of the common block so far */ + + extptr->extleng += size; + } /* for */ + + extptr->extype = k; + +/* Determine curno and, if new, save this identifier chain */ + + q1 = extptr->extp; + for (q = extptr->allextp, i = 0; q; i++, q = q->nextp) + if (struct_eq((chainp)q->datap, q1)) + break; + if (q) + extptr->curno = extptr->maxno - i; + else { + extptr->curno = ++extptr->maxno; + extptr->allextp = mkchain((char *)extptr->extp, + extptr->allextp); + } + } /* if extptr -> extstg == STGCOMMON */ + +/* Now the hash table entries have STGCOMMON, vdcldone, voffset, and + varno. And the common block itself has its full size in extleng. */ + +} /* docommon */ + + +/* copy_data -- copy the Namep entries so they are available even after + the hash table is empty */ + +copy_data (list) +chainp list; +{ + for (; list; list = list -> nextp) { + Namep namep = ALLOC (Nameblock); + int size, nd, i; + struct Dimblock *dp; + + cpn(sizeof(struct Nameblock), list->datap, (char *)namep); + namep->fvarname = strcpy(gmem(strlen(namep->fvarname)+1,0), + namep->fvarname); + namep->cvarname = strcmp(namep->fvarname, namep->cvarname) + ? strcpy(gmem(strlen(namep->cvarname)+1,0), namep->cvarname) + : namep->fvarname; + if (namep -> vleng) + namep -> vleng = (expptr) cpexpr (namep -> vleng); + if (namep -> vdim) { + nd = namep -> vdim -> ndim; + size = sizeof(int) + (3 + 2 * nd) * sizeof (expptr); + dp = (struct Dimblock *) ckalloc (size); + cpn(size, (char *)namep->vdim, (char *)dp); + namep -> vdim = dp; + dp->nelt = (expptr)cpexpr(dp->nelt); + for (i = 0; i < nd; i++) { + dp -> dims[i].dimsize = (expptr) cpexpr (dp -> dims[i].dimsize); + } /* for */ + } /* if */ + list -> datap = (char *) namep; + } /* for */ +} /* copy_data */ + + + +LOCAL docomleng() +{ + register Extsym *p; + + for(p = extsymtab ; p < nextext ; ++p) + if(p->extstg == STGCOMMON) + { + if(p->maxleng!=0 && p->extleng!=0 && p->maxleng!=p->extleng + && strcmp(Blank, p->cextname) ) + warn1("incompatible lengths for common block %.60s", + p->fextname); + if(p->maxleng < p->extleng) + p->maxleng = p->extleng; + p->extleng = 0; + } +} + + +/* ROUTINES DEALING WITH AUTOMATIC AND TEMPORARY STORAGE */ + +frtemp(p) +Addrp p; +{ + /* put block on chain of temps to be reclaimed */ + holdtemps = mkchain((char *)p, holdtemps); +} + + void +freetemps() +{ + register chainp p, p1; + register Addrp q; + register int t; + + p1 = holdtemps; + while(p = p1) { + q = (Addrp)p->datap; + t = q->vtype; + if (t == TYCHAR && q->varleng != 0) { + /* restore clobbered character string lengths */ + frexpr(q->vleng); + q->vleng = ICON(q->varleng); + } + p1 = p->nextp; + p->nextp = templist[t]; + templist[t] = p; + } + holdtemps = 0; + } + +/* allocate an automatic variable slot for each of nelt variables */ + +Addrp autovar(nelt0, t, lengp, name) +register int nelt0, t; +expptr lengp; +char *name; +{ + ftnint leng; + register Addrp q; + char *temp_name (); + register int nelt = nelt0 > 0 ? nelt0 : 1; + extern char *av_pfix[]; + + if(t == TYCHAR) + if( ISICON(lengp) ) + leng = lengp->constblock.Const.ci; + else { + Fatal("automatic variable of nonconstant length"); + } + else + leng = typesize[t]; + + q = ALLOC(Addrblock); + q->tag = TADDR; + q->vtype = t; + if(t == TYCHAR) + { + q->vleng = ICON(leng); + q->varleng = leng; + } + q->vstg = STGAUTO; + q->ntempelt = nelt; + q->isarray = (nelt > 1); + q->memoffset = ICON(0); + + /* kludge for nls so we can have ret_val rather than ret_val_4 */ + if (*name == ' ') + unamstring(q, name+1); + else { + q->uname_tag = UNAM_IDENT; + temp_name(av_pfix[t], ++autonum[t], q->user.ident); + } + if (nelt0 > 0) + declare_new_addr (q); + return(q); +} + + +/* Returns a temporary of the appropriate type. Will reuse existing + temporaries when possible */ + +Addrp mktmpn(nelt, type, lengp) +int nelt; +register int type; +expptr lengp; +{ + ftnint leng; + chainp p, oldp; + register Addrp q; + + if(type==TYUNKNOWN || type==TYERROR) + badtype("mktmpn", type); + + if(type==TYCHAR) + if( ISICON(lengp) ) + leng = lengp->constblock.Const.ci; + else { + err("adjustable length"); + return( (Addrp) errnode() ); + } + else if (type > TYCHAR || type < TYADDR) { + erri("mktmpn: unexpected type %d", type); + exit(1); + } +/* + * if a temporary of appropriate shape is on the templist, + * remove it from the list and return it + */ + for(oldp=CHNULL, p=templist[type]; p ; oldp=p, p=p->nextp) + { + q = (Addrp) (p->datap); + if(q->ntempelt==nelt && + (type!=TYCHAR || q->vleng->constblock.Const.ci==leng) ) + { + if(oldp) + oldp->nextp = p->nextp; + else + templist[type] = p->nextp; + free( (charptr) p); + return(q); + } + } + q = autovar(nelt, type, lengp, ""); + return(q); +} + + + + +/* mktemp -- create new local variable; call it something like name + lengp is taken directly, not copied */ + +Addrp Mktemp(type, lengp) +int type; +expptr lengp; +{ + Addrp rv; + /* arrange for temporaries to be recycled */ + /* at the end of this statement... */ + rv = mktmpn(1,type,lengp); + frtemp((Addrp)cpexpr((expptr)rv)); + return rv; +} + +/* mktmp0 omits frtemp() */ +Addrp mktmp0(type, lengp) +int type; +expptr lengp; +{ + Addrp rv; + /* arrange for temporaries to be recycled */ + /* when this Addrp is freed */ + rv = mktmpn(1,type,lengp); + rv->istemp = YES; + return rv; +} + +/* VARIOUS ROUTINES FOR PROCESSING DECLARATIONS */ + +/* comblock -- Declare a new common block. Input parameters name the block; + s will be NULL if the block is unnamed */ + +Extsym *comblock(s) + register char *s; +{ + Extsym *p; + register char *t; + register int c, i; + char cbuf[256], *s0; + +/* Give the unnamed common block a unique name */ + + if(*s == 0) + p = mkext(Blank,Blank); + else { + s0 = s; + t = cbuf; + for(i = 0; c = *t = *s++; t++) + if (c == '_') + i = 1; + if (i) + *t++ = '_'; + t[0] = '_'; + t[1] = 0; + p = mkext(s0,cbuf); + } + if(p->extstg == STGUNKNOWN) + p->extstg = STGCOMMON; + else if(p->extstg != STGCOMMON) + { + errstr("%.68s cannot be a common block name", s); + return(0); + } + + return( p ); +} + + +/* incomm -- add a new variable to a common declaration */ + +incomm(c, v) +Extsym *c; +Namep v; +{ + if (!c) + return; + if(v->vstg != STGUNKNOWN && !v->vimplstg) + dclerr("incompatible common declaration", v); + else + { + v->vstg = STGCOMMON; + c->extp = mkchain((char *)v, c->extp); + } +} + + + + +/* settype -- set the type or storage class of a Namep object. If + v -> vstg == STGUNKNOWN && type < 0, attempt to reset vstg to be + -type. This function will not change any earlier definitions in v, + in will only attempt to fill out more information give the other params */ + +settype(v, type, length) +register Namep v; +register int type; +register ftnint length; +{ + int type1; + + if(type == TYUNKNOWN) + return; + + if(type==TYSUBR && v->vtype!=TYUNKNOWN && v->vstg==STGARG) + { + v->vtype = TYSUBR; + frexpr(v->vleng); + v->vleng = 0; + v->vimpltype = 0; + } + else if(type < 0) /* storage class set */ + { + if(v->vstg == STGUNKNOWN) + v->vstg = - type; + else if(v->vstg != -type) + dclerr("incompatible storage declarations", v); + } + else if(v->vtype == TYUNKNOWN || v->vimpltype && v->vtype != type) + { + if( (v->vtype = lengtype(type, length))==TYCHAR && length>=0) + v->vleng = ICON(length); + v->vimpltype = 0; + + if (v->vclass == CLPROC && v->vstg == STGEXT + && (type1 = extsymtab[v->vardesc.varno].extype) + && type1 != v->vtype) + changedtype(v); + } + else if(v->vtype!=type + || (type==TYCHAR && v->vleng->constblock.Const.ci!=length) ) + dclerr("incompatible type declarations", v); +} + + + + + +/* lengtype -- returns the proper compiler type, given input of Fortran + type and length specifier */ + +lengtype(type, len) +register int type; +ftnint len; +{ + register int length = (int)len; + switch(type) + { + case TYREAL: + if(length == typesize[TYDREAL]) + return(TYDREAL); + if(length == typesize[TYREAL]) + goto ret; + break; + + case TYCOMPLEX: + if(length == typesize[TYDCOMPLEX]) + return(TYDCOMPLEX); + if(length == typesize[TYCOMPLEX]) + goto ret; + break; + + case TYSHORT: + case TYDREAL: + case TYDCOMPLEX: + case TYCHAR: + case TYUNKNOWN: + case TYSUBR: + case TYERROR: + goto ret; + + case TYLOGICAL: + if(length == typesize[TYLOGICAL]) + goto ret; + if(length == 1 || length == 2) { + erri("treating LOGICAL*%d as LOGICAL", length); + --nerr; /* allow generation of .c file */ + goto ret; + } + break; + + case TYLONG: + if(length == 0) + return(tyint); + if(length == typesize[TYSHORT]) + return(TYSHORT); + if(length == typesize[TYLONG]) + goto ret; + break; + default: + badtype("lengtype", type); + } + + if(len != 0) + err("incompatible type-length combination"); + +ret: + return(type); +} + + + + + +/* setintr -- Set Intrinsic function */ + +setintr(v) +register Namep v; +{ + int k; + + if(v->vstg == STGUNKNOWN) + v->vstg = STGINTR; + else if(v->vstg!=STGINTR) + dclerr("incompatible use of intrinsic function", v); + if(v->vclass==CLUNKNOWN) + v->vclass = CLPROC; + if(v->vprocclass == PUNKNOWN) + v->vprocclass = PINTRINSIC; + else if(v->vprocclass != PINTRINSIC) + dclerr("invalid intrinsic declaration", v); + if(k = intrfunct(v->fvarname)) { + if ((*(struct Intrpacked *)&k).f4) + if (noextflag) + goto unknown; + else + dcomplex_seen++; + v->vardesc.varno = k; + } + else { + unknown: + dclerr("unknown intrinsic function", v); + } +} + + + +/* setext -- Set External declaration -- assume that unknowns will become + procedures */ + +setext(v) +register Namep v; +{ + if(v->vclass == CLUNKNOWN) + v->vclass = CLPROC; + else if(v->vclass != CLPROC) + dclerr("invalid external declaration", v); + + if(v->vprocclass == PUNKNOWN) + v->vprocclass = PEXTERNAL; + else if(v->vprocclass != PEXTERNAL) + dclerr("invalid external declaration", v); +} /* setext */ + + + + +/* create dimensions block for array variable */ + +setbound(v, nd, dims) +register Namep v; +int nd; +struct { + expptr lb, ub; +} dims[ ]; +{ + register expptr q, t; + register struct Dimblock *p; + int i; + extern chainp new_vars; + char buf[256]; + + if(v->vclass == CLUNKNOWN) + v->vclass = CLVAR; + else if(v->vclass != CLVAR) + { + dclerr("only variables may be arrays", v); + return; + } + + v->vdim = p = (struct Dimblock *) + ckalloc( sizeof(int) + (3+2*nd)*sizeof(expptr) ); + p->ndim = nd--; + p->nelt = ICON(1); + doin_setbound = 1; + + for(i = 0; i <= nd; ++i) + { + if( (q = dims[i].ub) == NULL) + { + if(i == nd) + { + frexpr(p->nelt); + p->nelt = NULL; + } + else + err("only last bound may be asterisk"); + p->dims[i].dimsize = ICON(1); + ; + p->dims[i].dimexpr = NULL; + } + else + { + + if(dims[i].lb) + { + q = mkexpr(OPMINUS, q, cpexpr(dims[i].lb)); + q = mkexpr(OPPLUS, q, ICON(1) ); + } + if( ISCONST(q) ) + { + p->dims[i].dimsize = q; + p->dims[i].dimexpr = (expptr) PNULL; + } + else { + sprintf(buf, " %s_dim%d", v->fvarname, i+1); + p->dims[i].dimsize = (expptr) + autovar(1, tyint, EXNULL, buf); + p->dims[i].dimexpr = q; + if (i == nd) + v->vlastdim = new_vars; + v->vdimfinish = 1; + } + if(p->nelt) + p->nelt = mkexpr(OPSTAR, p->nelt, + cpexpr(p->dims[i].dimsize) ); + } + } + + q = dims[nd].lb; + if(q == NULL) + q = ICON(1); + + for(i = nd-1 ; i>=0 ; --i) + { + t = dims[i].lb; + if(t == NULL) + t = ICON(1); + if(p->dims[i].dimsize) + q = mkexpr(OPPLUS, t, mkexpr(OPSTAR, cpexpr(p->dims[i].dimsize), q) ); + } + + if( ISCONST(q) ) + { + p->baseoffset = q; + p->basexpr = NULL; + } + else + { + sprintf(buf, " %s_offset", v->fvarname); + p->baseoffset = (expptr) autovar(1, tyint, EXNULL, buf); + p->basexpr = q; + } + doin_setbound = 0; +} + + + +wr_abbrevs (outfile, function_head, vars) +FILE *outfile; +int function_head; +chainp vars; +{ + for (; vars; vars = vars -> nextp) { + Namep name = (Namep) vars -> datap; + if (!name->visused) + continue; + + if (function_head) + nice_printf (outfile, "#define "); + else + nice_printf (outfile, "#undef "); + out_name (outfile, name); + + if (function_head) { + Extsym *comm = &extsymtab[name -> vardesc.varno]; + + nice_printf (outfile, " ("); + extern_out (outfile, comm); + nice_printf (outfile, "%d.", comm->curno); + nice_printf (outfile, "%s)", name->cvarname); + } /* if function_head */ + nice_printf (outfile, "\n"); + } /* for */ +} /* wr_abbrevs */ diff --git a/sources/f2c/put.c b/sources/f2c/put.c new file mode 100644 index 0000000..c1ff6c4 --- /dev/null +++ b/sources/f2c/put.c @@ -0,0 +1,378 @@ +/**************************************************************** +Copyright 1990 by AT&T Bell Laboratories and Bellcore. + +Permission to use, copy, modify, and distribute this software +and its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the names of AT&T Bell Laboratories or +Bellcore or any of their entities not be used in advertising or +publicity pertaining to distribution of the software without +specific, written prior permission. + +AT&T and Bellcore disclaim all warranties with regard to this +software, including all implied warranties of merchantability +and fitness. In no event shall AT&T or Bellcore be liable for +any special, indirect or consequential damages or any damages +whatsoever resulting from loss of use, data or profits, whether +in an action of contract, negligence or other tortious action, +arising out of or in connection with the use or performance of +this software. +****************************************************************/ + +/* + * INTERMEDIATE CODE GENERATION PROCEDURES COMMON TO BOTH + * JOHNSON (PORTABLE) AND RITCHIE FAMILIES OF SECOND PASSES +*/ + +#include "defs.h" +#include "names.h" /* For LOCAL_CONST_NAME */ +#include "pccdefs.h" +#include "p1defs.h" + +/* Definitions for putconst() */ + +#define LIT_CHAR 1 +#define LIT_FLOAT 2 +#define LIT_INT 3 + + +/* +char *ops [ ] = + { + "??", "+", "-", "*", "/", "**", "-", + "OR", "AND", "EQV", "NEQV", "NOT", + "CONCAT", + "<", "==", ">", "<=", "!=", ">=", + " of ", " ofC ", " = ", " += ", " *= ", " CONV ", " << ", " % ", + " , ", " ? ", " : " + " abs ", " min ", " max ", " addr ", " indirect ", + " bitor ", " bitand ", " bitxor ", " bitnot ", " >> ", + }; +*/ + +/* Each of these values is defined in pccdefs */ + +int ops2 [ ] = +{ + P2BAD, P2PLUS, P2MINUS, P2STAR, P2SLASH, P2BAD, P2NEG, + P2OROR, P2ANDAND, P2EQ, P2NE, P2NOT, + P2BAD, + P2LT, P2EQ, P2GT, P2LE, P2NE, P2GE, + P2CALL, P2CALL, P2ASSIGN, P2PLUSEQ, P2STAREQ, P2CONV, P2LSHIFT, P2MOD, + P2COMOP, P2QUEST, P2COLON, + 1, P2BAD, P2BAD, P2BAD, P2BAD, + P2BITOR, P2BITAND, P2BITXOR, P2BITNOT, P2RSHIFT, + P2BAD, P2BAD, P2BAD, P2BAD, P2BAD, P2BAD, P2BAD, P2BAD, P2BAD, + P2BAD, P2BAD, P2BAD, P2BAD, + 1,1,1,1,1, /* OPNEG1, OPDMIN, OPDMAX, OPASSIGNI, OPIDENTITY */ + 1,1,1,1 /* OPCHARCAST, OPDABS, OPMIN2, OPMAX2 */ +}; + + +int types2 [ ] = +{ + P2BAD, P2INT|P2PTR, P2SHORT, P2LONG, P2REAL, P2DREAL, + P2REAL, P2DREAL, P2LONG, P2CHAR, P2INT, P2BAD +}; + + +setlog() +{ + types2[TYLOGICAL] = types2[tylogical]; + typesize[TYLOGICAL] = typesize[tylogical]; + typealign[TYLOGICAL] = typealign[tylogical]; +} + + +void putex1(p) +expptr p; +{ +/* Write the expression to the p1 file */ + + p = (expptr) putx (fixtype (p)); + p1_expr (p); +} + + + + + +expptr putassign(lp, rp) +expptr lp, rp; +{ + return putx(fixexpr((Exprp)mkexpr(OPASSIGN, lp, rp))); +} + + + + +void puteq(lp, rp) +expptr lp, rp; +{ + putexpr(mkexpr(OPASSIGN, lp, rp) ); +} + + + + +/* put code for a *= b */ + +expptr putsteq(a, b) +Addrp a, b; +{ + return putx( fixexpr((Exprp) + mkexpr(OPSTAREQ, cpexpr((expptr)a), cpexpr((expptr)b)))); +} + + + + +Addrp mkfield(res, f, ty) +register Addrp res; +char *f; +int ty; +{ + res -> vtype = ty; + res -> Field = f; + return res; +} /* mkfield */ + + +Addrp realpart(p) +register Addrp p; +{ + register Addrp q; + expptr mkrealcon(); + + if (p -> uname_tag == UNAM_CONST && ISCOMPLEX (p->vtype)) { + return (Addrp)mkrealcon (p -> vtype + TYREAL - TYCOMPLEX, + p->user.kludge.vstg1 ? p->user.Const.cds[0] + : cds(dtos(p->user.Const.cd[0]),CNULL)); + } /* if p -> uname_tag */ + + q = (Addrp) cpexpr((expptr) p); + if( ISCOMPLEX(p->vtype) ) + q = mkfield (q, "r", p -> vtype + TYREAL - TYCOMPLEX); + + return(q); +} + + + + +expptr imagpart(p) +register Addrp p; +{ + register Addrp q; + expptr mkrealcon(); + + if( ISCOMPLEX(p->vtype) ) + { + if (p -> uname_tag == UNAM_CONST) + return mkrealcon (p -> vtype + TYREAL - TYCOMPLEX, + p->user.kludge.vstg1 ? p->user.Const.cds[1] + : cds(dtos(p->user.Const.cd[1]),CNULL)); + q = (Addrp) cpexpr((expptr) p); + q = mkfield (q, "i", p -> vtype + TYREAL - TYCOMPLEX); + return( (expptr) q ); + } + else + +/* Cast an integer type onto a Double Real type */ + + return( mkrealcon( ISINT(p->vtype) ? TYDREAL : p->vtype , "0")); +} + + + + + +/* ncat -- computes the number of adjacent concatenation operations */ + +ncat(p) +register expptr p; +{ + if(p->tag==TEXPR && p->exprblock.opcode==OPCONCAT) + return( ncat(p->exprblock.leftp) + ncat(p->exprblock.rightp) ); + else return(1); +} + + + + +/* lencat -- returns the length of the concatenated string. Each + substring must have a static (i.e. compile-time) fixed length */ + +ftnint lencat(p) +register expptr p; +{ + if(p->tag==TEXPR && p->exprblock.opcode==OPCONCAT) + return( lencat(p->exprblock.leftp) + lencat(p->exprblock.rightp) ); + else if( p->headblock.vleng!=NULL && ISICON(p->headblock.vleng) ) + return(p->headblock.vleng->constblock.Const.ci); + else if(p->tag==TADDR && p->addrblock.varleng!=0) + return(p->addrblock.varleng); + else + { + err("impossible element in concatenation"); + return(0); + } +} + +/* putconst -- Creates a new Addrp value which maps onto the input + constant value. The Addrp doesn't retain the value of the constant, + instead that value is copied into a table of constants (called + litpool, for pool of literal values). The only way to retrieve the + actual value of the constant is to look at the memno field of the + Addrp result. You know that the associated literal is the one referred + to by q when (q -> memno == litp -> litnum). +*/ + +Addrp putconst(p) +register Constp p; +{ + register Addrp q; + struct Literal *litp, *lastlit; + int k, type; + int litflavor; + double cd[2]; + char cdsbuf0[64], cdsbuf1[64], *ds[2]; + + if( p->tag != TCONST ) + badtag("putconst", p->tag); + + q = ALLOC(Addrblock); + q->tag = TADDR; + type = p->vtype; + q->vtype = ( type==TYADDR ? tyint : type ); + q->vleng = (expptr) cpexpr(p->vleng); + q->vstg = STGCONST; + +/* Create the new label for the constant. This is wasteful of labels + because when the constant value already exists in the literal pool, + this label gets thrown away and is never reclaimed. It might be + cleaner to move this down past the first switch() statement below */ + + q->memno = newlabel(); + q->memoffset = ICON(0); + q -> uname_tag = UNAM_CONST; + +/* Copy the constant info into the Addrblock; do this by copying the + largest storage elts */ + + q -> user.Const = p -> Const; + q->user.kludge.vstg1 = p->vstg; /* distinguish string from binary fp */ + + /* check for value in literal pool, and update pool if necessary */ + + k = 1; + switch(type = p->vtype) + { + case TYCHAR: + /* Treat all character strings as too long for literal table */ + q -> memno = BAD_MEMNO; + break; + case TYCOMPLEX: + case TYDCOMPLEX: + k = 2; + if (p->vstg) + cd[1] = atof(ds[1] = p->Const.cds[1]); + else + ds[1] = cds(dtos(cd[1] = p->Const.cd[1]), cdsbuf1); + case TYREAL: + case TYDREAL: + litflavor = LIT_FLOAT; + if (p->vstg) + cd[0] = atof(ds[0] = p->Const.cds[0]); + else + ds[0] = cds(dtos(cd[0] = p->Const.cd[0]), cdsbuf0); + goto loop; + + case TYLOGICAL: + type = tylogical; + goto lit_int_flavor; + case TYLONG: + type = tyint; + case TYSHORT: + lit_int_flavor: + litflavor = LIT_INT; + +/* Scan the literal pool for this constant value. If this same constant + has been assigned before, use the same label. Note that this routine + does NOT consider two differently-typed constants with the same bit + pattern to be the same constant */ + +loop: + lastlit = litpool + nliterals; + for(litp = litpool ; litplittype) switch(litflavor) + { + case LIT_FLOAT: + if(cd[0] == litp->litval.litdval[0] + && !strcmp(ds[0], litp->cds[0]) + && (k == 1 || + cd[1] == litp->litval.litdval[1] + && !strcmp(ds[1], litp->cds[1]))) { +ret: + q->memno = litp->litnum; + frexpr((expptr)p); + return(q); + } + break; + + case LIT_INT: + if(p->Const.ci == litp->litval.litival) + goto ret; + break; + } + +/* If there's room in the literal pool, add this new value to the pool */ + + if(nliterals < MAXLITERALS) + { + ++nliterals; + + /* litp now points to the next free elt */ + + litp->littype = type; + litp->litnum = q->memno; + switch(litflavor) + { + case LIT_FLOAT: + litp->litval.litdval[0] = cd[0]; + litp->cds[0] = copys(ds[0]); + if (k == 2) { + litp->litval.litdval[1] = cd[1]; + litp->cds[1] = copys(ds[1]); + } + break; + + case LIT_INT: + litp->litval.litival = p->Const.ci; + break; + } /* switch (litflavor) */ + } /* if (nliternals < MAXLITERALS) */ + else { + Addrp t = Mktemp(type, q -> vleng); + puteq (cpexpr((expptr)t), (expptr)p); + free ((char *) q); + return t; + } /* else */ + + break; + case TYADDR: + break; + default: + badtype ("putconst", p -> vtype); + break; + } /* switch */ + + if (type != TYCHAR) + frexpr((expptr)p); + return( q ); +} diff --git a/sources/f2c/putpcc.c b/sources/f2c/putpcc.c new file mode 100644 index 0000000..e10ab58 --- /dev/null +++ b/sources/f2c/putpcc.c @@ -0,0 +1,1713 @@ +/**************************************************************** +Copyright 1990 by AT&T Bell Laboratories and Bellcore. + +Permission to use, copy, modify, and distribute this software +and its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the names of AT&T Bell Laboratories or +Bellcore or any of their entities not be used in advertising or +publicity pertaining to distribution of the software without +specific, written prior permission. + +AT&T and Bellcore disclaim all warranties with regard to this +software, including all implied warranties of merchantability +and fitness. In no event shall AT&T or Bellcore be liable for +any special, indirect or consequential damages or any damages +whatsoever resulting from loss of use, data or profits, whether +in an action of contract, negligence or other tortious action, +arising out of or in connection with the use or performance of +this software. +****************************************************************/ + +/* INTERMEDIATE CODE GENERATION FOR S. C. JOHNSON C COMPILERS */ +/* NEW VERSION USING BINARY POLISH POSTFIX INTERMEDIATE */ + +#include "defs.h" +#include "pccdefs.h" +#include "output.h" /* for nice_printf */ +#include "names.h" +#include "p1defs.h" + +Addrp realpart(); +LOCAL Addrp intdouble(), putcx1(), putcxeq (), putch1 (), putchop (); +LOCAL putct1 (); + +expptr putcxop(); +LOCAL expptr putcall (), putmnmx (), putcheq(), putcat (); +LOCAL expptr putaddr(), putchcmp (), putpower(), putop(); +LOCAL expptr putcxcmp (); +expptr imagpart(); +ftnint lencat(); + +#define FOUR 4 +extern int ops2[]; +extern int types2[]; +extern int proc_argchanges, proc_protochanges; + +#define P2BUFFMAX 128 + +/* Puthead -- output the header information about subroutines, functions + and entry points */ + +puthead(s, class) +char *s; +int class; +{ + if (headerdone == NO) { + if (class == CLMAIN) + s = "MAIN__"; + p1_head (class, s); + headerdone = YES; + } +} + +putif(p, else_if_p) + register expptr p; + int else_if_p; +{ + register int k; + + if( ( k = (p = fixtype(p))->headblock.vtype) != TYLOGICAL) + { + if(k != TYERROR) + err("non-logical expression in IF statement"); + } + else { + p = putx(p); + if (else_if_p) + p1_elif(p); + else + p1_if(p); + } + frexpr(p); +} + + +putexpr(p) +expptr p; +{ + putex1(p); +} + + +putout(p) +expptr p; +{ + p1_expr (p); + +/* Used to make temporaries in holdtemps available here, but they */ +/* may be reused too soon (e.g. when multiple **'s are involved). */ +} + + + +putcmgo(index, nlab, labs) +expptr index; +int nlab; +struct Labelblock *labs[]; +{ + if(! ISINT(index->headblock.vtype) ) + { + execerr("computed goto index must be integer", CNULL); + return; + } + + p1comp_goto (index, nlab, labs); +} + +expptr putx(p) +expptr p; +{ + int opc; + int k; + + if (p) + switch(p->tag) + { + case TERROR: + break; + + case TCONST: + switch(p->constblock.vtype) + { + case TYLOGICAL: + case TYLONG: + case TYSHORT: + break; + + case TYADDR: + break; + case TYREAL: + case TYDREAL: + +/* Don't write it out to the p2 file, since you'd need to call putconst, + which is just what we need to avoid in the translator */ + + break; + default: + p = putx( (expptr)putconst((Constp)p) ); + break; + } + break; + + case TEXPR: + switch(opc = p->exprblock.opcode) + { + case OPCALL: + case OPCCALL: + if( ISCOMPLEX(p->exprblock.vtype) ) + p = putcxop(p); + else p = putcall(p, (Addrp *)NULL); + break; + + case OPMIN: + case OPMAX: + p = putmnmx(p); + break; + + + case OPASSIGN: + if(ISCOMPLEX(p->exprblock.leftp->headblock.vtype) + || ISCOMPLEX(p->exprblock.rightp->headblock.vtype)) { + (void) putcxeq(p); + p = ENULL; + } else if( ISCHAR(p) ) + p = putcheq(p); + else + goto putopp; + break; + + case OPEQ: + case OPNE: + if( ISCOMPLEX(p->exprblock.leftp->headblock.vtype) || + ISCOMPLEX(p->exprblock.rightp->headblock.vtype) ) + { + p = putcxcmp(p); + break; + } + case OPLT: + case OPLE: + case OPGT: + case OPGE: + if(ISCHAR(p->exprblock.leftp)) + { + p = putchcmp(p); + break; + } + goto putopp; + + case OPPOWER: + p = putpower(p); + break; + + case OPSTAR: + /* m * (2**k) -> m<exprblock.leftp->headblock.vtype) && + ISICON(p->exprblock.rightp) && + ( (k = log_2(p->exprblock.rightp->constblock.Const.ci))>0) ) + { + p->exprblock.opcode = OPLSHIFT; + frexpr(p->exprblock.rightp); + p->exprblock.rightp = ICON(k); + goto putopp; + } + + case OPMOD: + goto putopp; + case OPPLUS: + case OPMINUS: + case OPSLASH: + case OPNEG: + case OPNEG1: + case OPABS: + case OPDABS: + if( ISCOMPLEX(p->exprblock.vtype) ) + p = putcxop(p); + else goto putopp; + break; + + case OPCONV: + if( ISCOMPLEX(p->exprblock.vtype) ) + p = putcxop(p); + else if( ISCOMPLEX(p->exprblock.leftp->headblock.vtype) ) + { + p = putx( mkconv(p->exprblock.vtype, + (expptr)realpart(putcx1(p->exprblock.leftp)))); + } + else goto putopp; + break; + + case OPNOT: + case OPOR: + case OPAND: + case OPEQV: + case OPNEQV: + case OPADDR: + case OPPLUSEQ: + case OPSTAREQ: + case OPCOMMA: + case OPQUEST: + case OPCOLON: + case OPBITOR: + case OPBITAND: + case OPBITXOR: + case OPBITNOT: + case OPLSHIFT: + case OPRSHIFT: + case OPASSIGNI: + case OPIDENTITY: + case OPCHARCAST: + case OPMIN2: + case OPMAX2: + case OPDMIN: + case OPDMAX: +putopp: + p = putop(p); + break; + + default: + badop("putx", opc); + p = errnode (); + } + break; + + case TADDR: + p = putaddr(p); + break; + + default: + badtag("putx", p->tag); + p = errnode (); + } + + return p; +} + + + +LOCAL expptr putop(p) +expptr p; +{ + expptr lp, tp; + int pt, lt; + int comma; + + switch(p->exprblock.opcode) /* check for special cases and rewrite */ + { + case OPCONV: + pt = p->exprblock.vtype; + lp = p->exprblock.leftp; + lt = lp->headblock.vtype; + +/* Simplify nested type casts */ + + while(p->tag==TEXPR && p->exprblock.opcode==OPCONV && + ( (ISREAL(pt)&&ISREAL(lt)) || + (INT(pt)&&(ONEOF(lt,MSKINT|MSKADDR|MSKCHAR|M(TYSUBR)))) )) + { +#if SZINT < SZLONG + if(lp->tag != TEXPR) + { + if(pt==TYINT && lt==TYLONG) + break; + if(lt==TYINT && pt==TYLONG) + break; + } +#endif + + + if(pt==TYDREAL && lt==TYREAL) + { + if(lp->tag==TEXPR && + lp->exprblock.opcode==OPCONV && + lp->exprblock.leftp->headblock.vtype==TYDREAL) + { + lp->exprblock.leftp = + putx(lp->exprblock.leftp); + return p; + } + else break; + } + + + if(lt==TYCHAR && lp->tag==TEXPR && + lp->exprblock.opcode==OPCALL) + { + +/* May want to make a comma expression here instead. I had one, but took + it out for my convenience, not for the convenience of the end user */ + + putout (putcall (lp, (Addrp *) &(p -> + exprblock.leftp))); + return putop (p); + } + if (lt == TYCHAR) { + p->exprblock.leftp = putx(p->exprblock.leftp); + return p; + } + free( (charptr) p ); + p = lp; + if (p->tag != TEXPR) + goto retputx; + pt = lt; + lp = p->exprblock.leftp; + lt = lp->headblock.vtype; + } /* while */ + if(p->tag==TEXPR && p->exprblock.opcode==OPCONV) + break; + retputx: + return putx(p); + + case OPADDR: + comma = NO; + lp = p->exprblock.leftp; + free( (charptr) p ); + if(lp->tag != TADDR) + { + tp = (expptr) + Mktemp(lp->headblock.vtype,lp->headblock.vleng); + p = putx( mkexpr(OPASSIGN, cpexpr(tp), lp) ); + lp = tp; + comma = YES; + } + if(comma) + p = mkexpr(OPCOMMA, p, putaddr(lp)); + else + p = (expptr)putaddr(lp); + return p; + + case OPASSIGN: + case OPASSIGNI: + case OPLT: + case OPLE: + case OPGT: + case OPGE: + case OPEQ: + case OPNE: + ; + } + + if( ops2[p->exprblock.opcode] <= 0) + badop("putop", p->exprblock.opcode); + p -> exprblock.leftp = putx (p -> exprblock.leftp); + if (p -> exprblock.rightp) + p -> exprblock.rightp = putx (p -> exprblock.rightp); + return p; +} + +LOCAL expptr putpower(p) +expptr p; +{ + expptr base; + Addrp t1, t2; + ftnint k; + int type; + char buf[80]; /* buffer for text of comment */ + + if(!ISICON(p->exprblock.rightp) || + (k = p->exprblock.rightp->constblock.Const.ci)<2) + Fatal("putpower: bad call"); + base = p->exprblock.leftp; + type = base->headblock.vtype; + t1 = Mktemp(type, ENULL); + t2 = NULL; + + free ((charptr) p); + p = putassign (cpexpr((expptr) t1), base); + + sprintf (buf, "Computing %d%s power", k, k == 2 ? "nd" : (k == 3 ? + "rd" : "th")); + p1_comment (buf); + + for( ; (k&1)==0 && k>2 ; k>>=1 ) + { + p = mkexpr (OPCOMMA, p, putsteq(t1, t1)); + } + + if(k == 2) { + +/* Write the power computation out immediately */ + putout (p); + p = putx( mkexpr(OPSTAR, cpexpr((expptr)t1), cpexpr((expptr)t1))); + } else { + t2 = Mktemp(type, ENULL); + p = mkexpr (OPCOMMA, p, putassign(cpexpr((expptr)t2), + cpexpr((expptr)t1))); + + for(k>>=1 ; k>1 ; k>>=1) + { + p = mkexpr (OPCOMMA, p, putsteq(t1, t1)); + if(k & 1) + { + p = mkexpr (OPCOMMA, p, putsteq(t2, t1)); + } + } +/* Write the power computation out immediately */ + putout (p); + p = putx( mkexpr(OPSTAR, cpexpr((expptr)t2), + mkexpr(OPSTAR, cpexpr((expptr)t1), cpexpr((expptr)t1)))); + } + frexpr((expptr)t1); + if(t2) + frexpr((expptr)t2); + return p; +} + + + + +LOCAL Addrp intdouble(p) +Addrp p; +{ + register Addrp t; + + t = Mktemp(TYDREAL, ENULL); + putout (putassign(cpexpr((expptr)t), (expptr)p)); + return(t); +} + + + + + +/* Complex-type variable assignment */ + +LOCAL Addrp putcxeq(p) +register expptr p; +{ + register Addrp lp, rp; + expptr code; + + if(p->tag != TEXPR) + badtag("putcxeq", p->tag); + + lp = putcx1(p->exprblock.leftp); + rp = putcx1(p->exprblock.rightp); + code = putassign ( (expptr)realpart(lp), (expptr)realpart(rp)); + + if( ISCOMPLEX(p->exprblock.vtype) ) + { + code = mkexpr (OPCOMMA, code, putassign + (imagpart(lp), imagpart(rp))); + } + putout (code); + frexpr((expptr)rp); + free ((charptr) p); + return lp; +} + + + +/* putcxop -- used to write out embedded calls to complex functions, and + complex arguments to procedures */ + +expptr putcxop(p) +expptr p; +{ + return (expptr)putaddr((expptr)putcx1(p)); +} + +#define PAIR(x,y) mkexpr (OPCOMMA, (x), (y)) + +LOCAL Addrp putcx1(p) +register expptr p; +{ + expptr q; + Addrp lp, rp; + register Addrp resp; + int opcode; + int ltype, rtype; + long ts; + expptr mkrealcon(); + + if(p == NULL) + return(NULL); + + switch(p->tag) + { + case TCONST: + if( ISCOMPLEX(p->constblock.vtype) ) + p = (expptr) putconst((Constp)p); + return( (Addrp) p ); + + case TADDR: + resp = &p->addrblock; + if (addressable(p)) + return (Addrp) p; + if ((q = resp->memoffset) && resp->isarray + && resp->vtype != TYCHAR) { + if (ONEOF(resp->vstg, M(STGCOMMON)|M(STGEQUIV)) + && resp->uname_tag == UNAM_NAME) + q = mkexpr(OPMINUS, q, + mkintcon(resp->user.name->voffset)); + ts = typesize[resp->vtype] + * (resp->Field ? 2 : 1); + q = resp->memoffset = mkexpr(OPSLASH, q, ICON(ts)); + } + else + ts = 0; + resp = Mktemp(tyint, ENULL); + putout(putassign(cpexpr((expptr)resp), q)); + p->addrblock.memoffset = (expptr)resp; + if (ts) { + resp = &p->addrblock; + q = mkexpr(OPSTAR, resp->memoffset, ICON(ts)); + if (ONEOF(resp->vstg, M(STGCOMMON)|M(STGEQUIV)) + && resp->uname_tag == UNAM_NAME) + q = mkexpr(OPPLUS, q, + mkintcon(resp->user.name->voffset)); + resp->memoffset = q; + } + return (Addrp) p; + + case TEXPR: + if( ISCOMPLEX(p->exprblock.vtype) ) + break; + resp = Mktemp(TYDREAL, ENULL); + putout (putassign( cpexpr((expptr)resp), p)); + return(resp); + + default: + badtag("putcx1", p->tag); + } + + opcode = p->exprblock.opcode; + if(opcode==OPCALL || opcode==OPCCALL) + { + Addrp t; + p = putcall(p, &t); + putout(p); + return t; + } + else if(opcode == OPASSIGN) + { + return putcxeq (p); + } + +/* BUG (inefficient) Generates too many temporary variables */ + + resp = Mktemp(p->exprblock.vtype, ENULL); + if(lp = putcx1(p->exprblock.leftp) ) + ltype = lp->vtype; + if(rp = putcx1(p->exprblock.rightp) ) + rtype = rp->vtype; + + switch(opcode) + { + case OPCOMMA: + frexpr((expptr)resp); + resp = rp; + rp = NULL; + break; + + case OPNEG: + case OPNEG1: + putout (PAIR ( + putassign( (expptr)realpart(resp), + mkexpr(OPNEG, (expptr)realpart(lp), ENULL)), + putassign( imagpart(resp), + mkexpr(OPNEG, imagpart(lp), ENULL)))); + break; + + case OPPLUS: + case OPMINUS: { expptr r; + r = putassign( (expptr)realpart(resp), + mkexpr(opcode, (expptr)realpart(lp), (expptr)realpart(rp) )); + if(rtype < TYCOMPLEX) + q = putassign( imagpart(resp), imagpart(lp) ); + else if(ltype < TYCOMPLEX) + { + if(opcode == OPPLUS) + q = putassign( imagpart(resp), imagpart(rp) ); + else + q = putassign( imagpart(resp), + mkexpr(OPNEG, imagpart(rp), ENULL) ); + } + else + q = putassign( imagpart(resp), + mkexpr(opcode, imagpart(lp), imagpart(rp) )); + r = PAIR (r, q); + putout (r); + break; + } /* case OPPLUS, OPMINUS: */ + case OPSTAR: + if(ltype < TYCOMPLEX) + { + if( ISINT(ltype) ) + lp = intdouble(lp); + putout (PAIR ( + putassign( (expptr)realpart(resp), + mkexpr(OPSTAR, cpexpr((expptr)lp), + (expptr)realpart(rp))), + putassign( imagpart(resp), + mkexpr(OPSTAR, cpexpr((expptr)lp), imagpart(rp))))); + } + else if(rtype < TYCOMPLEX) + { + if( ISINT(rtype) ) + rp = intdouble(rp); + putout (PAIR ( + putassign( (expptr)realpart(resp), + mkexpr(OPSTAR, cpexpr((expptr)rp), + (expptr)realpart(lp))), + putassign( imagpart(resp), + mkexpr(OPSTAR, cpexpr((expptr)rp), imagpart(lp))))); + } + else { + putout (PAIR ( + putassign( (expptr)realpart(resp), mkexpr(OPMINUS, + mkexpr(OPSTAR, (expptr)realpart(lp), + (expptr)realpart(rp)), + mkexpr(OPSTAR, imagpart(lp), imagpart(rp)))), + putassign( imagpart(resp), mkexpr(OPPLUS, + mkexpr(OPSTAR, (expptr)realpart(lp), imagpart(rp)), + mkexpr(OPSTAR, imagpart(lp), + (expptr)realpart(rp)))))); + } + break; + + case OPSLASH: + /* fixexpr has already replaced all divisions + * by a complex by a function call + */ + if( ISINT(rtype) ) + rp = intdouble(rp); + putout (PAIR ( + putassign( (expptr)realpart(resp), + mkexpr(OPSLASH, (expptr)realpart(lp), cpexpr((expptr)rp))), + putassign( imagpart(resp), + mkexpr(OPSLASH, imagpart(lp), cpexpr((expptr)rp))))); + break; + + case OPCONV: + if( ISCOMPLEX(lp->vtype) ) + q = imagpart(lp); + else if(rp != NULL) + q = (expptr) realpart(rp); + else + q = mkrealcon(TYDREAL, "0"); + putout (PAIR ( + putassign( (expptr)realpart(resp), (expptr)realpart(lp)), + putassign( imagpart(resp), q))); + break; + + default: + badop("putcx1", opcode); + } + + frexpr((expptr)lp); + frexpr((expptr)rp); + free( (charptr) p ); + return(resp); +} + + + + +/* Only .EQ. and .NE. may be performed on COMPLEX data, other relations + are not defined */ + +LOCAL expptr putcxcmp(p) +register expptr p; +{ + int opcode; + register Addrp lp, rp; + expptr q; + + if(p->tag != TEXPR) + badtag("putcxcmp", p->tag); + + opcode = p->exprblock.opcode; + lp = putcx1(p->exprblock.leftp); + rp = putcx1(p->exprblock.rightp); + + q = mkexpr( opcode==OPEQ ? OPAND : OPOR , + mkexpr(opcode, (expptr)realpart(lp), (expptr)realpart(rp)), + mkexpr(opcode, imagpart(lp), imagpart(rp)) ); + + free( (charptr) lp); + free( (charptr) rp); + free( (charptr) p ); + return putx( fixexpr((Exprp)q) ); +} + +/* putch1 -- Forces constants into the literal pool, among other things */ + +LOCAL Addrp putch1(p) +register expptr p; +{ + Addrp t; + expptr e; + + switch(p->tag) + { + case TCONST: + return( putconst((Constp)p) ); + + case TADDR: + return( (Addrp) p ); + + case TEXPR: + switch(p->exprblock.opcode) + { + expptr q; + + case OPCALL: + case OPCCALL: + + p = putcall(p, &t); + putout (p); + break; + + case OPCONCAT: + t = Mktemp(TYCHAR, ICON(lencat(p))); + q = (expptr) cpexpr(p->headblock.vleng); + p = putcat( cpexpr((expptr)t), p ); + /* put the correct length on the block */ + frexpr(t->vleng); + t->vleng = q; + putout (p); + break; + + case OPCONV: + if(!ISICON(p->exprblock.vleng) + || p->exprblock.vleng->constblock.Const.ci!=1 + || ! INT(p->exprblock.leftp->headblock.vtype) ) + Fatal("putch1: bad character conversion"); + t = Mktemp(TYCHAR, ICON(1)); + e = mkexpr(OPCONV, (expptr)t, ENULL); + e->headblock.vtype = tyint; + p = putop( mkexpr(OPASSIGN, cpexpr(e), p)); + putout (p); + break; + default: + badop("putch1", p->exprblock.opcode); + } + return(t); + + default: + badtag("putch1", p->tag); + } + /* NOT REACHED */ return 0; +} + + +/* putchop -- Write out a character actual parameter; that is, this is + part of a procedure invocation */ + +LOCAL Addrp putchop(p) +expptr p; +{ + p = putaddr((expptr)putch1(p)); + return (Addrp)p; +} + + + + +LOCAL expptr putcheq(p) +register expptr p; +{ + expptr lp, rp; + + if(p->tag != TEXPR) + badtag("putcheq", p->tag); + + lp = p->exprblock.leftp; + rp = p->exprblock.rightp; + frexpr(p->exprblock.vleng); + free( (charptr) p ); + +/* If s = t // u, don't bother copying the result, write it directly into + this buffer */ + + if( rp->tag==TEXPR && rp->exprblock.opcode==OPCONCAT ) + p = putcat(lp, rp); + else if( ISONE(lp->headblock.vleng) && ISONE(rp->headblock.vleng) ) { + lp = mkexpr(OPCONV, lp, ENULL); + rp = mkexpr(OPCONV, rp, ENULL); + lp->headblock.vtype = rp->headblock.vtype = tyint; + p = putop(mkexpr(OPASSIGN, lp, rp)); + } + else + p = putx( call2(TYSUBR, "s_copy", lp, rp) ); + return p; +} + + + + +LOCAL expptr putchcmp(p) +register expptr p; +{ + expptr lp, rp; + + if(p->tag != TEXPR) + badtag("putchcmp", p->tag); + + lp = p->exprblock.leftp; + rp = p->exprblock.rightp; + + if(ISONE(lp->headblock.vleng) && ISONE(rp->headblock.vleng) ) { + lp = mkexpr(OPCONV, putx(lp), ENULL); + rp = mkexpr(OPCONV, putx(rp), ENULL); + lp->headblock.vtype = rp->headblock.vtype = tyint; + } + else { + lp = call2(TYINT,"s_cmp", lp, rp); + rp = ICON(0); + } + p->exprblock.leftp = lp; + p->exprblock.rightp = rp; + p = putop(p); + return p; +} + + + + + +/* putcat -- Writes out a concatenation operation. Two temporary arrays + are allocated, putct1() is called to initialize them, and then a + call to runtime library routine s_cat() is inserted. + + This routine generates code which will perform an (nconc lhs rhs) + at runtime. The runtime funciton does not return a value, the routine + that calls this putcat must remember the name of lhs. +*/ + + +LOCAL expptr putcat(lhs0, rhs) + expptr lhs0; + register expptr rhs; +{ + register Addrp lhs = (Addrp)lhs0; + int n, tyi; + Addrp length_var, string_var; + expptr p; + static char Writing_concatenation[] = "Writing concatenation"; + +/* Create the temporary arrays */ + + n = ncat(rhs); + length_var = mktmpn(n, tyioint, ENULL); + string_var = mktmpn(n, TYADDR, ENULL); + frtemp((Addrp)cpexpr((expptr)length_var)); + frtemp((Addrp)cpexpr((expptr)string_var)); + +/* Initialize the arrays */ + + n = 0; + /* p1_comment scribbles on its argument, so we + * cannot safely pass a string literal here. */ + p1_comment(Writing_concatenation); + putct1(rhs, length_var, string_var, &n); + +/* Create the invocation */ + + tyi = tyint; + tyint = tyioint; /* for -I2 */ + p = putx (call4 (TYSUBR, "s_cat", + (expptr)lhs, + (expptr)string_var, + (expptr)length_var, + (expptr)putconst((Constp)ICON(n)))); + tyint = tyi; + + return p; +} + + + + + +LOCAL putct1(q, length_var, string_var, ip) +register expptr q; +register Addrp length_var, string_var; +int *ip; +{ + int i; + Addrp length_copy, string_copy; + extern int szleng; + + if(q->tag==TEXPR && q->exprblock.opcode==OPCONCAT) + { + putct1(q->exprblock.leftp, length_var, string_var, + ip); + putct1(q->exprblock.rightp, length_var, string_var, + ip); + frexpr (q -> exprblock.vleng); + free ((charptr) q); + } + else + { + i = (*ip)++; + length_copy = (Addrp) cpexpr((expptr)length_var); + length_copy->memoffset = + mkexpr(OPPLUS,length_copy->memoffset, ICON(i*szleng)); + string_copy = (Addrp) cpexpr((expptr)string_var); + string_copy->memoffset = + mkexpr(OPPLUS, string_copy->memoffset, + ICON(i*typesize[TYLONG])); + putout (PAIR (putassign((expptr)length_copy, cpexpr + (q->headblock.vleng)), + putassign((expptr)string_copy, addrof((expptr)putch1(q))))); + } +} + +/* putaddr -- seems to write out function invocation actual parameters */ + +LOCAL expptr putaddr(p0) + expptr p0; +{ + register Addrp p; + + if (!(p = (Addrp)p0)) + return ENULL; + + if( p->tag==TERROR || (p->memoffset!=NULL && ISERROR(p->memoffset)) ) + { + frexpr((expptr)p); + return ENULL; + } + if (p->isarray && p->memoffset) + p->memoffset = putx(p->memoffset); + return (expptr) p; +} + + LOCAL expptr +addrfix(e) /* fudge character string length if it's a TADDR */ + expptr e; +{ + return e->tag == TADDR ? mkexpr(OPIDENTITY, e, ENULL) : e; + } + + LOCAL int +typekludge(ccall, q, at, j) + int ccall; + register expptr q; + Atype *at; + int j; /* alternate type */ +{ + register int i, k; + extern int iocalladdr; + register Namep np; + + /* Return value classes: + * < 100 ==> Fortran arg (pointer to type) + * < 200 ==> C arg + * < 300 ==> procedure arg + * < 400 ==> external, no explicit type + * < 500 ==> arg that may turn out to be + * either a variable or a procedure + */ + + k = q->headblock.vtype; + if (ccall) { + if (k == TYREAL) + k = TYDREAL; /* force double for library routines */ + return k + 100; + } + if (k == TYADDR) + return iocalladdr; + i = q->tag; + if ((i == TEXPR && q->exprblock.opcode != OPCOMMA_ARG) + || (i == TADDR && q->addrblock.charleng) + || i == TCONST) + k = TYFTNLEN + 100; + else if (i == TADDR) + switch(q->addrblock.vclass) { + case CLPROC: + if (q->addrblock.uname_tag != UNAM_NAME) + k += 200; + else if ((np = q->addrblock.user.name)->vprocclass + != PTHISPROC) { + if (k && !np->vimpltype) + k += 200; + else { + if (j > 200 && infertypes && j < 300) { + k = j; + inferdcl(np, j-200); + } + else k = (np->vstg == STGEXT + ? extsymtab[np->vardesc.varno].extype + : 0) + 200; + at->cp = mkchain((char *)np, at->cp); + } + } + else if (k == TYSUBR) + k += 200; + break; + + case CLUNKNOWN: + if (q->addrblock.vstg == STGARG + && q->addrblock.uname_tag == UNAM_NAME) { + k += 400; + at->cp = mkchain((char *)q->addrblock.user.name, + at->cp); + } + } + else if (i == TNAME && q->nameblock.vstg == STGARG) { + np = &q->nameblock; + switch(np->vclass) { + case CLPROC: + if (!np->vimpltype) + k += 200; + else if (j <= 200 || !infertypes || j >= 300) + k += 300; + else { + k = j; + inferdcl(np, j-200); + } + goto add2chain; + + case CLUNKNOWN: + /* argument may be a scalar variable or a function */ + if (np->vimpltype && j && infertypes + && j < 300) { + inferdcl(np, j % 100); + k = j; + } + else + k += 400; + + /* to handle procedure args only so far known to be + * external, save a pointer to the symbol table entry... + */ + add2chain: + at->cp = mkchain((char *)np, at->cp); + } + } + return k; + } + + char * +Argtype(k, buf) + int k; + char *buf; +{ + if (k < 100) { + sprintf(buf, "%s variable", ftn_types[k]); + return buf; + } + if (k < 200) { + k -= 100; + return k == TYFTNLEN ? "ftnlen" : ftn_types[k]; + } + if (k < 300) { + k -= 200; + if (k == TYSUBR) + return ftn_types[TYSUBR]; + sprintf(buf, "%s function", ftn_types[k]); + return buf; + } + if (k < 400) + return "external argument"; + k -= 400; + sprintf(buf, "%s argument", ftn_types[k]); + return buf; + } + + static void +atype_squawk(at, msg) + Argtypes *at; + char *msg; +{ + register Atype *a, *ae; + warn(msg); + for(a = at->atypes, ae = a + at->nargs; a < ae; a++) + frchain(&a->cp); + at->nargs = -1; + if (at->changes & 2) + proc_protochanges++; + } + + static char inconsist[] = "inconsistent calling sequences for "; + + void +bad_atypes(at, fname, i, j, k, here, prev) + Argtypes *at; + char *fname, *here, *prev; + int i, j, k; +{ + char buf[208], buf1[32], buf2[32]; + + sprintf(buf, "%s%.90s,\n\targ %d: %s%s%s %s.", + inconsist, fname, i, here, Argtype(k, buf1), + prev, Argtype(j, buf2)); + atype_squawk(at, buf); + } + + int +type_fixup(at,a,k) + Argtypes *at; + Atype *a; + int k; +{ + register struct Entrypoint *ep; + if (!infertypes) + return 0; + for(ep = entries; ep; ep = ep->entnextp) + if (at == ep->entryname->arginfo) { + a->type = k % 100; + return proc_argchanges = 1; + } + return 0; + } + + + void +save_argtypes(arglist, at0, at1, ccall, fname, stg, nchargs, type) + chainp arglist; + Argtypes **at0, **at1; + int ccall, stg, nchargs, type; + char *fname; +{ + Argtypes *at; + chainp cp; + int i, i0, j, k, nargs, *t, *te; + Atype *atypes; + expptr q; + char buf[208]; + static int initargs[4] = {TYCOMPLEX, TYDCOMPLEX, TYCHAR, TYFTNLEN+100}; + static int *init_ap[TYSUBR+1] = {0,0,0,0,0,0, + initargs, initargs+1,0,initargs+2}; + static int init_ac[TYSUBR+1] = { 0,0,0,0,0,0, + 1, 1, 0, 2}; + + i = i0 = init_ac[type]; + t = init_ap[type]; + te = t + i; + if (at = *at0) { + *at1 = at; + nargs = at->nargs; + if (nargs < 0) { /* inconsistent usage seen */ + if (type) { + if (at->changes & 2) + --proc_protochanges; + goto newlist; + } + return; + } + for(cp = arglist; cp; cp = cp->nextp) + i++; + if ((i += nchargs) != nargs) { + sprintf(buf, + "%s%.90s:\n\there %d, previously %d args and string lengths.", + inconsist, fname, i, nargs); + atype_squawk(at, buf); + retn: + if (type) + goto newlist; + return; + } + atypes = at->atypes; + i = 0; + for(; t < te; atypes++) { + i++; + j = atypes->type; + k = *t++; + if (j != k) + goto badtypes; + } + for(cp = arglist; cp; atypes++, cp = cp->nextp) { + ++i; + j = atypes->type; + if (!(q = (expptr)cp->datap)) + continue; + k = typekludge(ccall, q, atypes, j); + if (k >= 300 || k == j) + continue; + if (j >= 300) { + if (k >= 200) { + if (k == TYUNKNOWN + 200) + continue; + if (j % 100 != k - 200 + && k != TYSUBR + 200 + && j != TYUNKNOWN + 300 + && !type_fixup(at,atypes,k)) + goto badtypes; + } + else if (j % 100 % TYSUBR != k % TYSUBR + && !type_fixup(at,atypes,k)) + goto badtypes; + } + else if (k < 200 || j < 200) + if (j) + goto badtypes; + else ; /* fall through to update */ + else if (k == TYUNKNOWN+200) + continue; + else if (j != TYUNKNOWN+200) + { + badtypes: + bad_atypes(at, fname, i, j, k, "here ", + ", previously"); + if (type) { + /* we're defining the procedure */ + t = init_ap[type]; + te = t + i0; + proc_argchanges = 1; + goto newlist; + } + goto retn; + } + /* We've subsequently learned the right type, + as in the call on zoo below... + + subroutine foo(x, zap) + external zap + call goo(zap) + x = zap(3) + call zoo(zap) + end + */ + atypes->type = k; + at->changes |= 1; + } + if (type) + at->changes = 0; + return; + } + newlist: + i = i0 + nchargs; + for(cp = arglist; cp; cp = cp->nextp) + i++; + k = sizeof(Argtypes) + (i-1)*sizeof(Atype); + *at0 = *at1 = at = stg == STGEXT ? (Argtypes *)gmem(k,1) + : (Argtypes *) mem(k,1); + at->nargs = i; + at->changes = 0; + atypes = at->atypes; + for(; t < te; atypes++) { + atypes->type = *t++; + atypes->cp = 0; + } + for(cp = arglist; cp; atypes++, cp = cp->nextp) { + atypes->cp = 0; + atypes->type = (q = (expptr)cp->datap) + ? typekludge(ccall, q, atypes, 0) + : 0; + } + for(; --nchargs >= 0; atypes++) { + atypes->type = TYFTNLEN + 100; + atypes->cp = 0; + } + } + + void +saveargtypes(p) /* for writing prototypes */ + register Exprp p; +{ + Addrp a; + Argtypes **at0, **at1; + Namep np; + chainp arglist; + expptr rp; + Extsym *e; + char *fname; + + a = (Addrp)p->leftp; + switch(a->vstg) { + case STGEXT: + switch(a->uname_tag) { + case UNAM_EXTERN: /* e.g., sqrt() */ + e = extsymtab + a->memno; + at0 = at1 = &e->arginfo; + fname = e->fextname; + break; + case UNAM_NAME: + np = a->user.name; + at0 = &extsymtab[np->vardesc.varno].arginfo; + at1 = &np->arginfo; + fname = np->fvarname; + break; + default: + goto bug; + } + break; + case STGARG: + if (a->uname_tag != UNAM_NAME) + goto bug; + np = a->user.name; + at0 = at1 = &np->arginfo; + fname = np->fvarname; + break; + default: + bug: + Fatal("Confusion in saveargtypes"); + } + rp = p->rightp; + arglist = rp && rp->tag == TLIST ? rp->listblock.listp : 0; + save_argtypes(arglist, at0, at1, p->opcode == OPCCALL, + fname, a->vstg, 0, 0); + } + +/* putcall - fix up the argument list, and write out the invocation. p + is expected to be initialized and point to an OPCALL or OPCCALL + expression. The return value is a pointer to a temporary holding the + result of a COMPLEX or CHARACTER operation, or NULL. */ + +LOCAL expptr putcall(p0, temp) + expptr p0; + Addrp *temp; +{ + register Exprp p = (Exprp)p0; + chainp arglist; /* Pointer to actual arguments, if any */ + chainp charsp; /* List of copies of the variables which + hold the lengths of character + parameters (other than procedure + parameters) */ + chainp cp; /* Iterator over argument lists */ + register expptr q; /* Pointer to the current argument */ + Addrp fval; /* Function return value */ + int type; /* type of the call - presumably this was + set elsewhere */ + int byvalue; /* True iff we don't want to massage the + parameter list, since we're calling a C + library routine */ + extern int Castargs; + char *s; + extern struct Listblock *mklist(); + + type = p -> vtype; + charsp = NULL; + byvalue = (p->opcode == OPCCALL); + +/* Verify the actual parameters */ + + if (p == (Exprp) NULL) + err ("putcall: NULL call expression"); + else if (p -> tag != TEXPR) + erri ("putcall: expected TEXPR, got '%d'", p -> tag); + +/* Find the argument list */ + + if(p->rightp && p -> rightp -> tag == TLIST) + arglist = p->rightp->listblock.listp; + else + arglist = NULL; + +/* Count the number of explicit arguments, including lengths of character + variables */ + + for(cp = arglist ; cp ; cp = cp->nextp) + if(!byvalue) { + q = (expptr) cp->datap; + if( ISCONST(q) ) + { + +/* Even constants are passed by reference, so we need to put them in the + literal table */ + + q = (expptr) putconst((Constp)q); + cp->datap = (char *) q; + } + +/* Save the length expression of character variables (NOT character + procedures) for the end of the argument list */ + + if( ISCHAR(q) && + (q->headblock.vclass != CLPROC + || q->headblock.vstg == STGARG + && q->tag == TADDR + && q->addrblock.uname_tag == UNAM_NAME + && q->addrblock.user.name->vprocclass == PTHISPROC)) + { + charsp = mkchain((char *)cpexpr(q->headblock.vleng), charsp); + if (q->headblock.vclass == CLUNKNOWN + && q->headblock.vstg == STGARG) + q->addrblock.user.name->vpassed = 1; + } + } + charsp = revchain(charsp); + +/* If the routine is a CHARACTER function ... */ + + if(type == TYCHAR) + { + if( ISICON(p->vleng) ) + { + +/* Allocate a temporary to hold the return value of the function */ + + fval = Mktemp(TYCHAR, p->vleng); + } + else { + err("adjustable character function"); + if (temp) + *temp = 0; + return 0; + } + } + +/* If the routine is a COMPLEX function ... */ + + else if( ISCOMPLEX(type) ) + fval = Mktemp(type, ENULL); + else + fval = NULL; + +/* Write the function name, without taking its address */ + + p -> leftp = putx(fixtype(putaddr(p->leftp))); + + if(fval) + { + chainp prepend; + +/* Prepend a copy of the function return value buffer out as the first + argument. */ + + prepend = mkchain((char *)putx(putaddr(cpexpr((expptr)fval))), arglist); + +/* If it's a character function, also prepend the length of the result */ + + if(type==TYCHAR) + { + + prepend->nextp = mkchain((char *)putx(mkconv(TYLENG, + p->vleng)), arglist); + } + if (!(q = p->rightp)) + p->rightp = q = (expptr)mklist(CHNULL); + q->listblock.listp = prepend; + } + +/* Scan through the fortran argument list */ + + for(cp = arglist ; cp ; cp = cp->nextp) + { + q = (expptr) (cp->datap); + if (q == ENULL) + err ("putcall: NULL argument"); + +/* call putaddr only when we've got a parameter for a C routine or a + memory resident parameter */ + + if (q -> tag == TCONST && !byvalue) + q = (expptr) putconst ((Constp)q); + + if(q->tag==TADDR && (byvalue || q->addrblock.vstg!=STGREG) ) + cp->datap = (char *)putaddr(q); + else if( ISCOMPLEX(q->headblock.vtype) ) + cp -> datap = (char *) putx (fixtype(putcxop(q))); + else if (ISCHAR(q) ) + cp -> datap = (char *) putx (fixtype((expptr)putchop(q))); + else if( ! ISERROR(q) ) + { + if(byvalue + || q->tag == TEXPR && q->exprblock.opcode == OPCHARCAST) + cp -> datap = (char *) putx(q); + else { + expptr t, t1; + +/* If we've got a register parameter, or (maybe?) a constant, save it in a + temporary first */ + + t = (expptr) Mktemp(q->headblock.vtype, q->headblock.vleng); + +/* Assign to temporary variables before invoking the subroutine or + function */ + + t1 = putassign( cpexpr(t), q ); + if (doin_setbound) + t = mkexpr(OPCOMMA_ARG, t1, t); + else + putout(t1); + cp -> datap = (char *) t; + } /* else */ + } /* if !ISERROR(q) */ + } + +/* Now adjust the lengths of the CHARACTER parameters */ + + for(cp = charsp ; cp ; cp = cp->nextp) + cp->datap = (char *)addrfix(putx( + /* in case MAIN has a character*(*)... */ + (s = cp->datap) ? mkconv(TYLENG,(expptr)s) + : ICON(0))); + +/* ... and add them to the end of the argument list */ + + hookup (arglist, charsp); + +/* Return the name of the temporary used to hold the results, if any was + necessary. */ + + if (temp) *temp = fval; + else frexpr ((expptr)fval); + + saveargtypes(p); + + return (expptr) p; +} + + + +/* putmnmx -- Put min or max. p must point to an EXPR, not just a + CONST */ + +LOCAL expptr putmnmx(p) +register expptr p; +{ + int op, op2, type; + expptr arg, qp, temp; + chainp p0, p1; + Addrp sp, tp; + char comment_buf[80]; + char *what; + + if(p->tag != TEXPR) + badtag("putmnmx", p->tag); + + type = p->exprblock.vtype; + op = p->exprblock.opcode; + op2 = op == OPMIN ? OPMIN2 : OPMAX2; + p0 = p->exprblock.leftp->listblock.listp; + free( (charptr) (p->exprblock.leftp) ); + free( (charptr) p ); + + /* special case for two addressable operands */ + + if (addressable((expptr)p0->datap) + && (p1 = p0->nextp) + && addressable((expptr)p1->datap) + && !p1->nextp) { + if (type == TYREAL && forcedouble) + op2 = op == OPMIN ? OPDMIN : OPDMAX; + p = mkexpr(op2, mkconv(type, cpexpr((expptr)p0->datap)), + mkconv(type, cpexpr((expptr)p1->datap))); + frchain(&p0); + return p; + } + + /* general case */ + + sp = Mktemp(type, ENULL); + +/* We only need a second temporary if the arg list has an unaddressable + value */ + + tp = (Addrp) NULL; + qp = ENULL; + for (p1 = p0 -> nextp; p1; p1 = p1 -> nextp) + if (!addressable ((expptr) p1 -> datap)) { + tp = Mktemp(type, ENULL); + qp = mkexpr(op2, cpexpr((expptr)sp), cpexpr((expptr)tp)); + qp = fixexpr((Exprp)qp); + break; + } /* if */ + +/* Now output the appropriate number of assignments and comparisons. Min + and max are implemented by the simple O(n) algorithm: + + min (a, b, c, d) ==> + { t1, t2; + + t1 = a; + t2 = b; t1 = (t1 < t2) ? t1 : t2; + t2 = c; t1 = (t1 < t2) ? t1 : t2; + t2 = d; t1 = (t1 < t2) ? t1 : t2; + } +*/ + + if (!doin_setbound) { + switch(op) { + case OPLT: + case OPMIN: + case OPDMIN: + case OPMIN2: + what = "IN"; + break; + default: + what = "AX"; + } + sprintf (comment_buf, "Computing M%s", what); + p1_comment (comment_buf); + } + + p1 = p0->nextp; + temp = (expptr)p0->datap; + if (addressable(temp) && addressable((expptr)p1->datap)) { + p = mkconv(type, cpexpr(temp)); + arg = mkconv(type, cpexpr((expptr)p1->datap)); + temp = mkexpr(op2, p, arg); + if (!ISCONST(temp)) + temp = fixexpr((Exprp)temp); + p1 = p1->nextp; + } + p = putassign (cpexpr((expptr)sp), temp); + + for(; p1 ; p1 = p1->nextp) + { + if (addressable ((expptr) p1 -> datap)) { + arg = mkconv(type, cpexpr((expptr)p1->datap)); + temp = mkexpr(op2, cpexpr((expptr)sp), arg); + temp = fixexpr((Exprp)temp); + } else { + temp = (expptr) cpexpr (qp); + p = mkexpr(OPCOMMA, p, + putassign(cpexpr((expptr)tp), (expptr)p1->datap)); + } /* else */ + + if(p1->nextp) + p = mkexpr(OPCOMMA, p, + putassign(cpexpr((expptr)sp), temp)); + else { + if (type == TYREAL && forcedouble) + temp->exprblock.opcode = + op == OPMIN ? OPDMIN : OPDMAX; + if (doin_setbound) + p = mkexpr(OPCOMMA, p, temp); + else { + putout (p); + p = putx(temp); + } + if (qp) + frexpr (qp); + } /* else */ + } /* for */ + + frchain( &p0 ); + return p; +} + + + void +putwhile(p) + expptr p; +{ + long where; + int k, n; + char *realloc(); + + if (wh_next >= wh_last) + { + k = wh_last - wh_first; + n = k + 100; + wh_next = mem(n,0); + wh_last = wh_first + n; + if (k) + memcpy(wh_next, wh_first, k); + wh_first = wh_next; + wh_next += k; + wh_last = wh_first + n; + } + if( ( k = (p = fixtype(p))->headblock.vtype) != TYLOGICAL) + { + if(k != TYERROR) + err("non-logical expression in IF statement"); + } + else { + p1put(P1_WHILE1START); + where = ftell(pass1_file); + p = putx(p); + *wh_next++ = ftell(pass1_file) > where; + p1put(P1_WHILE2START); + p1_expr(p); + } + frexpr(p); + } diff --git a/sources/f2c/readme b/sources/f2c/readme new file mode 100644 index 0000000..b857cf0 --- /dev/null +++ b/sources/f2c/readme @@ -0,0 +1,38 @@ +Type "make" to check the validity of the f2c source and compile f2c. + +The file usignal.h is for the benefit of strictly ANSI include files +on a UNIX system -- the ANSI signal.h does not define SIGHUP or SIGQUIT. +You may need to modify usignal.h if you are not running f2c on a UNIX +system. + +Should you get the message "xsum0.out xsum1.out differ", see what lines +are different (`diff xsum0.out xsum1.out`) and ask netlib to send you +the files in question "from f2c/src". For example, if exec.c and +expr.c have incorrect check sums, you would send netlib the message + send exec.c expr.c from f2c/src + +On some systems, the malloc and free in malloc.c let f2c run faster +than do the standard malloc and free. Other systems cannot tolerate +redefinition of malloc and free. If yours is such a system, you may +either modify the makefile appropriately, or simply execute + cc -c -DCRAY malloc.c +before typing "make". Still other systems have a -lmalloc that +provides performance competitive with that from malloc.c; you may +wish to compare the two on your system. + +On some BSD systems, you may need to create a file named "string.h" +whose single line is +#include +you may need to add " -Dstrchr=index" to the "CFLAGS =" assignment +in the makefile, and you may need to add " memset.o" to the "OBJECTS =" +assignment in the makefile -- see the comments in memset.c . + +For non-UNIX systems, you may need to change some things in sysdep.c, +such as the choice of intermediate file names. + +Please send bug reports to dmg@research.att.com . The index file +("send index from f2c") will report recent changes in the recent-change +log at its end; all changes will be shown in the "fixes" file +("send fixes from f2c"). To keep current source, you will need to +request xsum0.out and version.c, in addition to the changed source +files. diff --git a/sources/f2c/rm.bat b/sources/f2c/rm.bat new file mode 100644 index 0000000..f7b31c3 --- /dev/null +++ b/sources/f2c/rm.bat @@ -0,0 +1,9 @@ +@echo off +:begin +if "%1" == "" goto :end +echo %1 +del %1 +shift +goto :begin +:end + diff --git a/sources/f2c/safstrcp.c b/sources/f2c/safstrcp.c new file mode 100644 index 0000000..413f6ab --- /dev/null +++ b/sources/f2c/safstrcp.c @@ -0,0 +1,86 @@ +/**************************************************************** +Copyright 1990 by AT&T Bell Laboratories and Bellcore. + +Permission to use, copy, modify, and distribute this software +and its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the names of AT&T Bell Laboratories or +Bellcore or any of their entities not be used in advertising or +publicity pertaining to distribution of the software without +specific, written prior permission. + +AT&T and Bellcore disclaim all warranties with regard to this +software, including all implied warranties of merchantability +and fitness. In no event shall AT&T or Bellcore be liable for +any special, indirect or consequential damages or any damages +whatsoever resulting from loss of use, data or profits, whether +in an action of contract, negligence or other tortious action, +arising out of or in connection with the use or performance of +this software. +****************************************************************/ + +/* safe_strncpy + + Copies at most max_length characters, stopping at the first \0 + character in source. The algorithm correctly handles overlapping + buffer areas. */ + +#include +#ifndef NULL +/* ANSI C */ +#include +#endif + +char *safe_strncpy (dest, source, max_length) +char *dest, *source; +int max_length; +{ + +/* There are several conditions to be considered in determining buffer + area overlap: + + Buffer Overlap? Picture Direction In Which To Copy +--------------------------------------------------------------------------- +1. dest == source | dest/src | no copy necessary + ============ + +2. tail of dest against | dest | | src | left to right + head of source ---------===-------- + +3. head of dest against | src | | dest | right to left + tail of source --------===--------- + +4. no overlap |src| |dest| or |dest| |src| either direction + ----- ------ ------ ----- +*/ + + register char *ret_val = dest; + register int real_length; + + if (source == NULL || dest == NULL) + return NULL; + +/* Compute the actual length of the text to be copied */ + + for (real_length = 0; real_length < max_length && source[real_length]; + real_length++); + +/* Account for condition 3, dest head v. source tail */ + + if (source + real_length >= dest && source < dest) + for (; real_length >= 0; real_length--) + dest[real_length] = source[real_length]; + +/* Account for conditions 2 and 4, dest tail v. source head or no overlap */ + + else if (source != dest) + for (; real_length >= 0; real_length--) + *dest++ = *source++; + +/* Implicitly handle condition 1, by not performing the copy */ + + return ret_val; +} /* safe_strncpy */ + diff --git a/sources/f2c/sysdep.c b/sources/f2c/sysdep.c new file mode 100644 index 0000000..44eaf04 --- /dev/null +++ b/sources/f2c/sysdep.c @@ -0,0 +1,314 @@ +/**************************************************************** +Copyright 1990 by AT&T Bell Laboratories and Bellcore. + +Permission to use, copy, modify, and distribute this software +and its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the names of AT&T Bell Laboratories or +Bellcore or any of their entities not be used in advertising or +publicity pertaining to distribution of the software without +specific, written prior permission. + +AT&T and Bellcore disclaim all warranties with regard to this +software, including all implied warranties of merchantability +and fitness. In no event shall AT&T or Bellcore be liable for +any special, indirect or consequential damages or any damages +whatsoever resulting from loss of use, data or profits, whether +in an action of contract, negligence or other tortious action, +arising out of or in connection with the use or performance of +this software. +****************************************************************/ +#include "defs.h" +#include "usignal.h" + +char binread[] = "rb", textread[] = "r"; +char binwrite[] = "wb", textwrite[] = "w"; +char *c_functions = "c_functions"; +char *coutput = "c_output"; +char *initfname = "raw_data"; +char *initbname = "raw_data.b"; +char *blkdfname = "block_data"; +char *p1_file = "p1_file"; +char *p1_bakfile = "p1_file.BAK"; +char *sortfname = "init_file"; + +#ifndef TMPDIR +#ifdef MSDOS +#define TMPDIR "" +#else +#define TMPDIR "/tmp" +#endif +#endif + +char *tmpdir = TMPDIR; + + void +Un_link_all(cdelete) +{ + if (!debugflag) { + unlink(c_functions); + unlink(initfname); + unlink(p1_file); + unlink(sortfname); + unlink(blkdfname); + if (cdelete && coutput) + unlink(coutput); + } + } + + void +set_tmp_names() +{ + int k; + if (debugflag == 1) + return; + k = strlen(tmpdir) + 16; + c_functions = (char *)ckalloc(7*k); + initfname = c_functions + k; + initbname = initfname + k; + blkdfname = initbname + k; + p1_file = blkdfname + k; + p1_bakfile = p1_file + k; + sortfname = p1_bakfile + k; + { +#ifdef MSDOS + char buf[64], *s, *t; + if (!*tmpdir || *tmpdir == '.' && !tmpdir[1]) + t = ""; + else { + /* substitute \ for / to avoid confusion with a + * switch indicator in the system("sort ...") + * call in formatdata.c + */ + for(s = tmpdir, t = buf; *s; s++, t++) + if ((*t = *s) == '/') + *t = '\\'; + if (t[-1] != '\\') + *t++ = '\\'; + *t = 0; + t = buf; + } + sprintf(c_functions, "%sf2c_func", t); + sprintf(initfname, "%sf2c_rd", t); + sprintf(blkdfname, "%sf2c_blkd", t); + sprintf(p1_file, "%sf2c_p1f", t); + sprintf(p1_bakfile, "%sf2c_p1fb", t); + sprintf(sortfname, "%sf2c_sort", t); +#else + int pid = getpid(); + sprintf(c_functions, "%s/f2c%d_func", tmpdir, pid); + sprintf(initfname, "%s/f2c%d_rd", tmpdir, pid); + sprintf(blkdfname, "%s/f2c%d_blkd", tmpdir, pid); + sprintf(p1_file, "%s/f2c%d_p1f", tmpdir, pid); + sprintf(p1_bakfile, "%s/f2c%d_p1fb", tmpdir, pid); + sprintf(sortfname, "%s/f2c%d_sort", tmpdir, pid); +#endif + sprintf(initbname, "%s.b", initfname); + } + if (debugflag) + fprintf(diagfile, "%s %s %s %s %s %s\n", c_functions, + initfname, blkdfname, p1_file, p1_bakfile, sortfname); + } + + char * +c_name(s,ft)char *s; +{ + char *b, *s0; + int c; + + b = s0 = s; + while(c = *s++) + if (c == '/') + b = s; + if (--s < s0 + 3 || s[-2] != '.' + || ((c = *--s) != 'f' && c != 'F')) { + infname = s0; + Fatal("file name must end in .f or .F"); + } + *s = ft; + b = copys(b); + *s = c; + return b; + } + + static void +killed() +{ + signal(SIGINT, SIG_IGN); +#ifdef SIGQUIT + signal(SIGQUIT, SIG_IGN); +#endif +#ifdef SIGHUP + signal(SIGHUP, SIG_IGN); +#endif + signal(SIGTERM, SIG_IGN); + Un_link_all(1); + exit(126); + } + + static void +sig1catch(sig) int sig; +{ + if (signal(sig, SIG_IGN) != SIG_IGN) + signal(sig, killed); + } + + static void +flovflo() +{ + Fatal("floating exception during constant evaluation; cannot recover"); + /* vax returns a reserved operand that generates + an illegal operand fault on next instruction, + which if ignored causes an infinite loop. + */ + signal(SIGFPE, flovflo); +} + + void +sigcatch() +{ + sig1catch(SIGINT); +#ifdef SIGQUIT + sig1catch(SIGQUIT); +#endif +#ifdef SIGHUP + sig1catch(SIGHUP); +#endif + sig1catch(SIGTERM); + signal(SIGFPE, flovflo); /* catch overflows */ + } + + +dofork() +{ +#ifdef MSDOS + Fatal("Only one Fortran input file allowed under MS-DOS"); +#else + int pid, status, w; + extern int retcode; + + if (!(pid = fork())) + return 1; + if (pid == -1) + Fatal("bad fork"); + while((w = wait(&status)) != pid) + if (w == -1) + Fatal("bad wait code"); + retcode |= status >> 8; +#endif + return 0; + } + + +/* Unless SYSTEM_SORT is defined, the following gives a simple + * in-core version of dsort(). On Fortran source with huge DATA + * statements, the in-core version may exhaust the available memory, + * in which case you might either recompile this source file with + * SYSTEM_SORT defined (if that's reasonable on your system), or + * replace the dsort below with a more elaborate version that + * does a merging sort with the help of auxiliary files. + */ + +#ifdef SYSTEM_SORT + +dsort(from, to) + char *from, *to; +{ + char buf[200]; + sprintf(buf, "sort <%s >%s", from, to); + return system(buf) >> 8; + } +#else + + static int +compare(a,b) + char *a, *b; +{ return strcmp(*(char **)a, *(char **)b); } + +dsort(from, to) + char *from, *to; +{ + extern char *Alloc(); + + struct Memb { + struct Memb *next; + int n; + char buf[32000]; + }; + typedef struct Memb memb; + memb *mb, *mb1; + register char *x, *x0, *xe; + register int c, n; + FILE *f; + char **z, **z0; + int nn = 0; + + f = opf(from, textread); + mb = (memb *)Alloc(sizeof(memb)); + mb->next = 0; + x0 = x = mb->buf; + xe = x + sizeof(mb->buf); + n = 0; + for(;;) { + c = getc(f); + if (x >= xe && (c != EOF || x != x0)) { + if (!n) + return 126; + nn += n; + mb->n = n; + mb1 = (memb *)Alloc(sizeof(memb)); + mb1->next = mb; + mb = mb1; + memcpy(mb->buf, x0, n = x-x0); + x0 = mb->buf; + x = x0 + n; + xe = x0 + sizeof(mb->buf); + n = 0; + } + if (c == EOF) + break; + if (c == '\n') { + ++n; + *x++ = 0; + x0 = x; + } + else + *x++ = c; + } + clf(&f, from, 1); + f = opf(to, textwrite); + if (x > x0) { /* shouldn't happen */ + *x = 0; + ++n; + } + mb->n = n; + nn += n; + if (!nn) /* shouldn't happen */ + goto done; + z = z0 = (char **)Alloc(nn*sizeof(char *)); + for(mb1 = mb; mb1; mb1 = mb1->next) { + x = mb1->buf; + n = mb1->n; + for(;;) { + *z++ = x; + if (--n <= 0) + break; + while(*x++); + } + } + qsort((char *)z0, nn, sizeof(char *), compare); + for(n = nn, z = z0; n > 0; n--) + fprintf(f, "%s\n", *z++); + free((char *)z0); + done: + clf(&f, to, 1); + do { + mb1 = mb->next; + free((char *)mb); + } + while(mb = mb1); + return 0; + } +#endif diff --git a/sources/f2c/tokdefs.h b/sources/f2c/tokdefs.h new file mode 100644 index 0000000..5983692 --- /dev/null +++ b/sources/f2c/tokdefs.h @@ -0,0 +1,99 @@ +#define SEOS 1 +#define SCOMMENT 2 +#define SLABEL 3 +#define SUNKNOWN 4 +#define SHOLLERITH 5 +#define SICON 6 +#define SRCON 7 +#define SDCON 8 +#define SBITCON 9 +#define SOCTCON 10 +#define SHEXCON 11 +#define STRUE 12 +#define SFALSE 13 +#define SNAME 14 +#define SNAMEEQ 15 +#define SFIELD 16 +#define SSCALE 17 +#define SINCLUDE 18 +#define SLET 19 +#define SASSIGN 20 +#define SAUTOMATIC 21 +#define SBACKSPACE 22 +#define SBLOCK 23 +#define SCALL 24 +#define SCHARACTER 25 +#define SCLOSE 26 +#define SCOMMON 27 +#define SCOMPLEX 28 +#define SCONTINUE 29 +#define SDATA 30 +#define SDCOMPLEX 31 +#define SDIMENSION 32 +#define SDO 33 +#define SDOUBLE 34 +#define SELSE 35 +#define SELSEIF 36 +#define SEND 37 +#define SENDFILE 38 +#define SENDIF 39 +#define SENTRY 40 +#define SEQUIV 41 +#define SEXTERNAL 42 +#define SFORMAT 43 +#define SFUNCTION 44 +#define SGOTO 45 +#define SASGOTO 46 +#define SCOMPGOTO 47 +#define SARITHIF 48 +#define SLOGIF 49 +#define SIMPLICIT 50 +#define SINQUIRE 51 +#define SINTEGER 52 +#define SINTRINSIC 53 +#define SLOGICAL 54 +#define SNAMELIST 55 +#define SOPEN 56 +#define SPARAM 57 +#define SPAUSE 58 +#define SPRINT 59 +#define SPROGRAM 60 +#define SPUNCH 61 +#define SREAD 62 +#define SREAL 63 +#define SRETURN 64 +#define SREWIND 65 +#define SSAVE 66 +#define SSTATIC 67 +#define SSTOP 68 +#define SSUBROUTINE 69 +#define STHEN 70 +#define STO 71 +#define SUNDEFINED 72 +#define SWRITE 73 +#define SLPAR 74 +#define SRPAR 75 +#define SEQUALS 76 +#define SCOLON 77 +#define SCOMMA 78 +#define SCURRENCY 79 +#define SPLUS 80 +#define SMINUS 81 +#define SSTAR 82 +#define SSLASH 83 +#define SPOWER 84 +#define SCONCAT 85 +#define SAND 86 +#define SOR 87 +#define SNEQV 88 +#define SEQV 89 +#define SNOT 90 +#define SEQ 91 +#define SLT 92 +#define SGT 93 +#define SLE 94 +#define SGE 95 +#define SNE 96 +#define SENDDO 97 +#define SWHILE 98 +#define SSLASHD 99 diff --git a/sources/f2c/tokens b/sources/f2c/tokens new file mode 100644 index 0000000..d97fb52 --- /dev/null +++ b/sources/f2c/tokens @@ -0,0 +1,99 @@ +SEOS +SCOMMENT +SLABEL +SUNKNOWN +SHOLLERITH +SICON +SRCON +SDCON +SBITCON +SOCTCON +SHEXCON +STRUE +SFALSE +SNAME +SNAMEEQ +SFIELD +SSCALE +SINCLUDE +SLET +SASSIGN +SAUTOMATIC +SBACKSPACE +SBLOCK +SCALL +SCHARACTER +SCLOSE +SCOMMON +SCOMPLEX +SCONTINUE +SDATA +SDCOMPLEX +SDIMENSION +SDO +SDOUBLE +SELSE +SELSEIF +SEND +SENDFILE +SENDIF +SENTRY +SEQUIV +SEXTERNAL +SFORMAT +SFUNCTION +SGOTO +SASGOTO +SCOMPGOTO +SARITHIF +SLOGIF +SIMPLICIT +SINQUIRE +SINTEGER +SINTRINSIC +SLOGICAL +SNAMELIST +SOPEN +SPARAM +SPAUSE +SPRINT +SPROGRAM +SPUNCH +SREAD +SREAL +SRETURN +SREWIND +SSAVE +SSTATIC +SSTOP +SSUBROUTINE +STHEN +STO +SUNDEFINED +SWRITE +SLPAR +SRPAR +SEQUALS +SCOLON +SCOMMA +SCURRENCY +SPLUS +SMINUS +SSTAR +SSLASH +SPOWER +SCONCAT +SAND +SOR +SNEQV +SEQV +SNOT +SEQ +SLT +SGT +SLE +SGE +SNE +SENDDO +SWHILE +SSLASHD diff --git a/sources/f2c/usignal.h b/sources/f2c/usignal.h new file mode 100644 index 0000000..ba4ee6a --- /dev/null +++ b/sources/f2c/usignal.h @@ -0,0 +1,7 @@ +#include +#ifndef SIGHUP +#define SIGHUP 1 /* hangup */ +#endif +#ifndef SIGQUIT +#define SIGQUIT 3 /* quit */ +#endif diff --git a/sources/f2c/vax.c b/sources/f2c/vax.c new file mode 100644 index 0000000..f1e4407 --- /dev/null +++ b/sources/f2c/vax.c @@ -0,0 +1,325 @@ +/**************************************************************** +Copyright 1990 by AT&T Bell Laboratories and Bellcore. + +Permission to use, copy, modify, and distribute this software +and its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the names of AT&T Bell Laboratories or +Bellcore or any of their entities not be used in advertising or +publicity pertaining to distribution of the software without +specific, written prior permission. + +AT&T and Bellcore disclaim all warranties with regard to this +software, including all implied warranties of merchantability +and fitness. In no event shall AT&T or Bellcore be liable for +any special, indirect or consequential damages or any damages +whatsoever resulting from loss of use, data or profits, whether +in an action of contract, negligence or other tortious action, +arising out of or in connection with the use or performance of +this software. +****************************************************************/ + +#include "defs.h" +#include "pccdefs.h" +#include "output.h" + +int regnum[] = { + 11, 10, 9, 8, 7, 6 }; + +/* Put out a constant integer */ + +prconi(fp, n) +FILEP fp; +ftnint n; +{ + fprintf(fp, "\t%ld\n", n); +} + + + +/* Put out a constant address */ + +prcona(fp, a) +FILEP fp; +ftnint a; +{ + fprintf(fp, "\tL%ld\n", a); +} + + + +prconr(fp, x, k) + FILEP fp; + int k; + Constp x; +{ + char *x0, *x1; + char cdsbuf0[64], cdsbuf1[64]; + + if (k > 1) { + if (x->vstg) { + x0 = x->Const.cds[0]; + x1 = x->Const.cds[1]; + } + else { + x0 = cds(dtos(x->Const.cd[0]), cdsbuf0); + x1 = cds(dtos(x->Const.cd[1]), cdsbuf1); + } + fprintf(fp, "\t%s %s\n", x0, x1); + } + else + fprintf(fp, "\t%s\n", x->vstg ? x->Const.cds[0] + : cds(dtos(x->Const.cd[0]), cdsbuf0)); +} + + +char *memname(stg, mem) + int stg; + long mem; +{ + static char s[20]; + + switch(stg) + { + case STGCOMMON: + case STGEXT: + sprintf(s, "_%s", extsymtab[mem].cextname); + break; + + case STGBSS: + case STGINIT: + sprintf(s, "v.%ld", mem); + break; + + case STGCONST: + sprintf(s, "L%ld", mem); + break; + + case STGEQUIV: + sprintf(s, "q.%ld", mem+eqvstart); + break; + + default: + badstg("memname", stg); + } + return(s); +} + +/* make_int_expr -- takes an arbitrary expression, and replaces all + occurrences of arguments with indirection */ + +expptr make_int_expr (e) +expptr e; +{ + if (e != ENULL) + switch (e -> tag) { + case TADDR: + if (e -> addrblock.vstg == STGARG) + e = mkexpr (OPWHATSIN, e, ENULL); + break; + case TEXPR: + e -> exprblock.leftp = make_int_expr (e -> exprblock.leftp); + e -> exprblock.rightp = make_int_expr (e -> exprblock.rightp); + break; + default: + break; + } /* switch */ + + return e; +} /* make_int_expr */ + + + +/* prune_left_conv -- used in prolog() to strip type cast away from + left-hand side of parameter adjustments. This is necessary to avoid + error messages from cktype() */ + +expptr prune_left_conv (e) +expptr e; +{ + struct Exprblock *leftp; + + if (e && e -> tag == TEXPR && e -> exprblock.leftp && + e -> exprblock.leftp -> tag == TEXPR) { + leftp = &(e -> exprblock.leftp -> exprblock); + if (leftp -> opcode == OPCONV) { + e -> exprblock.leftp = leftp -> leftp; + free ((charptr) leftp); + } + } + + return e; +} /* prune_left_conv */ + + + static int wrote_comment; + static FILE *comment_file; + + static void +write_comment() +{ + if (!wrote_comment) { + wrote_comment = 1; + nice_printf (comment_file, "/* Parameter adjustments */\n"); + } + } + + static int * +count_args() +{ + register int *ac; + register chainp cp; + register struct Entrypoint *ep; + register Namep q; + + ac = (int *)ckalloc(nallargs*sizeof(int)); + + for(ep = entries; ep; ep = ep->entnextp) + for(cp = ep->arglist; cp; cp = cp->nextp) + if (q = (Namep)cp->datap) + ac[q->argno]++; + return ac; + } + +prolog(outfile, p) + FILE *outfile; + register chainp p; +{ + int addif, addif0, i, nd, size; + int *ac; + register Namep q; + register struct Dimblock *dp; + + if(procclass == CLBLOCK) + return; + wrote_comment = 0; + comment_file = outfile; + ac = 0; + +/* Compute the base addresses and offsets for the array parameters, and + assign these values to local variables */ + + addif = addif0 = nentry > 1; + for(; p ; p = p->nextp) + { + q = (Namep) p->datap; + if(dp = q->vdim) /* if this param is an array ... */ + { + expptr Q, expr; + + /* See whether to protect the following with an if. */ + /* This only happens when there are multiple entries. */ + + nd = dp->ndim - 1; + if (addif0) { + if (!ac) + ac = count_args(); + if (ac[q->argno] == nentry) + addif = 0; + else if (dp->basexpr + || dp->baseoffset->constblock.Const.ci) + addif = 1; + else for(addif = i = 0; i <= nd; i++) + if (dp->dims[i].dimexpr + && (i < nd || !q->vlastdim)) { + addif = 1; + break; + } + if (addif) { + write_comment(); + nice_printf(outfile, "if (%s) {\n", /*}*/ + q->cvarname); + next_tab(outfile); + } + } + for(i = 0 ; i <= nd; ++i) + +/* Store the variable length of each dimension (which is fixed upon + runtime procedure entry) into a local variable */ + + if ((Q = dp->dims[i].dimexpr) + && (i < nd || !q->vlastdim)) { + expr = (expptr)cpexpr(Q); + write_comment(); + out_and_free_statement (outfile, mkexpr (OPASSIGN, + fixtype(cpexpr(dp->dims[i].dimsize)), expr)); + } /* if dp -> dims[i].dimexpr */ + +/* size will equal the size of a single element, or -1 if the type is + variable length character type */ + + size = typesize[ q->vtype ]; + if(q->vtype == TYCHAR) + if( ISICON(q->vleng) ) + size *= q->vleng->constblock.Const.ci; + else + size = -1; + + /* Fudge the argument pointers for arrays so subscripts + * are 0-based. Not done if array bounds are being checked. + */ + if(dp->basexpr) { + +/* Compute the base offset for this procedure */ + + write_comment(); + out_and_free_statement (outfile, mkexpr (OPASSIGN, + cpexpr(fixtype(dp->baseoffset)), + cpexpr(fixtype(dp->basexpr)))); + } /* if dp -> basexpr */ + + if(! checksubs) { + if(dp->basexpr) { + expptr tp; + +/* If the base of this array has a variable adjustment ... */ + + tp = (expptr) cpexpr (dp -> baseoffset); + if(size < 0 || q -> vtype == TYCHAR) + tp = mkexpr (OPSTAR, tp, cpexpr (q -> vleng)); + + write_comment(); + tp = mkexpr (OPMINUSEQ, + mkconv (TYADDR, (expptr)p->datap), + mkconv(TYINT, fixtype + (fixtype (tp)))); +/* Avoid type clash by removing the type conversion */ + tp = prune_left_conv (tp); + out_and_free_statement (outfile, tp); + } else if(dp->baseoffset->constblock.Const.ci != 0) { + +/* if the base of this array has a nonzero constant adjustment ... */ + + expptr tp; + + write_comment(); + if(size > 0 && q -> vtype != TYCHAR) { + tp = prune_left_conv (mkexpr (OPMINUSEQ, + mkconv (TYADDR, (expptr)p->datap), + mkconv (TYINT, fixtype + (cpexpr (dp->baseoffset))))); + out_and_free_statement (outfile, tp); + } else { + tp = prune_left_conv (mkexpr (OPMINUSEQ, + mkconv (TYADDR, (expptr)p->datap), + mkconv (TYINT, fixtype + (mkexpr (OPSTAR, cpexpr (dp -> baseoffset), + cpexpr (q -> vleng)))))); + out_and_free_statement (outfile, tp); + } /* else */ + } /* if dp -> baseoffset -> const */ + } /* if !checksubs */ + + if (addif) { + nice_printf(outfile, /*{*/ "}\n"); + prev_tab(outfile); + } + } + } + if (wrote_comment) + nice_printf (outfile, "\n/* Function Body */\n"); + if (ac) + free((char *)ac); +} /* prolog */ diff --git a/sources/f2c/version.c b/sources/f2c/version.c new file mode 100644 index 0000000..ac09787 --- /dev/null +++ b/sources/f2c/version.c @@ -0,0 +1,2 @@ +char F2C_version[] = "26 February 1990 17:38:00"; +char xxxvers[] = "\n@(#) FORTRAN 77 to C Translator, VERSION 26 February 1990 17:38:00\n"; diff --git a/sources/gen/back.c b/sources/gen/back.c new file mode 100644 index 0000000..66b3b4f --- /dev/null +++ b/sources/gen/back.c @@ -0,0 +1,168 @@ +/* Loglan82 Compiler&Interpreter + Copyright (C) 1993 Institute of Informatics, University of Warsaw + Copyright (C) 1993, 1994 LITA, Pau + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + +======================================================================= +*/ + +#include "glodefs.h" + + +#ifndef NO_PROTOTYPES + +static void rsnuse(argnr); +static void ptnuse(argnr); + +#else + +static void rsnuse(); +static void ptnuse(); + +#endif + + +static void rsnuse(n) argnr n;{ + + /* if no next use - replace by 'nop' and exit to 55 */ + + qaddr0 nextuse ; + int notrick ; + quadruple * curr ; /* gsg for PASCAL WITH translation */ + + + notrick = ipmem[ tuple[ qcurr ].arg[ n ] ] ; +/* with tuple[ qcurr ] do begin */ + { curr = tuple + qcurr ; /* gsg PASCAL WITH translation */ + + nextuse = ipmem[ (curr->arg)[ n ] + 2 ] ; + (curr->nxtuse)[ n ] = nextuse ; + if ( (nextuse == 0) && (! slive(notrick)) ) + { + if ((curr->opcode) > 5) /* #lslopen */ + { + (curr->opcode) = 195 ; + nouse = TRUE ; + } + } + else + { ipmem[ (curr->arg)[ n ] + 2 ] = 0 ; + if (ctpoint < nextuse) + { /* set slocal */ + putslocal(TRUE, notrick) ; + ipmem[ (curr->arg)[ n ] ] = notrick ; + } + } + } /* with */ + } /* rsnuse */ + + + +static void ptnuse(n) argnr n;{ + qaddr0 nextuse ; + int notrick ; + quadruple * curr ; /* gsg for PASCAL WITH translation */ + +/* with tuple[ qcurr ] do */ + { curr = tuple + qcurr ; /* gsg PASCAL WITH translation */ + nextuse = ipmem[ (curr->arg)[ n ] + 2 ] ; + ipmem[ (curr->arg)[ n ] + 2 ] = qcurr ; + (curr->nxtuse)[ n ] = nextuse ; + if (ctpoint < nextuse) + { /* set slocal */ + notrick = ipmem[ (curr->arg)[ n ] ] ; + putslocal(TRUE,notrick) ; + ipmem[ (curr->arg)[ n ] ] = notrick ; + } + } /* with */ +} /* ptnuse */ + + +void back() + + /* SCANS DOWN THE QUADRUPLES TABLE TO ESTABLISH 'NEXT USE' INFORMATION */ + /* OPERATIONS YIELDING NOT REFERENCED RESULTS ARE REPLACED BY 'NOP'==195*/ + /* IF VALUE IS USED AFTER CONTROL TRANSMISSION, THE ATTRIBUTE 'SLOCAL' */ + /* IS SET. */ + +/* LABEL 55 ; */ /* EXIST FROM RSNUSE IF NO NEXT USE */ + + { quadruple * curr ; /* gsg for PASCAL WITH translation */ + + + /* Back */ + + ctpoint = qlast + 1 ; + qcurr = qlast ; + /* FOR QCURR = QLAST DOWNTO 1 */ + while (qcurr > 0) /* DO WITH TUPLE [ QCURR ] DO */ + { curr = tuple + qcurr ; /* PASCAL WITH translation */ + nouse = FALSE ; + switch ( opdescr[ curr->opcode ] ) + { case 0 : + case 1 : break ; + + case 2 : + case 3 : + case 4 : ptnuse(1) ; + break ; + + case 5 : + case 6 : ptnuse(1) ; + ptnuse(2) ; + if ( curr->opcode <= 160 ) + ctpoint = qcurr ; + break ; + + case 7 : ptnuse(1) ; + ptnuse(2) ; + ptnuse(3) ; + break ; + + case 8 : + case 9 : + case 10 : rsnuse(1) ; + break ; + + case 11 : + case 12 : rsnuse(1) ; + if ( nouse ) + goto label55 ; + ptnuse(2) ; + break ; + + case 13 : rsnuse(1) ; + if ( nouse ) + goto label55 ; + ptnuse(2) ; + ptnuse(3) ; + break ; + + case 14 : + case 15 : rsnuse(1) ; + if ( nouse ) + goto label55 ; + rsnuse(2) ; + if ( nouse ) + goto label55 ; + if ( curr->opcode > 3 ) + ptnuse(3) ; + break ; + + } /* switch */ + label55 : ; + qcurr-- ; + } /* while */ + } /* back */ + + + diff --git a/sources/gen/back.o b/sources/gen/back.o new file mode 100644 index 0000000000000000000000000000000000000000..b9bc6c7d6d1d2d719a993663db9f68a4b0a7482e GIT binary patch literal 1816 zcmb7^O-NKx6vyw(Jj-k($!X!D5<;k`kZ7S)i>z4$Nl_VA*t1@P%%slb%KSf9^YuFH5Qm_x;ZIJ@?Gj#XcdL z4N+VUOZ~9ZYLXx9iQu6FS4okNGojZc__7(}A_@2DqZ&))%S`Yx$-Wo%fZ@x^VO1fA zGoe1R>0A}6kWKjo$~@Ak&t!T^g{M?gsoLcja`p_F4Xhx4rlC}3m0yMn9Mo8ldz_Gc zwjk1LRXA^t`1=OZtKhWjO1dk-Au))&p%PskpYemv-|7$fDOk5zA1-vSIoFu?{UJx` zj#Oh_2K|}H#L;7NqGiy*a_6cT*fh!Toh8OEndg-`=L5 z%(7+Yvp$#%treewa{5tsW|S(sYXmy&NzWDmRKu>tZuRU0WZM1MBfN7*am;KnFy6C9j{<5*YCl1gk;( z`w50Y{GA5(vAvD$=h^-gTm=6|*1v*_p;uw*lvf8*y}cmSi?jU#^9uWKgOoSS_AksT zyq_}It3mSDu)ZFoy0y$5%w~|zu|Vo82`&YDnU3o>=)EG&xX!%6yve-9yu-Z9e8?PN zK4Cs*zG4nD-!k7Z-!rSxJoR6L58dkwNd4YqPB4RLlI%M{m`J6*^{Vv9H6D2*WQ5nG$9q +#include "glodefs.h" + + +#ifndef NO_PROTOTYPES + +static long hash_search(char *); +static int ord(char); + +#else + +static long hash_search(); +static int ord(); + +#endif + + + +/* ===================== for debugger ======================== */ +/* files organization : */ +/* fil21 ( .DEB ) : */ +/* hash(maxhash), */ +/* idict(maxidict), ind, prot(ind) */ +/* dfile ( .DCD ) : */ +/* hash(maxhash), */ +/* idict(maxidict), protbreakl, ind, prot(ind) */ + +#define maxhash 8000 +#define maxidict 500 + +static int idict[maxidict]; /* dictionary of prototypes */ +static int *prot; /* array of prototypes */ +static int ind; /* last used in PROT */ + +void db3(){ + /* put dispnr and offset into prototypes */ + int i=0,j,pr,prz,el; + + while( i < maxidict ){ + + if( idict[i] != 0 ){ + + /* pr - address of zero word of the prototype */ + pr = idict[i]; + /* dispnr */ + prot[pr+3] = i; + /* hash table of prototype */ + for( j = pr+5 ; j <= pr+12 ; j++){ + + el = prot[j]; + prz = prot[el]; + /* el - address of zero word of list element */ + while( prz != -100 ){ + + if( prot[el+1] % 8 < 4 ){ /* not not taken */ + + prz = prot[el+2]; + /* prz - address of debugger protype */ + if( prz < -15 ){ /* variable or constant */ + + prz = -prz; + if( prot[prz] == 5 ) /* variable */ + prot[prz+3] = ipmem[prot[prz+3] - 2]; + } + } + el = el+3; + prz = prot[el]; /* next element */ + } /* while */ + } /* for */ + } + i++; + } /* while */ +} + +long hash[8000]; + +void ts3( fname ) char *fname; { + + /* wpisuje dispnr i offset do prototypow debuggera */ + /* czyta prototypy z pliku fil21, pisze na dfile */ + + FILE *fil21; /* input - prototypes from TS2 */ + + char fnameaux[30]; + long position; + + strcpy( fnameaux, fname ); + fil21 = fopen( strcat( fnameaux, ".deb" ) , "rw" ); + fseek( fil21, maxhash * sizeof(int) ,0 ); + fread( idict, sizeof(*idict), maxidict, fil21 ); + fread( &ind, sizeof(ind), 1, fil21 ); + /* reading PROT */ + position = ftell( fil21 ); + prot=(int *)calloc(ind+1,sizeof(int)); + fread( prot+1, sizeof(int), ind*4, fil21 ); + /* changing prototypes */ + db3(); + /* writing PROT */ + fseek( fil21, position, 0 ); + fwrite( prot+1, sizeof(int), ind*4, fil21 ); +fseek( fil21, 0L, 0); +fread( hash, 8000, sizeof(long), fil21 ); +printf("searching do for begin aaa ala i nikldksjkehtr");getchar(); +printf("#%ld",hash_search("do"));getchar(); +printf("#%ld",hash_search("for"));getchar(); +printf("#%ld",hash_search("begin"));getchar(); +printf("#%ld",hash_search("aaa"));getchar(); +printf("#%ld",hash_search("ala"));getchar(); +printf("#%ld",hash_search("i"));getchar(); +printf("#%ld",hash_search("niksehfkertk"));getchar(); + fclose( fil21 ); + free(prot); +} + +/* ======================================================== */ + +#define BYTE 64 +#define M 1009 + +static long hash_search (str) char *str;{ + + long name[21]; + int result; + int i=0; + int H; /* do poszukiwan po hash */ + int N; /* do przechodzenia po name */ + + /* pakowanie nazwy do poszukiwan w hash */ + + for( i=0; i<20 && *str!='\0'; i++ ) + if( i % 2 == 0 ) name[ i/2 ] = ord( *( str++ ) ); + else name[ i/2 ] = name[ i/2 ] * BYTE + ord( *( str++ ) ); + + name[ (i+1)/2 ]= -1 ; + i= i/2 + i%2; + H = ( name[0] % M ) * 2; + + for(;;){ +printf("comparing name H=%d,name[0]=%d",H,name[0]);getchar(); + + N=0; + result = H; + + while( hash[ H+1 ] <0 && hash[ H ] == name[ N ] ){ +printf("Nth pare OK %d",N);getchar(); + + H = - hash[ H+1 ] - 1; + N++; + + } + + if( hash[ H ] != name[ N ] ){ + + while( hash[ H+1 ] <0 ) H = - hash[ H+1 ] - 1; + if( hash[ H+1 ] == 0 ) return -1; + H = hash[ H+1 ] - 1; + continue; + + } + + if( name[ N+1 ] == -1 ) return result; + if( hash[ H+1 ] == 0 ) return -1; + + H = hash[ H+1 ] - 1; + + } + +} + + +static int ord_tab[]={ +63,63,63,63,63,63,63,63,36,63,63,63,37, +36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36, +63,43,63,63,63,63,44,52,53,48,39, +42,40,38,41,0,1,2,3,4,5,6,7,8,9,47,45,50,49,51,63,63, +10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29, +30,31,32,33,34,35,63,63,63,63,46, +63,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29, +30,31,32,33,34,35 +}; + +static int ord(c) char c;{ + if( c>122 ) return 63; + return ord_tab[ c-1 ]; +} + + diff --git a/sources/gen/deb.o b/sources/gen/deb.o new file mode 100644 index 0000000000000000000000000000000000000000..2cc7fd6c11cc91d021fa1d1c8840659d4402fad4 GIT binary patch literal 4912 zcmchbe{56N700g=1E#g}qa^$&Y%y&^2{0DgZXFOty7h^+6fmtawn63@+lieRJ93<% z6->(vDsK&2s%W$Yh3!9d-+5)8-W!+R;j;hcx5t3})_uO~v zyk_~aKc+q9ywAPop8I|0{&?4R=9q-|>uo}$!Ao<5SOwDch*@WY`nT9%#gpfiF{&pH zM#uh+hy#|)FMvcMp($gry2HP-qOtVQ^YFo;RY-^0a6?mWsJ(IXG3u-K7FTvw2oe8^ zRqaKTTBJ4Jh@G3IHVz{!cGkL989q>!*{thAT3(tmTu{(tf6ZK^DubFbIGKMa79HyB zxGnP!N|r8T+;|3NWKg8`9)2fU9P6Ev8Yx!$;}yTBENl8=!^Ne~$5EWTt3`HI=t0+` z{+o?MnldyYlUQBRtd6Zlf8oiGS=G0+h9Pvz0Llh-Q{xGT>+QfZx8xg1D@9QmR7GX5*D72xVt*w5r`BrQXofl# zB77n$ca$R?k$x-ojl*{X{aVaE+H~n%(qBgY789IZ*kS2SzM%c5ilL>C$cp&{y@G3JS#aOGP!9|0E!hfQ?LM?@y=HdtoNM z6{L53g5J(4^&Xl*Pj1L1dXU`ij&zA$qZ7g%+SBF=)5#EY?eW?l*--6SMWvm!jVOw( z5uY9HUi-Gqc2o;nNWSmB9bdyIMmI7Q31%$XJ@4r|w5UamCN(Ab%$Gz*MYbrB$XukL z@k@(#Q$#~D_7~IPcRK2Ea;QpDizZ9YEO;WPSkjBJ)oDKAZ0J_|Q@5(ri>Yi?+&WLa zkQy;TTYdOgPxjj^S$JaUnKIe`O7Zmlw{$~qv`YPR>f@^Tk`ncD>Xu2{74K0m!~fxI zWMaCi?myO(Q@S(vj-R{v5ok(xz056{8mU5hnJSFMbU__Rbn@gwb?cOl)TyWE_&8n)hAf(GxgDfqDeK{r7NMlLsPnR?+)LsS=eu*H);P{<@>HT ztlc1wq)Po1xgy)m`6DSGryoh@l}_3OTC__ayQ;jx<%VSbYk^E5_8U6EM6{M4-_VI% zw7NIQsdrtARgEmomgXm#nb8no@M+ObJ>KD4I2-BL$@DDR2GVCG{Yd5f7jyoVx=0~V zA3#2xWV}xQ5+ir7mLRp8@5P_WVeWEDXJ%P`C*(U!nt$mb8ql;eu)ic*XBbW*uQy!+ z*^}cvCXbJumebo&ewub(=KT1aO`eP3f4V{IrDp)AmjPjjbm+L6e zlvlF;LPGydKG}7J@WhPyJb_Q{@$f|4dvxcwoOEF6PI>;AwFb+PhTJpJ+*1ciPH)6$ z3m;0QXSU=tbNmB*<;@nO3-zRc>Fk~f?bWE0?|)_V?3ELqLB3V62Vh@-)xz$Dt$;0u zErZp-=)xzKz(<3?$tGx>@!AUPeSxp@f?n0Ru+PIj2fGip26jIzKW5B@xE)4c;%%@J zSShRwRt~!ZHV=kxM4}QlAGQFt5Vi<*Cu}in3G6el&%&x;cGyzbU9h`h`RC=intlJT z=hK{FKFkj?w=$n&{+QXvyd4uu@wLpym~Q4i5OZyPiR;_22$*x*4iM{L-o^BS(6P0F zSPR<`5M#C-*Zt-$5c6+4#r0otJq2PtY<=t>0I@cn}1pLHg@q{v0HoS3%OD!;<)0=0%Wnu5tY%<{(IaV@wk^59!PWsedVR zK65chI%~N8AhQl6iN~4SLDKmKw>z0l%vO+e4s!ij=24JzI+-Ux()kIu|BU%-=4&A7 z^mBcH`2mP?!IlPTzkLkijIfR2WgvYMoN}BXjkA)ugt-)yv)MM{s?mb#JOrl4wQ$y@SH-q z8f6S!UMq0NV+H+4UBhMiNl9l9jthBx8Fz}W$NT$LFz?@NC_iZ^f74KQ8OlDC=~?vK zc8|dyF_iZk%7^l0{J8#pz6}1rQ2wEz{4&Zk-dYU)mj?gqhH@{*oWdNPM;W2=|4Mye zv)g^2lYUS5176Q+;dDBigB=Bj(=D8y-S-Qp-{W^jgtILi!rkAt$Gb;3BkgEtkA&TA z-__|tTT`gb8wA?D-c}&&b$QSsh+9*{8wd!e+Z70eAltMz?2mYb)8}gUk+44)X~N?l q-3CdIKj@@XI+_BZy?TgK|8EHTxdWkg^n*0+p)izjb4Fad#lHdier5sy literal 0 HcmV?d00001 diff --git a/sources/gen/gen b/sources/gen/gen new file mode 100644 index 0000000000000000000000000000000000000000..856be1a867000c6d08d33d7a679c4e1cca9a21b6 GIT binary patch literal 36864 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 j8L%CyboTEo2hMWfECopcode) { + + +/*CBC... Fixed bug - added calls of ARGUMENT to release global temporary + variables in case of no further references to them */ + +case 1 /* #LOPENRC */: + forceprot(3); + emit(); + argument(1); + argument(2); + break; + +case 2 /* #LBACKADDR */: + emit(); + argument(1); + argument(2); + break; + +/*...CBC*/ +case 3 /* #LRAISE */: + emit(); + aftraise = fre; + fre++; /* this cell is to be filled further */ + break; + +case 11 : + curr1->opcode = 60 ; /* #limove */ + force(2,IMMEDIATE,(address)0,(address)0); + emit() ; + break; +case 12 : + curr1->opcode= 61 ; /* #lvmove */ + force(2,GLOBAL,realbase /* none */,(address)0); + emit() ; + break; + +case 13 : + curr1->opcode= 60 ; /* #limove */ + force(2,GLOBAL,temporary,(address)0); + emit() ; + break; + + /* M [ TEMPORARY ] STANDS FOR ANY REGISTER */ +case 15 : /* #LTHIS */ +case 20 : /* #LVIRTDISPL */ + + forceprot(2); + emit() ; + break; + + + case 16 : + curr1->opcode= 60 ; /* #limove */ + forceprot(2); + args[ 2 ].mode=IMMEDIATE; + emit() ; + break ; + +case 21 /* #LSTATTYPE */: + args[ 3 ].off1= - ipmem[ args[ 3 ].off1 + 2 ]; + emit() ; + break; + +case 22 : /* FETCH FORMAL TYPE THROUGH THE DISPLAY */ + curr1->opcode= 61 ; /* #lvmove */ + force(2,DOTACCESS, ipmem[ curr1->arg[ 3 ]-2 ] /*offset*/, + ipmem[ curr1->arg[ 3 ]-1 ] /* +display */ /*prot*/); + args[ 3 ].mode=NOARGUMENT; + emit() ; + break; + + +case 23 : + notrick =ipmem[ curr1->arg[ 1 ] ]; + switch(sap(notrick)) + { + case APINT : break; + case APVIRT : curr1->opcode = 25 ; /* #lvparout */ + break; + case APREAL : curr1->opcode=24 ; /* #lrparout */ + break; + } /* switch */ + emit() ; + break; + +case 29 : +case 30 : +case 133 : generror(NOTIMPL); + break; + +case 32 : + curr1->opcode = 113 ; /* #liadd */ + force(3,IMMEDIATE,(address)1,(address)0); + emit() ; + break ; + +case 37 : +case 39 : + curr1->opcode= 113 ; /* #liadd */ + args[ 3 ].mode=IMMEDIATE; + emit() ; + break ; + +case 38 : /* MOVE & SAVE */ + notrick =ipmem[ curr1->arg[ 1 ] ] ; + switch(sap(notrick)) + { + case APINT : curr1->opcode= 60 ; /* #limove */ + break ; + case APREAL : curr1->opcode= 62 ; /* #lrmove */ + break ; + case APVIRT : curr1->opcode= 61 ; /* #lvmove */ + break ; + } /* switch */ + emit(); + break ; + +case 54 /* #LLOADT */: + forceprot(3); + emit(); + m[ fre ]=ipmem[ curr1->arg[ 3 ]-2 ]; /* offset */ + fre+=APINT; + break ; + +case 53 : /* SHIFT BY CONSTANT NUMBER OF POSITIONS */ + curr1->opcode= 116 ; /* #lshift */ + args[ 3 ].mode=IMMEDIATE; + emit(); + break ; + +case 55 : /* #LIS */ +case 56 : /* #LIN */ +case 57 : /* #LQUA */ + + /*WITH ARGS[ 3 ] DO */ + curr2 = args + 3 ; + curr2->off1 = + - ipmem[ curr2->off1 + 2 ]; + /* ADDRESS OF TYPE DESCRIPTION */ + emit() ; + break ; + +case 149 /* #LQUATEST */: + + args[ 2 ].off1= - ipmem[ args[ 2 ].off1 + 2 ]; + /* ADDRESS OF TYPE DESCRIPTION */ + emit() ; + break ; + +case 60 /* #LIMOVE */: + + notrick = ipmem[ curr1->arg[ 1 ] ]; + switch (sap(notrick)) { + case APINT : break ; + case APREAL : curr1->opcode = 62 ; /* #LRMOVE */ break ; + case APVIRT : curr1->opcode = 61 ; /* #LVMOVE */ break ; + case APFMPROC : curr1->opcode = 63 ; /* #LFPMOVE */ break ; + } /* CASE */; + emit() ; + break ; + + case 61 : + curr1->opcode= 60 ; /* #limove */ + args[ 2 ].mode=INDIRECT; + emit(); + break ; + + case 62 : + curr1->opcode= 61 ; /* #lvmove */ + args[ 2 ].mode=INDIRECT; + emit(); + break ; + + case 63 : + curr1->opcode= 63 ; /* #lfpmove */ + args[ 2 ].mode=INDIRECT; + emit(); + break ; + + case 64 : + curr1->opcode= 115 ; /* #limult */ + force(3,IMMEDIATE,(address)2,(address)0); + emit() ; + break ; + + case 65 : + curr1->opcode= 115 ; /* #limult */ + force(3,IMMEDIATE,(address)3,(address)0); + emit() ; + break ; + + case 66 : + curr1->opcode= 115 ; /* #limult */ + force(3,IMMEDIATE,(address)4,(address)0); + emit() ; + break ; + + case 67 : + curr1->opcode= 115 ; /* #limult */ + force(3,IMMEDIATE,(address)5,(address)0); + emit() ; + break ; + + case 68 : + curr1->opcode= 115 ; /* #limult */ + force(3,IMMEDIATE,(address)6,(address)0); + emit() ; + break ; + + case 69 : + curr1->opcode= 115 ; /* #limult */ + force(3,IMMEDIATE,(address)7,(address)0); + emit() ; + break ; + + case 70 : + curr1->opcode= 115 ; /* #limult */ + force(3,IMMEDIATE,(address)8,(address)0); + emit() ; + break ; + + case 71 : + curr1->opcode= 115 ; /* #limult */ + force(3,IMMEDIATE,(address)9,(address)0); + emit() ; + break ; + + case 72 : + curr1->opcode= 115 ; /* #limult */ + force(3,IMMEDIATE,(address)10,(address)0); + emit() ; + break ; + + case 73 : + curr1->opcode= 117 ; /* #lidive */ + force(3,IMMEDIATE,(address)8,(address)0); + emit() ; + break ; + + case 74 : + curr1->opcode= 117 ; /* #lidive */ + force(3,IMMEDIATE,(address)4,(address)0); + emit() ; + break ; + + case 75 : + curr1->opcode= 117 ; /* #lidive */ + force(3,IMMEDIATE,(address)2,(address)0); + emit() ; + break ; + + case 76 : + case 77 : + case 78 : + case 79 : + case 80 : + case 81 : + + curr1->opcode = 106 + /* #liequal */(curr1->opcode-76); + force(3,IMMEDIATE,(address)0,(address)0); + emit() ; + break ; + + case 84 : + curr1->opcode= 60 ; /* #limove */ + args[ 2 ].mode=REMOTE; args[ 2 ].off2=args[ 2 ].off1; args[ 2 ].off1=ipmem[ curr1->arg[ 3 ]-2 ]; + args[ 3 ].mode=NOARGUMENT; + emit(); + break ; + + case 85 : + curr1->opcode= 61 ; /* #lvmove */ + args[ 2 ].mode=REMOTE; + args[ 2 ].off2=args[ 2 ].off1; + args[ 2 ].off1=ipmem[ curr1->arg[ 3 ]-2 ]; + args[ 3 ].mode=NOARGUMENT; + emit(); + break ; + + case 86 : + curr1->opcode= 63 ; /* #lfpmove */ + args[ 2 ].mode=REMOTE; + args[ 2 ].off2=args[ 2 ].off1; + args[ 2 ].off1=ipmem[ curr1->arg[ 3 ]-2 ]; + args[ 3 ].mode=NOARGUMENT; + emit(); + break ; + + case 88 : + case 89 : + case 90 : + case 91 : + case 92 : + case 93 : + + curr1->opcode= 106 + /* #liequal */(curr1->opcode-88); + args[ 3 ].mode=IMMEDIATE; + emit() ; + break ; + + case 94 : + case 95 : + case 96 : + case 97 : + case 98 : + case 99 : + + curr1->opcode= 106 + /* #liequal */(curr1->opcode-94); + args[ 3 ].mode=IMMEDIATE; + emit() ; + break ; + + case 137 : + curr1->opcode= 60 ; /* #limove */ + force(1,REMOTE,ipmem[ curr1->arg[ 2 ]-2 ],args[ 1 ].off1); + force(2,IMMEDIATE,(address)0,(address)0); + emit(); + break ; + + case 138 : + curr1->opcode= 61 ; /* #lvmove */ + force(1,REMOTE,ipmem[ curr1->arg[ 2 ]-2 ],args[ 1 ].off1); + force(2,GLOBAL,realbase,(address)0); /* none */ + emit(); + break ; + + case 139 : if (curr1->arg[2] == -45) { /* file address */ + curr1->opcode = 61; + args[2] = args[1]; + force(1,GLOBAL,(address)CURRFILE,(address)0); + emit() ; + } else /*dsw*/ + { + curr1->opcode= 60 ; /* #limove */ + args[ 2 ]=args[ 1 ]; + force(1,GLOBAL,temporary,(address)0); emit() ; + } + break ; + + case 140 : + case 158 : + case 176 : + case 179 : + case 195 : break ; + + case 141 : + notrick =ipmem[ curr1->arg[ 1 ] ]; + locrelease(args[ 1 ].off1, sap(notrick)); + break ; + + case 145 : + notrick =ipmem[ curr1->arg[ 1 ] ]; + switch (sap(notrick)) { + case APINT : break ; + case APVIRT : curr1->opcode= 147 ; /* #lvparinp */ break ; + case APREAL : curr1->opcode=148 ; /* #lrparinp */ break ; + } /* case */ + emit(); + break ; + + case 147 : + curr1->opcode= 60 ; /* #limove */ + args[ 1 ].mode=INDIRECT; + force(2,IMMEDIATE,(address)0,(address)0); + emit(); + break ; + + case 148 : + curr1->opcode= 61 ; /* #lvmove */ + args[ 1 ].mode=INDIRECT; + args[ 2 ].mode=GLOBAL; + args[ 2 ].off1=realbase; /* none */ + emit(); + break ; + + case 150 /* #lstype */: + args[ 2 ].off1= - ipmem[ args[ 2 ].off1 + 2 ]; + emit() ; + break ; + + case 152 /* #liftrue */ : + case 151 /* #liffalse */ : + case 182 /* #ljump */: + + emit(); + fre -- ; + uselabel(m[ fre ]); + fre ++ ; + break ; + + case 153 : /* kill after raise */ + m[ aftraise ]= fre + base; + curr1->opcode= 143 ; /* #lkill */ + emit(); + break ; + + case 161 : + curr1->opcode= 60 ; /* #limove */ + args[ 1 ].mode=INDIRECT; + emit(); + break ; + + case 162 : + curr1->opcode= 61 ; /* #lvmove */ + args[ 1 ].mode=INDIRECT; + emit(); + break ; + + case 163 : + curr1->opcode= 63 ; /* #lfpmove */ + args[ 1 ].mode=INDIRECT; + emit() ; + break ; + + case 164 : + curr1->opcode= 60 ; /* #limove */ + args[ 1 ].mode=REMOTE; + args[ 1 ].off2=args[ 1 ].off1; + args[ 1 ].off1=ipmem[ curr1->arg[ 3 ]-2 ]; /* offset */ + args[ 3 ].mode=NOARGUMENT; + emit(); + break ; + + case 165 : + curr1->opcode= 61 ; /* #lvmove */ + args[ 1 ].mode=REMOTE; + args[ 1 ].off2= args[ 1 ].off1; + args[ 1 ].off1=ipmem[ curr1->arg[ 3 ]-2 ]; /* offset */ + args[ 3 ].mode=NOARGUMENT; + emit(); + break ; + + case 166 : + curr1->opcode= 63 ; /* #lfpmove */ + args[ 1 ].mode=REMOTE; + args[ 1 ].off2=args[ 1 ].off1; + args[ 1 ].off1=ipmem[ curr1->arg[ 3 ]-2 ]; /* offset */ + args[ 3 ].mode=NOARGUMENT; + emit(); + break ; + + case 174 : /* lastwill */ + /* printf("fre = %d , base = %d\n", fre, base) ;*/ + prototype[ unitt ]->lastwill = fre + base; + t1=locspace(APVIRT); + t2=locspace(APINT); + curr1->opcode=2; /* lbackaddr */ + force(1, TEMPLOCAL, t1, (address)0); + force(2, TEMPLOCAL, t2, (address)0); + emit(); + locrelease(t2, APINT); + curr1->opcode=146; /* lgkill */ + force(1, TEMPLOCAL, t1, (address)0); + force(2, NOARGUMENT, (address)0, (address)0); + emit(); + locrelease(t1, APVIRT); + break ; + + case 175 : + curr1->opcode= 182 ; /* #ljump */ + force(1,CONSTANT, + prototype[ ipmem[ curr1->arg[ 1 ]-1 ] ]->lastwill,(address)0); + emit(); + break ; + + case 178 : /* inner */ + emit(); + +#if SMALL || HUGE + ipmem[ ipunit ] = fre + base; /* ADDRESS OF AFTER INNER STATEMENT */ +#elif LARGE + trick.t.b32 = fre+base; + ipmem[ ipunit ] = trick.f.r16; + ipmem[ ipunit+1 ] = trick.f.l16; +#endif + + mapdscr[ unitt ] = (tmpmapdscr *) new(mapdscr[ unitt ]); +/* mapdscr[ unitt ]->map = ltmpmap ; */ + for(l = 0; l <= MAXLOCTEMP; l++) + mapdscr[unitt]->map[l] = ltmpmap[l] ; + break ; + + case 181 : deflabel(curr1->arg[ 1 ]); + break ; + + case 183 : /* JUMP AFTER INNER */ + curr1->opcode= 182 ; /* #LJUMP */ + +#if SMALL || HUGE + args[ 1 ].off1 = ipmem[ curr1->arg[ 1 ] ]; +#elif LARGE + trick.f.r16 = ipmem[ curr1->arg[1] ]; + trick.f.l16 = ipmem[ curr1->arg[1]+1 ]; + args[ 1 ].off1 = trick.t.b32; +#endif + + emit(); + break ; + + case 184 : begunit(curr1->arg[ 1 ]); + break ; + + case 185 : endunit() ; + break ; + + case 186 : /* BLOCK */ + /* EXTRA : 186,174,176 */ + args[ 1 ].off1=ipmem[ curr1->arg[ 1 ]-1 ]; + emit(); /* open object for block */ + curr1->opcode=174; + args[ 1 ].mode=NOARGUMENT; + emit(); /* TRANSMIT CONTROL */ + curr1->opcode=176; + emit(); /* KILL BLOCK OBJECT */ + break ; + + case 189 : /* CASE */ + curr1->opcode=195; + args[ 3 ].mode=NOARGUMENT; + emit(); + fre -- ; + uselabel(curr1->arg[ 2 ]); /* ADDRESS OF 'CASE' DESCRIPTION */ + fre ++ ; + break ; + + case 190 : esac() ; + break ; + + case 223 : /* #LENABLE */ + case 224 : /* #LDISABLE */ + case 225 : /* #LACCEPT1 */ + case 227 : /* #LBACKRPC */ + + forceconst(1); + emit(); + if (fre+ curr1->arg[ 1 ] >= firstlabel) + generror(MEMOVF); + for (i=1; i <= curr1->arg[ 1 ]; i++) + m[ fre + i - 1 ] = proclist[ i ]; + fre += curr1->arg[ 1 ]; + break ; + +/*CBC... */ +/* 2 ,*/ /* #LBACKADDR */ +/*...CBC*/ + case 31 : /* #LSIGN */ + case 4 : /* #LOPEN */ + case 5 : /* #LSLOPEN */ + case 33 : /* #LLOWER */ + case 34 : + case 35 : /* #LUPPER */ + case 36 : + case 41 : /* #LCOPY */ + case 42 : /* #LNOT */ + case 43 : /* #LRCVAVIRT */ + case 44 : /* #LVIRTDOT */ + case 45 : + case 46 : /* #LADDRPH */ + case 47 : /* #LADDRPH2 */ + case 48 : /* #LIABS */ + case 49 : /* #LINEG */ + case 50 : /* #LRABS */ + case 51 : /* #LRNEG */ + case 52 : /* #LPARAMADDR */ + case 58 : /* #LIFIX */ + case 59 : /* #LFLOAT */ + case 40 : /* #LGETTYPE */ + case 87 : /* #LMDFTYPE */ + case 82 : /* # LEQNONE */ + case 83 : /* #LNENONE */ + case 100 : /* #LOR */ + case 101 : /* #LAND */ + case 131 : /* #LXOR */ + case 116 : /* #LSHIFT */ + case 102 : /* #LARRAY */ + case 103 : + case 104 : + case 105 : /* #LFARRAY */ + case 112 : /* #LCOMBINE */ + case 106 : /* #LIEQUAL */ + case 107 : /* #LINEQUAL */ + case 108 : /* #LILT */ + case 109 : /* #LILE */ + case 110 : /* #LIGT */ + case 111 : /* #LIGE */ + case 113 : /* #LIADD */ + case 114 : /* #LISUB */ + case 115 : /* #LIMULT */ + case 117 : /* #LIDIVE */ + case 118 : /* #LIMODE */ + case 119 : /* #LRADD */ + case 120 : /* #LRSUB */ + case 121 : /* #LRMULT */ + case 122 : /* #LRDIVE */ + case 125 : /* #LREQ */ + case 126 : /* #LRNE */ + case 127 : /* #LRLT */ + case 128 : /* #LRLE */ + case 129 : /* #LRGT */ + case 130 : /* #LRGE */ + case 123 : /* #LEQREF */ + case 124 : /* #LNEREF */ + case 132 : /* #LCALLPROCSTAND */ + case 143 : /* #LKILL */ + case 144 : /* #LHEADS */ + case 146 : /* #LGKILL */ + case 159 : /* #LGO */ + case 160 : /* #LGOLOCAL */ + case 170 : /* #LDTYPE */ + case 172 : /* #LTERMINATE */ + case 173 : /* #LWIND */ + case 177 : /* #LTRACE */ + case 180 : /* #LBACKHD */ + case 191 : /* #LBACKBL */ + case 193 : /* #LBACK */ + case 194 : /* #LFIN */ + case 192 : /* #LBACKPR */ + case 220 : /* #LRESUME */ /*CBC*/ + case 221 : /* #LSTOP */ /*CBC*/ + case 222 : /* #LKILLTEMP */ /*CBC*/ + case 226 : /* #LACCEPT2 */ /*CBC*/ + case 228 : /* #LASKPROT */ /*CBC*/ + case 240 : /* #LSTEP */ /*CDSW&BC*/ + case 188 : /* #LATTACH */ + case 187 : /* #LDETACH */ + emit(); /* NO EXTRA TREATMENT */ + break ; + + } /* switch opcode */ + } /* for */ + } /* GEN */ + diff --git a/sources/gen/gen.o b/sources/gen/gen.o new file mode 100644 index 0000000000000000000000000000000000000000..f0dd955804a50039e4743b482bbc0198634ba4f6 GIT binary patch literal 10437 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 prototype */ + + /* only for processes : */ + protaddr maskbase ; /* lowest procedure prototype number */ + int masksize ; /* size of RPC mask for that process */ + + /* for procedures and functions */ + int virtnumber; /* virtual number or -1 if not virtual */ + + /* for all : */ + protkind kind ; /* kind of unit */ + + /* only for procedures, functions and processes : */ + word pfdescr; /* address of table with parameters descr. addresses */ + + /* only for functions : */ + int nrarray; + word finaltype; /* type of result */ + +} protdescr,*pointprdsc; + + diff --git a/sources/gen/genio.c b/sources/gen/genio.c new file mode 100644 index 0000000..8e02289 --- /dev/null +++ b/sources/gen/genio.c @@ -0,0 +1,304 @@ +/* Loglan82 Compiler&Interpreter + Copyright (C) 1993 Institute of Informatics, University of Warsaw + Copyright (C) 1993, 1994 LITA, Pau + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + +======================================================================= +*/ + +#include "glodefs.h" + +#ifndef NO_PROTOTYPES + +static void fputaddr(FILE *,address); +static int fgetint(FILE *); + +#else + +static void fputaddr(); +static int fgetint(); + +#endif + +int wordswritten = 0 ; + +void setfiles(name) char *name;{ + char work[80]; + + strcpy(work, name) ; + strcat(work, ".lcd") ; + lfile = fopen(work, "rb"); + if(lfile == NULL) + { puts(strcat("Couldn't open file ", work)) ; + exit(8) ; + } + strcpy(work, name) ; + strcat(work, ".pcd") ; + pfile = fopen(work, "wb") ; + + strcpy(work, name) ; + strcat(work, ".ccd") ; + cfile = fopen(work, "wb") ; + if(cfile == NULL) + { + printf("Couldn't open file %s for writing\n", work); + exit(8) ; + } +} /* setfiles */ + + + +int next(){ + int i; + + if(!fread((char *)&i,sizeof(i),1,lfile)){ + printf("Unexpected EOF ! Aborting...\n"); + exit(8); + } + return i; +} /* next */ + +static int fgetint(f) FILE * f;{ + int c ; + fread((char *)&c, sizeof(int), 1, f) ; + return c ; +} + +static void fputaddr(f,v) FILE *f; address v;{ + fwrite((char *)&v, sizeof(address), 1, f); +} + + /* Buffered version - not finished + static address buf[BUFSIZE] ; + static address * bufp = buf; + static int n = 0; + + if(n==BUFSIZE) */ + +void putstrings() +{ + int cc, i, ch2 ; + int c1, c2, start, nr=1 ; + + cc = fgetint(lfile); /* character count */ + + while (cc != ENDOFSTRINGS) + { + m[ fre ] = cc; + fre ++ ; + start=fre; + + for (i = 1; i <= (cc / CHARSINAD + 1) ; i++ ) + /* extra 0 byte after string */ + { + +#if SMALL || HUGE + ch2 = fgetint(lfile) ; + m[ fre ] = ch2; +#elif LARGE + c1 = fgetint(lfile) ; + c2 = fgetint(lfile) ; + m[ fre ] = ( (long)c1 ) | ( ((long)c2) << 16 ) ; +#endif + + fre++ ; + } + +#if (TALK >= 2) + if(fre!=start+1) + printf("string %d = %s\n", nr++, (char *)(&m[start])); +#endif + + cc = fgetint(lfile) ; + } + } /* putstrings */ + + +void initiate() + /* read ipmem and some variables from the blank common of the compiler */ +{ + int tarr[302]; +#ifdef DUMP + int k; +#endif + fread((char *)tarr, sizeof(int), 302, lfile) ; + + + lmem = tarr[278] ; + lpmem = tarr[279] ; + irecn = tarr[280] ; + nrint = tarr[285] ; + nrre = tarr[286] ; + nrbool = tarr[287] ; + nrchr = tarr[288] ; + nrcor = tarr[289] ; + nrproc = tarr[290] ; + nrtext = tarr[291] ; + nblus = tarr[296] ; + addrnone = tarr[299] ; /*cdsw&ail */ + +#if (TALK >= 2) + printf("Initiate\n lmem = %d, lpmem = %d, irecn = %d\n", + lmem, lpmem, irecn); + printf(" nrint = %d\n", nrint); + printf(" nrre = %d\n", nrre ); + printf(" nrbool= %d\n", nrbool); + printf(" nrchr = %d\n", nrchr); + printf(" nrcor = %d\n", nrcor); + printf(" nrproc= %d\n", nrproc); + printf(" nrtext= %d\n", nrtext); + printf(" nblus = %d\n", nblus); + printf(" addrnone = %d\n", addrnone); +#endif + + ipmem = (int *) calloc(lmem + 1, sizeof(int)); + fread( (char *)(ipmem + 1), sizeof(int), irecn, lfile); + +#ifdef DUMP + for (k = 1; k <= irecn; k++) + { + printf("%8d",ipmem[k]); + if (k % 16 == 0) printf("\n"); + } + exit(0); +#endif + + } + + +void putreals() + /* WRITE REAL CONSTANTS TO MEMORY */ +{ + int i ; + union + { + float r ; + struct { int int1, int2 ; } p; + } trick1 ; + + union + { + real r ; + struct { address int1, int2 ; } p; + } trick2 ; + + i = lpmem + 1 ; + while (i <= irecn) + { +#ifdef HUGE +#if (TALK >=2 ) + printf("real %10d:%18f\n",i,*(float *)&(ipmem[i])); +#endif + m[ fre++ ] = ipmem[ i++ ] ; +#else + trick1.p.int1 = ipmem[ i++ ] ; + trick1.p.int2 = ipmem[ i++ ] ; + trick2.r = trick1.r; +#if (TALK >=2 ) + printf("real %10d:%18f\n",i,trick1.r); +#endif + m[ fre++ ] = trick2.p.int1; + m[ fre++ ] = trick2.p.int2; +#endif + } +}/* putreals */ + + + + +void generror(err) +errtype err; +{ + switch (err) + { + case TMPROT : printf(" TOO MANY PROTOTYPES"); + break ; + + case TLDESCR : printf(" DESCRIPTIONS TOO LONG"); + break ; + + case MEMOVF : printf(" MEMORY OVERFLOW "); + break ; + + case TMTEMP : printf(" TOO MANY TEMPORARY VARIABLES NEEDED"); + break ; + + case STSEQTL : printf(" STATEMENT SEQUENCE TOO LONG"); + break ; + + case NOTIMPL : printf(" FUNCTION NOT IMPLEMENTED"); + break ; + + case OBJTOLG : printf(" OBJECT TOO LONG"); + break ; + + case PROCLTL : printf(" PROCEDURE LIST TOO LONG ") ; + break ; + } /* switch */ + + exit(4); + + } /* generror */ + + + + +void out(){ + /* PUT THE CONTENTS OF M^[ 0 .. fre-1 ] ON THE FILE "CFILE" */ + /* 'BASE$ IS UPDATED AND 'fre' IS RESET TO ZERO */ + + address n,w; + +#if (TALK > 2) + printf("Writing %4d words of code\n", fre) ; +#endif + + for (n=0; n <= fre-1; n++ ){ + w = m[ n ]; + fputaddr(cfile, w); + wordswritten ++ ; + } + + base += fre; +#if (TALK > 3) + printf("base = %d\n", base) ; + printf("fre = %d\n", fre) ; +#endif + fre = 0; +} + + +void outprot() +{ + protaddr n ; + address lp ; + + for (n = MAINBLOCK; n <= lastprot; n++) + fwrite( (char *)(prototype[ n ]), sizeof(*(prototype[0])), 1, pfile); + + fputaddr(cfile,ipradr); + fputaddr(cfile,temporary); + fputaddr(cfile,strings); + lp = lastprot; + fputaddr(cfile, lp); + fputaddr(cfile,base); +} + + +int apet(ip) /* STRONGLY MACHINE DEPENDENT */ +int ip ; +{ + return ( iand( ishft( ipmem [ ip ],-14 ), 3 ) + 1 ); +} + + diff --git a/sources/gen/genio.o b/sources/gen/genio.o new file mode 100644 index 0000000000000000000000000000000000000000..67af1db0f5bd2d0840a686fe69530f507775394a GIT binary patch literal 3869 zcmZvfe{5UT6~~{`$KtjLG@@f;<;N?fbY)w{_%)TOs3EyogA)7UIAs~#JjZ^q9l6i$ zi`^faim1FY858MM)5i7(5*=fMKR{H|ph%ULwun%zf0PMrgFmKG%JwQ}8d8fCiZ}0j z?mf0|raa}n&-tEv?mg$;ci)R&cgQe)+-(@9p^kgI6i=*D?9ZpthBsvl7RvdwyQO3m zijHed=kkta^cT^#f6C}jfhz=Tp0%b6p0(f0m2z%ojp5^%sD4ygv}+=4&xu#<;Mr!g zS$Q*@rDW3aG&`VyXVy)-c@vBejUK z~@ zll9xobIkM1cbNh6isX#iAUo_}yG$6CUR9C0aztg`w1XQ}QEDdgey!g%Ub~N0d$?L| z;1OzUlWTvdtG+{aU*Z1zajxfC>QTE{UVGNka*Bq!Y4ww>p<8jr>&Z82_GLt=a|He$y|qLFbKF&d40+pxyOSTr_iMR$qV@M!c=%jooui!nPI z8$j!>f!N5vL!)BciU=_zh74;wK7eKsiCg31kqHqQ6xx`>6Olp6V@0BIYh=tGm66mf z`q0B-Fs_B7!a*@K5fj$v$ats0!j`4=Iu!1{?k8tx@*><>8sEmEH7~Shu8bm_PvG=% zK8N#Fobx!(?HP1@Z?q6CuV)GpLI#^W1aM~M@Ubze#Fl{LwXnM0Y7_^^f2ph z_}TYJ-_LrZpS?`_4%U5s)~q3T^>e^(a6{(@-GeU`gn=Qh!Jyt^)B z2W*zk5~!!w?5c{Tnpm>c)(g(!QNTODc@6#F!5*ojFwsN2dz8Kil~` zTeG`NbU=P}(Amx7sqOWDW8kgeOP~cF2RDNB`-;Z@19%(qEr6S#&w*6$ zpFqm@KKnlesjjOa)f2`dQF|Xq^S3~n*WKVIaDe^a!p(tc+RQlfJIvk8A28F*EHlsC z%iIUjeL2kfN!CYM|D5$P*1utWob_w0PqBWB^*gNp%=!b?|6qL?q>)cfzK5 zeT$sl#$q9@Y1vNZB=qyBQfig=%Z{FR>?~h4=N^0Mq--2*o;J;nvF!U zTtbXg74fG>~!dAwn7*lj*bvi*oWvCG^Q)JVYCbJw_tu z;!`h4t@%9;biOE&^PCh)a47?UqFryQP{lCy}0iSZ!w$yv5Y7fJ_?sz! Pq^A~5%_v!PO2+>HRBQwq literal 0 HcmV?d00001 diff --git a/sources/gen/genprot.c b/sources/gen/genprot.c new file mode 100644 index 0000000..46be602 --- /dev/null +++ b/sources/gen/genprot.c @@ -0,0 +1,521 @@ +/* Loglan82 Compiler&Interpreter + Copyright (C) 1993 Institute of Informatics, University of Warsaw + Copyright (C) 1993, 1994 LITA, Pau + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + +======================================================================= +*/ + +#include "glodefs.h" + + +#ifndef NO_PROTOTYPES + +static bool vtype(address,int); +static void addressing(void); +static void param(int,int); +static void p2(int,int,address); +static void par2(address,int); +static void putaddr(int,int); +static void parproc(int); +static void parfunc(int); +static void partype(int); +static void signoffst(int); +static void offsets(void); +static void rpcmask(void); + +#else + +static bool vtype(); +static void addressing(); +static void param(); +static void p2(); +static void par2(); +static void putaddr(); +static void parproc(); +static void parfunc(); +static void partype(); +static void signoffst(); +static void offsets(); +static void rpcmask(); + +#endif + + + +static bool vtype(i,ip) address i; int ip;{ + +/* PUTS THE TYPE OF ITEM DESCRIBED AT ADDRESS IP IN IPMEM TO THE CELLS + m[ I ],m[ I+1 ] / NUMBER OF ARRAYOF,FINAL TYPE/ . + ASSIGNES TRUE TO REF IF THE TYPE IS A REFERENCE TYPE AND FALSE OTHERWISE. + IF THERE IS NO DESCRIPTION FOR THE TYPE YET,"I" IS ADDED TO THE LIST + OF UNSATISFIED REFERENCES */ + + int ft ; /* final type */ + address fft ; + int n ; + bool ref; + fft = 0 ; + m[ i ] = ipmem[ ip - 4 ] ; +LOG(i); + ft = ipmem[ ip-3 ] ; + ref = FALSE ; + + /* PRIMITIVE TYPE ? */ + if (ft==nrint) /* integer */ + fft = ipradr + TINT ; + else + if (ft==nrre) /* real */ + fft = ipradr + TREAL ; + else + if (ft==nrbool) /* boolean */ + fft = ipradr + TBOOLEAN ; + else + if (ft==nrchr) /* char */ + fft = ipradr + TCHAR ; + else + if (ft == nrtext) /* string */ + fft = ipradr + TSTRING ; + else /* REFERENCE TYPE */ + ref = TRUE; + + + if (ref || (ipmem[ip-4] > 0) ) + { + ref = TRUE ; + + if (ft==nrcor) + fft=ipradr + TCOROUT ; + else + if (ft==nrproc) + fft = ipradr + TPROCESS ; + else + if( (ipmem[ft] % 16) == 11 ) /*file*/ + fft = ipradr + TFILE ; + else + if (fft == 0) + { /* CLASS OR FORMAL TYPE */ + if (ipmem[ ft+2 ] < 0) + fft = -ipmem[ ft+2 ] ; + else /* UNKNOWN YET, ADD TO LIST OF UNSATISFIED REFERENCES */ + { + n = -ipmem[ft-2] ; + ipmem[ft-2] = -(i+1) ; + fft = -n; + } /* else */ + } /* CLASS OR FORMAL TYPE */ + } /* REFERENCE TYPE */ + + m[ i + 1 ] = fft ; +LOG(i + 1); + return(ref) ; +} /* VTYPE */ + + + + + +static void param(ia, parkind) int ia,parkind;{ + /* PREPARES A DESCRIPTION OF INPUT, OUTPUT OR INOUT PARAMETER */ + bool aux ; /* auxilliary */ + pointprdsc curr ; + + /* IA = PARAMETER ADDRESS IN IPMEM */ + /* WITH PROTOTYPE[ LASTPROT ] ^ DO */ + { curr = prototype[ lastprot ] ; + reserve(3); + m[ fre ]=parkind; +LOG(fre); + + aux = vtype(fre+1,ia); + + if (aux) + { /* REFERENCE TYPE */ + addtolist(&(listofref[ lastprot ]), ia); + curr->lthreflist++ ; + } + + longaddtolist(&(listofpar[ lastprot ]), fre + base) ; + curr->lthparlist++ ; + fre += 3 ; + } +} + +static void p2(pk,pda,ndscr) int pk,pda; address ndscr;{ + + /* CREATES DESCRIPTION OF PAR. INPUT,OUTPUT OR INOUT + OF FORMAL PROCEDURE OR FUNCTION */ + + reserve(3) ; + m [ ndscr ] = fre + base ; +LOG(ndscr); + m [ fre ] = pk ; +LOG(fre); + + vtype(fre + 1, pda) ; + fre += 3 ; /* mb */ +} + + + +static void par2(am,ip) address am; int ip;{ + + /* MAKES DESCRIPTIONS FOR FORMAL PARAMETERS OF void OR FUNCTION + BEING A PARAMETER ITSELF . + AM = ADDRESS OF THIS UNIT DESCRIPTION IN M, + IP = ADDRESS IN IPMEM */ + + int pda; + address n,ndscr ; + pointprdsc curr ; + +/* WITH PROTOTYPE[ LASTPROT ] ^ DO */ + { curr = prototype[lastprot] ; + + longaddtolist(&listofpar[ lastprot ],am+base); + curr->lthparlist++ ; + addtolist(&listofref[ lastprot ],ip) ; + curr->lthreflist++ ; + } /* with */ ; + + m [ am + 2 ]=ipmem[ ip + 4 ]; +LOG(am + 2); + /* number of parameters including 'result' */ + m [ am + 1 ] = fre + base ; +LOG(am + 1); + + if( m [ am+2 ] != 0) + { /* NOT EMPTY PARAMETERS LIST */ + reserve(m [ am+2 ]) ; + fre += m [ am+2 ] ; + + for (n=0; n<=m[ am+2 ]-1; n++) + { + pda = ipmem[ ipmem[ ip+3 ] + n ] ; + /* PARAMETER ADDRESS IN IPMEM */ + ndscr = m [ am+1 ] - base + n ; + + switch(itemkind(pda)) + { + case IFMPROC : m [ ndscr ] = ipradr + TPROC2; + LOG(ndscr); + break; + + case IFMFUNC : m [ ndscr ] = ipradr + TFUNC2; + LOG(ndscr); + break; + + case IFMTYPE : reserve(2); + m [ ndscr ] = fre +base ; + LOG(ndscr); + m [ fre ] = FORMTYPE; + LOG(fre); + m [ fre + 1 ] = -1; + LOG(fre + 1); + backpatch(pda,fre); + fre += 2; + break; + case IPARIN : p2(PARIN, pda,ndscr) ; + break ; + case IVAR : ; + /* BECAUSE OF THE BUG IN COMPILER : 'RESULT' NOT DESCRIBED */ + /* CORRECTLY, SHOULD BE TREATED AS OUTPUT PARAMETER */ + + case IPAROUT : p2(PAROUT, pda, ndscr); + break; + + case IPARINOUT : p2(PARINOUT, pda, ndscr); + break; + } /* switch */ + } /* for */ + } /* NOT EMPTY PARAMETER LIST */; +} /* PAR2 */; + + + +static void parproc(ia) int ia;{ /* FORMAL PROCEDURE DESCRIPTION */ + reserve(3); + m [ fre ] = FORMPROC ; +LOG(fre); + fre += 3 ; + par2(fre-3, ia) ; +} + + +static void parfunc(ia) int ia;{ /* FORMAL FUNCTION DESCRIPTION */ + address n; + reserve(5); + m [ fre ] = FORMFUNC; +LOG(fre); + fre += 5; + n = fre; + par2(n-5,ia); + vtype(n-2,ia); +} + + +static void partype(ia) int ia;{ /* FORMAL TYPE PARAMETER */ + reserve(3); + + m [ fre ] = FORMTYPE ; +LOG(fre); + m [ fre + 1 ] = lastprot ; /* sl */ +LOG(fre + 1); + m [ fre + 2 ] = offset ; +LOG(fre + 2); + backpatch(ia,fre + base) ; + + /* WITH PROTOTYPE[ LASTPROT ] ^ DO */ + longaddtolist(&listofpar[ lastprot ],fre + base) ; + prototype[lastprot]->lthparlist++ ; + + fre += 3 ; +} + + +static void putaddr(ap,a) int ap,a;{ + + /* PUT PROTOTYPE AND OFFSET INTO ATTRIBUTE DESCRIPTION AT "A" IN IPMEM */ + + ipmem[ a - 2 ] = offset ; + ipmem[ a - 1 ] = lastprot ; + + if(ap == APVIRT) offset += APREF ; + else offset += ap ; +} + + +static void offsets(){ + + /* COMPUTE OFFSETS FOR ALL ATTRIBUTES, */ + /* COMPUTE OFFSETS FOR ALL ATTRIBUTES, */ + /* LINK PARAMETERS, */ + /* LINK REFERENCE ATTRIBUTES */ + + int p, n, a ; + pointprdsc curr ; + { + curr = prototype[lastprot] ; + offset = curr->appetite; /* total length of attributes from prefix,if any */ + + /* GO THRU THE LIST OF ATTRIBUTES */ + for (p = ipmem[ curr->codeaddr + 6 ] ; /* first element */ + p != 0 ; + p = ipmem[ p+1 ] /* next element */){ + + /* LIST ELEMENT : POINTER TO ATTRIBUTE DESCRIPTION, */ + /* POINTER TO THE NEXT ELEMENT */ + + a = ipmem[ p ] ; /* attribute address in ipmem */ + switch (itemkind(a)){ + + case IFMPROC : parproc(a) ; + putaddr(APFMPROC, a) ; + break ; + + case IFMFUNC : parfunc(a) ; + putaddr(APFMPROC, a) ; + break ; + + case IFMTYPE : partype(a) ; + putaddr(APFMTYPE, a) ; + break ; + + case IPARIN : param(a, PARIN) ; + putaddr(apet(a), a) ; + break ; + + case IPAROUT : param(a, PAROUT) ; + putaddr(apet(a), a) ; + break ; + + case IPARINOUT : param(a, PARINOUT) ; + putaddr(apet(a), a) ; + break ; + + case IVAR : n = apet(a) ; + if (n == APVIRT) + { + addtolist(&listofref[ lastprot ], a) ; + curr->lthreflist++ ; + n = APREF ; + } + + putaddr(n, a) ; + break ; + default : break ; + /* IBLOCK, IPREFBLOCK, IHANDLER, ISIGNAL : IMPOSSIBLE */ + + /* ICLASS,IRECORD,ICOROUT,IPROCESS,IFUNC,IPROC,ICONST: NOP */ + + } /* switch */ + + } /* for */ + + curr->appetite = offset ; + } /* WITH */ + +} /* OFFSETS */ + + + + +static void signoffst(s) int s;{ + + /* COMPUTES THE OFFSETS OF PARAMETERS OF */ + /* THE SIGNAL DESCRIBED IN IPMEM AT S */ + + int offset ; + int p ; + int param ; /* POINTER TO PARAMETER DESCRIPTION */ + int ap ; + + offset = APINT + APINT; + + /* GO THRU THE LIST OF ATTRIBUTES */ + for( p = ipmem[ s+6 ] ; /* first element */ + (p != 0) ; + p = ipmem[ p+1 ] /* next element */) + + { + /* LIST ELEMENT : POINTER TO ATTRIBUTE DESCRIPTION */ + /* POINTER TO THE NEXT ELEMENT */ + param = ipmem[ p ] ; /* attribute address in ipmem */ + + switch(itemkind(param)) + { + case IFMPROC : ; + case IFMFUNC : ap = APFMPROC ; + break ; + + case IFMTYPE : ap = APFMTYPE ; + break ; + default : + /* IPARIN,IPAROUT,IPARINOUT */ + ap = apet(param) ; + if (ap == APVIRT) + ap = APREF ; + break ; + } /* switch */ + + ipmem[ param-2 ] = offset ; + offset += ap ; + } /* for */ +} /* SIGNOFFST */ + + +static void addressing() + + /* FOR EACH UNIT ( IN TOPOLOGICAL ORDER ) : */ + /* - NEW PROTOTYPE IS CREATED, */ + /* ( FOR CLASS ALSO CLASS TYPE DESCRIPTION ) */ + /* - UNIT'S ATTRIBUTES ARE ASSIGNED OFFSETS */ + /* - REFERENCE VARIABLES ( INCLUDING FORMAL PROCEDURES ) ARE LINKED */ + /* INTO LIST */ + /* - PARAMETERS ARE LINKED INTO LIST */ + /* ( THEIR DESCRIPTIONS ARE ALSO PRODUCED ) */ + +{ + int pip ; /* PROTOTYPE IN IPMEM */ + protaddr nextunit ; + protkind pkind[ IFMFUNC + 1 ] ; /* AUXILIARY, READ-ONLY */ + logitem it ; + + pointprdsc curr; /* for translation of Pascal's WITH */ + + for (it = ICLASS; it <= IFMFUNC ; it++) + pkind[ it ] = it; + + /* START FROM THE MAIN BLOCK */ + nextunit = MAINBLOCK ; + pip = nblus; /* main block in ipmem */ + + do /* GET UNIT FROM THE LIST OF ALL UNITS */ + { + it = itemkind(pip); + if ( (it == ICLASS) || (it == IRECORD) || (it == ICOROUT) + || (it == IPROCESS) || (it == IBLOCK) || (it == IPREFBLOCK) + || (it == IFUNC) || (it == IPROC) || (it == IHANDLER) ) + { /* REAL UNIT */ + + if (nextunit > MAXPROT) + generror(TMPROT) ; + /* mb removed case which did the same in every case */ + /* in doubts cf. Pascal version */ + prototype[ nextunit ] = (pointprdsc) new(prototype[ nextunit ]) ; + + /* WITH PROTOTYPE[ NEXTUNIT ] ^ DO */ + { curr = prototype[nextunit] ; + curr->codeaddr = pip ; /* pointer to the description in ipmem */ + curr->kind = pkind[ it ] ; + } + + nextunit++ ; + } /* OF REAL UNIT */ + else + if (it == ISIGNAL) + signoffst(pip) ; + + pip = ipmem[ pip+2 ] ; /* move on to the next unit */ + } + while (pip != 0) ; /* END OF LIST. */ + + lastprot = MAINBLOCK ; + + do + { + pdescr() ; /* make prototype's description */ + offsets(); /* compute offsets for all attributes */ + lastprot++ ; + } + while (lastprot != nextunit) ; + + lastprot = nextunit-1; +} /* ADDRESSING */ + + +static void rpcmask(){ + pointprdsc *prot ; + + for (prot = prototype; prot <= &prototype[lastprot]; prot++) + { + if ((*prot)->kind == PROCESS) + { + (*prot)->maskbase = MAINBLOCK ; + (*prot)->masksize = (lastprot + 7) / 8 ; + } + } +} + + + + void genprot(){ + + /* PROTOTYPES CREATING */ + + out() ; + primdescr() ; /* primitive types descriptions */ + addressing() ; /* offsets, prototypes without lists */ + lists() ; /* preflist, parlist, virtlist, descrlist */ + handlers() ; /* handlers lists */ + +/*CBC Force unit kind of main to be PROCESS (instead of BLOCK) ...*/ + prototype[ MAINBLOCK ]->kind = PROCESS ; + +/*CBC Added computing of base and size of RPC mask */ + rpcmask() ; +/*...CBC*/ + +} /* GENPROT */ + + diff --git a/sources/gen/genprot.o b/sources/gen/genprot.o new file mode 100644 index 0000000000000000000000000000000000000000..254d592a18570861604391551085d1fb46e4dfad GIT binary patch literal 6274 zcmai2eQ*=k5kE_3Ti6Gd8wekPe3THr5=to{Kq+-Sxs(*#h&m1(7*}It+1S{!BIyVX zHHBV1>CII{bS7jvnJ}a+oph$jkT#vPe^nT2JAqOYk|}A1hGfdjxpHUJ;(~$=?r-0% zPG?7^H`4uf-|pMD``*5NPbx2wq>&kt^DOb$Yz0el_J$P(U5ERT2I~_AJO!NhWv?gFJ7Ro*&jU3dw z$E3t!N9y!VrpWlWtkE$t?1N9^H8X_)ugF!~*k{zwy42_ELeuMVKL!8m;qGyvCY!3? zvB1uX4P2j$_+#<9YP_WrFGcAN>zBHY_XQI?M)J6vQY_Ya?{vcCR=;uHtTy~bd(~1BxF=#>aWy-6tA6+l ziq@1GrYB&n5sqTI3)QQTacDE=m5AYrRJnr17L$ ziLI-S759Qd_AD0(V>aeWP8p4~mjc$l8zQk`srI^_E310$*%AaR_Z)-j_~ld@kj3}j zGD$jt?;yTeMsmgnjn@_{w-itDEsDL#ZWNc}uw=R3 z?US|H`Fxw5UwIqNI$w#XXgrZ(z5Jr5yWD2YfX}dxZxys`3?}*X8ngpV2Id%prr&4~ z2a@I+x>_Q3n)^I0oc}6n!$`miUYk@K_M;POLmDfD+Ca}`TC57x2YhSrjpBO@-$8sy zF6?~WK0Jv=^1gjbtisUO$O9pNW`g`zEWgi@_q*gC%V2p4$=fT11)QGtDN4H&o*)0O z?Rh$2ZD;j&;bn^YJxmq% zj{)P!p0nfXK;|;^#P1k;t*J=jh@De#e*gxg#Cp6-607m{Bv#<r+DoiA1&u4G*^o2%_mi4)O2lbX zJ#99O83Ei;Kn$2$UN~!Ps=;ZKxhHR0AjYfKut(tb$N611#l2qq#G>o1R*{*LH!@V= zp3PLMU)(ro>a1$GXl=krF)rG~6ydg`DVcfs-pKEZ1)3<_RW=*qMqxIlCoc}ii2F3A4c)zlAjV|q+cX!Voj#yj@!pK{~E$x*NI z?X|i(CTD)m{!H)!<6CS0jljM{uXC6(YbjCp<0YKwuc@H~x9Sl$_oQ&prhE}71D{}Q z17d2FC=gdHr3Z+ESD~9N@yCHU+m+Xt{}T}9SNSvZSAZzH%D#xWd0D4^xk0pZ_MWy@5PQJc@5)kAo>3y5I^meqrfWQt3babO+Nvw2LDGO>78SK z7)bh~z|R3oAiM+mRY2081)K@I3rKp)fH>2XmB2fp_f;V2Z3EIc9YB1P7`N{QQvU>uXzh*qa_$K4;8P5U9|M!5D7q^&~!4SU?FYr;{&U1`!F}}|@3?zR>fnwjHm{9%)faH$`B>#^xe~$4Iko;SO zVng-=K+;bzUIg9`{vSZn+b~^{76CT_9{_FxQv6MfzX4MJPk`i42Dlh{*O(t=d;mg{ zZ^n!I2bd2se~9_hz-8$FHgGxc0`NiLMc_lgOF-(6F=<@!AZ~|-uMUlV63V4`zTl$Q zxahCAXw^k;cG2}Ndb^9>>7v_Q^wXfpw-jpXURV1MTy)Y!A92z2|6ShaU%KcwT=ZKm zy4OXY2TkJ!u+iRUIt}_mm(CRzon@Vs*rT5^eE_rv4v?KJ=t|Ief9~M+H1^1RrdJ|g z7rAuk|4{0C0C~2C>0`*HT9?k_F1p@D?{Lu}&}63u>)ipm6m%N2=F*{mMeq?%kBk1X zi#`InH56JE40Uxz+d9I{E2LmB*c#EChG0kv?n!(%8kT~cQm`%B83sgRZIJ|Vv8Lu2 zu`!4vv7KFA9fYA>qA?NP3nj2!f{n(yU@O`bYl4N2rg#Dkkkh-%9v~KuhhuwSs)g)z zw8ax$pjxD0Q*(2oi+CxxvnlS#U<+zpkye*Hx=M_JcUvOdxw|dWOnpMTqfLp>E+KOK zXwf3JL-y!hEiLgdIiw|E50>qQIEIf>d%UeRLQNn^9*)P`BCUvTXNLxz)^H>oi&3PZ srj8B~X>&Lp0w0TpI-BCVg^C?=mqx?H+B#W-B7=!tO_An~a4atU54$7|g8%>k literal 0 HcmV?d00001 diff --git a/sources/gen/glodefs.h b/sources/gen/glodefs.h new file mode 100644 index 0000000..9d76ea6 --- /dev/null +++ b/sources/gen/glodefs.h @@ -0,0 +1,360 @@ +/* Loglan82 Compiler&Interpreter + Copyright (C) 1993 Institute of Informatics, University of Warsaw + Copyright (C) 1993, 1994 LITA, Pau + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + +======================================================================= +*/ + +#include +#include + +#ifndef NO_PROTOTYPES +#include +#endif + + +/*#define DEBUG 0 Defined for debugging time, undefine when ready */ +/*#define LOG(i) fprintf(log,"%s #%d : m[%d]=%d\n",__FILE__,__LINE__,i+base,m[i])*/ +#define LOG(i) + +#define MAXINT 32767 + +#define new(s) calloc(1, sizeof(*s)) + /*cmb It is calloc here, because we want untouched fields to be 0 */ + /* rather than a random value cmb */ + +#if SMALL +#define MEMLIMIT 32000 /* small memory for main */ +typedef float real; +typedef int address; /* APOPCODE == 2 - appetite of extended opcode */ + +#elif LARGE +#define MEMLIMIT 16000 +typedef long address; /* APOPCODE == 1 */ +typedef double real; + +#elif HUGE +#define MEMLIMIT 32000 +typedef long address; /* APOPCODE == 1 */ +typedef double real; + +#else +#error Define one of SMALL/LARGE/HUGE +#endif + + +#define CHARSINAD ( sizeof(address) ) /* number of characters in word */ + + +/* compiler symbol table and memory */ +extern int *ipmem; +extern address *m; +extern address fre,base,firstlabel; + +#define MEMORYSIZE 32000 /* CODE AND ALL RUNNING-SYSTEM DATA STRUCTURES */ +#define MAXCOMTEMP 100 /* NUMBER OF GLOBAL TEMPORARY VARIABLES */ +#define MAXLOCTEMP 100 /* LIMIT FOR THE NUMBER OF LOCAL TEMPORARY VARIABLES*/ +#define MAXREFTEMP 30 /* LIMIT FOR THE NUMBER OF LOCAL TMP. REF.VARIABLES */ +#define MAXAPPT 32767 /* MAXIMUM APPETITE (EASILY EXTENSIBLE) */ +#define MAXPARAM 10 + + +/* SIMPLE TYPES ARE DISTINGUISHED BY THEIR OFFSET FROM "IPRADR" */ +#define TINT 0 +#define TREAL 1 +#define TBOOLEAN 2 +#define TCHAR 3 +#define TCOROUT 4 +#define TPROCESS 5 +#define TSTRING 6 +#define TFUNC2 7 /* parameter "function" of parameter */ +#define TPROC2 8 /* parameter "procedure" of parameter */ +#define TFILE 9 + + +#define CURRFILE 2 /* constant address of a current file virtual address */ + +#define MAXNAME 70 /* file name length */ + + +#define GEN 1 +#include "genint.h" + +typedef int addrmode ; /* gsg it was an enumeration */ + +typedef char argdescr[4] ; + +typedef struct { + argdescr args ; /* ARGS[0] IS OPCODE */ +} extopcode ; /* EXTENDED OPCODE */ + + /* mb think up removing record extopcode */ + +/************************************************************/ +/* b32b16c = record 32-bit integer + case boolean of + true : ( b32 : longint + false : ( r16 : integer + l16 : integer + ) + end; */ + +typedef union { + struct { long int b32 ; } t ; + struct { int r16, l16 ; } f ; + } b32b16c ; + +/* ieopc = record + case integer of + 0 : (int1,int2 : integer); + 1 : (int : longint); + 2 : (eop : extopcode ); + end; */ + +typedef union { + struct { int int1f, int2f ; } c0 ; + struct { long int intf ; } c1 ; + struct { extopcode eop ; } c2 ; + } ieopc ; +/************************************************************/ +typedef char filename[ MAXNAME + 1 ] ; + + +/* mb declarations from main to follow...*/ + +#define ENDOFSTRINGS -1 /* end of strings section marker */ + +typedef int errtype ; /* gsg previously enumeration */ +#define TMPROT 0 /* TOO MANY PROTOTYPES */ +#define TLDESCR 1 /* DESCRIPTIONS TOO LONG */ +#define MEMOVF 2 /* MEMORY OVERFLOW */ +#define TMTEMP 3 /* TOO MANY TEMPORARY VARIABLES NEEDED */ +#define STSEQTL 4 /* STATEMENT SEQUENCE TOO LONG */ +#define NOTIMPL 5 /* FUNCTION NOT IMPLEMENTED */ +#define OBJTOLG 6 /* OBJECT TOO LONG */ +#define PROCLTL 7 /* PROCEDURE LIST TOO LONG */ + +typedef struct { + unsigned int ap : 2 ; /* 0..3 */ + unsigned int l : 1 ; /* 0..1 */ + unsigned int ft : 1 ; /* 0..1 */ + unsigned int v : 1 ; /* 0..1 */ + unsigned int s : 3 ; /* 0..7 */ + unsigned int zp : 4 ; /* 0..15 */ + unsigned int t : 4 ; /* 0..15 */ + + } csti ; /* : SYMBOL TABLE ITEM, 16 bits long */ + + +typedef union { + int icstic_int ; + csti cst ; + + } icstic ; + + + /* mb genprot declarations to follow */ + +typedef int logitem ; /* loglan items */ /* gsg previously enumeration */ +#define ICLASS 0 +#define IRECORD 1 +#define ICOROUT 2 +#define IPROCESS 3 +#define IBLOCK 4 +#define IPREFBLOCK 5 +#define IFUNC 6 +#define IPROC 7 +#define IHANDLER 8 +#define IFMPROC 9 +#define IFMFUNC 10 +#define IFMTYPE 11 +#define IPARIN 12 +#define IPAROUT 13 +#define IPARINOUT 14 +#define IVAR 15 +#define ICONST 16 +#define ISIGNAL 17 + +typedef int logunit ; /* iclass .. ifmfunc */ /* LOGLAN UNITS TOGETHER WITH FORMAL */ + /* FUNCTION AND FORMAL PROCEDURE */ + + + /* AUXILIARY */ + + + +typedef struct s1 { + int ip ; /* ADDRESS IN IPMEM */ + struct s1 * prevelem ; /* PREVIOUS ELEMENT */ + + } listelem ; /* LIST OF PARAMETERS OR OF REFERENCE ATTRIBUTES */ + +typedef listelem * pointer ; + + + +typedef struct s2 { + address ip ; /* ADDRESS IN IPMEM */ + struct s2 * prevelem ; /* PREVIOUS ELEMENT */ + + } longlistelem ; /* list of parameters or of reference attributes */ + +typedef longlistelem * longpointer ; + + +/* mb declarations of code to follow */ + +#define QMAX 2400 /* MAXIMAL LENGTH OF THE QUADRUPLES SEQUENCE */ +#define TEMPGUARD 103 /* = MAXCOMTEMP + MAXIMAL APPETITE */ + +/*CBC added concurrent statements... */ +#define MAXPROCLIST 30 /* maximum length of procedure ident. list */ + + +typedef int qaddr ; /* 1..QMAX */ +typedef int qaddr0 ; /* 0..QMAX */ /* 0 FOR NO NEXT USE */ +typedef int argnr ; /* gsg na razie int; moze wystarczy char ?; 1..3 */ +typedef int app ; /* APINT..APVIRT */ + +typedef struct { + int opcode ; + int arg[4] ; + qaddr0 nxtuse[4] ; + } quadruple ; + +extern quadruple tuple[]; + +typedef int stmode ; /* gsg previously enumeration */ +#define VARGLOB 0 /* GLOBAL VARIABLE */ +#define VARLOC 1 /* LOCAL VARIABLE */ +#define VARMID 2 /* MIDDLE LEVEL VARIABLE */ +#define TEMPVAR 3 /* TEMPORARY VARIABLE */ +#define INTCONST 4 /* CONSTANT: INTEGER,CHAR,BOOLEAN,STRING */ +#define REALCONST 5 /* REAL CONSTANT */ + + +typedef struct { + unsigned int smode:4; + unsigned int sap:3; + /* APPETITE, DISTINGUISHING REFERENCES */ + unsigned int slive:1; + /* TRUE, IF USED OUTSIDE THE ADDRESSING SCOPE */ + unsigned int slocal:1; + /* TRUE --> MUST BE ALLOCATED IN OBJECT */ + /* FALSE --> MAY BE ALLOCATED IN GLOBAL AREA */ + + } stitem ; /* SYMBOL TABLE ITEM */ + /* totalling 9 bits , less then 1 word */ + + +/* ISTIC =*/ /* INTEGER <--> SYMBOL TABLE ITEM CONVERSION */ +/* RECORD*/ +/* CASE BOOLEAN OF*/ +/* TRUE : ( INT : INTEGER );*/ +/* FALSE: ( STI : STITEM )*/ +/* END;*/ + +typedef bool tmpmap[ MAXLOCTEMP + 1 ] ; + +typedef struct { + tmpmap map ; + int locsize ; /* 0..MAXLOCTEMP */ + int refsize ; /* -1..MAXREFTEMP */ + + } tmpmapdscr ; +#define ishft(i, n) (( (n) > 0) ? ((i) << (n)) : ((i) >> -(n))) + +#define iand(i,j) ((int)((i) & (j))) + +#define ior(i,j) ((int)((i) | (j))) + +typedef struct { + addrmode mode ; + address off1 ; + address off2 ; /* FOR REMOTE ONLY */ +} args_struct ; + +extern args_struct args[4]; + + +#define putsap(s, i) i = (i & 0xff03) | ((s) << 2) + +#define sap(i) ((i) & 255) >> 2 + +#define putslive(b, i) ((b) ? (i |= 2) : (i &= -3)) + +#define slive(i) (bool)((i & 2) == 2) + +#define putslocal(b, i) ((b) ? (i |= 1) : (i &= -2)) + +#define slocal(i) (bool)((i & 1) == 1) + +#define smode(i) ((stmode)(i >> 8)) + +#include "mainvar.h" +#include "oxen.h" + + +#ifndef NO_PROTOTYPES + +void out(void); +void outprot(void); +void back(void); +void backpatch(int,address); +void generror(errtype); +void addtolist(pointer *,int); +void longaddtolist(longpointer *,address); +void gen(void); +void genprot(void); +void handlers(void); +void initiate(void); +void lists(void); +void primdescr(void); +void pdescr(void); +void putreals(void); +void putstrings(void); +void setfiles(char *); +void reserve(address); +logitem itemkind(int); +int apet(int); +void dump_lcode(char *); +void makeproclist(void); + +#else + +void out(); +void outprot(); +void back(); +void backpatch(); +void generror(); +void addtolist(); +void longaddtolist(); +void gen(); +void genprot(); +void handlers(); +void initiate(); +void lists(); +void primdescr(); +void pdescr(); +void putreals(); +void putstrings(); +void setfiles(); +void reserve(); +logitem itemkind(); +int apet(); +void dump_lcode(); +void makeproclist(); + +#endif + diff --git a/sources/gen/lcode.c b/sources/gen/lcode.c new file mode 100644 index 0000000..34e3dfb --- /dev/null +++ b/sources/gen/lcode.c @@ -0,0 +1,295 @@ +/* Loglan82 Compiler&Interpreter + Copyright (C) 1993 Institute of Informatics, University of Warsaw + Copyright (C) 1993, 1994 LITA, Pau + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + +======================================================================= +*/ + +#if TALK >= 3 + +#include +#include + +#include "glodefs.h" +#include "mainvar.h" + + +void dump_lcode( name ) char *name;{ + + FILE *fout; + char outname[100]; + unsigned char opdescr[ 229 ]; + int args[ 3 ] , arg_no ; + int i, opcode, n ; + + strcpy(outname,name); + fout=fopen(strcat(outname,".lco"),"w"); + if( fout==NULL ){ + fprintf(stderr,"Can't open file %s for writing\n",name); + exit(10); + } + + /* initiate opdescr */ + + for( n=100; n<=131; n++ ) opdescr[ n ]=3; + for( n=30 ; n<=83 ; n++ ) opdescr[ n ]=2; + opdescr[ 29 ]=3; + opdescr[ 37 ]=3; + opdescr[ 39 ]=3; + opdescr[ 40 ]=3; + opdescr[ 44 ]=2; + opdescr[ 45 ]=2; + for( n=52 ; n<=57 ; n++ ) opdescr[ n ]=3; + for( n=84 ; n<=99 ; n++ ) opdescr[ n ]=3; + opdescr[ 11 ]=1; + opdescr[ 12 ]=1; + opdescr[ 13 ]=2; + opdescr[ 15 ]=2; + opdescr[ 16 ]=2; + for( n=20 ; n<=26 ; n++ ) opdescr[ n ]=3; + for( n=1 ; n<=5 ; n++ ) opdescr[ n ]=3; + opdescr[ 2 ]=2; + opdescr[ 132 ]=1; + opdescr[ 145 ]=3; + opdescr[ 137 ]=2; + opdescr[ 138 ]=2; + opdescr[ 139 ]=2; + opdescr[ 144 ]=2; + opdescr[ 149 ]=2; + opdescr[ 150 ]=2; + opdescr[ 151 ]=2; + opdescr[ 152 ]=2; + opdescr[ 140 ]=1; + opdescr[ 141 ]=1; + opdescr[ 143 ]=1; + opdescr[ 146 ]=1; + opdescr[ 147 ]=1; + opdescr[ 148 ]=1; + opdescr[ 153 ]=1; + opdescr[ 158 ]=1; + opdescr[ 159 ]=2; + opdescr[ 160 ]=2; + opdescr[ 161 ]=2; + opdescr[ 162 ]=2; + opdescr[ 163 ]=2; + opdescr[ 164 ]=3; + opdescr[ 165 ]=3; + opdescr[ 166 ]=3; + opdescr[ 170 ]=3; + for( n=172 ; n<= 194 ; n++ ) opdescr[ n ]=0; + opdescr[ 175 ]=1; + opdescr[ 177 ]=1; + opdescr[ 178 ]=1; + opdescr[ 181 ]=1; + opdescr[ 182 ]=1; + opdescr[ 183 ]=1; + opdescr[ 184 ]=1; + opdescr[ 186 ]=1; + opdescr[ 188 ]=1; + opdescr[ 189 ]=3; + opdescr[ 220 ]=1; + opdescr[ 221 ]=0; + opdescr[ 222 ]=0; + opdescr[ 223 ]=0; + opdescr[ 224 ]=0; + opdescr[ 225 ]=0; + opdescr[ 226 ]=0; + opdescr[ 227 ]=0; + opdescr[ 228 ]=1; + for( n = 195 ; n<=219 ; n++ ) opdescr[ n ]=2; + for( n = 201 ; n<=204 ; n++ ) opdescr[ n ]=1; + + + while( 1 ) { + + opcode = next(); + arg_no = opdescr[ opcode ] ; + for(i = 0 ; i < arg_no ; i++) args[ i ] = next(); + + fprintf(fout," %3d " , opcode ); + + switch( opcode ) { + + case 13 : + if(args[ 1 ] > 0 ) + fprintf(fout," t%-5d := R%1d",args[0],args[1]); + else + fprintf(fout," t%-5d := %5d(R6)",args[0],args[1]); + break; + + case 23 : + fprintf(fout," t%-5d := sp%-3d.par%02d",args[0],args[1],args[2]); + break; + + case 37 : + fprintf(fout," t%-5d := t%-5d + %d",args[0],args[1],args[2]); + break; + + case 60 : + fprintf(fout," t%-5d := t%-5d",args[0],args[1]); + break; + + case 64 : + case 65 : + case 66 : + case 67 : + case 68 : + case 69 : + case 70 : + case 71 : + case 72 : + fprintf(fout," t%-5d := %2d * t%-5d",args[0],opcode-62,args[1]); + break; + + case 110 : + fprintf(fout," t%-5d := ( t%-5d > t-5d )",args[0],args[1],args[2]); + break; + + case 132 : + fprintf(fout," call sp%-3d",args[0]); + break; + + case 139 : + if( args[ 1 ] > 0 ) + fprintf(fout," R%1d := t%-5d",args[1],args[0]); + else + fprintf(fout," %5d(R6) := t%-5d",-args[1],args[0]); + break; + + case 140 : + fprintf(fout," nop"); + break; + + case 145 : + fprintf(fout," sp%-3d.par%02d := t%-5d",args[1],args[2],args[0]); + break; + + case 151 : + fprintf(fout," if not t%-5d goto L%-4d",args[0],args[1]); + break; + + case 152 : + fprintf(fout," if t%-5d goto L%-4d",args[0],args[1]); + break; + + case 174 : + fprintf(fout,"LASTWILL :"); + break; + + case 177 : + fprintf(fout,"* line %5d",-args[0]+1); + break; + + case 179 : + fprintf(fout," Entry point:"); + break; + + case 181 : + fprintf(fout,"L%-4d :",args[0]); + break; + + case 182 : + fprintf(fout," jump L%-4d",args[0]); + break; + + case 184 : + fprintf(fout,"BEGIN M%05d",args[0]); + break; + + case 185 : + fprintf(fout,"END"); + break; + + case 191 : + fprintf(fout," backbl"); + break; + + case 192 : + fprintf(fout," backpr"); + break; + + case 193 : + fprintf(fout," back"); + break; + + case 194 : + fprintf(fout," fin"); + break; + + case 199 : + fprintf(fout," iconst t%-5d = %5d",args[0],args[1]); + break; + + case 200 : + fprintf(fout,"END OF CODE" ); + break; + + case 201 : + fprintf(fout," tempvar1 t%-5d",args[0]); + break; + + case 202 : + fprintf(fout," tempvar2 t%-5d",args[0]); + break; + + case 203 : + fprintf(fout," tempvar3 t%-5d",args[0]); + break; + + case 204 : + fprintf(fout," tempvar4 t%-5d",args[0]); + break; + + case 205 : + fprintf(fout," globvar t%-5d [ desc = &5d ]",args[0],args[1]); + break; + + case 208 : + fprintf(fout," livevar t%-5d := t%-5d",args[0],args[1]); + break; + + case 223 : + case 224 : + case 225 : + case 227 : + { + qcurr=1; + makeproclist(); + fprintf(fout," proclist "); + } + break; + + default : + for( i=0; i=172 && opcode<=176 || opcode>=178 && opcode<=194 ) + fprintf(fout,"---------------------------------------------------\n"); + + if( opcode == 200 ) break ; /* end-marker */ + + } + + fclose(fout); + +} + +#endif + diff --git a/sources/gen/lcode.o b/sources/gen/lcode.o new file mode 100644 index 0000000000000000000000000000000000000000..05f14b2108925022253add8db292b11d6d18cf1c GIT binary patch literal 93 zcmZQ)WIzEDC_DxR79bylK|mOYVQf_(J3TqsC_Xtqw;(eoHARmhK0ZD@uM{p2pUeON D +#include "glodefs.h" + +#ifndef NO_PROTOTYPES + +static void makereflist (protaddr); +static void makeprefseq (protaddr); +static void makeparlist (protaddr); +static void makevirtlist(protaddr); +static void makeit (int,protaddr); + +#else + +static void makereflist(); +static void makeprefseq(); +static void makeparlist(); +static void makevirtlist(); +static void makeit(); + +#endif + +logitem itemkind (i) + /* strongly implementation dependent, */ + /* given the address in symbol table */ + /* returns the kind of loglan item */ + /* ctp */ + +int i ; +{ + int n ; + csti trick ; + + n = ipmem [ i ] ; + +/* WITH TRICK DO */ + { + trick.t=iand(n,15); /* 000f */ + /* bits 12..15 in 16-bits word */ + + trick.zp=ishft(iand(n,15*16),-4); /* 00f0 */ + /* bits 8..11 in 16-bits word */ + + trick.s=ishft(iand(n,7*256),-8); /* 0700 */ + + /* bits 5.. 7 in 16-bits word */ + + switch(trick.t) + { + case 2 : return(IRECORD) ; + + case 3 : return(ICLASS) ; + + case 5 : return(IPROCESS) ; + + case 6 : return(IFMTYPE) ; + + case 7 : return(ICOROUT) ; + + default : + /* 4,8,9,10,11,12,13,14,15 */ break; + + case 1 : switch(trick.zp) + { + case 2 : return(IFMFUNC) ; + + case 3 : return(IFMPROC); + + case 5 : return(IPARIN); + + case 6 : return(IPAROUT); + + case 7 : return(IVAR); + + case 8 : return(ICONST); + + case 9 : return(IPARINOUT); + + case 11 : return(ISIGNAL); + + + + case 0 : switch(trick.s) + { + case 0 : return(IBLOCK); + + case 1 : return(IPREFBLOCK); + + case 2 : return(IFUNC); + + case 4 : return(IPROC); + + case 7 : return(IHANDLER); + + + default /* 3,5,6*/ : break ; + } /* switch trick.s */ + default : + /* 1,4,10,12,13,14,15 */ break ; + + } /* switch trick.zp */ + } /* switch trick.t */; + } /* WITH */ + +} /* itemkind */ + + + +void reserve(n) address n;{ /* TEST IF THERE IS AT LEAST N EMPTY CELLS IN 'M' */ + if((fre + n) > MEMLIMIT) generror(TLDESCR); +} + + + +static void makereflist(prot) protaddr prot;{ +/* PREPARES THE TABLE WITH OFFSETS OF REFERENCE VARIABLES */ +/* FOR THE PROTOTYPE PROT */ + + pointer elem ; + int n ; + bool anytodo ; + dprotaddr pref ; + pointprdsc curr ; /* cmb */ + + curr = prototype[ prot ] ; + if (curr->lthreflist > 0){ + anytodo = TRUE ; + pref = prefix[ prot ] ; + + if (pref != DUMMY) /* prefixed unit */ + if(( prototype[ pref ]->span != 0 ) + && ( prototype[ pref ]->lthreflist == curr->lthreflist )){ + + /* prefix already processed and the same reference attributes */ + + anytodo = FALSE ; + curr->reflist = prototype[ pref ]->reflist ; + } + + if(anytodo){ + reserve(curr->lthreflist) ; + elem = listofref[ prot ] ; + + /* COPY THESE OFFSETS */ + for (n = curr->lthreflist-1; n>=0; n--) + { + m [ fre+n ] = ipmem[ (elem->ip) - 2 ] ; /* offset */ +LOG(fre + n); + elem = elem->prevelem ; + } /* COPYING */ + + curr->reflist = fre + base ; + fre += curr->lthreflist ; + + } /* NOT DONE YET */ + } /* IF NON EMPTY REFLIST */ +} + + + +static void makeprefseq(prot) protaddr prot;{ + int n ; + dprotaddr pa ; + pointprdsc curr ; + +/* WITH PROTOTYPE[ PROT ]^ DO */ + + curr = prototype[ prot ] ; + reserve(curr->lthpreflist) ; + pa = prot ; + + for (n = (curr->lthpreflist) - 1; n >= 0 ; n--) + { + m[ fre + n ] = pa ; +LOG(fre + n); + pa = prefix[ pa ] ; + } + + curr->preflist = fre + base ; + fre += curr->lthpreflist ; + +} + + + +static void makeparlist(prot) protaddr prot;{ +/* PREPARES TABLES WITH PARAMETERS OFFSETS AND DESCRIPTION ADDRESSES + FOR PROTOTYPE PROT */ + + longpointer elem ; + int ip , /* address in ipmem */ + n ; + dprotaddr pref; + bool anytodo ; + pointprdsc curr ; + +/* WITH PROTOTYPE[ PROT ] ^ DO */ +{ curr = prototype[ prot ] ; + if (curr->lthparlist > 0) + { + /* TABLE WITH PARAMETERS OFFSETS */ + reserve(curr->lthparlist) ; + curr->parlist = fre + base ; + + if (curr->kind == HANDLER) + { + /* NO PARAMETER LIST IN IPMEM, USE ATTRIBUTE LIST*/ + ip = ipmem[(curr->codeaddr) + 6 ] ; + /* FIRST ELEM. OF ATTRIBUTE LIST */ + for (n = 0; (n <=(curr->lthparlist-1 )); n++) + { + m[ fre + n ] = ipmem[(ipmem[ ip ])-2 ] ; /* offset */ +LOG(fre + n); + + + ip = ipmem[ ip+1 ]; /* next */ + } /* FOR */; + + fre += curr->lthparlist; + } /* IF HANDLER */ + + else /* not handler */ + { + anytodo = TRUE; + pref = prefix[ prot ]; + + if (pref != DUMMY) + if (( prototype[ pref ]->span != 0 ) /* prefix already processed */ + && ( prototype[ pref ]->lthparlist == curr->lthparlist )) + /* the same parameters */ + { + curr->parlist=prototype[ pref ]->parlist; + anytodo=FALSE; + } + + if (anytodo) + { + /* COPY THESE OFFSETS USING PARAMETERS LIST FROM IPMEM */ + ip=ipmem[ curr->codeaddr+3 ]; /* first parameter indirect address */ + + for (n=0;n <= (curr->lthparlist) - 1; n++) + m [ fre + n ] = ipmem[ ipmem[ ip+n ] - 2 ]; /* offset */ +LOG(fre + n - 1); + + fre += curr->lthparlist; + } /* mb if anytodo (?) */ + + /* FOR PROCEDURE OR FUNCTION PREPARE TABLE WITH PARAMETERS + DESCRIPTIONS ADDRESSES */ + if( (curr->kind == LFUNCTION) || (curr->kind == LPROCEDURE) + || (curr->kind == PROCESS) ) + { + reserve(curr->lthparlist); + curr->pfdescr=fre+base; + elem = listofpar[ prot ]; + + for (n=curr->lthparlist-1; n >= 0; n--) + { + m [ fre + n ] = elem->ip; /* description's address */ +LOG(fre + n); + elem=elem->prevelem; + } /* for */ + + fre += curr->lthparlist; + } /* FUNCTION,PROCEDURE,PROCESS */ + } /* NOT HANDLER */ + } /* mb if lthparlist>0 ?? */ + } /* WITH */ + + } /* makeparlist */ + +static void makeit(ipr,prot) + int ipr ; + protaddr prot ; + /* mb added passing ipr,prot as parameters rather than globals */ + /* for the ipmem prototype 'ipr' creates the table with virtuals + prototypes numbers and assignes its address to virtlist of + 'prot' . */ +{ + int k,l,f ; + + l=ipmem[ ipr+25 ]; /* length */ + f=ipmem[ ipr+24 ]; /* first element address */ + reserve(l); + prototype[ prot ]->virtlist=fre + base; + for (k=0; k<=l-1; k++) + m[ fre+k ]=ipmem[ (ipmem[ f+k ])-1 ]; /* virtual's prototype */ +LOG(fre + k); + fre+=l; + } /* makeit */ + +static void makevirtlist(prot) protaddr prot;{ + /* MAKES A TABLE WITH PROTOTYPES NUMBERS FOR VIRTUAL */ + /* PROCEDURES OR FUNCTIONS (IF NOT MADE YET). */ + /* PROPAGATES ITS ADDRESS THRU THE PREFIX SEQUENCE. */ + + int ipr ; + address n ; + pointprdsc curr; + + { + curr = (prototype[prot]); + ipr = (int)(curr->codeaddr); /* address in ipmem */ + if( ((curr->kind == CLASS) || (curr->kind == LRECORD) || + (curr->kind ==COROUTINE) || (curr->kind ==PROCESS) || + (curr->kind == PREFBLOCK) || (curr->kind ==LFUNCTION) || + (curr->kind ==LPROCEDURE)) /* VIRTUALS ALLOWED */ + && (curr->virtlist == 0) /* not processed yet */ + && (ipmem[ ipr + 25 ] != 0)) + { /* not empty virtuals list */ + while (ipmem[ ipr + 25 ] < 0) + /* LIST INHERITED FROM PREFIX, GO THERE */ + ipr=ipmem[ ipr + 21 ]; + /* THE OWN LIST OF IPR */ + n = prototype[ ipmem[ ipr - 1 ] ]->virtlist ; + if (!n) /* TABLE NOT MADE YET */ + makeit(ipr, prot) ; + else + { curr->virtlist = n ;} + /* PROPAGATE IT UP THE PREFIX SEQUENCE TILL THE OWNER OF THE LIST */ + ipr=(int)(curr->codeaddr); /* ipmem address for prot */ + while (ipmem[ ipr+25 ] < 0) + { + ipr = (int)(ipmem[ ipr+21 ]); /* prefix */ + prototype[ ipmem[ ipr-1 ] ]->virtlist = curr->virtlist; + } + } /* VIRTUALS ALLOWED AND EXIST, UNIT NOT PROCESSED */ + } /* WITH */ + } /* MAKEVIRTLIST */ + +void lists(){ + + /* PREPARATION OF : REFLIST, PARLIST, PARDESCRLIST, PREFLIST */ + /* UNITS ARE PROCESSED IN A REVERSED ORDER */ + + protaddr pr ; + dprotaddr prfx ; + pointprdsc pref ; + address n ; + pointprdsc curr ; /* gsg auxiliary for the Pascal WITH */ + + for(pr = lastprot; pr >= MAINBLOCK; pr--){ + curr = prototype[pr] ; + if(curr->span == 0){ /* ALREADY PROCESSED ? */ + /* NOT PROCESSED YET */ + makeparlist(pr) ; + if(curr->kind == LFUNCTION){ /* SUPPLEMENT FUNCTION TYPE */ + n = m[ curr->pfdescr - base + curr->lthparlist - 1 ] - base; /* result */ + curr->nrarray = m[ n+1 ] ; + curr->finaltype = m[ n+2 ] ; + } /* SUPPLEMENT OF FUNCTION TYPE */ + + makereflist(pr) ; + makeprefseq(pr) ; + curr->span = 1 ; /* ==> processed */ + + /* GO UP THE PREFIX SEQUENCE */ + prfx = prefix[ pr ] ; + + while (prfx != DUMMY) + { pref = prototype[ prfx ] ; + + if (pref->span != 0) + prfx = DUMMY ; /* FORCE EXIT */ + else + { /* prefix not processed yet */ + pref->span = 1 ; /* ==> processed */ + pref->reflist = curr->reflist ; + pref->parlist = curr->parlist ; + pref->preflist = curr->preflist ; +/*CBC added copying of PFDESCR (formal parameter description list) */ + pref->pfdescr = curr->pfdescr ; + prfx = prefix[ prfx ] ; + } /* PREFIX NOT PROCESSED */ + } /* WHILE */ + + } /* NOT PROCESSED */ + + makevirtlist(pr) ; + } /* for */ + +} /* Lists */ + + +void handlers(){ + protaddr prot; + address pip,listfrompref; + int h; + + for (prot = MAINBLOCK; prot <= lastprot; prot++) + /* WITH PROTOTYPE[ PROT ] ^ DO */ + { if (prototype[prot]->kind == HANDLER) /* SURELY NO OWN HANDLERS */ + prototype[prot]->handlerlist = 0 ; + else + { + if (prototype[prot]->lthpreflist == 1) /* NO PREFIX */ + listfrompref = 0 ; + else + listfrompref = prototype[ prefix[ prot ] ]->handlerlist ; + + pip = prototype[prot]->codeaddr ; /* prototype in ipmem */ + + if (ipmem[ pip + 19 ] == 0) /* NO OWN HANDLERS */ + prototype[prot]->handlerlist = listfrompref ; + else + { /* mb own handlers possible */ + reserve( 3 * ( ipmem[ pip + 19 ]) ) ; + prototype[prot]->handlerlist = fre + base ; + h = ipmem[ pip + 20 ] ; + /* first element of handler list in ipmem */ + + do + { + m[ fre ] = ipmem[ h ] ; /*signal identifier */ +LOG(fre); + m[ fre + 1 ] = ipmem[ (int)(ipmem[ h + 1 ]) - 1 ] ; +LOG(fre + 1); + + /* handler prototype */ + m[ fre + 2 ] = fre + 3 + base ; /* next */ +LOG(fre + 2); + h = ipmem[ h + 2 ] ; + fre += 3 ; + } while (h) ; + + m[ fre - 1 ] = listfrompref ; +LOG(fre - 1); + + } /* else */ + } /* OWN HANDLERS */ + } /* for */ +} /* HANDLERS */ + + + +void primdescr(){ +/* DESCRIPTIONS OF PRIMITIVE TYPES */ + + /*printf("primdescr: fre = %d\n", fre) ; */ + assert(fre == 0 && base > 0); + ipradr =base + fre ; + m[ fre + TINT ] = PRIMITIVETYPE ; + m[ fre + TREAL ] = PRIMITIVETYPE ; + m[ fre + TBOOLEAN ] = PRIMITIVETYPE ; + m[ fre + TCHAR ] = PRIMITIVETYPE ; + m[ fre + TCOROUT ] = PURECOROUTINE ; + m[ fre + TPROCESS ]= PUREPROCESS ; + m[ fre + TSTRING ] = PRIMITIVETYPE ; + m[ fre + TFUNC2 ] = FORMFUNC ; + m[ fre + TPROC2 ] = FORMPROC ; + m[ fre + TFILE ] = FILETYPE ; /*DSW*/ + + /*dsw*/ /* fre=fre+TPROC2+1; */ + + fre = fre + TFILE + 1 ; /*dsw*/ + + /* STORE ADDRESSES OF THESE TYPES DESCRIPTIONS */ + + /*DSW&BC...*/ + if (ipradr + TFILE > MAXINT - 1) generror(TLDESCR) ; + + ipmem[ nrint + 2 ] = -(ipradr + TINT) ; + ipmem[ nrre + 2 ] = -(ipradr + TREAL) ; + ipmem[ nrbool + 2 ] = -(ipradr + TBOOLEAN) ; + ipmem[ nrchr + 2 ] = -(ipradr + TCHAR) ; + ipmem[ nrcor + 2 ] = -(ipradr + TCOROUT) ; + ipmem[ nrproc + 2 ] = -(ipradr + TPROCESS) ; + ipmem[ nrtext + 2 ] = -(ipradr + TSTRING) ; + +} /* PRIMDESCR */ + + + +void addtolist(head, i) /* gsg ATTENTION !!! head is "var" parameter !!! */ +/* ADD THE NEW ELEMENT WITH VALUE "I" TO THE LIST + REFERED BY "HEAD" */ +/* head is passed by reference - it is an "inout" parameter */ +/* so it is pointer to pointer to first item */ + +pointer * head ; /* i.e item **head */ +int i ; +{ + pointer elem ; + + elem = *head ; + (*head) = (pointer) new(*head) ; + (*head)->ip = i ; + (*head)->prevelem = elem ; + +} /* ADDTOLIST */ + + +void longaddtolist(head, i) /* gsg ATTENTION !!! head is "var" parameter !!! */ +/* ADD THE NEW ELEMENT WITH VALUE "I" TO THE LIST + REFERED BY "HEAD" */ +longpointer * head ; +address i ; +{ + longpointer elem ; + + elem = (*head) ; + (*head) = (longpointer) new(*head); + (*head)->ip = i ; + (*head)->prevelem = elem ; + +} /* longaddtolist */ + + +void backpatch(i, a) int i; address a;{ + +/* SATISFY REFERENCES (IF ANY) TO THE TYPE WITH IPMEM ADDRESS I */ +/* WITH THE VALUE A . */ +/* IPMEM(I+2) >= 0 ==> NO DESCRIPTION YET, */ +/* IF IPMEM(I-2) >= 0 THEN NOT REFERED YET, */ +/* OTHERWISE = -LINK TO THE FIRST ELEMENT OF LIST */ +/* IPMEM(I+2) < 0 ==> DESCRIPTION ALREADY MADE */ +/* AT ADDRESS = -IPMEM(I+2) */ + + address n,k; + + /*DSW&BC...*/ if(a > MAXINT - 1) generror(TLDESCR); + + /* ANY REFERENCES ? */ + if(ipmem[ i - 2 ] < 0){ + n = -ipmem[ i - 2 ]; + ipmem[ i - 2 ] = 0; + + while (n > 0){ + k = n; + n = - m[n]; + m[ k ] = a; + LOG(k); + } + } + ipmem[ i + 2 ] = -a ; /* DESCR. ALREADY MADE */ +} + + +void pdescr(){ +/* FILLS THE PROTOTYPE OF UNIT. */ +/* FOR THE CLASS ALSO CREATES CLASS TYPE DESCRIPTION */ + + pointprdsc prfx ; /* POINTER TO PREFIX DESCRIPTION */ + int ip ; /* ADDRESS IN IPMEM */ + pointprdsc curr ; /* gsg translation of the Pascal WITH */ + + /* WITH PROTOTYPE[ LASTPROT ]^ DO */ + { curr = prototype[ lastprot ] ; + ip = curr->codeaddr ; + + if (lastprot == MAINBLOCK) + curr->slprototype = DUMMY ; + else + curr->slprototype = ipmem[ ipmem[ip-1]-1 ] ; /*PROTOTYPE NUMBER FOR SL*/ + + ipmem[ ip - 1 ] = lastprot ; + curr->appetite = APINT + APINT ; /* 2 CELLS: OBJECT'S APPETITE, */ + /* PROTOTYPE ADDRESS */ + curr->span = 0 ; + listofref[ lastprot ] = NULL ; + curr->lthreflist = 0 ; + listofpar[ lastprot ] = NULL ; + curr->lthparlist = 0 ; + curr->preflist = 0 ; + curr->lthpreflist = 1 ; + curr->lastwill = 0 ; + curr->handlerlist = 0 ; + curr->virtlist = 0 ; + + /*CBC added virtual number ...*/ + if (iand(ipmem[ ip ], 8 * 256) != 0) /* virtual ? 0800 */ + curr->virtnumber = ipmem[ ip + 27 ] ; /* yes, store virtual number */ + else + curr->virtnumber = -1 ; /* no, flag that not virtual */ + /*...CBC*/ + + prefix[ lastprot ] = DUMMY ; + + if ( (curr->kind == CLASS) || (curr->kind == LRECORD) || + (curr->kind ==COROUTINE) || (curr->kind ==PROCESS) || + (curr->kind == PREFBLOCK) || (curr->kind ==LFUNCTION) || + (curr->kind ==LPROCEDURE) ) + + { /* POSSIBLY PREFIXED */ + if (ipmem[ ip + 21 ] != 0) + { /* PREFIXED UNIT */ + prefix[ lastprot ] = ipmem[ ipmem[ ip + 21 ] - 1 ] ; + prfx = prototype[ prefix[ lastprot ] ] ; + curr->lthpreflist = prfx->lthpreflist + 1 ; + listofref[ lastprot ] = listofref[ prefix[ lastprot ] ] ; + curr->lthreflist = prfx->lthreflist ; + listofpar[ lastprot ] = listofpar[ prefix[ lastprot ] ] ; + curr->lthparlist = prfx->lthparlist ; + curr->appetite = prfx->appetite ; + } /* PREFIXED UNIT */ + + if ( (curr->kind == CLASS) || (curr->kind == LRECORD) || + (curr->kind ==COROUTINE) || (curr->kind ==PROCESS) ) + { /* CREATE CLASS TYPE */ + reserve(2) ; + backpatch(ip, fre + base) ; + m[ fre++ ] = CLASSTYPE ; +LOG(fre - 1); + m[ fre++ ]= lastprot ; +LOG(fre - 1); + + } /* CLASS TYPE */ + } /* POSSIBLE PREFIXED */ + } /* WITH */ + +} /* PDESCR */ + + diff --git a/sources/gen/lists.o b/sources/gen/lists.o new file mode 100644 index 0000000000000000000000000000000000000000..62897e4fa048489d71e43ccbcf79d942274f8f07 GIT binary patch literal 8342 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 TKzv)MeM=;ywQol2vg!W;%7pF( literal 0 HcmV?d00001 diff --git a/sources/gen/logen.c b/sources/gen/logen.c new file mode 100644 index 0000000..70d9ba2 --- /dev/null +++ b/sources/gen/logen.c @@ -0,0 +1,368 @@ +/* Loglan82 Compiler&Interpreter + Copyright (C) 1993 Institute of Informatics, University of Warsaw + Copyright (C) 1993, 1994 LITA, Pau + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + +======================================================================= +*/ + +#include "glodefs.h" +#include + +#ifndef NO_PROTOTYPES + +static void code(void); +static void putstmode(stmode,int *); +static void segments(void); + +#else + +static void code(); +static void putstmode(); +static void segments(); + +#endif + +/* cas dodalem deklaracje zmiennej qcurr */ +/* DO CELOW URUCHOMIENIOWYCH */ +static address zmienna; +int qcurr; + +static void putstmode(s,i) stmode s; int *i;{ + (*i) &= 255 ; /* CLEAR LEFT BYTE */; + s <<= 8 ; + (*i) |= s ; +} + +void makeproclist(){ + int p, len ; + + len = 0 ; + do + { + p = next() ; + if (p) + { + len ++ ; + if (p > 0) + proclist[ len ] = ipmem[ p-1 ] ; + else + proclist[ len ] = -ipmem[ -p-1 ] ; + } + } while ( ! ( (p == 0) || (len == MAXPROCLIST) )) ; + + if (p) + generror(PROCLTL) ; + + tuple[ qcurr ].arg[ 1 ] = len ; +} + + + + +static void segments(){ + /* COMPLETES THE QUADRUPLES SEGMENT */ + /* LABEL 100 ; EXIT AT END-MARKER */ + bool stop ; /* segment completed */ +/*!!*/ static int op ; /* opcode */ /* static for debugging purposes */ +/*!!*/ static int a, b ; /* first and second argument */ + int trck2 ; +/* int n ; */ + quadruple * curr ; /* gsg for PASCAL WITH translation */ + + while (TRUE) /* EXIT ONLY AT END-MARKER */ + { + stop = FALSE ; /* COMPLETE THE SEGMENT */ + qcurr = 1 ; + do /* WITH tuple[ qcurr ] DO BEGIN */ + { curr = tuple + qcurr ; /* gsg PASCAL WITH statement translation */ + + op = next() ; /* Fetch operator */ + +#if (TALK > 15) + printf(" op = %d\n", op) ; +#endif +if( op==210 || op==211 ){ printf("|opcode %d|\n",op); getchar(); } + if ( (op <= 194) || (op >= 220) ) + { + + stop = ( ((172 <= op) && (op <= 176)) || ((178 <= op) && (op <= 227)) ) ; + /* op in [172..176, 178..227] */ + curr->opcode = op ; + /* Now fetch arguments */ + switch (opdescr[ op ]) + { + case 0 : break ; + + case 1 : + case 2 : + case 8 : curr->arg[ 1 ] = next() ; + break ; + + case 3 : + case 5 : + case 9 : + case 11 : + case 15 : curr->arg[ 1 ] = next() ; + curr->arg[ 2 ] = next() ; + break ; + + case 4 : + case 6 : + case 7 : + case 10 : + case 12 : + case 13 : + case 14 : curr->arg[ 1 ] = next() ; + curr->arg[ 2 ] = next() ; + curr->arg[ 3 ] = next() ; + break ; + + } /* switch */ + + if ( ((223 <= op) && (op <= 225)) || (op == 227) ) /*op in [223..225,227]*/ + makeproclist() ; + qcurr ++ ; + } + else /* op in 195..219 */ + if (op == 200) + goto label100 ; /* end-marker */ + else /* SPECIAL CARE OPCODES */ + { + a = next() ; + ipmem[ a + 2 ] = 0 ; + if ((op < 201 ) || (op > 204)) + { + b = next() ; + ipmem[ a+1 ] = b ; + } + else + ipmem[ a+1 ] = 0 ; + /* SET DEFAULT VALUES */ + /*SLOCAL = FALSE; SLIVE = FALSE; SMODE = TEMPVAR; SAP = APINT; */ + putslocal(FALSE,notrick) ; + putslive(FALSE,notrick) ; + putstmode(TEMPVAR, ¬rick) ; + putsap(APINT,notrick) ; + + switch (op) + { /* TEMPORARY VARIABLES */ + case 201 : break ; + + case 202 : putsap(APFMTYPE,notrick) ; /* == apreal */ + break ; + + case 203 : putsap(APFMPROC,notrick) ; + break ; + + case 204 : /* reference */ + putsap(APVIRT,notrick) ; + putslocal(TRUE,notrick) ; + break ; + + /* declared variables */ + case 205 : putstmode(VARGLOB, ¬rick) ; + putsap(apet(b),notrick) ; + putslive(TRUE,notrick) ; + break ; + + case 206 : putstmode(VARMID, ¬rick) ; + putsap(apet(b),notrick) ; + putslive(TRUE,notrick) ; + break ; + + case 207 : putstmode(VARLOC, ¬rick) ; + putsap(apet(b),notrick) ; + putslive(TRUE,notrick) ; + break ; + + /* real or integer constant */ + case 197 : putstmode(REALCONST, ¬rick) ; + putsap(APREAL,notrick) ; + break ; + + case 198 : + case 199 : putstmode(INTCONST, ¬rick) ; + break ; + + /* temporary but live */ + case 195 : + case 208 : putslocal(TRUE,notrick) ; + if (op==195) + { /* move&save */ + trck2 = ipmem[ b ] ; + putsap(sap(trck2),notrick) ; + } + else /* live temporary */ + putslive(TRUE,notrick) ; + curr->opcode = 60 ; /* #limove */ + /* proper opcode will be chosen further */ + curr->arg[ 1 ] = a ; + curr->arg[ 2 ] = b ; + qcurr ++ ; + break ; + } /* switch */ + + ipmem[ a ] = notrick ; + } /* SPECIAL CARE OPCODES */ + } while ( ! (stop || (qcurr > QMAX)) ) ; + + qlast = qcurr - 1 ; + if (! stop) + generror(STSEQTL) ; + back() ; /* establish 'next-use' information */ + gen() ; +} /* while true */ + label100: ; /* end-marker : all has been done */ + +} + + + +static void code(){ + /* TRANSFORMS L-CODE TO L'-CODE BY REDUCTION OF NUMBER OF OPCODES */ + /* ALLOCATES TEMPORARY VARIABLES */ + + /* INSERT 'NONE' INTO THE SYMBOL TABLE */ + /*cdsw&ail NONE = LMEM-3 ; */ + none = addrnone ; + /* WITH TRICK.STI DO { */ /* CTRP + SAP = APVIRT ; + SMODE = REALCONST ; + SLOCAL = TRUE ; + SLIVE = TRUE ; + } ; */ + putsap(APVIRT,notrick) ; + putstmode(REALCONST,¬rick) ; + putslocal(TRUE,notrick) ; + putslive(TRUE,notrick) ; + ipmem [ none ] = notrick ; + ipmem [ none+1 ] = 0 ; /* --> m [realbase] */ + ipmem [ none+2 ] = 0 ; + + + /* CLEAR THE DICTIONARY OF LABELS */ + +/* memset(m + fre, (char) 0, (MEMLIMIT - fre + 1) * sizeof(address)) ; */ + for(zmienna = fre; zmienna <= MEMLIMIT; zmienna ++) + m[zmienna] = 0 ; + /* zerowanie pamieci */ + /* n = MEMLIMIT ;*/ + + segments() ; + + /* END OF CODE PREPARING */ +} + + +void main(argc,argv) int argc; char *argv[];{ + +/* + log = fopen("gen.log", "w") ; + if (log == NULL) + printf("cannot open dump file\n") ; +*/ + base = 0 ; + + m = (address *) calloc(sizeof(address), MEMLIMIT + 1) ; + + puts("") ; + puts(" LOGLAN-82 Compiler Version 4.00") ; + puts(" January 10, 1993") ; + puts(" (C)Copyright Institute of Informatics, University of Warsaw") ; + puts(" (C)Copyleft LITA Universite de Pau"); + puts("\n Pass Two\n") ; fflush(stdout); + if(argc < 2){ printf("Usage : %s filename\n",argv[0]); exit(8); } +#if (TALK >= 1) + puts("Setting files...") ; fflush(stdout); +#endif + setfiles(argv[1]) ; + fre = 2 ; /* SKIP TWO WORDS RESERVED FOR DUMMY VIRT. */ + m[fre++] = 0 ; /* dsw*//* free == currfile */ + m[fre++] = 0 ; /* place for file virtual address */ /*dsw*/ + strings = fre ; /* START STRING AREA */ +#if (TALK >= 1) + puts("Putting strings...") ; fflush(stdout); +#endif + putstrings() ; /* WRITE STRINGS INTO MEMORY */ + realbase = fre ; /* BASE FOR REAL CONSTANTS */ +#if (TALK >= 1) + puts("Initiating...") ; fflush(stdout); +#endif + initiate() ; /* READ IPMEM AND OTHER VARIABLES */ +#if (TALK >= 3) + { + long seek=ftell(lfile); + dump_lcode(argv[1]); + fseek(lfile,seek,SEEK_SET); + } +#endif +#if (TALK >= 1) + puts("Putting reals...") ; fflush(stdout); +#endif + putreals() ; /* WRITE REAL CONSTANTS INTO MEMORY */ +#if (TALK >= 1) + puts("Generating prototypes...") ; fflush(stdout); +#endif + genprot() ; + /* PROTOTYPES ARE NUMBERED MAINBLOCK..LASTPROT */ + +temporary = base+fre ; +fre += MAXCOMTEMP + 1 ; + +/* mb removed some unimportant comments to improve readability ; cf text2.gen */ + +#if (TALK >= 1) + puts("Outputing...") ; fflush(stdout); +#endif +#if (TALK >= 70) + for(zmienna = 0; zmienna < fre ; zmienna ++) + printf("M DUMP WORD # %lu VALUE %lu\n", + (unsigned long int)zmienna,(unsigned long int)(m[zmienna])); +#endif + + out() ; /*CBC*/ + + +/* fre == 0 */ + +#if (TALK >= 1) + puts("Code preparation...") ; fflush(stdout); +#endif + code() ; /* CODE PREPARING */ + + +#if (TALK >= 1) + puts("Putting debug info...") ; fflush(stdout); +#endif + +/* + ts3(argv[1]); +*/ + +#if (TALK >= 1) + puts("Putting prototypes...") ; fflush(stdout); +#endif + + outprot() ; /* PUT PROTOTYPES ONTO THE FILE */ + +/* fclose(log) ;*/ +/* *((int *)0xccL) = 0x1445 ;*/ + +#if (TALK >= 1) + puts("Generation ok.") ; fflush(stdout); +#endif + +} + + diff --git a/sources/gen/logen.o b/sources/gen/logen.o new file mode 100644 index 0000000000000000000000000000000000000000..31251f3f63a41d64c7b6bce65b42f79eed960622 GIT binary patch literal 5457 zcma)=e{fXQ702IhHn1d{CeeT*n!Z#>0U?thW5of=52Hi*6~Nf3opf0?ZgbobGxOQ zEGS&+Hr&RghMtuD1OK*5?p1xYgLHk$?8;;^Mz>Kr)V66z(VxoH4wA5Wa-uV z2BHIB5Gog~3=wB7X*3BRW%xpdH2QsPcF4A8VUMxy>m zqoz)3+*qLGB8vHYR;8?Q(v*G-#ei>${vM-Yz-+xiCEQJ` zv~3Qxe@34^PReIUF0dA6hv+1Sy5@Tj+MI_A+j`xdF8IvKccWcj(u`IyD@BjX@}xv( zCZAknz@v~hkC*aU$Xkli8xSlTzouJu{gT}7kn%o~D=ioKNXvd(kdH`qTZJ;hVVX0x zL$Y=tIhJxYN<_+Sv&AYF7jJ(X4oR2LjBNRnsTB5Q=EGF#GdWd` zl0EBZg|jn}G$&lA>L%+4j0J9MManF+>E?~0T&KsHNmrQGu*q$n8&*7K|FBYGjpkuw zJi>(?7Z?q>Se@9~}|zq1%o(`+vrBm;+bs`F$d^+sW?|N^UDJ&o|%P!|~8P zyx`e#9~!<$&c|iy(m%axxJ!iP(#qZ2gU-ZKxfgRshp1rEct9Zm{snmZxul|aO+kBGZmRKxv74Ztzy38jBX?0xYGSFOvCcQCx zS+e1>{UMF#(<)Jh-IT;|LFj(t-6~6-Z#qO!H&>VoA+E@sDL2h;WasdKle_tE<&Zm( zgu`y7kj^G*l})IU{XFU<>rLbLxp4d8G{~nu>n&Tga2~G1ERqdFR0Bm_vi$KS^OsG3 zc!sJjjD(`W7A>Z#PinDvFcMa0R#jIk>NkAhgfG^r)>KbZYi7-QP*Eo@oU$+yZH)z+ znsrrO6prgbJ)vuABmgB4iG_T6&>x?s)`x@7P$<2Xy1wa)#eM5@SGQ;ZT&ylx^u+vO zM@_~1L!B?76rhdA)hE_R3Y7Y|uSruMQ76UK01^!QLfXjp3$yuOnT&japlLTdP$TSt zm9XLn73b0Ji7E;X~z$XigpV;bUiY@>&PqL~xOR+)zmJUWWjf$;LQf_P+j z=uMFHS6NSkc+?bK0Z~1&v+Y;OZ8?hmEim16E7Zi3-;IXi7ct90@}JCl4RZn8SAln+|0(8bW`wzg z`8|;0z6{d0gSm&fm-#w#AM*h7Ftdx<&Fp0!W1e81X1>e30#cq1Oomv>tYFqK=QAH? z`j}CW@_z=r6Ls3g_8rWf%>B%6ko?~Q$-kfNA2a{Kbl@hWd`dv_9|w|u1>0vbA7QRw zu4YD=+n7IN{sN?U2bet|hV-1`{!f`s-0U>|SdjcHm{TP^HLTAA>H5b&@~`LqpDdtVh9n;GY2Tbv?&?k=X&>i~cuQ-+@D}9C_{pzYP0ppbGsrAo(2vX)ASs6|ncR zew_7w*57CS9P1ykZn1uu^+DFJv!0K4d`|rRhu>TR93if~xfX6|q&pRNE z{~kCEJj?n;a60@funNQ+XddE&eVvmrhn!pu8EdN$=i-MWUVI+4$%}1ry-oJAOk)IW z_7G$&t@uAsoMn2&-M})v;^G}cwWcnKlU-7B6$t!H~w{5a!lOr~n{_ldX_|UsUR({?lzX-X>@1NoI%lFyFD#h#d zHiZ*8gV(QkqX|8(hw$Gj#T)Xi)1tA6za<#g6>nJEfHoKnX(4#!%uQNYi^U=_#rw2B z5d-u@v;`MOqE!zmUSHMM6z`gy5#%m-0viS|aP| zvPLcLN0@L#j|Khf5F)B!+^1W7l*AeznJ}h;q$x*VV`D5F2}6=?AO`W-P*4kpeV74F zA_!+MbB!;Ke!s7!CBk#fnBls(ml<(TGc lkr9L8pdR$;h>d CODE) */ + /* (+1) = VALUE OF CONSTANT */ + /* OR OFFSET OF TEMPORARY VARIABLE, */ + /* OR POINTER TO THE ATTRIBUTE DESCRIPTION IN COMP.SYM.TABLE */ + /* (+2) = NEXT USE (QADDR) */ + + /* PROCEDURE 'GENPROT' MODIFIES INFORMATION IN COMPILER SYMBOL TABLE. */ + /* PROCEDURE 'CODE' NEED THE FOLLOWING EXTRA INFORMATION : */ + + /* FOR EACH UNIT: (-1) = PROTADDR */ + /* (+0) = ADDRESS OF 'AFTER INNER' STATEMENT */ + /* ( STORED BY 'CODE' ) */ + /* FOR EACH OBJECT ATTRIBUTE: */ + /* (-2) = OFFSET */ + /* (-1) = PROTADDR FOR THAT OBJECT */ + /* FOR EACH TYPE (CLASS TYPE, FORMAL TYPE OR PRYMITIVE TYPE): */ + /* (+2) = - ADDRESS OF TYPE DESCRIPTION IN M */ + + /* MOREOVER, EXTRA INFORMATION IS STORED TO LINK REFERENCES TO THE TYPES */ + /* ( --> BACKPATCH) */ + +address base ; /* TOTAL LENGTH OF JUST PRODUCED CODE; + TO BE ADDED TO INDEX IN "SMALL" M */ +address realbase ; /* BASE FOR REAL CONSTANTS */ + +dprotaddr prefix[ MAXPROT + 1 ] ; /* PROTOTYPE NUMBER OF PREFIX */ + /* OR DUMMY IF PREFIX ABSENT */ + + + + /* TYPES OF SOME OBJECTS BELONGING TO THE ADDRESS TYPE HAVE BEEN CHANGED */ + /* TO INTEGER. THIS HAS BEEN FORCED DUE TO THE REQUIREMENTS OF THE PASCAL */ + /* COMPILER ACCESSIBLE ON SIEMENS WHICH DEMANDS THAT THE PROCEDURE AND */ + /* FUNCTION PARAMETERS PASSED BY VARIABLE HAVE STRICTLY THE SAME TYPE AS */ + /* THEIR FORMAL CORRESPONENTS. */ + +address offset; + +/* Variables of code to follow */ +/* qaddr0 qcurr ; */ /* CURRENT QUADRUPLE */ +qaddr qlast ; /* LAST QUADRUPLE */ + +quadruple tuple[ QMAX + 1 ] ; + +protaddr unitt ; /* CURRENT UNIT */ +int ipunit ; /* UNIT ADDRES IN IPMEM */ + + +int notrick ; /* FOR INTEGER <--> STITEM CONVERSION */ + + /* M^ [ FIRSTLABEL..MEMLIMIT ] IS USED FOR HANDLING LABELS */ + /* FOR LABEL L : */ + /* M^ [ MEMLIMIT-L+1 ] < 0 */ + /* --> = - VALUE OF ALREADY DEFINED LABEL */ + /* M^ [ MEMLIMIT-L+1 ] > 0 */ + /* --> = HEAD OF UNSATISFIED REFERENCES LIST */ + +int none ; /* ADDRESS OF 'NONE' IN SYMBOL TABLE */ + +int n ; + + /*CBC added concurrent statements... */ +protaddr proclist[ MAXPROCLIST + 1 ] ; + +/* mb vars from back to follow */ + +qaddr ctpoint ; +bool nouse ; + + + +/*mb vars from gen to follow */ + +filename file_name ; /* text given by the user as a file name */ + +FILE * lfile ; + /* OUTPUT FROM LOGLAN COMPILER: */ + /* STRINGS, */ + /* SYMBOL TABLE, */ + /* L-CODE. */ + /* */ + /* PARTICULAR SECTIONS ARE SEPARATED BY '#' OCCURRING IN THE */ + /* FIRST POSITION OF LINE. ZEROS OCCURRING IN THE SYMBOL TA- */ + /* BLE ARE COMPRESSED (SEE GETITEM). */ + +/* TEMPORARY FILES: WRITEN BY GENERATOR, READ BY INTERPRETER */ +FILE * cfile ; /* CODE AND LISTS FOR PROTOTYPES */ +FILE * pfile ; /* PROTOTYPES */ + +int error ; /* TRUE FOR FAILURE DURING GENERATION */ + +pointprdsc prototype[MAXPROT + 1] ; + +address ipradr ; /* BASE FOR PRIMITIVE TYPES DESCRIPTIONS */ +address temporary ; /* ADDRESS OF GLOBAL TEMPORARY VARIABLES */ +address strings ; /* BASE FOR STRING CONSTANTS */ +protaddr lastprot ; /* THE LAST USED PROTOTYPE NUMBER */ +address fre ; /* FIRST FREE CELL IN M */ + + + +pointer listofref[ MAXPROT + 1 ] ; + /* LISTS OF REFERENCE ATTRIBUTES WITH POINTERS TO IPMEM */ + +longpointer listofpar[ MAXPROT + 1 ] ; + /* LISTS OF PRODUCED DESCRPTIONS OF FORMAL PARAMETERS */ + +int opdescr[] = { 0, + 14, 15, 14, 14, 14, 0, 0, 0, 0, 0, + 8, 8, 9, 0, 9, 9, 0, 0, 0, 10, + 10, 10, 10, 10, 10, 10, 0, 0, 12, 11, + 11, 11, 11, 11, 11, 11, 12, 11, 12, 12, + 11, 11, 11, 9, 9, 11, 11, 11, 11, 11, + 11, 12, 12, 12, 12, 12, 12, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 1, 0, 0, 0, 0, 3, 3, 3, 2, + 2, 0, 2, 3, 4, 2, 2, 2, 3, 3, + 3, 3, 2, 0, 0, 0, 0, 2, 5, 5, + 5, 5, 5, 6, 6, 6, 0, 0, 0, 7, + 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, + 1, 1, 1, 1, 0, 1, 0, 2, 4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, + 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2 }; + diff --git a/sources/gen/mainvar.h b/sources/gen/mainvar.h new file mode 100644 index 0000000..38d2df7 --- /dev/null +++ b/sources/gen/mainvar.h @@ -0,0 +1,109 @@ +/* Loglan82 Compiler&Interpreter + Copyright (C) 1993 Institute of Informatics, University of Warsaw + Copyright (C) 1993, 1994 LITA, Pau + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + +======================================================================= +*/ + +#if DEBUG + extern FILE * log ; +#endif + /* DATA STRUCTURES COPIED FROM LOGLAN COMPILER */ + + +extern int nblus ; /* ADDRESS OF MAIN BLOCK IN IPMEM */ +extern int nrint ; /* ADDRESS OF TYPE INTEGER IN IPMEM */ +extern int nrre ; /* ADDRESS OF TYPE REAL IN IPMEM */ +extern int nrbool; /* ADDRESS OF TYPE BOOLEAN IN IPMEM */ +extern int nrchr ; /* ADDRESS OF TYPE CHAR IN IPMEM */ +extern int nrtext ; /* ADDRESS OF TYPE STRING IN IPMEM */ +extern int nrcor ; /* ADDRESS OF TYPE COROUTINE IN IPMEM */ +extern int nrproc ; /* ADDRESS OF TYPE PROCESS IN IPMEM */ +extern int lpmem ; /* THE LAST INDEX BELOW REAL CONSTANTS */ +extern int irecn ; /* LAST INDEX OF REAL CONSTANT AREA */ +extern int lmem ; /* ACTUAL (I.E. FROM COMPILER) SIZE OF IPMEM */ +extern int addrnone ; + + /* dsw&ail*/ + + /* INFORMATION ADDED INTO IPMEM : */ + + /* LOWER ADDRESSES ARE OCCUPIED BY COMPILER SYMBOL TABLE */ + /* UPPER ADDR. ARE USED IN 'CODE' FOR GENERATOR SYMBOL TABLE. */ + /* EACH (GENERATOR) SYMBOL TABLE ITEM OCCUPIES 3 WORDS : */ + /* (+0) = STITEM ( --> CODE) */ + /* (+1) = VALUE OF CONSTANT */ + /* OR OFFSET OF TEMPORARY VARIABLE, */ + /* OR POINTER TO THE ATTRIBUTE DESCRIPTION IN COMP.SYM.TABLE */ + /* (+2) = NEXT USE (QADDR) */ + + /* PROCEDURE 'GENPROT' MODIFIES INFORMATION IN COMPILER SYMBOL TABLE. */ + /* PROCEDURE 'CODE' NEED THE FOLLOWING EXTRA INFORMATION : */ + + /* FOR EACH UNIT: (-1) = PROTADDR */ + /* (+0) = ADDRESS OF 'AFTER INNER' STATEMENT */ + /* ( STORED BY 'CODE' ) */ + /* FOR EACH OBJECT ATTRIBUTE: */ + /* (-2) = OFFSET */ + /* (-1) = PROTADDR FOR THAT OBJECT */ + /* FOR EACH TYPE (CLASS TYPE, FORMAL TYPE OR PRYMITIVE TYPE): */ + /* (+2) = - ADDRESS OF TYPE DESCRIPTION IN M */ + + /* MOREOVER, EXTRA INFORMATION IS STORED TO LINK REFERENCES TO THE TYPES */ + /* ( --> BACKPATCH) */ + +extern address base ; /* TOTAL LENGTH OF JUST PRODUCED CODE; + TO BE ADDED TO INDEX IN "SMALL" M */ +extern address realbase ; /* BASE FOR REAL CONSTANTS */ + +extern dprotaddr prefix[ MAXPROT + 1 ] ; /* PROTOTYPE NUMBER OF PREFIX */ + /* OR DUMMY IF PREFIX ABSENT */ + + + + /* TYPES OF SOME OBJECTS BELONGING TO THE ADDRESS TYPE HAVE BEEN CHANGED */ + /* TO INTEGER. THIS HAS BEEN FORCED DUE TO THE REQUIREMENTS OF THE PASCAL */ + /* COMPILER ACCESSIBLE ON SIEMENS WHICH DEMANDS THAT THE PROCEDURE AND */ + /* FUNCTION PARAMETERS PASSED BY VARIABLE HAVE STRICTLY THE SAME TYPE AS */ + /* THEIR FORMAL CORRESPONENTS. */ +/* from addressing taken offset : */ +extern address offset; +extern int opdescr[]; + +extern protaddr lastprot; +extern address ipradr; +extern pointprdsc prototype[]; +extern pointer listofref[]; +extern longpointer listofpar[]; +extern protaddr unitt ; +extern int ipunit ; +extern int loctmp ; +extern int reftmp ; +extern tmpmap ltmpmap ; +extern tmpmapdscr * mapdscr[] ; +extern bool rtmpmap[] ; +extern bool gtmpmap[] ; +extern qaddr0 qcurr ; +extern qaddr ctpoint ; +extern bool nouse ; +extern qaddr qlast ; +extern int notrick ; +extern address temporary ; +extern protaddr proclist[] ; +extern int none ; +extern address strings ; +extern int n ; +extern FILE * lfile ; +extern FILE * pfile ; +extern FILE * cfile ; + diff --git a/sources/gen/mainvar.o b/sources/gen/mainvar.o new file mode 100644 index 0000000000000000000000000000000000000000..6052a85d91b27c1eaac1fafb1957c90399933d92 GIT binary patch literal 1888 zcmc(dJBZal6o#|DuFq8vTRRJzEfhfu8$}S=X0Z_qhuq2J8cb%!NdmjDrQLR0S&QYC zmX=~^Wn*t|XDR+C$+`YqR>eX#+>`%1k9+2vA+xn?cs?8-_0q9X`MnP3B1}|`^U9|I zVrQm+sPYub&H{dCT5}$7?hmGUQDv>yGu2;J{m-hd*8MMk_1u5;FJR}RwCQuf6u%z% zbkyYY(N9QJ;wPq<=CoE->ru9RBzE!;JB66qvKTO9XJVaIR9RB$t7=SC&XswO>N)H# zc$UBAxmH;B(VZ?MrhE;o_qG9+`;go%;@iY`iSJMRc55wrMDZ=+C&bT)OX7yOC*CD~ zMZ8D6PyCwr4e`OmpRwpWioYlRNc@TFzYu>V{zmoRiGL8!aG83a>%>=xuM%IMSoXe2 z@jJx#h#wGd5I`KpFbQG__3u|u}8=6?vuGq+oF$>=>1IA`1#KN^UWu}UaYchjh znOtV(d5d?~#~R}2b>Bi#=>Idq~wB5 z`QXtbxx5|^ipiDLHpVH-)}c+Ew;eiws+jTu9mNaXPQ>5ps_g=%EEQvpg5Fo%P%n@f z+r==B8+uvgrL@GHp-Yv0fz@0SL(0?6(Ar8*$;wzQO8i0=#sMX+4ke@5QRHoW-XP&p H!oEKNE>xm4 literal 0 HcmV?d00001 diff --git a/sources/gen/makefile b/sources/gen/makefile new file mode 100644 index 0000000..2edb5e8 --- /dev/null +++ b/sources/gen/makefile @@ -0,0 +1,73 @@ +#/* Loglan82 Compiler&Interpreter +# Copyright (C) 1993 Institute of Informatics, University of Warsaw +# Copyright (C) 1993, 1994 LITA, Pau +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +# +# contacts: Andrzej.Salwicki@univ-pau.fr +# +# or Andrzej Salwicki +# LITA Departement d'Informatique +# Universite de Pau +# Avenue de l'Universite +# 64000 Pau FRANCE +# tel. ++33 59923154 fax. ++33 59841696 +# +#======================================================================= +#*/ +# +# switches SMALL/LARGE/HUGE switch between : +# 16-bit small, 16-bit large and 32-bit memory models + +SHELL=/bin/sh +OBJ=gen.o mainvar.o genio.o lists.o genprot.o oxen.o back.o logen.o deb.o lcode.o + +#change this according to your system + +#CC=cl -Oelsgc -DSMALL -DTALK=0 -AC -Fo$*.o # MSC small +#CC=cl -Oelsgc -DLARGE -DTALK=0 -AC -Fo$*.o # MSC large +#CC=gcc -O -m486 -DHUGE -DTALK=20 # GCC +CC=gcc -DHUGE -DNO_PROTOTYPES -DTALK=0 # SUN +#CC=cc -Oactl -CSON -W2 -DHUGE -DTALK=0 # SCO + +target : gen + +# UNIX 32-bit version +gen : $(OBJ) + $(CC) $(OBJ) -o gen + strip gen +# cp gen $(HOME)/bin + +# GCC version HUGE 32-bit memory +gen32.exe : $(OBJ) + $(CC) $(OBJ) -o gen.out + aout2exe gen.out + rm gen.out + +# MSC version LARGE 16-bit memory +gen.exe : $(OBJ) + link /e $(OBJ) + +# MSC version SMALL 16-bit memory +hgen.exe : $(OBJ) + link /e $(OBJ) + +.c.o : + $(CC) -c $*.c + +clean : + rm *.o gen + + diff --git a/sources/gen/oxen.c b/sources/gen/oxen.c new file mode 100644 index 0000000..1c3eb22 --- /dev/null +++ b/sources/gen/oxen.c @@ -0,0 +1,732 @@ +/* Loglan82 Compiler&Interpreter + Copyright (C) 1993 Institute of Informatics, University of Warsaw + Copyright (C) 1993, 1994 LITA, Pau + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + +======================================================================= +*/ + +/**********************************************************/ +/* auxiliary functions for GEN */ +/* Written according to NEW m & ipmem declarations */ +/* Last modified : Mar-01-90 */ +/**********************************************************/ + +#include +#include "glodefs.h" + +address firstlabel; + + /* static void globrelease(address n, app ap); */ + /* releases temporary variable with appetite ap and */ + /* address n within global area */ + + +#ifndef NO_PROTOTYPES + +static void globrelease(address,app); +static int globspace(app); +static void result(argnr); + +#else + +static void globrelease(); +static int globspace(); +static void result(); + +#endif + + + +args_struct args[4]; + /* M^ [ FIRSTLABEL..MEMLIMIT ] IS USED FOR HANDLING LABELS */ + /* FOR LABEL L : */ + /* M^ [ MEMLIMIT-L+1 ] < 0 */ + /* --> = - VALUE OF ALREADY DEFINED LABEL */ + /* M^ [ MEMLIMIT-L+1 ] > 0 */ + /* --> = HEAD OF UNSATISFIED REFERENCES LIST */ + + +bool gtmpmap[ TEMPGUARD + 1 ] ; + /* MAP OF GLOBAL NON-REFERENCE TEMPORARY VARIABLES */ + +bool rtmpmap[ MAXREFTEMP + 1 ] ; + /* MAP OF (LOCAL) REFERENCE TEMPORARY VARIABLES */ + +tmpmap ltmpmap ; + /* MAP OF (LOCAL) NON-REFERENCE TEMPORARY VARIABLES */ + /* TRUE STANDS FOR AVAILABLE WORD, FALSE FOR OCCUPIED ONE */ + +int loctmp ; /* MAXIMAL NUMBER OF ALREADY USED WORDS FOR + LOCAL (NON-REFERENCE) TEMPORARY VARIABLES */ + +int reftmp ; /* MAXIMAL NUMBER-1 OF ALREADY USED PAIRS OF WORDS + FOR REFERENCE TEMPORARY VARIABLES */ + +tmpmapdscr * mapdscr[ MAXPROT + 1 ] ; + /* FOR CLASS ONLY : MAP OF TEMPORARIES USED AT 'INNER' */ + +qaddr0 qcurr; +/**********************************************************/ + + + +void deflabel(lab) +int lab; + /* DEFINES NEW LABEL AND SATISFIES REFERENCES (IF ANY) */ +{ + address n, k ; + + n = MEMLIMIT - lab + 1; + if (n < firstlabel) + if (n < fre) + generror(MEMOVF) ; + else + firstlabel = n ; + k = m [ n ] ; + m [ n ] = -(fre+base); + while (k > 0) + { + n = m [ k ] ; + m [ k ] = fre + base ; + k = n ; + } +} /* DEFLABEL */ + + +void uselabel(lab) address lab;{ + address n ; /* MAINTAINS THE USE OF LABEL LAB AT ADDRESS fre */ + + n = MEMLIMIT - lab + 1 ; + if (n < firstlabel) + if(n < fre) generror(MEMOVF) ; + else firstlabel = n ; + if (m [ n ] < 0) /* ALREADY DEFINED */ + m [ fre ] = -m [ n ] ; + else /* ADD TO THE LIST OF UNSATISFIED REFERENCES */ + { + m [ fre ] = m [ n ] ; + m [ n ] = fre ; + } + +} /* USELABEL */ + + + +/* THE BEGINNING OF UNIT DESCRIBED AT 'IP' */ + +void begunit(ip) int ip;{ + int i,k; + pointprdsc prot = prototype[ipmem[ ip - 1 ]]; + + unitt = ipmem[ ip-1 ] ; + ipunit = ip ; + + prot = prototype[unitt] ; + prot->codeaddr = fre + base; + if (prot->lthpreflist > 1){ /* prefixed unit */ + + k = prefix[ unitt ]; + /* ltmpmap = mapdscr[k]->map ;*/ + for (i=0; i<= MAXLOCTEMP; i++) ltmpmap[i] = mapdscr[k]->map[i]; + + loctmp = mapdscr[k]->locsize ; + reftmp = mapdscr[k]->refsize ; + + }else{ + + for (k = 1; k<= MAXLOCTEMP; k++) ltmpmap[k] = TRUE; /* index negated */ + + /* fillword(ltmpmap + 1, (char) TRUE, MAXLOCTEMP) ; + + k = MAXLOCTEMP ; */ + + loctmp = 0 ; + reftmp = -1 ; + } + + for (k = 0; k <= MAXREFTEMP; k++) rtmpmap[ k ] = TRUE ; + + /* memset(rtmpmap, (char) TRUE, MAXREFTEMP + 1) ;*/ + + for (k = 1; k <= TEMPGUARD; k++) gtmpmap[ k ] = TRUE ; + + /* memset(gtmpmap + 1, (char) TRUE, TEMPGUARD) ; */ + + + firstlabel = MEMLIMIT; /* IN FACT, MEMLIMIT+1 */ + + m[0]=m[MEMLIMIT]=0; + /* for (k = 0; k <= MEMLIMIT; k++) m[k]=0; */ + /* memset( (char *)m, 0, (MEMLIMIT + 1)*sizeof(m[0]) ); */ +} + +void endunit(){ + address systsize; + pointprdsc prot; + tmpmapdscr *mapd; + + out() ; + /* with prototype[ unitt ] ^ do*/ + { prot = prototype[ unitt ] ; + if(unitt != MAINBLOCK) + if ((prot->kind == CLASS) || (prot->kind == LRECORD) + || (prot->kind == COROUTINE) || (prot->kind == PROCESS)) + /*with mapdscr[ unitt ]^ do*/ + { mapd = mapdscr[unitt] ; + mapd ->locsize = loctmp ; + mapd ->refsize = reftmp ; + } + switch(prot->kind) + { + case LRECORD : systsize = 0 ; + break ; + case CLASS : + case BLOCK : + case PREFBLOCK : systsize = 2*(APREF+APINT) ; + /* sl, dl, lsc, status sl */ + break ; + case LFUNCTION : + case LPROCEDURE : systsize = 3*APREF+2*APINT ; + /* sl, dl, rpcdl, lsc, status sl */ + /*cbc add rpcdl field for procedures and functions...*/ + break ; + case COROUTINE : systsize = 3*APREF+2*APINT ; + /* sl, dl, cl, lsc, status sl */ + break ; + case PROCESS : systsize = 5*APREF+2*APINT+2*(lastprot+1); + /* sl, dl, cl, chd, virtsc, lsc, statsl, display, display2 */ + break; + case HANDLER : systsize = 2*APREF+3*APINT ; + /* sl, dl, lsc, status sl, signal nr */ + break ; + } /* switch */ + prot->span = prot->appetite + loctmp; + prot->appetite = prot->span + (reftmp + 1) * APREF + systsize; + if (prot->appetite > MAXAPPT) + generror(OBJTOLG); + } /* with prototype */; + + /* clear dictionary of labels */ + for(systsize = firstlabel; systsize <= MEMLIMIT; systsize++) + m [ systsize ] = 0 ; + + /* memset(m+firstlabel, (char)0, (MEMLIMIT-firstlabel+1)*sizeof(address)); */ +} + + +static int globspace(ap) app ap;{ + + /* returns offset of the new temporary variable allocated in global area */ + /* indexed 1..maxcomtemp */ + + int n ; /* 0..tempguard;*/ + + n = 0 ; + switch(ap) + { + case 1 : while (!gtmpmap[ ++n ]) ; /*not guarded */ + if (n > MAXCOMTEMP) + generror(TMTEMP) ; + else + gtmpmap[ n ] = FALSE; + break ; + case 2 : do + { + n++ ; + n++ ; + } + while (!(gtmpmap[ n ] && gtmpmap[ n+1 ])) ; + if (n >= MAXCOMTEMP ) + generror(TMTEMP) ; + else + { + gtmpmap[ n ] = FALSE ; + gtmpmap[ n + 1 ] = FALSE ; + } + break ; + case 3 : do + n += 3 ; + while(!(gtmpmap[ n ] && gtmpmap[ n+1 ] && gtmpmap[ n+2 ])) ; + if (n > MAXCOMTEMP - 2) + generror(TMTEMP) ; + else + { + gtmpmap[ n ] = FALSE ; + gtmpmap[ n+1 ] = FALSE ; + gtmpmap[ n+2 ] = FALSE ; + } + break ; + } /* switch */; + + return(n) ; + } /* globspace */ + +static void globrelease(n,ap) address n; app ap;{ + + /* releases temporary variable with appetite ap and */ + /* address n within global area */ + + gtmpmap[ n ] = TRUE; + switch(ap) + { + case 1 : break ; + case 2 : gtmpmap[ n+1 ] = TRUE ; + break ; + case 3 : gtmpmap[ n+1 ] = TRUE ; + gtmpmap[ n+2 ] = TRUE ; + break ; + } /* switch */ +} + +int locspace (ap) +app ap ; + /* returns offset of the new temporary variable allocated within local area */ + /* indexed -maxloctemp .. -1 for non-reference or */ + /* 0 .. maxreftemp for reference values */ + +/* label 77; exit when successed */ +{ + int n ; + + if (ap == APVIRT) /* REFERENCE */ + {/* reference variable, indexed 0..maxreftemp */ + n = 0; + while ( !rtmpmap[ n ] && (n < MAXREFTEMP)) + ++n ; + if (rtmpmap[ n ]) + { + rtmpmap[ n ] = FALSE; + if (n > reftmp) + reftmp = n ; + } + else + generror(TMTEMP); + return (n * APREF); + } + else + { /* non-reference, indexed 1..maxloctemp */ + n = ap ; + while (n <= MAXLOCTEMP) + { if (ltmpmap[ n ]) + switch (ap) + { case 1 : ltmpmap[ n ] = FALSE ; + goto label77 ; + + + case 2 : if (ltmpmap[ n-1 ]) + { ltmpmap[ n ] = FALSE ; + ltmpmap[ n-1 ] = FALSE ; + goto label77 ; + } + break ; + + case 3 : if (ltmpmap[ n-1 ] && ltmpmap[ n-2 ]) + { ltmpmap[ n ] = FALSE ; + ltmpmap[ n-1 ] = FALSE ; + ltmpmap[ n-2 ] = FALSE ; + goto label77; + } + break ; + } /* switch */ + + /*dsw else*/ + + n += ap ; + } /* while */; + /* exit on failure */ + generror(TMTEMP) ; + + label77 : /* found */ + if (n > loctmp) + loctmp = n ; + return (-n) ; + } /* non-reference */ +} /*locspace */ + +void locrelease(n, ap) +address n; +app ap ; + +/* releases temporary variable of appetite ap allocated at address n */ +/* within local area */ + +{ + if (ap == APVIRT) /* reference variable */ + rtmpmap[ n / APREF ] = TRUE ; + else{ /* non-reference */ + /*cmb indices to ltmpmap negated cmb*/ + ltmpmap[ -n ] = TRUE ; + switch( ap ){ + case 1 : break ; + case 2 : ltmpmap[ -n - 1 ] = TRUE ; + break ; + case 3 : ltmpmap[ -n - 1 ] = TRUE ; + ltmpmap[ -n - 2 ] = TRUE ; + break ; + } + } +} /* locrelease */ + + + void force(n, m, o1, o2) + /* FORCES THE N-TH ARGUMENT TO BE OF M-MODE WITH PARAMETERS O1,O2 */ +argnr n ; +addrmode m ; +address o1, o2 ; + +{ args_struct * curr ; /* gsg for PASCAL WITH translation */ + curr = args + n ; /* WITH ARGS[ N ] DO BEGIN */ + + { curr->mode = m ; + curr->off1 = o1 ; + curr->off2 = o2 ; + } +} /* force */ +/**********************************************************/ + + + void forceconst(n) + /* FORCES THE N-TH ARGUMENT TO BE A CONSTANT */ +argnr n ; +{ args_struct * curr ; /* gsg for PASCAL WITH translation */ + + curr = args + n ; +/* WITH ARGS[ N ] DO BEGIN */ + { curr->mode = CONSTANT ; + curr->off1 = tuple[ qcurr ].arg[ n ] ; + } +} /* forceconst */ +/**********************************************************/ + + + + void forceprot(n) + /* FORCES THE N-TH ARGUMENT TO BE A PROTOTYPE NUMBER AS A CONSTANT */ +argnr n ; +{ args_struct * curr ; /* gsg for PASCAL WITH translation */ + + curr = args + n ; +/* WITH ARGS[ N ] DO BEGIN */ + { curr->mode = CONSTANT ; + curr->off1 = ipmem[ tuple[ qcurr ].arg[ n ] - 1 ] ; + } +} /* forceprot */ +/**********************************************************/ + + void argument(n) +/* PUTS THE DESCRIPTION OF THE N-TH ARGUMENT INTO ARGS[N] */ +/* FOR TEMPORARY VARIABLES WITH NO NEXT USE AND NOT LIVE */ +/* THE CORRESPONDING IS RELEASED */ + +argnr n ; +{ + address w1 ; /* ( + 1) WORD OF SYMBOL TABLE ITEM */ +/* qaddr0 nextuse ; */ + quadruple * curr1 ; /* gsg for PASCAL WITH translation */ + args_struct * curr2 ; /* gsg for PASCAL WITH translation */ + int ad ; + + curr1 = tuple + qcurr ; + curr2 = args + n ; +/* WITH TUPLE[ QCURR ] DO BEGIN */ + { + ad = curr1->arg[n] ; + notrick = ipmem[ ad ] ; + w1 = ipmem[ ++ad ] ; +/* WITH ARGS[ N ] DO BEGIN */ /* WITH TRICK.STI DO */ + { + switch (smode(notrick)) { +/*CBC Replaced global absolute addressing by dot access to MAIN block object */ +/*CBC VARGLOB : { MODE = GLOBAL ; OFF1 = ipmem[ W1-2 ] + MAIN } */ + + case VARGLOB : curr2->mode = DOTACCESS ; + curr2->off1 = ipmem[ w1-2 ] ; + curr2->off2 = MAINBLOCK ; + break ; + + case VARLOC : curr2->mode = LOCAL ; + curr2->off1 = ipmem[ w1 - 2 ] ; + break ; + +/*CBC Added new addressing mode for remote access through DISPLAY */ + case VARMID : curr2->mode = DOTACCESS ; + curr2->off1 = ipmem[ w1 - 2 ] ; + curr2->off2 = /* DISPLAY + */ ipmem[ w1 - 1 ] ; + break ; + + case TEMPVAR : if (slocal(notrick)) + { + curr2->mode = TEMPLOCAL ; + curr2->off1 = w1 ; + if ( (curr1->nxtuse[ n ]==0) && (! slive(notrick)) ) + locrelease(w1, sap(notrick)) ; + } /* slocal */ + else + { + curr2->mode = GLOBAL ; + curr2->off1 = w1 + temporary ; + if ((curr1->nxtuse[ n ]==0) && (! slive(notrick)) ) + globrelease(w1, sap(notrick)) ; + } /* else */ + break ; + + case INTCONST : curr2->mode = IMMEDIATE ; + curr2->off1 = w1 ; + break ; + + case REALCONST : curr2->mode = GLOBAL ; + curr2->off1 = realbase + w1 ; + break ; + + } /* switch */ + } /* WITH ARGS */ + } /* WITH TUPLE */ +} /* argument */ +/**********************************************************/ + + +static void result(n) argnr n;{ + + /* PUTS THE DESRIPTION OF N-TH ARGUMENT ( BEING DEFINED ) INTO ARGS[N]. */ + /* FOR THE TEMPORARY VALUE THE NEW SPACE IS ASSIGNED */ + + int w1 ; /* ( + 1) WORD OF SYMBOL TABLE ITEM */ + quadruple * curr1 ; /* gsg for PASCAL WITH translation */ + args_struct * curr2 ; /* gsg for PASCAL WITH translation */ + + /* int globspace(app) ; */ + + curr1 = tuple + qcurr ; + curr2 = args + n ; +/* WITH TUPLE[ QCURR ] DO BEGIN */ + { notrick = ipmem[ curr1->arg[ n ] ] ; + w1 = ipmem[ curr1->arg[ n ] + 1 ] ; +/* WITH ARGS[ N ] DO BEGIN */ /* WITH TRICK.STI DO */ + { + switch (smode(notrick)) { +/*CBC Replaced global absolute addressing by dot access to MAIN block object */ +/*CBC VARGLOB : { MODE = GLOBAL ; OFF1 = (ipmem)[ W1-2 ] + MAIN } */ + case VARGLOB : curr2->mode = DOTACCESS ; + curr2->off1 = ipmem[ w1-2 ] ; + curr2->off2 = MAINBLOCK ; + break ; + + case VARLOC : curr2->mode = LOCAL ; + curr2->off1 = ipmem[ w1-2 ] ; + break ; + +/*CBC Added new addressing mode for remote access through DISPLAY */ + case VARMID : curr2->mode = DOTACCESS ; + curr2->off1 = ipmem[ w1 - 2 ] ; + curr2->off2 = /* DISPLAY + */ ipmem[ w1 - 1 ] ; + break ; + + case TEMPVAR : /* ALLOCATE IT */ + if (slocal(notrick)) + { /* CANNOT USE GLOBAL TEMPORARIES */ + args[ n ].mode = TEMPLOCAL ; + curr2->off1 = locspace(sap(notrick)) ; + ipmem[ curr1->arg[ n ] + 1 ] = curr2->off1 ; + } + else + { /* GLOBAL AREA MAY BE USED */ + args[ n ].mode = GLOBAL ; + curr2->off1 = globspace(sap(notrick)) ; + ipmem[ curr1->arg[ n ] + 1 ] = curr2->off1 ; + curr2->off1 += temporary ; + } + break ; + + case INTCONST : + case REALCONST : /* IMPOSSIBLE */ + break ; + } /* switch */ + } /* WITH ARGS */ + } /* WITH TUPLE */ +} /* result */ + + + + void emit() +{ ieopc trick ; + argnr i ; + args_struct * curr ; /* gsg for PASCAL WITH translation */ + +#if (TALK > 31) + printf("on entrance to emit fre == %d\n", fre) ; +#endif + for (i = 1; i <= 3 ; i++) + trick.c2.eop.args[ i ] = (char)(args[ i ].mode) ; + trick.c2.eop.args[ 0 ] = (char)(tuple[ qcurr ].opcode) ; /* opcode */ + +#if SMALL + m[ fre ] = trick.c0.int1f ; + m[ fre + 1 ] = trick.c0.int2f ; + LOG(fre); + LOG(fre + 1); +#elif LARGE || HUGE + m[ fre ] = trick.c1.intf ; + LOG(fre); +#endif + +#if (TALK > 15) + printf(" emit %d\n", trick.c2.eop.args[0]); +#endif + + fre += APOPCODE ; + + for (i = 1; i <= 3; i++) /* WITH ARGS[ I ] DO */ + { curr = args + i ; /* gsg PASCAL WITH translation */ + + if (curr->mode != NOARGUMENT) + { + m[ fre ] = curr->off1 ; + fre += APINT ; + if ( (curr->mode == REMOTE) || /*cbc*/ (curr->mode == DOTACCESS) ) + { + m[ fre ] = curr->off2 ; + fre += APINT ; + } + } + } + if (fre >= firstlabel) + generror(MEMOVF) ; +#if (TALK > 31) + printf("on exit from emit fre == %d\n", fre) ; +#endif +} /* emit */ + + + void defaultargs() + /* PREPARES DEFAULT DESCRIPTIONS OF ARGUMENTS */ + +{ + int d ; + /* void result(argnr) ; */ + + for (d = 1; d <= 3; d++) + args[ d ].mode = NOARGUMENT ; + d = opdescr[tuple[qcurr].opcode ] ; /*!!*/ + if (d < 8) + /* NO RESULTS */ + switch (d) + { case 0 : break ; + + case 1 : forceconst(1) ; + break ; + + case 2 : argument(1) ; + break ; + + case 3 : argument(1) ; + forceconst(2) ; + break ; + + case 4 : argument(1) ; + forceconst(2) ; + forceconst(3) ; + break ; + + case 5 : argument(1) ; + argument(2) ; + break ; + + case 6 : argument(1) ; + argument(2) ; + forceconst(3) ; + break ; + + case 7 : argument(1) ; + argument(2) ; + argument(3) ; + break ; + + } /* switch */ + else + { /* AT LEAST ONE RESULT */ + if (d < 14) /* 1 RESULT */ + switch (d) + { case 8 : break ; + + case 9 : forceconst(2) ; + break ; + + case 10 : forceconst(2) ; + forceconst(3) ; + break ; + + case 11 : argument(2) ; + break ; + + case 12 : argument(2) ; + forceconst(3) ; + break ; + + case 13 : argument(2) ; + argument(3) ; + break ; + + } /* switch */ + + else { /* 2 RESULTS */ + if (d == 14) + if (tuple[qcurr].opcode >= 4) + argument(3) ; /*!!*/ + /* open , slopen */ + else forceconst(3) /* openrc , raise */ ; + result(2) ; + } /* 2 results */ + + result(1) ; + } /* at least one result */ + + } /* defaultargs */ + + + void esac() + /* PRODUCES A DESCRIPTION OF 'CASE' */ +{ + int n,trick; + int lab,labnr,othrlab; + int val,valuee; + address tofill ; + + /* WITH TUPLE[ QCURR ] DO */ + { + labnr = next() ; /* number of labels */ + othrlab = next() ; /* 'otherwise' label */ + deflabel(othrlab - 1) ;/* 'switch' description label */ + m[ fre ] = next() ; /* minimal value of 'switch' expression */ + tofill = fre + 1 ; /* to be filled with the number of branches */ + fre += 2 ; + val = 0 ; + for (n = 1; n <= labnr; n++) + { + trick = next() ; + valuee = iand(ishft(trick,-8),255) ; + lab = iand(trick,255) ; + while (val < valuee) + { + uselabel(othrlab) ; + fre ++ ; + val ++ ; + } /* while */ + uselabel(othrlab + lab) ; + fre ++ ; + val ++ ; + } /* for */ + m[ tofill ] = val ; + } /* with */ +} /* esac */ + + diff --git a/sources/gen/oxen.h b/sources/gen/oxen.h new file mode 100644 index 0000000..4b3aa20 --- /dev/null +++ b/sources/gen/oxen.h @@ -0,0 +1,110 @@ +/* Loglan82 Compiler&Interpreter + Copyright (C) 1993 Institute of Informatics, University of Warsaw + Copyright (C) 1993, 1994 LITA, Pau + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + +======================================================================= +*/ + +/**********************************************************/ +/* auxiliary functions for GEN */ +/* Written according to NEW m & ipmem declarations */ +/* Last modified : May-08-89 */ +/**********************************************************/ + +#ifndef NO_PROTOTYPES + +int next(void); + + /* M^ [ FIRSTLABEL..MEMLIMIT ] IS USED FOR HANDLING LABELS */ + /* FOR LABEL L : */ + /* M^ [ MEMLIMIT-L+1 ] < 0 */ + /* --> = - VALUE OF ALREADY DEFINED LABEL */ + /* M^ [ MEMLIMIT-L+1 ] > 0 */ + /* --> = HEAD OF UNSATISFIED REFERENCES LIST */ + + + +/**********************************************************/ + +void deflabel(int); +void begunit(int); +void uselabel(address); +void endunit(void); + +int locspace(app); +void locrelease(address,app); + + /* returns offset of the new temporary variable allocated in global area */ + /* indexed 1..maxcomtemp */ + + /* returns offset of the new temporary variable allocated within local area */ + /* indexed -maxloctemp .. -1 for non-reference or */ + /* 0 .. maxreftemp for reference values */ + +/* extern void locrelease(address n, app ap); */ +/* releases temporary variable of appetite ap allocated at address n */ +/* within local area */ + + +void force(argnr,addrmode,address,address); +void forceconst(argnr); +void forceprot(argnr); +void argument(argnr); + + /* void force(argnr n, addrmode m, address o1, address o2); */ + /* forces the n-th argument to be of m-mode with parameters o1,o2 */ + + /* void forceconst(argnr n) ;*/ + /* forces the n-th argument to be a constant */ + + /* extern void forceprot(argnr n); */ + /* forces the n-th argument to be a prototype number as a constant */ + + /* extern void argument(argnr n); */ +/* puts the description of the n-th argument into args[n] */ +/* for temporary variables with no next use and not live */ +/* the corresponding is released */ + + /* static void result(argnr n); */ + /* puts the desription of n-th argument ( being defined ) into args[n]. */ + /* for the temporary value the new space is assigned */ + +void emit(void); + +void defaultargs(void); + /* prepares default descriptions of arguments */ + +void esac(void); + /* produces a description of 'case' */ + + +#else + + +int next(); +void deflabel(); +void begunit(); +void uselabel(); +void endunit(); +int locspace(); +void locrelease(); +void force(); +void forceconst(); +void forceprot(); +void argument(); +void emit(); +void defaultargs(); +void esac(); + +#endif + diff --git a/sources/gen/oxen.o b/sources/gen/oxen.o new file mode 100644 index 0000000000000000000000000000000000000000..21e76bbdb087daffbd7c1af9cf725a27a7ffb26f GIT binary patch literal 8747 zcmcIp4RBP|6@I(>fF(T0B2l5kUlFv3C^~e6N}ZsrAR`csLDViu*eo%apLMf4<;Mi* ziuio9<2u@^Q`!#%$Sx{R$SeF=ic+)zTG56 zX4;+H{mwo2-1B$Oz3;xwD3_wtU8>k0pIegNQ4(wP)A4?9^((FpMVS-u>Vcf$&n+B5 zgPn5<6q6=PL)QmBBvisXuqN%L-=dVA9MDkKHqIF z{f_e57+n(~mgHDwQFA9knS0k#pdvo4+VFdAC-g%eu^@??utbL2sMsNVtjYWrAzo9j zK;ffvT1H0Uk-1-^8vaat<4jj)q*yZBq({ z;ZWY6GvA^0XG_MF~)Xs6{Rn7^6^__4II~{23beq!$%bzZiXZszB(nTf>u`=5aDH)fd z_w|s^N)LT0Mqr?@o~x@<)wz6LPO;W68~?G8jIM#v_{K^lIztk!=p;$FqdrM^qNB{~ zgdfE!Py!k0f}W&oJGzu-IoVsjb00ZWS!tJ)k*rja-G3&N+kj!T-DuCFQJ-3pTQ8yG z!zE!hG7tTcP;TB;=zFQZw4{GM_l5s(MDKO=Cc+xFuQ{2A1VA61Z00CtA_S_ph}ZK& zuoXS5F-Pp2#rjeGgzJP6(GnHoj9AX~t{(P6VEaaIek)GEvJE3s@1GN=KvG!N{kiQO zIR(qtIl{aQHU^(>J*qfjshp1|lZjBj+?ec-JbyR~*nsh@yZoW2;2DUm7sa!#=#=zf zq@Kl-@vNu(p;2I@|0KE43!CvpqQ;eIxjDrW6=;4`)J=-L_q`3C)C3tuakhm2yk96i z=@kysQW5Nxn4Ij4IldnYtSG3ji>3X)53(QZB>PW%B@a_shPDuNIqW+%_fQ#$Px>za zYew9k^EeZ5wR4W;4eGz}IEwG5ic+Ggc~LTHzGf+si2SS*{+-E6|HP?Mkb$D}`sXy( zvrQO-JyRtu7&FHd)Fq1^M&P3!Pz8=7%kXO`h3NH#dN8**=A#~>H<(Q}$6RZZf^eSc zGJ{xA#av)X4Lx4Wr3l048yms%2Rs zZHr?L7V=})@@0dPEg!}m*pl+8YnGvsZaphj3OpPGeXc(JaQb(4*`|MKlfnu`1{3rI zsz|RY9wPyV{ql#VVH^`E|4R$`PkSBHDF0j1Um|cBM6t{1v-W@-E;=9L`*DWnl_=e- zhAk=~0xju32vupLSfhxV?^%|SyBKj!?AazJ!kjsuod=lX3N%qh!0QU+ z($C>)BnGe^FMVOHN9l4IHMz6z>%C@KL5C5@7Ht7K4?8q9c7-UxgXgB{eFxLi5*04J z_h8oL*ca(NA`uWf`<{c%+hqYQ*91B~rekXGVQKMX5sDhSp1Mylj??$j^n=<5N^woFA%ZbgldjU(e}!nsq_;&Qp&* zDD0voll2%Kyysu0(H>R&2vSsnshRRpp?4cK8T}?MTyZ1}%J_0sKMW}Y=uK~jLMwNK z!`md&#Wn}dhzI9|+7y+WG44_A&0tQlT^Rhl7O#=^xI8acSL2-*ublMGoAGp(74C-# z`klpt9Q0Bmj?vqZ%UVP6$au7(>=9qypE2JQIz_$*AG{*bkE*^${8=esWswVeMHatj z7NefJhV!* zDzq>fPHW|Pv|hCIQMl!pvB8zvB)3X>FO5)NoUdw{T%~@K>?1j=SaN4U2gYx;$FGs& zxI@m8lv#)I+4lG}Ntw$F4q$w=J)XDcpZ-!TgE<}JY3909AKByYuzn?dH}X#(^`a)7gk47;~oHx^}Q%|PzdA%F=tJI@R^&9^F zWmTyy=;Bx9RJ&mFZPhw)4BVRFs5)N$;CQnhI29L%hP%g~q9NXASi6P(feyDBPR(KU zxbbCiBP-wco*ww5d>>vr0=Vd<7WzNgI>wxBhXg08QlCj5D{9!+6*9m&(P)o5y99c%wG+}On+ zGZ2qq?bpnwU*JgYRUSXYA>4iEHoYj5`Qz0_jIMf{XnvR2sj&P0x2J~i3n9jFQdljW2|7D$T-55XWi3G(|^gjm?l4;b7C6qNM#<&%)=RV1Jm80{SKLx4w|ma_!FNX2+~)H{d_-Y@?ijb?E$8%u(+L|@h3hz znO}$cNI3XUfNl&1ud5BVwS=3RLk(9ewY9a4tudQX8&ql=LhGCB*M*vu+VxG5_NYZi zLP~98s5KOcv_+KK7NvGweLGmO_7F>~3pK`Co1#i>Q@ACB@o=Oq+7{guCL!>}fD{Nv zLhGA0LP>qNp*;v~&C!-HIw0DDAeCAONVEnTEh5y~AeFSmps~5WJxX@qT65dF_HccW zyaX8uHHUENqcBpwE7>mH6Xe``}aWNwGLp0VBYK2H^ zTQt%XydOfLmT+67KC+4Yt#6k3h=kf>&5#PUP%4nidUU0ows1p8gd1wFN1j_l8>7m9 E0L`Y4DgXcg literal 0 HcmV?d00001 diff --git a/sources/gen/rm.bat b/sources/gen/rm.bat new file mode 100644 index 0000000..25b506f --- /dev/null +++ b/sources/gen/rm.bat @@ -0,0 +1,9 @@ +@echo off +:begin +if "%1" == "" goto :end +echo %1 +del %1 +shift +goto :begin +:end + diff --git a/sources/int/cint.c b/sources/int/cint.c new file mode 100644 index 0000000..8b535a0 --- /dev/null +++ b/sources/int/cint.c @@ -0,0 +1,283 @@ +/* Loglan82 Compiler&Interpreter + Copyright (C) 1993 Institute of Informatics, University of Warsaw + Copyright (C) 1993, 1994 LITA, Pau + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + contacts: Andrzej.Salwicki@univ-pau.fr + +or Andrzej Salwicki + LITA Departement d'Informatique + Universite de Pau + Avenue de l'Universite + 64000 Pau FRANCE + tel. ++33 59923154 fax. ++33 59841696 + +======================================================================= +*/ + +#include "depend.h" +#include "genint.h" +#include "int.h" +#include "process.h" +#include "intproto.h" + +#if DLINK +#include "dlink.h" +#elif TCPIP +#include "tcpip.h" +#endif + + +/* IIUW LOGLAN-82 Executor */ +/* Written in PASCAL by P.Gburzynski and A.Litwiniuk. */ +/* Modified by J.Findeisen, T.Przytycka, D.Szczepanska, B.Ciesielski. */ +/* Hand translated to C by B. Ciesielski. */ + + +#ifndef NO_PROTOTYPES +static void load(char *); +static void initiate(int,char **); +int main(int,char **); +#else +static void load(); +static void initiate(); +int main(); +#endif + + +/* Macro to decode addressing modes : */ +#define getargument(a, argnr) \ + switch (eop->args[ argnr ]) \ + { \ + case GLOBAL : a = M[ ic++ ]; break; \ + case LOCAL : a = c1+M[ ic++ ]; break; \ + case TEMPLOCAL : a = c2+M[ ic++ ]; break; \ + case REMOTE : a = M[ M[ ic+1 ] ]+M[ ic ]; ic+=2; break;\ + case INDIRECT : a = M[ M[ ic++ ] ]; break;\ + case IMMEDIATE : a = ic++; break;\ + case CONSTANT : a = M[ ic++ ]; break;\ + case DOTACCESS : a = M[ display+M[ ic+1 ] ]+M[ ic ]; ic += 2; break;\ + case NOARGUMENT : return; \ + } + + +static void load(_filename) /* Load code and prototypes from file */ + char *_filename; +{ + FILE *fp; + char *cp; + word n, left; + char filename[100]; /* should suffice on all systems */ + + strcpy( filename, _filename ); + + M = mallocate(memorysize+1); /* allocate main memory array */ + if (M == NULL) abend("Memory size too large (use /m option)\n"); + + addext(filename, ".ccd"); + if ((fp = fopen(filename, BINARYREAD)) == NULL) + abend("Cannot open .ccd file\n"); + + ic = 0; /* read static data and code */ + left = memorysize+1; /* from .ccd file */ + do + { + if (left == 0) abend("Memory size too small (use /m option)\n"); + n = min(IOBLOCK/sizeof(word), left); + n = fread((char *) &M[ ic ], sizeof(word), (int) n, fp); + ic += n; + left -= n; + } while (n != 0); /* now ic = number of words read */ + + fclose(fp); + /* Get various addresses passed by GENERATOR */ + ipradr = M[ ic-5 ]; /* primitive type desctriptions */ + temporary = M[ ic-4 ]; /* global temporary variables */ + strings = M[ ic-3 ]; /* string constants */ + lastprot = M[ ic-2 ]; /* last prototype number */ + freem = M[ ic-1 ]; /* first free word in memory */ + + /* Read prototypes from .pcd file */ + addext(filename, ".pcd"); + if ((fp = fopen(filename, BINARYREAD)) == NULL) + abend("Cannot open .pcd file\n"); + for (n = MAINBLOCK; n <= lastprot; n++ ) + { + cp = ballocate(sizeof(protdescr)); + if (cp == NULL) abend("Memory size too large (use /m option)\n"); + prototype[ n ] = (protdescr *) cp; + if (fread(cp, sizeof(protdescr), 1, fp) != 1) + abend("Cannot read .pcd file\n"); + } + fclose(fp); + + /* Open trace file */ + if (debug) + { + addext(filename, ".trd"); + if ((tracefile = fopen(filename, "w")) == NULL) + abend("Cannot open .trd file\n"); + } +} /* end load */ + + +static void initiate(argc, argv) /* Establish configuration parameters */ +int argc; +char **argv; +{ + long m; + int c; + char *filename=NULL; + + fprintf(stderr,"\n LOGLAN-82 Concurrent Executor Version 4.51\n"); + fprintf(stderr," January 21, 1993\n"); + fprintf(stderr, + " (C) Copyright Institute of Informatics University of Warsaw\n"); + fprintf(stderr," (C) Copyleft LITA Universite de Pau\n"); +#if DLINK + fprintf(stderr," D-LINK version 3.21\n\n"); +#elif TCPIP + fprintf(stderr," TCPIP version 0.9\n\n"); +#else + fprintf(stderr,"\n"); +#endif + fflush(stderr); + +#if DLINK + ournode = net_logon(msginterrupt); + if (ournode >= 0) /* network driver installed */ + network = TRUE; + else /* network driver not installed */ + { + network = FALSE; + ournode = 0; /* only node 0 is available */ + } +#else + network = FALSE; + ournode = 0; +#endif + argc--,argv++; + + for( ; argc>0; argc--,argv++ ){ + if( filename != NULL ) usage(); + if( (*argv)[0]=='-' ) + switch( (*argv)[1] ){ + + case 'i' : + infmode = TRUE; + break; + + case 'd' : + debug = TRUE; + break; + + case 'r' : +#if DLINK + if (!network) + abend("D-Link Network Driver Version 3.21 must be installed\n"); + argv++,argc--; + if( argc==0 ) usage(); + if( sscanf( *argv, "%d", &c ) != 1 ) usage(); + if( c < 0 || c >= 255 || c == ournode ) + abend("Invalid console node number\n"); + console = c; + remote = TRUE; +#elif TCPIP + argv++,argc--; + if( argc==0 ) usage(); + if( sscanf( *argv, "%d", &c ) != 1 ) usage(); + if( c < 0 || c >= 255 ) + abend("Invalid my console node number\n"); + ournode = console = c; + argv++,argc--; + if( argc==0 ) usage(); + /* here we test if we are remote */ + /* master will have number of slaves to wait for */ + /* slave - internet full address of master */ + if( strchr(*argv,':') ){ + /* internet address of master nn.nn.nn.nn:port */ + remote = TRUE; + tcpip_connect_to_master( *argv ); + }else{ + /* # of slaves to wait for */ + if( sscanf( *argv, "%d", &c ) != 1 ) usage(); + if( c < 0 || c >= 254 ) usage(); + tcpip_wait_for_slaves( c ); + remote = FALSE; + } + puts(""); + network = TRUE; +#else + usage(); +#endif + break; + + case 'm' : + argv++,argc--; + if( argc==0 ) usage(); + if (sscanf( *argv, "%ld", &m ) != 1) usage(); + if (m <= 0 || m > MAXMEMSIZE) + abend("Invalid memory size specified\n"); + memorysize = m; + break; + + default : + usage(); + break; + + } /* end of switch */ + else{ /* this is not option */ + if( filename != NULL ) usage(); + filename = *argv ; + } + } /* end of for */ + + if( filename!=NULL ) + load(filename); /* load code and prototypes */ + else + usage(); +} + + +void decode(){ + extopcode *eop; + eop = (extopcode *)(M+ic); /* pointer to extended opcode in M */ + lastic = ic; /* save ic for possible redecoding */ + ic += APOPCODE; + opcode = ((int) eop->opcode ) & 0xFF ; + getargument(a1, 0); + getargument(a2, 1); + getargument(a3, 2); +} + + +int main(argc, argv) +int argc; +char **argv; +{ + initiate(argc, argv); /* initialize executor */ + runsys(); /* initialize running system */ + init_scheduler(); + setjmp(contenv); /* set label for continue long jump */ + while (TRUE) /* repeat until exit() is called */ + { + schedule(); /* reschedule current process */ + decode(); /* fetch instruction */ + execute(); /* and execute it */ + } + return 0; +} /* end main */ + diff --git a/sources/int/compact.c b/sources/int/compact.c new file mode 100644 index 0000000..5b8126e --- /dev/null +++ b/sources/int/compact.c @@ -0,0 +1,763 @@ +/* Loglan82 Compiler&Interpreter + Copyright (C) 1993 Institute of Informatics, University of Warsaw + Copyright (C) 1993, 1994 LITA, Pau + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + contacts: Andrzej.Salwicki@univ-pau.fr + +or Andrzej Salwicki + LITA Departement d'Informatique + Universite de Pau + Avenue de l'Universite + 64000 Pau FRANCE + tel. ++33 59923154 fax. ++33 59841696 + +======================================================================= +*/ + +#include "depend.h" +#include "genint.h" +#include "int.h" +#include "process.h" +#include "intproto.h" + +#include + + +#ifndef NO_PROTOTYPES + +static word get_pointer(word,word); +static void phase1(void); +static void phase2(void); +static void phase2a(void); +static void phase3(void); +static void phase4(void); +static void phase5(void); +static void phase6(void); +static void curtain(void); +static void heap_walk(word); +static void nonefy(virtaddr *); +static void relocate(virtaddr *); +static void traverse(word,void (*)(virtaddr *)); +static void what_we_have(virtaddr *); + +#else + +static word get_pointer(); +static void phase1(); +static void phase2(); +static void phase2a(); +static void phase3(); +static void phase4(); +static void phase5(); +static void phase6(); +static void curtain(); +static void heap_walk(); +static void nonefy(); +static void relocate(); +static void traverse(); +static void what_we_have(); + +#endif + + +#ifdef CDBG +FILE *ff; +static void what_we_have(va) virtaddr *va; { + fprintf(ff," pointer offset %d:|va=%d,va_m=%d,M[va]=%d,M[va+1]=%d|\n", + ((word*)va)-M,va->addr,va->mark,M[va->addr],M[va->addr+1]); + fflush(ff); +} +#endif + + +/* + * Memory compactifier - a play in 6 acts + */ + +static word nleng; /* free memory before compact. */ +static word curah; /* to preserve ah of current object */ + +/* One of the actions for traverse: see below; + * converts none to absolute none, i.e. (0, 0) + */ + + +static void nonefy(va) virtaddr *va; { + +#ifdef CDBG + if(va->addr==0 && va->mark!=0){ + fprintf(ff,"nonefy:|va=%d,va_m=%d,M[va]=%d,M[va+1]=%d|\n", + va->addr,va->mark,M[va->addr],M[va->addr+1]); + fflush(ff); + } +#endif + +#ifndef OBJECTADDR + if(!isprocess(va)) +#else + assert( va->mark >= 0 ); +/* assert( va->mark <= M[ va->addr+1 ] );*/ +#endif +#ifdef CDBG + fprintf(ff,"nonefy:|va=%d,va_mark=%d,am=%d,mark=%d|\n", + va->addr,va->mark,M[va->addr],M[va->addr+1]); + fflush(ff); +#endif + if( va->mark != M[ va->addr+1 ] ) /* if NONE */ + { + +#ifdef CDBG + fprintf(ff," set to NONE\n"); fflush(ff); +#endif + va->addr = 0; + va->mark = 0; + } + assert( va->addr != 1 ); +} /* end nonefy */ + + +/* One of the actions for traverse; update the virtual address to + * correspond to its dictionary entry after compactification. + */ + +static void relocate(va) virtaddr *va; { +#ifndef OBJECTADDR + if(!isprocess(va)){ +#endif + va->addr = M[ va->addr+1 ]; /* new ah (after compression) */ + va->mark = 0; /* clear mark */ +#ifndef OBJECTADDR + } +#endif +} /* end relocate */ + + +/* Traverse all the virtual variables of object am and perform action + * on each of them. Skip references to processes (see nonefy() and + * relocate()). + */ + +static void traverse(am, action) + word am; +#ifndef NO_PROTOTYPES + void (*action)(virtaddr *); +#else + void (*action)(); +#endif +{ + word t1, t2, t3, length; + protdescr *ptr; + + t1 = am+M[ am ]; /* LWA+1 of the object */ + length = M[ am+PROTNUM ]; /* prototype number */ + if (length == AINT || length == AREAL || length == AVIRT || + length == FILEOBJECT +#ifdef OBJECTADDR + || length == APROCESS +#endif + ) + { + if (length == AVIRT) /* ARRAYOF */ + for (t2 = am+3; t2 < t1; t2 += 2) + (*action)((virtaddr *)(M+t2)); + } + else /* neither an array nor a file */ + { + ptr = prototype [ length ]; + switch (ptr->kind) /* compute the number of the system */ + /* virtual variables */ + { + case RECORD : length = 0; t3 = 0; break; + case COROUTINE : length = 3; t3 = CL; break; + case PROCESS : length = 5; t3 = disp2off; break; + case FUNCTION : + case PROCEDURE : length = 2; t3 = RPCDL+1; break; /* PS */ + case HANDLER : length = 2; t3 = SIGNR; break; + default : length = 2; t3 = STATSL; break; + } + + /* action for system reference variables */ + for (t2 = length; t2 >= 1; t2-- ) + (*action)((virtaddr *)(M+t1+offset[ t2 ])); + + /* action for temporary reference variables */ + t1 = am+M[ am ]+t3; + for (t2 = am+ptr->span; t2 < t1; t2 += 2) + (*action)((virtaddr *)(M+t2)); + + /* action for user reference variables */ + t1 = ptr->reflist; + for (t2 = t1+ptr->lthreflist-1; t2 >= t1; t2-- ) + (*action)((virtaddr *)(M+am+M[ t2 ])); + } +} /* end traverse */ + + +/* Mark killed objects by substituting prototype number by a special value. + * This way we will be able to tell apart the killed objects without + * recalling to the dictionary or to the list of killed objects. + */ + +static void phase1() +{ + word t1, t2, t3, phead; + + nleng = thisp->lastitem-thisp->lastused-1; /* free memory before comp. */ + M[ 1 ] = 0; /* for proper update of none */ + phead = thisp->prochead; /* head of current process */ + M[ phead+M[ phead ]+SL ] = 0; /* make SL of head look like none */ + t1 = thisp->headk2; /* flag killed objects */ + while (t1 != 0) /* special list for appetite=2 */ + { + t2 = t1+SHORTLINK; + t1 = M[ t2 ]; + M[ t2 ] = SKILLED; /* flag object killed */ + } + t1 = thisp->headk; /* now other killed objects */ + while (t1 != thisp->lower) + { + t2 = t1; + while (t2 != 0) + { + t3 = t2+SHORTLINK; + t2 = M[ t3 ]; + M[ t3 ] = SKILLED; /* flag object killed */ + } + t1 = M[ t1+LONGLINK ]; /* goto other size list */ + } +} /* end phase1 */ + + +/* Step thru the memory area containing objects. For each object not being + * killed detect all its virtual variables pointing to none and convert + * them to absolute none i.e. (0, 0). + */ + +static void phase2() +{ + word t1; + + nonefy( &(thisp->procref ) ); + + t1 = thisp->lower+1; /* FWA of object area */ + while (t1 <= thisp->lastused) + { + +#ifdef CDBG + fprintf(ff,"OBJECT am=%d,SIZE=%d,TYPE=%d\n",t1,M[t1],M[t1+1]); + fflush(ff); + if (M[ t1+1 ] != SKILLED) traverse(t1,what_we_have); +#endif + + if (M[ t1+1 ] != SKILLED) /* an active object */ + traverse(t1, nonefy); + t1 += M[ t1 ]; /* next object address */ + } +} /* end phase2 */ + + +/* garbage collection */ + +/* Find x-th pointer in am. + * Skip references to processes. + */ + +static word get_pointer(am,x) word am,x; { + + word t1, t2, t3, length, va; + protdescr *ptr; + + t1 = am+M[ am ]; /* LWA+1 of the object */ + length = M[ am+PROTNUM ]; /* prototype number */ + +#ifdef CDBG + fprintf(ff,"|get_pointer(am=%d,x=%d)lenght=%d|",am,x,length); + fflush(ff); +#endif + + if (length == AINT || length == AREAL || length == AVIRT || + length == FILEOBJECT +#ifdef OBJECTADDR + || length == APROCESS +#endif + ) + { + if(length == AVIRT) /* ARRAYOF */ + for(t2 = am+3; t2 < t1; t2 += 2){ +#ifndef OBJECTADDR + if(isprocess((virtaddr *)(M+t2))) continue; +#endif + if(M[t2]==0){ assert( M[t2+1]==0 ); continue; } +#ifdef CDBG + fprintf(ff,"ARR"); + fflush(ff); +#endif + if(x==0){ +#ifdef CDBG + fprintf(ff,"=%d|\n",t2); + fflush(ff); +#endif + return t2; + } + x--; + } + } + else /* neither an array nor a file */ + { + ptr = prototype [ length ]; + switch (ptr->kind) /* compute the number of the system */ + /* virtual variables */ + { + case RECORD : length = 0; t3 = 0; break; + case COROUTINE : length = 3; t3 = CL; break; + case PROCESS : length = 5; t3 = disp2off; break; + case FUNCTION : + case PROCEDURE : length = 2; t3 = RPCDL+1; break; /* PS */ + case HANDLER : length = 2; t3 = SIGNR; break; + default : length = 2; t3 = STATSL; break; + } + + /* system reference variables */ + for(t2 = length; t2 >= 1; t2-- ){ + va=t1+offset[ t2 ]; +#ifndef OBJECTADDR + if(isprocess((virtaddr *)(M+va))) continue; +#endif + if(M[va]==0){ assert( M[va+1]==0 ); continue; } + if(x==0){ +#ifdef CDBG + fprintf(ff,"=%d|\n",va); + fflush(ff); +#endif + return va; + } + x--; + } + + /* temporary reference variables */ + t1 = am+M[ am ]+t3; + for(t2 = am+ptr->span; t2 < t1; t2 += 2){ +#ifndef OBJECTADDR + if(isprocess((virtaddr *)(M+t2))) continue; +#endif + if(M[t2]==0){ assert( M[t2+1]==0 ); continue; } + if(x==0){ +#ifdef CDBG + fprintf(ff,"=%d|\n",t2); + fflush(ff); +#endif + return t2; + } + x--; + } + + /* user reference variables */ + t1 = ptr->reflist; + for(t2 = t1+ptr->lthreflist-1; t2 >= t1; t2-- ){ + va=am+M[ t2 ]; +#ifndef OBJECTADDR + if(isprocess((virtaddr *)(M+va))) continue; +#endif + if(M[va]==0){ assert( M[va+1]==0 ); continue; } + if(x==0){ +#ifdef CDBG + fprintf(ff,"=%d|\n",va); + fflush(ff); +#endif + return va; + } + x--; + } + } + +#ifdef CDBG + fprintf(ff,"=-1|\n"); + fflush(ff); +#endif + + return -1; +} + +static void heap_walk(curr_ah) word curr_ah;{ + word aux,prev_ah=1; /* 1 is special value not expected in anyone virtaddr */ + word level=0; + +#ifdef CDBG + fprintf(ff,"|prev_ah=%d|\n",prev_ah); + fflush(ff); +#endif + + for(;;){ + word am=get_pointer(M[curr_ah],M[curr_ah+1]); + M[curr_ah+1]++; + if(am >= 0){ + if(M[ M[am] +1] >0){ +#ifdef CDBG + fprintf(ff,"Object %d->%d invited.\n",M[am],M[M[am]]); + fflush(ff); +#endif + continue; + } + + /*** go ahead ***/ + level++; + aux=M[am]; + M[am]=prev_ah; + prev_ah=curr_ah; + curr_ah=aux; +#ifdef CDBG + fprintf(ff,"|curr_ah set to %d|\n",curr_ah); + fflush(ff); +#endif + continue; + } + if(prev_ah > 1){ + /*** go back ***/ +#ifdef CDBG + fprintf(ff,"going back (prev_ah=%d)(lvl=%d)\n",prev_ah,level); + fflush(ff); +#endif + level--; + aux=curr_ah; + curr_ah=prev_ah; + am=get_pointer(M[prev_ah],M[prev_ah+1]-1); + prev_ah=M[am]; +#ifdef CDBG + if(level==0) + fprintf(ff,"|prev_ah set to %d,next set to %d|\n",prev_ah,aux); + fflush(ff); +#endif + M[am]=aux; + continue; + } + assert( prev_ah==1 ); + assert( level == 0 ); + break; /*** now all 'invited' objects have its mark >0 ***/ + } +} + +static void phase2a() +{ + word t1,c1_ah; + + /*** generation number already is not needed so we reset it ***/ + + t1 = thisp->upper-1; + while(t1 >= thisp->lastitem){ + if( M[t1] == c1 ) c1_ah=t1; + M[ t1+1 ] = 0; + t1-=2; + } + +#ifdef CDBG + fprintf(ff,"first phase of walk |from=%d,to=%d,procah=%d|\n", + thisp->lastitem, + thisp->upper-1, + thisp->procref.addr); + fflush(ff); +#endif + + heap_walk(thisp->procref.addr); + +#ifdef CDBG + fprintf(ff,"second phase of walk c1_ah=%d,c1=%d\n",c1_ah,c1); + fflush(ff); +#endif + + heap_walk(c1_ah); + + if( thisp->blck1 != 0 ) + heap_walk(thisp->blck1); + + /*** Mark objects not traversed like SKILLED ***/ + + t1 = thisp->freeitem; /* head of free item list */ + while (t1 != 0) + { + word t2; + t2 = M[ t1 ]; + M[ t1 ]= 0-1; /* mark not to set object SKILLED */ + t1 = t2; /* next free item */ + } + + t1 = thisp->upper-1; /* last dictionary item pointer */ + while (t1 >= thisp->lastitem) + { + if (M[ t1+1 ] == 0 ){ /* entry not traversed - so killed */ + +#ifdef CDBG + fprintf(ff,"MARKING dict. entry %d -> %d like SKILLED\n",t1,M[t1]); + fflush(ff); +#endif + + M[ t1+1 ] = MAXMARKER; + if( M[ t1 ] > 0 ) M [ M[ t1 ] +1 ] = SKILLED; + /* mark SKILLED if not set yet */ + } + t1 -= 2; + } +} /* end phase2a */ + + + +/* For each free dictionary item set its mark to unusable status. + */ + +static void phase3() +{ + word t1; + + t1 = thisp->freeitem; /* head of free item list */ + while (t1 != 0) + { + M[ t1+1 ] = MAXMARKER; /* flag item unusable */ + t1 = M[ t1 ]; /* next free item */ + } +} /* end phase3 */ + + +/* Step thru the dictionary and virtually remove all unusable items. + * For each active item (after phase3 we have only active and unusable + * items) its mark is set to the new address of this item (after + * forthcomming compression). Moreover the contents of locations am and + * (old) ah are interchanged. + */ + +static void phase4() +{ + word t1, t2, t3; + + t1 = thisp->upper-1; /* last dictionary item pointer */ + t2 = t1; /* initialize new address */ + while (t1 >= thisp->lastitem) + { + if (M[ t1+1 ] == MAXMARKER) /* entry killed - don't decrement t2 */ + M[ t1+1 ] = 0; + else + { + M[ t1+1 ] = t2; /* store new ah */; + t2 -= 2; + t3 = M[ t1 ]; /* am */ + M[ t1 ] = M[ t3 ]; /* save (am) in (old ah) */ + M[ t3 ] = t1; /* move old ah to (am) */ + } + t1 -= 2; + } +} /* end phase4 */ + + +/* The memory area of objects is traversed once again. Now the killed + * objects are removed and the remaining ones compressed. For each active + * object its virtual variables are relocated, their marks cleared, their + * ah's set to the proper new values. The contents of locations am and ah + * are interchanged back. + */ + +static void phase5() +{ + word t1, t2, t3, t4, t5; + + t2 = t1 = thisp->lower+1; + while (t1 <= thisp->lastused) /* traverse object area */ + { + t5 = M[ t1 ]; /* old ah saved by phase4 */ + if (M[ t1+1 ] == SKILLED){ /* ignore this object */ +#ifdef CDBG + fprintf(ff,"OBJECT am=%d,SIZE=%d,TYPE=%d\n",t1,M[t1],M[t1+1]); + fflush(ff); +#endif + t1 += t5; /* t5=appetite in this case */ + } + else + { +#ifdef CDBG + fprintf(ff,"OBJECT am=%d,SIZE=%d,TYPE=%d\n",t1,M[t1],M[t1+1]); + fflush(ff); +#endif + t3 = M[ t5 ]; /* appetite saved by phase4 */ + M[ t2 ] = t3; /* send it to the new am */ + for (t4 = 1; t4 < t3; t4++ ) /* copy the object into new am */ + M[ t2+t4 ] = M[ t1+t4 ]; +#ifdef CDBG + traverse(t2,what_we_have); +#endif + + /* Update global absolute pointer to current object : */ + if (t1 == c1) /* locate am of current */ + { + c1 = t2; + curah = M[ t5+1 ]; /* new ah of current */ + } + if (t1 == M[ temporary ]) + M[ temporary ] = t2; + + M[ t5 ] = t2; /* make (ah) looking ok */ + traverse(t2, relocate); /* relocate virtual variables */ +#ifdef CDBG + fprintf(ff," --> am=%d,SIZE=%d,TYPE=%d\n",t2,M[t2],M[t2+1]); + fflush(ff); + traverse(t2,what_we_have); +#endif + t1 += t3; + t2 += t3; + } + } + thisp->lastused = t2-1; + + + /* Update global absolute pointers to objects : */ + + relocate(&(thisp->procref )); + + { + virtaddr v; + v.addr=thisp->blck1; + v.mark=0; + relocate(&v); + thisp->blck1=v.addr; + } + +} /* end phase5 */ + + +/* The dictionary is compressed. The unusable entries are moved out and + * the remaining ones are moved up to the positions indicated by their + * marks. + * If pointers to processes are implemented as objects we have to rebuild + * has table of these pointers too. + */ + +static void phase6() +{ + word t1, t2, t3; + +#ifdef OBJECTADDR + hash_create(thisp,thisp->hash_size); +#endif + + t1 = thisp->upper+1; + for (t2 = t1-2; t2 >= thisp->lastitem; t2 -= 2) /* compress dictionary */ + { + t3 = M[ t2+1 ]; + if (t3 != 0) /* this is new ah */ + { + M[ t3 ] = M[ t2 ]; + M[ t3+1 ] = 0; /* clear mark */ + t1 = t3; +#ifdef OBJECTADDR + { + virtaddr vt3; + vt3.addr=t3; + vt3.mark=0; + if( isprocess(&vt3) ){ + virtaddr obj; + procaddr mess; + obj.addr=t3; + obj.mark=0; + obj2mess(M,&obj,&mess); + /* force to create item - we not need it yet */ + hash_set(&mess,t3); + } + } +#endif + } + } + thisp->lastitem = t1; + + thisp->prochead = M[ thisp->procref.addr ]; + thisp->blck2 = M[ thisp->blck1 ]; + +} /* end phase6 */ + + +/* System invariants are recovered, e.g. display is rebuilt to reflect the + * new physical addresses. + */ + +static void curtain() +{ + word t1, phead; + + phead = thisp->prochead; + t1=M[ c1 + PROTNUM ]; + c2 = c1+prototype[ t1 ]->span; + t1 = phead+M[ phead ]; /* first free after process head */ + display = t1+dispoff; /* display address */ + display2 = t1+disp2off; /* indirect display */ + M[ t1+SL ] = DUMMY; /* restore head's SL */ + loosen(); /* rebuild DISPLAY */ + update(c1, curah); + if (infmode){ + fprintf(stderr, + "\n(COMPACTIFIER used for process %d,%ld words reclaimed,now %ld free)\n", + thispix, + (long) (thisp->lastitem-thisp->lastused-1-nleng), + (long) (thisp->lastitem-thisp->lastused-1)); + fflush(stderr); + } +#ifdef CDBG + fprintf(ff, + "(COMPACTIFIER used for process %d,%ld words reclaimed,now %ld free)\n", + thispix, + (long) (thisp->lastitem-thisp->lastused-1-nleng), + (long) (thisp->lastitem-thisp->lastused-1)); + fflush(ff); +#endif + thisp->freeitem = 0; + thisp->headk2 = 0; + thisp->headk = thisp->lower; + M[ 1 ] = 1; /* absolute none */ + ic = lastic; /* re-decode current instruction ! */ + decode(); + if (opcode == 3 /*LRAISE*/) ic++; /* skip address after LRAISE */ +} /* end curtain */ + + +void compactify() /* Compactification */ +{ +#ifdef CDBG + ff=fopen("trace","a"); + fprintf(ff,"----------------------------------------\n"); + fprintf(ff,"COMPACTIFY (thisp=%d)\n",thispix); + fprintf(ff,"c1=%d,c2=%d,templ=%d\n", + thisp->c1,thisp->c2,thisp->template.addr); + fprintf(ff,"back=%d,back.mark=%d,backam=%d,backam.mark=%d\n", + thisp->backobj.addr,thisp->backobj.mark, + M[thisp->backobj.addr],M[thisp->backobj.addr+1]); + fprintf(ff,"blck1=%d,blck2=%d\n",thisp->blck1,thisp->blck2); + fflush(ff); +#endif + + phase1(); + phase2(); + phase2a(); /* garbage collection */ +/* phase3(); if only compactifier is needed uncomment this statement */ +/* and comment statement phase2a() */ + phase4(); + phase5(); + phase6(); + curtain(); + +#ifdef CDBG + fprintf(ff,"----------------------------------------\n"); + fflush(ff); + fclose(ff); +#endif + +} /* end compactify */ + + diff --git a/sources/int/control.c b/sources/int/control.c new file mode 100644 index 0000000..5a86391 --- /dev/null +++ b/sources/int/control.c @@ -0,0 +1,421 @@ +/* Loglan82 Compiler&Interpreter + Copyright (C) 1993 Institute of Informatics, University of Warsaw + Copyright (C) 1993, 1994 LITA, Pau + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + contacts: Andrzej.Salwicki@univ-pau.fr + +or Andrzej Salwicki + LITA Departement d'Informatique + Universite de Pau + Avenue de l'Universite + 64000 Pau FRANCE + tel. ++33 59923154 fax. ++33 59841696 + +======================================================================= +*/ + +#include "depend.h" +#include "genint.h" +#include "int.h" +#include "process.h" +#include "intproto.h" + +/* Transfer of control routines */ + +#ifndef NO_PROTOTYPES +static void att2(virtaddr *, word, word); +static void back1(word, word, virtaddr *, word *); +#else +static void att2(); +static void back1(); +#endif + +/* Transfer control to the newly created object. + */ + +void go(ah, am) +word ah, am; +{ + protdescr *ptr; + word pnum, plen, node, apt; + message msg; + + ptr = prototype[ M[ am+PROTNUM ] ]; + apt = am+M[ am ]; + if (ptr->kind == PROCESS) /* new process creation */ + { + thisp->template.addr = ah; /* save template address */ + thisp->template.mark = M[ ah+1 ]; + msg.control.type = CREATE; + msg.control.par = M[ am+PROTNUM ]; + moveparams(thispix, am, &msg, PARIN, LOADPAR); + msg.control.receiver.pix = 0; /* pix will create receiver */ + msg.control.receiver.mark= 0; /* mark will create receiver */ + msg.control.receiver.node = getnode(am); /* node we decided */ + sendmsg( &msg); /* send create request */ +# ifdef RPCDBG + fprintf( + stderr, "send new process from %d to node %d\n", + thispix, + msg.control.receiver.node + ); +# endif + passivate(WAITFORNEW); /* and wait for return from process */ + } + else + if (isprocess((virtaddr*)(M+apt+SL))) /* remote procedure call */ + { + thisp->backobj.addr = ah; /* save template address */ + thisp->backobj.mark = M[ ah+1 ]; + thisp->M[ temporary ] = am; /* physical address also */ + { + virtaddr v; + loadvirt( v, apt+SL ); + obj2mess( M, &v, &msg.control.receiver ); +# ifdef RPCDBG + fprintf( + stderr, "send rpc from process %d to (%d,%d,%d)\n", + thispix, + msg.control.receiver.node, + msg.control.receiver.pix, + msg.control.receiver.mark + ); +# endif + } + msg.control.type = RPCALL; + msg.control.par = M[ am+PROTNUM ]; + moveparams(thispix, am, &msg, PARIN, LOADPAR); + sendmsg( &msg); /* send RPC request */ + passivate(WAITFORRPC); /* and wait for RP return */ + } + else + { + M[ c1+M[ c1 ]+LSC ] = ic; /* save local control */ + loosen(); /* release DISPLAY */ + update(am, ah); /* update DISPLAY */ + c1 = am; /* new current */ + c2 = c1+ptr->span; + pnum = ptr->preflist; + plen = ptr->lthpreflist; + while (TRUE) /* search for executable prefix */ + if (plen <= 1) + { + ic = ptr->codeaddr; + break; + } + else + { + ptr = prototype[ M[ pnum ] ]; + plen--; + pnum++; + if (ptr->kind != RECORD) plen = 0; + } + } +} + + +/* Transfer control to a local unprefixed procedure, function, block, + * class or coroutine. + */ + +void goloc(ah, am) +word ah, am; +{ + word t1; + protdescr *ptr; + + M[ c1+M[ c1 ]+LSC ] = ic; /* save local control */ + c1 = am; /* new current */ + t1 = M[ am+PROTNUM ]; + ptr = prototype[ t1 ]; + c2 = am+ptr->span; + ic = ptr->codeaddr; + M[ display+t1 ] = am; /* simulate update display */ + M[ display2+t1 ] = ah; + M[ am+M[ am ]+STATSL ]++; +} + + +void backbl(virt, am) /* Return from block. */ +virtaddr *virt; +word *am; +{ + word t1; + + t1 = M[ c1+PROTNUM ]; + virt->addr = M[ display2+t1 ]; + virt->mark = M[ virt->addr+1 ]; /* prepare old address */ + *am = c1; /* am of old */ + M[ display+t1 ] = 0; /* simulate loosen */ + t1 = c1+M[ c1 ]; + M[ t1+STATSL ]--; /* remove from SL chain */ + c1 = M[ t1+SL ]; /* return up along SL */ + if (c1 == DUMMY) endprocess(0); /* return from main */ + c1 = M[ c1 ]; /* am of new current */ + c2 = c1+prototype[ M[ c1+PROTNUM ] ]->span; + ic = M[ c1+M[ c1 ]+LSC ]; + storevirt(*virt, *am+M[ *am ]+DL); /* force DL consistency */ +} + + +static void back1(at1, at2, virt, am) /* Common code for some backs below. */ +word at1, at2; +virtaddr *virt; +word *am; +{ + word t1; + + loosen(); + if (at1 == 0) endprocess(0); + t1 = M[ c1+PROTNUM ]; + virt->addr = M[ display2+t1 ]; /* ah of old */ + virt->mark = M[ virt->addr+1 ]; + *am = c1; /* am of old */ + storevirt(*virt, at2); /* loop up DL */ + at2 = M[ at1 ]; /* am of DL */ + update(at2, at1); + c1 = at2; + c2 = c1 + prototype[ M[ c1+PROTNUM ] ]->span; + ic = M[ c1+M[ c1 ]+LSC ]; +} + + +/* Return from classes, coroutines and by end from procedures. + */ + +void back(virt, am, length) +virtaddr *virt; +word *am; +word length; +{ + word t1, t2, plist; + int i; + protdescr *ptr; + message msg; + + t2 = c1+M[ c1 ]; + t1 = M[ t2+DL ]; /* ah of DL */ + ptr = prototype[ M[ c1+PROTNUM ] ]; /* prototype of current */ + if (ptr->kind == PROCESS) /* RETURN in process */ + { +# ifdef RPCDBG + fprintf( stderr, "return from process %d\n", thispix ); +# endif + if (M[ c1+PROTNUM ] == MAINBLOCK) endprocess(0); + { + virtaddr v; + loadvirt( v, t2+DL ); + obj2mess( M, &v, &msg.control.receiver ); /* father process */ + } + msg.control.type = CREACK; + moveparams(thispix, c1, &msg, PAROUT, LOADPAR); + sendmsg(&msg); /* send create acknowledge */ + M[ t2+DL ] = 0; /* cut DL of new process head */ + passivate(STOPPED); /* and suspend new process */ + } + else + if (ptr->kind == COROUTINE) + { + if (t1 != 0) /* nothing if detached */ + { + M[ t2+LSC ] = ic; + back1(t1, t2+DL, virt, am); + } + } + else + { + plist = ic; /* save begining of prototype list */ + if (ptr->lthpreflist==1 && t1==M[t2+SL] && M[t2+DL+1]==M[t2+SL+1]) + backbl(virt, am); + else + back1(t1, t2+DL, virt, am); + +/* +# ifdef RPCDBG + fprintf( + stderr, "back (thisp=%d) from %s to %s\n", + thispix, + ( + (ptr->kind==PROCEDURE) ? + "PROCEDURE" : + (ptr->kind==FUNCTION) ? + "FUNCTION" : + "???" + ), + isprocess((virtaddr*)(M+t2+RPCDL)) ? "PROCESS" : "OBJECT" + ); +# endif +*/ + if ((ptr->kind == PROCEDURE || ptr->kind == FUNCTION) && + isprocess((virtaddr*)(M+t2+RPCDL))) + { + { + virtaddr v; + loadvirt( v, t2+RPCDL ); + obj2mess( M, &v, &msg.control.receiver ); /* remote DL */ + } +# ifdef RPCDBG + fprintf( + stderr, "send rpc ack from process %d to (%d,%d,%d)\n", + thispix, + msg.control.receiver.node, + msg.control.receiver.pix, + msg.control.receiver.mark + ); +# endif + msg.control.type = RPCACK; + moveparams(thispix, *am, &msg, PAROUT, LOADPAR); + sendmsg(&msg); /* send RP return - acknowledge */ + gkill(virt); /* kill procedure object manualy */ + popmask(thispix); /* restore RPC mask from stack */ + for (i = 0; i < length; i++) /* and modify it */ + { + t1 = virtprot(M[ plist++ ]); /* prototype number */ + if (t1 > 0) enable(thispix, t1); + else disable(thispix, -t1); + } + evaluaterpc(thispix); /* check for enabled RPCs */ + } + } +} + + +/* Return, end in procedures and functions without prefix. + */ + +void backpr(virt, am) +virtaddr *virt; +word *am; +{ + word t1, t2, t3; + + t2 = c1+M[ c1 ]+DL; /* DL pointer of current */ + t1 = M[ t2 ]; /* ah of DL */ + t3 = c1+M[ c1 ]+SL; /* SL pointer */ + if (t1 == M[ t3 ] && M[ t2+1 ] == M[ t3+1 ]) backbl(virt, am); /* SL=DL */ + else back1(t1, t2, virt, am); +} + + +void fin(backic, virt, am) /* End in classes and coroutines. */ +word backic; +virtaddr *virt; +word *am; +{ + word t1, t2, knd; + + knd = prototype[ M[ c1+PROTNUM ] ]->kind; + if (knd != COROUTINE && knd != PROCESS) + back(virt, am, (word) 0); /* a class - exit as above */ + else + { + ic = backic; /* backspace ic */ + t2 = c1+M[ c1 ]; + t1 = M[ t2+DL ]; /* ah of DL */ + if (t1 == 0) + { + if (M[ t2+SL ] == DUMMY) endprocess(0); + ic = 0; /* coroutine terminated */ + *am = 0; + detach(); + } + else + { + M[ t2+LSC ] = ic; + back1(t1, t2+DL, virt, am); + } + } +} + + +static void att2(virt, ax, at1) /* Helper for attach/detach */ +virtaddr *virt; +word ax, at1; +{ + word t1, t2, phead; + + t1 = M[ display2+M[ c1+PROTNUM ] ]; /* ah of current */ + t2 = at1+M[ at1 ]+DL; /* DL of coroutine head */ + M[ t2 ] = t1; /* loop up DL */ + M[ t2+1 ] = M[ t1+1 ]; + M[ c1+M[ c1 ]+LSC ] = ic; /* preserve local control */ + loosen(); + phead = thisp->prochead; + storevirt(*virt, phead+M[ phead ]+CHD); + t2 = M[ ax+DL ]; + if (t2 == 0) errsignal(RTECORAC); /* coroutine active */ + M[ ax+DL ] = 0; /* cut DL of new coroutine head */ + c1 = M[ t2 ]; + update(c1, t2); + c2 = c1+prototype[ M[ c1+PROTNUM ] ]->span; + ic = M[ c1+M[ c1 ]+LSC ]; + if (ic == 0) errsignal(RTECORTM); /* coroutine terminated */ +} + + +void attach(virt) +virtaddr *virt; +{ + word t1, ax, phead, chead; + int knd; + + if (M[ virt->addr+1 ] != virt->mark) errsignal(RTEILLAT); + else ax = M[ virt->addr ]; /* am */ + t1 = M[ ax+PROTNUM ]; + if (t1 == AINT || t1 == AREAL || t1 == AVIRT || t1 == FILEOBJECT) + errsignal(RTEILLAT); + knd = prototype[ t1 ]->kind; + if (knd != COROUTINE && knd != PROCESS) errsignal(RTEILLAT); + ax = ax+M[ ax ]; + phead = thisp->prochead; + chead = phead+M[ phead ]+CHD; + if (virt->addr != M[ chead ] || virt->mark != M[ chead+1 ]) + { + M[ ax+CL ] = M[ chead ]; + M[ ax+CL+1 ] = M[ chead+1 ]; + att2(virt, ax, M[ M[ chead ] ]); + } +} + + +void detach() +{ + virtaddr virt; + word t1, phead; + + phead = thisp->prochead; + t1 = M[ M[ phead+M[ phead ]+CHD ] ]; /* am of coroutine head */ + loadvirt(virt, t1+M[ t1 ]+CL); /* coroutine link */ + if (M[ virt.addr+1 ] != virt.mark) errsignal(RTEILLDT); + att2(&virt, M[ virt.addr ]+M[ M[ virt.addr ] ], t1); +} + + +void inner(level) /* Simulate execution of inner */ +word level; +{ + word t1; + protdescr *ptr; + + ptr = prototype[ M[ c1+PROTNUM ] ]; /* prototype of current */ + t1 = ptr->lthpreflist; + if (t1 != level) + if (level == t1-1) ic = ptr->codeaddr; + else ic = prototype[ M[ ptr->preflist+level ] ]->codeaddr; +} + + diff --git a/sources/int/depend.h b/sources/int/depend.h new file mode 100644 index 0000000..cc4deb6 --- /dev/null +++ b/sources/int/depend.h @@ -0,0 +1,173 @@ +/* Loglan82 Compiler&Interpreter + Copyright (C) 1993 Institute of Informatics, University of Warsaw + Copyright (C) 1993, 1994 LITA, Pau + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + contacts: Andrzej.Salwicki@univ-pau.fr + +or Andrzej Salwicki + LITA Departement d'Informatique + Universite de Pau + Avenue de l'Universite + 64000 Pau FRANCE + tel. ++33 59923154 fax. ++33 59841696 + +======================================================================= +*/ + +#if MSDOS +#undef UNIX +#undef OS2 +#elif UNIX +#undef OS2 +#elif OS2 +#undef UNIX +#else +#error Define one of MSDOS/OS2/UNIX +#endif + +#if WORD_16BIT +#undef DWORD_16BIT +#undef WORD_32BIT +#elif DWORD_16BIT +#undef WORD_32BIT +#elif WORD_32BIT +#undef DWORD_16BIT +#else +#error Define one of WORD_16BIT/DWORD_16BIT/WORD_32BIT +#endif + + +#include +#include +#include +#include +#include + + +typedef struct { + char opcode; + char args[ 3 ]; + } extopcode; + +typedef char *lword; /* max(word, char *) but in every case was char* */ + +#define BINARYREAD "rb" +#define BINARYWRITE "wb" +#define DIRECTOLD "r+b" +#define DIRECTNEW "w+b" + + +#if WORD_16BIT + +typedef int word; +typedef float real; +typedef word *memory; + +#if UNIX +extern char *calloc(int,int); +#endif + +#define mallocate(n) ((memory) (char /*|||huge*/ *) calloc((n),sizeof(word))) +#define ballocate(n) ((char /*|||huge*/ *) calloc((n),1)) + +#define MAXINTEGER 0x7FFF +#define DEFMEMSIZE 0x7FF0 /* 32K words = 64K bytes */ +#define MAXMEMSIZE 0x7FF0 /* 32K words = 64K bytes */ + +#endif + + + +#if DWORD_16BIT + +typedef long word; +typedef double real; +typedef word huge *memory; + +#if UNIX + +extern char *calloc(int,int); + +#define mallocate(n) (((n)<60000)?(memory) calloc((n),sizeof(word)):abort()) +#define ballocate(n) (calloc((n),1)) + +#define MAXINTEGER 0x7FFFFFFFL +#define DEFMEMSIZE 0x13C00L /* 79K words = 316K bytes */ +#define MAXMEMSIZE 0x400000L /* 4M words = 16M bytes */ + +#elif OS2 + +extern char huge *halloc(); + +#define mallocate(n) ((memory) halloc((long) (n), sizeof(word))) +#define ballocate(n) (halloc((long) (n),1L)) + +#define MAXINTEGER 0x7FFFFFFFL +#define DEFMEMSIZE 0x13C00L /* 79K words = 316K bytes */ +#define MAXMEMSIZE 0x400000L /* 4M words = 16M bytes */ + +#define INCL_DOSINFOSEG + +#include + +#elif MSDOS && TURBOC + +extern char far *farcalloc(); + +#define mallocate(n) ((memory) farcalloc((long) (n), (long) sizeof(word))) +#define ballocate(n) (farcalloc((long) (n),1L)) + +#define MAXINTEGER 0x7FFFFFFFL +#define DEFMEMSIZE 0x14000L /* 80K words = 320K bytes */ +#define MAXMEMSIZE 0x28000L /* 160K words = 640K bytes */ + +#elif MSDOS + +extern void huge *halloc(); +#define mallocate(n) ((memory) halloc((long) (n), sizeof(word))) +#define ballocate(n) (halloc((long) (n),1)) + +#define MAXINTEGER 0x7FFFFFFFL +#define DEFMEMSIZE 0xF000L /* 60K words = 120K bytes */ +#define MAXMEMSIZE 0x28000L /* 160K words = 640K bytes */ + +#else +#error Allocation macros not defined. +#endif + +#endif + + + +#if WORD_32BIT + +typedef int word; +typedef float real; +typedef word *memory; + +#define mallocate(n) ((memory) (char *) calloc((n),sizeof(word))) +#define ballocate(n) ((char *) calloc((n),1)) + +/* printf("|%d*4|",(n)),getchar(),\ */ + +#define MAXINTEGER 0x7FFFFFFFL +#define DEFMEMSIZE 0x13C00L /* 79K words = 316K bytes */ +#define MAXMEMSIZE 0x400000L /* 4M words = 16M bytes */ + +#endif + + diff --git a/sources/int/dlink.asm b/sources/int/dlink.asm new file mode 100644 index 0000000..6e7457f --- /dev/null +++ b/sources/int/dlink.asm @@ -0,0 +1,327 @@ +/* Loglan82 Compiler&Interpreter + Copyright (C) 1993 Institute of Informatics, University of Warsaw + Copyright (C) 1993, 1994 LITA, Pau + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + contacts: Andrzej.Salwicki@univ-pau.fr + +or Andrzej Salwicki + LITA Departement d'Informatique + Universite de Pau + Avenue de l'Universite + 64000 Pau FRANCE + tel. ++33 59923154 fax. ++33 59841696 + +======================================================================= +*/ + + NAME CINTA + PUBLIC _logon, _logoff, _attention, _ignore, _send, _receive + EXTRN _endrun:FAR, COPYOK:FAR + +DGROUP GROUP _data + +CINTA_TEXT SEGMENT PUBLIC 'CODE' + ASSUME CS:DRIVER + +; PATCH FOR RECEIVE MESSAGE INTERRUPT HANDLER +PATCH PROC FAR + PUSHF + PUSH AX + PUSH BX + PUSH CX + PUSH DX + PUSH DS + PUSH ES + CALL FAR PTR _ignore ; DISABLE ATTENTION + MOV AX, DGROUP + MOV DS, AX + ASSUME CS:DRIVER, DS:DGROUP + PUSH AX + MOV AX, OFFSET DGROUP:MSGBUF + PUSH AX + CALL FAR PTR _receive + CALL DWORD PTR MSGINT + ADD SP, 4 + POP ES + POP DS + POP DX + POP CX + POP BX + POP AX + POPF + RET +PATCH ENDP +PATLEN = $-PATCH +SAVLEN = PATLEN +CINTA_TEXT ENDS + +_data SEGMENT WORD PUBLIC 'data' +SAVCOD DB SAVLEN DUP(?) ; SPACE FOR SAVING PATCHED CODE +USER DB 8 DUP(?) +MSGBUF DB 80 DUP(' ') +MSGINT DD ? +_data ENDS + +; SEGMENT FOR ADDRESSING DRIVER CODE +DRIVER SEGMENT AT 0 + ORG 102EH ; ***** ONLY FOR D-LINK VERSION 3.21 ***** +DISPLAY LABEL FAR ; RECEIVE MESSAGE INTERRUPT HANDLER + ORG $+PATLEN +DRIVER ENDS + +CINTA_TEXT SEGMENT 'CODE' + ASSUME CS:CINTA_TEXT + +NETWORK DB 0 ; NETWORK OPERATION FLAG + +BREAK PROC FAR ; CONTROL-BREAK INTERRUPT ROUTINE + MOV AX, DGROUP + MOV DS, AX + CALL _endrun + RET 2 +BREAK ENDP + +; int logon(msgint) +; void (*msgint)(); +; +; CHECK IF DRIVER IS INSTALLED AND CONNECT TO RECEIVE MESSAGE INTERRUPT HANDLER. +; RETURN NODE NUMBER (-1 MEANS NODE NOT LOGGED ON) + +_logon PROC FAR + PUSH BP + MOV BP,SP + PUSH SI + PUSH DI + PUSH DS + PUSH AX ; PUSH DUMMY PARAMETER FOR COPYOK + PUSH AX + CALL COPYOK ; CHECK FOR AUTHORIZATION + OR AX, AX + JZ NOTAUT ; UNAUTHORIZED DUPLICATE + MOV AX, 2523H ; REPLACE CONTROL-BREAK INTERRUPT + MOV DX, OFFSET BREAK + PUSH CS + POP DS + INT 21H + MOV AX, 357DH ; GET NIOS VECTOR INTO ES:BX + INT 21H + CMP WORD PTR ES:[BX-2], 'ns' + JNE NONE ; DRIVER NOT INSTALLED + MOV AH, 17H ; GET NIOS VERSION NUMBER + INT 7DH + CMP AX, 1503H ; IS VERSION = 3.21 + JNE NONE ; INCORRECT NIOS VERSION + PUSH ES + POP DS + MOV AX, DGROUP + MOV ES, AX + ASSUME CS:CINTA_TEXT, DS:DRIVER, ES:DGROUP + MOV BX, OFFSET DGROUP:USER + MOV AH, 02H ; GET USER NAME + MOV DL, 0FFH ; OUR NODE (UNKNOWN YET) + INT 7DH + OR AL, AL + JNZ NONE + MOV NETWORK, 1 ; FLAG NETWORK INSTALLED + CLD + MOV SI, OFFSET DISPLAY + MOV DI, OFFSET DGROUP:SAVCOD + MOV CX, SAVLEN + REP MOVSB + CALL FAR PTR _ignore ; DISABLE ATTENTION FOR A MOMENT + PUSH DS ; AND REPLACE WITH OUR + POP ES + PUSH CS + POP DS + ASSUME CS:CINTA_TEXT, DS:CINTA_TEXT, ES:DRIVER + MOV SI, OFFSET PATCH + MOV DI, OFFSET DISPLAY + MOV CX, PATLEN + REP MOVSB + MOV AX, DGROUP + MOV DS, AX + ASSUME CS:CINTA_TEXT, DS:DGROUP, ES:DRIVER + MOV AX, [BP+6] ; STORE ADDRESS OF USER INTERRUPT ROUTINE + MOV WORD PTR MSGINT, AX + MOV AX, [BP+8] + MOV WORD PTR MSGINT+2, AX + MOV AL, DL ; RETURN OUR NODE NUMBER + XOR AH, AH + JMP SHORT L1 +NONE: MOV AX, -1 + MOV NETWORK, 0 + JMP SHORT L1 +NOTAUT: MOV AX, -2 +L1: POP DS + POP DI + POP SI + POP BP + RET +_logon ENDP + + +; void logoff() +; +; RESTORE ORIGINAL INTERRUPT HANDLER + +_logoff PROC FAR + PUSH BP + MOV BP,SP + PUSH SI + PUSH DI + PUSH DS + ASSUME CS:CINTA_TEXT + CMP NETWORK, 0 + JZ L2 ; NOTHING IF NO NETWORK + CALL FAR PTR _ignore ; DISABLE ATTENTION FOR A MOMENT + CLD + MOV AX,DGROUP + MOV DS,AX + MOV AX,357DH ; GET DRIVER SEGMENT INTO ES + INT 21H + ASSUME CS:CINTA_TEXT, DS:DGROUP, ES:DRIVER + MOV SI,OFFSET DGROUP:SAVCOD + MOV DI,OFFSET DISPLAY + MOV CX,SAVLEN + REP MOVSB ; RESTORE PATCHED CODE + CALL FAR PTR _attention ; ATTENTION BACK ON +L2: POP DS + POP DI + POP SI + POP BP + RET +_logoff ENDP + + +; void attention() +; +; ENABLE ATTENTION + +_attention PROC FAR + CMP NETWORK, 0 + JZ A1 + MOV AX,1600H + INT 7DH +A1: RET +_attention ENDP + + +; void ignore() +; +; DISABLE ATTENTION + +_ignore PROC FAR + CMP NETWORK, 0 + JZ I1 + MOV AX,16FFH + INT 7DH +I1: RET +_ignore ENDP + + +; int send(node, msg) +; int node; +; message *msg; +; +; SEND MESSAGE MSG TO NODE + +_send PROC FAR + PUSH BP + MOV BP,SP + MOV AH,0DH ; SEND MESSAGE + MOV DL,[BP+6] ; NODE NUMBER + LES BX,[BP+8] ; BUFFER ADDRESS + INT 7DH + XOR AH,AH + POP BP + RET +_send ENDP + + +; int receive(msg) +; message *msg; +; +; GET STORED MESSAGE + +_receive PROC FAR + PUSH BP + MOV BP,SP + MOV AH,0EH ; GET MESSAGE + LES BX,[BP+6] ; BUFFER ADDRESS + INT 7DH + XOR AH,AH + POP BP + RET +_receive ENDP + + +; FUNCTION TICKS:INTEGER4; +; RETURN BIOS TIME IN TICKS +TICKS PROC FAR + MOV AH,0 + INT 1AH + MOV AX,DX ; LOW WORD + MOV DX,CX ; HIGH WORD + RET +TICKS ENDP + +; PROCEDURE DTIME(VAR H,M,S:INTEGER); +; RETURN DOS DAY TIME IN HOURS, MINUTES, AND SECONDS +DTIME PROC FAR + PUSH BP + MOV BP,SP + MOV AH,2CH ; GET TIME + INT 21H + MOV BX,[BP+10] + MOV [BX],CH ; HOURS + MOV BYTE PTR [BX+1],0 + MOV BX,[BP+8] + MOV [BX],CL ; MINUTES + MOV BYTE PTR [BX+1],0 + MOV BX,[BP+6] + MOV [BX],DH ; SECONDS + MOV BYTE PTR [BX+1],0 + POP BP + RET 6 +DTIME ENDP + +; FUNCTION SHIFT(PATTERN, COUNT:INTEGER):INTEGER; +; SHIFT LEFT LOGICALY PATTERN BY COUNT BITS +SHIFT PROC FAR + PUSH BP + MOV BP,SP + MOV AX,[BP+8] ; PATTERN + MOV CL,[BP+6] ; BIT COUNT + AND CL,0FH ; MASK LOW 4 BITS + TEST CL,08H ; TEST THEIR SIGN BIT + JZ S0 ; OK IF POSITIVE + OR CL,0F0H ; EXTEND SIGN TO ENTIRE BYTE IF NEGATIVE +S0: CMP CL,0 ; TEST BIT COUNT ONCE AGAIN + JZ S2 ; IF = 0 DO NOTHING + JG S1 ; IF > 0 SHIFT LEFT + NEG CL ; IF < 0 NEGATE BIT COUNT AND + SHR AX,CL ; SHIFT RIGHT + JMP SHORT S2 +S1: SHL AX,CL ; SHIFT LEFT +S2: POP BP + RET 4 +SHIFT ENDP + +CINTA_TEXT ENDS + END + + diff --git a/sources/int/dlink.h b/sources/int/dlink.h new file mode 100644 index 0000000..7f6fbb1 --- /dev/null +++ b/sources/int/dlink.h @@ -0,0 +1,54 @@ +/* Loglan82 Compiler&Interpreter + Copyright (C) 1993 Institute of Informatics, University of Warsaw + Copyright (C) 1993, 1994 LITA, Pau + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + contacts: Andrzej.Salwicki@univ-pau.fr + +or Andrzej Salwicki + LITA Departement d'Informatique + Universite de Pau + Avenue de l'Universite + 64000 Pau FRANCE + tel. ++33 59923154 fax. ++33 59841696 + +======================================================================= +*/ + +#ifndef __DLINK_H__ +#define __DLINK_H__ + +#ifndef NO_PROTOTYPES + +int net_logon( void (*)() ); +void net_logoff( void ); +void net_attention( void ); +int net_send(int,message *); +void net_ignore( void ); + +#else + +int net_logon(); +void net_logoff(); +void net_attention(); +int net_send(); +void net_ignore(); + +#endif + +#endif + + diff --git a/sources/int/dosgraf1.c b/sources/int/dosgraf1.c new file mode 100644 index 0000000..6df0958 --- /dev/null +++ b/sources/int/dosgraf1.c @@ -0,0 +1,79 @@ +/* Loglan82 Compiler&Interpreter + Copyright (C) 1993 Institute of Informatics, University of Warsaw + Copyright (C) 1993, 1994 LITA, Pau + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + contacts: Andrzej.Salwicki@univ-pau.fr + +or Andrzej Salwicki + LITA Departement d'Informatique + Universite de Pau + Avenue de l'Universite + 64000 Pau FRANCE + tel. ++33 59923154 fax. ++33 59841696 + +======================================================================= +*/ + +#include +#include "graf\graf.h" + + +static union REGS r; + +#ifndef NO_PROTOTYPES +static char *normalize(char *); +static int mouse(int,word *,word *,word *); +#else +static char *normalize(); +static int mouse(); +#endif + + + +static char *normalize(addr) /* Normalize segmented address */ + char *addr; +{ + union{ + char *address; + unsigned int words[2]; + } conv; + conv.address = addr; +#if !WORD_32BIT + conv.words[1] += conv.words[0] / 16; + conv.words[0] %= 16; +#endif + return (conv.address); +} + + + +static int mouse(func, bx, cx, dx) /* Call mouse driver INT 33H */ +int func; +word *bx, *cx, *dx; +{ + union REGS r; + r.x.ax = func; + r.x.bx = *bx; + r.x.cx = *cx; + r.x.dx = *dx; + int86(0x33, &r, &r); + *bx = (int) r.x.bx; + *cx = (int) r.x.cx; + *dx = (int) r.x.dx; + return(r.x.ax); +} + diff --git a/sources/int/dosgraf2.c b/sources/int/dosgraf2.c new file mode 100644 index 0000000..e059d40 --- /dev/null +++ b/sources/int/dosgraf2.c @@ -0,0 +1,263 @@ +/* Loglan82 Compiler&Interpreter + Copyright (C) 1993 Institute of Informatics, University of Warsaw + Copyright (C) 1993, 1994 LITA, Pau + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + contacts: Andrzej.Salwicki@univ-pau.fr + +or Andrzej Salwicki + LITA Departement d'Informatique + Universite de Pau + Avenue de l'Universite + 64000 Pau FRANCE + tel. ++33 59923154 fax. ++33 59841696 + +======================================================================= +*/ + + case GRON : + gron((int *) ¶m[ 0 ].xword); + graphmode = TRUE; + break; + + case GROFF : + groff(); + graphmode = FALSE; + break; + + case CLS : + cls(); + break; + + case POINT : + point((int *) ¶m[ 0 ].xword, (int *) ¶m[ 1 ].xword); + break; + + case MOVE : + move((int *) ¶m[ 0 ].xword, (int *) ¶m[ 1 ].xword); + break; + + case DRAW : + draw((int *) ¶m[ 0 ].xword, (int *) ¶m[ 1 ].xword); + break; + + case HFILL : + hfill((int *) ¶m[ 0 ].xword); + break; + + case VFILL : + vfill((int *) ¶m[ 0 ].xword); + break; + + case COLOR : + color((int *) ¶m[ 0 ].xword); + break; + + case STYLE : + style((int *) ¶m[ 0 ].xword); + break; + + case PATERN : + patern((int *) ¶m[ 0 ].xword, (int *) ¶m[ 1 ].xword, + (int *) ¶m[ 2 ].xword, (int *) ¶m[ 3 ].xword); + break; + + case INTENS : + intens((int *) ¶m[ 0 ].xword); + break; + + case PALETT : + pallet((int *) ¶m[ 0 ].xword); + break; + + case BORDER : + border((int *) ¶m[ 0 ].xword); + break; + + case VIDEO : + if (member(¶m[ 0 ].xvirt, &am)) + if (M[ am ] >= 0x8000L/sizeof(word)) + video(normalize((char *) &M[ am+3 ])); + else errsignal(RTEILLAB); + else errsignal(RTEREFTN); + break; + + case HPAGE : + i = (int) param[ 1 ].xword; + if (i == 0) graphmode = FALSE; + else + if (i == 1) graphmode = TRUE; + hpage((int *) ¶m[ 0 ].xword, &i, + (int *) ¶m[ 2 ].xword); + break; + + case NOCARD : + param[ 0 ].xword = nocard(NULL); + break; + + case PUSHXY : + pushxy(); + break; + + case POPHXY : + popxy(); + break; + + case INXPOS : + param[ 0 ].xword = inxpos(NULL); + break; + + case INYPOS : + param[ 0 ].xword = inypos(NULL); + break; + + case INPIX : + param[ 2 ].xword = inpix((int *) ¶m[ 0 ].xword, + (int *) ¶m[ 1 ].xword); + break; + + case GETMAP : + t1 = abs(param[ 0 ].xword-inxpos(NULL))+1; /* cols */ + t2 = abs(param[ 1 ].xword-inypos(NULL))+1; /* rows */ + t1 = (4+t1*t2+sizeof(word)-1)/sizeof(word); /* no. of words, pixel=byte */ + newarry((word) 1, t1, (word)AINT, ¶m[ 2 ].xvirt, &am); + getmap((int *) ¶m[ 0 ].xword, (int *) ¶m[ 1 ].xword, + normalize((char *) &M[ am+3 ])); + break; + + case PUTMAP : + if (member(¶m[ 0 ].xvirt, &am)) + putmap(normalize((char *) &M[ am+3 ])); + else errsignal(RTEREFTN); + break; + + case ORMAP : + if (member(¶m[ 0 ].xvirt, &am)) + ormap(normalize((char *) &M[ am+3 ])); + else errsignal(RTEREFTN); + break; + + case XORMAP : + if (member(¶m[ 0 ].xvirt, &am)) + xormap(normalize((char *) &M[ am+3 ])); + else errsignal(RTEREFTN); + break; + + case TRACK : + track((int *) ¶m[ 0 ].xword, (int *) ¶m[ 1 ].xword); + break; + + case INKEY : + param[ 0 ].xword = inkey(NULL); + break; + + case HASCII : + hascii((int *) ¶m[ 0 ].xword); + break; + + case HFONT : + hfont((int *) ¶m[ 0 ].xword, (int *) ¶m[ 1 ].xword); + break; + + case HFONT8 : + param[ 0 ].xword = 0; + param[ 1 ].xword = 0; + hfont8((int *) ¶m[ 0 ].xword, (int *) ¶m[ 1 ].xword); + break; + + case OUTSTRING : + t1 = strings+param[ 0 ].xword; + outhli((int *) &M[ t1 ], (char *) &M[ t1+1 ]); + break; + + case CIRB : + r1 = param[ 3 ].xreal; + r2 = param[ 4 ].xreal; + cirb((int *) ¶m[ 0 ].xword, (int *) ¶m[ 1 ].xword, + (int *) ¶m[ 2 ].xword, &r1, &r2, + (int *) ¶m[ 5 ].xword, (int *) ¶m[ 6 ].xword, + (int *) ¶m[ 7 ].xword, (int *) ¶m[ 8 ].xword); + break; + +/* MOUSE */ + + case INIT : + ax = mouse(0, ¶m[ 0 ].xword, &cx, &dx); + param[ 1 ].xbool = lbool(ax); + break; + + case SHOWCURSOR : + mouse(1, &bx, &cx, &dx); + break; + + case HIDECURSOR : + mouse(2, &bx, &cx, &dx); + break; + + case STATUS : + mouse(3, &bx, ¶m[ 0 ].xword, ¶m[ 1 ].xword); + param[ 2 ].xbool = lbool(bx & 0x01); + param[ 3 ].xbool = lbool(bx & 0x02); + param[ 4 ].xbool = lbool(bx & 0x04); + break; + + case SETPOSITION : + mouse(4, &bx, ¶m[ 0 ].xword, ¶m[ 1 ].xword); + break; + + case GETPRESS : + case GETRELEASE : + i = ( nrproc == GETPRESS ? 5 : 6 ); + bx = param[ 0 ].xword; + ax = mouse(i, &bx, ¶m[ 1 ].xword, ¶m[ 2 ].xword); + param[ 4 ].xbool = lbool(ax & 0x01); + param[ 5 ].xbool = lbool(ax & 0x02); + param[ 6 ].xbool = lbool(ax & 0x04); + param[ 3 ].xword = bx; + break; + + case SETWINDOW : + mouse(7, &bx, ¶m[ 0 ].xword, ¶m[ 1 ].xword); + mouse(8, &bx, ¶m[ 2 ].xword, ¶m[ 3 ].xword); + break; + + case DEFCURSOR : + mouse(10, ¶m[ 0 ].xword, ¶m[ 1 ].xword, + ¶m[ 2 ].xword); + break; + + case GETMOVEMENT : + mouse(11, &bx, ¶m[ 0 ].xword, ¶m[ 1 ].xword); + break; + + case SETSPEED : + mouse(15, &bx, ¶m[ 0 ].xword, ¶m[ 1 ].xword); + break; + + case SETMARGINS : + r.x.ax = 16; + r.x.cx = param[ 0 ].xword; + r.x.dx = param[ 2 ].xword; + r.x.si = param[ 1 ].xword; + r.x.di = param[ 3 ].xword; + int86(0x33, &r, &r); + break; + + case SETTHRESHOLD : + mouse(19, &bx, &cx, ¶m[ 0 ].xword); + break; + + diff --git a/sources/int/eventque.h b/sources/int/eventque.h new file mode 100644 index 0000000..1bf9720 --- /dev/null +++ b/sources/int/eventque.h @@ -0,0 +1,145 @@ +/** + ** EVENTQUE.H + ** + ** Copyright (C) 1992, Csaba Biegl + ** 820 Stirrup Dr, Nashville, TN, 37221 + ** csaba@vuse.vanderbilt.edu + ** + ** This file is distributed under the terms listed in the document + ** "copying.cb", available from the author at the address above. + ** A copy of "copying.cb" should accompany this file; if not, a copy + ** should be available from where this file was obtained. This file + ** may not be distributed without a verbatim copy of "copying.cb". + ** You should also have received a copy of the GNU General Public + ** License along with this program (it is in the file "copying"); + ** if not, write to the Free Software Foundation, Inc., 675 Mass Ave, + ** Cambridge, MA 02139, USA. + ** + ** This program is distributed in the hope that it will be useful, + ** but WITHOUT ANY WARRANTY; without even the implied warranty of + ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + ** GNU General Public License for more details. + **/ + +#ifndef _EVENTQUE_H_ +#define _EVENTQUE_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * structures: + * BE CAREFUL when hacking!!! -- 16 and 32 bit compilers have to generate + * the same alignments + */ +typedef struct { + unsigned char evt_type; /* event type: 0: keyboard, 1: mouse */ + unsigned char evt_kbstat; /* keyboard status (ALT, SHIFT, etc..) */ + unsigned char evt_mask; /* mouse event mask */ + unsigned char evt_button; /* button status */ + unsigned short evt_xpos; /* X coord (or keycode if keybd event) */ + unsigned short evt_ypos; /* Y coord */ + unsigned long evt_time; /* time stamp of event */ +#define evt_keycode evt_xpos /* reuse this slot for keybd events !! */ +#define evt_scancode evt_ypos /* store here the BIOS scan code */ +} EventRecord; + +typedef struct { + unsigned short evq_maxsize; /* max size of event queue */ + unsigned short evq_cursize; /* number of events in the queue */ + unsigned short evq_rdptr; /* next event to read */ + unsigned short evq_wrptr; /* next event to be written */ + short evq_xpos; /* current X coordinate of mouse */ + short evq_ypos; /* current Y coordinate of mouse */ + short evq_xmin; /* minimal mouse X coordinate */ + short evq_ymin; /* minimal mouse Y coordinate */ + short evq_xmax; /* maximal mouse X coordinate */ + short evq_ymax; /* maximal mouse Y coordinate */ + short evq_xspeed; /* horizontal speed (mickey/coord) */ + short evq_yspeed; /* vertical speed (mickey/coord) */ + unsigned short evq_thresh; /* fast movement threshold */ + unsigned short evq_accel; /* multiplier for fast move */ + unsigned char evq_drawmouse; /* interrupt handler has to draw mouse */ + unsigned char evq_moved; /* set if mouse moved */ + unsigned char evq_delchar; /* character removed from BIOS buffer */ + unsigned char evq_enable; /* event generation control flag */ + EventRecord evq_events[1]; /* event buffer space */ +} EventQueue; + +/* + * event types + */ +#define EVENT_KEYBD 0 +#define EVENT_MOUSE 1 + +/* + * MOUSE event flag bits + * (also defined in "mousex.h" of the graphics library) + */ +#ifndef M_MOTION + +#define M_MOTION 0x001 +#define M_LEFT_DOWN 0x002 +#define M_LEFT_UP 0x004 +#define M_RIGHT_DOWN 0x008 +#define M_RIGHT_UP 0x010 +#define M_MIDDLE_DOWN 0x020 +#define M_MIDDLE_UP 0x040 +#define M_BUTTON_DOWN (M_LEFT_DOWN | M_MIDDLE_DOWN | M_RIGHT_DOWN) +#define M_BUTTON_UP (M_LEFT_UP | M_MIDDLE_UP | M_RIGHT_UP) +#define M_BUTTON_CHANGE (M_BUTTON_UP | M_BUTTON_DOWN ) + +/* + * MOUSE button status bits + */ +#define M_LEFT 1 +#define M_RIGHT 2 +#define M_MIDDLE 4 + +#endif /* M_MOTION */ + +/* + * KEYBOARD status word bits + * (also defined in "mousex.h" of the graphics library) + */ +#ifndef KB_SHIFT + +#define KB_RIGHTSHIFT 0x01 /* right shift key depressed */ +#define KB_LEFTSHIFT 0x02 /* left shift key depressed */ +#define KB_CTRL 0x04 /* CTRL depressed */ +#define KB_ALT 0x08 /* ALT depressed */ +#define KB_SCROLLOCK 0x10 /* SCROLL LOCK active */ +#define KB_NUMLOCK 0x20 /* NUM LOCK active */ +#define KB_CAPSLOCK 0x40 /* CAPS LOCK active */ +#define KB_INSERT 0x80 /* INSERT state active */ + +#define KB_SHIFT (KB_LEFTSHIFT | KB_RIGHTSHIFT) + +#endif /* KB_SHIFT */ + +/* + * set this bit in 'evq_enable' to generate the corresponding event + */ +#define EVENT_ENABLE(type) (1 << (type)) + +/* + * prototypes + */ +#if defined(__TURBOC__) && defined(FOR_GO32) +EventQueue *EventQueueInit(int qsize,int ms_stksize,void (*msdraw)(void),int,int); +#else +EventQueue *EventQueueInit(int qsize,int ms_stksize,void (*msdraw)(void)); +#endif + +void EventQueueDeInit(void); +int EventQueueNextEvent(EventQueue *q,EventRecord *e); + +#ifdef __cplusplus +} +#endif + +#endif /* whole file */ + + + \ No newline at end of file diff --git a/sources/int/execute.c b/sources/int/execute.c new file mode 100644 index 0000000..f612031 --- /dev/null +++ b/sources/int/execute.c @@ -0,0 +1,618 @@ +/* Loglan82 Compiler&Interpreter + Copyright (C) 1993 Institute of Informatics, University of Warsaw + Copyright (C) 1993, 1994 LITA, Pau + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + contacts: Andrzej.Salwicki@univ-pau.fr + +or Andrzej Salwicki + LITA Departement d'Informatique + Universite de Pau + Avenue de l'Universite + 64000 Pau FRANCE + tel. ++33 59923154 fax. ++33 59841696 + +======================================================================= +*/ + +#include "depend.h" +#include "genint.h" +#include "int.h" +#include "process.h" +#include "intproto.h" + +#include + + +/* Execute one L-code instruction */ + + +void execute() +{ + word t1, t2; + int i; + real r; + virtaddr virt1, virt2, virt3; + +#ifdef TRACE + fprintf(stderr,"pix %d,ic %d,opcode %d\n",thispix,ic,opcode);fflush(stderr); +#endif + + switch (opcode) + { + case 1 : /* LOPENRC */ + openrc(a3, &virt2, &t2); + storevirt(virt2, a1); + M[ a2 ] = t2; + break; + + case 2 : /* LBACKADDR */ + storevirt(thisp->backobj, a1); + M[ a2 ] = M[ temporary ]; + break; + + case 3 : /* LRAISE */ + ic++; /* skip the address */ + raise_signal(a3, M[ ic-1 ], &t1, &t2); + M[ a1 ] = t1; + M[ a2 ] = t2; + break; + + case 4 : /* LOPEN */ + openobj(M[ a3 ], &t1, &t2); + M[ a1 ] = t1; + M[ a2 ] = t2; + break; + + case 5 : /* LSLOPEN */ + loadvirt(virt3, a3); + slopen(M[ a3+APREF ], &virt3, &t1, &t2); + M[ a1 ] = t1; + M[ a2 ] = t2; + break; + + case 15 : /* LTHIS */ + virt1.addr = M[ display2+a2 ]; + virt1.mark = M[ virt1.addr+1 ]; + storevirt(virt1, a1); + break; + + case 20 : /* LVIRTDISPL */ + t2 = M[ display+a2 ]; + t1 = M[ t2+PROTNUM ]; + M[ a1 ] = M[ prototype[ t1 ]->virtlist+a3 ]; + break; + + case 21 : /* LSTATTYPE */ + M[ a1 ] = a2; + M[ a1+1 ] = a3; + break; + + case 23 : /* LIPAROUT */ + M[ a1 ] = param[ a3 ].xword; + break; + + case 24 : /* LRPAROUT */ + MR(a1) = param[ a3 ].xreal; + break; + + case 25 : /* LVPAROUT */ + storevirt(param[ a3 ].xvirt, a1); + break; + + case 31 : /* LSIGN */ + if (M[ a2 ] == 0) M[ a1 ] = 0; + else + if (M[ a2 ] < 0) M[ a1 ] = -1; + else M[ a1 ] = 1; + break; + + case 33 : /* LLOWER */ + case 34 : + loadvirt(virt2, a2); + if (member(&virt2, &t1)) + { + switch ((int) M[ t1+PROTNUM ]) + { + case AINT : t2 = APINT; break; + case AREAL : t2 = APREAL; break; + case AVIRT : t2 = APREF; break; + } + M[ a1 ] = (M[ t1+2 ]+3)/t2; + } + else errsignal(RTEREFTN); + break; + + case 35 : /* LUPPER */ + case 36 : + loadvirt(virt2, a2); + if (member(&virt2, &t1)) + { + switch ((int) M[ t1+PROTNUM ]) + { + case AINT : t2 = APINT; break; + case AREAL : t2 = APREAL; break; + case AVIRT : t2 = APREF; break; + } + M[ a1 ] = (M[ t1+2 ]+M[ t1 ])/t2-1; + } + else errsignal(RTEREFTN); + break; + + case 40 : /* LGETTYPE */ + typep(M[ a2 ], a3, &virt1.addr, &virt1.mark); + storevirt(virt1, a1); + break; + + case 41 : /* LCOPY */ + loadvirt(virt2, a2); + copy(&virt2, &virt1); + storevirt(virt1, a1); + break; + + case 42 : /* LNOT */ + M[ a1 ] = ~ M[ a2 ]; + break; + + case 43 : /* LRCVAVIRT */ /* recover virtual address from ah */ + virt1.addr = M[ a2 ]; + virt1.mark = M[ virt1.addr+1 ]; + storevirt(virt1, a1); + break; + + case 44 : /* LVIRTDOT */ + case 45 : + M[ a1 ] = M[ prototype[ M[ temporary ] ]->virtlist+a2 ]; + break; + + case 46 : /* LADDRPH */ + case 47 : /* LADDRPH2 */ + loadvirt(virt2, a2); + if (!member(&virt2, &M[ a1 ])) errsignal(RTEREFTN); + break; + + case 48 : /* LIABS */ + t2 = M[ a2 ]; + M[ a1 ] = absolute(t2); + break; + + case 49 : /* LINEG */ + M[ a1 ] = -M[ a2 ]; + break; + + case 50 : /* LRABS */ + r = MR(a2); + if( r < (real)0.0 ) + r=(real)0.0-r; + MR(a1) = r; + break; + + case 51 : /* LRNEG */ + MR(a1) = -MR(a2); + break; + + case 52 : /* LPARAMADDR */ + t2 = M[ a2 ]; + M[ a1 ] = t2+M[ prototype[ M[ t2+PROTNUM ] ]->parlist+a3 ]; + break; + + case 54 : /* LLOADT */ + t1 = M[ ic++ ]; /* offset */ + t2 = t1+loadt(M[ M[ a2 ] ], a3); /* object address */ + loadvirt(virt1, t2); + storevirt(virt1, a1); + break; + + case 55 : /* LIS */ + loadvirt(virt2, a2); + M[ a1 ] = lbool(is(&virt2, a3)); + break; + + case 56 : /* LIN */ + loadvirt(virt2, a2); + M[ a1 ] = lbool(inl(&virt2, a3)); + break; + + case 57 : /* LQUA */ + loadvirt(virt2, a2); + if (member(&virt2, &M[ a1 ])) + qua(&virt2, a3); + else errsignal(RTEREFTN); + break; + + case 58 : /* LIFIX */ + M[ a1 ] = (word)( MR(a2) ); + break; + + case 59 : /* LFLOAT */ + MR(a1) = (real)( M[ a2 ] ); + break; + + case 60 : /* LIMOVE */ + M[ a1 ] = M[ a2 ]; + break; + + case 61 : /* LVMOVE */ + loadvirt(virt1, a2); + storevirt(virt1, a1); + break; + + case 62 : /* LRMOVE */ /* WARNING: these areas may overlap! */ + r = MR(a2); + MR(a1) = r; + break; + + case 63 : /* LFPMOVE */ /* WARNING: these areas may overlap! */ + loadvirt(virt1, a2); /* MACHINE DEPENDENT */ + t1 = M[ a2+2 ]; + storevirt(virt1, a1); + M[ a1+2 ] = t1; + break; + + case 82 : /* LEQNONE */ + M[ a1 ] = lbool(M[ a2+1 ] != M[ M[ a2 ]+1 ]); + break; + + case 83 : /* LNENONE */ + M[ a1 ] = lbool(M[ a2+1 ] == M[ M[ a2 ]+1 ]); + break; + + case 87 : /* LMDFTYPE */ /* modify the formal type */ + loadvirt(virt1, a2); + virt1.addr += a3; /* number of "arrayof" */ + storevirt(virt1, a1); + break; + + case 100 : /* LOR */ + M[ a1 ] = M[ a2 ] | M[ a3 ]; + break; + + case 101 : /* LAND */ + M[ a1 ] = M[ a2 ] & M[ a3 ]; + break; + + case 102 : /* LARRAY */ + case 103 : + case 104 : + loadvirt(virt2, a2); + if (member(&virt2, &t2)) + { + t1 = M[ a3 ]-M[ t2+2 ]; /* index-lower+3 */ + if (t1 < 3 || t1 >= M[ t2 ]) errsignal(RTEINVIN); + else M[ a1 ] = t2+t1; + } + else errsignal(RTEREFTN); + break; + + case 105 : /* LFARRAY */ /* without any tests */ + t1 = M[ M[ a2 ] ]; /* physical address */ + M[ a1 ] = t1+M[ a3 ]-M[ t1+2 ]; + break; + + case 106 : /* LIEQUAL */ + M[ a1 ] = lbool(M[ a2 ] == M[ a3 ]); + break; + + case 107 : /* LINEQUAL */ + M[ a1 ] = lbool(M[ a2 ] != M[ a3 ]); + break; + + case 108 : /* LILT */ + M[ a1 ] = lbool(M[ a2 ] < M[ a3 ]); + break; + + case 109 : /* LILE */ + M[ a1 ] = lbool(M[ a2 ] <= M[ a3 ]); + break; + + case 110 : /* LIGT */ + M[ a1 ] = lbool(M[ a2 ] > M[ a3 ]); + break; + + case 111 : /* LIGE */ + M[ a1 ] = lbool(M[ a2 ] >= M[ a3 ]); + break; + + case 112 : /* LCOMBINE */ + loadvirt(virt2, a2); + t1 = M[ a3 ]; + storevirt(virt2, a1); + M[ a1+APREF ] = t1; + break; + + case 113 : /* LIADD */ + M[ a1 ] = M[ a2 ]+M[ a3 ]; + break; + + case 114 : /* LISUB */ + M[ a1 ] = M[ a2 ]-M[ a3 ]; + break; + + case 115 : /* LIMULT */ + M[ a1 ] = M[ a2 ] * M[ a3 ]; + break; + + case 116 : /* LSHIFT */ + M[ a1 ] = shift(M[ a2 ], M[ a3 ]); + break; + + case 117 : /* LIDIVE */ + if (M[ a3 ] == 0) errsignal(RTEDIVBZ); + else M[ a1 ] = M[ a2 ] / M[ a3 ]; + break; + + case 118 : /* LIMODE */ + if (M[ a3 ] == 0) errsignal(RTEDIVBZ); + else M[ a1 ] = M[ a2 ] % M[ a3 ]; + break; + + case 119 : /* LRADD */ + MR(a1) = MR(a2)+MR(a3); + break; + + case 120 : /* LRSUB */ + MR(a1) = MR(a2)-MR(a3); + break; + + case 121 : /* LRMULT */ + MR(a1) = MR(a2) * MR(a3); + break; + + case 122 : /* LRDIVE */ + if (MR(a3) == (real)0.0) errsignal(RTEDIVBZ); + else MR(a1) = MR(a2) / MR(a3); + break; + + case 123 : /* LEQREF */ + loadvirt(virt2, a2); + loadvirt(virt3, a3); + if (member(&virt2, &t1)) + M[ a1 ] = lbool(member(&virt3, &t2) && t1 == t2); + else M[ a1 ] = lbool(!member(&virt3, &t2)); + break; + + case 124 : /* LNEREF */ + loadvirt(virt2, a2); + loadvirt(virt3, a3); + if (member(&virt2, &t1)) + M[ a1 ] = lbool(!member(&virt3, &t2) || t1 != t2); + else M[ a1 ] = lbool(member(&virt3, &t2)); + break; + + case 125 : /* LREQ */ + M[ a1 ] = lbool(MR(a2) == MR(a3)); + break; + + case 126 : /* LRNE */ + M[ a1 ] = lbool(MR(a2) != MR(a3)); + break; + + case 127 : /* LRLT */ + M[ a1 ] = lbool(MR(a2) < MR(a3)); + break; + + case 128 : /* LRLE */ + M[ a1 ] = lbool(MR(a2) <= MR(a3)); + break; + + case 129 : /* LRGT */ + M[ a1 ] = lbool(MR(a2) > MR(a3)); + break; + + case 130 : /* LRGE */ + M[ a1 ] = lbool(MR(a2) >= MR(a3)); + break; + + case 131 : /* LXOR */ + M[ a1 ] = M[ a2 ] ^ M[ a3 ]; + break; + + case 132 : /* LCALLPROCSTAND */ +#if USE_ALARM + alarm(0); /* reschedule forced so alarm may be switched off */ +#endif + reschedule=TRUE; + standard(a1); + break; + + case 143 : /* LKILL */ + loadvirt(virt1, a1); + disp(&virt1); + break; + + case 144 : /* LHEADS */ + loadvirt(virt1, a1); + heads(&virt1, a2); + break; + + case 145 : /* LIPARINP */ + param[ a3 ].xword = M[ a1 ]; + break; + + case 146 : /* LGKILL */ + loadvirt(virt1, a1); + gkill(&virt1); + break; + + case 147 : /* LVPARINP */ + loadvirt(param[ a3 ].xvirt, a1); + break; + + case 148 : /* LRPARINP */ + param[ a3 ].xreal = MR(a1); + break; + + case 149 : /* LQUATEST */ + loadvirt(virt1, a1); + qua(&virt1, a2); + break; + + case 150 : /* LSTYPE */ + loadvirt(virt1, a1); + typref(&virt1, a2); + break; + + case 151 : /* LIFFALSE */ + if (M[ a1 ] == LFALSE) ic = a2; + break; + + case 152 : /* LIFTRUE */ + if (M[ a1 ] == LTRUE) ic = a2; + break; + + case 159 : /* LGO */ + go(M[ a2 ], M[ a1 ]); + break; + + case 160 : /* LGOLOCAL */ + goloc(M[ a2 ], M[ a1 ]); + break; + + case 170 : /* LDTYPE */ + loadvirt(virt1, a1); /* left side type */ + loadvirt(virt2, a2); + loadvirt(virt3, a3); /* right side type */ + typed(virt1.addr, virt1.mark, virt3.addr, virt3.mark, &virt2); + break; + + case 172 : /* LTERMINATE */ + term(); + break; + + case 173 : /* LWIND */ + wind(); + break; + + case 174 : /* LBLOCK2 */ + goloc(thisp->blck1, thisp->blck2); + break; + + case 176 : /* LBLOCK3 */ + disp(&thisp->backobj); + break; + + case 177 : /* LTRACE */ + trace(a1); + break; + + case 178 : /* LINNER */ + inner(a1); + break; + + case 180 : /* LBACKHD */ + backhd(&thisp->backobj, &M[ temporary ]); + break; + + case 182 : /* LJUMP */ + ic = a1; + break; + + case 186 : /* LBLOCK1 */ + openobj(a1, &thisp->blck1, &thisp->blck2); + break; + + case 187 : /* LDETACH */ + detach(); + break; + + case 188 : /* LATTACH */ + loadvirt(virt1, a1); + attach(&virt1); + break; + + case 191 : /* LBACKBL */ + backbl(&thisp->backobj, &M[ temporary ]); + break; + + case 192 : /* LBACKPR */ + /* backpr(&thisp->backobj, &M[ temporary ]); */ + back(&thisp->backobj, &M[ temporary ], (word) 0); + break; + + case 193 : /* LBACK */ + back(&thisp->backobj, &M[ temporary ], (word) 0); + break; + + case 194 : /* LFIN */ + fin(ic-APOPCODE, &thisp->backobj, &M[ temporary ]); + break; + + case 195 : /* LCASE */ + /* a2 = address of case description : */ + /* minimal value, number of branches, */ + /* remaining branches followed by "otherwise" code */ + t1 = M[ a1 ]-M[ a2 ]; /* in 0..number of branches-1 */ + if (t1 < 0 || t1 >= M[ a2+1 ]) + ic = a2+2+M[ a2+1 ]; /* otherwise */ + else + ic = M[ a2+2+t1 ]; /* indirect jump */ + break; + + case 220 : /* LRESUME */ + loadvirt(virt1, a1); + resume(&virt1); + break; + + case 221 : /* LSTOP */ + passivate(STOPPED); + break; + + case 222 : /* LKILLTEMP */ + disp(&thisp->template); + break; + + case 223 : /* LENABLE */ + for (i = 0; i < a1; i++) + enable(thispix, virtprot(M[ ic++ ])); + evaluaterpc(thispix); + break; + + case 224 : /* LDISABLE */ + for (i = 0; i < a1; i++) + disable(thispix, virtprot(M[ ic++ ])); + break; + + case 225 : /* LACCEPT1 */ + rpc_accept(a1); + break; + + case 226 : /* LACCEPT2 */ + popmask(thispix); + rpc3(); + break; + + case 227 : /* LBACKRPC */ + back(&thisp->backobj, &M[ temporary ], a1); + break; + + case 228 : /* LASKPROT */ + loadvirt(virt1, a1); + askprot(&virt1); + break; + + case 240 : /* LSTEP */ + if (M[ a1 ] < 0) errsignal(RTENEGST); + break; + + default : + fprintf( stderr, "Invalid opcode\n" ); + errsignal(RTESYSER); + break; + } + +} + + diff --git a/sources/int/fileio.c b/sources/int/fileio.c new file mode 100644 index 0000000..2377150 --- /dev/null +++ b/sources/int/fileio.c @@ -0,0 +1,337 @@ +/* Loglan82 Compiler&Interpreter + Copyright (C) 1993 Institute of Informatics, University of Warsaw + Copyright (C) 1993, 1994 LITA, Pau + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + contacts: Andrzej.Salwicki@univ-pau.fr + +or Andrzej Salwicki + LITA Departement d'Informatique + Universite de Pau + Avenue de l'Universite + 64000 Pau FRANCE + tel. ++33 59923154 fax. ++33 59841696 + +======================================================================= +*/ + +#include "depend.h" +#include "genint.h" +#include "int.h" +#include "process.h" +#include "intproto.h" + +#include + +/* File I/O routines */ + +void loadfile(status, ftype, am, fp) /* Load parameters of current file */ +word status; /* expected status of file */ +word *ftype; /* file type */ +word *am; /* file object address */ +FILE **fp; /* file stream pointer */ +{ + word s; + virtaddr virt; + + loadvirt(virt, currfile); + if (member(&virt, am)) /* file object exists */ + { + s = M[ *am+FSTAT ]; /* check status */ + if (status != s && status != UNKNOWN) errsignal(RTEILLIO); + *ftype = M[ *am+FTYPE ]; + *fp = MF(*am+FFILE); + } + else errsignal(RTEREFTN); /* file not opened yet */ +} /* end loadfile */ + + +/* Open file object + */ + +void genfileobj(ftemp, ftyp, fnam, virt, am) +bool ftemp; /* TRUE iff file is temporary */ +word ftyp; /* file type */ +char *fnam; /* file name */ +virtaddr *virt; /* output virtual address */ +word *am; /* output physical address */ +{ + word t1; + + request((word) APFILE, &t1, am); /* generate file object */ + virt->addr = t1; + virt->mark = M[ t1+1 ]; + M[ *am+PROTNUM ] = FILEOBJECT; + M[ *am+FSTAT ] = UNKNOWN; + M[ *am+FTEMP ] = lbool(ftemp); + M[ *am+FTYPE ] = ftyp; + MN(*am+FNAME) = fnam; +} /* end genfileobj */ + + +void reset(am) /* Prepare file for reading */ +word am; +{ + FILE *fp; + + if (M[ am+FSTAT ] != UNKNOWN) /* first close file if opened */ + if (fclose(MF(am+FFILE))) errsignal(RTEIOERR); + switch ((int) M[ am+FTYPE ]) + { + case TEXTF : /* open text file for reading */ + fp = fopen(MN(am+FNAME), "r"); + M[ am+FSTAT ] = READING; + break; + + case CHARF : /* open binary file for reading */ + case INTF : + case REALF : + fp = fopen(MN(am+FNAME), BINARYREAD); + M[ am+FSTAT ] = READING; + break; + + case DIRECT : /* open existing file for update */ + fp = fopen(MN(am+FNAME), DIRECTOLD); + M[ am+FSTAT ] = UPDATING; + break; + } + if (fp == NULL) + { + M[ am+FSTAT ] = UNKNOWN; + errsignal(RTECNTOP); + } + MF(am+FFILE) = fp; /* store stream pointer */ +} /* end reset */ + + +void rewrite(am) /* Prepare file for writing */ +word am; +{ + FILE *fp; + + if (M[ am+FSTAT ] != UNKNOWN) /* first close file if opened */ + if (fclose(MF(am+FFILE))) errsignal(RTEIOERR); + + switch ((int) M[ am+FTYPE ]) + { + case TEXTF : /* open text file for writing */ + fp = fopen(MN(am+FNAME), "w"); + M[ am+FSTAT ] = WRITING; + break; + + case CHARF : /* open binary file for writing */ + case INTF : + case REALF : + fp = fopen(MN(am+FNAME), BINARYWRITE); + M[ am+FSTAT ] = WRITING; + break; + + case DIRECT : /* create new file for update */ + fp = fopen(MN(am+FNAME), DIRECTNEW); + M[ am+FSTAT ] = UPDATING; + break; + } + if (fp == NULL) + { + M[ am+FSTAT ] = UNKNOWN; + errsignal(RTECNTOP); + } + MF(am+FFILE) = fp; /* store stream pointer */ +} /* end rewrite */ + + +void delete(virt) /* Delete file */ +virtaddr *virt; +{ + word am; + + if (member(virt, &am)) + { + if (M[ am+FSTAT ] != UNKNOWN) /* first close file if opened */ + if (fclose(MF(am+FFILE))) errsignal(RTEIOERR); + if (unlink(MN(am+FNAME))) errsignal(RTEIOERR); /* delete file */ + free(MN(am+FNAME)); /* free memory used by file name */ + disp(virt); /* and kill file object */ + } + else errsignal(RTEREFTN); +} /* end delete */ + + +char *tempfilename() /* Generate temporary file name */ +{ + char *cp; + static int tempcnt = 0; + + cp = ballocate(10); + if (cp == NULL) errsignal(RTEMEMOV); + sprintf(cp, "LOG%05d", tempcnt++); + return (cp); +} /* end tempfilename */ + + +bool testeof(fp) /* Test for end of file */ +FILE *fp; +{ + int ch; + + ch = getc(fp); + ungetc(ch, fp); + return (ch == EOF); +} /* end testeof */ + + +bool testeoln(fp) /* Test for end of line */ +FILE *fp; +{ + int ch; + + ch = getc(fp); + ungetc(ch, fp); + return (ch == '\n'); +} /* end testeoln */ + + +void readln(fp) /* Skip to end of line */ +FILE *fp; +{ + int ch; + + while ((ch = getc(fp)) != '\n' && ch != EOF) ; +} /* end readln */ + + +static char str[10]; +word readint(fp) /* Read integer */ +FILE *fp; +{ + long i=0L; + int j=0,c=0; + int bool=0; + while(c<'0' || c>'9'){ + if(c=='-') bool=1; + else bool=0; + c=fgetc(fp); + if(c==EOF){ + errsignal(RTEBADFM); + goto END; + } + } + + do{ + i=10*i+(c-'0'); + j++; + c=fgetc(fp); + }while(c>='0' && c<='9'); + if(c!=EOF) ungetc(c,fp); + if (j == 0 ) errsignal(RTEBADFM); + END: + if(bool) + return(-i); + else + return (i); +} /* end readint */ + + +double readreal(fp) /* Read real */ +FILE *fp; +{ + double r; + + if (fscanf(fp, "%lf", &r) != 1) errsignal(RTEBADFM); + return (r); +} /* end readreal */ + + +void writeint(n, field, fp) /* Write integer */ +word n, field; +FILE *fp; +{ +/* PS&MM static char format[ 32 ]; + + sprintf(format,"%%%dld",(int)field); */ + if (fprintf(fp, "%*ld", (int)field, (long) n) == 0) errsignal(RTEIOERR); +} /* end writeint */ + + +void writereal(r, field1, field2, fp) /* Write real */ +double r; +word field1, field2; +FILE *fp; +{ +/* PS&MM char format[ 32 ]; + + sprintf(format, "%%%d.%dlf", (int) field1, (int) field2); + if (fprintf(fp, format, r) == 0) errsignal(RTEIOERR); +*/ + if (fprintf(fp,"%*.*lf", (int)field1, (int)field2, r) == 0) + errsignal(RTEIOERR); +} /* end writereal */ + + +void writestring(offset, field, fp) /* Write string */ +word offset; +word field; +FILE *fp; +{ + word len, addr; + char *cp; + + addr = strings+offset; + len = M[ addr ]; + cp = (char *) &M[ addr+1 ]; /* pointer to first char of string */ + while (len-- > 0 && field-- != 0) + if (putc(*cp++, fp) == EOF) errsignal(RTEIOERR); +} /* end writestring */ + + +word directio(buf, len, action, fp) /* Perform direct access read/write */ +virtaddr *buf; /* buffer array */ +word len; /* number of bytes to transfer */ +#ifndef NO_PROTOTYPES +int (*action)(char *,int,int,FILE *); /* fread() or fwrite() */ +#else +int (*action)(); /* fread() or fwrite() */ +#endif +FILE *fp; /* stream pointer */ +{ + word am, t1, result; + int n; + + if (member(buf, &am)) /* file not none */ + { + if (fseek(fp, 0L, 1)) errsignal(RTEIOERR); /* seek to current */ + /* position required */ + len = min(len, (M[ am ]-3)*sizeof(word)); /* check appetite */ + result = 0; /* number of bytes transfered */ + t1 = am+3; /* address in memory for transfer */ + while (len >= IOBLOCK) /* transfer full blocks */ + { + n = (*action)((char *) &M[ t1 ], 1, IOBLOCK, fp); + result += n; + if (n != IOBLOCK) return(result); + len -= IOBLOCK; + t1 += IOBLOCK/sizeof(word); + } + if (len > 0) /* transfer last unfilled block */ + { + n = (*action)((char *) &M[ t1 ], 1, (int) len, fp); + result += n; + } + return(result); + } + else errsignal(RTEREFTN); +} /* end directio */ + diff --git a/sources/int/genint.h b/sources/int/genint.h new file mode 100644 index 0000000..ea894b7 --- /dev/null +++ b/sources/int/genint.h @@ -0,0 +1,50 @@ +/* Loglan82 Compiler&Interpreter + Copyright (C) 1993 Institute of Informatics, University of Warsaw + Copyright (C) 1993, 1994 LITA, Pau + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + contacts: Andrzej.Salwicki@univ-pau.fr + +or Andrzej Salwicki + LITA Departement d'Informatique + Universite de Pau + Avenue de l'Universite + 64000 Pau FRANCE + tel. ++33 59923154 fax. ++33 59841696 + +======================================================================= +*/ + +#ifdef GEN +#undef GEN +#endif + +#if UNIX +#include "../gen/genint.h" +#else +#include "..\gen\genint.h" +#endif + +/* Variables : */ + +extern protdescr *prototype[]; +extern word ipradr; /* address of primitive type descriptions */ +extern word temporary; /* address of global temporary variables */ +extern word strings; /* base for string constants */ +extern word lastprot; /* the last used prototype number */ +extern word freem; /* first free cell in M */ +extern word currfile; /* current file virtual address */ + diff --git a/sources/int/graf/cirb.c b/sources/int/graf/cirb.c new file mode 100644 index 0000000..fe33dc1 --- /dev/null +++ b/sources/int/graf/cirb.c @@ -0,0 +1,396 @@ + /* Loglan82 Compiler&Interpreter + Copyright (C) 1981-1993 Institute of Informatics, University of Warsaw + Copyright (C) 1993, 1994 LITA, Pau + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + +======================================================================= +*/ + +#include "graf.h" + +#define isign(k, i) (((i) >= 0) ? (k) : -(k)) +#define iabs(i) ((i) >= 0 ? (i) : -(i)) +#define sqr(x) ((x)*(x)) +#define min0(x, y) ((x) < (y) ? (x) : (y)) +#define max0(x, y) ((x) > (y) ? (x) : (y)) + +#define alf(i) alf_[i] +#define ix(i) ix_[i] +#define iy(i) iy_[i] +#define sx(i) sx_[i] +#define sy(i) sy_[i] +#define d(i) d_[i] +#define min(i) min_[i] +#define max(i) max_[i] +#define mx(i) mx_[i] +#define mx1(i) mx1_[i] +#define incr1(i) incr1_[i] +#define incr2(i) incr2_[i] +#define ip(i) ip_[i] +#define sj(i) sj_[i] +#define sc(i) sc_[i] +#define bl(i) bl_[i] +#define bxy(i) bxy_[i] +#define bp(i) bp_[i] +#define g(i,j) g_[i][j] +#define go(i,j) go_[i][j] + +#define logical int +#define FALSE 0 +#define TRUE 1 +#define INT(x) ((int) (x)) +#define FLOAT(x) ((float) (x)) +#define SIN(x) sin((double) (x)) +#define COS(x) cos((double) (x)) +#define SQRT(x) sqrt((double) (x)) + +int pa = 3, qa = 4; +float asp = 0.75; + +void pascal cirb(xi, yi, ri, alfa, beta, cbord, bcint, p, q) +int *xi, *yi, *ri; +float *alfa, *beta; +int *cbord, *bcint, *p, *q; +{ + extern void pascal wyc47(); + + wyc47(*xi, *yi, (double) *ri, (double) *alfa, (double) *beta, + *cbord, *bcint, pa*(*p), qa*(*q), (double) 1.0); +} + +/*********************************************************************** +void pascal rcirb(xr, yr, r, alfa, beta, cbord, bcint, p, q) +float *xr, *yr, *r, *alfa, *beta; +int *cbord, *bcint, *p, *q; +{ + extern void pascal wyc47(); + extern float mix, miy, sxx, syy; + extern int mii, maj; + + wyc47(mii+INT(sxx*(*xr-mix)), maj-INT(syy*(*yr-miy)), (double) *r, + (double) *alfa, (double) *beta, + *cbord, *bcint, pa*(*p), qa*(*q), (double) sxx); +} +***********************************************************************/ + +void pascal wyc47(ir, jr, r, alfa, beta, cbord, bcint, p, q, cx) +int ir, jr; +double r, alfa, beta; +int cbord, bcint, p, q; +double cx; +{ + extern double sin(), cos(), sqrt(); + extern void pascal move(), pascal hfill(), pascal pushxy(), + pascal popxy(), pascal color(), pascal style(); + + float alfj,qasp,pr,a,s,c; + float alf(2+1); + long p1,q1,p2,q2,p4,q4,u,v,w,d1; + int i,j,j1,j2,j3,k,l,n,m,m1,m2,ri,x,y,py,px1, + px2,sxi,sy1,sy2,xi,dj,dxj,dyj,inc1, + pa,qa; + int ix(2+1),iy(2+1),sx(2+1),sy(3+1),d(2+1),min(5+1),max(5+1), + mx(2+1),mx1(2+1),incr1(2+1),incr2(2+1),ip(2+1),sj(2+1), + sc(3+1),g(3+1,2+1),go(3+1,2+1); + logical bl(2+1),bxy(2+1),bp(3+1); + logical bc; + static int one = 1; + + qasp=asp*FLOAT(q); + a=cx*r; + ri=INT(a); + pr=a*FLOAT(p); + q1=q*q; + q2=2*q1; + q4=2*q2; + p1=p*p; + p2=2*p1; + p4=2*p2; + for (i=1; i <= 3; i++) + { + bp(i)=FALSE; + for (j=1; j <= 2; j++) + { + go(i,j)=3; + g(i,j)=3; + } + } + sj(1)=1; + sj(2)=-1 ; + if(alfa == beta) { + n=2; + sc(1)=1; + sc(2)=-1; + bp(3)=TRUE; + bl(1)=TRUE; + bl(2)=TRUE; + goto L45; + } + alf(1)=alfa; + alf(2)=beta; + + for (j=1; j <= 2; j++) + { + alfj=alf(j); + c=COS(alfj); + s=SIN(alfj); + a=pr/SQRT(sqr(p*c)+sqr(qasp*s)); + m=INT(a*c); + sx(j)=isign(1,m); + ix(j)=m; + m=-INT(a*asp*s); + sy(j)=isign(1,m); + iy(j)=iabs(m); + } + + sy1=sy(1); + sy2=sy(2); + sc(1)=sy1; + sc(2)=sy2; + if (sy1 >= 0) { + j1=1; + j2=2; + } else { + j1=2; + j2=1; + } + + if (sy1 == sy2) { + m=sy1*(ix(2)-ix(1)); + if (isign(1,m) > 0) { + n=1; + bp(2)=TRUE; + bp(3)=TRUE; + g(1,1)=j1; + g(1,2)=j2; + go(1,1)=j1; + go(1,2)=j2; + } else { + n=3; + sc(3)=-sy1; + g(1,2)=j2; + g(2,1)=j1; + go(1,2)=j2; + go(2,1)=j1; + } + } else { + n=2; + bp(3)=TRUE; + g(1,j1)=1; + g(2,j1)=2; + go(1,j1)=1; + go(2,j1)=2; + } + + bl(1)=FALSE; + bl(2)=FALSE; + + for (j=1; j <= 2; j++) + { + dxj=iabs(ix(j)); + ix(j)=dxj; + dyj=iy(j); + ip(j)=0; + if (dyj > dxj) { + bxy(j)=TRUE; + m=2*dxj; + d(j)=m-dyj; + incr2(j)=2*(dxj-dyj); + } else { + bxy(j)=FALSE; + m=2*dyj; + d(j)=m-dxj; + incr2(j)=2*(dyj-dxj); + } + incr1(j)=m; + } + + + L45: u=0; + v=ri*p4; + d1=q2-p1*(2*ri-1); + x=ri; + min(3)=x; + max(3)=x; + bc=FALSE; + y=0; + + + L300: for (j=1; j <= 2; j++) + { + if (bl(j)) continue; + dj=d(j); + xi=ip(j); + min(j)=xi; + m=ix(j); + if (bxy(j)) { + max(j)=xi; + if (dj > 0) { + d(j)=dj+incr2(j); + if (xi >= m) bl(j)=TRUE; + ip(j)=xi+1; + } else { + d(j)=dj+incr1(j); + } + } else { + inc1=incr1(j); + L40: if (dj > 0) { + d(j)=dj+incr2(j); + ip(j)=xi+1; + max(j)=xi; + } else { + dj=dj+inc1; + xi=xi+1; + if (xi >= m) { + dj=1; + bl(j)=TRUE; + } + goto L40; + } + } + if (y == iy(j)) bl(j)=TRUE; + } + + + for (i=1; i <= n; i++) + { + if (bp(i)) continue; + j1=g(i,1); + j2=g(i,2); + if (j1 != 3) { + j3=j1; + l=1; + } else { + j3=j2; + l=2; + } + j=j1+j2; + sy(3)=sc(i); + if ((j == 4 || j == 5) && bl(j3)) { + m=ix(j3); + if (sy(j3) == sj(j3)*sx(j3)) { + bp(i)=TRUE; + min(j)=m; + max(j)=max0(max(3),m); + if (j1 != 3) { + j2=j; + } else { + j1=j; + } + } else { + g(i,l)=3; + sc(i)=sy(j3); + min(j3)=min0(min(j3),min(3)); + } + } else { + if (j == 3) { + for (l=1; l <= 2; l++) + { + j=g(i,l); + if (bl(j)) { + g(i,l)=3; + sc(i)=sy(j); + min(j)=min0(min(j),min(3)); + } + } + } + } + + j=j1; + for (l=1; l <= 2; l++) + { + m1=max(j); + m2=min(j); + if (j < 3) { + sxi=sx(j); + } else { + sxi=-sj(l); + if (j == 3) { + k=go(i,l); + if (k < 3) { + m1=min0(m1,max(k)); + m2=min0(m1,m2); + } + } + } + if (sxi > 0) { + mx(l)=ir+m2; + mx1(l)=ir+m1; + } else { + mx(l)=ir-m1; + mx1(l)=ir-m2; + } + j=j2; + } + + py=jr+sy(j3)*y; + if (bcint != 0) { + px1=mx1(1)+1; + px2=mx(2)-1; + if (px1 <= px2) { + move(&px1,&py); + hfill(&px2); + } + } + pushxy(); + color(&cbord); + style(&one); + move(&mx(1),&py); + hfill(&mx1(1)); + move(&mx(2),&py); + hfill(&mx1(2)) ; + popxy(); + } + + if (x == 0) return; + + + if (bp(1) && bp(2) && bp(3)) return; + if (bc) goto L240; + + u=u+q4; + if (d1 < 0) { + d1=d1+u+q2; + } else { + v=v-p4; + w=u-v; + if (w > 0) { + bc=TRUE; + w=w/2-v; + } + d1=d1+w+q2; + x=x-1; + } + y=y+1; + min(3)=x; + max(3)=x; + if (bc) goto L250; + goto L300; + + L240: max(3)=x; + y=y+1; + L250: v=v-p4; + x=x-1; + if (d1 > 0) { + d1=d1-v+p2; + } else { + u=u+q4; + d1=d1+u-v+p2; + min(3)=x+1; + goto L300; + } + if (x > 0) goto L250; + min(3)=x; + goto L300; +} + + diff --git a/sources/int/graf/doc/distrib.txt b/sources/int/graf/doc/distrib.txt new file mode 100644 index 0000000..90392ab --- /dev/null +++ b/sources/int/graf/doc/distrib.txt @@ -0,0 +1,83 @@ + + Zestaw dystrybucyjny pakietu + podstawowych procedur graficznych IIUWGRAF + ( wersja 2.2 ) + + +1. IIUWGRAF TXT - dokumentacja + + DISTRIB.TXT - niniejszy tekst + IIUWGRAF.DOC - podrecznik ( pod PWORDem ) + IIUWGRAF.STY - definicja stylow ( WORD ) + IIUWGRAF.DHN - podrecznik ( WORD, wersja DHN ) + IIUWGRAF.POL - podrecznik ( bez polskich liter, do drukowania ) + GRAPH.H - deklaracja procedur IIUWGRAFu dla MS Pascala + + +2. IIUWGRAF_LB - biblioteki + + HGCMSF.LIB - Hercules, MS Fortran/Pascal + HGCMSF4.LIB - Hercules, MS Fortran v.4.00 + MGCMSF.LIB - IBM Color/Graphics, MS Fortran/Pascal + MGCMSF4.LIB - IBM Color/Graphics, MS Fortran v.4.00 + MGC64MSF.LIB - IBM Color/Graphics (tryb 640*200), + MS Fortran/Pascal + MGC64MF4.LIB - IBM Color/Graphics (tryb 640*200), + MS Fortran v.4.00 + HGCCS.LIB - Hercules, Lattice C model S + HGCCD.LIB - Hercules, Lattice C model D + HGCCP.LIB - Hercules, Lattice C model P + HGCCL.LIB - Hercules, Lattice C model L + + +3. IIUWGRAF_LC - biblioteki ( Lattice C ) + + MGCCS.LIB - IBM Color/Graphics, Lattice C model S + MGCCD.LIB - IBM Color/Graphics, Lattice C model D + MGCCP.LIB - IBM Color/Graphics, Lattice C model P + MGCCL.LIB - IBM Color/Graphics, Lattice C model L + MGC64CS.LIB - IBM Color/Graphics (tryb 640*200), + Lattice C model S + MGC64CD.LIB - IBM Color/Graphics (tryb 640*200), + Lattice C model D + MGC64CP.LIB - IBM Color/Graphics (tryb 640*200), + Lattice C model P + MGC64CL.LIB - IBM Color/Graphics (tryb 640*200), + Lattice C model L + + +4. HGCDEMO + + HGCDEMO.EXE - program pokazowy dla karty Hercules + HGCFEDIT.EXE - edytor znakow ( Hercules ) + DUMP1.DAT - dane dla programu pokazowego + DUMP2.DAT - dane dla programu pokazowego + HGCPRINT.EXE - program do drukowania obrazu graficznego, + ( Hercules ) + + + +5. MGCDEMO + + MGCDEMO.EXE - program pokazowy dla karty IBM Color/Graphics + MGCFEDIT.EXE - edytor znakow ( IBM Color/Graphics ) + + MGC64DEM.EXE - program pokazowy dla karty + IBM Color/Graphics ( tryb 640*200 ) + MGC64FED.EXE - edytor znakow + ( IBM Color/Graphics, tryb 640*200 ) + MGCPRINT.EXE - program do drukowania obrazu graficznego + ( IBM Color/Graphics ) + + +6. IIUWGRAF EGA ( zestaw dystrybucyjny dla karty EGA ) + + EGAMSF.LIB - biblioteka, MS Fortran/Pascal + EGAMSF4.LIB - biblioteka, MS Fortran v.4.00 + EGACS.LIB - biblioteka, Lattice C model S + EGACD.LIB - biblioteka, Lattice C model D + EGACP.LIB - biblioteka, Lattice C model P + EGACL.LIB - biblioteka, Lattice C model L + + EGADEMO.EXE - program pokazowy + EGAFEDIT.EXE - edytor znakow diff --git a/sources/int/graf/doc/fedit.doc b/sources/int/graf/doc/fedit.doc new file mode 100644 index 0000000..ec7987e --- /dev/null +++ b/sources/int/graf/doc/fedit.doc @@ -0,0 +1,116 @@ + + FEDIT - a simple font editor for IBM PC + a companion to IIUWGRAF graphics library + +FEDIT allows to create and modify 8*8 pixel patterns. Such +patterns may be displayed as part of graphics screen image +via the "hascii" function. + +Font tables can be prepared by FEDIT in two formats: + + - as an assembly subroutine, + delivering address of the font table + in the form suitable for passing to "hfont" + - as an independent program, + setting up pointer to the font table in + the location of interrupt vector 31. + +The first format can be used to replace the standard font +usually found in ROM BIOS at location F000:FA6E. It is used +by "hascii" for drawing character codes 0 to 127. The subroutine +generated by FEDIT has to be linked together with the application. +This is "base 0" format. +FEDIT generates the subroutine with the name "hfont8". Should +another name be desired (e.g. when font tables are to be switched +dynamically), it may changed by hand in the assembly source. + +The second format is used when drawing characters from the +extended range 128 to 255. This font has to be loaded into +memory before execution of the application program that +uses it by invoking the program generated by FEDIT. +This is "base 128" format. +FEDIT generates this table as part of an independent program, +that sets up the vector address and exits via "terminate and +stay resident". +FEDIT and HGCGRAPHICS do not provide facilities for dynamic +switching of this extended font table. + + +For example, + + integer*2 iseg,ioffs + call hfont8(iseg,ioffs) + ... + call hascii(45) ; uses ROM BIOS + call hascii(145) ; extended table + ... + call hfont(iseg,ioffs) + call hascii(45) ; uses FEDIT font + call hascii(145) ; same extended table + .... + call hfont(16#f000,16#fa6e) + call hascii(45) ; ROM BIOS again + call hascii(145) ; same extended table + + +FEDIT is a simple conversational program with few commands. The basic +idea is to have a table of 8*8 pixel patterns that can be modified +interactively. A single character can be brought out of the table for +editing and returned, possibly to a different position in the table. +There are two tables, one for character codes 0 through 127, the other +for codes 128 through 255. The first table is read-only. The second table +can be initialized by an already resident extended font table, loaded +from a FEDIT-created file or initialized as empty. The second table can be +written out to file in one of two formats discussed above. + +FEDIT commands are entered as single keystrokes selecting the commands +listed in a menu appearing on top of the screen. +Additional parameters, if any, are prompted for. + +FEDIT commands: + +< low redisplays the 0 to 127 table + +> high redisplays the 128 to 255 table + +i init initializes 128 to 255 table to all zeros + +l load loads the 128 to 255 table from file; + asks for the file name + +d dump dumps the 128 to 255 table to file; + asks for the file name; + asks for base, which should be either 0 or + 128, indicating one of the two formats + asks for target: + f - ms fortran, ms pascal + s - lattice c, s model + p - lattice c, p model + d - lattice c, d model + l - lattice c, l model + +e edit brings a character into the editing area + asks for a character code (in decimal); + during editing, cursor keys may be used + to select pixel position, "INS" to set + the pixel on, "DEL" to set it off, "END" + to exit edit mode. + +t text accepts a short text that will be displayed + during the editing as an additional help + for judgement of the quality of the appearance + of currently edited character; + asks for vspace & hspace : horizontal & vertical + spacing between adjacent character boxes, + then waits for a string (at most 40 chars). + +p put saves the pattern in the editing buffer + in the font table; + asks for a code (in decimal) which should + be in the range 128 through 255 + +q quit exits from FEDIT + +FEDIT is not foolproof, e.g. it will not survive an attempt to load +a non-existing font file and it will overwrite an existing file +without warning if asked to. diff --git a/sources/int/graf/doc/gmouse.doc b/sources/int/graf/doc/gmouse.doc new file mode 100644 index 0000000..5cbc5f7 --- /dev/null +++ b/sources/int/graf/doc/gmouse.doc @@ -0,0 +1,1321 @@ + PROGRAMMER'S REFERENCE FOR GENIUS MOUSE DRIVER + +*** 1 : BRIEF DESCRIPTION + +The Genius Mouse Driver enables you to use mouse hardware to move an on-screen +cursor and control its movement through a software program. Various functions +allow you to determine cursor placement, cursor shape, and button status. + +In order for you to interface your Genius Mouse with an application program, the +following information on the Genius Driver has been provided. + +*** 2 : GRAPHICS AND TEXT CURSORS + +GMOUSE Driver supports a hardware text cursor, a software text cursor, and +a graphics cursor. A hardware text cursor is a blinking cursor which moves from +one character to another on-screen. This blinking cursor may take the form of a +block or underscore. A software text cursor makes use of display attributes to +change the visual appearance of a character on-screen. Movement is from +character to character. A graphics cursor is a shape that moves over on-screen +images. + +You can choose any of these three cursors to use on-screen, however, only one +cursor can be displayed at a given time. Also, within your application program, +you can switch back and forth between cursors. + + +Display the Graphics Cursor + +The cursor appears on-screen or disappears from the screen through the calling +program. This cursor consists of a block of pixels. As this block moves +on-screen and affects the pixels beneath it, the cursor shape and background are +created. This interaction is defined by two 16-by-16 bit arrays; +one is the screen mask and the other is the cursor mask. The screen mask +determines what part of the cursor pixel is to be the shape, and what part is +is to be the background. The cursor mask determines which pixels contribute to +the color of the cursor. Whenever changes are made to the screen which lie +directly beneath the cursor, the cursor should be concealed so that old values +are not restored to the screen. + +Please note that with a high resolution mode, you have a 16-by-16 pixel block; +with a medium resolution (four color) mode, you have a 8-by-16 pixel block; with +a medium resolution (sixteen color) mode, you have a 4-by-16 pixel block. + +Refer to function 9. + +To create the cursor, the software uses data from the computer's screen memory +which defines the color of each pixel on-screen. Operations are performed that +affect individual screen bits. Software ANDs the screen mask defining the +pixels under the cursor and XORs the cursor mask with the result of the AND +operation. + +Note the results when: + + + + + + + page 1 + +Screen Mask Bit is Cursor Mask Bit is Resulting Screen Bit is +------------------ ------------------ ----------------------- + 0 0 0 + 0 1 1 + 1 0 unchanged + 1 1 inverted + +With each mouse function, a reference to the graphics cursor location is in +reference to a point on-screen directly beneath the cursor. This point that the +mouse software uses to determine the cursor coordinates is known as the cursor's +hot spot. +Generally, the upper_left hand corner of the cursor block is designated as the +coordinates for the cursor default value. ((0,0) are the upper_left hand corner +coordinates.) + +Software Text Cursor + +You can use this text cursor when your computer is in one of the text modes. By +changing the character attributes beneath the cursor, the appearance of the +character is influenced on-screen. This effect on the text cursor can be +defined by two 16-bit mask values. These bits can be described as follows: +bit 15 sets the blinking (1) or non-blinking (0) character ; bit 12 - 14 set the +background (1); bits 8 - 10 set the foreground color; and bits 0 - 7 set the +character code. These values in the screen mask and the cursor mask +determine the character's new attributes when the cursor is covering the +character. The screen mask decides which of the character's attributes are +maintained. The cursor mask decides in what manner the attributes are altered +to produce the cursor. + +In creating this cursor, the software works from data which defines each +character on the screen. The software first ANDs the screen mask and the screen +data bit for the character beneath the cursor. Next, the software XORs the +cursor mask and the result of the AND operation. + +When a function refers to the text cursor location, it gives the coordinates of +the character beneath the cursor. + +Refer to function 10. + +Hardware Text Cursor + +This cursor is also available when the computer is in one of the text modes. +This cursor is the one seen on-screen when the computer is powered on. It +consists of 8 pixels wide and 8 to 14 pixels tall. Software allows you to use +this cursor for your needs. Scan lines determine a cursor's appearance +on-screen. A scan line consists of a horizontal set of pixels. +If a line is on, there will be flashing on the screen. If a line is off, there +is no effect. Scan lines are numbered from 0 to 7, or 0 to 11 depending on the +type of display used. 0 indicates the top scan line. + +Refer to function 10. + +*** 2.1 : Mouse Buttons + +Mouse functions can give the status of the mouse buttons and the number of times +a certain button has been pressed and released. The button status is given as +an integer. If a bit is set to 1 the button is down; if a bit is set to 0, the +button is up. + page 2 + + Bit 0 - Left Button Status + Bit 1 - Right Button Status + Bit 2 - Middle Button Status +Each time a mouse button is pressed, a counter records the number of presses and +releases. The software sets the counter to zero once it has been read or after +a reset. + +*** 2.2 : Unit of Distance - Mouse Motion + +The motion of the mouse can be expressed in a unit of distance (mouse motion) +and is approximately 1/200 of an inch. + +With mouse movement, mouse software determines a horizontal and vertical mouse +motion count. This count is used by the software to move a cursor a certain +number of pixels on-screen. Software defines mouse motion sensitivity (the +number of mouse motions needed to move the cursor 8 pixels on-screen) and this +sensitivity determines the rate at which the cursor moves on-screen. + +Refer to function 15. + +*** 2.3 : Internal Cursor Flag + +Mouse software supports an internal flag. This flag determines when the cursor +should appear on-screen. If the flag equals 0, the cursor appears on-screen; if +the flag is any other number, the cursor disappears from the screen. + +You can call functions 1 and 2 a number of times, however, if you call function +2, you must call function 1 later. This is necessary to restore the flag's +previous value. + +Refer to functions 1 and 2. + +*** 3 : CALLING FROM ASSEMBLY LANGUAGE PROGRAMS + +To make mouse function calls: + +Load the appropriate registers (AX, BX, CX, DX) with the parameter values. +These correspond to G1%, G2%, G3%, and G4% as shown in the BASIC example to +follow. Then execute software interrupt 51 (33H). The values given by the +mouse functions will be installed in the registers. + + +Example: + + ; * set cursor to location (150,100) + Mov AX,4 ;(function call 4) + Mov CX,150 ;(set horizontal to 150) + Mov DX,100 ;(set vertical to 100) + Int 51(33H) ;(interrupt to mouse) + +It is important to note that before using INT 33H, one should verify the +presence of the mouse driver. Executing an INT 33H will cause uncertain results +if the mouse driver is not loaded. Assume a mouse driver is present when INT +33H vector is non-zero and the vector does not point to an IRET instruction. + +Note: When making a mouse call in Assembly Language, expect somewhat of a +different value for the fourth parameter (when compared with calls using a BASIC +program) involving functions 9, 12, and 16. + page 3 + +*** 4 : CALLING FROM BASIC LANGUAGE PROGRAM + +To make mouse function calls: + + Set a pair of integer variables in your program for the offset and the segment + of the mouse driver entry point. + + In order to obtain the offset and segment values, the following statements + must be inserted into your program before any calls to mouse functions: + +10 DEF SEG = 0 +15 ' GET GMOUSE ENTRY POINT +20 GMSEG = PEEK( 51*4 + 2 ) + 256 * PEEK( 51*4 + 3 ) ' GET SEGMENT ENTRY +30 GMOUSE = 2 + PEEK( 51*4 ) + 256 * PEEK( 51*4 + 1 ) ' GET OFFSET ENTRY +40 DEF SEG = GMSEG ' SET SEGMENT REGISTER AS THE SEGMENT OF GMOUSE + +To enter the mouse driver, use the CALL statement: + + CALL GMOUSE (G1%, G2%, G3%, G4%) + +GMOUSE contains the entry offset of the mouse driver. G1%, G2%, G3%, and G4% +are the integer variables given in the call. These four must be specified in +the CALL statement even if a value is not assigned. When a value is assigned, +it must be an integer, that is, a whole number. + +Example: + +50 ' Find the Activated Mode of Genius Mouse +60 G1% = 0 : G2% = 0 +70 CALL GMOUSE ( G1%, G2%, G3%, G4% ) +80 IF G2% AND 2 THEN PRINT "Genius Mouse ( 2_Button Mode ) Enable" +90 IF G2% AND 3 THEN PRINT "Genius Mouse ( 3_Button Mode ) Enable" +100 IF NOT G1% THEN PRINT "Can't Find Genius Mouse" + +*** 5 : MOUSE FUNCTIONS + +These functions listed apply to the Genius Mouse. Further descriptions of each +mouse function will be given in the following pages. + +Functions Function Number +----------------------------------------------------------------- +Reset Genius Mouse Driver 0 +Enable Cursor Display 1 +Disable Cursor Display 2 +Read Cursor Location & Button State of Genius Mouse 3 +Set Cursor Location of Genius Mouse 4 +Read Button Press State of Genius Mouse 5 +Read Button Release State of Genius Mouse 6 +Define Horizontal (X) Range of Cursor Location 7 +Define Vertical (Y) Range of Cursor Location 8 +Define Graphics Mode Cursor Style 9 +Define Text Mode Cursor Style 10 +Read Genius Mouse Motion Number 11 +Define Event Handler Entry Location 12 +Enable Light Pen Emulation Function 13 +Disable Light Pen Emulation Function 14 +Define Sensitivity (Mouse Motion/Pixel) of Genius Mouse 15 + + page 4 + +Disable Cursor Display in Special Range 16 +Define Double-Speed Threshold 19 + +EGA functions are described in Section *** 7. + +*** 6 : DESCRIPTION OF THE MOUSE FUNCTIONS + +You'll notice that with the following mouse function descriptions, the +parameters needed to make the calls and the expected outcome (return) for each +is indicated. Also, any special conditions regarding any of the mouse functions +have been included. Further, an example of a program has been provided in order +for you to understand how to make the call. + +The input and return values are presented for 8086 registers and for BASIC in +the following pages. + +It is important to note that each mouse function call needs four parameters. +The Genius Mouse software does not verify any input values, and therefore, if +any incorrect values are given, uncertain results will occur. + +Function 0: Reset Genius Mouse Driver + +Function 0 gives the current status of the mouse hardware plus the current +status of the mouse software. The calling program is able to determine the +presence of a mouse driver and/or a serial port. + +This function resets the mouse driver to the following default status as +indicated: + +Variable Value +------------------------------------------------------------------------------ +internal cursor flag -1 (cursor concealed) +graphics cursor shape horizontal oval +text cursor reverse video +user-defined call mask all zeroes +light pen emulation mode enabled +vertical mouse motion/pixel ratio 16 to 8 +horizontal mouse motion/pixel ratio 8 to 8 +vertical min/max cursor coordinates 0/current display mode y values minus 1 +horizontal min/max cursor coordinates 0/current display mode x values minus 1 + +8086 Register +Input: AX = 0 +Return: AX = mouse state (-1: installed, 0: not installed) + BX = number of buttons (2 button mode, 3 button mode) + +BASIC +Input: G1% = 0 +Return: G1% = mouse state (-1: installed, 0: not installed) + G2% = number of buttons (2 button mode, 3 button mode) + +Example: Used initially to determine if the GMOUSE driver is present and to + reset GMOUSE. + + + + + + page 5 + +50 ' Find the Actived Mode of Genius Mouse +60 G1% = 0 : G2% = 0 +70 CALL GMOUSE ( G1%, G2%, G3%, G4% ) +80 IF G2% AND 2 THEN PRINT "Genius Mouse ( 2_Button Mode ) Enable" +90 IF G2% AND 3 THEN PRINT "Genius Mouse ( 3_Button Mode ) Enable" +100 IF NOT G1% THEN PRINT "Can't Find Genius Mouse" + +Function 1: Enable Cursor Display + +Function 1 increments the internal cursor flag counter. If the counter is zero, +the cursor is enabled and appears on-screen. + +The default value is -1 which indicates a concealed cursor. Function 1 must be +called to display the cursor. In case the internal cursor flag is already zero, +a call to this function produces no effect. + +8086 Register +Input: AX = 1 +Return: none + +BASIC +Input: G1% = 1 +Return: none + +Example: + +110 ' Enable Genius Mouse's Cursor +120 G1% = 1 +130 CALL GMOUSE ( G1%, G2%, G3%, G4% ) + +Function 2: Disable Cursor Display + +Function 2 disables the cursor by removing it from the screen and decrementing +the internal cursor flag. Even though the cursor cannot be seen, it still +tracks any motion made with the mouse. + +You should use this function before changing any portion of the screen +containing the cursor. You will avoid the problem of the cursor affecting +screen data. + +Keep in mind that whenever your program calls function 2, it must later call +function 1 to return the internal cursor flag to its default value. In +addition, if your program changes the screen mode, function 2 is called +automatically. Therefore, the cursor's movement is enabled the next time it is +displayed. + +Call function 2 at the end of a program in order to conceal the cursor. This +ensures that nothing remains on-screen. + +8086 Register +Input: AX = 2 +Return: none + +BASIC +Input: G1% = 2 +Return: none + +Example: + page 6 + +110 ' Disable Genius Mouse's Cursor +120 G1% = 2 +130 CALL GMOUSE ( G1%, G2%, G3%, G4% ) + +Function 3: Read Cursor Location & Button State of Genius Mouse + +Function 3 gives the status of mouse buttons, plus cursor location. + +Button status consists of a single integer value: + Bit 0 = left button (2 button mode, 3 button mode) + Bit 1 = right button (2 button mode, 3 button mode) + Bit 2 = middle button (3 button mode) + +The bit is 1 when the button is pressed. The bit is 0 when the button is +released. + +8086 Register +Input: AX = 3 +Return: BX = button status + CX = horizontal cursor coordinate + DX = vertical cursor coordinate + +BASIC +Input: G1% = 3 +Return: G2% = button status + G3% = horizontal cursor coordinate + G4% = vertical cursor coordinate + +Example: + +110 ' Read Genius Mouse Location & Button State +120 G1% = 3 +130 CALL GMOUSE ( G1%, G2%, G3%, G4% ) +140 PRINT "Genius Mouse Location : X_Coord=" G3% " Y_Coord=" G4% +150 IF G2% AND 1 THEN PRINT "Left Button" +160 IF G2% AND 2 THEN PRINT "Right Button" +170 IF G2% AND 4 THEN PRINT "Middle Button" +180 PRINT "Pressed" + +Function 4: Set Cursor Location of Genius Mouse + +Function 4 sets the current cursor location. Values must be within the +coordinate ranges for the virtual screen and, if necessary, are rounded to the +nearest values allowed for the current screen mode. + + Screen Display Virtual Cell Bits/Pixel + Mode Adapter Screen (XxY) Size Graphics Mode +--------- ------------ --------------- -------- ---------------- + 0 C, E, 3270 640 x 200 16 x 8 - + 1 C, E, 3270 640 x 200 16 x 8 - + 2 C, E, 3270 640 x 200 8 x 8 - + 3 C, E, 3270 640 x 200 8 x 8 - + 4 C, E, 3270 640 x 200 2 x 1 2 + 5 C, E, 3270 640 x 200 2 x 1 2 + 6 C, E, 3270 640 x 200 1 x 1 1 + 7 M, E, 3270 640 x 200 8 x 8 - + + + page 7 + + D E 640 x 200 16 x 8 2 + E E 640 x 200 1 x 1 1 + F E 640 x 350 1 x 1 1 + 10 E 640 x 350 1 x 1 1 + 30 3270 720 x 350 1 x 1 1 + H 720 x 348 1 x 1 1 + +Display Adapter: + M = IBM Monochrome Display/Printer Adapter + C = IBM Color/Graphics Adapter + E = IBM Enhanced Graphics Adapter +3270 = IBM All Points Addressable Graphics Adapter (3270 PC) + H = Hercules Monochrome Graphics Card + +8086 Register +Input: AX = 4 + CX = new horizontal cursor coordinate + DX = new vertical cursor coordinate +Return: none + +BASIC +Input: G1% = 4 + G3% = new horizontal cursor coordinate + G4% = new vertical cursor coordinate +Return: none + +Example: + +110 ' Set Cursor Location at the Upper_Left Corner of Screen +120 G1% = 4 +130 G3% = 0 : G4% = 0 +140 CALL GMOUSE ( G1%, G2%, G3%, G4% ) + +Function 5: Read Button Press State of Genius Mouse + +Function 5 provides status on the specified button, gives the number of button +presses since the last call, and produces the location of the cursor at last +button press. + +Button status consists of a single integer value. Again, as in function 3: + Bit 0 = left button (2 button mode, 3 button mode) + Bit 1 = right button (2 button mode, 3 button mode) + Bit 2 = middle button (3 button mode) + +The bit is 1 when the button is pressed. The bit is 0 when the button is +released. + +The number of button presses will always fall in the range of 0 to 32767. There +is no indicator for overflow. Following this function call, the count is reset +to zero. + +8086 Register +Input: AX = 5 + BX = button status (left = 0, right = 1, middle = 2) +Return: AX = button status + BX = number of button presses + CX = horizontal cursor coordinate at last press + DX = vertical cursor coordinate at last press + page 8 + +BASIC +Input: G1% = 5 + G2% = button status (left = 0, right = 1, middle = 2) +Return: G1% = button status + G2% = number of button presses + G3% = horizontal cursor coordinate at last press + G4% = vertical cursor coordinate at last press + +Example: + +110 ' Read the Left Button Press State of Genius Mouse +120 G1% = 5 : G2% = 2 +130 CALL GMOUSE ( G1%, G2%, G3%, G4% ) +140 IF G1% AND 2 THEN PRINT "The Middle Button Pressed at X_loc=" G3% + +Function 6: Read Button Release State of Genius Mouse + +Function 6 provides status on the specified button, gives the number of button +releases since the last call, and provides the location of the cursor at the +last button release. + +Button status consists of a single integer value. Again, as in function 3: + Bit 0 = left button (2 button mode, 3 button mode) + Bit 1 = right button (2 button mode, 3 button mode) + Bit 2 = middle button (3 button mode) + +The bit is 1 when the button is pressed. The bit is 0 when the button is +released. + +The number of button releases will always fall in the range of 0 to 32767. +There is no indicator for overflow. Following this function call, the count is +reset to zero. + +8086 Register +Input: AX = 6 + BX = button status (left = 0, right = 1, middle = 2) +Return: AX = button status + BX = number of button releases + CX = horizontal cursor coordinate at last release + DX = vertical cursor coordinate at last release + +BASIC +Input: G1% = 6 + G2% = button status (left = 0, right = 1, middle = 2) +Return: G1% = button status + G2% = number of button releases + G3% = horizontal cursor coordinate at last release + G4% = vertical cursor coordinate at last release + +Example: + +110 ' Read the Left Button Release State of Genius Mouse +120 G1% = 6 : G2% = 2 +130 CALL GMOUSE ( G1%, G2%, G3%, G4% ) +140 IF NOT G1% OR &HFFFB THEN PRINT "The Middle Button Released at X_loc=" G3% + + + + page 9 + +Function 7: Define Horizontal (X) Range of Cursor Location + +Function 7 defines the horizontal range of the cursor on-screen. As a result, +cursor movement is limited to this specified area. If a cursor happens to be +outside of this area when a call is made, the cursor is moved to just inside the +area. + +8086 Register +Input: AX = 7 + CX = minimum horizontal cursor coordinate + DX = maximum horizontal cursor coordinate +Return: none + +BASIC +Input: G1% = 7 + G3% = minimum horizontal cursor coordinate + G4% = maximum horizontal cursor coordinate +Return: none + +Example: + +110 ' Enable Cursor in Horizontal Range between 100 to 200 +120 G1% = 7 +130 G2% = 100 : G3% = 200 +140 CALL GMOUSE ( G1%, G2%, G3%, G4% ) + +Function 8: Define Vertical (Y) Range of Cursor Location + +Function 8 defines the vertical range of the cursor on-screen. As a result, +cursor movement is limited to this specified area. If a cursor happens to be +outside of this area when a call is made, the cursor is moved to just inside the +area. + +8086 Register +Input: AX = 8 + CX = minimum vertical cursor coordinate + DX = maximum vertical cursor coordinate +Return: none + +BASIC +Input: G1% = 8 + G3% = minimum vertical cursor coordinate + G4% = maximum vertical cursor coordinate +Return: none + +Example: + +110 ' Enable Cursor in Vertical Range between 100 to 200 +120 G1% = 8 +130 G2% = 100 : G3% = 200 +140 CALL GMOUSE ( G1%, G2%, G3%, G4% ) + +Function 9: Define Graphics Mode Cursor Style + +Function 9 defines the style of the cursor in terms of color, shape, and center +for the graphics. As mentioned before, this cursor is a 16-by-16 pixel block +and is defined by two 16-bit arrays (the screen mask bit and the cursor mask +bit). Cursor coordinates for the hot spot must be in the range of -16 to +16. + page 10 + +8086 Register +Input: AX = 9 + BX = horizontal cursor hot spot + CX = vertical cursor hot spot + DX = pointer to screen and cursor mask +Return: none + +BASIC +Input: G1% = 9 + G2% = horizontal cursor hot spot + G3% = vertical cursor hot spot + G4% = pointer to screen and cursor mask +Return: none + +Example: + +10 ' Define the screen mask +20 ' +30 cursor (0,0) = &HFFFF '1111111111111111 +40 cursor (1,0) = &HFFFF '1111111111111111 +50 cursor (2,0) = &HFFFF '1111111111111111 +60 cursor (3,0) = &HFFFF '1111111111111111 +70 cursor (4,0) = &HFFFF '1111111111111111 +80 cursor (5,0) = &HF00F '1111000000001111 +90 cursor (6,0) = &H0000 '0000000000000000 +100 cursor (7,0) = &H0000 '0000000000000000 +110 cursor (8,0) = &H0000 '0000000000000000 +120 cursor (9,0) = &H0000 '0000000000000000 +130 cursor (10,0) = &HF00F '1111000000001111 +140 cursor (11,0) = &HFFFF '1111111111111111 +150 cursor (12,0) = &HFFFF '1111111111111111 +160 cursor (13,0) = &HFFFF '1111111111111111 +170 cursor (14,0) = &HFFFF '1111111111111111 +180 cursor (15,0) = &HFFFF '1111111111111111 +190 ' +200 ' Define the cursor mask +210 ' +220 cursor (0,1) = &H0000 '0000000000000000 +230 cursor (1,1) = &H0000 '0000000000000000 +240 cursor (2,1) = &H0000 '0000000000000000 +250 cursor (3,1) = &H0000 '0000000000000000 +260 cursor (4,1) = &H0000 '0000000000000000 +270 cursor (5,1) = &H0000 '0000000000000000 +280 cursor (6,1) = &H07E0 '0000011111100000 +290 cursor (7,1) = &H7FFE '0111111111111110 +300 cursor (8,1) = &H7FFE '0111111111111110 +310 cursor (9,1) = &H07E0 '0000011111100000 +320 cursor (10,1) = &H0000 '0000000000000000 +330 cursor (11,1) = &H0000 '0000000000000000 +340 cursor (12,1) = &H0000 '0000000000000000 +350 cursor (13,1) = &H0000 '0000000000000000 +360 cursor (14,1) = &H0000 '0000000000000000 +370 cursor (15,1) = &H0000 '0000000000000000 +380 ' +390 ' Set the cursor style and hot spot number of Genius Mouse +400 ' + + + page 11 + +410 ' +420 G1% = 9 +430 G2% = 6 ' horizontal hot spot +440 G3% = 5 ' vertical hot spot +450 CALL GMOUSE ( G1%, G2%, G3%, cursor (0,0)) + +Function 10: Define Text Mode Cursor Style + +Function 10 chooses the hardware or the software text cursor. + +For example, if BX (G2%) is 1, the hardware cursor is selected and the hardware +is set up with the first and last scan lines which define the cursor. +(Values for CX (G3%) and DX (G4%) range from 0 to 7 for the color display and 0 +to 11 for the monochrome display.) + +If BX (G2%) is 0, the software cursor is selected; and CX (G3%) and DX (G4%) +must specify the screen and cursor masks. (These masks give the attributes and +character code of the cursor, and their values are dependent on the type of +display in use.) + +8086 Register +Input: AX = 10 + BX = select cursor (0: software text, 1: hardware text) + CX = screen mask value/scan line start + DX = cursor mask value/scan line stop +Return: none + +BASIC +Input: G1% = 10 + G2% = select cursor (0: software text, 1: hardware text) + G3% = screen mask value/scan line start + G4% = cursor mask value/scan line stop +Return: none + +Example: + +110 ' Enable an Inverting Cursor +120 G1% = 10 +130 G2% = 0 +140 G3% = &HFFFF : G4% = &H7700 +150 CALL GMOUSE ( G1%, G2%, G3%, G4% ) + +Function 11: Read Genius Mouse Motion Number + +Function 11 gives the mouse motion number since the last call. A positive +horizontal number indicates rightward movement (negative shows leftward +movement). A positive vertical number indicates downward movement (negative +shows upward movement). +The number is always in the range of -32768 to 32767. Overflow is disregarded. +Once the call is completed, the number is set to 0. + +8086 Registers +Input: AX = 11 +Return: CX = horizontal number + DX = vertical number + + + + page 12 + +BASIC +Input: G1% = 11 +Return: G3% = horizontal number + G4% = vertical number + +Example: + +110 ' Read Genius Mouse Motion Number +120 G1% = 11 +130 CALL GMOUSE ( G1%, G2%, G3%, G4% ) +140 IF G3% > 0 THEN PRINT "Genius Mouse is Moving to Right" +150 IF G4% > 0 THEN PRINT "Genius Mouse is Moving Down" + +Function 12: Define Event Handler Entry Location + +Function 12 defines the address entry location of an event handler routine which +is called when a certain event (defined by the call mask) occurs. The program +is temporarily interrupted by the mouse driver. At the end of the event handler +routine the program continues at the point it was interrupted. + +The call mask is a single integer value defining the conditions which will cause +an interrupt. + +A specific condition corresponds to a bit in the call mask: + +Mask Bit Condition +-------------------------------------------------- + 0 cursor location changed + 1 left button pressed + 2 left button released + 3 right button pressed + 4 right button released + 5 middle button pressed + 6 middle button released + 7 - 15 not used + +In order to call the event handler routine, set the mask bit to 1 and put the +mask in at CX (G3%). To disable, set the mask bit to 0 and put the mask in at +CX (G3%). Always be sure to set the call mask to 0 before the program finishes. +(Leave the system in the same state upon exit as if was upon entrance.) + +8086 Register +Input: AX = 12 + CX = call mask + ES:DX = pointer to event handler routine +Return: none + +BASIC +Input: G1% = 12 + G3% = call mask + G4% = pointer to event handler routine +Return: none + +Example: + + + + + page 13 + +110 ' Active BUTTDOWN Event Handler Routine, When One or More Buttons Pressed +120 G1% = 12 +130 G3% = &H002A : G4% = BUTTDOWN% +140 CALL GMOUSE ( G1%, G2%, G3%, G4% ) + +Function 13: Enable Light Pen Emulation Function + +Function 13 permits the mouse to act like a light pen. When in this mode, calls +to the pen function will give the cursor coordinates at the last pen down +location. + +Note that the status of "pen down" and "pen off-screen" is controlled by the +mouse buttons: all buttons up, pen off-screen; one button pressed, pen down. + +Light pen emulation is ON after each call to function 0 (Reset Mouse Driver). + +8086 Register +Input: AX = 13 +Return: none + +BASIC +Input: G1% = 13 +Return: none + +Example: + +110 ' Enable Light Pen Emulation Function +120 G1% = 13 +130 CALL GMOUSE ( G1%, G2%, G3%, G4% ) + +Function 14: Disable Light Pen Emulation Function + +Function 14 turns off the light pen emulation mode. When disabled, any call to +the pen function will give information only about a real light pen. + +8086 Register +Input: AX = 14 +Return: none + +BASIC +Input: G1% = 14 +Return: none + +Example: + +110 ' Disable Light Pen Emulation Function +120 G1% = 14 +130 CALL GMOUSE ( G1%, G2%, G3%, G4% ) + +Function 15: Define Sensitivity (Mouse Motion/Pixel) of Genius Mouse + +Function 15 defines mouse sensitivity as determined by the mouse motion/pixel +ratio. This is a way of setting the amount of cursor motion wanted for mouse +movement. These ratios specify mouse motion per 8 pixels. These values must +be in the range of 1 to 32767. With a larger ratio, the cursor movement is +shortened for each mouse movement. + + + page 14 + +Default values: horizontal ratio - 8 mouse motions to 8 pixels + vertical ratio - 16 mouse motions to 8 pixels + +Note: 1 mouse motion = 1/200 of an inch increment + +8086 Register +Input: AX = 15 + CX = horizontal mouse motion counts to pixel ratio + DX = vertical mouse motion counts to pixel ratio +Return: none + +BASIC +Input: G1% = 15 + G3% = horizontal mouse motion counts to pixel ratio + G4% = vertical mouse motion counts to pixel ratio +Return: none + +Example: + +110 ' Define Horizontal Sensitivity as 8 +120 ' Define Vertical Sensitivity as 16 +130 G1% = 15 +140 G3% = 8 +150 G4% = 16 +160 CALL GMOUSE ( G1%, G2%, G3%, G4% ) + +Function 16: Disable Cursor Display in Special Range + +Function 16 sets up a special range on-screen. If the cursor moves to this area +or is in this area, it will be disabled. After a call is made to this function, +it is necessary to call function 1 to enable the cursor again. + +Define the special range with screen location values using four components: + +Components Values +-------------------------------------------------------- + 1 Left horizontal screen location + 2 Upper vertical screen location + 3 Right horizontal screen location + 4 Lower vertical screen location + +8086 Register +Input: AX = 16 + ES:DX = pointer to special range +Return: none + +BASIC +Input: G1% = 16 + G4% = pointer to special range +Return: none + +Example: + +110 ' Disable Cursor Display in (0,0) to (100,100) Range +120 G1% = 16 +130 RANGE%(1) = 0 : RANGE%(2) = 0 +140 RANGE%(3) = 100 : RANGE%(4) = 100 +150 CALL GMOUSE ( G1%, G2%, G3%, RANGE%(0) ) + page 15 + + . + . + . + +500 ' Enable Cursor Display Again +510 G1% = 1 +520 CALL GMOUSE ( G1%, G2%, G3%, G4% ) + +Function 19: Define Double-Speed Threshold + +Function 19 defines the threshold value (mouse motion per second) for doubling +the cursor's motion. Should the mouse move faster than the DX (G4%) value, the +cursor motion doubles. The default value is 64 mouse motions per second. + +If you should want to disable double-speed, just set the threshold to 32767 +(7FFFH) mouse motions/second. + +8086 Register +Input: AX = 19 + DX = threshold speed in mouse motions/second +Return: none + +BASIC +Input: G1% = 19 + G4% = threshold speed in mouse motions/second +Return: none + +Example: + +110 ' Define Double-Speed Threshold as 20 Mouse Motions/Second +120 G1% = 19 +130 G4% = 20 +140 CALL GMOUSE ( G1%, G2%, G3%, G4% ) + + . + . + . + +500 ' Disable Double-Speed Threshold Function +510 G1% = 19 +520 G4% = 256 'MAX. VALUE +530 CALL GMOUSE ( G1%, G2%, G3%, G4% ) + +*** 7 : USING GENIUS MOUSE WITH IBM ENHANCED GRAPHICS ADAPTER + +Within the Genius Mouse driver, you'll find nine EGA functions. These functions +permit your program to write to and read from write-only registers. + +The cursor in use is defined as a monochrome cursor with one bit per pixel. The +bit masks are determined by function 9 and apply to all active planes. + +In order to make an EGA function call from an Assembly-Language program, first +load the AX, BX, CX, DX, and ES registers with the values indicated for the +parameters. Note that five values must be given for a high level language +program. Next, execute software interrupt 16 (10h). The values that are +returned are intalled in the registers by EGA functions. + + + page 16 + +Upon start with DOS, PC BIOS will verify if the EGA BIOS exists. When this is +verified, the PC will execute the EGA BIOS, booting up the program to write the +INT 10h entry vector to the address of the INT 42h vector. Now, EGA BIOS +address will be written to INT 10h. Following this, you are able to call EGA +BIOS (by using INT 10h) and PC video BIOS (by using INT 42h). + +There are twenty functions in EGA BIOS. (PC BIOS has only 16.) The EGA BIOS +routines only intercept the BIOS ROM video routines (INT 10h, AH = 13h or less). + +The following indicates nine EGA functions and the corresponding function +number: + +Function Number (HEX) +----------------------------------------------------------------- +Retrieve Single Data F0 +Save Single Data F1 +Retrieve Registers on a Specified Port F2 +Save Registers on a Specified Port F3 +Retrieve Several Registers Data F4 +Save Several Registers Data F5 +Reset All Registers as Initial Values F6 +Set Initial Values F7 +Get Version Number of Genius Mouse Driver FA + +In the above functions, the EGA I/O port number and address are as follows: + +Port No. Register Name No. of Registers Index No. Address Select Register +------------------------------------------------------------------------------ + 00H CRT Controller 25 0 - 24 3x4H + 08H Sequencer 5 0 - 4 3C4H + 10H Graphics Controller 9 0 - 8 3CEH + 18H Attribute Controlle 20 0 - 19 3C0H + Singular Registers + 20H Miscellaneous Output 1 ignored 3C2H + 28H Feature Control 1 ignored 3xAH + 30H Graphics 1 Position 1 ignored 3CCH + 38H Graphics 2 Position 1 ignored 3CAH + + Note: x = B or D depending on the base I/O address; + determined by Miscellaneous Output Register bit 1. + +Function F0: Retrieve Single Data + +This function retrieves data from a single register. + +Input: AH = F0H + BX = Index number + DX = Port number +Return: BL = Retrieved data from EGA register + +Example: + +FUN_F0 EQU 0f0H ; Function F0 +; +GR_CONTR EQU 010H ; Graphics Controller +MODE_REG EQU 005H ; Mode Regisiter +; + + page 17 + +GR1_PORT EQU 030H ; Graphics 1 Position Register +GR2_PORT EQU 038H ; Graphics 2 Position Register +; +VIDEO EQU 010H ; BIOS ROM Video Routine Entry + + + + ; Retrieve the Mode Register in Graphics Controller +MODE_REG DB 00 + ; + MOV DX, GR_CONTR + MOV BX, MODE_REG + MOV AH, FUN_F0 + INT VIDEO + MOV MODE_REG, BL + + + ; Retrieve Graphics 1 Position Data +GR1_POS DB 00 + ; + MOV DX, GR1_POS + MOV AH, FUN_F0 + INT VIDEO + MOV GR1_POS, NL + + +Function F1: Save Single Data + +This function saves data to an EGA register. Upon finishing a call to this +function, the BH and DX values are altered. + +Input: AH = F1H + BL = Index number (Non-single register only) + = Data (Single register only) + BH = Data (Non-single register only) + = Disregard (Single register only) + DX = Port number +Return: None + +Example: + +FUN_F1 EQU 0f1H ; Function F1 +; +SEQUENCE EQU 008H ; Sequencer +MASK_REG EQU 002H ; Map Mask Register +; +FEAT_PORT EQU 028H ; Feature Control Register +; +VIDEO EQU 010H ; BIOS ROM Video Routine Entry + ; Save Map Mask Register of Sequencer +MAP_MASK EQU 03H + ; + MOV DX, SEQUENCE + MOV BL, MASK_REG + MOV BH, MAP_MASK + MOV AH, FUN_F1 + INT VIDEO + MOV MAP_MASK, BL + page 18 + + + ; Save Feature Control Register +FEATURE DB 02H + ; + MOV DX, FEAT_PORT + MOV BL, FEATURE + MOV AH, FUN_F1 + INT VIDEO + MOV FEATURE, BL + +Function F2: Retrieve Registers on a Specified Port + +This function retrieves data from registers on a specifiã port. Upon finishing +a call to this function, the CX value is altered. + +Input: AH = F3H + CH = Starting index number + CL = Number of registers + DX = Port number + ES:BX = Destination of returned data +Return: Returned data to destination address + +Example: + +FUN_F2 EQU 0f2H ; Function F2 +; +GR_CONTR EQU 010H ; Graphics Controller +; +VIDEO EQU 010H ; BIOS ROM Video Routine Entry + + + + ; Retrieve Four Registers Data from Graphics Controller +GRAPH_POOL DB 04 DUP (0) + ; + MOV DX, DS + MOV ES, DX + ; + MOV DX, GR_CONTR + MOV BX, OFFSET GRAPH_POOL + MOV CX, 04H + MOV AH, FUN_F2 + INT VIDEO + +Function F3: Save Registers on a Specified Port + +This function saves data from registers on a specifiã port. Upon finishing a +call to this function, the BX, CX, and DX values are altered. + +Input: AH = F3H + CH = Starting index number + CL = Number of register + DX = Port number + ES:BX = Address source of incoming data +Return: None + +Example: + + page 19 + +FUN_F3 EQU 0f3H ; Function F3 +; +ATTR_CONTR EQU 018H ; Attribute Controller +; +VIDEO EQU 010H ; BIOS ROM Video Routine Entry + + + + ; Save Four Registers Data into Attribute Controller +PALET_DATA DB 1, 2, 4, 3 + ; + MOV DX, DS + MOV ES, DX + ; + MOV DX, ATTR_CONTR + MOV BX, OFFSET PALET_DATA + MOV CX, 08 + MOV AH, FUN_F3 + INT VIDEO + +Function F4: Retrieve Several Registers Data At The Same Time + +This function retrieves data from several registers at the same time. Upon +finishing a call to this function, the CX value is altered. + +Input: AH = F4H + CX = Number of registers (more than 1) + ES:BX = Address of register packet (each consists of 4 bytes; + port address, byte 1-2; index number, byte 3; + returned data, byte 4) +Return: Returned data is saved into byte 4 + +Example: + +FUN_F4 EQU 0f4H ; Function F4 +; +VIDEO EQU 010H ; BIOS ROM Video Routine Entry + ; Retrieve Follow Registers Data +TABLE DW 030H ; Graphics 1 Position Register + DB 00 ; Single Register + DB 00 ; Retrieved Data + ; + DW 010H ; Graphics Controller + DB 05 ; Mode Register + DB 00 ; Retrieved Data + ; + ; + MOV DX, DS + MOV ES, DX + ; + MOV BX, OFFSET TABLE + MOV CX, 02 + MOV AH, FUN_F4 + INT VIDEO + + +Function F5: Save Several Registers Data At The Same Time + + page 20 + +This function saves data from several registers at the same time. Upon +finishing a call to this function, the CX value is altered. + +Input: AH = F5H + CX = Number of registers (more than 1) + ES:BX = Address of register packet (each consists of 4 bytes; + port number, byte 1-2; index number, byte 3; + output data, byte 4) +Return: None + +Example: + +FUN_F5 EQU 0f5H ; Function F5 +; +VIDEO EQU 010H ; BIOS ROM Video Routine Entry + + + ; Save Follow Registers Data +TABLE DW 20H ; Miscellaneous + DB 00 ; Single Register + DB 01 ; Data + ; + DW 18H ; Attribute Controller + DB 12H ; Color Plane Enable + DB 07H ; Data + ; + ; + MOV DX, DS + MOV ES, DX + ; + MOV BX, OFFSET TABLE + MOV CX, 02 + MOV AH, FUN_F5 + INT VIDEO + +Function F6: Reset All Registers as Initial Values + +This function resets all values to default values for the specific registers. +Function 7 sets the default values. + +Input: AH = F6H +Return: None + +Example: + +FUN_F6 EQU 0f6H ; Function F6h +; +VIDEO EQU 010H ; BIOS ROM Video Routine Entry + + + MOV AH, FUN_F6 + INT VIDEO + +Function F7: Set Initial Values + +This function sets the initial default values. Upon finishing a call to this +function, the BX and DX values are altered. + + page 21 + +Input: AH = F7H + DX = Port number + ES:BX = Table of output data +Return: None + +Example: + +FUN_F7 EQU 0f7H ; Function F7 +; +ATTR_CONTR EQU 018H ; Attribute Controller +; +VIDEO EQU 010H ; BIOS ROM Video Routine Entry + + + + ; Setting Initial Values for the Attribute Controller +ATTR_DATA DB 1, 2, 4, 3, 5, 6, 0, 7 + DB 0, 0, 0, 0, 0, 0, 0, 0 + DB 0, 0, 0fh, 0 + ; + MOV DX, DS + MOV ES, DX + ; + MOV DX, ATTR_CONTR + MOV BX, OFFSET ATTR_DATA + MOV AH, FUN_F7 + INT VIDEO + +Function FA: Get Version Number of Genius Mouse Driver + +This function will give the Genius Mouse driver version number. + +Input: AH = FAH + BX = 00H +Return: ES:BX = Pointer to Genius Mouse driver version number. + + + + + + + + + + + + + + + + + + + + + + + + page 22 + + diff --git a/sources/int/graf/doc/graph.h b/sources/int/graf/doc/graph.h new file mode 100644 index 0000000..f0665b0 --- /dev/null +++ b/sources/int/graf/doc/graph.h @@ -0,0 +1,62 @@ +(* --------------------------------------------------------- *) +(* HERCULES GRAPHICS FOR MICROSOFT PASCAL *) +(* *) +(* External subprograms header *) +(*$list-,$symtab- *) +type ads_of_byte = ads of byte; + +procedure GRON(consts imode: integer); external; +procedure GROFF; external; +procedure CLS; external; +procedure POINT(consts ix,iy: integer); external; +procedure MOVE(consts ix,iy: integer); external; +procedure DRAW(consts ix,iy: integer); external; +procedure HFILL(consts maxx: integer); external; +procedure VFILL(consts maxy: integer); external; +procedure COLOR(consts c: integer); external; +procedure STYLE(consts s: integer); external; +procedure PATERN(consts p1, p2, p3, p4: integer); external; +procedure INTENS(consts i: integer); external; +procedure PALLET(consts p: integer); external; +procedure BORDER(consts b: integer); external; +procedure VIDEO(ads_of_buffer: ads_of_byte); external; +procedure HPAGE(consts page, mode, clear: integer); external; +function NOCARD(consts idummy: integer): integer; external; +procedure PUSHXY; external; +procedure POPXY; external; +function INXPOS(consts idummy: integer): integer; external; +function INYPOS(consts idummy: integer): integer; external; +function INPIX(consts x,y: integer): integer; external; +procedure GETMAP(consts x,y: integer; ads_of_array: ads_of_byte); external; +procedure PUTMAP(ads_of_array: ads_of_byte); external; +procedure ORMAP(ads_of_array: ads_of_byte); external; +procedure XORMAP(ads_of_array: ads_of_byte); external; +procedure TRACK(consts x,y: integer); external; +function INKEY(consts idummy: integer): integer; external; +procedure HASCII(consts ic: integer); external; +procedure HFONT(consts seg, offs: integer); external; +procedure HFONT8(vars seg, offs: integer); external; +procedure OUTHLI(consts n:integer; ads_of_buffer: ads_of_byte); external; +procedure INHLIN(vars n:integer;ads_of_buffer: ads_of_byte); external; +procedure MKWNDW(consts x,y,icols,ilines: integer; ads_of_window: ads_of_byte; + consts iwndwsize,iborder: integer); external; +procedure BURY(ads_of_window: ads_of_byte); external; +procedure EXPOSE(ads_of_window: ads_of_byte; consts x,y: integer); external; +procedure OUTWLI(ads_of_window: ads_of_byte; consts n: integer; + ads_of_buffer: ads_of_byte); external; +procedure INWLIN(ads_of_window: ads_of_byte; vars n: integer; + ads_of_buffer: ads_of_byte); external; +procedure SWINDO(rw, iw: ads_of_byte; consts scale: integer); external; +procedure RWINDO(rw: ads_of_byte; consts scale: integer); external; +procedure RMOVE(consts rx,ry: real); external; +procedure RDRAW(consts rx,ry: real); external; +procedure CIRB(consts ix,iy,ir: integer; consts alfa, beta: real; + consts cbord, bcint: integer; + consts p, q: integer); external; +procedure RCIRB(consts ix,iy,ir: real; consts alfa, beta: real; + consts cbord, bcint: integer; + consts p, q: integer); external; +(*$list+ *) +(* --------------------------------------------------------- *) + + \ No newline at end of file diff --git a/sources/int/graf/doc/graphsal.h b/sources/int/graf/doc/graphsal.h new file mode 100644 index 0000000..427de14 --- /dev/null +++ b/sources/int/graf/doc/graphsal.h @@ -0,0 +1,63 @@ +(* --------------------------------------------------------- *) +(* IIUWGRAF GRAPHICS FOR MICROSOFT PASCAL *) +(* *) +(* External subprograms header *) +(*$list-,$symtab- *) +type ads_of_byte = ads of byte; + +procedure GRON(consts imode: integer); external; +procedure GROFF; external; +procedure CLS; external; +procedure POINT(consts ix,iy: integer); external; +procedure MOVE(consts ix,iy: integer); external; +procedure DRAW(consts ix,iy: integer); external; +procedure HFILL(consts maxx: integer); external; +procedure VFILL(consts maxy: integer); external; +procedure COLOR(consts c: integer); external; +procedure STYLE(consts s: integer); external; +procedure PATERN(consts p1, p2, p3, p4 : integer); external; +procedure INTENS(consts i: integer); external; +procedure PALLET(consts p: integer); external; +procedure BORDER(consts b: integer); external; +procedure VIDEO(ads_of_buffer: ads_of_byte); external; +procedure HPAGE(consts page, mode, clear: integer); external; +function SCREEN(consts idummy: integer): integer; external; +procedure PUSHXY; external; +procedure POPXY; external; +function INXPOS(consts idummy: integer): integer; external; +function INYPOS(consts idummy: integer): integer; external; +function INPIX(consts x,y: integer): integer; external; +procedure GETMAP(consts x,y: integer; ads_of_array: ads_of_byte); external; +procedure PUTMAP(ads_of_array: ads_of_byte); external; +procedure ORMAP(ads_of_array: ads_of_byte); external; +procedure XORMAP(ads_of_array: ads_of_byte); external; +procedure TRACK(consts x,y: integer); external; +function INKEY(consts idummy: integer): integer; external; +procedure HASCII(consts ic: integer); external; +procedure HFONT(consts seg, offs: integer); external; +procedure HFONT8(vars seg, offs: integer); external; +procedure OUTHLI(consts n:integer; ads_of_buffer: ads_of_byte); external; +procedure INHLIN(vars n:integer;ads_of_buffer: ads_of_byte); external; +procedure MKWNDW(consts x,y,icols,ilines: integer; ads_of_window: ads_of_byte; + consts iwndwsize,iborder: integer); external; +procedure BURY(ads_of_window: ads_of_byte); external; +procedure EXPOSE(ads_of_window: ads_of_byte; consts x,y: integer); external; +procedure OUTWLI(ads_of_window: ads_of_byte; consts n: integer; + ads_of_buffer: ads_of_byte); external; +procedure INWLIN(ads_of_window: ads_of_byte; vars n: integer; + ads_of_buffer: ads_of_byte); external; +procedure SWINDO(rw, iw: ads_of_byte; consts scale: integer); external; +procedure RWINDO(rw: ads_of_byte; consts scale: integer); external; +procedure RMOVE(consts rx,ry: real); external; +procedure RDRAW(consts rx,ry: real); external; +function RINXPO(consts dummy: real): real; external; +function RINYPO(consts dummy: real): real; external; +procedure CIRB(consts ix,iy,ir: integer; consts alfa, beta: real; + consts cbord, bcint: integer; + consts p, q: integer); external; +procedure RCIRB(consts ix,iy,ir: real; consts alfa, beta: real; + consts cbord, bcint: integer; + consts p, q: integer); external; +procedure PRTSCR; external; +(*$list+ *) +(* --------------------------------------------------------- *) diff --git a/sources/int/graf/doc/iiuwgraf.ang b/sources/int/graf/doc/iiuwgraf.ang new file mode 100644 index 0000000..b7cb4e3 --- /dev/null +++ b/sources/int/graf/doc/iiuwgraf.ang @@ -0,0 +1,804 @@ +you can find here certain information about graphics operation in + +LOGLAN version DOS +________________________________________________________________________ + + +IIUWGRAF - basic graphics support for MICROSOFT compilers: + + FORTRAN 77 vsn 3.31 + PASCAL vsn 3.31 + and + Lattice C vsn 2.14 + + for IBM color graphics card & Hercules II monochrome card + + + +Osrodek Obliczeniowy, +Instytut Informatyki Uniwersytetu Warszawskiego, +00-901 Warszawa, PKiN VIII p. +tel. (0048)22-200211-4028 + + + + + +general info +------------ + + Drawing is done by issuing calls to subroutines which + modify the contents of a bitmap video buffer. Its contents + usually is directly displayed on the screen, so the + changes are seen immediately. + The video buffer assignment, however, can be changed to + point to a user-supplied block of memory. In this case, + the changes in bitmap setting are not displayed and even + putting the real screen into graphics mode is not necessary. + The drawing may be constructed silently, saved away + and restored later on an active display or output to + a binary file. + The Hercules card offers additional possibilities of fast + switching between two directly displayable pages. + + + The interface routines are on two different levels: + + level 1 - screen management on pixel basis + uses actual screen indices + + level 2 - positioning & drawing + in abstract world coordinates + + Description of calling sequences for Fortran and C + are given together with explanations below. Pascal + declarations may be found in the "graph.h" include + file in the distribution set. + + + +LEVEL 1 ROUTINES +________________ + +All parameters not specified explicitly as arrays or reals +are integers. +All integer parameters are assumed to be "integer*2" (16 bits) +in Fortran, "integer" in Pascal and "int" in C. + +screen address range: + + 0 <= ix <= 719 for Hercules card + 0 <= iy <= 347 + + 0 <= ix <= 319 for IBM color card + 0 <= iy <= 199 + + 0 <= ix <= 639 for IBM color card in mono mode + 0 <= iy <= 199 + + (0,0) is top left pixel + + (0,0)-----------> (ix,0) + | + | + | + V + (0,iy) + + +Three separate libraries are supplied, each for a different +kind of graphics screen: + + HGCMSF for Hercules + MGCMSF for IBM card in full color mode + MGC64MSF for IBM card in mono mode + +These libraries follow Microsoft Fortran and Pascal calling +conventions. +Optionally, each of these libraries can be supplied in four +variants, following four Lattice C models (S, D, P, L). + +initialization/termination routines +----------------------------------- + +---------------------------------------------->> SCREEN + +Fortran: | C: + | +i=screen(dummy) | int screen(); + | + + returns code identifying which library is being used + + 1 for Hercules + 2 for IBM in full color 320*200 + 3 for IBM in monochrome 640*200 + 4 for IBM in monochrome 320*200 + + +---------------------------------------------->> GRAPH + +call graph(i) | graph(i); + + switches display to graphics mode + clears entire screen + involves a delay of approx. 3 secs [ for Hercules only ] + for IBM color display, "i" sets either regular color mode, + or black&white mode, more suitable for use on monochrome + displays + i should be 1 for color mode 320*200 + + +---------------------------------------------->> TEXT + +call text | text(); + + switches display to character mode + does not change current video buffer assignment + fills screen with blanks + delays for 3 secs [ for Hercules only ] + + +---------------------------------------------->> CLS + +call cls | cls(); + + clears current video buffer in graphics mode, + without turning display off + + +---------------------------------------------->> HPAGE + +call hpage(nr, mode, cflag) | hpage(nr,mode,cflag); + + +[Hercules II only] + + controls access to both pages of Hercules-II; + + "nr" - page number ( 0 or 1) + "mode" - 0 for text display, + 1 for graphics display, + -1 for buffering only (display not affected) + "cflag" - 0 for preserving previous contents + - 1 for clearing buffer contents + + switching pages via "hpage" is done without delay if the mode + remains unchanged; + otherwise, "call graph" is equivalent to "call hpage(0,1,1)" + "call text" is equivalent to "call hpage(0,0,1)" + + the typical animation loop may be done as follows: + + call hpage(0,1,1) + c draw initial picture + ... + page=1 + 1 continue + call hpage(1-page,1,0) ; set display + call hpage(page,-1,1) ; set buffer + c draw modified picture + ... + page=1-page + if (.not.finished) go to 1 + + +---------------------------------------------->> VIDEO + +call video(array) | video(array); + | char *array; + + sets video buffer to "array", which should have + 32K bytes for Hercules, 16K bytes for IBM card. + "video" preserves the previous contents of "array". + Subsequent calls to drawing subroutines + will not affect screen display, picture + created in this buffer may be transferred + to actual display via "getmap"-"putmap", + or some other form of saving & restoring. + + + +mode setting routines +--------------------- + + +---------------------------------------------->> COLOR + +call color(i) | color(i); + + sets current color to i + for monochrome displays, 0 means black, non-0 - white + for color displays, 0 means background + + +---------------------------------------------->> STYLE + +call style(i) | style(i); + + sets style of lines and fill shades to a combination + of current color and background color (for mono - + white and black, respectively) according to 5 predefined + patterns: + + 0 .... + 1 **** + 2 ***. + 3 **.. + 4 *.*. + 5 *... + + where '*' means curent color, '.' background color + + +---------------------------------------------->> PATERN + +call patern(iv,io) | pattern(iv,io); + + sets style of lines and fill shades to an explicitly specified + combination of colors : "iv" for even scan lines, "io" for odd. + Color encoding is decimal, allowing 4 pixels. + Lines are drawn always according to "iv". + + Examples: + + call patern(1100,0011) + is equivalent to + call color(1), call style(3) + + + call patern(1212,2121) + produces a shade that cannot be otherwise achieved + ( a dotted line consisting of pixels in colors 1 and 2 ) + + +---------------------------------------------->> BORDER + +call border(i) | border(i); + +[ IBM color mode only ] + + sets actual background color to i ( i = 0,1,...,15 ) + + +---------------------------------------------->> PALLET + +call pallet(ip) | pallet(ip); + +[ IBM color mode only ] + + changes current pallette to pallette ip ( 0 or 1 ) + default pallette is 0 + + +---------------------------------------------->> INTENS + +call intens(i) | intens(i); + +[ IBM color mode only ] + + changes current intensity, 1 means more intensity, 0 less; + default intensity is 1 + + +positioning routines +-------------------- + + +---------------------------------------------->> MOVE + +call move(ix,iy) | move(ix,iy); + + sets current position to (ix,iy) + picture remains unchanged + + +---------------------------------------------->> INXPOS + INYPOS + +ix=inxpos(idummy) | int inxpos(); + + returns current x screen coordinate + + +iy=inypos(idummy) | int inypos(); + + returns current y screen coordinate + + +---------------------------------------------->> PUSHXY + POPXY + +call pushxy | pushxy(); + + pushes current position, color & mode + stack is kept internally, max depth is 16 + + +call popxy | popxy(); + + restores position, color & mode from internal stack + + +---------------------------------------------->> TRACK + +call track(ix,iy) | track(ix,iy); + + displays a small (8*8) arrow-shaped cursor which can be + moved around with cursor keys; a single keystroke moves + it by 5 pixels, in shift mode step size is 1 pixel; + "home" key returns the cursor to the initial (ix,iy); + "end" removes cursor from screen, and returns - its + position can be read with "in?pos" above. + + + +pixel operations +---------------- + +---------------------------------------------->> POINT + +call point(ix,iy) | point(ix,iy); + + moves to pixel (ix,iy) and sets it to current color + + +---------------------------------------------->> INPIX + +ic=inpix(ix,iy) | int inpix(ix,iy); + + moves to pixel (ix,iy) and returns its color setting; + for Hercules and IBM monochrome mode 640*200 : + it will be 1 if pixel is on, 0 if it is off. + + + +line drawing +------------ + +---------------------------------------------->> DRAW + +call draw(ix,iy) | draw(ix,iy); + + draws a line from current screen position to (ix,iy); + sets current position to (ix,iy); + line is drawn in current color, with both terminal pixels + always turned white ( non-background) for non-black + ( non-background ) line color. + Bresenham algorithm is used. + + +---------------------------------------------->> CIRB + +call cirb(xi,yi,ri,alfa,beta,cbord,bcint,p,q) +real alfa,beta + +[ not available in Lattice C ] + + draws a circle (or ellipse, depending on aspect value), + optionally filling its interior; does not preserve position; + (xi,yi) - center coordinates + ri - radius in pixels (horizontally) + alfa, beta - starting & ending angles; if alfa=beta a full + circle is drawn; values should be given in radians; + cbord - border color + bcint - if .ne.0, interior is filled in current style&color + p,q - aspect ratio; if p/q=1, a perfect circle is drawn, + if p/q<1, the horizontal axis is longer, if p/q>1 - the vertical + axis is longer; + + + +bitmap operations +----------------- + +---------------------------------------------->> GETMAP + +call getmap(ix,iy,iarray) | getmap(ix,iy,iarray); + | char *iarray; + + saves rectangular area between current position as + top left corner and (ix,iy) as bottom right corner, + including border lines; + position remains unchanged. + "iarray" should have 4 + ( rows * ( 3 + cols div 8)) + bytes. + + +---------------------------------------------->> PUTMAP + +call putmap(iarray) | putmap(iarray); + | char *iarray; + + sets rectangular area of screen pixels to that saved + by "getmap" in "iarray"; + same size is restored, with top left corner in current + position; + position remains unchanged. + + +---------------------------------------------->> ORMAP + +call ormap(iarray) | ormap(iarray); + | char *iarray; + + same as putmap, but saved bitmap is or'ed into screen + rather than just set. + + +---------------------------------------------->> XORMAP + +call xormap(iarray) | xormap(iarray); + | char *iarray; + + same as putmap, but saved bitmap is xor'ed into screen + rather than just set. + + + +character i/o +------------- + +---------------------------------------------->> INKEY + +ik=inkey(idummy) | int inkey(); + + returns next character from keyboard buffer; + 0 is returned if buffer is empty; + special keys are returned as negative numbers; + ALT-NUM method may be used for entering character codes + above 127 (this makes entering special keys 128-132 + impossible); + if a character is returned, it is also removed + from the buffer, so MS-DOS will not see it (CTRL-C!); + typeahead is allowed, echo is suppressed. + + +---------------------------------------------->> HASCII + +call hascii(ic) | hascii(ic); + + 'xor's the character in a 8*8 box with top left corner + in the current position; + moves current position by (8,0); + character code 0 sets complete box to black ( background ), + with no change in position. + BIOS ROM font for IBM color card is used. If the font + table is not at F000:FA6E, the character will probably + be unrecognizable, and most certainly wrong. + For codes >127, table pointed to by interrupt vector 31 + is used. + + +---------------------------------------------->> HFONT + +call hfont(iseg,ioffs) | hfont(iseg,ioffs); + + sets 8*8 horizontal font table address to iseg:ioffs. + + +---------------------------------------------->> HFONT8 + +call hfont8(iseg,ioffs) | hfont8(iseg,ioffs); + + includes a copy of IBM ROM 8*8 font and returns address + suitable for passing to "hfont"; + use of "hfont8" makes program larger but quarantees + BIOS ROM independence. + + + +line -oriented i/o +------------------- + +---------------------------------------------->> OUTHLINE + +call outhline(n,l) | outhline(n,l); + | char *l; + + call "hascii" "n" times with subsequent bytes + from "l" array as arguments; + before each character is written, "hascii(0)" is + called. + + +---------------------------------------------->> INHLINE + +call inhline(n,l) | inhline(n,l); + | int *n; + | char *l; + + reads a line of at most "n" characters from + the keyboard, storing them in the "l" array; + characters are echoed at current position with "hascii" + as they are typed in; + a blinking cursor prompts for the next character; + BACKSPACE works as expected, RETURN completes the line; + typing "n"-th character also completes the line; + "l" is blank filled up to "n" bytes; + on return "n" is the total number of characters read. + + + +window - oriented i/o +--------------------- + +---------------------------------------------->> MKWNDW + +call mkwndw(ix,iy,icols,ilines,iwndw,iwndwsize,iborder) + + | mkwndw(ix,iy,icols,ilines,iwndw,iwndwsize,iborder); + | int ix,iy, icols, ilines; + | int iwndw[]; + | int iwndwsize, iborder; + + makes a tty-like scrollable window for "ilines" lines + of alphanumeric text of "icols" characters each; + top left corner of the window is located at (ix,iy); + if "iborder" is non-zero, the window will have a solid + border and a margin of 2 black pixels drawn around it; + "iwndw" should be an array large enough to "getmap" + complete window into it, leaving 20 bytes free, + however, if "bury" and "expose" are not to be applied to + the window, 20 bytes total size is enough; + "iwndwsize" is size of "wndw" array, it is ignored now. + + Window just defines scrolling size for subsequent + line-oriented i/o. Anything drawn across it will + simply scroll. If you want to have overlapping + windows, all you need to implement that is here. + + +---------------------------------------------->> BURY + +call bury(iwndw) | bury(iwndw); + | int iwndw[]; + + makes the window disappear from the screen; + the contents is saved away, so it may be "exposed" later; + "iwndw" should have appeared before in call to "mkwndw". + "bury" may be called only if the array supplied to "mkwndw" + is large enough. + + +---------------------------------------------->> EXPOSE + +call expose(iwndw,ix,iy) | expose(iwndw,ix,iy); + | int iwndw[]; + + makes the window reappear at (ix,iy) as its new top + left corner; + the window should have been "buried" before. + + +---------------------------------------------->> OUTWLINE + +call outwline(iwndw,n,l) | outwline(iwndw,n,l); + | int iwndw[]; + | char *l; + + outputs "n" characters from "l" array at bottom line + in window "iwndw", scrolling it appropriately; + "n" may be larger than window line length - output + will take as many window lines as needed; + + +---------------------------------------------->> INWLINE + +call inwline(iwndw,n,l) | inwline(iwndw,n,l); + | int iwndw[]; + | int *n; + | char *l; + + reads in a line of at most "n" characters from + window "iwndw", putting them into "l" array; + prompts at bottom of the window with ":"; + "n" may be larger than window size - it will be done + in as many window lines as needed; + BACKSPACE can be used to erase characters on bottom + window line only; + when specifying length, one should remember that the first + column is used by the prompt; + on return "n" is the total number of read characters. + + +secret operations +----------------- + +---------------------------------------------->> HFILL + +call hfill(ix) | hfill(ix); + + fills current row (horizontally) from current position + (ix0,iy0) up to (ix,iy0) with bit pattern depending + on current color, style and/or pattern and position on + the screen in such a way that adjacent "hfill"ed" rows + will produce a shade simulating color; + does not change current position; + + +---------------------------------------------->> VFILL + +call vfill(iy) | vfill(iy); + + fills current column ( vertically ) from current + position (ix0,iy0) up to (ix0,iy) in a similiar way + that "hfill" does; + rectangular area "vfill'ed" is not distinguishable + on the screen from same shape "hfill'ed", except that + it will take much longer to fill. + + + + +LEVEL 2 ROUTINES +_________________ + + + These accept coordinates a real numbers and translate + them to actual pixel positions according to a previously + specified "window" definition; + + +abstract world window definition +________________________________ + + +---------------------------------------------->> SWINDOW + +call swindow(r,i,scale) | swindow(r,i,scale); +real r(4) | float r[4]; +integer*2 i(4),scale | int i[4],scale; + + enables positioning & drawing in abstract world + coordinates ( cf. "rmove", "rdraw") + + defines rectangular window + + r(1) <= x <= r(2), + r(3) <= y <= r(4) + + in center of the rectangular area of the screen + with top left corner in position (i(1),i(3)) + and right bottom corner in position (i(2),i(4)); + if "scale" equals 0, the real proportions are not + preserved: the abstract window is simply mapped to fit + the entire area of the screen, otherwise the window + is adjusted to reflect the aspect ratio of the screen; + abstract coordinates are mapped to the screen in the + follwing way: + + (r(1),r(4)) + ^ + | + | + | + (r(1),r(3))--------------------->(r(2),r(3)) + + +---------------------------------------------->> RWINDOW + +call rwindow(r,scale) | rwindow(r,scale); +real r(4) | float r[4]; +integer*2 scale | integer scale; + + equivalent to "swindow", using the entire screen; + a margin of 1 pixel, however, is left on all sides + to circumvent rounding problems + + +positioning +___________ + + +---------------------------------------------->> RMOVE + +call rmove(rx,ry) | rmove(rx,ry); +real rx,ry | float rx,ry; + + sets current abstract world position to (rx,ry) + (rounded to nearest pixel) within a window + that should have been defined in a previous call + to "rwindow" or "swindow"; + picture remains unchanged + + +---------------------------------------------->> RINXPOS + +x=rinxpos(dummy) +real dummy + + returns abstract "x" coordinate in latest window of the + current pixel position; + will bomb out if there was no previous call to "rwindow" + or "swindow"; + in case of "swindow" returned value may be negative; + +---------------------------------------------->> RINYPOS + +y=rinypos(dummy) +real dummy + + returns abstract "y" coordinate in latest window of the + current pixel position; + will bomb out if there was no previous call to "rwindow" + or "swindow"; + in case of "swindow" returned value may be negative; + + +drawing +_______ + + +---------------------------------------------->> RDRAW + +call rdraw(rx,ry) | rdraw(rx,ry); +real rx,ry | float rx,ry; + + draws a line in current color from current screen + position to position (rx,ry) in abstract world + coordinates ( using LEVEL 1 "draw" internally ); + sets current position to (rx,ry) (rounded); + the window should have been defined before as for "rdraw". + +---------------------------------------------->> RCIRB + +call rcirb(xr,yr,rr,alfa,beta,cbord,bcint,p,q) +real alfa,beta + +[not available in Lattice C] + + draws a circle (or ellipse), accepting center coordinates + and radius value in abstract coordinates, + optionally filling its interior; does not preserve position; + (xr,yr) - center coordinates + rr - radius (scaled horizontally) + alfa, beta - starting & ending angles; if alfa=beta a full + circle is drawn; values should be given in radians; + cbord - border color + bcint - if .ne.0 , interior is filled in current style&color + p,q - aspect ratio; if p/q=1, a perfect circle is drawn, + if p/q<1, the horizontal axis is longer, if p/q>1 - the vertical + axis is longer; + + + +OTHER USEFUL THINGS +___________________ + + Program "hgcprint.com", when called, sets up the system to + make hardcopy of HERCULES graphics image on a GEMINI STAR 10 + dot matrix printer in the same way as MS-DOS GRAPHICS command + does for the color/graphics card. + To make the hardcopy, press SHIFT-PrtSc. + This will work only in graphics mode. + + Note + Actually one cannot make hardcopy of IBM color graphics. + + +A NOTE ON LINKING PASCAL PROGRAMS +--------------------------------- + + When linking Pascal programs which call one of the following: + + mkwndw inhlin outhlin bury window cirb rcirb + track inwlin outwlin expose rmove rdraw + + linker will complain about the missing library FORTRAN.LIB. + Just ignore this complaint (simply type CR). + + +A NOTE ON LINKING C PROGRAMS +---------------------------- + + When linking C programs using one of the following: + + rwindow swindow rmove rdraw rcirb cirb + + keep in mind that the following global names + are used internally: + + wir* (e.g. wirmix, wirmiy, etc.) + pqasp* (e.g. pqaspp, pqaspq, etc.) + diff --git a/sources/int/graf/doc/iiuwgraf.pol b/sources/int/graf/doc/iiuwgraf.pol new file mode 100644 index 0000000..76292f7 --- /dev/null +++ b/sources/int/graf/doc/iiuwgraf.pol @@ -0,0 +1,1546 @@ + + + + + + + + + + + + IIUWGRAF + + biblioteczka podstawowych procedur graficznych + + moze wspolpracowac z kompilatorami firmy Microsoft: + + Fortran 77 wersja 3.31 i 4.00 + Pascal wersja 3.31 + + oraz + + C (Lattice) wersja 3.10 + Aztec C wersja 3.20d + + + + dla IBM PC/XT + + obsluguje karty IBM color/graphics, Hercules II oraz EGA + + + + + + + wersja 2.2, grudzien 1987 + + + + + + + +Autorzy: + + Piotr Carlson + Miroslawa Milkowska - procedury poziomu 1 + + Janina Jankowska + Michal Jankowski - procedury poziomu 2 + + +Osrodek Obliczeniowy Instytutu Informatyki +Uniwersytet Warszawski + + + 2 + + + +Spis tresci + + +Informacje ogolne 3 +Procedury poziomu 1 4 +Procedury ustawiania trybu 5 +Procedury sterujace kolorami 8 +Procedury ustawiania pozycji 11 +Procedury obslugujace punkty 12 +Procedury rysowania linii 13 +Procedury operujace na fragmentach ekranu 15 +Procedury wejscia/wyjscia dla pojedynczych znakow 16 +Procedury wejscia/wyjscia dla linii 18 +Procedury wejscia/wyjscia dla okienek 19 +Procedury poziomu 2 20 +Informacje dodatkowe 22 +Procedury dodatkowe 22 + + + +Dodatki + +A. Uzycie IIUWGRAFu z FORTRANem 77 23 +B. Uzycie IIUWGRAFu z Pascalem 24 +C. Uzycie IIUWGRAFu z Lattice C 25 +D. Uzycie IIUWGRAFu z LOGLANem 26 +E. Wykaz specyfikacji procedur IIUWGRAFu 27 +F. Wartosci kodow klawiszy specjalnych 29 +G. FEDIT - prosty program do edycji kroju znakow 30 +H. Zmiany IIUWGRAFu w stosunku do poprzednich wersji 33 + + + + 3 + + + +Informacje ogolne + + + + Rysunek jest tworzony na ekranie monitora za pomoca +szeregu wywolan procedur bibliotecznych IIUWGRAF. Modyfikuja +one zawartosc bufora mapy bitowej, ktora jest zwykle +bezposrednio wyswietlana na ekranie. Zmiany te sa wtedy +widoczne natychmiast. Umiejscowienie bufora roboczego moze +byc jednak zmienione, tak aby byl on zwiazany z obszarem +pamieci dostarczonym przez uzytkownika. W tym przypadku +zmiany jego zawartosci oczywiscie nie sa wyswietlane, a +nawet przestawienie monitora w tryb graficzny nie jest +konieczne. Rysunek moze byc wtedy skonstruowany w pamieci, +bez wyswietlania, przechowany na dysku w postaci binarnej i +odtworzony pozniej na ekranie. Omowiony tryb pracy jest +mozliwy jednak tylko dla karty Hercules II oraz karty IBM. + W opisie procedur slowo ekran, tam gdzie mowa o jego +zawartosci, nalezy rozumiec wlasnie jako bufor roboczy. + + Karty Hercules II oraz EGA daja dodatkowa mozliwosc +blyskawicznego przelaczania pomiedzy dwiema +rownouprawnionymi stronami graficznymi. + + W wersji podstawowej karta graficzna EGA posiada +64K bajty pamieci. Pamiec ta moze byc zwiekszona do 128K +oraz 256K bajtow. Opisane ponizej procedury graficzne +dotycza w zasadzie karty EGA z pelna pamiecia 256K bajtow. +Tylko w tej wersji karty mozna bowiem uzywac 16 kolorow +( z 64 istniejacych ) oraz dwoch stron graficznych. W obu +wersjach z mniejsza pamiecia istnieje tylko jedna strona +graficzna, a ponadto w wersji podstawowej uzytkownik ma +mozliwosc korzystania tylko z 4 kolorow (z 16 istniejacych). + + Dostarczone sa cztery zestawy oddzielnych bibliotek +IIUWGRAF, kazda dla innego rodzaju ekranu: + + HGCMSF i HGCMSF4 dla karty Hercules + MGCMSF i MGCMSF4 dla karty IBM color/graphics + MGC64MSF i MGC64MF4 dla karty IBM w trybie mono + EGAMSF i EGAMSF4 dla karty EGA + + Biblioteki HGCMSF, MGCMSF, MGC64MSF i EGAMSF zgodne +sa z konwencjami Fortranu ( wersja 3.31 ) i Pascala firmy +Microsoft. Natomiast biblioteki HGCMSF4, MGCMSF4, MGC64MF4 i +EGAMSF4 sa zgodne z konwencjami Fortranu ( wersja 4.00 ) +firmy Microsoft. Dodatkowo, kazda biblioteka moze byc +dostarczona w konwencji Lattice C, oddzielnie dla czterech +modeli kodu S, P, D i L. + + Programy uzytkowe komunikuja sie z IIUWGRAFem na +dwoch poziomach: + + poziom 1 - zarzadzanie ekranem na poziomie pixli, +przy uzyciu prawdziwych wspolrzednych na ekranie, + + poziom 2 - rysowanie punktow i linii we +wspolrzednych abstrakcyjnych. + + + + 4 + + + +Procedury poziomu 1 + + Wszystkie parametry bez podanej explicite +specyfikacji maja typ integer. Wszystkie parametry calkowite +powinny miec wartosci 16-bitowe (integer*2 w Fortranie, +integer w Pascalu, int w C) + + +Zakresy wspolrzednych ekranu: + + 0 <= ix <= 719 + 0 <= iy <= 347 dla karty Hercules + + 0 <= ix <= 319 + 0 <= iy <= 199 dla karty IBM color/graphics + + 0 <= ix <= 639 + 0 <= iy <= 199 dla karty IBM color/graphics + w trybie mono + 0 <= ix <= 639 + 0 <= iy <= 349 dla karty EGA + + + + (0,0)-----------> (ix,0) + | + | + | + V + (0,iy) + + + + 5 + + + +Procedury ustawiania trybu + +GRON(i) + + Procedura GRON ustawia monitor w graficznym trybie +pracy, czyszczac zawartosc jego ekranu, ktory jednoczesnie +staje sie buforem roboczym. Parametr i ma znaczenie jedynie +dla karty IBM w trybie 320*200: wartosc 1 wybiera normalne +kolory, wartosc 0 - kolory zmodyfikowane do pracy na +monitorach monochromatycznych. Dla kart Hercules, EGA oraz +karty IBM w trybie 640*200 wartosc parametru i jest +ignorowana. Przy przelaczaniu karty Hercules z trybu +tekstowego na graficzny i odwrotnie stosowane jest +programowo opoznienie ok. 3 sekund. Tryb karty IBM ustawiany +jest wprost, bez pomocy przerwania 10H, tak aby mozliwa byla +jednoczesna praca na monitorze kolorowym w trybie graficznym +z praca na monitorze monochromatycznym w trybie tekstowym. +Konsekwencja tego rozwiazania jest to, ze nie mozna +korzystac z komendy GRAPHICS. Natomiast tryb karty EGA jest +ustawiany wprost, za pomoca przerwania 10H. + + + +NOCARD(ple) + + Funkcja NOCARD zwraca liczbe calkowita +identyfikujaca rodzaj monitora obslugiwanego przez biezaco +uzywana biblioteke: + + 1 dla karty Hercules + 2 dla karty IBM w trybie kolor + 3 dla karty IBM w trybie mono 640*200 + 4 dla karty IBM w trybie mono 320*200 + 5 dla karty EGA + + Funkcja NOCARD moze byc wywolana dopiero po +zainicjowaniu trybu graficznego za pomoca procedury GRON. +Parametr ple jest ignorowany. + + + +GROFF + + Procedura GROFF przelacza monitor w tryb tekstowy, +wypelniajac zawartosc jego ekranu spacjami. Przed +zakonczeniem dzialania programu monitor, z ktorego byl +wywolany, nalezy zawsze ustawic z powrotem w tryb tekstowy. + + +CLS + + Procedura CLS czysci ekran, wypelniajac go kolorem +0. Czyszczenie odbywa sie bez wylaczania ekranu. + + + 6 + + + +HPAGE(nr, tryb, zeruj) + + Procedura HPAGE ma zastosowanie jedynie dla kart +Hercules oraz EGA. Pozwala na dostep do drugiej strony +graficznej monitora. Wywolanie HPAGE wybiera strone o +numerze nr (0 lub 1), zeruje jej zawartosc, o ile parametr +zeruj ma wartosc <> 0, oraz ustawia jej tryb: + + tryb = 0 wyswietla zawartosc strony alfanumerycznie + tryb = 1 wyswietla zawartosc strony graficznie + tryb =-1 przypisuje do tej strony bufor roboczy + + + Przypisanie bufora roboczego trybem -1 nie zmienia +numeru ani sposobu wyswietlania biezacej strony. Tryb 0 +wiaze bufor roboczy z wybrana wlasnie strona. Przelaczanie +stron odbywa sie bez opoznien, o ile nie ulega zmianie tryb +wyswietlania (alfanumeryka/grafika). Poza tym, wywolanie +HPAGE(0,1,1) jest ( tylko dla karty Hercules ) rownowazne +GRON(), a HPAGE(0,0,1) - wywolaniu GROFF. + +Typowa petla animacyjna moze byc zatem rozwiazana na +przyklad tak: + +VAR NR: INTEGER; +BEGIN + GRON(0); + NR := 1; + (* NARYSUJ PIERWOTNY OBRAZ *) + DRAW(... + ... + WHILE JESZCZE DO + HPAGE(1-NR,1,0); (* WYSWIETLANIE *) + HPAGE(NR,-1,1); (* BUFOROWANIE *) + (* NARYSUJ ZMODYFIKOWANY OBRAZ *) + DRAW(... + ... + NR := 1-NR + OD + + +VIDEO(tablica) + + Procedura VIDEO przelacza bufor roboczy tak, aby +miescil sie on w tablicy podanej jako parametr jej +wywolania. +Samo wywolanie VIDEO nie zmienia zawartosci bufora. Obraz +wyswietlany na monitorze nie bedzie ulegal teraz zmianom +mimo wywolywania procedur modyfikujacych zawartosc ekranu. +Wszelkie odwolania do ekranu beda teraz dokonywane w +tablicy. Gotowy obraz moze byc przeniesiony na rzeczywisty +ekran za pomoca procedur GETMAP/PUTMAP lub zapisany binarnie +na dysku w celu pozniejszego odtworzenia. Tablica powinna +miec 16K bajtow przy wspolpracy z karta IBM i 32K bajtow +przy wspolpracy z karta Hercules. +Procedury VIDEO nie mozna stosowac dla karty EGA. + + + 7 + + +Przyklad: + +VAR BOK: ARRAY[1..32K] OF BYTE; + FRAGM: ARRAY[1..MAX] OF BYTE; +BEGIN + GRON(1); + (* NARYSUJ STRONE TYTULOWA *) + DRAW(... + ... + (* SKONSTRUUJ RYSUNEK "NA BOKU" *) + VIDEO(BOK); + DRAW(... + ... + (* ZAPAMIETAJ FRAGMENT GOTOWEGO RYSUNKU *) + MOVE(MINX,MINY); + GETMAP(MAXX,MAXY,FRAGM); + (* PRZYPISZ Z POWROTEM EKRAN DO MONITORA *) + GRON(1); (* NIESTETY, CZYSCI EKRAN *) + MOVE(MINX,MINY); + PUTMAP(FRAGM); + ... + +Uwaga: + W przypadku wywolania VIDEO(tablica(adres)), wartosc +wyrazenia adres musi byc postaci 1+k*16, gdzie k=0,1,2,... + + + + 8 + + + +Procedury sterujace kolorami + + +COLOR(kolor) + + Procedura COLOR ustawia biezacy kolor. W tym +kolorze beda odtad dokonywane zmiany zawartosci ekranu. Na +monitorach monochromatycznych kolor 0 oznacza czarny (pixel +wygaszony), kolor <> 0 oznacza bialy (pixel zapalony). +Na monitorach kolorowych, dla karty IBM color/graphics, +kolory maja nastepujace numery: + + 0 - tlo (czarny lub ustalony wywolaniem BORDER) + 1 - zielony lub turkusowy - cyan ( zaleznie od wyboru +palety) + 2 - czerwony lub purpurowy - magenta + 3 - zolty lub bialy + +Kolorem ustawionym poczatkowo jest 1. + + + Dla karty EGA kolor moze przyjmowac wartosci od 0 +do 15. Znaczenie tego parametru jest okreslone poprzez wybor +palety ( przyporzadkowanie kazdemu z 16 identyfikatorow +koloru dowolnego koloru z 64 istniejacych ), dokonywany za +pomoca procedury PALLET. +Kolorem ustawionym poczatkowo jest 7. + + +STYLE(styl) + + Procedura STYLE ustawia biezacy styl, czyli +kombinacje kolorow uzywana do rysowania odcinkow (DRAW) i +wypelniania obszarow (HFILL,VFILL). Styl wybiera jeden z +szesciu nastepujacych sposobow mieszania tla (.) i biezacego +koloru (*): + + 0 - .... + 1 - **** + 2 - ***. + 3 - **.. + 4 - *.*. + 5 - *... + + Przy rysowaniu odcinkow kolejne pixle beda mialy +kolor wyznaczony cyklicznie wzorcem stylu. Pierwszy i +ostatni pixel odcinka bedzie zawsze mial biezacy kolor. +Przy wypelnianiu, podany wzorzec dotyczy linii poziomych +(pionowych) ekranu o parzystej wspolrzednej y (x). Wzorzec +dla linii o wspolrzednych nieparzystych dobierany jest +automatycznie. +Inne sposoby mieszania, dopuszczajace uzycie wiekszej liczby +kolorow sa dostepne za pomoca procedury PATERN. + + + 9 + + +PATERN(par,par1,par2,par3) + + Procedura PATERN pozwala rysowac odcinki i +wypelniac obszary dowolna kombinacja kolorow. Przy rysowaniu +odcinkow brany jest pod uwage tylko par. Przy wypelnianiu, +par oraz par2 dotycza linii poziomych (pionowych) o +wspolrzednych y (x) parzystych, par1 oraz par3 - linii o +wspolrzednych nieparzystych ( na zmiane kolejno par/par2 +oraz par1/par3 ). Wartosci par,...,par3 przedstawione jako +czterocyfrowe liczby szesnastkowe daja wzorce mieszania +numerow kolorow. 0 oznacza tlo, inne cyfry - zob. opis +procedury COLOR. + +Przyklad: + +PATERN(#1100,#0011,#1100,#0011); + ODPOWIADA: COLOR(1); STYLE(3); + +natomiast efekt: + +PATERN(#1212,#0303,#2121,#3030); + NIE MOzE BYC UZYSKANY INACZEJ + + +BORDER(kolor) + + Procedura BORDER ustawia biezacy kolor tla. + + kolor kolor + + 0 czarny + 1 niebieski + 2 zielony + 3 turkusowy - cyan (niebiesko-zielony) + 4 czerwony + 5 karmazynowy - magenta (czerwono-niebieski) + 6 zolty + 7 jasno szary + +Kolory 8 - 15 to jasniejsze odcienie kolorow 0 - 7, przy +czym kolor bialy ma numer 15. + +Przedstawione powyzej kolory dotycza tylko karty IBM, dla +karty EGA natomiast parametr kolor moze przyjmowac wartosci +od 0 do 63. + + +PALLET(nr) + + Dla karty IBM color/graphics : + + procedura PALLET wybiera biezaca palete z dwu +mozliwych + + + nr kolory + + 0 turkusowy,karmazynowy,bialy + 1 zielony,czerwony,zolty + + + + 10 + + + Domyslna paleta jest paleta nr 0. + + Dla karty EGA natomiast procedura PALLET sluzy do +wyboru dowolnych 16 kolorow z 64 ogolnie dostepnych. +Parametr nr powinien byc postaci + kolor16 * 256 + kolor64, +gdzie + kolor16 oznacza identyfikator koloru ( uzywany +przez procedure COLOR ), mogacy przyjmowac wartosci 0 - 15, + kolor64 oznacza wybrany kolor. + + + Standardowa paleta ( przyjmowana domyslnie ) +zawiera nastepujace kolory : + + identyfikator kolor numer koloru + + 0 czarny 0 + 1 niebieski 1 + 2 zielony 2 + 3 turkusowy 3 + 4 czerwony 4 + 5 karmazynowy 5 + 6 zolty 6 + 7 bialy 7 + 8 szary 56 + 9 jasno-niebieski 57 + 10 jasno-zielony 58 + 11 jasno-turkusowy 59 + 12 jasno-czerwony 60 + 13 jasno-karmazynowy 61 + 14 jasno-zolty 62 + 15 intensywny bialy 63 + + + Wszystkie dostepne kolory mozna obejrzec oraz +poznac ich numery za pomoca programu demonstracyjnego +EGADEMO.EXE. + + Procedura PALLET nie ma zastosowania dla karty +Hercules. + + + +INTENS(i) + + Procedura INTENS wybiera intensywnosc kolorow. +Dla i rownego 0 intensywnosc jest wieksza, dla i rownego 1 +mniejsza. +Domyslnie intensywnosc jest ustawiona na poziomie 0. + +Procedura INTENS ma zastosowanie tylko dla karty IBM. + + + 11 + + + +Procedury ustawiania pozycji + + +MOVE(x,y) + + Procedura MOVE ustawia biezaca pozycje na ekranie +na pixel o wspolrzednych (x {kolumna}, y {wiersz}). + + +INXPOS(ple), INYPOS(ple) + + Funkcje calkowite INXPOS i INYPOS zwracaja +odpowiednio wspolrzedne x i y biezacej pozycji. Parametr ple +jest ignorowany. + + +PUSHXY + + Procedura PUSHXY powoduje przechowanie biezacej +pozycji, koloru i stylu na wierzcholku wewnetrznego stosu +IIUWGRAFu. Parametry te nie ulegaja przy tym zmianie. +Maksymalna glebokosc stosu wynosi 16. + + +POPXY + + Procedura POPXY odtwarza biezacy styl, kolor i +pozycje z wierzcholka wewnetrznego stosu IIUWGRAFu. +Glebokosc stosu zmniejsza sie o 1. + + + +Przyklad: + + +PROCEDURE SKOS; +VAR IX,IY:INTEGER; +BEGIN + PUSHXY; + IX := INXPOS(0); + IY := INYPOS(0); + DRAW(IX+10,IY+10); + POPXY; +END; + + + 12 + + + +TRACK(x,y) + + Procedura TRACK wyswietla na ekranie wskaznik w +ksztalcie malej (8*8 pixli) strzalki, skierowanej na punkt o +wspolrzednych (x,y). Wskaznik ten moze byc przesuwany po +ekranie za pomoca klawiszy kierunkowych. Nacisniecie +klawisza powoduje przesuniecie wskaznika o 5 pixli. +Nacisniecie odpowiedniego klawisza w trybie numerycznym +przesuwa wskaznik o 1 pixel. Klawisz "home" powoduje powrot +wskaznika do pozycji (x,y). Klawisz "End" usuwa wskaznik z +ekranu i powoduje powrot z procedury, pozostawiajac biezaca +pozycje w tym miejscu. Moze byc ona teraz odczytana za +pomoca funkcji INXPOS i INYPOS. + + + + + + + +Procedury obslugujace punkty + + +POINT(x,y) + + Procedura POINT ustawia biezaca pozycje w punkcie +(x,y) i zmienia jego kolor na biezacy. + + +INPIX(x,y) + + Funkcja INPIX ustawia biezaca pozycje w punkcie +(x,y) i zwraca jego kolor. + + + 13 + + + +Procedury rysowania linii + + +DRAW(x,y) + + Procedura DRAW rysuje odcinek od biezacej pozycji +do pozycji o wspolrzednych (x,y). Rysowanie polega na +zmianie koloru pixli nalezacych, wedlug algorytmu +Bresenhama, do odcinka. Pixle te przyjmuja nowy stan +zaleznie od biezacego koloru i stylu. + + + +CIRB(x,y,r,alfa,beta,kolb,wwyp,p,q) + + Procedura CIRB rysuje na ekranie wycinek okregu +lub elipsy, zaleznie od podanych wartosci p i q, +okreslajacych aspekt. Aspekt wyznaczony jest stosunkiem p/q. +Dla wartosci aspektu rownej 1 zostanie narysowany idealny +okrag. Srodek bedzie umieszczony w punkcie (x,y), promien +poziomy bedzie mial wielkosc r pixli, alfa i beta okreslaja, +odpowiednio kat poczatkowy i koncowy rysowanego wycinka. Dla +alfa = beta zostanie narysowany pelny okrag (lub elipsa). +Wartosci alfa i beta sa wyrazane w radianach, w zwyklym +ukladzie. Brzeg wycinka i jego promienie zostana narysowane +kolorem kolb, niezaleznie od stylu. Jesli wwyp <> 0, wnetrze +wycinka zostanie wypelnione biezacym kolorem i stylem. + + +HFILL(x) + + Procedura HFILL rysuje, w biezacym kolorze i stylu, +odcinek poziomy od biezacej pozycji do punktu o +wspolrzednych + + (x,inypos(0)) + +OSTROZNIE: HFILL nie zmienia biezacej pozycji. + + Uzycie HFILL jest zalecane przy wypelnianiu +obszarow, gdyz dziala znacznie szybciej niz odpowiedni DRAW. +Rowniez mieszajac kolory w danym stylu, HFILL, w +przeciwienstwie do DRAW nie bierze pod uwage poczatkowego +punktu odcinka, co pozwala na uzyskanie substytutu +dodatkowych kolorow. + + + + + 14 + + +VFILL(y) + + + Procedura VFILL rysuje, w biezacym kolorze i stylu, +odcinek pionowy od biezacej pozycji do punktu o +wspolrzednych + + (inxpos(0),y) + +OSTROZNIE: VFILL nie zmienia biezacej pozycji. + + + 15 + + + +Procedury operujace na fragmentach ekranu + + +GETMAP(x,y,tablica) + + Procedura GETMAP zapamietuje prostokatny obszar +ekranu pomiedzy biezaca pozycja jako lewym gornym rogiem a +punktem (x,y) jako prawym dolnym rogiem w tablicy. GETMAP +nie zmienia przy tym biezacej pozycji. Tablica powinna miec +co najmniej 4 + w*sufit(k/8)*kol bajtow, gdzie w i k sa, +odpowiednio, liczba wierszy i kolumn zapamietywanego +obszaru, natomiast wartosc wspolczynnika kol zalezy od +rodzaju karty graficznej i wynosi 1 dla karty Hercules, +2 dla karty IBM oraz 4 dla karty EGA. + +Przyklad: zapamietanie obszaru 101*101 polozonego w lewym +gornym rogu ekranu. + +VAR OKNO: ARRAY[1..700] OF INTEGER; + + ... + MOVE(0,0); + GETMAP(100,100,OKNO); + ... + + + +PUTMAP(tablica) + + Procedura PUTMAP ustawia prostokatny obszar ekranu +o lewym gornym rogu znajdujacym sie w biezacej pozycji +zgodnie z zawartoscia tablicy, w ktorej uprzednio +zapamietano fragment ekranu za pomoca procedury GETMAP. +Biezaca pozycja nie ulega zmianie. Odtworzeniu podlega caly +zapamietany obszar, ktory jest kopiowany w nowe miejsce. + + +ORMAP(tablica) + + Procedura ORMAP dziala podobnie jak PUTMAP, lecz o +nowej zawartosci ekranu decyduje wynik zastosowania funkcji +or do elementow tablicy i ekranu. + + +XORMAP(tablica) + + Procedura XORMAP dziala podobnie jak PUTMAP, lecz o +nowej zawartosci ekranu decyduje wynik zastosowania funkcji +xor do elementow tablicy i ekranu. + + + 16 + + + +Procedury wejscia/wyjscia dla pojedynczych znakow + + +INKEY(ple) + + Funkcja calkowita INKEY podaje i usuwa nastepny +znak z bufora klawiatury. Czytanie odbywa sie bez echa. +Jesli bufor jest pusty, wynikiem jest 0. Klawisze specjalne +kodowane sa jako liczby ujemne wedlug zalaczonej tablicy. +Metoda ALT-NUM moze byc uzyta do wprowadzenia z klawiatury +kodow powyzej 127 jako zwyklych znakow. Uniemozliwia to, +niestety, korzystanie ze znakow specjalnych o kodach od 128 +do 132. + +Przyklad: zaczekaj na klawisz End. + +PROCEDURE WAIT_FOR_END; +BEGIN + WHILE INKEY(0)<>-79 DO; +END; + +Wartosci kodow klawiszy specjalnych podane sa w Dodatku F. + + +HASCII(kod) + + Procedura HASCII rysuje na ekranie znak +alfanumeryczny. Znak wpisany jest w raster 8*8. Gorny lewy +rog rastra umieszczony bedzie w biezacej pozycji, ktora +jednoczesnie przesunie sie o 8 pixli w prawo. Uzyta funkcja +rysujaca jest xor. Kroj znakow pobierany jest z tablicy +znajdujacej sie w ROM BIOS standardowo pod adresem +F000:FA6E. W przypadku niestandardowego ROM BIOSu obraz +znaku alfanumerycznego bedzie zly. Uzycie procedur HFONT i +HFONT8 pozwala uniezaleznic sie od wersji BIOSu a takze +korzystac z innych, rowniez wlasnorecznie zaprojektowanych +krojow znakow. Kod znaku 0 powoduje tylko wyczyszczenie +miejsca przeznaczonego na znak, bez zmiany biezacej pozycji. +Wszystkie kody maja tylko interpretacje graficzna, bez +funkcji sterujacych (NL, CR etc.). + +Przyklad: napisanie slowa "oh" na gwarantowanie czystym tle. + + +HASCII(0); HASCII('o'); HASCII(0); HASCII('h'); + +Uwaga: + Parametr procedury HASCII moze byc typu integer lub +znakowego ( character w Fortranie, char w Pascalu i C ). + + + + 17 + + + +HFONT(segment,offset) + + Wywolanie procedury HFONT przelacza adres wzorca +znakow alfanumerycznych na segment:offset. Bez uzycia HFONT +uzywa sie adresu F000:FA6E. + + +HFONT8(segment,offset) + + Uzycie procedury HFONT8 dolacza do programu +uzytkowego kopie tablicy kroju znakow z ROM BIOS i zwraca +adres tej kopii jako segment:offset (parametry wyjsciowe). + + + + + 18 + + + +Procedury wejscia/wyjscia dla linii + + +OUTHLINE(dlugosc,bufor) + + Procedura OUTHLINE wywoluje HASCII dlugosc razy, +wypisujac na ekran znaki, ktorych kody zawarte sa w buforze. +Przed narysowaniem kazdego znaku wywolywane jest HASCII(0). + + +INHLINE(dlugosc,bufor) + + Procedura INHLINE wczytuje z klawiatury linie +zlozona z co najwyzej dlugosci znakow i umieszcza je w +buforze. Do wczytywania uzyta jest procedura INKEY. +Wyswietlane jest echo. Migajacy wskaznik oznacza oczekiwanie +na nacisniecie klawisza. Klawisz BACKSPACE dziala tak, jak +mozna tego oczekiwac. Linia moze byc zakonczona klawiszem CR +albo wyczerpaniem jej dlugosci. Znak CR konczacy linie nie +jest umieszczany w buforze. Przed rozpoczeciem czytania +bufor jest wypelniany spacjami. Po zakonczeniu czytania +parametr dlugosc zwraca liczbe wczytanych znakow. +Migajacy wskaznik jest zawsze rysowany kolorem numer 1, +wyswietlane znaki natomiast biezacym kolorem. + + +Przyklad: echo wczytanej linii. + +VAR LINIA: ARRAY[1:40] OF INTEGER; + N: INTEGER; +BEGIN + N:=80; + INHLINE(N,LINIA); + IF N=0 THEN MOVE(INXPOS(0),INYPOS(0)+10) + ELSE OUTHLINE(N,LINIA); + ... + + + + + 19 + + + +Procedury wejscia/wyjscia dla okienek + + +MKWNDW(x,y,kolumn,wierszy,okienko,rozmiar,ramka) + + Procedura MKWNDW urzadza na ekranie prostokatne +okienko do konwersacji. Lewy gorny rog okienka znajdzie sie +w punkcie (x,y). Zmiesci ono zadana liczbe kolumn i wierszy +tekstu alfanumerycznego. Opis okienka bedzie przechowany w +dostarczonej przez uzytkownika tablicy okienko. Parametr +rozmiar jest na razie ignorowany, a tablica powinna miec co +najmniej 20 bajtow, lub duzo wiecej, jesli okienko ma byc +zaslaniane i odslaniane ( patrz opis procedury BURY ). Jesli +parametr ramka ma wartosc rozna od 0, obszar okienka bedzie +obwiedziony ramka, co uczyni je nieco wiekszym. + + +BURY(okienko) + + Wywolanie BURY usuwa okienko z ekranu, przechowujac +jego obraz w dalszej czesci tablicy okienko tak, aby moc +odtworzyc je pozniej za pomoca EXPOSE. Tablica okienko musi +miec odpowiednia wielkosc, aby GETMAP obszaru okienka +pozostawilo w niej jeszcze co najmniej 20 bajtow. + + +EXPOSE(okienko,x,y) + + Wywolanie EXPOSE odtwarza okienko przechowane za +pomoca BURY umieszczajac jego gorny lewy rog w punkcie +(x,y). + + +OUTWLINE(okienko,dlugosc,bufor) + + Procedura OUTWLINE dziala podobnie jak OUTHLINE, +wyswietlajac linie w ramach podanego okienka. Bufor o +dlugosci wiekszej niz rozmiar okienka wyswietli sie w kilku +liniach. + + +INWLINE(okienko,dlugosc,bufor) + + Procedura INWLINE, podobnie jak INHLINE, wczytuje z +klawiatury linie tekstu. W przypadku INWLINE okienko +wskazuje na obszar ekranu, w ktorym ma pojawiac sie echo. +Jesli dlugosc bufora jest wieksza niz rozmiar okienka echo +moze zajac w nim kilka linii. Poprawianie wprowadzanego +tekstu przy uzyciu BACKSPACE jest mozliwe tylko w ostatniej +czesci linii. Dlugosc jako parametr wyjsciowy zwraca liczbe +wczytanych znakow, bez konczacego CR. + + + 20 + + + +Procedury poziomu 2 + + + Procedury te operuja wspolrzednymi wyrazonymi +liczbami rzeczywistymi odnoszacymi sie do abstrakcyjnego +okna o dowolnych rozmiarach. + + + +Definiowanie okna + + +SWINDOW(rxy,ixy,skalowanie) + + Procedura SWINDOW urzadza na ekranie prostokatne +okno umieszczone pomiedzy punktami naroznikowymi podanymi w +tablicy ixy jako calkowite wspolrzedne prawdziwych pixli. +Program uzytkowy tworzacy rysunek w tym obszarze bedzie +okreslal polozenie punktow w sposob abstrakcyjny we +wspolrzednych rzeczywistych. Tablica rxy podaje zakresy tych +wspolrzednych. Jesli parametr skalowanie ma wartosc 0, +abstrakcyjny prostokat bedzie po prostu odwzorowany na +wskazana czesc ekranu bez zachowania proporcji miedzy +skalowaniem w pionie i w poziomie. Jesli natomiast parametr +skalowanie bedzie rozny od zera, wykorzystana zostanie +jedynie srodkowa czesc obszaru ekranu tak, aby zachowac +rzeczywiste proporcje rysunku, niezaleznie od aspektu danego +monitora. +Odwzorowanie stosowane przez IIUWGRAF odwraca tez kierunek +wzrastania wspolrzednej y do naturalnego ukladu: + + + (ixy(1),ixy(3)) + / + (rxy(1),rxy(4)) + ^ + | + | + | + | (ixy(1),ixy(4)) (ixy(2),ixy(4)) + | / / + (rxy(1),rxy(3))--------------------->(rxy(2),rxy(3)) + + +Przyklad: przygotowanie rysunku sinusoidy w gornej polowie +ekranu Herculesa. + + +VAR RW:ARRAY [1:4] OF REAL INIT (0.,6.29,-1.,1.); + IW:ARRAY [1:4] OF INTEGER INIT (0,719,0,173); +BEGIN + SWINDOW(RW,IW,0); + + + + 21 + + +RWINDOW(rxy,skalowanie) + + Procedura RWINDOW jest skrotem wywolania SWINDOW +dla odwzorowania obejmujacego caly ekran. + + + +RINXPOS(ple),RINYPOS(ple) + + Funkcje rzeczywiste RINXPOS i RINYPOS zwracaja, +odpowiednio wspolrzedne x i y biezacej pozycji w +abstrakcyjnym oknie urzadzonym przez ostatnie wywolanie +RWINDOW lub SWINDOW. Biezaca pozycja jest zawsze zaokraglana +do najblizszego pixla. + + + +RMOVE(rx,ry) + + Wywolanie procedury RMOVE ustawia biezaca pozycje w +punkcie (rx,ry) w ostatnio urzadzonym oknie. Pozycja ta jest +zaokraglona do najblizszego pixla. + + + +RDRAW(rx,ry) + + Wywolanie procedury RDRAW powoduje narysowanie w +biezacym kolorze i stylu odcinka od biezacej pozycji do +pixla najblizszego punktowi (rx,ry) w ostatnio urzadzonym +oknie. + + + +RCIRB(rx,ry,rr,alfa,beta,kolb,wwyp,p,q) + + Procedura RCIRB odpowiada procedurze CIRB z poziomu +1, z tym, ze wspolrzedne srodka (rx,ry) i promien rr +wyrazane sa, jako liczby rzeczywiste, w oknie urzadzonym +przez ostatnie wywolanie RWINDOW lub SWINDOW. Pozostale +parametry maja znaczenie takie, jak w CIRB. + + + 22 + + + +Informacje dodatkowe + + + Pakiet IIUWGRAF zawiera dodatkowo dwa programy +HGCPRINT.EXE oraz MGCPRINT.EXE. Umozliwiaja one drukowanie +tworzonych obrazow graficznych na powszechnie dostepnych +drukarkach ( np. typu STAR GEMINI, EPSON ). W przypadku +uzywania karty Hercules nalezy stosowac program HGCPRINT, a +dla karty IBM color/graphics program MGCPRINT. + + Programow tych powinno uzywac sie w nastepujacy +sposob : + przed zaladowaniem wlasnego programu nalezy wykonac +program HGCPRINT lub MGCPRINT, w zaleznosci od rodzaju +uzywanej karty graficznej. Kazdy z tych programow ustawia +znaczenie klawisza PrtSc. Kazdorazowe pozniejsze nacisniecie +klawisza PrtSc powoduje wydrukowanie graficznej zawartosci +ekranu. + +Uwaga. W przypadku karty Hercules drukowana jest +zawartosc pierwszej strony graficznej, niezaleznie od tego, +ktora strona jest aktualnie wyswietlana. + W przypadku karty IBM color/graphics klawisz PrtSc +zaklada, ze jest ustawiony tryb kolor 320*200. Wydruk obrazu +graficznego utworzonego w trybie mono 640*200 jest mozliwe +poprzez uzycie procedury PRTSCR. + + Mozliwosc drukowania obrazu graficznego nie +istnieje dla karty EGA. + + Autorem programow HGCPRINT oraz MGCPRINT jest +Krzysztof Studzinski. + + + + +Procedury dodatkowe + + +PRTSCR(nr) + + Procedura PRTSCR umozliwia drukowanie obrazow +graficznych tworzonych na ekranie monitora pod kontrola +programu. Parametr nr okresla numer strony graficznej +(0 lub 1), ktorej zawartosc ma byc wydrukowana. + + Wywolanie procedury PRTSCR z parametrem nr rownym +zeru jest rownowazne nacisnieciu klawisza PrtSc. + + W celu poprawnego dzialania tej procedury nalezy, +analogicznie jak w przypadku klawisza PrtSc, uprzednio +wykonac dolaczony program : + - HGCPRINT.EXE w przypadku uzywania karty +Hercules lub + - MGCPRINT.EXE dla karty IBM. + + Procedura PRTSCR nie dziala dla karty EGA. + + + + + 23 + + + + + DODATEK A + + Uzycie IIUWGRAFu z FORTRANem 77. + + +1) Procedury IN?LINE i OUT?LINE dokonuja jedynie +transmisji tekstu, bez zadnej konwersji pomiedzy postacia +binarna i tekstowa. Aby takiej konwersji dokonac, mozna +posluzyc sie instrukcjami formatowanego wejscia/wyjscia +w polaczeniu z tzw. plikami wewnetrznymi (internal file). + +Przyklad: + + + INTEGER*2 I,J,SUM,W(10) + CHARACTER*20 LINE + CHARACTER LINEL(20) + EQUIVALENCE (LINE,LINEL(1)) + + ... + CALL MKWNDW(10,10,21,4,W,20,1) + CALL OUTWLINE(W,20,'PODAJ 2 LICZBY (2I3)') + CALL INWLINE(W,20,LINEL) + READ (LINE,'(2I3)') I,J + SUM=I+J + WRITE (LINE,'(8H SUMA = I4)') SUM + CALL OUTWLINE(W,12,LINEL) + + + 24 + + + + + + DODATEK B + + Uzycie IIUWGRAFu z PASCALem. + + +1) Microsoft Pascal dopuszcza jedynie 6 znakow w nazwie +podprogramu, zatem nazwy: INHLIN(E), INWLIN(E), OUTHLI(NE), +OUTWLI(NE), RWINDO(W), SWINDO(W), RINXPO(S), RINYPO(S) musza +byc uzywane w skroconej postaci. + +2) Niektore procedury IIUWGRAFu sa napisane w FORTRANie. +Przy linkowaniu LINK moze domagac sie dostarczenia +biblioteki FORTRAN.LIB. Zadanie to nalezy zignorowac. + +3) Do linkowania nalezy uzywac LINK w wersji co najmniej +3.04, do kompilacji Pascal w wersji co najmniej 3.31. + + + 25 + + + + + DODATEK C + + Uzycie IIUWGRAFu z Lattice C. + + +1) Nalezy unikac konfliktow z nazwami globalnych zmiennych +roboczych IIUWGRAFu. Zmienne te maja nazwy rozpoczynajace +sie od liter WIR... i PQASP... + +2) W przypadku procedur majacych parametry wyjsciowe ( w +dodatku E sa one zaznaczone jako vars ) nalezy przy ich +wywolaniu przekazywac adres odpowiedniego parametru +aktualnego. + +Przyklad: + + + CHAR LENGTH; + CHAR *TEXT; + ... + INHLINE(&LENGTH,TEXT) + + + +3) Adresy parametrow aktualnych nalezy przekazywac rowniez +w przypadku parametrow bedacych tablicami znakowymi. + + +Przyklad: + + + INT LENGTH; + CHAR *TEXT; /* LUB NP. CHAR TEXT[40]; */ + ... + OUTHLINE(LENGTH, &TEXT[3]); + /* WYPISZ ZNAKI Z TABLICY 'TEXT', ROZPOCZYNAJAC OD +CZWARTEGO */ + + + + 26 + + + + + DODATEK D + + Uzycie IIUWGRAFu z LOGLANem. + + +1) W biezacej wersji LOGLANu dostepnych jest jedynie 7 +podstawowych procedur: GRON, GROFF, MOVE, DRAW, HASCII, +HPAGE, INKEY obslugujacych wylacznie karte Hercules. + +2) System okienek do konwersacji nie bedzie w LOGLANie +dostepny w postaci procedur standardowych. Podobnie okienka +o wspolrzednych rzeczywistych. + +3) Niektore podprogramy dostepne jako funkcje standardowe +LOGLANu musza miec zmienione specyfikacje parametrow w +stosunku do oryginalnego IIUWGRAFu: + + IIUWGRAF LOGLAN + + GETMAP GETMAP:function:array of ? + INKEY INKEY:integer function; (* bez parametrow *) + INXPOS INXPOS:integer function;(* bez parametrow *) + INYPOS INYPOS:integer function;(* bez parametrow *) + + + + 27 + + + + + DODATEK E + + Wykaz specyfikacji procedur IIUWGRAFu. + + + proc BORDER(consts b: integer); + L proc BURY(window: buffer); + proc CIRB(consts ix,iy,ir: integer; + consts alfa, beta: real; + consts cbord, bcint, p, q: integer); + proc CLS; + proc COLOR(consts c: integer); + proc DRAW(consts ix,iy: integer); + L proc EXPOSE(window: buffer; consts x,y: integer); + L proc GETMAP(consts x,y: integer; ekran: buffer); + L proc GROFF; + proc GRON(consts imode: integer); + proc HASCII(consts ic: integer); + proc HFILL(consts maxx: integer); + proc HFONT(consts seg, offs: integer); + proc HFONT8(vars seg, offs: integer); + proc HPAGE(consts page, mode, clear: integer); + P proc INHLINE(vars n:integer; line: tekst); + L func INKEY(consts idummy: integer): integer; + func INPIX(consts x,y: integer): integer; + proc INTENS(consts i: integer); + PL proc INWLINE(window: buffer; vars n: integer; + line: tekst); + L func INXPOS(consts idummy: integer): integer; + L func INYPOS(consts idummy: integer): integer; + L proc MKWNDW(consts x,y,icols,ilines: integer; + window: buffer; + consts iwndwsize,iborder: integer); + proc MOVE(consts ix,iy: integer); + L func NOCARD(consts idummy: integer): integer; + proc ORMAP(ekran: buffer); + PL proc OUTHLINE(consts n:integer; line: tekst); + PL proc OUTWLINE(window: buffer; consts n: integer; + line: tekst); + proc PALLET(consts p: integer); + proc PATERN(consts p1, p2, p3, p4: integer); + proc POINT(consts ix,iy: integer); + proc POPXY; + proc PRTSCR(consts nr: integer); + proc PUSHXY; + proc PUTMAP(ekran: buffer); + L proc RCIRB(consts ix,iy,ir: real; + consts alfa, beta: real; + consts cbord, bcint, p, q: integer); + L proc RDRAW(consts rx,ry: real); + PL func RINXPOS(consts dummy: real): real; + PL func RINYPOS(consts dummy: real): real; + L proc RMOVE(consts rx,ry: real); + PL proc RWINDOW(rw: array [1:4] of real; + consts s: integer); + proc STYLE(consts s: integer); + + + 28 + + + PL proc SWINDOW(rw: array [1:4] of real; + iw: array [1:4] of integer; + consts s: integer); + proc TRACK(consts x,y: integer); + proc VFILL(consts maxy: integer); + proc VIDEO(ekran: buffer); + proc XORMAP(ekran: buffer); + +Uzyto notacji semi-pascalowej. +Specyfikacja consts oznacza parametr przekazywany przez +wartosc (tylko wejsciowy), vars - przez zmienna (wejsciowo- +wyjsciowy). +Typ buffer oznacza tablice bajtowa sluzaca do przechowania +zawartosci okreslonego obszaru ekranu ( rozmiar jej zalezy +od wielkosci tego obszaru ), typ tekst natomiast oznacza +tablice znakowa. +Litery w pierwszej kolumnie sugeruja dodatkowe wazne +informacje (roznice) w kontekscie konkretnych jezykow +(Fortran, Pascal, C, Loglan). + + + 29 + + + + DODATEK F + + Wartosci kodow klawiszy specjalnych: + + + 3 - ctrl-2 + 15 - back tab (shift-tab) + 16-25 - ALT-Q az do ALT-P + 30-38 - ALT-A az do ALT-L + 44-50 - ALT-Z az do ALT-M + 59-68 - F1 az do F10 + 71 - Home + 72 - Cursor-Up + 73 - PgUp + 75 - Cursor-Left + 77 - Cursor-Right + 79 - End + 80 - Cursor-Down + 81 - PgDn + 82 - Ins + 83 - Del + 84-93 - Shift-F1 az do Shift-F10 + 94-103 - Ctrl-F1 az do Ctrl-F10 + 104-113 - Alt-F1 az do Alt-F10 + 114 - Ctrl-PrtSc + 115 - Ctrl-Cursor-Left + 116 - Ctrl-Cursor-Right + 117 - Ctrl-End + 118 - Ctrl-PgDn + 119 - Ctrl-Home + 120-131 - Alt-1 az do Alt-= + 132 - Ctrl-PgUp + + + 30 + + + + + DODATEK G + + FEDIT + + Prosty program do edycji kroju znakow. + Dodatek do biblioteki graficznej IIUWGRAF. + +FEDIT pozwala komponowac i modyfikowac uklady pixli o +wymiarze 8*8. Takie uklady moga byc wyswietlane razem z +grafika za pomoca procedury HASCII. + +FEDIT produkuje opisy tablic kroju znakow w dwoch +postaciach: + + - jako podprogram dostarczajacy adres tablicy kroju +w postaci odpowiedniej do przekazania procedurze HFONT, + + - jako niezalezny program umieszczajacy wskaznik do +tablicy kroju w wektorze przerwania 14H. + +Pierwszy format moze byc uzyty do zastapienia standardowego +zestawu znakow zwykle znajdujacego sie w ROM BIOS pod +adresem F000:FA6E. Jest on uzywany przez procedure HASCII do +rysowania znakow o kodach od 0 do 127. Stad jego nazwa : + "format 0". + +Podprogram wygenerowany przez FEDIT ma nazwe HFONT8. Po +przetlumaczeniu przez MACROASSEMBLER musi byc on linkowany +razem z programem uzytkowym. Jesli zajdzie potrzeba zmiany +nazwy (np. w celu dynamicznego przelaczania pomiedzy kilkoma +krojami znakow), nazwa moze byc zmieniona recznie w tekscie +zrodlowym. + +Drugi format jest uzywany do rysowania znakow z +rozszerzonego zakresu znakow o kodach od 128 do 255. Stad +nazwa: + "format 128". + +Opis zestawu znakow w tym formacie musi byc zaladowany do +pamieci przed rozpoczeciem wykonania programu, ktory z niego +korzysta. Wskaznik do tablicy kroju musi byc wpisany w +wektor przerwania 14H. Robi to program wygenerowany przez +FEDIT, ktory nastepnie zawiesza sie za pomoca przerwania 27H +(terminate but stay resident). W tym przypadku tekst +zrodlowy po przetlumaczeniu przez MACROASSEMBLER musi byc +zlinkowany (bez zadnych bibliotek) do postaci .EXE. +IIUWGRAF i FEDIT nie daja mozliwosci dynamicznego +przelaczania tablic znakow rozszerzonego zakresu. + + + + 31 + + +Przyklad: + +VAR ISEG, IOFFS: INTEGER; +BEGIN + HFONT8(ISEG,IOFFS); (* ADRES TABLICY FORMATU 0 *) + ... + HASCII(45); (* UZYWA ROM BIOS *) + HASCII(145); (* UZYWA ROZSZERZONEGO ZESTAWU *) + ... + HFONT(ISEG,IOFFS); + HASCII(45); (* UZYWA TABLICY FORMATU 0 *) + HASCII(145); (* TEN SAM ROZSZERZONY ZESTAW *) + ... + HFONT(16#F000,16#FA6E); + HASCII(45); (* ZNOWU ROM BIOS *) + HASCII(145); (* TEN SAM ROZSZERZONY ZESTAW *) + + + FEDIT jest prostym programem konwersacyjnym o kilku +zaledwie rozkazach. Tablica kroju znakow zawiera wzorce +ukladow pixli rozmiaru 8*8. Wzorzec pojedynczego znaku moze +byc wyjety z tej tablicy w celu jego edycji i zapamietany z +powrotem, byc moze w innym miejscu tablicy. Sa dwie tablice +znakow: jedna dla kodow od 0 do 127, druga dla kodow od 128 +do 255. Pierwsza z nich nie moze byc modyfikowana. Druga z +nich moze poczatkowo zawierac zaladowany wczesniej +rozszerzony zestaw lub zostac wyczyszczona. Mozna tez +wczytac do niej zestaw zawarty w pliku wygenerowanym +wczesniej przez FEDIT. Po dokonaniu modyfikacji, zawartosc +tej drugiej tablicy moze byc uzyta do generacji badz +"formatu 0" badz "128". + + + Rozkazy FEDITu. + + +Rozkazy FEDITu sa wprowadzane jako pojedyncze litery +wybierajace czynnosci wymienione w jadlospisie wyswietlonym +u gory ekranu. Dodatkowe parametry podaje sie po +przynagleniu przez FEDIT. + +Komendy FEDITu: + +< low odswieza tablice "0 do 127" + +> high odswieza tablice "128 do 255" + +i init inicjalizuje zerami tablice "128 do 255" + +l load laduje tablice "128 do 255" z pliku + dodatkowy parametr: + - nazwa pliku (musi istniec) + + + 32 + + + +d dump wypisuje zawartosc tablicy "128 do 255" + na plik; dodatkowe parametry: + - nazwa pliku (bedzie zapisany) + - baza ( 0 albo 128), + zaleznie od formatu + - jezyk: + f - MS Fortran, MS Pascal + s - Lattice C, model S + p - Lattice C, model P + d - Lattice C, model D + l - Lattice C, model L + +e edit wyjmuje z tablicy pojedynczy znak + i umieszcza go w obszarze roboczym. + dodatkowy parametr: + - kod znaku (dziesietnie) + Po obszarze roboczym mozna poruszac sie + za pomoca klawiszy kierunkowych. Pixel + zapala klawisz Ins, gasi klawisz Del. + Klawisz End powoduje wyjscie z tego trybu. + +t text wyswietla tekst pomocny przy ocenie + jakosci ksztaltu znakow. Tekst, nie dluzszy + niz 40 znakow jest wprowadzany przez uzytkow- + nika. Dodatkowe parametry: + - vspace, + - hspace - odpowiednio, pionowy i poziomy + odstep w pixlach pomiedzy znakami. Normalnie, + vspace wynosi 2, hspace - 0. + +p put przechowuje wzorzec z obszaru roboczego pod + wskazanym kodem. Dodatkowy parametr: + - kod pozycji (dziesietnie), + powinien byc miedzy 128 a 255 + +q quit konczy dzialanie FEDIT + + +Z FEDITem nalezy obchodzic sie ostroznie. Posiada on jedynie +minimalne wbudowane zabezpieczenia i np. bez ostrzezenia +zapisze nowa, nie wykonczona jeszcze wersje kroju znakow na +pliku zawierajacym jedyny egzemplarz poprzedniej, bardzo +potrzebnej wersji. + + + 33 + + + + DODATEK H + + Zmiany IIUWGRAFu w stosunku do poprzednich wersji + + + + Zmiany IIUWGRAFu w stosunku do wersji 1.1 + + +1) Rozszerzenie zestawu obslugiwanych kart graficznych o +karte EGA ( IBM Enhanced Graphics Adapter ). + +2) Niewielkie modyfikacje procedur IIUWGRAFu : + + - dodanie procedury PRTSCR, + - modyfikacja procedury PATERN polegajaca na : + zwiekszeniu liczby parametrow ( wzorcow ) z +dwoch do czterech oraz + zmianie postaci tych parametrow ( zamiast +liczb dziesietnych liczby szesnastkowe ), +( rozszerzenie wzorcow oczywiscie oznacza rownoczesnie +modyfikacje procedur HFILL oraz VFILL ), + - zmiany nazw procedur GRAPH, TEXT, SCREEN +odpowiednio na GRON, GROFF, NOCARD. + + + + + Zmiany IIUWGRAFu w stosunku do wersji 2.1 + + +1) Udostepnienie procedur CIRB oraz RCIRB dla C. + diff --git a/sources/int/graf/doc/nullgraf.asm b/sources/int/graf/doc/nullgraf.asm new file mode 100644 index 0000000..5929544 --- /dev/null +++ b/sources/int/graf/doc/nullgraf.asm @@ -0,0 +1,32 @@ + TITLE NULLGRAF + PUBLIC GRON, GROFF, CLS, POINT, MOVE, DRAW, HFILL, VFILL + PUBLIC COLOR, STYLE, PATERN, INTENS, PALLET, BORDER, VIDEO, HPAGE + PUBLIC NOCARD, PUSHXY, POPXY, INXPOS, INYPOS, INPIX, GETMAP, PUTMAP + PUBLIC ORMAP, XORMAP, TRACK, INKEY, HASCII, HFONT, HFONT8, OUTHLI + PUBLIC CIRB + +DEFPRO MACRO ARG, PRLIST + LOCAL LAB + IRP X, +X LABEL FAR + ENDM +LAB PROC FAR + RET ARG +LAB ENDP + ENDM + +CODE SEGMENT 'CODE' + ASSUME CS:CODE + + DEFPRO , + DEFPRO 4, + DEFPRO 4, + DEFPRO 4, + DEFPRO 8, + DEFPRO 12, + DEFPRO 16, + DEFPRO 36, + +CODE ENDS + END + \ No newline at end of file diff --git a/sources/int/graf/draw.c b/sources/int/graf/draw.c new file mode 100644 index 0000000..aaf3174 --- /dev/null +++ b/sources/int/graf/draw.c @@ -0,0 +1,108 @@ + /* Loglan82 Compiler&Interpreter + Copyright (C) 1981-1993 Institute of Informatics, University of Warsaw + Copyright (C) 1993, 1994 LITA, Pau + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + +======================================================================= +*/ + +#include "graf.h" + + +void pascal draw( _col, _row ) + int *_col,*_row; +{ + int X1 = inxpos(NULL); + int Y1 = inypos(NULL); + int X2 = *_col; + int Y2 = *_row; + int pos_slope; + + int dX, dY, /* vector components */ + row, col, + final, /* final row or col number */ + G, /* used to test for new row or column */ + inc1, /* G increment when row or column doesn't change */ + inc2; /* G increment when row or column does change */ + + if( X2 < X1 ) + { + X1 = *_col; + Y1 = *_row; + X2 = inxpos(NULL); + Y2 = inypos(NULL); + } + + dX = X2 - X1; dY = Y2 - Y1; /* find vector component */ + pos_slope = (dX > 0); /* is slope positive? */ + if (dY < 0) pos_slope = !pos_slope; + if (abs(dX) > abs(dY)) { /* shallow line case */ + if (dX > 0) { /* determine start point and last column */ + col = X1; row = Y1; final = X2; + } else { + col = X1; row = Y2; final = X1; + } + inc1 = 2*abs(dY); /* determine increments and initial G */ + G = inc1 - abs(dX); + inc2 = 2 * (abs(dY) - abs(dX)); + if (pos_slope) + while (col<=final) { /* step thru cols. checking for new row */ + point( &col, &row ); + col++; + if (G >= 0) { /* it's time to change rows */ + row++; G+= inc2; /* positive slope, so inc thru rows */ + } else /* stay at the same row */ + G += inc1; + } /* while */ + else + while (col<=final) { /* step thru cols, check for new row */ + point( &col, &row ); + col++; + if (G > 0) { /* time to change the rows */ + row--; G+= inc2; /* negative slope, dec thru rows */ + } else + G += inc1; /* stay at the same row */ + } /* while */ + } /* if |dX| > |dY| */ else { + if (dY > 0) { /* steep line case, angle > 45 degree */ + col = X1; row = Y1; final = Y2; /* find start point and last row */ + } else { + col = X2; row = Y2; final = Y1; + } + inc1 = 2 * abs(dX); /* determine increments and initial G */ + G = inc1 - abs(dY); + inc2 = 2 * (abs(dX) - abs(dY)); + if (pos_slope) + while (row <= final) { /* step thru rows - check for new column */ + point( &col, &row ); + row++; + if (G >= 0) { /* it's time to change columns */ + col++; G+= inc2; /* pos. slope, increment thru cols. */ + } else + G += inc1; /* stay at the same column */ + } /* while */ + else + while (row <= final) {/* step thru rows, checking for new column */ + point( &col, &row ); + row++; + if (G > 0) { /* it's time to change columns */ + col--; G+= inc2; /* neg slope, so decrement thru columns */ + } else + G += inc1; /* stay at the same column */ + } /* while */ + } /* if |dY| > |dX| */ + + move( _col, _row ); +} + + + diff --git a/sources/int/graf/gpmap.c b/sources/int/graf/gpmap.c new file mode 100644 index 0000000..d7b6589 --- /dev/null +++ b/sources/int/graf/gpmap.c @@ -0,0 +1,128 @@ + +#include "graf.h" + + /* Loglan82 Compiler&Interpreter + Copyright (C) 1981-1993 Institute of Informatics, University of Warsaw + Copyright (C) 1993, 1994 LITA, Pau + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + +======================================================================= +*/ + +void pascal getmap( x, y, buf ) + int *x,*y; + char *buf; +{ + /* buffer : 2 bytes X size, 2 bytes Y size, and rows * columns of pixels */ + int i,j,x0,y0,x1,y1; + int x00 = inxpos(NULL); + int y00 = inypos(NULL); + pushxy(); + if( *x < x00 ) + { + x0 = *x; + x1 = x00; + } + else + { + x1 = *x; + x0 = x00; + } + if( *y < y00 ) + { + y0 = *y; + y1 = y00; + } + else + { + y1 = *y; + y0 = y00; + } + ((short int *)buf)[0] = (short int)(x1-x0+1); + ((short int *)buf)[1] = (short int)(y1-y0+1); + buf += 4; + for( j=y0; j<=y1; j++ ) + for( i=x0; i<=x1; i++ ) + *(buf++) = (char)inpix( &i, &j ); + popxy(); +} + + +void pascal putmap( buf ) + char *buf; +{ + int x00 = inxpos(NULL); + int y00 = inypos(NULL); + int xw = ((short int *)buf)[0]; + int yw = ((short int *)buf)[1]; + int i,j; + pushxy(); + buf += 4; + for( j=y00; j719 || y>347 ) + + +int pascal nocard( dummy ) + void *dummy; +{ + return 1; +} + + +#define index 0x3b4 /* 6845 ports */ +#define data 0x3b5 +#define mode 0x3b8 /* Herc ports */ +#define status 0x3ba +#define config 0x3bf + + +static int cur_color; +static int cur_x; +static int cur_y; +static char *page_drawn; +static int page_drawn_no; +static int page_viewed; + + +#if WORD_32BIT +#define HERC_BASE 0xE00B0000UL +#define CHAR_BASE 0xE00FFA6EUL +#else +#define HERC_BASE 0xB0000000UL +#define CHAR_BASE 0xFFA6000EUL +#endif + + +static void set_page_drawn( page ) + int page; +{ + if( page == 0 || page == 1 ) + { + page_drawn = (char *)( HERC_BASE + page * 0x8000); + page_drawn_no = page; + } +} + + +static void screen_off() +{ + outportb( mode, '\0' ); +} + + +static void set_page_viewed( page ) + int page; +{ + if( page == 0 ) outportb( mode, '\x0a' ); + else + if( page == 1 ) outportb( mode, '\x8a' ); + page_viewed = page; +} + + +static void clear_buffer( buf ) + char *buf; +{ + int i; + for( i=0; i<0x7fff; i++ ) buf[i] = '\0'; +} + + +static void clear_gr_scr( page ) + int page; +{ + if( page_viewed == page ) screen_off(); + clear_buffer( (char *)(HERC_BASE + page*0x8000) ); + if( page_viewed == page ) set_page_viewed( page ); +} + + +static int in_graphics=0; +void pascal gron( dummy ) + int *dummy; +{ + char i; + static char params[16] = { + '\x35', '\x2d', '\x2e', '\x07', '\x5b', '\x02', + '\x57', '\x57', '\x02', '\x03', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00' + }; + + if( in_graphics ) return; + in_graphics = 1; + + atexit( groff ); + +/* + { + int i=0; + geninterrupt (0x11); + if (( AX & 0x30 ) == 0x30) + for (i=0; i<0x800; i++) + if (inportb(status) & 0x80) + { + i=-1; + break; + } + if( i != -1 ) + { + fprintf( stderr, "This version runs only with HERCULES graphic card\n" ); + exit( 1 ); + } + } +*/ + + + outportb( config, 3 ); /* allows both graphics pages */ + screen_off(); + for( i=0; i>(i-x00)) ) ) + point(&i,&j); + } + popxy(); + if( chr != 0 ) + { + x00 += 8; + move( &x00, &y00 ); + } +} +void pascal hfont ( seg, ofs ) int *seg,*ofs; {} +void pascal hfont8( seg, ofs ) int *seg,*ofs; {} + + diff --git a/sources/int/graf/hlineio.c b/sources/int/graf/hlineio.c new file mode 100644 index 0000000..bb2ea48 --- /dev/null +++ b/sources/int/graf/hlineio.c @@ -0,0 +1,41 @@ + /* Loglan82 Compiler&Interpreter + Copyright (C) 1981-1993 Institute of Informatics, University of Warsaw + Copyright (C) 1993, 1994 LITA, Pau + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + +======================================================================= +*/ + +/* + OUTHLINE(dlugosc,bufor) + + Procedura OUTHLINE wywoluje HASCII dlugosc razy, + wypisujac na ekran znaki, ktorych kody zawarte sa w buforze. + Przed narysowaniem kazdego znaku wywolywane jest HASCII(0). +*/ + +#include "graf.h" + +void pascal outhli( length, buf ) + int *length; + char *buf; +{ + int l = (*length) % 0x10000; + int zero = 0; + while( l-- > 0 ) + { + hascii( &zero ); + hascii( (int *)(buf++) ); + } +} + + diff --git a/sources/int/graf/hvfill.c b/sources/int/graf/hvfill.c new file mode 100644 index 0000000..c64b3ad --- /dev/null +++ b/sources/int/graf/hvfill.c @@ -0,0 +1,40 @@ + /* Loglan82 Compiler&Interpreter + Copyright (C) 1981-1993 Institute of Informatics, University of Warsaw + Copyright (C) 1993, 1994 LITA, Pau + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + +======================================================================= +*/ + +#include "graf.h" + + +void pascal hfill( col ) + int *col; +{ + int x = inxpos(NULL); + int y = inypos(NULL); + draw( col, &y ); + move( &x, &y ); +} + + +void pascal vfill( row ) + int *row; +{ + int x = inxpos(NULL); + int y = inypos(NULL); + draw( &x, row ); + move( &x, &y ); +} + + diff --git a/sources/int/graf/lib/egamsf4.lib b/sources/int/graf/lib/egamsf4.lib new file mode 100644 index 0000000000000000000000000000000000000000..3aa9e47aa9f291e444cdc39894f71c7b0c9f55db GIT binary patch literal 26889 zcmeHw4_H-Iy7#-!KId>i1pJd>DS;WKG)8Kssi_DDEdvDHfEJ=A=}2M};rbOKbNDnI7AG9>G(ij}Z+ijH0d-nakYwrVSPG9p3&+|Q> za}VtEuC@01|NdR?T6>@Ky@}=%$z*)Wg2?vR@&)-z^K)}=+8j${o|+t=V2+=XKE)cJ zn3_B*#hRGPNdTM}kTP>hTFTHV)}bQM@3{afeoL~-(rp|HqX3)qK0=FbB8y4-_<1Xt zHAyqgsTo5O(e&xFG7?j#*drq&i$+9_9C0@S56qg86?yl#vG@9WWWc4D=sZ!>wosBr z(k7Hfc`^}I)+`|@Rk9G(q>%q_ho=8&T4))WjT$t3&f}jnjn1DB4aFCN`iH1bpCLm= zjf#(-H7hrF<;u#+En8lB<(+rD-jgTW+mUD0q+3D*WXW06pBpukg&MsxCP`FklIUUS z{+bA$!dcF9yThn4%=y(L2h1X7(qjk5ZVJXETQGrkdkE2qO}!8`BbtQH-BE=q3-n%= zSx8=xw_;2WPW?SR^?$s6r+%C<^%!UAlc!5HKQ7oskASly)Jc%tqD~3k#OzulS$` zQF1$@(>1e|?qU`+-xrUM|0|}9& zS^0wb+Id6e03hjpTHJQ|4pylV1 z8V2yVr1l4RLQ=y4R!C|jz`sc9Z2%5Qy#ru_q>cb^O6o{}XC$*O5T_>3NKOSdPx?8I z@wqI2@zR0^dJvzp7@w|Ae69~9KOH@N-6^6h1Gh?sK(0kC4T^RS{+fs-V-<9da|{v7 zM~je;kc@s=S+y7P(Og3mU1{#hK<#t08S6HB)-{CI_JwL!2LOfXl6n)s5=o5!0Gmz# z__w0fr*X-t@d?aix%$bLG)c^8(!D!>9-TF=1ze_8%4ORw6+g;Y>#dsK9sB^ z06DjJvJvyoqTKwY1wE z63h1wV2gy!cnChOx4dnD6ZHbAKLoHef0%g9oJjQ7`99gZP&FaWe-6u?+ghXTM#ViV{-QeyyMEZqfgKM6|+=Fu3$U{8$$ zfO#|#Adb|@0I-?j0pdwb1b9YL9|W+InhJm}J)(n00nnw#0MNlD0O-BN zfDS$hfG(8)po3)q=u$ZVI`}jIx>N;#4sHZMm;MC+9sD%_y7U|XI_LsGm)rp8;C29X z>30C=;41*J6z{hIQZlnLi5@jH$*i<#nOP8Ki#vrGBDy?VoR_z-2f1mF1a7+f`sJqm zk}RAJN(S3$k}%{#+jV1}&AZiSWNJF&TuZdme5{rYKVja(_={| zh0?JDg8zE6CW<*Y#m{uBzmVw27gsXnOs+WvM3s5#zGJoEiY$2#k#E0mf7utZ-M;!v z0G1XlMWs8ev^dSADF#WvPNk7-MfuG(?ujZR&6NXqIo zg47}_vyv?AlkoNt>tXOjJNrjFXPC9$h&xF{Y_26O5SIndO&kC9zd4uXfLrS^g(m+Zi@P?8jQFTB~4)yi-POf*t#! z>a(`NoA_2tRZFU=sqB)iRC;wbviUPzVXkC~W^bFFH7E0yx!u&s^a3{Z=5l(|UqrZb zwAc^nnzk+_LsajYLF$b#IMO7segVPXEeKv64*>l#2LSpdS7cecm|cQPMcBjs-%M%U zZHPTW>+S}aO#iC0MP_p9LsL?~0_EM=g7uAHho1Cj{4YCnvP0Pavco^h4u^Z19mH0! zpBwy+C7~U3{jjXCpojGX_Qy@q3;$gDLFuj^dQvC+KqaL8h)zi86!+M7{xQ{XZ+F$u zl~-tp&sYsS^tUy{$e*ks{1x9eXLi=#qbPJkluuHWF*o#rU{BF^`=A_nn-7Z*UbjLy zByYltl&*f_=g3i{y2 zs^5W^P=cocH3H=@`7oiYXq&mfvJi8 ztf0DR08m|)PHqbTKz!_+%#_x?j(nv$WhEvUl;sj;M;Z379$h|fWkU~A)2${@llKa0 zGL9)+f7{Eqo4UIm{jL&F5qlc9ld-X)Z#p|0oX29|>Uh$0@pufJCx9nnnu;@QCeco*?S@SkKe;kl({|b%_rrc(eHI?ovsLIHlRPgTX704H=Lg-( znpQlrd_O&Dkx#URZIV%Y$I+83tVd7E$SS`xH(hML@|I29@@d_=+6%qz-rb!x)c;`d z&u~r-9o>hq%BYQdCnG2Kk4tnMIk`eUa?*a}edKOCveS0WUUqj43(p1T3dN}bcw~>E z)~w9g`@OCfNu1+>=ZU?X`I7oG05I%50ASy#0<3)iS|CeOlk|JMvw?dG0M-|?0pRJH zrzb81zyX9sVC}V!>!phHq^A&jlhoBBrmoYoI{;9}1_0FYte(hQ7^tI~>!{I7?G{Pu zA9YZx=Q{#$2dQUu@E3sLq+S9*RX%_S@|Xb9B@cT72GhD=RHjKDJ_<3MJi`F)AP)~X zQ}Wy^vUny4u#Ww?$eDmxzT}w!;E+6NBDPM^@A2|#2zllLM3RRk8)7Q}qRGR1IH;O8 zXb|IJA@)1~nte%6{5OCllIPz6(9fL!>C(D4^{VR;L(YQ$=-FWa6#p0?n$~@(XK6zW zJ^Ka#J^N0?)?F6&>iURS9dB{vOD27bIzDwu1`);TtGY7yHx|uXv0(9HsRt$ORJLFL z{hvd^CU)7ad^+o%)n_!}hW2msR6#!M3@`Ulq4{;HI>?ev?2Z^4AHoZQqdd-!D!yqt z!+)!N9dc>k)$L@C81>1h$R#`+w{1%s{*h=cgAfp8q%>(YSH*E!Q|dZMLT+BpQdP)A?xhK(gX!G(tIKw#d@A z&zo^b+Vn`xU_RoEy=^r+D7roXsx{jxpne*w+SQ910?j6q+6Q0TYsid4#Qsm|>X%l( zyJdB0srHGs|EyM;=kxhW#)eVY*b)K9mW<_uk}y4?geZK%gm7qG?d*Q!*Jwg+TwLx1 z()Mq8_uVb~wa|djr@UTo@r2ym+zH{O;gd#9ij7@%zGc;dRSOn8cBXdA>HY;{^YX@ei@Cq0rKKVt zvS}iJcsPaQgE+bs>~O<@xZJN3kWf#lan@sLmT6n_EX?^Trl^>Mf$2oLZ4DJT@mMCpMgLg(FOqJ3*U} zi(9d=mrmc9!Ma7He`*fIdUfe&Fdp`lkDCQ;1 z9zMks5sYr4KWB3Dit}>M(0NSH{9GT^wflS@)zwkmnG2^50glb9tEbfK7hb?d`NqP=3Yo0C&a zJosR%3AQ7Dib2oF-1X67#oTa0ac~Ln+LDul@qfy3Z!Ov%6pUn~bNn*qX>48&hIAhB zBA)S%mYlqzT=X}VmWlBPlRg10IXnSpL@M`-$jcJ|*uf(Z_3=CreTo_93PpX8Ri75+ ziuwiNQCMtAZ0u;p9~a|(0ATze$d7zJrd3RU7!uOaAK>}9*heqZpxD@!*w{hL7vkaw zlBkG>#ve??V>LE1U6$+WeALK7O0tTxOJi~Or7j`G`gz5Imh}DKn7zurm!O|iiK4bjhRI05f$Ui}54Sob;x5H)r1-<;L@ zJ~0wjpT>^y>1XQrhn8CXk!n%3{zc%nnm`_*14CY;P z==^Nx{GU^*uHe(Are@4a0q+!b@eVVZIIpy9-eU{%dysu9*&VgGlYOo`7u5PIT~NlE zbe&&PMt*su!Fi{8MbG z0|TRu))0;SQb)w?{PdL-7)X_VrZZhq^3*A*@j$`$&N=7#UbegdDyt`-zY1iA`}+E2 zxZVcC=@Z?m&u&U;I;0wA*LZXaA;>d6&pfZ7VBzwm%X^TZGkJoyT)z|iura|n#@`n@ z9x9&?4XZ-ocSiWEd1nMmd4EKlIS(TopnM0*Sa=2B3Zskv8FT{Pvx8Zu+xOq&8b@n+ zi)E62(%2!b4cB9Xz%5Q`EpM;m9=n+~NNY#xF+N88jI`3g^_294)Fj|{Qzs`0bPN5p zqTtEAg;RSF+fx|ZJFZ`BCv;&OXq?z|w&^UpTK&(H?tLaxEjOZh;>qsyP# z49|{ueB1Cgl(Vucq@jkVdU&xFEvyT3EF8L7?w)ICgC zl5wmE1Fq_dW7~|#t@lOvKUOYY`e^>j72j9FYe5gCMcS8C;(2HHj2YA8?8&JKt14mF zZjH@L{u2jYl%^{8ZXQEqJYU{>TE_IG_~eYVx#7xIZx%{ZPcnIAxH909Q-8?rg zEltMtM-1tX?H1WAIS`sAk;N(nbBHJ)Knmi}5V8eIUpLdAscbx=rfFPL;M}?PsSENJE-fN++^p0rvZN&AXgpbyXQiVlvKo6- zR^x~ar=uXZBKEGV4?UQX6rVvK)>sHmp2%@EyJX!pRDLcfLt+1rGr(cLq-KXim#+$; z!oJotYnpTa`h6A?_U@hs5=eaMIk#KMVK;U?CQ4K?h_^K0Tv9d^Ywr>LHru|;GOnoO zsdKy~Q*SlXefY-H(WDiHX+G*O_RZHXc;)luZOhDi0?HEsAu11b48`+HRu__R9#bA7G+- zyHBFsSR$o3?N+B^lTpSPF0x99p{W;xD0*B#XSO`O=|Xl&WKsfhSoCfSfd>)dGbxsj>I7LG5T)= z_o^*`$1yQj5`C>t43Yd~#CQw#<38G%VcsbpJ1y_y#^r$ReUYDAHb@e5;?D{)aV7^l zo0>kC56F9E`=#yu8H`&wDmsSnaiXye52)tCmprGA-{UOa7M#};@ z9|ENx>$D%t_$@>8n1ld}Ec)$8wCUaHj0e@*FG*PFZYx4bllK2zasPy8cRstCi5hn-$C9b&93F%zd~JV41sqiTiLaLUY`Q z6(#U+f+E)ky6Y|OdU7ASq?qge>OOQ{39M^#*PV3Nop2vIs>pR7cik5Ep+Y6#kgSB( zk=t|0-T1B2&-0nv^Rd#~a|~Cb+w-ow@efL1BbcM{7fL{5p<->EqJ(yfSGW3&Tm6e$J?B=xaI2rW)eqh3LAScct?qJr zUsHnAe{*|(s|0$B6`T6FTYb!}E^w=}wyF=h)yZykoZCA>3Gfb6tOIH;O41G)qRA>1 zWPx&mEJ2V!zHWTsN4_AxM5d;eX~==R-ALzW!6eyOpgAXh(>mcCKY}r_)Wasqx>8g$;u*E!XCv&0h z3gl}=Hm%62i={3htatGmj03Lu!En2C3WTc(V;5W^hAqYv=9hLxJDqXS1>N?CSYQod zD2804bHQ3sklsZ-t3AZ2gjqVv3$fEFM7kt`$k_9!|9gkPwB z;EJQhvr1^=@0I?IzX2UqfClpre@yAyn4$FXY9OChP|02;$on6lsF&R8b8hunx3>~E z9#(pJBbC4_J>{9A4PJ1#(<@xv~IagMk7Nz8)@~4 zMo{uIUsp!vI~+D~y-1BIirMqvR!@T4GsW#0z10)z_T1@iyd9}Swt5D-J$>DtUT%-c zt@_;F?-aB8?N+tjt)6wOEpGKww|aOh%iDUlcOUM(yH)*zTixM?)K#~;Rkz#wJW_wX zRei>-R=U+SZuOULwa~3DaeEiwM)p=U)$M&qv3T!CY}{7wXhl}g{ed!tL#+ z$OCvaAsJLf)cV8Kgzg_$uG{mue+S3R>g1TCGI;7nos+;*y*U)j*1nHJcQQ|Xf>3dP>J=pI;ZPX$4wm-(7@s{&R{H~KsWWFv zR{L~6Ofcf{2FzgCeWjpV{TB2XCm^i)ILTNjq)t!5QUM}LjGmVQ;vo?$((!Z%S?A8p zEy&L!ORBzd5UFW2ttOh+Wf0mrPwuv{e;_rbyQ~)E6^TWR7dpG4ce+&#O1HjU6UJ*) z{ZlpxaB`9>kQz+s)&@$q45(SpUT|R}2D3V-jy@iME74rt{CV~92s3dcxH`J|F&m;b z+ElIU00?|jOr692ZS`lkn#Y*Mo&+*S1S8KzdoZi$=$J%vR~B1mmN2drOGU1XEk-Dd zj3D0Ah=xRob_}rMYYcpVydFrj>NnVChf1A9)hBBqFFx{DW(`KjgbJHO(Anb=Tq~DA z3$XvHo6$`5$>!>lrQdFdhToo>LC5jdz_yjWM11{1uH)%hrsjVlQ`X5h{= z+_AgVIJY_pspD}C$DKRe>TL){;^xh`2D;S&i1x!3f+$9nTJwY?y&`R@?piQ`@_?iO z1Dnx|vgQzDStZC(#)@%!Fq35Wd`uqAAz`|uC-ON%f+(iJ5fVbXgIQ7X+D*5t1h<0k zep*vuKfS5GBvwUT3nE?b2o|?qrIleiif+bWI9QZ{moH%iSU}<%)a=CYj^DDW8b;+& zuEnYgioaD0R?ji^%iZc>K5vGu{b4=*T;G#t9;gub^JIa#W`VlW0Fwb9MA}q@C%GEO zD1AHwkqs#G^g&W@-0lS!04M{6KA`_x(mS_ z!1QZ?uK>R6QnvwYb*s-K<<~CnGsv_a!Ahip_f+tnTIN!Jp~&8!D*;SsId1h4x0-=_ zsV?sfWS@>87Go-U30jlYi7xeCfRS$XE~E^1d50oX6oP}1dNbgSfH%0*PykXahc-pB zeiiy5!qllDpc-}U;4o1Rt6-}|ygLy>`-4q4vaPEtjUjqQsEflU`YpTLELL4HB4@d- zyM_9AU7{$z?&kfH1&f!@AF*Icr49ZPGe?H`HTTq|m4SvMZfe49*Kos)?9|(VQ>UlK z{S>7wRPoJ0P|D|60SB?6D|5)kO4-CA*rkC|z>g{526mF=<_QlR>*A@Bf#eSX)U?q{{ZIcOK!+VA!={CDC;-s6RNq=z0|Tts{MP^6@{3?;m2AW0^9 z?y`A6nLPK2c`(tpjxbS* zHpYsR(q>#Habh|II~Xh!hO$uDeV-(Hk)c3_gg|LR6dr#eRjWQ}kFNeS31VdP5nuK3 z?3U`|6-Rs`tE0lEA#+%D^G0#27IFs5&4!DuTO9Ty4&^8uh({gvR~*W#B2=Mhj?I~x z(;jBz`O=}B(er%ZP(IQ_n;pt?^%W7CL~VC!75%mH_xfw5RfBiS9d5m361_a0-2gZMQ|{eVZHy&-x28Fb!H1)s13pLGrRwAM zmg?rDZ31TkF&CR16(F5tV};TrP$He zjUcV#o4uTbuTy(}q?YE=+Uny9kMVZ~-5tQ7u(&(#!?;@i>~mIxVM0&%oEt+l$Hp^0 z$3~zIcaVS-|*qP*uNxFQom1nK{Z1t)w zy-iTUM?Uz!K@3h5|D|i3boegihWg=3V0|>MA-EzG+u?pnXnmLxRNotM3oe3R?|WPq zaD9X8&$zzE^(C$rT%Y1F!lZdREql*@yKTePNyMXg(In|EsF60M7(Jh5@53Ch+6{> zh6AM?YwUYz(FLg`5J`urO(e_9lq|& z5%=GEx-;&Q&O4&`C1>0@2WqHabB9JW9%-e&LOYp zYdU;##i!ui*V@K*B{?dBAjLlQ(JHz1w+1gd(J3RV)Bg2j2igI2teKDbi8MsPxVUqL z*7`N=AnEQsUT;)U{&qVKlz-*#{%a1j?5w&&b0mH3cwm<^^^#-rm%j2}oM8X@6PlxH zzSgT2JxJ4Jw2dx~KTu-S&OOkp;eNE1pbtTs#MNQiH2c@%>|cW^$LqoqsfM6x_qE;* z*~TKh^(~W**VDfGiVNUKU0gfY6o6m*3Y^PeF$W~~L^BoGCRzxhc^k5w_BEZ+Mip>s{RcJURTZ#<-0;nYsi&#c{v$GBbNA!DC1JMqo)R{ow@lM8w|(S!pe*7`eS z=AcOP&`%75_<6`t8`rHilO=6UCu`!UFGL7Ec)%{=emtFZreROloR9_aJmC1v%-9$WGS1Q1 zzxf5N3MzjuTU7TkIqe@fm5*YO?`GtaDzddcn{$vC&8>QeD{MUja#u7b%rFV2OrOmU z8#RSH5p^Oe+h6IYyy`F7w%DKUOxog@Xg3{O9h8>De0FMCHD*e@WwtC-G z`gvbf26%suWS7$C<(d$JNskQ(*z1!gN%X#d9cEbYRMv|E7v(Kpx^Qv+hz0+}#~`)` z81YYj@~Z5f&Q)13A1Fwep8Qi5X2W>tH5IR!mk#NRFu%97>ukjTePK43I!`qirxMr$ z>R&Y-(hq?ccW{W;zlcdR+?czAbT5hU@nMe(+jl-ZSs326->bVeHM>FR<*GKQ8K5xu_|=CTof7 z0s770(a8nr(fyXitbN&dI{u_gR{e#+c+aN3NS;9f`s4Xg!%YUIykz1-Gk9(4J9re3 zpM#3RF*oC3gbz(%2jlUms1HrnMSPSxDosYJacC&&E7>YuSQS-@T|E7D#AwZMpmUmj zN_2(H$7pbWF(Cg2#Wu6CJU@oq`pKE^a2`l_NVb`6#wJG8HZuj_G${`7MyWHXMoMS&76;teVdl2yDuD5?Q9=;x_WgUvY78dZbZ z#Ovgv7DLt5C44h(-fXGZvs*NSSnp#UXTli&~5RNlb_5aN*jb9X&Kh<8ROU=&pP`PqXt{d z_>q#Rf#5Xp;|ozUfFpjbLR7NJIL$U3oc@^cLo!j|7xB|4fZ{lvO|nem)AngHwy*Kl zx_OeZU(eXrwF%RP{_=6={uFVZ71-2WZ^w`#PBT}@z@#`H9#tjlo>s^KeUptbs&C36 z#5|9Oo}zB?|AYiQodNm}dqj;Si}3XAkpuKsvqk+zVxQf0gyz4A|8J~PBy{y!8b}p1 zk}7EiRncNvPfz1VcDB>6a71}C9i!*S2G8F_$wl*|7pPR)M!%7MOAXS?^qur74L9we zWYaEs$+Vk3H2slok>8^mPs0O-Sv2nT%ZB^KuECoF*&IK?G873Z*dWLw%_~-GUmeNa1_INQ3Ay Ka=}H59RC9;v|$$j literal 0 HcmV?d00001 diff --git a/sources/int/graf/lib/hgcmsf4.lib b/sources/int/graf/lib/hgcmsf4.lib new file mode 100644 index 0000000000000000000000000000000000000000..b0d8d854bde5e88fa1dd67f1efeec477f4b19738 GIT binary patch literal 25355 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 literal 0 HcmV?d00001 diff --git a/sources/int/graf/makefile b/sources/int/graf/makefile new file mode 100644 index 0000000..22513ce --- /dev/null +++ b/sources/int/graf/makefile @@ -0,0 +1,32 @@ +# /* Loglan82 Compiler&Interpreter +# Copyright (C) 1981-1993 Institute of Informatics, University of Warsaw +# Copyright (C) 1993, 1994 LITA, Pau +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# ======================================================================= + + +COMMON=hlineio.o draw.o hvfill.o cirb.o gpmap.o hercules.o + +CC=gcc -O -Dpascal= -DWORD_32BIT +CCc=$(CC) -c + +#CC=cl -AL -Olsg +#CCc=$(CC) -Fo$*.o -c + +.c.o : + $(CCc) $*.c + +hgc386.a : $(COMMON) + ar rv hgc386.a $(COMMON) + + diff --git a/sources/int/handler.c b/sources/int/handler.c new file mode 100644 index 0000000..71bb6ee --- /dev/null +++ b/sources/int/handler.c @@ -0,0 +1,243 @@ +/* Loglan82 Compiler&Interpreter + Copyright (C) 1993 Institute of Informatics, University of Warsaw + Copyright (C) 1993, 1994 LITA, Pau + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + contacts: Andrzej.Salwicki@univ-pau.fr + +or Andrzej Salwicki + LITA Departement d'Informatique + Universite de Pau + Avenue de l'Universite + 64000 Pau FRANCE + tel. ++33 59923154 fax. ++33 59841696 + +======================================================================= +*/ + +#include "depend.h" +#include "genint.h" +#include "int.h" +#include "process.h" +#include "intproto.h" + +/* Handler routines */ + +/* pataud le 13/10/94 +#if !NO_GRAPH || !DJE +#if MSDOS +#include "graf\graf.h" +#else +#include "graf/graf.h" +#endif +#endif +*/ + +void errsignal(exception) +int exception; +{ + word signum, ah, am; + + signum = scot[ exception ]; + if (signum != -1) /* attempt to call a handler */ + { + raise_signal(signum, (word) 0, &ah, &am); + if (ic != 0) /* continue execution */ + { + go(ah, am); + longjmp(contenv, 1); + } + } + +#if MSDOS && !NO_GRAPH && !DJE + { + extern bool graphmode; + + if (graphmode) groff(); + graphmode = FALSE; + } +#endif + + putc('\n', stderr); + switch (exception) + { + case RTESLCOF: fprintf(stderr, " SL CHAIN CUT OFF"); break; + case RTEUNSTP: fprintf(stderr, " UNIMPLEMENTED STANDARD PROCEDURE"); break; + case RTEILLAT: fprintf(stderr, " ILLEGAL ATTACH"); break; + case RTEILLDT: fprintf(stderr, " ILLEGAL DETACH"); break; + case RTECORTM: fprintf(stderr, " COROUTINE TERMINATED"); break; + case RTECORAC: fprintf(stderr, " COROUTINE ACTIVE"); break; + case RTEINVIN: fprintf(stderr, " ARRAY INDEX ERROR"); break; + case RTEILLAB: fprintf(stderr, " INCORRECT ARRAY BOUNDS"); break; + case RTEINCQA: fprintf(stderr, " IMPROPER QUA"); break; + case RTEINCAS: fprintf(stderr, " ILLEGAL ASSIGNMENT"); break; + case RTEFTPMS: fprintf(stderr, " FORMAL TYPE MISSING"); break; + case RTEILLKL: fprintf(stderr, " ILLEGAL KILL"); break; + case RTEILLCP: fprintf(stderr, " ILLEGAL COPY"); break; + case RTEINCHS: fprintf(stderr, " INCOMPATIBLE HEADERS"); break; + case RTEHNDNF: fprintf(stderr, " HANDLER NOT FOUND"); break; + case RTEMEMOV: fprintf(stderr, " MEMORY OVERFLOW"); break; + case RTEFHTLG: fprintf(stderr, " FORMAL LIST TOO LONG"); break; + case RTEILLRT: fprintf(stderr, " ILLEGAL RETURN"); break; + case RTEREFTN: fprintf(stderr, " REFERENCE TO NONE"); break; + case RTEDIVBZ: fprintf(stderr, " DIVISION BY ZERO"); break; + case RTESYSER: fprintf(stderr, " SYSTEM ERROR"); break; + case RTEILLIO: fprintf(stderr, " ILLEGAL I/O OPERATION"); break; + case RTEIOERR: fprintf(stderr, " I/O ERROR"); break; + case RTECNTOP: fprintf(stderr, " CANNOT OPEN FILE"); break; + case RTEBADFM: fprintf(stderr, " INPUT DATA FORMAT BAD"); break; + case RTEILLRS: fprintf(stderr, " ILLEGAL RESUME"); break; + case RTETMPRC: fprintf(stderr, " TOO MANY PROCESSES ON ONE MACHINE"); break; + case RTEINVND: fprintf(stderr, " INVALID NODE NUMBER"); break; + case RTENEGST: fprintf(stderr, " NEGATIVE STEP VALUE"); break; + case RTENONGL: fprintf(stderr, " REFERENCE TO GLOBAL NON PROCESS OBJECT FROM PROCESS"); break; + default : fprintf(stderr, " UNRECOGNIZED ERROR"); + } + if (thisp->trlnumber < 0) thisp->trlnumber = - thisp->trlnumber; + if (thisp->trlnumber != 0) + fprintf(stderr, "\n AT LINE: %ld\n", (long) thisp->trlnumber); + endprocess(4); +} /* end errsignal */ + + +void raise_signal(signal, skip, ahnew, amnew) /* Raise exception */ +word signal, skip; +word *ahnew, *amnew; +{ + word t1, t2, t3, t4, t5, virts; + protdescr *ptr; + + t1 = 0; /* handler for others = no */ + t2 = M[ display2+M[ c1+PROTNUM ] ]; /* ah of current */ + t3 = c1; /* am of current */ + t5 = 0; /* flag handler not found */ + do + { + ptr = prototype[ M[ t3+PROTNUM ] ]; /* prototype of current */ + t4 = ptr->handlerlist; + if (t4 != 0) /* any handlers ? */ + { + do + { + t5 = M[ t4 ]; /* signal number */ + if (t5 != signal) + { + if (t5 == 0 && t1 == 0) t1 = t4; + t4 = M[ t4+2 ]; + } + } while (t5 != signal && t4 != 0); + } + if (t5 != signal) /* look in DL or SL */ + { + if (t1 != 0) t4 = t1; /* handler for others found */ + else + { + t4 = t3+M[ t3 ]; + if (ptr->kind == HANDLER) + t2 = M[ t4+SL ]; /* use SL for handlers */ + else + t2 = M[ t4+DL ]; /* or DL for other goodies */ + if (t2 == 0) /* handler not found */ + { + if (signal <= MAXSYSSN) + { /* system signal */ + ic = skip; + if (ic != 0) longjmp(contenv, 1); + else return; + } + else errsignal(RTEHNDNF); + } + t3 = M[ t2 ]; + } + } + else t1 = 0; + } while (t1 == 0 && t5 != signal); + + virts = thisp->prochead+M[ thisp->prochead ]+VIRTSC; + M[ virts ] = t2; /* compactification possible */ + M[ virts+1 ] = M[ t2+1 ]; + t3 = M[ t4+1 ]; /* prototype number of handler */ + t5 = prototype[ t3 ]->appetite; + if (t1 != 0) /* others */ + { + request(t5, ahnew, amnew); + M[ *amnew+M[ *amnew ]+SIGNR ] = 0; + } + else + { + if (signal == scot[ RTEMEMOV ] && + thisp->lastitem-thisp->lastused-1 < t5) + { + scot[ RTEMEMOV ] = -1; /* make memov look like abort */ + errsignal(RTEMEMOV); + } + request(t5, ahnew, amnew); + M[ *amnew+M[ *amnew ]+SIGNR ] = signal; + } + M[ *amnew+PROTNUM ] = t3; /* provide system attributes */ + t5 = *amnew+M[ *amnew ]; + M[ t5+SL ] = M[ virts ]; + M[ t5+SL+1 ] = M[ virts+1 ]; + t2 = M[ display2+M[ c1+PROTNUM ] ]; /* ah of current */ + M[ t5+DL ] = t2; + M[ t5+DL+1 ] = M[ t2+1 ]; + if (t1 != 0) /* skip */ + { + ic = skip; + go(*ahnew, *amnew); + } +} /* end raise_signal */ + + +void wind() +{ + word t1, t2; + + t1 = M[ M[ c1+M[ c1 ]+SL ] ]; /* am of handlers' SL */ + t2 = c1; /* current */ + while (TRUE) + { + t2 = M[ M[ t2+M[ t2 ]+DL ] ]; /* am of DL */ + if (t2 == t1) break; + M[ t2+M[ t2 ]+LSC ] = prototype[ M[ t2+PROTNUM ] ]->lastwill; + } + back(&thisp->backobj, &M[ temporary ], (word) 0); +} /* end wind */ + + +void term() +{ + word t1; + + t1 = M[ M[ c1+M[ c1 ]+SL ] ]; /* am of handlers' SL */ + M[ t1+M[ t1 ]+LSC ] = prototype[ M[ t1+PROTNUM ] ]->lastwill; + wind(); +} /* end term */ + + +/* This wraps up the above series of the handler procedures. + */ + +void backhd(virt, am) +virtaddr *virt; +word *am; +{ + if (M[ c1+M[ c1 ]+SIGNR ] <= MAXSYSSN) + errsignal(RTEILLRT); /* illegal return */ + else + back(virt, am, (word) 0); +} /* end backhd */ + diff --git a/sources/int/herc.c b/sources/int/herc.c new file mode 100644 index 0000000..0ae417d --- /dev/null +++ b/sources/int/herc.c @@ -0,0 +1,636 @@ +/* Loglan82 Compiler&Interpreter + Copyright (C) 1993 Institute of Informatics, University of Warsaw + Copyright (C) 1993, 1994 LITA, Pau + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + contacts: Andrzej.Salwicki@univ-pau.fr + +or Andrzej Salwicki + LITA Departement d'Informatique + Universite de Pau + Avenue de l'Universite + 64000 Pau FRANCE + tel. ++33 59923154 fax. ++33 59841696 + +======================================================================= +*/ + +#include "nonstand.h" + +typedef int word; + +#include +#include + +/*#include */ +#include +#include +#include + +#include + +#include +#include +#include + +XSizeHints theHints; +Display *theDisp; +int theDepth, theScreen, dispcells; +Colormap theCmap; +Window rootW, window, father; +GC theGC; +unsigned long fcol,bcol,white,black,style=1; +Font mfont; +XFontStruct *mfinfo; +Visual *theVisual; +XImage *theImage; +XClientMessageEvent toFatherEv; +XEvent event; +Cursor theCursor; + +int iWIDE,iHIGH; +int mouse_x=0,mouse_y=0,mouse_l=0,mouse_r=0,mouse_c=0, + mouse_l_prs=0,mouse_r_prs=0,mouse_c_prs=0, + mouse_l_p_x=0,mouse_r_p_x=0,mouse_c_p_x=0, + mouse_l_p_y=0,mouse_r_p_y=0,mouse_c_p_y=0, + mouse_l_rel=0,mouse_r_rel=0,mouse_c_rel=0, + mouse_l_r_x=0,mouse_r_r_x=0,mouse_c_r_x=0, + mouse_l_r_y=0,mouse_r_r_y=0,mouse_c_r_y=0; +int tracking=0; +#define END_OF_TRACK -9999 + +Pixmap pixmap; + +#define get_shrt(w) w=(int)(*(pars++)); +#define get_word(w) w=((int)(pars[0])&0xffff)|((int)pars[1]<<16); pars+=2; + +#define put_shrt(w) toFatherEv.data.s[cnt++] = (short)(w); +#define put_word(w) toFatherEv.data.s[cnt++] = (short)((w) & 0xffff); \ + toFatherEv.data.s[cnt++] = (short)(((w) >> 16) & 0xffff); +#define snd_father toFatherEv.type=ClientMessage; \ + toFatherEv.format = 16; \ + XSendEvent(theDisp,father,False,NoEventMask,&toFatherEv); \ + XFlush(theDisp); + +#ifndef NO_PROTOTYPES +void RealiseCmd(int,short *); +#else +void RealiseCmd(); +#endif + + +static char *application_name="IIUWGRAPH"; + + +#define QSIZE 256 +static KeySym keycodes[QSIZE]; +static int keyhead=0,keytail=0; + +main(argc, argv) + int argc; + char *argv[]; +{ + int w=0; + int i; + int events=0; + + father = atoi(argv[1]); + + for( i=2; ifid; + + theHints.width =iWIDE; + theHints.height=iHIGH; + theHints.flags=PSize; + window = XCreateSimpleWindow(theDisp,rootW,10,10,iWIDE,iHIGH,3,fcol,bcol); + + XSetStandardProperties(theDisp,window,"HERCULES","HERCULES", + None,argv,argc,theHints); + XDefineCursor(theDisp,window,theCursor); + + XChangeProperty(theDisp,window,XA_WM_CLASS,XA_STRING,8,PropModeReplace, + application_name,strlen(application_name)); + + { + struct { + long flags; + long functions; + long decorations; + int input_mode; + } hints; + Atom a=XInternAtom(theDisp,_XA_MWM_HINTS,False); + hints.flags = MWM_HINTS_FUNCTIONS; + hints.functions = MWM_FUNC_CLOSE | MWM_FUNC_MOVE; + hints.decorations = 0; + hints.input_mode = 0; + XChangeProperty(theDisp,window,a,a,32,PropModeReplace,&hints,4); + } + + theGC = XCreateGC(theDisp,window,0,0); + XSetFont(theDisp,theGC,mfont); + XSetForeground(theDisp,theGC,fcol); + XSetBackground(theDisp,theGC,bcol); + + XSelectInput(theDisp,window, + ExposureMask | + KeyPressMask | + PointerMotionMask | + ButtonPressMask | + ButtonReleaseMask + ); + XMapRaised(theDisp,window); + + pixmap = XCreatePixmap(theDisp,window,iWIDE,iHIGH,theDepth); + + for(;;){ + + XNextEvent(theDisp,&event); + + switch (event.type){ + + case Expose: + { + int x=event.xexpose.x; + int y=event.xexpose.y; + int w=event.xexpose.width; + int h=event.xexpose.height; + int cnt=0; + XCopyArea(theDisp,pixmap,window,theGC,x,y,w,h,x,y); + if( events==0 ){ + put_word(window); + snd_father + } + events=1; + } + break; + + case ClientMessage: + RealiseCmd( (int)(event.xclient.message_type),event.xclient.data.s); + break; + + case MappingNotify: + if( event.xmapping.request == MappingModifier || + event.xmapping.request == MappingKeyboard ) + XRefreshKeyboardMapping(&event); + break; + + case KeyPress: + { + KeySym key; + char ch; + int i=XLookupString( &(event.xkey), &ch, 1, &key, NULL ); + + if( i>0 ) + if( ch == '\177' ) keycodes[ keytail++ ] = -83; + else keycodes[ keytail++ ] = (int)ch; + else + if( key == NoSymbol ) break; + else + if( IsModifierKey( key ) ) break; + else + { + int to_return = 0; + switch( key ){ + case XK_F1 : to_return = -59; break; + case XK_F2 : to_return = -60; break; + case XK_F3 : to_return = -61; break; + case XK_F4 : to_return = -62; break; + case XK_F5 : to_return = -63; break; + case XK_F6 : to_return = -64; break; + case XK_F7 : to_return = -65; break; + case XK_F8 : to_return = -66; break; + case XK_F9 : to_return = -67; break; + case XK_F10 : to_return = -68; break; + case XK_Home : to_return = -71; break; + case XK_Left : to_return = -75; break; + case XK_Up : to_return = -72; break; + case XK_Right : to_return = -77; break; + case XK_Down : to_return = -80; break; + case XK_End : to_return = -79; break; + case XK_Insert: to_return = -82; break; + case XK_Break : to_return = -3; break; + case XK_Prior : to_return = -73; break; + case XK_Next : to_return = -81; break; + } + if( to_return!=0 ) keycodes[ keytail++ ] = to_return; + else break; + } + + if( keytail == QSIZE ) keytail = 0; + if( keytail == keyhead ){ + keytail -- ; + if( keytail < 0 ) keytail = QSIZE ; + } + } + break; + + case MotionNotify: + case ButtonPress: + case ButtonRelease: + mouse_x = event.xmotion.x; + mouse_y = event.xmotion.y; + if( event.type == ButtonPress ){ + switch( event.xbutton.button ){ + case Button1 : mouse_l=1; mouse_l_prs++; + mouse_l_p_x = mouse_x; + mouse_l_p_y = mouse_y; + if( tracking ){ + tracking = 0; + RealiseCmd( END_OF_TRACK, NULL ); + } + break; + case Button2 : mouse_c=1; mouse_c_prs++; + mouse_c_p_x = mouse_x; + mouse_c_p_y = mouse_y; + break; + case Button3 : mouse_r=1; mouse_r_prs++; + mouse_r_p_x = mouse_x; + mouse_r_p_y = mouse_y; + break; + } + } + if( event.type == ButtonRelease ){ + switch( event.xbutton.button ){ + case Button1 : mouse_l=0; mouse_l_rel++; + mouse_l_r_x = mouse_x; + mouse_l_r_y = mouse_y; + break; + case Button2 : mouse_c=0; mouse_c_rel++; + mouse_c_r_x = mouse_x; + mouse_c_r_y = mouse_y; + break; + case Button3 : mouse_r=0; mouse_r_rel++; + mouse_r_r_x = mouse_x; + mouse_r_r_y = mouse_y; + break; + } + } + break; + + } /* end of switch */ + + } /* end of for */ + +} + + + +word cmd=0,w,h,x,y,curx,cury,kolb,wwyp,p,q,r,color; +word alfa,beta,aspect; +char c; +XImage *image; +XImage *XGetImage(); + + + +void RealiseCmd( cmd, pars ) int cmd; short *pars; { + + int i=1; + int cnt=0; + + switch( cmd ){ + + case CLS : + XSetForeground(theDisp,theGC,bcol); + XFillRectangle(theDisp,pixmap,theGC,0,0,iWIDE,iHIGH); + XFillRectangle(theDisp,window,theGC,0,0,iWIDE,iHIGH); + XSetForeground(theDisp,theGC,fcol); + break; + + case GROFF : + XFreePixmap(theDisp,pixmap); + XDestroyWindow(theDisp,window); + XCloseDisplay(theDisp); + exit(0); + break; + + case INKEY : + { + int keycode=0; + if( keyhead != keytail ){ + keycode = keycodes[ keyhead++ ]; + if( keyhead == QSIZE ) keyhead = 0; + } + put_word(keycode) + snd_father + } + break; + + case POINT : + get_shrt( x ); + get_shrt( y ); + XDrawPoint(theDisp,pixmap,theGC,x,y); + XDrawPoint(theDisp,window,theGC,x,y); + break; + + case DRAW : + get_shrt( curx ); + get_shrt( cury ); + get_shrt( x ); + get_shrt( y ); + XDrawLine(theDisp,pixmap,theGC,curx,cury,x,y); + XDrawLine(theDisp,window,theGC,curx,cury,x,y); + break; + + case CIRB : + get_shrt( x ); + get_shrt( y ); + get_shrt( r ); + get_shrt( aspect ); + get_shrt( alfa ); + get_shrt( beta ); + XDrawArc(theDisp,pixmap,theGC,x,y,r,aspect,alfa,beta); + XDrawArc(theDisp,window,theGC,x,y,r,aspect,alfa,beta); + break; + + case HFILL : + get_shrt( curx ); + get_shrt( cury ); + get_shrt( x ); + XDrawLine(theDisp,pixmap,theGC,curx,cury,x,cury); + XDrawLine(theDisp,window,theGC,curx,cury,x,cury); + break; + + case VFILL : + get_shrt( curx ); + get_shrt( cury ); + get_shrt( y ); + XDrawLine(theDisp,pixmap,theGC,curx,cury,curx,y); + XDrawLine(theDisp,window,theGC,curx,cury,curx,y); + break; + + case INPIX : + get_shrt( x ); + get_shrt( y ); + image=XGetImage(theDisp,pixmap,x,y,1,1,0x7fffffffL,ZPixmap); + color = XGetPixel(image,0,0); + XDestroyImage(image); + put_word(color) + snd_father + break; + + case GETMAP : + { + Pixmap map; + get_shrt( x ); + get_shrt( y ); + get_shrt( w ); + get_shrt( h ); + if( w>iWIDE ) w=iWIDE; + if( h>iHIGH ) h=iHIGH; + map = XCreatePixmap(theDisp,window,w,h,theDepth); + XCopyArea(theDisp,pixmap,map,theGC,x,y,w,h,0,0); + put_word(map) + snd_father + } + break; + + case PUTMAP : + case XORMAP : + case ORMAP : + { + Pixmap map; + switch( cmd ){ + case XORMAP: XSetFunction(theDisp,theGC,GXxor); break; + case ORMAP: XSetFunction(theDisp,theGC,GXor ); break; + } + get_word( map ); + get_shrt( curx ); + get_shrt( cury ); + get_shrt( w ); + get_shrt( h ); + if( w>iWIDE ) w=iWIDE; + if( h>iHIGH ) h=iHIGH; + XCopyArea(theDisp,map,pixmap,theGC,0,0,w,h,curx,cury); + XCopyArea(theDisp,map,window,theGC,0,0,w,h,curx,cury); + if( cmd != PUTMAP ) XSetFunction(theDisp,theGC,GXcopy); + } + break; + + case COLOR : + get_shrt( color ); + if( color == 0 ) fcol = black ; + else fcol = white ; + XSetForeground(theDisp,theGC,fcol); + break; + + case BORDER : + get_shrt( color ); + if( color == 0 ) bcol = black ; + else bcol = white ; + XSetBackground(theDisp,theGC,bcol); + break; + + case STYLE : + { + static char style_2[]={ 6, 3 }; + static char style_3[]={ 4, 6 }; + static char style_4[]={ 2, 3 }; + static char style_5[]={ 2, 9 }; + + get_shrt( style ); + switch( style ){ + case 0: + XSetForeground(theDisp,theGC,bcol); + XSetLineAttributes(theDisp,theGC,0,LineSolid,CapButt,JoinMiter); + break; + case 1: + XSetForeground(theDisp,theGC,fcol); + XSetLineAttributes(theDisp,theGC,0,LineSolid,CapButt,JoinMiter); + break; + case 2: + XSetLineAttributes(theDisp,theGC,0,LineDoubleDash, + CapButt,JoinMiter); + XSetDashes(theDisp,theGC,0,style_2,2); + break; + case 3: + XSetLineAttributes(theDisp,theGC,0,LineDoubleDash, + CapButt,JoinMiter); + XSetDashes(theDisp,theGC,0,style_3,2); + break; + case 4: + XSetLineAttributes(theDisp,theGC,0,LineDoubleDash, + CapButt,JoinMiter); + XSetDashes(theDisp,theGC,0,style_4,2); + break; + case 5: + XSetLineAttributes(theDisp,theGC,0,LineDoubleDash, + CapButt,JoinMiter); + XSetDashes(theDisp,theGC,0,style_5,2); + break; + } + } + break; + + case HASCII : + get_shrt( curx ); + get_shrt( cury ); + get_shrt( r ); + if( r==0 ){ + XSetForeground(theDisp,theGC,bcol); + XFillRectangle(theDisp,pixmap,theGC,curx,cury,8,8); + XFillRectangle(theDisp,window,theGC,curx,cury,8,8); + XSetForeground(theDisp,theGC,fcol); + }else{ + c = (char)r; + XDrawString(theDisp,pixmap,theGC,curx,cury+8,&c,1); + XDrawString(theDisp,window,theGC,curx,cury+8,&c,1); + } + break; + + case STATUS : + put_shrt(mouse_x) + put_shrt(mouse_y) + put_shrt(mouse_l) + put_shrt(mouse_r) + put_shrt(mouse_c) + snd_father + break; + + case GETPRESS : + case GETRELEASE : + { + int button; + get_shrt(button); + if( cmd == GETPRESS ) + switch( button ){ + + case 0: + put_shrt( mouse_l_p_x ); + put_shrt( mouse_l_p_y ); + put_shrt( mouse_l_prs ); + mouse_l_prs=0; + break; + + case 1: + put_shrt( mouse_r_p_x ); + put_shrt( mouse_r_p_y ); + put_shrt( mouse_r_prs ); + mouse_r_prs=0; + break; + + case 2: + put_shrt( mouse_c_p_x ); + put_shrt( mouse_c_p_y ); + put_shrt( mouse_c_prs ); + mouse_c_prs=0; + break; + + default:put_shrt( 0 ); + put_shrt( 0 ); + put_shrt( 0 ); + break; + + } + else + switch( button ){ + + case 0: + put_shrt( mouse_l_r_x ); + put_shrt( mouse_l_r_y ); + put_shrt( mouse_l_rel ); + mouse_l_rel=0; + break; + + case 1: + put_shrt( mouse_r_r_x ); + put_shrt( mouse_r_r_y ); + put_shrt( mouse_r_rel ); + mouse_r_rel=0; + break; + + case 2: + put_shrt( mouse_c_r_x ); + put_shrt( mouse_c_r_y ); + put_shrt( mouse_c_rel ); + mouse_c_rel=0; + break; + + default:put_shrt( 0 ); + put_shrt( 0 ); + put_shrt( 0 ); + break; + + } + put_shrt(mouse_l) + put_shrt(mouse_r) + put_shrt(mouse_c) + snd_father + } + break; + + case GETMOVEMENT : + { + static int x=0,y=0; + put_shrt(mouse_x-x) + put_shrt(mouse_y-y) + snd_father + x = mouse_x; + y = mouse_y; + } + break; + + case TRACK: + { + int x,y; + get_shrt( x ) /* these parameters are not used */ + get_shrt( y ) + tracking = 1; + /* now we wait to point and press left button */ + } + break; + + case END_OF_TRACK: + put_shrt( mouse_x ) + put_shrt( mouse_y ) + snd_father + break; + + default : + fprintf(stderr,"UKNOWN COMMAND for HERCULES emulation - %d\n",cmd); + fflush(stderr); + XFreePixmap(theDisp,pixmap); + XDestroyWindow(theDisp,window); + XCloseDisplay(theDisp); + exit(7); + + } + +} + diff --git a/sources/int/inkeydos.c b/sources/int/inkeydos.c new file mode 100644 index 0000000..e333bc3 --- /dev/null +++ b/sources/int/inkeydos.c @@ -0,0 +1,25 @@ +#include "graf\graf.h" +#include + +static union REGS r; + +int pascal inkey( dummy ) + void *dummy; +{ + r.h.ah = 0x01; + int86( 0x16, &r, &r); + if( r.x.ax == 0 ) return 0; + else + { + r.h.ah = 0x00; + int86( 0x16, &r, &r); + if( r.h.al != '\0' ) + return (int)(unsigned char)( r.h.al ); + else + if( r.h.ah & '\x80' ) + return (int)( -r.h.ah ); + else + return (int)(unsigned char)( r.h.ah ); + } +} + diff --git a/sources/int/inkeyos2.c b/sources/int/inkeyos2.c new file mode 100644 index 0000000..51ec873 --- /dev/null +++ b/sources/int/inkeyos2.c @@ -0,0 +1,28 @@ +#define INCL_BASE +#include + +int pascal inkey(dummy) +int *dummy; +{ + KBDKEYINFO kdata; + int i; + unsigned u; + + KbdPeek(&kdata, 0); + if (kdata.fbStatus) + { + KbdCharIn(&kdata, 0, 0); + if (kdata.chChar != '\0') + { + u = kdata.chChar; + return(u); + } + else + { + i = kdata.chScan; + if (i < 0x80) return(-i); else return(i); + } + } + else + return(0); +} diff --git a/sources/int/inkeyux.c b/sources/int/inkeyux.c new file mode 100644 index 0000000..b567dfe --- /dev/null +++ b/sources/int/inkeyux.c @@ -0,0 +1,744 @@ +#include +#include +#include +#include +#include + +#include + + +#include "graf/graf.h" + +#define KB_BACKSPACE (int)'\b' /* kb */ +#define KB_ENTER (int)'\r' /* RT */ +#define KB_TAB (int)'\t' /* TB */ +#define KB_ESC 0x1b /* EC */ + +#define KB_HOME -71 /* kh or HM */ +#define KB_END -79 /* EN */ +#define KB_UP -72 /* ku or UP */ +#define KB_DOWN -80 /* kd */ +#define KB_LEFT -75 /* kl */ +#define KB_RIGHT -77 /* kr */ +#define KB_PGUP -73 /* PU */ +#define KB_PGDN -81 /* PD */ +#define KB_BACK_TAB -15 /* BT */ +#define KB_INS -82 /* al */ +#define KB_DEL -83 /* DL */ + +#define KB_F1 -59 /* k1 */ +#define KB_F2 -60 /* k2 */ +#define KB_F3 -61 /* k3 */ +#define KB_F4 -62 /* k4 */ +#define KB_F5 -63 /* k5 */ +#define KB_F6 -64 /* k6 */ +#define KB_F7 -65 /* k7 */ +#define KB_F8 -66 /* k8 */ +#define KB_F9 -67 /* k9 */ +#define KB_F10 -68 /* k0 */ + +#define KB_STR_EXISTS 1 /* string exists in tree or his prefix */ +#define KB_TOO_MANY_STRINGS 2 +#define KB_NULL_STRING 3 +#define KB_OUT_OF_MEMORY 4 +#define KB_OK 0 + + + +#include "depend.h" +#include "genint.h" +#include "int.h" +#include "process.h" +#include "intproto.h" + + +#define TERMINAL 0 +#define KEYBOARD 1 + +static char *capability,*capability_value; + +typedef struct _tree_node *tree; /* drzewo zawierajace ciagi znakow */ +struct _tree_node { /* odpowiadajace klawiszowi klawiatury */ + int key; + tree way; + int outkey; +}; + +#ifndef NO_PROTOTYPES +static int tfirst(int); +static int tnext(void); +static void *___allocate_object(unsigned); +static void ___free_object(void *); +static char *object_str(char *); /* allocate space and copy string */ +static int __testkey(int*,int*); +static int getkey(void); +static int __inkey(void); +static void kbinit(void); +static tree new_tree_node(void); +static int _create_new_leaf(tree,int,unsigned char *,int); +static int inskey(int,char *); +#else +static int tfirst(); +static int tnext(); +static void *___allocate_object(); +static void ___free_object(); +static char *object_str(); +static int __testkey(); +static int getkey(); +static int __inkey(); +static void kbinit(); +static tree new_tree_node(); +static int _create_new_leaf(); +static int inskey(); +#endif + + + + + +#define object_kill(i) (___free_object(i),(i)=NULL) +#define object_new(type) ((type *)___allocate_object(sizeof(type))) +#define object_dim(i,type) ((type *)___allocate_object((i)*sizeof(type))) + + + + +#define KB_NDEF 0xff /* KN - key suppressed by inkey() */ + +#define NODE_SIZE 100 + + +#define QSIZE 256 +static int cqueue[QSIZE]; /* implementacja kolejki */ +static int qh=0,qt=0,qs=0; +static int bget(){ + int c; + if( qs == 0 ) return -1; + c = cqueue[ qh++ ]; + qh &= QSIZE - 1 ; + qs--; + return c; +} +static void bput( c ) int c; { + if( qs == QSIZE ) return; + cqueue[ qt++ ] = c; + qt &= QSIZE - 1 ; + qs++; +} +static int qq; +static int bfirst(){ + if( qs == 0 ) return -1; + qq = qh + 1 ; + qq &= QSIZE - 1 ; + return cqueue[ qh ]; +} +static int bnext(){ + int c; + if( qq == qt ) return -1; + c = cqueue[ qq++ ]; + qq &= QSIZE - 1 ; + return c; +} + + +static tree troot=NULL; + +#ifndef NDEBUG +static FILE *f=NULL; +static void _show_tree(root,r) tree root;int r;{ + int i,j; + for(i=0;(i'7') return 1; + *ptr*=8; + *ptr+=*(tptr++)-'0'; + } + ptr++; ptr_size--; + } + break; + case '^': tptr++; + c=*(tptr++); + *(ptr++)=(char)((toupper(c))-'A'+1); ptr_size--; + break; + default: *(ptr++)=*(tptr++); ptr_size--; + } + *ptr='\0'; + if( ptr_size<=0 ){ + fprintf(stderr,"buffer exceeded in convert(%s)",__FILE__); + fflush(stderr); + exit(7); + } + return 0; +} + + +/* FUNCTIONS looking for entries in /ETC/TERMCAP */ + + + +static char etcname[80]; +static char termname[80]; +static char *fname; + + +static char *envset(envname,envfile) char *envname,*envfile;{ + extern char *getenv(); + char *TERM=getenv("TERM"); + char *env=getenv(envname); + char *str,*ptr; + FILE *f; + int c,continued=1; + + ptr=str=object_dim(32000,char); + if(str==NULL){ + fprintf(stderr,"Out of memory.\n"); + fflush(stderr); + exit(7); + } + + if(TERM==NULL){ + fprintf(stderr,"\n\renvironment variable TERM not found\n\r"); + fflush(stderr); + exit(7); + } + + strcpy(termname,TERM); + + f=fopen(env,"r"); + if( f==NULL ) f=fopen(envfile,"r"); else fname=env; + if( f==NULL ) f=fopen(strcat(strcpy(etcname,"/etc/"),envfile),"r"); + else fname=envfile; + if( f==NULL ) return NULL; + else fname=etcname; + + while( continued ){ + + char *rev,*tnm; + + if( find_name(f,termname)==0 ) return object_str(":"); + + *(ptr++)=':'; + c=' '; + do{ + c=next_char(f); + if( c!='\0' ) *(ptr++)=(char)c; + }while( c!='\0' ); + + *(ptr)='\0'; + rev=ptr-1; + while( rev>str && rev[-1]!=':' ) rev--; + if( rev[0]=='t' && rev[1]=='c' ){ + ptr=rev-1; + rev+=3; + tnm=termname; + while( *rev!=':' ) *(tnm++)=*(rev++); + *tnm='\0'; + continued=1; + }else continued=0; + + } + + ptr=object_str(str); + object_kill(str); + return ptr; + +} + +static int find_name(f,termname) FILE *f; char *termname;{ + int i,c,lastc,found=0; + fseek(f,0L,0); + + do{ + + do{ + c=fgetc(f); + if(c==EOF) return 0; + if(c=='#' || c=='\t' || c==':' || c=='\n') + while(c!='\n'){ + lastc=c; + c=fgetc(f); + if(c==EOF) return 0; + if( lastc=='\\' ) c=' '; + } + }while(c=='\n'); + + while( !found ){ + for(i=0;termname[i]!='\0';i++){ + if((char)c!=termname[i]) break; + c=fgetc(f); + } + if( termname[i]=='\0' ){ found=1; break; } + while( isalpha((char)c) ) c=fgetc(f); + if( c=='|' ) c=fgetc(f); + else{ ungetc('#',f); break; } + } + + } while( !found ); + + while(c!=':'){ + c=fgetc(f); + if(c==EOF) return 0; + } + + return 1; +} + + +static int next_char(f) FILE *f;{ + int c; + static int lastc='\0'; + if( lastc!='\0' ){ + c=lastc; + lastc='\0'; + return c; + } + c=fgetc(f); + if( c==EOF || c=='\n' ) return '\0'; + if( c=='\\' ){ + c=fgetc(f); + if( c=='\n' ){ + while( c=='\n' || c=='\t' || c==':' || c==' ' ) c=fgetc(f); + return c; + } + lastc=c; + return '\\'; + } + return c; +} + + + + +static void *___allocate_object(size) unsigned size;{ + char *p; + extern void *calloc(); + if(size==0) return NULL; + p=calloc(size,1); + if( p==NULL ){ + printf("\r\n"); + printf("=======================================\r\n"); + printf("Memory overflow ... \r\n"); + printf("=======================================\r\n"); + fflush(stdout); + system("stty sane"); + exit(7); + } + return (void *)p; +} + +static void ___free_object(ff) void *ff;{ + assert(ff!=NULL); + free((char *)ff); +} + +static char *object_str(str) char *str;{ + char *buf=object_dim(strlen(str)+1,char); + strcpy(buf,str); + return buf; +} diff --git a/sources/int/int.h b/sources/int/int.h new file mode 100644 index 0000000..ec13819 --- /dev/null +++ b/sources/int/int.h @@ -0,0 +1,165 @@ +#define MAXMARKER MAXINTEGER /* maximum special value of mark */ +#define MAXAPPT MAXINTEGER /* maximum appetite (easily extensible ?) */ +#define MAXTRACNT 13 /* maximum number of trace messages in line */ +#define MAXHDLEN 40 /* maximum length of formal procedure header */ +#define MAXSYSSN 62 /* maximum number of a system signal */ +#define MAXPARAM 10 /* maximum number of params to standard proc */ +#define IOBLOCK 0x4000 /* size of I/O transfer block in bytes */ + +/* Object structure : */ + +/* Offsets from the beginning : */ +#define PROTNUM 1 /* prototype number */ +#define SHORTLINK 1 /* link to same size list (killed only) */ +#define LONGLINK 2 /* link to other size list (killed only) */ + +/* Files : */ +/* appetite 0 */ +/* prot number 1 always FILEOBJECT */ +#define FSTAT 2 /* file status */ +#define FTEMP 3 /* flag to tell if file is temporary */ +#define FTYPE 4 /* file type */ +#define FNAME 5 /* file name pointer */ +#define FFILE (FNAME+sizeof(char *)/sizeof(word)) /*file handle */ +#define APFILE (FFILE+sizeof(FILE *)/sizeof(word)) /*appetite of file*/ + /* object */ + +/* Offsets from the first address after object : */ +#define SL -2 /* static link */ +#define DL -4 /* dynamic link */ +#define LSC -5 /* local control */ +#define STATSL -6 /* number of times the object occurs in SL */ +#define SIGNR -7 /* signal number (handlers only) */ +#define RPCDL -8 /* remote dynamic link (procedures only) */ +#define CL -8 /* coroutine link (coroutine only) */ +#define CHD -10 /* coroutine head (process only) */ +#define VIRTSC -12 /* virtual scratch (process only) */ + +/* Virtual address (also formal type) : */ + +typedef struct { + word addr; /* address of dictionary item */ + /* (node and process index for processes) */ + /* (or for formal types - number of arrayof) */ + word mark; /* address mark */ + /* (negative for processes) */ + /* (or for formal types - actual type) */ + } virtaddr; + +#define loadvirt(v, a) { word ta; \ + ta = (a); \ + (v).addr = M[ ta++ ]; \ + (v).mark = M[ ta ]; } +#define storevirt(v, a) { word ta; \ + ta = (a); \ + M[ ta++ ] = (v).addr; \ + M[ ta ] = (v).mark; } + +#define MF(a) (*( (FILE **) (M+(a)) )) +#define MN(a) (*( (char **) (M+(a)) )) +#define MR(a) *( (real *) (M+(a)) ) + + +#ifdef max +#undef max +#endif + +#ifdef min +#undef min +#endif + +#define min(x, y) ((x) < (y) ? (x) : (y)) +#define max(x, y) ((x) > (y) ? (x) : (y)) +#define absolute(x) ((x) >= 0 ? (x) : -(x)) + +/* LOGLAN's booleans : */ +#define LFALSE ((word)0) +#define LTRUE (~LFALSE) +#define lbool(b) ( (b) ? LTRUE : LFALSE ) + +/* Type of files : */ +#define TEXTF 1 /* text file */ +#define CHARF 2 /* file of char */ +#define INTF 3 /* file of integer */ +#define REALF 4 /* file of real */ +#define DIRECT 5 /* direct access file */ + +/* File status : */ +#define READING 0 /* sequential file opened for read */ +#define WRITING 1 /* sequential file opened for write */ +#define UPDATING 2 /* direct access file */ +#define UNKNOWN 3 /* file not opened */ + +/* Run time error types : */ + +#define RTESLCOF 0 /* SL chain cut off */ +#define RTEUNSTP 1 /* unimplemented standard procedure */ +#define RTEILLAT 2 /* illegal attach */ +#define RTEILLDT 3 /* illegal detach */ +#define RTECORTM 4 /* coroutine terminated */ +#define RTECORAC 5 /* coroutine active */ +#define RTEINVIN 6 /* array index error */ +#define RTEILLAB 7 /* incorrect array bounds */ +#define RTEINCQA 8 /* improper QUA */ +#define RTEINCAS 9 /* illegal assignment */ +#define RTEFTPMS 10 /* formal type missing */ +#define RTEILLKL 11 /* illegal kill */ +#define RTEILLCP 12 /* illegal copy */ +#define RTEINCHS 13 /* incompatible headers */ +#define RTEHNDNF 14 /* handler not found */ +#define RTEMEMOV 15 /* memory overflow */ +#define RTEFHTLG 16 /* formal header too long */ +#define RTEILLRT 17 /* illegal return */ +#define RTEREFTN 18 /* reference to NONE */ +#define RTEDIVBZ 19 /* division by zero */ +#define RTESYSER 20 /* system error */ +#define RTEILLIO 21 /* illegal I/O operation */ +#define RTEIOERR 22 /* I/O error */ +#define RTECNTOP 23 /* Cannot open file */ +#define RTEBADFM 24 /* Input data format bad */ +#define RTEILLRS 25 /* illegal resume */ +#define RTETMPRC 26 /* too many processes on one machine */ +#define RTEINVND 27 /* invalid node number */ +#define RTENEGST 28 /* negative step value */ +#define RTENONGL 29 /* only process may be global */ + +union value { + unsigned int xint; + word xword; + real xreal; + virtaddr xvirt; + word xbool; + }; + +/* Variables : */ + +extern memory M; /* main memory for code and data */ +extern union value *param; /* pointer to standard proc. param list */ +extern int offset[]; /* offset conversion table for compact. */ +extern int scot[]; /* signal to number conversion table */ +extern int primapet[]; /* appetites of primitive types */ +extern word ic; /* instruction counter */ +extern word lastic; /* previous ic for redecoding after comp. */ +extern int opcode; /* opcode of L-code instruction */ +extern word a1, a2, a3; /* arguments of L-code instruction */ + +/* kernel variables for the running system */ + +extern word memorysize; /* size of memory array for code and data */ +extern word dispoff; /* DISPLAY offset in process object */ +extern word disp2off; /* indirect DISPLAY offset in process object */ +extern word display; /* DISPLAY address - physical addresses */ +extern word display2; /* DISPLAY address - indirect addresses */ +extern word c1, c2; /* pointers to current object */ +extern word mainprog; /* main block object */ +extern word mnoff; /* offset of variable main */ + + +extern bool infmode; /* TRUE if compactification message printed */ +extern bool debug; /* TRUE if trace is printed */ +extern FILE *tracefile; /* output file for trace */ + +extern jmp_buf contenv; /* for continue execution */ + + + diff --git a/sources/int/intdt.c b/sources/int/intdt.c new file mode 100644 index 0000000..ff5f051 --- /dev/null +++ b/sources/int/intdt.c @@ -0,0 +1,96 @@ +#include "depend.h" +#include "genint.h" +#include "int.h" +#include "process.h" +#include "intproto.h" + +/* Variables common with generator : */ + +protdescr *prototype[ MAXPROT+1 ]; /* prototypes */ +word ipradr; /* address of primitive types descriptions */ +word temporary; /* address of global temporary variables */ +word strings; /* base for string constants */ +word lastprot; /* the last used prototype number */ +word freem; /* first free cell in M */ +word currfile = 2; /* current file virtual address */ + +/* Interpreter own variables : */ + +memory M; /* main memory for code and data */ +union value *param; /* for comunication with standard procs */ + +/* offset conversion table for compactification */ +int offset[] = { DUMMY, SL, DL, CL, CHD, VIRTSC }; + +/* signal to number conversion table */ +/* -1 stands for an unrecoverable error which cannot be serviced by handler */ + +int scot[] = +{ + 20, /* RTESLCOF */ + 20, /* RTEUNSTP */ + 20, /* RTEILLAT */ + 20, /* RTEILLDT */ + 20, /* RTECORTM */ + 20, /* RTECORAC */ + 23, /* RTEINVIN */ + 23, /* RTEILLAB */ + 21, /* RTEINCQA */ + 24, /* RTEINCAS */ + 20, /* RTEFTPMS */ + 20, /* RTEILLKL */ + 20, /* RTEILLCP */ + 24, /* RTEINCHS */ + -1, /* RTEHNDNF */ + 22, /* RTEMEMOV */ + 22, /* RTEFHTLG */ + -1, /* RTEILLRT */ + 21, /* RTEREFTN */ + 01, /* RTEDIVBZ */ + 02, /* RTESYSER */ + 02, /* RTEILLIO */ + 02, /* RTEIOERR */ + 02, /* RTECNTOP */ + 02, /* RTEBADFM */ + 20, /* RTEILLRS */ + 02, /* RTETMPRC */ + 02, /* RTEINVND */ + 23, /* RTENEGST */ + -1 /* RTENONGL */ +}; + +/* Primitive type appetites for moveparams() : */ + +int primapet[] = +{ + APINT, /* INTEGER */ + APREAL, /* REAL */ + APINT, /* BOOLEAN */ + APINT, /* CHAR */ + APREF, /* COROUTINE */ + APREF, /* PROCESS */ + APINT /* STRING */ +}; + +word ic; /* instruction counter */ +word lastic; /* previous ic for redecoding after compact. */ +int opcode; /* opcode of L-code instruction */ +word a1, a2, a3; /* arguments of L-code instructions */ + +/* kernel variables for the running system: */ + +word memorysize = DEFMEMSIZE; /* code and data memory size */ +word c1, c2; /* pointers to current object */ +word dispoff; /* DISPLAY offset in process object */ +word disp2off; /* indirect DISPLAY offset in process object */ +word display; /* DISPLAY address - physical addresses */ +word display2; /* DISPLAY address - indirect addresses */ +word mainprog; /* main block object */ +word mnoff; /* offset of variable main */ + + +bool infmode = FALSE; /* default: no compactification message */ +bool debug = FALSE; /* TRUE if trace is printed */ +FILE *tracefile; /* output file for trace */ + +jmp_buf contenv; /* for continue execution */ diff --git a/sources/int/intproto.h b/sources/int/intproto.h new file mode 100644 index 0000000..c130dfd --- /dev/null +++ b/sources/int/intproto.h @@ -0,0 +1,196 @@ +#ifndef NO_PROTOTYPES + +unsigned alarm( unsigned ); +double prandom( void ); + +void openrc(word,virtaddr *,word *); +void raise_signal(word,word,word *,word *); +void openobj(word,word *,word *); +void slopen(word,virtaddr *,word *,word *); +void errsignal(int); +void typep(word,word,word *,word *); +void copy(virtaddr *,virtaddr *); +void qua(virtaddr *,word); +void standard(word); +void disp(virtaddr *); +void gkill(virtaddr *); +void typref(virtaddr *,word); +void go(word,word); +void goloc(word,word); +void typed(word,word,word,word,virtaddr *); +void term(void); +void wind(void); +void trace(word); +void inner(word); +void backhd(virtaddr *,word *); +void backbl(virtaddr *,word *); +void backpr(virtaddr *,word *); +void back(virtaddr *,word *,word); +void detach(void); +void attach(virtaddr *); +void fin(word,virtaddr *,word *); +void heads(virtaddr *,word); +void resume(virtaddr *); +void passivate(int); +void enable(word,word); +void evaluaterpc(word); +void disable(word,word); +void rpc_accept(word); +void rpc3(void); +void popmask(word); +void askprot(virtaddr *); +bool member(virtaddr *,word *); +word virtprot(word); +word loadt(word,word); +bool is(virtaddr *,word); +bool inl(virtaddr *,word); +word shift(word,word); +void execute(void); +void abend(char *); +void addext(char *,char *); +void usage( void ); +void decode( void ); +void init_scheduler( void ); +void runsys( void ); +void schedule( void ); +void msginterrupt( message * ); +void loosen( void ); +void update( word, word ); +void compactify( void ); +void moveparams(word, word, message *, int, int); +void sendmsg(message *); +word getnode(word); +void endprocess(int); +word entier(double); +char *asciiz( virtaddr * ); +void ranset(void); +void moveblock( char *,char *, word ); +void request( word, word *, word *); +word memavail( void ); +void newarry( word, word, word, virtaddr *, word *); +void initprocess( word,word,procaddr *); +void activate( word ); +void reset( word ); +void pushmask( word ); +void trapmsg( void ); +void rpc2( void ); +void endrun( int ); +void loadfile(word,word *,word *,FILE **); +word directio(virtaddr *,word,int (*)(),FILE *); +void nonstandard( word ); +void genfileobj(bool,word,char *,virtaddr *,word *); +void rewrite( word ); +void delete( virtaddr * ); +bool testeof( FILE * ); +bool testeoln( FILE * ); +char *tempfilename( void ); +word readint( FILE * ); +double readreal( FILE * ); +void writeint( word, word, FILE * ); +void writereal( double, word, word, FILE * ); +void writestring( word, word, FILE * ); +void readln( FILE * ); +void senderr( int, procaddr * ); +void rpcend( message * ); +void rpc1( message * ); + +#else + +unsigned alarm(); +int unlink(); +int ioctl(); + +void openrc(); +void raise_signal(); +void openobj(); +void slopen(); +void errsignal(); +void typep(); +void copy(); +void qua(); +void standard(); +void disp(); +void gkill(); +void typref(); +void go(); +void goloc(); +void typed(); +void term(); +void wind(); +void trace(); +void inner(); +void backhd(); +void backbl(); +void backpr(); +void back(); +void detach(); +void attach(); +void fin(); +void heads(); +void resume(); +void passivate(); +void enable(); +void evaluaterpc(); +void disable(); +void rpc_accept(); +void rpc3(); +void popmask(); +void askprot(); +bool member(); +word virtprot(); +word loadt(); +bool is(); +bool inl(); +word shift(); +void execute(); +void abend(); +void addext(); +void usage(); +void decode(); +void init_scheduler(); +void runsys(); +void schedule(); +void msginterrupt(); +void loosen(); +void update(); +void compactify(); +void moveparams(); +void sendmsg(); +word getnode(); +void endprocess(); +word entier(); +char *asciiz(); +void ranset(); +double prandom(); +void moveblock(); +void request(); +word memavail(); +void newarry(); +void initprocess(); +void activate(); +void pushmask(); +void trapmsg(); +void rpc2(); +void endrun(); +void loadfile(); +word directio(); +void nonstandard(); +void genfileobj(); +void reset(); +void rewrite(); +void delete(); +bool testeof(); +bool testeoln(); +char *tempfilename(); +word readint(); +double readreal(); +void writeint(); +void writereal(); +void writestring(); +void readln(); +void senderr(); +void rpcend(); +void rpc1(); + +#endif + diff --git a/sources/int/link.lnk b/sources/int/link.lnk new file mode 100644 index 0000000..643ca4e --- /dev/null +++ b/sources/int/link.lnk @@ -0,0 +1 @@ +cint.o compact.o control.o util.o handler.o intdt.o memory.o object.o runsys.o typchk.o standard.o execute.o fileio.o nonstand.o process.o procaddr.o queue.o rpcall.o \ No newline at end of file diff --git a/sources/int/makefile b/sources/int/makefile new file mode 100644 index 0000000..0f3bb5e --- /dev/null +++ b/sources/int/makefile @@ -0,0 +1,101 @@ +SHELL=/bin/sh +#.SUFFIXES: .o .c + +############################################################################# +# switches : +# OBJECTADDR - switch on special process addressing - object simulates +# process pointer +# CDBG - turn on debugging of compactifier, compactifier appends to file +# 'trace' state of memory before & after the compactification, +# also a history of compactification & process number is dumped +# RPCDBG - debugging of alien call, all actions : alien call, acknowledges, +# passivations and returns are written to stderr +# NO_GRAPH - nonstand.c defines only INKEY grom IIUWGRAPH +# DLINK - DLINK network version +# TCPIP - TCPIP network version - needs also OBJECTADDR +# +# switches depending on environment : +# TURBOC - if using BORLAND TURBO-C compiler +# MSDOS/OS2/UNIX - choose operating system +# USE_CLOCK - scheduler should use clock() function to measure time +# USE_ALARM - scheduler should use alarm() function to measure time +# WORD_16BIT/DWORD_16BIT/WORD_32BIT - choose memory model : +# small 16-bit / large 16-bit / small 32-bit +# +# for DLINK use cinta.o ( cinta.asm ) +# for TCPIP use tcpip.o sock.o +# for no network simply leave empty +# NETFILE=tcpip.o sock.o + +#NETFILE=tcpip.o sock.o +NETFILE= + +#CC=gcc -m486 -DDJE -DUSE_CLOCK -DWORD_32BIT -Dpascal= +# MSDOS 32bit GNU CC + +#CC=cl -AL -Olsg -DMSDOS -DDWORD_16BIT # MSDOS 16bit LARGE +#CC=cl -AL -Olsg -DMSDOS -DWORD_16BIT # MSDOS 16bit SMALL + +UNIXPARS=-DUNIX -DWORD_32BIT -DUSE_ALARM -Dpascal= +UNIXPARSNG=$(UNIXPARS) + +#CC=cc $(UNIXPARSNG) -DNO_PROTOTYPES # SUN,HP +#CC=rcc $(UNIXPARSNG) -O # SCO - AT&T C compiler +#CC=cc -W1 $(UNIXPARSNG) # SCO +#CC=cc -W1 $(UNIXPARSNG) -DOBJECTADDR # SCO +#CC=cc -W1 $(UNIXPARSNG) -DOBJECTADDR -DTCPIP # SCO TCPIP +CC=gcc $(UNIXPARSNG) -DOBJECTADDR -DXSIGHT # GNU C+ +#CC=cc -W1 $(UNIXPARS) -DSYSV -DXSIGHT # SCO with X11 graphics +#CC=gcc -g $(UNIXPARS) -DSYSV -DXSIGHT # SCO GCC with X11 graphics + +CCc=$(CC) # common version +#CCc=$(CC) -Fo$*.o # MSDOS MSC version + +target : int + +############################################################################# + + + +OBJ= cint.o compact.o control.o util.o handler.o intdt.o \ + memory.o object.o runsys.o standard.o \ + execute.o fileio.o nonstand.o process.o procaddr.o queue.o \ + rpcall.o typchk.o $(NETFILE) + +.c.o : + $(CCc) -c $*.c +.s.o: + as -o $*.o $*.s + +hgcint.exe: $(OBJ) inkeydos.o graf\lib\hgcmsf4.lib + link /e @link.lnk inkeydos.o, hgcint.exe, nul, graf\lib\hgcmsf4, ; + +egaint.exe: $(OBJ) inkeydos.o graf\lib\egamsf4.lib + link /e @link.lnk inkeydos.o, egaint.exe, nul, graf\lib\egamsf4, ; + +cgaint.exe: $(OBJ) inkeydos.o graf\lib\mgcmsf4.lib + link /e @link.lnk inkeydos.o, cgaint.exe, nul, graf\lib\mgcmsf4, ; + +cga64int.exe: $(OBJ) inkeydos.o graf\lib\mgc64mf4.lib + link /e @link.lnk inkeydos.o, cga64int.exe, nul, graf\lib\mgc64mf4, ; + +int386.exe: $(OBJ) + $(CC) @link.lnk -lm -lpc -lgrx -o svgaint + strip svgaint + coff2exe svgaint + rm svgaint +# move svgaint.exe ..\examp\svgaint.exe + +int: $(OBJ) inkeyux.o + $(CC) $(OBJ) inkeyux.o -lm -lX11 -lmalloc -lsocket -o int + strip int +# mv int $(HOME)/bin + +nonstand.o : nonstand.c x11graf1.c x11graf2.c + +herc : herc.c + $(CC) herc.c -lX11 -lmalloc -lsocket -o herc + strip herc + +clean : + rm *.o diff --git a/sources/int/memory.c b/sources/int/memory.c new file mode 100644 index 0000000..8b2d9f4 --- /dev/null +++ b/sources/int/memory.c @@ -0,0 +1,225 @@ +#include "depend.h" +#include "genint.h" +#include "int.h" +#include "process.h" +#include "intproto.h" + +/* Memory management routines */ + +#ifndef NO_PROTOTYPES +static void compandtake(word, word *, word *, word *, bool); +static void sinsert(word); +#else +static void compandtake(); +static void sinsert(); +#endif + + +int compactify_allowed=1; +#define space 400 /* words */ + + +void request(app, ah, am) +word app, *ah, *am; +{ + word t2, t4, t5; + bool wascompactified, found; + + if (app >= MAXAPPT) errsignal(RTEMEMOV); + wascompactified = FALSE; + + if( compactify_allowed && thisp->force_compactification ){ + compactify(); + thisp->force_compactification=FALSE; + wascompactified=TRUE; + } + + if (thisp->freeitem != 0) /* reserve dictionary item */ + { + *ah = thisp->freeitem; + thisp->freeitem = M[ *ah ]; + } + else + { + *ah = thisp->lastitem-2; + if (*ah <= thisp->lastused + space) /* cannot take free item */ + { + if( compactify_allowed ) + if( !wascompactified ) compactify(),wascompactified=TRUE; + else ; + else + thisp->force_compactification=TRUE; + *ah = thisp->lastitem-2; + if (*ah <= thisp->lastused) errsignal(RTEMEMOV); + } + + thisp->lastitem = *ah; + M[ *ah+1 ] = 0; /* clear mark */ + } /* now we have a free dict. item */ + + + if (app == 2 && thisp->headk2 != 0) /* special case app=2 */ + { + *am = thisp->headk2; + thisp->headk2 = M[ *am+SHORTLINK ]; + } + else + { + word t1 = thisp->headk; + found = FALSE; + t4 = 0; + while (t1 != thisp->lower && !found) + { + t2 = M[ t1 ]; + if (t2 == app) found = TRUE; + else + if (t2-app >= 2) found = TRUE; + else + { + t4 = t1; + t1 = M[ t1+LONGLINK ]; + } + } + if( found ) { + t5 = M[ t1+SHORTLINK ]; + if (t5 != 0) M[ t5+LONGLINK ] = M[ t1+LONGLINK ]; + else t5 = M[ t1+LONGLINK ]; + if (t4 == 0) thisp->headk = t5; else M[ t4+LONGLINK ] = t5; + *am = t1; + if (t2 > app) /* at least two extra words */ + { + t5 = t1+app; + M[ t5 ] = t2-app; + sinsert(t5); + } + } + else + if ( thisp->lastitem - thisp->lastused > app + space ) + { + *am = thisp->lastused+1; + thisp->lastused += app; + } + else + { + M[ *ah ] = thisp->freeitem; /* return dictionary item */ + thisp->freeitem = *ah; + if( compactify_allowed ) + if( !wascompactified ) compactify(); + else ; + else + thisp->force_compactification=TRUE; + *ah = thisp->lastitem-2; /* reserve dictionary item */ + thisp->lastitem = *ah; + M[ *ah+1 ] = 0; /* clear mark */ + if ( thisp->lastitem - thisp->lastused > app ) { + *am = thisp->lastused+1; + thisp->lastused += app; + } + else + errsignal(RTEMEMOV); + } + } + + M[ *am ] = app; + for (t2 = *am+1; t2 < *am+app; t2++ ) M[ t2 ] = 0; + M[ *ah ] = *am; + +} + + +static void sinsert(am) /* Dispose of a memory item. */ +word am; +{ + word t1, t2, t3, t4; + + t1 = M[ am ]; /* appetite */ + if (t1 == 2) /* a special list should be used */ + { + M[ am+SHORTLINK ] = thisp->headk2; + thisp->headk2 = am; + } + else + { + t2 = thisp->headk; + t4 = 0; + while (TRUE) /* look for a proper place */ + { + t3 = M[ t2 ]; /* appetite */ + if (t1 == t3) /* an entry with matching appetite */ + { + M[ am+SHORTLINK ] = M[ t2+SHORTLINK ]; + M[ t2+SHORTLINK ] = am; + break; + } + else + if (t1 < t3) + { + M[ am+LONGLINK ] = t2; + M[ am+SHORTLINK ] = 0; + if (t4 == 0) thisp->headk = am; + else M[ t4+LONGLINK ] = am; + break; + } + else + { + t4 = t2; + t2 = M[ t2+LONGLINK ]; + } + } + } +} + + +void disp(virt) /* Simple kill. */ +virtaddr *virt; +{ + word t1, t2; + + t1 = M[ virt->addr+1 ]; + if (t1 == virt->mark) /* not none */ + { + t1++; /* advance mark */ + t2 = M[ virt->addr ]; /* am */ + M[ virt->addr+1 ] = t1; + if (t1 != MAXMARKER) /* mark still usable */ + { + M[ virt->addr ] = thisp->freeitem; + thisp->freeitem = virt->addr; + } /* now dictionary item is released */ + if (t2+M[ t2 ]-1 == thisp->lastused) /* on the boundary */ + thisp->lastused = t2-1; + else sinsert(t2); + } +} /* end disp */ + + +word memavail() /* Compute available memory size */ +{ + word t1, t2, avail; + + avail = thisp->lastitem-thisp->lastused-1; /* contiguos memory */ + t1 = thisp->headk2; /* go through killed 2 list */ + while (t1 != 0) + { + avail += 2; + t1 = M[ t1+SHORTLINK ]; + } + t1 = thisp->headk; + while (t1 != thisp->lower) /* go through killed object list */ + { + t2 = t1; + while (t2 != 0) + { + avail += M[ t2 ]; + t2 = M[ t2+SHORTLINK ]; + } + t1 = M[ t1+LONGLINK ]; + } + t1 = thisp->freeitem; /* go through free item list */ + while (t1 != 0) + { + avail += 2; + t1 = M[ t1 ]; + } + return(avail); +} /* end memavail */ diff --git a/sources/int/net/ip/cli.c b/sources/int/net/ip/cli.c new file mode 100644 index 0000000..eb105c3 --- /dev/null +++ b/sources/int/net/ip/cli.c @@ -0,0 +1,202 @@ +#include "sock.h" +#include "srv.h" +#include "graph.h" + +msg m; +int sock; + +char *host; +char *file; +char *dest; +FILE *fdest; + + +#ifndef NO_PROTOTYPES +int main(int argc,char **argv); +#endif + +static int bytes_received=0; +static char title[100]; + + +static void usage(s) char *s;{ + printf("usage: %s [-ms] host file [dest_file]\n",s); + exit(0); +} + + +int main(argc,argv) int argc; char** argv; { + + int file_size,file_packets,size,x,y; + + if( argc < 3 || argc > 5 ) usage(argv[0]); + + if( argv[1][0]=='-' ){ + int i; + set_cli_recv_timeout( atoi(argv[1]+1) ); + printf("timeout set to %d ms\n",atoi(argv[1]+1)); + for( i=1; i 3 ) + dest = argv[3]; + else + dest = file; + + do{ + + printf("ask for %s:%s\n",host,file); + + sock = sock_open( SOCK_DGRAM, "udp", host, NULL, PORT, AS_CLIENT ); + if( sock<0 ) exit(10); + m.req = htonl( RQ_FILE_SIZE ); + strcpy( m.data, file ); + sock_cli_crc_send( sock, &m, HEAD+strlen(m.data)+1 ); + size = sock_cli_crc_recv( sock, &m, sizeof(m) ); + close( sock ); + + if( size>0 ){ + file_size = ntohl(*(int *)(m.data)); + if( file_size < 0 ) + printf("file %s:%s not found\n",host,file),exit(0); + }else + if( size<0 ) + printf("error in packet\n"); + else + printf("timed out\n"); + + }while( size<=0 ); + + fdest = fopen(dest,"wb"); + if( fdest==NULL ){ + printf("can't open file %s for writing\n",dest); + } + + file_packets = (file_size+DATA_PIECE-1)/DATA_PIECE; + + { + int i; + for(i=0;i*ifile_packets){ + x=i; + y=i; + while(x*y>file_packets) y--; + if(x*y0 ) bytes_received += size; + packno=ntohl(m.req); + if( packno<0 || packno>=file_packets ) continue; + if( file_table[packno]!='\0' ){ + continue; + } + if( size>0 ){ + size-=HEAD; + fseek(fdest,packno*DATA_PIECE,0L); + if( fwrite(m.data,size,1,fdest)!=1 ){ + printf("can't write file %s\n",file); + exit(10); + } + graph_point(packno,GRAPH_COL_OK); + file_table[packno]='\1'; + }else /* error in packet */ + graph_point(packno,GRAPH_COL_ERROR); + } + + close( sock ); + + return 0; +} + diff --git a/sources/int/net/ip/graph.c b/sources/int/net/ip/graph.c new file mode 100644 index 0000000..51672e3 --- /dev/null +++ b/sources/int/net/ip/graph.c @@ -0,0 +1,81 @@ +#include + +#include +#include + +#include + +#include "graph.h" + + +static int child_no=0; +static int fcol=1,bcol=0; + +static Display *theDisplay; +static Window myWindow,theWindow; +static XClientMessageEvent theMessage; +static XEvent retEv; + +static void send_sig(nrproc) int nrproc; { + theMessage.type=ClientMessage; + theMessage.format = 16; + theMessage.message_type = nrproc; + XSendEvent(theDisplay,theWindow,True,NoEventMask,&theMessage); + XFlush(theDisplay); +} + +static void nxtev(){ + do XNextEvent( theDisplay, &retEv ); + while( retEv.type!=ClientMessage ); +} + + + + +void graph_on(x,y,title) int x,y; char *title; { + + if ((theDisplay = XOpenDisplay(NULL)) == NULL){ + fprintf (stderr,"\ngraph: Can't open display\n"); + exit(1); + } + + myWindow = XCreateWindow( + theDisplay, + RootWindow(theDisplay,DefaultScreen(theDisplay)), + 0,0,1,1,0, + CopyFromParent,InputOnly,CopyFromParent, + 0,NULL + ); + + if( (child_no=fork())==0 ){ + char me[16]; + char xs[16]; + char ys[16]; + sprintf(me,"%d",(int)myWindow); + sprintf(xs,"%d",x); + sprintf(ys,"%d",y); + execlp("./graph","graph",me,xs,ys,title,NULL); + } + + nxtev(); + theWindow = (int)(retEv.xclient.data.l[0]); +} + + +void graph_off(){ + send_sig(GRAPH_CMD_END); + child_no=0; +} + + +void graph_point( x,c ) int x,c; { + theMessage.data.l[0]=x; + theMessage.data.l[1]=c; + send_sig(GRAPH_CMD_POINT); +} + +void graph_board( size ) int size; { + theMessage.data.l[0]=size; + send_sig(GRAPH_CMD_LINE); +} + diff --git a/sources/int/net/ip/graph.h b/sources/int/net/ip/graph.h new file mode 100644 index 0000000..5da11e8 --- /dev/null +++ b/sources/int/net/ip/graph.h @@ -0,0 +1,20 @@ +#define GRAPH_CMD_POINT 1 +#define GRAPH_CMD_END 2 +#define GRAPH_CMD_LINE 3 + +#define GRAPH_COL_BACK 0 +#define GRAPH_COL_BOARD 1 +#define GRAPH_COL_OK 2 +#define GRAPH_COL_ERROR 3 + +#ifndef NO_PROTOTYPES +void graph_on( int x, int y, char *title ); +void graph_off( void ); +void graph_point( int x, int color ); +void graph_board( int size ); +#else +void graph_on(); +void graph_off(); +void graph_point(); +void graph_board(); +#endif diff --git a/sources/int/net/ip/graphsrv.c b/sources/int/net/ip/graphsrv.c new file mode 100644 index 0000000..a41869c --- /dev/null +++ b/sources/int/net/ip/graphsrv.c @@ -0,0 +1,265 @@ +#include "graph.h" + +#include +#include +#include + +#include + +#ifndef NO_MWM +#include +#endif + +#include +#include +#include + +#ifndef NO_MWM +#include +#endif + +XSizeHints theHints; +Display *theDisp; +int theDepth, theScreen, dispcells; +Colormap theCmap; +Window rootW, window, father; +GC theGC; +unsigned long fcol,bcol,white,black,grey,yellow,red,style=1; +XColor exact_color,closest_color; +Font mfont; +XFontStruct *mfinfo; +Visual *theVisual; +XImage *theImage; +XClientMessageEvent toFatherEv; +XEvent event; +Cursor theCursor; + +int iWIDE,iHIGH,xWIDE; +static int MARGIN=3; + +Pixmap pixmap; + +static void snd_father(){ + toFatherEv.type=ClientMessage; + toFatherEv.format = 16; + XSendEvent(theDisp,father,False,NoEventMask,&toFatherEv); +/* XFlush(theDisp);*/ +} + +#ifndef NO_PROTOTYPES +void RealiseCmd(int,long *); +#else +void RealiseCmd(); +#endif + + +static char *title; + + +main(argc, argv) + int argc; + char *argv[]; +{ + int w=0; + int i; + int events=0; + + father = atoi(argv[1]); + + iWIDE = atoi(argv[2])+2*MARGIN; + iHIGH = atoi(argv[3])+2*MARGIN; + xWIDE = atoi(argv[2]); + title = argv[4]; + + for( i=2; ifid; + + theHints.width =iWIDE; + theHints.height=iHIGH; + theHints.flags=PSize; + window = XCreateSimpleWindow(theDisp,rootW,10,10,iWIDE,iHIGH,3,fcol,bcol); + + XSetStandardProperties(theDisp,window,title,title,None,argv,argc,&theHints); + XDefineCursor(theDisp,window,theCursor); + + XChangeProperty(theDisp,window,XA_WM_CLASS,XA_STRING,8,PropModeReplace, + title,strlen(title)); + +#ifndef NO_MWM + { + struct { + long flags; + long functions; + long decorations; + int input_mode; + } hints; + Atom a=XInternAtom(theDisp,_XA_MWM_HINTS,False); + hints.flags = MWM_HINTS_FUNCTIONS; + hints.functions = MWM_FUNC_CLOSE | MWM_FUNC_MOVE; + hints.decorations = 0; + hints.input_mode = 0; + XChangeProperty(theDisp,window,a,a,32,PropModeReplace,&hints,4); + } +#endif + + theGC = XCreateGC(theDisp,window,0,0); + XSetFont(theDisp,theGC,mfont); + XSetForeground(theDisp,theGC,fcol); + XSetBackground(theDisp,theGC,bcol); + + XSelectInput(theDisp,window, ExposureMask | KeyPressMask); + XMapRaised(theDisp,window); + + pixmap = XCreatePixmap(theDisp,window,iWIDE,iHIGH,theDepth); + + XSetForeground(theDisp,theGC,bcol); + XFillRectangle(theDisp,pixmap,theGC,0,0,iWIDE,iHIGH); + XFillRectangle(theDisp,window,theGC,0,0,iWIDE,iHIGH); + XSetForeground(theDisp,theGC,fcol); + + for(;;){ + + XNextEvent(theDisp,&event); + + switch (event.type){ + + case Expose: + { + int x=event.xexpose.x; + int y=event.xexpose.y; + int w=event.xexpose.width; + int h=event.xexpose.height; + int cnt=0; + XCopyArea(theDisp,pixmap,window,theGC,x,y,w,h,x,y); + if( events==0 ){ + toFatherEv.data.l[0] = window; + snd_father(); + } + events=1; + } + break; + + case ClientMessage: + RealiseCmd( (int)(event.xclient.message_type),event.xclient.data.l); + break; + + case MappingNotify: + if( event.xmapping.request == MappingModifier || + event.xmapping.request == MappingKeyboard ) + XRefreshKeyboardMapping(&event); + break; + + } /* end of switch */ + + } /* end of for */ + +} + + + +static int cmd=0,w,h,x,y,curx,cury,kolb,wwyp,p,q,r,color; +static char c; +static XImage *image; +XImage *XGetImage(); + + + +void RealiseCmd( cmd, pars ) int cmd; long *pars; { + + int size; + + switch( cmd ){ + + case GRAPH_CMD_END: + XFreePixmap(theDisp,pixmap); + XDestroyWindow(theDisp,window); + XCloseDisplay(theDisp); + exit(0); + break; + + + case GRAPH_CMD_POINT: + + x = pars[ 0 ]; + color = pars[ 1 ]; + + if( color == GRAPH_COL_BACK ) fcol = black ; + else + if( color == GRAPH_COL_OK ) fcol = yellow ; + else + if( color == GRAPH_COL_BOARD ) fcol = grey ; + else + if( color == GRAPH_COL_ERROR ) fcol = red ; + + XSetForeground(theDisp,theGC,fcol); + XDrawPoint(theDisp,pixmap,theGC,MARGIN+x%xWIDE,MARGIN+x/xWIDE); + XDrawPoint(theDisp,window,theGC,MARGIN+x%xWIDE,MARGIN+x/xWIDE); + break; + + + case GRAPH_CMD_LINE: + + size = pars[ 0 ]; + XSetForeground(theDisp,theGC,grey); + XFillRectangle(theDisp,pixmap,theGC,MARGIN,MARGIN,xWIDE,size/xWIDE); + XFillRectangle(theDisp,window,theGC,MARGIN,MARGIN,xWIDE,size/xWIDE); + if( size%xWIDE > 0 ){ + XDrawLine(theDisp,pixmap,theGC, + MARGIN, MARGIN+size/xWIDE, + MARGIN+size%xWIDE-1, MARGIN+size/xWIDE + ); + XDrawLine(theDisp,window,theGC, + MARGIN, MARGIN+size/xWIDE, + MARGIN+size%xWIDE-1, MARGIN+size/xWIDE + ); + } + break; + + + default : + fprintf(stderr,"UKNOWN COMMAND - %d\n",cmd); + fflush(stderr); + XFreePixmap(theDisp,pixmap); + XDestroyWindow(theDisp,window); + XCloseDisplay(theDisp); + exit(7); + + } +} + diff --git a/sources/int/net/ip/makefile b/sources/int/net/ip/makefile new file mode 100644 index 0000000..e8b4846 --- /dev/null +++ b/sources/int/net/ip/makefile @@ -0,0 +1,40 @@ +SHELL = /bin/sh + + +#### SCO #### +CFLAGS=-g -W1 +socket=-lsocket + +#### HP #### +#CFLAGS=-g -DNO_PROTOTYPES -DNO_MWM -DBZERO +#socket= + + + +PROD = cli srv graph time timediff + +install all: $(PROD) + +.c.o: + $(CC) $(CFLAGS) -c $*.c + +cli: cli.o graph.o sock.o sockcrc.o + $(CC) $(CFLAGS) -o cli cli.o graph.o sock.o sockcrc.o -lX11 $(socket) + +srv: srv.o sock.o sockcrc.o + $(CC) $(CFLAGS) -o srv srv.o sock.o sockcrc.o $(socket) + +graph: graphsrv.o + $(CC) $(CFLAGS) -o graph graphsrv.o -lX11 $(socket) + +time: time.o sock.o + $(CC) $(CFLAGS) -o time time.o sock.o $(socket) + +timediff: timediff.o sock.o + $(CC) $(CFLAGS) -o timediff timediff.o sock.o $(socket) + +clean: + -rm -f $(PROD) + -rm -f *.o + -rm -f srv.log + diff --git a/sources/int/net/ip/sock.c b/sources/int/net/ip/sock.c new file mode 100644 index 0000000..9d8d909 --- /dev/null +++ b/sources/int/net/ip/sock.c @@ -0,0 +1,197 @@ +#include "sock.h" + + +#ifndef FD_SET +#define BITS_PER_INT 32 +#define FD_SET(f,fds) (fds)->fds_bits[(f)/BITS_PER_INT]|=(1<<((f)%BITS_PER_INT)) +#define FD_ZERO(fds) { (fds)->fds_bits[0]=0; (fds)->fds_bits[1]=0; } +#endif + + + +#ifdef BZERO +void bzero( buf, size ) char *buf; int size; { + while( --size >= 0 ) + buf[size]='\0'; +} +void bcopy( from, to, size ) char *from,*to; int size; { + while( --size >= 0 ) + to[size]=from[size]; +} +#endif + + + +#ifndef INADDR_NONE +#define INADDR_NONE 0xffffffffUL +#endif + + +int sock_open( socket_type, protocol, host, service, port, as_server ) + char *host; + char *service; + char *protocol; + int socket_type,port; + int as_server; +{ + int fd; + unsigned long inaddr; + struct sockaddr_in my_addr,it_addr,*srv_addr; + struct servent *sp; + struct hostent *hp; + struct protoent *pp; + + bzero((char *)&my_addr,sizeof(my_addr)); + bzero((char *)&it_addr,sizeof(it_addr)); + + my_addr.sin_family=AF_INET; + it_addr.sin_family=AF_INET; + + my_addr.sin_port=htons(0); + it_addr.sin_port=htons(0); + + my_addr.sin_addr.s_addr=htonl(INADDR_ANY); + it_addr.sin_addr.s_addr=htonl(INADDR_ANY); + + if( as_server ) + srv_addr = &my_addr; + else + srv_addr = &it_addr; + + if( (pp=getprotobyname(protocol)) == NULL ){ + fprintf(stderr,"protocol %s unknown\n",protocol); + return -1; + } + + if( service != NULL ){ + if( (sp=getservbyname(service,protocol)) == NULL ){ + fprintf(stderr,"port_open:unknown service %s/%s\n",service,protocol); + return -1; + } + srv_addr->sin_port = sp->s_port; + } + + if( port>0 ) + srv_addr->sin_port = htons( port ); + + if( host!=NULL ) + if( (inaddr = inet_addr(host)) != INADDR_NONE ){ + /* it is dotted-decimal address */ + bcopy((char *)&inaddr,(char *)&(srv_addr->sin_addr),sizeof(inaddr)); + } else { + if( (hp = gethostbyname(host)) == NULL ){ + fprintf(stderr,"port_open:host name error %s\n",host); + return -1; + } + bcopy(hp->h_addr,(char *)&(srv_addr->sin_addr),hp->h_length); + } + + if( (fd = socket(AF_INET,socket_type,pp->p_proto)) < 0 ){ + perror("port_open:can't create socket"); + errno=0; + return -1; + } + + if( bind( fd, (struct sockaddr *)&my_addr, sizeof(my_addr) ) < 0 ){ + perror("port_open:bind error"); + errno=0; + return -1; + } + + if( !as_server ) + if( connect( fd, (struct sockaddr *)&it_addr, sizeof(it_addr) ) < 0 ){ + perror("port_open:connect error"); + errno=0; + return -1; + } + + return fd; +} + + +int sock_cli_send( sock, m, size ) int sock,size; void *m; { + if( send(sock, m, size, 0) < 0) { + perror("cli:send failed"); + errno=0; + return -1; + } + return 0; +} + + + +int sock_poll( sock, ms ) int sock,ms; { + struct timeval timeout; + fd_set rd_fds; + int nfds; + FD_ZERO(&rd_fds); + timeout.tv_sec = ms/1000; + timeout.tv_usec = (ms%1000)*1000; + if( sock>=0 ) /* sock==-1 means we only sleep */ + FD_SET(sock,&rd_fds); + nfds = select(sock+1,&rd_fds,NULL,NULL,&timeout); + errno=0; + return ( nfds == 1 ); +} + + +static int cli_recv_timeout = 2000 /* miliseconds */; + +void set_cli_recv_timeout( ms ) int ms; { /* set timeout to miliseconds */ + cli_recv_timeout = ms; +} + +int sock_cli_recv( sock, m, size ) int sock,size; void *m; { + int recv_size; + int nfds; + nfds = sock_poll(sock,cli_recv_timeout); + if( nfds==0 ){ errno=0; return 0; } /* timeout */ + if( nfds<0 ){ + perror("cli:select failed"); + errno=0; + return -1; + } + if( (recv_size=recv(sock, m, size, 0)) < 0) { + perror("cli:recv failed"); + errno=0; + return -1; + } + return recv_size; +} + + +static int srv_send_wait_time = 1; + +void set_srv_send_delay( ms ) int ms; { /* set delay to miliseconds */ + srv_send_wait_time = ms; +} + +int sock_srv_send( sock, m, size, addr, namelen ) + int sock,size,namelen; + void *m; + struct sockaddr_in *addr; +{ + sock_poll(-1,srv_send_wait_time); + if( sendto(sock,m,size,0,addr,namelen) <= 0) { + perror("srv:send failed"); + errno=0; + return -1; + } + return 0; +} + +int sock_srv_recv( sock, m, size, addr, namelen ) + int sock,size,*namelen; + void *m; + struct sockaddr_in *addr; +{ + int recv_size; + if( (recv_size=recvfrom(sock, m, size, 0, addr, namelen )) < 0) { + perror("srv:recvfrom"); + errno=0; + return -1; + } + return recv_size; +} + + diff --git a/sources/int/net/ip/sock.h b/sources/int/net/ip/sock.h new file mode 100644 index 0000000..53fe388 --- /dev/null +++ b/sources/int/net/ip/sock.h @@ -0,0 +1,57 @@ +# include +# include +#ifndef NO_PROTOTYPES +# include +#endif +# include +# include +# include +# include +# include +# include +# include + + +#define AS_CLIENT 0 +#define AS_SERVER 1 + + +#ifndef NO_PROTOTYPES +int sock_open( int socket_type, char *protocol, + char *host, char *service, int port, + int as_server ); +int sock_cli_send( int sock, void *m, int size ); +int sock_cli_recv( int sock, void *m, int size ); +int sock_srv_recv( int sock, void *m, int size, + struct sockaddr_in *addr, int *namelen ); +int sock_srv_send( int sock, void *m, int size, + struct sockaddr_in *addr, int namelen ); +void set_cli_recv_timeout( int miliseconds ); +void set_srv_send_delay ( int miliseconds ); +int poll_socket( int sock, int miliseconds ); +#else +int sock_open(); +int sock_cli_send(); +int sock_cli_recv(); +int sock_srv_recv(); +int sock_srv_send(); +void set_cli_recv_timeout(); +void set_srv_send_delay (); +int poll_socket(); +#endif + + +#ifndef NO_PROTOTYPES +int sock_cli_crc_send( int sock, void *m, int size ); +int sock_cli_crc_recv( int sock, void *m, int size ); +int sock_srv_crc_recv( int sock, void *m, int size, + struct sockaddr_in *addr, int *namelen ); +int sock_srv_crc_send( int sock, void *m, int size, + struct sockaddr_in *addr, int namelen ); +#else +int sock_cli_crc_send(); +int sock_cli_crc_recv(); +int sock_srv_crc_recv(); +int sock_srv_crc_send(); +#endif + diff --git a/sources/int/net/ip/sockcrc.c b/sources/int/net/ip/sockcrc.c new file mode 100644 index 0000000..b93c51b --- /dev/null +++ b/sources/int/net/ip/sockcrc.c @@ -0,0 +1,79 @@ +#include "sock.h" + +#ifndef NO_PROTOTYPES +static int get_crc( char *data, int data_size ); +#else +static int get_crc(); +#endif + + +static char buffer[8192]; /* shouldn't be bigger message */ + + +int sock_cli_crc_send( sock, m, size ) int sock,size; void *m; { + *(int *)buffer = htonl(get_crc( m, size )); + bcopy( m, buffer+sizeof(int), size ); + return sock_cli_send( sock, buffer, size+sizeof(int) ); +} + +int sock_cli_crc_recv( sock, m, size ) int sock,size; void *m; { + int recv_size; + recv_size = sock_cli_recv(sock, buffer, size+sizeof(int) ); + if( recv_size == 0 ) return 0; + else + if( recv_size < sizeof(int) ) return -1; + else{ + recv_size-=sizeof(int); + bcopy( buffer+sizeof(int), m, recv_size ); + if( get_crc(m,recv_size)!=ntohl(*(int *)buffer) ) + return -1; /* error */ + else + return recv_size; + } +} + +int sock_srv_crc_send( sock, m, size, addr, namelen ) + int sock,size,namelen; + void *m; + struct sockaddr_in *addr; +{ + *(int *)buffer = htonl(get_crc( m, size )); + bcopy( m, buffer+sizeof(int), size ); + return sock_srv_send( sock, buffer, size+sizeof(int) , addr, namelen ); +} + +int sock_srv_crc_recv( sock, m, size, addr, namelen ) + int sock,size,*namelen; + void *m; + struct sockaddr_in *addr; +{ + int recv_size; + recv_size = sock_srv_recv(sock, buffer, size+sizeof(int), addr, namelen ); + if( recv_size == 0 ) return -1; + else + if( recv_size < sizeof(int) ) return -1; + else{ + recv_size-=sizeof(int); + bcopy( buffer+sizeof(int), m, recv_size ); + if( get_crc(m,recv_size)!=ntohl(*(int *)buffer) ) + return -1; /* error */ + else + return recv_size; + } +} + + + +static int get_crc( data, data_size ) char *data; int data_size; { + int i; + unsigned long crc=0L; + for( i=0; i + +struct sockaddr_in it; +int sock, namelen, seq = 0; + +#ifndef NO_PROTOTYPES +int main(int argc,char **argv); +#endif + +int main(argc,argv) int argc; char** argv; { + msg m; + + if( argc>1 ){ + set_srv_send_delay( atoi(argv[1]) ); + printf("delay set to %d ms\n",atoi(argv[1])); + } + + fclose(stdin); + + { + int retval=fork(); + if( retval<0 ) perror("fork failed"),exit(0); + if( retval>0 ) exit(0); + } + + setpgrp(); + freopen("srv.log","a",stdout); + freopen("srv.log","a",stderr); + + sock = sock_open( SOCK_DGRAM, "udp", NULL, NULL, PORT, AS_SERVER ); + if( sock < 0 ){ + perror("sockopen"); + fflush(stdout); + fflush(stderr); + exit(10); + } + + if (fork()) exit(0); + + for ( ;; ) { + + int namelen = sizeof(it); + int size; + + fflush(stdout); + fflush(stderr); + + size=sock_srv_crc_recv(sock, &m, sizeof(m), &it, &namelen ); + + if( size>0 ) /* there was no error & I'm not interested in 0 size */ + switch( ntohl(m.req) ){ + + case RQ_FILE_SIZE : + { + struct stat status; + if( stat(m.data,&status) ) status.st_size=0; + m.req=htonl(0); + printf("file %s size %d\n",m.data,status.st_size); + fflush(stdout); + fflush(stderr); + *(int*)(m.data)=htonl(status.st_size); + sock_srv_crc_send(sock,&m,HEAD+sizeof(int),&it,namelen); + } + break; + + case RQ_FILE : + { + FILE *f=fopen(m.data+2*sizeof(int),"rb"); + int size,cnt=0; + int packets = ntohl(((int *)m.data)[1]); + int seek=ntohl(((int *)m.data)[0]); + int errors=0; + if( f==NULL ) break; + printf("file %s from %d %d packets\n", + m.data+2*sizeof(int),seek,packets); + fflush(stdout); + fflush(stderr); + fseek(f,DATA_PIECE*seek,0); + while( (size=fread(m.data,1,DATA_PIECE,f)) > 0 ){ + m.req=htonl(seek++); + cnt++; + if(sock_srv_crc_send(sock,&m,HEAD+size,&it,namelen)<0) + errors++; + else + errors=0; + if( errors>=10 ) break; + if( cnt==packets ) break; + } + fclose(f); + while( sock_poll( sock, 0 ) ) + sock_srv_crc_recv(sock,&m,sizeof(m),&it,&namelen); + } + break; + + default: + printf("srv:unknown req %d\n",ntohl(m.req)); + + } + } + + return 0; +} + diff --git a/sources/int/net/ip/srv.h b/sources/int/net/ip/srv.h new file mode 100644 index 0000000..defdaac --- /dev/null +++ b/sources/int/net/ip/srv.h @@ -0,0 +1,14 @@ +#define PORT 3963 +#define DATA_PIECE 64 + +typedef struct { + unsigned long req; + char data[DATA_PIECE]; +} msg; + +#define HEAD (sizeof(msg)-DATA_PIECE) + + +#define RQ_FILE_SIZE 1 +#define RQ_FILE 2 + diff --git a/sources/int/net/ip/t.c b/sources/int/net/ip/t.c new file mode 100644 index 0000000..217468f --- /dev/null +++ b/sources/int/net/ip/t.c @@ -0,0 +1,51 @@ +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include + + +int main(){ + + int i=0; + long diff; + struct timeval time_before,time_after; + + if( gettimeofday(&time_before,NULL) ){ + perror("gettimeofday:"); + exit(1); + } + + for(;;i++){ + + if( gettimeofday(&time_after ,NULL) ){ + perror("gettimeofday:"); + exit(1); + } + + diff = (time_after.tv_sec - time_before.tv_sec)*1000; + diff -= time_before.tv_usec/1000; + diff += time_after .tv_usec/1000; + + if( diff < 0 ){ + printf("%d-th operation took %d ms\n",i,diff); + fflush(stdout); + i=0; + } + +/* printf("time now %d s %d us\n",time_after.tv_sec,time_after.tv_usec); +*/ + fflush(stdout); + + time_before = time_after; + + } + + return 0; +} + diff --git a/sources/int/net/ip/time.c b/sources/int/net/ip/time.c new file mode 100644 index 0000000..f86f203 --- /dev/null +++ b/sources/int/net/ip/time.c @@ -0,0 +1,68 @@ +#include "sock.h" + +char m[100]; +int sock; + +char *host; + + +#ifndef NO_PROTOTYPES +int main(int argc,char **argv); +#endif + +static int bytes_received=0; +static char title[100]; + + +static void usage(s) char *s;{ + printf("usage: %s host\n",s); + exit(0); +} + + +static int do_rs( socket_type, protocol, host, service ) + int socket_type; + char *host,*service,*protocol; +{ + int size=0; + int sock = sock_open( socket_type, protocol, host, service, 0, AS_CLIENT ); + if( sock>=0 ){ + if( !sock_cli_send( sock, m, 1 ) ){ + size=sock_cli_recv(sock,m,sizeof(m)); + if( size>=0 ) + printf("packet size %d\n",size); + } + close( sock ); + } + return ( size > 0 ); +} + + +int main(argc,argv) int argc; char** argv; { + + int size; + + if( argc != 2 ) usage(argv[0]); + host = argv[1]; + printf("ask for time on %s\n",host); + + set_cli_recv_timeout( 5000 ); + + if( do_rs( SOCK_DGRAM, "udp", host, "time" ) ) + printf("time on %s is %u s\n",host,ntohl(*(int *)m)); + + if( do_rs( SOCK_DGRAM, "udp", host, "daytime" ) ) + printf("daytime on %s is %s\n",host,m); + + if( do_rs( SOCK_STREAM, "tcp", host, "time" ) ) + printf("time on %s is %u s\n",host,ntohl(*(int *)m)); + + if( do_rs( SOCK_STREAM, "tcp", host, "daytime" ) ) + printf("daytime on %s is %s\n",host,m); + + if( do_rs( SOCK_STREAM, "tcp", host, "ntp" ) ) + printf("daytime on %s is %s\n",host,m); + + return 0; +} + diff --git a/sources/int/net/ip/timediff.c b/sources/int/net/ip/timediff.c new file mode 100644 index 0000000..6dd17a9 --- /dev/null +++ b/sources/int/net/ip/timediff.c @@ -0,0 +1,144 @@ +#include "sock.h" + +char m[100]; +int sock; + +char *host; + + +#ifndef NO_PROTOTYPES +int main(int argc,char **argv); +#endif + +static int bytes_received=0; +static char title[100]; + + +static void usage(s) char *s;{ + printf("usage: %s host\n",s); + exit(0); +} + + +static int host_time( host ) + char *host; +{ + int size=0; + int time; + int sock = sock_open( SOCK_STREAM, "tcp", host, "time", 0, AS_CLIENT ); + if( sock>=0 ){ + size=sock_cli_recv(sock,&time,sizeof(int)); + close( sock ); + } + if( size == sizeof(int) ) return ntohl(time); + else return 0; +} + + +int main(argc,argv) int argc; char** argv; { + + int uid=getuid(); + + if( argc != 2 ) usage(argv[0]); + host = argv[1]; + + printf("STARTED\n"); + + for(;;sleep(60*15)){ + + int local,remote,i; + long diff; + struct timeval delta,olddelta; + struct timeval time_before,time_after; + + errno=0; + + for( i=0; i<3; i++ ){ + + if( gettimeofday(&time_before,NULL) ){ + perror("gettimeofday:"); + if( uid!=0 ) return 1; + continue; + } + + local = host_time( "localhost" ); + remote= host_time( host ); + + if( gettimeofday(&time_after ,NULL) ){ + perror("gettimeofday:"); + if( uid!=0 ) return 1; + continue; + } + + diff = (time_after.tv_sec - time_before.tv_sec)*1000; + diff -= time_before.tv_usec/1000; + diff += time_after .tv_usec/1000; + if( diff >=0 && diff < 300 ) break; + + } + + if( i==3 ){ + printf("transaction too long ( %dms ) or errors in time\n",diff); + fflush(stdout); + fflush(stderr); + if( uid==0 ) + continue; + } + + if( remote==0 ){ + printf("error in connect to %s\n",host); + fflush(stdout); + fflush(stderr); + if( uid!=0 ) return 1; + continue; + } + if( local==0 ){ + printf("error in connect to %s\n","localhost"); + fflush(stdout); + fflush(stderr); + if( uid!=0 ) return 1; + continue; + } + + delta.tv_sec=remote-local; + delta.tv_usec=0; + + if( delta.tv_sec!=0 ){ + if( delta.tv_sec > 1 ) delta.tv_sec = 1; + else + if( delta.tv_sec < -1 ) delta.tv_sec = -1; + else{ + if( delta.tv_sec == 1 ) delta.tv_usec = 500000; + else delta.tv_usec = -500000; + delta.tv_sec = 0; + } + if( uid==0 ) + if( adjtime(&delta,&olddelta)<0 ) perror("adjtime error:"); + } + + { + extern char *ctime(); + extern time_t time(); + time_t t=time(NULL); + char *c=ctime(&t); + if( c[strlen(c)-1]=='\n' ) c[strlen(c)-1]='\0'; + if( remote > local ) + printf("at %s(%dms) time on %s is %u s forward\n", + c,diff,host,remote-local); + if( remote < local ) + printf("at %s(%dms) time on %s is %u s late\n", + c,diff,host,local-remote); + if( uid != 0 && remote == local ) + printf("at %s(%dms) time on %s is equal\n",c,diff,host); + } + + fflush(stdout); + fflush(stderr); + + if( uid!=0 ) return 0; + + } + + return 0; +} + diff --git a/sources/int/net/ip/udpmsg.c b/sources/int/net/ip/udpmsg.c new file mode 100644 index 0000000..100c1e0 --- /dev/null +++ b/sources/int/net/ip/udpmsg.c @@ -0,0 +1,92 @@ +#ifndef NO_PROTOTYPES +int sendmsg( int sock, struct msghdr *hdr, int flags ); +int recvmsg( int sock, struct msghdr *hdr, int flags ); +#else +int sendmsg(); +int recvmsg(); +#endif + + +#ifdef SCO +#define msghdr dumb_name_for_wrong_msghdr_9873 +#endif + +#ifdef SCO +#undef msghdr +#endif + +#ifdef SCO /* wrong structute msghdr + sendmsg not implemented !!!? */ + +struct iovec { + caddr_t iov_base; + int iov_len; +}; + +/* + * Message header for recvmsg and sendmsg calls. + */ +struct msghdr { + caddr_t msg_name; /* optional address */ + int msg_namelen; /* size of address */ + struct iovec *msg_iov; /* scatter/gather array */ + int msg_iovlen; /* # elements in msg_iov */ + caddr_t msg_accrights; /* access rights sent/received */ + int msg_accrightslen; +}; + + + + +/* SCO did not implement these functions ! */ + +static char buffer[8192]; /* maybe there won't be bigger message */ + + +int sendmsg( sock, hdr, flags ) int sock; struct msghdr *hdr; int flags; { + int i,size; + char *ptr=buffer; + + for( size=i=0; + i < hdr -> msg_iovlen ; + size+=hdr->msg_iov[i].iov_len, ptr+=hdr->msg_iov[i].iov_len, i++ + ){ + if( size + hdr->msg_iov[i].iov_len >= sizeof(buffer) ){ + errno=EMSGSIZE; + return -1; + } + bcopy( hdr->msg_iov[i].iov_base, ptr, hdr->msg_iov[i].iov_len ); + } + + if( hdr->msg_name != NULL ) + return sendto( sock,buffer,size,flags, hdr->msg_name,hdr->msg_namelen ); + else + return send( sock,buffer,size,flags ); +} + + +int recvmsg( sock, hdr, flags ) int sock; struct msghdr *hdr; int flags; { + int i,sizegot,size; + char *ptr=buffer; + + if( hdr->msg_name != NULL ) + size = recvfrom( sock,buffer,size,flags, hdr->msg_name,hdr->msg_namelen ); + else + size = recv( sock,buffer,size,flags ); + + if( size<=0 ) return size; + + for( sizegot=i=0; + i < hdr -> msg_iovlen ; + sizegot+=hdr->msg_iov[i].iov_len, ptr+=hdr->msg_iov[i].iov_len, i++ + ){ + if( sizegot + hdr->msg_iov[i].iov_len >= sizeof(buffer) ){ + bcopy( ptr, hdr->msg_iov[i].iov_base, sizeof(buffer)-sizegot); + size = sizeof(buffer); + break; + } + bcopy( ptr, hdr->msg_iov[i].iov_base, hdr->msg_iov[i].iov_len ); + } + + return size; +} + diff --git a/sources/int/net/rpc/clnt.c b/sources/int/net/rpc/clnt.c new file mode 100644 index 0000000..4bac786 --- /dev/null +++ b/sources/int/net/rpc/clnt.c @@ -0,0 +1,77 @@ +#include +#include +#include "srvr.h" +#include +#include +#include +#include + +main(argc,argv) int argc; char **argv; { + struct hostent *hp; + struct timeval pertry_timeout,total_timeout; + struct sockaddr_in server_addr; + int addrlen; + int sock=RPC_ANYSOCK; + CLIENT *client; + enum clnt_stat clnt_stat; + char *s; + int pid=getpid(); + int vers; + + if(argc < 3) fprintf(stderr,"usage:%s hostname version\n",argv[0]),exit(-1); + + vers=(int)atol(argv[2]); + + if((hp=gethostbyname(argv[1]))==NULL) + fprintf(stderr,"cannot get addr for %s\n",argv[1]),exit(-1); + + pertry_timeout.tv_sec = 60; + pertry_timeout.tv_usec = 0; + + addrlen = sizeof( struct sockaddr_in ); + { + int i; + for( i=0; ih_length ; i++ ) + ((char *)(&server_addr.sin_addr))[i] = hp->h_addr[i]; + } + + server_addr.sin_family = AF_INET; + server_addr.sin_port = 0; + + total_timeout.tv_sec = 2000; + total_timeout.tv_usec = 0; + + if((client=clntudp_create(&server_addr,SRVRPROG,SRVRVERS+vers,total_timeout,&sock))==NULL){ + perror("clntudp_create"); + exit(-1); + } + + clnt_stat=clnt_call(client,NULLPROC, xdr_void,NULL, xdr_void,NULL, + total_timeout); + + if( clnt_stat != RPC_SUCCESS ){ + clnt_perror( client, "rpc clnt call" ); + exit(-1); + } + + { + int i; + for( i=0; i<500; i++ ){ + + s=malloc(40); + sprintf(s,"client %d version %d",pid,vers); + + clnt_stat = clnt_call( client, RENDERSTR, + xdr_wrapstring, &s, xdr_void, NULL, + total_timeout ); + + if( clnt_stat != RPC_SUCCESS ){ + clnt_perror(client,"rpc"); + exit(-1); + } + + } + } + + clnt_destroy( client ); +} diff --git a/sources/int/net/rpc/makefile b/sources/int/net/rpc/makefile new file mode 100644 index 0000000..ee33886 --- /dev/null +++ b/sources/int/net/rpc/makefile @@ -0,0 +1,18 @@ +SHELL=/bin/sh + +all : srvr clnt stop + +LIBS = -lrpc -lsocket +SRVR_LIBS = -lrpcsvc $(LIBS) + +clean : + rm -f srvr clnt stop *.o a.out errs core + +srvr : srvr.c + cc -o srvr srvr.c $(SRVR_LIBS) + +clnt : clnt.c + cc -o clnt clnt.c $(LIBS) + +stop : stop.c + cc -o stop stop.c $(LIBS) diff --git a/sources/int/net/rpc/srvr.c b/sources/int/net/rpc/srvr.c new file mode 100644 index 0000000..e2c395c --- /dev/null +++ b/sources/int/net/rpc/srvr.c @@ -0,0 +1,127 @@ +#include +#include +#include "srvr.h" + +void dispatch(); + +#define MAXPROCS 64 + +#define disable(p) (mask&=~(1<<(sockets[p]))) +#define enable(p) (mask|= (1<<(sockets[p]))) +int sockets[MAXPROCS]; +unsigned int mask=0xffffffff; + + +main(){ + SVCXPRT *transp; + + int i; + for(i=0;ixp_sock; + + transp = svcudp_create(RPC_ANYSOCK); + if( transp == NULL ){ + fprintf(stderr,"could not create an RPC2 server\n"); + exit(1); + } + pmap_unset(SRVRPROG,SRVRVERS+1); + if(!svc_register(transp,SRVRPROG,SRVRVERS+1,dispatch,IPPROTO_UDP)){ + fprintf(stderr,"could not register service 2\n"); + exit(1); + } + sockets[1]=transp->xp_sock; + + disable(1); + + svc_run(); + fprintf(stderr,"should never reach this point!\n"); +} + +void dispatch(rqstp,transp) struct svc_req *rqstp; SVCXPRT *transp; { + char *s=NULL; + static int sem=0; + static int cnt=0; + switch( rqstp->rq_proc ){ + + case NULLPROC: + printf("nullproc\n"); + if(!svc_sendreply(transp,xdr_void,0)){ + fprintf(stderr,"could not reply to RPC NULL call\n"); + exit(1); + } + return; + + case RENDERSTR: + sem++; + if(sem>1){ printf("ERROR sem=%d\n",sem); exit(1); } + enable(0); + if(cnt>50) enable(1); + if(!svc_getargs(transp,xdr_wrapstring,&s)){ + fprintf(stderr,"could not decode arguments in RPC render call\n"); + exit(1); + } + printf("got:%s\n",s); + if(!svc_sendreply(transp,xdr_void,0)){ + fprintf(stderr,"could not reply to RPC render call\n"); + exit(1); + } + if(rqstp->rq_vers-SRVRVERS==1) + if((cnt%9)==2) + disable(0); + cnt++; + sem--; + break; + + case SRVR_END: + if(!svc_sendreply(transp,xdr_void,0)){ + fprintf(stderr,"could not reply to RPC END call\n"); + exit(1); + } + svc_unregister(SRVRPROG,rqstp->rq_vers); + svc_destroy(transp); + printf("server %d closed\n",rqstp->rq_vers-SRVRVERS); + + default : + svcerr_noproc(transp); + return; + + } + svc_freeargs(transp,xdr_wrapstring,&s); +} + + +void svc_run() +{ + int readfds; + for(;;){ + readfds=svc_fds&mask; +/* printf("sel:svc_fds=%x\n",svc_fds);*/ + if( svc_fds == 0 ){ + printf("server has no services - closing\n"); + exit(0); + } + switch( select(32,&readfds,NULL,NULL,NULL) ){ + + case -1: perror("rstat: select"); + return; + + case 0: break; + + default: +/* printf(" req:svc_fds=%x\n",readfds);*/ + svc_getreq(readfds); + } + } +} + diff --git a/sources/int/net/rpc/srvr.h b/sources/int/net/rpc/srvr.h new file mode 100644 index 0000000..39f3419 --- /dev/null +++ b/sources/int/net/rpc/srvr.h @@ -0,0 +1,4 @@ +#define SRVRPROG 120022 +#define SRVRVERS 1 +#define RENDERSTR 1 +#define SRVR_END 3 diff --git a/sources/int/net/rpc/stop.c b/sources/int/net/rpc/stop.c new file mode 100644 index 0000000..a5dc65a --- /dev/null +++ b/sources/int/net/rpc/stop.c @@ -0,0 +1,62 @@ +#include +#include +#include "srvr.h" +#include +#include +#include + +main(argc,argv) int argc; char **argv; { + struct hostent *hp; + struct timeval pertry_timeout,total_timeout; + struct sockaddr_in server_addr; + int addrlen; + int sock=RPC_ANYSOCK; + CLIENT *client; + enum clnt_stat clnt_stat; + int vers; + + if(argc < 3) fprintf(stderr,"usage:%s hostname version\n",argv[0]),exit(-1); + vers=(int)atol(argv[2]); + + if((hp=gethostbyname(argv[1]))==NULL) + fprintf(stderr,"cannot get addr for %s\n",argv[1]),exit(-1); + + pertry_timeout.tv_sec = 10; + pertry_timeout.tv_usec = 0; + + addrlen = sizeof( struct sockaddr_in ); + { + int i; + for( i=0; ih_length ; i++ ) + ((char *)(&server_addr.sin_addr))[i] = hp->h_addr[i]; + } + + server_addr.sin_family = AF_INET; + server_addr.sin_port = 0; + + total_timeout.tv_sec = 20; + total_timeout.tv_usec = 0; + + if((client=clntudp_create(&server_addr,SRVRPROG,SRVRVERS+vers,total_timeout,&sock))==NULL){ + perror("clntudp_create in stop"); + exit(-1); + } + + clnt_stat=clnt_call(client,NULLPROC, xdr_void,NULL, xdr_void,NULL, + total_timeout); + + if( clnt_stat != RPC_SUCCESS ){ + clnt_perror( client, "rpc clnt call" ); + exit(-1); + } + + clnt_stat=clnt_call(client,SRVR_END, xdr_void,NULL, xdr_void,NULL, + total_timeout); + + if( clnt_stat != RPC_SUCCESS ){ + clnt_perror( client, "rpc" ); + exit(-1); + } + + clnt_destroy( client ); +} diff --git a/sources/int/nettest/m b/sources/int/nettest/m new file mode 100644 index 0000000..868cc5d --- /dev/null +++ b/sources/int/nettest/m @@ -0,0 +1,3 @@ +: +int -r 1 1 p # colsole number 1, wait for one slave + diff --git a/sources/int/nettest/m2 b/sources/int/nettest/m2 new file mode 100644 index 0000000..1b95df1 --- /dev/null +++ b/sources/int/nettest/m2 @@ -0,0 +1,3 @@ +: +int -r 1 2 p # colsole number 1, wait for 2 slaves + diff --git a/sources/int/nettest/p.log b/sources/int/nettest/p.log new file mode 100644 index 0000000..0b6f205 --- /dev/null +++ b/sources/int/nettest/p.log @@ -0,0 +1,89 @@ +program p; + + + +unit sync : process(nr:integer); + + unit slock:procedure; + begin + accept sunlock; + end slock; + + unit sunlock:procedure; + begin + end sunlock; + + begin + return; + do + accept slock; + od; +end sync; + + + +unit main_process : process( i:integer, s:sync ); + + var cnt : integer; + + unit entry : procedure( i,j:integer ); + begin + writeln("entry called from node ",i," #",j); + if j<0 then cnt:=cnt+1; fi; + end entry; + + begin + cnt := 0; + return; + while cnt < 2 do + accept entry; + od; + call s.sunlock; +end main_process; + + + +unit slave : process( i:integer, m:main_process ); + var j:integer; + begin + return; + for j:=1 to 10 do + call m.entry( i, j ); + od; + call m.entry( i, -1 ); +end slave; + + +unit ender : process( i:integer ); + begin + return; + call endrun; +end ender; + + +var m:main_process, s1,s2:slave, sem:sync, e:ender; + +begin + + sem := new sync( 0 ); + resume( sem ); + + m := new main_process( 0, sem ); + resume( m ); + + s1 := new slave( 2, m ); + resume( s1 ); + s2 := new slave( 3, m ); + resume( s2 ); + call sem.slock; + + e := new ender( 2 ); + resume( e ); + e := new ender( 3 ); + resume( e ); + + writeln("end of program"); + call endrun; + +end. + diff --git a/sources/int/nettest/s1 b/sources/int/nettest/s1 new file mode 100644 index 0000000..29216e9 --- /dev/null +++ b/sources/int/nettest/s1 @@ -0,0 +1,3 @@ +: +int -r 2 futrzak: p # console number 2, master at futrzak: + diff --git a/sources/int/nettest/s2 b/sources/int/nettest/s2 new file mode 100644 index 0000000..d9c4368 --- /dev/null +++ b/sources/int/nettest/s2 @@ -0,0 +1,3 @@ +: +int -r 3 futrzak: p + diff --git a/sources/int/nonstand.c b/sources/int/nonstand.c new file mode 100644 index 0000000..bd8d047 --- /dev/null +++ b/sources/int/nonstand.c @@ -0,0 +1,63 @@ +#include "depend.h" +#include "genint.h" +#include "int.h" +#include "process.h" +#include "intproto.h" + +#include "nonstand.h" + +/* Call (non)standard procedures. + * Almost totaly implementation dependent. + */ + +bool graphmode = FALSE; /* TRUE iff graphics mode active */ + + +#ifndef NO_GRAPH +# if DJE +# include "svga1.c" +# elif MSDOS +# include "dosgraf1.c" +# elif UNIX +# include "x11graf1.c" +# endif +#endif + + + +void nonstandard(nrproc) /* Call (non)standard procedure */ +word nrproc; +{ + + word am; + int cnt=0; + float r1, r2; + word ax,bx,cx,dx,i,t1,t2; + unsigned int v,p,h,l,r,c; + unsigned int Res_graph_X,Res_graph_Y; + + switch ((int) nrproc) + { + + +#ifndef NO_GRAPH +# if DJE +# include "svga2.c" +# elif MSDOS +# include "dosgraf2.c" +# elif OS2 +# include "os2graf2.c" +# elif UNIX +# include "x11graf2.c" +# else only /*INKEY defined */ + case INKEY: + param[ 0 ].xword = inkey(); + break; +# endif +#endif + + default : + errsignal(RTEUNSTP); + } +} + diff --git a/sources/int/nonstand.h b/sources/int/nonstand.h new file mode 100644 index 0000000..f37f2f0 --- /dev/null +++ b/sources/int/nonstand.h @@ -0,0 +1,105 @@ +/* Standard class IIUWGRAPH graphics primitives + +GRON:procedure(mode:integer) +GROFF:procedure +CLS:procedure +POINT:procedure(x, y:integer) +MOVE:procedure(x, y:integer) +DRAW:procedure(x, y:integer) +HFILL:procedure(x:integer) +VFILL:procedure(y:integer) +COLOR:procedure(color:integer) +STYLE:procedure(style:integer) +PATERN:procedure(p1, p2, p3, p4:integer) +INTENS:procedure(intens:integer) +PALLET:procedure(p:integer) +BORDER:procedure(b:integer) +VIDEO:procedure(buffer:arrayof integer) +HPAGE:procedure(p, q, r:integer) +NOCARD:function:integer +PUSHXY:procedure +POPXY:procedure +INXPOS:function:integer +INYPOS:function:integer +INPIX:function(x, y:integer):integer +GETMAP:function(x, y:integer):arrayof integer +PUTMAP:procedure(arrayof integer) +ORMAP:procedure(arrayof integer) +XORMAP:procedure(arrayof integer) +TRACK:procedure(x, y:integer) +INKEY:function:integer +HASCII:procedure(ch:integer) +HFONT:procedure(off, seg:integer) +HFONT8:procedure(output off, seg:integer) +OUTSTRING:procedure(s:string) +CIRB:procedure(x, y, r:integer, alpha, beta:real, b, i, p, q:integer) + +*/ + +#define GRON 100 +#define GROFF 101 +#define CLS 102 +#define POINT 103 +#define MOVE 104 +#define DRAW 105 +#define HFILL 106 +#define VFILL 107 +#define COLOR 108 +#define STYLE 109 +#define PATERN 110 +#define INTENS 111 +#define PALETT 112 +#define BORDER 113 +#define VIDEO 114 +#define HPAGE 115 +#define NOCARD 116 +#define PUSHXY 117 +#define POPHXY 118 +#define INXPOS 119 +#define INYPOS 120 +#define INPIX 121 +#define GETMAP 122 +#define PUTMAP 123 +#define ORMAP 124 +#define XORMAP 125 +#define TRACK 126 +#define INKEY 127 +#define HASCII 128 +#define HFONT 129 +#define HFONT8 130 +#define OUTSTRING 131 +#define CIRB 132 + + +/* Standard class MOUSE mouse support + +INIT:function(output butttons:integer):boolean +SHOWCURSOR:procedure +HIDECURSOR:procedure +STATUS:procedure(output x,y:integer, l,r,c:boolean) +SETPOSITION:procedure(x, y:integer) +GETPRESS:procedure(b:integer; output x,y,p:integer, l, r, c:boolean) +GETRELEASE:procedure(b:integer; output x,y,p:integer, l, r, c:boolean) +SETWINDOW:procedure(l, r, t, b:integer) +DEFCURSOR:procedure(select, p, q:integer) +GETMOVEMENT:procedure(output x, y:integer) +SETSPEED:procedure(x, y:integer) +SETMARGINS:procedure(l, r, t, b:integer) +SETTHRESHOLD:procedure(t:integer) + +*/ + + +#define INIT 200 +#define SHOWCURSOR 201 +#define HIDECURSOR 202 +#define STATUS 203 +#define SETPOSITION 204 +#define GETPRESS 205 +#define GETRELEASE 206 +#define SETWINDOW 207 +#define DEFCURSOR 210 +#define GETMOVEMENT 211 +#define SETSPEED 215 +#define SETMARGINS 216 +#define SETTHRESHOLD 219 diff --git a/sources/int/object.c b/sources/int/object.c new file mode 100644 index 0000000..7155010 --- /dev/null +++ b/sources/int/object.c @@ -0,0 +1,195 @@ +#include "depend.h" +#include "genint.h" +#include "int.h" +#include "process.h" +#include "intproto.h" + +/* object management routines */ + + +void openrc(prot, virt, addr) /* Open new field for a record. */ +word prot; +virtaddr *virt; +word *addr; +{ + word t1; + + request(prototype[ prot ]->appetite, &t1, addr); + M[ *addr+PROTNUM ] = prot; + virt->addr = t1; + virt->mark = M[ t1+1 ]; +} /* end openrc */ + + +void slopen(prot, sladr, ah, am) +word prot; +virtaddr *sladr; +word *ah, *am; +{ + word t1, t2, virts; + + virts = thisp->prochead+M[ thisp->prochead ]+VIRTSC; + storevirt(*sladr, virts); /* preserve for compactifier */ + t1 = prototype[ prot ]->appetite; + + request(t1, ah, am); /* open field */ + + M[ *am+PROTNUM ] = prot; + t1 = *am+t1; /* LWA+1 of object */ + M[ t1+SL ] = M[ virts ]; /* prepare SL pointer */ + M[ t1+SL+1 ] = M[ virts+1 ]; + t2 = M[ display2+M[ c1+PROTNUM ] ]; /* ah of current */ + M[ t1+DL ] = t2; + M[ t1+DL+1 ] = M[ t2+1 ]; + +} /* end slopen */ + + +void openobj(prot, ah, am) +word prot; +word *ah, *am; +{ + virtaddr v1; + word t1; + + t1 = M[ display2+prototype[ prot ]->slprototype ]; + v1.addr = t1; /* ah of SL */ + v1.mark = M[ t1+1 ]; + slopen(prot, &v1, ah, am); +} /* end openobj */ + + +void newarry(low, up, kind, virt, am) /* Reserve room for array */ +word low, up, kind; +virtaddr *virt; +word *am; +{ + word ap; + + switch ((int) kind) + { + case AINT : ap = APINT; break; + case AREAL : ap = APREAL; break; + case AVIRT : ap = APREF; break; + case APROCESS : ap = APINT; break; + } + low *= ap; + up *= ap; + if (up < low) errsignal(RTEILLAB); /* illegal array bounds */ + low -= 3; + request(up-low+ap, &virt->addr, am); + M[ *am+1 ] = kind; + M[ *am+2 ] = low; + virt->mark = M[ virt->addr+1 ]; +} /* end newarry */ + + +void gkill(virt) /* Generalized killer */ +virtaddr *virt; +{ + word t1, t2, t3; + virtaddr vt; + protdescr *ptr; + message msg; + + if (isprocess(virt)) /* kill remote process */ + { + msg.control.type = KILLPR; + obj2mess( M, virt, &msg.control.receiver ); + sendmsg( &msg);/* send remote kill request */ + } + else + if (virt->mark == M[ virt->addr+1 ]) + { + t1 = M[ virt->addr ]; /* am */ + t2 = M[ t1+PROTNUM ]; + if (t2 == AINT || t2 == AREAL || t2 == AVIRT) + disp(virt); /* simple kill for array */ + else + if (t2 == FILEOBJECT) + { /* First close file if opened */ + if (M[ t1+FSTAT ] != UNKNOWN) + if (fclose(MF(t1+FFILE))) errsignal(RTEILLIO); + /* Delete file if temporary */ + if (M[ t1+FTEMP ] == LTRUE) + if (unlink(MN(t1+FNAME))) errsignal(RTEILLIO); + free(MN(t1+FNAME)); + disp(virt); + } + else /* more than array or file */ + { + ptr = prototype[ t2 ]; + if (ptr->kind == RECORD) + disp(virt); + else + { + t3 = t1; + do + { + t3 += M[ t3 ]; /* LWA of object */ + if (M[ t3+STATSL ] != 0) errsignal(RTEILLKL); + t3 = M[ t3+DL ]; /* next object in DL */ + if (t3 == 0) errsignal(RTEILLKL); + t3 = M[ t3 ]; /* am of DL */ + } while (t3 != t1); + do /* kill DL chain */ + { + t3 += M[ t3 ]; + loadvirt(vt, t3+DL); + disp(virt); + virt->addr = vt.addr; + virt->mark = vt.mark; + t3 = M[ virt->addr ]; + } while (M[ virt->addr+1 ] == virt->mark); + } + } + } +} /* end gkill */ + + +/* Copy object to a new object and locate it by fresh. + */ + +void copy(old, fresh) +virtaddr *old, *fresh; +{ + word t1, t2, t3, virts; + protdescr *ptr; + bool notrecord; + + if (M[ old->addr+1 ] != old->mark) + { /* fine copy for none */ + fresh->addr = 0; + fresh->mark = 0; /* note M[ 1 ] <> 0 */ + } + else /* not none */ + { + t1 = M[ old->addr ]; /* am of old */ + notrecord = FALSE; /* assume it is a record */ + t2 = M[ t1+PROTNUM ]; + if (t2 != AINT && t2 != AREAL && t2 != AVIRT && t2 != FILEOBJECT) + { /* if not array nor file */ + ptr = prototype[ t2 ]; + if (ptr->kind != RECORD) /* our assumption was wrong */ + { + notrecord = TRUE; + t3 = t1+M[ t1 ]+DL; + if (M[ t3 ] != old->addr || M[ t3+1 ] != old->mark) + errsignal(RTEILLCP); /* non-terminated object */ + } + } + virts = thisp->prochead+M[ thisp->prochead ]+VIRTSC; + storevirt(*old, virts); /* preserve for compactification */ + request(M[ t1 ], &t2, &t3); /* book field */ + fresh->addr = t2; /* ah */ + fresh->mark = M[ fresh->addr+1 ]; + t1 = M[ M[ virts ] ]; + for (t2 = 1; t2 < M[ t1 ]; t2++ ) + M[ t3+t2 ] = M[ t1+t2 ]; + if (notrecord) + { + storevirt(*fresh, t3+M[ t3 ]+DL); /* loop up DL */ + M[ t3+M[ t3 ]+STATSL ] = 0; /* not in any SL chain */ + } + } +} /* end copy */ diff --git a/sources/int/os2graf2.c b/sources/int/os2graf2.c new file mode 100644 index 0000000..31439bc --- /dev/null +++ b/sources/int/os2graf2.c @@ -0,0 +1,3 @@ + case INKEY : + param[ 0 ].xword = inkey(NULL); + break; diff --git a/sources/int/procaddr.c b/sources/int/procaddr.c new file mode 100644 index 0000000..058b91f --- /dev/null +++ b/sources/int/procaddr.c @@ -0,0 +1,216 @@ +#include "depend.h" +#include "genint.h" +#include "int.h" +#include "process.h" +#include "intproto.h" + +#include + +#define ldnode(addr) ((word) (addr & 0xFF)) +#define ldpix(addr) ((word) ((addr >> 8) & 0xFF)) +#define staddr(node, pix) ((word) ((pix << 8) | node)) + + +/* + These are converters from global to process pointers in memory + to global process pointers in message. + M denotes memory in which pair (pointer,object) exists or has to exist. + We want to create object denoting remote process instead of + dummy pointer without object. + The object will be like an arrayof integer of size 2. + arr[1..3] : arr[1]=node, arr[2]=pix. +*/ + +void obj2mess(M,obj,mess) + word *M; + virtaddr *obj; + procaddr *mess; +{ +#ifdef OBJECTADDR + word am; + if( obj->mark != M[obj->addr+1] ){ + mess->node=-1; + mess->pix =-1; + mess->mark=-1; + }else{ + am=M[obj->addr]; + mess->node=M[am+2]; + mess->pix =M[am+3]; + mess->mark=M[am+4]; + } +#else + mess->node=ldnode(obj->addr); + mess->pix =ldpix (obj->addr); + mess->mark=obj->mark; +#endif +} + +void mess2obj(p,mess,obj) + procdescr *p; + procaddr *mess; + virtaddr *obj; +{ + +#ifdef OBJECTADDR + + word am; + word *currM=M; + word currpix=thispix; + + extern int compactify_allowed; + compactify_allowed=0; + + transfer(p-process); + + hash_find(mess,obj); +/* + newarry(1,4,APROCESS,obj,&am); + M[am+2]=mess->node; + M[am+3]=mess->pix; + M[am+4]=mess->mark; +*/ + + transfer(currpix); + M=currM; + + compactify_allowed=1; + +#else + + obj->addr=staddr(mess->node,mess->pix); + obj->mark=mess->mark; + +#endif + +} + + + +bool isprocess(v) virtaddr *v; { + +#ifdef OBJECTADDR + + word am=M[v->addr]; +/* assert(v->mark<=M[v->addr+1]);*/ + if( v->mark!=M[v->addr+1] ) return 0; + else return ( M[am+1]==APROCESS ); + +#else + + return ( v->mark < 0 ); + +#endif + +} + + + +#ifdef OBJECTADDR + +/* hash entry is a word pointing to dictionary or 0 if empty */ + +#ifndef NO_PROTOTYPES +static int hash_check_item( word, procaddr * ); +static void hash_new_item( virtaddr *, procaddr * ); +static int hash_mess( procaddr * ); +static int hash_2( int ); +#else +static int hash_check_item(); +static void hash_new_item(); +#endif + +void hash_create(p,size) procdescr *p; int size;{ + /* create hash table for p process */ + int i; + if( p->hash!=NULL ) free( p->hash ); + p->hash_size = size; + p->hash = mallocate(size); + if( p->hash==NULL ) errsignal(RTEMEMOV); + for( i=0; ihash_size; i++ ) p->hash[i]=0; +} + + +/* find pointer in hash table, add if not exists */ + +void hash_find(mess,obj) procaddr *mess; virtaddr *obj; { + int i,first,jump; + word am; + first=hash_mess( mess ); + jump=hash_2(first); + for( i=first; thisp->hash[i]!=0; ){ + if( hash_check_item(thisp->hash[i],mess) ){ + obj->addr=thisp->hash[i]; + obj->mark=M[thisp->hash[i]+1]; + return; + } + i=(i+jump)%thisp->hash_size; + if( i==first ){ + int *curhash=thisp->hash; + int cursize=thisp->hash_size; +errsignal(RTEMEMOV); /* the rest is not debugged yet */ + thisp->hash_size = cursize*3-1; + thisp->hash = mallocate(thisp->hash_size); + if( thisp->hash==NULL ) errsignal(RTEMEMOV); + for( i=0; ihash_size; i++ ) thisp->hash[i]=0; + for( i=0; iaddr ); + return; + } + } + /* not exists yet */ + hash_new_item( obj, mess ); + thisp->hash[i]=obj->addr; +} + +void hash_set(mess,ah) procaddr *mess; word ah;{ + int i,first,jump; + word am; + first=hash_mess( mess ); + jump=hash_2(first); + for( i=first; thisp->hash[i]!=0; ){ + assert( !hash_check_item(thisp->hash[i],mess) ); + i=(i+jump)%thisp->hash_size; + if( i==first ) errsignal(RTEMEMOV); + } + /* not exists yet */ + assert( thisp->hash[i]==0 ); + thisp->hash[i]=ah; +} + +#endif + + +static int hash_check_item( ah, mess ) word ah; procaddr *mess; { + word am=M[ah]; + return ( mess->node==M[am+2] && mess->pix==M[am+3] && mess->mark==M[am+4] ); +} + +static void hash_new_item( obj, mess ) virtaddr *obj; procaddr *mess; { + word am; + newarry(1,4,APROCESS,obj,&am); + M[am+2]=mess->node; + M[am+3]=mess->pix; + M[am+4]=mess->mark; +} + +static int hash_mess( mess ) procaddr *mess;{ + word hash=mess->pix; + hash *= abs( mess->mark ); + hash += mess->node; + return hash % (thisp->hash_size); +} + +static int hash_2( hash_1 ) int hash_1;{ + return thisp->hash_size -2 - ( hash_1 % ( thisp->hash_size -2 ) ); +} + diff --git a/sources/int/process.c b/sources/int/process.c new file mode 100644 index 0000000..2c46974 --- /dev/null +++ b/sources/int/process.c @@ -0,0 +1,676 @@ +#include "depend.h" +#include "genint.h" +#include "int.h" +#include "process.h" +#include "intproto.h" + +#if DLINK +# include "dlink.h" +#elif TCPIP +# include "tcpip.h" +#endif + +#include + + +/* Process management */ + +procdescr process[ MAXPROCESS ]; /* process descriptor table */ +procdescr *thisp; /* pointer to current process descr */ +word thispix; /* current process index */ +queue ready; /* Round-Robin queue */ +bool network; /* TRUE if operating in network */ +message globmsgqueue[ MAXMSGQUEUE ]; /* queue of waiting messages */ +int msgready = 0; /* number of waiting messages */ +int msghead = 0, msgtail = 0; /* pointers to message queue */ +word ournode; /* this machine node number */ +word console; /* console node number */ +bool remote = FALSE; /* TRUE if remote node */ +bool reschedule = TRUE; /* TRUE if must re-schedule */ + + + +#ifndef NO_PROTOTYPES +static void ansprot(message *); +static void localkill(message *); +void transfer(word); +static void backcreate(message *); +static void createprocess(message *); +static void localerror(message *); +static void killprocess(word); +static void mkglobal(word); +word pix, ref; +#else +static void ansprot(); +static void localkill(); +void transfer(); +static void backcreate(); +static void createprocess(); +static void localerror(); +static void killprocess(); +static void mkglobal(); +#endif + + + +#if OS2 +PGINFOSEG ginf; /* pointer to Global Info Segment */ +#endif + + +#if USE_ALARM +# include +# ifndef NO_PROTOTYPES + static void signal_catch( void ); +# else + static void signal_catch(); +# endif + static void signal_catch(){ reschedule=TRUE; } +#endif + + +void init_scheduler(){ +#if USE_ALARM + signal(SIGALRM,signal_catch); + alarm(1); +#endif +} + +void schedule() /* Choose next ready process to exec */ +{ /* STRONGLY machine dependent */ +#if USE_ALARM + if(reschedule){ + alarm(0); + signal(SIGALRM,signal_catch); + alarm(1); +#elif USE_CLOCK + static char last; + char c; + c = clock() >> 5; /* the most expensive method */ + if (reschedule || c != last) /* context switch is needed */ + { + last = c; +#elif MSDOS && ( WORD_16BIT || DWORD_16BIT ) /* DOS real memory model */ + static char last; + char c; + static char *clk = (char *) 0x0040006CL; + c = *clk >> 1; + if (reschedule || c != last) /* context switch is needed */ + { + last = c; +#elif OS2 + static char last; + char c; + c = ginf->hundredths >> 3; + if (reschedule || c != last) /* context switch is needed */ + { + last = c; +#else +#error Scheduler time counting method not implemented ! +#endif + +#if TCPIP + while (qempty(ready)){ /* wait for event if no processes */ + tcpip_poll( -1 ); /* wait for message until arrives */ + trapmsg(); + } +#else + while (qempty(ready)) /* wait for event if no processes */ + trapmsg(); +#endif + ready = qrotate(ready); /* find another ready process */ + transfer(pfront(ready)); /* transfer control to it */ + reschedule = FALSE; + } +} + + +void transfer(pix) /* Context switch to another process */ +word pix; +{ + word apt; + + if (pix == thispix) return; /* optimized for case of one process */ + + if( thisp != NULL ) /* previous process is alive */ + { + thisp->ic = ic; /* store previous context */ + thisp->c1 = c1; + thisp->c2 = c2; + } + + thispix = pix; /* and load new context */ + thisp = &process[ thispix ]; + ic = thisp->ic; + c1 = thisp->c1; + c2 = thisp->c2; + M = thisp->M; + param = thisp->param; + apt = thisp->prochead+M[ thisp->prochead ]; + display = apt+dispoff; + display2 = apt+disp2off; +} + + +void activate(pix) /* Resume process on this node */ +word pix; +{ + process[ pix ].status = EXECUTING; /* flag process as ready to execute */ + ready = pinsert(ready, pix); /* insert into ready queue */ + reschedule = TRUE; /* force context switch */ +# ifdef RPCDBG + fprintf(stderr,"activate process %d\n",pix); +# endif +} + + +void passivate(newstatus) /* Passivate process */ +int newstatus; +{ + thisp->status = newstatus; /* change to some wait status */ + ready = qremove(ready); /* remove from ready queue */ + reschedule = TRUE; /* force context switch */ +# ifdef RPCDBG + fprintf(stderr,"passivate process %d to state %d\n",thispix,newstatus); +# endif +} + + +/* Copy parameters from object to message or vice versa. */ + + +void moveparams(pix, am, msg, par1, dir) + word pix, am; + message *msg; + int par1, dir; +{ + protdescr *ptr; + procdescr *p; + word i, tpd, ap, pd, prim, offset; + char *cp; + bool cflag, convert; + + p = &process[ pix ]; + ptr = prototype[ p->M[ am+PROTNUM ] ]; + cp = (char *) msg->params; + + for (i = 0; i < ptr->lthparlist; i++) /* loop through parameters */ + { + + offset = M[ ptr->parlist+i ]; + tpd = M[ ptr->pfdescr+i ]; /* type description of param */ + pd = M[ tpd ]; + + if (par1 == PARIN) + cflag = ( pd==PARIN || pd==PARINOUT || pd==FORMFUNC || pd==FORMPROC ); + else + cflag = ( pd==PAROUT || pd==PARINOUT ); + + if (cflag) + { + if (pd == FORMFUNC || pd == FORMPROC) + { + ap = APFMPROC; + convert = TRUE; + } + else + if (M[ M[ tpd+2 ] ] == CLASSTYPE) + { + ap = APREF; + convert = TRUE; + } + else + { + prim = M[ tpd+2 ]-ipradr; + ap = primapet[ prim ]; + convert = (prim == 4 || prim == 5); /* process or coroutine */ + } + + ap *= sizeof(word); /* param appetite in bytes */ + + switch (dir) /* copy parameter in right direction */ + { + + case LOADPAR : + + /* we always load parameters from OUR process */ + assert(pix==thispix); + + if (convert){ + procaddr pa; + { + word ah=M[am+offset]; + if( !isprocess((virtaddr*)(M+am+offset)) && + M[ ah+1 ] == M[ am+offset+1 ] + ) + if (prototype[ M[ M[ ah ]+PROTNUM ] ]->kind == PROCESS) + { + pa.node = ournode; + pa.pix = pix; + pa.mark = thisp->mark; + } + else + /*pat errsignal(RTENONGL); */ /* only process may be global */ + /*pat*/ obj2mess(p->M,(virtaddr*)(p->M+am+offset),&pa); + else + obj2mess(M,(virtaddr*)(M+am+offset),&pa); + } +/* + mkglobal(am+offset); + obj2mess(p->M,(virtaddr*)(p->M+am+offset),&pa); +*/ + moveblock((char *)&pa, cp, ap=sizeof(procaddr)); + }else + moveblock((char *) &p->M[ am+offset ], cp, ap); + break; + + + case SAVEPAR : + + if (convert){ + procaddr pa; + ap=sizeof(procaddr); + moveblock(cp,(char *)&pa, ap); + mess2obj(p,&pa,(virtaddr*)(p->M+am+offset)); + }else + moveblock(cp, (char *) &p->M[ am+offset ], ap); + break; + + } + + cp += ap; + assert(cp-msg->params <= sizeof(msg->params)); + } + } +} + + +word getnode(am) /* Determine node number for process */ +word am; +{ + protdescr *ptr; + word p; + int i; + + p = prototype[ M[ am+PROTNUM ] ]->preflist; + while (prototype[ M[ p ] ]->kind != PROCESS) p++; + ptr = prototype[ M[ p ] ]; + if (ptr->lthpreflist == 1) i = 0; + else i = prototype[ M[ p-1 ] ]->lthparlist; + return (M[ am+M[ ptr->parlist+i ] ]); +} + + +void resume(virt) /* Perform RESUME instruction */ +virtaddr *virt; +{ + message msg; + + if (isprocess(virt)) /* is it process realy ? */ + { + msg.control.type = RESUME; + obj2mess( M, virt, &msg.control.receiver ); + sendmsg( &msg); /* request remote resume */ + } + else errsignal(RTEILLRS); /* illegal RESUME */ +} + + +static void createprocess(msg) /* Create new process */ +message *msg; +{ + word i, prot; + + for (i = 0; i < MAXPROCESS; i++) /* find unused process descr. */ + if (!process[ i ].used && process[ i ].mark != -MAXMARKER) break; + if (i == MAXPROCESS) senderr(RTETMPRC, &(msg->control.sender) ); + if (process[ i ].M == NULL) /* memory not allocated yet */ + { + process[ i ].M = mallocate(memorysize+1); + if (process[ i ].M == NULL) senderr(RTEMEMOV, &msg->control.sender); + moveblock((char *) process[ 0 ].M, (char *) process[ i ].M, + freem * sizeof(word)); + } + prot = msg->control.par; /* process prototype number */ + initprocess(i, prot, &msg->control.sender); + moveparams(i, process[ i ].prochead, msg, PARIN, SAVEPAR); + process[ i ].status = GENERATING; /* execute process until RETURN */ + ready = pinsert(ready, i); + reschedule = TRUE; +} + + +static void killprocess(pix) /* Release process descriptor */ +word pix; +{ + qfree(process[ pix ].msgqueue); + qfree(process[ pix ].rpcwait); + sfree(process[ pix ].rpcmask); + + process[ pix ].used = FALSE; /* mark descriptor as unused */ + process[ pix ].mark--; /* decrement marker */ + + if( pix == thispix ) + { + thispix = -1; + thisp = NULL; + } +} + + +static void localkill(msg) +message *msg; +{ + word pix; + + pix = msg->control.receiver.pix; + +# if RPCDBG + fprintf( stderr, "kill process %d\n", pix ); +# endif + + if (process[ pix ].mark == msg->control.receiver.mark) /* not none */ + { + if (process[ pix ].status != STOPPED) /* is process suspended ? */ + senderr(RTEILLKL, &msg->control.sender); + killprocess(pix); + } +} + + +void endprocess(status) /* Terminate current process */ +int status; +{ + int i; + + passivate(STOPPED); +# if RPCDBG + fprintf( stderr, "terminate process %d\n", thispix ); +# endif + killprocess(thispix); + if( ournode != console ) longjmp(contenv, 1); + for (i = 0; i < MAXPROCESS; i++) + if (process[ i ].used) longjmp(contenv, 1); + endrun(status); +} + + +static void backcreate(msg) +message *msg; +{ + word pix, am; + procdescr *p; + + pix = msg->control.receiver.pix; + p = &process[ pix ]; + + am = p->M[ p->template.addr ]; /* template physical address */ + p->M[ temporary ] = am; + moveparams(pix, am, msg, PAROUT, SAVEPAR); + + /*store new process address */ + mess2obj(p,&(msg->control.sender),&(p->backobj)); + + activate(pix); /* end of waiting for NEW */ +} + + +void senderr(exception, virt) +int exception; +procaddr *virt; +{ + message msg; + + msg.control.type = ERRSIG; + msg.control.receiver=*virt; + msg.control.par = exception; + sendmsg(&msg); /* send error message */ + longjmp(contenv, 1); /* continue from next instruction */ +} + + +static void localerror(msg) +message *msg; +{ + word pix; + int s; + + pix = msg->control.receiver.pix; + s = process[ pix ].status; + if (process[ pix ].mark == msg->control.receiver.mark && s != STOPPED) + { + if (s == WAITFORNEW || s == WAITFORRPC) activate(pix); + while (pfront(ready) != pix) + ready = qrotate(ready); + transfer(pfront(ready)); + errsignal(msg->control.par); + } +} + + +void askprot(virt) /* Ask for prototype of object */ +virtaddr *virt; +{ + word am; + message msg; + + if (isprocess(virt)) /* send question to remote process */ + { + obj2mess( M, virt, &msg.control.receiver ); + msg.control.type = ASKPRO; + sendmsg( &msg ); + passivate(WAITASKPRO); + } + else + { + if (member(virt, &am)) + M[ temporary ] = M[ am+PROTNUM ]; + else errsignal(RTEREFTN); + } +} + + +static void ansprot(msg) /* Answer with prototype of process */ +message *msg; +{ + message msg1; + word pix; + + pix = msg->control.receiver.pix; + if (process[ pix ].mark == msg->control.receiver.mark) /* not none */ + { + msg1.control.receiver = msg->control.sender; + msg1.control.type = PROACK; + msg1.control.par = process[ pix ].prot; + sendmsg( &msg1 ); + } + else senderr(RTEREFTN, &msg->control.sender); +} + + +/* Message send/receive handling : */ + +void msginterrupt(msg) /* Receive message interrupt handler */ + message *msg; +{ + moveblock((char *)msg, (char *)&globmsgqueue[ msgtail ], + (word) sizeof(message)); + msgtail = (msgtail+1) % MAXMSGQUEUE; + msgready++; +#if DLINK + if (msgready < MAXMSGQUEUE-1) /* leave one place for own message */ + net_attention(); +#endif +} + + +void sendmsg(msg) /* Send message via net */ +message *msg; +{ + msg->control.sender.node = ournode; + msg->control.sender.pix = thispix; + msg->control.sender.mark = thisp->mark; + if( + msg->control.receiver.node == ournode + || + msg->control.receiver.node == 0 + ) + /* simulate receive message interrupt */ + { +#if DLINK + net_ignore(); /* disable attention */ +#endif + msg->control.receiver.node == ournode; + msginterrupt(msg); /* call directly interrupt handler */ + } + else + { +#if DLINK + if (!network) errsignal(RTEINVND); /* send message by net */ + while (net_send((int) msg->control.receiver.node, msg)) ; +#elif TCPIP + if (!network) errsignal(RTEINVND); /* send message by net */ + tcpip_send( msg ); +#else + errsignal(RTEINVND); +#endif + } +} + + +void trapmsg() /* Check for waiting message */ +{ + message *msg; + procdescr *p; + word pix; + +#if TCPIP + /* check for message on TCPIP socket & move to queue */ + if (msgready < MAXMSGQUEUE-1) /* there is place for new message */ + if( tcpip_poll( 0 ) ) /* check for message */ + if ( tcpip_recv( globmsgqueue + msgtail ) ){ + msgtail = (msgtail+1) % MAXMSGQUEUE; + msgready++; + } +#endif + + if (msgready > 0) /* at least one message is waiting */ + { +#if DLINK + net_ignore(); /* disable attention for a moment */ +#endif + msg = &globmsgqueue[ msghead ]; /* get first message from queue */ + msghead = (msghead+1) % MAXMSGQUEUE; + switch(msg->control.type) + { + case ERRSIG : + localerror(msg); + break; + + case RESUME : + pix = msg->control.receiver.pix; + if (process[ pix ].mark != msg->control.receiver.mark) + senderr(RTEREFTN, &msg->control.sender); + if (process[ pix ].status != STOPPED) + senderr(RTEILLRS, &msg->control.sender); + activate(pix); + break; + + case CREATE : + createprocess(msg); + break; + + case CREACK : + backcreate(msg); + break; + + case KILLPR : + localkill(msg); + break; + + case RPCALL : + rpc1(msg); + break; + + case RPCACK : + rpcend(msg); + break; + + case ASKPRO : + ansprot(msg); + break; + + case PROACK : + pix = msg->control.receiver.pix; + p = &process[ pix ]; + p->M[ temporary ] = msg->control.par; + activate(pix); + break; + + default : + fprintf( stderr, " Invalid message\n" ); + senderr(RTESYSER, &msg->control.sender); + } + msgready--; +#if DLINK + if (msgready < MAXMSGQUEUE-1) /* leave one place for own message */ + net_attention(); /* attention back on */ +#endif + } +} + + +static void mkglobal(ref) /* Make global a process reference */ + word ref; +{ + word ah; + ah = M[ ref ]; + if (!isprocess((virtaddr*)(M+ref)) && M[ ah+1 ] == M[ ref+1 ]) + if (prototype[ M[ M[ ah ]+PROTNUM ] ]->kind == PROCESS) + { + virtaddr va; + procaddr pa; + pa.node = ournode; + pa.pix = pix; + pa.mark = thisp->mark; + mess2obj(thisp,&pa,&va); + M[ ref ] = va.addr; + M[ ref+1 ] = va.mark; +#ifdef RPCDBG +fprintf(stderr,"mkglobal REAL (thisp=%d) isprocess:node=%d pix=%d mark=%d\n",thispix,pa.node,pa.pix,pa.mark);fflush(stderr); +#endif + } + else errsignal(RTENONGL); /* only process may be global */ +} + + + +/* +void show_m( char *s, message *msg ){ + char *n; + switch(msg->control.type) + { + case ERRSIG : n = "ERRSIG"; break; + case RESUME : n = "RESUME"; break; + case CREATE : n = "CREATE"; break; + case CREACK : n = "CREACK"; break; + case KILLPR : n = "KILLPR"; break; + case RPCALL : n = "RPCALL"; break; + case RPCACK : n = "RPCACK"; break; + case ASKPRO : n = "ASKPRO"; break; + case PROACK : n = "PROACK"; break; + default : n = "??????"; break; + } + printf( "message %s type %s from %d:%d:%d to %d:%d:%d\n", + s, n, + msg->control.sender.node, + msg->control.sender.pix, + msg->control.sender.mark, + msg->control.receiver.node, + msg->control.receiver.pix, + msg->control.receiver.mark + ); + fflush( stdout ); +} +*/ + diff --git a/sources/int/process.h b/sources/int/process.h new file mode 100644 index 0000000..08b1801 --- /dev/null +++ b/sources/int/process.h @@ -0,0 +1,137 @@ +#include "queue.h" + + +/* Process management definitions : */ + +#define MAXPROCESS 64 /* maximum number of processes on one node */ +#define MAXMSGQUEUE 16 /* maximum number of waiting messages */ + +#if DLINK +#define MSGLENGTH 80 /* message length defined by D-Link driver */ +#elif TCPIP +#define MSGLENGTH 256 /* message length defined by me (PS) */ +#else +#define MSGLENGTH 256 /* message length defined by me (PS) */ +#endif + + +/* Process state : */ + +#define GENERATING 0 /* during generation of process object */ +#define STOPPED 1 /* non-active process (suspended by STOP) */ +#define EXECUTING 2 /* active process (ready to execute) */ +#define WAITFORNEW 3 /* waiting for NEW of another process */ +#define WAITFORRPC 4 /* waiting for remote procedure call */ +#define ACCEPTING 5 /* during execution of ACCEPT statement */ +#define WAITASKPRO 6 /* waiting for process prototype */ + +/* Process descriptor : */ + +typedef struct +{ + bool used; /* TRUE if in use by some process */ + word mark; /* process mark for proper detecting of none */ + int status; /* process state */ + word prot; /* process prototype number */ + memory M; /* pointer to memory array */ + union value param[ MAXPARAM ]; + word ic; /* instruction counter */ + word trlnumber; /* trace line number */ + word lower; /* first word of object area */ + word upper; /* last word in memory */ + word lastused; /* last word used by objects */ + word lastitem; /* first word used by dictionary */ + word freeitem; /* head of free dictionary item list */ + word headk; /* head of killed object list for size > 2 */ + word headk2; /* head of killed object list for size = 2 */ + word prochead; /* am of process object */ + virtaddr procref; /* process object virtual address */ + virtaddr template; /* remote process or procedure template */ + word c1, c2; /* pointers to current object */ + virtaddr backobj; /* adress of object just left */ + word blck1, blck2; /* used for LBLOCK1, LBLOCK2, LBLOCK3 */ + queue msgqueue; /* queue of messages for this process */ + queue rpcwait; /* queue of disabled RPC messages */ + stack rpcmask; /* stack of set of enabled remote procedures */ + bool force_compactification; /* next allocate will forace compact... */ + word *hash; /* table of pointers to processes in process */ + word hash_size; +} procdescr; + + +/* Message type : */ + +#define ERRSIG 0 /* error signal */ +#define RESUME 1 /* resume request */ +#define CREATE 2 /* create new process request */ +#define CREACK 3 /* create process acknowledge */ +#define KILLPR 4 /* kill process */ +#define RPCALL 5 /* remote procedure call request */ +#define RPCACK 6 /* remote procedure return */ +#define ASKPRO 7 /* ask for process prototype */ +#define PROACK 8 /* answer with process prototype */ + +typedef struct { + word node; + word pix; + word mark; +} procaddr; + +struct ctrlmsg +{ + procaddr sender; /* address of the sender and */ + procaddr receiver; /* receiver of the message */ + int type; /* message type */ + int par; /* prototype or error signal number */ +}; + +#define MAXPROCPAR (MSGLENGTH-sizeof(struct ctrlmsg)) + +typedef struct +{ + struct ctrlmsg control; + char params[ MAXPROCPAR ]; +} message; + +/* Direction of copying of parameters (for moveparams()) : */ + +#define LOADPAR 0 +#define SAVEPAR 1 + +typedef char *mask; + +extern procdescr process[]; /* process descriptor table */ +extern procdescr *thisp; /* pointer to current process descriptor */ +extern word thispix; /* current process index */ +extern queue ready; /* Round-Robin queue of ready processes */ +extern bool network; /* TRUE if operating in D-Link network */ +extern message globmsgqueue[]; /* queue of waiting messages */ +extern int msgready; /* number of waiting messages */ +extern int msghead, msgtail; /* pointers to message queue */ +extern word ournode; /* this machine node number */ +extern word console; /* console node number */ +extern bool remote; /* TRUE if remote node */ +extern bool reschedule; /* TRUE if rescheduling is mandatory */ + +#if OS2 +extern PGINFOSEG ginf; /* pointer to Global Info Segment */ +#endif + + + +#ifndef NO_PROTOTYPES +void obj2mess(word *,virtaddr *,procaddr*); +void mess2obj(procdescr *,procaddr *,virtaddr*); +bool isprocess(virtaddr *); +void hash_find(procaddr *,virtaddr *); +void hash_create(procdescr *,int); +void hash_set(procaddr *,word); +#else +void obj2mess(); +void mess2obj(); +bool isprocess(); +void hash_find(); +void hash_create(); +void hash_set(); +#endif + diff --git a/sources/int/queue.c b/sources/int/queue.c new file mode 100644 index 0000000..c256d5c --- /dev/null +++ b/sources/int/queue.c @@ -0,0 +1,112 @@ +#include "depend.h" +#include "genint.h" +#include "int.h" +#include "process.h" +#include "intproto.h" + + +/* Queue management */ +/* Single linked circular lists with queue represented as pointer to rear */ + +queue qinit() /* Initialize empty queue */ +{ + return (NULL); +} /* end qinit */ + + +stack push(q, e) /* Insert element into the queue */ +stack q; +selem e; +{ + stack p; + + p = (stack) ballocate(sizeof(struct queuelem)); + if (p == NULL) errsignal(RTEMEMOV); + p->elem = e; + if (q == NULL) + { + p->next = p; /* the lonely element of the queue */ + q = p; + } + else + { + p->next = q->next; /* insert at rear */ + q->next = p; + } + return(q); +} /* end push */ + + +qelem qfront(q) /* Get first element of the queue */ +queue q; +{ + if (qempty(q)){ + fprintf( stderr, "getting first element from empty queue\n"); + errsignal(RTESYSER); + } + return (q->next->elem); +} /* end qfront */ + + +queue qremove(q) /* Remove front element from the queue */ +queue q; +{ + queue p; + + if (qempty(q)){ + fprintf( stderr, "removing first element from empty queue\n"); + errsignal(RTESYSER); + } + p = q->next; + q->next = q->next->next; + if (p == q) q = NULL; /* removing last element of the queue */ + free(p); + return(q); +} /* end qremove */ + + +queue qdelete(q, e) /* Delete arbitrary element */ +queue q; +qelem e; +{ + queue p, r, s; + + if (qempty(q)) return(q); + r = q; + p = r->next; + while (p->elem != e) + { + if (p == q) return(q); + r = p; + p = p->next; + } + r->next = p->next; + if (r == p) s = NULL; + else + if (p == q) s = r; + else s = q; + free(p); + return(s); +} /* end qdelete */ + + +queue qrotate(q) /* Remove front and insert at rear */ +queue q; +{ + if (qempty(q)){ + fprintf( stderr, "rotating empty queue\n"); + errsignal(RTESYSER); + } + return (q->next); +} /* end qrotate */ + + +void qfree(q) +queue q; +{ + while (!qempty(q)) + { + free(qfront(q)); + q = qremove(q); + } +} /* end qfree */ diff --git a/sources/int/queue.h b/sources/int/queue.h new file mode 100644 index 0000000..67af654 --- /dev/null +++ b/sources/int/queue.h @@ -0,0 +1,40 @@ +/* Header for queue management module */ + +typedef lword qelem; +typedef qelem selem; +struct queuelem { qelem elem; + struct queuelem *next; + }; +typedef struct queuelem *queue; +typedef queue stack; + +#ifndef NO_PROTOTYPES +queue qinit(void); +stack push(stack,selem); +qelem qfront(queue); +queue qremove(queue); +queue qdelete(queue,qelem); +queue qrotate(queue); +void qfree(queue); +#else +queue qinit(); +stack push(); +qelem qfront(); +queue qremove(); +queue qdelete(); +queue qrotate(); +void qfree(); +#endif + +#define qinsert(q, e) (((queue) push((stack) (q), (selem) (e)))->next) +#define qempty(q) ((q) == NULL) +#define pinsert(q, p) (qinsert(q, (qelem) (p))) +#define pfront(q) ((word) qfront(q)) +#define minsert(q, m) (qinsert(q, (qelem) (m))) +#define mfront(q) ((message *) qfront(q)) +#define mdelete(q, m) (qdelete(q, (qelem) (m))) +#define mpush(q, m) ((queue) push((stack) q, (selem) m)) +#define sfree(s) qfree((queue) s) +#define sinit qinit +#define pop(s) ((stack) qremove((queue) s)) +#define top(s) ((selem) qfront((queue) s)) diff --git a/sources/int/rm.bat b/sources/int/rm.bat new file mode 100644 index 0000000..25b506f --- /dev/null +++ b/sources/int/rm.bat @@ -0,0 +1,9 @@ +@echo off +:begin +if "%1" == "" goto :end +echo %1 +del %1 +shift +goto :begin +:end + diff --git a/sources/int/rpcall.c b/sources/int/rpcall.c new file mode 100644 index 0000000..006d55f --- /dev/null +++ b/sources/int/rpcall.c @@ -0,0 +1,266 @@ +#include "depend.h" +#include "genint.h" +#include "int.h" +#include "process.h" +#include "intproto.h" + + +#ifndef NO_PROTOTYPES +static bool isenabled(word,word); +static bool rpcready(word); +static void bitaccess(word,word,int *,char *); +static void dupmask(word); +#else +static bool isenabled(); +static bool rpcready(); +static void bitaccess(); +static void dupmask(); +#endif + + +void rpc1(msg) /* preprocess RPC request */ +message *msg; +{ + word pix, prot; + procdescr *p; + message *msg1; + + pix = msg->control.receiver.pix; + p = &process[ pix ]; + if (p->mark != msg->control.receiver.mark) + senderr(RTEREFTN, &msg->control.sender); + msg1 = (message *) ballocate(sizeof(message)); + if (msg1 == NULL) errsignal(RTEMEMOV); + moveblock((char *) msg, (char *) msg1, (word) sizeof(message)); + prot = msg->control.par; + if (isenabled(pix, prot)) + { + p->msgqueue = minsert(p->msgqueue, msg1); + if (p->status == ACCEPTING) activate(pix); + } + else p->rpcwait = minsert(p->rpcwait, msg1); +} + + +void rpc2() +{ + if (rpcready(thispix)) rpc3(); +} + + +void rpc3() /* Actual remote procedure call */ +{ + word prot, ah, am; + message *msg; + + msg = mfront(thisp->msgqueue); /* remove first RPC message (enabled) */ +# ifdef RPCDBG + fprintf( + stderr, "rpc(thisp=%d) from: node=%d, pix=%d, mark=%d\n", + thispix, + msg->control.sender.node, + msg->control.sender.pix, + msg->control.sender.mark + ); +# endif + thisp->msgqueue = qremove(thisp->msgqueue); + pushmask(thispix); /* disable all procedures */ + prot = msg->control.par; + + slopen(prot, &thisp->procref, &ah, &am); /* open procedure object */ + + { + virtaddr v; + mess2obj( thisp, &(msg->control.sender), &v ); + storevirt( v, am+M[ am ]+RPCDL ); /* set up remote DL */ + } + + moveparams(thispix, am, msg, PARIN, SAVEPAR); + + go(ah, am); /* transfer control to procedure */ + + free(msg); + +} + + +void rpcend(msg) /* After return from RPC */ +message *msg; +{ + word pix, am; + procdescr *p; + + pix = msg->control.receiver.pix; +#ifdef RPCDBG +fprintf(stderr,"activate after rpc(thisp=%d)\n",pix);fflush(stderr); +#endif + p = &process[ pix ]; + am = p->M[ temporary ]; /* template physical address */ + moveparams(pix, am, msg, PAROUT, SAVEPAR); + activate(pix); /* resume process waiting for RPC */ +} + + +static void bitaccess(pix, prot, bytenr, bitmask) +word pix, prot; +int *bytenr; +char *bitmask; +{ + int bitnr; + + bitnr = prot-prototype[ process[ pix ].prot ]->maskbase; + *bytenr = bitnr / 8; + *bitmask = (char)(unsigned char)( 1 << (bitnr % 8) ); +} + + +void enable(pix, prot) /* Enable remote procedure */ +word pix, prot; +{ + mask m; + int bytenr; + char bitmask; + + m = top(process[ pix ].rpcmask); + bitaccess(pix, prot, &bytenr, &bitmask); + m[ bytenr ] |= bitmask; +} + + +void disable(pix, prot) /* Disable remote procedure */ +word pix, prot; +{ + mask m; + int bytenr; + char bitmask; + + m = top(process[ pix ].rpcmask); + bitaccess(pix, prot, &bytenr, &bitmask); + m[ bytenr ] &= ~ bitmask; +} + + +static bool isenabled(pix, prot) /* Check if RPC allowed */ +word pix, prot; +{ + mask m; + int bytenr; + char bitmask; + + m = top(process[ pix ].rpcmask); + bitaccess(pix, prot, &bytenr, &bitmask); + return( m[ bytenr ] & bitmask ); +} + + +void pushmask(pix) /* Push empty RPC mask onto stack */ +word pix; +{ + mask m; + int i, size; + + size = prototype[ process[ pix ].prot ]->masksize; + m = (mask) ballocate(size); + if (m == NULL) errsignal(RTEMEMOV); + for (i = 0; i < size; i++ ) m[ i ] = '\0'; /* disable all */ + process[ pix ].rpcmask = push(process[ pix ].rpcmask, m); +} + + +static void dupmask(pix) /* Duplicate RPC mask from stack top */ +word pix; +{ + mask m; + int size; + + size = prototype[ process[ pix ].prot ]->masksize; + m = (mask) ballocate(size); + if (m == NULL) errsignal(RTEMEMOV); + moveblock(top(process[ pix ].rpcmask), m, (word) size); + process[ pix ].rpcmask = push(process[ pix ].rpcmask, m); +} + + +void popmask(pix) /* Pop RPC mask from stack (restore) */ +word pix; +{ + mask m; + + m = top(process[ pix ].rpcmask); + process[ pix ].rpcmask = pop(process[ pix ].rpcmask); + free((char *) m); +} + + +void evaluaterpc(pix) /* Check if any waiting RPC is enabled */ +word pix; +{ + queue q; + message *msg; + + q = process[ pix ].rpcwait; + if (!qempty(q)) + { + do + { + msg = mfront(q); + if (isenabled(pix, msg->control.par)) + { + process[ pix ].msgqueue = mpush(process[ pix ].msgqueue, msg); + process[ pix ].rpcwait = mdelete(process[ pix ].rpcwait, msg); + return; + } + q = qrotate(q); + } while (q != process[ pix ].rpcwait); + } +} + + +void rpc_accept(length) /* Accept remote procedure call */ +word length; +{ + int i; + + dupmask(thispix); + for (i = 0; i < length; i++) + enable(thispix, virtprot(M[ ic++ ])); + evaluaterpc(thispix); + if (!rpcready(thispix)) + passivate(ACCEPTING); +} + + +static bool rpcready(pix) +word pix; +{ + procdescr *p; + message *msg; + word prot; + + p = &process[ pix ]; + while (!qempty(p->msgqueue)) + { + msg = mfront(p->msgqueue); + prot = msg->control.par; + if (isenabled(pix, prot)) return(TRUE); + p->msgqueue = qremove(p->msgqueue); + p->rpcwait = minsert(p->rpcwait, msg); + } + return(FALSE); +} + + +word virtprot(prot) /* Get actual prototype for virtual */ +word prot; +{ + bool sign; + word virtnr; + + sign = (prot < 0); + prot = absolute(prot); + virtnr = prototype[ prot ]->virtnumber; + if (virtnr != -1) prot = M[ prototype[ thisp->prot ]->virtlist+virtnr ]; + if (sign) return(-prot); else return(prot); +} + + diff --git a/sources/int/runsys.c b/sources/int/runsys.c new file mode 100644 index 0000000..bbf22fc --- /dev/null +++ b/sources/int/runsys.c @@ -0,0 +1,281 @@ + /* Loglan82 Compiler&Interpreter + Copyright (C) 1981-1993 Institute of Informatics, University of Warsaw + Copyright (C) 1993, 1994 LITA, Pau + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + contacts: Andrzej.Salwicki@univ-pau.fr + +or Andrzej Salwicki + LITA Departement d'Informatique + Universite de Pau + Avenue de l'Universite + 64000 Pau FRANCE + tel. ++33 59923154 fax. ++33 59841696 + +======================================================================= +*/ + +#include "depend.h" +#include "genint.h" +#include "int.h" +#include "process.h" +#include "intproto.h" + + +/* Initialize memory structures for objects, main object and a few goodies + * more. + */ + +void runsys() +{ + word apt, i; + procaddr father; + + for (i = 0; i < MAXPROCESS; i++ ) /* initialize process descriptors */ + { + process[ i ].used = FALSE; /* not used */ + process[ i ].mark = -1; /* initial mark for processes */ + process[ i ].M = NULL; /* memory not allocated */ + process[ i ].hash = NULL; + } + process[ 0 ].M = M; /* always contains code */ + dispoff = VIRTSC-(lastprot+1); /* DISPLAY offset in process object */ + disp2off = dispoff-(lastprot+1); /* indirect DISPLAY offset */ + ready = qinit(); /* initialize Round-Robin queue */ + ranset(); /* init pseudo-random no. generator */ + +#if OS2 + { + SEL gsel, lsel; + DosGetInfoSeg(&gsel, &lsel); + ginf = MAKEPGINFOSEG(gsel); + } +#endif + + if (!remote) /* create main process */ + { + father.node = 0; /* dummy DL for generated process */ + father.pix = 0; + father.mark = 0; + thispix = 0; /* current process index */ + thisp = &process[ thispix ]; /* current process descr pointer */ + initprocess((word) 0, (word) MAINBLOCK, &father); + mainprog = thisp->prochead; /* am of main */ + c1 = thisp->c1; /* pointers to current object */ + c2 = thisp->c2; + ic = thisp->ic; /* instruction counter */ + param = thisp->param; /* parameter vector */ + apt = mainprog+M[ mainprog ]; /* LWA+1 of main */ + display = apt+dispoff; /* DISPLAY in main */ + display2 = apt+disp2off; /* indirect DISPLAY in main */ + mnoff = 2; /* offset of variable mainprog */ + storevirt(thisp->procref, mainprog+mnoff); /* init variable main */ + M[ apt+STATSL ]++; /* flag main included in SL chain */ + thisp->status = STOPPED; + activate(thispix); /* activate main process */ + } + else /* remote */ + { + thispix = 1; /* a dirty trick: set junk current */ + thisp = &process[ thispix ]; /* process for first transfer() */ + } /* (must save 'context' somewhere) */ +#if DLINK + net_attention(); +#endif +} + + +void initprocess(pix, prot, father) /* Initialize process descriptor */ +word pix, prot; +procaddr *father; +{ + procdescr *p; + protdescr *ptr; + word i, j, ah, am, apt; + +#ifdef RPCDBG +fprintf(stderr,"new process(n,p,m) (%d,%d,%d)",0,pix,process[pix].mark); +fprintf(stderr," from (%d,%d,%d)\n",father->node,father->pix,father->mark); +#endif + + p = &process[ pix ]; +#ifdef OBJECTADDR + hash_create(p,119); +#endif + p->used = TRUE; /* process descriptor is used */ + p->prot = prot; /* prototype number */ + p->freeitem = 0; /* null list of free dictionary items */ + p->upper = memorysize-1; /* highest memory address */ + p->lower = freem; /* lowest address for data */ + p->headk = p->lower; /* head of killed objects list */ + p->M[ p->headk ] = MAXAPPT; /* maximum appetite sentinel */ + p->headk2 = 0; + ah = p->upper-1; /* dict. item for process itself */ + p->lastitem = ah; /* first word used by dictionary */ + ptr = prototype[ prot ]; + if (p->upper - p->lower - ptr->appetite < 512) + if (prot == MAINBLOCK) + abend("Memory size too small (use /m option)\n"); + else errsignal(RTEMEMOV); + + /* generate process object */ + p->lastused = p->lower+ptr->appetite; + am = p->lower+1; + p->M[ am ] = ptr->appetite; + p->M[ am+PROTNUM ] = prot; + for (i = PROTNUM+1; i < ptr->appetite; i++) + p->M[ am+i ] = 0; + p->M[ ah ] = am; + p->M[ ah+1 ] = 0; + p->prochead = am; + p->procref.addr = ah; + p->procref.mark = 0; + p->c1 = am; /* initialize current object ptrs */ + p->c2 = am+ptr->span; + apt = am+ptr->appetite; + p->M[ apt+CHD ] = ah; /* initialize coroutine head ptr */ + p->M[ apt+CHD+1 ] = 0; + p->M[ apt+SL ] = DUMMY; /* dummy SL for process */ + p->M[ 1 ] = 1; /* absolute none */ + for (i = MAINBLOCK; i <= lastprot; i++) /* initialize DISPLAY */ + p->M[ apt+dispoff+i ] = 0; + p->M[ apt+disp2off+MAINBLOCK ] = DUMMY; /* dummmy entry for MAIN */ + j = ptr->preflist; /* set DISPLAY entries for process */ + + for (i = j+ptr->lthpreflist-1; i >= j; i--) + { + p->M[ apt+dispoff+M[ i ] ] = am; /* physical address */ + p->M[ apt+disp2off+M[ i ] ] = ah; /* indirect address */ + } + + { + virtaddr v; + mess2obj( p, father, &v ); + p->M[ apt+DL ] = v.addr; + p->M[ apt+DL+1 ] = v.mark; + } + + p->msgqueue = qinit(); + p->rpcwait = qinit(); + p->rpcmask = sinit(); + pushmask(pix); /* initialy all RPCs are disabled */ + p->trlnumber = 0; /* trace line number */ + i = ptr->preflist; /* search for executable prefix */ + while (prototype[ p->M[ i ] ]->kind == RECORD) i++; + p->ic = prototype[ M[ i ] ]->codeaddr; /* first instruction address */ +#if RPCDBG +fprintf(stderr,"first instruction address %d of new process %d\n", p->ic, pix ); +#endif + p->force_compactification=FALSE; +} + + +bool member(virt, am) +virtaddr *virt; +word *am; +{ + *am = M[ virt->addr ]; + return (virt->mark == M[ virt->addr+1 ]); +} + + +void update(am, ah) /* Update DISPLAY */ +word am, ah; +{ + word t1, t2, t3, t4, t5, t6; + protdescr *ptr; + + while (TRUE) + { + t1 = am+M[ am ]; + M[ t1+STATSL ]++; /* flag object included in SL */ + ptr = prototype[ M[ am+PROTNUM ] ]; + t2 = ptr->preflist; + t3 = t2+ptr->lthpreflist-1; + for (t4 = t3; t4 >= t2; t4-- ) + { + t6 = M[ t4 ]; + t5 = display+t6; + if (M[ t5 ] == 0) /* entry to be updated */ + { + M[ t5 ] = am; + M[ display2+t6 ] = ah; + } + } + ah = M[ t1+SL ]; + if (ah == DUMMY) break; + if (M[ ah+1 ] != M[ t1+SL+1 ]) errsignal(RTESLCOF); + am = M[ ah ]; + } +} + + +void loosen() /* Loosen DISPLAY */ +{ + word t1, t2, t3; + protdescr *ptr; + + t1 = c1; + while (TRUE) + { + ptr = prototype[ M[ t1+PROTNUM ] ]; + t2 = ptr->preflist; + for (t3 = t2+ptr->lthpreflist-1; t3 >= t2; t3-- ) + M[ display+M[ t3 ] ] = 0; + t3 = t1+M[ t1 ]; + M[ t3+STATSL ]--; /* flag object removed from SL */ + t1 = M[ t3+SL ]; /* ah of SL */ + if (t1 == DUMMY) break; /* still not main */ + t1 = M[ t1 ]; /* am of SL */ + } +} + + +static int tracecnt = 0; /* To count trace messages in line */ + +void trace(lineno) /* Trace the program if debug mode */ +word lineno; +{ + thisp->trlnumber = lineno; + if (debug && lineno > 0) + { + tracecnt++; + if (tracecnt == MAXTRACNT) /* change line */ + { + tracecnt = 0; + fprintf(tracefile, "\n"); + } + fprintf(tracefile, "%6ld", (long) lineno); + } + trapmsg(); /* check for waiting message */ + rpc2(); /* check for RPC message */ +} + + +void endrun(status) +int status; +{ + fflush(stdout); + + fprintf(stderr, "\n\nEnd of LOGLAN-82 program execution\n");fflush(stderr); +#if DLINK + net_logoff(); +#endif + if (debug) fclose(tracefile); + exit(status); +} + + diff --git a/sources/int/sock.c b/sources/int/sock.c new file mode 100644 index 0000000..eff610e --- /dev/null +++ b/sources/int/sock.c @@ -0,0 +1,216 @@ + /* Loglan82 Compiler&Interpreter + Copyright (C) 1981-1993 Institute of Informatics, University of Warsaw + Copyright (C) 1993, 1994 LITA, Pau + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + contacts: Andrzej.Salwicki@univ-pau.fr + +or Andrzej Salwicki + LITA Departement d'Informatique + Universite de Pau + Avenue de l'Universite + 64000 Pau FRANCE + tel. ++33 59923154 fax. ++33 59841696 + +======================================================================= +*/ + +#include + +#include "depend.h" +#include "genint.h" +#include "int.h" +#include "process.h" +#include "intproto.h" + +#include "sock.h" +#include "tcpip.h" + + +#ifndef FD_SET +#define BITS_PER_INT 32 +#define FD_SET(f,fds) (fds)->fds_bits[(f)/BITS_PER_INT]|=(1<<((f)%BITS_PER_INT)) +#define FD_ZERO(fds) { (fds)->fds_bits[0]=0; (fds)->fds_bits[1]=0; } +#endif + + + +#ifdef BZERO +void bzero( buf, size ) char *buf; int size; { + while( --size >= 0 ) + buf[size]='\0'; +} +void bcopy( from, to, size ) char *from,*to; int size; { + while( --size >= 0 ) + to[size]=from[size]; +} +#endif + + + +#ifndef INADDR_NONE +#define INADDR_NONE 0xffffffffUL +#endif + + +#define init_addr(addr) \ + bzero((char *)&(addr),sizeof(addr)); \ + (addr).sin_family=AF_INET; \ + (addr).sin_port=htons(0); \ + (addr).sin_addr.s_addr=htonl(INADDR_ANY); + + + +int host_addr( host, buf ) char *host; struct sockaddr_in *buf; { + + long inaddr; + int port; + struct hostent *hp; + char *addr; + + init_addr( *buf ); + + addr = strchr( host, ':' ); + if( addr == NULL ) + port = PORT; + else + { + *addr = '\0'; + addr++; + if( *addr!='\0' ) + if( sscanf( addr, "%d", &port ) != 1 ) usage(); + else; + else + port = PORT; + } + + buf->sin_port = htons( port ); + + /* try dotted-decimal address */ + if( (inaddr = inet_addr(host)) == INADDR_NONE ){ + if( (hp = gethostbyname(host)) == NULL ) + return -1; + assert( hp->h_length == sizeof( inaddr ) ); + bcopy( (char *)( hp->h_addr ), (char *)&( buf->sin_addr ), sizeof( inaddr ) ); + } + + return 0; +} + + + +int sock_open( socket_type, protocol, service, port ) + char *service; + char *protocol; + int socket_type,port; +{ + int fd; + struct sockaddr_in my_addr; + struct servent *sp; + struct protoent *pp; + + init_addr( my_addr ); + + if( (pp=getprotobyname(protocol)) == NULL ) + return -1; + + if( service != NULL ){ + if( (sp=getservbyname(service,protocol)) == NULL ) + return -1; + my_addr.sin_port = sp->s_port; + } + + if( port>0 ) + my_addr.sin_port = htons( port ); + + if( (fd = socket(AF_INET,socket_type,pp->p_proto)) < 0 ) + return -1; + + if( bind( fd, (struct sockaddr *)&my_addr, sizeof(my_addr) ) < 0 ) + return -1; + + return fd; +} + + + +int sock_poll( sock, ms ) int sock,ms; { + struct timeval timeout; + fd_set rd_fds; + int nfds; + FD_ZERO(&rd_fds); + timeout.tv_sec = ms/1000; + timeout.tv_usec = (ms%1000)*1000; + if( sock>=0 ) /* sock==-1 means we only sleep */ + FD_SET(sock,&rd_fds); + if( ms >= 0 ) + nfds = select(sock+1,&rd_fds,NULL,NULL,&timeout); + else + nfds = select(sock+1,&rd_fds,NULL,NULL,NULL); + errno=0; + return ( nfds == 1 ); +} + + + +static int send_wait_time = 0; + +void set_send_delay( ms ) int ms; { /* set delay to miliseconds */ + send_wait_time = ms; +} + +int sock_send( sock, buf, size, addr ) + int sock,size; + void *buf; + struct sockaddr_in *addr; +{ + int namelen = sizeof( *addr ); + if( send_wait_time > 0 ) + sock_poll( -1, send_wait_time ); + if( sendto( sock, buf, size, 0, addr, namelen ) <= 0 ){ + fprintf( + stderr, + "socket send to %s:%d\n", + inet_ntoa( addr->sin_addr ), + (int)ntohs( addr->sin_port ) + ); + perror("send error"); + abend("send error"); + } + return 0; +} + +int sock_recv( sock, buf, size, addr ) + int sock,size; + void *buf; + struct sockaddr_in *addr; +{ + int recv_size; + int namelen = sizeof( struct sockaddr_in ); + if( ( recv_size = recvfrom( sock, buf, size, 0, addr, &namelen ) ) < 0 ){ + perror("recv"); + return -1; + } + if( namelen != sizeof( struct sockaddr_in ) ){ + printf("str sockaddr_in %d namelen %d\n",sizeof(struct sockaddr_in),namelen); + printf("addr %s\n",inet_ntoa(addr->sin_addr)); + abend("strenge message"); + } + return recv_size; +} + + + diff --git a/sources/int/sock.h b/sources/int/sock.h new file mode 100644 index 0000000..f6b8a34 --- /dev/null +++ b/sources/int/sock.h @@ -0,0 +1,81 @@ + /* Loglan82 Compiler&Interpreter + Copyright (C) 1981-1993 Institute of Informatics, University of Warsaw + Copyright (C) 1993, 1994 LITA, Pau + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + contacts: Andrzej.Salwicki@univ-pau.fr + +or Andrzej Salwicki + LITA Departement d'Informatique + Universite de Pau + Avenue de l'Universite + 64000 Pau FRANCE + tel. ++33 59923154 fax. ++33 59841696 + +======================================================================= +*/ + +#ifndef __SOCK_H__ +#define __SOCK_H__ + +#include +#include + +#ifndef NO_PROTOTYPES +#include +#endif + +#include +#include +#include +#include +#include +#include +#include + + +#ifndef NO_PROTOTYPES +int host_addr( char * /* host name */, struct sockaddr_in * ); +int sock_open( int socket_type, char *protocol, char *service, int port ); +int sock_recv( int sock, void *buf, int size, struct sockaddr_in *addr ); +int sock_send( int sock, void *buf, int size, struct sockaddr_in *addr ); +void set_send_delay ( int miliseconds ); +int sock_poll( int sock, int miliseconds ); + /* sock == -1 -> equivalent of sleep */ + /* miliseconds < 0 -> waits indefinitely */ +#else +int host_addr(); +int sock_open(); +int sock_srv_recv(); +int sock_srv_send(); +void set_send_delay(); +int sock_poll(); +#endif + + +#ifndef NO_PROTOTYPES +int sock_crc_recv( int sock, void *m, int size, struct sockaddr_in *addr ); +int sock_crc_send( int sock, void *m, int size, struct sockaddr_in *addr ); +#else +int sock_srv_crc_recv(); +int sock_srv_crc_send(); +#endif + +#endif + + + + diff --git a/sources/int/standard.c b/sources/int/standard.c new file mode 100644 index 0000000..4a40d1d --- /dev/null +++ b/sources/int/standard.c @@ -0,0 +1,456 @@ + /* Loglan82 Compiler&Interpreter + Copyright (C) 1981-1993 Institute of Informatics, University of Warsaw + Copyright (C) 1993, 1994 LITA, Pau + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + contacts: Andrzej.Salwicki@univ-pau.fr + +or Andrzej Salwicki + LITA Departement d'Informatique + Universite de Pau + Avenue de l'Universite + 64000 Pau FRANCE + tel. ++33 59923154 fax. ++33 59841696 + +======================================================================= +*/ + +#include "depend.h" +#include "genint.h" +#include "int.h" +#include "process.h" +#include "intproto.h" + +#include +#include + +/* Call standard procedure */ + +void standard(nrproc) /* Process call to a standard proc. */ +word nrproc; +{ + word t1, t2, t3, t5, t6; + double r; + bool absent; + int ch, n; + long tim; + char *cp; + FILE *fp; + + absent = FALSE; + +#ifdef TRACE + fprintf( stderr, "standard procedure %d\n", nrproc ); +#endif + + switch ((int) nrproc) + { + case 1 : /* new array */ + newarry(param[ 1 ].xword, param[ 0 ].xword, param[ 2 ].xword, + ¶m[ 3 ].xvirt, ¶m[ 4 ].xword); + break; + + case 2 : /* rew */ + case 3 : /* avf */ + case 4 : /* bsf */ + case 5 : /* weo */ + case 6 : /* putrec */ + case 7 : /* getrec */ + case 8 : /* ass */ + case 9 : /* assin */ + case 10 : /* assout */ + absent = TRUE; + break; + + case 11 : /* unpack:function(s:string):arrayof char */ + t1 = strings+param[ 0 ].xword+1; + t6 = M[ t1-1 ]; /* length of the string */ + if (t6 > 0) /* string not null */ + { + newarry((word) 1, t6, (word) AINT, ¶m[ 1 ].xvirt, &t5); + t5 += 3; + cp = (char *) &M[ t1 ]; + while (t6-- > 0) M[ t5++ ] = *cp++; + } + else /* null string */ + { + param[ 1 ].xvirt.addr = 0; + param[ 1 ].xvirt.mark = 0; + } + break; + + case 12 : /* random:function:real */ + param[ 0 ].xreal = (real)prandom(); + break; + + case 13 : /* time:function:integer */ + time(&tim); + param[ 0 ].xword = tim; + break; + + case 14 : /* sqrt:function(x:real):real */ + param[ 1 ].xreal = (real)sqrt((double) param[ 0 ].xreal); + break; + + case 15 : /* entier:function(x:real):integer */ + param[ 1 ].xword = entier((double) param[ 0 ].xreal); + break; + + case 16 : /* round:function(x:real):integer */ + param[ 1 ].xword = entier((double) (param[ 0 ].xreal+0.5)); + break; + + case 17 : /* unused */ + case 18 : /* intrinsic procedure */ + absent = TRUE; + break; + + case 19 : /* imin:function(x, y:integer):integer */ + param[ 2 ].xword = min(param[ 0 ].xword, param[ 1 ].xword); + break; + + case 20 : /* imax:function(x, y:integer):integer */ + param[ 2 ].xword = max(param[ 0 ].xword, param[ 1 ].xword); + break; + + case 21 : /* imin3:function(x, y, z:integer):integer */ + t1 = min(param[ 0 ].xword, param[ 1 ].xword); + param[ 3 ].xword = min(t1, param[ 2 ].xword); + break; + + case 22 : /* imax3:function(x, y, z:integer):integer */ + t1 = max(param[ 0 ].xword, param[ 1 ].xword); + param[ 3 ].xword = max(t1, param[ 2 ].xword); + break; + + case 23 : /* sin:function(x:real):real */ + param[ 1 ].xreal = (real)sin((double) param[ 0 ].xreal); + break; + + case 24 : /* cos:function(x:real):real */ + param[ 1 ].xreal = (real)cos((double) param[ 0 ].xreal); + break; + + case 25 : /* tan:function(x:real):real */ + r = cos((double) param[ 0 ].xreal); + if (r == 0.0) errsignal(RTEDIVBZ); + param[ 1 ].xreal = (real)sin((double) param[ 0 ].xreal) / r; + break; + + case 26 : /* exp:function(x:real):real */ + param[ 1 ].xreal = (real)exp((double) param[ 0 ].xreal); + break; + + case 27 : /* ln:function(x:real):real */ + param[ 1 ].xreal = (real)log((double) param[ 0 ].xreal); + break; + + case 28 : /* atan:function(x:real):real */ + param[ 1 ].xreal = (real)atan((double) param[ 0 ].xreal); + break; + + case 29 : /* endrun:procedure */ + endrun(0); + break; + + case 30 : /* ranset:procedure(x:real) */ + ranset(); + break; + + case 31 : /* clock */ + case 32 : /* option */ + case 33 : /* lock */ + case 34 : /* unlock */ + case 35 : /* sched, boy! */ + case 36 : /* date */ + case 37 : /* execpar */ + case 38 : /* test&set */ + absent = TRUE; + break; + + case 39 : /* eof */ + param[ 0 ].xbool = lbool(testeof(stdin)); + break; + + case 40 : /* eof(f) */ + loadfile((word) UNKNOWN, &t1, &t2, &fp); + t3 = M[ t2+FSTAT ]; + if (t3 == READING || t3 == UPDATING) + param[ 0 ].xbool = lbool(testeof(fp)); + else errsignal(RTEILLIO); + break; + + case 41 : /* readln */ + readln(stdin); + break; + + case 42 : /* readln(f) */ + loadfile((word) READING, &t1, &t2, &fp); + if (t1 != TEXTF) errsignal(RTEILLIO); + readln(fp); + break; + + case 43 : /* readchar */ + param[ 0 ].xword = getc(stdin); + break; + + case 44 : /* readchar(f) */ + loadfile((word) READING, &t1, &t2, &fp); + if (t1 != TEXTF) errsignal(RTEILLIO); + if ((ch = getc(fp)) == EOF) errsignal(RTEIOERR); + param[ 0 ].xword = ch; + break; + + case 45 : /* readint */ + param[ 0 ].xword = readint(stdin); + break; + + case 46 : /* readint(f) */ + loadfile((word) READING, &t1, &t2, &fp); + if (t1 != TEXTF) errsignal(RTEILLIO); + param[ 0 ].xword = readint(fp); + break; + + case 47 : /* readreal */ + param[ 0 ].xreal = (real)readreal(stdin); + break; + + case 48 : /* readreal(f) */ + loadfile((word) READING, &t1, &t2, &fp); + if (t1 != TEXTF) errsignal(RTEILLIO); + param[ 0 ].xreal = (real)readreal(fp); + break; + + case 49 : /* getchar(f) */ + loadfile((word) READING, &t1, &t2, &fp); + if (t1 != CHARF) errsignal(RTEILLIO); + if ((ch = getc(fp)) == EOF) errsignal(RTEIOERR); + param[ 0 ].xword = ch; + break; + + case 50 : /* getint(f) */ + loadfile((word) READING, &t1, &t2, &fp); + if (t1 != INTF) errsignal(RTEILLIO); + n = fread((char *) ¶m[ 0 ].xword, sizeof(word), 1, fp); + if (n != 1) errsignal(RTEIOERR); + break; + + case 51 : /* getreal(f) */ + loadfile((word) READING, &t1, &t2, &fp); + if (t1 != REALF) errsignal(RTEILLIO); + n = fread((char *) ¶m[ 0 ].xreal, sizeof(real), 1, fp); + if (n != 1) errsignal(RTEIOERR); + break; + + case 52 : /* getobject(f) */ + absent = TRUE; + break; + + case 53 : /* putchar(f) */ + loadfile((word) WRITING, &t1, &t2, &fp); + if (t1 != CHARF) errsignal(RTEILLIO); + ch = (char) param[ 0 ].xword; + if (putc(ch, fp) == EOF) errsignal(RTEIOERR); + break; + + case 54 : /* putint(f) */ + loadfile((word) WRITING, &t1, &t2, &fp); + if (t1 != INTF) errsignal(RTEILLIO); + n = fwrite((char *) ¶m[ 0 ].xword, sizeof(word), 1, fp); + if (n != 1) errsignal(RTEIOERR); + break; + + case 55 : /* putreal(f) */ + loadfile((word) WRITING, &t1, &t2, &fp); + if (t1 != REALF) errsignal(RTEILLIO); + n = fwrite((char *) ¶m[ 0 ].xreal, sizeof(real), 1, fp); + if (n != 1) errsignal(RTEIOERR); + break; + + case 56 : /* putobject(f) */ + case 57 : /* putstring(f) */ + absent = TRUE; + break; + + case 58 : /* writeln(f) */ + loadfile((word) WRITING, &t1, &t2, &fp); + if (t1 != TEXTF) errsignal(RTEILLIO); + if (putc('\n', fp) == EOF) errsignal(RTEIOERR); + if (fflush(fp)) errsignal(RTEIOERR); + break; + + case 59 : /* writeln */ + putc('\n', stdout); + break; + + case 60 : /* writechar(f) */ + loadfile((word) WRITING, &t1, &t2, &fp); + if (t1 != TEXTF) errsignal(RTEILLIO); + if (putc((char) param[ 0 ].xword, fp) == EOF) + errsignal(RTEIOERR); + break; + + case 61 : /* writechar */ + putc((char) param[ 0 ].xword, stdout); + break; + + case 62 : /* writeint(f) */ + loadfile((word) WRITING, &t1, &t2, &fp); + if (t1 != TEXTF) errsignal(RTEILLIO); + writeint(param[ 0 ].xword, param[ 1 ].xword, fp); + break; + + case 63 : /* writeint */ + writeint(param[ 0 ].xword, param[ 1 ].xword, stdout); + break; + + case 64 : /* writereal0(f) */ + case 66 : /* writereal1(f) */ + case 68 : /* writereal2(f) */ + loadfile((word) WRITING, &t1, &t2, &fp); + if (t1 != TEXTF) errsignal(RTEILLIO); + writereal((double) param[ 0 ].xreal, param[ 1 ].xword, + param[ 2 ].xword, fp); + break; + + case 65 : /* writereal0 */ + case 67 : /* writereal1 */ + case 69 : /* writereal2 */ + writereal((double) param[ 0 ].xreal, param[ 1 ].xword, + param[ 2 ].xword, stdout); + break; + + case 70 : /* writestring(f) */ + loadfile((word) WRITING, &t1, &t2, &fp); + if (t1 != TEXTF) errsignal(RTEILLIO); + writestring(param[ 0 ].xword, param[ 1 ].xword, fp); + break; + + case 71 : /* writestring */ + writestring(param[ 0 ].xword, param[ 1 ].xword, stdout); + break; + + case 72 : /* open temporary file */ + genfileobj(TRUE , param[ 1 ].xword, tempfilename(), + ¶m[ 0 ].xvirt, &t1); + break; + + case 73 : /* open external file */ + genfileobj(FALSE, param[ 1 ].xword, asciiz(¶m[ 2 ].xvirt), + ¶m[ 0 ].xvirt, &t1); + break; + + case 74 : /* eoln */ + param[ 0 ].xbool = lbool(testeoln(stdin)); + break; + + case 75 : /* eoln(f) */ + loadfile((word) READING, &t1, &t2, &fp); + if (t1 != TEXTF) errsignal(RTEILLIO); + param[ 0 ].xbool = lbool(testeoln(fp)); + break; + + case 76 : /* this coroutine */ + loadvirt(param[ 0 ].xvirt, + thisp->prochead+M[ thisp->prochead ]+CHD); + break; + + case 77 : /* this process */ + { + procaddr p; + virtaddr v; + p.node = ournode; + p.pix = thispix; + p.mark = thisp->mark; + mess2obj( thisp, &p, &v ); + param[ 0 ].xvirt = v; + } + break; + + case 78 : /* reset:procedure(f:file) */ + if (member(¶m[ 0 ].xvirt, &t2)) + reset(t2); + else errsignal(RTEREFTN); + break; + + case 79 : /* rewrite:procedure(f:file) */ + if (member(¶m[ 0 ].xvirt, &t2)) + rewrite(t2); + else errsignal(RTEREFTN); + break; + + case 80 : /* unlink:procedure(f:file) */ + delete(¶m[ 0 ].xvirt); + break; + + case 81 : /* seek:procedure(f:file, offset, base:integer) */ + storevirt(param[ 0 ].xvirt, currfile); + loadfile((word) UPDATING, &t1, &t2, &fp); + if (t1 != DIRECT) errsignal(RTEILLIO); + if (fseek(fp, (long) param[ 1 ].xword, (int) param[ 2 ].xword)) + errsignal(RTEIOERR); + break; + + case 82 : /* getrec(f, a, n) */ + loadfile((word) UPDATING, &t1, &t2, &fp); + if (t1 != DIRECT) errsignal(RTEILLIO); + param[ 1 ].xword = directio( + ¶m[ 0 ].xvirt, + param[ 1 ].xword, + (int (*)())fread, + fp + ); + break; + + case 83 : /* putrec(f, a, n) */ + loadfile((word) UPDATING, &t1, &t2, &fp); + if (t1 != DIRECT) errsignal(RTEILLIO); + param[ 1 ].xword = directio( + ¶m[ 0 ].xvirt, + param[ 1 ].xword, + (int (*)())fwrite, + fp + ); + break; + + case 84 : /* position:function(f:file):real */ + storevirt(param[ 0 ].xvirt, currfile); + loadfile((word) UPDATING, &t1, &t2, &fp); + if (t1 != DIRECT) errsignal(RTEILLIO); + param[ 1 ].xword =(int) ftell(fp); + break; + + case 98 : /* memavail:function:integer */ + param[ 0 ].xword = memavail(); + break; + + case 99 : /* exec:function(c:arrayof char):integer */ + cp = asciiz(¶m[ 0 ].xvirt); + param[ 1 ].xword = system(cp); + free(cp); + break; + + default : + nonstandard(nrproc); + break; + } +# if TRACE + fflush( stdout ); +# endif + if (absent) errsignal(RTEUNSTP); +} + + diff --git a/sources/int/svga1.c b/sources/int/svga1.c new file mode 100644 index 0000000..7569e23 --- /dev/null +++ b/sources/int/svga1.c @@ -0,0 +1,293 @@ +#include +#include +#include "eventque.h" + +int Couleur,Fond,CurX,CurY; +int Coul[4],Pal; +int MOUSE_PRESENT =0; + +MouseEvent *evt; +EventQueue *q; +char *ret; + +void mousenit(int mo,int ke) +{ + MouseEventMode(1); + MouseInit(); + evt=(MouseEvent *)malloc(sizeof(MouseEvent)); + MouseEventEnable(ke,mo); + MOUSE_PRESENT=1; +} + +void mouseshow(void) +{ + MouseDisplayCursor(); +} + +void mousehide(void) +{ + MouseEraseCursor(); +} + +int mouse(v,p,h,l,r,c) +unsigned int *v,*p,*h,*l,*r,*c; +{ + EventRecord e; + MouseEvent *ev1; + short result=0; + + *v=0,*p=0,*h=0,*l=0,*r=0,*c=0; + + ev1=evt; + evt=(MouseEvent *)calloc(1,sizeof(MouseEvent)); + MouseGetEvent(M_EVENT | M_POLL | M_NOPAINT,evt); + *p=evt->kbstat; *l=evt->key; + *h=evt->x; *v=evt->y; + *r=evt->flags; *c=evt->buttons; + if(ev1->kbstat!=evt->kbstat || ev1->key!=evt->key || ev1->x!=evt->x || + ev1->y!=evt->y || ev1->flags!=evt->flags || ev1->buttons!=evt->buttons) + result=1; + free(ev1); + return(result); +} + +void afficheinteger(int x,int y,int valeur,int cf,int ce) +{ + char tst[20]; + + sprintf(tst,"%i",valeur); + GrTextXY(x,y,tst,ce,cf); + CurX+=8*strlen(tst); + if(CurX>GrMaxX()) + { + CurX=0; + CurY+=14; + } +} + + + +int readcara(int posx,int posy,int col_f,int col_e) +{ + char *t="_\0"; + int a; + + while(!kbhit()) + { + GrHLine(posx,posx+8,posy+13,col_f); + delay(200); + GrHLine(posx,posx+8,posy+13,col_e); + delay(100); + } + GrHLine(posx,posx+8,posy+13,col_f); + a=getxkey(); + if(!a) + return(getxkey()); + else + return(a); +} + + +void beep(void) +{ + printf("%c\n",7); +} + +int affiche_chaine(int x,int y,int lg,char *txtd,char *txtf,int av,int *ll,int col_e,int col_f) +{ + int larg; + char cara[2]; + + + if(!av) + { + for(sprintf(&cara[0],"%c\0",*txtf),larg=0;txtf>=txtd;txtf--) /* affiche arriere */ + { + GrTextXY(x+lg-larg,y,&cara[0],col_e,col_f); + larg+=8; + sprintf(&cara[0],"%c\0",*(txtf-1)); + if((lg-larg-8)<0) + break; + } + if(txtf<=txtd) + { + *ll-=6; + return(1); + } + else + return(0); + } + else + { + for(sprintf(&cara[0],"%c\0",*txtd),larg=0;txtd<=txtf;txtd++) /* affiche avant */ + { + GrTextXY(x+larg,y,&cara[0],col_e,col_f); + larg+=8; + sprintf(&cara[0],"%c\0",*(txtd+1)); + if((lg-larg-8)<0) + break; + } + if(txtd<=txtf) + return(0); + else + return(1); + } +} + +int gscanfnum(int x,int y,int lg,int min,int max,int deft,int col_f,int col_e,int col_c) +{ + + char t[10],a; + int larg=0,flg=0; + char *ptd,*ptc; + int i; + int cpt=0; + short chgt=0; + short signe=0; /* par defaut 0(+) sinon 1(-) */ + + ptc=ptd=&t[0]; + GrFilledBox(x,y,x+lg,y+14,col_f); + sprintf(t,"%lu\0",deft); + while(*ptc!='\0') ptc++; + GrTextXY(x+lg-strlen(t)*8,y,t,col_e,col_f); + do + { + a=readcara(x+lg-8,y,col_f,col_c); + switch(a) + { + case 8: + if(ptc>ptd) + { + ptc--; + cpt--; + if(flg) + larg-=8; + *(ptc)='\0'; + } + else + { + larg=0; + ptc=ptd; + beep(); + } + break; + case 13: + if(ptc==ptd) + { + *ptc='\0'; + a=11; + } + break; + case 43: + signe=0; + chgt=1; + if(cpt==0) + *ptc='\0'; + break; + case 45: + signe=1; + chgt=1; + if(cpt==0) + *ptc='\0'; + break; + default: + if(cpt<10) + { + if((a<='9') && (a>='0')) + { + *(ptc++)=a; + cpt++; + *ptc='\0'; + } + } + else + beep(); + break; + } + GrFilledBox(x,y,x+lg,y+14,col_f); + affiche_chaine(x,y,lg,ptd,ptc,flg,&larg,col_e,col_f); + if(chgt) + if(signe) + GrTextXY(x,y,"-",col_e,col_f); + else + GrTextXY(x,y,"+",col_e,col_f); + } + while((a!=13) && (a!=27)); + if(a==13) + { + i=atol(t); + if(signe) + i=-i; + if((i<=max) && (i>=min)) + return(i); + else + { + beep(); + return(gscanfnum(x,y,lg,min,max,deft,col_f,col_e,col_c)); + } + } + else + return(gscanfnum(x,y,lg,min,max,deft,col_f,col_e,col_c)); +} + + +/******************************************************************************/ +char *gschar(int x,int y,int lg,int *lgmax,char *defaut,int col_f,int col_e,int col_c) +{ + + char *ptd,*ptc,a; + int larg=0,flg=1; + + ptd=(char *)malloc(*lgmax); + ptc=ptd; + GrFilledBox(x,y,x+lg*8,y+14,col_f); + GrTextXY(x,y,defaut,col_e,col_f); + do + { + a=readcara((larg<(lg-1)*8) ? (x+larg) : (x+(lg-1)*8),y,col_f,col_c); + switch(a) + { + case 8: + if(ptc>ptd) + { + ptc--; + if(flg) + larg=(larg-8)>0 ? larg-8 : 0; + *(ptc)='\0'; + } + else + { + larg=0; + ptc=ptd; + beep(); + } + break; + case 13: + break; + default : + if(((ptc-ptd)/sizeof(char))<=*lgmax) + { + *(ptc++)=a; + *ptc='\0'; + if(flg) + larg+=8; + } + else + beep(); + } + GrFilledBox(x,y,x+lg*8,y+14,col_f); + flg=affiche_chaine(x,y,(lg-1)*8,ptd,ptc,flg,&larg,col_e,col_f); + } + while((a!=13) && (a!=27)); + if((a==27) || (ptd==ptc)) + { + ptc=ptd=defaut; + while(*ptc!='\0') ptc++; + } + else + *ptc='\0'; + GrFilledBox(x,y,x+lg*8,y+14,col_f); + affiche_chaine(x,y,lg*8,ptd,ptc,1,&larg,col_e,col_f); + *lgmax=(ptc>ptd)? ptc-ptd+1 : 0; + return(ptd); +} diff --git a/sources/int/svga2.c b/sources/int/svga2.c new file mode 100644 index 0000000..ea19634 --- /dev/null +++ b/sources/int/svga2.c @@ -0,0 +1,321 @@ +case GRON: switch (param[0].xword) + { + case 0: GrSetMode(GR_width_height_graphics, + 640,480,16); + Res_graph_X=640; + Res_graph_Y=480; + break; + case 1: GrSetMode(GR_width_height_graphics, + 640,480,256); + Res_graph_X=640; + Res_graph_Y=480; + break; + case 2: GrSetMode(GR_width_height_graphics, + 800,600,16); + Res_graph_X=800; + Res_graph_Y=600; + break; + + case 3: GrSetMode(GR_width_height_graphics, + 800,600,256); + Res_graph_X=800; + Res_graph_Y=600; + break; + case 4: GrSetMode(GR_width_height_graphics, + 1024,768,16); + Res_graph_X=1024; + Res_graph_Y=768; + break; + case 5: GrSetMode(GR_width_height_graphics, + 1024,768,256); + Res_graph_X=1024; + Res_graph_Y=768; + break; + case 6: GrSetMode(GR_width_height_graphics, + 1280,1024,16); + Res_graph_X=1280; + Res_graph_Y=1024; + break; + case 7: GrSetMode(GR_width_height_graphics, + 1280,1024,256); + Res_graph_X=1280; + Res_graph_Y=1024; + break; + case 8: GrSetMode(GR_width_height_graphics, + 1600,1280,16); + Res_graph_X=1600; + Res_graph_Y=1280; + break; + case 9: GrSetMode(GR_width_height_graphics, + 1600,1280,256); + Res_graph_X=1600; + Res_graph_Y=1280; + break; + default: GrSetMode(GR_width_height_graphics, + 320,200,256); + Res_graph_X=320; + Res_graph_Y=200; + } + GrClearScreen(0); + break; + +case POINT: CurX=param[0].xword; + CurY=param[1].xword; + GrPlot(CurX,CurY,Couleur); + break; + +case INPIX: CurX=param[0].xword; + CurY=param[1].xword; + param[2].xword=GrPixel(CurX,CurY); + break; + +case MOVE: CurX=param[0].xword; + CurY=param[1].xword; + break; + +case COLOR: Couleur=param[0].xword; + break; + +case PALETT: Coul[Pal++]=param[0].xword; + if (Pal==4) + { + GrSetColor(Coul[0],Coul[1],Coul[2],Coul[3]); + Pal=0; + } + break; + +case GROFF: if(MOUSE_PRESENT) MouseUnInit(); + GrSetMode(GR_80_25_text); + break; + +case DRAW: GrLine(CurX,CurY,param[0].xword,param[1].xword,Couleur); + CurX=param[0].xword; + CurY=param[1].xword; + break; + +case HFILL: GrHLine(CurX,param[0].xword,CurY,Couleur); + CurX=param[0].xword; + break; + +case VFILL: GrVLine(CurX,CurY,param[0].xword,Couleur); + CurY=param[0].xword; + break; + +case CLS: GrClearScreen(Fond); + break; + +case BORDER: Fond=param[0].xword; + break; + +case INXPOS: param[0].xword=CurX; + break; + +case INYPOS: param[0].xword=CurY; + break; + +case OUTSTRING: + { + char *Texte= (char *)(M + strings + param[ 2 ].xword + 1); + if(param[0].xint==-1) ax=CurX; + else ax=param[0].xint; + if(param[1].xint==-1) bx=CurY; + else bx=param[1].xint; + if(param[3].xint==-1) cx=Couleur; + else cx=param[3].xint; + if(param[4].xint==-1) dx=Fond; + else dx=param[4].xint; + GrTextXY(ax,bx,Texte,cx,dx); + if(param[0].xint==-1 && param[1].xint==-1) + { + CurX+=8*strlen(Texte); + if(CurX>GrMaxX()) + { + CurX=0; + CurY+=14; + } + } + } + break; + +case HASCII: + { + char *Texte=(char *)¶m[ 0 ].xword; + GrTextXY(CurX,CurY,Texte,Couleur,Fond); + CurX+=8; + if (CurX>GrMaxX()) + { + CurX=0; + CurY+=14; + } + } + break; + +case INKEY: + { + int Touche; + + Touche=kbhit(); + if (Touche) + param[0].xword=getkey(); + else + param[0].xword=0; + } + break; + +case GETMAP : { + int w,h; + GrContext *Destination; + + w=abs(param[0].xword-CurX)+1; + h=abs(param[1].xword-CurY)+1; + newarry((word)1,3,(word)AINT,¶m[2].xvirt,&am); + Destination=GrCreateContext(w,h, + NULL,NULL); + M[am+3]=(int)Destination; + M[am+4]=w; + M[am+5]=h; + GrBitBlt(Destination,0,0, + NULL,CurX,CurY,param[0].xword,param[1].xword, + GrWRITE); + } + break; + +case PUTMAP : if (member(¶m[0].xvirt,&am)) + GrBitBlt(NULL,CurX,CurY, + (GrContext *)M[am+3],0,0,M[am+4],M[am+5],GrWRITE); + else + errsignal(RTEREFTN); + break; + +case ORMAP : if (member(¶m[0].xvirt,&am)) + GrBitBlt(NULL,CurX,CurY, + (GrContext *)M[am+3],0,0,M[am+4],M[am+5],GrOR); + else + errsignal(RTEREFTN); + break; + +case XORMAP : if (member(¶m[0].xvirt,&am)) + GrBitBlt(NULL,CurX,CurY, + (GrContext *)M[am+3],0,0,M[am+4],M[am+5],GrXOR); + else + errsignal(RTEREFTN); + break; + +case INTENS : { + word am1,am2; + int i; + int pt1[30][2]; + + if(member(¶m[1].xvirt,&am1) && member(¶m[2].xvirt,&am2)) + { + if(param[0].xint>30) param[0].xint=30; + for(i=0;i + + +static int sock; + +static int slaves=0; +static struct addr { + int console; + struct sockaddr_in addr; +} *phone_book; + + +#define MAX_NODES 256 +static int node2book[ MAX_NODES ]; /* only 256 nodes - can be changed */ + + +static void sock_recv_from( void *, int, struct sockaddr_in * ); +static void sock_recv_from( buf, buflen, from_addr ) + int buflen; + void *buf; + struct sockaddr_in *from_addr; +{ + struct sockaddr_in addr; + int retval; + for(;;){ + if( ( retval = sock_recv( sock, buf, buflen, &addr ) ) < 0 ) + perror("receive"),abend("no answer from master"); + if( + from_addr->sin_port != addr.sin_port + || + from_addr->sin_addr.s_addr != addr.sin_addr.s_addr + || + buflen != retval + ) + fprintf( stderr, "unexpected message from %s:%d length %d\n", + inet_ntoa( from_addr->sin_addr ), + (int)ntohs( from_addr->sin_port ), + retval + ); + else + break; + } +} + + /* nn.nn.nn.nn:port address */ +void tcpip_connect_to_master( addr ) char *addr; { + + char *host = addr; + int namelen; + int aux; + struct sockaddr_in m_address; + + for( aux = 0; aux < MAX_NODES; aux++ ) + node2book[ aux ] = -1; + + if( host_addr( host, &m_address ) < 0 ){ + perror("invalid host name:"); + usage(); + } + + sock = sock_open( SOCK_DGRAM, "udp", NULL, 0 ); /* any port */ + if( sock < 0 ) perror("can't open any socket"),exit(10); + + { + struct sockaddr_in addr; + int namelen = sizeof(struct sockaddr_in); + getsockname( sock, &addr, &namelen ); + fprintf( stderr, "socket opened on %s:%d\n", + inet_ntoa(addr.sin_addr), + (int)ntohs(addr.sin_port) + ); + } + + aux = htonl( console ); + sock_send( sock, &aux, sizeof(aux), &m_address ); + fprintf( + stderr, "waiting for acknowledge from %s:%d\n", + host, (int)ntohs( m_address.sin_port ) + ); + + sock_recv_from( &aux, sizeof(aux), &m_address ); + slaves = ntohl( aux ); + fprintf( stderr, "answer from master: %d interpreters\n", slaves ); + + phone_book = (struct addr *)calloc( slaves, sizeof( struct addr ) ); + if( phone_book==NULL ) abend("can't allocate table of addresses"); + + sock_recv_from( &aux, sizeof(aux), &m_address ); + phone_book[0].console = ntohl( aux ); + phone_book[0].addr = m_address; + + fprintf( stderr, "master console %d at %s:%d\n", + phone_book[0].console, + inet_ntoa(phone_book[0].addr.sin_addr), + (int)ntohs(phone_book[0].addr.sin_port) + ); + + node2book[ phone_book[ 0 ].console ] = 0; + + { + int i; + for( i=1; i 0 ){ + + if( sock_recv( sock , &slave_console, sizeof(slave_console), &slave_address ) < 0 ) + perror("server receive"),abend("can't connect slave"); + + fprintf( stderr, "slave %d connected at %s:%d\n", + ntohl(slave_console), + inet_ntoa(slave_address.sin_addr), + (int)ntohs(slave_address.sin_port) + ); + + slave_console = ntohl( slave_console ); + + phone_book[_slaves].console = slave_console; + phone_book[_slaves].addr = slave_address; + + if( node2book[ slave_console ] != -1 ){ + fprintf( stderr, "node %d already bound\n", slave_console ); + abend("exiting"); + } + node2book[ slave_console ] = _slaves; + + _slaves--; + + } + + fprintf( stderr, "all slaves notified - sending acknowledges\n" ); + + { + int i,j; + for( i=1; icontrol.receiver.node; + int ix = node2book[ node ]; + if( ix == -1 ){ + fprintf( stderr, "tcpip send message to not existing node %d\n", node ); + abend("exiting"); + } +/* + fprintf( stderr, "tcpip send message to node %d indx %d\n", node, ix ); +*/ + sock_send( + sock, + msg, + sizeof( message ), + &( phone_book[ ix ].addr ) + ); +} + +bool tcpip_poll( ms ) int ms; { + return sock_poll( sock, ms ); +} + +bool tcpip_recv( msg ) message *msg; { + int retval; + struct sockaddr_in addr; + if( ( retval = sock_recv( sock, msg, sizeof( message ), &addr ) ) < 0 ){ + perror("receive"); + return FALSE; + } +/* + if( retval == sizeof( message ) ) + fprintf(stderr,"tcpip recv message from node %d\n",msg->control.sender.node); + else + fprintf(stderr,"tcpip recv incorrect message from node %d\n",msg->control.sender.node); +*/ + return ( retval == sizeof( message ) ); +} + + + diff --git a/sources/int/tcpip.h b/sources/int/tcpip.h new file mode 100644 index 0000000..abf05e3 --- /dev/null +++ b/sources/int/tcpip.h @@ -0,0 +1,52 @@ + /* Loglan82 Compiler&Interpreter + Copyright (C) 1981-1993 Institute of Informatics, University of Warsaw + Copyright (C) 1993, 1994 LITA, Pau + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + contacts: Andrzej.Salwicki@univ-pau.fr + +or Andrzej Salwicki + LITA Departement d'Informatique + Universite de Pau + Avenue de l'Universite + 64000 Pau FRANCE + tel. ++33 59923154 fax. ++33 59841696 + +======================================================================= +*/ + +#ifndef __TCPIP_H__ +#define __TCPIP_H__ + +#ifndef NO_PROTOTYPES +void tcpip_connect_to_master( char * ); /* nn.nn.nn.nn:port address */ +void tcpip_wait_for_slaves( int ); /* slaves number */ +void tcpip_send( message * ); +bool tcpip_poll( int miliseconds ); /* < 0 -> blocks indefinitely */ +bool tcpip_recv( message * ); +#else +void tcpip_connect_to_master(); +void tcpip_wait_for_slaves(); +void tcpip_send(); +bool tcpip_poll(); +void tcpip_recv(); +#endif + +#define PORT 3600 + +#endif + + diff --git a/sources/int/typchk.c b/sources/int/typchk.c new file mode 100644 index 0000000..21d6c27 --- /dev/null +++ b/sources/int/typchk.c @@ -0,0 +1,383 @@ + /* Loglan82 Compiler&Interpreter + Copyright (C) 1981-1993 Institute of Informatics, University of Warsaw + Copyright (C) 1993, 1994 LITA, Pau + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + contacts: Andrzej.Salwicki@univ-pau.fr + +or Andrzej Salwicki + LITA Departement d'Informatique + Universite de Pau + Avenue de l'Universite + 64000 Pau FRANCE + tel. ++33 59923154 fax. ++33 59841696 + +======================================================================= +*/ + +#include "depend.h" +#include "genint.h" +#include "int.h" +#include "process.h" +#include "intproto.h" + +/* Type checking routines */ + + +/* Determine if prot occurs in the prefix sequence of object am + */ + +#ifndef NO_PROTOTYPES +static bool pref(word,word); +static bool typep0(word,word,bool,word *,word *); +static bool prefh(word,word); +static bool typef(word,word,word,word); +#else +static bool pref(); +static bool typep0(); +static bool prefh(); +static bool typef(); +#endif + + +static bool pref(am, prot) +word am, prot; +{ + word t1, t2; + protdescr *ptr; + + t1 = M[ am+PROTNUM ]; + if (t1 != AINT && t1 != AVIRT && t1 != AREAL && t1 != FILEOBJECT) + { /* neither array nor file */ + ptr = prototype[ t1 ]; + t1 = ptr->preflist; + t2 = t1+ptr->lthpreflist; + while (t1 < t2) + { + if (prot == M[ t1 ]) return (TRUE); + t1++; + } + } + return (FALSE); +} /* end pref */ + + +void qua(virt, tp) /* Validate qualification of object */ +virtaddr *virt; +word tp; +{ + if (virt->mark != M[ virt->addr+1 ]) errsignal(RTEREFTN); + if (M[ tp ] != CLASSTYPE) errsignal(RTEINCQA); + if (!pref(M[ virt->addr ], M[ tp+1 ])) errsignal(RTEINCQA); +} /* end qua */ + + +bool inl(virt, tp) /* Determine if A in B */ +virtaddr *virt; +word tp; +{ + if (virt->mark != M[ virt->addr+1 ]) + return (TRUE); /* none is in everything */ + else + if (M[ tp ] != CLASSTYPE) return (FALSE); + else return (pref(M[ virt->addr ], M[ tp+1 ])); +} /* end inl */ + + +bool is(virt, tp) /* Determine if A is B */ +virtaddr *virt; +word tp; +{ + if (virt->mark != M[ virt->addr+1 ] || M[ tp ] != CLASSTYPE) + return (FALSE); + else return (M[ M[ virt->addr ]+PROTNUM ] == M[ tp+1 ]); +} /* end is */ + + +/* Check correctness of an especially clumsy assignment statement + */ + +void typref(virt, tp) +virtaddr *virt; +word tp; +{ + word t1, t2, t3; + int knd; + + if (virt->mark == M[ virt->addr+1 ]) /* none always allowed */ + { + t3 = M[ virt->addr ]; /* am of right hand side */ + t1 = M[ t3+PROTNUM ]; + if (t1 == AINT || t1 == AREAL || t1 == AVIRT) errsignal(RTEINCAS); + t2 = M[ tp ]; /* right hand side type */ + if (t2 == FILETYPE) + { + if (t1 != FILEOBJECT) errsignal(RTEINCAS); + } + else + if (t2 == PURECOROUTINE || t2 == PUREPROCESS) + { + if (t2 == PURECOROUTINE) knd = COROUTINE; + else knd = PROCESS; + if (prototype[ t1 ]->kind != knd) errsignal(RTEINCAS); + } + else + { + if (t2 != CLASSTYPE) errsignal(RTEINCAS); + if (!pref(t3, M[ tp+1 ])) errsignal(RTEINCAS); + } + } +} /* end typref */ + + +/* Check correctness of a dynamic assignment + */ + +void typed(ldim, lt, rdim, rt, virt) +word ldim, lt, rdim, rt; +virtaddr *virt; +{ + if (ldim != rdim) errsignal(RTEINCAS); + if (ldim == 0) typref(virt, lt); + else + if (lt != rt) errsignal(RTEINCAS); +} /* end typed */ + + +/* Search the SL chain of object am to find the nearest Y such that Y in A. + * prot = prototype number of A + */ + +word loadt(am, prot) +word am, prot; +{ + word t1, t2, t3, t4; + + while( !pref(am, prot) ) + { + t1 = am+M[ am ]+SL; + t2 = M[ t1 ]; /* try next object in chain */ + t3 = M[ t1+1 ]; + t4 = M[ t2+1 ]; + if( t3 != t4 ) errsignal( RTEFTPMS ); + am = M[ t2 ]; + } + return (am); +} + + +/* Compute type of a formal parameter - see also typep (below). */ + +static bool typep0(am, pdaddr, protp, dim, tp) +word am, pdaddr; +bool protp; +word *dim, *tp; +{ + word t1; + protdescr *ptr; + + if (protp) /* prototype number on input */ + { + ptr = prototype[ pdaddr ]; + *dim = ptr->nrarray; + *tp = ptr->finaltype; + } + else /* type address on input */ + { + *dim = M[ pdaddr+1 ]; + *tp = M[ pdaddr+2 ]; + } + if (M[ *tp ] != FORMTYPE) return (TRUE); + else + { + t1 = M[ *tp+1 ]; /* SL prototype number */ + if (t1 == DUMMY) return (FALSE); + else /* undefined */ + { + *tp = loadt(am, t1)+M[ *tp+2 ]; + *dim += M[ *tp ]; /* accumulate dim */ + *tp = M[ *tp+1 ]; + return (TRUE); /* AIL 1989.02.02 */ + } + } +} /* end typep0 */ + + +void typep(am, nr, dim, tp) /* Compute type of formal parameter */ +word am, nr; +word *dim, *tp; +{ + if (!typep0(am, M[ prototype[ M[ am+PROTNUM ] ]->pfdescr+nr ], + FALSE, dim, tp)) errsignal(RTESYSER); +} /* end typep */ + + +/* Auxiliary function for heads, almost the same as pref. + */ + +static bool prefh(tp, prot) +word tp, prot; +{ + word t1, t2; + protdescr *ptr; + + ptr = prototype[ M[ tp+1 ] ]; + t2 = ptr->preflist; + t1 = t2+ptr->lthpreflist-1; + do + { + if (M[ t1 ] == prot) return (TRUE); + else t1--; + } while (t1 >= t2); + return (FALSE); +} /* end prefh */ + + +/* Check compatibility of generalized types, used by heads only. + */ + +static bool typef(dima, ta, dimb, tb) +word dima, ta, dimb, tb; +{ + word t1, t2; + int knd; + + if (dima != dimb) errsignal(RTEINCHS); /* incompatible headers */ + if (ta != tb) /* types different somehow */ + { + if (dima != 0) errsignal(RTEINCHS); /* dim must be 0 now */ + t1 = M[ ta ]; + t2 = M[ tb ]; + if (t1 == PRIMITIVETYPE || t1 == FILETYPE) errsignal(RTEINCHS); + if (t2 == PRIMITIVETYPE || t2 == FILETYPE) errsignal(RTEINCHS); + if (t1 != PURECOROUTINE && t1 != PUREPROCESS) + { + if (t2 == PURECOROUTINE || t2 == PUREPROCESS) return (TRUE); + else + { + if (!prefh(ta, M[ tb+1 ])) + { + if (!prefh(tb, M[ ta+1 ])) errsignal(RTEINCHS); + else return (TRUE); + } + } + } + else /* something pure */ + { + if (t1 != t2) + { + /* AIL : t1 below replaced with t2, 1989.02.02 */ + /* if (t1 == PURECOROUTINE || t1 == PUREPROCESS) */ + if (t2 == PURECOROUTINE || t2 == PUREPROCESS) + knd = RECORD; /* used as junk */ + else knd = prototype[ M[ tb+1 ] ]->kind; + + if ((t1 == PURECOROUTINE && knd != COROUTINE) || + (t1 == PUREPROCESS && knd != PROCESS)) + { + if ((t1 != PURECOROUTINE) || + (knd != PROCESS && t2 != PUREPROCESS)) + return (TRUE); + } + } + } + } + return (FALSE); +} /* end typef */ + + +/* Verify the compatibility of formal/actual procedure (function) heads. + */ + +void heads(virt, nr) +virtaddr *virt; +word nr; +{ + word i, j, fp, gp, oba, g, slen, dim, t1, t2, tp, ftv; + protdescr *ptr; + bool junk; + word x[ MAXHDLEN+1 ], y[ MAXHDLEN+1 ]; + /* The two arrays declared above may be dynamically generated as objects */ + /* upon entry to heads. In fact heads was implemented this way in the */ + /* original LOGLAN running system on MERA-400 */ + + oba = M[ virt->addr ]; + ptr = prototype[ M[ oba+PROTNUM ] ]; + fp = M[ ptr->pfdescr+nr ]; /* parameter description pointer */ + slen = M[ fp+2 ]; /* length of its desclist */ + if (slen > MAXHDLEN) errsignal(RTEFHTLG); + ftv = oba+M[ ptr->parlist+nr ]; /* type value pointer */ + g = M[ ftv ]; + if (M[ ftv+1 ] == M[ g+1 ]) /* not none */ + g = M[ g ]; /* am of SL */ + else errsignal(RTESLCOF); /* SL chain cut off */ + gp = M[ ftv+2 ]; /* prototype number of g */ + ptr = prototype[ gp ]; + t2 = M[ fp ]; /* t2 = F-kind */ + if (ptr->kind == FUNCTION) + { + if (t2 != FORMFUNC) errsignal(RTEINCHS); + junk = typep0(g, gp, TRUE, &dim, &tp); + junk = typep0(oba, fp+2, FALSE, &t1, &t2); + if (typef(dim, tp, t1, t2)) errsignal(RTEINCHS); + } + else + if (t2 != FORMPROC) errsignal(RTEINCHS); + if (slen != ptr->lthparlist) /* incompatible lengths */ + errsignal(RTEINCHS); + t1 = M[ fp+1 ]-1; /* oba descriptlist */ + t2 = ptr->pfdescr-1; /* g descriptlist */ + for (i = 1; i <= slen; i++ ) /* verify second order lists */ + { + x[ i ] = DUMMY; /* mark entry as empty */ + y[ i ] = DUMMY; + fp = M[ t1+i ]; /* first type pointer */ + gp = M[ t2+i ]; /* second type pointer */ + tp = M[ fp ]; /* first type ordinal */ + if (tp != M[ gp ]) errsignal(RTEINCHS); + if (tp == FORMTYPE) + { + x[ i ] = fp; /* save pointers to formal types */ + y[ i ] = gp; + } + else + { + if (tp == PARIN || tp == PAROUT || tp == PARINOUT) + { + /* AIL 1989.02.02 */ + /* if (typep0(oba, fp, FALSE, &dim, &tp)) */ + if (! typep0(oba, fp, FALSE, &dim, &tp)) + { /* undefined yet */ + /* search preceding formals */ + for (j = 1; j <= i; j++ ) + if (x[ j ] == M[ fp+2 ]) + break; + if (j > i) errsignal(RTEINCHS); + if (y[ j ] != M[ gp+2 ]) errsignal(RTEINCHS); + } + else /* already defined */ + { + for (j = 1; j <= i; j++ ) + if (y [ j ] == M[ gp+2 ]) + errsignal(RTEINCHS); + junk = typep0(g, gp, FALSE, &j, &ftv); + junk = typef(dim, tp, j, ftv); + } + } + } + } +} + diff --git a/sources/int/util.c b/sources/int/util.c new file mode 100644 index 0000000..c4ebd19 --- /dev/null +++ b/sources/int/util.c @@ -0,0 +1,194 @@ + /* Loglan82 Compiler&Interpreter + Copyright (C) 1981-1993 Institute of Informatics, University of Warsaw + Copyright (C) 1993, 1994 LITA, Pau + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + contacts: Andrzej.Salwicki@univ-pau.fr + +or Andrzej Salwicki + LITA Departement d'Informatique + Universite de Pau + Avenue de l'Universite + 64000 Pau FRANCE + tel. ++33 59923154 fax. ++33 59841696 + +======================================================================= +*/ + +#include "depend.h" +#include "genint.h" +#include "int.h" +#include "process.h" +#include "intproto.h" + +#include "tcpip.h" + +#include + +/* Utility routines */ + + +word entier(x) /* Compute entier (floor) */ +double x; +{ + word i; + + if (x >= 0.0) + { + i = (word)x; + return(i); + } + else + { + i = (word)(-x); + i = -i; + if ((double)i <= x) return(i); else return(i-1); + } +} /* end entier */ + + +word shift(x, n) /* shift x by n bits */ +word x, n; +{ + if (n == 0) return (x); + if (n > 0) return (x << n); + else return ( (x >> -n) & ~(~(word)0 << (8*sizeof(word)+n)) ); +} /* end shift */ + + +char *asciiz(virt) /* Get ASCIIZ string from arrayof char */ +virtaddr *virt; +{ + word am; + int len, i; + char *cp; + + if (member(virt, &am)) + { + len = M[ am ]-3; /* length of the string */ + cp = ballocate(len+1); /* allocate buffer for the string */ + if (cp == NULL) errsignal(RTEMEMOV); + for (i = 0; i < len; i++) cp[ i ] = (char) M[ am+3+i ]; + cp[ len ] = '\0'; /* terminate string with 0 byte */ + return (cp); + } + else errsignal(RTEREFTN); /* reference to none */ +} /* end asciiz */ + + +void addext(fname, ext) /* Add extension to a file name */ +char *fname, *ext; +{ + char *cp; + + cp = fname; + while (*cp != '\0' && *cp != '.') cp++; + strcpy(cp, ext); +} /* end addext */ + + +void usage() +{ +#if DLINK + fprintf(stderr,"Usage: int [-i] [-d] [-m memsize] [-r console] file\n"); + net_logoff(); +#elif TCPIP + fprintf(stderr,"Usage: int [-i] [-d] [-m memsize]\n"); + fprintf(stderr,"\t[-r console_number #_of_slaves_to_wait_for|master_address]\n"); + fprintf(stderr,"\tfile\n"); + fprintf(stderr,"master address in form: nnn.nnn.nnn.nnn:[port]\n"); + fprintf(stderr," or : host_name:[port]\n"); + fprintf(stderr,"default port number : %d\n",PORT); +#else + fprintf(stderr,"Usage: int [-i] [-d] [-m memsize] file\n"); +#endif + exit(4); +} + + +void abend(msg) /* Print error message and abort */ +char *msg; +{ + fprintf(stderr, "Error: %s\n", msg); +#if DLINK + net_logoff(); +#endif + exit(8); +} /* end abend */ + + +/* Pseudo random number generator */ + +static int ranpat1 = 7, ranpat2 = 503, ranpat3 = 15661; + +void ranset() /* Initialize generator */ +{ + long tim; + + time(&tim); + ranpat1 = tim % 30269; + ranpat2 = tim % 30307; + ranpat3 = tim % 30323; +} /* end ranset */ + + +double prandom() /* Produce next pseudo random number */ +{ + int i; + double r; + + ranpat1 = 171*(ranpat1 % 177)- 2*(ranpat1 / 177); + if (ranpat1 < 0) ranpat1 += 30269; + ranpat2 = 172*(ranpat2 % 176)-35*(ranpat2 / 176); + if (ranpat2 < 0) ranpat2 += 30307; + ranpat3 = 170*(ranpat3 % 178)-63*(ranpat3 / 178); + if (ranpat3 < 0) ranpat3 += 30323; + r = ranpat1/30269.0 + ranpat2/30307.0 + ranpat3/30323.0; + i = (int)r; + return (r-i); +} + + +void moveblock(from, to, len) /* Copy a block of memory */ +char *from, *to; +word len; +{ + while (len-- > 0) *to++ = *from++; +} /* end moveblock */ + + +/************************************************************** + +#define LINE 10 +void dump(pix, from, len) +word pix, from; +int len; +{ + int i; + memory M; + + M = process[ pix ].M; + while (len > 0) + { + printf("%6ld: ", (long) from); + for (i = 0; i < LINE; i++) printf("%7ld", (long)M[from++]); + putchar('\n'); + len -= LINE; + } +} + + **************************************************************/ + diff --git a/sources/int/x11graf1.c b/sources/int/x11graf1.c new file mode 100644 index 0000000..8c76166 --- /dev/null +++ b/sources/int/x11graf1.c @@ -0,0 +1,51 @@ +/* Loglan82 Compiler&Interpreter + Copyright (C) 1993 Institute of Informatics, University of Warsaw + Copyright (C) 1993, 1994 LITA, Pau + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + contacts: Andrzej.Salwicki@univ-pau.fr + +or Andrzej Salwicki + LITA Departement d'Informatique + Universite de Pau + Avenue de l'Universite + 64000 Pau FRANCE + tel. ++33 59923154 fax. ++33 59841696 + +======================================================================= +*/ + +#include +#include + +#include +#include + +static int child_no=0; +static int curx=0,cury=0; +static int fcol=1,bcol=0; +static int style=1; + +static Display *theDisplay; +static Window myWindow,theWindow; +static XClientMessageEvent theMessage; +static XEvent retEv; + +static word w; + +static struct { int x,y,fcol,bcol,style; } xystack[16]; +static stackptr=0; + diff --git a/sources/int/x11graf2.c b/sources/int/x11graf2.c new file mode 100644 index 0000000..b813980 --- /dev/null +++ b/sources/int/x11graf2.c @@ -0,0 +1,414 @@ +/* Loglan82 Compiler&Interpreter + Copyright (C) 1981-1993 Institute of Informatics, University of Warsaw + Copyright (C) 1993, 1994 LITA, Pau + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + contacts: Andrzej.Salwicki@univ-pau.fr + +or Andrzej Salwicki + LITA Departement d'Informatique + Universite de Pau + Avenue de l'Universite + 64000 Pau FRANCE + tel. ++33 59923154 fax. ++33 59841696 + +======================================================================= +*/ + +#define send_par(par) theMessage.data.s[cnt++]=(short)(param[par].xword); +#define send_shrt(wd) theMessage.data.s[cnt++]=(short)(wd); +#define send_word(wd) theMessage.data.s[cnt++]=(short)((wd)&0xffff); \ + theMessage.data.s[cnt++]=(short)(((wd)>>16)&0xffff); + + +#define send_sig \ + theMessage.type=ClientMessage; \ + theMessage.format = 16; \ + theMessage.message_type = nrproc; \ + XSendEvent(theDisplay,theWindow,True,NoEventMask,&theMessage); \ + XFlush(theDisplay); + +#define nxtev do XNextEvent( theDisplay, &retEv ); \ + while( retEv.type!=ClientMessage ); \ + cnt = 0; + +#define rec_par(par) param[par].xword=(int)(retEv.xclient.data.s[cnt++]); +#define rec_shrt(sh) sh = (int)(retEv.xclient.data.s[cnt++]); +#define rec_word(wd) wd = (int)(retEv.xclient.data.s[cnt++]) & 0xffff; \ + wd |= (int)(retEv.xclient.data.s[cnt++]) << 16; + + + + case GRON : + if ((theDisplay = XOpenDisplay(NULL)) == NULL){ + fprintf (stderr,"\nint: Can't open display\n"); + exit(1); + } + myWindow = XCreateWindow( + theDisplay, + RootWindow(theDisplay,DefaultScreen(theDisplay)), + 0,0,1,1,0, + CopyFromParent,InputOnly,CopyFromParent, + 0,NULL + ); + if( (child_no=fork())==0 ){ + char me[16]; + sprintf(me,"%d",(int)myWindow); + execlp("herc","herc",me,NULL); + } + graphmode = TRUE; + curx=cury=0; + nxtev + rec_word(theWindow); + break; + + case GROFF : + if( graphmode == FALSE ) break; + send_sig + child_no=0; + graphmode = FALSE; + break; + + case CLS : + send_sig + break; + + + case PUSHXY : + xystack[stackptr].x = curx; + xystack[stackptr].y = cury; + xystack[stackptr].fcol = fcol; + xystack[stackptr].bcol = bcol; + xystack[stackptr].style= style; + + stackptr++; + if( stackptr == 16 ) stackptr--; + + break; + + + case POPHXY : + + stackptr--; + if( stackptr < 0 ){ + stackptr = 0; + break; + } + + curx = xystack[stackptr].x; + cury = xystack[stackptr].y; + fcol = xystack[stackptr].fcol; + bcol = xystack[stackptr].bcol; + style= xystack[stackptr].style; + + cnt = 0; + nrproc = COLOR; + send_shrt(fcol) + send_sig + + cnt = 0; + nrproc = BORDER; + send_shrt(bcol) + send_sig + + cnt = 0; + nrproc = STYLE; + send_shrt(style) + send_sig + + break; + + + case POINT : + send_par(0) + send_par(1) + send_sig + case MOVE : + curx=param[0].xword; + cury=param[1].xword; + break; + + case DRAW : + send_shrt(curx) + send_shrt(cury) + send_par(0) + send_par(1) + send_sig + curx=param[0].xword; + cury=param[1].xword; + break; + + case INXPOS : + param[0].xword = curx; + break; + + case INYPOS : + param[0].xword = cury; + break; + + case HFILL : + case VFILL : + send_shrt(curx) + send_shrt(cury) + send_par(0) + send_sig + break; + + case HASCII : + send_shrt(curx) + send_shrt(cury) + send_par(0) + send_sig + if( param[0].xword != 0 ) curx += 8; + break; + + case COLOR : + fcol = param[0].xword; + send_par(0) + send_sig + break; + + case BORDER : + bcol = param[0].xword; + send_par(0) + send_sig + break; + + case STYLE : + bcol = param[0].xword; + send_par(0) + send_sig + break; + + case INPIX : + send_par(0) + send_par(1) + send_sig + curx=param[0].xword; + cury=param[1].xword; + nxtev + rec_par(2) + break; + + case OUTSTRING : + { + char *s= (char *)(M + strings + param[ 0 ].xword + 1); + int signs=M[ strings + param[ 0 ].xword ]; + nrproc=HASCII; + while( signs-- ){ + word sign=0; + cnt = 0; + send_shrt(curx) + send_shrt(cury) + send_shrt(sign) + send_sig + sign = (word)(*s); + cnt = 0; + send_shrt(curx) + send_shrt(cury) + send_shrt(sign) + send_sig + s++; + curx+=8; + } + } + break; + + case GETMAP : + { + word map; + word x=param[0].xword; + word y=param[1].xword; + word w = x - curx + 1; + word h = y - cury + 1; + x = curx; + y = cury; + if( w <= 0 ){ w=-w; x-=w; } + if( h <= 0 ){ h=-h; y-=h; } + send_shrt(x) + send_shrt(y) + send_shrt(w) + send_shrt(h) + send_sig + nxtev + rec_word(map) + newarry((word) 1, 3, (word)AINT, ¶m[ 2 ].xvirt, &am); + M[ am+3 ] = map; + M[ am+4 ] = w; + M[ am+5 ] = h; + } + break; + + case PUTMAP : + case ORMAP : + case XORMAP : + if (member(¶m[ 0 ].xvirt, &am)){ + send_word( M[ am+3 ] ) + send_shrt(curx) + send_shrt(cury) + send_shrt( M[ am+4 ] ) + send_shrt( M[ am+5 ] ) + send_sig + }else errsignal(RTEREFTN); + break; + +/* + case PATERN : + patern((int *) ¶m[ 0 ].xword, (int *) ¶m[ 1 ].xword, + (int *) ¶m[ 2 ].xword, (int *) ¶m[ 3 ].xword); + break; + + case INTENS : + intens((int *) ¶m[ 0 ].xword); + break; + + case PALETT : + pallet((int *) ¶m[ 0 ].xword); + break; + + case VIDEO : + if (member(¶m[ 0 ].xvirt, &am)) + if (M[ am ] >= 0x8000L/sizeof(word)) + video(normalize((char *) &M[ am+3 ])); + else errsignal(RTEILLAB); + else errsignal(RTEREFTN); + break; + + case HPAGE : + i = (int) param[ 1 ].xword; + if (i == 0) graphmode = FALSE; + else + if (i == 1) graphmode = TRUE; + hpage((int *) ¶m[ 0 ].xword, &i, + (int *) ¶m[ 2 ].xword); + break; + + case NOCARD : + param[ 0 ].xword = nocard(NULL); + break; +*/ + + case TRACK : + send_par(0) + send_par(1) + send_sig + nxtev + rec_shrt( curx ) + rec_shrt( cury ) + break; + + case INKEY : + if( child_no == 0 ) param[ 0 ].xword = inkey(); + else + { + int keycode; + send_sig + nxtev + rec_word(keycode) + param[ 0 ].xword = keycode; + } + break; + +/* + case HFONT : + hfont((int *) ¶m[ 0 ].xword, (int *) ¶m[ 1 ].xword); + break; + + case HFONT8 : + param[ 0 ].xword = 0; + param[ 1 ].xword = 0; + hfont8((int *) ¶m[ 0 ].xword, (int *) ¶m[ 1 ].xword); + break; +*/ + + case CIRB : + { + double alfa,beta,aspect,abs; word kolb,wwyp; + + send_par(0) + send_par(1) + param[2].xword *= 2; + send_par(2) + alfa = (double)(param[3].xreal); + beta = (double)(param[4].xreal); + kolb = param[5].xword; + wwyp = param[6].xword; + + aspect = (double)(param[7].xword) / (double)(param[8].xword); + aspect *= (double)(param[2].xword); + + alfa = alfa / M_PI * 180.0 * 64.0 ; + beta = beta / M_PI * 180.0 * 64.0 ; + + abs = alfa - beta; + if( abs < 0.0 ) abs = -abs; + if( abs < 0.0001 ) + beta+=360.0*64.0; + + send_shrt( (unsigned)aspect ) + send_shrt( (unsigned)alfa ) + send_shrt( (unsigned)beta ) + send_sig + } + break; + +/* MOUSE */ + + case INIT : + param[ 0 ].xbool = 2; + param[ 1 ].xbool = lbool(1); + break; + + case STATUS : + send_sig + nxtev + rec_par(0) + rec_par(1) + rec_par(2) + rec_par(3) + rec_par(4) + break; + + case GETPRESS : + case GETRELEASE : + send_par(0) + send_sig + nxtev + rec_par(1) + rec_par(2) + rec_par(3) + rec_par(4) + rec_par(5) + rec_par(6) + break; + + case SHOWCURSOR : + case HIDECURSOR : + case SETPOSITION : + case SETWINDOW : + case DEFCURSOR : + case SETSPEED : + case SETMARGINS : + case SETTHRESHOLD : + break; + + case GETMOVEMENT : + send_sig + nxtev + rec_par(0) + rec_par(1) + break; + diff --git a/sources/lotek.src/lha.exe b/sources/lotek.src/lha.exe new file mode 100644 index 0000000000000000000000000000000000000000..84eb2bf76f395e2c2d7ed7fa422244c4a9295904 GIT binary patch literal 33951 zcmeFadw5jU)dzgeoS8GZ4j~BvxeNg_BP0+p!KlnI1PPNU7!sn8fCg`Ez18+jX245; zNe2oi8?ah?p_O77Z0l%wClu?%CYJiFe6!&-#fne^;`F{JH3759-U*CV< z^XbExbM|HJwbx#I?X}lhd*{Ao+qrq1o=fG{j8&AF#3Rv)!r{O1_{Za)jDP8PnZSoc zy#D|H{eO%C!H~G6NgVzDsRrvNb1t`M#>bPazUkc1-fFJKpxa+|~gd|1q;iSOOQe>`bokW(}6Mn)bNWrqySWF*IpU1kQZ7DpP|uYVFBX?9eIOXcHSpY^lCqF{Xhpek zS=sW5rJw$L^#W9P{`cxSF8erY-+Nu{-~^6t;etF@WHuYEAEp4wuGnUm0ce8UAEux; z+V{=)o=5|QMSC0#Iv`)VzNyru3-EguemqGKXK)oc#fwQ-oxW3^x9RAngWhivG7bty zmzCMfS=`D|MdGIR=?UDHrakw5JjqyE5iKEk1FE$I6{SVVnZe#kA?;)zEq#!5Ri9Qk?_lbh3$rA7xe~mN9Z5P@bntia4M_XP)L>Z}d%5XxR^7{GAE1Yld|NFl40jAeti&aR z{>phBTP>VBkrm$_M?*<8v=s03w~u)oA_#I^=K9^(Og#4@`cKhSP$} z!DRG*uBAi=^Wz#&C2?v5nC*$$-&?YeXCHWvOQpXlljCc*Uj5uy_PRdJUgBD9zu)yg z_W7~mcc>oP9KAIxPYMP&dP`WoDY%!T6T|Yz;3pg% z9hRempK)|Vn5N#N5mN}=&C>&kl5;>RA7Yfg-#vrTbm5N-Wogs(T*DcTj{o8MCihrU zK0us9;3&7?9pqdw!8TJ7txELn*JW@?~Y@Uk_j0h{0F_~VRdXr2NU@k zvp$W!`8X!P@R(XPx#Y@Z?ye5UqUPDKQgbt$<(2IFHwM6I}3cfc|B1a3TKSR(1Wtgr!ZvM#&Hr%NmJwqar$A;e2$y&@XZh}oFt znFBu5UQ$tSLtrd?k+byfFpt)gKN3tEkwe7D!}6cmE78g8{uaWuD| zk=#ACO+*GKuV3HeG8U5f{CqjZ>v#fX<7%Ja=vb|k5PFs;M{A6;#P=<3qsQ^SWxCr$ zj(X-ycPDrpu~@vK=VHDZMuqGOOU`vq(~>cC0Pi*QIZE%j zITWpU9nWxK_d?bJo$}}oeHvh_<)Ik`9U4DueUy<}mClOz3>RFWCI9SEpCOGgVX1or z%bedTDolt&k~5Hs`w<}3{RnsfEscB>zgVPlqW_vn3)E3{$04bqn5R!X68bq8T*A{G zY(`ai912z+w>rgL&!S9G&=6llxp?n>J^gXCz0fVP5q!-e7qfP_s(Z;kK>lYGnp^h> z=~^J5Cs_XU_F3-9==pMT(k9;r8}^jg7R1@%|G#}S1^+R!Tg z8pzfRt-$PSX%pX8wTE5m^UvzjuRi~%K6m1&&CdjFa+HvM(#G_O3n0yMm#G9_SglX7 zFDxe#U*d5X!2kx*N*AnHg6Gd3CWo^RKplSmVbYb|By=XVdz%xz9UN)KFeovSb4V%= z?=K%Bg?i!?tOf4M+O^lF-W> z6uC{uBXuh01s{uR&?VCsQdNK>08=LwvL;CR1>(Fkyp+0MBIdU(wYx0C39h95NFaqn z#2L0qBY+{~DgkYrVF{S}{FdR5w=KS17FO8WX5=_)TfUCt)X&!Z1WplmTG;qrm9ClU z=p82Aq<_8QGGH`zJ*29Sq`Ahtj;Aw3(%di_!nc!tv34K!=pU4Ka|ltdoH&oD!3+&9HZ`u z80ixj7nj02!^@fc$pV)QS$OwIkgRQU;YHf5BV7<~?lFopyxAF|&xs{PtQN~#dj<1s zdC6vHCoKeS%OR$O(2o_6g0#jyg9eJ#;~jsaE+CKU&vB%In9|%F34FdY5xkn zl}TjF)ei=3^nX@)i~+r_k&?OKmcM4uj)x!x#D*X7)cX)pXpf%sX@r@u*(sAR=`#;u zdOgk4$5}R`hRk$JGb^KW$9raHx}!*I!%uknw+Gb%=>7;cmB2S~Wtbog@9XHG(cmht z2_bqT3H2Z$*1zE?!AK|H`JdgX&js@*FyP=dUYi86Rc$Q7>8$3Bjk$wCj%(n!2vY{3 z*>W7^jlLlERqt7R0sQO+KV#&s@v|m*7*<%8rNSX;Nf<17SRj4)Nq;c=xM2k6?d0ft zqHhoC{|)u`TwkAk4$mcRx@!gU<2bGsS*T$!ajIx(nv)SGrahM0zgfKdOv0yXL1__$ zOMc9LbI=mWi_A&M6twu>yK#yEO?3nK%5vbvt9VToHQ}a_XwxyeY>xJN-OSV%FNqYo z7+TLUB4Vw`bj`KTff}9;eKo^9SLU4_tRDuLAKc%|52>G-u9&N77vy_9sFTMM<}e$@ zET??O)m)vNp@E&Hccp658NAQhp$C`MwAbiq%d%PR*p|C^Ink*&hgc@#Ya#R#g|wDm zlOk~uDbh?A>PVk9&5V$hI;{txUhEW@sJc4KULUg9b(pQ&I6LnuSjV*Kx70ooP?qG! z*qj59{I@?hPX{FYUMrboLS+7VwYORO?{GUYt>HzSjt5u$fq#7CVkcE0G zsg(RUt-880$Wzsi>w118ucMbeVU68ykWh?~vzs)sVWNO+VCnL(Jeq+MB28SE!C1FE zjLjZ)eEppJC}v$$@MX5bPad1ya}^F-TGXk!n8ER`jpN*RLK1g?rrSzt+Oxi`*+=6`*^9Sd z098&gs>I#o?Jsi~y#0mlqs77X=-ER8mJS9%wVWikInQx-Y<8a8Tz-x|UQ*+{wBvmX z(_S&PTE%tztyh=J#A4D#jFyR9$4SX~9&aa&b%stVK?^WixW2kr_I?SAI*Lfn%k1SO z&q@@48`&2Zu8Z!Zh9aiD)H<=f$EtRoK5D- z>^@&3YDUeyRs~>rmN_x3Wv+Q|ep*Mzs;I`dhtqk=~me@~0hh_Pug?Yvjru|@I{QW%>T)4Og+9T>$@+42e1FI(~0SHWrt zwTjl=P5R_y=zOUh-Lwd8R2h+)KacdSSKP6%t6*;e)$P4eqz#B-f*xv+c>0clCK@*J z^)JWKH}Q^HRlK=S44w;+ay{K=FN^Hu#p1=PF-FxeWtZ1E#Cw;7x!Kb>_m9}le`Y>= zW~$FA>T_~F%d|(94_TPNagw>u;v2ARb`H=(9E8C{`qO*=OMY!1*6{(0JRKl4fd@)O zt3W??qGPM8wMr3ik>VQLF2StphH6$bF-s9nWHrfxPVcmJSM-;+fMk87*I8q*=eitr zoohN4u<@|_JBZ$Q#v%K66Pl?BOs-Xh;5=#rWBj+oG$lmXZ*>3k-n!EyDYIFbT# zy?^)YQ5@TCqomuA-4yz@?sZ*q))|A2^EF$7`z;On#vbaHKMvSj|m;yVnz z=%B^-5r`C@Tss1ZM=ZX-TV78=P2Wk&>!aB32}_%J4ye?gw9M9FwSi4?HqW_?OazDi z$P@F(>9-|AFE>iPreNr5-N4_HKx(YS>H;g^FV=G#w53i-{477nk^X}-hnYyv6x#M z#w7brS(q#2q(xD@127AGY}VfY|^rJ89w8P9^(t z>5(BHwV($5Q!z19i*OW6NiDTt!MUs7_l*Uwp?moVEt9dNjU%lfD(efQd){326MNNf zt_T-N9JU`{f@iAFLnCk93JyA0+icmI(KYViR8aaR(?{TrW{bRbm>jxf={l11ZHXAx4)TS#**{rw>J0q!clZl-q>k@mf#lUbt9 zmA5g@3G|N9{35MXG-*}$vXA!)7i*6J$$whtFZ(b+BiQcSq%to757%~~v60EXq-6P; zYe)UAJ!O&f7+VeAWYRiapS(kt%!ZncY3&Kij#0^sr9T|pAtZ;wT&w;*;4odsN~u`6 zr`CRBp)W1+owwAUw-^LYh1aU*8LGonODz&|kWVc(FuQ9OYGi=-edjE-=dP=wb26GL z^jAIC4Z^<`2{|aIGH+Fn*Kxv<>Pl+U8#rLys?T)-MYY9YZnj-;8@-MT;DlSq3AGI8 zWWuXW4^uhoD9aLSFIbpksx_lUGDdRLUO}#Cy&BakHd~;%85R7p(QdZ*;J8x9nOTFo z?)F^*Q7>B}3|7zP4$?0=pwJB)w|_hW_} z?QC8_Gd!ktW-FMnIpdRYUEYw+dz=$Y2Qk~hOQuiI@L`PhCze_!>{Om&0~=vA^}Au1 zX^b_-tTVYn7aM8gHP+lxsP+>!V+=0s$KYzy$E;18;Yl<+ecrx>r2v37orZfWI9Nwi zr5oK?pBvFZRDpjX^cy()e#6%srN{4MtE}tA>hFHTvpr2}@DN`!p68uAs(K| zt-XUCUz2Tb@*9m#xyaN1f;*X&gjF-zs>9y5S+}=?#}==Dm3uVHNYo6`(P>!3@4RpC z5gsz^%Z}4z`eelP+B5#{%DSZVEkH0~wDpCpWPzAh-Ec$nXE86U=`)g{wiK8tGm7I?( zO3p$2`#b&}fv!|Vzl%?TMx)N*{O6UxvhHzI&2> zHF%vX5)+oBd}N_dUsg*o4GUZPOg9sa^r3qpD=C*t`fAgy5>Uqi3|@ZbUdfSe)s!Zv zu+1>lH)#rP43>i_coh!bGZ(whaiqE9WXDNEg0Sg0{o{Gfn5cSF((m>TL{*(6Iq6n7 z7umv&66>xn5k+QVcYG$hNt0)gI4xM|=#v+*w!uOl|GjS;#NZTxTRo#qoFW*o(lSFj z)R8FykB?|8?^ZvU_YuX`MAuFc=oOQ1iU4E(2@Cz#eARI37OSl%ER(p}Z5FDFjwn#C z|C(17u{IHsm?P$G7Lp%J|8ckPAY|D`7T*#4{9V=V(gpg^J%H>>v$AG*7XXBZ%huK~ zBoKO%hI#IF;JF6Y&OSPB02upHm}}BE#u`kq(svSx*=(&%wc5n-R=3`U<|-z$ZdKcE z6y?=64H_+-f-r+frHDdWn`Sl4;C8fuwrI*dksj)$fqqD&B0y4|*QO)jn7>=-U6;Ty z^hYOZCkLPm(T0B3)U$W|yYn@%6nPvm7&$}mE&&wF z2g};KVIUY@mac7JBm0b&k(#ks+nUnnGIHt9FOdt^S#qTe(yH1_R_HUz`-Bs8?-g)! z+w6$wkF0iBuj#gLw6$({Q|FrMaqvulGKque5(Xs$u8(o~CPbX5n_2pV!UQy2;%xtU zb;tyoKZR}^%5J*Bm;e{c4R+f!2GFxMfpf=1pp8}Ls;K^-24VL{WZ!lBd92bmg1iOm z-8HMyNV+MVEtkL3p#I-RqXXB$oWW#rWV3riudwOZ3ez1kc+rG((#}X$;1t@KA2IRb zFwL1gi;e;lQ;TQLt?m(?Dj3|w);t|%0MrtYKG{hQ3!h<+iz0M7M2qILFu=1c3sC7d z7k1EZ=0YnmVAY1J^#Jy|H)|s?rg*dSYa0HRIIskm{%OhR8+WLz3PmEtpkG4U{9+I> z3=;>@)K@mL?*{QYONxx?{+_aw6z)gS`*E9Q8H=nOM5ncM-WwLH}A?cN$WER^; ziV8~$95~C#Lz9olQwjodwy2Qdc z{yYa$HY&I_9uqxYluht_C%{~weqS*FNIvN$ZP@AjaK5^=uPMIT+8J2!%djN=86u1^ zVj^4)XdpvG*b`LeD&6jq*A1#PoK90 zO5{|AJ|bJvP4r3joq%tn3vN_qruaNJu;{;#TU!H-m+U#)yCtU0PFK37eEs?kW})L^v`S@VCG2Y`G& zHrqvT%ow=d(+KuzxnIEcrj(ZDfvrw^m1tu1X87(J{6+7}@iiZ?ODm%ehEkPLTBk7KY$Gmf;yl<8M*f zUw|GDbG19kGCUxeM+`3b|$p#dcqO_moikN3FQ4Sy2o z$lF+sUx3b=Gg)Cs?iPxa9LVU#bda10>k)Uzh>&6GPjv9-Cc5e7&@cJmK2}3NxlP=L zl~2MV0A<@6&#WM9vB8ov=HJ${t2({e>PxkH6{9QFtLR?Fev2(g zFwC%(d3Z7Tvy8>W>j2)aRMx#2Ie1>x9GyH%`vl4Y>zLZ@s;97a*~C*8*CU#pJ$L{U zsPP=YFf``7Z_#25#s)i=t) zN%CUJLpl;qJE7)YtCHO6{5E@|^W4VrOA%ZDb2ixe+04#r$~sPuDm$iG1N>ik`l-?q z;E~eCerwFrtn>p#L+f$4BsMz(kgB0MQsGX#O3pvFI=4N%+4@35J2UWA6%Ot&dnXEv9AOy95(XJMyv99muk(TKN>09@5JOE}~fK6}Z&`pJ5FPs1^4MRe` z$k7VeG+fN$8BoJ5x6FVyB9?S@oNn8Yi8+!xThCQp7;a~-+73URv}ZTjoMGnd99k)0 z2ZcRLIyr_d`i9E_y=%1gnrZb-4ygVFdXJg}sUZO>wlMmtj_jtXg+n*}yJOv@he7fe zz#)O*;BCybVi%3iBoz@kDCmpm63S@LU+21GVQz=Ak3dwyX^bsk#EEyi$IhI1cIL#h zGbf%s;=~&tbm(EDNS%#UBi>_AT^UuQSEIk6cCB#c+xn}50KpfkN*EI(2!~#(di64? zX*Rh4N9xTiZ(la=O{@0lEC%e>{JG?!T4*&2fg(py;zg~*ElfHvgCuExFO`#%7_GgH z_5h?NdsTj858Ue=;8uUV_i#WSTOB?Za2rv3`3xET$8G`de1^BxR2`;u6(^x|-P*xA z2=P^Y&cmUfo7Z@tedo;N(T^zLv-u1q$3p?7eNC2Z7>E4J-8Z2txeX zRG`uDh#pbrbR`RbZ+J|PSakZ-REUR$AL#1`0axN12!4aWpdd*v~bd85CS4g4_thSU^R8v(JZGwsU(6;2d`!|7Ex zqHh>Zo4CQ4s`+nxHZsR-< zDxhWeTU*4R`pIAty2Rl zz*S~rNh2JJ<`?{%ZzJc4>0!Tcs3X+<2BwH<{4TmGnHQh)$HFf||7=)Z`+~pYq;I8P zPEbtG`Mu&wziz%Q^Jjiny_q;x`nQ;W>i1$Raz_qpHfM_&*xzm?6RgsB>5l9kB>dFB z;dW$J_^shhyeG$&v<ZLL`cyClC-2z|_v_c>4X*UH+ZIW_>SFyv%7*7(Vn#7;JI zp4bD=PlpRRlw&h#d8Rdf+o6>@xNHvP#NtCjAu^j4?f9zVb5;2om?Vzt29BHVPNSv?)6a$-}~_;YH1=x37pse&Am^Mt?pe13Yz*_>Dq zKy91YV-u3n8sv(|H-Rk7Gm*{$q#<@e-s@?{P|=e>=bhg%&ly@dWwR6nY^ zb8P5SWmNS6^a|l9-T z3Bbr_p?eh-Hbclt#)I5j%+LCzIb?i<;$V5JG|I{-F4-rx5QodJLIB%=-z2k30|rKr zM%8q^t5ZjjjdcWq1{7mQ%uo1*uAG{QDuuqhN};9daDxnX@b2v^)G-DfhDmv?AVw2J zvojWA>>jpmP}u~PCaRv-2Z}J`48HNZ$b6m8jHjMFB>GDIl6jfm_aJ`C{RqE)+>eEr zMi1dU6FPzkzpubog{J`Gd{6*OoI35yMsWI-j!-a_P2>;N3Hn)rFET%)bZz1fA(Lpu zQ0;U6yYRkJ0ENAd=lq=O39z5RRt}?d933X9PDe%kF z$rl;sXZ&7SceA<5Z@9v-RK@g^pK?R&$K88lJCCECmvNrUzoNF(Ptd;%@j?GMbWoZf zB|Q{_Q(llaOip8=c>q+I5PRG`vf)@=tFeyEPn7ccwtRt0kjz(UbzhtWSq(PsJm~{X z=IcQ>GGFv9!!ruRBlBZ?D*5jB`<5^Y61VBSE1Wkhy7{{cvG|-7dOOZmw?3zDEYxH@ zL>;7{N@qRz=OTp4NrM|iqEw&2#SjlKs63)kh^zNNyQ%$9Qwb2S8bicy% zwJ$TeRNO9`Ab(%*LpqD>931E?;4|=(P$(IzA!uEn#5F$bWvfDcm~WiE^Gf%wA(&_y zXY8n%kRNm0onEgf-Mbd`c6j@Bt3=-PuvZ@C?N3@2=SC#>!`S0K>SY1`k9*~)ECssD zhR40O@XD5mzEoVYH*@FaDn;lc?Q^r57;tj5l)e?8UnYE#rPPdfdIrT+`hWmUt7SSC z_^?8^#M>^qZ>kQ@+*ujL6c)iLUkd2RiE8<_o%Da=ZM`d7BhZ0vy@Jy$*Kj6B1JU%p zcn$UCSxwg?Z+bm*Co#{crMJhQx-8pSCvJAf4kxC@-}Cyd$j_>!qv8X4aulHxREU?8 zU!Q^0nYC1j3q-TjWcqEKJOa3Hn6Z;Nw2*Zs4qYZHQjBwhVZLGJi}f>hyf^drG&LIA z$#%8ii-81M7gyaM<|}Tao^UXUYk1gOpSklr;M5;AJBh0>u`~k*t%L3h%SO@_h@ora zXcFuP*~bGWT8R@0_<1HSXyO{uhwFY2HQU7MB2CYs$8^0`H;T@S+n=+}4^=R8li%}| z(XF?>T|=`JJi9y}dJcb%KI~9Y1Dsn-Ds;J!awksQD9t4CS=zho>k^Tos8x$eq7-f_~E%A6(*CT>B;$%|wy8^6S`^w^)^Q@9VEXgaAyGQ9^qwT8fwcH3 zvK9@SSbA?bXk@kkbF3v2J_8)3RJr zvmtXQ{abYDbRD;9iaVY``AxJTnZrgVDHq>x18#_h>kHpPJyYwu{W6bERQSND8J|`P zp~n=K$e4V_j`}$6y_ql4BSxkv7L^nS6F6EBUEr(nU*qIA!}Lz&8gu?GT(-Pajw<$M z*7*5~LyTnX9IZA(st3b-Wh{`Kv4f6`E-h<8kB*$Yu@h>UbMmob%t5mS^wv6SsvNI% z?r2mg)Y13?(oR2!f)%avbZkpm%j;=@8^L%7O_kruAGL`!SQ0}6(QMIa;B>VQ`we04 zF445B(m>3nT?-_0;x4lh&W(DPuF(%JXTLAJ{8n!6slmoq!Goq<PH z5%%^Hc)D$a->c)K-#99z3HRQ+U_pNVDcU9`?9y{9$oiQt3hT38WW}UL6xdeqw6x9n zv~5Gqi*Av;`?eR6#yJVQyeO_CdtP{1de`rjUVEj+`<;Hlg6B1dcyXIJ-os-DV||WX zX%nOVLiNNvTxUD#m|xl0w&9f;iVaWlE~*D+1gj;M%9LH%O>N?sUAdfZ>@L*Y#c}N5 zjcJz|yCSwXqH+{HAEvJ<>WuKk?1FoJ7v@EuEhlc*>KyW#qcZmR>XBsK%olSzsD$1~ z+Z>ho`Q$af_pWzesd10+W-`oiayem_wBd!9olbfGqD6&;)NXOF$F>geW2Am|Zq}RO;u=lY4A~sPHRPcoh|Xg$l1aDhmr2Et1bN z5XGky@;;DNo{#DMTzcnKfA8mVl=Kd${f_f#0!X&QZczf( z^5`3Bha?FdAuhiJWuG|tvgJCpS=VOmQ7b7(SaHI2SS?ukU7;hX? zQ{P4EyOGp)k=nal7HzM+?RC%eVt8~4qX7Qd)@8j2*Vwv0d!=ck%Fpj8i0E79Wc9pW?QGc0D_3-2OhUFdwEW^Czj^tegU6;1yR`zyo zcIzb8y9?E=E?w_u(mQuoZg%UXcR;3Xj6ZT-Y+HZli`Y?Y18KLt?X6a*-aUfxu%ZyK zs!9v#gL|KrK3Mp)w@oiG=v`7{)L(8S1gnlgp!dKg!`QRqB+%Rbsvoi62T6B_jQ@`v z{$eh9t>9_q**piIet*KscycU|kls%3GLVj}BWfsVCbOe-g;moKvuxxzD(e&A@JL!wPg*;Nq@Qv1g2!d%3G$sFr* z5iDYR)|jthBK!v?@(C4>Z-m~@s?WO+gtLU+9u8vFX%ouP%vnLhVm8NDM3vCLhf6~} zhS101fDsEz7F^`H>6Igi*_n=e0bt2U<&+I~T3fuLGhJ80)(ZMhWjS6Pm9$e?-toT$ zPj~#Uqtcs+Y_($#kazF2E+LurbO(t6-Ot)`?oMAdmArqa)j@>H1oHkYyd>G0R~kq& z974ACm2oUnYP{1*PRO6Wgw`~DLDlwsccx2bd%9$rl`f??(y^P#P50%bXE#Ab#Q{Il zo#|L6@gxp=`sN384R=~)qqjvT&6zqHy6gYCyQ^iuHs6ij=qnRyXIV*~;BcffTUTfr z-ywTXhfAnaS&qGmyN4i$E<{yx-|C#p1p5b-Gh>BXV*a>45|i ze|iKN4?=dxf_YZ@M&qfAC>U;cpT+KQnblWi1lB40pAj)<76|D`fBW#s8cgkF*0;!pDl3ndQ|C%M=#9gIp~%75U|dWXAB>H* z7$$Iyv#i~3T>}VRo+)N`T2FmXQ1Syb`>%#s*1c;OR<(}ww+KUlVbt-hG!59D`nD)T zbfnjf$UyPVlb!#%Rzl6cr{i1qIjrPSsxCyEzFtAvScMMC0%2L5)8tSF%-F!939eOi zs%Cu5ao4k13h9Ja(74P>UaG?Q+0$1=b-yLyTVBk+gw$RFR;x=$Kh*hM$JdNaY7TXt z%|1|bkYU2c0EefjZtDIOcGAYlyC9O9q1JWKN?mr#slKFm@C3rCgV&Xc;oOK4(;HNdcCSahB)8*W@}xH92LTTB}YX!TGm zJ(Sf`^EoP?j%g*Gbx|rZUTp5Uig}2$0XBwVY&HU$6xa~*4Rp$Apc8}323V2M^Jiy; zDi}(wHJ9YQ8*{D$-zGlp=W&emLBE0ys?wDl-f)zxh}|>i<4L6JmDuChC_EJOIR6pu?o&efClu-iO`{=Sd+&>QD;#a6G-jrj#~nOgwXH8t>P_#s8-P$ z;NXO#&$AdLLm(>j({Lb`J{|U@2LgKfSlGbvEg52ZV0t2lGc7Hlpb|Ds4LomZ6{iM_ zwXlqyOxZCdz+OI2Ih;8qP%#NL*=KtSyN~4pH++U@%=ei0n3GhZ>JCohCV`>1C zt#R418d?|M?GHD(``BYJ-0pV|)_b^afBmyuAhp|%-OLT@+cc$3oEGpvH{1;aSW9sc z?y3T)f;EgZnf(VN4Jr(g%zyF<@RxO?B!*Tgw7n-15|{?23Al{C(%y>psd zoa^lPM()`-V%}RqbNItqnbQIlR9)j(v$IsK(T>)p1#&ss7^b@~L)UnNX^+grfL#lA zv>;{X6*MA(dX_7>{!{0xl|o--x}A4Vs$PAC=iOtWW8<2N?*wgg!(F+$xk;`c$IE+z z=Igc`D+bk>q&0xu6B^LdkB9uH`l^*(J1f%wcAN$_8DKq}3YGy>_il#z)tvl^HWzU! zs1S8u9@@ArbEnfA7Tj|@j?A6B`%YX^grD0yjv4q#4;bl>hq8~$Vk>qh+`Q^R4_9>= zu{f{_K>LTDI=8x?MkBwcHKVe-I*^|hs}It zbj>(;+LsqVY{xvF#FHbD^jNa zc{;*zk^T0T-rmKHk8{0W3+<)&e#g+;%Zvy@d*hFJ(#$}^tX?4$2%ii4aGkY--E!{8T=)RN}qw=*c6PF&Tp?L^>kp%=J`ep=h=|(I|)j_W{ z&loNcoX4Ua@8Wz}0Y&_yrA3SRGvk`4fRb|+Ozls(|%r53qyt?4B4@-DwH-An!w#r=l=`uXouOyfinX(Q&wQ*2!f{^9ms5e=WhPUd*J@;re{@E zTkF{9tAUT40c43W6w!IC%@&n{2zAhkWd#!rS_psvQ9f!o%n!nCXdmk`0zH}A5G4F2 zTpSz=2t0$Jiu0U+*8w8IRpz@h(6VDzpf(3%lY@YlI|CJWEG{nElM6Ks=8gAe1#r0+ z!}c!VzA~lvE7rO$#43gmZg^jKTdDRHBd9c`Li>A zAO=6qV4ow*!QyG`MKlM?)t4(1f~(TmO<0#F1XB%A(t)#jj$x_^R^CW#b;AorL=w&y zhx6i1>JqqQZ<`jbw$*9r_8#*jzq9XWayx76r?|&Fs#Tn^?4;T4z3f zA47AoXfBFAw|{maLRVS%$JtmG{_(5PZ6YE<;9W;)x?wct%kcd>E5Eod{u3d#8gkkZ zQ7xh;a%gilhqxI8z_4SWG>#JxL_=`N8;jdnTns}iLMC*JiIc-rKmdGVyqgW#*ow-IeL^+Zwz1|CG}>G9>ixUuJsy;stwUx{X|@`q$S}H z01WpqLLce9m~jcPmM?Qpu$^$ndk1t??5IozqPlLebyu?YiFhBUW%8?8f(Z#Rwi9Y5 z&eTMD!i3cHIwL#+IG{qhf%2)+qIq%7QW4 z=WC;IRDXj#5%TwyfISiQefK6}2wn-`7!Tbvsy@MlKrLD})`w&9=7L0$gBDupgJZ~H z*7{i1dS5)6PQaZp2kGU}AhlwdAeJrQa3cCFQajMiGUs;%ZGa(iM_KMXEw>oi zq+Hxw7)4JiIN(gouLeRVqZRSj0b>4jV8KRsW>61btlr%FX)LT8zYc&-+WF{f)sM33 zUdQ%;;!09P{G@CP%vKb3b_5?xeXl{lo-E>OgD!E)3eE_%a z{5Fv49uY{z`uUQAa&)^Q$FtwxD1jMBd_l?h94)UwLm1j;6v#Hc6UM(qUIi!E1F6et zDGY%?>*_haYtfm5nl#5Y{8QRA26SV={OZ^4F`Cf7diDXcRy#!mUf!dS3uT`Em`a0Z z-wfI43B~A4uLab@ovbDGu)8WiB~xucO7R5=`U| zjq?mX=SuMm{=_}CF$yc$@6rFst>RY9-f@iy2*nt^(fk_pNtPbN(si=X7z2^YAQRTY zm(;A?I02Z$vg$p7lP8n*>aRw?#Gw68x`j(uF&8|c0~_PiNV22e7CmVhHcGOwkxbhH zY?xsmOB3uCD3fCaDd(L)tB3(<6){2#4?KWVoA@ruwTbn3W*tDJ7jxTAXMx?nLk})` z1~c5^Ml(8l)-#xjXgmyhhU=J`@^{bR&8*<>QLx=JnCaHn@p7YQFx@={cWuOw3HkYw zxjrDjt-ZY)kau_npKv962A^?_@C+`*oic+?+%q#+=+@V?$m>0WGu-T!4(!i=8<-Jt zDJ2onvD`JYsHP?B%=8%udV4R1>phjFc;y*Fi?e3@)iUn0sA}+`J;C>Gpfq$lly7ux zH5i`t(Ca`CSC1np^?}}F5}qoj;wS+-taxN&%I^Z}jzhCP%6kTXir?i&FgL@_?Vxe{Cf2in@7ai_r0y%bIz5|33_ zGQAP-{VA|Qwy^r>^OLy44jYxNzBj;Te+s}Sgsts1M|jQ&d7s z^-PK&l|Ga}4&&(G%|oH@HO^qT?06IW;#Ui+Ho5u$tc}>WhB}712h2o9<>zA=5#B3J zgag%(gkzns_5h@ifI(140!s)I)Yejvv3D@^3yv`aC=^?}J+M_WN=tR}YP?EDc_r=x z743z%j#s@7u;I;s-RV|ILqkLCR+d@w5E6Mpebvxlz1*CL#%j?W*77e#fCm^cu5Yzq zP##x^H7A8l0#Km#od7uofj@(tujv|q*nz|oLPv&xhBgJ4u=q?CqkuU7NHpdpH6}Br zP27<*2D=m4fJ@>84tw9of~g(FVJ9Ky@C}o>8om7y*B!V7<5qhG?iXyu6>axmi)+kL_sf!rtb7!q7iBgjKM{VGAY z$lu3Ly-$#~045Z2qmKu-Le;Zf73Hsd#a*SWZlVejC8H9^v@~XwiS&MIyZ;+Q16@!yw zGCrX?2#xhe%G^5AQCbYOsmpe(Qcpe;4&$&AQ>IYl4M55`Aq=u-X+{gVg!?|qs*-FM zD@PQy8shUY?KT?nS-1j%bl2#CW$iL@Ok!jT{uwTR80Ji1yK_k1qB+3&P#Q@#*`d+3F zrF-IXL4`acBHQqrA1&n>l!XRwm4U0ORq}Z9Ain@5H{yZ-%^25Cy0N&s<9hT7Fx16k z9Db_Q?8DEKidq2Oen6c!J$k*{)T76hv%n_pDsB)k^aUNT!q&@JLh_;^wCOs;r9iMx zhv|#){aPTYXGl);#H9{nrz}K|1g>gF1S@uD0a^srfC_HrX{FT)9M*uY%#P<=J+sGh zZc&57e6-s9g{4N|w9N-o(M;`F)D8x4I^8uETM?HCQ`WQcGXOH4=f(EGNb|vf{1A|h z%zmKynbEgDAembO*HYnZYcl$pklGwzWQj)>eL;+*5OY(YwmHC?0Zu%~su9zEC{(S8 z7^fSJJ^EBE*VP=U;xnp@LX~h0E?RqH7%pksN=!{yESduu?c z0ciGthQ^7_fz`LGh1*dWiKsLVmDC+;o>AB*VN5lQGEi+CFp?e=AOUYdr`K?vv_Ta? zR0dsu;Md}G=p@Iv)x+F3Je@I>uO~~R==%r+_yh#VbtREJJ|oYl+UY(DBq0@t81<>H zWRfSK8y^9)Pqc3Ala007XGAY#b0C^?-NV3`J!y?(A)m3($Z&elNPnld?OQ#}z*!99 zBv0Cxj4QCmW*i0Zy7>P7zgJROg9ylzn)XS=4qC!GLr-C*`qQeGHyB z5A++%c$T0}z{tf!u)sijU^mlNa`H2nlk6;IFI!tzKvuyIH>cqvbsZ@p{m`atYjyBK zw_!tV%hy$ogF@U3YjZ}Ml&6!{>e}=TAK?HP=nYBNEKdN`3D|>U8DT3CmKw;!BwR>E ze+}hZBR4j>?cROxzCW6{o`s{*Itj0mnbzTEpgP1e++ka&TQ!sHV@>AiDnz1(k}`^f zg?_{%>v45Jo-Sjb1odvAj@7)1f_$qj=g~y>&A{QU?KoF4sHjNX)Mjk>NLr**HFj#^ z2nt~y&Xj-4%tg#@<2|phwl{p_zMnWAO_WWx*%eU;Dl^$`uZSVDZQ;uEw%aSeL7Zrw z&Sr2Yz`&EQk{CPc3i6CDks-osv}4=jA9o_;A|friP7O4itD{B(hA;|t6=r;L5c9b@_>fw% zk0XGdi)R;Sov-sK>I^T z7^tfqs)JC{ZU(sB>lmmL-I=v&GJ)wA-si6D0|;p6SWA+r2le{UPEVb+dd~STV18f* zVc6k_BgZORNtbMJ&LfBJVaKb)nh~?&To>4FBsf(w+ik$%A32tJ`ELh1{GA=XEraU& zcw%qo&0W1M9vmsg{uRzb6&`j_xZLMxmO{VOu_aWUq6-Paz6JcD1)Xay)j?IM{u%~} zFX@}On-beqtwq0lHRL+hhZP(7g z(`7nlnP3{qMjTKVEw6L4U&r|saP1aEc<)FW$^N`V=rlXo*Uevf8`oNFb11h!^1(*m8=82OZG^9hR9+5@b{764_3ZRkh__-+&) zr{cRx{R0l}X#kSSxh$K@qlj_dJh%c8#jRQ^$fr0`_+eNB6~nri#~yRM1Ibkh0P}bF z5Shx%64NF07eTAdbS7GHC*hE%zWRWQXaej8)dz5P<=DoT!gZvXO;H$0A}VLkx^SJ& zH4)m!HH~ox&nA`t@|J0e09GpuNilz&Fm0u;^1hVal6lPT>#P2V_a!1R8HvP{vYVug z*$t^&d=(&^$T-CZgpIX{yAe9Io5|7PLs;s)wb$V>mY)tMd*&li1h*lv1&2cS+@%(>YlX6#ma#>A7D&lHkTlH%!oTHagj1v6-Cy@ zke|dUt4v$+6L1^q#E&PvR)PUFe^@SJ3%W=zEfu9zQPSF&P5B8g<(pp0k9#R!_fmf1 z^5rnmGfsq}P0hbsUJBe`bY-WzDvY>225Sqh5uZRixfSpnm`O*`p0Nl>Acyu8;_u8< z!egZF_TV#M^g-61Md+1*`qboQE%-|^_aH$Cy@GWQgm|UaJGMD;qo{V}0x|Vt4*C(F3hk{S!nZy#1-{=F>@T10veNw*5&f z4Gl@Cgj@7CJdyZYA7mP?g0!_%Ax;!OtJ%->Mm*Tz`_tCOKqF^xxYa4FffNqX085p& z*5H0(+(Vp-qq6MOVNJ4UU^*tmKn6}|LQxp+vCnWP*W~f^XFB_Huwy51aunim5ZD~U zdHWOGiL5|8EAR*_!0s);bPg(Ou`gso;z5pWz17>`0U6=l>IEUa$2F5mxq7FxYExu` z&n6z}Qq9;d5tb+PhJEPR$I{3Lv|O)z2R?#S(E7@5c)^uaCG4yyyIM>YmNY5SYMZkU zQi1&`5xEq9HiZ<1ZH4T9;w60*)0e=Fpw>{mQ@8KJt-7%PWVu1(N^0*x6XE< zw7e4jyB$fBaY&opXU`m6&H*`TEAQ+Zxn!Wmke_vi<|($;s@Il72NxDWZBbob!@W|+ z{TTfp_-P=M^LPQS1vc(b=g23rNK<(1lbJQ&eVOdTs>Rk@tdFwJiQOCR zjWXCtSoPNE)67p00dk1xUnHlBZKsdY9FBz_;H4PO6{uWnU-2m?wEC(rUYr}3AY-8( z!Ip46Y})hSvqC)vN)@?>$Y<~^Fq;gn?Zp9M1vhoNzstCUBEvWz!pUTob%tHy30+W* zV&&a3lvD-sD?nxY>+QL6Wp+TxCDalR7+KgSYi)>lSk|JqvF&Q&sW~`wSDYT)TR*~20 z^;BfZ_O$Vy6fd%6$&#`ps$qWT&Y<4!_x^z2H*?QD-?`s8=R4>7&bi-r?wvXRzWn3Y z2ZwwjjArs@0qWn9D-*j%@4yih2A5^vlS=+iCw?VKu5_OIg~S{qfs-XHCS{EKzpCc` z-}<&-l*yIcG5B-W*}@@;l?eZIw8j=&oJ#ozUc&U`;ItIS@ZhvKM-Togi=%mPdLBpp z;ItS=^5C>k7##BUz&2!XMU999JlBY16CfromA@pfy zc)7wiOyN6LN#le*#SAY<(w~;@vSs3ZI(+o@&vqCzdqTf?RA($Ru_ZG~6uL|eV4@}Q z6^y>+dry7RAZrf6Vgia?mC$aK)OnRYF#^9S&vjm56A09vZBQwP6TWg5CD$eoBsV?) z$yLc+$?Xq8{XqR&%tVLzzVubYJ8H_)iGb{**& z277%Lf^jI$!Pd=ji>j6i*}>Bm2oP-nf>BMwoeuFtHbPojL#-YGgGqd+-qi zG6B265K$(wmGJ=VB>Le&gfG?+Gk{|;BSR>DbWT`!1T}~eO@liG5~qmMMEGum5>81- zNmyx~(tITmB~hi*I5DLKN_Zu4B~6l+x;9n-f;ds25a+;|MGd6VDKso$3&k%O^+ymF z*s~0XTTwUyO1|6?#Dc?NA#PDjm}u!@i3g;A0fNk;zr+MdKd;P@U=cwwKZK3e(xip) z1B9sKPbO;l6Nv~>Q`?_37w}O-4CM!a5yU2uC;%%U0^=V7QB!w2n5{%`{)HPsg>yB} zFz^#6k?;U3M8_Wqpwdt_fWus|CNbg)1d3-n+R4Vy%Z=Erp5(hmeo5%|MF z5F@eynW(Ab4;)b%U%4^un27^PyssDiiVHzmEI|t5yqTW?iWi7S4$nJ_y8+)@+QDE4Q32j9h|1=-A7P_t2pby|z9{1CVrOILWZ{7L!=cHd z`i5~}Vc4icY{~qLaI7e(sjnkz7#bOyn3{R*^p4>HMi>VUIV1!PVX&eAV1Wqiqwb4w zv18*yTk6K=h89LFqgaa!`!{y677Z2$OhxQ7?9FY5jkQf8O$6a-n*y6BHkCH>Z5P=J zaK6 z4LcDEZYB?m@rm%jHJHj|!ij=EI{`<}^Emi!Er6TcEaLHod2p)&xKZmcZxuXYFo*-> zP1`rk&P15(5faeU)x-K5s{nrZV;#n!5Uz_vi{3RJ4V@>vAU5E~`%cUArR^Gb8zMaJ zU23^D_43*96V6}$_a0uWYm-*hZqX_)?pi&?Y{4m*U)67R3p=E?Aj?hPD6hKcW^5?; zcvhZ-yvR9&60Yc}&6?Ud`mTFOPraAgS)0eG)a;=Cw%D$E^lLw9orD`f#?7P)_bg3S z++S+NzWPz=l2;>zyNs+4eUkNfIs!u9564~d)^?wWVHO8aM7W(*x+@kb8b3Z~szdPA z&@Qsnb*pQPNZ(HhTi&o|Z-RrhZMx(@OdHRq>B3(%?m7bze=H}MJ0@{|%j;VuzF&91 zjGm@*hwJFt^R18CLGn7HQfxEE8BEc>yW#9~;EneC%{C!d3lm=xg$Ru$zh68=_YR*b z6{Q5EoK%kNDO!7ItJi~lizjQ(W(H;lNPQz1i-n@o3M*c2$>CN^9&>z2x^x2PmlDy% zesHlVt36^$ZG)|Hd!KB2qI~{=>@|T~U$SdR8|~%4l;3Z5Wdb_%bWzoZ-<9FU#_WT|#W%;7%jn{)}a}UMr zIGSf^K(50X^S8v+3JzBy^X$VY=Tw>oS?9(FoohUw>T{iKq(`~aQ!X;96?o!Nqep3D z@4dx)dh60s9^miZI%a!DODq^vD2$GRkW>W_LyJNd)RY{kcAGSkJTW@>hEQ}Pve2{yHQQmVKkj}nI_ zx+PR_(|65`9N#QTHWLpE42NDhxC}|i>Raa5ogv%~RA$H(-O^55jHH?^uBe|1;4U1p-8x9#Y-YxD;7SlWH! zg06Adu$!ZSr5bVt5mqwXMH0)li@$u7`iIdzw7s?ezEuqUs2WczBeAN&MA_~L%FWa( z@yg%7_(=g-R#!u@_>fr(y-`}1ytDb`Jf(uB zi@u*1Gd%`7zFZEu?NIDN8EMO4^cE)vSI5o&o{%3B(U#KWYg6+zql04dB(^Ky(2~l| z%l{Y`zqx-)?FZiaGf5|Y;SP0<68(Y$!A>&pi06x+%3bC;IUVryqZg zyc%A1$!Ga}lXkQ2-G^oN8GSsy?$q}*QS^W$|cr?G*!NLBa8D&|Q0CYO*7<}%vN^7S@TNxm)y z9#R9`ngp>uF3}GvYcKg`p6=Qn`fM^S!kW|8ep+-BVBd4k_K{>alm+T<-^=M;_AsJN zSwvQD&!o_YVXrUedlN2w$bIBlICLU!o_wIy6)9d#^S!WEyVr6`Q|{AWd74}7ylzOJ z-P-JZeU*lC?UHo0@B6kDFC9}TtaJ5@9yfbbC_3f%v5qt5=#+QCXGPRH8bv$(RpmiK z`O~fwdwCl?@AjK-sJd6g8_1zcm`X*5oN5fLk~Y{ZTQt!tcgr}i!0P1FSTmRHXJU6O zyR>26hG@Ocw9{O}4o`DkLwrg1zVY;TrlqecOd8fD)asbU@3azIoG)@AHm}b7{e0ij z$jtAL+VduI^)2(3cprNaHmTmN;{CS7IA!Z#?sd2MS-*V_AXSyIDzE%#%y&?YZ)=Zh zGzc8Iw+m3l5~F#|c`H`-l$RDM-cr+#^*s^0d>~&a_tNtA&Qj5{s91G*lc=w%f2zGE zBhZ$c-Ch5ArE_9bT;bJIhMz+W>YufIzX>)MS@npr-iq0Dw`cdS$ezC5xjge&e|gNU z;DBSr1;>hGHh1`~C6~qaMovHd8hYrRZ^XwfANJR83J*Yg>JR^sG-Pmpgpwwwz5HZ_tk9`YPXGg z{!AC&;e7e9r+LYGpYKv-zH&a_6`zm3b=Y5X*zMMhFGXpw=PPe~8nyMvS=>F|`q$Cp z^SE!{CJa7tV$7N8bZAThh-2mw!bdD-40t+&g9I?b=>EWxLRaP>ewe|IA{;b?$-w*v zeiq;g^Yinu5h@*_z)V3X3t>_?L0}6E_?Mu~!9ZvXXjjcv^dIG749wI7D-zgmGk64x z3M=LlIPy&ogb|Li0%(i~V98<8NWL&bFv5g>1RLJk1>6Qu>Hdf{Rwi^KP&(hufu_rh zccMaMt0K@Y!rG{e+4IU|#F7E6u`m>t!|;P8nIT>~G@QH<04Ow!p(q56gtii!j5x!} z`7F(mK#v54mJ|#1<3Ph`F4>v_>-Wd{B}Cw|%#i>WtceUdEou$G|0MI9abEu2$C$}B z!#CayWraX%A9e=?wvUDeaDEX8W@tjYZ6k{jj6zumup82y}Azjh#!P z{A3@AphCGpF(T|)+0Hf{(9sAeT?R{ViLWy=y#m7M!E{ChY%0nLV)&B*G%SOWfG`>j zV7BW_U$euQPq>q$?()NAHB;i<;1jjA zFXCK}MEc_C-f9nVM~}uF(Zq8qVs1?Y>0F~XRVOaJ)9X-q7H6q>)Td9Z#>T5RcSNF0 zB5vMbumq~V{o%BM(D`7wQ`To>PHY`#$Ue6_)UVO@DAMIfrms<4B=2eX#vz54n^)d+ z-gnV$)u^beR(OzbH$&n?;jY^AlkdnNGoE@{UrSTY6qmadq`g@nlDJe+ey75)Q)2@n zr}T-prAL3a#gJ-itop)b?r%o9j;o#aCLQQi;S!~c+qlm<^}eRKgw`3gq~|e1eZ>`# zKWKNNZEDIQ?LJ!XTHLNx)RE+hySVa}P1Cfv!TR+%q8~n-SVR6j?t2M$N~`RvSLf0s zS@)7lD*dY>oxiOvS^6z?FsIq2EK>{}oT?f)!x)+Py{s_QCpF(g^|RW0lf711jp6ZE zl5;N%5vMn%lx7FiGFw9Tw5==5r7ZYrwEMVeYE^T=#qlK-(ZORKA+_Ca$4bT)QjE_@ z6xVzeE-)H-He9gpU0n$=!(I&8ZCd!+E4uflp3r1&!QuYAs!vz@+SRBPT7w*ob%i#| z?*08ZuC-vY@oG=oj&!MoMT*gu1!?TN4X2)8JbA!}*JARz^h0p6%$|Zu`YD&wA3Nrs z-+1#Idy$IffTOC?QkhV#4AO$m!A<#<5)Q<*Hx@Lh73lR{`5Py^+Q84%^p@p{HhZ6( z7}XSB9rE4ogXl_fYHt1UvLj|s^3&Ice0!<#Et~ZH*;)4?@!FGhucJdJdbVgP=YBeE z68oEv(7~fptG2zow$ z-?Sp!Y-jWNn95Hdp@-?@?%;qh8B{t4j%C643qk1|=x)ldl3xu!{J_T14Re8Jz<3FK z^V!W4z*M+Wq=FTp3Rge809b-iNDB$cNG_0&kPsDKj9y literal 0 HcmV?d00001 diff --git a/sources/lotek.src/lotek/englotek.txt b/sources/lotek.src/lotek/englotek.txt new file mode 100644 index 0000000..de73ec5 --- /dev/null +++ b/sources/lotek.src/lotek/englotek.txt @@ -0,0 +1,121 @@ + + Warsaw 1990, Michal Pakier + + Loglan Environment Manager + -------------------------- + +1:Program installation +---------------------- + Just run LOTEK.EXE - the system contains some additional files but you + need not know anything about that. + + The whole system comprises of the following files : + LOTEK.EXE - main program, + MPLOGED.EXE - editor, + LSTTEST.EXE - auxiliary file used during compilation, + LOTEK.HLP - help file text, + LOTEKINS.EXE - installation file. + +2:Text editor +------------- + You may treat the whole program as a Loglan-oriented editor. + It supports the following facilities : + 1.Block operations + All common block operations, such as deleting, moving, copying, + indenting, unindenting, saving, loading, are implemented as well as some + sophisticated ones : moving and copying with whole block adjusting, + making a frame in comments for blocks (you may set such frame parameters + as width, pattern, text adjusting inside the block). + You may also copy or move a block into itself (while moving,the block + will be adjusted in such a way that the block beginning will be placed + at the cursor position). + 2.Find and replace word operations + You may find or find and replace given word or the word pointed + by the cursor. You may also change small letters into capital ones + (or the other way round) in Loglan keywords globally or locally. + There is a function that changes all the characters into small + or capital letters (globally, locally or in comments). + 3.Fast moving round the text + You may mark two positions in the text and go to that places + from anywhere. You may go to the text beginning or end, too. + 4.Help + You may always press the F1 key to get short review of all available + at the moment operations. + 5.Macro instructions + They really make writing programs much easier than when you have to get + round without them. + You may bind a macro instruction to every key from among [a..z,0..9, + F1..F10]. A macro is then called just by pressing the Alt key + with desired key. + A macro may be any sequence of characters. Using macros you may define + on-line some useful operarations, eg inserting a blank line, upcasing + words, marking blocks, ... + 6.File handling + The following operations are implemented : + loading a file from disc, + editing a file (unnamed new file has name 'noname.log'), + saving a file to disc, + changing a file name. + You may also choose a file for editing from among last ten used. + +3:Windows +--------- + You may use three windows. + The first one is the main window, in which you may process everything that + is supported by the system. In the second window you cannot only compile + programs and process operations from window 'Execute'. The third window + does not let you edit but is used for viewing the database that contains + data about Loglan. + You may use up to two windows at the same time. The main window is always + visible so you cannot use both of the additional windows at the same time. + While being in the main window you may move or copy a block from another + visible window (all options are available). + +4:Compiling +----------- + You may compile a file from the main window without returning to DOS. + You may execute the first, the second pass of compilation, run compiled + program, trace run program. + You do not have to remember which passes of compilation have been executed + or whether have they been executed at all - LOTEK will take care of it. + You may view found errors after the first pass of compilation. Information + about errors will displayed in the bottom line and the cursor will indicate + the position of its occurence. + +5:Window 'Execute' +------------------ + You may define this window during the installation. It lets you call any DOS + function or any executable program. After this call you will find yourself + back in the editor as if you were doing nothing but editing. You may pass + command line parameters (name of edited file) to called programs, too. + +6:Database +---------- + It is meant to be a database on Loglan but you may set any other database + instead (created by program MPH) during installation. + Such a database consists of maximum 6 windows, every of which may comprise + of maximum 22 lines. Every line is mapped to any length contents and every + contents line is mapped to any length text. + While viewing the database you may evoke some of the editor functions : + namely finding given word and marking a block. A marked block may be later on + moved to the main program. + It is possible to have the information from the database you are interested + in in one window and to edit your program in the main window. +7:Using LOTEK +--- ---------- + Just run the program LOTEK. + There are displayed all the functions available at the moment at the bottom + of the screen. If you want to have more room for editing, just press the F10 + key and this information will disappear. + LOTEK saves all the options on file MPLED.DAT before exit, so when you run + LOTEK once more you will find yourself in exactly the same conditions + (ie the same file, the same cursor position, the same options, ...) as you + were in when using LOTEK for the last time. + The editor has a built-in mechanism protecting the monitor - there will + appear a sky on the screen after two minutes during which you have not + pressed any key. The sky will vanish when you press any key. + LOTEK always saves the last but one version of the program, which is being + edited, so you have a copy of the program. This file's name is the same as + yours file but its extension is .BAK. + +  \ No newline at end of file diff --git a/sources/lotek.src/lotek/exe.lzh b/sources/lotek.src/lotek/exe.lzh new file mode 100644 index 0000000000000000000000000000000000000000..4488a72e9cffb648eb97dd769e9d8b47c164e2b6 GIT binary patch literal 113754 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 TomOg}!>0o2rTxM+otmHkE5E$# literal 0 HcmV?d00001 diff --git a/sources/lotek.src/lotek/logdoc.zip b/sources/lotek.src/lotek/logdoc.zip new file mode 100644 index 0000000000000000000000000000000000000000..f5f1b254bfa9707a8b142c78d553e318a323b3dc GIT binary patch literal 142259 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 T!A7b*L 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%0D}M>Oh)}=(M%9|zd?(A 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 l?*9j@|4+vM=4+V*{4c&}N z_my*bFEF}_rs=k-oHVy+C;pwjovrQ1=W3lmr{FuD-l*g`?H@k<6o=s)=4g{~$9ebdZ|D!>ztI(DlyVt;GgpvTG`(*yVh?S= zu!fpS8nZn4s^eW|Nh~)x>(XSm$meUck7d-TzFFG zAKgnk6oZi>7H!HK#DeFkNHL$ut*1AzmvRJ}DL>e$NJ*AO`iVc$r#t_Ny(4mJH(;d6 znL#TqZ%e~)EfM#Jh5S?ZasMQs4{jzRa6KVOl3016AWSD>(35|z4F4tnwn(3Z&^oR& z*QSCBa8C)tT}6^&AS)|D5%R;V5``HN@(r*IV{l(ti9k4yd52gP!YdenMP&>Y1jsK| z9y61?In+55FF~VWT2<7DRdq>~$^$F|Bt>WY&KvNi@WRlO5ORnpuyJM} z5MIMI+AcHE4V(a^JqtRq4N}Jz<@Pqgq?}9y2RZ{PPHPfGGnnC=aa37_+5oEPxiB0Q zdTlraS;YrSA~FgG12ixxx=#BFm&DuaT8`PENP9=HFG~JZh^eS<5l#$;ah($ literal 0 HcmV?d00001 diff --git a/sources/lotek.src/lotek/loghelp.mph b/sources/lotek.src/lotek/loghelp.mph new file mode 100644 index 0000000000000000000000000000000000000000..044042438c25284ea8aa012d06a43a4f01ea2a8c GIT binary patch literal 1819 zcmchXO-~a+7{~v+Z7Gyuy;uw}ae~HoR!R*h-Gj~2^0vUHw9!L74BN3RZFlRwSj#~V z=%L{oa5H`YO}uy{(VK}U;|DN-qbE-o#pyywC)>m08{)N39t!&1}Dy?8EFYb>&8TQXkym06A$zs(iSE-pO zPAw_L+1bLq>0CN1X(~DH+T3~YUO*hZIg(>_%XZyYpZ^Ab+X*jOdNG&LmU4M%M%9js zCZr7?gpOX7sQ!DhzpiKZTG_q+?WY6UyEo9bcAuZSy73{n^^xzJJ9ElpQC*r=(~Ac$ zKZvFL{rvIayll@pV(2T7g2U_@HSs7FEi7kp3+YADuGxorDgY-HElLuv|0n$L=s(eU zO|^wf=&Re7&Ptx$6nb$X5f4PT2@X9F4-A2bxSWXMVnPrE9{H&dt|Ve;>(JSX|1rTe zUj8+b2rrNY%X1j#0ypIdZpeZVgCx&{cq)KVc>p6kC3dqFxFyegMHG=`vg}f`MC}p@ zVp2YZ362Wz$ft*qk_Fu1scynW+?Btf2jPdFS<%;+KSKaIbx8VcUolpyhUGGSy+TRd zDmgA~SdFIMO&xTyPQD|2qysw~i;>%7M6)gaGt_E^Stcqq%N{K=shh1xa*zLj*r|g* zlP3oMi6Mkt%G<0T=@5*}lX=!$vA8R23Z#84H0tQIN*c^|)+k9z$wa8D^PrF`>L4Gu zfegvmwq+B=DlrF8xceg5&bJNOgRCrKif8(<-Ax_1`_!|-C!FR#vS+$RjS<$qgmY3R Z*cHwrrVwS7+EjO$O&sQ)m#Gr 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 AzW@LL literal 0 HcmV?d00001 diff --git a/sources/lotek.src/lotek/loghelp.str b/sources/lotek.src/lotek/loghelp.str new file mode 100644 index 0000000..3e4125b --- /dev/null +++ b/sources/lotek.src/lotek/loghelp.str @@ -0,0 +1,517 @@ + 103 156 ³ Informacje ogolne + 166 193 ³ Procedury poziomu 1 + 203 345 ³ Procedury ustawiania trybu + 356 527 ³ Procedury sterujace kolorami + 537 596 ³ Procedury ustawiania pozycji + 607 616 ³ Procedury obslugujace punkty + 626 684 ³ Procedury rysowania linii + 694 739 ³ Procedury operujace na fragmentach ekranu + 749 813 ³ Procedury wejscia/wyjscia dla pojedynczych znakow + 825 857 ³ Procedury wejscia/wyjscia dla linii + 869 916 ³ Procedury wejscia/wyjscia dla okienek + 926 928 ³ Procedury poziomu 2 + 935 1021 ³ Definiowanie okna + 1031 1059 ³ Informacje dodatkowe + 1067 1084 ³ Procedury dodatkowe + 1099 1120 ³ Uzycie IIUWGRAFu z FORTRANem 77. + 1134 1144 ³ Uzycie IIUWGRAFu z PASCALem. + 1157 1188 ³ Uzycie IIUWGRAFu z Lattice C. + 1202 1219 ³ Uzycie IIUWGRAFu z LOGLANem. + 1233 1307 ³ Wykaz specyfikacji procedur IIUWGRAFu. + 1357 1507 ³ FEDIT + 1520 1545 ³ Zmiany IIUWGRAFu w stosunku do poprzednich wersj + 197 222 ³ List of symbols + 226 444 ³ 1. Preface + 3 89 ³ 2. The basic characteristics of LOGLAN-82 + 451 597 ³ 2.1. Control structure + 601 690 ³ 2.2. Block structure + 694 734 ³ 2.3. Procedures and functions + 738 789 ³ 2.4. Classes + 793 885 ³ 2.5. Prefixing + 889 932 ³ 2.6. Object deallocator + 936 975 ³ 2.7. Arrays + 980 1032 ³ 2.8. Parameters + 1036 1076 ³ 2.9. Coroutines + 1081 1132 ³ 2.10. Processes + 1136 1168 ³ 2.11. Other important features + 1172 1297 ³ 3. Lexical and textual structure + 1301 1341 ³ 4. Types + 1345 1391 ³ 4.1. Primitive types + 1395 1441 ³ 4.2. System types + 1445 1456 ³ 4.3. Compound types and objects + 1457 1498 ³ 4.3.1. Array type + 1502 1528 ³ 4.3.2. Class type + 1532 1556 ³ 4.4. Formal types + 1560 1591 ³ 5.Declarations + 1594 1619 ³ 5.1. Constant declaration + 1623 1672 ³ 5.2. Variable declaration + 1677 1690 ³ 5.3. Unit declaration + 1691 1731 ³ 5.3.1. Class declaration (introduction) + 1735 1806 ³ 5.3.2. Subprogram declaration (introduction) + 1810 1843 ³ 5.3.3. Block + 1847 1879 ³ 5.3.4. Prefixing + 1883 2015 ³ 5.3.5. Formal parameters + 2019 2112 ³ 5.3.6. Unit body + 2116 2133 ³ 6. Static and dynamic locations + 2135 2164 ³ 6.1. Unit attributes + 2168 2177 ³ 6.2. Protected attributes + 2179 2206 ³ 6.2.1. Hidden attributes + 2210 2223 ³ 6.2.2. Taken attributes + 2226 2249 ³ 6.2.3. Legal and illegal identifiers + 2253 2304 ³ 6.2.4. Close attributes + 2308 2390 ³ 6.3. Static location + 2394 2427 ³ 6.4. Objects + 2431 2564 ³ 6.4.1. Virtual attributes + 2568 2663 ³ 6.4.2. Valuation of virtuals + 2667 2720 ³ 6.5. Dynamic location + 2724 2783 ³ 7. Consistency of types + 2787 2835 ³ 8. Expressions + 2839 2864 ³ 8.1. Constant + 2868 2889 ³ 8.2. Variable + 2893 2927 ³ 8.2.1. Simple variable + 2931 2971 ³ 8.2.2. Subscripted variable + 2975 3018 ³ 8.2.3. Dotted variable + 3022 3059 ³ 8.2.4. System variable + 3063 3176 ³ 8.3. Arithmetic expression + 3180 3359 ³ 8.4. Boolean expression + 3363 3406 ³ 8.5. Character expression + 3410 3453 ³ 8.6. String expression + 3457 3525 ³ 8.7. Object expression + 3529 3551 ³ 9. Sequential statements. + 3558 3585 ³ 9.1. Sequential primitive statements + 3590 3737 ³ 9.1.1. Evaluation statement + 3741 3758 ³ 9.1.2. Configuration statement + 3761 4133 ³ 9.1.2.1. Allocation statement + 4137 4201 ³ 9.1.2.2. Deallocation statement + 4205 4291 ³ 9.1.3. Simple control statement + 4295 4348 ³ 9.1.4. Coroutine statement + 4352 4368 ³ 9.2. Compound statements + 4373 4439 ³ 9.2.1. Conditional statement + 4443 4499 ³ 9.2.2. Case statement + 4506 4799 ³ 9.2.3. Iteration statement + 4803 4819 ³ 10. Exception handling + 4822 4844 ³ 10.1. Signal specification + 4848 4898 ³ 10.2. Signal handlers + 4902 5046 ³ 10.3. Signal raising + 5050 5145 ³ 10.4. Handler execution + 5149 5183 ³ 10.5. System signals + 5187 5269 ³ 11. Processes + 5274 5403 ³ 11.1. Transition state statement + 5407 5588 ³ 11.2. Primitive synchronizing statement + 5592 5760 ³ 11.3. Monitors (compound synchronization facilities) + 5765 5862 ³ 12. Separate compilation of units + 5866 5920 ³ 12.1. Library items + 5924 6084 ³ 12.1.1. Interface + 6088 6140 ³ 12.1.2. Using languages + 6144 6151 ³ 12.1.3. Using externals + 6155 6198 ³ 12.1.4. Using sl-virtuals + 6202 6224 ³ 12.2. Linking library items + 6227 6373 ³ 12.2.1. Connecting the interface + 6377 6419 ³ 12.3. Binary items + 6423 6425 ³ 12.4. Processing libraries + 6427 6452 ³ 12.4.1. Recompilation + 6456 6482 ³ 12.4.2. Insertions and deletions + 3 89 ³ 13. File processing + 6490 6524 ³ 13.1. External and internal files + 6528 6608 ³ 13.2. File generation and deallocation + 6612 6663 ³ 13.3. Binary input-output + 6667 6723 ³ 13.4. Other predefined operations + 6727 6817 ³ 13.5. Text input-output + 6821 6880 ³ 13.6. Example of high-level file processing + 6884 6973 ³ Bibliography + 19 100 ³Wstep + 105 349 ³1. Compound statements + 354 443 ³2. Modularity + 449 637 ³3. Procedures and functions + 642 829 ³4. Classes + 834 975 ³5. Adjustable arrays + 981 1158 ³6. Coroutines and semicoroutines + 1164 1490 ³7. Prefixing + 1496 1548 ³8. Formal types + 1554 1591 ³9. Protection techniques + 1597 1691 ³10. Programmed deallocation + 1697 1781 ³11. Exception handling + 1785 1788 ³12. Separate compilation (this section does not apply to PC vers + 1793 1999 ³13. Processes + 2005 2009 ³References. + 20 29 ³Wstep + 110 118 ³0. Preface + 123 141 ³1. Using Loglan-82 system + 146 184 ³ 1.1. Compilation + 187 216 ³ 1.2. Compiler switches + 220 245 ³ 1.3. Code generation + 249 294 ³ 1.4. Program interpretation + 296 327 ³ 1.5. Compile time error + 332 341 ³ 1.6. Run-time errors + 346 359 ³2. Compiler options + 362 371 ³ 2.1. Option format + 378 403 ³ 2.2. Options list + 408 410 ³3. Loglan implementation specification + 411 419 ³ 3.1. Implemented subset of Loglan + 422 432 ³ 3.2. Non-standard language elements + 437 442 ³ 3.3. File system + 445 461 ³ 3.3.1. File variables + 465 501 ³ 3.3.2. File generation + 504 508 ³ 3.3.3. File deallocation + 512 530 ³ 3.3.4. General file operations + 535 556 ³ 3.3.5. Text files + 560 577 ³ 3.3.6. Binary sequential files + 581 630 ³ 3.3.7. Direct access binary files + 635 644 ³ 3.4. Concurrency + 647 676 ³ 3.4.1. Invoking the LOGLAN interpreter for concurrent pro + 679 753 ³ 3.4.2. Restrictions and differences from the report + 756 841 ³ 3.4.3. Communication mechanism + 846 865 ³ 3.5. System signals + 870 910 ³ 3.6. Implementation restrictions + 913 922 ³A. Standard constants + 928 1077 ³B. Standard classes + 931 972 ³ IIUWGRAPH + 976 1077 ³ MOUSE + 1082 1196 ³C. Standard procedures and functions + 1202 1755 ³D. Error codes + 1758 1833 ³E. Loglan runtime errors + 1835 1914 ³F. Character set + 1919 1923 ³Bibliography + 435 455 ³ proc BORDER(consts b: integer); + 883 889 ³ L proc BURY(window: buffer); + 636 649 ³ proc CIRB(consts ix,iy,ir: integer; + 636 649 ³ consts alfa, beta: real; + 636 649 ³ consts cbord, bcint, p, q: integer); + 250 253 ³ proc CLS; + 356 379 ³ proc COLOR(consts c: integer); + 626 632 ³ proc DRAW(consts ix,iy: integer); + 892 896 ³ L proc EXPOSE(window: buffer; consts x,y: integer) + 694 714 ³ L proc GETMAP(consts x,y: integer; ekran: buffer); + 242 247 ³ L proc GROFF; + 203 220 ³ proc GRON(consts imode: integer); + 770 794 ³ proc HASCII(consts ic: integer); + 652 667 ³ proc HFILL(consts maxx: integer); + 802 806 ³ proc HFONT(consts seg, offs: integer); + 809 813 ³ proc HFONT8(vars seg, offs: integer); + 260 298 ³ proc HPAGE(consts page, mode, clear: integer); + 832 857 ³ P proc INHLINE(vars n:integer; line: tekst); + 520 527 ³ proc INTENS(consts i: integer); + 907 916 ³ PL proc INWLINE(window: buffer; vars n: integer; + 907 916 ³ line: tekst); + 869 880 ³ L proc MKWNDW(consts x,y,icols,ilines: integer; + 869 880 ³ window: buffer; + 869 880 ³ consts iwndwsize,iborder: integer); + 537 547 ³ proc MOVE(consts ix,iy: integer); + 728 732 ³ proc ORMAP(ekran: buffer); + 825 829 ³ PL proc OUTHLINE(consts n:integer; line: tekst); + 899 904 ³ PL proc OUTWLINE(window: buffer; consts n: integer; + 899 904 ³ line: tekst); + 458 516 ³ proc PALLET(consts p: integer); + 411 432 ³ proc PATERN(consts p1, p2, p3, p4: integer); + 607 610 ³ proc POINT(consts ix,iy: integer); + 558 577 ³ proc POPXY; + 1067 1084 ³ proc PRTSCR(consts nr: integer); + 550 555 ³ proc PUSHXY; + 718 725 ³ proc PUTMAP(ekran: buffer); + 1015 1021 ³ L proc RCIRB(consts ix,iy,ir: real; + 1015 1021 ³ consts alfa, beta: real; + 1015 1021 ³ consts cbord, bcint, p, q: integer); + 1006 1011 ³ L proc RDRAW(consts rx,ry: real); + 998 1002 ³ L proc RMOVE(consts rx,ry: real); + 981 984 ³ PL proc RWINDOW(rw: array [1:4] of real; + 981 984 ³ consts s: integer); + 382 405 ³ proc STYLE(consts s: integer); + 935 974 ³ PL proc SWINDOW(rw: array [1:4] of real; + 935 974 ³ iw: array [1:4] of integer; + 935 974 ³ consts s: integer); + 584 596 ³ proc TRACK(consts x,y: integer); + 675 684 ³ proc VFILL(consts maxy: integer); + 301 345 ³ proc VIDEO(ekran: buffer); + 735 739 ³ proc XORMAP(ekran: buffer); + 979 982 ³MOUSE + 989 993 ³showcursor:procedure + 995 999 ³hidecursor:procedure + 1001 1007 ³status:procedure(output h, v:integer, l, r, c:boolean) + 1009 1014 ³setposition:procedure(h, v:integer) + 1016 1022 ³getpress:procedure(b:integer; output h, v, p:integer, l, r, c:boo + 1024 1030 ³getrelease:procedure(b:integer; output h, v, p:integer, l, r, c:b + 1032 1036 ³setwindow:procedure(l, r, t, b:integer) + 1039 1054 ³defcursor:procedure(s, x, y:integer) + 1056 1058 ³getmovement:procedure(output h, v:integer) + 1060 1069 ³setspeed:procedure(h, v:integer) + 1071 1077 ³setthreshold:procedure(s:integer) + 1085 1086 ³ ENDRUN:procedure; + 1088 1089 ³ RANSET:procedure(x:real); + 1180 1182 ³ RESET:procedure(f:file); + 1184 1187 ³ REWRITE:procedure(f:file); + 1189 1190 ³ UNLINK:procedure(f:file); + 1192 1193 ³ SEEK:procedure(f:file; offset, base:integer); + 749 765 ³ L func INKEY(consts idummy: integer): integer; + 613 616 ³ func INPIX(consts x,y: integer): integer; + 543 547 ³ L func INXPOS(consts idummy: integer): integer; + 543 547 ³ L func INYPOS(consts idummy: integer): integer; + 224 238 ³ L func NOCARD(consts idummy: integer): integer; + 988 994 ³ PL func RINXPOS(consts dummy: real): real; + 988 994 ³ PL func RINYPOS(consts dummy: real): real; + 976 982 ³MOUSE + 984 987 ³init:function(output b:integer):boolean + 1091 1093 ³ RANDOM:function:real; + 1095 1096 ³ SQRT:function(x:real):real; + 1098 1099 ³ SIN:function(x:real):real; + 1101 1102 ³ COS:function(x:real):real; + 1104 1105 ³ TAN:function(x:real):real; + 1107 1108 ³ EXP:function(x:real):real; + 1110 1111 ³ LN:function(x:real):real; + 1113 1114 ³ ATAN:function(x:real):real; + 1116 1117 ³ ENTIER:function(x:real):integer; + 1119 1121 ³ ROUND:function(x:real):integer; + 1123 1124 ³ IMIN:function(x, y:integer):integer; + 1126 1127 ³ IMAX:function(x, y:integer):integer; + 1129 1130 ³ IMIN3:function(x, y, z:integer):integer; + 1132 1133 ³ IMAX3:function(x, y, z:integer):integer; + 1135 1137 ³ ISHFT:function(x, k:integer):integer; + 1139 1140 ³ IAND:function(n, k:integer):integer; + 1142 1143 ³ IOR:function(n, k:integer):integer; + 1145 1146 ³ XOR:function(n, k:integer):integer; + 1148 1150 ³ INOT:function(n:integer):integer; + 1152 1156 ³ ORD:function(c:char):integer; + 1158 1160 ³ CHR:function(n:integer):char; + 1162 1164 ³ UNPACK:function(s:string):arrayof char; + 1166 1168 ³ MEMAVAIL:function:integer; + 1170 1173 ³ EXEC:function(cmd:arrayof char):integer; + 1175 1178 ³ TIME:function: integer; + 1195 1196 ³ POSITION:function(f:file):real; + 1319 1345 ³ Wartosci kodow klawiszy specjalnych: + 1206 1213 ³ 0 - ***declaration part overloaded + 1214 1217 ³ 10 - ***too many errors + 1218 1219 ³ 41 - ***declaration part overloaded + 1220 1220 ³ 101 - ':=' expected + 1221 1221 ³ 102 - ';' expected + 1222 1222 ³ 103 - 'then' expected + 1223 1223 ³ 104 - 'fi'/'else' expected + 1224 1224 ³ 105 - 'od' expected + 1225 1225 ³ 106 - '(' expected + 1226 1226 ³ 107 - ')' expected + 1227 1227 ³ 108 - 'do' expected + 1228 1228 ³ 109 - identifier expected + 1229 1231 ³ 110 - too many exits found + 1232 1232 ³ 111 - illegal character + 1233 1233 ³ 112 - wrong structure of 'if'-statement + 1234 1234 ³ 113 - 'end' missing + 1235 1235 ³ 114 - '.' expected + 1236 1238 ³ 115 - illegal constant in expression + 1239 1239 ³ 116 - '=' expected + 1240 1240 ³ 117 - constant expected + 1241 1241 ³ 118 - ':' expected + 1242 1244 ³ 119 - unit kind specification expected + 1245 1245 ³ 120 - 'hidden' or 'close' occurred twice + 1246 1246 ³ 121 - 'hidden' or 'close' out of a class + 1247 1247 ³ 122 - 'block' expected + 1248 1250 ³ 123 - object expression is not a generator + 1251 1251 ³ 124 - 'dim' expected + 1252 1252 ³ 125 - 'to'/'downto' expected + 1253 1253 ³ 126 - illegal arithmetic operator + 1254 1254 ³ 127 - declaration part expected + 1255 1257 ³ 128 - incorrect identifier at 'end' + 1258 1258 ³ 129 - wrong structure of 'case'-statement + 1259 1259 ³ 130 - wrong structure of 'do'-statement + 1260 1262 ³ 131 - illegal use of 'main' + 1263 1263 ³ 132 - 'when' expected + 1264 1266 ³ 133 - too many branches in 'case'-statement + 1267 1267 ³ 134 - 'begin' missed + 1268 1268 ³ 135 - bad option + 1269 1271 ³ 136 - is it really a loglan program??? + 1272 1276 ³ 137 - 'block' missed - parsing began + 1277 1279 ³ 138 - 'repeat' out of a loop + 1280 1280 ³ 139 - there is no path to this statement + 1281 1281 ³ 140 - 'andif'/'orif' mixed + 1282 1282 ³ 141 - array of 'semaphore' is illegal + 1283 1285 ³ 142 - wrong handler end + 1286 1286 ³ 143 - lastwill inside a structured statement + 1287 1289 ³ 144 - repeated lastwill + 1290 1290 ³ 145 - no parameter specification + 1291 1291 ³ 146 - wrong register specification + 1292 1292 ³ 147 - "," expected + 1293 1296 ³ 191 - ***null program + 1297 1300 ³ 196 - ***too many identifiers + 1301 1304 ³ 197 - ***too many formal parameters + 1305 1307 ³ 198 - ***parsing stack overloaded + 1308 1311 ³ 199 - ***too many prototypes + 1312 1312 ³ 201 - wrong real constant + 1313 1313 ³ 202 - wrong comment + 1314 1314 ³ 203 - wrong character constant + 1315 1315 ³ 204 - wrong integer constant + 1316 1317 ³ 205 - integer overflow + 1318 1319 ³ 206 - real overflow + 1320 1322 ³ 211 - identifier too long + 1323 1325 ³ 212 - string too long + 1326 1329 ³ 301 - prefix is not a class id + 1330 1332 ³ 303 - coroutine/process illegal here as prefix id + 1333 1335 ³ 304 - hidden identifier cannot be taken id + 1336 1336 ³ 305 - undeclared identifier id + 1337 1337 ³ 306 - undeclared type identifier id + 1338 1342 ³ 307 - type identifier expected id + 1343 1343 ³ 308 - undeclared prefix identifier id + 1344 1344 ³ 309 - declared more than once id + 1345 1345 ³ 310 - taken list in unprefixed unit + 1346 1349 ³ 316 - formal type specification after use id + 1350 1353 ³ 317 - hidden type identifier id + 1354 1356 ³ 318 - type identifier not taken id + 1357 1359 ³ 319 - hidden identifier in the list id + 1360 1363 ³ 320 - identifier in the list not taken id + 1364 1366 ³ 321 - identifier cannot be taken id + 1367 1368 ³ 322 - hidden prefix identifier id + 1369 1370 ³ 323 - prefix identifier not taken id + 1371 1373 ³ 329 - only procedure and function may be virtual + 1374 1374 ³ 330 - virtual in unprefixed block/procedure/function + 1375 1378 ³ 331 - incompatible kinds of virtuals id + 1379 1381 ³ 332 - incompatible types of virtuals id + 1382 1384 ³ 333 - different lengths of form.param.lists in virtuals + 1385 1390 ³ 334 - conflict kinds of the 1st level parameters + 1391 1395 ³ 335 - incompatible types of the 1st level parameters + 1396 1400 ³ 336 - different lengths of the 2nd level params lists + 1401 1405 ³ 337 - incompatible kinds of the 2nd level parameters i + 1406 1410 ³ 338 - incompatible types of the 2nd level parameters i + 1411 1412 ³ 341 - ***declaration part overloaded + 1413 1413 ³ 342 - ***too many classes declared + 1414 1415 ³ 343 - ***too many prototypes + 1416 1416 ³ 350 - undeclared signal identifier id + 1417 1418 ³ 351 - hidden signal identifier id + 1419 1420 ³ 352 - signal identifier not taken id + 1421 1423 ³ 353 - signal identifier expected id + 1424 1428 ³ 354 - different types of parameters id + 1429 1432 ³ 355 - incompatible kinds of parameters id + 1433 1436 ³ 356 - different identifiers of parameters id + 1437 1438 ³ 357 - incompatible kinds of the 2nd level parameters i + 1439 1440 ³ 358 - different types of the 2nd level parameters + 1441 1446 ³ 359 - different lengths of the 2nd level params lists + 1447 1450 ³ 360 - different lengths of form. param. lists in signal + 1451 1453 ³ 361 - non-local formal type cannot be used id + 1454 1456 ³ 362 - repeated handler for signal id + 1457 1459 ³ 370 - only 'input' is legal here + 1460 1473 ³ 398 - class prefixed by itself id + 1474 1476 ³ 404 - repeated label in 'case'-statement id + 1477 1479 ³ 405 - illegal type of 'case' expression id + 1480 1480 ³ 406 - different types of labels and 'case' expression + 1481 1481 ³ 407 - non-logical expression after 'if'/'while' i + 1482 1484 ³ 408 - real constant out of integer range + 1485 1487 ³ 410 - simple variable expected id + 1488 1490 ³ 411 - non-integer control variable id + 1491 1495 ³ 412 - non-integer expression id + 1496 1496 ³ 413 - file expression expected id + 1497 1497 ³ 414 - string expression expected id + 1498 1501 ³ 415 - reference expression expected id + 1502 1502 ³ 416 - array expression expected id + 1503 1503 ³ 417 - boolean expression expected id + 1504 1504 ³ 418 - semaphore variable expected + 1505 1507 ³ 419 - illegal type in 'open' + 1508 1511 ³ 420 - variable expected id + 1512 1514 ³ 421 - class identifier after 'new' expected id + 1515 1515 ³ 422 - procedure identifier after 'call' expected + 1516 1518 ³ 423 - 'new' missing id + 1519 1521 ³ 424 - 'call' missing id + 1522 1522 ³ 425 - 'inner' out of a class + 1523 1523 ³ 426 - 'inner' occurred more than once + 1524 1524 ³ 427 - 'wind'/'terminate' out of a handler + 1525 1525 ³ 428 - 'inner' inside lastwill + 1526 1528 ³ 429 - definition cannot be reduced to constant id + 1529 1529 ³ 430 - undefined constant in the definition id + 1530 1532 ³ 431 - wrong number of indices id + 1533 1533 ³ 432 - index out of range id + 1534 1534 ³ 433 - upper bound less than lower bound id + 1535 1536 ³ 434 - too many subscripts id + 1537 1537 ³ 435 - variable is not array id + 1538 1541 ³ 440 - type identifier expected after 'arrayof' id + 1542 1545 ³ 441 - incorrect format in 'write' + 1546 1548 ³ 442 - illegal expression in 'write' + 1549 1551 ³ 443 - illegal type of variable in 'read' id + 1552 1553 ³ 444 - no data for i/o transfer + 1554 1554 ³ 445 - illegal expression in 'put' + 1555 1555 ³ 446 - illegal expression in 'get' + 1556 1558 ³ 448 - 'raise' missing id + 1559 1561 ³ 449 - signal identifier expected id + 1562 1563 ³ 450 - illegal procedure occurrence id + 1564 1565 ³ 451 - illegal class occurrence id + 1566 1567 ³ 452 - illegal type occurrence id + 1568 1569 ³ 453 - illegal signal occurrence id + 1570 1570 ³ 454 - illegal operator occurence + 1571 1571 ³ 455 - wrong number of operands + 1572 1572 ³ 460 - divided by zero + 1573 1576 ³ 470 - illegal input parameter id + 1577 1579 ³ 471 - illegal output parameter id + 1580 1582 ³ 472 - illegal type parameter id + 1583 1585 ³ 473 - illegal procedure parameter id + 1586 1588 ³ 474 - illegal function parameter id + 1589 1591 ³ 475 - illegal left side of 'is'/'in' id + 1592 1594 ³ 476 - illegal right side od 'is'/'in' id + 1595 1597 ³ 477 - illegal parameter of 'attach' id + 1598 1598 ³ 478 - illegal type of expression + 1599 1599 ³ 479 - negative step value + 1600 1606 ³ 550 - ***stack overloaded + 1607 1610 ³ 551 - ***too many auxiliary variables needed + 1611 1612 ³ 552 - ***too many auxiliary reference variable needed + 1613 1617 ³ 553 - ***statement sequence too long or too complicated + 1618 1621 ³ 554 - ***real constants dictionary overflow + 1622 1622 ³ 600 - undeclared identifier id + 1623 1625 ³ 601 - illegal type before '.' id + 1626 1629 ³ 602 - close identifier after '.' id + 1630 1634 ³ 603 - undeclared identifier after '.' id + 1635 1637 ³ 604 - illegal operand type id + 1638 1640 ³ 605 - illegal type in 'div/'mod' term id + 1641 1642 ³ 606 - incompatible types in comparison id + 1643 1646 ³ 607 - unrelated class types in comparison id + 1647 1648 ³ 608 - string cannot be compared id + 1649 1654 ³ 609 - incompatible types in assignment/transmission id + 1655 1656 ³ 610 - unrelated class types in assignment/transmission + 1657 1658 ³ 611 - constant after '.' id + 1659 1662 ³ 612 - this class does not occur in sl-chain id + 1663 1667 ³ 613,614 - class identifier expected id + 1668 1671 ³ 615 - illegal type before 'qua' id + 1672 1676 ³ 616,617 - illegal type after 'qua' id + 1677 1680 ³ 618 - unrelated types in 'qua'-expression id + 1681 1684 ³ 619 - hidden identifier id + 1685 1688 ³ 620 - not taken identifier id + 1689 1691 ³ 621 - invisible identifier after '.' id + 1692 1696 ³ 622 - formal parameter list is shorter id + 1697 1698 ³ 623 - formal parameter list is longer id + 1699 1702 ³ 624 - actual parameter is not a reference type id + 1703 1705 ³ 625 - actual parameter is not a type id + 1706 1710 ³ 626 - procedure-function conflict between parameters i + 1711 1716 ³ 627 - unmatched heads-wrong kinds of parameters i + 1717 1721 ³ 628 - unmatched heads-incompatible types in lists + 1722 1726 ³ 629 - unmatched heads-unrelated class types in lists i + 1727 1729 ³ 630 - unmatched heads-different numbers of parameters + 1730 1733 ³ 631 - incompatible types of function parameters + 1734 1737 ³ 632 - function/procedure expected id + 1738 1744 ³ 633 - actual function type defined weaker than formal + 1745 1750 ³ 634 - unmatched heads-too weak type in actual list + 1751 1753 ³ 635 - standard function/procedure cannot be actual par. + 1754 1754 ³ 636 - illegal use of semaphore id + 1755 1755 ³ 637 - 'semaphore' cannot be used id + 1760 1761 ³LOGLAN RUNTIME ERRORS + 1763 1764 ³ARRAY INDEX ERROR (CONERROR) + 1765 1765 ³NEGATIVE STEP VALUE (CONERROR) + 1766 1768 ³SL CHAIN CUT OFF (LOGERROR) + 1769 1771 ³ILLEGAL ATTACH (LOGERROR) + 1772 1774 ³ILLEGAL DETACH (LOGERROR) + 1775 1777 ³ILLEGAL RESUME (LOGERROR) + 1778 1779 ³TOO MANY PROCESSES ON ONE MACHINE (SYSERROR) + 1780 1782 ³INVALID NODE NUMBER (SYSERROR) + 1783 1786 ³IMPROPER QUA (LOGERROR) + 1787 1789 ³ILLEGAL ASSIGNMENT (TYPERROR) + 1790 1791 ³FORMAL TYPE MISSING (LOGERROR) + 1792 1793 ³ILLEGAL KILL (LOGERROR) + 1794 1797 ³ILLEGAL COPY (LOGERROR) + 1798 1800 ³REFERENCE TO NONE (ACCERROR) + 1801 1801 ³MEMORY OVERFLOW (MEMERROR) + 1802 1806 ³INCOMPATIBLE HEADERS (TYPERROR) + 1807 1809 ³INCORRECT ARRAY BOUNDS (CONERROR) + 1810 1810 ³DIVISION BY ZERO (NUMERROR) + 1811 1812 ³COROUTINE TERMINATED (LOGERROR) + 1813 1814 ³COROUTINE ACTIVE (LOGERROR) + 1815 1816 ³HANDLER NOT FOUND (LOGERROR) + 1817 1819 ³ILLEGAL RETURN (LOGERROR) + 1820 1821 ³UNIMPLEMENTED STANDARD PRC. (LOGERROR) + 1822 1823 ³FORMAL LIST TOO LONG (MEMERROR) + 1824 1826 ³ILLEGAL I/O OPERATION (SYSERROR) + 1827 1828 ³I/O ERROR (SYSERROR) + 1829 1829 ³CANNOT OPEN FILE (SYSERROR) + 1830 1830 ³INPUT DATA FORMAT BAD (SYSERROR) + 1831 1832 ³SYSTEM ERROR (SYSERROR) + 1833 1833 ³UNRECOGNIZED ERROR + 1838 1914 ³CHARACTER SET diff --git a/sources/lotek.src/lotek/lotek.hlp b/sources/lotek.src/lotek/lotek.hlp new file mode 100644 index 0000000..26b6d2a --- /dev/null +++ b/sources/lotek.src/lotek/lotek.hlp @@ -0,0 +1,737 @@ +(* Loglanizator Tekstowy wersja 1.0 1990 Warszawa Michal Pakier *) +===============REKORD 1=======================================|=============== ++ 9 2 42 4 5 6 7 8 + Obsluga edytora LOglanizator TEKstowy wersja 1.1 + + Poslugiwanie sie helpem nacisnij <0> + Operacje edytorskie <1> + F3 Operacje plikowe <2> + F4 Wyszukiwanie bledow <3> + F5 Zmiana aktualnego okienka <4> + F8 Programy pomocnicze <5> + F9 Kompilacja <6> +===============REKORD 2=======================================|=============== ++ 11 + INFORMACJA O POSLUGIWANIU SIE HELPEM. + + W kazdej sytuacji po nacisnieciu klawisza F1 mozemy otrzymac +informacje o aktualnie dostepnych opcjach. Na wyswietlonym +czesto moze byc wspomniane o mozliwosci uzyskania dokladniej- +szych informacji na podany temat. Uzyskuje sie ja przez nacis- +niecie jednego z klawiszy {0,1,2,3,4,5,6,7,8,9},co jest przed- +stawione na ekranie przez wypisanie nazwy danego klawisza w na- +wiasach trujkatnych. + Esc opuszczenie helpa + F1 przejscie do glownego okienka helpa +===============REKORD 3=======================================|=============== ++ 10 2 4 + Nagrywanie pliku na dysk (F2,F3S) + +Moze sie zdarzyc, ze z jakiegos powodu nie mozna nagrac pliku +w katalogu, z ktorego go wgralismy. Wtedy nalezy przejsc (F3 L) +do katalogu,w ktorym mamy wszystkie prawa i tam zgrac nasz plik +opcja F3 W. + +Aby dowiedziec sie wiecej o operacjach plikowych nacisnij <1> +--------------------------------------------------------------- +ABY DOWIEDZIEC SIE JAK POSLUGIWAC SIE HELPEM NACISNIJ <0> +===============REKORD 4=======================================|=============== ++ 17 2 23 3 24 25 26 41 + Operacje plikowe (F3) + +Przy pomocy znajdujacych sie tu funkcji mozemy wybrac dowolny +plik do edycji. +Mamy do dyspozycji nastepujace funkcje: + + L Ladowanie pliku z dysku <1> + S Nagrywanie pliku na dysk <2> + N Rozpoczynanie edycji nowego pliku <3> + W Zmiana nazwy pliku <4> + P Ostatnio uzywane pliki <5> + O Rozne opcje <6> + G Informacje o edytowanych plikach i ilosci + wolnej pamieci. + Q Wyjscie z programu +--------------------------------------------------------------- +ABY DOWIEDZIEC SIE JAK POSLUGIWAC SIE HELPEM NACISNIJ <0> +===============REKORD 5=======================================|=============== ++ 18 2 + POPRAWIANIE BLEDOW + +Ta opcja ulatwia poprawianie bledow w programie. W najnizszej +linii pojawia sie numer linii, w ktorej wystapil blad, numer +bledu i krotki opis. Kursor automatycznie ustawia sie w miejscu +wystapinia. Dla niektorych bledow wskazuje dokladnie wiersz +i kolumne,dla innych tylko wiersz i wtedy ustawia sie w pierw- +szej kolumnie. Jesli ustawilismy opcje wyswietlania menu (F10) +to nad linia z opisem bledu pojawia sie sciagawka o sposobie +przegladania bledow.Dostepne sa nastepujace funkcje: + Ctrl F5 - Przejscie do pierwszego bledu + Ctrl F6 - Przejscie do ostatniego bledu + Ctrl F8 - Przejscie do nastepnego bledu + Ctrl F7 _ Przejscie do poprzedniego bledu + Ctrl F10 - Koniec poprawiania bledow +Ponowne wcisniecie F4 powoduje wyjscie z opcji. +--------------------------------------------------------------- +ABY DOWIEDZIEC SIE JAK POSLUGIWAC SIE HELPEM NACISNIJ <0> +===============REKORD 6=======================================|=============== ++ 10 2 12 + ZMIANA AKTUALNEGO OKNA + + Dzieki tej funkcji mozemy zmienic okienko robocze. +Mamy do wyboru nastepujace funkcje: + F Rozszerza aktualne okienko na caly ekran. + H Przechodzimy do okienka z baza danych o Loglanie.<1> + A Przechodzimy do okienka dodatkowego + M przechodzimy do okienka glownego. +--------------------------------------------------------------- +ABY DOWIEDZIEC SIE JAK POSLUGIWAC SIE HELPEM NACISNIJ <0> +===============REKORD 7=======================================|=============== ++ 19 2 + PRZECHODZENIE DO PROGRAMOW POMOCNICZYCH + +Ta opcja umozliwia wykonywanie pewnych programow, bez wycho- +dzenia z tego prograwu do systemu.To okienko mozemy zdefiniowac +sobie sami w czasie instalacji edytora.Umozliwia ono miedzy +innymi wykonywanie pewnych operacjii na edytowanym pliku(nazwa +pliku jest umieszczana w parametrach wywolanego programu). +Jako jedna z opcji mozna umiescic program LOTEKINS co pozwala +na zmiane tego okienka w trakcie pracy.Wywolanie opcji tego +okienka moze byc umieszczone w makroinstrukcji +(Przyklad: Jesli mamy komputer z dwoma monitorami i zdefiniuje- +my instrukcje:C COLOR (mode co80) i M MONO (mode mono) +to makroinstrukcja @8M@5H@5F spowoduje,ze bedziemy mogli +ogladac baze danych na moanitorze z karta Hercules. + @8C@5M@5F spowoduje,ze bedziemy mogli +edytowac plik glowny na ekranie kolorowy(ale baza danych nie +zniknie z ekranu monochromatycznego) +--------------------------------------------------------------- +ABY DOWIEDZIEC SIE JAK POSLUGIWAC SIE HELPEM NACISNIJ <0> +===============REKORD 8=======================================|=============== ++ 13 2 36 + KOMPILOWANIE PROGRAMU + +Tutaj mamy nastepujace opcje: + L: Pass 1 Pierwszy przebieg kompilacji (program Loglan) tu + sa miedzy innymi wykrywane popelnione przez nas bledy (F4) + G: Pass 2 Drugi lub pierwszy i drugi przebieg kompilacji + (program Gen) tu jest generowany gotowy do wykonania program + R: Run Wykonywanie programu (lub takze kompilacja). + D: Debuger Najpierw wykonujemy program,a potem mozemy prze- + sledzic instrukcja po instrukcji jak przebiegalo to wykonanie + O: Options<1> Tu ustawia sie rozne opcje zwiazane z kompilacja +--------------------------------------------------------------- +ABY DOWIEDZIEC SIE JAK POSLUGIWAC SIE HELPEM NACISNIJ <0> +===============REKORD 9=======================================|=============== ++ 19 2 27 28 29 30 31 32 33 34 35 + OPERACJE BLOKOWE + +Po nacisnieciu Ctrl_K wybieramy klawisz odpowiadajacy intere- +sujacej nas funkcji.Jesli przez 2 sek. tego nie zrobimy to +pojawi sie ramka z wypisanymi wszystkimi opcjami. + +Mamy do dyspozycji nastepujaca funkcje: + + K,B,T,L -zaznaczanie bloku <1> + Y -kasowanie bloku <2> + C,V -zwyczajne przenoszenie bloku <3> + S,M -przenoszenie z wyrownywaniem <4> + R,W -blok z dysku i na dysk <5> + U,I -przesuwanie bloku <6> + H -chowanie bloku <7> + F -blok w ramke <8> + O -opcje <9> +--------------------------------------------------------------- +ABY DOWIEDZIEC SIE JAK POSLUGIWAC SIE HELPEM NACISNIJ <0> +===============REKORD 10=======================================|=============== ++ 15 2 37 38 39 40 + OPERACJE KONTROLOWANEGO PRZEMIESZCZANIA SIE PO TEKSCIE + +Po nacisnieciu Ctrl_J wybieramy klawisz odpowiadajacy intere- +sujacej nas funkcji.Jesli przez 2 sek. tego nie z +pojawi sie ramka z wypisanymi wszystkimi opcjami. + +Mamy do dyspozycji nastepujace funkcje: + + S -ustawienie miejsca dla skoku <1> + R -powrot do ostatnio ustawionego miejsca <2> + J -skok do ostatnio ustawionego miejsca <3> + L -skok do podanej linii + B,K -skoki do poczatku i konca bloku <4> +--------------------------------------------------------------- +ABY DOWIEDZIEC SIE JAK POSLUGIWAC SIE HELPEM NACISNIJ <0> +===============REKORD 11=======================================|=============== ++ 19 2 15 16 17 18 19 20 + OPERACJE WYSZUKIWANIA I ZAMIANY SLOW + +Po nacisnieciu Ctrl_Q wybieramy klawisz odpowiadajacy intere- +sujacej nas funkcji.Jesli przez 2 sek. tego nie zrobimy to +pojawi sie ramka z wypisanymi wszystkimi opcjami. + +Mamy do dyspozycji nastepujace opcje: + + F -znajdz podane slowo <1> + A -znajdz slowo i zamien je na inne <2> + C -zamien znaki <3> + K -zamien slowa kluczowe <4> + T -znajdz slowo wskazywane przez kursor <5> + R -znajdz i zamien slowo wskazywane przez kursor <6> + +UWAGA:Naciskajac Ctrl L mozesz powtorzyc ostatnio wykonywana + funkcje wyszukiwania i zamiany. +--------------------------------------------------------------- +ABY DOWIEDZIEC SIE JAK POSLUGIWAC SIE HELPEM NACISNIJ <0> +===============REKORD 12=======================================|=============== ++ 16 2 13 14 + SPIS TRESCI WIADOMOSCI O LOGLANIE + + Kazda linia jaka widzisz na ekranie oznacza jakis tekst. +Podkreslenie oznacza linie,ktora mozna aktualnie wybrac. + + Enter -przejscie do ogladania podrozdzialu <1> + kursor w gore -poprzenia linia + kursor w dol -nastepna linia + Ctrl PgUp -do poczatku spisu + Ctrl PgDn -do konca spisu + PgUp,PgDn -o strone w gore lub w dol + Tab -wybieranie roznych innych rozdzialow <2> + Ctrl_Q_F -wyszukiwanie podanego slowa + Esc - powrot do glownego okienka edycyjnego +--------------------------------------------------------------- +ABY DOWIEDZIEC SIE JAK POSLUGIWAC SIE HELPEM NACISNIJ <0> +===============REKORD 13=======================================|=============== ++ 14 2 12 14 + TRESC PODROZDZIALU + + Enter -powrot do spisu tresci <1> + Tab -wybieranie roznych innych rozdzialow <2> + Up,Down,Left,Right -przemieszczanie kursora + Home,End -do poczatku i konca linii + Ctrl PgUp -do poczatku tekstu + Ctrl PgDn -do konca tekstu + PgUp,PgDn -o strone w gore lub w dol + Ctrl_K_B,K,L,T -zaznaczanie bloku + Ctrl_Q_F -wyszukiwanie slowa + Esc -powrot do glownego okienka edycyjnego +--------------------------------------------------------------- +ABY DOWIEDZIEC SIE JAK POSLUGIWAC SIE HELPEM NACISNIJ <0> +===============REKORD 14=======================================|=============== ++ 11 2 + WYBOR ROZDZIALU INFORMACJI O LOGLANIE + + Na ekranie widzimy okienko z wypisanymi nazwami rozdzialow +jakie z niego mozemy otrzymac.Kursorami w gore i w dol wedru- +jemy po okienku Home i End przenosi nas na poczatek lub koniec. +Enter pozwala wybrac wskazywany rozdzial i odrazu przechodzimy +do niego.Kursorami w lewo i w prawo przechodzimy do sasiednich +okienek z innymi rozdzialami.Esc powoduje powrot do ostatnio +ogladanego rozdzialu. +--------------------------------------------------------------- +ABY DOWIEDZIEC SIE JAK POSLUGIWAC SIE HELPEM NACISNIJ <0> +===============REKORD 15=======================================|=============== ++ 17 2 46 + (F) WYSZUKIWANIE WYRAZEN REGULARNYCH W TEKSCIE + +Najpierw podajemy tresc slowa, ktore chcemy znalezc (Find :?). +Przy zapisie slowa obowiazuja pewne reguly, ktore poznasz naci- +skajac klawisz <1> +W nastepnej kolejnosci czytane sa opcje , a potem nastepuje +szukanie.Jesli znaleziono podane slowo to kursor ustawia sie na +nastepnej pozycji za nim. +Dzialaja nastepujace opcje : + G.........Szukanie rozpocznie sie na poczatku lub koncu tekstu. + B.........................................Przeszukiwanie w tyl. + n............................Szukanie az do n-tego wystapienie. + U...........................Utozsamianie duzych i malych liter. + W.........................................Szukanie calych slow. + L.........................Szukanie wewnatrz zaznaczonego bloku. +--------------------------------------------------------------- +ABY DOWIEDZIEC SIE JAK POSLUGIWAC SIE HELPEM NACISNIJ <0> +===============REKORD 16=======================================|=============== ++ 21 2 46 48 + (A) ZAMIANA WYSTAPIEN PODANEGO SLOWA W TEKSCIE + +Najpierw podajemy tresc slowa, ktore chcemy znalezc. (Find :?) +Przy zapisie slowa obowiazuja pewne reguly, ktore poznasz naci- +skajac klawisz <1> +Potem podajemy na co chcemy zamienic to slowo. (Replace with :?) +Tu obowiazuja takze pewne reguly (nacisnij <2>). +W nastepnej kolejnosci czytane sa opcje , a potem nastepuje +szukanie.Jesli znaleziono podane slowo to kursor ustawia sie na +tym slowia a w najwyzszej linii ekranu pojawia sie pytanie, czy +zamienic to slowo,czy tez nie. +Dzialaja nastepujace opcje : + G.........Szukanie rozpocznie sie na poczatku lub koncu tekstu. + B.........................................Przeszukiwanie w tyl. + n...............................Zamiana pierwszych n wystapien. + U...........................Utozsamianie duzych i malych liter. + W.........................................Szukanie calych slow. + L.........................Szukanie wewnatrz zaznaczonego bloku. + N...........Zamiana bezwarunkowa (bez pytania za kazdym razem). +--------------------------------------------------------------- +ABY DOWIEDZIEC SIE JAK POSLUGIWAC SIE HELPEM NACISNIJ <0> +===============REKORD 17=======================================|=============== ++ 13 2 + (C) ZAMIANA ZNAKOW + +Ta funkcja umozliwia zamiane duzych liter na male lub odwrotnie +Dzialaja nastepujace opcje : + D.......................................Zamiana na duze litery. + S.......................................Zamiana na male litery. + G.........Szukanie rozpocznie sie na poczatku lub koncu tekstu. + B.........................................Przeszukiwanie w tyl. + L.........................Szukanie wewnatrz zaznaczonego bloku. + C............................Zamiana tylko wewnatrz komentarzy. + T......................................Zamiana tylko w tekscie. +--------------------------------------------------------------- +ABY DOWIEDZIEC SIE JAK POSLUGIWAC SIE HELPEM NACISNIJ <0> +===============REKORD 18=======================================|=============== ++ 12 2 + (K) ZAMIANA SLOW KLUCZOWYCH + +Ta funkcja umozliwia nam zamiane wszystkich slow kluczowych +jezyka Loglan. +Dzialaja nastepujace opcje : + D.......................................Zamiana na duze litery. + S.......................................Zamiana na male litery. + G.........Szukanie rozpocznie sie na poczatku lub koncu tekstu. + B.........................................Przeszukiwanie w tyl. + L.........................Szukanie wewnatrz zaznaczonego bloku. +--------------------------------------------------------------- +ABY DOWIEDZIEC SIE JAK POSLUGIWAC SIE HELPEM NACISNIJ <0> +===============REKORD 19=======================================|=============== ++ 14 2 + (T) SZUKANIE SLOWA WSKAZYWANEGO PRZEZ KURSOR + +Najpierw podajemy opcje , a potem nastepuje szukanie. +Jesli znaleziono podane slowo to kursor ustawia sie na +nastepnej pozycji za nim. +Dzialaja nastepujace opcje : + G.........Szukanie rozpocznie sie na poczatku lub koncu tekstu. + B.........................................Przeszukiwanie w tyl. + n............................Szukanie az do n-tego wystapienie. + U...........................Utozsamianie duzych i malych liter. + W.........................................Szukanie calych slow. + L.........................Szukanie wewnatrz zaznaczonego bloku. +--------------------------------------------------------------- +ABY DOWIEDZIEC SIE JAK POSLUGIWAC SIE HELPEM NACISNIJ <0> +===============REKORD 20=======================================|=============== ++ 17 2 + (R) SZUKANIE I ZAMIANA SLOWA WSKAZYWANEGO PRZEZ KURSOR + +Najpierw podajemy na co chcemy zamienic to slowo. +W nastepnej kolejnosci czytane sa opcje , a potem nastepuje +szukanie.Jesli znaleziono podane slowo to kursor ustawia sie na +tym slowia a w najwyzszej linii ekranu pojawia sie pytanie, czy +zamienic to slowo,czy tez nie. +Dzialaja nastepujace opcje : + G.........Szukanie rozpocznie sie na poczatku lub koncu tekstu. + B.........................................Przeszukiwanie w tyl. + n...............................Zamiana pierwszych n wystapien. + U...........................Utozsamianie duzych i malych liter. + W.........................................Szukanie calych slow. + L.........................Szukanie wewnatrz zaznaczonego bloku. + N...........Zamiana bezwarunkowa (bez pytania za kazdym razem). +--------------------------------------------------------------- +ABY DOWIEDZIEC SIE JAK POSLUGIWAC SIE HELPEM NACISNIJ <0> +===============REKORD 21=======================================|=============== ++ 15 2 29 30 + OPERACJE WYMIANY BLOKOW MIEDZY OKNAMI TEKSTOWYMI I INNE + +Po nacisnieciu Ctrl_W wybieramy klawisz odpowiadajacy intere- +sujacej nas funkcji.Jesli przez 2 sek. tego nie z +pojawi sie ramka z wypisanymi wszystkimi opcjami. + +Mamy do dyspozycji nastepujace funkcje: + C -przekopiowanie bloku z drugiego widocznego na ekranie okna + V -przeniesienie bloku z drugiego widocznego na ekranie okna + S -przekopiowanie z przesunieciem z drugiego okna + M -przeniesienie z przesunieciem z drugiego okna + +Patrz C,V <1> S,M <2> +--------------------------------------------------------------- +ABY DOWIEDZIEC SIE JAK POSLUGIWAC SIE HELPEM NACISNIJ <0> +===============REKORD 22=======================================|=============== ++ 21 2 + DEFINIOWANIE MAKROROZKAZOW + +Kazdemu klawiszowi odpowiadajacemu literze,cyfrze lub klawiszo- +wi funkcyjnemu mozemy przyporzadkowac makroinstrukcje. +Makroinstrukcje sa uruchamiane przez jednoczesne nacisniecie Alt +i odpowiedniego klawisza. +W definicji makrorozkazu moga wystapic oprucz zwyczajnych znakow +ASCII zastepujace symbole: + ^.............Oznacza Ctrl + nastepny klawisz (A..Z oraz 0..9) + &..............Oznacza Alt + nastepny klawisz (A..Z oraz 0..9) + @........Oznacza klawisz funkcyjny.Nastepnym znakiem moze byc: + 1..0 - F1..F10 ³ <>^v - kursor ³ H - Home ³ E - End ³ + U - PgUp ³ D - PgDn ³ I - Insert ³ L - Delete ³ + S - Esc ³ B - Backspace ³ ³ ³ + C - Enter ³ ³ ³ ³ + #..Nastepny znak po ty nie jest interpretowany np.## oznacza # +Nawiasy klamrowe oznaczaja powtorzenie ich zawartosci pewna +liczbe razy . Np. {^C(* *)}12 spowoduje utworzenie 12 nowych +linii zawierajacych napis "(* *)" +--------------------------------------------------------------- +ABY DOWIEDZIEC SIE JAK POSLUGIWAC SIE HELPEM NACISNIJ <0> +===============REKORD 23=======================================|=============== ++ 19 2 + (L) WGRYWANIE PLIKU Z DYSKU + +Pojawia sie okienko,w ktorym mozemy podac nazwe pliku,lub maske +opisujaca grupe plikow. Jezeli podamy nazwe to dany plik jest +wgrywany ( jesli nie istnieje to rozpoczynamy jego edycje ). +Jezeli podamy maske to pojawiaja sie wszystkie odpowiadajace +jej nazwy plikow oraz podkatalogow. +>>>Mamy dostepne nastepujace klawisze: + Esc.........Powrot,bez wczytania pliku.Zostajemy w aktualnie + ustawionym podkatalogu. +   < >......................Przemieszczanie sie po okienku. + Enter.........Jesli wskazywana jest nazwa pliku to dany plik + jest wczytywany i mozemy rozpoczac jego edycje. + Jezeli wskazywany jest podkatalog to jest on + dodawany do aktualnej sciezki. + PgUp,PgDn......Przejscie do poprzedniej lub nastepnej strony + (w okienku miesci sie tylko 20 nazw). +--------------------------------------------------------------- +ABY DOWIEDZIEC SIE JAK POSLUGIWAC SIE HELPEM NACISNIJ <0> +===============REKORD 24=======================================|=============== ++ 7 2 + (N) ROZPOCZECIE EDYCJI NOWEGO PLIKU + +Czysci bufor tekstu i rozpoczyna edycje pliku o domyslnej +nazwie NONAME.LOG .Przy nagrywaniu na dysk program bedzie pro- +ponowal zmiane tej nazwy na inna. +--------------------------------------------------------------- +ABY DOWIEDZIEC SIE JAK POSLUGIWAC SIE HELPEM NACISNIJ <0> +===============REKORD 25=======================================|=============== ++ 10 2 + (W) ZMIANA NAZWY AKTUALNEGO PLIKU + +Zmienia nazwe aktualnie edytowanego pliku i nagrywa go na dysk +w aktualnym katalogu (ustawianie aktualnego katalogu funkcja L) +Jesli byl juz plik o takiej nazwie to pyta, czy go skasowac +UWAGA: Mozemy podac od razu nazwe nowego pliku lub maske +i wtedy zastepujemy aktualnie edytowanym plikiem jakis juz +istiejacy na dysku (Wybieranie tak jak w opcji L). +--------------------------------------------------------------- +ABY DOWIEDZIEC SIE JAK POSLUGIWAC SIE HELPEM NACISNIJ <0> +===============REKORD 26=======================================|=============== ++ 6 2 + (P) OSTATNIO UZYWANE PLIKI + +Pojawia sie okienko z ostatnio wgrywanymi plikami ponumerowanymi +od 0 do 9 mozemy wybrac jakis plik lub przejsc do opcji Load (L) +--------------------------------------------------------------- +ABY DOWIEDZIEC SIE JAK POSLUGIWAC SIE HELPEM NACISNIJ <0> +===============REKORD 27=======================================|=============== ++ 8 2 + ZAZNACZANIE BLOKU + + B -zaznaczenie poczatku bloku + K -zaznaczenie konca bloku + T -zaznaczenie slowa,na ktorym stoi kursor jako bloku + L -zaznaczenie linii,na ktorej stoi kursor jako bloku +--------------------------------------------------------------- +ABY DOWIEDZIEC SIE JAK POSLUGIWAC SIE HELPEM NACISNIJ <0> +===============REKORD 28=======================================|=============== ++ 5 2 + KASOWANIE ZAZNACZONEGO BLOKU + + Jezeli zaznaczyles blok to mozesz go skasowac. +--------------------------------------------------------------- +ABY DOWIEDZIEC SIE JAK POSLUGIWAC SIE HELPEM NACISNIJ <0> +===============REKORD 29=======================================|=============== ++ 17 2 30 + (C,V) KOPIOWANIE LUB PRZENOSZENIE ZAZNACZONEGO BLOKU + + Funkcja.C.kopiuje zaznaczony przez nas blok (Ctrl K + B,K,T,L) +do miejsca w tekscie rozpoczynajacego sie pozycja kursora. +Pierwsza linia bloku bedzie przesunieta tak , aby jej poczatek +znajdowal sie w pozycji kursora natomiast pozostale linie nie +zostana przesuniete. +UWAGA:Mozna przenosic blok do wnetrza jego samego. + Funkcja.V.przenosi zaznaczony przez nas blok (Ctrl K+ B,K,T,L) +do miejsca w tekscie rozpoczynajacego sie pozycja kursora. +W poprzednim miejscu blok bedzie skasowany. +Pierwsza linia bloku bedzie przesunieta tak , aby jej poczatek +znajdowal sie w pozycji kursora natomiast pozostale linie nie +zostana przesuniete. + ----> Ctrl K S,M <1> +--------------------------------------------------------------- +ABY DOWIEDZIEC SIE JAK POSLUGIWAC SIE HELPEM NACISNIJ <0> +===============REKORD 30=======================================|=============== ++ 20 2 29 + (S) KOPIOWANIE LUB PRZENOSZENIE BLOKU Z WYROWNYWANIEM + + Funkcja.S. kopiuje zaznaczony przez nas blok (Ctrl K+ B,K,T,L) +do miejsca w tekscie rozpoczynajacego sie pozycja kursora. +Jest jednak inna niz funkcja Ctrl K C. +Wszystkie linie bloku zostana przesuniete tak,aby poczatek +pierwszej linii znajdowal sie w pozycji kursora. +UWAGA:Mozna przenosic blok do wnetrza jego samego. + Funkcja.M.przenosi zaznaczony przez nas blok (Ctrl K+ B,K,T,L) +do miejsca w tekscie rozpoczynajacego sie pozycja kursora. +W poprzednim miejscu blok bedzie skasowany. +Jest jednak inna niz funkcja Ctrl K M. +Wszystkie linie bloku zostana przesuniete tak,aby poczatek +pierwszej linii znajdowal sie w pozycji kursora. +UWAGA:Mozna przenosic blok do wnetrza jego samego. +W tym przypadku spowoduje to, ze blok nie przesunie sie w pionie +tylko w poziomie.Jego poczatek ustawi sie w kolumnie kursora. + -----> Ctrl K C,V <1> +--------------------------------------------------------------- +ABY DOWIEDZIEC SIE JAK POSLUGIWAC SIE HELPEM NACISNIJ <0> +===============REKORD 31=======================================|=============== ++ 12 2 23 + (R,W) WCZYTANIE I ZGRYWANIE BLOKU Z DYSKU + + Funkcja.R. umozliwia dolaczenie do naszego tekstu dowolnego +pliku z dysku.Plik jest dolaczany w miejscu wskazywanym przez +kursor,bez wyrownywania (tak jak Ctrl K C). +Pojawia sie okienko,w ktorym mozemy podac nazwe zbioru lub maske +i wtedy wybieramy odpowiedni plik tak jak w funkcji F3 L <1> + Funkcja.W. umozliwia zgranie zaznaczonego bloku na dysk. +Pojawia sie okienko,w ktorym mozemy podac nazwe zbioru lub maske +i wtedy wybieramy odpowiedni plik tak jak w funkcji F3 L <1> +--------------------------------------------------------------- +ABY DOWIEDZIEC SIE JAK POSLUGIWAC SIE HELPEM NACISNIJ <0> +===============REKORD 32=======================================|=============== ++ 10 2 + (I,U) PRZESUNIECIE BLOKU O JEDEN ZNAK W PRAWO LUB W LEWO + + Funkcja.I. przesuwa wszystkie linie zawierajace blok o jeden +znak w prawo.Przesuwane jest takze to co jest przed blokiem +w pierwszej linii bloku oraz za blokiem w ostatniej linii bloku + Funkcja.U. przesuwa wszystkie linie zawierajace blok o jeden +znak w lewo.Przesuwane jest takze to co jest przed blokiem +w pierwszej linii bloku oraz za blokiem w ostatniej linii bloku +--------------------------------------------------------------- +ABY DOWIEDZIEC SIE JAK POSLUGIWAC SIE HELPEM NACISNIJ <0> +===============REKORD 33=======================================|=============== ++ 7 2 + CHOWANIE ZAZNACZONEGO BLOKU + + Wybranie tej funkcji powoduje,ze blok staje sie niewidoczny. +Ponowne jej wybranie ustawia blok taki,jaki byl przed zaslo- +nieciem. +--------------------------------------------------------------- +ABY DOWIEDZIEC SIE JAK POSLUGIWAC SIE HELPEM NACISNIJ <0> +===============REKORD 34=======================================|=============== ++ 8 2 35 + (F) TWORZENIE RAMKI + + Dookola linii zawierajacych blok tworzona jest ramka. +W opcjach mozemy sobie ustawic wszelkie mozliwe parametry +ramki. + -----> Ctrl K O <1> +--------------------------------------------------------------- +ABY DOWIEDZIEC SIE JAK POSLUGIWAC SIE HELPEM NACISNIJ <0> +===============REKORD 35=======================================|=============== ++ 21 2 + (O) ROZNE CIEKAWE PARAMETRY + +Te opcje dotycza przede wszystkim ksztaltu ramki ale nie tylko + 3 nastepne linie to wzor ramki. + - lewy gorny , srodkowy gorny , prawy gorny + - lewy , srodkowy , prawy + - lewy dolny , srodkowy dolny , prawy dolny + F.......................................Pierwsza kolumna ramki. + - musi byc z przedzialu 0..255 + - musi byc mniejsza niz ostatnia kolumna ramki + - 0 ma specjalne znaczenie : ramka zacznie sie tam,gdzie + zaczyna sie zaznaczony tekst. + L.......................................Ostatnia kolumna ramki. + - musi byc z przedzialu 0..255 + - musi byc wieksza niz pierwsza kolumna ramki + - 0 ma specjalne znaczenie : ramka zkonczy sie tam,gdzie + zaczyna sie zaznaczony tekst. + T.....Wyrownywanie tekstu w ramce.Moze o n byc z lewej,z prawej + lub w srodku ramki. +--------------------------------------------------------------- +ABY DOWIEDZIEC SIE JAK POSLUGIWAC SIE HELPEM NACISNIJ <0> +===============REKORD 36=======================================|=============== ++ 16 2 + OPCJE DLA KOMPILACJI + +Tu mozna wplynac na pewne parametry kompilacji i wykonywania +programu. +D: Debug info on/off Wlaczenie powoduje,ze przy wykonywaniu + programu na specjalny plik sa wyprowadzane numery kolejno + wykonywanych instrukcji.Zwalnia to wykonywanie programu ale + umozliwia jego puzniejsze przesledzenie (patrz opcja DEBUGER) +M: Memory ______ Jest to podzielona przez 4 ilosc + pamieci zarezerwowana dla naszego programu.Moze ona przyjac + wartosc od 16384 do 100000. Korzystnie jest ustawiac 16384 + bo wtedy program szybciej sie wykonuje. +C: Cursor on/off Jest to opcja dla koneserow.Wlaczenie + jej powoduje,ze na czas wykonywania programu znika kursor +--------------------------------------------------------------- +ABY DOWIEDZIEC SIE JAK POSLUGIWAC SIE HELPEM NACISNIJ <0> +===============REKORD 37=======================================|=============== ++ 6 2 + (S) ZAZNACZANIE POZYCJI DLA SKOKOW + +Ta funkcja zapamietuje aktualna pozycje kursora i umozliwia +wykonanie w przyszlosci skoku do tego miejsca. +--------------------------------------------------------------- +ABY DOWIEDZIEC SIE JAK POSLUGIWAC SIE HELPEM NACISNIJ <0> +===============REKORD 38=======================================|=============== ++ 7 2 + (R) POWROT DO ZAZNACZONEGO WCZESNIEJ MIEJSCA + +Podobnie jak Ctrl J J skacze do zaznaczonego wczesniej miejsca +z ta roznica,ze zanim skoczy zaznacza aktualna pozycje tak , aby +potem mozna bylo do niej wrocic opcjami Ctrl J J/R. +--------------------------------------------------------------- +ABY DOWIEDZIEC SIE JAK POSLUGIWAC SIE HELPEM NACISNIJ <0> +===============REKORD 39=======================================|=============== ++ 6 2 + (J) SKOK DO ZAZNACZONEGO PRZEDTEM MIEJSCA W TEKSCIE + +Kursor jest przenoszony do miejsca,ktore wczesniej zaznaczylismy +opcja Ctrl J S +--------------------------------------------------------------- +ABY DOWIEDZIEC SIE JAK POSLUGIWAC SIE HELPEM NACISNIJ <0> +===============REKORD 40=======================================|=============== ++ 6 2 + SKOKI DO BLOKU + + B -skok do poczatku zaznaczonego bloku + K -skok do konca zaznaczonego bloku +--------------------------------------------------------------- +ABY DOWIEDZIEC SIE JAK POSLUGIWAC SIE HELPEM NACISNIJ <0> +===============REKORD 41=======================================|=============== ++ 22 2 + OPCJE PLIKOWE (F3O) + +Tutaj mozemy ustawiac rozne opcje wplywajace na dzialanie prog- +ramu. + S..Jest to numer linii bedacej granica miedzy okienkami + (np. miedzy plikiem glownym i dodatkowym lub plikiem glownym + i baza danych) + B..Czy maja byc robione kopie bezpiczenstwa plikow. + Jesli jest wlaczone,to przy kazdym nagraniu pliku na dysk + poprzednia wersja tego pliku nie jest kasowana tylko dosta- + je rozszerzenie BAK + D..Opuznienie odswierzania ekranu. + Jesli przez jakis czas (ustawiony w tym miejscu) nie zosta- + nie wcisniety zaden klawisz to na ekranie pojawia sie mru- + gajace niebo. + W..Opuznienie pojawiania sie okienek. + Po wybraniu funkcji edytora pojawia sie najpierw sam naglo- + a dopiero po pewnym czasie jesli nie wybierzemy zadnej + opcji okienko menu.Tutaj mamy mozliwosc ustawic czas,jaki + minie od pojawienia sie naglowka do wyswietlenia okienka. +--------------------------------------------------------------- +ABY DOWIEDZIEC SIE JAK POSLUGIWAC SIE HELPEM NACISNIJ <0> +===============REKORD 42=======================================|=============== ++ 10 43 44 9 11 10 21 22 45 + Operacje edytorskie + + Przesuwanie kursora <0> + Kasowanie znakow <1> + ^K Operacje blokowe <2> + ^Q Wyszukiwanie i zamiana slow <3> + ^J Skakanie po tekscie <4> + ^W Przenoszenie blokow miedzy oknami <5> + ^V Makroinstrukcje <6> + Inne <7> +===============REKORD 43=======================================|=============== ++ 11 + Przesuwanie kursora + +^v<>.ruchy kursora | ^>........o jedno slowo w prawo +^u.........o linie w gore | ^<.........o jedno slowo w lewo +^d.........o linie w dol | wzgledem wyzszej linii: +pgdn.......o strone w gore | ^n........o jedno slowo w prawo +pgup........o strone w dol | ^p.........o jedno slowo w lewo +^pgdn.....na poczatek tekstu | ^home.......na poczatek okienka +^pgup.......na koniec tekstu | ^end..........na koniec okienka +tab......przestawia kursor pod nastepne slowo, + przesuwa to co bylo za kursorem +===============REKORD 44=======================================|=============== ++ 8 + Kasowanie znakow + + Backspace kasowanie znaku w lewo + Del kasowanie znaku w prawo + ^Y kasowanie linii + ^T kasowanie slowa wskazywanego przez kursor + ^A kasowanie linii w lewo + ^S kasowanie linii w prawo +===============REKORD 45=======================================|=============== ++ 12 + Inne operacje + +Enter - nowa linia +Insert - zmiana trybu pracy. + jesli jest wlaczone to znaki beda wstawiane miedzy + juz istniejace + w przeciwnym przypadku sa nadpisywane. +Esc - jesli jestesmy w glownym okienku edycyjnym + to wracamy do DOS'u + jesli jestesmy w okienku dodatkowym to przechodzimy + do okienka glownego +F10 - powoduje znikniecie linii z menu programu +===============REKORD 46=======================================|=============== ++ 20 47 + WYSZUKIWANIE WYRAZEN REGULARNYCH + +Interpretowane sa nastepujace oznaczenia: + + c znak graficzny c + ? dowolny znak + % poczatek wiersza (jesli jest to pierwszy znak) + $ koniec wiersza (jesli jest to ostatni znak) + [...] dowolny znak z posrod wymienionych + [^...] dowolny znak oprucz wymienionych + [|...|...|] jeden z ciagow miedzy pionowymi kreskami + {...} zaznaczenie fragmentu do wymiany + * zero lub wiecej wystapien poprzedniego znaku + @c znak c (z pominieciem jego specjalnego znaczenia + wewnatrz nawiasow [..] [^...] + c1-c2 przedzial znakow +Przyklady: nacisnij <0> + Specjalne znaczenie znakow zanika, jesli nie ma ono sensu np: + % w srodku wzorca + * wewnatrz [...] itp. +===============REKORD 47=======================================|=============== ++ 13 + PRZYKLADY WYRAZEN REGULARNYCH + +[0-9][0-9]* pasuje co liczby posiadajacej conajmniej jedna + cyfre +%?ab pasuje do slow trzyliterowych zaczynajacych sie + od poczatku linii dowolnym znakiem a konczacych + literami 'ab' +[^a-z][a-zA-Z]* pasuje do slow nie rozpoczynajacych sie mala + litera +[|begin|end|] pasuje do slowa begin lub end +procedure pasuje do slowa procedure + +itd. +===============REKORD 48=======================================|=============== ++ 12 + BUDOWA WZORCA DO WYMIANY + + c -znak graficzny c + @c -znak graficzny c + {}n -fragment tekstu pasujacy do n-tego fragmentu wzorca + Przyklad: + szukany wzorzec : %{[0-9][0-9]*}{?*} + zamieniamy na : {}2 {}1 + szukany wzorzec pasuje do linii rozpoczynajacych sie numerem + (%{[0-9][0-9]*} oznacza numer na poczatku wiersza a {?*} + pasuje do dalszej czesci linii) zamiana spowoduje + przestawienie numeru na koniec wiersza +=============KONIEC============================================|============== + + + + + + + + + diff --git a/sources/lotek.src/lotek/lotek.txt b/sources/lotek.src/lotek/lotek.txt new file mode 100644 index 0000000..06b8a01 --- /dev/null +++ b/sources/lotek.src/lotek/lotek.txt @@ -0,0 +1,118 @@ + + Warszawa 1990 Michal Pakier + + Program zarzadzajacy srodowiskiem jezyka LOGLAN + ----------------------------------------------- + +1:Instalacja programu +--------------------- + W sklad systemu wchodza nastepujace pliki: + LOTEK.EXE zarzadzajacy wszystkim pozostalym + MPLOGED.EXE wlasciwy program + LSTTEST.EXE popmocniczy przy kompilacji + LOTEK.HLP tekst helpa + LOTEKINS.EXE program instalacyjny +2:Edytor tekstow. +----------------- + Caly program jest jakby edytorem tekstow ukierunkowanym na pisanie + programow w LOGLAN'ie.Oprocz podstawowych funkcji zwiera on takze + inne ciekawe mozliwosci ulatwiajace prace. + 1\Operacje blokowe + Oprocz zwyklych operacji na blokach,takich jak:kasowanie,przenosze- + nie,kopiowanie, przesuwanie w lewo i prawo oraz wgrywanie na dysk + i z dysku sa takze inne , uwzgledniajace specyficzna strukture pro- + gramow komputerowych. Sa to: przenoszenie i kopiowanie z wyrownywa- + niem (przesuwa w poziomie caly blok , a nie tylko pierwsza linie), + wstawianie bloku w ramke z komentarzy (mozna dowolnie ustawic para- + metry ramki:szerokosc,wzor,wyrownawanie tekstu wewnatrz).Edytor ten + pozwala kopiowac i przenosic blok do wnetrza jego samego (przeno- + szenie powoduje przesuniecie w bok, tak by poczatek byl w kolumnie + wskazywanej przez kursor). + 2\Operacje wyszukiwania i zamiany slow + Mozna znalezc lub znalezc i zamienic podane slowo lub wskazywane + przez kursor. Mozliwa jest tez zamiana wszystkich loglanowych slow + kluczowych na duze lub male litery(w calym tekscie lub jego wskaza- + nym fragmencie) .Jest tez funkcja zamieniajaca wszystkie znaki na + duze badz male litery (w wybranym fragmencie tekstu lub tylko w ko- + mentarzach lub tylko w tekscie). + 3\Operacje szybkiego poruszania sie po tekscie + Mozna zaznaczyc punkt w tekscie i nastepnie z dowolnego miejsca + skoczyc do niego. Sa dwa rodzaje skokow:skok normalny i z zaznacze- + niem aktualnego punktu. Wykonujac ten drugi mozemy skakac miedzy + dwoma miejscami w tekscie. Oczywiscie mozna tez skoczyc do poczatku + i konca zaznaczonego bloku. + 4\Help + W kazdym momencie po nacisnieciu klawisza F1 pojawia sie na ekranie + krotki opis wszystkich aktualnie dostepnych funkcji. + 5\Makroinstrukcje + Jest to cos co bardzo ulatwia pisanie programow. Dla kazdego klawi- + sza (a..z,0..9,F1..F10) mozna zdefiniowac makrorozkaz. Jest on poz- + niej wywolywany przez nacisniecie Alt+ .Makro- + instrukcja jest to ciag znakow wstawianych naraz do bufora klawia- + tury (mozna tez kazac aby jakas sekwencja byla wstawiona kilka ra- + zy). Z pomoca makrorozkazow mozna sobie na bierzaco definiowac roz- + ne pozyteczne funkcje np : linia oddzielajaca, zamienienie slowa na + duze litery,zaznaczenie trzech nastepnych linii jako blok,... + 6\Operacje plikowe + Sa dostepne nastepujace operacje : wgranie pliku z dysku (jesli nie + ma pliku o podanej nazwie to rozpoczynamy jego edycje) ,rozpoczecie + edycji nowego pliku (przyjmuje nazwe noname.log) , zgranie pliku na + dysk,zmiana nazwy edytowanego pliku (dokladnie nagranie w aktualnym + katalogu edytowanego pliku z nowa nazwa i rozpoczecie jego edycji). + Mozna takze wybrac do edycji plik z posrod dziesieciu ostatnio uzy- + wanych. +3:Okna +------ + W programie mozemy kozystac jakby z trzech okien edycyjnych.Pierwsze to + okienko glowne ,w ktory mozemy wykonywac wszystkie mozliwe operacje. Dru- + gie to okienko dodatkowe, dla ktorego nie mozna jedynie wykonywac kompi- + lacji i operacji z okienka Execute. Trzecie okienko nie zezwala nam na + edycje czegokolwiek umozliwia ono podladanie bazy danych zawierajacej + wszelkie mozliwe informacje o loglanie. Na ekranie moga byc maksymalnie + dwa okienka :okienko Glowne i ktores z pozostalych. Bedac w okienku glow- + nym lub dodatkowym mozna przeniesc z drugiego widocznego okienka blok + (sa tu wszelkie odmiany przenoszenia blokow). +4:Kompilacja +------------ + Program umozliwia skompilowanie (bez wychodzenia z edytora) pliku znajdu- + jacego sie w okienku glownym. Mozna wykonac pierwszy lub drugi przebieg + kompilacji, uruchomic skompilowany program a po powrocie przesledzic jego + wykonanie. Program automatycznie zapamietuje jakie operacje dla danego + pliku byly wykonywane i na przyklad jezeli wywolamy opcje RUN a byl tylko + pierwszy przebieg to zostanie wykonany tez drugi. Po wykonaniu pierwszego + przebiegu kompilacji mozna ogladac znalezione bledy. W dolnej linii wy- + swietla sie opis bledu a kursor wskazuje jego wystapienie w tekscie. +5:Okienko Execute +----------------- + To okienko kazdy uzytkownik moze sobie zdefiniowac sam podczas instalowa- + nia programu Pozwala ono na wywolanie dowolnych funkcji dosu,programow + lub plikow *.BAT a nastepnie na powrot do edytcji. Do wywolanego programu + mozna oczywiscie kazac automatycznie wstawiac nazwe edytowanego pliku + (w parametrze). +6:Baza danych +------------- + Jest to zasadniczo zbior informacji o Loglanie ale moze tu byc podczas + instalacji podlaczona dowolna inna baza danych (stworzona za pomoca pro- + gramu MPH ). Baza taka sklada sie z 6-ciu okienek po max. 22 linie.Kazdej + linii przyporzadkowany jest dowolnej dlugosci spis tresci a kazdej linii + spisu tresci dowolnej wielkosci tekst. Bedac w spisie tresci lub w te- + kscie mozna wywolac niektore funkcje edytora: Wyszukanie podanego slowa + i zaznaczenie bloku. Zaznaczony blok moze byc potem przeniesiony do pliku + glownego. Mozliwe jest wejscie do bazy danych wyszukanie interesujacego + nas tekstu, a nastepnie powrot do edycji bez utraty podgladu na wybrany + tekst. +7:Praca w srodowisku LOTEK +-------------------------- + Prace rozpoczyna sie uruchamiajac program LOTEK.EXE.Na dole ekranu wypi- + sane sa wszsystkie funkcje, ktore sa aktualnie dostepne. Jesli ktos chce + miec o jedna linie wiecej dla edycji to moze spowodowac,ze linia informa- + cyjna bedzie niewidoczna. Po kazdym wyjsciu z programu na dysk nagrywane + sa wszelkie parametry (na pliku MPLED.DAT) i przy ponownym uruchomieniu + jestesmy w takim stanie jak wtedy, gdy skonczylismy. Edytor ma wbudowany + mechanizm zapobiegajacy wypaluniu sie monitora. Jesli przez 2 minuty nie + nacisniemy zadnego klawisza,to obraz znika i pojawia sie "niebo".Po naci- + snieciu dowolnego klawisza niebo znika. Zawsze przy nagrywaniu pliku na + dysk jest tworzona wersja bezpieczenstwa (.BAK) + + + diff --git a/sources/lotek.src/lotek/ne2lotek.doc b/sources/lotek.src/lotek/ne2lotek.doc new file mode 100644 index 0000000..ed157e3 --- /dev/null +++ b/sources/lotek.src/lotek/ne2lotek.doc @@ -0,0 +1,22 @@ + Ne2Lotek Warszawa 1990 Michal Pakier + + Program sluzy do zamiany plikow z formatu tworzonego +przez Norton Edytor na format zrozumialy przez edytor srodowiska +loglanowego LOTEK. Norton Edytor zamienia kazde 8 spawcji wystepujacych +po sobie na znak ascii o kodzie 9 . Program Ne2Lotek wykonuje czynnosc +odwrotna. + + Program wywoluje sie w nastepujacy sposob: + +NE2LOTEK par1 + + par1 - nazwa pliku , ktory ma byc poddany konwersji. + + Pracujac w srodowisku LOTEK mozna wstawic program Ne2Lotek +do okienka EXECUTE. Wtedy bedziemy mogli uszlachetniac pliki nie wychodzac +z edytora. Robi sie to wpisujac w programie LOTEKINS w opcji tworzenia +okienka w wybranej linii : + + C Convert NE to LOTEK ³ ne2lotek ! + + diff --git a/sources/lotek.src/lotek/pomoc.txt b/sources/lotek.src/lotek/pomoc.txt new file mode 100644 index 0000000..f51e4d5 --- /dev/null +++ b/sources/lotek.src/lotek/pomoc.txt @@ -0,0 +1,56 @@ + + Uwagi o uzytkowaniu programu LOTEK. + ---------------------------------- + Program wywolujemy uruchamiajac program lotek.exe.(wczesniej musimy w danym +podkatalogu dokonac instalacji lotekins.exe). + +Do dzialania calego srodowiska loglanu potrzebne sa: + + loglan,hgen,cgen,int,hint - kompilator loglanu.Musza byc widoczne tak,jakby + byly w aktualnym katalogu. + + MPloged.exe,lsttest.exe,lotek.hlp - pliki srodowiska ,musza byc w jednym + podkatalogu. + + prep.exe,logdeb.exe - debuger,musza byc w jednym podkatalogu + + logrprt.hlp,loghlp.str - baza danych o loglanie,musza byc + w jednym katalogu + report.hlp - tekst raportu loglanu.Jest uzywany w bazie danych. + Musi znajdowac sie na dysku(ten egzemplarz,ktory + dolaczylem,poniewarz nie ma on niektorych linii + i uzywanie innego pliku z raportem spowoduje ble- + dne dzialanie bazy danych) + + lotek.exe - musi byc widoczny (ten program zarzadza wszystkimi + innymi). + lotek.pth - ten plik jest generowany podczas instalacji(lotekins).Musi on + byc w kazdym katalogu,z ktorego uruchamiamy program + +W trakcie pracy generowane sa w aktualnym katalogu dwa pliki: + praca.bat - jest to plik pomocniczy i mozna na niego nie zwracac uwagi. + mpled.dat - tu jest zapisany aktualny stan programu.Nie nalezy tego pliku + kasowac,jesli chce sie w przyszlosci kontynuowac przerwana + prace + +Dolaczona baza danych jest tylko przykladowa.Maksymalna wersja moze miec 6 +okienek po 22 linii (ta ma 1 okienko z 1 linia) i moze zarzadzac danymi +ze 132 plikow tekstowych dowolnej wielkosci.(Jednoczesnie w pamieci siedzi +tylko to co widac na ekranie). + +Przyklady makroinstrukcji + +begin@C@^@E{@<}5@vend; -wpisanie begin'a i w linii nizej end'a + +(**)@<@< -narysowanie komentarza i ustawienie w srodku + kursora. + +@H(*{*}74*} -wstawienie linii oddzielajacej z gwiazdek + +^KT^QCdl@C^KK^KB -zamienienie slowa wskazywanego przez kursor + na duze litery. + + + + + diff --git a/sources/lotek.src/lotek/readme b/sources/lotek.src/lotek/readme new file mode 100644 index 0000000..50cd271 --- /dev/null +++ b/sources/lotek.src/lotek/readme @@ -0,0 +1,15 @@ +W katalogu SOURCE sa pliki zrodlowe. + +W katalogu LOTEK sa wlasciwe programy oraz wszystkie inne pliki potrzebne +do uruchomienia systemu (helpy itd.) + +W katalogu MPH jest program, przy pomocy ktorego mozna zmieniac +baze danych (IIUWGRAF itd.). Posiada on helpa i wydaje mi sie, ze mozna +sie zorientowac jak dziala. Exe do tego programu jest w katalogu MPH/MPH. +Po dokonaniu zmian nalezy uruchomic program instalacyjny LOTEKINS, aby +"skompilowac" utworzona baze danych. + + + + + diff --git a/sources/lotek.src/mph/comp/helpcomp.lzh b/sources/lotek.src/mph/comp/helpcomp.lzh new file mode 100644 index 0000000000000000000000000000000000000000..7aa700e32035954afc46d564472486498f3b9bfa GIT binary patch literal 16536 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....................wgrywanie helpa z dysku + SAVE HELP...<2>..........nagranie aktualnego helpa na dysk + NEW HELP...<3>............rozpoczecie edycji nowego helpa + EDIT HELP...<4>.................kontynuowanie edycji helpa + +Jesli chcesz dowiedziec sie,jak poslugiwac sie uzywanym aktua- +lnie przez ciebie helpem nacisnij klawisz <0>. +==============================================================|REKORD 2 ++ 7 11 + WGRYWANIE HELPA Z DYSKU + Po wybraniu opcji L glownego menu mozemy wgrac poprzednio +edytowanego helpa z dysku i kontynuowac prace nad nim. +Nazwa pliku z helpem powinna miec rozszerzenie HLP + +Jesli chcesz dowiedziec sie,jak poslugiwac sie uzywanym aktua- +lnie przez ciebie helpem nacisnij klawisz <0>. +==============================================================|REKORD 3 ++ 10 11 + NAGRYWANIE HELPA NA DYSK + Po wybraniu opcji S glownego menu zgrywamy aktualnie tworzo- +nego helpa na dysk.Jest on nagrywany do pliku z rozszerzeniem +HLP i ten wlasnie plik jest juz gotowy do skompilowania +programem MPHCOMP. + Jako nazwa pliku jest brana nazwa helpa,ktora podales rozpo- +czynajac jego edycje. + +Jesli chcesz dowiedziec sie,jak poslugiwac sie uzywanym aktua- +lnie przez ciebie helpem nacisnij klawisz <0>. +==============================================================|REKORD 4 ++ 12 11 + TWORZENIE NOWEGO HELPA + Po wybraniu opcji N glownego menu rozpoczynamy edycje nowego +helpa.Do tej pory edytowany help jest kasowany. + Na poczatku musimy podac nazwe helpa(jest to nazwa pliku,na +ktorym,bedzie trzymany help).Potem definiujemy pierwsze okno +(podajemy jego nazwe,oraz jedna linie,czyli tresc linii i plik +jej odpowiadajacy). + Po zdefiniowaniu nowego okienka od razu przechodzimy do jego +edycji. + +Jesli chcesz dowiedziec sie,jak poslugiwac sie uzywanym aktua- +lnie przez ciebie helpem nacisnij klawisz <0>. +==============================================================|REKORD 5 ++ 7 11 + EDYCJA HELPA + Po wybraniu opcji E glownego menu rozpoczynamy edycje aktu- +alnego helpa.Jest to ten,nad ktorym do tej pory pracowalismy, +lub ktory wlasnie wgralismy z dysku. + +Jesli chcesz dowiedziec sie,jak poslugiwac sie uzywanym aktua- +lnie przez ciebie helpem nacisnij klawisz <0>. +==============================================================|REKORD 6 ++ 13 11 7 + WYBIERANIE OKIENKA + Jestes w trybie wybierania okienka.Strzalkami kursora w lewo +i prawo oraz klawiszami Home i End wybierasz sobie jakies +okienko.Enter powoduje przejscie do edycji wskazywanego okien- +ka. + Naciskajac Esc wracasz do glownego menu. + Po wcisnieciu F9 pojawi sie na dole dodatkowe menu z opera- + cjami,ktore mozesz aktualnie wykonac,jednak wszystkie one + sa dostepne takze besposrednio,o czym sie dowiesz naciskajac + <1> + +Jesli chcesz dowiedziec sie,jak poslugiwac sie uzywanym aktua- +lnie przez ciebie helpem nacisnij klawisz <0>. +==============================================================|REKORD 7 ++ 13 11 + OPERACJE PODCZAS WYBIERANIA OKIENKA + Masz dostepne nastepujace operacje: + C zmiana naglowka wskazywanego okienka takze Ctrl C + S nagranie wskazywanego okienka na dysk takze Ctrl S + L wstawienie nowego okienka wgranego z dysku Ctrl L + M stworzenie nowego okienka takze Ins + (moze byc najwyzej 6 okienek,kazdego naglowek moze + miec do 15 znakow ale laczna suma musi byc mniejsza + niz 70 znakow) + D skasowanie wskazywanego okna takze Del + +Jesli chcesz dowiedziec sie,jak poslugiwac sie uzywanym aktua- +lnie przez ciebie helpem nacisnij klawisz <0>. +==============================================================|REKORD 8 ++ 14 11 9 + TRYB WYBIERANIA LINII OKIENKA + Jestes w trybie wybierania linii okienka.Strzalkami kursora +w w gore i w dol oraz klawiszami Home i End wybierasz sobie +jakas linie.Klawiszami kursora w lewo i w prawo przechodzisz +do sasiednich okienak.Enter powoduje przejscie do edycji +wskazywanej linii. + Naciskajac Esc wracasz do trybu wybierania okienka + Po wcisnieciu F9 pojawi sie na dole dodatkowe menu z opera- + cjami,ktore mozesz aktualnie wykonac,jednak wszystkie one + sa dostepne takze besposrednio,o czym sie dowiesz naciskajac + <1> + +Jesli chcesz dowiedziec sie,jak poslugiwac sie uzywanym aktua- +lnie przez ciebie helpem nacisnij klawisz <0>. +==============================================================|REKORD 9 ++ 17 11 + OPERACJE PODCZAS WYBIERANIA LINII OKIENKA + Masz dostepne nastepujace operacje: + C zmiana tresci wskazywanej linii takze Ctrl C + S nagranie wskazywanej linii na dysk takze Ctrl S + L wstawienie nowej linii wgranej z dysku takze Ctrl L + M stworzenie nowej linii takze Ins + (moze byc najwyzej 22 linie.Kazda linia zaczyna sie + znakiem klawisza,ktorego nacisniecie bedzie automa- + tycznie wywolywac edycje tej linii. + Przyklad: + P Pierwsza linia + D skasowanie wskazywanej linii takze Del +Uwaga:przy tworzeniu nowej linii musimy takze wskazac plik + tekstowy,z ktorego bedziemy pobierac informacje. + +Jesli chcesz dowiedziec sie,jak poslugiwac sie uzywanym aktua- +lnie przez ciebie helpem nacisnij klawisz <0>. +==============================================================|REKORD 10 ++ 18 11 12 13 + EDYCJA POJEDYNCZEJ LINII + Na ekranie widac dwa okienka.Pierwsze jest spisem tresci , +drygie plikiem tekstowym,ktory wskazalismy definiujac te +linie.Kazda linia spisu tresci sklada sie z dwoch pol oddzie- +lonych pionowa linia.Pierwsze pole zawiera numery pierwszej +i ostatniej linii (kolejno) fragmentu tekstu z drygiego okien- +ka,ktorego dotyczy ta linia spisu tresci.Drugie pole zawiera +tresc linii spisu tresci. + Esc powrot do trybu wybierania linii + Tab zmiana okienka (aktualne ma podwojna ramke) + ScrollLock zmiana polozenia i wielkosci okienek <1> + F9 dodatkowe operacje <2> + +Poruszanie sie po okienku: + left,right,up,down,PgUp,PgDn,Ctrl PgUp,Ctrl PgDn,Home,End + +Jesli chcesz dowiedziec sie,jak poslugiwac sie uzywanym aktua- +lnie przez ciebie helpem nacisnij klawisz <0>. +==============================================================|REKORD 11 ++ 14 + POSLUGIWANIE SIE HELPEM +Jest to bardzo proste.W dowolnym momencie,kiedy czegos nie +wiemy naciskamy F1 i pojawia sie tresc aktualnego okienka +helpa (dotyczaca tego,co wlasnie robimy).Ale czytajac tresc +jakiejs tresci helpa mozemy zwykle przejsc do innej czesci, +bedacej rozwinieciem tego,co nas interesuje.Robi sie to naci- +skajac klawisze z cyferkami {0,1,2,3,4,5,6,7,8,9}.Zawsze jest +napisane jakie cyferki mozemy w danum momencie nacisnac (sa +one wypisane w nawiasach trujkatnych). + Esc wyjscie z helpa + F1 powrot do poczatku helpa +Uwaga:niektore informacje mozemy uzyskac spogladajac na +najnizsza linie ekranu,gdzie jest napisane jakie podstawowe +operacje mozemy wykonac. +==============================================================|REKORD 12 ++ 9 11 + ZMIANA POLOZENIA I WIELKOSCI OKIENEK + Tab zmiana aktywnego okienka + klawisze kursora przesuwanie okienka + Shift Left/Up zmniejszanie okienka + Shift Right/Down zwiekszanie okienka + ScrollLock przejscie do normalnego trybu + +Jesli chcesz dowiedziec sie,jak poslugiwac sie uzywanym aktua- +lnie przez ciebie helpem nacisnij klawisz <0>. +==============================================================|REKORD 13 ++ 20 11 + OPERACJE PODCZAS EDYCJI LINII + M utworzenie nowej linii spisu tresci zawierajacej linie + z tekstu (przeniesienie jednej linii z tekstu do sp. tr.). + N tworzenie nowej linii spisu tresci + R kasowanie aktualnej linii spisu tresci + B zaznaczenie poczatku tekstu,ktorego dotyczy aktualna linia + spisu tresci (jesli jestesmy w spisie tresci to przesuwa + tekst ,tak aby byl widoczny poczatek zaznaczotego fra- + gmentu). + E zaznaczenie konca tekstu,ktorego dotyczy aktualna linia + spisu tresci (jesli jestesmy w spisie tresci to przesuwa + tekst ,tak aby byl widoczny koniec zaznaczotego fragmen- + tu). + Y skasowanie zaznaczenia fragmentu tekstu. + U przesuniecie kursora spisu tresci do gory + D przesuniecie kursora spisu treci w dol + C zmiana tresci aktualnie wskazywanej linii spisu tresci. + +Jesli chcesz dowiedziec sie,jak poslugiwac sie uzywanym aktua- +lnie przez ciebie helpem nacisnij klawisz <0>. +==============================================================| + \ No newline at end of file diff --git a/sources/lotek.src/mph/exe/mph.exe b/sources/lotek.src/mph/exe/mph.exe new file mode 100644 index 0000000000000000000000000000000000000000..1a425088cc0ab2109e8fca41e4b8cb3235c5a92a GIT binary patch literal 52320 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 TL_$1m@IQ$?{ZeB7Tl@e3uA<-3 literal 0 HcmV?d00001 diff --git a/sources/lotek.src/pkunzip.exe b/sources/lotek.src/pkunzip.exe new file mode 100644 index 0000000000000000000000000000000000000000..46c59fabe7818196e31e4c980d65b59dc5f43e65 GIT binary patch literal 22540 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 kWF){~e2z#TLz2N((m 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 NHvj+tD6Rki007&x9hCq8 literal 0 HcmV?d00001 diff --git a/sources/lotek.src/source/lotek.lzh b/sources/lotek.src/source/lotek.lzh new file mode 100644 index 0000000000000000000000000000000000000000..d22119255a714469370aadde3d14d3913a814d05 GIT binary patch literal 89322 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

    0<7ipn z=PyFYFZdh&WClDBdzk?42fxh0(4j(X=+OfoJMVK6jh%VSN;>TwDD3BfmC~20^DIqS zP+Eg(G1SFqz{i@vc*sQzZ16>)e~$77B4}FFRKblf|rXIw#u^?MlTW<8t3{8mrjom% zllNF*X>6J00!)+BbGNxX)1p^jlC1fc(>$d(>R%N)DZNk3=$`=W*U4LW_qjT;EAu?& z{M4Gd6mm%&K?CShmn(cWXGB7k9c?}_N?!brZN$_@FF(s59LE;cg|uDJu_D@uhlq;k z9c)7Ro-=PuX;57d<%F%eM?KhKYE%AXhOXye>5j=)cTcQF+If1BQC&TyAl25r+NNA4 z7VO0?n&;)auf#|Y2BQ=Ppl;jsAk7Xtb!SAh3A5@vlI}mmKliZD&%!^c2j$dQ5N1R_ z(rQ{Qns~z*iudzPjKaU65v;rDNlk94`tY!gBDzRv;}zM%8na_)CnHn(RoBCuWSNu& z#8#Pz%krBGSuicvLrsv>pz0gOO8!W32=RD?V+nGYHm=)A7i}``RBFtIJ|iK9yZ-1& zvsdYa=LK6$c=AdI(y}0ONvqm~oPwG(e4V=itqwLHKe#xw)j}fI2Yu4q$ttM`aBKVl zRgG8Mgf${F4tpvOB8zf+eHtmimF#X~7dFD+yIkM;;U|^{Axj3n}CR_3I^cH5%94mftZ1y9{!e}jrmuJwFJtZ(qDc$KV$YBNevpKCX7 zSZlj{GB#K;I_(LLjv_8F8nJdXl!H`a_}-DjW2xPVTX!-OhRrMv+t zgM|fTb04*gZ0KX`y&7O}TSh?uiE>N9bJm1G&c15=>TC1C4t^ngngOcb z`Viu8E=25Mf(TIvA&wwX&rHo-{3dGkp+uu%&045Mzj(|Pop#+4ZRkI}GQ_Ex$XJO1 zMsVgsT`8;yPi7VuKw~v>3nf^Rk_w#IzE;{d1DAoyu6|(9O7k_n;eRO2{8Y1jIj&e% z#!EMot6^Pqd@eG5NLKGZ1SitcvU1rSIkkUOvC?wV8goTv^j7p#ACr${+@Hhh zLD%Q@2|u016LtAaBzJ;B4P>O(jiAFCA{VR(xeiSBx*DO#F)ERJ!!t>tMW6C|8Uf{% zOFY@$Nz@6qPuW%YSQiBAr<>DqeqKoH(l5zJ%sKy=AHT+wJK?$_(a)cm z=X4^A)^S>J;0jX#e@ex@F6C~LK7&G^$@Xq>k0)9iB6gv%CvF)Y8?(?FVEj-2el{oA zB4#aYXf-XoBme+gi2wkHSy&Yy0SQb`R7FcJNK8;YtxW&`83%)!?yuV&rN;@A9NukV+u_tVn+CAeD!v_In8F2Qz7wWp*@`rkY_qv%mP zeo@R6R;}mf)$H|i?Qxi&HlJ}odIQo7qooM{{7&M??lkqjryhm(uorJzxzm-mk=&|t z1FYTQ9q7EDcJ=dRclL8-a$+yxAw6S;xm-Wt7~ap=nqB}njYg5TFHa7^e!P(_w$ajDHcC!g@aml`b+fSQ`k zg0I00PUL=9JVVovA%{Fw3xpx*C5A_xixdybk55P?;M57M7d);HbRj%G70aZaY)?r9 zE<91qEI2~|DD|Pl?~RuRuAY=LCdEGpcyqzfuc`S;CvmDOg~)lR@GZ9jp~;qKW?y3( z0(N2NcKR_K#NOj6e45nt>FiV4r?pRRpJJb8pK6}x%}vM#G8mIazI+BDj(~FUygP>~ zH6r#YCCKzC`@X4z!VV~V6zN7m=Nbf$DiDW?EV1CisErxaYSOO@h4lRfNa2_yN7(l2 zZeS|h-yaXb3HE#N7e*)~(BbUNdRl8|t){h(7QIb8&$w05mQ}uyz%nyO*TSeGrN6OH ze`fBYH5UP}$*Y2z`hz<;OoxJCvBx~k_+QJFky?viul%4;`LCMLvTc_P;^E! zC4@q(`_TWS7+g<7j#`C!Aq-KM#OPkEMPq|(m7&1`F`q$^GzoE*Gl3L=i6M&$F7uE> z#S*cU$-cg*W=;jCq>cP={=Bz!tIilI0N|JA4ECLHevSu&3Q2JwHV#}!jkjowDaAim z`hFY#ca*oS-mzbMn#Fp_0Z#>6G(e`dXcLzWTGlS`*zhhuK9(Zd>tZg*Vl9o5*)5Ht z*xN0R!EI~$SjWpFz^InQyjf;sY-J2k`mkS&Br`{5mtu^I!yEWc1FVJ=lJlCS3K|Sg z%crDiu-t4gIKqWbz-xeb14(3pX;%ebd^Z~Oj~vHRKFyf=;Wa)Z$16RqoWBrI!X6Pm^amL! z4m9VoJ@m|k)!K4%j;2JBXXu$8Y`=I*I*BpBx*JC8D;$8_q2hZH$dAUxrnZBsWL7he z6-^%R$aE^MA|dIQKREu^Tife(zR_%YT_`Mzd{-*ouqYO;UE5X1Ge*keQs-Jx;#5)` z+j2l~+m zYRbP&cwIds*y9UN4p;QK(p8#U3}^r+jCgeHpSTabba&A;)A%7`K44 zfn*-p5{WU_m!X;<@H-ACnTts{HNhK5Qcv^`*x;@&(-zl7sZV+VM(@8kKkQy9(;Rid-k!f zXRVEQJhE%zxy@d;e%|*rbCWLcx-#Xy^~$^!?*`i7w_AqAZf;uL_Q~Orc_`O!uz49J z!Y(FVDTR^Q7e8gm>Io^AI$FpRI6=40&_h}=B_9cdk~2?mi3mH6I-GD$#Z75z?)XGl z#R>xKw29D&<}n@8a%CJ>o_s><5?rjnSL$+4$3zK^PPgWi?+6!XJ)@X6m$JPllIfY~ zzs9;;sU0uMT~G0@<#@)XcIllnf=X%~t=O`i9TG|?(p|`HqRUV+M}b&iORv<}NwUy{ z(p(Pg%xDN~1R-OF={RvJ8^$5M9$Ok-;TC&^Bo{}k3yZUH$!cC+`17pTqDJy=Hhb_J z&rb0HIYkNM8br$(z&lS$k=IglaouFalGKbK6X@a;5sJ#>6X6}-=Z8AeuE9vC(aWvoO;{E4SiY^V^4!-VGgpdSL1}jO%h-0N9jLD4x=ILCG z`R+i^4wgbNsUHuCSY~#O?MDhC-rX(ddE@90#(@3cPHMfJH_?jTy%L#+dLvxe(H~6J zK79@&aiJoA9C|E1%bMxAgm&gNDK>72 z_PH+S**fCb0KJQdw+m-jwsp&7Ik*NRXts9#i;YU(6?=eXleo^^n|G_M7v7PKPPSi; z$IZVoKJ7j_c8gYJ3920B((srB>(@~) zDQe+VFiD@#fYVl|@C>M;f?;_A#uR=CRxM*N=nS>md2vCL#rc##e2NfxrB~trz+yMWv<<= zW7gn)5BE49`y1=XCcVz{s#bl~=bk!7uy; zs(J_M$1F>0RAZ2xpo$PA)Ajdh*UXR|ib|EpB ztb@>0!D~fOqVuvkQ z)9-7Wzb<|h3fVZm;kw0IBiM4c6prlMh5&Ci&cWc=J%s1addKI zEnM+$gi`4qZ+`RX?_6Og_8wlE{eT&GvaAAB;b&peZiwaz=Pg!2@%C3fcWSVB#`R!6 zQ(j>qU-9prR(7{_kK81nk1mMF8?&lZO1H>(VU~d|2ha`QV|9IJ$88|HK6dI~$lYP$ zH?CXe9LBA#PNry`8zRvG5SUBtWxw&OK*4*#KGU@ChAMX+=Xy5*{XV!nlzmQ`K z+`Z5qTk1U)BX+k93W*zf)jwb!<*!wugdH!;gaFF~_V-n6N37Ia}y#$kXu zW>e*NqC8T!Psnr_r4MdAcPuWThSz+Ns=QO0x(|i}Av=IIppHNz+E|XMQxdI#hf^kp zBHGuTGq_{Ig_Ex8HS@=ekq(;JKyYlKKR9i#p$@I!4X*ZMKC2k+o5;~v73Hryj=c`` zM*Vf16xtl!r6RPN{So$Kyg1na9VcDdpSR;L+ca&#B68wA1^=fhKNeKTc1EgSYABb8 zEQ6<{^d3*opmIbEq5-DyAK{7N1H;g7e(sAu5OI1Dsk6{+ew>Vfm{cM% zOqTQvK0r%<-2Q!MeC%tZ`IgseclM=MQJ0m~H~r(Q#b7^>q=jJ&9p}}5t^I0ee{c4` zuM$2a{7}y=f_@IBA3+l9DuSU>xb93w?=n3XiF{lRX`6#Aeti5esW1dA2TuvY|NZc3 zWEww~4KV{+z$2x>??cqEo!D?0XC9y6uRaByEbl2Ev>smr&&V-huA z86Yu;M5g9pP!-?k&{xUl(0}OmU)J4~zgK)4Xtd6KBpKxE@hD0J^d3L)B!+2dft*N< zdmOv9*5%tChc2aNhbcM)ip{P{+}7_41iWr#nasl>l!2n{SJ}!TO;>coA+9q_gb6(2n=iWz+-F# zfw8z-I?I6dzAElX#d~@PTVV+k*Z>c-!U=grI!@!_JsMDCYPOh=tVl^B>U28JKc-UBgh4PDaCX zY3VKOk?cmoDs9k8Lu#KNk-TA$RGgoIOCf^%u(otL-r;-OyQo-d%ihBVN1&2|$_CB} zSm;7y0Xb&*DaCUhd4=>WyWn1cJW!;_Kc7E$$-pK=9SmrhMHiX0rsX(1d#CBig?g1K zR;Tb7Z)U+)Y49x1Z)16EeS(?!z(C%wzhj2QwUSlAR?W*`y>T%10EuKkA>47bu|r_! zY=iYAI%am8lK67Wun`-L2oz)ymWEX5z=w_t9T;5zC zlPBcRKJ`h_Dk4KUJ}FW$I30#1#~&tFVu213epdt>*BRy&mnUb z_buBzjGj#ug(2@)V5cGzZ!S6Ea4UXrBiVw=$%*VS(>QnIR5(DU0#(U8;I_Il$B}pu zP8oO|nbV$#&LxNEojTR8n;D)F88Ae%qb#V%^pC(YD`A*SSo{mgGPF5gJtSd7HXXky z#D`HYzD=RKN^x|{GQMmJ>$A{E?@V({EBpz^}Bx!h$5tG~}h z2@HcW;t+3jMRc$j%T&&$sTXKKO^A^ya}6bSu1HG56l%nSK$q2oDx$3KL)&#*Bd0_BmlS zq+!xbBnUNuW_@~=t@nze9ftas2Z3ezjKeGDm0Qe!pDB^7xZcsy6u+u6`2cZOyW7Zv8jrX*R`&x|`GoD;R4$;iHGzJie>FdBm z#tk_Rh{hm3r@xSbv?pAyo|h%+z3RKC+_)DCMoaz+=|p^OmQZ0zI$>s*h=n9Ww-oi1 zo{8o`L$IeFI-tt{e*ix-u?7M~PyBfmhC!uWEq5$P(0gW0+fP`#jc#fSN`0>PFvHM_A36f zfcE^#zRg>#1F4G6+D6klv}G%dND|_96hr3{V{n0b0EbIrMec)c=h#V{;)|6a7|x+t zx5UthZE|-|k}ex}NAdKeef7#BrD}#AG2K5n({ivI;}gvi-6RBR$OCJ;PR%|#X9Lj% z0W<*xq$2q!?K+$@QPy@hB&*NNu{6dlZLoAi@hp8+BY+P|#Dt=a1_(D2l1RXqesirO z10J2xI1s>CFQpy{vPn6cY}pQIaX={x6}2C%;=hS*;OQlpDdI91XWLG_HO*guzzR=D zD0Bqeh$weyA9M*QrPvM#U?0^?=||wG+@I-6U)q#!QD0^@X={dSQllJP1h@Z`{6_B` z!ecrZz9uj4+WA{OW`7G%431X5Ro~-$gnO_EeePS9?{KUVP7bHbyHLM#=6`EE_zvvT z7q~G|*w7aA)793+kyzS>a5fgetRdsdz{dV`&77!a<`@e(q%<@4p`U-u`1~LHe1FuQ zxIgrsuMwUqggt^DBg`q(P*W+F%#b%Z;9lMQ1h{ZdSQ9D3-Vk^*=g!Y|ban*}%$Psk zJZVm}{LvusL>^dEx3&)-S*zOz2aTSZUuj&XFE+hfo0p9t0bseO7A>%Qpjf&bmgPc> zQt^r7vpW13n^vv!yreOZPwWIFF@y|+rku)wg4k4a#bjJ+fTgG|CkK_-^4fP?sq zW(A*tkK1~_&e!yWdRsexI7k$?^$U*myNj+S>*3af%p5N&*-;=TOcY#=D5%l(`m)JJd5GlORoD=udfQtGEA%*maM)v9IYBa@rFh z1yK>XvsUmGW~frN`0jF|m*aI3`=(0dQknfo*sjkGU^XroW*0_^C6Oo*-7xz~+Zra! z<&&}^A{w$x1CgCSmZ`)L$CAn@uclDt1@FO|z;WPb>zf?Evtyg!Om=KQq%WseZ-IKc zexq04srvq&{^ix~tlc1PIOBxhxxq}DBB`EMAOL2yN}C&demoi0Yk>5lv8A!9>ed;P z)&w+)@!bvBDf%h|^xa#9hcXbCWq9!`9X^AzeUA)&vngk5LDtR`{!UE0*=Dpc)PiD;BDQe^&;0&NLxZNs|z2gRT^^ zI&)o~HUWn*`z8FU!mm!pOeq*Ms3P?UPiQEsIJ1El5R_{LySz|gCYI8_t z1Sui;KHTjaSc$3UsIyfs(8(OjfeSCF#2ryO9W06$`z~K)y3{lU6i4&xSS zpK8EnaEy!b|+_9ahK# z8KWSqg5a&XRhCYUb-SCfEeW4C88=}v`YKMp4{BJiR4^Fqf?E*hWhxZ7PvQ(qyqntf zeV^<#z{NYxUndp5Zcy}S_E&7%vu^UNSFz*#KILAtXu%4l}MVJP( zQNW}|M22H%U=ofKvl{t<)zLVAzUY$nztd%XD}wYJcdlFG9EYaL&=M_i!YlX-fPWWj zRbk$D;O9q77a*>ye*pg&nSr^D9_R!vLF9!l0%A`WoQaf}sL#COjlje+ML9t}9MTz_ zRSPw%GIB4(T;Pe^Y>l9^b_5ET_Bk@Z;H~8z7#`Z*JN!32%NKL~4u4C*sE$G8SSAS8 z_ZZ=(E&F;-~B9Y{*_Vf~3atZN;Ok5W%vGn`he2=dn# z)a={TWiwz92Hw3q?oJ1dxNzyTkzsKi1}9&<^ls{9!WE-F%YEF*tOc(WARN*Gk?mwIUIqSy^qXdyfW2q~G$x`g|+ zY@jIu+GW&ken>CEV5H2HYP*DR`1*PZ>IN{WAzdKUmrUdcLD7_q!Vk3*ip`&Zr0<+~ z;Vlu!*a@syaSY@$BI9P_mATM6_B^q-KE@7@ zSltO>j#6X|u8xzeJ)uP&u!06NKaJ(7_HwshpO+h2VNw^nDXZAAC$Wwn?V2{%*g|I3 z$!%>G;cM%m3tHz2eXpQIOL+i;M+bGT*l?wK{WWCHI)w&Hc=TlH+58q(?T;V~f%?4L z(+Y=Y-xZoTS;)EoBL|x&v7;yX0M5|O9v7Fj9j*A@H{t^e&$)K?bY#T#Fsln4CWFEH zwtcM`JIH{}g!fu?Boa{-x6YZu?d|Bv`~|?QIbfdae?Lwx-(#s8*nRhYpgwzjpIaSu zkMFOq^RXY9f1?rnU&Y(*RLdKlDSYfL@|VTjXkBPcJMbcwfu%By0y>mnRwjgoB-5?X zJ9R#d1j*?d1^+gH1cPq@l5T;2F_U*J)DyqDD{<(){P}>W4pj7SLwSGd=UF-<$y3Xq zvwIo_PvqxQ@FcKI>0NgVLohu9#RfN7q36J|7b&1mz@JO#01i3y2VbEM=D^ROM6PxF z5D?{()U~`|ZBR2xb9#B$ZgS`rTB2EHGjoPom(J6_Ss`Aa!aQ(lo)`VqIffjEF+uhn z7+B{}=j+~g6&iP!5XIz=tIA${N;0!BJbsJ`q(d`6QJi5{EFcr0wV;P4Zm+Lh(ab(8 zzoQV&Ve_b7vOcx_Vn?JdU}SKSLDzmERJa-0^Y3Pe!#db}1dR~#Ot{p6BYERA#N@Rz zE-W5egpHd`NiMEHlF_V(opFcHoQ`6710p&^vw9E_@Ep2PI(08(QH*^Fhb@02(4v|g z8n~gaS2qK6Tsm+cWn@cuIL>BnOM;5T&`A-}PK!Z9j`h30f;RfRnqzcK)wZs$H(c=; zi#X@%BT8f1FMx(T)6(A)+tr*mv<+=$gEYTXr5bSGJxm+cH2%P$v$NxQd)&8qxh&XO z#n-uRRR&L$%Kh$3Rc>(d*6*VYST-8TmDr#|>Cr$O8>33F;As;I-DBoCqhdq*MS=bo zjN{@#OurtC4e*7`W|PF9x9{lo&lJP2ILRxenVXG5ER;3plFh&GXwR}KKR$JZJyD$e zqAY(8qm3Cmuo)O)R2a^yXb#lW$^2RJnlfU}$lRODk@-eNKmUapxa>ffoOxXoQB{%S zJ)C9>4p(7q!T%u2eAFeyP*AsrD!KzBMH=fsH?c;Q_qtSZ*Xo4Fger&N1OhAzev4)f z9qAO~&in3p7Gs4-&{9{9XXPw=Daxr{b!;U&H^?kxLGE8T1BkR5X!ux;QH?eAT-fQA zs$QQwiNzZdi&*c=x->Mk?*nSdyXGvBm1Ld2_*G9en!vS44txUb!E=61)$%XDK~v^! z8;s{Z^&H`>F!Wg}dY*%6xMbjbCiWWWf6@w3A|0~Qj4@3 lK9!oP%Ip#n$+IA0T{4&IVY@cO} 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 literal 0 HcmV?d00001 diff --git a/sources/lotek.src/source/lsttest.lzh b/sources/lotek.src/source/lsttest.lzh new file mode 100644 index 0000000000000000000000000000000000000000..82da50f55082655199433ff14e100c7f967cb492 GIT binary patch literal 1796 zcmV+f2mAOT-YslsF)fG!004*y001s>&lDg43rtf~L`6$XE>J;JL`}@)fPY_54QJ#3 zf$;eK@3{E5m^fE1|KBffzN}zo_RTB%&)t2+jkU`F$Uf(jRha=`z*QkKw zdrvC}`kEkKNA?^RoYal?1<4VF0C))g2{3IcXei`Hk`bZ@hfawe%1NR)oI_j$kMI%# zGb8`5Z=4CwlS`$2%+tS{;V$t(Q3RAk^UZ~Kpu6C>H3Yo`&i&u+FX5mDJN{%z2V6V% z(eMpq8u>GI$}K@fp;8mjfSU@b!iH(`IK$!UP^Kw;n-AX!8FXMI-BYw&baTr!J8A1F zxYc!sZv;PW|Ma2o9EZFdZliE70d`?%t=vJen_$knKwm^5U?45-4HOR|Ao31^Ngur! zP!dp6b-BZVB#Q9J_UW?aavT zFu4EVFycqv058q_c7bWUwN~E@joi?Wt5nmb974M{dp&cg(oZexSoe&3z;LpP;V!Dd6J5Jq#C>`%&15OQKi z)o;ZZ%t_c0->ElpiT{#yRdy2&;Ji_FCKk5Rf4_Eo^8pEj0uH0J;nS0Ir7J6d(W#OjA@;MN?ERP(f4wM*e@l ze>_ib=UMpwfL?rWZgKNDU>jF9ul@Ee?mifFSH=aas{QY(!q)cFMOIa(+1QSkN}$F~ zpd?^g5(7^Qz;jaZz0cjBYUrA3N`v>LOBQ1X_4Q>ZMO9H2V#*P_8*)~B!IFCn}m26Py~6USCo2_&|`D;T%WC2dZhkzq+Uy5bCN6dmO3WK=;z* z**ot^5)Or~NGl7xaT*a)Lj|Mw62%lPOip zt|KL(-unFme!mI-GcVA+q4FX23M*?ksILxb$Y!Gvuk9Wbn^v5aqg(pNrN1||pDQ2q zA1Pf&FD=TvJJoymGoAfdC1a)znl_&Y@U5bqqO1{h0ulOl%yrrwjCeyVA)J(&%d3+B zLgw$gS!Bhw*uy42JevY^-kVsM4r1zJ3em=GfK5RPlDqCq>kq1O2~xh`R;fj~R&FCE zDHj6}vm04fmo?*ztu_U%bIX#RRmsaVNMT}(nQgrqiA*Rqqd)V_R!(79yr>e6w2b

    iZa{YGCtxfb_>g>xkq}J3H1TRo?V*Ng0@ZEDZc*~G(l0m0e zQ(q!o;iR{z`1=&zUu_Ful*QA<@mL)ApBTCCcjWh|)0|pCEPuYuG)Ug9#dXwyQZlN% z>zK3XLZZjX1+)RdkK)V5ngH>O9Zx5R>Ky__P;@<~NJJx`hOu5v4MLA5c_W8TvEFA` z@7L~$9{R9W0UjbqFgu}7v6-bXX+9k9C98+_H#(ZUDBz+>C(BA9#iEHs9ScF%3PR@m z2qymN1keR-{sormz`it=aK%H!7L~rcVR$!@sO#H>+A63%Xmb^L;Y>y>teo^_#d zQTOy^5PfOm7s%PeJoewIL(ltp27u4tBwj(j-4uyt8e<|N_c~JrrEm7<$rYf-&`8KZ zn-Oi%jXSorzqS{g4`kprRzaJCAftijrCgllDci$^^X-i)AVJ*Hvof96C{(d*?GMwZ zd{!00Y*)i$;&i_hs*b4-%}{HZYynpl)x(>ft~?Frm&lBcN2u~rzSrUfnongjFlJSz@#}1v;I&w mIF)HvjPI%(*$KXuck(PGSt|3+p|J4!rU1)ErlLL_>;M29v~NBD literal 0 HcmV?d00001 diff --git a/sources/lotek.src/source/mplgd112.lzh b/sources/lotek.src/source/mplgd112.lzh new file mode 100644 index 0000000000000000000000000000000000000000..b66e2341fe0e928547425b539f80192cfc83d72b GIT binary patch literal 87526 zcmV)tK$pKHf-P)lH7)iA006}w004ldT%aHU3qev+L0L~mE>J;Jq}ojY00kOyo%LOi7mtQV$qhmGta?BLFg$VmoCd_da$HOgAfow*75D?r3cN2!JaHQQXMC3c5WIkN z!1)f}sGs2|hc)y-@4WAy|Mv&Mda9_9tX^DTRyMh;>?$!Q zV)H~`d`w=_cA03GdCYAAEp1Y3r(isM)&CTDv-7u}!3dm!2RGlpTR%Gk(3T7CI#b>p zlFL^_U#IH42M1r?dDw71@V864{2TRlUw;u?dbC1`t1EX{8bdP-G)7VrOk7M>Q)N{R z^3Z`yq@9s2qhhItR98r<;q7b`VrePC$`9tOw{J24W`SC$sf2lef?O7DrUtr+fIrxR zv-7f$L^ydfvF15u{J37ly zdIO(SYPt!=w>z<>s%s{@QA1Amz@Nth?w4zN0*dZPT<_4t^<0p_f$h3AxgL?0fglV^ zgNLEMJ}Cbi_+0QrP1cndnpH@Iy@Fd!Rn#CabTjJSh(7eQ{O^(SJLNlOJL5aGQ*I~Y zG`tRYsqrV?!0eJV=SK+yP)`a5MzH*l5A&!X1caK*4>Q^g0b6$gqkac_ue=HudDvfo zN(ATVcbtGzIVap`o*|}vn(vKiOuWeR7 zj~u;E>bO0i@F=iumPQH*(q1-HoHE?Z` z^b%#okfM+c^weOB?gl@m54j)SduoScv86_~(Q!GyL$jr&^}@mD&y@1u%4^g*pZBgJ zc(qNcYM;(7$ZUQlVFm;{ETKYhvAMOeR}YQ2cLPpzsIR}dgAqcnSaVi7VJjw(WL4*D*98r;zV)Vet3Lv+fq7Q8|69y?T zJn6mVDK^UpAqoMoCXitCLhr3oTiw_D(gbM+54$!I01~0R4DcMuHel?*Sc`rn7Zg#= zjPB9yRM6 zB6$gRU8F3oPtqh9`tad>)6( z60=shVU6(lh#%Obnjt>c*E=t7WOoDZ?oYh?Gfbj)HpsCOTse$~HxS6rzq(E7#|OW< z`>}&R{4w}=JN+@m<>3{Jl4RVHd^{NPFwza$@uNeEj=4^^&w7cS@iBS{`scuWqs2D} z*Q-sxA{p^;pmCvxU&p^fG&@SADKwAz5hwbHr{SIaqlx3;#50P4vnYZzXk*OBk+jfP zsYD`9XoA;?2AbvkD2eYLlB307_)`}_hB!7Z4kr~3VTWo%0rCjIJ2-kW zhzI)#^fCw~E-h?mH7$TC001GP008^}U7#QV3`0*&Q&d(#QZ7(IQxI8A0013$gWK9E zBai*#w4a~)QKklAmdc;PdJ?cXPn?iuGQnINoC22(LCA^gzWTc%%Qm~aB zP4=x zH-oO~lDgZ%OvGJ8$gp;0YKwFZwJHXjy4(QN02~1Sh#9uufU@*%ag9w_+ok*)%7@c|ATrLwVZxhW)5)iLH=PLArcAdVbvR&%Z%hojMNm z`E$N~2USjxBYc>r%sHdwIUETO6MD_UTDMVZz-rmCpn^l8$2K+GPhU0$Q;K>Be0fb8 zUx-m3JKL1ewDlSeTQ-v1NRwaWAUp(t8^p96GjVFbYAMjOxJ4^dTeRQuyQiMcnR+JD ziPE?RrCnwRo&ez0?gN7YG*aFMCT@}QnNmHRG_z z`8Z3by?TDtw|h`~I>l6--ZZR-af30B1NT}eEQI#%_rieN($^Qbor2RhT)Ypeolt3~ zCH{6pPvC182r*~?^d)!@jEEwU(0z4;ixnsY2)f}U5k*#Bi6|w!9EtSt{!@|WhOdAt zZQ|SB{YvpE7zwMx9xR^4iz&qD|28$=8dgf>t7LU-)zwm>)`@1|tE_A-I&R7)UAMu1 z130eXXC&8{BbHVNj?YoLejF%Kb8)~0KoSlGTCHxW*%K(|`A z)+@LHj8U+`hVD)z2?V& zAQ>6$Xw$u1_6kSdUWh_9s0kb@2x-}^P*E*K#_$t+?9=<9+;zDy`QJw$u!zi${nXX2 zB`OTQT3JzL^X${>@3tMPmFvx$kiO*tz!}z1sZy|-;MedpF2JZj>`JFnz&$Sf27-gt zR`@*bLqN!c04f!;?(c5>7hq@dcgTSZkpx1CS~w^mY$K@uD* zg9Y^~Cs+EEy_ME`l7XBj-fm{??gqi6V(Kj9p*}G;lU-1KVQWe)NFbaGpVg8spH0?G z04r^Jj|1{?HOdhJ`hnTE#kIqIu&LnM6b`j;T_wXcHJQ}X}rp=dES@vR6v<`g^Y*!H6zEW1*xi?C>@`|&Mr>1 ze)efiVU)q+C=mUE?nfQuIlg;rCU|2};>hUI$mp3Nx)90^7$ShhI!snkZ?QqZ+?N&m z%=>uxbe@SiJBrfv)>Ie+q!jbG{4J^q1Rh-OSTfxn&fhdTgC`X%!2Ueo_y=CVdHCm8 zKOY_k&ig5~_rg!E>C-CHMxV?N`QL(fPQDNN`+oqIgRu5~Cag@fimO~zOHW4*(poqH zeOV{Uk30E+;}!vSDg>ulL_{$`vQsA?eVFZIUVx;)Ej57D*52!A@bl zp&k7Rlbx2tZ|%^~J^&D{mZ&h9$ASe--8vB%z$BI;h@?bx1jBpL{w8)LeOeIm!}?mp zNK|YDQQM&n^drjV$Vebk!YlS>vV=-4Va64Lu4tW5jNPxeK!{Qg=MF6PRUfj0Aov}k z-iUPh4egl-GbX;sQ4*MOwA+S&HXtF@FJK?zCjo{H{5d!D@sP^XM^9cn?)cDpbKMGoqey*LVP^;Ja4Ok29`J+Da#QX~`2UK{}m%IMX_#+osmldhudEZ)BC z7V)TWS*u)8PU)+YF5gDJIIO;v(RQGLuHbqg0v(9c3B@DhqgFWAh89 zG1Ow2u%Kf7DwG%~Eo39235?(p=;MgP6&wYKc zV~VM?ZUPTuwx)DyIa8dDd_KOl_|9)h&vgNpPPipWgw5KH^J)>gHFoU;sMNDutDFq7 z)amO|RRDvLP*En3mkzub9bKS4z@3DAAYjVJhwPXs-5}c7K#i&hbf}XBg@R}NRaL8_ z1g+@m3*Gm#MscvtD$Q2Hd7VS`3>kz3W!mz!?Qh#1^_B!4Y0F5-pmv^G3y#- z9w8ex3d190{AqE)7!w3;(8HTG9qTGg`N7tuxHu=FA?rbsy@)Ji|D0_S%{LAB-!$Be zxGnwf@m+3thyF-N1Hh<<_~HIQf07^N2mP@BEI-T-@q_=EKmQPa<#diAG8J17?g##0 z|HvQjhxUX1F#mKvgU+z82mS#6!uDr~D)EQ^$bWbP|2Tj22mSE>?+5=lf5ac~hwyNA z6`=m}PmqDYh(Km=t%v&|{XqT=_QI|o(huOEcvOY$@c+0U_e1{he|f*yN`+g2|J@Jt zL;s9F&=2*4{a9XK+tI%D*2zm18@U-fhNIB_S9(CupE8;6F^M=2tAsT0b~Iu5uqHW5 z&B2eH3l3F3vKsh2AhjSkgFGv2mn{Q2;}nXxLLInyj)iDOg2`B}5}v8IJq@@4^5>x~>$#KA znE2u}^kYsJMFN;_px~2KL@FZfNa0YZA2ndmh{$&CNeeOf)g=!fN;p4kDeb#+EGkQO zq`;{$@OWrQ;lW_&sOUiFL=RCC^b#|RQaIC&dzk}LLF!2wh3N9u9SI&$?)Ju}+3HIu zK3ReD2As!6(Sx^xLDazSb(f>+Htk^Gx}1*G4GU89y}u$v?bfieYGJ`C;=RUdfuQT~ z*~i9Oh3NYHG_e}6a9V*3c-Vl@w3&2sCN$*oZ=RTNO$)o`2gwZv#osyZUg+@=Pm+F* z5d`@s==z4l$uCFyg{LUjDwd)8a>;5-bRS5yrW)*a%=uA`P&UYyQUwRlA*q(|f#H3Z^3Z<-;FISS>@5dS$5b7ut01gRx3<^Y-;iBOEeC zxsG5G<)~sWK*vVu7ouv$BKYR0VlR+$%_$ejH8T->qaMMu9@(lOaD1~?M7MJdP{nF< z_Lm?*{^6;~EzP4;HiJynHqH;QYSPPg!KxcV+d35E2tLWFn9fu+LufUPQaQo(%~;$P zk*XU)u5f&z2hue&a7{B*HiO(XNrwmSnHfglz2j6ig{X9Ll<(CwGjL7AR5pY6O;O&D zqH4zAzZt3e#!ATZu&UOESLzRrhHCO2qfr5I05F<^(_XR$oxPTb$ihO&_;YP;<#6F3m`$~&3su0 zER% zB0!5R?3^ij{u22XQ?E2%9Jrilz=m)X4w-b@IWCJX?D{W=Pk>p);AmOfr^$62k_m7dn`)J<9psqXR+QT^y&B}Ua-WYC|JB6#p z2x4cHS^#LfM-xH;8>mfVDD=8%&E@<7qy zZs_povH!)$Emk*n`FKsRZ+!l+Vl518-Eg!Vn+htrpM%cud6 z+&A%Ea6#dxi)F-K10H~c$2Kv!vxs@XLEM;+!5%xKw!Q1^xyVrWEz5yTtsy(Rj6VVJM7U0(>{%yhoO7ZpkDohe`un#&=MQkbX zc8P5uJzAr(JXN}Ee8;#XG8$#2XUJd{HxWj5o}vjP7b_)DF-oUtV&YpXA1J>+D^@1G zgo}#%43~fquFfz{#NGznpAH-^ya!MGf&cMB8H<^1TnLB*41%F7TU->uSXEYMS1Z_B zigc{lJWkDOxrYn*#&5uX{y0!ftI8X8h&x!gk(2U-!fF+|q7~e*FDGmV{v+w{y$UDT zgVIo^UJeoP0Jz`#=C?h?6$J;tL5nJvTJoWngH8YQPG8CqIjULg2f?R{FU8%7%2I|Z z3bNX_VQW>bhhDySHiuTxPccUi+@~oy-ws*Qn?7F%Evo|}`A%9P9umUcd2WL01Hy8q zRuQI_eBu+nE(AH!0#1t*{UdXCL*Vc~!vlXSFixDQj}N#W*f9WLfq61_TP}e)>1qUn zic;6SzJBH?n3?(52{1Z*5YJFKxjI)A{J{LC?7!~^w`eLL_BiMPvVrE=A=lO17YD*~15iuZGI{5Vv`Xe1)d3pbPJKZ39g|}3`YM0Go`B=Vdm(RFgHVfr)`D3IHWVZe?`Ltg?>3rKSkaq$R z(CB$u*u}T*uA&zg(TzV@DluU-==b#;I8dNTHd<(BkfEaQMEsA#9=q4sX~*x&$nU$8 z-*+p%?{B{DUwz!p`@J$#bKZB|ckz-v*IoQ!-^Km>UEjsM{8`_{dN`=BQ=b1Wb-lv# znd;-MD?QPkvN%GHd!oG_^FCSbjPuFvv!{j^1J6MZSodqq&g-q*_d@ZT*GhL~ce}2t zcU>#pbyvFTw{_Cl?y1AD-RvWUzMp@m1%MsH#mdWLNT0F38WtJu7%%|_CeEr{#e2hqc|L=oL z=YnW{Y?oxwuhYeUhvVY9SKIb+Ualv1hu1#{S?b>!cL%C(hHRJL059MV|BSO`|Hf#! z2=X-v%gw*Y-a@)ms6C>Xwjg*q=5Q1u#BMF8Da6y+OMeDe>un#6o@}0eP7Ve`s>+nv z@S#r9^KioTG}T0yvNLkkOSPIi__!Lt5pwahlRLS2YgwwDgTWsV0+oO(RHTBlvusiV zaYvgIYQ{K{L$VM?7q}7lYg+@8`}aQtPlen3pxiPt zWaT}bR-h&)Yh%lOK~Aa-K7&@RK@ybf-JpiiG0t0!5FJ?VnZ(N5QFfm ziMXh~D_5`|luPiF%gGy7t=Ca=zJHv>7cmxl^irZwxC z_LDe8rKBCGvh-948dbiaeo!>I;Q%1o%8E*#QvX;z6N8sZsVXGGK`(Rm_BghJJ(|xO zcX3Z^&-oeOb1}B$-)!nQef{{+qZR%V_T$PrOd$s8nU*qywP#T-Xl6prfllJ0yFm?M zP(no_#%~DgdJdiirr*5CX>lD~O1PXsjSVV{SxHewf%ISz=|k5O^n!A6HOg>FWRxmU zJK;cu$8jr3SYV_=P+0cSgV1T#abEqbJ72?(12|d4<Z~fsI@Naae@Egr^9)2WM?5a+jI8w2DWv6CUwDs!pX;)*g#?lt3j6ge`v59 zi*2=cifQHiWqKTTp)+P`}Z*_?pqU z&tLsF8_f9F3E}l9a&S!nqdY9P)~53_Kbl*W$4_HRU8GQlVUu`Jqzs;SD1Fu=rjx{0 zUE^oH`B``NGn4GWhm zlIT*n8)tbn*aX^(++kFE&!sm-(%+BvX>Snw2nKOHFiPz)K~=U`ETr&;k?hg`cl&gE z{PXcSWEwmmed^KAKFWkCukGIw2*%cHfc>tFA{}^0`f!N#;UsCoN9)2#(}a=Ngq5cW zC$9;&rwJ>s2`^3)Z?6e6P7+^U5;mM9&b%kNqY1M~TG4~qq*Kv@*`zFJ!R*oOXTkOm z1-%$Oo&RS>4`+WVqX)CUR?&mm-<9-W_IKJ@@NxESb@X8NZF*WTdp5m27(JU`b4Cwl z*WJ;B*|qnyVD=IHO&C3dey)rj!aup62P0;)_jF+PYdShGdo`brMh|AQp`!=0S=P~m z*j{yW;N-o6p1lq~1K6w^wiq<*{dY8>{$}i6&(3sjK~o%9R>-RMzgq=t@F& zRM+0b>qYH=ep6ODjbxp|ZPo%B6-BWe@ z6ZI-w?Q?mbjkB8%RF@|2~nxh?MYG*&KRr*{n71R1r9-3VMuQ_2 zpXP1Yt-QMh{H zT?K-N{3MD02_k>ONT2@XiNW#Vp=bM-CNv*Jgq+dBa-~YbYuhH^81=xO?(}9=HLT@NG#kK73Cjf*b)b1n=Jf?k#QBS5v z{#33KlE4n4qTmdo1v9*m6wpbWdKur!4}(!VA0Tx(=sI_V3L^C;@5~SnulpL|$*48YsQF zZjSO!#`M+8k3`<;;2E>+2LV;P=$vi}HEZ~a&(?WRuJCf!y*vhP0iNSNg3;>dPej@L zyiB&wyE~ZlZS`RfA3LVs3tsau>Ze!8y&DOoSu516O^xM>1qb90LoV-J*kRgja>EFS zab?DejGcHVb#QBp4Rv2{;A~~2blZV0Pbz0Ru7W`@7+KooR1~FIKwiyon}=CUHci+&yrlbz+~Q{z#W0!tLzHk2 zK?!wxSiB9T8`P9Qn!kChH~ITg%fQf{&`w8jqDdv@ofw;UyrG`vIy(ycKJCWQcS$g_ zhseJ8I3tNG*PEIunDSrp_!08WpRyIkbzuf3Z1ZgBXa`|?C+qi$QIi|DF`>wA-X}&k zR}>jvU%QEs{%$5m`#6~&?BZcJk!72*|I?Vh_OX$gMV3`OM_!sjamq%S=EpB0XRj}}*_GS%|$)}p#vI%%9P`>gj(0NwE4o*je0qugFHV25&ev!^6_85 z%o}V}P%}~s3>ltnSr4uhTdJ~l3;zEi z;lGi_a}qwJrnj|si%Tvc%FV<3h)Rmyax(?#hBE~7Gtmb_Pw@y63`oT1&$P{&;@6rG zkAyd8r6=WzW2YSUEB6y~yofr2E&T+^)5=_J1O9vZ9sJJmJI<|z)BN`9lir7%p5}dm zjP8Xx`<)%qT3))!hksHnT<*W;Zru7$I~O6)FUu>R3KoXzGdDrfQ9&8;RR|g`szK(7 zAB`}w}Fu#T_N6hsxj5AvXzLOGrPQwzIATI2Z;uG+8x)fCeo;t6Q2|ie&x15Dtb;%6IKJV-?FAu2bAZbz0ZsGT6rlVjE)MGv4uJFkOq7~G4tW^0_2o;wL~UzdlY zqZ9dfdS}b79UWVxkIhVMkRCLLetPa*ZjhZh z^veEZyj+mewG6N+Q1;nj0C-NhYWEy4fLcH z!O`Mjif^(}dA2fUlKr@#KnP6Yg6)8d{xVG;)E*=wqco!J_Zz{Fgc^;4?Fojvq8EFu zVP`$uyxDxsTLs?R`E>IXcwI_<>c##ZCo|qje(_d#GhNG$YoI4=)~DBsV#%7-16tSN zrHhX>yklGO=F&T7++nHnV)oClxZBNWeLu&WLG8zMTW20{3H09|CTm0Ktz4Rn&8?vF zeL*wD411Tt7STK@U~vdBNXZ;btr&obQaFEd3_N*ZhmLTBv*F{*E*&T^@aYh|)CbBqNs<=BEavLH@>oREzesAGMJEttahZAcWtwIXO_fzXvoQ zuh_figFr`jwH(ai(hv(PL2Us^*Mizy1yu#K1}MB6b~Eo9 zPJbiOaWiEMgsj)VLGUc-$tpWXMU33)P~SLFSD!i1u@DvS3^e@s&Vc%wQp}poZAyFy zm-V7V^Gc62qeDBMDJSM!#H?G1N9KBH>bO5N(~qj)fP!O)LRW~+&A?hP@@d{ZDO?>A1(nJ+c&t#dMFYu#G-Bk<AsJe`&QOM0oL}Ls0P(E-9R!|P1Fix_cUE223NJ3S2P0_*$oQMbutCF>l2}CtP1~SL_fZ zdvxgQ@YBx<0>4C6MtWojm=7f*O9 zT1vwOOcCS%1PW5|4^Inc;7+b1(ZbkWlJxdT`=iOEe~15hKtu3;zoG~~wJ-q(xq2i} zAkA+iFgubZRjFB4&u&1#|M1iQZ|yxOKA3YIa9}zg24)6gJi!r_pVX`&#&@d_vYhci z1$|nf-gMLSS4y=gbk}Ca++-1b^d(h!mNsZW14v1=Nm0+A0jIbfYys$@g*;8uq z50Ki+oYE1VTu9lh-ToS_US~|Nz6ql*FE*rm5j|VE92zgFt=qSh;f1VC8g6MIF4_Nb zfEQ;{Vez%U&&m=l(AONG8gebve$2NMKovy|nR8v|7rxmB`#}Z-+JtvcoFB&FZLUCi z3jo3i;cQ|@4bJ;m8g3t-0AMw#3lmM@7}}1^`Rtk}?GCoh?UQU=!IPhVpXd(ZyTZ;V zF6IruFzM56Ugd4fUqF9_wpqpUaJge0BlHGN2>G?SL#ThpoqbyG8&|m7$@KQ64O;LS zT*5+n+x+;=99vu3kI-u-=1*m+LrvzSD-6>o{27>^M`kcKO5M1R}!|n|#Ca zxya?;$V`~qyUTl?{`^pnKu$~7a5PMp*(W|5?Bc(^M;qqzn1&kV=Ie70^$?fHeIKa$ zzGLj^5Z=1q9-#-U&Hh92)^j|J<`8o;fC;iEW@p-R{UOrud*Q>OgVY;G`?>?WxV|&@ z_>bhg{BAPq&in`e{`3I+$OHLM3+zBYtpPuk0e;j5yYGdU0gJeCqT#!L5VGeH*OVQw z@*UcDupVE(_#u8HzFzI5+3wNsh1oz@8sWfer~--Yjs-Zc!KjjeOMrcMUQEp zLnpxTGlL&c7jtzrYwcC9yVHeskB2@MaJ1wbR});01TZ0%#8!fuY_JN5<3y1wt_8MQ zOIJ-$hO#b6)k>v>l&rfJEQGZM1{=aLh8vYdtsNj{fZl#FYZ$e|kRUKb`{9TH^Y$}m zzfZytAC05i2A6|ggywjn?O4aEMG0{rfPZqRXtaq@dw~EIizEo>)eQvWHgY-hh)hBz zkj!_3C`?DH@;k$AxQ}rg(<6t928&JJhY2WA0(5ZgYFMa)Qyxxm&GWme^4VR0i3XVQ z!wFDTN+yrd06d^ukfL}{crX$`y&)W?vLsuA6|j&wdY<-Rj4QB&3k#kU01G(9vnYJ= zGij%F3l`O=uy(4ckyRK@!}@{J6hcGLiyfaqf53_OiPQnaGk-f@{&yy#!#X#V zH{(jj|6R!>AAljAEo^8tEms%-0Ka|!09#$!6d(ZzMMOzdE>J;J@<~kq01$_Jz4mRl zAN$WhzMbOu4)8|fO^Bto-i5}%Eh6MCB#Nk&R!RwY7LjR|OCM1J@d2f2mS>A;E(*Pf8+=MV?X`wKlr`;q@&J~B()QhJH0zt_|yeG zIy4hfLMRGiQPWWQ=}$mfv!%$5tbmY@K}4peKWy<#nwNTM@`L9A-`SNiN?qh5_I}ib z{zra4)6bfn6X%{Nz0T)oehEm%@1G<>n0OrXf8d|?eTwZa=$59tx<1dayH2d;!nBqT zHD#*_)tId8N=>y{-x97wq~Q3U?ud)}H53z!DCkI%e9&T@X=nchg;mDsEl#_O3Od^o z7PDJ1s{3ba*>!BtLB3X6w?2e~rJpPs)=}~%q>QxGn>ZVB5hN*dr6D$o1OEJQ1MSN` zWYg!zKuR8G2|QE50>?a2(iWucRHmPF8bD-uiBClc^3f8ANKH>4Sw8sEh^D1P9xqmE zQ_q(|QXuj3!QUvMEf9A=2iwp7@4ye(uGJ@3ZJ}ze)j5tW;?!EEV=Wz7*B5H0jaKUw zH52*K8AjU#HLdo4U*iMqSaDiPimP_4(%M)*x>l8SisA68<)x{#y44#MW?QhSeReBa zvL@+*B2Mx}?Ed0@Vo|7`IFZT{azRfESp?KLQvwCUiSVe)K0ri*N;1($g?w8l7;O`% zgmJ~`IfsKSM3i|W5iuc2LV6m)22x0TQhSi%WP*eY43dh7P2mOy{!R)X>d6xRCwSQ( z{+SV_YdW=7y4ef(G9p1YH39~|{>Wkz?23R)MoR51m^p#cU4xoeUcSR_8IV779t9mB zk@N_kg(7s+#~weU^T7G^BX`n|MI8z{5)zJttpsI+jipc;S(TucgvqpMMx#Iykp4jg zaFr4I1R+r|3wR!2_I|8UXNy)ZY5|LNRtEP5@Y`9c;;0S6M(X7!-Ur5Y#zi9U1@L~m zEwJ5%x{mw6|9>Dp#hTWuu)T#^T~RJ8O6{(zR(e7D*LXFUZH2+`#8w{qN%=QH^;@v( zZZN2utm>|Wnzo)Sm%dqWgZ>Mk`fF@1((R9?3QblVZE&X%%Ipjw)KAa6PlUj0S!96X zsUdBywK2l=hJhjU1ND8Yfcq63vQl!ZD}+a_3Z0t4{rVC9uec2eUx?Zzx{Rw##QN00 zpJaX(o3Un=&iFs|K4)(vu4?(J8gdW3f1qoch&Evjcx6b<(ZC11pU?^e~p9nr*oF9oN;0LI# zz9YYBRt5wqvI*=FRR zIba{~<$!%aSYD_v__BlPw$G{`<&pgB;PNpqQ9Zg3kGc=&C$|CfDo&~_PTuQ{w6{q` zh#wuUAb*ge$amj}DIxy4&IOtyr{chTs{`3s3J2F&tP|PD55EvmgWjYs>IdIQm!m&x zU3T2B>O1eGNFzVY4BrRPzPIbv3~?(Cq^FL)a)0l!{e8NutQFpZatlAlkZ1mJ^cNpG zA(tfyNJ~?fA6M_n7wgB>e;-g~@)IvNk-|0y1*l?W#j3JkO04WF+wB+ z%@_ks)pUN1cH3oTS|&n?;+llXB*DTi@=6Z}X$0d+kB1RF!O`EkFdhIP`=}=<2~bUe zjg%CyEI9>4BkO|@f*IU39A{HL&VPmlF>#b3Ch6D^+ znq7{;52BW5X>2OZWwcCzp8F4gQE}Qu{_A)Etnic2x!O@l@UgPHD+zw?lPfh*-JHVm zb3#I5d}1L|R?= zGFh_Sk*Xu5Jt;4@mEX(kKHU!NtkG2T2BLIlNE>Gf87U_j9maX({lu5JKLH|C0tf)4 zo9IF>W2gn{a5WN0uDv@3Iu`OdiWQ5W#>h*k#3c#h)hUT5ytV?#r++%rM$lNXs)<$_=DIrsC& z+8G^?ujV^E9H%@dOg%fNK{_UOk6V;_+@t4mh(0EbDE^Om0%c~H<1J>~nWkd;adTB_ zn0bMxbh`rV5@yuad;&BhNxHT}gAy!5c^C?n!U1~=I7D3s*gd5gdiJsU_ObrGW8q#2 zTL6n;whnr&o0TU72*H3f;+6z}-C_05i+#z*6|(wEQmYp!5i5na1PQ<(6(<-TK2a%v zGqc>0ka5cAJ>4<6)6S8f6wZ|oe+-=;0fXCyNB358&S-!VCYyEOZQoYtOveq!xD6+i z>VuR5B|AxSyuG`Qd+XhQ>)n6;FFt8Gyt5^w%I+yA6anwarE{U4y(DI30&dMM~o(2$gLC1@ioF=$GlHy)LsmW0W) zXhx$z99(}On?UQF&>;$mh+LUbHDZR}@@@Lu-^dv;tBRmPn2@jea>_`$V7?D7?;ods zC%=#%dwz=Ht7v*!?DT{6uJJ1{8N&hYL{=X9N%=Ro@;71D++kPqylp&LFMP7$2mBX7 z^wtMDT-v2})nUfhXe_|4z``9w{QJcC_6u2L+xZ5hg|@oX$0#Nm1c%TM)%LCf>{N2e zNy@CQJp#g~X0sLkRDY}P140+#Hi>SdD$_AOwJ;~yABCpuS*5eScmAjxK<(j(Mu0jh z0!m;?BqekpbkM{Ym`va2d-IrXnKigFt%d7azo`&53;u9E#FW z@8ik169Gwccc(c)2tNTya39W4Up^Ao+f9ek7lO9-_MVj{T)r7$gApiw4@{fd1Rt{KH(SSx7ukljrbnlrR7{sF3Lg zQYax_Grc~5c}|=`3;_K_X)#)=w3gim+G$W@Jgu*QA01|KyMEw5g|+Yl(Q6bEPP93U zDj<=bxB~(WmTpP|mI40`SO@fP<-!l~We4w9~2}_9{K2R&bK2x*b;fW z1EfsD5&f+YuBEc8klQF78m>1|o_#w^u~F+#bW_X`_Y^&HXm>Jy38O z6UV-ccqqHHW$BE{n3WOQy#2euv?R8)$(Qx5VvES701RE3rTV-jqVh~1^%)r-4c*$- z7k6aVWHIo+ffDwsV&JA6T;IV}1@^m|xEfZYinO#kYAH9jR3BN4nsGo%3XLObJ->tq z+LEy`!0x$Dbo1pVL+3|C8tu>tYoZeV~dS{#G zi%*l%E)`*_q6Xaz~TnOY}~})7+YZT?&{s$)M4*HQd}s(KcPNZ>P@0j zGzwEbz!bX3car1CL{g9``|&3M+HSL_W1I zuSn=Xtr1q2MV#1jsK0cYhp$@JSMC z+im!khDeP;?QWy)Ay(W%*3su(FHVGh5$I*UMXu)6!XgJFtIT(nDK` z+E`*@G3Gk4vCTFKbAP1MQ`v69i+oP#@a^H;j%@k~&qW0!pMvQGFWgc)bgMFTYEA~+ zAjvkikEUk@#KG|BI^xx-Xjln;SbuMG+dSTy&XrPaH+s@7CNp81S0Sts(~|YV!jy^u zZ7`F`H6as&>0zQ!4dh^>)sG2XKY7_UR6GV&G?~lTwU?dDBMfD5wsWR%-98%~^H! z_0H0Z+tKTDUbMajEg-2VGcK1AzDMUS>%rb&S`4TPY4k^g!eBq@BA?$zOb#al5p^C< z1c_WGH)DC1Jjo2yz;FZXY_7_}khPt5)pD5Xtjr8qF)cL^XcIN`n*D3>E*G(cGxs!M=YD`6ga0kv%dcaRccUeJ_CQ&Q9n zUucSPaQtWf3fbr;17w@YB{2D94UU_2rs7;NoK)zz-g287pi$aiTDGma6SjnBv|o zMXFr3LIAC_gq)Ov8#Y3GVEL=m*}xE&@jJW^xDJG$9)`#PQF)$L*x*Q%YA2`_nnPW{ zXl!8bnkFL&16M{rhQNo(@KNx)kzfUxa|dYYpu0iNoLle+7m}N(W}%UTw>ns=P#UyT zr3%{&7z2QCH(=GF`^wSz_3qD76fnPp3qahG>dsjr7+h_*G$=zceBOWy=~J(^I&v3y zq0JC>ME7a*i^1I9L<{GQi-!roxa29!)=U`UQ1elyRCgQ4l*nI9#Bj^Zm{4KHJ-|_7 z#b?9I93;37-P=(2*)Cw=M)Z~{wj1?(x@|6NLGQ>eI6ZML8+nw{<8}+MoV*~tEC`#( zU}W6BvTVfcv(r%tlKjNkq0jS^N-M9Fm^D0R(dR5(M9|&??Imus)6#Qam8Q35em9!* zUpuZwQ*z00#T(EU0;FMG;*Ts0 zx?p3BQofxfng&%zo`>{odDWAG$;y=uxbgJYbST&O;P*m}XhH6U8qtH? zL~DP6sI4!SwHsvC23xkWScA=~@Lc%Thj9Ti=b)HU@pnVagrv@uhZ>9jn`4gianxUO zygu%j<)~VXuVsEEQ278m#!obEN=%aU-VP7VET{sFu=#+$5pmNW8)-<-j2KoPxx6ay zqD^l%u(;0>k7r)-^rl@e{Y;!wh5ppMG^fmy%c81G?Lz3n3@aj-JRlqid8Wf@dl^wa zN&+~aISEB0cScw9A#%PMs^XqIOq4=E_P_PmNcq3XS|IYb>0YcW`6$WfV=gb)G~@L2 zN2jZn6t~#(Q2@%4H9Vae(hrRj9n+?! zBdc)#A4$7!0YX;Jh%mw8dN}!8LEt#ZIso5e(se#C8bsTJEgB*&MX>c2Kc|`$JV5f< z;tof~{04NOWe2THX?jI|`<^goUhf7NyfC+UsL7-{=n4#P!0hr+qa_fQ*N@D{&#{+3 zLz$%r&_yXpXGYnb6H5!TI6QUV(_tT^z2-KqP(LXDAJ`8f1tbz+Kt5Er=|Uk8%=IS$ zR4qyog)Dg7eC>wy#_oD35pa?9rR2B!eTlccqeYwb2HxKJ=BA?^KUU>VO&gfmpnp>C zBJv{lfaif2IB3s4YKbQpMbE()M1lOc(}P9r5)@oiVU~3StUVL;%IKB@t~QE64W1hTIfV^eP4$a}Mo%CJXztvhho;tI0rz zHrf6T*90vge#}^fRt(Oe`QhZ?e_rd%{GvN*beq~A3Sb!f^rvW=`CU~UOgJ||req~7QUI*}#w?Z6f z{AC;gA^!nGZSbwTyC+C`PRb9C)$n*dw&6={{fRul{`-4tKo8hm%FeQ5)P%kJ7{ru- zbGZlbgV1W@LNcrX(u43&703@kr&e?1(3@@x9eE&6dM18MFub=B;D&*6SjY;mNg=4| zKfY(pN9-0=--A%_`}sS5dMCQ@?sT7?tS1)Ko{%CiLyxNT2W%VH(SD0vt)gq?k1}u@ zFDR5q$r7kf({44pwGmNz?2lE#*MNm@DkE?(ms*r0$Vdu*uI6iCaB5JJkuurG`ib}? z4>+j^xlBf;zDBUccg%O8pc!(^dp?1=!TB&RtI?ij8O_679&b1(wYuT#bM^M2dtty* zf^=m1G1y$Ee`|+lu3b`FM902Fm={@(4EH#(s>?X&>}v8@BYqV-T?%iW#4nb_f99~0 zruj|_5(h4N9au5&Kj$NT_1n@svlM|laxER=_j}FfcPu^pKX7XC)__|gQ`v69fj~z6 zuD(Tqcr?1u0{&w>Drn&!8W2FlFUYQEmNbc7GfZ2;!U4rmOm_HlmklZ~P5`yS7+ znc2?I`@d&)b4CyN_)&mVaEcLyDJb)#&K)q((Nl+;@suC^7Oi4;QoA(z*C@Spqt@4ovpFp^SDB-(oQy>DA`UEPyz z&2MCrZ%aVoCjs5m2}e*Rv|XJbz8>*+x4XXk+h-eXZ(q5D)7rniBkq4Ok^evXA5+?Y z^q!yI`~SL;6okw7jp_ZF6YD|qqmqx+$@qLKCS=l$V9T1Jm^9Jo&mN4kRW#xMmz9H1 zKZM$uKOr9ihw0<+b=Vot=1TJ-d+7fY$m8L~*njc(?8KUzGV0DW_9#^~h3iaWlIEn% ziVPZ!CS@@$tt#f2ZF;lj%Ge&8Guf3wWUCAsT;oP((LCD*9PLR4aHI*isd z`ZJmAu`lRxs7L>oZw(6N{4F`PX47AD`M0n&fY#fqo|mMwNysRwN0g&Jb-*!vbe1%HsdqKizS=OfxecL#8@L_T!k0(jTEtzYcFs032qT(eDPOh}Ml#MNuFE*uB=TKv^$&>C? z_}I=phAGaNlq8r@V!|~-`_$@%D>TE(p)vJu_O_g9;^99~(J@jP8D1Qdi zuH~J^q3|ttk0`LV1VWd z6*bqdJ}mK6N^+{jn^u)Egz)NiE7TRKig&dZp}SsWdogFPHl2CpVx5Sx=T+>AM$C&A zab+zQFVRSxf04y`k?YRvvr4^5@&9T))G*F*=?kr1r0TTnO0ZSSM2uKpN9gVKm!(p< zs~V?k_Hp!HGKk9lwL2BfVuJHgbP3Zc7Fu-~{G5D1@OyqPJ^6U}%vx5$=3c>I-9?>( z&8V^Crd4C0ITxR|msA)y51CY8Ajj-``kE*Hks{&93)M6BBlLB0qsu22e^Nb)2hi@E z)@GHahF0R!2B$b+`|C&h%+Fy+^SG&27pXR{B1hDZ)~1f$y0H(~EIdX@1nX-3UA&+% zU7oPe4zlv>A3*%Pi`A6`RUnz5%u}Z#>oH<1)@d;|rFgX&iieQnD;4*AP4^x7$2 zm(PF}HCgEyK#gMzn@%Q87xZ4s9SQowq8^?s)GTcUR7)|_r>lsI8MvK8U*SjNpDD>+UU1?Y0*w>E14AV(YUxQYL3HM4`0!H3S=o+BGI4Q&kpKXP&&SIonWa;V z?9y8`7nZQ9cCm9otAOLF+k4T+@yu7*4e(c{aw`>C<_uoS7}tZ3ryM-3<^HZ|)pe6; zhw;^_py;S(}Jj{6zGuNjy=n{*e=dE8@g3%!q{~r42mCCctqZIn97Og^@i_)+_ z$cz@y`DRr=FR$rGh{iONMnEu!0v+}W_WXjz|1v*K&~@KQOJ=hu11RawS8rmm1iTT5 z?q};uO*nZp1ci?6Q~{-0XQnSPlZa9*ykbCW_E@07JwlQKmRko4gZM?{t+E|Vw{=?Z zu0^KrA}jE?eTTI4_~OGIWC|Mg>Z7AASo^%pFXRdzHJR0CmHQJr~b?|qswwk95*`cZQJ{dEZ#8g-yTWyzn`kL$(eNETrU?fCseF}w4Z zt5KQj)UPVSn#X)@Cw_3%aM~#fJ&DW}8=0-2>%H@lbytHAR!%AVRdamfha3Zqig4kF z#~Tu#=Yj8P@+VX-e~(6ozHvNbXwhc1CPu*qA_oAKQ0B8N+EF=vcfhyaHjRbEmP)W2 zDB)}#3F``6PUTL}ma+4)(RV-3X&KqEHB5#7oSlFdR=(3$u`KtGDZ6CrMc?_!?PsSz z+c80}CdS-+GMy4(qp=viDpB4RGxNcp`q06B>@B-cE)2JMPvn6K4!7>kxCPN<$;AX1@^=M;+LwsmzqK))_-1W%PR;2>(#Rr?bjzWUCB`MgO*A ziLOpmgxTL>Kds1*rTS6y3e4xZ0KscSQM2*0{AUU_P8T{C6W~cMW0|g(I-(=|oTWBh}KXAPk`)>}!g*qReTI^DjE4gr;eV#!vewb&Lmc zTL+Z&jArUm>4m3o!XQ^(0wIL*LbTvUe~!5L+16xaO<;E6Lcw*)DDMceF$fvY$H?_u zcALR+?+~b4^o0zTWYukoF90ouer#1S1h&^X-dzDSd>w@$dm1Mcnq60}X;2p5VR|zu zyKX61T)b|_7fL_+T}P=QD!#Zy6Fh-5q=NUb_|gB>*y*e4kZOYy(OSO63jdoQ-o%q? zK%4L5`|~5nUe5YE^W{1{4}+VJmL~qhf8dMEkQl!D(c^7A+3{<}AyzfxX?r;Tz0Ca! zAU|R~j(9~GEPE04d6Cq6HE8=0^7;|-=z9_KIZ?AHQ(~1*Vm@~&K3LJJr`F@?^f>=s z!K6F}bWXDJrk^^WVm?!*;oHd{VVgpscp4;c1QWDhz&b;95iwK5xzOQxXpK1jd(SHErkjNZyD^$ zEt`N|KwI5q<(!g23(=a%=R_rGqnGkY6nbrNVKj04J?OaB2To@}44H0m52@`x`cF^q zegDs0_b=Y{K77cZS`VEZlzy&H!aaufgAXD7iXj?#sF;q{o=0sOp@slPu3!*Ri*Ef) zpOBA%L-g_ZI_wPR^CfwaJ@kKxJ63v?-5CMhNqBhD#L8@@q1uK4?{ zVILkIlEQgV&bF{_-noVt^Q=9Ujz)<3DEBT$lNkOD{kxZ%HO)ykn!nw{w+#*wA+5HD z>vL$y^!s-^l3^MYLpJ75OWz)r9k#EU+gF;x(tV|_EgC1yUxu$>93K6scN55VlL82F zCs3V<7qUyV^8)3k;HUUrRfzj<{e51pPI6q?|8#T@Btex_WRI2M_|0Fp%fw5yb8>;l zNz(_WjxMDBf*4Pit{tH}^vM&TABKQqX+R&7+S@27b_uRuZ+i*;p>41^gpam-Xf?kq z{3N5Wr>+Z0kJnqawa5da2TX5~(>w9^#_`GZHg~q8wROuk;F5y*G34*uzifC<@(=Zq z=-J>zcaIx;@Z&8RZ+A&;KDrnnM@8GYZLAiY%PFPE5%92vm1hVgK27%A+_QNS#^D%W z8Eri!z0bP0RUagD81h^IAeS$ONEN-$ZP|8AFg%z-dX8`;%bYes*a6S?w$wA)8duX6A z@q%$IxaFK(unZA6+1?~F^TowZ@YoZXvuFZV`I zA{p4Xa|noCa;y*Y!dt@X9Z8K0=z(?~IE~bL_QEV?UuO1ns(wW~KZC%x%kX|QO(u`8 zg$B?4b`0;aSf3%auQzJxsy2_U9q)Ku=+qCfQJ`70W*l%Sf1KI)N)azE7{7(2@Z9Kf z9K}CBUB>q~*JR0*r^)Jf)biTd-tL*b(~lQ(0Dc=!B7Nb!zaObht1epGFwoqQ_uIlK zyS;wgSWypbPx6ZBEsHdwg5}#dNXLw(J4EvkQH&lW3UaAAM#)$+u+#xRWd;Zh{ zyQ(%RK9Iyp51uX8$8c=;XY*qkFudQ}X~vO{P9*tpAIeHKV)l9}cEhjkJEKr`a$_Sm zLedO;g`*~)TTbClJzWhoW6RHyLTc`srYGc{uU`_;9}W?yjN)(`QH&O~VSFld{oOQu z*0?TVKdj?hty#kRXp?oUTP@jg-VhMfGIJ|%-&<-cV7G5wh#YZLu(_;j_s z+*oYixYCPP_jIHw_Ng+{6CLp;#y`&1%*Wv?W%=;S}E<%eLk z|5N&L#>kI_UKi^}>E%bzgqelQF1WAmw}URK_^O%HWaf_^6K$``f4p{Jfa>Dn5k-<>JD%JELQeXe^))m{zU22qBE?49Sv-*?3#xb%P`D0Y1palS(9nfuQ>+cYd3a zP1n-n0@E^}zdY8r@nOA#hSv^Y8`Hy3_}!znKoyCCKnfaY-(T9kHe=@kl|U$D`WU^c z2>Kb6NNj}9iBluN&>w-metnhYLiV9?^swxp^k3(1aZw*<-T*wO>Bm=g)tn7O;lC0{ zmt+NxS9Vjrodo)PH{{yeavq<#6C^V}*Ogk)gTiwj2tz!J7)`4eC{fc+@uxy~=w3bQ zMo{&{+MV@J*p<`Wh2r!vzmxa-R*cSpd{jymsZca(y;5scjk~^KRjWlvv9;&L1Zr$k zl~pFkt|@b3y+A7bQ`Z75Lw3B#_F~UoZ94PFUHyo%=T+>D>;ZwqK1B$zevRv~{z|xc zk?YPIr&p;yKkY}lh6G=|ZyMF=PODDDs{{vfE&XAAAEUR{UXawDv8r~zXCFZ5RAw?t016)M8@Ce`Ff`jPt7(c9NhhFb(6peOj9ZC|Umlm;ua)&L^bUR{Hl^_P)) zidKrG6Eqn??9p|Yu@-AIn440(T8za;P5yLv%16MGQbBi;9%O!>U$4rMK9FvqV#eeW zxcKY6l8$VcAj$uAy~ya^Yq##{cM>@uw?(X(KjheCheXemMd>fOEUrvSTE3%sd^t z*+)9P2g-Zz>JJhGau(i`hl46q8<24ZB^)*^Jg|KPC^SHG1L&sCwzm++k$csM6F}h_79ambd7HkXw zm`%rEsTY2PytE_feNWDBoC|Tn^G;H6%i_K)wZc3U>C#}4>&?NqzpOhmho8S(qh=XpV4 zKsHIYxL0V#=C|2fxSC#XVg@J>(efgoL|wg`rzs&LtH1b)uTaPg&>k_k~rc!E5|2^~qX{gxM;d&WW?0xAD0q*P_V3qmN_hywAtS zhK}FiMQoOSKAz@KLC;kU>*i|7c1gMo?hy%FPYjco4%!-SFT` z`Yqn92?a8GiRs*!IK7YdUxT2EV`7Q=uH=gX3Zu|wv%94{)($yg;t>p^(UE!ui$~Uc zgfxk{NrmOsW|Y6QP0~89hW6&mPD8)BvmWzz#!}d1Zd|^$<(>z8_&8c|B6cg%`R(_O zLT(G9%CW35=1zGPd2)F8a{-^M1*2AZi<~<#97w$-ac-725TUQ|qw&v}1stBgXjjl| z`C?-8hY%WYOrB}%gP66e%7Xsk9>3$mV;wsH65SI_oLpe8>{ed+xcMBjG=rMX%_Xx@ zd20adHH(@sW=9>O$y(xvqmSd5ud*B9pv2?{*;(ccUdkBPgO8-ZyshQ_u4&bEjIEBj z>s$J$5|$7k871v(?`Y~YY^CfE zs!}wz7b0=yp~*-)s3o-I7vXVYlXq&E@f;}v4^iD~oIOnbY;)<+URK1%W0Ziyb08RM z#p%O=d(87t1NsY=RWhO7lcf>22lOo|5eTonX7M4(g58PFZqrsF2J8?!R3<^Xe@SS> z$?u+zQRIggAhjKL1H~T}IAFruoCd6sNkw@zB#KU{$GnCf%8#`F)l2{u%Bh9d8{N9y z*muFX$3D_FoJ_|Zc_=(nUIji_vl%5*eogSn}*L<4OB9bUMh z&mc%^XFYA%3hE^G$9)dN$MrhLKG!9c$ltTWzh^s-FCs33>j;$?8p^OR3Pugan@O58 zSLt#7hW7;3eKSelq=I|mbrU3D)K=z?MbMEdJpWE7|78ir_;7INb^wFV8?Vgd**lO1 z;g&cMqRwZt2{_}H4b#^{ubKb%UvcfO6WwFUM=j4ngSnS}8_s0#&!clfH`?d$;@wSH zFI>Tf%%6d)#o)yww_CNsf0U1*CjHCaUV?+L7@A_~Rn22sV>FS^KXYW= zal1`h-f%vPJC|(vsX307dS$AJ!***2Y_+TF6^9A56^;hAmK5A-r$$SQceu@f<}Pn& za8{wl>aEvXuhv`K&R#C-cJ8@?^nl1^&7>u4jJ!df*Du>|ejIMH-rC;ZS!miw`&O?x zg3@OS3o3QpvXOedeLw6^(|Ndc&fE{u|9t|Uie4Kx+V1ani(?V6+5u4ujB3>2%haV`TBws&b*b21 zkpA+XNMuUjiemD1maYuOARHN*LG+)+#F@W5-Ec{b)sS8cQhL%n(_>V$4Xem}x#S%O zr@LPZHpLoMyTh_BS%Q%Lp>+~Lc`+ZzoyZaN1adXFA6D8nBmeW%fZ8= zkopbAw>xz04SMgdZrhR0htRpy)6k9FRI4Jwo-dFwLbtx=8~%`TTJ>h{(n>#v_m7dM zrv4;p&T{?naEM16wQx!5$nXZ1yxMija8wydn4HA$0HO(1X2ixsZJS0jpjCu_jw5`D z8H~`%k4DAvbo?gLV@eveI~D2Fn=nbt2^MCFdq(ZQZ2sB1hkDKHoIBm`zE@0Z>CG=1 z^J-OIbjt;7F{ZLZghxSNiP@&zZ*do|KwE$^2WHzgoLE}BgA4c<9P6h2M;QNB>t4OCspH;NBO zsT-@H2r|&qdwm0v8M&#dVTcka){7~RQ{akxU1E3eY6l@~F)fM;hb}IVCsS%T5Rji= zl~!U%`L%PH#M)>(5$6E_hFlt@J80>Mz~h1Na(VwAx_(R)f@={bv1S7v0;uQ^h5?Zr zO#cYi&;fd<0PBBDMF#v?YvnQbCIW}F$3wn_N4qZnE+2W^j%*t=@+H$DzXVg}w*Mk^ zM^|^livNjU{IHR>-Rm~Ee*L!3Ni0yyF7oN=q4lQKvVVd2n~6sUL7MxO`M3nVGp zL$P%h`N4?P0WVze*_IiO%8~1TCs%gP4`q&sgLD*+PNNyz`Sx)0IMh_#*y==a^Ekd+ z5arn>OY&e&ncszO<^XM3>ZK9Z&;HG2&`?fw=xCTNG0Ly7eDQ&d)DN@R1`92R#(Dr5 zhGk5YZp$liqZdIf@k1LVeFe}=JfOQkIMtb!d z2lA!KRpQNs2l(Mdn+gMXG8$7{f>Zf5y(7bl8I=e%rb`pAK!+JK6G#oUU)3&*Ba)br z0{Z?Z{f{nCc^PGV*lxjbN9wl)R+kaIKVp#H!P)~!7K6gGP7*>x;;vSj(M;i~ZV z8M@0Np*1K>0Wd4W#?-QCT%XSGs_sUsL30PN!-6DAK8q2Htzy}3%a-tg*I|@~t-`VR zN%;&}@pKZS< za(DH%kCmq%uJkx7!ke+k`qfzq<^^M+gz6Ss>0ys59fQvkChxFco_JkqgjG{KU!kC< zKW{@p%^d$@K;An*#rh#Dvdtzx&Jw%&JU|h#^v(i;|MC~Dp^lU4pg5=XFm?i@7lRp$atM^>U{;U-P69lOFaK;_v!4<<|dT~ zitg^?B79*vw=z&2Jey|b>eY8q)xUIF;m@QQOcbn0Yz5P?RPUJBHI9k%b;;oq~vvg9}p7>VFGfdU(if7dliMY4r~XMl7y zdGiIJ>Cy&VRW&**%Gd>1tx z)}x*F?sqjcVMT@WpkGp3M-V82C zIQ)k)E$!^p0ISOo4Ddz?KS|K?K=^7URfHeXLI0HrtV#fevR1LH#r?!{yKfK#$N~W- zimm}TUZqM<1zBr_Y@jag*>i_x<8E(9z}1&6ZMd0%zyqjPaL*8ypAc7Q95c0X!K`7~ zBE-iQbtve*cED8bINOB+4#6TKwO-bytZ#MrD9vM2)?rC#q@_G-7lI^{`Lo_Hmd?d- z{D?U=?hfIFw=re;9vb;_Py;U*zh`l-++|D0MmW4MWJC%VJ`Dm%&@leK?u-txT057oYhTcXa)61HeX1#2?9~k0ei&Up!&Sk8|QE6yU~qZI7YymoS8rmq1?R94Xzpk0OHHWFB6aha9ondrTGJ(Z zQRLzji!T_(3cqEF3=`BNze`e!1NmlBW-B1$Bq4SOeB6^(g1I2RIz}^ZaH4-MJU3Rj zu)><@e-_|T<{fBMX#a8Kle5B)VouPWGVtK-lz<})ZLAx&u3?6Mg0Qp-$M6cTyK?Ab z)f$Q15BfrjAsPneFN5 zm$jq7f0cwVlj6rF`)+PoP7Ll969e&C)Fy;)ac-&;qpM=jMqoz}0sn|JHu!r_X>5o0 z8eHYgNrmOsW|Xt`v>e9wWLgrA+dr~S=({Q4rD)1E_Wic^;l^4r-tLmxeRO)MffD*U z1F=Z+fHpKrMLyR);K#_JE)C)3bCY3^4IiLRjQuR z2gDNeC-$At_k6aBerjVz%f;5ql>&&+ufvkWpy%s_= zy0!@3;9*LuH;@-h{n1?RJe}>*A+{R52#;M@rxZ7NAYl-SKZ{SV*NM>mTUYYe! zdc4sEbbVSgd{vxI9K>QdUbw_!+HekImhE0PwuYD2=V@tYeE~k6kG}{@?&(PcDgI&g zRkrF6yBO4fT6nUVKbR*})v6G}ZWeAEkSC8y=UlMnO<|FXjlkFq6i{h5~OmAD4F$?uimPZz^6r3wqQkZ1th zT)@x0I3D`5P3bMqFX|0%%ed#s5*(T5`9FSK`@FX3^8|Cz-11{WcoOju`b2rM{H}7^ zXL8NfiG-q{yu9zq%70TB%)$8>FEJgLY~bGS9&e!a`D~}*ut{1;|Bt_mC1&zm$=Hn{ z6NlD1AC|KDzBBP`XSRMwF#W_a9yd;U%=$N{Rb~+F9jwQN;pa0qF5(5Kct`oZyPH?f zrZ$(0k5+PNHwP^3qrwTXE^8aPpgG2jV&_^HG-Di`=k+vbIfV-GOVW7P#^v)Eit4grJL3Y7xjKtHM z&&eptD0u;HB3#GPW{j<$(rA?YdHZay%pISe!7nvbB zhf(V6fp?<3+Lc$FP|;eP)$CWSKxAvBsiP{yqXzIA@s5GV)b##O%wDZVXRlJcs|s@5 zzm@YVSEg+l(+CXEB>6x>HxCFt04HT-7x1KI$Pw3hy-^#$(lnjYH(B`u&zy(bIGvHhA8%Dz7 za^+YKTyRzo3pIedlep6~C9UrPsEwi=wAMq0mF*xtb|$HcyYnc4!-1Bopb`P|*Rd=` z;wY@i)(gAy6WC5LHFH#4{~3i2shfikLaY~9KG;b`bTHq?18$z9b+n6h!+t%jyDmt( zdAp<4zj3Qs1;yFk+K*+&EaL5nhW9@2aLw%-JwVg-xWjV!LU5u%IS~M?DB2cNSS#Lbu{!L;?PYvbadi%BYS#U5wtFKH2a?} z+qNgnDV)#5hV9_%f{c=05Kbzd3ZU5obaz3YZx@3VJ$KPNP{)u?Gg=EN|C0Y|V;h_eoXD*wuZlHIq; zqam3*sy$MBSyZvS3OmSAsi_OA$ZLY;9KR9F{}Zjr@fg2_tlu3xIz$dvFVn$mFVWJ@ zmsf=vXrU1y{DA*#{F0j)WxvJ$83Ql9g|~A>;L3BPi(ELcJ79kfK_49(20=AWYC5s~ zIb`USeTe?IB0iVtN6;-JQU%ow5tB2nKlf2LGU@H;T*ZU$km)}a4YI`H zPAbqv3Z&?7Hta5bx*KI1hKHpej;&?;E1Et^6Do&YqMF)<9H&@osmn6OyGXbpSy5}9 z6-w|5kK-5V(8+Kj))@d{)9z^J0mrZ3`@2pM&%=K^O^i;^eko;oa4gHqp{BA_Ji%Z+ z$anE!y@Q6=41gKEN!4lClrgR5Yv&ry_3%Z1cJr!#B6U6g9R_Jn4WF4W21+?P8DzGh z{b6$|6ZW$+B1C3tu7k7ccrTAeXkHNjzNU)uW#E}E4nyZse2p>W^``f6K%?$0)yo7! zG}xTWHoNAJx)%XR!nS@$wUPJ4LMO@ITI>>9?$#*tTRf+h)@7+9+gPIq(?Od@XP5WhhwC2XF1I5h%A=4L@d&Z0k zHWw8x*rtHeAGGhw4SyvEI+ zmq+(=?`0ac?dv=5I?n|+mEY>_+D_|oVEYSqyZfbb)P)?ky_1&l@4$?2*fz&CCHXr3 zUqwYY9nf6WlUU?X%O}Ya0+Q3?(~gCw5;KLmam=>uUrkcOnG+R8wu z)ur|}b&A7w2W}Q;1F%s?ctFa)K;Dg$q4fvbwB8Gsc!uro>rfdi$)?s~U4gL>v$z{X z{MfgZ8r@gwMChV6GaKOSDGS)qK4)WIXGcJ&#R0Od8I;`{%2pRI8?nXGkN%fY>PSkj zt`S7fAWbPCz3e_TfAw}ccA!!XP-1#jSJ+Mlf07A%5>2TBZ@y8#%#R5@Uiv%pm97#0 z2R9!gPyLAh!55hz35E5ez%sdv9M_ByfK@#&XCL>upP>{R>_@TB2%x4fVm_}jI*(?p zA7VaVLOxv&Vm@aoHf0KIQmO1m&gDnT1~pXr+ z+G|7$VF(J7q-2gZn-h&-0dAYV|NncYZW1lCv?U%31l>W4i$4W^HsisHIHk7PkzxZdH^|G8ML-}uHr$t7 zV0NSBKMRyuNrA|m<+0439%+nUMhSix;pOHlDOi%^Ye}nd_!ZOS!0YZ6LG3WJVy7|M z7i8KiDOI3Su7#ib>k2h!;x_Nw(iTyFV|zXdKP zUxxeTD4J`(3~oJB1N>6e{6|X;Y#NhQ1qH&;At~T zwvL6puP57ZKZX{!bMsoT2scaWPGkZ(tc)E2mUj9&dOe+ldx@qeMzLtoBzk?$NwCfaSW4p>$ zU&8z#SCfUhIz@QwYq<1OR|*yH7Tb-*!-AF36upy*Ui`64 zWnES+E}e=MOh<_fLZ%0AIH3zuAA*sH*FTwriNt79N8HO^uTbV9#H^#4pmJDmO;3>y zGOTYL?0iZlbdl^>A>>j$kM6XuJoW1I(Eey=JQ;_xUaIvfFZGIt)uSS?91e$}^yyKf zzTFo8DV9X*HbwpEYqOqSRdAwQC~J~FiBW0jCt8LDOX%=T^{?OU`M#7yNV*3(6TGwowFwNGFUT;&%!pB!ndZa1f$N99|IL z1#R#*_wT;@-~b?$nrS4IX*S!9$ou<_Nz*6(?w782X!W^gWwKtj<(YJCxpc0T+`3o5 zYvHBTx))k@9`{PyZMhv!v*|wHwIirP{YZ%Te;smj{d<$65Iq43U(gRZLreNe^Bok4 z{Xp}RW+(O0@k>@w_9A}!|8WE0|25z|2k~Y9)to@`NBI0pe_kSc89({K{7OIbgX2f! zygziK|EKHx>|g(Y|LubPC8yU^j3-ru=dhlVbF7h7yNahxYYCIIn+cM7bnMRVk$Tn^ zs>0OMB}%L)z<;ZEDyK-9w5oS=U^~nY(ouTEoWhIFpqf0Iz3KMvg;)XD&?z)1>vv_0ZxL4_Shu*E77h>1g-}CfJZ^p z`a&NKYCFYJU*kO=55;owPzM!Kl9cNM#c2b!|HEj|*uQy@X_u`EoA&*nYhr8yProkx zr?v1r=rv>8m)RxeuswOE=J&(=a_e(BikvkT(g*veI3Sv+D^$p^HMKe^kPdp{noA>+ zfu^~s@3U>=@xSwSfz9u^ecjn-8@?~YO*QK&P!UxER9Im-JVaQ98`%NxI?fAnz|CpB zZuX9LoX;!}aMr3Sd_wd$xC#B;t4Ig+`w@e{p?(L zUD^Yct4UsJ-tM6OO-tHw+mkYRT;+{A^nxVS0ws1AU>j(q*dk?UPGhv68I|G)*g1-^ z1k(pLF|{D(s7RyM4~R7a4e+q@{yt$Qlk5KPllK_~ZL@9X9VN#b=7aqd*RQ0YO7N)N zPDWb$iSox7Ri= z(OQ_S=wURqMJj~VL2S>cur_@0q&YtTqCj20p|ipJr%+rE3Dhfu(r1pDMyXbvB$rLOX!cfkw@M07Z^VKmiJP%b?uv1x8#6S z3}}&zkkg}Dx@yz$NeA^hAu}p67(=Z_n%t0v`-%7JOR(!t zGhwFgNZU0@!c;#A2iM<);Q|7q3LPie5FoZiD4L_H1hHqd3`#X02ksA~FSK~Ke6S?K z#ejoCWU##vnW1KiAgdD*Ua(x=trZ9qC)G~E-z^Y^2z7YE3aRpg z@cY37<|r*lRE0&AED`}GmJ}Q`LPr)YfwvU#6X_IA2~?CEYa!1Tg0otbav&&SVw0Ex zxYpX`h*87-Abu*Sea@P^4^@bk0Nn*EafAO`;N&O$kpX^~@QtmN>u<-y?kC`*n)Ej; z@k8n)Zi}0L+@CB!hW~EpL!@Mt1U1guln{+W3U?b9{lxq6p*=*rGls_5$*?oo86+pa zV!!qi=6y2V*2r4u_17hp_9k%J1z0Uge*tlDl>{Gb(iq;ujKtUwL?l;w*1Y}b7@dq% zg*ceCZq(q0m6}AVvjJ_WLO3F3Y;5o0)CdcXCox;-Nb_52@UFAbd^8M~355#+OYh$T z`{|eYhxXt{d@J_hkQA43r)7uq*dfggeTHR^`3Dm_Z%YsC90Hyp!F*PZmhgB%->A;B zO^+DSmxH~br=<@fJNi<#FpnfId?XC)m=>yV`7KsT= zkPVIKHL4{{+@V`JLFXZ?789@%wfjh4@&e2Nv#_>kS2hTlIE(051^l`p6uVD6=)?SQMcr!|qi)bRz%o{- z#C(owMUM_)N9Qh89O(9*{vDNt!5OUg<1h5-9}I}-Z5KF0GuDqlI2-xGKai)Oo^n`xx0HVV#ch_T2>sYURge z#}0;Wx)gVHC3Um1+UjTJ%F_wTIdbc`B7yV%jlJE>4{isiX}pqzfs;_+I7Pc4jtYhal3pTz-=L!QJ{aN)@H~QwAFmmc_h1CHR-a<3)u6|u1o?<)k?_RE3RI7I2g5l40*9yW_Cnu2H4TK> z6V^VU>Wfn7#>a}C&<*rZ9pk23m*?hCHW5g*di0r}7o(%|`aX(;|5D`OsZYveWT~^* zLHMeh{eZYC%IEvf9&Z=5qxAbmVB|s)ozhE5D_28kt@M}*RCIvjdSKfrN z;tGZ}CC!zd{Nv%|(1uZmvj6+>6#b!J`v;+hdoTS1711K0czWUe52+9>T_t!seb@d+ z4)^|}@*^lfwz%5hHYiP%&7)Ha!I5Am46*gI!Mn7#GJfKSZ5GZNhYhisha>8ilC5xZKRJP6IuR(vg79_NMPzeLwFuK+L6(R& z67WNUWZ}qg6FSZIZ9R-ib)DZd1BJ~bVq}vp4K#~MqwEfkdTaKVmXSd5JQ)G;eVlv~ zs3(JU7D$!h-%Z|SVvV4JNc8$0HBAti{aqPmzGSFmTNi@ioK;eJ$}xb zE?e`1%K#H8={yaAQmS?XUsCm|tp(+M2vf`9zoaMf9o;%IV7K8AN|om-{A&ZN62QLY z_jh;J59?S33rzhB0^=|&4+imNRR5)b<^X<%+V!kBq#gQhL*ih#b;)r-A08UYsxe(q zs=L4CNYB9?5aRRQ$+FwP%Vvg``CG4Wcgbwqcqsrh&I`C(#mOqv89L|LUX634{aIsxOC?vaX~xEyV?g-Na6=d{HLTo?RFS^h zEV#J?8`j1BbJI2yJ2LQiN2;4r^Oo+0hYNwk(DHhy_YH=ovQjGf!eMBk=iTh*MHD&> zwD+fYfi2z^3f1xB2KaaBA&#P>CAM~o%i^xUJ0=9!c+ljA2pOl~hC)Z-GhUXf-grEr zyLKWKo7h6Ng=9hFjC>E1SkN(O^yBZ$t`t`NW}p3sOUZ{lQP{dl#8^40^5NC|FzEzg zx$x;D4q{|A^~(hrVTBsZ?I5*0^lI1Mj@zJyE19+i!%G8UrrE6XEuJT|0#8M{5MXCT zCcrgPjZ)i?{=zifAy&%A3dv$(WbTIiYCE%b}39a`JX1wKsgkiWSERCYH@-PT| zNpj-mAXJBDa~5gYAH_kV za%Sta6sFsEj}ccr00P#9WL6Vk6B`Rt7M($Vy$&5d8`1M0#Fya35_~`Z%axPCdh>_u zJ{&`Xd|;pCI3_x4ij~4oII(qfVrlSdHpnn zg}9Y$uC;{Ci0ol3Wu+QH9FN}$HA4XBq}POCEQ+F_BgiJ?`U8(^aqHMOdT&yP9zj$` zdRCuBF5VP}&>gnr{m4W>ns^ufWT`y^ab3MTdLv@KI%Q7BoLPLqR-Rx;Wfr?7VB<1# zQC(bIYm1G6k{UA^m5>4Lw({jAp(o3Bne%v+Z67zLkz{ZZ(oU^qheAb*Izj&|7w?sq z5jqL2Ov!5VNO}I3q2EbDa-jAx&jn1I5BR{#!FI27eF8M>cRSF zNid!Ki5`4$c4Jw%gym#yNxfHT{y6#Z0Ig&O4TohP-?Kf~ry@Fx^vBtij-@(1*E%IkiM&tSaV zYEYqyI)AeB-`#kzk$e}5oA-wCLvVQS6ZKvsg$?vxBK_c>h2Z{M!N>pnF9*pTl7F0w z!VrNDPfUzamLVG`Q39jFyZvJxa<|PH6h=73R{Ueqy)S9UQJ)U;a==8>df2UNhAF0~ zqesD#l({s5n?4Sk?K1Ar77bcOf-!cMni1`48w>a1+mbB*el;jFC!H}LLTrcdiA?rj z8p5}6ROgn3wZ{o*D^*ZxL7+;?QC_uwRqsQ7IckTZs8u|>38kc+5#6+^j9DVxrPZz& zGQJ>qS$#!nV%Sv{3^LYf&R{2FP%w(l967VW$Gj%0(v$ERiXXVP%0}Y$F9+fkq z;5LfOd9Kat=J#|wp07su2zOaPaOlkWmT#Ql(fW=ZA5W{a z)7tN{uKoybAI4&QS8(~T4USwNXQm6>GLa)4N5)M6q{49gJwC?^ZF&4R-0I%$<_EV9 zaq(Oh`{H@LypF7f_RXm4p8F-!dE;tyGCV$(F*HVn-I;j?Z<}ss3W z#BT~U=GV>aM)8=f?Y;R?zs!z4ahvGlUBH^J3x7WM&xWAh4i*@NnBis>V7q9z@3)|+ zI_2L8Jf2G-0@kW?lg1Cp9M{O#_+vSPN{(EtOf6Gdz5g^j2Tph+SuvZQYmB(z*noaA zE_;5GED}VR(8u$UVh?+ooxmmfU|MR8KXI6_lmtg8cLDAR6 z(cOci+{MvC4vxkyjVJmvGqH40gQ7F#SUMv zRt|{ImEh=%`K z52DK}{FUnXtha`!^9^#t4W}^`nb+)mkd^fk7>PeUuRbi8tA_e|%9njqc&fZOCb*flVaRQ^M!JE#`kYom=wEF7T<@5{>{<3_K=0n(I zG?+bg%+qa`M%X9$k+pc;0FE<#zian^BxEgYXf-X+AOHZTlK=p4s9c~R0Siq~OixEe zL@rQ4Q)|Ud000(DgzNT+$s6c?eX8HzbpHfFxpM&yZs-#p9CL&-huFZ)6g&A|LB|WePL&Hk?bLXDPiiB_P$&ES8i{o8>C{chd9@V__zZN)wzD?_K_*Nzggh%NYI640 zj;n2}zv6|TpBG^Uwvf8xYuoa8wDdM4jvMp-y+I*VGiD(P3NxlnGOzQ0KAvq>8Fa~N zOG>2GD}TFBh=+wa)J(&_PM>-z6DVq_N_tYY(g+37Qk76-Iuk0PPGVv9LsD{b(v{&R zp945kA`!`&^U7(Ge7y55-C4IhkXPmulLq=GRZF zq5l8ge+V;b8$q_etIBb6@vo&0aBveQhgt+I0a z)uu~QRf-Bzl!as^Sg4&O<#=$&%etK&Bt99v+{*5vxoL}FsOo@X`e@4fqMf0ZHZ8vv0-7vTe8f;jd zNYMwh*xq`}+X+wI&gs*1VSM^-m_TJ~J$<7~=Fg3T>egSBQ`3pw;1Z0uA-BjQ4{|uae{i@_x-rgg;PWIu zrxE>WoGVa4hOJy{d9u&%{@V~&;bm)Et*nB~Hm$YQafYNn0qfMO)2ptU0YbWSX#&(t zzxk_RMGFaq1GX#EsWxQ!g|u83kS~*0A|FpNdP?W$dn0~wK3l|&BnU{tMxBU1zD8Q!VR;|xuMALnm571Oa2Y5avaQvSySC7AUm!!MyAW0iGX;)L-iGsQxU>V> z2jYjZ21D_It`uL_e^;vQj)6fJB{&{NoNLR!0ydg3pz?JxZWh(tS^%YC_+9ZT?QzC)gp#}7oJpjvmZV<8CT?5$mcO+3rW!UMvI<=I}nI>jSCH^2|H>JIvh6>WGm+z zp+x|6@mF}U|Ndq*nW}^XE=e}p24X-P0^3d@tGdf2XQTsfx6-vwPpOub?R4qR2%1a_ zZ&0aTbk#52e2nV4h$S|qaRKO_anfuhuRLB#Qd5Sb;yiUzY5U8$wr=;h7VYc{sueI9 zi=iWNt2_Yf9o}X4k&s?ekhVQpBebkP%d_HYl5^x?_mS<-=4spio?sq~OU*^u0Fx`J z$x5)GSGFH&gD=|C6R9|h$ZwQVvNaU^cEDbDL7!a-(+Io8fU2cBg?Z%Elb%J`zR=mM z(`{UEtmswF9$^ME7nRlf4kkpMd#9ldlW2$7Z5NuAfM;Oh$B%kswb%0kDf;6niKgQA zwBI{cLcb$#TUYgU2AkYfpQ}L#Is10?f?&ATc1d^r{MoBp&AD&wn9b+dSg^h=@xs*g zeBW9H>PD7XZDzd*TJ>YONCEaPcQFaIX;Tqv$rzJzZ*L$guV<>mo2s+l@LOG++ubO%`&Sxi#<`Vl~$gT%}swJ+d=UqQLs z`Er6I-6u`QOc=Nx4%^468OcA5_Y^OQ{g967hdtlY!Jht1?oIR@BYTO$1DL?hTRIPN z0n=B&4lsR#ilaBA23CLf{o=Jx{w=)VSAyEMcm@ElE$;3X)|MApvx(<^2zRU{Vt_W_ zR*V%dsVv`0!DEy0IxR}z;bJnKfgz$?`G#-0{9@XEds9j)Da8T$3G1sp0RDkxh2bsj-fT>R5 z&bMY3$tDH%%NTO*?nyIb`dX~~rRJ;RY9H-sd24Pp>7+98=Q@IbvZw_Jhby+ey#a{z z1grrNhBhjxfKK3#XKhyRfSmXPypI{Q*x1Dm5;|za(nq`~Qw!W3X-GWcjC^W>PtHw9 zm_}{D&ejYPNKg>FL;t84>RH&+k1n)7ssZ`adiDxr)hi)iIrb-J-ff6-_!{_nH%8X} zt&1*)$_{f2J`_GJ^A}8>xG5%3qNyFUhj4!ndJ(eit#M^sLw4JXvV#k6+y>dYwWK6) zM*_W-v>qa1!d!Q3xAgiTbKIqM;r6kZSEB@%9)~`J+WVObwEkHO}O1~z~XC+~lm~^jl!l{Du{ue(g zp*9e5@Pi6n$=PUPQ#&) zhH5*>T26tv4y-HwSaG5o&P_u9suB8=cybX>=VuR|GvM<7?TcEtvufG-6&c4O9#SVr zIFwhpam`YJf=5z{bdt!(|8pL{G=ZNePv*c>W_CUOQ`G}G4XeJ0;yhI93Jg0$5^1qdvYwIT}61?64?$M^pl}3)xf)j4Du=rCS35jx^b$ z97YHW!~zl5es;ILR5fbT4F;Sqait$wXC_f+N-Nqd|LO>SJe6-}&S z8-8$e_+!o>TqNjYhhngbc=Q8+?|?S(f>F{Nv#!7RQnYZ3e0euF+yf2*vgzWQN3Fn^J(>)+%;T%mblMVSn0fZntG*HyX6Q z((779wYGOxX3`&nEB11}&{3v<3QS3rS3m_9QlJ0{F$zj*Oa;j6>~h*;^uE_>^Z$bN z`xn2leDf4+`9xS!Fgwf1CbqR8pwHIk2t5BCD3hhtzs)jZl@1@i1uFWDZX?k zHKpp8cETdI{E^90pR@>j>O$jIcnYmOxv{XoL#m?F;Me`<11oCM<7R5Co29(b-;!OV zYohf>wJz4c>5lhKn;Y7SI{VZ_V*UNi`K=d{MD)aOwSyx4=)00u*;21RHjVoEx8%`1 zM;>)xd3}6-SYvhPgaT+%ZYw+fpqBda4#Z?>PnPsVY#=%kbI_bJgaB}>&+~dFbnFAJ zt#O-u$XzpQWm~QYXhR?ulrb{>-dwriwH{6U-ds?6 z!VGF%T7Mf!#EDDpt9wCR1#X6OhBae=lRWH>K>!5F-BQX}LUa$UeN)*L=JZv6zu z7#Q*7*j-{2d`nXldAOa67^4_8_;~dAaD5~b-j_x13aqdBraJ_FsX?hz#?CB)z=fq^~{lEVwUkR#> zFo;;V6AeT^tF31d)?vy~xQhifmx4W=wND68%7#kPBCHl-`LNdkJ1XYcjjZu$ceWn% zM`Qv!RNsA;TC&7@YV7WWK7XsP*#+?89$PIm-Kgre+PnTJS^4@~0s+|d2`6cv#oY*o zAzGakCj_Zwfp&+imR#hJ*3ZOyqzwdg5r#kHSZKx5M@Bbmr05`GW-y%4fi2&m(Z`H* z@bDxQmqkD>zFI&J!2sPOSMzc3{=y2JK-XXFW2;KJ9s1~AQR%G+AY8i7tm2`sv3o`F8w z+xB-`yX?ChmH|wat~29w?Q_!H0}5lUgNCv2dSHaBFd?F0^6%0d_pr4-&KgZSyu-Xb z8v`F@VB9`^5E7F-I6@N2ajJ*}VzNkmTeny8TYwDOi0`8XuI6^-z%h?JJbA_40ELB| zCJfvZBFeqCw_Fk&bTSo>f|i{SrKs;1NJ$4$v`sCd$nYtFMjO3${%=n%Xk1`hQb+Deg%<>%Yl{!l=(Vz z89@AbkqAWJZF^Z$`wMT~2&wHX*cTI{%#mHV-=9US37xI!Ycj6?J5JMaR`Xyd>MLc1 zIyy$nEDLYL%k5*Y+QU6s&HrmHD{76FHAmS6`c;CvW?H(l-ebVX@p5r*D}cp~i0AF@ zb6@-HI^zLwr;GJ+!-3newz&X3$^FK6`b=BULkwre3dv48Q zaWMxc#3tlIpX!k9fi{wom5We1b8u6rI+WCc`Tj%TzU3NXzGh-jCyqBFg+3c#>EO}S z@Aw3yYvic(hXzZ;O_+45;|1X#Yv&F?;@2A>ae6g!jH-9o#%0)j&nK=Pf9^Tn`9Ix; zgOd~O-D3Wo)S#eyf;b}wiw6r&qbQ&iSE7`#Xu05YvVhl>1J$nm;DoZ=FT11w_}@C2 zo302Xr%kwfIGolM61Zxy$#To}Y~zbKay3HXaJn4&bJK=BH`bQiX!VObdygh~C<9qn zKPZ$5)Ej#S71;tT=QZqM42$Me1?AD?rXOLfK=5qGaOL6#cvvNt0`9+9m+(ytVKMP8 zw)aFPFAN>!lSC475_Ft*g;014J>}fnK_(m*H~8PG%o9b%uCNq2cUTMkm~X!n$+Xw& zNsXhKrwH7x;_^&*4=A94Zom(W(PY}y>{GBY5~8JvichMH(uj~ZjwxUwyIxWT2&FH+ zAa}olvS6_)QnCC48h4`qeP)z8v-Qnbi0Z~iS4|yW_h^jwt2{PSwyNU3693|Y!yZeG z?(?4s#l-Rri4r+NJ7Uksu$n^Ews+o*S_=9NZMM^p9eQBKkAnW59=+x5LCvBVD@P;A ziPTcT1tvFj=Nw4gRyF>s8~1fs-)B{g`#P?j{;Q+=x~`Ae)pUPnRqtQwx?j7h>3yA7 zOZD|%QT=6$Z5oD#MeyAZPY}$8m{W0FgsJ_-kA}by^pjGRQJZKE+em9d9kZOa@fr|{ z*sm$TuLZSi@C_cY2IJv_XFYiP+hHJs=R$(_!5Zd-(5nuJO$imFO;ruu&5)v3r6@yx z4-=;k5&S$}oIF?X@w#yFpTp?%;q+g_>2%@rpTp_p!}T)YE8>kc;sm#`-|!Z19UG6a zLk~a-PJ)O}D%N*gTQhA7{PnldG^Dp&YIw4#2B{}4MgDS(L`duXFKV}<0{>4HClRy3 zzUPgOp+f+_iDYxckg-~ll9VMnb`!87Ey_+^T0rcic0je&Av6=I+DxAVd(599#*H5x zPh>mZSA|J-CIjaM1?M4Vh+K4?ZrBzT`MeO1SS^u#*goW*c!YJfaQ@x4;_SN^(OX}( zJLJ?&9v-L=#*2+2^(0C(lKN6Fe@NE`+x-a^7yr^OgnTmm=5lHYN|{V0d=~8|PFG4r z0;XYTb=EWn@M-}3B`R4kxdvZs!VhrS%?E&E75!mA`)IWF#xFOo4a=N=zNx))?N|Kz zu%n0^vOcigtJ4Fqs!n?0CsX#UIQbJiF%)~8qtXY0@kb#O$#vr{RAcPsGFhnQM z#bbVsD;x7g%kha*hdiCzG5N!VJ&+~rKqy7c_X0LcK+dGIo2}asMWv}t4CG<=ogq7t zf+ggdmTZvTh>o8QUx%;pMWQpt1iNP9F?(?L_1R7~&y1jzaEj0eeQhq?*8}GxgiT

    }wr%(hg^I_BUa_QnbM;@Fp&nU!vdVZc=KG+tK$)|-7H0mcthbJG>%ctCJZTQdY@CCJjUce>B;6|vo8KGb69I=1v=7B2lhj31(M1k89e!xi^hkC#X0Iv{ zi64o&a8Dxe6=Ow7L0kAx90OdCff5YLS_d#DDZQeeasl==7-~*X4HMzE4eQ!F**c3% za|)_k5O||h(+7SV_iaW*qhccn*JfmMxA+6_N)PX=7yMihHA+PI4Vh(CLI=LRYbmvSF_XClX zeVJG}pB?VKm$&Gnq>h>+9K>Nnjt2ig*=4INA_X}EVKV{{HXjw_T(!OSZE&NQoPUg9 z@#ER??kd|0H(P~=;%@agP&H1p~y(B-v0A)U+((T^qFXh9uoCnPSD zQ^PWv6_lmdZ2iad(-cXXf}#}0924VoMFat!u69sJQ6gYm@Ioyua0J0?IrHbhxdd7D zmBL2*@JCY+KCVIb>Fjspmq=x6c=d)cYaWmefC9!n8@QH}-vEFf0e%FQp#hfEUM}>x4-Dl&(sn9oq>P_ZGV0#>mG9nQ6{Wp(n{IZd9)BooQxP zabjwmo92&R`OmMFf?dnDw&Pza#gX1XFE2_`jegEvbod$Yi6-lW_?-W9&*SU~(@Xoh z-1R;r{he>zqNB5^dxDo1LHrLuVsM`Kbw=#+&GK93~a-0iC+A(rZ=aFkGFj*|{}LrVO2zY&N9X!sdiIg<9xn=<7$l1H~jV~a*(>d~;Hn~eK1 zCaj#hU(vA!0!X+psEDqx z6=k2G9-b#`Df-NFtumjM)+?j&ii@xA6VS<)oYba}WlAa`Q8~20Ri2SOA!vT_J#?{& z>+TbKOCX!x?njx0A7)QlPYG~LrVb@hL=&egiLId(!1erk{M5x$nxxPuap{(b+W{|4 zdUBHD)8U^_r6Y$%uzeLU;#1H{ZAz(5pq{ucdjdJX7M~FMeK{Pb#J#9{H29~}=VnLl z_i8E(^|i`+cNU)*`hKL3Zkz|z)SFiOe7kq`9>IC(%3ENb7q!#o*>d zpi!-Am1z|-7_IdTHCUn5D5pswBj5@Wu~uxsj51gV`1pNL1H5e&JQ^w!0gWfjN`-!? z0Yd%o0*m?}1sC+d2*f>nJ%l|84?cn(J0!*RK|j?5*I=LU`1N|-d>{?4F2S973UidK zr!fJB)6(?u^Xg?|1n6@R7;QhP*Y6iVCl*Nwv#NwW`KRd=`h2fsW6i7wDVsCR$|0e& z`jR~zp0G@s#d^m_>3O+C2R5He^`rmqpw_W@&0|wHlI;OI8l8E>r@*w!45g)skuyV{ z%?^ix5I+%g|BI~yfUw%39-~x|Jt?%5nL?dPRc5^;_qj^;+T9V4W63=bU~vil*Rv(qt~5X3JGgc6{s%DTRfj&T%mISoSiWZU|nH#l)#VNu#!@ho`}P1 zD{E^94nRt97$CYBUH?HKu3t#}UG*Ck9#7$X^L!rC<_FI2nCFw5I5)m!)D^X9cNc2f ztnup4dw#ue-K&dHKWlf?3RLK`2m~)FqwZMS42wtzK7!Np>az z{jh>^>(o+_Uz|FP#a!DegCB`DRl?_0t@#|=fNyzZ<{h;D4-)$lbH9r?#rZGbi3H`Z zid8-p6~N*0W~}YnUA#JPM2Ak*14lqLT~sI0oSeMyYGczkT>zl+f)r^e4aYpRSSxnw z{!4HzD&i;Uoy_gajIC=tJbA_48(Vp>GC-JEN8tNGFwpKmVG~G2(R|91S^oAxtAfeb zL%pL9lR2l+n-*FYIwp5dK>6HQUz5jim29kxK5u>1g8g^7#xHKp(04~34Ywz_jWyGr z26pN8w$}GXaoQKT@E3O4-d^96FTG~lX|PN=a2tV0XIH;zdv=N6@}J8O^R= z_XyE6Y_Y07!$R$m1TEjQ^2^U0V0smR^Y0VUe-iwuIPvfMp#G@w7AJF3rcsdu4(f%T zjs9NfIb7U-552{_t^t6~>MLxA?k#+N_e!LDWZ>gg7((|9ju} zpnM(9@9h2D_#lp-^K z04SrB6(9iyQbjIMK~uT0O#lE5M0=Xuzvr%A8*CD2(6wAKTk2S5WzedmPM()yyngRRX z@P7B6-v;fUFN_2ByncIIo`iUJxGf{bk1d_6T1ow{cs!2KP+CU)t^K<`ea-}UHm&(L zy(fQ*-Vfli5xj9>Lo^co+04e{F?*yi%kgNAK66goX1hG8f4hM#yBX-j zzym*GP6pa_w4fFuE>Oht;KOw&$7=S&Jj7!H^-U zV5#B70$+oPf;OKgb7H8X|Q!@t10u6U=KyjP=oZtWGw9N_e2Y@*cj2G4Y@i zcd;_kINWOHJqVC6Yn>>TRwdAPCDgdwM7s#-BUq3EUC3quD$A`p)ADdGy#vtX9CGes ziz6Wvk)sj;5q*)y+5NV5{8o`n4H%h$V>Ed3IPxv|49&vu0AA`dNXiA2ZHXD0OoJ<2 zNZ&lu3Kp%xdW6h#GslGd_|Z%Qct{PzWbH7-EE!gdu06(=9cajg@L_SHXta?X{_lYy z(YW+3wN58%Rf*k$Y5CqjL96NhZ=CApBX`ZYXMe-NWg8-ZJ`b~R?5rjvU%iBG*+%8P z@j(2X&F%gV7S*o_LdZ&&&u@2R=I=wJN6h?)ZZ@vA>2%xVP&N)$g3u$Ly^4F-c2kJY z1}sVa>@dXde$bF?odLsJr<7 zBI+}js86Viucwi=VhsSvaK4PZE003+gwunRUhd{!bdfStSQ3hAbHVuuI6(|~jxELC zG4qu5`@%vyS1 zcj0$-j+q)>oTSQip~zNIm2jM6~r7A?d|?!M)+P zz93J*Z*ykJ#EwfPycYJ1xhhGyq-(JjhTG?n16q%XusDlp{M;)$YNj^F$~aT9e7r54 zt9!fKmXTxhp9=-`D1-IXHAFm_FNOh^rYYwVl-xy+m~`_z7zg%FmGHfBmfpLJ&i5LK zi4-Q_a=JSwTg8u_RM>rVj=DYFke7nW*BzMNg5a)xB0Y_b!#PG?LJQJ)iI*vNM|!lQ zg)?NrD?;V6;p`c#Q~{+D5;9Z~tcrk}`w5fP{D5(@tdl!&=0Xvsx^=Tt-uEXaCZP3I z%2jctOXNPRD8AxxOzK1l;ZO^R+p|4Qr!G~HHP>bYXA5=gE45HqcTQkS0PtL261qQS zLh$mo<4AA5u3G70SVNHv*dRN6N}6nwV~^xyL=WR?io)a~!00v(JWGMnPN_4irLlpT zEZ&*o5GK;8!rW<^ZO1pd6W}AUHxpFzCuyu#&sxfcL>8 z^`V6*4)PscVUTPy%Kb7#1FCG8OOE%Xl^vH>z+FDYFt<;pL`dGNx;R;S#?2~4aK0Kf z$7#}u#G{WGiLzG26uSs6RJjE@+C7tqRsHB}6w!G(GB^aH7(d#5*eT-r zpwrZ9bU`fRebyP(t^Pr|BdF}L)V=JErT&1T{tOO{CIaBD5e1I1wWHmJKL&^>%3iDQ z;;KffY3}!aNc)ro3<2)%d!#WZ4c|x~8?ZLu$Ieo<7>_BtV_(%T-b4;IW-`C3-Adov zBf`X?9nny$70WpP#z+zs3n%;bHRpqPo%?kc>i9vrI8NxM!%Q4ICh|wVcyY%rI5J@f zQy(WIPoluc9Qtx_@#KN7Aqq4X@fn;djAs3ZxbHN~8HD4#U+Yj0IvW@SYt99a;oKf9 z;D9c{Zq|sVTxw5s!Cy{*v+pu81il)}9xhscaftLOiE4p+4^ayz0jwBc$woBX%XN2P ztdcYrtg_xpQypp=VFIXzBjDdbUHOdlcNS{N+_>H$(rQovB})#r=SVhF`9RFb5`1dl zDPv>i`IOJnO4y%FdSn#+V<$!-5AV7`6o_eJ8Bz{#?!I8za;!)bKM_CD#oa;N>H0$f zUW*jWPd$sD`%LC~OUjECOz>FzF{`Ah4J_GWiyCUEF^MrT8VQd`sbXzamuFlVS#GTJ z<&D9E&?B0Z^P~PdNRf>9K&ygw94MuIkDBqY2@n#1U>+ z(p*g)Tu^IhgJAKSpJt&utox#?45zx!vgkdcbg|lgX_7j^|9``c=V3?9lnPb2LNbFM znnRX~^kl+J)Z5UC@#^ulaGFG9I>>eJWdR0n72rK^@9x$n`g@Ed<4VHT21OBAqJgN} zG&Z^TGGzj&ZB(^kf;Q$%6a~eLI2|Vai4$X%&XSdb%r;nwl4Z*7@)Sh4t!VN5p>p)L zSFve#>_+!x|B}B6xZv^Gc~@O9`C9WlqUWO0cW^oC1(InQGGO65V|o4TNKwVV?WNb# zK$Aymx;ro}lQzAEgms?##l?2T@bs5%WJU2HS=Sh195_*n9rkC)VyA7 zNJzSx&>+zS7SAZmv4Ia_Lcu`aL)Dl=L)6h-`8>1E#;Ff+ordT4m31|`tKC|srhWd( zCWiK%-OF7&+9f}-;kVI4>>@O<60>^?H=cC#>%)=st1N}b4uVptY;RI-jb}f6xkXB& z?6e62X4Y>OoG9nSnMn~$S(hqOMJarRRMgoRB=k_TR$rT5aRc5KkMGvtmh1lK^$vr3IcRs>X9&BRi|F_o^Dk{)q`d;HfC zXjy7ad23f-LA6vrW7w+2(x`T)OwRv$u9Z;je}bVrU25UcimKY3U2`I9cD?o}tYdC%Bm^tiC#a-AOP80lsPB zx0(~JkgEKEXecfB>Z{>-=P+awtTqxB=Ds!?AobQ{9(*e66c*BTx)#g=?NcIsjcG18 zUC%{6Tu@&O$T!Gi<6YDNVvJ-e>yetkC82EZ3X>Ud@m(5VvNBSbdLrHM)O(QIM>4kh z>M*Eh2ysC&E0R&Tb0zmE;z~y<|ftb%gs2PvvVCc0X7Pl3OT-2k1)SzLXRgcQz49@8&6?zres0d7?r^!l< z0rJHjUgfXcL3)NCCSiy0kH@Avcz-zU^b()X9$iH%6|)#%b{>8|^p%MP3q+$G9(eF} z^dqUvy*||zk+!tps*CdFDLJV}r9hrjv^g|lr9!4)Q9!@-?aoAxZA+VK_^L;&@er|VBt0oln<$0e#3%amTge`RV z7jMim#*2S0S3M2m4I)5Py~3OHS4VT3hhJCc;y=cxKR3~-&pk)Np0QD#a6oJiy4@fp zWKSXxVmEEH3TaCRSg8Ps#(7UUTe$Ev`&bU1uICKnAqbFyMjpj*$Xu*Hck!G$= z{TiH7X!S8=!5}D_yoO?EW`9uagDuhkSdSrT;*JM6s{Rr)j~{`Fv5=j3lvX8GNYmF^ zIX$)3=)JLZdbkzO7`?4HTf{_UG1M-^x?>9_HUV7fa4VgXZ8KGr3mD5t{4DP!rs*Sw zdEjyk)FQNyYC!8~#w&wX<~c9b1-i=q9f;lK+N|imfVlc9=Ffb(Wy{R76g`?aX;!6H zmcaY@N8jlme=z&~L+|yEzt}$harduFs^qg9f##SE`z>@TB(dNWnJRP2F6&BO7Qkt{ zUus;YIpYT7G-Wwwy&gFMgF3YEI8iIrZMN;9goojV8TPRHaKi;Zc-lGuQ|6f@kT2aw#&!yUTz{DtHzbXBEEcIbe>B&BHjx2V`{)m?OH zntY^ZX77HBSxU}%F%omqV>aRbhD3Da98Z>W4K068>aGouq%L`eJru6c9==R(%%i<3 zNK$u;3h3C{cvIczZ~Arb1t$Q+HNlX&w`}Sx^vv9y^4eJQ`w>wl$}yDp%W4t_f*G1W0l{v z`l18^?sUWl*$*)YYtXmVfNDQgx8}KT5G0PM>N=|`)6 z<->JM$X}X=&P zP(f23G)({i4M}{P);Qc->v>hzC6|jNmhLs$lWn-xwY+0X9?aB|#YrVfl4E6N;>D{q zX67ozifh-g{4zch|Np)3W-Li0w_fhH+mCs_^o4{*XL*1M0^3e5#+}^CHIhe5ae@XUDQ^ z5&gl();<{i>YvPiYah&iXX0m*Hb0Y(C!dcm@1Kw68~>Y+&^Og5uaC3mC;Y(vf_@x< zzqy9^ia((5!VsKq{=|QzwEGlEZ96KdRXwEVS|?`3Iuo{(3_7;cpKNgyC2FfrTFSMk zDy1M7>Q!52s&ti5l&Vo%Wl8_s5ApqFI<uUxDC1-m{(IrH{9;?Z-`vLNO z&tnsfK1?q=aozoYx$HFK?7ek%87^P=kmG$i+LfmgdXy-qR1P-PH2j+1u!jK+!p;(0 zcM428<`@07-b({*UuiAoT*Q+PK9lUg!jJTqOCPkC9*A1TELZEiYiaB-#;G@!`4g>!%ORErM_hGyRb?CbJ^v=*acl{C__N)^_srqmo!d5t`K z?=yvoha~J?UG0Au@!{4-DQXK z@wZxd4kK%c$-e$2+k=zwnNS;w4lQRuI#eus6A!xa0Led`8YRYH&$#Z8=$IaLhHhec zl3``?gSgQXlS(1)-_khGch982^FH34Bn3DW5K3&r6&!?zhS)U%oiR$$BOuh`PokL< zpc)vfFevJ0sC@zym2R*4t zN_F|!-Tkfm6SZ-trd$+pLI60v^D_tW4iF+N!2iL4!_epx>i=n8Z7D%Y{Y)~Wh*NfB z-~ve3@a;I3+NE1|iBKM=X0^Lif&RAC>?)?sf>2tJGVwXvO89_Hws#tH$JXz>)9kk7 zd#N_=<9HW-_N->`zW5W8M%5C9ssVKu}S_F*Xho#*z#e^=+tt!BfOZ+l}##9Oi>C&<*Rl(`@%7 z&I9>`7wMUkYA=TjtJgjBQ)Rp?__$AZg9fK~^T(O`gny()@*n*BOYh8@4%cVJvpbQ0 zTMVWAtTKUyv+CH{SN_;#?{MsY8v-wG2drrxf@)MtgKojL{{V1i9+P3rP5(&Ohy56R zFY00RzxQGEzom!L|M`d2GQi{VF#kLaD*l!qnh@K*r_zG&7CUCbJ{HL+n~uKdM(X2C z`Is(dp?p0&#BzV~;Dua&=5RzuYR#$(Q?wFgt6>z6IHn1M;X}}2%)pGzr#CxZ&u?Go zai1eUdE2);6WCpQOhgx*U^0F7@bNdBe}LQHR7FpI7eR$6ui|tOcE1l>=Wqxc`1F*d zwOd$P?=p~Xe9R4oG~c_u8&q}vM%*Dqd?8)Ib&nKvUv}rjU;bGW{+Ex{#OL$8bT}{e zc-V-4ltT2HybFa$A0gTQR-?=QhNKnZP&`B)Mpmi~OE00~JnpG8f$sm)r)7NQTZIrd zCH9qX_<^AY`~TpKo~L8-svH&jEm>NLYxV~#V`pS7ef?8PgPV;55LOhxcN}_4yc?i` zoIL#d&#=P!s~m8Je8XHOOq(iGQmufvUNxvelc~;5PhmRdR9gkOqO|&faP3LrTh^!r ztS&DHTf!U^(f!H`cOi6wQ9a3K@s>|>qDrFkZ zQreVNC5h?LSe1jM71ym^g2cB~Zo;#%>-#CutQK}Ql&wWrEW%nQ(A+t!JZ$=FR-CCL z)2Spa1Ws1429?$zR&SBt8(c+Wa$ALCf!!+Y_$!SE!Di(qlHH35w-Uha@#4%4qz#mW zvuBqphOiWyGwrA(&TvM6djg?$B{EM70zrAa1HsLPQGjLImO{9BwE=Wbzw;>?8celu zyfk1Wyn73T4M2jVcIk!bX>?`-FkE%~a6r4gfU{BZ!WIOUWZWDNt_*9B8nd{bVUlk< zajUH}aUjmy#M5^P_lX%UmaeF&+{0aN#{GTY|O}lUAKX>-$2zi?F<%wb2>V%$_v!dt++f?J~vZK%3n@r?Xft zkG~(X02MK?W!extSKqdfSX3<@G@yyx1DN59+HIFNAG|(NJ9A@x+-U?|%Y=`Q8)Ks& z!u7zqf&f7Ac=M8!enMo^RIlH>00A27%|4KYo9C_vD0{sd<% zQf)ZIc8%BQLy1WO9VOD4jF7Q#8S)_{MbA#+VUM3H*}s+RKQ%I*H=n?WaHJHohTy{x zFJC0+rhRWI{(T^$`);uLv$E|;UCm-KX9IfzyN%w_p{E~lfS{DLo6 zCq?{%4=*+B`MIfoi<;|yl2%IA`q3-H(n|WzPlu$J^qCG$b1P(u&i8NVX8I?a%=wv9 z4@4_AJh_@^F-6ov=hFNww2F!u<5CHzC_Gt_Q8zVRhj$Fy9*=-|4VP@Ry_oQ=8MrZ&2D` z<4F}5!&0s)hu!i}f|;IMEAQi{9$~QGkgC`EJ^*?e+w^ePeVWhmrot)*CQ6HAr{Iv( z8CJD$nmH9Ey0O?j3bdo>{E7Xg(0US!C??|Xrb z)zWho^Dh>--e@k7uN~yqcK2Cf{Jahx^BwLEZh41X3hTI-eb<4c?PpYIRhs5nyP0z^ zV#9hnNjL_;);zOnV6r`d+!5i@#b2r>lmA)Dh-4B?Cx~hIr3tTPYNoKgP#6xT%EdsD zrJD_j;}xuR62CL!Lq>`B8BwyA47ee)^0PtRD*|tHuse>Lq8^@t)nOj7BSm}GHYL{Hle)? zRN3=2vmxF^=~LbA2r)LRPEsSTbL=pqPqrzD2qES}xM4L^T25{N>DdZ$1S$vZWgQO2 zi8e61m5?Q(nJNg+glY$2leH^aRGBimU0&RWUWXP~;>(pUw<8@JoRC*(WsjL4;gg~y ze=;f>k4`iFjokWDXDjm2;s*j?KwpRLjS?q|mfvU4@tB@9MNx!^PlDERM_p7Wrv1eW z)_VGW6T-KbnFv^o3sNJp6g&v7<_G)*lk@`?M8d`O1`tK(FhB6%U6}ZLp?9B{E*d|p zU}(VZj4&;<<0Jb>44}&J6W;+ha%T8LqKMG1zB*Zf_-O~sCG8HSr#B)@_nsX*NuP8> zLcnRR94;l>H=Apt7r}eynmpfjJiL+QjCk%liSQMA`xz=E!7j)mQ1cQ80i+d%LQ`?)Mql5(%z^ma zfOVnFsoXan2W?fVmRdLt+y)TT?-4H9X`h;f*PpSYOdJnIO{0=j&LgQw1Y6r(xa>QF zfM`+l(&@-To8y@CJ!^zCBws&>8sc;J5=cS-b||Mjlh&_jXUe9vmkX+jXh2)^$4i{FC92YN-TX!=r>gs1o9Z8YuckgU%y7hAnbFU5|oBq$y7jU z-}SVwm>J~;0!l$SHM>+3oJ(}mpe?XYp<9la3nz?1av%ycQj`_ck@LxsA5mIa7NJPE z_>;#qX7Cn~O}uK^g=){e7^kO-vFu5>)~uwuG78{`lYfrP@FRJoZspJ5FxRrmya;F4hgH)g>5h)u~>tH z${Qs7<{AWEI9ypU%nd{V#8Rboxr$GXg};0V5!NCwkyPj+k3$bc7|KPUkRO;^7&dLR{w!eSrPzjUmJ=a_Y|6fPP+^u@7J~sj6?WQfW zJzS$#hLK@&Q5<=WNq<=>6qZ#ZAs#o~MM(cGmW+yhjx}%Zu`mZ|j89<+pz+8cD>cPQ zmxUG-XjrRRYQ75#5XBxbP}&0mnAUbu*yAbR{FMIy16BtnR4pr19O$IV$wv&WDF{4Z zlmjh{q(;NWddnN3w_z7Z(agtSAjnu0XQ8;@Y1yWUNiyKUNUM#&#<)mrlndwO*!Vaf zTbZ=auj`w65goblLG=qmbP>FfOl7fjAcm9;j4>Rrj?2r zQlOEq$K&Otode0+a3|J{0x$&q5{7<_Q{fB|v7>TpkVu%0Qw!xDhjj%KK7_4-HOEN8 zn~1YHICKt?NW5EJjko~`yUd0VQ2BS?8&A%?yt$(9y6{!^kJRdP2ewLFu7oK0tI;w< z>h!bk_xK-dY=Z0WywmJ~LyUCCjmy;C09dF{=OTCX9_hU%>2}|caF?K}} zvqZ;`{>3wNq#J%=z8Vo}OOYdAz*Vx%gD)B{wKTwKPg%JBICRSr>I(7_fKQW1wV{yh z-gH@jUnDU~ZE8%piabnCOR3d4=jn7HN+Y5^HX(y@q~oyCj4ZO04h&Wx%fv}95g$|Q z`atpiHZ#yzB=DRSIVaeoV3n$@Hhnx_8;|~=e2D*kz$6weY-lwtN-+QcAld)`3{_Ya zAOQ`Zf&&mi&-Jq@FfQFK>}PO9~{P z93+@w_6Ha&uO^NXi8PX;Z5X}~<>TH3zW{H+AK&}l_ulu3B&3o}CfiRNc-zd}nU8Wz z$+I_PlF%rUSw+!Aq6#RRyKUXJ3<807fxHR@;9J0>Mc~`SyecRc;MMpgc(c4c+Q}Pj zLFsh!zc2Ssr3>o)NIfsN^~{gt{?|w9f`5m~Qa^{qlm8EeG~~y) zkKCjFSu(#*Y4lU_qsOPNu0#A9e;*%R&gK3+J#~L#NB%uOGCxWG>J$?L4)97JnLne^G#+=IfiL^ zl9-^mr_g3Y5^2z?YL#WPI-a`n7&Qi3oWZqe&X*%ygHL8_GABxq(*~$!B-NzN0rGJl z&7U!yW+a>O|2e1BUWF0IS2RAiTR_ugNcLBlY3s`zyYA`#=12RM>|i(At$M}H%kjTb zp6C7w0*r%6VqC@OFCwnI<^QX{Shs<@+cm4V^?sp^xqZ9luX_U9ZQI;hy~}s-1TwYT zRxH?C19orVTVmz)uim+_b9HOY#w?-m#;=0)ukG5uf-i5qfw=JF8w)gPFG_PJrqw!2 znVIr6*Eh1n$@}HeGrvFabVKkW;d?eM>|L#c1X1|fzk>955F=(vIBGOa-5}IvG8#@x zA<5{qPFnM&E*v_O66na3#`$UYo4ad|PgaJoRx-n$)iojZ)Lc9y*-QsnGgFtC!%~?J z>RUS})9zit;p5mz60m7A2^WXTk*_H{ZdF6^*_8DUu&+9==}5*k+t(|%vAKD(NDDu; z?RK?ec%DZKh~6)rXp=JRVFA^bjc1;^#70h3>|hP&KeU&>SsumOiCEJ43OpC%rEI| z{eITFoyQFsY|AJ7X>hg!4;>h}+XLe3(UH*4`uxoQle{Zy2~28wlNpy!lTXx*@adD; zkka&})9~r^d^&y_W46>NS1{*qC_R?J%cq^6-QZ5J+4PhoHEB&4mvbd9In`$U)-TP; zW|?_(sjo1$ZcaZkF}@^$C30x#lBY_Q{Ve}d4|MY%g&Fs84h1=yEgeH0Wdw4_q;7Px z%5gt0yzT#EI(s5eQ%VBU*_d~0OFw7%wDfVQOi@D-PF{^BC(|iVGV+K!kW#1d@%$|s zO$vI_i$79Ski>`5haF;F0)w}UkKvNZaH5*gb*8G(r7WVOJ(?`)RXja|LQ!Zq`ApSL zKmNtPFSO2O!j`^7Qm2&kaZh--+2u3%9DUu0SIH%%_02(fvj5!K|6ihk*(_>@T4tg9 zo4ls8dXj|Cf*4+q%u%76n5wyhzg;mzK=g@}@8T-ao5i(|o*t7a7)OWa6UT z9Ey;%%zZW2mly9bei~I7L+K9DJY8WvWT6J`mVTo0{d#z+uA5Vl0h#RUqnHUDmoz9? z{LP;Js6S|~NbnK=Ti@$9f>phnk&jB?lWi%8rFwR&G$x(uT!)zR9`hjD#HL9hu7|(> zjmOBi_E5gHiL6eg(Q*gsxchGHrp3j$D-&fM0c`GDu3tk?ZnniLmoIEZt!rkqO*qdp z4jPI{wPvc85!33@MOf^;Rz51RO0N2XCo75;!f_W)i)ioel-E>b70zT*vLKT^Eh1e)565GSGMKNb4^B* zGM}$p#MgZeBHjfz5*9td~zh)+|3yHn(A2Glx-b-pAGYgYXbf)%uuz zx9I-g{#`s>x@xBr0i%hbEaG$2IH}W*^I*G;L;Kk{mr@Ja@A30b86XC@$I==+vwFDy zOZ0yYJ^7*Dzk+3pXbK+>_)b8@X)!p6t}v``}>hetNbwBMjhyIrP(gvOd{gP z(#r^gx)}6mMtddOcO)P=VQ7$__S(noch`jyBF*{vKb)Zx4C2~;-l6|95Bc9Udd18Q zb7jmf&0)~~+y9;M=Fp0C5M(}zt^^=ZX4Nw?QE&QUob9amw9FT`8!`0AaYuJjY0vH2 zxn9l&@8Ik9G!BWlwe??7zK!b=mBNcBIUu2T(7Op zEk*EiN2%1u@Sv3_%}}`}C30E0Z{S>cR7vxGtj;7-`c8E!X+_G$mG`4~Ta7>ly~UyV zS(}@Lx}S@^a}45PS&NTw}hHqSqlBCGA^zuW+8N{DvO$*$iUbe^4Vym4)JStcCjgdth7htcPYn~*1et8-&Vf0*SX z2z;@2&(B@9E+~x+flCD9gf$H9`enLhsns9{Y*cR zhl%f*ljLFhb+6$6;|~>E9=0AXtNm;{*i`^OorfKgB9V9Nk{JY9NK)SftpN?K6dp%n z-*PcGio>iRb*xfh#7?~W3)BOEkVyfc5i>#gN$?=Pk?5Shy7Cx6l;uUURZ2SrT^2^G z!a?~-nNL_qno<4;kE1%oMFGq(Il@5U)5u3ri6A%`vXF3i@}}IImR{xvbilw>I3ppM zt5049edPpxG>G65V?hXK+b>6D;755@;aj9xe9gp92Xfn>@0JqflY}7V#xM`;ShMO? zMU{8X^c4@iJB2O)mPuEW^s-HGI(7q0qpA|>ld3!446}h^+LdG=M^_k(PW>mXyGuOE zG(4JrHke1wfwQt{?D@F`q2ruh_A=I*y!2P~|6moQxJ_n?Fm%`HMk z@yL84dgvvyt)tcE#)JYg5#hdo4#x4vCis}GEby6Gd|8(JwlI1z@7o`jql*aP_pn4cHz*zCuE7(qk!*L}O#Ai(SX_hJIa(ucE`H@R;B30#+^hZX}hOUICU z7+~&-l)=vX^GejpK(-J9#Sv=PJs=)*N%)aAR8WqO^fh0^)x6DKuQQw($?_%?$|Dc; z$do~v*WZyY8Vu?S)P&p@nh04Rwkc}Loh3DY5%I_<=`%(Kw|_i!XbzcLyJ)>n9Cv7b z*zW#l?vogP*zUZsPYaHS>>b$C80)|Hj#or+Jh94gg8!}-!Sj4jwQ{Qy*3v4sXsgDY z1PUs!3b&W4gj>N>BB5Xz-y|#uWGrze9uWU_V%D{@S{zS$7Q`N!ohMlTGspsC-fEA0 z=RNZ*^*6rq9{JLH=Oyo*9GUZu1<7UJ8LW!-jZ%F98{vF}fI2M3HN}?_D(cW=UPB?R zN}~5ll$iqZPTx+Re)>)!;)=n=ghl!D`_4M-7n9b^oi&1ey4b9*L0i!+2*F_02@QQsVxNaiDTV!CETc|* zCJb#FSXLfj{IkG~zFdLqxl| z^@#dM8%2VFYlJpSW@{6vFF~hX_qn@bw)VxE-u9w>Q>yN$4M%|n0j5*bG!B#pH2Za~ z*uNIO)oaAaoZ5B~?9M^1Fd#tAoKx+FXdk$rlta?HcJ<2b>~3Cc(l)DG?lwO+qk7)k z3WcRO`VyQV@83PZ?t&(|F$%a<*m;bsO+c|Us>InV6KuJ5EtRgUDwTfgdrlGP zkG}P@qKMuDd|#igB9|N?u>}st$YI#A?LHefEqq{J6R6$s0^5sqc&R%vQ{eeGGwwq; zDNXqTZSnGd4y2U?bl#%&g_d{gxSbA77hHUuN-g(1%=|>Y_6nQDAu;pwWrGe!y7?{t za_`qosLnxN%d86lmMbz4MWD+>SQwBYJ-DGI({lXKr^7AHNKoFLNvUkk6i5B-J^gBA z;a^2X=u!p4;?hRMccx4g(^$RItX|G4#e91DOf?Vu!o*?0;d=Z;PX^j}sLLo|3NlRr z=Vv`_MPdQ{rCTbE+7;!MF@Xn4VnTH9-t!<`9U`f^)w9jF_Y+C7B6xV5d9)t0x(Nx< zqt=D|8ZV8MT{xxJar7sC2|XS?Zl;amwQ#xCV|o#M;VTz!mpWEhndntUBa8rQb!Q)D zRWPe`C!?!3IHL2#B9s}`W}?`<@+rv?@*?@FIj6Y5Th{T~%cG>QQAtjl&c9RjxrI@^ zZ?Gm#g+fvnkE4jx)8KmLH69!bxMT2L>v^r_O_?yDMLuVY9om45pjrXf#!>dkmEPFEY=~F62MUNqcXH&+b2Goa$aq?9r9 z`J$h_F=-6;N(?eXEaubx=O3EPn!2*3)7K~@r)R2tK$x=+x~~21*E%2fPTch zXu2PNg}I`^EfyNIS88Du9*V3zS}#bnSf7mxqp0b9^e*O#exs-PG*k5+r@V#nXuVUj zkk4aOeO?_D+8oJugGE14>u~iE!uS1JDjC)sIKMXw#+PB}`7~ZcFO4q4(u>j5e0nN+ zj-SuM@wMDN4qX(^=%(=X6RwzXJen!AF~)Z!oysyM+qtl9C{grs1k7IOD7i*HkpKXD z=OJ9Y=a)eKQnPjzEZ;o=i4(o*08LV2;&XKb@(36?5|cn+r0?g914y?(MfCw#6m-!Z zZTwwsOO}?NFi~UEyC8)uKh^n83|$HE*B>%r4!YL^o%CkL~yGHm-e|2;n!70hD68Zu!HFzH(?0bbd+HDKH9E zl{9U9cbbxHn8Q+;09c-qb5S|FqHt7bF+OL$weX3VP^7AK42u~UF`rXSoiGcibc!<97JtiUoIlJc>ql#YBB(}0^@kWpXA@8Y0~22Fg+f7cRA1_H z4Y6OwL?So<1>4)$j@jnF(}aPGb-S0VTW=`lf&h0y-Lsf<*T}s(?{#q%%^2FKT7)79P7~syCTSmmKazu0qb_Kp(?TQkfD~MngSOow5;+01=J)q`2G4bB>8ot!a!&455{z;zcUb zod*G9_1-aiaW%2(-#(feoA^fH!%)C}8WkwC}{=(f=aufsG&B!rv=Ph6SL%+X zOP5exmw$o%Fz`ps!B7JU0YW95%$e-cB81Z#NpmU4X_}0F26GZPlS~T0LnloUT^rRV z4mY=_K-84OMI*T;r%`=p06Rdm@>DHig`J8=2B*GVTFc_nZrxjU$seReTrKWD>bYfW zJGl?nem(!RTwmHQFXtB*kX>{}Qy8u_a@FndY7+C46i$6Sg>jAWnjo5r$QQv$1g4qG zr-{lpTLPm@gC34~f$L-=%dG@#5)fiR~{J3)0>PqoJ(!Z5y<~*aoeGVnPxb-$KPg3A#4Q! z?F)kwZUXXG*Iq}9Pdev<5GP(f-EQrYjrs1Hxo0F-(zrs%RY8cCSGF^Km`_F7`F#lM zAvWZ4I+@PP%@UC`mPOaV*_KDniFI9Nq*#{UXLStexpum4 zlndkB&WG8AE~h_<-f*|M*@cd*0%7uVyF0IWvB78{P=`<43BX2;3ycCxx7|Le-MxWU z^eIh|A1a_^>qF&)CKk1sKC;ucxJ{I1XNzp6%EU~d?JDVh6t|ZDPjjccbR`(BB^}q& zj|kkU9x9I>iLq>yx3^{e6SL7FGwLtsn6s$PZd<`((X4hO*^TD`CCZ4ukOO-6EsHOJ zHFT79ynP7Cd=yBjlT@l9byPp%<^$79J?nK`FZpvKqR}6JqP@|z3V-CxT<*@IfZSl; zX>rFyLOvZpw5b>`TK2m|$IyMWqMdOGY$t4Q;)nxfL(15j1*e{#KiRefE#ePK}}z-N(qwXHi^ z)!UnKZCJNrvHqf^_kBan!&$Zl`?xD$!FZvwdv3L(;oIK*Ax7iW1MgpN0RSZgzZXUU@ix)!5JZAM`F)tg_`^<0 z^BFvWN|`WX6(!^)ElFiAFqal6YA|Rzj5J^<6epxwNSZpVEYC$)v5#npUj;A#-BPUe z}MaMSDl5f%ON%r3wkzT?yegI&cjGCntS# zW$xVzCELol5qbDR1k0tOO5+@Ww5E%V>9ZDC#o%lNFJ6bU*$kHuwj z!n0e;Y>&syWyf37Wx)g^KpA&hyMKnu@-zMkem{!M?iei{K{D|{2U0VRP>hK{(eNHI zS--#MZ?_y)zV~|m4)FF?x0LL6u%W2E#_Qm*arb@9;e1^Yms9*NA2(3WQ z;vPA5TCM;4P`~qNH$9oY5yRdc(g#k3jeRd|!(H1L zJ_xsTbl7>Qk)$tg60ycqXF;1@{H702Q?Q6k4s(jm{~eCC_N!a&HcVuCi;q#qiy`vG z=-#Nq{%Fd6NYMOX+w=o=_0C-hZOPyH7iZ++UI3H4O|a)6|L{vZ!6|Y8y67`LDBOCa zrRibsRX1P#2?lhj4+H9o5Ag%+7HtnGJ~*UT_W_&v0hIf|#{6Kze4xLt@q+*UqjJdP z`5g#13xKT!S1onkCX# zsCPGPR^HgNS^L*8p}W{F4n8xfx+iHu{N$ccW<-`G)1g<_5rqZ@yn%exPEuifp#$mp zLI;p~56nMTt5?9?>;3?OD7S%}pyhf&!$HysIz1>iWPrl)LsdE%z!gFgIQbO~sWF*! z%({u!L?f3CJ0YM3uKR&L9*UqBEElMHxn9XywI4w}0qTrhdHD{!`=yx$Eag6maG7k0 zjT{t$QwxvT=6|mwOn700(pd~UOBBaYoXI&j?+y|7qvj*+8AMDprS&*1@(3yRy!1Mz z9x>|Ce#;yVsCb@_++{>mI^<_&6@JV72P8qiWHROa5X(V>f7J}UaKK0_B?AxUhF|$$ zS2E{v)oW&!-*}KWsR=V=0Oi z8KpVd!~Y}VEE*I&!#Lh&>|feZiQ1Cuf$U|9t~Wzr@3ncst~s>^0@Vy$r?)+jC{AZL;y=nW9* z88kiNMISRL=jZ2|i;`~=X{5ZhmpEjS*(1Tl8P1m;j58%TAPbb%DPwoebeq7=?)Yog z0X?RTlU&(E#!dx{R3@aLFKboL5~hB8P2%DKQ1pz&dbzWO_?h^HUG=#?jV#QXaAwgq z6Mb(__WmtAQsio;H4_=58kvToG~)6uVXT+Ug5(ts?_|cH87RG-{XhI)-=|MDW}(;Z zYx<>qhK#mll}`><6pJEB@uZVuiaT}a$X|c>W*vl5IxCMG3I;sa?N68~G)<~tICR>k z^I3}xwfjdZQ9=;8TX|#MBI{H^2&%$@HA2TiRgR+#*X&yrbY&&ylCA|le-MMJs?j_} z&pNKscwEPuTlwJyujQSNMZ6&yA#_>>vMnJ!p!lr-=29LMY7=YLkG!k7#yev!_I@sw zVLIU{4V9TNR8ca8;qa}$8oySO=b_6WQRxLDII|Ojb#Z^eZ0da#Jh;134ox*BkNqu@ zF7NWKq-k7hZ6*-^V%($Vt)T8Jh#|EW@vbaLPslDpU6kLST4D^)aK=jF& zP8ASaI$fOklBo&1G=+KI-J%62_;j6x=A%kX-S(jF>?s{ zin-K-ILbA|Zc7xzg?53~sSUqTa&*x}N(5)s^a?6=B~YU}`s}7n&?^(E6`Fjz3{qevHHv_`!$HWNlax8nJC|r=01GArXW? z$HI!kZDiw-)4@Fy-6t9P>AFtE{f=8w4|L=iLiD+w5{VS%Xrkrfo_GcUqcbcC3oUbu zWRI3;mEkO5rn1ooHjAgI$Tcdn1d$!f8(0IPc#)OTGDE|p%k;(V8Y*}sqfs0XZf@NE z43(tHZ~I21BgknqDeFov6-iP<70!20`KZ@-ZXGR&bP4nm0z1v$Q7}b{Jr*kzV=dP0 z?rhvqYxe;)7cN?EvZy54y>o1zO>7qn^^+aL!1ZV|Hj^J>k^t_VDp_!{DCUyQ9mj`l z)L|p!sTauR?zm|)%ciN@yZV0+Dp36Iw&?cmbh$=P251L%(c(=caBsS+aO;twr|3Bt zcAmKCJMI9iPlaqneZUp=>sYrH1qmfZ$NtelKL55}p3etaK8=5B=Ix7p$244D*6s+4 zyiF!A<@PoUUW=+229x`BZHuW^9A_*Cq{S1J)u_8g0;R~V*QA0>D2Pc;l_A(m zZ@y3(3q5h|-4B?@e%R~oV7WEBdysm|cUI9@z0i|CEHo<74Bq4-X0bY&%~S!ufhnr$ zP$4Z28#-QG?36V}nHxebP0YrJ6eeXQ3`PgLE;msr(5D&gYP6v7Qa#{m4)&;cb88j! z)8#tl?lyCKuu%=NLb{8?;gC~-OsezG8ph@@qL{8yOZt$(f#y!gqT&74))M& zY65l@PxhPiqs~+`hkNz+%`bz#V`BgLchA7bJP3R7vBGMuLHM^U{>rT7_L=q7YN9Vn zg%Uh8(q=B{AtK{pXJI_Ey@s=Z8x zmZ*723!KEGik2jE83va{s!PnITGJBzynhU!Xeep=1A)sYRv5D=8=`aUDsN z=8II>pu1k0Rq)ZC%@%bB6cnGbf{af}-7{2Tq~*o22=9KaKkN(Gnv~4aF1C9!4hypG zSO=Q5TQ@cztya~zxA0yRw|jbhm!}e(3zoz`JB(n<0AJ@JgK1C`?v&>8dC&s53`KA= zBo>t^c`Jp+}U#hY(6J;0#OzB6RUR^E!Xkc<15 zFkJ5Up!a%Vv!TR=0INV$zZ=CJ9cE}cG^Ye1iINoR3q$Pm-1)?N=cA6zBiFHb1&~4Y zhLc-M8mkV21YqOnLN&|C`9#yxg~BRoKc3&owL|R2<-kNn0w*>DMHmd6!83{CtXqXB z=;cZ;r0O&ol0dop=|&^TMkC2aC+tcwJc&jpktoFVr5zq5qovT)a#@+_YCRW{j*H1h zNA@KhA0koF@+BP~T2a!>ltjVw@ue5iVrbP3LW(l#@TC;Xy#q&EK+(#W9)ie}<|JVM z5Yyt~9Zr5AnpXNafZVch;^2znflc%A4x)I4i*?}YY?QjW_+lxmru~zOrnfa0fr!zk zb~I4J=$brO@cCnJ%};j(u2EpAy;OJN+Le}FU%g#g0Wzcfyu$6vi3z5BGJk1=F`f+?&{s=><-}m;fC&EY(fg;7PZglaZ>;B z1vb7kV-r6=Nl!=JiyjFkjOdV!wka*qh0=+q(}(a=S>Ag;v19EF|4t{toK!4U??UqJ z_@f|i7{uH@vQbtR9HnfQ&)Kkbp5cYYgfH;`L-L`0an}YCrwUUP9{vc_ONv9x85V1o9?$?a|3y|=gw(D zUD6jD`yRs4G!cpgcbdRpV$mV>G8(3*iql%eD9PPD*DXO;7SQ4L^EO5rm1oLJ5!5Cn zki*3lyB2BLV<3i1PcDXByGt)FdM;y#@~AZ<+m~<=CO7@N9hdQMBL}e{m;>S;>qj|W z9ArDZSm&Fc4|5~al6qEHzB}F39a5^ehaPD%0pH3BmN_dw&Ms_j-ob7%lL`hY1}iTi zrb|}jn=V8aH9pG9?d9}R>pT^shHUNJt$SdFsDdE=w)MPsiu3X36dwZyAC+X~-28je zs~_i_H=*JpF!OXc%cxGL3^P%Ng*tQqWOA88pDXRSnoSqUpJd**lVgFQ13x|oS_D(E zX;^2yZWeZzSEmmgrr=gAKK4vGe#fLrFD5l|#!^tzF_fZ;_JH4QO}j+}F5@^t>Vdc*1kT4qf`9B&4l zK7#M*`;lIuAMOJJtv~^BkVN=sLHb&8xDTH}bU&WQRqf zG=SfU1S|jxtSRlLQXywrVyEX)RFLi<8@)=dLKQA}vUPewkkY(fU@l;P+SCC>t_n<% zDQ1jU=ZZHq7?RNdk~NXsXf;%0K`4+-S7E;1=WuU`nz~5r>JeFeWuO_E&^T_4Jl!&4 znbp;Dy&jG^PgBDEw5^X`0&J$jOZ(35K-+HBx!W=}-^OD@9a#dhpabxkt zZAP012QC7_9r5RV%tL2WNcQdWXn5TG@0zEW#O1qZRae5Q6G!TFq3A@%Mq{ff1BRqk z$8yUjDzrTU{#&b#Js!#X>)8InasBaP^kT?6OR}VEAx%viEVzmnhjj$OY>o0&dmI1r z6t`42H{g!REHY?n47BV5`4!*3DW4pB=~NLqW7d0k8hV8h!wS;?%A-J|N}y$Vl7U(V z>1XOMN$x*~hB~K_U{y>@l!+D|n2mK?DDOunfSSbWe=K%z&Yzw}xt$vj*7DE!_Khl( zobxJKG^x^GT)484@o|->vUxL2GgGA(0$!r@DF#(Qvvk%KeN2>luqp@emK~pe@dl5D zrR2^Puc&H%QF<`cH6XN7ayc!T%ea;51g?M`P*?LZN@Oz#aR)D5eOvXqi7VRyuV*S$nh>NXbfJ!WaPJ-c6Gu<3hJv>&b z94k33+O6KrX8szIr%7UFayu#($wNVz^unkpcp(irUSv3^WWC=n{U6!(}9VP1Eax#)5n3*&4GuYd=6epDear7TD_KXQ`j=`JyjyP zi+-eRbi@`5NAS}Us$&r7h^9z16ZMF3(-Z5xp~m^;rsEYY8c{PHJoM@h%BlPDd^?X~ zr5z4nRODs^xeD6;)xh8V$m{HE6$;2#yrsZwj0OL1ZncYjocp&c?=}OJj(vxWvG>Rj z(kGWje#d7#K;hipcds{iX7g>>iwu6A_>ol8D5tq!Sjv?l>yCEn1G^4S zcu~C9p*bY1QKQ77)2DVck|~Z@-DT@qPjI9|6XW4H<*AE>BTiQd%P!n}BZv*|Qf!ih zNbqCFbRmO}PC?9zjDtQuKh*UVQPi53q6DONPK~m?(=!oZ|OCO*F{fXI*`l?Ca-b6+3`{7u4_f3hY1Mv4Y3JO`A6{|eRf z!^A+yqC%&nauCI^q`*MKGI$IuGz6j6PL9nyHJOn1myAopEsdgl;+L}zuy&LpTgGib zIeCye2ig5PygxEG;F6V2pidCA-0B0&kt*$HuU4P1b5wA9GH9e5&0{J-w@bYoI0lK(UEJ|jm zyvyaE9%9fX#hBZLJ0(AJbe@gzE3y>B1+IaH-6l%@&i&_qYD{(1@Kh5gPc3g>5UUp$ zTYZ``CtD{OdG+VLKM7Ju%`m&hF1J37=j-LKSn;Ad>GLI#;9nydAT^68jDE!4s7Ot& z`3e4y&d--2Kk+0?#(TZpMmA_Tx$3EjPrZ86t8ASI$%eTEW1%!m5Ti{c1 zf)u_ebZa``O!^N&bAp*EdxabkrkVepZdKv` z-9GXB`T!z4Eo^8tEuJ#~0MzgR0Gzp=7$5-&R7FcuR4!0KQ=o-S0016vgT3~Rxf}m^ z^bPmm7r@EnQ3$QqyR4K@7>UH$M+w3+Fv1Qn_kl%XPZ=vPf^q6;5WgG0|NHO0%*@Or zl8Q+tn@y(M*4upddUtP59c}3?vf1F_)Lx>_uuir?DA{&S>urMhFTVI^ruc8V{ufUi z?)&d+ByF|u{1QI*==~&g^bh%S{tuc*{2w}H_fseKv43O7llCnk(a`$z^Y+4Vs&C}r?f=Ke(En#||4KjeE&feE`C0y=lxwDg2-u{OsG&tF zX`-q$HWENS3t2&A>#&Ukwh*GC6_sHs9i=QIR+1<#l{J^Im$!y>gX!A=nGC9w5~E#P zBcWKcO-i;)pw>#oTQoaJDOn-hX(3esx)c~mY6HcUQ?jZxE1~zQ zR!vUIRC8tjw~v$cgjHA)iYQF%b~KQwN{49_(5#IxOk9~C_;K_;AA`QzPN3^IFgrM( zcAIsZ`*y9f@caSnz|I6MU%zX8&AC?GZv($YtMay-!8m=c@7`q#S9a}8)1QIc?KipG znWx+x7=I6==0Bh2i_P($&GE;L(t91H7o*}opW^O6ykNI|n@!zmwr7)&_VlI8nb+)h z5OZw}o%dOti67ytrovQg)u6&CCrDbcDr%!vzX<9-55P{kh6~LG)jnbO(xIEz=jp$^ z2ISSL|2rf7w0uE+v)tM5Gi}s5zh&X2cg_><2mIZv4$8dc>--Z*yiUh}cKbLj%`&97 z-L-yqR`|N0;^f`wWZVdXFZb=b<@5t^c0eyAF1IwQ3UF|#LBz|$B;?_}8>NL6V#zmD zjoW1s3dpLugnDG^@cH!cM|GuDMPvi}2wzdFNdbdG%cWYaloCxUiB()Sb(gb~PugYf zxwPYK`+5I24W^3K_6^i=ZS1$T16TtsiyII3-+hhA_B$L%D%?MVCc!(s}g${rnDJ_3{zb z3#G9xopn}GRH{X%vvU2W{Q7o2*Hsy0gN-DycKe~JP2z=@9-B=>>(r~wr;6Z>dGvOQ z3~M7SHESy`OeF~~EClUbb-w=ZpH2-zt$K+nT@#fbix>I(hp`{G=+m+>UoM^uU*^;@ zF()pcdCUW;dAR_?VT&|25jLg@V=|A~yKqt!-$LO(Caj=Ip?Y=Y>n5c-{91T4H&&s9 z?Dyl-!AX5QdJaStB2Y)0PxNu$`) zX=U z8A|AF?u6y}`;j!jo_Hw$n@RL!Dv8D)~?71 z(Mkw|5%BzVy5R_>f?iIO1J|{y>!_*&43sJ&fJ0OsCXG38q$lLGuP^?wX3dCRlml)}%Nez1SXQG;DE}#HU zWGsL}h_z)E7qdV?ALl}$I&{=vSRDgSrct}$JY@Hm4{C1dOJDo#Iq`a1xe$I%s zyY5}P(#2w+EK=At@km%fKn6OfC`$nVRZ>Dgv5k7tP)@$Ec<88^d{k=5^Py}sR3gD7 zeZx4BG;sNbxWY!fT+E;MA!S+JpcPG~-z*exgNq1=Y#0*A`7E(UD_02t3!#9Cicvve z{xMhM=0gI2!h9$^h_#hQop2GXppK>YAo@*(5pIQveipi_-F{=`BRPTg~Po1VZ(m=J>S^K&54(Ki= zFFXEFeekhTkt58dVI4>)&`DqDhA=|Zk$*#4>z3{=O3Fs*&s6PK3D^>jqe|3|ehmbL zhC3;w40eWFNk_BT0q~KUfC{hT{7MA}RV4!)bOOVx%*UV>38l{xqJnVxLB;F>UV4ho zT|ZAIjgv(%CvQ>h#oOM~{wVm3fFnr|w$$0H2v9{a61c)#hNol4r~G;QLkPjg%mmM; zkM-sBBnY)}qg{U@Klw7~k9RWBl?p)EOR}erPx*Y>d;PSoo}ZlnO_iPyLYcqRrM_Wj4N{yAN5(C5I})6xRwswhD~O zkLCMig@nn-#y3%5XVh`*_?mF6o^ce1;;tJVDbJ?~51j;wDOHj*wg`On{;RSBU>fcTUp-}Csno?y*{oW+ zJ@nEJqP1#Ea%uzW`;)I_msTmGt;o9F_IAugbHn3`j=h5H*Udx6R{1J&TqVH4`XMxe z1!O3;fVCd7Ob5|X2V`T4IUxA0NiQNg!g|Ri*DVlZN`ANpuP8(4D5OWBCd~pw`^Mk` zL&2(8utp1@YTtr(3sXga3Yc5yc?eG;s;O)J$||FuLo2i3cbey?>)YZn0F0?#_9^$M zNiZEu7U|Q=QE==4pg~frTna7Bjj+*fUrwMFGJACJX1lpL9$(q{ubLX?i1{MsYTnkc z2cH7ZQHtO+{1&`*{6r&oVtfA4;ivQIZE9pXcqlwE*rMT6neovpb$` zLWqC{QigfsB27Ie_Prd4bs`g!;nVfnzk$@-<*ZnErYisZYCSty^yoDFb=UN*`?jsK zrJ_&kv6HU7X@JED82e#h?SX!_knJ6gEk9cA&q|JsNOIVy8h+2MM?j=HETrO|fGlCD zK}t203FA>BJ_j#EKoZW6|DN=XcAMHI66ctVlT3%v(@l8EWU@ed9)Y5TlpqJ4s2>eq zS{>L(29N?CO;V8|*705D+nZ|d?kEEV=CDLi1nawWr&t4$?-kYVuGH9}!}ZF;omJ}NPui7I(rOZs{hKYv2;bU=OT zNl^d4LRBh?e)3W`yR6@4Yj(DK`)*(8w8VW z8o{MyU-6Bu`jT6v;?DuLjDqkpl(MGKV}bzM8@9;}Fb^sxl^>G1wx zogT0)G_}`26RK%gQ}}f94>wD*+7PTODvWx6^#veA*E`uU{)e~+VJKC((228=heEQd zQ9UAKp&lCjl?!(fX*2f&ixIdAqQKBBANegc|H*pQEnH___)NFeDWelasx>L3O1Hq7 zRAZ`VEl041qqgT()CU59AVaf_aY=xz1wFtZwkLTfNQZZ3s3Dg2r(xEwu0YjV-Mw|4 z)?0Sa)06Q09sCU7Lf!HcqwxF~f64kkaR1j&2Ygb3RBM5t6w^g(A>2~}#wv&YiXA$5 zcPnl-6o>ciy5;m48nIfIAIG?^94puZplqBf!bhT056lEY$E)aYtTmLaCxN}^R)4V`7|{y1I`9#Av6Wi^1Ih0<2CsQ^(ydjUB9%OOx`v9q_?!EA^W z0{$$xTMKmN&ky9ETh3m;!8Uk*Uk|`6x(Z`Q^nMN(w9YjtwC9|76OQa~gE4h8Xoco~ z|8D%v-K>RlHNpVuq2$y4AA$HflAh^!Eqx5_T6WY{4)V_E1b6JJ0tJ#hVFv-VjYYx` zbV41~*s{Gaq0*3B3t13|T1$r`cn4t=&u(tpS5C2Zn!h(_KzhD!1ADVafJl-}&1$jO{Jsp0%+b%!t3CVV?^Xfx&@>xg`4Z8$prZfA06 z2th*D24oM}uHjp~t+Dpc>q|{~ePkW(veT?S{ClO91CyBNul$zXX$j}N0)P8jNk}tjR>dY zcCI=X=gQNQm(_X97d!XxAEQOe^NfF;Dve{Hh+ZabgbYh()FzUVYL{n077)DP>2?l+_x@ci#dhQVHWgHRof;gA=< z8Vuf&`XL~NmsY(x8wme{(qLuZ{=EZ9NFdaPLCC+D-$j(-dCND z<@-(QYJjKkxNF4@jo)-wMx~M%_)%ZZ7NKq}r9>_ds(WuopHC*IIj8o#=5c|VHPK9k zCYcW+Hx9>V7WZ@^T!eJ z$jMJf=&F7lLL2}yj2GXBS%=v2CqIzvAp;Z{?u{XBK#W`O%ukrHaXomkTBY}B0lt9; z6zDm3MrM4zj5rh05N;#)pnm@_jW|Jag&V2TU}GXcLC}^h zA5b8`7qE%ej~NrpX)hkM_-Z9|VGTfn?hx$9gJg#2g2B?*UVIFG^c91pG|jwTGCkye zGcmkAE3E|ZK%4j|ZY>1iN-XGi6US~H(DECLbjgS^@`q4*gQ>Ih@%aIev0{lrMqeH* zMZOLE4)2?>5x8FUUvq=KYXD2k5i}6>FGVX$%z`(V1bQg&&Dz`zUmkMV=#2!Y2n-KV z5sMyG%m?|!I(??FUK)VIY?LT^Omnfu>e$^&6Q^QypopjunLgFnW6u-haXUvt zl}yg%T7Ua;uj6m{Q-(KX{%0G$X->lB&#;}GFI2}asxr+}9J7d!foqc% zg0;1LWb_}=YoL!sMvAE{@gN}N0B*$txpZUC!_k&y)Y{zcx{I#g_te<=%4Qk3yX6&2 zy@$dVlO?^SW<1>TwIr3WB)C#RKz!xJ`U^=dfJ+Na{(0chQc9v4>$|Iin!dDQKFAIWW-v{vSd?XpYe~ zI!`1tBs~=3T1*5`7SmJ2>sEPvr1Np02y`Rmq~=stTYKG#zKHmgKUcV6*Bj|W!^B?V z#$85Ak#R@63_XGjp_I|CG>?$SA`@wb>{yZ}Cn5QJ9-TrY2aeHL|7Nt05NJDQWIb28 zFGf4Zww;Pz87lr6d@hc;t z6K8sPz}~Kg90@OWmuIxSrPmqe|F}(OckeQW?Wb?gwSN7r{@lrO^!ojN;tm8tiauGW zKWbNcRmoR^_p4_gmOAd}6a>{ZT5Nve8nG&^Tce z;1kL5Y4bVIhKx)w5m(29@P=uVg_2A_FQAZNZe7+%LSxiy$FJw<1dG7rCmMU#`a zgObRDKT@QFNE;_&ggmh?_pZ+m4v*cJIhH+Gyd;0lmJA3! znvclzz9q5A+>DKm$}VEpxe@=0PCr|ibfjM{1Bj12em9&CR(ySc)@a*00`$@nSj>h} zv|48#f3n~P?PjG1}fwky8nyo-lB6?)(;-jgT&Z>7wzqC{H0 zSZSZO#Dnw+0)8v0vbT35oco)b#MnL`W@>~pA!m#e^-!^vh76`FMF|JKP|B}013nrB zRYioVAoT+%)TC+#y<}jXf{O&8hq5#ezp??hCZK8!J|P~7N4y>q8sCzTxI6pR2gV}1 z^$E{)o0uJ$JB%(t;SFhi32s*^|L1ha z`i^rtxuR{z!DdG@y&5m=i!La$7>JB7kW0h*h?F(tAiplnHK9#$mt71sn5YA$1YfHu zQAz-HI{;kLXp-6b9jd6Tx>bn|ipr@$DmB&N`$tAB>9= zBMPsQhGbU?58QFrJR9M|ae&(srEgzp)^5dA0Vr`PoAbQfHD)W*Ckh0oRV{)fics)| zi>Bgz!kd29p?K~(b@-)G3-TaSeG6dkGu@sL?MH78DJkwU>7ALf8~S1qV<8e&3$kZC zQ<7aBzje={nHVni^t+O`S>1*mafiFylpn+VW&SHgzjFt2uy}Fklq+~K!5c7Fe~`Ez z5)R`_$4dGKa{D~C*+s`L57mYW`FhUZ4am#A6yFfd#e96BEnl7p#Tsdlm zEG1Bbbi?bVC^$?=DPO6arjJ_-E*|;HSuDE;bAKv@Rl)Ik3rawb&~aI zJurIn{>=&RH9O?xVG#C=GErg?1$(~8Y4g5>FO%fJ@H2hVyrh9| zAUPWYx7u%VPm-4iXih!c#d_^T>gti_2keR4Lx=mE+8Fr4!R2$)Fq6@D{7Z-bizT~T zmt5Xv=ds~1t7L$MqfL6^04f!0)Jan$;7ST7UZqEyodyvBGUza&A2&Y^nU6p$Q;VJ&U8s|X(he_R8D~9R5b64PG;EqJV5g?S z%soV>KtlL_DEN(ptW^MCm^Ny{6cJ58sO&pUgjHNMJ03kh1E{B1jtvc2x1{|1X4vKAE?xMYCf^xNS%zw_wo+7{*|ip145&;y=_2A>60n*dIz2K zq2RW*fIyzDFV>2EOjeewM)diq`YeJplNU&LdC%A6lfMD`XkP)3Y0Q@>qCd28&V&DLFIKB6^o!krRZ zU`yF$SVEfMHFAh<_J8s^lu46R)#0!E5OgbT8H$g>$1xT!=glI&CLd;MX#giDL z6y|NYyLdST$9TP+LA-!R+Z6+Ecq7Mvlp3lQUOL})nYSSHBV#Wx=+g6-ukdC`g!7a+ zBk?l*dYwSU_X(;{<~eu^!TQI*2h45^{*F(#mw=Jz3cPVknVS>W&J&G({yB1@?z`8pz;c+ zysTJm?p;5lyb@SKg1}c)0zcvZu21fg6;Mlu{*tgLG{P!ufCwPt5MgrX4jTe6DakbP zmRfO(!X!o*rGoqs&n(a9mRtnu=OlY*)VVF&}lSuVwLg7%LOzUmw`6r*Qel{9E6l9OZpLSEKO6kODdh)}(QPEAB{^B~41SE1%I_ zkaKLfQNRg7WTsrv2GcA-?zbqgev~I0=SuHa{QW#7s&sT;bxDVY80Gl3gTx;%z4rSd zk+-pQxt_k4;^~tiCXhE-odCU7#h|`!Z%`v!5H<9SDjQ&>v{@6Qi6G#_`tTM%*GzaS>zG!~^G^3ll1+XB8%{$oVU?^x z)f8qpLcol1JKRJx_;Gc{QIEGg>0au}(*E1cLPQ3{LFX`k%#?!7r zInG@)x@E{x3-GzTFKu=Cs{^Zp7EjVa*AOeNCqO6fFcty%ZYmGK*gI`~?LOq$;OexKR_aX(++}x0govRWQG;@q~oGx>p?!#C`BwpSMp2NV}7f<^7+U`Jy0uaY=B=Z=gYI3Ty?q6_jGV4T?w}F&XY{Cm+k) z`ndq0U$>9e-18&T@${;fN-{v>)BOFnHlQ8Di%%Bu)@O6gs07n%DM5r+r{SxNntDy` zdN~m4Ls^Uz7o1vofKA@t!2IGl09ru{rK2ht zt_ECbYY5tCm_FIY3UF^`SPdaX1FMwjP-9sWa8jZieRCyq74J>$sC-1ib7_kCGaD1+3Ox?}9V9&|pV-+j%=AEFYAe%5d_!@)juhZ8S#dj>|;D{`RijpDFC_IZr()Ck)l`$rBf9y&`kjCO5W+6 z|Jqb#wQ75=4XvPZ=YTJB_jLQ5~qcF=U#@k6V$!%!Dr`9vL=E!*7cLQ zzGQ}PVN!WXpv#sbN{$+uhc#v&%UI z572cAr)1@aA3QGlW&>K=u{~pY$S%Dd^LSl zyW!YLFa)t0Wzo?kcXXB`FNH>>+k#t9gOt%hqk4jsr7h17N zN~e)3Sqh=aaB;TK?U2w7pI#Edwh~!zRzY1AV=IiqA?KkJo#LKNM&L(G*mbD|MUm~P z3=hEWRBTaWp1|RI)}--P$(p=u=t&3Dr;&Q$prXb?^pc{cur6*B8vg>rJDU@;#{p4W z5Bq^Xe$qg0xoc=o*^u3>)@I(c?{p93op>BtQ&&UzEAUP!lF^CO0(LhvF|9YaZ@&X` zZTD?FRNURLZ9{z;IHKgM!nXrA2$Xa zQdXbp=$vX?wajxV-$amY-E#vnHvKrm>rk6D;;$FL)4e8Z#a}q5yRGPTkcB_C&h^ol z{nq6RtveM61a`vJ86+-XBZN;Yh;v~`@e|188JLv+7?8uk@=thsckLDCum|a|I~^IO zt^k{PJUQ$yjYYtb|B@TLP}(8Rn4z{1r92*EhZDQ^nL*oIH)q`m?^8Dpa_1ay$pkys`=fTmUGr7U>?$)HRb*oqirT#I=&6*eqIsIW-DcFbn~u>S~oE7zLtuNCQq-JYurC z3Oxy9zIt+tYaS*Oe>2P#J6S@UhgLl4T6@E@cHs8mZ-V0uCMZZ;4PL@XbpGxsoxsZ>++_>p}d2?MRHQkoE9W;9AXWgGlEK3|(lOKhG>?&1?)|xod+n3IMpf6#=N~ z2x$~f7M4b$AV)AG;pY2H-DT2IAu?0($kCaV%nzL^Z{rRv{Wa(T=*ZLS{CYQ8Z*kt} zdL+q}r`PM~z3$7ik?q1@S*a?;-B+-ptXUMQrHd#enpG02zE0|9v@%G_I)Fl13@vTJ zml#xG25p1HZYcydUinVq!o4vE{%=#ZZM1e&FqRdZKWs(ociq+$2_nHFGgj8H`KMs+ zwYKY*ojt)kkt)Mr(;y?82&K@%`3;0=s92#`LZA*rwF>7UJL-v1oat`WEp^naxhsMg z!`QN_mMVjCnsT`BAqh1~1J%N);Jd+{#&5mnejo6|nACq{hakJDmO;sdh2MV%Ov0U0 zMm*%LSRy~512_>I{O_|EcYTBc1&dH5A*h=ql|W5oPep0-7t`u`vppMb&z6>|*>nlHNia2>*;6q86~w@pA!V3akHB3D|tPi+G>Wm`X6P8GjN zqy_Os)GQ(jYQh3R>YOnX#gdzNw6hT28QDTe8tGLtu2fNqu=3Rlv>T?&_46}2P?5Y2 zfNHoym7Uh+&(}pYizv8ipLo!dz-|(dBofLJs$ihoK#DV0N=Rej^#puN>eK~x@g`(; zsOr^vrop{jHTK+f2sC!uwp^>wrzkOgWCl$~HE3K)csGZ;XFV4tN*I*QveG@XfL(o`{N|rmYDvJmOGHVu%0+&0M zC(?pYG}j1W1!)xs@C0q*+j8@e;W5HhX;X(ovr+9Hx#G44^-4!rKea|AM6CSqCjI*R zPY6mUF`4MAFb^G2<>W{-RSRkctixO-7ne}qQ%b&0YjsV5Eia>7%1A2Vw&Alz5LbD(HD!C`IH-?MJ`z?<@I*qF=lZv6?|&>lQ|;%@;ScZ_q+ zW)R|=IErBgKlql6J$?Plm1dUE*05d?aA3;H+HtmVR>P5R=l64q&9u$A7@$WE0vN=T zqGL+=-i*lSBnU_n>)8Lw)RD1lJ6?9I%96{+@}%7BZ;JuQlYB`pDFnVT62uJjRYsyq zt7P&};)z6e8$o0I0jtGy222)#m&T0A*>wV451PBz?E}@y?l~zB@ZJJi4zk2f70Jby zBmhp+zD#5kPl%t9s!35Q$CwiM5mH;)FrM$v>%FC6sU)|x?f2Uur?P&*rtqGnQr@(n zgS-|Jjez_=m~OIbI`!($O)YiM29r%AS#kb<*j1(3?JotP1RU-w=(fv+>+?<( zKN#|P4%YOEv_lEORy<)H)^^>RYnn7pJ~j5YJFj_5m7afG+w(V{KX)MFy zKRlnV0-~pwR8m&LY%K4kiBza?1G0<$@tEAH)|~a#u9i!k49+mz@=ZU`EHP}hB5@~3 zfKrj+?pzwWBuGDdq1SC!$^^MEN)i{PuDghgya-xoVp?P$pl?#<%lsH~!cxK84&)zJjB8TW#U0L5l ztg%v%lBRj%1SQ{fh!v+ABpY}ioETfWE$07#8sDyKb6`SY=;lFY)C(~O^z!}k>BaN% zX{Cj^CN})5zpi7nNp&$c|5L8?mqY*o6axJ6#5QoZ{}(-B1(i~WQyyAnUkq?`s0C#9 z%u@}51O-Bsil74M0frCcFYK*#o)x(hOi*P4N(E0V$y?j_A(jD{EX1P4E`YEc-+NaZ zE>88s>5o%@O@@2Y?v779Mc?>ghsz~{amcjdRXHYiihQLRpDvy#4dR$IUgLAIJb;Zv zurHKeq&YfN7}i914Ki1YbctGBs@eIa1G(FR2X84kZI(g zh*E3R5$R2OgY*#7mDrkDdmhEY^t@$S!qDX(pmr)rRFz=83nOA2_pUT09WY8TEq7+B zI|$GKoZ<{J7^HkszDZv!uba=zaq~+FSgMFqJ&iSVa}3x+SrwGBEWEShl`}}(r-=o{ z$5=-iPazxN#sGuz^32>9K;AdZq|up~HDXIpa_+ggSlpOY6feIdokNjZ@$?=a$5R0` zs zk6z5hcvvYq>jLb)6 z7_GpK1oH{TF`}Mp@j^7S&wKOz^0FZbmB~>A6f#q52B1xPgUwlIcK%;O8Cn& z30;Tf7W;eoYRdFXM>M5*o}L*tjeW+GKA03^RNq$9>qj~dd=LB*#!H6ER7)*Fwb?Fi zYEefH9tx7(Cf7=q)KR1HyZ7&V-uI-QvfG`VR2(-3#o*fpb`8n7klY*KAO7LPSmbRs zJLF_)4nwhGGt-EmbRF&x2c0><@5AXr+}{F#mgdMH=*E6OjoMV!iyZJMb(M2h=r^J) z38)pH`MdzG>~m06(9f#ucuiUS>$lJ^9Q0k;Nn^rPHI>3} zyiaUXJk>VSOd#;?EfO#B>wRBLEQ~PrQ*W4Fey#S#s>mpgM(}NPsAX8zlA4)(7UxNH^R9!Xga27!v*1 zp!-?5+H%K2=UrxHnA~v^PKS8+AU`yaaBKMlVmR77XVp{jUAPheGMsH5lz51db@2tK zh@89x#0b>Y3>CN;U1i+1Z{r^P9rf|ic*R)P2nnW$3WSOFbHfM_08FG#A zxhINm3oGd`zE%psS8UUZ0D2UT1Uu@~wzqewRS@ZH)~+Yz*WU^?QEqNBj4&l#80LNo zyc>Y4+^j-Uii?7l{VMyVcQX=YrM5(+CeZ_K=C0m)-KVg#)m8>QR#H%iE5~DT!T_TK zXxP}}ZaAV6L;|!Sgcl`ZKWRG{-2B*fGb!lS@pNeIUs2e0(pYqeg_mX>C}9JX0O#@+ ze_<|9hLc!{ljCdz>oAW>a6@Nw6Zeo{;+>w}ig!j=Vtc2*zk@{*oBPj=IT> zoK7Gh`j2df`3`Bl@aCJ29MgND&7M1<3O$O|VQrk7=P}1`cv$P%NFq^TL>iRMH5CFf zxI>AdUT-MWO-bRL|IZIn3s)Q|%!RBu!PfcUvFo|ZKHbOyGe?Th1gLdXCdm<;^xj!b zeORe*ZNEK$x zPZD0AH>IT#DDXxpImXdCz33(xHP=Zoia*$RdkGc~1CWdmQOSTInY(A2_-1E>H4C?= z>NI5*syZTOn;3G`$p=x(8MieWJ8bH-ZUB!e88m*T2J9YVp0eyF{*jIae##{M1;97r z7Gw2Y8*atx(-Z65534`QT$5rf7N#|tE1_1qNo07zRY#;ZB?vL_4Vt*8%A85Bz;2P=x zC(2`9Ps%o^>uhgT7`KC{c(imhbR}tceqd4knnVb>Q^!o&6sC^r#+4ua)9WAjBFQam zXf-YD6951dR{#L4y`C5#0SQn{NlQsCP(f3WOHBX(4Q_jv+BV~V>~;gs{{w&|wXE_f zB&20B;M7i~#S%`CNi>38ZVg3gPhr)%Mx9(*L@x}lg#Ug2|NpzYq?A%AB%6)%ZS;NI z`M}(k34s8x3vex?fU<|uK`0jj+i)zwz6W0e?}qcY-+QHPw%mT#-Sm#nVn1kx`l3D` z(upAYdOi=%f%xc9$PPVd=yY^-ljQ#r zf7lQBBl3RbzEi#Lze7L&7aydo>l8_CI=0iDZ9TN++9gUe=qE~fERv;FcB+Tup%k5J zy0ud!btqP@t&&oyMO~#QW;^VsR<*S3rb%7S=7}j!oAW0`0p$`J?UfUuJxZkdzWwKa z157$g?6G-`e$Qcson6bTTwFQuFMyXDYXiSJ&Lz6u1f5>?2U6c%t^}?)=y{~<_5-Y& zEHb_cYdGTEJ^4~(>Uap<(r$2FZOwBQ_@>*grCUZsc8IRUYBn~f*-n~(k}aui2|J7e zU)}a8MO1{^qOF>Czi2-ek%5zyoSk|K+5KSrT4b$KePUOtrD?Otu${X^oSi#Ues9hX z#i(Er6QN$hbZM!ysVb{(b-C%$uuX|Gq<}vcZ|?Zy`q!Ph3yNDyLbW0$tk$5Nx?qaw zrh<4JZS~M+J19Q;joe>%fyK#5Ys>5{dtV|2#kQqtGtdS%vOxz@OiudN)CM!BJu*g< zu$>6O1_OE%>sJpKZBKfo#a&Wc2g(qZ*riHo+p?gUCJ48Ehq|Pb`0^_VU(ipMT@H;PYw%J`~qC$A9RH~hs!mw0I zXgF3i&#`KWM}o#v$fcDjn0kIdE;g0Oq#9ofciq>{y>S9ytgk|So&ib4>ZM@DQ7NlU zI!Z|h;bamr+S|U>>*r?|jKif9uTKdrm3mm~Y$B=+H_&VD*jYp!lDZfhD ze|&bB-@eM>Jl9qixGeL3+QzzHoK7#&(?g?2~q;n(sopu<%@NNLUaiv@*j zo=s;2OmTaSxx1DmfiGqFuPrY6&iH}CxgomJ!C=ky@43Y+q{cq;qBC*~NJW|EH@W#2 zxbGxmudutAaB(bPM>(;IpjvBYuuyuTpm<6O(Nk`O{L;g00FJcBg6CaGI89rg#F*RMOwfLKfaf zI4(NdfI~3st$*2RzAE-rstRJIfoD+|spc4#m7mKx4{XqkFbW2ZK!lx{Ift98ygMfA zZ7;9=_d11G<8IeM+X%q69{q=GL6lc27$V8GG2xv}QJNsoZZyCm))>BeTpR0n*)>() zobbhN%~a-vk)dulhOCdO2Y#{Pn+VHLC9PtR%;1t~ z)#O{|gILRyC4^Wt%S0S?#2zyq1XvhiLI^^Vkj8#kkbkUlG1Oip+?XH#;{E`Gi&Zmw z=ZG-=t=@v#2&WhA8J^tK=~^whmBSW!Htbs(G3)W1OE4Ss#-NZB5gr2Y;qd|ZNa4}l z?=-_EpuxMq^9CaVguv_Y$vmJY6%ZDLGKOxf&ISC1vfkB z$lIo!6)n$JnyCdWmBF7vJQgchrkvhJ|L93(GM+z-IeJ~W3Jm_zC6;sj64^JjS-$mq zXYVRxIOXm`4ZUOuyqusx<2WnMMeebJ`(aI>0=c2{y1mHgn+9(8scE|O;buzF&TaJmhN70aI1pqOr&|HPs;9{g-E&rs_e?U{wf9ULR5eYjgt z{82XFsXRpA#{t0Lyt9vpiH1X&97LSd{XF70@ZXD89cWfh`oDV6e$iAc@AtMyT$zYN zdEC!3kzp9l&gsXlW1Z4M8BBLWA(r#LDDbFrW91NEH)g&z4@0)(#-1UmTF(L{YeKcl zM__WXp{8Fn$tGhT%Nx#Rb{B1YZpndKeTuqQxmQeS#8-8A>G0}a45+swvFlW)O>;i) zp-p3*Qk)pVN>E~V3vO|6hDRPOAk)mTdxBZZfXkvvRX-Vilk$9@A^E=;Vq(DF7RiT) zamAWgmpE>?v>upXDBxL^xJh|uR%N~9NstD)Fj{7artAyeCzdZB^#hM>q>fN<&%5Mwd z*?taLEzr`~_M|tZIdy*+VwHOoZ>FH~BNMdK>naoi_?*!@Mf4Z=Fgo0~ny7T5Z`|UE z_Cb0}S;rRP@5+-WQ%AY2;3IcQbHuhb$;qj7!HJQhK--9aG3t@s($&=l-A9mKO#p3^ zARDb57w*T$MKS`@p*L=MDyW>~T&VIyHZdZIZU(XO%N7P%pjoLbrdig!&Ru=EC8e`i z+XaiS|2DvguwsvgGBq_skc|aEIWVjFCO~bMBY1lIe6#CJ@e8Z^$$@|NTFCDXE(W-SkHu0L=V%5-=<2Sd~ zz+ddOdI>iRhSyBh=Y!qnfHxs(P_|Obn67-A);TtY5&Cx&Kl9TjdvPpGb{wdgX!srp zfiY;K{2{nJ1X%0L!8lxX(M7<)W46ozFKy=6wZ2M;-XIHKJqODjieG(6{TXF z`U$;A{-Rpa?>E1|(*a&X(b&+fSTLHt_4=@QVHF$@c79|{ipg_fKSP_^+Ie;%z)d4$ ze4b7HQXw81iP?y*Z=!iAYNUwCErSCa%}3r#C3S@aNak;B3%WGK1sz3P^9IJtD6{oW!nW;n(x(KvhzXINO<{!-E(+(>23avdH?NsukHFHyE(goI*_ntCQ z-3&=5j^DORB*dkV+8A5sf{?-209i7Yks0LJQr$`F27CHp)|?Vq2*T3bTIJ^No}K}b z=EB#p#;YQe{ZdmgrOgx1BQp7zH}p#R!qDILlbs|ES!X`cx;p>!nJ8$WU~Juk2h=3y zBjDsw6_cM0$*F)Q#i}L3%oH;cc_3qhaswM}DtwtYo89EeaR~MH*&FfObsdj4-%gzm zg~6gky|Sfc@jfXS(bJfx)to`CFsrU=++zsgsq0hCc? z(L-@UfDMGv_5G!?rQneZ6t`B*znJcP{VU(Y_jrdnZog?=% zOZhn3UkE^No+r4EYxaDa6TrNjR!pT}_5Q_%Kv{G&ygiL`D=&CUxDqxdau&f!YSPXIulA_mx zRe3v74~^JpSwOd*iF#|{qQDTWw2;P;+wfq51)$deQQ|uu10j>`QNZQ~+!`GZNCBGl z#qT+eN-tp9WvBLpw2T>{$ZY>6jJTi7wDx~Y_MH!V>5e!3uc=*$3kKOZvb z^MH6sY`MTZm+2QZW}EQ8JUhejQgy28pE7qwaV)vi9s={{7|Wd~CbwqZ)ezo56K;sW z`A2y`Z#7Q1ICx=U4$4*z-&bGFq5ZkbPn@#PHgd8=>f`&H3%yW;_B~R7tK|*2x>>pZ zPHjO3_2l7yHKuw&^!YMiy_I>A<2|}8*XqW0@Ygg>@OxH=rq+Z`XOt;+XVlrPnqTp8JERf?f)U*(b1SMM%IS~PM)r&AtBbHpRnaO61~%}f`QBY9+k zt(S?gw^QoK@$f@fkur*bp4yU?>Z@lQ=S2-X`oeg0-Yk27?xhD@87VHml8_?WxIa9P z;gR%Jm$ME8+A7vkJ=q`Ugd^9EZN=}dvD?UH#>k^2RPX*sJN2Og9~9-^Pm%T^PcjyT z{CZ)dk{LZ1-OS|tu-<>fhT!ArWZ-Gg$`reIPXX(~-C@HYOJ#qvT&EVoN1J#odv@OBum>hi1 zQbLq3KC}+L@+m`7H{2W7ychGS`eCMd-3%$&8pCgAk#9U(6WPj1ZBH>B?>sRp}^{_m09Wd7IakhfY zFCF&qOcxgxCBekIi7=34JW0LV=>!cD!NItf2zY49l#LB+v4Pc(`?GV4advq!ws@Pk z5#9EeII7x3v;j)h0cR7{1p=WhJcT4?O4jYZ&VdKb#g}B%qJfVtW8Hh}c-b^RuDCS< ziRM#LA@Vdaehxh}xd9pntn6uyS=T@xhlSQ~aU)>S^}og?Rqig+q}c|1z)0DBMw@ee zV-lf>fQ$iZM_VC>8oY9bWMk-xW+?7A ze}*`WWhJK~AXs_Gr;O;*OqnsHbo=_60@ueV2Jc?ppKLf_3H2g(&d#Jxb^?5#YUFk# zbZe2xZ68qHF(~z^)A&?XPIPaEN-H+D4G>+i$KLdC!XdN*)@laUv|SZOn$Rzhifc&TjK0!&d#|$`VIa0LJQL(Ta z0_xjNjRiQ(QpYxsQ`g0$l&xdb|HAYf%Sx8)%($r!3dx-CIX|dx6GBn*U<|Yoq!Uj* zkVB=_NUce`VJ3i7JZA@rKkrPHA!fHn^6s2DBQB-yddV`tAYopyNkPVOL0Q~zIb0gF zpT$`g94z>kUxUMUgs+Q1uQrX+z#rEVe;K{ zx&27u&!VI7`KKP}M0>e1SEDsAC&u}HKG#+_WLWD+N=1lr>5LRCVArK~e*@}AOESo1 zEFPKZw^FKdMMJ0u(vI)AC#-((Dcf1PLN#CrSb;)OnK=<+nOA4(dK^cXL44I7h7fk0N+zS{+|v@YY9+` zLY#OI-uTz!9DAtM=+u_<({#p|sg@v?V%DD@t`a<_Nca&R7XV-GwdcvwyPm{-Uc!P2 zhkSF`jw}7?vs!;;ktq)_?XnF!6>UL#cZumsbA3YU<;8~2D2T$l2xe>-jx zNa~gGkE0gKaSjOPy0Jv3VsLSk*fvr33SeT_Q5Mu^iw#jz%dRn&bth{uq z$0YOwyeCdzZ;1VWS!4BP2(&jjQ9Y|*vN5q=y#NE;08+795Bg+zU`wgw(P5IqV=+=! z*F5z0Feg!A@)pOJKWpB;d4A*+6{t=lB6zwtMk`4>y-kSs*Ey6jn8azXlIo^%1Bua*X(xZ16CD;&%sH2{voT##3Tg&&kJ8?8M|^yq9l_p&6tE% zlFR!mQXNRK8F`!+Fb!8=d_!*-jwPin+?R6cb~{vzSp?t5RvW6r?O1=S0WDa6q+Fd= zQXVmaZ^@@-b2`g9BkhO3XpS_h-RAyy0D>y=4XeJ$_LSJ$H`aHE!NhDoj_IIvX_D}7 z@MLoaVbohv^j=i+C$yg|1ldLe`)bKkL-ajlZxMk`BSaUDBL_w@HZwUnVWV(lPCbh^dhLnVyEXUG z+pJ_{)zw!)q8t1?t>4V$)+c&BJ_);mxJpzy#xF0!u}m+aeh$G-IXdC=Bw(1ZF@S;bu2!onzdmGEkaJ^8nZ^T# z({c73?c`&NdCSypt)K~BhkK(m-*dOm^D^*t{4YX4?Db(_ot{$r43BB?aUV@Y90>lw znkCqgeZg`>U;rLsKY~miPNDuaA*O?9h26)zN3xQ9J|_^@?GgTBKt^T1_zm?zMdDd> zr@5Q>1AH~!EGjT@=!mJ%uJ_m23xrHB@1}Qu&yjx(5HNrS#1LzPzWbm3YarLjo31!& z3M~qeo@4~XRY(*wOOgj04^oFQOViu`bR=cch)Jcwbqvsq%9B}Q8_$88vI^!y&Av!x z$3EM--IFHzj0`fks6yZ(0g^P}QNqa<9q*~dJLfGv`in`Uxd;+RQ zbxEG7Au3L-QYM*yLTK#nn3{swK<~%ze`Q*z?HZzs^h%g$->j-WP+F>h;ons1GFoY+ zzf7AZowE9)G7_%QKGojeh`oulr#cNXdQ%JS{;QTb84kG)-4B*>`W%@aC_)zj2Qrg4v_fDGLX4TET-rut z^quQ>nd$^qyOS>2dvI$Z&JWL5Fm=#jwshk?mNGR*$Z(T-;cDX=KFMs*`% z3l8)agc(r`d&?+69MY#o)mu{wWO^wU3f$jpSW>>ySQZbc76Pi|pblsPM5!7A;{61p z_M&97%5!d$^siPchy0^&%DbNCwQ3=$ytidLL z+^6gf$}KG1niBoV0g2;$*f~Vd*at13TDpmXoWYI7EEc-OEg+2UD!YuX;4qyx3T*~Q zCpF)cF%0071h002se+Y}%G3{FKdOixrr zOD<4BQxG)F<-ecr-_Hx%`PP2EJMYE_1>fI~i-}&a5B{}C$>8j4H2xEfb!D`Iew7#+CC31aGxrYQnrye@(Fc&7@yX_48= zN||z|AJIrBhA^S|Ya-1SPQHK|5m_^C4&8Jd1ki)aMV+gTLhg(NG1Y;dXG zif9oIBzd)G9-0lnczi4ppj{K+&XIbFM;wc8h82Fr(WWE+<&+dqqcUIO%2fyRB0bD( zP*5rz^eVLypH(W6jS6W~_-rGUBf_51*TVe~`oGb!S3w1-Y^8_4@1XWmcHz2e;Qt5y z77+{l4PO&x-8y$Ug7~j3@_X46+2P}p)){AkJ%(G^m#Vz-U_~TD*agVqKn$Od_*yN< zDrC8~k-rvy)BCr+1)pBt``th&uGhd7CHs#_3DGLB+y1!c)$g9&dV-ZY_|cn}_^@5E z#k!~r^#|VAL3@kT@BqM=rc%;!B#BFd^YPh>osz4QZa?6tx{mCE$`PL(Bk|Ohqsh_C z^nR$7d!p!|Y*RN~6v(hBHKOskVF@zfz{NyojMLSZYB7g|{M-6GUfg-5QUBOn(0 z%Pm(N(KcSJ#)_RFVTbTSr(D3P5phLfYGh(~e?gQ4(#4sdzmfXf1=5*H31z*bVZP28zny)@L`kiKZT*XT`%BWxS% z5d7Q)a>7-L$lJRsgy7vMM-|BxG+)=QmcD6k{>wi_9%n80WP?cz5PkFnTKcSxQDLn$ z$}!HKn#Y@BAySOfPe3qTAyNMwwPi@-I>$(0dKKOQ#V3C=v~d?8qsJfulBIiqDq_E= zr_#ZFq;q05AIa0htkze&QW4CGO84vD4(fQ>%x`~H6e&KM_+wTqPlf>B8Khjql3hE- z+m{T^`+s*uoR8~dJlS0FyZyrsagsQMY4Q~TV`IVLhG#z=1vaVv)RLl`ZgQ{ziFlgC zoj-z%N^{v8)R8`hy>ji&!sRdg_o&Rqe#zv<({SUwIgI#HF|Rh!*3mD5slS3>d#`JEOF2qxbmUcKBeSI6`D zN^9|*Zb$MCQ0s`C9$4$^eM6Ww-3os@{mnfL!ZSePrdU>q3iy>p#`@YAHh$0^TX7-P zy?!$-&8}U2Uu|C%hH=5IHHD-=&ni?%6CR+zZqmu|-4U2l0u8*Y(y q((74Y7_apUVylLm4|7eeL3ZM>g@wwFxGI-T`-*?}YGVsFfdBx}-xmG= literal 0 HcmV?d00001 diff --git a/sources/new-s5r4/changes.doc b/sources/new-s5r4/changes.doc new file mode 100644 index 0000000..e99b40d --- /dev/null +++ b/sources/new-s5r4/changes.doc @@ -0,0 +1,3 @@ +1995.11.09 + Zmienilem nazwe funkcji 'sendmsg' na sendmsg1 , bo funkcja +sendmsg istnieje jako standardowa. O.S. diff --git a/sources/new-s5r4/cint.c b/sources/new-s5r4/cint.c new file mode 100644 index 0000000..2acf29c --- /dev/null +++ b/sources/new-s5r4/cint.c @@ -0,0 +1,283 @@ +/* Loglan82 Compiler&Interpreter + Copyright (C) 1993 Institute of Informatics, University of Warsaw + Copyright (C) 1993, 1994 LITA, Pau + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + contacts: Andrzej.Salwicki@univ-pau.fr + +or Andrzej Salwicki + LITA Departement d'Informatique + Universite de Pau + Avenue de l'Universite + 64000 Pau FRANCE + tel. ++33 59923154 fax. ++33 59841696 + +======================================================================= +*/ + +#include "depend.h" +#include "genint.h" +#include "int.h" +#include "process.h" +#include "intproto.h" + +#if DLINK +#include "dlink.h" +#elif TCPIP +#include "tcpip.h" +#endif + + +/* IIUW LOGLAN-82 Executor */ +/* Written in PASCAL by P.Gburzynski and A.Litwiniuk. */ +/* Modified by J.Findeisen, T.Przytycka, D.Szczepanska, B.Ciesielski. */ +/* Hand translated to C by B. Ciesielski. */ + + +#ifndef NO_PROTOTYPES +static void load(char *); +static void initiate(int,char **); +int main(int,char **); +#else +static void load(); +static void initiate(); +int main(); +#endif + + +/* Macro to decode addressing modes : */ +#define getargument(a, argnr) \ + switch (eop->args[ argnr ]) \ + { \ + case GLOBAL : a = M[ ic++ ]; break; \ + case LOCAL : a = c1+M[ ic++ ]; break; \ + case TEMPLOCAL : a = c2+M[ ic++ ]; break; \ + case REMOTE : a = M[ M[ ic+1 ] ]+M[ ic ]; ic+=2; break;\ + case INDIRECT : a = M[ M[ ic++ ] ]; break;\ + case IMMEDIATE : a = ic++; break;\ + case CONSTANT : a = M[ ic++ ]; break;\ + case DOTACCESS : a = M[ display+M[ ic+1 ] ]+M[ ic ]; ic += 2; break;\ + case NOARGUMENT : return; \ + } + + +static void load(_filename) /* Load code and prototypes from file */ + char *_filename; +{ + FILE *fp; + char *cp; + word n, left; + char filename[100]; /* should suffice on all systems */ + + strcpy( filename, _filename ); + + M = mallocate(memorysize+1); /* allocate main memory array */ + if (M == NULL) abend("Memory size too large (use /m option)\n"); + + addext(filename, ".ccd"); + if ((fp = fopen(filename, BINARYREAD)) == NULL) + abend("Cannot open .ccd file\n"); + + ic = 0; /* read static data and code */ + left = memorysize+1; /* from .ccd file */ + do + { + if (left == 0) abend("Memory size too small (use /m option)\n"); + n = min(IOBLOCK/sizeof(word), left); + n = fread((char *) &M[ ic ], sizeof(word), (int) n, fp); + ic += n; + left -= n; + } while (n != 0); /* now ic = number of words read */ + + fclose(fp); + /* Get various addresses passed by GENERATOR */ + ipradr = M[ ic-5 ]; /* primitive type desctriptions */ + temporary = M[ ic-4 ]; /* global temporary variables */ + strings = M[ ic-3 ]; /* string constants */ + lastprot = M[ ic-2 ]; /* last prototype number */ + freem = M[ ic-1 ]; /* first free word in memory */ + + /* Read prototypes from .pcd file */ + addext(filename, ".pcd"); + if ((fp = fopen(filename, BINARYREAD)) == NULL) + abend("Cannot open .pcd file\n"); + for (n = MAINBLOCK; n <= lastprot; n++ ) + { + cp = ballocate(sizeof(protdescr)); + if (cp == NULL) abend("Memory size too large (use /m option)\n"); + prototype[ n ] = (protdescr *) cp; + if (fread(cp, sizeof(protdescr), 1, fp) != 1) + abend("Cannot read .pcd file\n"); + } + fclose(fp); + + /* Open trace file */ + if (debug) + { + addext(filename, ".trd"); + if ((tracefile = fopen(filename, "w")) == NULL) + abend("Cannot open .trd file\n"); + } +} /* end load */ + + +static void initiate(argc, argv) /* Establish configuration parameters */ +int argc; +char **argv; +{ + long m; + int c; + char *filename=NULL; + + fprintf(stderr,"\n LOGLAN-82 Concurrent Executor Version 4.51\n"); + fprintf(stderr," January 21, 1993\n"); + fprintf(stderr, + " (C) Copyright Institute of Informatics University of Warsaw\n"); + fprintf(stderr," (C) Copyleft LITA Universite de Pau\n"); +#if DLINK + fprintf(stderr," D-LINK version 3.21\n\n"); +#elif TCPIP + fprintf(stderr," TCPIP version 0.9\n\n"); +#else + fprintf(stderr,"\n"); +#endif + fflush(stderr); + +#if DLINK + ournode = net_logon(msginterrupt); + if (ournode >= 0) /* network driver installed */ + network = TRUE; + else /* network driver not installed */ + { + network = FALSE; + ournode = 0; /* only node 0 is available */ + } +#else + network = FALSE; + ournode = 0; +#endif + argc--,argv++; + + for( ; argc>0; argc--,argv++ ){ + if( filename != NULL ) usage(); + if( (*argv)[0]=='-' ) + switch( (*argv)[1] ){ + + case 'i' : + infmode = TRUE; + break; + + case 'd' : + debug = TRUE; + break; + + case 'r' : +#if DLINK + if (!network) + abend("D-Link Network Driver Version 3.21 must be installed\n"); + argv++,argc--; + if( argc==0 ) usage(); + if( sscanf( *argv, "%d", &c ) != 1 ) usage(); + if( c < 0 || c >= 255 || c == ournode ) + abend("Invalid console node number\n"); + console = c; + remote = TRUE; +#elif TCPIP + argv++,argc--; + if( argc==0 ) usage(); + if( sscanf( *argv, "%d", &c ) != 1 ) usage(); + if( c < 0 || c >= 255 ) + abend("Invalid my console node number\n"); + ournode = console = c; + argv++,argc--; + if( argc==0 ) usage(); + /* here we test if we are remote */ + /* master will have number of slaves to wait for */ + /* slave - internet full address of master */ + if( strchr(*argv,':') ){ + /* internet address of master nn.nn.nn.nn:port */ + remote = TRUE; + tcpip_connect_to_master( *argv ); + }else{ + /* # of slaves to wait for */ + if( sscanf( *argv, "%d", &c ) != 1 ) usage(); + if( c < 0 || c >= 254 ) usage(); + tcpip_wait_for_slaves( c ); + remote = FALSE; + } + puts(""); + network = TRUE; +#else + usage(); +#endif + break; + + case 'm' : + argv++,argc--; + if( argc==0 ) usage(); + if (sscanf( *argv, "%ld", &m ) != 1) usage(); + if (m <= 0 || m > MAXMEMSIZE) + abend("Invalid memory size specified\n"); + memorysize = m; + break; + + default : + usage(); + break; + + } /* end of switch */ + else{ /* this is not option */ + if( filename != NULL ) usage(); + filename = *argv ; + } + } /* end of for */ + + if( filename!=NULL ) + load(filename); /* load code and prototypes */ + else + usage(); +} + + +void decode(){ + extopcode *eop; + eop = (extopcode *)(M+ic); /* pointer to extended opcode in M */ + lastic = ic; /* save ic for possible redecoding */ + ic += APOPCODE; + opcode = ((int) eop->opcode ) & 0xFF ; + getargument(a1, 0); + getargument(a2, 1); + getargument(a3, 2); +} + + +int main(argc, argv) +int argc; +char **argv; +{ + initiate(argc, argv); /* initialize executor */ + runsys(); /* initialize running system */ + init_scheduler(); + setjmp(contenv); /* set label for continue long jump */ + while (TRUE) /* repeat until exit() is called */ + { + schedule(); /* reschedule current process */ + decode(); /* fetch instruction */ + execute(); /* and execute it */ + } + return 0; +} /* end main */ + diff --git a/sources/new-s5r4/cint.o b/sources/new-s5r4/cint.o new file mode 100644 index 0000000000000000000000000000000000000000..7e87d280386b972b427401ac1f3a7bf071d27764 GIT binary patch literal 6770 zcmeI1e{fXQ702%;8;N0;1RE46mWR~}HHitJBW;QynWe=V-6}y_mCeiUOLlR8@%C*r zRwTGa*)C~UX0TK%MV(fswH<98iZhOlNWqR(p`$Zebc}6vUS_EiY=)*1-G0w~Cz~6@ zk$>B9CwD*Re9yVR-o5X>&F&1B5I4>erB_RtW6rH~*lxrUW}lXd+-7K2BB4cfv&YaD zr&ES@aZF1jtwecSwYeX&@~?62J5eu$>m;@fur~)oV~U*FNTwJ-}E(eT<3p8HL(BUWFgh`_zk?wJ&r!me=4D4G*>+&F;&U z$t&_{8Ka+>G4`1m}%zcAM1QdAgi<;Zm-U%dyE@ zxOwVwT7Rbn)Xa5^XKM$XW+wbpCFdLW+rtwymYVEPX53|Y z!&&O~&r)+2ePe}f)Q!B}zjs95U)JT}-AI+wc~C|w!#|%CwmCv}=%gL_C^epN+Q}Zh z>G>+{%B#P5<*KXdFI%cV>@y=hVM|*RPgxNwZ5djk8%}q^jOkV+n9@4pkzQ)c>Z8bY zx|z~%QEEqxZcDpz&DvGkRHmVY49%~nt3;K!AQ}>D;=Ot_64GMIX_87B!AN(+2vrGX zJ>>oB;YADYEEmGL8Lbn}y1!6Tx>z|K=9wdx;*@j-N%xjjVZZxfv6%CDay9*5tFIpTHyV>(YxeLDT+I<{NpocL zoaT_#H1Z5W%JlNhF{`=Rv=)!h`Xb=;h~~uz-E69VFZuTO(bLG?PBQXoP&77-D_vo) zM{p2#bhs50lq0ytz5-fizsK2?753N3#o2VnoGo}4En>5$aL&|-!mCl!K3mptW3$q* zL}6Yj!9MYyVzF>$$uBG_nbP3v@fxyZ|JjZ)zH}o)IA!uOKA#RUd!y4yVYb?W{Qzpx zhGtQ&zkA)a(@&n8vcB(PVvPc}9LU6{D0-X}6greb5qBM6J^Zk7PjQlU} zpKs%kQ5M|UKjrHF@ncJr&YylbPoNB=)OfIWP@X_Jgd(tYJ5iM8KHopMEI4mZKH2_n z&Y!|8b+z;PL1XNO_0yk+_N^bthbumGR{HHD$K?khI|$KUkGC+ckg(Un%ItR+7EW(2 zUuc*v*cVZ~`^NFM2v*_c>EV3SP{E^0%21??=kvO2b2nAy(w^+-!0~j&UKhIeXI~#U zGHKf{9Fs%L?#mu3RI81_9yG>F^Lqs~%dzX<0C5U?Y!J_C&-={dj_y7I;xX+lM_0&m zdq6y8J(^Q`Y+{eIRTX8lptA7}k3 z)}LnmS=JA*{vzv#Sbv@Ux4^mR?>%rH`X2@7gXiGm&KIF~feYZ9AkB9R>${kbf~eyD zEr`!d-sf0bse%)fz@ zH_rT+buR`(`aF>8Ed*(N_}W0S1*G^j%|z#^_?UeCOd*~tts!^|i%$=m``yLpiM z+X;RJ+{OBn%pr~+0BK!b0V(e_j=#ek1*x6mAgxOgq`V3ow$#sT=6N9HUB+C=dOQ2y z1*u+u^^MGaj&En)4^rN4jz7uV!}>GqA7&1N)UVC)_gSa!5@~#AffQc=(z?{Mzl`Ip z>|X^^ziU~)3tWuz@F(CBa2NPh@DcDL*{hNzwnR*nd~-f@0Gbos-w$BgJ+@oYcLFJqLCL@{(9&`V2Lh zbAe*lD|VA&(`PLF$=3?SZdL5nihTua>Z>1X?N{{c6}wZhlZxG^*crthRP6f{dl&4U zU~p+5n206u`$MQf1OkDcc)BD6f+7%2=phkES!OWVCj!nllk_u3DHlIcB#_rG0(zGb zN3I?U8Mj&@&`m#Yh(H9vZu&g}2u2er)QlueJ!Fc2WyF#R6JNK=4kGcM6#COsR?vB0x^U>Pw + + +#ifndef NO_PROTOTYPES + +static word get_pointer(word,word); +static void phase1(void); +static void phase2(void); +static void phase2a(void); +static void phase3(void); +static void phase4(void); +static void phase5(void); +static void phase6(void); +static void curtain(void); +static void heap_walk(word); +static void nonefy(virtaddr *); +static void relocate(virtaddr *); +static void traverse(word,void (*)(virtaddr *)); +static void what_we_have(virtaddr *); + +#else + +static word get_pointer(); +static void phase1(); +static void phase2(); +static void phase2a(); +static void phase3(); +static void phase4(); +static void phase5(); +static void phase6(); +static void curtain(); +static void heap_walk(); +static void nonefy(); +static void relocate(); +static void traverse(); +static void what_we_have(); + +#endif + + +#ifdef CDBG +FILE *ff; +static void what_we_have(va) virtaddr *va; { + fprintf(ff," pointer offset %d:|va=%d,va_m=%d,M[va]=%d,M[va+1]=%d|\n", + ((word*)va)-M,va->addr,va->mark,M[va->addr],M[va->addr+1]); + fflush(ff); +} +#endif + + +/* + * Memory compactifier - a play in 6 acts + */ + +static word nleng; /* free memory before compact. */ +static word curah; /* to preserve ah of current object */ + +/* One of the actions for traverse: see below; + * converts none to absolute none, i.e. (0, 0) + */ + + +static void nonefy(va) virtaddr *va; { + +#ifdef CDBG + if(va->addr==0 && va->mark!=0){ + fprintf(ff,"nonefy:|va=%d,va_m=%d,M[va]=%d,M[va+1]=%d|\n", + va->addr,va->mark,M[va->addr],M[va->addr+1]); + fflush(ff); + } +#endif + +#ifndef OBJECTADDR + if(!isprocess(va)) +#else + assert( va->mark >= 0 ); +/* assert( va->mark <= M[ va->addr+1 ] );*/ +#endif +#ifdef CDBG + fprintf(ff,"nonefy:|va=%d,va_mark=%d,am=%d,mark=%d|\n", + va->addr,va->mark,M[va->addr],M[va->addr+1]); + fflush(ff); +#endif + if( va->mark != M[ va->addr+1 ] ) /* if NONE */ + { + +#ifdef CDBG + fprintf(ff," set to NONE\n"); fflush(ff); +#endif + va->addr = 0; + va->mark = 0; + } + assert( va->addr != 1 ); +} /* end nonefy */ + + +/* One of the actions for traverse; update the virtual address to + * correspond to its dictionary entry after compactification. + */ + +static void relocate(va) virtaddr *va; { +#ifndef OBJECTADDR + if(!isprocess(va)){ +#endif + va->addr = M[ va->addr+1 ]; /* new ah (after compression) */ + va->mark = 0; /* clear mark */ +#ifndef OBJECTADDR + } +#endif +} /* end relocate */ + + +/* Traverse all the virtual variables of object am and perform action + * on each of them. Skip references to processes (see nonefy() and + * relocate()). + */ + +static void traverse(am, action) + word am; +#ifndef NO_PROTOTYPES + void (*action)(virtaddr *); +#else + void (*action)(); +#endif +{ + word t1, t2, t3, length; + protdescr *ptr; + + t1 = am+M[ am ]; /* LWA+1 of the object */ + length = M[ am+PROTNUM ]; /* prototype number */ + if (length == AINT || length == AREAL || length == AVIRT || + length == FILEOBJECT +#ifdef OBJECTADDR + || length == APROCESS +#endif + ) + { + if (length == AVIRT) /* ARRAYOF */ + for (t2 = am+3; t2 < t1; t2 += 2) + (*action)((virtaddr *)(M+t2)); + } + else /* neither an array nor a file */ + { + ptr = prototype [ length ]; + switch (ptr->kind) /* compute the number of the system */ + /* virtual variables */ + { + case RECORD : length = 0; t3 = 0; break; + case COROUTINE : length = 3; t3 = CL; break; + case PROCESS : length = 5; t3 = disp2off; break; + case FUNCTION : + case PROCEDURE : length = 2; t3 = RPCDL+1; break; /* PS */ + case HANDLER : length = 2; t3 = SIGNR; break; + default : length = 2; t3 = STATSL; break; + } + + /* action for system reference variables */ + for (t2 = length; t2 >= 1; t2-- ) + (*action)((virtaddr *)(M+t1+offset[ t2 ])); + + /* action for temporary reference variables */ + t1 = am+M[ am ]+t3; + for (t2 = am+ptr->span; t2 < t1; t2 += 2) + (*action)((virtaddr *)(M+t2)); + + /* action for user reference variables */ + t1 = ptr->reflist; + for (t2 = t1+ptr->lthreflist-1; t2 >= t1; t2-- ) + (*action)((virtaddr *)(M+am+M[ t2 ])); + } +} /* end traverse */ + + +/* Mark killed objects by substituting prototype number by a special value. + * This way we will be able to tell apart the killed objects without + * recalling to the dictionary or to the list of killed objects. + */ + +static void phase1() +{ + word t1, t2, t3, phead; + + nleng = thisp->lastitem-thisp->lastused-1; /* free memory before comp. */ + M[ 1 ] = 0; /* for proper update of none */ + phead = thisp->prochead; /* head of current process */ + M[ phead+M[ phead ]+SL ] = 0; /* make SL of head look like none */ + t1 = thisp->headk2; /* flag killed objects */ + while (t1 != 0) /* special list for appetite=2 */ + { + t2 = t1+SHORTLINK; + t1 = M[ t2 ]; + M[ t2 ] = SKILLED; /* flag object killed */ + } + t1 = thisp->headk; /* now other killed objects */ + while (t1 != thisp->lower) + { + t2 = t1; + while (t2 != 0) + { + t3 = t2+SHORTLINK; + t2 = M[ t3 ]; + M[ t3 ] = SKILLED; /* flag object killed */ + } + t1 = M[ t1+LONGLINK ]; /* goto other size list */ + } +} /* end phase1 */ + + +/* Step thru the memory area containing objects. For each object not being + * killed detect all its virtual variables pointing to none and convert + * them to absolute none i.e. (0, 0). + */ + +static void phase2() +{ + word t1; + + nonefy( &(thisp->procref ) ); + + t1 = thisp->lower+1; /* FWA of object area */ + while (t1 <= thisp->lastused) + { + +#ifdef CDBG + fprintf(ff,"OBJECT am=%d,SIZE=%d,TYPE=%d\n",t1,M[t1],M[t1+1]); + fflush(ff); + if (M[ t1+1 ] != SKILLED) traverse(t1,what_we_have); +#endif + + if (M[ t1+1 ] != SKILLED) /* an active object */ + traverse(t1, nonefy); + t1 += M[ t1 ]; /* next object address */ + } +} /* end phase2 */ + + +/* garbage collection */ + +/* Find x-th pointer in am. + * Skip references to processes. + */ + +static word get_pointer(am,x) word am,x; { + + word t1, t2, t3, length, va; + protdescr *ptr; + + t1 = am+M[ am ]; /* LWA+1 of the object */ + length = M[ am+PROTNUM ]; /* prototype number */ + +#ifdef CDBG + fprintf(ff,"|get_pointer(am=%d,x=%d)lenght=%d|",am,x,length); + fflush(ff); +#endif + + if (length == AINT || length == AREAL || length == AVIRT || + length == FILEOBJECT +#ifdef OBJECTADDR + || length == APROCESS +#endif + ) + { + if(length == AVIRT) /* ARRAYOF */ + for(t2 = am+3; t2 < t1; t2 += 2){ +#ifndef OBJECTADDR + if(isprocess((virtaddr *)(M+t2))) continue; +#endif + if(M[t2]==0){ assert( M[t2+1]==0 ); continue; } +#ifdef CDBG + fprintf(ff,"ARR"); + fflush(ff); +#endif + if(x==0){ +#ifdef CDBG + fprintf(ff,"=%d|\n",t2); + fflush(ff); +#endif + return t2; + } + x--; + } + } + else /* neither an array nor a file */ + { + ptr = prototype [ length ]; + switch (ptr->kind) /* compute the number of the system */ + /* virtual variables */ + { + case RECORD : length = 0; t3 = 0; break; + case COROUTINE : length = 3; t3 = CL; break; + case PROCESS : length = 5; t3 = disp2off; break; + case FUNCTION : + case PROCEDURE : length = 2; t3 = RPCDL+1; break; /* PS */ + case HANDLER : length = 2; t3 = SIGNR; break; + default : length = 2; t3 = STATSL; break; + } + + /* system reference variables */ + for(t2 = length; t2 >= 1; t2-- ){ + va=t1+offset[ t2 ]; +#ifndef OBJECTADDR + if(isprocess((virtaddr *)(M+va))) continue; +#endif + if(M[va]==0){ assert( M[va+1]==0 ); continue; } + if(x==0){ +#ifdef CDBG + fprintf(ff,"=%d|\n",va); + fflush(ff); +#endif + return va; + } + x--; + } + + /* temporary reference variables */ + t1 = am+M[ am ]+t3; + for(t2 = am+ptr->span; t2 < t1; t2 += 2){ +#ifndef OBJECTADDR + if(isprocess((virtaddr *)(M+t2))) continue; +#endif + if(M[t2]==0){ assert( M[t2+1]==0 ); continue; } + if(x==0){ +#ifdef CDBG + fprintf(ff,"=%d|\n",t2); + fflush(ff); +#endif + return t2; + } + x--; + } + + /* user reference variables */ + t1 = ptr->reflist; + for(t2 = t1+ptr->lthreflist-1; t2 >= t1; t2-- ){ + va=am+M[ t2 ]; +#ifndef OBJECTADDR + if(isprocess((virtaddr *)(M+va))) continue; +#endif + if(M[va]==0){ assert( M[va+1]==0 ); continue; } + if(x==0){ +#ifdef CDBG + fprintf(ff,"=%d|\n",va); + fflush(ff); +#endif + return va; + } + x--; + } + } + +#ifdef CDBG + fprintf(ff,"=-1|\n"); + fflush(ff); +#endif + + return -1; +} + +static void heap_walk(curr_ah) word curr_ah;{ + word aux,prev_ah=1; /* 1 is special value not expected in anyone virtaddr */ + word level=0; + +#ifdef CDBG + fprintf(ff,"|prev_ah=%d|\n",prev_ah); + fflush(ff); +#endif + + for(;;){ + word am=get_pointer(M[curr_ah],M[curr_ah+1]); + M[curr_ah+1]++; + if(am >= 0){ + if(M[ M[am] +1] >0){ +#ifdef CDBG + fprintf(ff,"Object %d->%d invited.\n",M[am],M[M[am]]); + fflush(ff); +#endif + continue; + } + + /*** go ahead ***/ + level++; + aux=M[am]; + M[am]=prev_ah; + prev_ah=curr_ah; + curr_ah=aux; +#ifdef CDBG + fprintf(ff,"|curr_ah set to %d|\n",curr_ah); + fflush(ff); +#endif + continue; + } + if(prev_ah > 1){ + /*** go back ***/ +#ifdef CDBG + fprintf(ff,"going back (prev_ah=%d)(lvl=%d)\n",prev_ah,level); + fflush(ff); +#endif + level--; + aux=curr_ah; + curr_ah=prev_ah; + am=get_pointer(M[prev_ah],M[prev_ah+1]-1); + prev_ah=M[am]; +#ifdef CDBG + if(level==0) + fprintf(ff,"|prev_ah set to %d,next set to %d|\n",prev_ah,aux); + fflush(ff); +#endif + M[am]=aux; + continue; + } + assert( prev_ah==1 ); + assert( level == 0 ); + break; /*** now all 'invited' objects have its mark >0 ***/ + } +} + +static void phase2a() +{ + word t1,c1_ah; + + /*** generation number already is not needed so we reset it ***/ + + t1 = thisp->upper-1; + while(t1 >= thisp->lastitem){ + if( M[t1] == c1 ) c1_ah=t1; + M[ t1+1 ] = 0; + t1-=2; + } + +#ifdef CDBG + fprintf(ff,"first phase of walk |from=%d,to=%d,procah=%d|\n", + thisp->lastitem, + thisp->upper-1, + thisp->procref.addr); + fflush(ff); +#endif + + heap_walk(thisp->procref.addr); + +#ifdef CDBG + fprintf(ff,"second phase of walk c1_ah=%d,c1=%d\n",c1_ah,c1); + fflush(ff); +#endif + + heap_walk(c1_ah); + + if( thisp->blck1 != 0 ) + heap_walk(thisp->blck1); + + /*** Mark objects not traversed like SKILLED ***/ + + t1 = thisp->freeitem; /* head of free item list */ + while (t1 != 0) + { + word t2; + t2 = M[ t1 ]; + M[ t1 ]= 0-1; /* mark not to set object SKILLED */ + t1 = t2; /* next free item */ + } + + t1 = thisp->upper-1; /* last dictionary item pointer */ + while (t1 >= thisp->lastitem) + { + if (M[ t1+1 ] == 0 ){ /* entry not traversed - so killed */ + +#ifdef CDBG + fprintf(ff,"MARKING dict. entry %d -> %d like SKILLED\n",t1,M[t1]); + fflush(ff); +#endif + + M[ t1+1 ] = MAXMARKER; + if( M[ t1 ] > 0 ) M [ M[ t1 ] +1 ] = SKILLED; + /* mark SKILLED if not set yet */ + } + t1 -= 2; + } +} /* end phase2a */ + + + +/* For each free dictionary item set its mark to unusable status. + */ + +static void phase3() +{ + word t1; + + t1 = thisp->freeitem; /* head of free item list */ + while (t1 != 0) + { + M[ t1+1 ] = MAXMARKER; /* flag item unusable */ + t1 = M[ t1 ]; /* next free item */ + } +} /* end phase3 */ + + +/* Step thru the dictionary and virtually remove all unusable items. + * For each active item (after phase3 we have only active and unusable + * items) its mark is set to the new address of this item (after + * forthcomming compression). Moreover the contents of locations am and + * (old) ah are interchanged. + */ + +static void phase4() +{ + word t1, t2, t3; + + t1 = thisp->upper-1; /* last dictionary item pointer */ + t2 = t1; /* initialize new address */ + while (t1 >= thisp->lastitem) + { + if (M[ t1+1 ] == MAXMARKER) /* entry killed - don't decrement t2 */ + M[ t1+1 ] = 0; + else + { + M[ t1+1 ] = t2; /* store new ah */; + t2 -= 2; + t3 = M[ t1 ]; /* am */ + M[ t1 ] = M[ t3 ]; /* save (am) in (old ah) */ + M[ t3 ] = t1; /* move old ah to (am) */ + } + t1 -= 2; + } +} /* end phase4 */ + + +/* The memory area of objects is traversed once again. Now the killed + * objects are removed and the remaining ones compressed. For each active + * object its virtual variables are relocated, their marks cleared, their + * ah's set to the proper new values. The contents of locations am and ah + * are interchanged back. + */ + +static void phase5() +{ + word t1, t2, t3, t4, t5; + + t2 = t1 = thisp->lower+1; + while (t1 <= thisp->lastused) /* traverse object area */ + { + t5 = M[ t1 ]; /* old ah saved by phase4 */ + if (M[ t1+1 ] == SKILLED){ /* ignore this object */ +#ifdef CDBG + fprintf(ff,"OBJECT am=%d,SIZE=%d,TYPE=%d\n",t1,M[t1],M[t1+1]); + fflush(ff); +#endif + t1 += t5; /* t5=appetite in this case */ + } + else + { +#ifdef CDBG + fprintf(ff,"OBJECT am=%d,SIZE=%d,TYPE=%d\n",t1,M[t1],M[t1+1]); + fflush(ff); +#endif + t3 = M[ t5 ]; /* appetite saved by phase4 */ + M[ t2 ] = t3; /* send it to the new am */ + for (t4 = 1; t4 < t3; t4++ ) /* copy the object into new am */ + M[ t2+t4 ] = M[ t1+t4 ]; +#ifdef CDBG + traverse(t2,what_we_have); +#endif + + /* Update global absolute pointer to current object : */ + if (t1 == c1) /* locate am of current */ + { + c1 = t2; + curah = M[ t5+1 ]; /* new ah of current */ + } + if (t1 == M[ temporary ]) + M[ temporary ] = t2; + + M[ t5 ] = t2; /* make (ah) looking ok */ + traverse(t2, relocate); /* relocate virtual variables */ +#ifdef CDBG + fprintf(ff," --> am=%d,SIZE=%d,TYPE=%d\n",t2,M[t2],M[t2+1]); + fflush(ff); + traverse(t2,what_we_have); +#endif + t1 += t3; + t2 += t3; + } + } + thisp->lastused = t2-1; + + + /* Update global absolute pointers to objects : */ + + relocate(&(thisp->procref )); + + { + virtaddr v; + v.addr=thisp->blck1; + v.mark=0; + relocate(&v); + thisp->blck1=v.addr; + } + +} /* end phase5 */ + + +/* The dictionary is compressed. The unusable entries are moved out and + * the remaining ones are moved up to the positions indicated by their + * marks. + * If pointers to processes are implemented as objects we have to rebuild + * has table of these pointers too. + */ + +static void phase6() +{ + word t1, t2, t3; + +#ifdef OBJECTADDR + hash_create(thisp,thisp->hash_size); +#endif + + t1 = thisp->upper+1; + for (t2 = t1-2; t2 >= thisp->lastitem; t2 -= 2) /* compress dictionary */ + { + t3 = M[ t2+1 ]; + if (t3 != 0) /* this is new ah */ + { + M[ t3 ] = M[ t2 ]; + M[ t3+1 ] = 0; /* clear mark */ + t1 = t3; +#ifdef OBJECTADDR + { + virtaddr vt3; + vt3.addr=t3; + vt3.mark=0; + if( isprocess(&vt3) ){ + virtaddr obj; + procaddr mess; + obj.addr=t3; + obj.mark=0; + obj2mess(M,&obj,&mess); + /* force to create item - we not need it yet */ + hash_set(&mess,t3); + } + } +#endif + } + } + thisp->lastitem = t1; + + thisp->prochead = M[ thisp->procref.addr ]; + thisp->blck2 = M[ thisp->blck1 ]; + +} /* end phase6 */ + + +/* System invariants are recovered, e.g. display is rebuilt to reflect the + * new physical addresses. + */ + +static void curtain() +{ + word t1, phead; + + phead = thisp->prochead; + t1=M[ c1 + PROTNUM ]; + c2 = c1+prototype[ t1 ]->span; + t1 = phead+M[ phead ]; /* first free after process head */ + display = t1+dispoff; /* display address */ + display2 = t1+disp2off; /* indirect display */ + M[ t1+SL ] = DUMMY; /* restore head's SL */ + loosen(); /* rebuild DISPLAY */ + update(c1, curah); + if (infmode){ + fprintf(stderr, + "\n(COMPACTIFIER used for process %d,%ld words reclaimed,now %ld free)\n", + thispix, + (long) (thisp->lastitem-thisp->lastused-1-nleng), + (long) (thisp->lastitem-thisp->lastused-1)); + fflush(stderr); + } +#ifdef CDBG + fprintf(ff, + "(COMPACTIFIER used for process %d,%ld words reclaimed,now %ld free)\n", + thispix, + (long) (thisp->lastitem-thisp->lastused-1-nleng), + (long) (thisp->lastitem-thisp->lastused-1)); + fflush(ff); +#endif + thisp->freeitem = 0; + thisp->headk2 = 0; + thisp->headk = thisp->lower; + M[ 1 ] = 1; /* absolute none */ + ic = lastic; /* re-decode current instruction ! */ + decode(); + if (opcode == 3 /*LRAISE*/) ic++; /* skip address after LRAISE */ +} /* end curtain */ + + +void compactify() /* Compactification */ +{ +#ifdef CDBG + ff=fopen("trace","a"); + fprintf(ff,"----------------------------------------\n"); + fprintf(ff,"COMPACTIFY (thisp=%d)\n",thispix); + fprintf(ff,"c1=%d,c2=%d,templ=%d\n", + thisp->c1,thisp->c2,thisp->template.addr); + fprintf(ff,"back=%d,back.mark=%d,backam=%d,backam.mark=%d\n", + thisp->backobj.addr,thisp->backobj.mark, + M[thisp->backobj.addr],M[thisp->backobj.addr+1]); + fprintf(ff,"blck1=%d,blck2=%d\n",thisp->blck1,thisp->blck2); + fflush(ff); +#endif + + phase1(); + phase2(); + phase2a(); /* garbage collection */ +/* phase3(); if only compactifier is needed uncomment this statement */ +/* and comment statement phase2a() */ + phase4(); + phase5(); + phase6(); + curtain(); + +#ifdef CDBG + fprintf(ff,"----------------------------------------\n"); + fflush(ff); + fclose(ff); +#endif + +} /* end compactify */ + + diff --git a/sources/new-s5r4/compact.o b/sources/new-s5r4/compact.o new file mode 100644 index 0000000000000000000000000000000000000000..368fea53d71c2895ec6c111dab046c4b7789d3a7 GIT binary patch literal 8390 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 OH4>G`{~4hZ2LB&C{<%T` literal 0 HcmV?d00001 diff --git a/sources/new-s5r4/control.c b/sources/new-s5r4/control.c new file mode 100644 index 0000000..efb6290 --- /dev/null +++ b/sources/new-s5r4/control.c @@ -0,0 +1,421 @@ +/* Loglan82 Compiler&Interpreter + Copyright (C) 1993 Institute of Informatics, University of Warsaw + Copyright (C) 1993, 1994 LITA, Pau + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + contacts: Andrzej.Salwicki@univ-pau.fr + +or Andrzej Salwicki + LITA Departement d'Informatique + Universite de Pau + Avenue de l'Universite + 64000 Pau FRANCE + tel. ++33 59923154 fax. ++33 59841696 + +======================================================================= +*/ + +#include "depend.h" +#include "genint.h" +#include "int.h" +#include "process.h" +#include "intproto.h" + +/* Transfer of control routines */ + +#ifndef NO_PROTOTYPES +static void att2(virtaddr *, word, word); +static void back1(word, word, virtaddr *, word *); +#else +static void att2(); +static void back1(); +#endif + +/* Transfer control to the newly created object. + */ + +void go(ah, am) +word ah, am; +{ + protdescr *ptr; + word pnum, plen, node, apt; + message msg; + + ptr = prototype[ M[ am+PROTNUM ] ]; + apt = am+M[ am ]; + if (ptr->kind == PROCESS) /* new process creation */ + { + thisp->template.addr = ah; /* save template address */ + thisp->template.mark = M[ ah+1 ]; + msg.control.type = CREATE; + msg.control.par = M[ am+PROTNUM ]; + moveparams(thispix, am, &msg, PARIN, LOADPAR); + msg.control.receiver.pix = 0; /* pix will create receiver */ + msg.control.receiver.mark= 0; /* mark will create receiver */ + msg.control.receiver.node = getnode(am); /* node we decided */ + sendmsg1( &msg); /* send create request */ +# ifdef RPCDBG + fprintf( + stderr, "send new process from %d to node %d\n", + thispix, + msg.control.receiver.node + ); +# endif + passivate(WAITFORNEW); /* and wait for return from process */ + } + else + if (isprocess((virtaddr*)(M+apt+SL))) /* remote procedure call */ + { + thisp->backobj.addr = ah; /* save template address */ + thisp->backobj.mark = M[ ah+1 ]; + thisp->M[ temporary ] = am; /* physical address also */ + { + virtaddr v; + loadvirt( v, apt+SL ); + obj2mess( M, &v, &msg.control.receiver ); +# ifdef RPCDBG + fprintf( + stderr, "send rpc from process %d to (%d,%d,%d)\n", + thispix, + msg.control.receiver.node, + msg.control.receiver.pix, + msg.control.receiver.mark + ); +# endif + } + msg.control.type = RPCALL; + msg.control.par = M[ am+PROTNUM ]; + moveparams(thispix, am, &msg, PARIN, LOADPAR); + sendmsg1( &msg); /* send RPC request */ + passivate(WAITFORRPC); /* and wait for RP return */ + } + else + { + M[ c1+M[ c1 ]+LSC ] = ic; /* save local control */ + loosen(); /* release DISPLAY */ + update(am, ah); /* update DISPLAY */ + c1 = am; /* new current */ + c2 = c1+ptr->span; + pnum = ptr->preflist; + plen = ptr->lthpreflist; + while (TRUE) /* search for executable prefix */ + if (plen <= 1) + { + ic = ptr->codeaddr; + break; + } + else + { + ptr = prototype[ M[ pnum ] ]; + plen--; + pnum++; + if (ptr->kind != RECORD) plen = 0; + } + } +} + + +/* Transfer control to a local unprefixed procedure, function, block, + * class or coroutine. + */ + +void goloc(ah, am) +word ah, am; +{ + word t1; + protdescr *ptr; + + M[ c1+M[ c1 ]+LSC ] = ic; /* save local control */ + c1 = am; /* new current */ + t1 = M[ am+PROTNUM ]; + ptr = prototype[ t1 ]; + c2 = am+ptr->span; + ic = ptr->codeaddr; + M[ display+t1 ] = am; /* simulate update display */ + M[ display2+t1 ] = ah; + M[ am+M[ am ]+STATSL ]++; +} + + +void backbl(virt, am) /* Return from block. */ +virtaddr *virt; +word *am; +{ + word t1; + + t1 = M[ c1+PROTNUM ]; + virt->addr = M[ display2+t1 ]; + virt->mark = M[ virt->addr+1 ]; /* prepare old address */ + *am = c1; /* am of old */ + M[ display+t1 ] = 0; /* simulate loosen */ + t1 = c1+M[ c1 ]; + M[ t1+STATSL ]--; /* remove from SL chain */ + c1 = M[ t1+SL ]; /* return up along SL */ + if (c1 == DUMMY) endprocess(0); /* return from main */ + c1 = M[ c1 ]; /* am of new current */ + c2 = c1+prototype[ M[ c1+PROTNUM ] ]->span; + ic = M[ c1+M[ c1 ]+LSC ]; + storevirt(*virt, *am+M[ *am ]+DL); /* force DL consistency */ +} + + +static void back1(at1, at2, virt, am) /* Common code for some backs below. */ +word at1, at2; +virtaddr *virt; +word *am; +{ + word t1; + + loosen(); + if (at1 == 0) endprocess(0); + t1 = M[ c1+PROTNUM ]; + virt->addr = M[ display2+t1 ]; /* ah of old */ + virt->mark = M[ virt->addr+1 ]; + *am = c1; /* am of old */ + storevirt(*virt, at2); /* loop up DL */ + at2 = M[ at1 ]; /* am of DL */ + update(at2, at1); + c1 = at2; + c2 = c1 + prototype[ M[ c1+PROTNUM ] ]->span; + ic = M[ c1+M[ c1 ]+LSC ]; +} + + +/* Return from classes, coroutines and by end from procedures. + */ + +void back(virt, am, length) +virtaddr *virt; +word *am; +word length; +{ + word t1, t2, plist; + int i; + protdescr *ptr; + message msg; + + t2 = c1+M[ c1 ]; + t1 = M[ t2+DL ]; /* ah of DL */ + ptr = prototype[ M[ c1+PROTNUM ] ]; /* prototype of current */ + if (ptr->kind == PROCESS) /* RETURN in process */ + { +# ifdef RPCDBG + fprintf( stderr, "return from process %d\n", thispix ); +# endif + if (M[ c1+PROTNUM ] == MAINBLOCK) endprocess(0); + { + virtaddr v; + loadvirt( v, t2+DL ); + obj2mess( M, &v, &msg.control.receiver ); /* father process */ + } + msg.control.type = CREACK; + moveparams(thispix, c1, &msg, PAROUT, LOADPAR); + sendmsg1(&msg); /* send create acknowledge */ + M[ t2+DL ] = 0; /* cut DL of new process head */ + passivate(STOPPED); /* and suspend new process */ + } + else + if (ptr->kind == COROUTINE) + { + if (t1 != 0) /* nothing if detached */ + { + M[ t2+LSC ] = ic; + back1(t1, t2+DL, virt, am); + } + } + else + { + plist = ic; /* save begining of prototype list */ + if (ptr->lthpreflist==1 && t1==M[t2+SL] && M[t2+DL+1]==M[t2+SL+1]) + backbl(virt, am); + else + back1(t1, t2+DL, virt, am); + +/* +# ifdef RPCDBG + fprintf( + stderr, "back (thisp=%d) from %s to %s\n", + thispix, + ( + (ptr->kind==PROCEDURE) ? + "PROCEDURE" : + (ptr->kind==FUNCTION) ? + "FUNCTION" : + "???" + ), + isprocess((virtaddr*)(M+t2+RPCDL)) ? "PROCESS" : "OBJECT" + ); +# endif +*/ + if ((ptr->kind == PROCEDURE || ptr->kind == FUNCTION) && + isprocess((virtaddr*)(M+t2+RPCDL))) + { + { + virtaddr v; + loadvirt( v, t2+RPCDL ); + obj2mess( M, &v, &msg.control.receiver ); /* remote DL */ + } +# ifdef RPCDBG + fprintf( + stderr, "send rpc ack from process %d to (%d,%d,%d)\n", + thispix, + msg.control.receiver.node, + msg.control.receiver.pix, + msg.control.receiver.mark + ); +# endif + msg.control.type = RPCACK; + moveparams(thispix, *am, &msg, PAROUT, LOADPAR); + sendmsg1(&msg); /* send RP return - acknowledge */ + gkill(virt); /* kill procedure object manualy */ + popmask(thispix); /* restore RPC mask from stack */ + for (i = 0; i < length; i++) /* and modify it */ + { + t1 = virtprot(M[ plist++ ]); /* prototype number */ + if (t1 > 0) enable(thispix, t1); + else disable(thispix, -t1); + } + evaluaterpc(thispix); /* check for enabled RPCs */ + } + } +} + + +/* Return, end in procedures and functions without prefix. + */ + +void backpr(virt, am) +virtaddr *virt; +word *am; +{ + word t1, t2, t3; + + t2 = c1+M[ c1 ]+DL; /* DL pointer of current */ + t1 = M[ t2 ]; /* ah of DL */ + t3 = c1+M[ c1 ]+SL; /* SL pointer */ + if (t1 == M[ t3 ] && M[ t2+1 ] == M[ t3+1 ]) backbl(virt, am); /* SL=DL */ + else back1(t1, t2, virt, am); +} + + +void fin(backic, virt, am) /* End in classes and coroutines. */ +word backic; +virtaddr *virt; +word *am; +{ + word t1, t2, knd; + + knd = prototype[ M[ c1+PROTNUM ] ]->kind; + if (knd != COROUTINE && knd != PROCESS) + back(virt, am, (word) 0); /* a class - exit as above */ + else + { + ic = backic; /* backspace ic */ + t2 = c1+M[ c1 ]; + t1 = M[ t2+DL ]; /* ah of DL */ + if (t1 == 0) + { + if (M[ t2+SL ] == DUMMY) endprocess(0); + ic = 0; /* coroutine terminated */ + *am = 0; + detach(); + } + else + { + M[ t2+LSC ] = ic; + back1(t1, t2+DL, virt, am); + } + } +} + + +static void att2(virt, ax, at1) /* Helper for attach/detach */ +virtaddr *virt; +word ax, at1; +{ + word t1, t2, phead; + + t1 = M[ display2+M[ c1+PROTNUM ] ]; /* ah of current */ + t2 = at1+M[ at1 ]+DL; /* DL of coroutine head */ + M[ t2 ] = t1; /* loop up DL */ + M[ t2+1 ] = M[ t1+1 ]; + M[ c1+M[ c1 ]+LSC ] = ic; /* preserve local control */ + loosen(); + phead = thisp->prochead; + storevirt(*virt, phead+M[ phead ]+CHD); + t2 = M[ ax+DL ]; + if (t2 == 0) errsignal(RTECORAC); /* coroutine active */ + M[ ax+DL ] = 0; /* cut DL of new coroutine head */ + c1 = M[ t2 ]; + update(c1, t2); + c2 = c1+prototype[ M[ c1+PROTNUM ] ]->span; + ic = M[ c1+M[ c1 ]+LSC ]; + if (ic == 0) errsignal(RTECORTM); /* coroutine terminated */ +} + + +void attach(virt) +virtaddr *virt; +{ + word t1, ax, phead, chead; + int knd; + + if (M[ virt->addr+1 ] != virt->mark) errsignal(RTEILLAT); + else ax = M[ virt->addr ]; /* am */ + t1 = M[ ax+PROTNUM ]; + if (t1 == AINT || t1 == AREAL || t1 == AVIRT || t1 == FILEOBJECT) + errsignal(RTEILLAT); + knd = prototype[ t1 ]->kind; + if (knd != COROUTINE && knd != PROCESS) errsignal(RTEILLAT); + ax = ax+M[ ax ]; + phead = thisp->prochead; + chead = phead+M[ phead ]+CHD; + if (virt->addr != M[ chead ] || virt->mark != M[ chead+1 ]) + { + M[ ax+CL ] = M[ chead ]; + M[ ax+CL+1 ] = M[ chead+1 ]; + att2(virt, ax, M[ M[ chead ] ]); + } +} + + +void detach() +{ + virtaddr virt; + word t1, phead; + + phead = thisp->prochead; + t1 = M[ M[ phead+M[ phead ]+CHD ] ]; /* am of coroutine head */ + loadvirt(virt, t1+M[ t1 ]+CL); /* coroutine link */ + if (M[ virt.addr+1 ] != virt.mark) errsignal(RTEILLDT); + att2(&virt, M[ virt.addr ]+M[ M[ virt.addr ] ], t1); +} + + +void inner(level) /* Simulate execution of inner */ +word level; +{ + word t1; + protdescr *ptr; + + ptr = prototype[ M[ c1+PROTNUM ] ]; /* prototype of current */ + t1 = ptr->lthpreflist; + if (t1 != level) + if (level == t1-1) ic = ptr->codeaddr; + else ic = prototype[ M[ ptr->preflist+level ] ]->codeaddr; +} + + diff --git a/sources/new-s5r4/control.o b/sources/new-s5r4/control.o new file mode 100644 index 0000000000000000000000000000000000000000..696f282fc13a30fc5b7ebf5e9a29edd5fe71b5f5 GIT binary patch literal 8097 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 +#include +#include +#include +#include + + +typedef struct { + char opcode; + char args[ 3 ]; + } extopcode; + +typedef char *lword; /* max(word, char *) but in every case was char* */ + +#define BINARYREAD "rb" +#define BINARYWRITE "wb" +#define DIRECTOLD "r+b" +#define DIRECTNEW "w+b" + + +#if WORD_16BIT + +typedef int word; +typedef float real; +typedef word *memory; + +#if UNIX +extern char *calloc(int,int); +#endif + +#define mallocate(n) ((memory) (char /*|||huge*/ *) calloc((n),sizeof(word))) +#define ballocate(n) ((char /*|||huge*/ *) calloc((n),1)) + +#define MAXINTEGER 0x7FFF +#define DEFMEMSIZE 0x7FF0 /* 32K words = 64K bytes */ +#define MAXMEMSIZE 0x7FF0 /* 32K words = 64K bytes */ + +#endif + + + +#if DWORD_16BIT + +typedef long word; +typedef double real; +typedef word huge *memory; + +#if UNIX + +extern char *calloc(int,int); + +#define mallocate(n) (((n)<60000)?(memory) calloc((n),sizeof(word)):abort()) +#define ballocate(n) (calloc((n),1)) + +#define MAXINTEGER 0x7FFFFFFFL +#define DEFMEMSIZE 0x13C00L /* 79K words = 316K bytes */ +#define MAXMEMSIZE 0x400000L /* 4M words = 16M bytes */ + +#elif OS2 + +extern char huge *halloc(); + +#define mallocate(n) ((memory) halloc((long) (n), sizeof(word))) +#define ballocate(n) (halloc((long) (n),1L)) + +#define MAXINTEGER 0x7FFFFFFFL +#define DEFMEMSIZE 0x13C00L /* 79K words = 316K bytes */ +#define MAXMEMSIZE 0x400000L /* 4M words = 16M bytes */ + +#define INCL_DOSINFOSEG + +#include + +#elif MSDOS && TURBOC + +extern char far *farcalloc(); + +#define mallocate(n) ((memory) farcalloc((long) (n), (long) sizeof(word))) +#define ballocate(n) (farcalloc((long) (n),1L)) + +#define MAXINTEGER 0x7FFFFFFFL +#define DEFMEMSIZE 0x14000L /* 80K words = 320K bytes */ +#define MAXMEMSIZE 0x28000L /* 160K words = 640K bytes */ + +#elif MSDOS + +extern void huge *halloc(); +#define mallocate(n) ((memory) halloc((long) (n), sizeof(word))) +#define ballocate(n) (halloc((long) (n),1)) + +#define MAXINTEGER 0x7FFFFFFFL +#define DEFMEMSIZE 0xF000L /* 60K words = 120K bytes */ +#define MAXMEMSIZE 0x28000L /* 160K words = 640K bytes */ + +#else +#error Allocation macros not defined. +#endif + +#endif + + + +#if WORD_32BIT + +typedef int word; +typedef float real; +typedef word *memory; + +#define mallocate(n) ((memory) (char *) calloc((n),sizeof(word))) +#define ballocate(n) ((char *) calloc((n),1)) + +/* printf("|%d*4|",(n)),getchar(),\ */ + +#define MAXINTEGER 0x7FFFFFFFL +#define DEFMEMSIZE 0x13C00L /* 79K words = 316K bytes */ +#define MAXMEMSIZE 0x400000L /* 4M words = 16M bytes */ + +#endif + + diff --git a/sources/new-s5r4/dlink.asm b/sources/new-s5r4/dlink.asm new file mode 100644 index 0000000..76d31d6 --- /dev/null +++ b/sources/new-s5r4/dlink.asm @@ -0,0 +1,327 @@ +/* Loglan82 Compiler&Interpreter + Copyright (C) 1993 Institute of Informatics, University of Warsaw + Copyright (C) 1993, 1994 LITA, Pau + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + contacts: Andrzej.Salwicki@univ-pau.fr + +or Andrzej Salwicki + LITA Departement d'Informatique + Universite de Pau + Avenue de l'Universite + 64000 Pau FRANCE + tel. ++33 59923154 fax. ++33 59841696 + +======================================================================= +*/ + + NAME CINTA + PUBLIC _logon, _logoff, _attention, _ignore, _send, _receive + EXTRN _endrun:FAR, COPYOK:FAR + +DGROUP GROUP _data + +CINTA_TEXT SEGMENT PUBLIC 'CODE' + ASSUME CS:DRIVER + +; PATCH FOR RECEIVE MESSAGE INTERRUPT HANDLER +PATCH PROC FAR + PUSHF + PUSH AX + PUSH BX + PUSH CX + PUSH DX + PUSH DS + PUSH ES + CALL FAR PTR _ignore ; DISABLE ATTENTION + MOV AX, DGROUP + MOV DS, AX + ASSUME CS:DRIVER, DS:DGROUP + PUSH AX + MOV AX, OFFSET DGROUP:MSGBUF + PUSH AX + CALL FAR PTR _receive + CALL DWORD PTR MSGINT + ADD SP, 4 + POP ES + POP DS + POP DX + POP CX + POP BX + POP AX + POPF + RET +PATCH ENDP +PATLEN = $-PATCH +SAVLEN = PATLEN +CINTA_TEXT ENDS + +_data SEGMENT WORD PUBLIC 'data' +SAVCOD DB SAVLEN DUP(?) ; SPACE FOR SAVING PATCHED CODE +USER DB 8 DUP(?) +MSGBUF DB 80 DUP(' ') +MSGINT DD ? +_data ENDS + +; SEGMENT FOR ADDRESSING DRIVER CODE +DRIVER SEGMENT AT 0 + ORG 102EH ; ***** ONLY FOR D-LINK VERSION 3.21 ***** +DISPLAY LABEL FAR ; RECEIVE MESSAGE INTERRUPT HANDLER + ORG $+PATLEN +DRIVER ENDS + +CINTA_TEXT SEGMENT 'CODE' + ASSUME CS:CINTA_TEXT + +NETWORK DB 0 ; NETWORK OPERATION FLAG + +BREAK PROC FAR ; CONTROL-BREAK INTERRUPT ROUTINE + MOV AX, DGROUP + MOV DS, AX + CALL _endrun + RET 2 +BREAK ENDP + +; int logon(msgint) +; void (*msgint)(); +; +; CHECK IF DRIVER IS INSTALLED AND CONNECT TO RECEIVE MESSAGE INTERRUPT HANDLER. +; RETURN NODE NUMBER (-1 MEANS NODE NOT LOGGED ON) + +_logon PROC FAR + PUSH BP + MOV BP,SP + PUSH SI + PUSH DI + PUSH DS + PUSH AX ; PUSH DUMMY PARAMETER FOR COPYOK + PUSH AX + CALL COPYOK ; CHECK FOR AUTHORIZATION + OR AX, AX + JZ NOTAUT ; UNAUTHORIZED DUPLICATE + MOV AX, 2523H ; REPLACE CONTROL-BREAK INTERRUPT + MOV DX, OFFSET BREAK + PUSH CS + POP DS + INT 21H + MOV AX, 357DH ; GET NIOS VECTOR INTO ES:BX + INT 21H + CMP WORD PTR ES:[BX-2], 'ns' + JNE NONE ; DRIVER NOT INSTALLED + MOV AH, 17H ; GET NIOS VERSION NUMBER + INT 7DH + CMP AX, 1503H ; IS VERSION = 3.21 + JNE NONE ; INCORRECT NIOS VERSION + PUSH ES + POP DS + MOV AX, DGROUP + MOV ES, AX + ASSUME CS:CINTA_TEXT, DS:DRIVER, ES:DGROUP + MOV BX, OFFSET DGROUP:USER + MOV AH, 02H ; GET USER NAME + MOV DL, 0FFH ; OUR NODE (UNKNOWN YET) + INT 7DH + OR AL, AL + JNZ NONE + MOV NETWORK, 1 ; FLAG NETWORK INSTALLED + CLD + MOV SI, OFFSET DISPLAY + MOV DI, OFFSET DGROUP:SAVCOD + MOV CX, SAVLEN + REP MOVSB + CALL FAR PTR _ignore ; DISABLE ATTENTION FOR A MOMENT + PUSH DS ; AND REPLACE WITH OUR + POP ES + PUSH CS + POP DS + ASSUME CS:CINTA_TEXT, DS:CINTA_TEXT, ES:DRIVER + MOV SI, OFFSET PATCH + MOV DI, OFFSET DISPLAY + MOV CX, PATLEN + REP MOVSB + MOV AX, DGROUP + MOV DS, AX + ASSUME CS:CINTA_TEXT, DS:DGROUP, ES:DRIVER + MOV AX, [BP+6] ; STORE ADDRESS OF USER INTERRUPT ROUTINE + MOV WORD PTR MSGINT, AX + MOV AX, [BP+8] + MOV WORD PTR MSGINT+2, AX + MOV AL, DL ; RETURN OUR NODE NUMBER + XOR AH, AH + JMP SHORT L1 +NONE: MOV AX, -1 + MOV NETWORK, 0 + JMP SHORT L1 +NOTAUT: MOV AX, -2 +L1: POP DS + POP DI + POP SI + POP BP + RET +_logon ENDP + + +; void logoff() +; +; RESTORE ORIGINAL INTERRUPT HANDLER + +_logoff PROC FAR + PUSH BP + MOV BP,SP + PUSH SI + PUSH DI + PUSH DS + ASSUME CS:CINTA_TEXT + CMP NETWORK, 0 + JZ L2 ; NOTHING IF NO NETWORK + CALL FAR PTR _ignore ; DISABLE ATTENTION FOR A MOMENT + CLD + MOV AX,DGROUP + MOV DS,AX + MOV AX,357DH ; GET DRIVER SEGMENT INTO ES + INT 21H + ASSUME CS:CINTA_TEXT, DS:DGROUP, ES:DRIVER + MOV SI,OFFSET DGROUP:SAVCOD + MOV DI,OFFSET DISPLAY + MOV CX,SAVLEN + REP MOVSB ; RESTORE PATCHED CODE + CALL FAR PTR _attention ; ATTENTION BACK ON +L2: POP DS + POP DI + POP SI + POP BP + RET +_logoff ENDP + + +; void attention() +; +; ENABLE ATTENTION + +_attention PROC FAR + CMP NETWORK, 0 + JZ A1 + MOV AX,1600H + INT 7DH +A1: RET +_attention ENDP + + +; void ignore() +; +; DISABLE ATTENTION + +_ignore PROC FAR + CMP NETWORK, 0 + JZ I1 + MOV AX,16FFH + INT 7DH +I1: RET +_ignore ENDP + + +; int send(node, msg) +; int node; +; message *msg; +; +; SEND MESSAGE MSG TO NODE + +_send PROC FAR + PUSH BP + MOV BP,SP + MOV AH,0DH ; SEND MESSAGE + MOV DL,[BP+6] ; NODE NUMBER + LES BX,[BP+8] ; BUFFER ADDRESS + INT 7DH + XOR AH,AH + POP BP + RET +_send ENDP + + +; int receive(msg) +; message *msg; +; +; GET STORED MESSAGE + +_receive PROC FAR + PUSH BP + MOV BP,SP + MOV AH,0EH ; GET MESSAGE + LES BX,[BP+6] ; BUFFER ADDRESS + INT 7DH + XOR AH,AH + POP BP + RET +_receive ENDP + + +; FUNCTION TICKS:INTEGER4; +; RETURN BIOS TIME IN TICKS +TICKS PROC FAR + MOV AH,0 + INT 1AH + MOV AX,DX ; LOW WORD + MOV DX,CX ; HIGH WORD + RET +TICKS ENDP + +; PROCEDURE DTIME(VAR H,M,S:INTEGER); +; RETURN DOS DAY TIME IN HOURS, MINUTES, AND SECONDS +DTIME PROC FAR + PUSH BP + MOV BP,SP + MOV AH,2CH ; GET TIME + INT 21H + MOV BX,[BP+10] + MOV [BX],CH ; HOURS + MOV BYTE PTR [BX+1],0 + MOV BX,[BP+8] + MOV [BX],CL ; MINUTES + MOV BYTE PTR [BX+1],0 + MOV BX,[BP+6] + MOV [BX],DH ; SECONDS + MOV BYTE PTR [BX+1],0 + POP BP + RET 6 +DTIME ENDP + +; FUNCTION SHIFT(PATTERN, COUNT:INTEGER):INTEGER; +; SHIFT LEFT LOGICALY PATTERN BY COUNT BITS +SHIFT PROC FAR + PUSH BP + MOV BP,SP + MOV AX,[BP+8] ; PATTERN + MOV CL,[BP+6] ; BIT COUNT + AND CL,0FH ; MASK LOW 4 BITS + TEST CL,08H ; TEST THEIR SIGN BIT + JZ S0 ; OK IF POSITIVE + OR CL,0F0H ; EXTEND SIGN TO ENTIRE BYTE IF NEGATIVE +S0: CMP CL,0 ; TEST BIT COUNT ONCE AGAIN + JZ S2 ; IF = 0 DO NOTHING + JG S1 ; IF > 0 SHIFT LEFT + NEG CL ; IF < 0 NEGATE BIT COUNT AND + SHR AX,CL ; SHIFT RIGHT + JMP SHORT S2 +S1: SHL AX,CL ; SHIFT LEFT +S2: POP BP + RET 4 +SHIFT ENDP + +CINTA_TEXT ENDS + END + + diff --git a/sources/new-s5r4/dlink.h b/sources/new-s5r4/dlink.h new file mode 100644 index 0000000..4bc477c --- /dev/null +++ b/sources/new-s5r4/dlink.h @@ -0,0 +1,54 @@ +/* Loglan82 Compiler&Interpreter + Copyright (C) 1993 Institute of Informatics, University of Warsaw + Copyright (C) 1993, 1994 LITA, Pau + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + contacts: Andrzej.Salwicki@univ-pau.fr + +or Andrzej Salwicki + LITA Departement d'Informatique + Universite de Pau + Avenue de l'Universite + 64000 Pau FRANCE + tel. ++33 59923154 fax. ++33 59841696 + +======================================================================= +*/ + +#ifndef __DLINK_H__ +#define __DLINK_H__ + +#ifndef NO_PROTOTYPES + +int net_logon( void (*)() ); +void net_logoff( void ); +void net_attention( void ); +int net_send(int,message *); +void net_ignore( void ); + +#else + +int net_logon(); +void net_logoff(); +void net_attention(); +int net_send(); +void net_ignore(); + +#endif + +#endif + + diff --git a/sources/new-s5r4/dosgraf1.c b/sources/new-s5r4/dosgraf1.c new file mode 100644 index 0000000..ff56740 --- /dev/null +++ b/sources/new-s5r4/dosgraf1.c @@ -0,0 +1,79 @@ +/* Loglan82 Compiler&Interpreter + Copyright (C) 1993 Institute of Informatics, University of Warsaw + Copyright (C) 1993, 1994 LITA, Pau + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + contacts: Andrzej.Salwicki@univ-pau.fr + +or Andrzej Salwicki + LITA Departement d'Informatique + Universite de Pau + Avenue de l'Universite + 64000 Pau FRANCE + tel. ++33 59923154 fax. ++33 59841696 + +======================================================================= +*/ + +#include +#include "graf\graf.h" + + +static union REGS r; + +#ifndef NO_PROTOTYPES +static char *normalize(char *); +static int mouse(int,word *,word *,word *); +#else +static char *normalize(); +static int mouse(); +#endif + + + +static char *normalize(addr) /* Normalize segmented address */ + char *addr; +{ + union{ + char *address; + unsigned int words[2]; + } conv; + conv.address = addr; +#if !WORD_32BIT + conv.words[1] += conv.words[0] / 16; + conv.words[0] %= 16; +#endif + return (conv.address); +} + + + +static int mouse(func, bx, cx, dx) /* Call mouse driver INT 33H */ +int func; +word *bx, *cx, *dx; +{ + union REGS r; + r.x.ax = func; + r.x.bx = *bx; + r.x.cx = *cx; + r.x.dx = *dx; + int86(0x33, &r, &r); + *bx = (int) r.x.bx; + *cx = (int) r.x.cx; + *dx = (int) r.x.dx; + return(r.x.ax); +} + diff --git a/sources/new-s5r4/dosgraf2.c b/sources/new-s5r4/dosgraf2.c new file mode 100644 index 0000000..e82040a --- /dev/null +++ b/sources/new-s5r4/dosgraf2.c @@ -0,0 +1,263 @@ +/* Loglan82 Compiler&Interpreter + Copyright (C) 1993 Institute of Informatics, University of Warsaw + Copyright (C) 1993, 1994 LITA, Pau + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + contacts: Andrzej.Salwicki@univ-pau.fr + +or Andrzej Salwicki + LITA Departement d'Informatique + Universite de Pau + Avenue de l'Universite + 64000 Pau FRANCE + tel. ++33 59923154 fax. ++33 59841696 + +======================================================================= +*/ + + case GRON : + gron((int *) ¶m[ 0 ].xword); + graphmode = TRUE; + break; + + case GROFF : + groff(); + graphmode = FALSE; + break; + + case CLS : + cls(); + break; + + case POINT : + point((int *) ¶m[ 0 ].xword, (int *) ¶m[ 1 ].xword); + break; + + case MOVE : + move((int *) ¶m[ 0 ].xword, (int *) ¶m[ 1 ].xword); + break; + + case DRAW : + draw((int *) ¶m[ 0 ].xword, (int *) ¶m[ 1 ].xword); + break; + + case HFILL : + hfill((int *) ¶m[ 0 ].xword); + break; + + case VFILL : + vfill((int *) ¶m[ 0 ].xword); + break; + + case COLOR : + color((int *) ¶m[ 0 ].xword); + break; + + case STYLE : + style((int *) ¶m[ 0 ].xword); + break; + + case PATERN : + patern((int *) ¶m[ 0 ].xword, (int *) ¶m[ 1 ].xword, + (int *) ¶m[ 2 ].xword, (int *) ¶m[ 3 ].xword); + break; + + case INTENS : + intens((int *) ¶m[ 0 ].xword); + break; + + case PALETT : + pallet((int *) ¶m[ 0 ].xword); + break; + + case BORDER : + border((int *) ¶m[ 0 ].xword); + break; + + case VIDEO : + if (member(¶m[ 0 ].xvirt, &am)) + if (M[ am ] >= 0x8000L/sizeof(word)) + video(normalize((char *) &M[ am+3 ])); + else errsignal(RTEILLAB); + else errsignal(RTEREFTN); + break; + + case HPAGE : + i = (int) param[ 1 ].xword; + if (i == 0) graphmode = FALSE; + else + if (i == 1) graphmode = TRUE; + hpage((int *) ¶m[ 0 ].xword, &i, + (int *) ¶m[ 2 ].xword); + break; + + case NOCARD : + param[ 0 ].xword = nocard(NULL); + break; + + case PUSHXY : + pushxy(); + break; + + case POPHXY : + popxy(); + break; + + case INXPOS : + param[ 0 ].xword = inxpos(NULL); + break; + + case INYPOS : + param[ 0 ].xword = inypos(NULL); + break; + + case INPIX : + param[ 2 ].xword = inpix((int *) ¶m[ 0 ].xword, + (int *) ¶m[ 1 ].xword); + break; + + case GETMAP : + t1 = abs(param[ 0 ].xword-inxpos(NULL))+1; /* cols */ + t2 = abs(param[ 1 ].xword-inypos(NULL))+1; /* rows */ + t1 = (4+t1*t2+sizeof(word)-1)/sizeof(word); /* no. of words, pixel=byte */ + newarry((word) 1, t1, (word)AINT, ¶m[ 2 ].xvirt, &am); + getmap((int *) ¶m[ 0 ].xword, (int *) ¶m[ 1 ].xword, + normalize((char *) &M[ am+3 ])); + break; + + case PUTMAP : + if (member(¶m[ 0 ].xvirt, &am)) + putmap(normalize((char *) &M[ am+3 ])); + else errsignal(RTEREFTN); + break; + + case ORMAP : + if (member(¶m[ 0 ].xvirt, &am)) + ormap(normalize((char *) &M[ am+3 ])); + else errsignal(RTEREFTN); + break; + + case XORMAP : + if (member(¶m[ 0 ].xvirt, &am)) + xormap(normalize((char *) &M[ am+3 ])); + else errsignal(RTEREFTN); + break; + + case TRACK : + track((int *) ¶m[ 0 ].xword, (int *) ¶m[ 1 ].xword); + break; + + case INKEY : + param[ 0 ].xword = inkey(NULL); + break; + + case HASCII : + hascii((int *) ¶m[ 0 ].xword); + break; + + case HFONT : + hfont((int *) ¶m[ 0 ].xword, (int *) ¶m[ 1 ].xword); + break; + + case HFONT8 : + param[ 0 ].xword = 0; + param[ 1 ].xword = 0; + hfont8((int *) ¶m[ 0 ].xword, (int *) ¶m[ 1 ].xword); + break; + + case OUTSTRING : + t1 = strings+param[ 0 ].xword; + outhli((int *) &M[ t1 ], (char *) &M[ t1+1 ]); + break; + + case CIRB : + r1 = param[ 3 ].xreal; + r2 = param[ 4 ].xreal; + cirb((int *) ¶m[ 0 ].xword, (int *) ¶m[ 1 ].xword, + (int *) ¶m[ 2 ].xword, &r1, &r2, + (int *) ¶m[ 5 ].xword, (int *) ¶m[ 6 ].xword, + (int *) ¶m[ 7 ].xword, (int *) ¶m[ 8 ].xword); + break; + +/* MOUSE */ + + case INIT : + ax = mouse(0, ¶m[ 0 ].xword, &cx, &dx); + param[ 1 ].xbool = lbool(ax); + break; + + case SHOWCURSOR : + mouse(1, &bx, &cx, &dx); + break; + + case HIDECURSOR : + mouse(2, &bx, &cx, &dx); + break; + + case STATUS : + mouse(3, &bx, ¶m[ 0 ].xword, ¶m[ 1 ].xword); + param[ 2 ].xbool = lbool(bx & 0x01); + param[ 3 ].xbool = lbool(bx & 0x02); + param[ 4 ].xbool = lbool(bx & 0x04); + break; + + case SETPOSITION : + mouse(4, &bx, ¶m[ 0 ].xword, ¶m[ 1 ].xword); + break; + + case GETPRESS : + case GETRELEASE : + i = ( nrproc == GETPRESS ? 5 : 6 ); + bx = param[ 0 ].xword; + ax = mouse(i, &bx, ¶m[ 1 ].xword, ¶m[ 2 ].xword); + param[ 4 ].xbool = lbool(ax & 0x01); + param[ 5 ].xbool = lbool(ax & 0x02); + param[ 6 ].xbool = lbool(ax & 0x04); + param[ 3 ].xword = bx; + break; + + case SETWINDOW : + mouse(7, &bx, ¶m[ 0 ].xword, ¶m[ 1 ].xword); + mouse(8, &bx, ¶m[ 2 ].xword, ¶m[ 3 ].xword); + break; + + case DEFCURSOR : + mouse(10, ¶m[ 0 ].xword, ¶m[ 1 ].xword, + ¶m[ 2 ].xword); + break; + + case GETMOVEMENT : + mouse(11, &bx, ¶m[ 0 ].xword, ¶m[ 1 ].xword); + break; + + case SETSPEED : + mouse(15, &bx, ¶m[ 0 ].xword, ¶m[ 1 ].xword); + break; + + case SETMARGINS : + r.x.ax = 16; + r.x.cx = param[ 0 ].xword; + r.x.dx = param[ 2 ].xword; + r.x.si = param[ 1 ].xword; + r.x.di = param[ 3 ].xword; + int86(0x33, &r, &r); + break; + + case SETTHRESHOLD : + mouse(19, &bx, &cx, ¶m[ 0 ].xword); + break; + + diff --git a/sources/new-s5r4/eventque.h b/sources/new-s5r4/eventque.h new file mode 100644 index 0000000..517d2c1 --- /dev/null +++ b/sources/new-s5r4/eventque.h @@ -0,0 +1,144 @@ +/** + ** EVENTQUE.H + ** + ** Copyright (C) 1992, Csaba Biegl + ** 820 Stirrup Dr, Nashville, TN, 37221 + ** csaba@vuse.vanderbilt.edu + ** + ** This file is distributed under the terms listed in the document + ** "copying.cb", available from the author at the address above. + ** A copy of "copying.cb" should accompany this file; if not, a copy + ** should be available from where this file was obtained. This file + ** may not be distributed without a verbatim copy of "copying.cb". + ** You should also have received a copy of the GNU General Public + ** License along with this program (it is in the file "copying"); + ** if not, write to the Free Software Foundation, Inc., 675 Mass Ave, + ** Cambridge, MA 02139, USA. + ** + ** This program is distributed in the hope that it will be useful, + ** but WITHOUT ANY WARRANTY; without even the implied warranty of + ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + ** GNU General Public License for more details. + **/ + +#ifndef _EVENTQUE_H_ +#define _EVENTQUE_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * structures: + * BE CAREFUL when hacking!!! -- 16 and 32 bit compilers have to generate + * the same alignments + */ +typedef struct { + unsigned char evt_type; /* event type: 0: keyboard, 1: mouse */ + unsigned char evt_kbstat; /* keyboard status (ALT, SHIFT, etc..) */ + unsigned char evt_mask; /* mouse event mask */ + unsigned char evt_button; /* button status */ + unsigned short evt_xpos; /* X coord (or keycode if keybd event) */ + unsigned short evt_ypos; /* Y coord */ + unsigned long evt_time; /* time stamp of event */ +#define evt_keycode evt_xpos /* reuse this slot for keybd events !! */ +#define evt_scancode evt_ypos /* store here the BIOS scan code */ +} EventRecord; + +typedef struct { + unsigned short evq_maxsize; /* max size of event queue */ + unsigned short evq_cursize; /* number of events in the queue */ + unsigned short evq_rdptr; /* next event to read */ + unsigned short evq_wrptr; /* next event to be written */ + short evq_xpos; /* current X coordinate of mouse */ + short evq_ypos; /* current Y coordinate of mouse */ + short evq_xmin; /* minimal mouse X coordinate */ + short evq_ymin; /* minimal mouse Y coordinate */ + short evq_xmax; /* maximal mouse X coordinate */ + short evq_ymax; /* maximal mouse Y coordinate */ + short evq_xspeed; /* horizontal speed (mickey/coord) */ + short evq_yspeed; /* vertical speed (mickey/coord) */ + unsigned short evq_thresh; /* fast movement threshold */ + unsigned short evq_accel; /* multiplier for fast move */ + unsigned char evq_drawmouse; /* interrupt handler has to draw mouse */ + unsigned char evq_moved; /* set if mouse moved */ + unsigned char evq_delchar; /* character removed from BIOS buffer */ + unsigned char evq_enable; /* event generation control flag */ + EventRecord evq_events[1]; /* event buffer space */ +} EventQueue; + +/* + * event types + */ +#define EVENT_KEYBD 0 +#define EVENT_MOUSE 1 + +/* + * MOUSE event flag bits + * (also defined in "mousex.h" of the graphics library) + */ +#ifndef M_MOTION + +#define M_MOTION 0x001 +#define M_LEFT_DOWN 0x002 +#define M_LEFT_UP 0x004 +#define M_RIGHT_DOWN 0x008 +#define M_RIGHT_UP 0x010 +#define M_MIDDLE_DOWN 0x020 +#define M_MIDDLE_UP 0x040 +#define M_BUTTON_DOWN (M_LEFT_DOWN | M_MIDDLE_DOWN | M_RIGHT_DOWN) +#define M_BUTTON_UP (M_LEFT_UP | M_MIDDLE_UP | M_RIGHT_UP) +#define M_BUTTON_CHANGE (M_BUTTON_UP | M_BUTTON_DOWN ) + +/* + * MOUSE button status bits + */ +#define M_LEFT 1 +#define M_RIGHT 2 +#define M_MIDDLE 4 + +#endif /* M_MOTION */ + +/* + * KEYBOARD status word bits + * (also defined in "mousex.h" of the graphics library) + */ +#ifndef KB_SHIFT + +#define KB_RIGHTSHIFT 0x01 /* right shift key depressed */ +#define KB_LEFTSHIFT 0x02 /* left shift key depressed */ +#define KB_CTRL 0x04 /* CTRL depressed */ +#define KB_ALT 0x08 /* ALT depressed */ +#define KB_SCROLLOCK 0x10 /* SCROLL LOCK active */ +#define KB_NUMLOCK 0x20 /* NUM LOCK active */ +#define KB_CAPSLOCK 0x40 /* CAPS LOCK active */ +#define KB_INSERT 0x80 /* INSERT state active */ + +#define KB_SHIFT (KB_LEFTSHIFT | KB_RIGHTSHIFT) + +#endif /* KB_SHIFT */ + +/* + * set this bit in 'evq_enable' to generate the corresponding event + */ +#define EVENT_ENABLE(type) (1 << (type)) + +/* + * prototypes + */ +#if defined(__TURBOC__) && defined(FOR_GO32) +EventQueue *EventQueueInit(int qsize,int ms_stksize,void (*msdraw)(void),int,int); +#else +EventQueue *EventQueueInit(int qsize,int ms_stksize,void (*msdraw)(void)); +#endif + +void EventQueueDeInit(void); +int EventQueueNextEvent(EventQueue *q,EventRecord *e); + +#ifdef __cplusplus +} +#endif + +#endif /* whole file */ + + diff --git a/sources/new-s5r4/execute.c b/sources/new-s5r4/execute.c new file mode 100644 index 0000000..c3a08c5 --- /dev/null +++ b/sources/new-s5r4/execute.c @@ -0,0 +1,618 @@ +/* Loglan82 Compiler&Interpreter + Copyright (C) 1993 Institute of Informatics, University of Warsaw + Copyright (C) 1993, 1994 LITA, Pau + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + contacts: Andrzej.Salwicki@univ-pau.fr + +or Andrzej Salwicki + LITA Departement d'Informatique + Universite de Pau + Avenue de l'Universite + 64000 Pau FRANCE + tel. ++33 59923154 fax. ++33 59841696 + +======================================================================= +*/ + +#include "depend.h" +#include "genint.h" +#include "int.h" +#include "process.h" +#include "intproto.h" + +#include + + +/* Execute one L-code instruction */ + + +void execute() +{ + word t1, t2; + int i; + real r; + virtaddr virt1, virt2, virt3; + +#ifdef TRACE + fprintf(stderr,"pix %d,ic %d,opcode %d\n",thispix,ic,opcode);fflush(stderr); +#endif + + switch (opcode) + { + case 1 : /* LOPENRC */ + openrc(a3, &virt2, &t2); + storevirt(virt2, a1); + M[ a2 ] = t2; + break; + + case 2 : /* LBACKADDR */ + storevirt(thisp->backobj, a1); + M[ a2 ] = M[ temporary ]; + break; + + case 3 : /* LRAISE */ + ic++; /* skip the address */ + raise_signal(a3, M[ ic-1 ], &t1, &t2); + M[ a1 ] = t1; + M[ a2 ] = t2; + break; + + case 4 : /* LOPEN */ + openobj(M[ a3 ], &t1, &t2); + M[ a1 ] = t1; + M[ a2 ] = t2; + break; + + case 5 : /* LSLOPEN */ + loadvirt(virt3, a3); + slopen(M[ a3+APREF ], &virt3, &t1, &t2); + M[ a1 ] = t1; + M[ a2 ] = t2; + break; + + case 15 : /* LTHIS */ + virt1.addr = M[ display2+a2 ]; + virt1.mark = M[ virt1.addr+1 ]; + storevirt(virt1, a1); + break; + + case 20 : /* LVIRTDISPL */ + t2 = M[ display+a2 ]; + t1 = M[ t2+PROTNUM ]; + M[ a1 ] = M[ prototype[ t1 ]->virtlist+a3 ]; + break; + + case 21 : /* LSTATTYPE */ + M[ a1 ] = a2; + M[ a1+1 ] = a3; + break; + + case 23 : /* LIPAROUT */ + M[ a1 ] = param[ a3 ].xword; + break; + + case 24 : /* LRPAROUT */ + MR(a1) = param[ a3 ].xreal; + break; + + case 25 : /* LVPAROUT */ + storevirt(param[ a3 ].xvirt, a1); + break; + + case 31 : /* LSIGN */ + if (M[ a2 ] == 0) M[ a1 ] = 0; + else + if (M[ a2 ] < 0) M[ a1 ] = -1; + else M[ a1 ] = 1; + break; + + case 33 : /* LLOWER */ + case 34 : + loadvirt(virt2, a2); + if (member(&virt2, &t1)) + { + switch ((int) M[ t1+PROTNUM ]) + { + case AINT : t2 = APINT; break; + case AREAL : t2 = APREAL; break; + case AVIRT : t2 = APREF; break; + } + M[ a1 ] = (M[ t1+2 ]+3)/t2; + } + else errsignal(RTEREFTN); + break; + + case 35 : /* LUPPER */ + case 36 : + loadvirt(virt2, a2); + if (member(&virt2, &t1)) + { + switch ((int) M[ t1+PROTNUM ]) + { + case AINT : t2 = APINT; break; + case AREAL : t2 = APREAL; break; + case AVIRT : t2 = APREF; break; + } + M[ a1 ] = (M[ t1+2 ]+M[ t1 ])/t2-1; + } + else errsignal(RTEREFTN); + break; + + case 40 : /* LGETTYPE */ + typep(M[ a2 ], a3, &virt1.addr, &virt1.mark); + storevirt(virt1, a1); + break; + + case 41 : /* LCOPY */ + loadvirt(virt2, a2); + copy(&virt2, &virt1); + storevirt(virt1, a1); + break; + + case 42 : /* LNOT */ + M[ a1 ] = ~ M[ a2 ]; + break; + + case 43 : /* LRCVAVIRT */ /* recover virtual address from ah */ + virt1.addr = M[ a2 ]; + virt1.mark = M[ virt1.addr+1 ]; + storevirt(virt1, a1); + break; + + case 44 : /* LVIRTDOT */ + case 45 : + M[ a1 ] = M[ prototype[ M[ temporary ] ]->virtlist+a2 ]; + break; + + case 46 : /* LADDRPH */ + case 47 : /* LADDRPH2 */ + loadvirt(virt2, a2); + if (!member(&virt2, &M[ a1 ])) errsignal(RTEREFTN); + break; + + case 48 : /* LIABS */ + t2 = M[ a2 ]; + M[ a1 ] = absolute(t2); + break; + + case 49 : /* LINEG */ + M[ a1 ] = -M[ a2 ]; + break; + + case 50 : /* LRABS */ + r = MR(a2); + if( r < (real)0.0 ) + r=(real)0.0-r; + MR(a1) = r; + break; + + case 51 : /* LRNEG */ + MR(a1) = -MR(a2); + break; + + case 52 : /* LPARAMADDR */ + t2 = M[ a2 ]; + M[ a1 ] = t2+M[ prototype[ M[ t2+PROTNUM ] ]->parlist+a3 ]; + break; + + case 54 : /* LLOADT */ + t1 = M[ ic++ ]; /* offset */ + t2 = t1+loadt(M[ M[ a2 ] ], a3); /* object address */ + loadvirt(virt1, t2); + storevirt(virt1, a1); + break; + + case 55 : /* LIS */ + loadvirt(virt2, a2); + M[ a1 ] = lbool(is(&virt2, a3)); + break; + + case 56 : /* LIN */ + loadvirt(virt2, a2); + M[ a1 ] = lbool(inl(&virt2, a3)); + break; + + case 57 : /* LQUA */ + loadvirt(virt2, a2); + if (member(&virt2, &M[ a1 ])) + qua(&virt2, a3); + else errsignal(RTEREFTN); + break; + + case 58 : /* LIFIX */ + M[ a1 ] = (word)( MR(a2) ); + break; + + case 59 : /* LFLOAT */ + MR(a1) = (real)( M[ a2 ] ); + break; + + case 60 : /* LIMOVE */ + M[ a1 ] = M[ a2 ]; + break; + + case 61 : /* LVMOVE */ + loadvirt(virt1, a2); + storevirt(virt1, a1); + break; + + case 62 : /* LRMOVE */ /* WARNING: these areas may overlap! */ + r = MR(a2); + MR(a1) = r; + break; + + case 63 : /* LFPMOVE */ /* WARNING: these areas may overlap! */ + loadvirt(virt1, a2); /* MACHINE DEPENDENT */ + t1 = M[ a2+2 ]; + storevirt(virt1, a1); + M[ a1+2 ] = t1; + break; + + case 82 : /* LEQNONE */ + M[ a1 ] = lbool(M[ a2+1 ] != M[ M[ a2 ]+1 ]); + break; + + case 83 : /* LNENONE */ + M[ a1 ] = lbool(M[ a2+1 ] == M[ M[ a2 ]+1 ]); + break; + + case 87 : /* LMDFTYPE */ /* modify the formal type */ + loadvirt(virt1, a2); + virt1.addr += a3; /* number of "arrayof" */ + storevirt(virt1, a1); + break; + + case 100 : /* LOR */ + M[ a1 ] = M[ a2 ] | M[ a3 ]; + break; + + case 101 : /* LAND */ + M[ a1 ] = M[ a2 ] & M[ a3 ]; + break; + + case 102 : /* LARRAY */ + case 103 : + case 104 : + loadvirt(virt2, a2); + if (member(&virt2, &t2)) + { + t1 = M[ a3 ]-M[ t2+2 ]; /* index-lower+3 */ + if (t1 < 3 || t1 >= M[ t2 ]) errsignal(RTEINVIN); + else M[ a1 ] = t2+t1; + } + else errsignal(RTEREFTN); + break; + + case 105 : /* LFARRAY */ /* without any tests */ + t1 = M[ M[ a2 ] ]; /* physical address */ + M[ a1 ] = t1+M[ a3 ]-M[ t1+2 ]; + break; + + case 106 : /* LIEQUAL */ + M[ a1 ] = lbool(M[ a2 ] == M[ a3 ]); + break; + + case 107 : /* LINEQUAL */ + M[ a1 ] = lbool(M[ a2 ] != M[ a3 ]); + break; + + case 108 : /* LILT */ + M[ a1 ] = lbool(M[ a2 ] < M[ a3 ]); + break; + + case 109 : /* LILE */ + M[ a1 ] = lbool(M[ a2 ] <= M[ a3 ]); + break; + + case 110 : /* LIGT */ + M[ a1 ] = lbool(M[ a2 ] > M[ a3 ]); + break; + + case 111 : /* LIGE */ + M[ a1 ] = lbool(M[ a2 ] >= M[ a3 ]); + break; + + case 112 : /* LCOMBINE */ + loadvirt(virt2, a2); + t1 = M[ a3 ]; + storevirt(virt2, a1); + M[ a1+APREF ] = t1; + break; + + case 113 : /* LIADD */ + M[ a1 ] = M[ a2 ]+M[ a3 ]; + break; + + case 114 : /* LISUB */ + M[ a1 ] = M[ a2 ]-M[ a3 ]; + break; + + case 115 : /* LIMULT */ + M[ a1 ] = M[ a2 ] * M[ a3 ]; + break; + + case 116 : /* LSHIFT */ + M[ a1 ] = shift(M[ a2 ], M[ a3 ]); + break; + + case 117 : /* LIDIVE */ + if (M[ a3 ] == 0) errsignal(RTEDIVBZ); + else M[ a1 ] = M[ a2 ] / M[ a3 ]; + break; + + case 118 : /* LIMODE */ + if (M[ a3 ] == 0) errsignal(RTEDIVBZ); + else M[ a1 ] = M[ a2 ] % M[ a3 ]; + break; + + case 119 : /* LRADD */ + MR(a1) = MR(a2)+MR(a3); + break; + + case 120 : /* LRSUB */ + MR(a1) = MR(a2)-MR(a3); + break; + + case 121 : /* LRMULT */ + MR(a1) = MR(a2) * MR(a3); + break; + + case 122 : /* LRDIVE */ + if (MR(a3) == (real)0.0) errsignal(RTEDIVBZ); + else MR(a1) = MR(a2) / MR(a3); + break; + + case 123 : /* LEQREF */ + loadvirt(virt2, a2); + loadvirt(virt3, a3); + if (member(&virt2, &t1)) + M[ a1 ] = lbool(member(&virt3, &t2) && t1 == t2); + else M[ a1 ] = lbool(!member(&virt3, &t2)); + break; + + case 124 : /* LNEREF */ + loadvirt(virt2, a2); + loadvirt(virt3, a3); + if (member(&virt2, &t1)) + M[ a1 ] = lbool(!member(&virt3, &t2) || t1 != t2); + else M[ a1 ] = lbool(member(&virt3, &t2)); + break; + + case 125 : /* LREQ */ + M[ a1 ] = lbool(MR(a2) == MR(a3)); + break; + + case 126 : /* LRNE */ + M[ a1 ] = lbool(MR(a2) != MR(a3)); + break; + + case 127 : /* LRLT */ + M[ a1 ] = lbool(MR(a2) < MR(a3)); + break; + + case 128 : /* LRLE */ + M[ a1 ] = lbool(MR(a2) <= MR(a3)); + break; + + case 129 : /* LRGT */ + M[ a1 ] = lbool(MR(a2) > MR(a3)); + break; + + case 130 : /* LRGE */ + M[ a1 ] = lbool(MR(a2) >= MR(a3)); + break; + + case 131 : /* LXOR */ + M[ a1 ] = M[ a2 ] ^ M[ a3 ]; + break; + + case 132 : /* LCALLPROCSTAND */ +#if USE_ALARM + alarm(0); /* reschedule forced so alarm may be switched off */ +#endif + reschedule=TRUE; + standard(a1); + break; + + case 143 : /* LKILL */ + loadvirt(virt1, a1); + disp(&virt1); + break; + + case 144 : /* LHEADS */ + loadvirt(virt1, a1); + heads(&virt1, a2); + break; + + case 145 : /* LIPARINP */ + param[ a3 ].xword = M[ a1 ]; + break; + + case 146 : /* LGKILL */ + loadvirt(virt1, a1); + gkill(&virt1); + break; + + case 147 : /* LVPARINP */ + loadvirt(param[ a3 ].xvirt, a1); + break; + + case 148 : /* LRPARINP */ + param[ a3 ].xreal = MR(a1); + break; + + case 149 : /* LQUATEST */ + loadvirt(virt1, a1); + qua(&virt1, a2); + break; + + case 150 : /* LSTYPE */ + loadvirt(virt1, a1); + typref(&virt1, a2); + break; + + case 151 : /* LIFFALSE */ + if (M[ a1 ] == LFALSE) ic = a2; + break; + + case 152 : /* LIFTRUE */ + if (M[ a1 ] == LTRUE) ic = a2; + break; + + case 159 : /* LGO */ + go(M[ a2 ], M[ a1 ]); + break; + + case 160 : /* LGOLOCAL */ + goloc(M[ a2 ], M[ a1 ]); + break; + + case 170 : /* LDTYPE */ + loadvirt(virt1, a1); /* left side type */ + loadvirt(virt2, a2); + loadvirt(virt3, a3); /* right side type */ + typed(virt1.addr, virt1.mark, virt3.addr, virt3.mark, &virt2); + break; + + case 172 : /* LTERMINATE */ + term(); + break; + + case 173 : /* LWIND */ + wind(); + break; + + case 174 : /* LBLOCK2 */ + goloc(thisp->blck1, thisp->blck2); + break; + + case 176 : /* LBLOCK3 */ + disp(&thisp->backobj); + break; + + case 177 : /* LTRACE */ + trace(a1); + break; + + case 178 : /* LINNER */ + inner(a1); + break; + + case 180 : /* LBACKHD */ + backhd(&thisp->backobj, &M[ temporary ]); + break; + + case 182 : /* LJUMP */ + ic = a1; + break; + + case 186 : /* LBLOCK1 */ + openobj(a1, &thisp->blck1, &thisp->blck2); + break; + + case 187 : /* LDETACH */ + detach(); + break; + + case 188 : /* LATTACH */ + loadvirt(virt1, a1); + attach(&virt1); + break; + + case 191 : /* LBACKBL */ + backbl(&thisp->backobj, &M[ temporary ]); + break; + + case 192 : /* LBACKPR */ + /* backpr(&thisp->backobj, &M[ temporary ]); */ + back(&thisp->backobj, &M[ temporary ], (word) 0); + break; + + case 193 : /* LBACK */ + back(&thisp->backobj, &M[ temporary ], (word) 0); + break; + + case 194 : /* LFIN */ + fin(ic-APOPCODE, &thisp->backobj, &M[ temporary ]); + break; + + case 195 : /* LCASE */ + /* a2 = address of case description : */ + /* minimal value, number of branches, */ + /* remaining branches followed by "otherwise" code */ + t1 = M[ a1 ]-M[ a2 ]; /* in 0..number of branches-1 */ + if (t1 < 0 || t1 >= M[ a2+1 ]) + ic = a2+2+M[ a2+1 ]; /* otherwise */ + else + ic = M[ a2+2+t1 ]; /* indirect jump */ + break; + + case 220 : /* LRESUME */ + loadvirt(virt1, a1); + resume(&virt1); + break; + + case 221 : /* LSTOP */ + passivate(STOPPED); + break; + + case 222 : /* LKILLTEMP */ + disp(&thisp->template); + break; + + case 223 : /* LENABLE */ + for (i = 0; i < a1; i++) + enable(thispix, virtprot(M[ ic++ ])); + evaluaterpc(thispix); + break; + + case 224 : /* LDISABLE */ + for (i = 0; i < a1; i++) + disable(thispix, virtprot(M[ ic++ ])); + break; + + case 225 : /* LACCEPT1 */ + rpc_accept(a1); + break; + + case 226 : /* LACCEPT2 */ + popmask(thispix); + rpc3(); + break; + + case 227 : /* LBACKRPC */ + back(&thisp->backobj, &M[ temporary ], a1); + break; + + case 228 : /* LASKPROT */ + loadvirt(virt1, a1); + askprot(&virt1); + break; + + case 240 : /* LSTEP */ + if (M[ a1 ] < 0) errsignal(RTENEGST); + break; + + default : + fprintf( stderr, "Invalid opcode\n" ); + errsignal(RTESYSER); + break; + } + +} + + diff --git a/sources/new-s5r4/execute.o b/sources/new-s5r4/execute.o new file mode 100644 index 0000000000000000000000000000000000000000..f57c6e100420b3a29c51196028a16873ec7905d4 GIT binary patch literal 25873 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 literal 0 HcmV?d00001 diff --git a/sources/new-s5r4/fileio.c b/sources/new-s5r4/fileio.c new file mode 100644 index 0000000..1507385 --- /dev/null +++ b/sources/new-s5r4/fileio.c @@ -0,0 +1,337 @@ +/* Loglan82 Compiler&Interpreter + Copyright (C) 1993 Institute of Informatics, University of Warsaw + Copyright (C) 1993, 1994 LITA, Pau + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + contacts: Andrzej.Salwicki@univ-pau.fr + +or Andrzej Salwicki + LITA Departement d'Informatique + Universite de Pau + Avenue de l'Universite + 64000 Pau FRANCE + tel. ++33 59923154 fax. ++33 59841696 + +======================================================================= +*/ + +#include "depend.h" +#include "genint.h" +#include "int.h" +#include "process.h" +#include "intproto.h" + +#include + +/* File I/O routines */ + +void loadfile(status, ftype, am, fp) /* Load parameters of current file */ +word status; /* expected status of file */ +word *ftype; /* file type */ +word *am; /* file object address */ +FILE **fp; /* file stream pointer */ +{ + word s; + virtaddr virt; + + loadvirt(virt, currfile); + if (member(&virt, am)) /* file object exists */ + { + s = M[ *am+FSTAT ]; /* check status */ + if (status != s && status != UNKNOWN) errsignal(RTEILLIO); + *ftype = M[ *am+FTYPE ]; + *fp = MF(*am+FFILE); + } + else errsignal(RTEREFTN); /* file not opened yet */ +} /* end loadfile */ + + +/* Open file object + */ + +void genfileobj(ftemp, ftyp, fnam, virt, am) +bool ftemp; /* TRUE iff file is temporary */ +word ftyp; /* file type */ +char *fnam; /* file name */ +virtaddr *virt; /* output virtual address */ +word *am; /* output physical address */ +{ + word t1; + + request((word) APFILE, &t1, am); /* generate file object */ + virt->addr = t1; + virt->mark = M[ t1+1 ]; + M[ *am+PROTNUM ] = FILEOBJECT; + M[ *am+FSTAT ] = UNKNOWN; + M[ *am+FTEMP ] = lbool(ftemp); + M[ *am+FTYPE ] = ftyp; + MN(*am+FNAME) = fnam; +} /* end genfileobj */ + + +void reset(am) /* Prepare file for reading */ +word am; +{ + FILE *fp; + + if (M[ am+FSTAT ] != UNKNOWN) /* first close file if opened */ + if (fclose(MF(am+FFILE))) errsignal(RTEIOERR); + switch ((int) M[ am+FTYPE ]) + { + case TEXTF : /* open text file for reading */ + fp = fopen(MN(am+FNAME), "r"); + M[ am+FSTAT ] = READING; + break; + + case CHARF : /* open binary file for reading */ + case INTF : + case REALF : + fp = fopen(MN(am+FNAME), BINARYREAD); + M[ am+FSTAT ] = READING; + break; + + case DIRECT : /* open existing file for update */ + fp = fopen(MN(am+FNAME), DIRECTOLD); + M[ am+FSTAT ] = UPDATING; + break; + } + if (fp == NULL) + { + M[ am+FSTAT ] = UNKNOWN; + errsignal(RTECNTOP); + } + MF(am+FFILE) = fp; /* store stream pointer */ +} /* end reset */ + + +void rewrite(am) /* Prepare file for writing */ +word am; +{ + FILE *fp; + + if (M[ am+FSTAT ] != UNKNOWN) /* first close file if opened */ + if (fclose(MF(am+FFILE))) errsignal(RTEIOERR); + + switch ((int) M[ am+FTYPE ]) + { + case TEXTF : /* open text file for writing */ + fp = fopen(MN(am+FNAME), "w"); + M[ am+FSTAT ] = WRITING; + break; + + case CHARF : /* open binary file for writing */ + case INTF : + case REALF : + fp = fopen(MN(am+FNAME), BINARYWRITE); + M[ am+FSTAT ] = WRITING; + break; + + case DIRECT : /* create new file for update */ + fp = fopen(MN(am+FNAME), DIRECTNEW); + M[ am+FSTAT ] = UPDATING; + break; + } + if (fp == NULL) + { + M[ am+FSTAT ] = UNKNOWN; + errsignal(RTECNTOP); + } + MF(am+FFILE) = fp; /* store stream pointer */ +} /* end rewrite */ + + +void delete(virt) /* Delete file */ +virtaddr *virt; +{ + word am; + + if (member(virt, &am)) + { + if (M[ am+FSTAT ] != UNKNOWN) /* first close file if opened */ + if (fclose(MF(am+FFILE))) errsignal(RTEIOERR); + if (unlink(MN(am+FNAME))) errsignal(RTEIOERR); /* delete file */ + free(MN(am+FNAME)); /* free memory used by file name */ + disp(virt); /* and kill file object */ + } + else errsignal(RTEREFTN); +} /* end delete */ + + +char *tempfilename() /* Generate temporary file name */ +{ + char *cp; + static int tempcnt = 0; + + cp = ballocate(10); + if (cp == NULL) errsignal(RTEMEMOV); + sprintf(cp, "LOG%05d", tempcnt++); + return (cp); +} /* end tempfilename */ + + +bool testeof(fp) /* Test for end of file */ +FILE *fp; +{ + int ch; + + ch = getc(fp); + ungetc(ch, fp); + return (ch == EOF); +} /* end testeof */ + + +bool testeoln(fp) /* Test for end of line */ +FILE *fp; +{ + int ch; + + ch = getc(fp); + ungetc(ch, fp); + return (ch == '\n'); +} /* end testeoln */ + + +void readln(fp) /* Skip to end of line */ +FILE *fp; +{ + int ch; + + while ((ch = getc(fp)) != '\n' && ch != EOF) ; +} /* end readln */ + + +static char str[10]; +word readint(fp) /* Read integer */ +FILE *fp; +{ + long i=0L; + int j=0,c=0; + int bool=0; + while(c<'0' || c>'9'){ + if(c=='-') bool=1; + else bool=0; + c=fgetc(fp); + if(c==EOF){ + errsignal(RTEBADFM); + goto END; + } + } + + do{ + i=10*i+(c-'0'); + j++; + c=fgetc(fp); + }while(c>='0' && c<='9'); + if(c!=EOF) ungetc(c,fp); + if (j == 0 ) errsignal(RTEBADFM); + END: + if(bool) + return(-i); + else + return (i); +} /* end readint */ + + +double readreal(fp) /* Read real */ +FILE *fp; +{ + double r; + + if (fscanf(fp, "%lf", &r) != 1) errsignal(RTEBADFM); + return (r); +} /* end readreal */ + + +void writeint(n, field, fp) /* Write integer */ +word n, field; +FILE *fp; +{ +/* PS&MM static char format[ 32 ]; + + sprintf(format,"%%%dld",(int)field); */ + if (fprintf(fp, "%*ld", (int)field, (long) n) == 0) errsignal(RTEIOERR); +} /* end writeint */ + + +void writereal(r, field1, field2, fp) /* Write real */ +double r; +word field1, field2; +FILE *fp; +{ +/* PS&MM char format[ 32 ]; + + sprintf(format, "%%%d.%dlf", (int) field1, (int) field2); + if (fprintf(fp, format, r) == 0) errsignal(RTEIOERR); +*/ + if (fprintf(fp,"%*.*lf", (int)field1, (int)field2, r) == 0) + errsignal(RTEIOERR); +} /* end writereal */ + + +void writestring(offset, field, fp) /* Write string */ +word offset; +word field; +FILE *fp; +{ + word len, addr; + char *cp; + + addr = strings+offset; + len = M[ addr ]; + cp = (char *) &M[ addr+1 ]; /* pointer to first char of string */ + while (len-- > 0 && field-- != 0) + if (putc(*cp++, fp) == EOF) errsignal(RTEIOERR); +} /* end writestring */ + + +word directio(buf, len, action, fp) /* Perform direct access read/write */ +virtaddr *buf; /* buffer array */ +word len; /* number of bytes to transfer */ +#ifndef NO_PROTOTYPES +int (*action)(char *,int,int,FILE *); /* fread() or fwrite() */ +#else +int (*action)(); /* fread() or fwrite() */ +#endif +FILE *fp; /* stream pointer */ +{ + word am, t1, result; + int n; + + if (member(buf, &am)) /* file not none */ + { + if (fseek(fp, 0L, 1)) errsignal(RTEIOERR); /* seek to current */ + /* position required */ + len = min(len, (M[ am ]-3)*sizeof(word)); /* check appetite */ + result = 0; /* number of bytes transfered */ + t1 = am+3; /* address in memory for transfer */ + while (len >= IOBLOCK) /* transfer full blocks */ + { + n = (*action)((char *) &M[ t1 ], 1, IOBLOCK, fp); + result += n; + if (n != IOBLOCK) return(result); + len -= IOBLOCK; + t1 += IOBLOCK/sizeof(word); + } + if (len > 0) /* transfer last unfilled block */ + { + n = (*action)((char *) &M[ t1 ], 1, (int) len, fp); + result += n; + } + return(result); + } + else errsignal(RTEREFTN); +} /* end directio */ + diff --git a/sources/new-s5r4/fileio.o b/sources/new-s5r4/fileio.o new file mode 100644 index 0000000000000000000000000000000000000000..a116955bdc8ecf3d8f67ebdf14ac37dbe975c43c GIT binary patch literal 5244 zcmbtYUu;`f89z=O>bW=A&78zryE0m}f=+3dssm*V$U3gjD!SdYWDiuCm)JLPQpXPV z^~}(cs<@fBy?8T%J!~%{NJx{4U;-^;@PL<1r0O2#QfY!tjKM&1b~}_Y)0x)e^83y` z*SQG}$-qkd`_6a1^E=91V1N*^rm@ zg@X4<8XBGa+uNecRcqa;njr_3f?QQ9KeH?=|B6p9&6WaZW{E%!8bQ5W2+@G)<<>UB zg5uN5&=1xP+1Dr6wP1eQ*Q)s^IxAD0!E4BpF&H%b`h|kTJ<%_;a$gEZg8BvMeTE!b z&mwGFnA?i>XQHEWlTE8%8G5-`2qx0e~&Gj9Zr~Z{tHet z|5xt+@}Ar8h`G)HyZ`l+r1pME z+#Wm&df8JhC}m@)>bay3)h!wKCA8^dtC}xnGTcvNBlos%};)4xDoi!7PxeM zo)ckpjb;7tuE!=uSj$Y?Z4A~wxQs^Gx5BZOpSpMJ%5>2fx#eM0W$6xx6a(I$sr2$y;ReemS6FDJ{o(OQ4;(k{pfa~+ zeR>upsWr|x*R2<~i4}bTH$T3_^SYj`B5T&s`fO=Yh2E zAH}$fNXb8ecLTY9K<=N=&)MjGUW^xj+&?k)Aekg~+9>S;a{t75K+LORoEGzsi}Ad` z^FZ#O7zZ$b*nT?@{L*~_PXNi!lR*5me@p0}0Dc_fXM}!U=wAi~pnnaB#%_OG%GQ_%QpK$_oi17q8Py+Go9Sd4!SB)ivy z{x&#I{D*+IKraKy{!yWy1%3kKCxw1N=wB83H-!Ega2N8@fn-yDdIU}bcVqp}fyDbK zAm#Boa1U@R{<%T=TY)^U0?!Ey;%p-QJwUQM1KbOQj`aL~iUM3jGxHpK|GYh5k9{?-KGdesVsMk67k0!E{WR0bTQsVOx{+FW{E!#JiURKjdBF`hh$`Ls&f@yry9 zXzJutG^y?H{fsRWd2)CX^TNyFL?Q(bGgImDq&7-M8BI+=h(xlZiByhg$5ag__Dq8B zJREZntFWVOkyeLe_(d3_ndop5B-}&W#MywWY%4BiH0(SE4>)FMrsU Qc#0TR6|qGff3-CGH!5|m+5i9m literal 0 HcmV?d00001 diff --git a/sources/new-s5r4/genint.h b/sources/new-s5r4/genint.h new file mode 100644 index 0000000..742d3a9 --- /dev/null +++ b/sources/new-s5r4/genint.h @@ -0,0 +1,50 @@ +/* Loglan82 Compiler&Interpreter + Copyright (C) 1993 Institute of Informatics, University of Warsaw + Copyright (C) 1993, 1994 LITA, Pau + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + contacts: Andrzej.Salwicki@univ-pau.fr + +or Andrzej Salwicki + LITA Departement d'Informatique + Universite de Pau + Avenue de l'Universite + 64000 Pau FRANCE + tel. ++33 59923154 fax. ++33 59841696 + +======================================================================= +*/ + +#ifdef GEN +#undef GEN +#endif + +#if UNIX +#include "../gen/genint.h" +#else +#include "..\gen\genint.h" +#endif + +/* Variables : */ + +extern protdescr *prototype[]; +extern word ipradr; /* address of primitive type descriptions */ +extern word temporary; /* address of global temporary variables */ +extern word strings; /* base for string constants */ +extern word lastprot; /* the last used prototype number */ +extern word freem; /* first free cell in M */ +extern word currfile; /* current file virtual address */ + diff --git a/sources/new-s5r4/graf/cirb.c b/sources/new-s5r4/graf/cirb.c new file mode 100644 index 0000000..fe33dc1 --- /dev/null +++ b/sources/new-s5r4/graf/cirb.c @@ -0,0 +1,396 @@ + /* Loglan82 Compiler&Interpreter + Copyright (C) 1981-1993 Institute of Informatics, University of Warsaw + Copyright (C) 1993, 1994 LITA, Pau + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + +======================================================================= +*/ + +#include "graf.h" + +#define isign(k, i) (((i) >= 0) ? (k) : -(k)) +#define iabs(i) ((i) >= 0 ? (i) : -(i)) +#define sqr(x) ((x)*(x)) +#define min0(x, y) ((x) < (y) ? (x) : (y)) +#define max0(x, y) ((x) > (y) ? (x) : (y)) + +#define alf(i) alf_[i] +#define ix(i) ix_[i] +#define iy(i) iy_[i] +#define sx(i) sx_[i] +#define sy(i) sy_[i] +#define d(i) d_[i] +#define min(i) min_[i] +#define max(i) max_[i] +#define mx(i) mx_[i] +#define mx1(i) mx1_[i] +#define incr1(i) incr1_[i] +#define incr2(i) incr2_[i] +#define ip(i) ip_[i] +#define sj(i) sj_[i] +#define sc(i) sc_[i] +#define bl(i) bl_[i] +#define bxy(i) bxy_[i] +#define bp(i) bp_[i] +#define g(i,j) g_[i][j] +#define go(i,j) go_[i][j] + +#define logical int +#define FALSE 0 +#define TRUE 1 +#define INT(x) ((int) (x)) +#define FLOAT(x) ((float) (x)) +#define SIN(x) sin((double) (x)) +#define COS(x) cos((double) (x)) +#define SQRT(x) sqrt((double) (x)) + +int pa = 3, qa = 4; +float asp = 0.75; + +void pascal cirb(xi, yi, ri, alfa, beta, cbord, bcint, p, q) +int *xi, *yi, *ri; +float *alfa, *beta; +int *cbord, *bcint, *p, *q; +{ + extern void pascal wyc47(); + + wyc47(*xi, *yi, (double) *ri, (double) *alfa, (double) *beta, + *cbord, *bcint, pa*(*p), qa*(*q), (double) 1.0); +} + +/*********************************************************************** +void pascal rcirb(xr, yr, r, alfa, beta, cbord, bcint, p, q) +float *xr, *yr, *r, *alfa, *beta; +int *cbord, *bcint, *p, *q; +{ + extern void pascal wyc47(); + extern float mix, miy, sxx, syy; + extern int mii, maj; + + wyc47(mii+INT(sxx*(*xr-mix)), maj-INT(syy*(*yr-miy)), (double) *r, + (double) *alfa, (double) *beta, + *cbord, *bcint, pa*(*p), qa*(*q), (double) sxx); +} +***********************************************************************/ + +void pascal wyc47(ir, jr, r, alfa, beta, cbord, bcint, p, q, cx) +int ir, jr; +double r, alfa, beta; +int cbord, bcint, p, q; +double cx; +{ + extern double sin(), cos(), sqrt(); + extern void pascal move(), pascal hfill(), pascal pushxy(), + pascal popxy(), pascal color(), pascal style(); + + float alfj,qasp,pr,a,s,c; + float alf(2+1); + long p1,q1,p2,q2,p4,q4,u,v,w,d1; + int i,j,j1,j2,j3,k,l,n,m,m1,m2,ri,x,y,py,px1, + px2,sxi,sy1,sy2,xi,dj,dxj,dyj,inc1, + pa,qa; + int ix(2+1),iy(2+1),sx(2+1),sy(3+1),d(2+1),min(5+1),max(5+1), + mx(2+1),mx1(2+1),incr1(2+1),incr2(2+1),ip(2+1),sj(2+1), + sc(3+1),g(3+1,2+1),go(3+1,2+1); + logical bl(2+1),bxy(2+1),bp(3+1); + logical bc; + static int one = 1; + + qasp=asp*FLOAT(q); + a=cx*r; + ri=INT(a); + pr=a*FLOAT(p); + q1=q*q; + q2=2*q1; + q4=2*q2; + p1=p*p; + p2=2*p1; + p4=2*p2; + for (i=1; i <= 3; i++) + { + bp(i)=FALSE; + for (j=1; j <= 2; j++) + { + go(i,j)=3; + g(i,j)=3; + } + } + sj(1)=1; + sj(2)=-1 ; + if(alfa == beta) { + n=2; + sc(1)=1; + sc(2)=-1; + bp(3)=TRUE; + bl(1)=TRUE; + bl(2)=TRUE; + goto L45; + } + alf(1)=alfa; + alf(2)=beta; + + for (j=1; j <= 2; j++) + { + alfj=alf(j); + c=COS(alfj); + s=SIN(alfj); + a=pr/SQRT(sqr(p*c)+sqr(qasp*s)); + m=INT(a*c); + sx(j)=isign(1,m); + ix(j)=m; + m=-INT(a*asp*s); + sy(j)=isign(1,m); + iy(j)=iabs(m); + } + + sy1=sy(1); + sy2=sy(2); + sc(1)=sy1; + sc(2)=sy2; + if (sy1 >= 0) { + j1=1; + j2=2; + } else { + j1=2; + j2=1; + } + + if (sy1 == sy2) { + m=sy1*(ix(2)-ix(1)); + if (isign(1,m) > 0) { + n=1; + bp(2)=TRUE; + bp(3)=TRUE; + g(1,1)=j1; + g(1,2)=j2; + go(1,1)=j1; + go(1,2)=j2; + } else { + n=3; + sc(3)=-sy1; + g(1,2)=j2; + g(2,1)=j1; + go(1,2)=j2; + go(2,1)=j1; + } + } else { + n=2; + bp(3)=TRUE; + g(1,j1)=1; + g(2,j1)=2; + go(1,j1)=1; + go(2,j1)=2; + } + + bl(1)=FALSE; + bl(2)=FALSE; + + for (j=1; j <= 2; j++) + { + dxj=iabs(ix(j)); + ix(j)=dxj; + dyj=iy(j); + ip(j)=0; + if (dyj > dxj) { + bxy(j)=TRUE; + m=2*dxj; + d(j)=m-dyj; + incr2(j)=2*(dxj-dyj); + } else { + bxy(j)=FALSE; + m=2*dyj; + d(j)=m-dxj; + incr2(j)=2*(dyj-dxj); + } + incr1(j)=m; + } + + + L45: u=0; + v=ri*p4; + d1=q2-p1*(2*ri-1); + x=ri; + min(3)=x; + max(3)=x; + bc=FALSE; + y=0; + + + L300: for (j=1; j <= 2; j++) + { + if (bl(j)) continue; + dj=d(j); + xi=ip(j); + min(j)=xi; + m=ix(j); + if (bxy(j)) { + max(j)=xi; + if (dj > 0) { + d(j)=dj+incr2(j); + if (xi >= m) bl(j)=TRUE; + ip(j)=xi+1; + } else { + d(j)=dj+incr1(j); + } + } else { + inc1=incr1(j); + L40: if (dj > 0) { + d(j)=dj+incr2(j); + ip(j)=xi+1; + max(j)=xi; + } else { + dj=dj+inc1; + xi=xi+1; + if (xi >= m) { + dj=1; + bl(j)=TRUE; + } + goto L40; + } + } + if (y == iy(j)) bl(j)=TRUE; + } + + + for (i=1; i <= n; i++) + { + if (bp(i)) continue; + j1=g(i,1); + j2=g(i,2); + if (j1 != 3) { + j3=j1; + l=1; + } else { + j3=j2; + l=2; + } + j=j1+j2; + sy(3)=sc(i); + if ((j == 4 || j == 5) && bl(j3)) { + m=ix(j3); + if (sy(j3) == sj(j3)*sx(j3)) { + bp(i)=TRUE; + min(j)=m; + max(j)=max0(max(3),m); + if (j1 != 3) { + j2=j; + } else { + j1=j; + } + } else { + g(i,l)=3; + sc(i)=sy(j3); + min(j3)=min0(min(j3),min(3)); + } + } else { + if (j == 3) { + for (l=1; l <= 2; l++) + { + j=g(i,l); + if (bl(j)) { + g(i,l)=3; + sc(i)=sy(j); + min(j)=min0(min(j),min(3)); + } + } + } + } + + j=j1; + for (l=1; l <= 2; l++) + { + m1=max(j); + m2=min(j); + if (j < 3) { + sxi=sx(j); + } else { + sxi=-sj(l); + if (j == 3) { + k=go(i,l); + if (k < 3) { + m1=min0(m1,max(k)); + m2=min0(m1,m2); + } + } + } + if (sxi > 0) { + mx(l)=ir+m2; + mx1(l)=ir+m1; + } else { + mx(l)=ir-m1; + mx1(l)=ir-m2; + } + j=j2; + } + + py=jr+sy(j3)*y; + if (bcint != 0) { + px1=mx1(1)+1; + px2=mx(2)-1; + if (px1 <= px2) { + move(&px1,&py); + hfill(&px2); + } + } + pushxy(); + color(&cbord); + style(&one); + move(&mx(1),&py); + hfill(&mx1(1)); + move(&mx(2),&py); + hfill(&mx1(2)) ; + popxy(); + } + + if (x == 0) return; + + + if (bp(1) && bp(2) && bp(3)) return; + if (bc) goto L240; + + u=u+q4; + if (d1 < 0) { + d1=d1+u+q2; + } else { + v=v-p4; + w=u-v; + if (w > 0) { + bc=TRUE; + w=w/2-v; + } + d1=d1+w+q2; + x=x-1; + } + y=y+1; + min(3)=x; + max(3)=x; + if (bc) goto L250; + goto L300; + + L240: max(3)=x; + y=y+1; + L250: v=v-p4; + x=x-1; + if (d1 > 0) { + d1=d1-v+p2; + } else { + u=u+q4; + d1=d1+u-v+p2; + min(3)=x+1; + goto L300; + } + if (x > 0) goto L250; + min(3)=x; + goto L300; +} + + diff --git a/sources/new-s5r4/graf/doc/distrib.txt b/sources/new-s5r4/graf/doc/distrib.txt new file mode 100644 index 0000000..90392ab --- /dev/null +++ b/sources/new-s5r4/graf/doc/distrib.txt @@ -0,0 +1,83 @@ + + Zestaw dystrybucyjny pakietu + podstawowych procedur graficznych IIUWGRAF + ( wersja 2.2 ) + + +1. IIUWGRAF TXT - dokumentacja + + DISTRIB.TXT - niniejszy tekst + IIUWGRAF.DOC - podrecznik ( pod PWORDem ) + IIUWGRAF.STY - definicja stylow ( WORD ) + IIUWGRAF.DHN - podrecznik ( WORD, wersja DHN ) + IIUWGRAF.POL - podrecznik ( bez polskich liter, do drukowania ) + GRAPH.H - deklaracja procedur IIUWGRAFu dla MS Pascala + + +2. IIUWGRAF_LB - biblioteki + + HGCMSF.LIB - Hercules, MS Fortran/Pascal + HGCMSF4.LIB - Hercules, MS Fortran v.4.00 + MGCMSF.LIB - IBM Color/Graphics, MS Fortran/Pascal + MGCMSF4.LIB - IBM Color/Graphics, MS Fortran v.4.00 + MGC64MSF.LIB - IBM Color/Graphics (tryb 640*200), + MS Fortran/Pascal + MGC64MF4.LIB - IBM Color/Graphics (tryb 640*200), + MS Fortran v.4.00 + HGCCS.LIB - Hercules, Lattice C model S + HGCCD.LIB - Hercules, Lattice C model D + HGCCP.LIB - Hercules, Lattice C model P + HGCCL.LIB - Hercules, Lattice C model L + + +3. IIUWGRAF_LC - biblioteki ( Lattice C ) + + MGCCS.LIB - IBM Color/Graphics, Lattice C model S + MGCCD.LIB - IBM Color/Graphics, Lattice C model D + MGCCP.LIB - IBM Color/Graphics, Lattice C model P + MGCCL.LIB - IBM Color/Graphics, Lattice C model L + MGC64CS.LIB - IBM Color/Graphics (tryb 640*200), + Lattice C model S + MGC64CD.LIB - IBM Color/Graphics (tryb 640*200), + Lattice C model D + MGC64CP.LIB - IBM Color/Graphics (tryb 640*200), + Lattice C model P + MGC64CL.LIB - IBM Color/Graphics (tryb 640*200), + Lattice C model L + + +4. HGCDEMO + + HGCDEMO.EXE - program pokazowy dla karty Hercules + HGCFEDIT.EXE - edytor znakow ( Hercules ) + DUMP1.DAT - dane dla programu pokazowego + DUMP2.DAT - dane dla programu pokazowego + HGCPRINT.EXE - program do drukowania obrazu graficznego, + ( Hercules ) + + + +5. MGCDEMO + + MGCDEMO.EXE - program pokazowy dla karty IBM Color/Graphics + MGCFEDIT.EXE - edytor znakow ( IBM Color/Graphics ) + + MGC64DEM.EXE - program pokazowy dla karty + IBM Color/Graphics ( tryb 640*200 ) + MGC64FED.EXE - edytor znakow + ( IBM Color/Graphics, tryb 640*200 ) + MGCPRINT.EXE - program do drukowania obrazu graficznego + ( IBM Color/Graphics ) + + +6. IIUWGRAF EGA ( zestaw dystrybucyjny dla karty EGA ) + + EGAMSF.LIB - biblioteka, MS Fortran/Pascal + EGAMSF4.LIB - biblioteka, MS Fortran v.4.00 + EGACS.LIB - biblioteka, Lattice C model S + EGACD.LIB - biblioteka, Lattice C model D + EGACP.LIB - biblioteka, Lattice C model P + EGACL.LIB - biblioteka, Lattice C model L + + EGADEMO.EXE - program pokazowy + EGAFEDIT.EXE - edytor znakow diff --git a/sources/new-s5r4/graf/doc/fedit.doc b/sources/new-s5r4/graf/doc/fedit.doc new file mode 100644 index 0000000..ec7987e --- /dev/null +++ b/sources/new-s5r4/graf/doc/fedit.doc @@ -0,0 +1,116 @@ + + FEDIT - a simple font editor for IBM PC + a companion to IIUWGRAF graphics library + +FEDIT allows to create and modify 8*8 pixel patterns. Such +patterns may be displayed as part of graphics screen image +via the "hascii" function. + +Font tables can be prepared by FEDIT in two formats: + + - as an assembly subroutine, + delivering address of the font table + in the form suitable for passing to "hfont" + - as an independent program, + setting up pointer to the font table in + the location of interrupt vector 31. + +The first format can be used to replace the standard font +usually found in ROM BIOS at location F000:FA6E. It is used +by "hascii" for drawing character codes 0 to 127. The subroutine +generated by FEDIT has to be linked together with the application. +This is "base 0" format. +FEDIT generates the subroutine with the name "hfont8". Should +another name be desired (e.g. when font tables are to be switched +dynamically), it may changed by hand in the assembly source. + +The second format is used when drawing characters from the +extended range 128 to 255. This font has to be loaded into +memory before execution of the application program that +uses it by invoking the program generated by FEDIT. +This is "base 128" format. +FEDIT generates this table as part of an independent program, +that sets up the vector address and exits via "terminate and +stay resident". +FEDIT and HGCGRAPHICS do not provide facilities for dynamic +switching of this extended font table. + + +For example, + + integer*2 iseg,ioffs + call hfont8(iseg,ioffs) + ... + call hascii(45) ; uses ROM BIOS + call hascii(145) ; extended table + ... + call hfont(iseg,ioffs) + call hascii(45) ; uses FEDIT font + call hascii(145) ; same extended table + .... + call hfont(16#f000,16#fa6e) + call hascii(45) ; ROM BIOS again + call hascii(145) ; same extended table + + +FEDIT is a simple conversational program with few commands. The basic +idea is to have a table of 8*8 pixel patterns that can be modified +interactively. A single character can be brought out of the table for +editing and returned, possibly to a different position in the table. +There are two tables, one for character codes 0 through 127, the other +for codes 128 through 255. The first table is read-only. The second table +can be initialized by an already resident extended font table, loaded +from a FEDIT-created file or initialized as empty. The second table can be +written out to file in one of two formats discussed above. + +FEDIT commands are entered as single keystrokes selecting the commands +listed in a menu appearing on top of the screen. +Additional parameters, if any, are prompted for. + +FEDIT commands: + +< low redisplays the 0 to 127 table + +> high redisplays the 128 to 255 table + +i init initializes 128 to 255 table to all zeros + +l load loads the 128 to 255 table from file; + asks for the file name + +d dump dumps the 128 to 255 table to file; + asks for the file name; + asks for base, which should be either 0 or + 128, indicating one of the two formats + asks for target: + f - ms fortran, ms pascal + s - lattice c, s model + p - lattice c, p model + d - lattice c, d model + l - lattice c, l model + +e edit brings a character into the editing area + asks for a character code (in decimal); + during editing, cursor keys may be used + to select pixel position, "INS" to set + the pixel on, "DEL" to set it off, "END" + to exit edit mode. + +t text accepts a short text that will be displayed + during the editing as an additional help + for judgement of the quality of the appearance + of currently edited character; + asks for vspace & hspace : horizontal & vertical + spacing between adjacent character boxes, + then waits for a string (at most 40 chars). + +p put saves the pattern in the editing buffer + in the font table; + asks for a code (in decimal) which should + be in the range 128 through 255 + +q quit exits from FEDIT + +FEDIT is not foolproof, e.g. it will not survive an attempt to load +a non-existing font file and it will overwrite an existing file +without warning if asked to. diff --git a/sources/new-s5r4/graf/doc/gmouse.doc b/sources/new-s5r4/graf/doc/gmouse.doc new file mode 100644 index 0000000..5cbc5f7 --- /dev/null +++ b/sources/new-s5r4/graf/doc/gmouse.doc @@ -0,0 +1,1321 @@ + PROGRAMMER'S REFERENCE FOR GENIUS MOUSE DRIVER + +*** 1 : BRIEF DESCRIPTION + +The Genius Mouse Driver enables you to use mouse hardware to move an on-screen +cursor and control its movement through a software program. Various functions +allow you to determine cursor placement, cursor shape, and button status. + +In order for you to interface your Genius Mouse with an application program, the +following information on the Genius Driver has been provided. + +*** 2 : GRAPHICS AND TEXT CURSORS + +GMOUSE Driver supports a hardware text cursor, a software text cursor, and +a graphics cursor. A hardware text cursor is a blinking cursor which moves from +one character to another on-screen. This blinking cursor may take the form of a +block or underscore. A software text cursor makes use of display attributes to +change the visual appearance of a character on-screen. Movement is from +character to character. A graphics cursor is a shape that moves over on-screen +images. + +You can choose any of these three cursors to use on-screen, however, only one +cursor can be displayed at a given time. Also, within your application program, +you can switch back and forth between cursors. + + +Display the Graphics Cursor + +The cursor appears on-screen or disappears from the screen through the calling +program. This cursor consists of a block of pixels. As this block moves +on-screen and affects the pixels beneath it, the cursor shape and background are +created. This interaction is defined by two 16-by-16 bit arrays; +one is the screen mask and the other is the cursor mask. The screen mask +determines what part of the cursor pixel is to be the shape, and what part is +is to be the background. The cursor mask determines which pixels contribute to +the color of the cursor. Whenever changes are made to the screen which lie +directly beneath the cursor, the cursor should be concealed so that old values +are not restored to the screen. + +Please note that with a high resolution mode, you have a 16-by-16 pixel block; +with a medium resolution (four color) mode, you have a 8-by-16 pixel block; with +a medium resolution (sixteen color) mode, you have a 4-by-16 pixel block. + +Refer to function 9. + +To create the cursor, the software uses data from the computer's screen memory +which defines the color of each pixel on-screen. Operations are performed that +affect individual screen bits. Software ANDs the screen mask defining the +pixels under the cursor and XORs the cursor mask with the result of the AND +operation. + +Note the results when: + + + + + + + page 1 + +Screen Mask Bit is Cursor Mask Bit is Resulting Screen Bit is +------------------ ------------------ ----------------------- + 0 0 0 + 0 1 1 + 1 0 unchanged + 1 1 inverted + +With each mouse function, a reference to the graphics cursor location is in +reference to a point on-screen directly beneath the cursor. This point that the +mouse software uses to determine the cursor coordinates is known as the cursor's +hot spot. +Generally, the upper_left hand corner of the cursor block is designated as the +coordinates for the cursor default value. ((0,0) are the upper_left hand corner +coordinates.) + +Software Text Cursor + +You can use this text cursor when your computer is in one of the text modes. By +changing the character attributes beneath the cursor, the appearance of the +character is influenced on-screen. This effect on the text cursor can be +defined by two 16-bit mask values. These bits can be described as follows: +bit 15 sets the blinking (1) or non-blinking (0) character ; bit 12 - 14 set the +background (1); bits 8 - 10 set the foreground color; and bits 0 - 7 set the +character code. These values in the screen mask and the cursor mask +determine the character's new attributes when the cursor is covering the +character. The screen mask decides which of the character's attributes are +maintained. The cursor mask decides in what manner the attributes are altered +to produce the cursor. + +In creating this cursor, the software works from data which defines each +character on the screen. The software first ANDs the screen mask and the screen +data bit for the character beneath the cursor. Next, the software XORs the +cursor mask and the result of the AND operation. + +When a function refers to the text cursor location, it gives the coordinates of +the character beneath the cursor. + +Refer to function 10. + +Hardware Text Cursor + +This cursor is also available when the computer is in one of the text modes. +This cursor is the one seen on-screen when the computer is powered on. It +consists of 8 pixels wide and 8 to 14 pixels tall. Software allows you to use +this cursor for your needs. Scan lines determine a cursor's appearance +on-screen. A scan line consists of a horizontal set of pixels. +If a line is on, there will be flashing on the screen. If a line is off, there +is no effect. Scan lines are numbered from 0 to 7, or 0 to 11 depending on the +type of display used. 0 indicates the top scan line. + +Refer to function 10. + +*** 2.1 : Mouse Buttons + +Mouse functions can give the status of the mouse buttons and the number of times +a certain button has been pressed and released. The button status is given as +an integer. If a bit is set to 1 the button is down; if a bit is set to 0, the +button is up. + page 2 + + Bit 0 - Left Button Status + Bit 1 - Right Button Status + Bit 2 - Middle Button Status +Each time a mouse button is pressed, a counter records the number of presses and +releases. The software sets the counter to zero once it has been read or after +a reset. + +*** 2.2 : Unit of Distance - Mouse Motion + +The motion of the mouse can be expressed in a unit of distance (mouse motion) +and is approximately 1/200 of an inch. + +With mouse movement, mouse software determines a horizontal and vertical mouse +motion count. This count is used by the software to move a cursor a certain +number of pixels on-screen. Software defines mouse motion sensitivity (the +number of mouse motions needed to move the cursor 8 pixels on-screen) and this +sensitivity determines the rate at which the cursor moves on-screen. + +Refer to function 15. + +*** 2.3 : Internal Cursor Flag + +Mouse software supports an internal flag. This flag determines when the cursor +should appear on-screen. If the flag equals 0, the cursor appears on-screen; if +the flag is any other number, the cursor disappears from the screen. + +You can call functions 1 and 2 a number of times, however, if you call function +2, you must call function 1 later. This is necessary to restore the flag's +previous value. + +Refer to functions 1 and 2. + +*** 3 : CALLING FROM ASSEMBLY LANGUAGE PROGRAMS + +To make mouse function calls: + +Load the appropriate registers (AX, BX, CX, DX) with the parameter values. +These correspond to G1%, G2%, G3%, and G4% as shown in the BASIC example to +follow. Then execute software interrupt 51 (33H). The values given by the +mouse functions will be installed in the registers. + + +Example: + + ; * set cursor to location (150,100) + Mov AX,4 ;(function call 4) + Mov CX,150 ;(set horizontal to 150) + Mov DX,100 ;(set vertical to 100) + Int 51(33H) ;(interrupt to mouse) + +It is important to note that before using INT 33H, one should verify the +presence of the mouse driver. Executing an INT 33H will cause uncertain results +if the mouse driver is not loaded. Assume a mouse driver is present when INT +33H vector is non-zero and the vector does not point to an IRET instruction. + +Note: When making a mouse call in Assembly Language, expect somewhat of a +different value for the fourth parameter (when compared with calls using a BASIC +program) involving functions 9, 12, and 16. + page 3 + +*** 4 : CALLING FROM BASIC LANGUAGE PROGRAM + +To make mouse function calls: + + Set a pair of integer variables in your program for the offset and the segment + of the mouse driver entry point. + + In order to obtain the offset and segment values, the following statements + must be inserted into your program before any calls to mouse functions: + +10 DEF SEG = 0 +15 ' GET GMOUSE ENTRY POINT +20 GMSEG = PEEK( 51*4 + 2 ) + 256 * PEEK( 51*4 + 3 ) ' GET SEGMENT ENTRY +30 GMOUSE = 2 + PEEK( 51*4 ) + 256 * PEEK( 51*4 + 1 ) ' GET OFFSET ENTRY +40 DEF SEG = GMSEG ' SET SEGMENT REGISTER AS THE SEGMENT OF GMOUSE + +To enter the mouse driver, use the CALL statement: + + CALL GMOUSE (G1%, G2%, G3%, G4%) + +GMOUSE contains the entry offset of the mouse driver. G1%, G2%, G3%, and G4% +are the integer variables given in the call. These four must be specified in +the CALL statement even if a value is not assigned. When a value is assigned, +it must be an integer, that is, a whole number. + +Example: + +50 ' Find the Activated Mode of Genius Mouse +60 G1% = 0 : G2% = 0 +70 CALL GMOUSE ( G1%, G2%, G3%, G4% ) +80 IF G2% AND 2 THEN PRINT "Genius Mouse ( 2_Button Mode ) Enable" +90 IF G2% AND 3 THEN PRINT "Genius Mouse ( 3_Button Mode ) Enable" +100 IF NOT G1% THEN PRINT "Can't Find Genius Mouse" + +*** 5 : MOUSE FUNCTIONS + +These functions listed apply to the Genius Mouse. Further descriptions of each +mouse function will be given in the following pages. + +Functions Function Number +----------------------------------------------------------------- +Reset Genius Mouse Driver 0 +Enable Cursor Display 1 +Disable Cursor Display 2 +Read Cursor Location & Button State of Genius Mouse 3 +Set Cursor Location of Genius Mouse 4 +Read Button Press State of Genius Mouse 5 +Read Button Release State of Genius Mouse 6 +Define Horizontal (X) Range of Cursor Location 7 +Define Vertical (Y) Range of Cursor Location 8 +Define Graphics Mode Cursor Style 9 +Define Text Mode Cursor Style 10 +Read Genius Mouse Motion Number 11 +Define Event Handler Entry Location 12 +Enable Light Pen Emulation Function 13 +Disable Light Pen Emulation Function 14 +Define Sensitivity (Mouse Motion/Pixel) of Genius Mouse 15 + + page 4 + +Disable Cursor Display in Special Range 16 +Define Double-Speed Threshold 19 + +EGA functions are described in Section *** 7. + +*** 6 : DESCRIPTION OF THE MOUSE FUNCTIONS + +You'll notice that with the following mouse function descriptions, the +parameters needed to make the calls and the expected outcome (return) for each +is indicated. Also, any special conditions regarding any of the mouse functions +have been included. Further, an example of a program has been provided in order +for you to understand how to make the call. + +The input and return values are presented for 8086 registers and for BASIC in +the following pages. + +It is important to note that each mouse function call needs four parameters. +The Genius Mouse software does not verify any input values, and therefore, if +any incorrect values are given, uncertain results will occur. + +Function 0: Reset Genius Mouse Driver + +Function 0 gives the current status of the mouse hardware plus the current +status of the mouse software. The calling program is able to determine the +presence of a mouse driver and/or a serial port. + +This function resets the mouse driver to the following default status as +indicated: + +Variable Value +------------------------------------------------------------------------------ +internal cursor flag -1 (cursor concealed) +graphics cursor shape horizontal oval +text cursor reverse video +user-defined call mask all zeroes +light pen emulation mode enabled +vertical mouse motion/pixel ratio 16 to 8 +horizontal mouse motion/pixel ratio 8 to 8 +vertical min/max cursor coordinates 0/current display mode y values minus 1 +horizontal min/max cursor coordinates 0/current display mode x values minus 1 + +8086 Register +Input: AX = 0 +Return: AX = mouse state (-1: installed, 0: not installed) + BX = number of buttons (2 button mode, 3 button mode) + +BASIC +Input: G1% = 0 +Return: G1% = mouse state (-1: installed, 0: not installed) + G2% = number of buttons (2 button mode, 3 button mode) + +Example: Used initially to determine if the GMOUSE driver is present and to + reset GMOUSE. + + + + + + page 5 + +50 ' Find the Actived Mode of Genius Mouse +60 G1% = 0 : G2% = 0 +70 CALL GMOUSE ( G1%, G2%, G3%, G4% ) +80 IF G2% AND 2 THEN PRINT "Genius Mouse ( 2_Button Mode ) Enable" +90 IF G2% AND 3 THEN PRINT "Genius Mouse ( 3_Button Mode ) Enable" +100 IF NOT G1% THEN PRINT "Can't Find Genius Mouse" + +Function 1: Enable Cursor Display + +Function 1 increments the internal cursor flag counter. If the counter is zero, +the cursor is enabled and appears on-screen. + +The default value is -1 which indicates a concealed cursor. Function 1 must be +called to display the cursor. In case the internal cursor flag is already zero, +a call to this function produces no effect. + +8086 Register +Input: AX = 1 +Return: none + +BASIC +Input: G1% = 1 +Return: none + +Example: + +110 ' Enable Genius Mouse's Cursor +120 G1% = 1 +130 CALL GMOUSE ( G1%, G2%, G3%, G4% ) + +Function 2: Disable Cursor Display + +Function 2 disables the cursor by removing it from the screen and decrementing +the internal cursor flag. Even though the cursor cannot be seen, it still +tracks any motion made with the mouse. + +You should use this function before changing any portion of the screen +containing the cursor. You will avoid the problem of the cursor affecting +screen data. + +Keep in mind that whenever your program calls function 2, it must later call +function 1 to return the internal cursor flag to its default value. In +addition, if your program changes the screen mode, function 2 is called +automatically. Therefore, the cursor's movement is enabled the next time it is +displayed. + +Call function 2 at the end of a program in order to conceal the cursor. This +ensures that nothing remains on-screen. + +8086 Register +Input: AX = 2 +Return: none + +BASIC +Input: G1% = 2 +Return: none + +Example: + page 6 + +110 ' Disable Genius Mouse's Cursor +120 G1% = 2 +130 CALL GMOUSE ( G1%, G2%, G3%, G4% ) + +Function 3: Read Cursor Location & Button State of Genius Mouse + +Function 3 gives the status of mouse buttons, plus cursor location. + +Button status consists of a single integer value: + Bit 0 = left button (2 button mode, 3 button mode) + Bit 1 = right button (2 button mode, 3 button mode) + Bit 2 = middle button (3 button mode) + +The bit is 1 when the button is pressed. The bit is 0 when the button is +released. + +8086 Register +Input: AX = 3 +Return: BX = button status + CX = horizontal cursor coordinate + DX = vertical cursor coordinate + +BASIC +Input: G1% = 3 +Return: G2% = button status + G3% = horizontal cursor coordinate + G4% = vertical cursor coordinate + +Example: + +110 ' Read Genius Mouse Location & Button State +120 G1% = 3 +130 CALL GMOUSE ( G1%, G2%, G3%, G4% ) +140 PRINT "Genius Mouse Location : X_Coord=" G3% " Y_Coord=" G4% +150 IF G2% AND 1 THEN PRINT "Left Button" +160 IF G2% AND 2 THEN PRINT "Right Button" +170 IF G2% AND 4 THEN PRINT "Middle Button" +180 PRINT "Pressed" + +Function 4: Set Cursor Location of Genius Mouse + +Function 4 sets the current cursor location. Values must be within the +coordinate ranges for the virtual screen and, if necessary, are rounded to the +nearest values allowed for the current screen mode. + + Screen Display Virtual Cell Bits/Pixel + Mode Adapter Screen (XxY) Size Graphics Mode +--------- ------------ --------------- -------- ---------------- + 0 C, E, 3270 640 x 200 16 x 8 - + 1 C, E, 3270 640 x 200 16 x 8 - + 2 C, E, 3270 640 x 200 8 x 8 - + 3 C, E, 3270 640 x 200 8 x 8 - + 4 C, E, 3270 640 x 200 2 x 1 2 + 5 C, E, 3270 640 x 200 2 x 1 2 + 6 C, E, 3270 640 x 200 1 x 1 1 + 7 M, E, 3270 640 x 200 8 x 8 - + + + page 7 + + D E 640 x 200 16 x 8 2 + E E 640 x 200 1 x 1 1 + F E 640 x 350 1 x 1 1 + 10 E 640 x 350 1 x 1 1 + 30 3270 720 x 350 1 x 1 1 + H 720 x 348 1 x 1 1 + +Display Adapter: + M = IBM Monochrome Display/Printer Adapter + C = IBM Color/Graphics Adapter + E = IBM Enhanced Graphics Adapter +3270 = IBM All Points Addressable Graphics Adapter (3270 PC) + H = Hercules Monochrome Graphics Card + +8086 Register +Input: AX = 4 + CX = new horizontal cursor coordinate + DX = new vertical cursor coordinate +Return: none + +BASIC +Input: G1% = 4 + G3% = new horizontal cursor coordinate + G4% = new vertical cursor coordinate +Return: none + +Example: + +110 ' Set Cursor Location at the Upper_Left Corner of Screen +120 G1% = 4 +130 G3% = 0 : G4% = 0 +140 CALL GMOUSE ( G1%, G2%, G3%, G4% ) + +Function 5: Read Button Press State of Genius Mouse + +Function 5 provides status on the specified button, gives the number of button +presses since the last call, and produces the location of the cursor at last +button press. + +Button status consists of a single integer value. Again, as in function 3: + Bit 0 = left button (2 button mode, 3 button mode) + Bit 1 = right button (2 button mode, 3 button mode) + Bit 2 = middle button (3 button mode) + +The bit is 1 when the button is pressed. The bit is 0 when the button is +released. + +The number of button presses will always fall in the range of 0 to 32767. There +is no indicator for overflow. Following this function call, the count is reset +to zero. + +8086 Register +Input: AX = 5 + BX = button status (left = 0, right = 1, middle = 2) +Return: AX = button status + BX = number of button presses + CX = horizontal cursor coordinate at last press + DX = vertical cursor coordinate at last press + page 8 + +BASIC +Input: G1% = 5 + G2% = button status (left = 0, right = 1, middle = 2) +Return: G1% = button status + G2% = number of button presses + G3% = horizontal cursor coordinate at last press + G4% = vertical cursor coordinate at last press + +Example: + +110 ' Read the Left Button Press State of Genius Mouse +120 G1% = 5 : G2% = 2 +130 CALL GMOUSE ( G1%, G2%, G3%, G4% ) +140 IF G1% AND 2 THEN PRINT "The Middle Button Pressed at X_loc=" G3% + +Function 6: Read Button Release State of Genius Mouse + +Function 6 provides status on the specified button, gives the number of button +releases since the last call, and provides the location of the cursor at the +last button release. + +Button status consists of a single integer value. Again, as in function 3: + Bit 0 = left button (2 button mode, 3 button mode) + Bit 1 = right button (2 button mode, 3 button mode) + Bit 2 = middle button (3 button mode) + +The bit is 1 when the button is pressed. The bit is 0 when the button is +released. + +The number of button releases will always fall in the range of 0 to 32767. +There is no indicator for overflow. Following this function call, the count is +reset to zero. + +8086 Register +Input: AX = 6 + BX = button status (left = 0, right = 1, middle = 2) +Return: AX = button status + BX = number of button releases + CX = horizontal cursor coordinate at last release + DX = vertical cursor coordinate at last release + +BASIC +Input: G1% = 6 + G2% = button status (left = 0, right = 1, middle = 2) +Return: G1% = button status + G2% = number of button releases + G3% = horizontal cursor coordinate at last release + G4% = vertical cursor coordinate at last release + +Example: + +110 ' Read the Left Button Release State of Genius Mouse +120 G1% = 6 : G2% = 2 +130 CALL GMOUSE ( G1%, G2%, G3%, G4% ) +140 IF NOT G1% OR &HFFFB THEN PRINT "The Middle Button Released at X_loc=" G3% + + + + page 9 + +Function 7: Define Horizontal (X) Range of Cursor Location + +Function 7 defines the horizontal range of the cursor on-screen. As a result, +cursor movement is limited to this specified area. If a cursor happens to be +outside of this area when a call is made, the cursor is moved to just inside the +area. + +8086 Register +Input: AX = 7 + CX = minimum horizontal cursor coordinate + DX = maximum horizontal cursor coordinate +Return: none + +BASIC +Input: G1% = 7 + G3% = minimum horizontal cursor coordinate + G4% = maximum horizontal cursor coordinate +Return: none + +Example: + +110 ' Enable Cursor in Horizontal Range between 100 to 200 +120 G1% = 7 +130 G2% = 100 : G3% = 200 +140 CALL GMOUSE ( G1%, G2%, G3%, G4% ) + +Function 8: Define Vertical (Y) Range of Cursor Location + +Function 8 defines the vertical range of the cursor on-screen. As a result, +cursor movement is limited to this specified area. If a cursor happens to be +outside of this area when a call is made, the cursor is moved to just inside the +area. + +8086 Register +Input: AX = 8 + CX = minimum vertical cursor coordinate + DX = maximum vertical cursor coordinate +Return: none + +BASIC +Input: G1% = 8 + G3% = minimum vertical cursor coordinate + G4% = maximum vertical cursor coordinate +Return: none + +Example: + +110 ' Enable Cursor in Vertical Range between 100 to 200 +120 G1% = 8 +130 G2% = 100 : G3% = 200 +140 CALL GMOUSE ( G1%, G2%, G3%, G4% ) + +Function 9: Define Graphics Mode Cursor Style + +Function 9 defines the style of the cursor in terms of color, shape, and center +for the graphics. As mentioned before, this cursor is a 16-by-16 pixel block +and is defined by two 16-bit arrays (the screen mask bit and the cursor mask +bit). Cursor coordinates for the hot spot must be in the range of -16 to +16. + page 10 + +8086 Register +Input: AX = 9 + BX = horizontal cursor hot spot + CX = vertical cursor hot spot + DX = pointer to screen and cursor mask +Return: none + +BASIC +Input: G1% = 9 + G2% = horizontal cursor hot spot + G3% = vertical cursor hot spot + G4% = pointer to screen and cursor mask +Return: none + +Example: + +10 ' Define the screen mask +20 ' +30 cursor (0,0) = &HFFFF '1111111111111111 +40 cursor (1,0) = &HFFFF '1111111111111111 +50 cursor (2,0) = &HFFFF '1111111111111111 +60 cursor (3,0) = &HFFFF '1111111111111111 +70 cursor (4,0) = &HFFFF '1111111111111111 +80 cursor (5,0) = &HF00F '1111000000001111 +90 cursor (6,0) = &H0000 '0000000000000000 +100 cursor (7,0) = &H0000 '0000000000000000 +110 cursor (8,0) = &H0000 '0000000000000000 +120 cursor (9,0) = &H0000 '0000000000000000 +130 cursor (10,0) = &HF00F '1111000000001111 +140 cursor (11,0) = &HFFFF '1111111111111111 +150 cursor (12,0) = &HFFFF '1111111111111111 +160 cursor (13,0) = &HFFFF '1111111111111111 +170 cursor (14,0) = &HFFFF '1111111111111111 +180 cursor (15,0) = &HFFFF '1111111111111111 +190 ' +200 ' Define the cursor mask +210 ' +220 cursor (0,1) = &H0000 '0000000000000000 +230 cursor (1,1) = &H0000 '0000000000000000 +240 cursor (2,1) = &H0000 '0000000000000000 +250 cursor (3,1) = &H0000 '0000000000000000 +260 cursor (4,1) = &H0000 '0000000000000000 +270 cursor (5,1) = &H0000 '0000000000000000 +280 cursor (6,1) = &H07E0 '0000011111100000 +290 cursor (7,1) = &H7FFE '0111111111111110 +300 cursor (8,1) = &H7FFE '0111111111111110 +310 cursor (9,1) = &H07E0 '0000011111100000 +320 cursor (10,1) = &H0000 '0000000000000000 +330 cursor (11,1) = &H0000 '0000000000000000 +340 cursor (12,1) = &H0000 '0000000000000000 +350 cursor (13,1) = &H0000 '0000000000000000 +360 cursor (14,1) = &H0000 '0000000000000000 +370 cursor (15,1) = &H0000 '0000000000000000 +380 ' +390 ' Set the cursor style and hot spot number of Genius Mouse +400 ' + + + page 11 + +410 ' +420 G1% = 9 +430 G2% = 6 ' horizontal hot spot +440 G3% = 5 ' vertical hot spot +450 CALL GMOUSE ( G1%, G2%, G3%, cursor (0,0)) + +Function 10: Define Text Mode Cursor Style + +Function 10 chooses the hardware or the software text cursor. + +For example, if BX (G2%) is 1, the hardware cursor is selected and the hardware +is set up with the first and last scan lines which define the cursor. +(Values for CX (G3%) and DX (G4%) range from 0 to 7 for the color display and 0 +to 11 for the monochrome display.) + +If BX (G2%) is 0, the software cursor is selected; and CX (G3%) and DX (G4%) +must specify the screen and cursor masks. (These masks give the attributes and +character code of the cursor, and their values are dependent on the type of +display in use.) + +8086 Register +Input: AX = 10 + BX = select cursor (0: software text, 1: hardware text) + CX = screen mask value/scan line start + DX = cursor mask value/scan line stop +Return: none + +BASIC +Input: G1% = 10 + G2% = select cursor (0: software text, 1: hardware text) + G3% = screen mask value/scan line start + G4% = cursor mask value/scan line stop +Return: none + +Example: + +110 ' Enable an Inverting Cursor +120 G1% = 10 +130 G2% = 0 +140 G3% = &HFFFF : G4% = &H7700 +150 CALL GMOUSE ( G1%, G2%, G3%, G4% ) + +Function 11: Read Genius Mouse Motion Number + +Function 11 gives the mouse motion number since the last call. A positive +horizontal number indicates rightward movement (negative shows leftward +movement). A positive vertical number indicates downward movement (negative +shows upward movement). +The number is always in the range of -32768 to 32767. Overflow is disregarded. +Once the call is completed, the number is set to 0. + +8086 Registers +Input: AX = 11 +Return: CX = horizontal number + DX = vertical number + + + + page 12 + +BASIC +Input: G1% = 11 +Return: G3% = horizontal number + G4% = vertical number + +Example: + +110 ' Read Genius Mouse Motion Number +120 G1% = 11 +130 CALL GMOUSE ( G1%, G2%, G3%, G4% ) +140 IF G3% > 0 THEN PRINT "Genius Mouse is Moving to Right" +150 IF G4% > 0 THEN PRINT "Genius Mouse is Moving Down" + +Function 12: Define Event Handler Entry Location + +Function 12 defines the address entry location of an event handler routine which +is called when a certain event (defined by the call mask) occurs. The program +is temporarily interrupted by the mouse driver. At the end of the event handler +routine the program continues at the point it was interrupted. + +The call mask is a single integer value defining the conditions which will cause +an interrupt. + +A specific condition corresponds to a bit in the call mask: + +Mask Bit Condition +-------------------------------------------------- + 0 cursor location changed + 1 left button pressed + 2 left button released + 3 right button pressed + 4 right button released + 5 middle button pressed + 6 middle button released + 7 - 15 not used + +In order to call the event handler routine, set the mask bit to 1 and put the +mask in at CX (G3%). To disable, set the mask bit to 0 and put the mask in at +CX (G3%). Always be sure to set the call mask to 0 before the program finishes. +(Leave the system in the same state upon exit as if was upon entrance.) + +8086 Register +Input: AX = 12 + CX = call mask + ES:DX = pointer to event handler routine +Return: none + +BASIC +Input: G1% = 12 + G3% = call mask + G4% = pointer to event handler routine +Return: none + +Example: + + + + + page 13 + +110 ' Active BUTTDOWN Event Handler Routine, When One or More Buttons Pressed +120 G1% = 12 +130 G3% = &H002A : G4% = BUTTDOWN% +140 CALL GMOUSE ( G1%, G2%, G3%, G4% ) + +Function 13: Enable Light Pen Emulation Function + +Function 13 permits the mouse to act like a light pen. When in this mode, calls +to the pen function will give the cursor coordinates at the last pen down +location. + +Note that the status of "pen down" and "pen off-screen" is controlled by the +mouse buttons: all buttons up, pen off-screen; one button pressed, pen down. + +Light pen emulation is ON after each call to function 0 (Reset Mouse Driver). + +8086 Register +Input: AX = 13 +Return: none + +BASIC +Input: G1% = 13 +Return: none + +Example: + +110 ' Enable Light Pen Emulation Function +120 G1% = 13 +130 CALL GMOUSE ( G1%, G2%, G3%, G4% ) + +Function 14: Disable Light Pen Emulation Function + +Function 14 turns off the light pen emulation mode. When disabled, any call to +the pen function will give information only about a real light pen. + +8086 Register +Input: AX = 14 +Return: none + +BASIC +Input: G1% = 14 +Return: none + +Example: + +110 ' Disable Light Pen Emulation Function +120 G1% = 14 +130 CALL GMOUSE ( G1%, G2%, G3%, G4% ) + +Function 15: Define Sensitivity (Mouse Motion/Pixel) of Genius Mouse + +Function 15 defines mouse sensitivity as determined by the mouse motion/pixel +ratio. This is a way of setting the amount of cursor motion wanted for mouse +movement. These ratios specify mouse motion per 8 pixels. These values must +be in the range of 1 to 32767. With a larger ratio, the cursor movement is +shortened for each mouse movement. + + + page 14 + +Default values: horizontal ratio - 8 mouse motions to 8 pixels + vertical ratio - 16 mouse motions to 8 pixels + +Note: 1 mouse motion = 1/200 of an inch increment + +8086 Register +Input: AX = 15 + CX = horizontal mouse motion counts to pixel ratio + DX = vertical mouse motion counts to pixel ratio +Return: none + +BASIC +Input: G1% = 15 + G3% = horizontal mouse motion counts to pixel ratio + G4% = vertical mouse motion counts to pixel ratio +Return: none + +Example: + +110 ' Define Horizontal Sensitivity as 8 +120 ' Define Vertical Sensitivity as 16 +130 G1% = 15 +140 G3% = 8 +150 G4% = 16 +160 CALL GMOUSE ( G1%, G2%, G3%, G4% ) + +Function 16: Disable Cursor Display in Special Range + +Function 16 sets up a special range on-screen. If the cursor moves to this area +or is in this area, it will be disabled. After a call is made to this function, +it is necessary to call function 1 to enable the cursor again. + +Define the special range with screen location values using four components: + +Components Values +-------------------------------------------------------- + 1 Left horizontal screen location + 2 Upper vertical screen location + 3 Right horizontal screen location + 4 Lower vertical screen location + +8086 Register +Input: AX = 16 + ES:DX = pointer to special range +Return: none + +BASIC +Input: G1% = 16 + G4% = pointer to special range +Return: none + +Example: + +110 ' Disable Cursor Display in (0,0) to (100,100) Range +120 G1% = 16 +130 RANGE%(1) = 0 : RANGE%(2) = 0 +140 RANGE%(3) = 100 : RANGE%(4) = 100 +150 CALL GMOUSE ( G1%, G2%, G3%, RANGE%(0) ) + page 15 + + . + . + . + +500 ' Enable Cursor Display Again +510 G1% = 1 +520 CALL GMOUSE ( G1%, G2%, G3%, G4% ) + +Function 19: Define Double-Speed Threshold + +Function 19 defines the threshold value (mouse motion per second) for doubling +the cursor's motion. Should the mouse move faster than the DX (G4%) value, the +cursor motion doubles. The default value is 64 mouse motions per second. + +If you should want to disable double-speed, just set the threshold to 32767 +(7FFFH) mouse motions/second. + +8086 Register +Input: AX = 19 + DX = threshold speed in mouse motions/second +Return: none + +BASIC +Input: G1% = 19 + G4% = threshold speed in mouse motions/second +Return: none + +Example: + +110 ' Define Double-Speed Threshold as 20 Mouse Motions/Second +120 G1% = 19 +130 G4% = 20 +140 CALL GMOUSE ( G1%, G2%, G3%, G4% ) + + . + . + . + +500 ' Disable Double-Speed Threshold Function +510 G1% = 19 +520 G4% = 256 'MAX. VALUE +530 CALL GMOUSE ( G1%, G2%, G3%, G4% ) + +*** 7 : USING GENIUS MOUSE WITH IBM ENHANCED GRAPHICS ADAPTER + +Within the Genius Mouse driver, you'll find nine EGA functions. These functions +permit your program to write to and read from write-only registers. + +The cursor in use is defined as a monochrome cursor with one bit per pixel. The +bit masks are determined by function 9 and apply to all active planes. + +In order to make an EGA function call from an Assembly-Language program, first +load the AX, BX, CX, DX, and ES registers with the values indicated for the +parameters. Note that five values must be given for a high level language +program. Next, execute software interrupt 16 (10h). The values that are +returned are intalled in the registers by EGA functions. + + + page 16 + +Upon start with DOS, PC BIOS will verify if the EGA BIOS exists. When this is +verified, the PC will execute the EGA BIOS, booting up the program to write the +INT 10h entry vector to the address of the INT 42h vector. Now, EGA BIOS +address will be written to INT 10h. Following this, you are able to call EGA +BIOS (by using INT 10h) and PC video BIOS (by using INT 42h). + +There are twenty functions in EGA BIOS. (PC BIOS has only 16.) The EGA BIOS +routines only intercept the BIOS ROM video routines (INT 10h, AH = 13h or less). + +The following indicates nine EGA functions and the corresponding function +number: + +Function Number (HEX) +----------------------------------------------------------------- +Retrieve Single Data F0 +Save Single Data F1 +Retrieve Registers on a Specified Port F2 +Save Registers on a Specified Port F3 +Retrieve Several Registers Data F4 +Save Several Registers Data F5 +Reset All Registers as Initial Values F6 +Set Initial Values F7 +Get Version Number of Genius Mouse Driver FA + +In the above functions, the EGA I/O port number and address are as follows: + +Port No. Register Name No. of Registers Index No. Address Select Register +------------------------------------------------------------------------------ + 00H CRT Controller 25 0 - 24 3x4H + 08H Sequencer 5 0 - 4 3C4H + 10H Graphics Controller 9 0 - 8 3CEH + 18H Attribute Controlle 20 0 - 19 3C0H + Singular Registers + 20H Miscellaneous Output 1 ignored 3C2H + 28H Feature Control 1 ignored 3xAH + 30H Graphics 1 Position 1 ignored 3CCH + 38H Graphics 2 Position 1 ignored 3CAH + + Note: x = B or D depending on the base I/O address; + determined by Miscellaneous Output Register bit 1. + +Function F0: Retrieve Single Data + +This function retrieves data from a single register. + +Input: AH = F0H + BX = Index number + DX = Port number +Return: BL = Retrieved data from EGA register + +Example: + +FUN_F0 EQU 0f0H ; Function F0 +; +GR_CONTR EQU 010H ; Graphics Controller +MODE_REG EQU 005H ; Mode Regisiter +; + + page 17 + +GR1_PORT EQU 030H ; Graphics 1 Position Register +GR2_PORT EQU 038H ; Graphics 2 Position Register +; +VIDEO EQU 010H ; BIOS ROM Video Routine Entry + + + + ; Retrieve the Mode Register in Graphics Controller +MODE_REG DB 00 + ; + MOV DX, GR_CONTR + MOV BX, MODE_REG + MOV AH, FUN_F0 + INT VIDEO + MOV MODE_REG, BL + + + ; Retrieve Graphics 1 Position Data +GR1_POS DB 00 + ; + MOV DX, GR1_POS + MOV AH, FUN_F0 + INT VIDEO + MOV GR1_POS, NL + + +Function F1: Save Single Data + +This function saves data to an EGA register. Upon finishing a call to this +function, the BH and DX values are altered. + +Input: AH = F1H + BL = Index number (Non-single register only) + = Data (Single register only) + BH = Data (Non-single register only) + = Disregard (Single register only) + DX = Port number +Return: None + +Example: + +FUN_F1 EQU 0f1H ; Function F1 +; +SEQUENCE EQU 008H ; Sequencer +MASK_REG EQU 002H ; Map Mask Register +; +FEAT_PORT EQU 028H ; Feature Control Register +; +VIDEO EQU 010H ; BIOS ROM Video Routine Entry + ; Save Map Mask Register of Sequencer +MAP_MASK EQU 03H + ; + MOV DX, SEQUENCE + MOV BL, MASK_REG + MOV BH, MAP_MASK + MOV AH, FUN_F1 + INT VIDEO + MOV MAP_MASK, BL + page 18 + + + ; Save Feature Control Register +FEATURE DB 02H + ; + MOV DX, FEAT_PORT + MOV BL, FEATURE + MOV AH, FUN_F1 + INT VIDEO + MOV FEATURE, BL + +Function F2: Retrieve Registers on a Specified Port + +This function retrieves data from registers on a specifiã port. Upon finishing +a call to this function, the CX value is altered. + +Input: AH = F3H + CH = Starting index number + CL = Number of registers + DX = Port number + ES:BX = Destination of returned data +Return: Returned data to destination address + +Example: + +FUN_F2 EQU 0f2H ; Function F2 +; +GR_CONTR EQU 010H ; Graphics Controller +; +VIDEO EQU 010H ; BIOS ROM Video Routine Entry + + + + ; Retrieve Four Registers Data from Graphics Controller +GRAPH_POOL DB 04 DUP (0) + ; + MOV DX, DS + MOV ES, DX + ; + MOV DX, GR_CONTR + MOV BX, OFFSET GRAPH_POOL + MOV CX, 04H + MOV AH, FUN_F2 + INT VIDEO + +Function F3: Save Registers on a Specified Port + +This function saves data from registers on a specifiã port. Upon finishing a +call to this function, the BX, CX, and DX values are altered. + +Input: AH = F3H + CH = Starting index number + CL = Number of register + DX = Port number + ES:BX = Address source of incoming data +Return: None + +Example: + + page 19 + +FUN_F3 EQU 0f3H ; Function F3 +; +ATTR_CONTR EQU 018H ; Attribute Controller +; +VIDEO EQU 010H ; BIOS ROM Video Routine Entry + + + + ; Save Four Registers Data into Attribute Controller +PALET_DATA DB 1, 2, 4, 3 + ; + MOV DX, DS + MOV ES, DX + ; + MOV DX, ATTR_CONTR + MOV BX, OFFSET PALET_DATA + MOV CX, 08 + MOV AH, FUN_F3 + INT VIDEO + +Function F4: Retrieve Several Registers Data At The Same Time + +This function retrieves data from several registers at the same time. Upon +finishing a call to this function, the CX value is altered. + +Input: AH = F4H + CX = Number of registers (more than 1) + ES:BX = Address of register packet (each consists of 4 bytes; + port address, byte 1-2; index number, byte 3; + returned data, byte 4) +Return: Returned data is saved into byte 4 + +Example: + +FUN_F4 EQU 0f4H ; Function F4 +; +VIDEO EQU 010H ; BIOS ROM Video Routine Entry + ; Retrieve Follow Registers Data +TABLE DW 030H ; Graphics 1 Position Register + DB 00 ; Single Register + DB 00 ; Retrieved Data + ; + DW 010H ; Graphics Controller + DB 05 ; Mode Register + DB 00 ; Retrieved Data + ; + ; + MOV DX, DS + MOV ES, DX + ; + MOV BX, OFFSET TABLE + MOV CX, 02 + MOV AH, FUN_F4 + INT VIDEO + + +Function F5: Save Several Registers Data At The Same Time + + page 20 + +This function saves data from several registers at the same time. Upon +finishing a call to this function, the CX value is altered. + +Input: AH = F5H + CX = Number of registers (more than 1) + ES:BX = Address of register packet (each consists of 4 bytes; + port number, byte 1-2; index number, byte 3; + output data, byte 4) +Return: None + +Example: + +FUN_F5 EQU 0f5H ; Function F5 +; +VIDEO EQU 010H ; BIOS ROM Video Routine Entry + + + ; Save Follow Registers Data +TABLE DW 20H ; Miscellaneous + DB 00 ; Single Register + DB 01 ; Data + ; + DW 18H ; Attribute Controller + DB 12H ; Color Plane Enable + DB 07H ; Data + ; + ; + MOV DX, DS + MOV ES, DX + ; + MOV BX, OFFSET TABLE + MOV CX, 02 + MOV AH, FUN_F5 + INT VIDEO + +Function F6: Reset All Registers as Initial Values + +This function resets all values to default values for the specific registers. +Function 7 sets the default values. + +Input: AH = F6H +Return: None + +Example: + +FUN_F6 EQU 0f6H ; Function F6h +; +VIDEO EQU 010H ; BIOS ROM Video Routine Entry + + + MOV AH, FUN_F6 + INT VIDEO + +Function F7: Set Initial Values + +This function sets the initial default values. Upon finishing a call to this +function, the BX and DX values are altered. + + page 21 + +Input: AH = F7H + DX = Port number + ES:BX = Table of output data +Return: None + +Example: + +FUN_F7 EQU 0f7H ; Function F7 +; +ATTR_CONTR EQU 018H ; Attribute Controller +; +VIDEO EQU 010H ; BIOS ROM Video Routine Entry + + + + ; Setting Initial Values for the Attribute Controller +ATTR_DATA DB 1, 2, 4, 3, 5, 6, 0, 7 + DB 0, 0, 0, 0, 0, 0, 0, 0 + DB 0, 0, 0fh, 0 + ; + MOV DX, DS + MOV ES, DX + ; + MOV DX, ATTR_CONTR + MOV BX, OFFSET ATTR_DATA + MOV AH, FUN_F7 + INT VIDEO + +Function FA: Get Version Number of Genius Mouse Driver + +This function will give the Genius Mouse driver version number. + +Input: AH = FAH + BX = 00H +Return: ES:BX = Pointer to Genius Mouse driver version number. + + + + + + + + + + + + + + + + + + + + + + + + page 22 + + diff --git a/sources/new-s5r4/graf/doc/graph.h b/sources/new-s5r4/graf/doc/graph.h new file mode 100644 index 0000000..f0665b0 --- /dev/null +++ b/sources/new-s5r4/graf/doc/graph.h @@ -0,0 +1,62 @@ +(* --------------------------------------------------------- *) +(* HERCULES GRAPHICS FOR MICROSOFT PASCAL *) +(* *) +(* External subprograms header *) +(*$list-,$symtab- *) +type ads_of_byte = ads of byte; + +procedure GRON(consts imode: integer); external; +procedure GROFF; external; +procedure CLS; external; +procedure POINT(consts ix,iy: integer); external; +procedure MOVE(consts ix,iy: integer); external; +procedure DRAW(consts ix,iy: integer); external; +procedure HFILL(consts maxx: integer); external; +procedure VFILL(consts maxy: integer); external; +procedure COLOR(consts c: integer); external; +procedure STYLE(consts s: integer); external; +procedure PATERN(consts p1, p2, p3, p4: integer); external; +procedure INTENS(consts i: integer); external; +procedure PALLET(consts p: integer); external; +procedure BORDER(consts b: integer); external; +procedure VIDEO(ads_of_buffer: ads_of_byte); external; +procedure HPAGE(consts page, mode, clear: integer); external; +function NOCARD(consts idummy: integer): integer; external; +procedure PUSHXY; external; +procedure POPXY; external; +function INXPOS(consts idummy: integer): integer; external; +function INYPOS(consts idummy: integer): integer; external; +function INPIX(consts x,y: integer): integer; external; +procedure GETMAP(consts x,y: integer; ads_of_array: ads_of_byte); external; +procedure PUTMAP(ads_of_array: ads_of_byte); external; +procedure ORMAP(ads_of_array: ads_of_byte); external; +procedure XORMAP(ads_of_array: ads_of_byte); external; +procedure TRACK(consts x,y: integer); external; +function INKEY(consts idummy: integer): integer; external; +procedure HASCII(consts ic: integer); external; +procedure HFONT(consts seg, offs: integer); external; +procedure HFONT8(vars seg, offs: integer); external; +procedure OUTHLI(consts n:integer; ads_of_buffer: ads_of_byte); external; +procedure INHLIN(vars n:integer;ads_of_buffer: ads_of_byte); external; +procedure MKWNDW(consts x,y,icols,ilines: integer; ads_of_window: ads_of_byte; + consts iwndwsize,iborder: integer); external; +procedure BURY(ads_of_window: ads_of_byte); external; +procedure EXPOSE(ads_of_window: ads_of_byte; consts x,y: integer); external; +procedure OUTWLI(ads_of_window: ads_of_byte; consts n: integer; + ads_of_buffer: ads_of_byte); external; +procedure INWLIN(ads_of_window: ads_of_byte; vars n: integer; + ads_of_buffer: ads_of_byte); external; +procedure SWINDO(rw, iw: ads_of_byte; consts scale: integer); external; +procedure RWINDO(rw: ads_of_byte; consts scale: integer); external; +procedure RMOVE(consts rx,ry: real); external; +procedure RDRAW(consts rx,ry: real); external; +procedure CIRB(consts ix,iy,ir: integer; consts alfa, beta: real; + consts cbord, bcint: integer; + consts p, q: integer); external; +procedure RCIRB(consts ix,iy,ir: real; consts alfa, beta: real; + consts cbord, bcint: integer; + consts p, q: integer); external; +(*$list+ *) +(* --------------------------------------------------------- *) + + \ No newline at end of file diff --git a/sources/new-s5r4/graf/doc/graphsal.h b/sources/new-s5r4/graf/doc/graphsal.h new file mode 100644 index 0000000..427de14 --- /dev/null +++ b/sources/new-s5r4/graf/doc/graphsal.h @@ -0,0 +1,63 @@ +(* --------------------------------------------------------- *) +(* IIUWGRAF GRAPHICS FOR MICROSOFT PASCAL *) +(* *) +(* External subprograms header *) +(*$list-,$symtab- *) +type ads_of_byte = ads of byte; + +procedure GRON(consts imode: integer); external; +procedure GROFF; external; +procedure CLS; external; +procedure POINT(consts ix,iy: integer); external; +procedure MOVE(consts ix,iy: integer); external; +procedure DRAW(consts ix,iy: integer); external; +procedure HFILL(consts maxx: integer); external; +procedure VFILL(consts maxy: integer); external; +procedure COLOR(consts c: integer); external; +procedure STYLE(consts s: integer); external; +procedure PATERN(consts p1, p2, p3, p4 : integer); external; +procedure INTENS(consts i: integer); external; +procedure PALLET(consts p: integer); external; +procedure BORDER(consts b: integer); external; +procedure VIDEO(ads_of_buffer: ads_of_byte); external; +procedure HPAGE(consts page, mode, clear: integer); external; +function SCREEN(consts idummy: integer): integer; external; +procedure PUSHXY; external; +procedure POPXY; external; +function INXPOS(consts idummy: integer): integer; external; +function INYPOS(consts idummy: integer): integer; external; +function INPIX(consts x,y: integer): integer; external; +procedure GETMAP(consts x,y: integer; ads_of_array: ads_of_byte); external; +procedure PUTMAP(ads_of_array: ads_of_byte); external; +procedure ORMAP(ads_of_array: ads_of_byte); external; +procedure XORMAP(ads_of_array: ads_of_byte); external; +procedure TRACK(consts x,y: integer); external; +function INKEY(consts idummy: integer): integer; external; +procedure HASCII(consts ic: integer); external; +procedure HFONT(consts seg, offs: integer); external; +procedure HFONT8(vars seg, offs: integer); external; +procedure OUTHLI(consts n:integer; ads_of_buffer: ads_of_byte); external; +procedure INHLIN(vars n:integer;ads_of_buffer: ads_of_byte); external; +procedure MKWNDW(consts x,y,icols,ilines: integer; ads_of_window: ads_of_byte; + consts iwndwsize,iborder: integer); external; +procedure BURY(ads_of_window: ads_of_byte); external; +procedure EXPOSE(ads_of_window: ads_of_byte; consts x,y: integer); external; +procedure OUTWLI(ads_of_window: ads_of_byte; consts n: integer; + ads_of_buffer: ads_of_byte); external; +procedure INWLIN(ads_of_window: ads_of_byte; vars n: integer; + ads_of_buffer: ads_of_byte); external; +procedure SWINDO(rw, iw: ads_of_byte; consts scale: integer); external; +procedure RWINDO(rw: ads_of_byte; consts scale: integer); external; +procedure RMOVE(consts rx,ry: real); external; +procedure RDRAW(consts rx,ry: real); external; +function RINXPO(consts dummy: real): real; external; +function RINYPO(consts dummy: real): real; external; +procedure CIRB(consts ix,iy,ir: integer; consts alfa, beta: real; + consts cbord, bcint: integer; + consts p, q: integer); external; +procedure RCIRB(consts ix,iy,ir: real; consts alfa, beta: real; + consts cbord, bcint: integer; + consts p, q: integer); external; +procedure PRTSCR; external; +(*$list+ *) +(* --------------------------------------------------------- *) diff --git a/sources/new-s5r4/graf/doc/iiuwgraf.ang b/sources/new-s5r4/graf/doc/iiuwgraf.ang new file mode 100644 index 0000000..b7cb4e3 --- /dev/null +++ b/sources/new-s5r4/graf/doc/iiuwgraf.ang @@ -0,0 +1,804 @@ +you can find here certain information about graphics operation in + +LOGLAN version DOS +________________________________________________________________________ + + +IIUWGRAF - basic graphics support for MICROSOFT compilers: + + FORTRAN 77 vsn 3.31 + PASCAL vsn 3.31 + and + Lattice C vsn 2.14 + + for IBM color graphics card & Hercules II monochrome card + + + +Osrodek Obliczeniowy, +Instytut Informatyki Uniwersytetu Warszawskiego, +00-901 Warszawa, PKiN VIII p. +tel. (0048)22-200211-4028 + + + + + +general info +------------ + + Drawing is done by issuing calls to subroutines which + modify the contents of a bitmap video buffer. Its contents + usually is directly displayed on the screen, so the + changes are seen immediately. + The video buffer assignment, however, can be changed to + point to a user-supplied block of memory. In this case, + the changes in bitmap setting are not displayed and even + putting the real screen into graphics mode is not necessary. + The drawing may be constructed silently, saved away + and restored later on an active display or output to + a binary file. + The Hercules card offers additional possibilities of fast + switching between two directly displayable pages. + + + The interface routines are on two different levels: + + level 1 - screen management on pixel basis + uses actual screen indices + + level 2 - positioning & drawing + in abstract world coordinates + + Description of calling sequences for Fortran and C + are given together with explanations below. Pascal + declarations may be found in the "graph.h" include + file in the distribution set. + + + +LEVEL 1 ROUTINES +________________ + +All parameters not specified explicitly as arrays or reals +are integers. +All integer parameters are assumed to be "integer*2" (16 bits) +in Fortran, "integer" in Pascal and "int" in C. + +screen address range: + + 0 <= ix <= 719 for Hercules card + 0 <= iy <= 347 + + 0 <= ix <= 319 for IBM color card + 0 <= iy <= 199 + + 0 <= ix <= 639 for IBM color card in mono mode + 0 <= iy <= 199 + + (0,0) is top left pixel + + (0,0)-----------> (ix,0) + | + | + | + V + (0,iy) + + +Three separate libraries are supplied, each for a different +kind of graphics screen: + + HGCMSF for Hercules + MGCMSF for IBM card in full color mode + MGC64MSF for IBM card in mono mode + +These libraries follow Microsoft Fortran and Pascal calling +conventions. +Optionally, each of these libraries can be supplied in four +variants, following four Lattice C models (S, D, P, L). + +initialization/termination routines +----------------------------------- + +---------------------------------------------->> SCREEN + +Fortran: | C: + | +i=screen(dummy) | int screen(); + | + + returns code identifying which library is being used + + 1 for Hercules + 2 for IBM in full color 320*200 + 3 for IBM in monochrome 640*200 + 4 for IBM in monochrome 320*200 + + +---------------------------------------------->> GRAPH + +call graph(i) | graph(i); + + switches display to graphics mode + clears entire screen + involves a delay of approx. 3 secs [ for Hercules only ] + for IBM color display, "i" sets either regular color mode, + or black&white mode, more suitable for use on monochrome + displays + i should be 1 for color mode 320*200 + + +---------------------------------------------->> TEXT + +call text | text(); + + switches display to character mode + does not change current video buffer assignment + fills screen with blanks + delays for 3 secs [ for Hercules only ] + + +---------------------------------------------->> CLS + +call cls | cls(); + + clears current video buffer in graphics mode, + without turning display off + + +---------------------------------------------->> HPAGE + +call hpage(nr, mode, cflag) | hpage(nr,mode,cflag); + + +[Hercules II only] + + controls access to both pages of Hercules-II; + + "nr" - page number ( 0 or 1) + "mode" - 0 for text display, + 1 for graphics display, + -1 for buffering only (display not affected) + "cflag" - 0 for preserving previous contents + - 1 for clearing buffer contents + + switching pages via "hpage" is done without delay if the mode + remains unchanged; + otherwise, "call graph" is equivalent to "call hpage(0,1,1)" + "call text" is equivalent to "call hpage(0,0,1)" + + the typical animation loop may be done as follows: + + call hpage(0,1,1) + c draw initial picture + ... + page=1 + 1 continue + call hpage(1-page,1,0) ; set display + call hpage(page,-1,1) ; set buffer + c draw modified picture + ... + page=1-page + if (.not.finished) go to 1 + + +---------------------------------------------->> VIDEO + +call video(array) | video(array); + | char *array; + + sets video buffer to "array", which should have + 32K bytes for Hercules, 16K bytes for IBM card. + "video" preserves the previous contents of "array". + Subsequent calls to drawing subroutines + will not affect screen display, picture + created in this buffer may be transferred + to actual display via "getmap"-"putmap", + or some other form of saving & restoring. + + + +mode setting routines +--------------------- + + +---------------------------------------------->> COLOR + +call color(i) | color(i); + + sets current color to i + for monochrome displays, 0 means black, non-0 - white + for color displays, 0 means background + + +---------------------------------------------->> STYLE + +call style(i) | style(i); + + sets style of lines and fill shades to a combination + of current color and background color (for mono - + white and black, respectively) according to 5 predefined + patterns: + + 0 .... + 1 **** + 2 ***. + 3 **.. + 4 *.*. + 5 *... + + where '*' means curent color, '.' background color + + +---------------------------------------------->> PATERN + +call patern(iv,io) | pattern(iv,io); + + sets style of lines and fill shades to an explicitly specified + combination of colors : "iv" for even scan lines, "io" for odd. + Color encoding is decimal, allowing 4 pixels. + Lines are drawn always according to "iv". + + Examples: + + call patern(1100,0011) + is equivalent to + call color(1), call style(3) + + + call patern(1212,2121) + produces a shade that cannot be otherwise achieved + ( a dotted line consisting of pixels in colors 1 and 2 ) + + +---------------------------------------------->> BORDER + +call border(i) | border(i); + +[ IBM color mode only ] + + sets actual background color to i ( i = 0,1,...,15 ) + + +---------------------------------------------->> PALLET + +call pallet(ip) | pallet(ip); + +[ IBM color mode only ] + + changes current pallette to pallette ip ( 0 or 1 ) + default pallette is 0 + + +---------------------------------------------->> INTENS + +call intens(i) | intens(i); + +[ IBM color mode only ] + + changes current intensity, 1 means more intensity, 0 less; + default intensity is 1 + + +positioning routines +-------------------- + + +---------------------------------------------->> MOVE + +call move(ix,iy) | move(ix,iy); + + sets current position to (ix,iy) + picture remains unchanged + + +---------------------------------------------->> INXPOS + INYPOS + +ix=inxpos(idummy) | int inxpos(); + + returns current x screen coordinate + + +iy=inypos(idummy) | int inypos(); + + returns current y screen coordinate + + +---------------------------------------------->> PUSHXY + POPXY + +call pushxy | pushxy(); + + pushes current position, color & mode + stack is kept internally, max depth is 16 + + +call popxy | popxy(); + + restores position, color & mode from internal stack + + +---------------------------------------------->> TRACK + +call track(ix,iy) | track(ix,iy); + + displays a small (8*8) arrow-shaped cursor which can be + moved around with cursor keys; a single keystroke moves + it by 5 pixels, in shift mode step size is 1 pixel; + "home" key returns the cursor to the initial (ix,iy); + "end" removes cursor from screen, and returns - its + position can be read with "in?pos" above. + + + +pixel operations +---------------- + +---------------------------------------------->> POINT + +call point(ix,iy) | point(ix,iy); + + moves to pixel (ix,iy) and sets it to current color + + +---------------------------------------------->> INPIX + +ic=inpix(ix,iy) | int inpix(ix,iy); + + moves to pixel (ix,iy) and returns its color setting; + for Hercules and IBM monochrome mode 640*200 : + it will be 1 if pixel is on, 0 if it is off. + + + +line drawing +------------ + +---------------------------------------------->> DRAW + +call draw(ix,iy) | draw(ix,iy); + + draws a line from current screen position to (ix,iy); + sets current position to (ix,iy); + line is drawn in current color, with both terminal pixels + always turned white ( non-background) for non-black + ( non-background ) line color. + Bresenham algorithm is used. + + +---------------------------------------------->> CIRB + +call cirb(xi,yi,ri,alfa,beta,cbord,bcint,p,q) +real alfa,beta + +[ not available in Lattice C ] + + draws a circle (or ellipse, depending on aspect value), + optionally filling its interior; does not preserve position; + (xi,yi) - center coordinates + ri - radius in pixels (horizontally) + alfa, beta - starting & ending angles; if alfa=beta a full + circle is drawn; values should be given in radians; + cbord - border color + bcint - if .ne.0, interior is filled in current style&color + p,q - aspect ratio; if p/q=1, a perfect circle is drawn, + if p/q<1, the horizontal axis is longer, if p/q>1 - the vertical + axis is longer; + + + +bitmap operations +----------------- + +---------------------------------------------->> GETMAP + +call getmap(ix,iy,iarray) | getmap(ix,iy,iarray); + | char *iarray; + + saves rectangular area between current position as + top left corner and (ix,iy) as bottom right corner, + including border lines; + position remains unchanged. + "iarray" should have 4 + ( rows * ( 3 + cols div 8)) + bytes. + + +---------------------------------------------->> PUTMAP + +call putmap(iarray) | putmap(iarray); + | char *iarray; + + sets rectangular area of screen pixels to that saved + by "getmap" in "iarray"; + same size is restored, with top left corner in current + position; + position remains unchanged. + + +---------------------------------------------->> ORMAP + +call ormap(iarray) | ormap(iarray); + | char *iarray; + + same as putmap, but saved bitmap is or'ed into screen + rather than just set. + + +---------------------------------------------->> XORMAP + +call xormap(iarray) | xormap(iarray); + | char *iarray; + + same as putmap, but saved bitmap is xor'ed into screen + rather than just set. + + + +character i/o +------------- + +---------------------------------------------->> INKEY + +ik=inkey(idummy) | int inkey(); + + returns next character from keyboard buffer; + 0 is returned if buffer is empty; + special keys are returned as negative numbers; + ALT-NUM method may be used for entering character codes + above 127 (this makes entering special keys 128-132 + impossible); + if a character is returned, it is also removed + from the buffer, so MS-DOS will not see it (CTRL-C!); + typeahead is allowed, echo is suppressed. + + +---------------------------------------------->> HASCII + +call hascii(ic) | hascii(ic); + + 'xor's the character in a 8*8 box with top left corner + in the current position; + moves current position by (8,0); + character code 0 sets complete box to black ( background ), + with no change in position. + BIOS ROM font for IBM color card is used. If the font + table is not at F000:FA6E, the character will probably + be unrecognizable, and most certainly wrong. + For codes >127, table pointed to by interrupt vector 31 + is used. + + +---------------------------------------------->> HFONT + +call hfont(iseg,ioffs) | hfont(iseg,ioffs); + + sets 8*8 horizontal font table address to iseg:ioffs. + + +---------------------------------------------->> HFONT8 + +call hfont8(iseg,ioffs) | hfont8(iseg,ioffs); + + includes a copy of IBM ROM 8*8 font and returns address + suitable for passing to "hfont"; + use of "hfont8" makes program larger but quarantees + BIOS ROM independence. + + + +line -oriented i/o +------------------- + +---------------------------------------------->> OUTHLINE + +call outhline(n,l) | outhline(n,l); + | char *l; + + call "hascii" "n" times with subsequent bytes + from "l" array as arguments; + before each character is written, "hascii(0)" is + called. + + +---------------------------------------------->> INHLINE + +call inhline(n,l) | inhline(n,l); + | int *n; + | char *l; + + reads a line of at most "n" characters from + the keyboard, storing them in the "l" array; + characters are echoed at current position with "hascii" + as they are typed in; + a blinking cursor prompts for the next character; + BACKSPACE works as expected, RETURN completes the line; + typing "n"-th character also completes the line; + "l" is blank filled up to "n" bytes; + on return "n" is the total number of characters read. + + + +window - oriented i/o +--------------------- + +---------------------------------------------->> MKWNDW + +call mkwndw(ix,iy,icols,ilines,iwndw,iwndwsize,iborder) + + | mkwndw(ix,iy,icols,ilines,iwndw,iwndwsize,iborder); + | int ix,iy, icols, ilines; + | int iwndw[]; + | int iwndwsize, iborder; + + makes a tty-like scrollable window for "ilines" lines + of alphanumeric text of "icols" characters each; + top left corner of the window is located at (ix,iy); + if "iborder" is non-zero, the window will have a solid + border and a margin of 2 black pixels drawn around it; + "iwndw" should be an array large enough to "getmap" + complete window into it, leaving 20 bytes free, + however, if "bury" and "expose" are not to be applied to + the window, 20 bytes total size is enough; + "iwndwsize" is size of "wndw" array, it is ignored now. + + Window just defines scrolling size for subsequent + line-oriented i/o. Anything drawn across it will + simply scroll. If you want to have overlapping + windows, all you need to implement that is here. + + +---------------------------------------------->> BURY + +call bury(iwndw) | bury(iwndw); + | int iwndw[]; + + makes the window disappear from the screen; + the contents is saved away, so it may be "exposed" later; + "iwndw" should have appeared before in call to "mkwndw". + "bury" may be called only if the array supplied to "mkwndw" + is large enough. + + +---------------------------------------------->> EXPOSE + +call expose(iwndw,ix,iy) | expose(iwndw,ix,iy); + | int iwndw[]; + + makes the window reappear at (ix,iy) as its new top + left corner; + the window should have been "buried" before. + + +---------------------------------------------->> OUTWLINE + +call outwline(iwndw,n,l) | outwline(iwndw,n,l); + | int iwndw[]; + | char *l; + + outputs "n" characters from "l" array at bottom line + in window "iwndw", scrolling it appropriately; + "n" may be larger than window line length - output + will take as many window lines as needed; + + +---------------------------------------------->> INWLINE + +call inwline(iwndw,n,l) | inwline(iwndw,n,l); + | int iwndw[]; + | int *n; + | char *l; + + reads in a line of at most "n" characters from + window "iwndw", putting them into "l" array; + prompts at bottom of the window with ":"; + "n" may be larger than window size - it will be done + in as many window lines as needed; + BACKSPACE can be used to erase characters on bottom + window line only; + when specifying length, one should remember that the first + column is used by the prompt; + on return "n" is the total number of read characters. + + +secret operations +----------------- + +---------------------------------------------->> HFILL + +call hfill(ix) | hfill(ix); + + fills current row (horizontally) from current position + (ix0,iy0) up to (ix,iy0) with bit pattern depending + on current color, style and/or pattern and position on + the screen in such a way that adjacent "hfill"ed" rows + will produce a shade simulating color; + does not change current position; + + +---------------------------------------------->> VFILL + +call vfill(iy) | vfill(iy); + + fills current column ( vertically ) from current + position (ix0,iy0) up to (ix0,iy) in a similiar way + that "hfill" does; + rectangular area "vfill'ed" is not distinguishable + on the screen from same shape "hfill'ed", except that + it will take much longer to fill. + + + + +LEVEL 2 ROUTINES +_________________ + + + These accept coordinates a real numbers and translate + them to actual pixel positions according to a previously + specified "window" definition; + + +abstract world window definition +________________________________ + + +---------------------------------------------->> SWINDOW + +call swindow(r,i,scale) | swindow(r,i,scale); +real r(4) | float r[4]; +integer*2 i(4),scale | int i[4],scale; + + enables positioning & drawing in abstract world + coordinates ( cf. "rmove", "rdraw") + + defines rectangular window + + r(1) <= x <= r(2), + r(3) <= y <= r(4) + + in center of the rectangular area of the screen + with top left corner in position (i(1),i(3)) + and right bottom corner in position (i(2),i(4)); + if "scale" equals 0, the real proportions are not + preserved: the abstract window is simply mapped to fit + the entire area of the screen, otherwise the window + is adjusted to reflect the aspect ratio of the screen; + abstract coordinates are mapped to the screen in the + follwing way: + + (r(1),r(4)) + ^ + | + | + | + (r(1),r(3))--------------------->(r(2),r(3)) + + +---------------------------------------------->> RWINDOW + +call rwindow(r,scale) | rwindow(r,scale); +real r(4) | float r[4]; +integer*2 scale | integer scale; + + equivalent to "swindow", using the entire screen; + a margin of 1 pixel, however, is left on all sides + to circumvent rounding problems + + +positioning +___________ + + +---------------------------------------------->> RMOVE + +call rmove(rx,ry) | rmove(rx,ry); +real rx,ry | float rx,ry; + + sets current abstract world position to (rx,ry) + (rounded to nearest pixel) within a window + that should have been defined in a previous call + to "rwindow" or "swindow"; + picture remains unchanged + + +---------------------------------------------->> RINXPOS + +x=rinxpos(dummy) +real dummy + + returns abstract "x" coordinate in latest window of the + current pixel position; + will bomb out if there was no previous call to "rwindow" + or "swindow"; + in case of "swindow" returned value may be negative; + +---------------------------------------------->> RINYPOS + +y=rinypos(dummy) +real dummy + + returns abstract "y" coordinate in latest window of the + current pixel position; + will bomb out if there was no previous call to "rwindow" + or "swindow"; + in case of "swindow" returned value may be negative; + + +drawing +_______ + + +---------------------------------------------->> RDRAW + +call rdraw(rx,ry) | rdraw(rx,ry); +real rx,ry | float rx,ry; + + draws a line in current color from current screen + position to position (rx,ry) in abstract world + coordinates ( using LEVEL 1 "draw" internally ); + sets current position to (rx,ry) (rounded); + the window should have been defined before as for "rdraw". + +---------------------------------------------->> RCIRB + +call rcirb(xr,yr,rr,alfa,beta,cbord,bcint,p,q) +real alfa,beta + +[not available in Lattice C] + + draws a circle (or ellipse), accepting center coordinates + and radius value in abstract coordinates, + optionally filling its interior; does not preserve position; + (xr,yr) - center coordinates + rr - radius (scaled horizontally) + alfa, beta - starting & ending angles; if alfa=beta a full + circle is drawn; values should be given in radians; + cbord - border color + bcint - if .ne.0 , interior is filled in current style&color + p,q - aspect ratio; if p/q=1, a perfect circle is drawn, + if p/q<1, the horizontal axis is longer, if p/q>1 - the vertical + axis is longer; + + + +OTHER USEFUL THINGS +___________________ + + Program "hgcprint.com", when called, sets up the system to + make hardcopy of HERCULES graphics image on a GEMINI STAR 10 + dot matrix printer in the same way as MS-DOS GRAPHICS command + does for the color/graphics card. + To make the hardcopy, press SHIFT-PrtSc. + This will work only in graphics mode. + + Note + Actually one cannot make hardcopy of IBM color graphics. + + +A NOTE ON LINKING PASCAL PROGRAMS +--------------------------------- + + When linking Pascal programs which call one of the following: + + mkwndw inhlin outhlin bury window cirb rcirb + track inwlin outwlin expose rmove rdraw + + linker will complain about the missing library FORTRAN.LIB. + Just ignore this complaint (simply type CR). + + +A NOTE ON LINKING C PROGRAMS +---------------------------- + + When linking C programs using one of the following: + + rwindow swindow rmove rdraw rcirb cirb + + keep in mind that the following global names + are used internally: + + wir* (e.g. wirmix, wirmiy, etc.) + pqasp* (e.g. pqaspp, pqaspq, etc.) + diff --git a/sources/new-s5r4/graf/doc/iiuwgraf.pol b/sources/new-s5r4/graf/doc/iiuwgraf.pol new file mode 100644 index 0000000..76292f7 --- /dev/null +++ b/sources/new-s5r4/graf/doc/iiuwgraf.pol @@ -0,0 +1,1546 @@ + + + + + + + + + + + + IIUWGRAF + + biblioteczka podstawowych procedur graficznych + + moze wspolpracowac z kompilatorami firmy Microsoft: + + Fortran 77 wersja 3.31 i 4.00 + Pascal wersja 3.31 + + oraz + + C (Lattice) wersja 3.10 + Aztec C wersja 3.20d + + + + dla IBM PC/XT + + obsluguje karty IBM color/graphics, Hercules II oraz EGA + + + + + + + wersja 2.2, grudzien 1987 + + + + + + + +Autorzy: + + Piotr Carlson + Miroslawa Milkowska - procedury poziomu 1 + + Janina Jankowska + Michal Jankowski - procedury poziomu 2 + + +Osrodek Obliczeniowy Instytutu Informatyki +Uniwersytet Warszawski + + + 2 + + + +Spis tresci + + +Informacje ogolne 3 +Procedury poziomu 1 4 +Procedury ustawiania trybu 5 +Procedury sterujace kolorami 8 +Procedury ustawiania pozycji 11 +Procedury obslugujace punkty 12 +Procedury rysowania linii 13 +Procedury operujace na fragmentach ekranu 15 +Procedury wejscia/wyjscia dla pojedynczych znakow 16 +Procedury wejscia/wyjscia dla linii 18 +Procedury wejscia/wyjscia dla okienek 19 +Procedury poziomu 2 20 +Informacje dodatkowe 22 +Procedury dodatkowe 22 + + + +Dodatki + +A. Uzycie IIUWGRAFu z FORTRANem 77 23 +B. Uzycie IIUWGRAFu z Pascalem 24 +C. Uzycie IIUWGRAFu z Lattice C 25 +D. Uzycie IIUWGRAFu z LOGLANem 26 +E. Wykaz specyfikacji procedur IIUWGRAFu 27 +F. Wartosci kodow klawiszy specjalnych 29 +G. FEDIT - prosty program do edycji kroju znakow 30 +H. Zmiany IIUWGRAFu w stosunku do poprzednich wersji 33 + + + + 3 + + + +Informacje ogolne + + + + Rysunek jest tworzony na ekranie monitora za pomoca +szeregu wywolan procedur bibliotecznych IIUWGRAF. Modyfikuja +one zawartosc bufora mapy bitowej, ktora jest zwykle +bezposrednio wyswietlana na ekranie. Zmiany te sa wtedy +widoczne natychmiast. Umiejscowienie bufora roboczego moze +byc jednak zmienione, tak aby byl on zwiazany z obszarem +pamieci dostarczonym przez uzytkownika. W tym przypadku +zmiany jego zawartosci oczywiscie nie sa wyswietlane, a +nawet przestawienie monitora w tryb graficzny nie jest +konieczne. Rysunek moze byc wtedy skonstruowany w pamieci, +bez wyswietlania, przechowany na dysku w postaci binarnej i +odtworzony pozniej na ekranie. Omowiony tryb pracy jest +mozliwy jednak tylko dla karty Hercules II oraz karty IBM. + W opisie procedur slowo ekran, tam gdzie mowa o jego +zawartosci, nalezy rozumiec wlasnie jako bufor roboczy. + + Karty Hercules II oraz EGA daja dodatkowa mozliwosc +blyskawicznego przelaczania pomiedzy dwiema +rownouprawnionymi stronami graficznymi. + + W wersji podstawowej karta graficzna EGA posiada +64K bajty pamieci. Pamiec ta moze byc zwiekszona do 128K +oraz 256K bajtow. Opisane ponizej procedury graficzne +dotycza w zasadzie karty EGA z pelna pamiecia 256K bajtow. +Tylko w tej wersji karty mozna bowiem uzywac 16 kolorow +( z 64 istniejacych ) oraz dwoch stron graficznych. W obu +wersjach z mniejsza pamiecia istnieje tylko jedna strona +graficzna, a ponadto w wersji podstawowej uzytkownik ma +mozliwosc korzystania tylko z 4 kolorow (z 16 istniejacych). + + Dostarczone sa cztery zestawy oddzielnych bibliotek +IIUWGRAF, kazda dla innego rodzaju ekranu: + + HGCMSF i HGCMSF4 dla karty Hercules + MGCMSF i MGCMSF4 dla karty IBM color/graphics + MGC64MSF i MGC64MF4 dla karty IBM w trybie mono + EGAMSF i EGAMSF4 dla karty EGA + + Biblioteki HGCMSF, MGCMSF, MGC64MSF i EGAMSF zgodne +sa z konwencjami Fortranu ( wersja 3.31 ) i Pascala firmy +Microsoft. Natomiast biblioteki HGCMSF4, MGCMSF4, MGC64MF4 i +EGAMSF4 sa zgodne z konwencjami Fortranu ( wersja 4.00 ) +firmy Microsoft. Dodatkowo, kazda biblioteka moze byc +dostarczona w konwencji Lattice C, oddzielnie dla czterech +modeli kodu S, P, D i L. + + Programy uzytkowe komunikuja sie z IIUWGRAFem na +dwoch poziomach: + + poziom 1 - zarzadzanie ekranem na poziomie pixli, +przy uzyciu prawdziwych wspolrzednych na ekranie, + + poziom 2 - rysowanie punktow i linii we +wspolrzednych abstrakcyjnych. + + + + 4 + + + +Procedury poziomu 1 + + Wszystkie parametry bez podanej explicite +specyfikacji maja typ integer. Wszystkie parametry calkowite +powinny miec wartosci 16-bitowe (integer*2 w Fortranie, +integer w Pascalu, int w C) + + +Zakresy wspolrzednych ekranu: + + 0 <= ix <= 719 + 0 <= iy <= 347 dla karty Hercules + + 0 <= ix <= 319 + 0 <= iy <= 199 dla karty IBM color/graphics + + 0 <= ix <= 639 + 0 <= iy <= 199 dla karty IBM color/graphics + w trybie mono + 0 <= ix <= 639 + 0 <= iy <= 349 dla karty EGA + + + + (0,0)-----------> (ix,0) + | + | + | + V + (0,iy) + + + + 5 + + + +Procedury ustawiania trybu + +GRON(i) + + Procedura GRON ustawia monitor w graficznym trybie +pracy, czyszczac zawartosc jego ekranu, ktory jednoczesnie +staje sie buforem roboczym. Parametr i ma znaczenie jedynie +dla karty IBM w trybie 320*200: wartosc 1 wybiera normalne +kolory, wartosc 0 - kolory zmodyfikowane do pracy na +monitorach monochromatycznych. Dla kart Hercules, EGA oraz +karty IBM w trybie 640*200 wartosc parametru i jest +ignorowana. Przy przelaczaniu karty Hercules z trybu +tekstowego na graficzny i odwrotnie stosowane jest +programowo opoznienie ok. 3 sekund. Tryb karty IBM ustawiany +jest wprost, bez pomocy przerwania 10H, tak aby mozliwa byla +jednoczesna praca na monitorze kolorowym w trybie graficznym +z praca na monitorze monochromatycznym w trybie tekstowym. +Konsekwencja tego rozwiazania jest to, ze nie mozna +korzystac z komendy GRAPHICS. Natomiast tryb karty EGA jest +ustawiany wprost, za pomoca przerwania 10H. + + + +NOCARD(ple) + + Funkcja NOCARD zwraca liczbe calkowita +identyfikujaca rodzaj monitora obslugiwanego przez biezaco +uzywana biblioteke: + + 1 dla karty Hercules + 2 dla karty IBM w trybie kolor + 3 dla karty IBM w trybie mono 640*200 + 4 dla karty IBM w trybie mono 320*200 + 5 dla karty EGA + + Funkcja NOCARD moze byc wywolana dopiero po +zainicjowaniu trybu graficznego za pomoca procedury GRON. +Parametr ple jest ignorowany. + + + +GROFF + + Procedura GROFF przelacza monitor w tryb tekstowy, +wypelniajac zawartosc jego ekranu spacjami. Przed +zakonczeniem dzialania programu monitor, z ktorego byl +wywolany, nalezy zawsze ustawic z powrotem w tryb tekstowy. + + +CLS + + Procedura CLS czysci ekran, wypelniajac go kolorem +0. Czyszczenie odbywa sie bez wylaczania ekranu. + + + 6 + + + +HPAGE(nr, tryb, zeruj) + + Procedura HPAGE ma zastosowanie jedynie dla kart +Hercules oraz EGA. Pozwala na dostep do drugiej strony +graficznej monitora. Wywolanie HPAGE wybiera strone o +numerze nr (0 lub 1), zeruje jej zawartosc, o ile parametr +zeruj ma wartosc <> 0, oraz ustawia jej tryb: + + tryb = 0 wyswietla zawartosc strony alfanumerycznie + tryb = 1 wyswietla zawartosc strony graficznie + tryb =-1 przypisuje do tej strony bufor roboczy + + + Przypisanie bufora roboczego trybem -1 nie zmienia +numeru ani sposobu wyswietlania biezacej strony. Tryb 0 +wiaze bufor roboczy z wybrana wlasnie strona. Przelaczanie +stron odbywa sie bez opoznien, o ile nie ulega zmianie tryb +wyswietlania (alfanumeryka/grafika). Poza tym, wywolanie +HPAGE(0,1,1) jest ( tylko dla karty Hercules ) rownowazne +GRON(), a HPAGE(0,0,1) - wywolaniu GROFF. + +Typowa petla animacyjna moze byc zatem rozwiazana na +przyklad tak: + +VAR NR: INTEGER; +BEGIN + GRON(0); + NR := 1; + (* NARYSUJ PIERWOTNY OBRAZ *) + DRAW(... + ... + WHILE JESZCZE DO + HPAGE(1-NR,1,0); (* WYSWIETLANIE *) + HPAGE(NR,-1,1); (* BUFOROWANIE *) + (* NARYSUJ ZMODYFIKOWANY OBRAZ *) + DRAW(... + ... + NR := 1-NR + OD + + +VIDEO(tablica) + + Procedura VIDEO przelacza bufor roboczy tak, aby +miescil sie on w tablicy podanej jako parametr jej +wywolania. +Samo wywolanie VIDEO nie zmienia zawartosci bufora. Obraz +wyswietlany na monitorze nie bedzie ulegal teraz zmianom +mimo wywolywania procedur modyfikujacych zawartosc ekranu. +Wszelkie odwolania do ekranu beda teraz dokonywane w +tablicy. Gotowy obraz moze byc przeniesiony na rzeczywisty +ekran za pomoca procedur GETMAP/PUTMAP lub zapisany binarnie +na dysku w celu pozniejszego odtworzenia. Tablica powinna +miec 16K bajtow przy wspolpracy z karta IBM i 32K bajtow +przy wspolpracy z karta Hercules. +Procedury VIDEO nie mozna stosowac dla karty EGA. + + + 7 + + +Przyklad: + +VAR BOK: ARRAY[1..32K] OF BYTE; + FRAGM: ARRAY[1..MAX] OF BYTE; +BEGIN + GRON(1); + (* NARYSUJ STRONE TYTULOWA *) + DRAW(... + ... + (* SKONSTRUUJ RYSUNEK "NA BOKU" *) + VIDEO(BOK); + DRAW(... + ... + (* ZAPAMIETAJ FRAGMENT GOTOWEGO RYSUNKU *) + MOVE(MINX,MINY); + GETMAP(MAXX,MAXY,FRAGM); + (* PRZYPISZ Z POWROTEM EKRAN DO MONITORA *) + GRON(1); (* NIESTETY, CZYSCI EKRAN *) + MOVE(MINX,MINY); + PUTMAP(FRAGM); + ... + +Uwaga: + W przypadku wywolania VIDEO(tablica(adres)), wartosc +wyrazenia adres musi byc postaci 1+k*16, gdzie k=0,1,2,... + + + + 8 + + + +Procedury sterujace kolorami + + +COLOR(kolor) + + Procedura COLOR ustawia biezacy kolor. W tym +kolorze beda odtad dokonywane zmiany zawartosci ekranu. Na +monitorach monochromatycznych kolor 0 oznacza czarny (pixel +wygaszony), kolor <> 0 oznacza bialy (pixel zapalony). +Na monitorach kolorowych, dla karty IBM color/graphics, +kolory maja nastepujace numery: + + 0 - tlo (czarny lub ustalony wywolaniem BORDER) + 1 - zielony lub turkusowy - cyan ( zaleznie od wyboru +palety) + 2 - czerwony lub purpurowy - magenta + 3 - zolty lub bialy + +Kolorem ustawionym poczatkowo jest 1. + + + Dla karty EGA kolor moze przyjmowac wartosci od 0 +do 15. Znaczenie tego parametru jest okreslone poprzez wybor +palety ( przyporzadkowanie kazdemu z 16 identyfikatorow +koloru dowolnego koloru z 64 istniejacych ), dokonywany za +pomoca procedury PALLET. +Kolorem ustawionym poczatkowo jest 7. + + +STYLE(styl) + + Procedura STYLE ustawia biezacy styl, czyli +kombinacje kolorow uzywana do rysowania odcinkow (DRAW) i +wypelniania obszarow (HFILL,VFILL). Styl wybiera jeden z +szesciu nastepujacych sposobow mieszania tla (.) i biezacego +koloru (*): + + 0 - .... + 1 - **** + 2 - ***. + 3 - **.. + 4 - *.*. + 5 - *... + + Przy rysowaniu odcinkow kolejne pixle beda mialy +kolor wyznaczony cyklicznie wzorcem stylu. Pierwszy i +ostatni pixel odcinka bedzie zawsze mial biezacy kolor. +Przy wypelnianiu, podany wzorzec dotyczy linii poziomych +(pionowych) ekranu o parzystej wspolrzednej y (x). Wzorzec +dla linii o wspolrzednych nieparzystych dobierany jest +automatycznie. +Inne sposoby mieszania, dopuszczajace uzycie wiekszej liczby +kolorow sa dostepne za pomoca procedury PATERN. + + + 9 + + +PATERN(par,par1,par2,par3) + + Procedura PATERN pozwala rysowac odcinki i +wypelniac obszary dowolna kombinacja kolorow. Przy rysowaniu +odcinkow brany jest pod uwage tylko par. Przy wypelnianiu, +par oraz par2 dotycza linii poziomych (pionowych) o +wspolrzednych y (x) parzystych, par1 oraz par3 - linii o +wspolrzednych nieparzystych ( na zmiane kolejno par/par2 +oraz par1/par3 ). Wartosci par,...,par3 przedstawione jako +czterocyfrowe liczby szesnastkowe daja wzorce mieszania +numerow kolorow. 0 oznacza tlo, inne cyfry - zob. opis +procedury COLOR. + +Przyklad: + +PATERN(#1100,#0011,#1100,#0011); + ODPOWIADA: COLOR(1); STYLE(3); + +natomiast efekt: + +PATERN(#1212,#0303,#2121,#3030); + NIE MOzE BYC UZYSKANY INACZEJ + + +BORDER(kolor) + + Procedura BORDER ustawia biezacy kolor tla. + + kolor kolor + + 0 czarny + 1 niebieski + 2 zielony + 3 turkusowy - cyan (niebiesko-zielony) + 4 czerwony + 5 karmazynowy - magenta (czerwono-niebieski) + 6 zolty + 7 jasno szary + +Kolory 8 - 15 to jasniejsze odcienie kolorow 0 - 7, przy +czym kolor bialy ma numer 15. + +Przedstawione powyzej kolory dotycza tylko karty IBM, dla +karty EGA natomiast parametr kolor moze przyjmowac wartosci +od 0 do 63. + + +PALLET(nr) + + Dla karty IBM color/graphics : + + procedura PALLET wybiera biezaca palete z dwu +mozliwych + + + nr kolory + + 0 turkusowy,karmazynowy,bialy + 1 zielony,czerwony,zolty + + + + 10 + + + Domyslna paleta jest paleta nr 0. + + Dla karty EGA natomiast procedura PALLET sluzy do +wyboru dowolnych 16 kolorow z 64 ogolnie dostepnych. +Parametr nr powinien byc postaci + kolor16 * 256 + kolor64, +gdzie + kolor16 oznacza identyfikator koloru ( uzywany +przez procedure COLOR ), mogacy przyjmowac wartosci 0 - 15, + kolor64 oznacza wybrany kolor. + + + Standardowa paleta ( przyjmowana domyslnie ) +zawiera nastepujace kolory : + + identyfikator kolor numer koloru + + 0 czarny 0 + 1 niebieski 1 + 2 zielony 2 + 3 turkusowy 3 + 4 czerwony 4 + 5 karmazynowy 5 + 6 zolty 6 + 7 bialy 7 + 8 szary 56 + 9 jasno-niebieski 57 + 10 jasno-zielony 58 + 11 jasno-turkusowy 59 + 12 jasno-czerwony 60 + 13 jasno-karmazynowy 61 + 14 jasno-zolty 62 + 15 intensywny bialy 63 + + + Wszystkie dostepne kolory mozna obejrzec oraz +poznac ich numery za pomoca programu demonstracyjnego +EGADEMO.EXE. + + Procedura PALLET nie ma zastosowania dla karty +Hercules. + + + +INTENS(i) + + Procedura INTENS wybiera intensywnosc kolorow. +Dla i rownego 0 intensywnosc jest wieksza, dla i rownego 1 +mniejsza. +Domyslnie intensywnosc jest ustawiona na poziomie 0. + +Procedura INTENS ma zastosowanie tylko dla karty IBM. + + + 11 + + + +Procedury ustawiania pozycji + + +MOVE(x,y) + + Procedura MOVE ustawia biezaca pozycje na ekranie +na pixel o wspolrzednych (x {kolumna}, y {wiersz}). + + +INXPOS(ple), INYPOS(ple) + + Funkcje calkowite INXPOS i INYPOS zwracaja +odpowiednio wspolrzedne x i y biezacej pozycji. Parametr ple +jest ignorowany. + + +PUSHXY + + Procedura PUSHXY powoduje przechowanie biezacej +pozycji, koloru i stylu na wierzcholku wewnetrznego stosu +IIUWGRAFu. Parametry te nie ulegaja przy tym zmianie. +Maksymalna glebokosc stosu wynosi 16. + + +POPXY + + Procedura POPXY odtwarza biezacy styl, kolor i +pozycje z wierzcholka wewnetrznego stosu IIUWGRAFu. +Glebokosc stosu zmniejsza sie o 1. + + + +Przyklad: + + +PROCEDURE SKOS; +VAR IX,IY:INTEGER; +BEGIN + PUSHXY; + IX := INXPOS(0); + IY := INYPOS(0); + DRAW(IX+10,IY+10); + POPXY; +END; + + + 12 + + + +TRACK(x,y) + + Procedura TRACK wyswietla na ekranie wskaznik w +ksztalcie malej (8*8 pixli) strzalki, skierowanej na punkt o +wspolrzednych (x,y). Wskaznik ten moze byc przesuwany po +ekranie za pomoca klawiszy kierunkowych. Nacisniecie +klawisza powoduje przesuniecie wskaznika o 5 pixli. +Nacisniecie odpowiedniego klawisza w trybie numerycznym +przesuwa wskaznik o 1 pixel. Klawisz "home" powoduje powrot +wskaznika do pozycji (x,y). Klawisz "End" usuwa wskaznik z +ekranu i powoduje powrot z procedury, pozostawiajac biezaca +pozycje w tym miejscu. Moze byc ona teraz odczytana za +pomoca funkcji INXPOS i INYPOS. + + + + + + + +Procedury obslugujace punkty + + +POINT(x,y) + + Procedura POINT ustawia biezaca pozycje w punkcie +(x,y) i zmienia jego kolor na biezacy. + + +INPIX(x,y) + + Funkcja INPIX ustawia biezaca pozycje w punkcie +(x,y) i zwraca jego kolor. + + + 13 + + + +Procedury rysowania linii + + +DRAW(x,y) + + Procedura DRAW rysuje odcinek od biezacej pozycji +do pozycji o wspolrzednych (x,y). Rysowanie polega na +zmianie koloru pixli nalezacych, wedlug algorytmu +Bresenhama, do odcinka. Pixle te przyjmuja nowy stan +zaleznie od biezacego koloru i stylu. + + + +CIRB(x,y,r,alfa,beta,kolb,wwyp,p,q) + + Procedura CIRB rysuje na ekranie wycinek okregu +lub elipsy, zaleznie od podanych wartosci p i q, +okreslajacych aspekt. Aspekt wyznaczony jest stosunkiem p/q. +Dla wartosci aspektu rownej 1 zostanie narysowany idealny +okrag. Srodek bedzie umieszczony w punkcie (x,y), promien +poziomy bedzie mial wielkosc r pixli, alfa i beta okreslaja, +odpowiednio kat poczatkowy i koncowy rysowanego wycinka. Dla +alfa = beta zostanie narysowany pelny okrag (lub elipsa). +Wartosci alfa i beta sa wyrazane w radianach, w zwyklym +ukladzie. Brzeg wycinka i jego promienie zostana narysowane +kolorem kolb, niezaleznie od stylu. Jesli wwyp <> 0, wnetrze +wycinka zostanie wypelnione biezacym kolorem i stylem. + + +HFILL(x) + + Procedura HFILL rysuje, w biezacym kolorze i stylu, +odcinek poziomy od biezacej pozycji do punktu o +wspolrzednych + + (x,inypos(0)) + +OSTROZNIE: HFILL nie zmienia biezacej pozycji. + + Uzycie HFILL jest zalecane przy wypelnianiu +obszarow, gdyz dziala znacznie szybciej niz odpowiedni DRAW. +Rowniez mieszajac kolory w danym stylu, HFILL, w +przeciwienstwie do DRAW nie bierze pod uwage poczatkowego +punktu odcinka, co pozwala na uzyskanie substytutu +dodatkowych kolorow. + + + + + 14 + + +VFILL(y) + + + Procedura VFILL rysuje, w biezacym kolorze i stylu, +odcinek pionowy od biezacej pozycji do punktu o +wspolrzednych + + (inxpos(0),y) + +OSTROZNIE: VFILL nie zmienia biezacej pozycji. + + + 15 + + + +Procedury operujace na fragmentach ekranu + + +GETMAP(x,y,tablica) + + Procedura GETMAP zapamietuje prostokatny obszar +ekranu pomiedzy biezaca pozycja jako lewym gornym rogiem a +punktem (x,y) jako prawym dolnym rogiem w tablicy. GETMAP +nie zmienia przy tym biezacej pozycji. Tablica powinna miec +co najmniej 4 + w*sufit(k/8)*kol bajtow, gdzie w i k sa, +odpowiednio, liczba wierszy i kolumn zapamietywanego +obszaru, natomiast wartosc wspolczynnika kol zalezy od +rodzaju karty graficznej i wynosi 1 dla karty Hercules, +2 dla karty IBM oraz 4 dla karty EGA. + +Przyklad: zapamietanie obszaru 101*101 polozonego w lewym +gornym rogu ekranu. + +VAR OKNO: ARRAY[1..700] OF INTEGER; + + ... + MOVE(0,0); + GETMAP(100,100,OKNO); + ... + + + +PUTMAP(tablica) + + Procedura PUTMAP ustawia prostokatny obszar ekranu +o lewym gornym rogu znajdujacym sie w biezacej pozycji +zgodnie z zawartoscia tablicy, w ktorej uprzednio +zapamietano fragment ekranu za pomoca procedury GETMAP. +Biezaca pozycja nie ulega zmianie. Odtworzeniu podlega caly +zapamietany obszar, ktory jest kopiowany w nowe miejsce. + + +ORMAP(tablica) + + Procedura ORMAP dziala podobnie jak PUTMAP, lecz o +nowej zawartosci ekranu decyduje wynik zastosowania funkcji +or do elementow tablicy i ekranu. + + +XORMAP(tablica) + + Procedura XORMAP dziala podobnie jak PUTMAP, lecz o +nowej zawartosci ekranu decyduje wynik zastosowania funkcji +xor do elementow tablicy i ekranu. + + + 16 + + + +Procedury wejscia/wyjscia dla pojedynczych znakow + + +INKEY(ple) + + Funkcja calkowita INKEY podaje i usuwa nastepny +znak z bufora klawiatury. Czytanie odbywa sie bez echa. +Jesli bufor jest pusty, wynikiem jest 0. Klawisze specjalne +kodowane sa jako liczby ujemne wedlug zalaczonej tablicy. +Metoda ALT-NUM moze byc uzyta do wprowadzenia z klawiatury +kodow powyzej 127 jako zwyklych znakow. Uniemozliwia to, +niestety, korzystanie ze znakow specjalnych o kodach od 128 +do 132. + +Przyklad: zaczekaj na klawisz End. + +PROCEDURE WAIT_FOR_END; +BEGIN + WHILE INKEY(0)<>-79 DO; +END; + +Wartosci kodow klawiszy specjalnych podane sa w Dodatku F. + + +HASCII(kod) + + Procedura HASCII rysuje na ekranie znak +alfanumeryczny. Znak wpisany jest w raster 8*8. Gorny lewy +rog rastra umieszczony bedzie w biezacej pozycji, ktora +jednoczesnie przesunie sie o 8 pixli w prawo. Uzyta funkcja +rysujaca jest xor. Kroj znakow pobierany jest z tablicy +znajdujacej sie w ROM BIOS standardowo pod adresem +F000:FA6E. W przypadku niestandardowego ROM BIOSu obraz +znaku alfanumerycznego bedzie zly. Uzycie procedur HFONT i +HFONT8 pozwala uniezaleznic sie od wersji BIOSu a takze +korzystac z innych, rowniez wlasnorecznie zaprojektowanych +krojow znakow. Kod znaku 0 powoduje tylko wyczyszczenie +miejsca przeznaczonego na znak, bez zmiany biezacej pozycji. +Wszystkie kody maja tylko interpretacje graficzna, bez +funkcji sterujacych (NL, CR etc.). + +Przyklad: napisanie slowa "oh" na gwarantowanie czystym tle. + + +HASCII(0); HASCII('o'); HASCII(0); HASCII('h'); + +Uwaga: + Parametr procedury HASCII moze byc typu integer lub +znakowego ( character w Fortranie, char w Pascalu i C ). + + + + 17 + + + +HFONT(segment,offset) + + Wywolanie procedury HFONT przelacza adres wzorca +znakow alfanumerycznych na segment:offset. Bez uzycia HFONT +uzywa sie adresu F000:FA6E. + + +HFONT8(segment,offset) + + Uzycie procedury HFONT8 dolacza do programu +uzytkowego kopie tablicy kroju znakow z ROM BIOS i zwraca +adres tej kopii jako segment:offset (parametry wyjsciowe). + + + + + 18 + + + +Procedury wejscia/wyjscia dla linii + + +OUTHLINE(dlugosc,bufor) + + Procedura OUTHLINE wywoluje HASCII dlugosc razy, +wypisujac na ekran znaki, ktorych kody zawarte sa w buforze. +Przed narysowaniem kazdego znaku wywolywane jest HASCII(0). + + +INHLINE(dlugosc,bufor) + + Procedura INHLINE wczytuje z klawiatury linie +zlozona z co najwyzej dlugosci znakow i umieszcza je w +buforze. Do wczytywania uzyta jest procedura INKEY. +Wyswietlane jest echo. Migajacy wskaznik oznacza oczekiwanie +na nacisniecie klawisza. Klawisz BACKSPACE dziala tak, jak +mozna tego oczekiwac. Linia moze byc zakonczona klawiszem CR +albo wyczerpaniem jej dlugosci. Znak CR konczacy linie nie +jest umieszczany w buforze. Przed rozpoczeciem czytania +bufor jest wypelniany spacjami. Po zakonczeniu czytania +parametr dlugosc zwraca liczbe wczytanych znakow. +Migajacy wskaznik jest zawsze rysowany kolorem numer 1, +wyswietlane znaki natomiast biezacym kolorem. + + +Przyklad: echo wczytanej linii. + +VAR LINIA: ARRAY[1:40] OF INTEGER; + N: INTEGER; +BEGIN + N:=80; + INHLINE(N,LINIA); + IF N=0 THEN MOVE(INXPOS(0),INYPOS(0)+10) + ELSE OUTHLINE(N,LINIA); + ... + + + + + 19 + + + +Procedury wejscia/wyjscia dla okienek + + +MKWNDW(x,y,kolumn,wierszy,okienko,rozmiar,ramka) + + Procedura MKWNDW urzadza na ekranie prostokatne +okienko do konwersacji. Lewy gorny rog okienka znajdzie sie +w punkcie (x,y). Zmiesci ono zadana liczbe kolumn i wierszy +tekstu alfanumerycznego. Opis okienka bedzie przechowany w +dostarczonej przez uzytkownika tablicy okienko. Parametr +rozmiar jest na razie ignorowany, a tablica powinna miec co +najmniej 20 bajtow, lub duzo wiecej, jesli okienko ma byc +zaslaniane i odslaniane ( patrz opis procedury BURY ). Jesli +parametr ramka ma wartosc rozna od 0, obszar okienka bedzie +obwiedziony ramka, co uczyni je nieco wiekszym. + + +BURY(okienko) + + Wywolanie BURY usuwa okienko z ekranu, przechowujac +jego obraz w dalszej czesci tablicy okienko tak, aby moc +odtworzyc je pozniej za pomoca EXPOSE. Tablica okienko musi +miec odpowiednia wielkosc, aby GETMAP obszaru okienka +pozostawilo w niej jeszcze co najmniej 20 bajtow. + + +EXPOSE(okienko,x,y) + + Wywolanie EXPOSE odtwarza okienko przechowane za +pomoca BURY umieszczajac jego gorny lewy rog w punkcie +(x,y). + + +OUTWLINE(okienko,dlugosc,bufor) + + Procedura OUTWLINE dziala podobnie jak OUTHLINE, +wyswietlajac linie w ramach podanego okienka. Bufor o +dlugosci wiekszej niz rozmiar okienka wyswietli sie w kilku +liniach. + + +INWLINE(okienko,dlugosc,bufor) + + Procedura INWLINE, podobnie jak INHLINE, wczytuje z +klawiatury linie tekstu. W przypadku INWLINE okienko +wskazuje na obszar ekranu, w ktorym ma pojawiac sie echo. +Jesli dlugosc bufora jest wieksza niz rozmiar okienka echo +moze zajac w nim kilka linii. Poprawianie wprowadzanego +tekstu przy uzyciu BACKSPACE jest mozliwe tylko w ostatniej +czesci linii. Dlugosc jako parametr wyjsciowy zwraca liczbe +wczytanych znakow, bez konczacego CR. + + + 20 + + + +Procedury poziomu 2 + + + Procedury te operuja wspolrzednymi wyrazonymi +liczbami rzeczywistymi odnoszacymi sie do abstrakcyjnego +okna o dowolnych rozmiarach. + + + +Definiowanie okna + + +SWINDOW(rxy,ixy,skalowanie) + + Procedura SWINDOW urzadza na ekranie prostokatne +okno umieszczone pomiedzy punktami naroznikowymi podanymi w +tablicy ixy jako calkowite wspolrzedne prawdziwych pixli. +Program uzytkowy tworzacy rysunek w tym obszarze bedzie +okreslal polozenie punktow w sposob abstrakcyjny we +wspolrzednych rzeczywistych. Tablica rxy podaje zakresy tych +wspolrzednych. Jesli parametr skalowanie ma wartosc 0, +abstrakcyjny prostokat bedzie po prostu odwzorowany na +wskazana czesc ekranu bez zachowania proporcji miedzy +skalowaniem w pionie i w poziomie. Jesli natomiast parametr +skalowanie bedzie rozny od zera, wykorzystana zostanie +jedynie srodkowa czesc obszaru ekranu tak, aby zachowac +rzeczywiste proporcje rysunku, niezaleznie od aspektu danego +monitora. +Odwzorowanie stosowane przez IIUWGRAF odwraca tez kierunek +wzrastania wspolrzednej y do naturalnego ukladu: + + + (ixy(1),ixy(3)) + / + (rxy(1),rxy(4)) + ^ + | + | + | + | (ixy(1),ixy(4)) (ixy(2),ixy(4)) + | / / + (rxy(1),rxy(3))--------------------->(rxy(2),rxy(3)) + + +Przyklad: przygotowanie rysunku sinusoidy w gornej polowie +ekranu Herculesa. + + +VAR RW:ARRAY [1:4] OF REAL INIT (0.,6.29,-1.,1.); + IW:ARRAY [1:4] OF INTEGER INIT (0,719,0,173); +BEGIN + SWINDOW(RW,IW,0); + + + + 21 + + +RWINDOW(rxy,skalowanie) + + Procedura RWINDOW jest skrotem wywolania SWINDOW +dla odwzorowania obejmujacego caly ekran. + + + +RINXPOS(ple),RINYPOS(ple) + + Funkcje rzeczywiste RINXPOS i RINYPOS zwracaja, +odpowiednio wspolrzedne x i y biezacej pozycji w +abstrakcyjnym oknie urzadzonym przez ostatnie wywolanie +RWINDOW lub SWINDOW. Biezaca pozycja jest zawsze zaokraglana +do najblizszego pixla. + + + +RMOVE(rx,ry) + + Wywolanie procedury RMOVE ustawia biezaca pozycje w +punkcie (rx,ry) w ostatnio urzadzonym oknie. Pozycja ta jest +zaokraglona do najblizszego pixla. + + + +RDRAW(rx,ry) + + Wywolanie procedury RDRAW powoduje narysowanie w +biezacym kolorze i stylu odcinka od biezacej pozycji do +pixla najblizszego punktowi (rx,ry) w ostatnio urzadzonym +oknie. + + + +RCIRB(rx,ry,rr,alfa,beta,kolb,wwyp,p,q) + + Procedura RCIRB odpowiada procedurze CIRB z poziomu +1, z tym, ze wspolrzedne srodka (rx,ry) i promien rr +wyrazane sa, jako liczby rzeczywiste, w oknie urzadzonym +przez ostatnie wywolanie RWINDOW lub SWINDOW. Pozostale +parametry maja znaczenie takie, jak w CIRB. + + + 22 + + + +Informacje dodatkowe + + + Pakiet IIUWGRAF zawiera dodatkowo dwa programy +HGCPRINT.EXE oraz MGCPRINT.EXE. Umozliwiaja one drukowanie +tworzonych obrazow graficznych na powszechnie dostepnych +drukarkach ( np. typu STAR GEMINI, EPSON ). W przypadku +uzywania karty Hercules nalezy stosowac program HGCPRINT, a +dla karty IBM color/graphics program MGCPRINT. + + Programow tych powinno uzywac sie w nastepujacy +sposob : + przed zaladowaniem wlasnego programu nalezy wykonac +program HGCPRINT lub MGCPRINT, w zaleznosci od rodzaju +uzywanej karty graficznej. Kazdy z tych programow ustawia +znaczenie klawisza PrtSc. Kazdorazowe pozniejsze nacisniecie +klawisza PrtSc powoduje wydrukowanie graficznej zawartosci +ekranu. + +Uwaga. W przypadku karty Hercules drukowana jest +zawartosc pierwszej strony graficznej, niezaleznie od tego, +ktora strona jest aktualnie wyswietlana. + W przypadku karty IBM color/graphics klawisz PrtSc +zaklada, ze jest ustawiony tryb kolor 320*200. Wydruk obrazu +graficznego utworzonego w trybie mono 640*200 jest mozliwe +poprzez uzycie procedury PRTSCR. + + Mozliwosc drukowania obrazu graficznego nie +istnieje dla karty EGA. + + Autorem programow HGCPRINT oraz MGCPRINT jest +Krzysztof Studzinski. + + + + +Procedury dodatkowe + + +PRTSCR(nr) + + Procedura PRTSCR umozliwia drukowanie obrazow +graficznych tworzonych na ekranie monitora pod kontrola +programu. Parametr nr okresla numer strony graficznej +(0 lub 1), ktorej zawartosc ma byc wydrukowana. + + Wywolanie procedury PRTSCR z parametrem nr rownym +zeru jest rownowazne nacisnieciu klawisza PrtSc. + + W celu poprawnego dzialania tej procedury nalezy, +analogicznie jak w przypadku klawisza PrtSc, uprzednio +wykonac dolaczony program : + - HGCPRINT.EXE w przypadku uzywania karty +Hercules lub + - MGCPRINT.EXE dla karty IBM. + + Procedura PRTSCR nie dziala dla karty EGA. + + + + + 23 + + + + + DODATEK A + + Uzycie IIUWGRAFu z FORTRANem 77. + + +1) Procedury IN?LINE i OUT?LINE dokonuja jedynie +transmisji tekstu, bez zadnej konwersji pomiedzy postacia +binarna i tekstowa. Aby takiej konwersji dokonac, mozna +posluzyc sie instrukcjami formatowanego wejscia/wyjscia +w polaczeniu z tzw. plikami wewnetrznymi (internal file). + +Przyklad: + + + INTEGER*2 I,J,SUM,W(10) + CHARACTER*20 LINE + CHARACTER LINEL(20) + EQUIVALENCE (LINE,LINEL(1)) + + ... + CALL MKWNDW(10,10,21,4,W,20,1) + CALL OUTWLINE(W,20,'PODAJ 2 LICZBY (2I3)') + CALL INWLINE(W,20,LINEL) + READ (LINE,'(2I3)') I,J + SUM=I+J + WRITE (LINE,'(8H SUMA = I4)') SUM + CALL OUTWLINE(W,12,LINEL) + + + 24 + + + + + + DODATEK B + + Uzycie IIUWGRAFu z PASCALem. + + +1) Microsoft Pascal dopuszcza jedynie 6 znakow w nazwie +podprogramu, zatem nazwy: INHLIN(E), INWLIN(E), OUTHLI(NE), +OUTWLI(NE), RWINDO(W), SWINDO(W), RINXPO(S), RINYPO(S) musza +byc uzywane w skroconej postaci. + +2) Niektore procedury IIUWGRAFu sa napisane w FORTRANie. +Przy linkowaniu LINK moze domagac sie dostarczenia +biblioteki FORTRAN.LIB. Zadanie to nalezy zignorowac. + +3) Do linkowania nalezy uzywac LINK w wersji co najmniej +3.04, do kompilacji Pascal w wersji co najmniej 3.31. + + + 25 + + + + + DODATEK C + + Uzycie IIUWGRAFu z Lattice C. + + +1) Nalezy unikac konfliktow z nazwami globalnych zmiennych +roboczych IIUWGRAFu. Zmienne te maja nazwy rozpoczynajace +sie od liter WIR... i PQASP... + +2) W przypadku procedur majacych parametry wyjsciowe ( w +dodatku E sa one zaznaczone jako vars ) nalezy przy ich +wywolaniu przekazywac adres odpowiedniego parametru +aktualnego. + +Przyklad: + + + CHAR LENGTH; + CHAR *TEXT; + ... + INHLINE(&LENGTH,TEXT) + + + +3) Adresy parametrow aktualnych nalezy przekazywac rowniez +w przypadku parametrow bedacych tablicami znakowymi. + + +Przyklad: + + + INT LENGTH; + CHAR *TEXT; /* LUB NP. CHAR TEXT[40]; */ + ... + OUTHLINE(LENGTH, &TEXT[3]); + /* WYPISZ ZNAKI Z TABLICY 'TEXT', ROZPOCZYNAJAC OD +CZWARTEGO */ + + + + 26 + + + + + DODATEK D + + Uzycie IIUWGRAFu z LOGLANem. + + +1) W biezacej wersji LOGLANu dostepnych jest jedynie 7 +podstawowych procedur: GRON, GROFF, MOVE, DRAW, HASCII, +HPAGE, INKEY obslugujacych wylacznie karte Hercules. + +2) System okienek do konwersacji nie bedzie w LOGLANie +dostepny w postaci procedur standardowych. Podobnie okienka +o wspolrzednych rzeczywistych. + +3) Niektore podprogramy dostepne jako funkcje standardowe +LOGLANu musza miec zmienione specyfikacje parametrow w +stosunku do oryginalnego IIUWGRAFu: + + IIUWGRAF LOGLAN + + GETMAP GETMAP:function:array of ? + INKEY INKEY:integer function; (* bez parametrow *) + INXPOS INXPOS:integer function;(* bez parametrow *) + INYPOS INYPOS:integer function;(* bez parametrow *) + + + + 27 + + + + + DODATEK E + + Wykaz specyfikacji procedur IIUWGRAFu. + + + proc BORDER(consts b: integer); + L proc BURY(window: buffer); + proc CIRB(consts ix,iy,ir: integer; + consts alfa, beta: real; + consts cbord, bcint, p, q: integer); + proc CLS; + proc COLOR(consts c: integer); + proc DRAW(consts ix,iy: integer); + L proc EXPOSE(window: buffer; consts x,y: integer); + L proc GETMAP(consts x,y: integer; ekran: buffer); + L proc GROFF; + proc GRON(consts imode: integer); + proc HASCII(consts ic: integer); + proc HFILL(consts maxx: integer); + proc HFONT(consts seg, offs: integer); + proc HFONT8(vars seg, offs: integer); + proc HPAGE(consts page, mode, clear: integer); + P proc INHLINE(vars n:integer; line: tekst); + L func INKEY(consts idummy: integer): integer; + func INPIX(consts x,y: integer): integer; + proc INTENS(consts i: integer); + PL proc INWLINE(window: buffer; vars n: integer; + line: tekst); + L func INXPOS(consts idummy: integer): integer; + L func INYPOS(consts idummy: integer): integer; + L proc MKWNDW(consts x,y,icols,ilines: integer; + window: buffer; + consts iwndwsize,iborder: integer); + proc MOVE(consts ix,iy: integer); + L func NOCARD(consts idummy: integer): integer; + proc ORMAP(ekran: buffer); + PL proc OUTHLINE(consts n:integer; line: tekst); + PL proc OUTWLINE(window: buffer; consts n: integer; + line: tekst); + proc PALLET(consts p: integer); + proc PATERN(consts p1, p2, p3, p4: integer); + proc POINT(consts ix,iy: integer); + proc POPXY; + proc PRTSCR(consts nr: integer); + proc PUSHXY; + proc PUTMAP(ekran: buffer); + L proc RCIRB(consts ix,iy,ir: real; + consts alfa, beta: real; + consts cbord, bcint, p, q: integer); + L proc RDRAW(consts rx,ry: real); + PL func RINXPOS(consts dummy: real): real; + PL func RINYPOS(consts dummy: real): real; + L proc RMOVE(consts rx,ry: real); + PL proc RWINDOW(rw: array [1:4] of real; + consts s: integer); + proc STYLE(consts s: integer); + + + 28 + + + PL proc SWINDOW(rw: array [1:4] of real; + iw: array [1:4] of integer; + consts s: integer); + proc TRACK(consts x,y: integer); + proc VFILL(consts maxy: integer); + proc VIDEO(ekran: buffer); + proc XORMAP(ekran: buffer); + +Uzyto notacji semi-pascalowej. +Specyfikacja consts oznacza parametr przekazywany przez +wartosc (tylko wejsciowy), vars - przez zmienna (wejsciowo- +wyjsciowy). +Typ buffer oznacza tablice bajtowa sluzaca do przechowania +zawartosci okreslonego obszaru ekranu ( rozmiar jej zalezy +od wielkosci tego obszaru ), typ tekst natomiast oznacza +tablice znakowa. +Litery w pierwszej kolumnie sugeruja dodatkowe wazne +informacje (roznice) w kontekscie konkretnych jezykow +(Fortran, Pascal, C, Loglan). + + + 29 + + + + DODATEK F + + Wartosci kodow klawiszy specjalnych: + + + 3 - ctrl-2 + 15 - back tab (shift-tab) + 16-25 - ALT-Q az do ALT-P + 30-38 - ALT-A az do ALT-L + 44-50 - ALT-Z az do ALT-M + 59-68 - F1 az do F10 + 71 - Home + 72 - Cursor-Up + 73 - PgUp + 75 - Cursor-Left + 77 - Cursor-Right + 79 - End + 80 - Cursor-Down + 81 - PgDn + 82 - Ins + 83 - Del + 84-93 - Shift-F1 az do Shift-F10 + 94-103 - Ctrl-F1 az do Ctrl-F10 + 104-113 - Alt-F1 az do Alt-F10 + 114 - Ctrl-PrtSc + 115 - Ctrl-Cursor-Left + 116 - Ctrl-Cursor-Right + 117 - Ctrl-End + 118 - Ctrl-PgDn + 119 - Ctrl-Home + 120-131 - Alt-1 az do Alt-= + 132 - Ctrl-PgUp + + + 30 + + + + + DODATEK G + + FEDIT + + Prosty program do edycji kroju znakow. + Dodatek do biblioteki graficznej IIUWGRAF. + +FEDIT pozwala komponowac i modyfikowac uklady pixli o +wymiarze 8*8. Takie uklady moga byc wyswietlane razem z +grafika za pomoca procedury HASCII. + +FEDIT produkuje opisy tablic kroju znakow w dwoch +postaciach: + + - jako podprogram dostarczajacy adres tablicy kroju +w postaci odpowiedniej do przekazania procedurze HFONT, + + - jako niezalezny program umieszczajacy wskaznik do +tablicy kroju w wektorze przerwania 14H. + +Pierwszy format moze byc uzyty do zastapienia standardowego +zestawu znakow zwykle znajdujacego sie w ROM BIOS pod +adresem F000:FA6E. Jest on uzywany przez procedure HASCII do +rysowania znakow o kodach od 0 do 127. Stad jego nazwa : + "format 0". + +Podprogram wygenerowany przez FEDIT ma nazwe HFONT8. Po +przetlumaczeniu przez MACROASSEMBLER musi byc on linkowany +razem z programem uzytkowym. Jesli zajdzie potrzeba zmiany +nazwy (np. w celu dynamicznego przelaczania pomiedzy kilkoma +krojami znakow), nazwa moze byc zmieniona recznie w tekscie +zrodlowym. + +Drugi format jest uzywany do rysowania znakow z +rozszerzonego zakresu znakow o kodach od 128 do 255. Stad +nazwa: + "format 128". + +Opis zestawu znakow w tym formacie musi byc zaladowany do +pamieci przed rozpoczeciem wykonania programu, ktory z niego +korzysta. Wskaznik do tablicy kroju musi byc wpisany w +wektor przerwania 14H. Robi to program wygenerowany przez +FEDIT, ktory nastepnie zawiesza sie za pomoca przerwania 27H +(terminate but stay resident). W tym przypadku tekst +zrodlowy po przetlumaczeniu przez MACROASSEMBLER musi byc +zlinkowany (bez zadnych bibliotek) do postaci .EXE. +IIUWGRAF i FEDIT nie daja mozliwosci dynamicznego +przelaczania tablic znakow rozszerzonego zakresu. + + + + 31 + + +Przyklad: + +VAR ISEG, IOFFS: INTEGER; +BEGIN + HFONT8(ISEG,IOFFS); (* ADRES TABLICY FORMATU 0 *) + ... + HASCII(45); (* UZYWA ROM BIOS *) + HASCII(145); (* UZYWA ROZSZERZONEGO ZESTAWU *) + ... + HFONT(ISEG,IOFFS); + HASCII(45); (* UZYWA TABLICY FORMATU 0 *) + HASCII(145); (* TEN SAM ROZSZERZONY ZESTAW *) + ... + HFONT(16#F000,16#FA6E); + HASCII(45); (* ZNOWU ROM BIOS *) + HASCII(145); (* TEN SAM ROZSZERZONY ZESTAW *) + + + FEDIT jest prostym programem konwersacyjnym o kilku +zaledwie rozkazach. Tablica kroju znakow zawiera wzorce +ukladow pixli rozmiaru 8*8. Wzorzec pojedynczego znaku moze +byc wyjety z tej tablicy w celu jego edycji i zapamietany z +powrotem, byc moze w innym miejscu tablicy. Sa dwie tablice +znakow: jedna dla kodow od 0 do 127, druga dla kodow od 128 +do 255. Pierwsza z nich nie moze byc modyfikowana. Druga z +nich moze poczatkowo zawierac zaladowany wczesniej +rozszerzony zestaw lub zostac wyczyszczona. Mozna tez +wczytac do niej zestaw zawarty w pliku wygenerowanym +wczesniej przez FEDIT. Po dokonaniu modyfikacji, zawartosc +tej drugiej tablicy moze byc uzyta do generacji badz +"formatu 0" badz "128". + + + Rozkazy FEDITu. + + +Rozkazy FEDITu sa wprowadzane jako pojedyncze litery +wybierajace czynnosci wymienione w jadlospisie wyswietlonym +u gory ekranu. Dodatkowe parametry podaje sie po +przynagleniu przez FEDIT. + +Komendy FEDITu: + +< low odswieza tablice "0 do 127" + +> high odswieza tablice "128 do 255" + +i init inicjalizuje zerami tablice "128 do 255" + +l load laduje tablice "128 do 255" z pliku + dodatkowy parametr: + - nazwa pliku (musi istniec) + + + 32 + + + +d dump wypisuje zawartosc tablicy "128 do 255" + na plik; dodatkowe parametry: + - nazwa pliku (bedzie zapisany) + - baza ( 0 albo 128), + zaleznie od formatu + - jezyk: + f - MS Fortran, MS Pascal + s - Lattice C, model S + p - Lattice C, model P + d - Lattice C, model D + l - Lattice C, model L + +e edit wyjmuje z tablicy pojedynczy znak + i umieszcza go w obszarze roboczym. + dodatkowy parametr: + - kod znaku (dziesietnie) + Po obszarze roboczym mozna poruszac sie + za pomoca klawiszy kierunkowych. Pixel + zapala klawisz Ins, gasi klawisz Del. + Klawisz End powoduje wyjscie z tego trybu. + +t text wyswietla tekst pomocny przy ocenie + jakosci ksztaltu znakow. Tekst, nie dluzszy + niz 40 znakow jest wprowadzany przez uzytkow- + nika. Dodatkowe parametry: + - vspace, + - hspace - odpowiednio, pionowy i poziomy + odstep w pixlach pomiedzy znakami. Normalnie, + vspace wynosi 2, hspace - 0. + +p put przechowuje wzorzec z obszaru roboczego pod + wskazanym kodem. Dodatkowy parametr: + - kod pozycji (dziesietnie), + powinien byc miedzy 128 a 255 + +q quit konczy dzialanie FEDIT + + +Z FEDITem nalezy obchodzic sie ostroznie. Posiada on jedynie +minimalne wbudowane zabezpieczenia i np. bez ostrzezenia +zapisze nowa, nie wykonczona jeszcze wersje kroju znakow na +pliku zawierajacym jedyny egzemplarz poprzedniej, bardzo +potrzebnej wersji. + + + 33 + + + + DODATEK H + + Zmiany IIUWGRAFu w stosunku do poprzednich wersji + + + + Zmiany IIUWGRAFu w stosunku do wersji 1.1 + + +1) Rozszerzenie zestawu obslugiwanych kart graficznych o +karte EGA ( IBM Enhanced Graphics Adapter ). + +2) Niewielkie modyfikacje procedur IIUWGRAFu : + + - dodanie procedury PRTSCR, + - modyfikacja procedury PATERN polegajaca na : + zwiekszeniu liczby parametrow ( wzorcow ) z +dwoch do czterech oraz + zmianie postaci tych parametrow ( zamiast +liczb dziesietnych liczby szesnastkowe ), +( rozszerzenie wzorcow oczywiscie oznacza rownoczesnie +modyfikacje procedur HFILL oraz VFILL ), + - zmiany nazw procedur GRAPH, TEXT, SCREEN +odpowiednio na GRON, GROFF, NOCARD. + + + + + Zmiany IIUWGRAFu w stosunku do wersji 2.1 + + +1) Udostepnienie procedur CIRB oraz RCIRB dla C. + diff --git a/sources/new-s5r4/graf/doc/nullgraf.asm b/sources/new-s5r4/graf/doc/nullgraf.asm new file mode 100644 index 0000000..5929544 --- /dev/null +++ b/sources/new-s5r4/graf/doc/nullgraf.asm @@ -0,0 +1,32 @@ + TITLE NULLGRAF + PUBLIC GRON, GROFF, CLS, POINT, MOVE, DRAW, HFILL, VFILL + PUBLIC COLOR, STYLE, PATERN, INTENS, PALLET, BORDER, VIDEO, HPAGE + PUBLIC NOCARD, PUSHXY, POPXY, INXPOS, INYPOS, INPIX, GETMAP, PUTMAP + PUBLIC ORMAP, XORMAP, TRACK, INKEY, HASCII, HFONT, HFONT8, OUTHLI + PUBLIC CIRB + +DEFPRO MACRO ARG, PRLIST + LOCAL LAB + IRP X, +X LABEL FAR + ENDM +LAB PROC FAR + RET ARG +LAB ENDP + ENDM + +CODE SEGMENT 'CODE' + ASSUME CS:CODE + + DEFPRO , + DEFPRO 4, + DEFPRO 4, + DEFPRO 4, + DEFPRO 8, + DEFPRO 12, + DEFPRO 16, + DEFPRO 36, + +CODE ENDS + END + \ No newline at end of file diff --git a/sources/new-s5r4/graf/draw.c b/sources/new-s5r4/graf/draw.c new file mode 100644 index 0000000..aaf3174 --- /dev/null +++ b/sources/new-s5r4/graf/draw.c @@ -0,0 +1,108 @@ + /* Loglan82 Compiler&Interpreter + Copyright (C) 1981-1993 Institute of Informatics, University of Warsaw + Copyright (C) 1993, 1994 LITA, Pau + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + +======================================================================= +*/ + +#include "graf.h" + + +void pascal draw( _col, _row ) + int *_col,*_row; +{ + int X1 = inxpos(NULL); + int Y1 = inypos(NULL); + int X2 = *_col; + int Y2 = *_row; + int pos_slope; + + int dX, dY, /* vector components */ + row, col, + final, /* final row or col number */ + G, /* used to test for new row or column */ + inc1, /* G increment when row or column doesn't change */ + inc2; /* G increment when row or column does change */ + + if( X2 < X1 ) + { + X1 = *_col; + Y1 = *_row; + X2 = inxpos(NULL); + Y2 = inypos(NULL); + } + + dX = X2 - X1; dY = Y2 - Y1; /* find vector component */ + pos_slope = (dX > 0); /* is slope positive? */ + if (dY < 0) pos_slope = !pos_slope; + if (abs(dX) > abs(dY)) { /* shallow line case */ + if (dX > 0) { /* determine start point and last column */ + col = X1; row = Y1; final = X2; + } else { + col = X1; row = Y2; final = X1; + } + inc1 = 2*abs(dY); /* determine increments and initial G */ + G = inc1 - abs(dX); + inc2 = 2 * (abs(dY) - abs(dX)); + if (pos_slope) + while (col<=final) { /* step thru cols. checking for new row */ + point( &col, &row ); + col++; + if (G >= 0) { /* it's time to change rows */ + row++; G+= inc2; /* positive slope, so inc thru rows */ + } else /* stay at the same row */ + G += inc1; + } /* while */ + else + while (col<=final) { /* step thru cols, check for new row */ + point( &col, &row ); + col++; + if (G > 0) { /* time to change the rows */ + row--; G+= inc2; /* negative slope, dec thru rows */ + } else + G += inc1; /* stay at the same row */ + } /* while */ + } /* if |dX| > |dY| */ else { + if (dY > 0) { /* steep line case, angle > 45 degree */ + col = X1; row = Y1; final = Y2; /* find start point and last row */ + } else { + col = X2; row = Y2; final = Y1; + } + inc1 = 2 * abs(dX); /* determine increments and initial G */ + G = inc1 - abs(dY); + inc2 = 2 * (abs(dX) - abs(dY)); + if (pos_slope) + while (row <= final) { /* step thru rows - check for new column */ + point( &col, &row ); + row++; + if (G >= 0) { /* it's time to change columns */ + col++; G+= inc2; /* pos. slope, increment thru cols. */ + } else + G += inc1; /* stay at the same column */ + } /* while */ + else + while (row <= final) {/* step thru rows, checking for new column */ + point( &col, &row ); + row++; + if (G > 0) { /* it's time to change columns */ + col--; G+= inc2; /* neg slope, so decrement thru columns */ + } else + G += inc1; /* stay at the same column */ + } /* while */ + } /* if |dY| > |dX| */ + + move( _col, _row ); +} + + + diff --git a/sources/new-s5r4/graf/gpmap.c b/sources/new-s5r4/graf/gpmap.c new file mode 100644 index 0000000..d7b6589 --- /dev/null +++ b/sources/new-s5r4/graf/gpmap.c @@ -0,0 +1,128 @@ + +#include "graf.h" + + /* Loglan82 Compiler&Interpreter + Copyright (C) 1981-1993 Institute of Informatics, University of Warsaw + Copyright (C) 1993, 1994 LITA, Pau + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + +======================================================================= +*/ + +void pascal getmap( x, y, buf ) + int *x,*y; + char *buf; +{ + /* buffer : 2 bytes X size, 2 bytes Y size, and rows * columns of pixels */ + int i,j,x0,y0,x1,y1; + int x00 = inxpos(NULL); + int y00 = inypos(NULL); + pushxy(); + if( *x < x00 ) + { + x0 = *x; + x1 = x00; + } + else + { + x1 = *x; + x0 = x00; + } + if( *y < y00 ) + { + y0 = *y; + y1 = y00; + } + else + { + y1 = *y; + y0 = y00; + } + ((short int *)buf)[0] = (short int)(x1-x0+1); + ((short int *)buf)[1] = (short int)(y1-y0+1); + buf += 4; + for( j=y0; j<=y1; j++ ) + for( i=x0; i<=x1; i++ ) + *(buf++) = (char)inpix( &i, &j ); + popxy(); +} + + +void pascal putmap( buf ) + char *buf; +{ + int x00 = inxpos(NULL); + int y00 = inypos(NULL); + int xw = ((short int *)buf)[0]; + int yw = ((short int *)buf)[1]; + int i,j; + pushxy(); + buf += 4; + for( j=y00; j719 || y>347 ) + + +int pascal nocard( dummy ) + void *dummy; +{ + return 1; +} + + +#define index 0x3b4 /* 6845 ports */ +#define data 0x3b5 +#define mode 0x3b8 /* Herc ports */ +#define status 0x3ba +#define config 0x3bf + + +static int cur_color; +static int cur_x; +static int cur_y; +static char *page_drawn; +static int page_drawn_no; +static int page_viewed; + + +#if WORD_32BIT +#define HERC_BASE 0xE00B0000UL +#define CHAR_BASE 0xE00FFA6EUL +#else +#define HERC_BASE 0xB0000000UL +#define CHAR_BASE 0xFFA6000EUL +#endif + + +static void set_page_drawn( page ) + int page; +{ + if( page == 0 || page == 1 ) + { + page_drawn = (char *)( HERC_BASE + page * 0x8000); + page_drawn_no = page; + } +} + + +static void screen_off() +{ + outportb( mode, '\0' ); +} + + +static void set_page_viewed( page ) + int page; +{ + if( page == 0 ) outportb( mode, '\x0a' ); + else + if( page == 1 ) outportb( mode, '\x8a' ); + page_viewed = page; +} + + +static void clear_buffer( buf ) + char *buf; +{ + int i; + for( i=0; i<0x7fff; i++ ) buf[i] = '\0'; +} + + +static void clear_gr_scr( page ) + int page; +{ + if( page_viewed == page ) screen_off(); + clear_buffer( (char *)(HERC_BASE + page*0x8000) ); + if( page_viewed == page ) set_page_viewed( page ); +} + + +static int in_graphics=0; +void pascal gron( dummy ) + int *dummy; +{ + char i; + static char params[16] = { + '\x35', '\x2d', '\x2e', '\x07', '\x5b', '\x02', + '\x57', '\x57', '\x02', '\x03', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00' + }; + + if( in_graphics ) return; + in_graphics = 1; + + atexit( groff ); + +/* + { + int i=0; + geninterrupt (0x11); + if (( AX & 0x30 ) == 0x30) + for (i=0; i<0x800; i++) + if (inportb(status) & 0x80) + { + i=-1; + break; + } + if( i != -1 ) + { + fprintf( stderr, "This version runs only with HERCULES graphic card\n" ); + exit( 1 ); + } + } +*/ + + + outportb( config, 3 ); /* allows both graphics pages */ + screen_off(); + for( i=0; i>(i-x00)) ) ) + point(&i,&j); + } + popxy(); + if( chr != 0 ) + { + x00 += 8; + move( &x00, &y00 ); + } +} +void pascal hfont ( seg, ofs ) int *seg,*ofs; {} +void pascal hfont8( seg, ofs ) int *seg,*ofs; {} + + diff --git a/sources/new-s5r4/graf/hlineio.c b/sources/new-s5r4/graf/hlineio.c new file mode 100644 index 0000000..bb2ea48 --- /dev/null +++ b/sources/new-s5r4/graf/hlineio.c @@ -0,0 +1,41 @@ + /* Loglan82 Compiler&Interpreter + Copyright (C) 1981-1993 Institute of Informatics, University of Warsaw + Copyright (C) 1993, 1994 LITA, Pau + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + +======================================================================= +*/ + +/* + OUTHLINE(dlugosc,bufor) + + Procedura OUTHLINE wywoluje HASCII dlugosc razy, + wypisujac na ekran znaki, ktorych kody zawarte sa w buforze. + Przed narysowaniem kazdego znaku wywolywane jest HASCII(0). +*/ + +#include "graf.h" + +void pascal outhli( length, buf ) + int *length; + char *buf; +{ + int l = (*length) % 0x10000; + int zero = 0; + while( l-- > 0 ) + { + hascii( &zero ); + hascii( (int *)(buf++) ); + } +} + + diff --git a/sources/new-s5r4/graf/hvfill.c b/sources/new-s5r4/graf/hvfill.c new file mode 100644 index 0000000..c64b3ad --- /dev/null +++ b/sources/new-s5r4/graf/hvfill.c @@ -0,0 +1,40 @@ + /* Loglan82 Compiler&Interpreter + Copyright (C) 1981-1993 Institute of Informatics, University of Warsaw + Copyright (C) 1993, 1994 LITA, Pau + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + +======================================================================= +*/ + +#include "graf.h" + + +void pascal hfill( col ) + int *col; +{ + int x = inxpos(NULL); + int y = inypos(NULL); + draw( col, &y ); + move( &x, &y ); +} + + +void pascal vfill( row ) + int *row; +{ + int x = inxpos(NULL); + int y = inypos(NULL); + draw( &x, row ); + move( &x, &y ); +} + + diff --git a/sources/new-s5r4/graf/lib/egamsf4.lib b/sources/new-s5r4/graf/lib/egamsf4.lib new file mode 100644 index 0000000000000000000000000000000000000000..3aa9e47aa9f291e444cdc39894f71c7b0c9f55db GIT binary patch literal 26889 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 Ka=}H59RC9;v|$$j literal 0 HcmV?d00001 diff --git a/sources/new-s5r4/graf/lib/hgcmsf4.lib b/sources/new-s5r4/graf/lib/hgcmsf4.lib new file mode 100644 index 0000000000000000000000000000000000000000..b0d8d854bde5e88fa1dd67f1efeec477f4b19738 GIT binary patch literal 25355 zcmeHwdt6mzzV~nKwQt}S@fwyInC(&=BQ?|15`>MWA_6YF6rv{SiBVG^Y6ve7x!LA$ zW*Wz0+oo*FahyIj(;{m$hQ`-Zjgm5Zz2D!n)&{Jm(|KRsKaS_! zw)j2w+wc1Po@cEtb|rd%NG9XAI-KkeuUNQj>9U-h8#l%gnI}$9Ofo0NXT)0*lhdZp zOtmJbaS{M0+EQo4r>72zw+<44o||k`_=aSarQ10aNjAIm7lam9lf@+6`Mj0PnxvWL zR^3Aq(d5Z9Gn3QeUD46e1;e6;4;zj^V$#H<^0sNZhftN`czdu#MLI;C(&V( zM02EHSE;;yGd*7@do<16hiDJ&5a1nohjd|w>6uYPZxQXL342WRIZ>A9uMZwH|BDKA zVMny65N+Fi)V3!&RN>G7tCE?TJ|k_ODK<-3}W5 zS-E;4Vf%%kdjHvf?6%X4-P)?N!P#do&z@EC4dr$5V1%t3_KncK`W@PuWwu|Kmu0(o ze}XrK)UZfN%9YeefLW5-4`8WOdOOK-HmUdMdGUJQG=L|h(%E`mo+zn4DH7G+i6TuE z4lI@hMB{SZN%Uq#7evj7reOJQ*E7?TGNvVF6Rj%8!sa1;wT0w`xhqF?BI(`0q<88% zCB2&r(#vcGd2O%~jnGC^fAzb0AhAQIy>?Q=1ukx>2*={f6Q`zQjf+Ez&FgI^>&iuW z%a^TuuM?MiG%xw?>vYM-@sca<0YqDfJQwRfumAkAlW5I3nO^UDyhgt0IaJ@w|KzXS zV9eE@*n;owkd7UA37o%wx_1z%GH?Q51#psJwmFh|J7NP#9SQKXlu`k?EL*`IsnZ!{ zMIn@}wvlDwvfO1WW_BXF;u&2#u2Xa+g*ZelwmLn%*FpM)AImfSLGs)S^gV@VGoCB; z=RMC5-SRGQivMmo$@t}mISImgwRZxk4&bItQu_d`lhhjl$|ZFGz@wt52lBId~cOpLTVSK*XhR^k36r!Z3 zuP?=WZ%FZG3glYU;&7*@KU6GB!tw~<6%2R@;cj_Wr`^$Pt+-V0jCRZu8rV)|??5W; z0b@m=6bg?~`m~Nxu;M_(%A`~sZK=~Ir(^(a$3mQlFn)p`7tUYt&|{s5zgrl8huiRX zec|jj17~eUkdC|l2BX1@(sS<8MPS18w8SLl7q1=%7LroZZzNi#$5Z2{PEE=PBl@|{ zPp~k5x~yQ)JDrG*8yOuRw4vkrWv2nxh{|?u5~#7$0I!uwyMtZc(M`E&)0HG3=C+O; z!Thi|XW7!c&eTu+83FILA>jJrhnV(7hw!pM`RK9?0b||Y_jV(-3xv^dQhNc!g{8gaq5v>j*+w%OCi5dr0jM00kEVFpktg0I+A+^1PRX=>oIn4#W~j9S#6PW)wgosbc_O z$czVYkvahY)=eV7BvO+Bwo2+0fcr^J1Hh0T)WJgl7}CQ47~mrS7}8Pz3~&VihLjJ0 z0X`0ZAr%2&fU5y8q!IuO@M!=HsT=?U+yH38B0me_Z7` z$kp1b=(e7jF7U>yD@Xv8cLM-O=OzFceK!Mu0B->pM1ytmnBdRWj#59Qc;m4A8ZgwStYSt`aJif2om31ZEsG9CT&T4E_Z%4U1- zW^;uz`Y!n$qTv4E{?(t_T&^|eY;^W?2)89(Xhs|G2g%VJ04QeH6>u930Nf7I6M1h9 zye9!XAVuhyRt!vktYez_eaX`0OA4oUB7R3Oe)qQF_xd#;?{35O_wC16BSILAs2*|5 zS=ukp6s!(y#1?pO`hktu2^~|DQ&J~GV$*vadD6hwvXxUh5nqvvuTR?Wb$!{Jy%%1W$`2y> zSoQ1nAqS5&me&~t=FFZu>*jeKB<$ooQ}b^^;+5!qFO0D+a3F6YHA<(FTLqN}YY}pG z1Y(f0@W-G?X*|1BTzc`f$az4zQ>UI;)6=HKr-Fw|LOjg==jHi%olHM(F#U}EA4ETU z{%`2#JLHr8mPW@vWg_YsBBGf7&M=*hK4&@_vTHS!v!&I-G<5kW$SlV4eY6#3nLB6p zcWKMrPFuS}w6*hxX=^;_X(yFVVA_ID7h&}UL0f9bgwOaEZGq0j`NqSGn7+R5MEUef zrmw7a`htU%F#^14+Y z9jo3Zq*9jrW}Dr2cBf7@4yyMKrqbR_3cRs}(qi{J%s$?rLJskk6jF(Ikq<~_oj#Ir z)F@<+Hza!meZXJ%(2Dtw9q2^rI3j^MVy>YM;~?icbH5*#U`p`0_ciW!&jHWzSZwbe zH(fp%3zHx4RBV0W2&5ub7?qw1;`upL96x+Qwr&_vb7F;tAV0{RH5Y%H@2v0~{h=z| zzf&b-PjWM{XgwB0SJ=D$Q*_kLdWKDbB?!Fg3w>9UnS3O^j zF){J7nw{~weI4e5A>?|ubr@S04720- zMEg?;e`3K}TjYJ1oQ&3ZI5JA|fVf7>(K9RMqi0-4|H5l~R3B6+2AOAe+K2AH^u9BC z=%x4f@A1AUi48KiiFd}}t)B=`Iub(ncKt95dE@jvb_Idq*cF7$7yE!vVLE`5O4Gof zrI~uIY(42=#Gch1L1<%{UVJ40+IS2AZ4~Q?Y&W2dr?`!Bz1BvNq&}|$7XIk#HGrX{ z`gKqTFpSg&05o+P01Y<+KpLC}h@sNIp|Q6mwH2{pz>N``;7O;xj=yao5N* z*i(z=uUxofiPVV_?KiCNrv49*Xus{C?{Hdt*P3%0c}|plS$~fItqHcs#XZ(sAoG9` zA8z>2lUyu6R&;Z-4SJ9TfCtRP4y`}ghcuPf2`?A;z1>{@gMD?7@_MEY*wC>3=HZ_i zw)d>&u!>!RJge7|{VYd9hEu#ZNq5r1^}$ZsIQ@bSID&~0 zR6i8}Jf;AE_?hk=kc86|iR?5TM5UErt~^~kPKr;TIC(Ot>9-xJiD)(MgDqaN;HP|~ zbHm1)zvn)f*_ED@Y+MS<;HzGJ$%^ALgtEzOk)^MnH{;Tm>A|Z05WTD|)U0r4tqsQ< zSylo0xX(_N-Y#??%xp5L-SKBj6`64(DD*2{^P4qqKewj1So=`he_kuj4F-cnqa!JD zbdi9gi$-%oQKX(wL=-h{Tom8kI=>&~H5!+bkdQNuwEfS${q}SFwQjak!f`n{ zIpd;=qwX7VUtHYsi;b%mu3EV8;d9l`%^7$8{J1&Kt!``ywluCLQ^dW&dm~I}wKyuO zcw7{!<>XKft@`l8pWSrRO?2gwtsz@Qv0XAmGN@SQUZTogx0{Nf4=6|1e2Z#6`skzTLW)BJt$_fw=HwLR4F^5z92k`j4O(Z8_D?NYCH}A%pU}K zA{b;^#R7;aAsyoZo;Srk)Jpy0;u_=P`Y~UKha*U$0-hTGun-Sd*~!!@*VF{5j%Ac& z6~~>Uk^7r=871zoEnM+f{_?|}sP7K3zH|N$(051L^c|b0{20nc_tD3`3yov!`FQ_l z(fv=@@co+TCw7wedm7e!iYWGIeB-sgh5yYpeECRNa~59xvstVQ*^(ZRHX}V%$;1u; zq_lqDhEv-I?!R>0Ik12D{%w3W)%4ZNt2HgJ>!lC253IfPfpg&a@Y-$jvS!VlJ?CcL z2Tq*Gy*+)3_2kp15)$~_hh0^#hW3TO@-Eg-0-yldrh~4F&_NGf<@M)1qi)cucOmID z{TLH~)h0~G*?Mt4xI`O^0iZqe^}MYBP@+2p__MA!(#W>k#kiaKS72u#>7R{efweKR|1C6KayW9gK4BB^)k6vMZqbEVP@CbzjFERMZF zOHb%I&v4GOdJgYlkn;xt{%D*)rp71p?V8KRG1cV6r0FkUgV`?nkO}(?_WsI+D;6zU z`ei2)-1UC|0z8g5RzV&0Q+=6TvDe()B2wReL4 zz5=dc^#ZDJ{hf~kas8cqfI@?QctMKx#uM^&O@u$v8&FoXgweIJP13=>rk|j>ncPeQ4QZE3dADmx89HN4p+b zhj*8JQ>RW&a7|B3TD1;pe{)>!^uKZ7MQNgP_r_5~#`|$yCuL4fNt~XUJ})C_R)!eA zWgfpOCtjknOq`yQo?)Jske)8%`7@?;`xc9AmfQ$UlE`9}92_FD*`#m|4J3P*^w;OH z8Pa48jugequZBn_lO&rbNJ&!l`d2A@-n{t>SLEfdT=bA+ot%<6b#e-!Cw|euqF-e) z3umDfDv$)D@HJm`4$~G-pn#3)I&70?%xG;Co(gHFk%uJh2 zmelFEJxA8*Gc(W?S&gF=t8u)`>8QxPh$9#4v?-Y>iJA0%m4)Eci5^q6Q`TKUC0~SR zD(nyP*xarwYF31^WK{&^_pqj0(>?pw@3WXFE%kY(3-L!Uxy4Fum*L7EFHuoH_S3_e zq&!oo?In6S%eCAxrl94?FZgVs)@r7E@E5N?kya3?6+{>S_b*Ycu^)53F&_moDrd){N0ArT~VsXW%Vd_8Fh^5qNs!zx_U93oMUXoJ&-cSYKLjt zbhpN7Zkw1$mXOB|_N$eAVgIkL<=sDGNm@EANsF;0?okn9_G2D1KWXEMZ;ANMydp3! zeW_$IyVx3IZn3DGU*;a=(2*+M#V{sd#RLX8J$LiUy7Bi$tfUAho7Aj6Z4tAY1;u6L zSe@?2c=1h6cXBxU6hj$~F4ed`R-5dQ#8_*SBcu=+G2R>@+&ev)=GW!pXXSm|xoq3g z1Le7AgCs#Gp`suY&vb{UzWx*Wp!}}vy0WDgW05fVps_R_Bu3JUy=aW<%BsOyL9|vd zU{_>_f_C)?g*0mz2o!&y)4qf8yBghN5o{J&jN6@T*N4*<53hAykCtq77<`wu!&sdPKCQL!9(O0m?g z_8rLwSnjKR#CIeIp}D>ziV}7tNs(*Ae6#QOq^}@EyLWgw-_rYR>p-PWcWW zQ{)=IujV=5;e5q*SXR2#kk5a`SNFBj)Bmy0|AErge;iMp&;Pcs?oB1E4$M*agkr19 zSFCmMN;m&lpMQkUe}~V1o6jHP^Y{1FMJWz{PoLlBQ#GZldKJ$7jgc2y*fpmW2K&@8bE?g%U z2!cKkGa)SMb-yc;u5{?<+Op;?{UF);KohbUyv=h_LImwIIfhCi8r>n9lK*l0+s7qe zfRU^$a-}@EX#;^*pm7EAwF0|VVAaJ^yAalg_&tmRuKCV%J8}wys|j-#Tq33|<`fx{ zc1AyKaWMpaUk16x8p2QvImX}|T0yuzM7^jh!lOi5+Ug6j(a)JUI%GVcbO}T&VUJXdXJKw=Wta)N4t84bQl8Mhui%ApR;#PbA&ojs zB1325%;B2rj^h4t-irAPADQ=GFiu9a87JWxY4H=M{20rmnk|z#urZ_)Y=yuhV3q!P ztz}|o%S8Jj%Vh91mWf4l9x^rzW5F^xWlGX)iqzk&N0Wp@my7U<%STLerA<{?{93=z zZYHhZTX;7#u?cdLk-WuByG#&r?Fw5cS3x4*lG4z?&<=kazgx?9v=?gLTmsAZb;#fk zz*ttY5XY(5$`MIKcIDYPZFK&P?bTkiLWrBGXzgJ9ZTgwU1$OA=hUX9NP|l23daXDn zjG&Sx+t_!D<)#!3l_jp0D60KQuQoEje}`(^yosKao1(SB2sHH-MgN!=&K->c>&9pu zO2Y{zI&rjh(i9Y(pytQH_JYh`cDlp+BGsiTX8)AU{v@A2-sc~=*&pZg5B1gEhSY(Z z{e6A@9zK5;pWozDgTBBwidp@7vwFd&p7*JZKJ~OuJ+hhQYOOD@4|#8IR^RlgJA9C? z>K32s^97zq>aRAdKliEYeCk@C`ZJ%J?^7S~1r{PBYqOf>3rtfifqM}fvpFzQk<~kV z>JXoLn@=6!3-navKD=d+4C*0j>bPa#{r?KxUeEb2aKy|uj&P*u=K7D}3EQB|$!Upc z)9gBE`|3sLBN!IunHyyA%ndrHfM>dL$idcpkV8Y6XFf!zuora+m)_w}Bz1L2@B9!S zJxx~E{po2lW=K}o#WY}>hpj-78j2QO>tol63*a)OePQg|HB1p`hO?`3C z*NSvp@FnZKc{zE@a>rw!R8JY_m$3*HayAZ%7#xWPYy5> zM;w*ThKKEl+Nq*am+=tjrq~*{>+8yo@idGwi(>{99^gQk4K4?(U}tQyxxI+JtwFQD%8|1z`So=`RHU@9A&Xt5yzN8}9{ z4SEg8hB|8v&xc{@wtv>>>do zP$nE@Oo~MfLR?(M^Nmlv1n_l+MZE~o@mFMhg7`;xAev4Be1NRu$g20Mb;yONI)Ky~ z5avFlR(sVyqrff%-|(v2k+TI+pI3br;OBVC@sxSh$51sN!ADVW8Q>#;OT6kLpSl2b zvhbv!#8l)=LXOL;Civ9*kUAF65aitMQ*T8u8kslY>FZPbAleg81frN#TGgZMJE^E_ z-w=WFfFzrNO(&zQA;Q=;338ONBi!O(lI&QH$)h16Qn%zpIZs45#U5}&@$7Q2g5gO+t|EVYS3OAVdfGQUy1o%CZvB=vhG{5<8H?#)(*<6>f*D|gh`*p_52knW z=88%fjmNkZt1c-1RV&yX$GTcOw8MPf03G|?c6xfRl7Bv^5cu=Y26fE@b)^GN2b_Ym zi3s24tsA9u_xD9Hpv>PLNnMfM1<(d41BF4L{TpxKqS7_+KFq+QVxw`ur|v`g+up#N zN;h>Uf;)ie*8sNxZuP1!0c`fE&m-km-oVdMXgz}KkP6;Y!F%dzulj@{2mVd5F`;Gq z)CYZPCi2p}fvG4y89{8eRE!d|CadGU>fHdted--Z8R88LLZKK0`y=%xz#9O2d)00L zq*xADM6+HM`eA^nO+!F6>e|6=qHI>ZR*U$y6NL7A6*sUgt1FFxdO@g*BPM#8-Dwu9 zt{73WMAz9uef&|Pn2^q9|E+jkq%+?S|NpOxbmHqG#x?(c{klk)44CG@sP$M@TD-nnqeiUq?K#;>!(pJwLB;E?4vap^jI2|_q(CnnwcJ#O0JZFXPS z#K~z1KgQ@2rrb^8FzUWw11_95LNbT!Y}A=JL~PXAe#n43z)sYhT;ZW*TW%t3HNeRR zyg%NE8&KGKoX@r%L$>u8vaQFEZ9VwLF$J<@&Yn2(ZZgkXxnwE+E?l;fEb~@Ax*|{P zy<7_yKe96K5o6P3IDU=VHcV68BvqaLC0Q;`y!Ft+_!%`I5Z@GwT6HsMS7zfl{l?5!;$z}hksK4*v7 z45&P<^brQ>-lIWSq_5NmU%*DP93@T!;h8QgM7doOxyuSPINRN27lZDyFN3kw?y?6o zci9|GE7+tJZ1iCA&lzrAciBkHY!q_NX$7BgPJQE~P^Kqkn%uHqtMR5pgZA8 z4Ak6r#!6j57-&n^P1Ujw(z4vsO7zsB){r|evC3~J>s@uUP}Q(7-K@v3!P ztuEEYw+c!)5ybfjh{1#EKl6@}j@+U2t{tL;)jIJE#4|v#AL*%dtBq8`Yr7(D!9(!- zUd3|>&zE@qj^}ecpW$i5a~e;BVn1A`bgen4gxAy}{x+W7c>aX+ZAwJVt4N2Vwq`Tn zCctNvu*0cJ@0w|wYwkzXg(m^eAY{YeR?`np6rNsi*qu?L>Z+9}f3Xtoe_RRk7vNce zXQ>jV24JZj0Njt~9r)|sRC=qgBm8?jTk)VvwF*xqp652J8v%ZSV(XR2(kB&%`nXrk z_o|P2)t`FR#hcX!H>=5LFcGE3!l670;SmTALHJgLu|8^F#U8LKk+ZAbkfqmUcUgkw z+3+>+ln5p$b*GdyPiF1|j{_%6y-$EjkzbaGa%SLk63UgiQ_7oT7#~2y8)hK^CTQ-2 zweWnoQQN)Nh1fb~RGnoFrWvP`b#1~ah`X}k;7!JJY}sg(evK12h{Uy@gOEN8hWM)` z*pWFB{;8*X60YdHBdTBVBz)mU3$<%+$JOPrNGtvY`T=ciK$D-iH=v&b?)zWk9xgXD zKX0_Lwk0T+od)l|);zjB$z2u>DRw$YtK_Da4PNwMP)1RY>+=b2^aJQ#y8!DGZHR&~ z318$}Yu8=?Np~FadZUSwJr{zM|JTs)Uvr~pPxcLAoZRZwztl!6Kt|9)aErkE5vwV+hwIZVt<)xjrA``W#F-Ru`T~H3Zd# zVAE}oZ7kB8cAIp(o(?ky;@Yz|5B%Cg;9Lfaxgoj7n<>ve-hx|fO)sI?*5erD}9JSOZM3mN;Q*@M5lZY6uonv5@jq6;@j ztmzdL=Ac@2NAbhbA6&7e?%Nl~kSdj*BSVM4Z*?S`P9%AnW zONyVT;=UeNoQ#OxhdaSrQuSw(w9qD!8-mR@AP|eHZTTXO2G%Y$7`K&;1cjz}#?{M+!d++V`=4>W@U1$_Lv@~URedXKMJP)& z$99GXl4cCxs(W;LD|zBe%0IWuN|#?l=0(ridojtcL7L+L&Ajg5tH^)4%XE?l4|M-$ z$zG?%$@8R=;;$*MTS@UH$_pzgZeeP_ABoRW-YgGW2q0RG8Qrzfqih-sGovq?85^7+ z<7|!n;-Av0@RGe*qPY*q<9g4doQOran@~u;$keIW(rw zL}k}|J(UxoG4nhpz_w~?xvZaN4W%Y;9338|^bK59ZU|gbdIXwrg7qQbQNU`Ym-^P` zz#B@>z;>li;8i4hmF`=sA_yjZ`xlS@657YZ-WR{sT_|jE?vka8mMj~#@GHJ1v&Ck_ zKm5_Vvb)-LWe&b@k~DexkJ*?F=B?L6d{S6CtZ%|X-uCvpGynO3$^LEJKqYQGPlyT&z_RWOgo)vBemLbrUR zyTi7!pZpF*3dG=nH|ba3Uf=(CFtpPDkKi4vena;~Jpr?P!I+p|yo$*0 zjm7wZU;X8c1tyS-@j6+|0+V$yUzLw}pHq!XS22&uR(ybG*~*w)oPz3Kdqi)>0R^Y& z7js+Di})sIAs~N)e5l#jzMes8{pQhD+@}&AsG(-NaYz(1)J!)0!gNfl$++pX9nLRt zsW4^=W~h6&P)NE!U5FP+bmp>^z zSU*&{2;Asr+bAi%^Nph-oBlFt%y{6MKbsZPL&6J%y1P zn)n!X%v|7zKcf(XJ1F{Xz{3)SJ#74s1Y*E1;xq7o;yPjv$uf!GZ+PE?<9~eB3Fn&n z9YMyvE^V1M^l!T|_os@hz`&;NnmU6NaU;B^3`~ma_%S_Y-IEPDpdVr~M)gBagqY{? zl32`klm6-q=uQ77!vxTR{sHuu33#oBucc0rZTcsTVoD|UZCyv`{tg{{X_um*%Svf5 zmC*!RM{}v13TZt(i~qsG@97uhr;T)mHc=0F#zsh9njyVFxzbBiD!oiwrLA;W+D;dx z9W>swlNOkE(RR}wdf&8{T21??Cyp70$~81aK0r(4gY>8zpsVs{G}Qbzde!_T9Wq~{ zmvQyF_HUHhC1SWQp!dHCmXo`d_Y z{r$~2`N(&%~K}Nm~5Srl$J6x z)tZ#XQ2-oiOTBAydg|cG*1^Kl^JyCuzAag0>00(hkj*ar1-``cx$Ap}zEb(r33xRBV!{ zhW1oF$x}Gf{Z+<0jq)}+^A7EB^&xtf=_wF(O>lN*Ywiz{Ty8#u&iHi2_^o$_2TZAMnkklRk zOC)ue9vTNQUs7l3p?d%xlGGI)eQ~utSJLO||$`w}>(Pm8d`G(dN=2bNmeZhelKI`7w z@IC*@-?~Ny&B*#NsR({Tv8nX z|0$`l053`EaDd-S>L`F$By|kHYtkW|7bc`kPe}t>kGG)}0sUe8<}O>ZH1GCK#P6+) z-?!TEyFP@1r1j_(Cpd32aIItrWLwnYP=|ZKmk^NPjOF3LGZy7}_`Bs<9rmymYsL8n zM|9YnOqP^(GJ6KmnjX+M1d1W&7{%o}im^NgA>@+cbu^}?OiP{tv>oh#MzKEU&t1OY z!A`{AHH^P~ZTP$5aCV)6vvy@g;BG*>_M)fUth2@Vl(Z>{ynZ}-7+6S5PQRLHnI2A^ zJbilNj1Z#7J0K>wzMwJQzpP;4`<;lMs~J5Xx1r~XUS3g`vC{U{B~WFjD36uabjR{} zUsv<)Oi>as^VhW@g4f65>}5;yI#YfPU<4d)L%b%o-3iqm=2RA-9dQ9)5t5<<4z{1uCHm*vjw#3iteF);bc#lZF;hk`nQ&6exY zAA+i%iu}o(Mr7&kKCD}?l8$Yj8{X2EK5occ9 zqB9x*n$cJQC^{1W;z^wZ0PSZAz!XxG0A7>SI{=)drU9T!_v&B)0J^jY03Ey!09{%N zfDSGPK$r3X(7}fQ(4`^(bg%>fT`C1Y2OkAMm&yUq!3_ZD(tiM;gTDhnm!1Yd2R#7j zk{19S+zfy&y$pa3ZUKm+twHggI&1bUq6LOjnVCLy)@(4dC2ha`5}|`h&Y2(F4vO8noMCx0I_%r5Cxt&4*5w&DAVRw!?2!~IX~ z*H}V=Il!)Y(6Od}o+(fr+^Eg-^!u5O+Fl)V(~?uCfrHcGHq06LTDIbjPQ+IPVA zaM|+v=jMLWi3oX?5t7k{koDckI(bT3@|1KPCZ^MgD-KD|wJ)Rs>+tp9nGSa^hkLrI zw8jjaU2CK5_F+xsDl=7`lLq-}MpSD0U1`HNAOUug;p=(P)s*#zU%v#&-^FPx#M|*iZVq8XfwanNZIl6N(w&5QJoJ`I7n2upK2-&YFBH^Pmd{z@}m>KgF9u zEce_!`^UV=)y|vV4-(h*pXW^zz>l`mnn}!?aHasi`kdfR`+{4<869~OOE{Kqixx6{ zo$EyT_FJZ}%y#;ML7(Lt>g{mdX)3KXv;L?E3C9A?T?cYvvg$iRD{tLe-gxM9$GQnD-3oi=bw|R=)22No z-`UISSDrXny+yF4O!=+0eZ|S`I@yHL$DX0IrZ!(d&@Mmjao4#I z#ln2>kmjzla%g^}s0AfCseBC+FB+I7Q;TBcNJ@Ulbdtb6d&a#Mx- zz|R%w{-Ywn{RvkSi`rvBbcMYeK1b7y?(bt;YY`{W8&XT}iVL4y9<6C_*j=~5rn~Ai zY$2!1(I+NeR@3f!!@dsVL6>GvEgVt0n;x>rM_VE)a4m&e4<27(J$PJ3R{2jvNlB|t z+vost-^IsWT%=|18+O3mqE9Hn{VMF+(1fw=cDKfU&wV1|UlX#5d6Hcu1+)%* z>w<1}?4PLrj=~!(m}`r?3xktU8+S)WPVNwwXgzRzg?!++^T1ztZV%|4T7ypJnH~1) zcc1^z5qaK2Z)?&uNA zT=EqGM3Ij<(*kMjTD@u>7;^H!&V^7=Rm#i4CTIvJY!6uNPKStan``G9USay(B<+JyWAL zG;SR@;tON%HmfD1Vh8lCCTLI{c5s0`*uw4S0$ou(i`UZK%twNXQ<5i9KLo&`6CVOx zPwK4zSP@K&p!(?mSYrwRh@a^$O%g_VM6yvnn$}ceac$701%3vok$0$+$!~gRchmB`c0&;mabkMV8JzYsMu()4f##_=+Dy zg_;@asI?KPnN|Vyga1lT7pe;}n@nnV{A{iwGj65@pW;<7t$Od7RmH{HC))1QT5(Pw z5GWcGK@nq$1RPT|h9in1^oSy&$noPN`J&(H-N>)e`0V)j?D3@Se&)URp4qK+vvqsK z@Ansu&(6*sA6XnZapc6fxZJZ%E9bAAKY!7w>SyjAfBN+JyPqj(Y7MkDm5?d?w!m%S zCe&IS8Cg6&62-E!DVtV)^2u-d_3KBs%^#DKGsa)Y{Vgso7Wt4(6Zs<}DH0FD=vG)D z41nUY0$I3>NmN~39RL`dtz{1eL;=2_h>nZw@QEj`urMx;;wUF4M}%{70{F|JxT5O9 zuvS!53n(kATI7q2%gV}%izK*6_=&Q|YvZ$#6c=|173xnMC(tD$ z#A##=L+hsR`9w_;l9 zk{=bIo_$An76oa@w|Wzv(Ae2ec87WaExMp!tCKGq^K}-6a6`rol}^T zeTvRvdgf&ZsOC%{@KH?-)towiVjtj`oSK@NoH3%kEYyeQ{l^OXi!hff^f%@9=W%Y= z>qRo2OWYo+k0X@+C~yY#p%T=^@#sP!1!~qujzD{bXg4dXka+N6RueQLehNX)$lU&D zabj*bqA;uocx}qc!uXGI*k6tI`-dSK@f^N{c^Z?Gg(00qxPWK8wJ9s7ARGOSqg*lm zFw!TWDT^oIl!)bi5&3xn09$zkqCTD{qGOnGu29qm4s@&_ThuQIk0RoV;^Iaz{7h@t`>8b6qbMOAh(U6N~R z0#wfoO0tTx^f5?%shvTUK;EsGzx=`c+f`y`dkI1F+bH>Ns1^&IjYDV=(}vXTF~HDgcD&b^%W6f-^lKEn{XX=(3=l zE}4k=5$Dsna~CaK)`{dfl*zNMjXbY7lfw;dBpF1iP#dfbE&3l@M}Zo?ynzFe>-ZpK zfQ}`;HL*Z?-Z&vnot(tCpDq~3h|{Jdrht(&cEpmwKNc=r`b{Sy=-=W%3OE^gu!`_H zL=X?S>uv=C=1Bweg^`?+Fga}sFtE98%6YzXm*;_HcjkTf8+bveSMGwi$yg8>nC|gX zo^8CG*S)1ng??fiTAgohZ824R_x6@8^%mpK=BNDP0pC5ECq?PVNKKmoMg?TFUuH)@ z+((<6m$z{F(&e4F0J0b%|8eCaWI+%iYH<(9M2JYf^rZ>`*%sitf^7k8C4&Khq6m81 z%e<=^ja@{FZ5d}KFKf9vNZX-%Xa>JP-e zBCTPw1k#2g^m}Q|2tC9*!Pg|4f%M5U64R1_=L%y5vOHRm_fXElgigeE5@UPIm5c2= z+OZ8ZPG~sYaGGs#!8aGmq2=iBGaNWM;=KFf&%VV_?U_Vs1aO3Fa=ifX`T`%v;`Iea zDsIwU4}iBAZUVqX7`_jKYjV7=$KAQx0A7>c(&btDjM>v!yzOmcuEu&^$_KIwmOru) z#t8AcpRqeH<=y%9B%7q#syN<^r{1N22oIfEUoF>csLot$K#I>C=)4E%93-mZ{?Qky%*UtciTJB9W}A`ej5b zIO@#Q3^I#*)>gxU!m+FnqNb@_Q^=e-&V>0n3zrs)0Rw<69ftasj#kvt`XKCH43j3UuvtG3I!DW&wQ&!6!&m)Sr#qFvcj46>2+)Ud(jnTE-T% zKJpbC=4-8Hx)r~8ca5}y2(2L8s0mwvB8L{oTxMawX=e<3I(E*o9Zba&jzM6!F0TQm`-CY^TSZm*8LD$3(Tx zfJ8g6rAT!uF>IQ^kW}1KVsv7Zw~*_xWX|meX3+Jy4V_HY_TYuU*;Me zrXy9nIAaXJiUCA9+_&(|y6}57W>WZ*OloGIwt!j9gw!%ptPa0bK zF4ef(SDO?jiN4k*g-by)V!VX~aqn zt#|4N;STwA%3`g!zfM@8z>788^LN@`sdU@FQL*e_t5|AFy!-P3a=o?pdG}|-caL|! zqJ->EROH$aZ>_~!OWu7K6?4tsz5C88AvG=Dn&aM@quzZ76}iUet$D_~FJH0kla+2Y z+j)}K>)`abpgK32N=4#CxXeeZee-%>*Au{i1l^9y-RSjQ z=k>*SeFMDpkxH1ar`Koms+!VO{T}Y`UiBNV`v1J@S6=mVullK1{m`rK^{VfC)$LyY z>q@Bld$0dRCB$E-*wy>J>LRZ?->c5tq~76GCwbMeUjJ~#<{zq9`&3tHMFoHf{GeIosWq-_)E_P_= z^1SBF{lVG#KoT+=yv}`ALICwMIRtatGz77kX;kA~ZErGUAbFm|y@#IVJfB7)q`Xs0bKx}a~$z}Hwp z7=j_&=v8U7A8h(<3?j%> z4}0RN{%V!+ z=gz-x&cC3XjBHa*LT98+PPpTjXeQOHncNK>L;8rd5Lg7P(myWOOzfLq0R!$+qH*Eu2c5ZR0*DmYb6` z6qdNy6jAI?da+UY13DDr>P_^B+#Ib9g{Qf%$oj{;P;O{6mTrvJA-BnBB&@BG=74Af zB|i0S6%H@f8$m2z3P2l|9m85Zc@{{{yPDQS1wbE#1EWBo} zlCfs4(pL)BOjq`Wu{IxI-}Ss^K7p^W7j+4h-e+F~bq$l=|G9PaC|RAir>EU@mt=KL z3&KPrJjH++3_I=wbgkZk9^;VRs*jV5jX>J8WNZb%g2d=q)fbnpt%%2MYqHLnlbyFL zhb(FO&OpSb)6^;l@4LX1^|iRe&intg)Q-GZkX1A`DSpW0x~?;J5>?92i2dF ziGY)mJt0(QnqjS@8J0d(>)FsPl-Mw4_mz$#Hn=2nW#ea+N21Kcfv`$P<03nPcB-h< zc{~`pDYnMtJXiTCT;pi7u+bxPR2cGXaE7r6cEl!`+q2l)vP5vL*a~uGtPw&OWQ4Mf z-vLhIaP_g`XEe-EtnVjT^#s<*Au=aYQ|ve$X4VFkDOrCZ(bhy8<_M z5)P=G=x`5eaaJBdt9r|gqq$|hG*@Ai7M(%|^)`%NUp8~IJmW#4d$52XHZ9HsCzKERXMA@QZuAzF7c@$CnOp7ZUG8;vF7elGir{F_RE8 z4(=AAz{M#R-*AM6APaOH4i9`!*K&4>2^WLyS#AK(&?y3ni6LzzstWaOBRl&MH@denHY zIuWts;D#Y(h*!N9-e@HDgX`;6`ykj8E*wFODy`}PN!lV+RJL!3KzTrt&A_IEQPvo4 zY?}l*%GeQZ4r7w+n2*V$F+4)o@+#f47QI%B_?8x!_Th@FSeMm>#vnZ-#KnFSy~yS?i&Ynl$XTk(Y#~1WC{avM zX7l;U{3Xlh4WB=GogMZNGY5tSC3nKob@=RpFtjBkUi%Yfwh?V|J0xLRTKq2&+Cmif z3x!briUn{eE3z{C>@1W`>?0P+wx1Kgb!-I7&Jh+imcwSdzMc>81{Y(OEaIh|!S zLzdMHSynS-Sq!4ZBu+NEvocr^0NcSyRQa~T@y*o*78A70d@`Pqqss{Uk{@gT!xC zrQ=f@>{9MymB+DwVaH%T)iI*a43l#kCYt{33`eH&fM)3s$$nnW$vYh}H((w)6D)5-xmWOBb5rMdStoRYtm-|VF|oN}!$(p;-= z)mj=ghkWoK;}0oIn8@a;E@CaUt7(nly1I}Ze)QM}v` zcn%wZa^(0Z0Lx-oA@c2z$W>OL!C2}lI~#D7eG`bSc9s1~bCun#X$4Pf1smNM{4<7G z&Q&%FBO8sBQ(D0noYK%VHJIp5-r~;O8e7-zsB1%}=6Wtm;|#7c2Wo%ERkm0|&CVxX zWzm}6;pU4b(aR&5b%1>^<^GCFV=OavXqwv?d?f1G6L7^}tUTgus%%VtLEuav=0c;Z z>K?^4WKbz$Roj{V2mFY*P6es$+0i<Fy7Gv^V|>}5yFC~bHg#tM7+3Ru1>9v3n9!pE_l9uIwc%92wE?ID9=rUdD7>}| zpD6@Z&jGhBVH{!{pM&|>U3Mxk7Nzo+xRV31$(JrP^Q?88tuEEY*9uDbC;h>!9^+d{XLa#wGm2aZC8XXa0I*E_i*RozJdEMxG&+pfNO#~ z2G^+A_th(1YxXFiHMI!82lqDIpAf%A39oqt@i4U2Yyx~5@JS_PU#il(=FUwuwKpL?C)}%WXi}|$tAu-Ile!V$31nNZM67v42~!{PsQDiC0grmWM_s&0y?2wEgbJr1 z*EkpiN5el7{$cQ63qR&Z?W@@RRwZI~)tj>PhU_Yf*W4S<0Z&t~2-dig%UY)K>cbib zPMCTh29+YcYzp$3fzzqTSLRACZ;4@i01w1>v*B+OV(I4 z<8`vGjXw%@S2hA`lkpr|HU_z0=Lq&9a`l%Wq%Q)&_0<~axH#hfp~t)9FY0SY6u;<> z|H_3LYF7`z)y;8;D}Dm)fVMWE%FkRI&`zD}_Sd8Pgu+ zDhmY{I~Jgoa`TJET6CjRMpn1;%SkS@1L#^k5Azdku!6DiU*%hCSDyh%ckJ$D zAw$FI(szN3ydlAQnceWI)jKfxM@_Sk zEVF78WO`(<`z#ljr;RIX3>0HV8nMC}1LMjLi_l?&4hKq$pQYlyZfBf~fZm2H-cwrj zXOlGFCZZbyEmy%4i=u7mB8&=FFEti!FRiWbD~AMWd>*=jLh;*0Lp)>TbY8>E#M_n^F++|H`0uChL02f5m0*M`B`xVn}7A1fQI;T!;&jN_cg zki+l_N%5Goml1@y#n`t!=6vo4WpaaM9&=XxAZd9pNmR#rh8vt_Ea1vpb$Tm(_#4VU zwZlpmUPt0t_v+g)$a5gg@qlKYcdV<3f4ItYlE)h8{*Tg~4vnMdNTtQ+D6d;-@p;M% zDJ^bgYQG(kPg342H){wWT8$UFbE8{%dMMP4zN}_!aDa@nG`4GgPAfx8cV>#}J|?&G zuv_^k7Ww)ipH!Bqb>EnUyl8IayIf)ODUiFOxuJ$hP-VJr{FPBtq#Hpug0gcmdygPZLJM-zG8_Af4BPNEwazCc+G(O# zEkg;OTpE1}X1=@`9+4PlyH>=LfGHZ)+ALwtFYj`&Pr-r8&ci*GkAi*XaZZA6)!ceP zKaIGanmuu}Z?w|a|GjdR|Gd(}-+~i}PXG@9Rx7>KcQ^UpRC@ZiDt-K~AljpJf3+%{ zpwi=j0s8%8r(IB_iCl!eFR*%4Q^tR z3^V4AP~A!*Y+|gz4ZT{Up@mju6&6mMm~&f#=NmHPh_Lul&abHd2Xkt28>F{o8jo08@uLJ z<89>0};(m{?h$NWp#-T+_f|+c%O^OS=F+K6cUUBmV_7tnQUB!{zT&57rMkdSVv! zvsUC39}LG*wCOJw#$*B4{F$woZW3M)(-~mQQ#g|qA7hG15xC}iRNRVw`T<;v6O}EX zHU0!>%oeg6SJh%bi5Br`h*u=5_?$@0E2u%gAB7t1x%w5=m;}@&KF=G2kCxkw4=Kig zLhw;Ve#t*(uVfhCfN$e`809SrU*d|BEDGNN|ITFC*^ozAYyS74`Jd9{uYNu1QHo5S zJ04$S9Ye+IOY^c}0J?Tc^rVMo5vBLXNBW2MeB8Lk$Ft7%!{v&}HtQYY;c|dVJuA5|;%9riGGvPQIpL|M@jPrNKzAjgo zHuMj}^6F0&_fmmP-PCpzG2(jiFd3K>*TZ9m$+~3~d_X@`V~pyDaPaY($4fsk`%T8D zl*fSv^be`Wj3bM%?9G#H`lpRzN+q_@T|sF6r}+QIDn&y!uc5(IM&oE5DO8RR{IAD< zu~0!<=n2|I8|f%LP2FJWi<3N*B0WdHmR_Jz=|y@)dX@G{Tj^_Q8}&48r!3PBT5I|< z?KkbD?@YU>C(Pc%u8?5he~8Wt&{gr5A!KXFn>im&F2VszD#0EtUw`(fAuFA yb2VZ+I+KyBV_q(S8_;CMy@n9#O5G@ex>FD8MFUZz6)~I^hB!-GE|_GIhL%PzqcLnT%gqIECJ~Dre=2mAScBZHXr`&zw6e$vi7zUV?R2 za{Ao)Y1ZU)jsoDwkhD7!GSWsQSVss?|EEHz*e_XSsUQ0yDI`?-0KR3vCyPm%^Nf|u znxvWTuAWE|QA*1E%;fY0M@&pi(b$-AV}Ak9ZS&_WjQPdnNjC?3WWW{Y=`>O7^LhP?A*Wq^yxl*{QmLdYievZj^iKE{Q29r!!x~)OtP&{{P=0pYij-b zPk+~`?W`Wa{TM_;XlL@`=@Q*4NmNH`s{fT|b-w$XOtsW%cUx|es35$~N;H-q=C@kp zSLoDRw97S!=xw4mBWc`MZyk~=)KiH8wIbxy%-g>B?m42(HE&YP_?q$BcmIYW)kLQf zUx`1p$o;2#_L@cQ|4>D{VnU3XUb&&Gq7Nr{W{}!9Qj&5cbr8T3NgV-jucVFyST3p4 z^-vlBvOJ)N@&O)})D0r^+e#a#$N~y+II@T;DtjSlMlcmqJE{T`RKSx=Wfqci@>Wm0 zjHES~N$cnpMOs$}NvjjYu^HqvUK?NY-M=waeAwv;B{f_iWpHIUuprNzlYyBp6-X!x zCF|;?1^FviAG(YvNMIDaaz&vaiBX`qqKUR)`p-6ZtTwN$qnLAc%=l^dhs_t7FUa4y zCK9dvT&BSLO`mUwAbLeU(C|D_HIaZ>wa6ml0gjy~+?Weq|wK$yu4Va@G9Hi0&jt_l_$H z-6_EpCz$!b4Pe^tTj3ss+X{ES`J{Uj(Y5b`8u0(xBTO0WDuDI_dpWNtdUO6o)aP{lNW3h5=C_0F6- zXKp&Me(WMLVEpH=T)v{`D;qHygB|7?NEr4Y#|8eGOR+ zPR#grW7(f=w#V42iR_`~MOiGZL+N49a9ZCFx{(mFkgit&e^}Mg09fjFfz4?;Hq+*& zq|O624_t&z$WLC+Ig3}_`_N^?=lzUNXBR%N1RSosXgv>G`(+<`>jw}>};)6XtKrpRGz=+c_Mq{`HLrx)PBHlu8wwqU+AG*bueECO9XgWXYGk| z(`O~|n)c{nkVH~yMlw;N9!^V`Gbd@@wM2zoR8j^F`+=23OW(VU%4c&Rg!?Rkvd9vy)MgLxuW25%HLs(kV9Pvxf0fE zY&R0XY%LJ6`mPEd0}mg0`jFZS%V(^vLtRhtIxC&+m@8Q6#exwi;$K-9h2$5mUY5Ty zfAM8pGIflhxGM@ndkqY^q4Z$i>U!)_Pz~V-?YKt*VtRyrw2%>5UOR}DDc;{;N6k%? zw-0io3E=;S0PK4MTI!L2m>!`YEriHm6OVfqNvZ{;6i;d>0F-l9*v66C2LL*He}D-j z#5e>ui}8u14g-KRj|HgE)wf9`)Hi7C*CTQYsW$>ZZyOIVjf55l?QaS~w~|omq3r?o*XCvCyP9HNDWJe!{}d%;2?THYNIrLfvlpgJt0%`3HN$kaTVJcD6etNiM(Ykl-nm(zHO#4 zM=IK<9xXMwkH#IW`0(xN6!@U&^8*(u8u6^P#|%4raCogf)KZ})m!IcCqbuEeo4;@V zz96LYyX|YgkO|QR1O71Gy;m>TT|`%l%{0<8g4Et13y|nw0Fcww0ML)G0RW|53lKxs z2Dy34oH-zo|Lm5pMY*7l%*#k0_b`1tc}3C3;x78Az*e>5+p~v-eC^GwHtxd&-q|pL zto>4=rY|oh9(&A9>zfKJ!}ov;O)Gk`kb*wIpSL|-DVJ??LRdXF0itZtNU(y^M7nwGKv zSUl7Ns|G$-uD<;;;xm%*`FR&UuLOO00OJtK)A$28CJ4gCtRhQ50aSx9fZ=pcaAUbZ zw;>uE&y>`K2!|5o_dt!l-e5m2Ub*Ul#rdCHMg&zeg6`}>(8j)GO_-IQIx9nmNf~tf zNcrK zmZ-5Cd6_nppEs9Aj{9oI!B(eg|Ai&F{Lkk0b{5E2RqSp090><%UNw(__dsh!qmk*Z zg?BHwW>F7Do>E|He=f+yi4J<81opzQ!m}hSmY^j*B?3EVg9g|++p59NXNWB8XR^I( zww`?hQqrZtI?XMZn|?<^8i=aACynv?7vyz0_sjpEyu^Xz{{`|2?Iy1ylkRpMT{S7F=fjwVV0Z_$!`&?fKvFuOG0ljJGv9_$4#3{y`=d zJIpQ!&D{Pq^Rf6{HB_PREIOEjoofQ4i?vkjMSgI#OSxN^;MwN|tm`x#w!+Fb+ft~*TS^=8&+ z6(K=cfVvw%K1_B)#%UEDJ1SZZerexu3ro-9{sn!Ju;!#`Z`t?eipDj^57cZIEG zc(8r{-c^eqYPgKlbB_ts^Tb8eV;m}95yyFpO;D9#Ra7#oiJEGfYG5qvx$$u~xDUp` zF!HeJ+>tnJjscIxH5cE6ScHnN%18s5Jq~4!9iRB0{b<8jqIO56h5$RHFSr|z_VJbO zrk^g<_XmaCXu9Ve0(4Sb9tiHZxPdsd90$TJ9@zXPy4B*o5Z6(UIEh}B+6Pvi`{d$i zO?%bqx)ql5wI^W#I$43?ATjZndH&x1L z=KBN3nvSjNSB@%Zjpg;ucDeHP=`zaeF(CmIY`0VfP+OUuZ=k$Rl$^ZwWQbll*V(@P z>__(X*Ps2Uuy6OQbIVAq6+=QhJgnj&&8?WUT6ag>1s)O+KTXs=r1D(L#Yv$eDWLTj zS}%0*;^B3T4h`L2JkA1qTI4;LBpKCmM`aY@u5!`un|Pq|>(d>9_sc$)QKbFDV845J z_nZ5iW{60#U^&UuBku;lVR9BY%laI>RGuES8lksHeMp4V-{{%b0HBUX z0Z_+AJ+cx2b^Ht0@swW5qo=$K0D~_Zbzud51puaDw%?*xY`+Ci0nqV70Ha84*THuH zV@M4ExFw$%Aewxk0QX8h9`{DcHwa)DJvs#KC766{4j4nei2$R>$0i?u**aij_b~D) zI=D**ivZFk->*dI(FgQeN)UQk@|6Q@l6-8?Mhg{s8XL5SlkZ;uV#xP9J;X+9JNf<{ z0PXG3Lk)Up9{{>^M2|cMfT4T|fT5fOz)*O!8>L6T6D`#7Fvn0G4>Mh=<8y*hRL7Ti z?BulTS#*10hv+L-0({&Horm-btGip;EcnjAiV-@8)|593J9y`a5!%a$*BfRDTfZ@K12?hl(C8A-{;CE|H} zHFyYFalHV(Y%*J9>C7``ToN|jQ$38Y_(CqLS>g8j5Xj^#tAP4tnkr8(Y6vr%Oln^| zwpEkaguWQR(zU-|`|i_gOG~v+wAzzeX9W?2Ku2pCnIdit+!|p*t))>>rPHENEH{^OY0W2}{O0Pbucljb zCgtT#@)vV=OG`^dK4jBG{-`L5!Vh6|%NDQ!P<(bE8<(+(YHDf%03&j>+!25%z_*jp zagiN9@ry4mj*q8!%FD|W;k>*6{^e18Nlme>0~OWzqvCVxXj0y!qEG!rl$~88@kMBf<`Y)ansM82>8d+_~T~kISb^DH=JyAmO`SJL5;wrdp zQnp`*HVk*@v^;;n7EPTs9X1Y6%C70av{I)Z6`-DC1UQUGi7hH$)Xnu9E}L87{)y(% z1NgaRZYPSzTT*xY`0<)zibn;Vem`~Q=9c8hUm4IUu^Alzdzha8Ep_}N>iQK&6yxbFX8q>2RH$Zi#0)fMIbyRoa?D2holk)27 z>hdOu_OekQn)iQNJXD0aT(Q43e<+XhHN9RWBE6js1KE(E{;bRiYZXH zF=`yzD@ME7*~P?zw^>b8%mflu40=Z9?w=Mf=7uARZ6&~KYj!rq|0#$4HE4gR4bh0_ za3|(zQeHNObQ<9zp7D;>?7X5}^f#XJ#rSQcPe5xnPrwNg%l#tq^8^5P@CZbGJWoWQ zV#c{bQ6Cu6r$xD2f##mdjdF8RrtJ3B)h>1T*>??WaTdve~NTXgHSOclQ)y1`6xts4RnLF}OU zZHVTM<_<_gangw3+ArYyB8%lJOVjA|J2TRhOzg@)UK{spKDuLg?b(C&;lsjfx0ioU z1*Y#_DATlp-e*7FF}(il$M)g3gx7Chl(pdQg?C-Ud-Rzzxvj^JvK)QvXksFtQL~Br zrQn{u*t1MOsD#GcOP78TI_Reh!C?@B>J7p#jNQBR(@FqVU7-N8k`A%Tcll69E&!zK zYCY{m0Ekt-B9Sh&>Y_AbW_srQG!SZ0H=#0B<0tNqB`GUuA`Y;8@kB#N-z=K z&_$v_Gz-nb8dSpgum#BC8%8)V8_5S{!*smyeV%)z=ZxD2X$i@EyYHNFE}b$fX)bt8 zOBdb@{<3uGif=C?!miW7tV$-C8kZE#3-}YXWx?wE5rqJBcZmRtL&F$M8Eyh*p z&-le7zBRW*iq?^nmOc-x4an(!HAURFTwGAFbk&MgmvMpI#R&S{6@{RzAcEA=evqjU zv3z||6#}*^z;|W40{j-D5fCVgq&Lm{>fu{3`n?%R=l(1FXw!#HA1?gjRK2s)E4$dEkY}q4 z9?n}j^D<)pN`3td>`{LO<(B4?%_rIH8GIk90(w)^7vs*l&;R&aNyd`>&@+S7AAJdl zkqq0P9RTklv7HXK%dr5s(8=a3-16j?(RNDj>XI;H-oiO77(eVrHA2u|aKCy5AL!q^ z>X9ul?~2!njop7a@BXhR*(B9h$Ma@C?M?+0dGOT68o6$BP1f2IeQ4o=+OF6Z#I^)u z-(wn+jB6qoZAEt&$6iEULmsd_;-Td$?p^uN>I)lSMW8z}VjTBx!0V~rIdf7H9dpx@ z)@*?A-x{Ac_s{HkPMWFQyk#Ph@xF8K*_kP+v*u=IESi_JV4mo|Wf8ynEMAJX%$%E= zG0(gxF(X5Udj~@rwap@%B^P|NC9+s08~cbtLZoo^4X4mB=}*sKv!clw3>}IG1Cb?@ zNs`Soq$H_k<4Y92Xwl-FRRx8sm)ra`kJnZmKE&COlJNdyPB9 zZEW`{|0eVwoy(hl#*}pQn34`-N?a2o#ONnKWPT)s2fi)h2jhysxb&%##pvSdjIqU` zaG}#R(WWC+yzFKSz={Dx+ub+w%)0Qr3NtDE$tE>xP*=dLWKNiZwO z#68#MZf^cu-YdT^JI-$#z*r;2T$q8I_=vSzh!71lMrH&MZaCip?Y_^!r}Ff^AegoZ#1blq7@C*imnnwAzHaK zylX&L(|V^a3HQjaQx>bxLv_Lm2VShXp1;!mDy7fh+EH z`fl|4MtXg*Uf(cpW0Yd^_4oQhysD=3RxiN))vJE%RsZ5uzwxSHdezUo>PKGnL$CUt zSAEUv->HPF|LXO>poIC0l~DBouX>+X&GD-9x2m^$)frxOve!RW3Gt6stb?l0L8!@K zO;)L3At)!@5)KX&=&>$>$QR_7%+%C68#$1-2kG2kL#a;SE?g%UFoHo~GeIosWq-($ z&i82N;=JZ9O*tSA%Oas9D_L#jOh_fE&NQZH}NTm@^7$^tjuzy0=aE7 zVXZ*o3gl}=p<0nuXG`5oSnuMGEF7$w9}KtWN&#~8UBAI=QA z7(|e%9`Yno<4L7Y<4ekb#@~SsouI)ygzr=OHD)S({Tj%p4OH^J67K&GP}J|e>Qi3z zNw0qc5`L-l^2aD)_gCJ+%-oR5P!n_+Y`5SgXd!)Hly$MX#vGKWcSvN&Oq>byyzQ*p zcM4W5&bfclKcJk9?@~^}=cOmiy#42BCN->?+yxy&I?P%~6l*4by;w5|Wz9tUDa~Z` zMVg64G#*qo3}wNRl6rg6LW-;&%DMrnq#B$RXf+ziH3UmL^_ec!(;up{@Rbyu8JV=A zOYm<7)}5(+D_=}_6}UiiX7$Wg^^{jV=~Y|3>Ze|H|5oO&^M zum2gu{&uVSxL4iaRo8jd-+0wRuX?}NpM!*~t!ld0e}`i6--^)Wt^Ns$tlsEV$9UC| zUNze5@2|*%cAL#Y(eZM!}C9S$GW%ma&Eg>njIqs5kp;tlbCLcRjD6Pv9#aK)u4H_t+Ony=~HaKeetN zBdg=KjPyJ2l&p@FAWSmCvkaKYu;eL*agwnyNKZ+{)&ML?jGk40al_w= zcwFr#>!L-u1uOH&lCJL*^b7wqyV}nCFfeI-P3{V1<3M^^Pu?uZD+ZeuKV)=6?|D`= ze4h2K>PR+6=)bb*fHP7(VboxnXKkQ)mO<4U*&;5KS{t+fD*KTTxMXux%jZ=`qRqqs zTa~@#zEA{1sj^Dv`C#y-xH^~POx0&_EfdY+2mqO*ZOF6PVPlbOk4rXpX9?}f63Mk< zYsi(ch6v%18O}!tc5oECYmgO>iLhC*{-12s6Ie%w2%Sz<$7;YY4hJi<+Tb&x!j=eh z_DD3>$|cYO^u4MUG*fk~rRrGenaZk)+`m4Hvd{d@#G)y|V%X7Cwb)T(OGGFh=nYyJ zE2aaJQdxyvf*U&vJ5*3~xF0T+RUJXAddn>nxn;dHS7DSEok9ooHjG|hG;<3*t0bRu zp2fFLk$q(zU&%bHuNdAUk8c%XSHPPGxC}5Ca0y_x$9E6-#@$}u0szJ1%K*3&iFY9J zc8@RF>zjp`8Hkw*ce7CF;uVW;EJ9HOM&3>$?gd%Htad08K9vAOd;9 zk;kN1)BxDV1-S3M>REs@^DOFVu#i6?>2rjS!+}K|0r(h62a(k5Q5%s8meqjRIuPa_ z#MXG!caUKhyl;5a9Z1=Rpx2{53Gg^v1)S5PK7^u$@IHu)D*^8ZT<%eqdetQ;lLeQG z9CMH|8z~Ntn&?%hBX%m>7^IBys@K6AgT$-hhIrLM2=<4IKoFx!uYQotCY4p)8zfL3 zkQ8EI)6OVsi7>WNf*fV+5VzTwBzxv#@@R>O)HOSi&m9p?aSg7B2-;<1LCJeHU6T^4 z73=QjH5K{uo9ahm7u3B0(&dg=;?_%~GE_y;%{UAPn=q{9^B4g(jCg{Y-5B1HYbvXt zL>}N;tU9CkTeV=f9OvllQ4g>47RcHk*3;i}fqaWWg}|S0A*gFUs4D|-F5vBmn+gAP zPvbOuet~E?|S@yRQjl| z!TSm@y%TUd;L9HMd4R26^%=zc*5iL1nKr_^0kK$nD%PG_=23sG$o^j`Axvo5UiBWY znu)Y@kADubr@)KNmx^A3)@1b-k9sq}IInsmV#avCdy_JY_*7Q_kn32svOL^tu8c%>lq;~_M7MhHm_N%x?n`k za$R-{@$m?39lj1EffnJYGg8HTr+N!R^|*=<~x+zy+W zlAic;gtidHSBFC=f5QSeoE2M{eW5IrP3(gn8YYGOlmKpEqgZa9u(+`-o(WkCm}0=& z5{$3`g{otOb7Num)%E;yV@;H% zO|;?$ff>#uZW2V`#DbZ^2xbbqrbwa}nF@GF1cWA7;gM(4wW?zdd)23@U?W?a0#!${ zTC0vYn*t)M%NeR6b7WP^W|33_K7;LL!@0JnU5+M~asURy11`sQm$F0noQme!vOse? zB8@y>xs(%nouCc&(Pt+%V3wtI?qn6$EP6DiVn(&cHj3&D3Q)Q4) zD0Vjmpi#Wo9C#KRf(qm~9Dt?KS&V$UByu^6G#F1^&eH*x^V>jNjm!B<&E>pH(~6$b zinh2h_@@msoy$1^Bb$hn6I#(%oYLGnJDBKB-R{oX5!Z0_QP<`y&Gl@y#u;2rJ8FN+ z_1$xz#STLS;8HHWzY$(?NIVV>9K z6IDkNRp9$Lrl*_WM9t-D=;l4{mMZ(P5OnNC(8BS+PiA>uCy-QRW%|)6#eu$V25BAH z;^!zlj=%pCwX~GhR2@-xj4v8=w-n}Isu zvDXJB5%o@d78O`M1KhUTIK((U19P(5c_J_wr3#n3Qv-3So#)zk)_TrXubR^91SK2} zz}^jFaHIHdJd>sUH!1_`$0%X-cDUhi(Mst4{z{+vNF}_!H^LS;f*tPy+*!D9;r?d_Y;iBLMzyNbhiE6A-qI{)FxbI;l%vS`r3T}lGrurdi8vtwJ z-h=(+kIF#xRrvoM?qxVMsaC^P!9BfI-2(6gvTal%*FU1z)Q3H4p+|ktqdwqKmu*$= z*{UX^!db{Q6$ZkI@Q;Uo4E)!@kNHuDD4~9<61lMY4Ox0sb~zI@_vSOe(=054^{!NB zdkU{Uta0FksrT2QQlvX)A)gsIosE1>S87FjEaL-+c*86>zzofmxDFN!7fQR~lXZRKQLsDbIIK;^bDVP$a_{5__9AlK*C3>?0>Smw5$L%%68~F|cPF0L z*N!ND-ktc33pLcQ8-=T)QxRAC1lj>@ZAO)!yEdbp2G?ynxrK8r?avr>tm_EK&QGy+ zceYRJj&eD}!Nooe&>Fez1!FC`(J3RV+wt`b7uo@Ity_Zmi7{Bg(H)Y-LrT>;i>KY?=@OUwn%eT$h2LT|AUSo8D9_C=uiggz3v?Fj-F7>Dk4 zQQEoffxuL7wZfTQte=;57akK|n+hKLh}n%N&s+I!vnChxa-#_sNUZHeWM;2fYpW97 zao0h_oR;4>ix%r4URdyO>uzS95HdIoE-%pBsMqmUsq6+1PkgO?F^eg=@Gc$|nrBJX zqZ;>HQ#2PcG@mSg8^|aa6|9%p?N8OKp}O+jn5fbn%zAiU^cLE-q7m+)dtHDRjN=)- z0|`H9nuVm(s@)>fBO~0Wxxf-_sv9g)%1irE!7tp7>e(*mAh3gcEy1;Ugf_Kd&CpHG5gN_~ zkjXgS*@PU1S4fIYjsZpx<`!e$w#o7AC1vu1Wi~mgFG*SzOcK?xp5X?knGCpQicW9k zzy6jAPwcYNxt&Nn?Ot~)26+agIStUv^Nw{D`QI+5PV!g-egC_Bw_W4tMN)a`87k;g zUV4@a!pciKnA&ecn-kU(%ZJ^4(dY zx{t~2IOJ9i$06U<$R|0ow7y%ikr&Oad7CS2I{|W6G&j^R393xrEx$BsigF|9Mo@Na z@2~6#7HwZ1jCZGQac4a>dNaE4>_nhpg60N{d;jW#F6UTiKk-_x10|!^m|-Knw%+li zM7vECr)4U^lT4#e!ORyo!y^*o?AD5S5->#*I@%=6`Ndrh_9-|}*>R}9ayZy$9_I|` zR&5>U^wWv!sm&8l`z9(w{1=qL{+YjJ^^e3tWgH2Z*TR#q4f9fPzL#5LbONe z`*L*zL8Zrm1N8eD(_Ai+n`$R5AF{^sv{hr(Ccf%&kEtqHTpC7mW zW#et~I+?8cH%Y5t3=sEGvM5AVi7%<(n~R6>sv5rs6nhx-qhH4NnLv)l z>p`(TlXV$iZH}EHBi6X26T45g;)6~rSI4?=YNmhj6s;KsY>v~fe9o8o+6vN30r_tb zRG5wJG2T8fZmRqR_iu!SqQV?%93sS4m?;FeLvcYjc0N9yEpEo(qyAQLDJ}LT_;l+B z^64iN3(Qt=Ko`3J=Xv5&W3h8kuh=(REXEy~ZIaktTP*)ZYeM@lH#z+2;aK29SQs!|{9b1|_Wpa%W^5^4y|*RPnyK8D)F=dWW+!E1~Uea3=9 z@X=5H2t({&B*Pd6d>iMtC~r~tlGPl^qVNUpDY9YrLLOl~`R7CP-z3Xl{%XQw6qUMo z8qvy0RJyUeAQuLi>t@Bwcz6L(#!&o`j?w)eH?G<7tg}5Y)?zW^k2u7R#7Yw%mygW? zj`*_#u~SXP?XkgF>Gv6bNF)~PMf_z5KyiI-jAWV3H|eLyI4;IV!15&He4Mebb91H* z{rkqe`qRW!QeaazeVs;(xLf>y3`~ma-mwqJx}_6*KtJSSjOvGC@bQ|*OFyxFf*;Js z8C8h>hY(_?lSNqCUXnxfPg})qlh|hV{}7u0CjP&*N->a?>uDr8X*zA7EUKVV+DKLS zBP;LH6Lgri;Mo2t8UxGQ9LYm@(zE1}o~Lcn3-p2XGW|u`L4!@N&{WfFRAt&lKGQqY zN8U|SW|c4RK&yMlP60k>h^=1-kCJ literal 0 HcmV?d00001 diff --git a/sources/new-s5r4/graf/makefile b/sources/new-s5r4/graf/makefile new file mode 100644 index 0000000..22513ce --- /dev/null +++ b/sources/new-s5r4/graf/makefile @@ -0,0 +1,32 @@ +# /* Loglan82 Compiler&Interpreter +# Copyright (C) 1981-1993 Institute of Informatics, University of Warsaw +# Copyright (C) 1993, 1994 LITA, Pau +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# ======================================================================= + + +COMMON=hlineio.o draw.o hvfill.o cirb.o gpmap.o hercules.o + +CC=gcc -O -Dpascal= -DWORD_32BIT +CCc=$(CC) -c + +#CC=cl -AL -Olsg +#CCc=$(CC) -Fo$*.o -c + +.c.o : + $(CCc) $*.c + +hgc386.a : $(COMMON) + ar rv hgc386.a $(COMMON) + + diff --git a/sources/new-s5r4/handler.c b/sources/new-s5r4/handler.c new file mode 100644 index 0000000..2c0ee47 --- /dev/null +++ b/sources/new-s5r4/handler.c @@ -0,0 +1,243 @@ +/* Loglan82 Compiler&Interpreter + Copyright (C) 1993 Institute of Informatics, University of Warsaw + Copyright (C) 1993, 1994 LITA, Pau + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + contacts: Andrzej.Salwicki@univ-pau.fr + +or Andrzej Salwicki + LITA Departement d'Informatique + Universite de Pau + Avenue de l'Universite + 64000 Pau FRANCE + tel. ++33 59923154 fax. ++33 59841696 + +======================================================================= +*/ + +#include "depend.h" +#include "genint.h" +#include "int.h" +#include "process.h" +#include "intproto.h" + +/* Handler routines */ + +/* pataud le 13/10/94 +#if !NO_GRAPH || !DJE +#if MSDOS +#include "graf\graf.h" +#else +#include "graf/graf.h" +#endif +#endif +*/ + +void errsignal(exception) +int exception; +{ + word signum, ah, am; + + signum = scot[ exception ]; + if (signum != -1) /* attempt to call a handler */ + { + raise_signal(signum, (word) 0, &ah, &am); + if (ic != 0) /* continue execution */ + { + go(ah, am); + longjmp(contenv, 1); + } + } + +#if MSDOS && !NO_GRAPH && !DJE + { + extern bool graphmode; + + if (graphmode) groff(); + graphmode = FALSE; + } +#endif + + putc('\n', stderr); + switch (exception) + { + case RTESLCOF: fprintf(stderr, " SL CHAIN CUT OFF"); break; + case RTEUNSTP: fprintf(stderr, " UNIMPLEMENTED STANDARD PROCEDURE"); break; + case RTEILLAT: fprintf(stderr, " ILLEGAL ATTACH"); break; + case RTEILLDT: fprintf(stderr, " ILLEGAL DETACH"); break; + case RTECORTM: fprintf(stderr, " COROUTINE TERMINATED"); break; + case RTECORAC: fprintf(stderr, " COROUTINE ACTIVE"); break; + case RTEINVIN: fprintf(stderr, " ARRAY INDEX ERROR"); break; + case RTEILLAB: fprintf(stderr, " INCORRECT ARRAY BOUNDS"); break; + case RTEINCQA: fprintf(stderr, " IMPROPER QUA"); break; + case RTEINCAS: fprintf(stderr, " ILLEGAL ASSIGNMENT"); break; + case RTEFTPMS: fprintf(stderr, " FORMAL TYPE MISSING"); break; + case RTEILLKL: fprintf(stderr, " ILLEGAL KILL"); break; + case RTEILLCP: fprintf(stderr, " ILLEGAL COPY"); break; + case RTEINCHS: fprintf(stderr, " INCOMPATIBLE HEADERS"); break; + case RTEHNDNF: fprintf(stderr, " HANDLER NOT FOUND"); break; + case RTEMEMOV: fprintf(stderr, " MEMORY OVERFLOW"); break; + case RTEFHTLG: fprintf(stderr, " FORMAL LIST TOO LONG"); break; + case RTEILLRT: fprintf(stderr, " ILLEGAL RETURN"); break; + case RTEREFTN: fprintf(stderr, " REFERENCE TO NONE"); break; + case RTEDIVBZ: fprintf(stderr, " DIVISION BY ZERO"); break; + case RTESYSER: fprintf(stderr, " SYSTEM ERROR"); break; + case RTEILLIO: fprintf(stderr, " ILLEGAL I/O OPERATION"); break; + case RTEIOERR: fprintf(stderr, " I/O ERROR"); break; + case RTECNTOP: fprintf(stderr, " CANNOT OPEN FILE"); break; + case RTEBADFM: fprintf(stderr, " INPUT DATA FORMAT BAD"); break; + case RTEILLRS: fprintf(stderr, " ILLEGAL RESUME"); break; + case RTETMPRC: fprintf(stderr, " TOO MANY PROCESSES ON ONE MACHINE"); break; + case RTEINVND: fprintf(stderr, " INVALID NODE NUMBER"); break; + case RTENEGST: fprintf(stderr, " NEGATIVE STEP VALUE"); break; + case RTENONGL: fprintf(stderr, " REFERENCE TO GLOBAL NON PROCESS OBJECT FROM PROCESS"); break; + default : fprintf(stderr, " UNRECOGNIZED ERROR"); + } + if (thisp->trlnumber < 0) thisp->trlnumber = - thisp->trlnumber; + if (thisp->trlnumber != 0) + fprintf(stderr, "\n AT LINE: %ld\n", (long) thisp->trlnumber); + endprocess(4); +} /* end errsignal */ + + +void raise_signal(signal, skip, ahnew, amnew) /* Raise exception */ +word signal, skip; +word *ahnew, *amnew; +{ + word t1, t2, t3, t4, t5, virts; + protdescr *ptr; + + t1 = 0; /* handler for others = no */ + t2 = M[ display2+M[ c1+PROTNUM ] ]; /* ah of current */ + t3 = c1; /* am of current */ + t5 = 0; /* flag handler not found */ + do + { + ptr = prototype[ M[ t3+PROTNUM ] ]; /* prototype of current */ + t4 = ptr->handlerlist; + if (t4 != 0) /* any handlers ? */ + { + do + { + t5 = M[ t4 ]; /* signal number */ + if (t5 != signal) + { + if (t5 == 0 && t1 == 0) t1 = t4; + t4 = M[ t4+2 ]; + } + } while (t5 != signal && t4 != 0); + } + if (t5 != signal) /* look in DL or SL */ + { + if (t1 != 0) t4 = t1; /* handler for others found */ + else + { + t4 = t3+M[ t3 ]; + if (ptr->kind == HANDLER) + t2 = M[ t4+SL ]; /* use SL for handlers */ + else + t2 = M[ t4+DL ]; /* or DL for other goodies */ + if (t2 == 0) /* handler not found */ + { + if (signal <= MAXSYSSN) + { /* system signal */ + ic = skip; + if (ic != 0) longjmp(contenv, 1); + else return; + } + else errsignal(RTEHNDNF); + } + t3 = M[ t2 ]; + } + } + else t1 = 0; + } while (t1 == 0 && t5 != signal); + + virts = thisp->prochead+M[ thisp->prochead ]+VIRTSC; + M[ virts ] = t2; /* compactification possible */ + M[ virts+1 ] = M[ t2+1 ]; + t3 = M[ t4+1 ]; /* prototype number of handler */ + t5 = prototype[ t3 ]->appetite; + if (t1 != 0) /* others */ + { + request(t5, ahnew, amnew); + M[ *amnew+M[ *amnew ]+SIGNR ] = 0; + } + else + { + if (signal == scot[ RTEMEMOV ] && + thisp->lastitem-thisp->lastused-1 < t5) + { + scot[ RTEMEMOV ] = -1; /* make memov look like abort */ + errsignal(RTEMEMOV); + } + request(t5, ahnew, amnew); + M[ *amnew+M[ *amnew ]+SIGNR ] = signal; + } + M[ *amnew+PROTNUM ] = t3; /* provide system attributes */ + t5 = *amnew+M[ *amnew ]; + M[ t5+SL ] = M[ virts ]; + M[ t5+SL+1 ] = M[ virts+1 ]; + t2 = M[ display2+M[ c1+PROTNUM ] ]; /* ah of current */ + M[ t5+DL ] = t2; + M[ t5+DL+1 ] = M[ t2+1 ]; + if (t1 != 0) /* skip */ + { + ic = skip; + go(*ahnew, *amnew); + } +} /* end raise_signal */ + + +void wind() +{ + word t1, t2; + + t1 = M[ M[ c1+M[ c1 ]+SL ] ]; /* am of handlers' SL */ + t2 = c1; /* current */ + while (TRUE) + { + t2 = M[ M[ t2+M[ t2 ]+DL ] ]; /* am of DL */ + if (t2 == t1) break; + M[ t2+M[ t2 ]+LSC ] = prototype[ M[ t2+PROTNUM ] ]->lastwill; + } + back(&thisp->backobj, &M[ temporary ], (word) 0); +} /* end wind */ + + +void term() +{ + word t1; + + t1 = M[ M[ c1+M[ c1 ]+SL ] ]; /* am of handlers' SL */ + M[ t1+M[ t1 ]+LSC ] = prototype[ M[ t1+PROTNUM ] ]->lastwill; + wind(); +} /* end term */ + + +/* This wraps up the above series of the handler procedures. + */ + +void backhd(virt, am) +virtaddr *virt; +word *am; +{ + if (M[ c1+M[ c1 ]+SIGNR ] <= MAXSYSSN) + errsignal(RTEILLRT); /* illegal return */ + else + back(virt, am, (word) 0); +} /* end backhd */ + diff --git a/sources/new-s5r4/handler.o b/sources/new-s5r4/handler.o new file mode 100644 index 0000000000000000000000000000000000000000..b127e59750a97fe2dc55165c061673df10862b29 GIT binary patch literal 6413 zcmb_ge{37o9ls<_3BjSsnjuCDI)tdu0)?Uut*}+G<4fY!_PJ-fG-bgJ`JJXonmDv* zEu?c-IBwQl0ozI$YPF0_V;ZXl+N4gX?VtrZt<4|PKozW=O6SO#mTuYbXi)ZfcOPHw z+Ay?fr#ye&`+VN}zVG+@ew>|aN+c<_Sh61(ZShoGW1$=i$qmiEU_@?6#AUUyQIZpp zU^p65!b&8r1msxU7YX>ZfE?A-1|^Wt6iE(-LQ0b_B>UoVUqkbJJD^zY231oN@nA%e zjHQAG|1Aw-(yJFbJv^Q{Io+JY9Q3P*kMpg*L@&5AFe zXqc!O;f63zM2*8FCYR)}5>~YqS>2#$jUn|xd#X?{7MJ6yDu-0(T$&P3Xc0-)ltx8U zA`Qrb3Ud(z90+a*#)4`@_P5BJ6it=nSW7Ifgze~=*x=o&ETV;TDlCa6^V8sq2+tr! z zP%r>r1Bx6;g#8K@B!ZO|tA&lAL}heHprOPs9OTSUkSJESt+%l_~Ek1{8!LBa95ue+a z^i^7&KAJVh0K2!FMe{PN5Z5P`tgkCIgpZ(tuK?LxjzY;M^QV6 zBB76rQjfA3WenvY%2AYaC=&dYQR-1Pql}>(L^+Cb4n!4r497hWY`QzRK1wT{g2Y`E{2bu=NS*54rTX ztskcTfJ^VQ^?lTry7Zm4zK#0jQm6mlw)OSY&${#<+4@TAM_l@Awq8U1fJ=Yd)-Qd` z_+9!3wmw1qA(uX7>xZd7;L<;~^?lTry7X#X$kzI7qkb98{QBKy>+7kXb?K{YeI@lH zE`6=7*HAy;(l^=qrGGJgm%i23C#XN<(x0&P!_*&e=^0z!M}4VFAGh^w)Gs4r^YOo8 z>+7kXb?L`!eI@lHF8y6wuc3axrRQw@Qo*_f9=9h)rRO@VmbE?;)E{=~vaKJczQ(10 z$=3H#zs05Z+4?q1KLq!r^o|~B*Ala8d|nX7+MbWz)0=y2HMP`Iqdi*B#Wu>-AH$0`fQm}?8Gba_X z`*AnU*xg(0MLOs2A72 zG`h%8rgddjd=_uv`I&Gt8*poy<1k`c8oeR!5pm~T*+%x|_(}`@)7+<))hpwh9CF^Si1$Y4?AdJJ^|}4l&cNH!&ZQ&! zGx;UX5!@)|A}q0zHM%r^t=;9S`TvR+uC3yIDng+7r=LPye<$O8&Owd|vdmMN**K%O z<_slwrBmU8?k#ol_QJ3A=x-T`fr9#W`XOba9{r4wm=Rf9INBS_mR0Jl;&fge^V)(~ik!U^hPe<%t+@yb^`CY3 zziR2ME9UC6{uwvZg3kHH@xpFLdg#oh7l)d}=l*F`a4$AO%+Y$*lvU{0Qb4ab&R;1stOK5Y)`npt3u z0?e#dW=CuCgAUuG`rp`JJM|wkY4F^yzeBH{yc@e)*zfz4caUaAT|SOzqqzq!S;w$- zrkG|i)O^f*d;YKa7B7G+a@0EeDJiu=p0)S=75ms3a_&5CMx(Xh4gvlzxL3^cQ|2wz z-?DviT`=kU*F3SLuO|0fa|e3zUtm7O&m%7`uZn2y)@d_q)_gDELc*KDdkl#4?wtVQ zXGPUnAbw7G&jBmYz687$?T?6JkZ6|!E1}o0eG~CMAb#F>>WKkjGciPr663^;#IF%I z6FZ1K#D1c9t%-S3#2v()#4+L?;#0(L5wpZ+iQgl>Ks-nsC;piDQ{vBwuM&?DPXI-J zP64k&e$JD>NIp-#L^zMXMfec?uLFwyw~}8@zK*<)d?WdF5goH~GEf4f2P` zzeN6J^2f-ZAb*PddGZ&@=gF5~(+Fu1(DWZ@`cHm2`8x7G@{Q!zk#8g4MSctU-Q@R@ zH^?6%{}TC^$sZ$sg8V7+=gD6rpC?~}&2IV+H2nvf{*zx$zK*<)d?WdF5go zH~GEf4f2P`zeN6J^2f-ZAb*PddGZ&@=gF7gkedDjP5*(W|KyjGuOsgx-$;HP`8M)h zeeb6yrW5 zmZP(1FDLqmEyQ7>LEH}%dHM<4uL4CL-(>rb#7~GfAo;@nT|kkaH9%~ss*ONlrMfw4{(ui* z=Y6*S&i1t+1%E5?eqxN+1{Cw`0SY_Mkl)YtD{P+yiutfd#XdEkC64;-s3Sj87Vo`# zfF&s6xerC~)7VS_V3BWj)I*MX!cl+NQQzXIZ+Fzk9Q7w1^=BOQ?>g$wJL=<(`YVq5 zuTU30N3lk)JNUO9_0#Ng6iNF%>to2#`>1!fx8Iv=AKW_B+uzx-LP{o+-2=j}3KV;?8ZOog?sId+$I8Mt5!<8XRsLeoRU}($>C35W`!odQXS+Z$=JyEdT%j literal 0 HcmV?d00001 diff --git a/sources/new-s5r4/herc.c b/sources/new-s5r4/herc.c new file mode 100644 index 0000000..fc9172d --- /dev/null +++ b/sources/new-s5r4/herc.c @@ -0,0 +1,636 @@ +/* Loglan82 Compiler&Interpreter + Copyright (C) 1993 Institute of Informatics, University of Warsaw + Copyright (C) 1993, 1994 LITA, Pau + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + contacts: Andrzej.Salwicki@univ-pau.fr + +or Andrzej Salwicki + LITA Departement d'Informatique + Universite de Pau + Avenue de l'Universite + 64000 Pau FRANCE + tel. ++33 59923154 fax. ++33 59841696 + +======================================================================= +*/ + +#include "nonstand.h" + +typedef int word; + +#include +#include + +/*#include */ +#include +#include +#include + +#include + +#include +#include +#include + +XSizeHints theHints; +Display *theDisp; +int theDepth, theScreen, dispcells; +Colormap theCmap; +Window rootW, window, father; +GC theGC; +unsigned long fcol,bcol,white,black,style=1; +Font mfont; +XFontStruct *mfinfo; +Visual *theVisual; +XImage *theImage; +XClientMessageEvent toFatherEv; +XEvent event; +Cursor theCursor; + +int iWIDE,iHIGH; +int mouse_x=0,mouse_y=0,mouse_l=0,mouse_r=0,mouse_c=0, + mouse_l_prs=0,mouse_r_prs=0,mouse_c_prs=0, + mouse_l_p_x=0,mouse_r_p_x=0,mouse_c_p_x=0, + mouse_l_p_y=0,mouse_r_p_y=0,mouse_c_p_y=0, + mouse_l_rel=0,mouse_r_rel=0,mouse_c_rel=0, + mouse_l_r_x=0,mouse_r_r_x=0,mouse_c_r_x=0, + mouse_l_r_y=0,mouse_r_r_y=0,mouse_c_r_y=0; +int tracking=0; +#define END_OF_TRACK -9999 + +Pixmap pixmap; + +#define get_shrt(w) w=(int)(*(pars++)); +#define get_word(w) w=((int)(pars[0])&0xffff)|((int)pars[1]<<16); pars+=2; + +#define put_shrt(w) toFatherEv.data.s[cnt++] = (short)(w); +#define put_word(w) toFatherEv.data.s[cnt++] = (short)((w) & 0xffff); \ + toFatherEv.data.s[cnt++] = (short)(((w) >> 16) & 0xffff); +#define snd_father toFatherEv.type=ClientMessage; \ + toFatherEv.format = 16; \ + XSendEvent(theDisp,father,False,NoEventMask,&toFatherEv); \ + XFlush(theDisp); + +#ifndef NO_PROTOTYPES +void RealiseCmd(int,short *); +#else +void RealiseCmd(); +#endif + + +static char *application_name="IIUWGRAPH"; + + +#define QSIZE 256 +static KeySym keycodes[QSIZE]; +static int keyhead=0,keytail=0; + +main(argc, argv) + int argc; + char *argv[]; +{ + int w=0; + int i; + int events=0; + + father = atoi(argv[1]); + + for( i=2; ifid; + + theHints.width =iWIDE; + theHints.height=iHIGH; + theHints.flags=PSize; + window = XCreateSimpleWindow(theDisp,rootW,10,10,iWIDE,iHIGH,3,fcol,bcol); + + XSetStandardProperties(theDisp,window,"HERCULES","HERCULES", + None,argv,argc,theHints); + XDefineCursor(theDisp,window,theCursor); + + XChangeProperty(theDisp,window,XA_WM_CLASS,XA_STRING,8,PropModeReplace, + application_name,strlen(application_name)); + + { + struct { + long flags; + long functions; + long decorations; + int input_mode; + } hints; + Atom a=XInternAtom(theDisp,_XA_MWM_HINTS,False); + hints.flags = MWM_HINTS_FUNCTIONS; + hints.functions = MWM_FUNC_CLOSE | MWM_FUNC_MOVE; + hints.decorations = 0; + hints.input_mode = 0; + XChangeProperty(theDisp,window,a,a,32,PropModeReplace,&hints,4); + } + + theGC = XCreateGC(theDisp,window,0,0); + XSetFont(theDisp,theGC,mfont); + XSetForeground(theDisp,theGC,fcol); + XSetBackground(theDisp,theGC,bcol); + + XSelectInput(theDisp,window, + ExposureMask | + KeyPressMask | + PointerMotionMask | + ButtonPressMask | + ButtonReleaseMask + ); + XMapRaised(theDisp,window); + + pixmap = XCreatePixmap(theDisp,window,iWIDE,iHIGH,theDepth); + + for(;;){ + + XNextEvent(theDisp,&event); + + switch (event.type){ + + case Expose: + { + int x=event.xexpose.x; + int y=event.xexpose.y; + int w=event.xexpose.width; + int h=event.xexpose.height; + int cnt=0; + XCopyArea(theDisp,pixmap,window,theGC,x,y,w,h,x,y); + if( events==0 ){ + put_word(window); + snd_father + } + events=1; + } + break; + + case ClientMessage: + RealiseCmd( (int)(event.xclient.message_type),event.xclient.data.s); + break; + + case MappingNotify: + if( event.xmapping.request == MappingModifier || + event.xmapping.request == MappingKeyboard ) + XRefreshKeyboardMapping(&event); + break; + + case KeyPress: + { + KeySym key; + char ch; + int i=XLookupString( &(event.xkey), &ch, 1, &key, NULL ); + + if( i>0 ) + if( ch == '\177' ) keycodes[ keytail++ ] = -83; + else keycodes[ keytail++ ] = (int)ch; + else + if( key == NoSymbol ) break; + else + if( IsModifierKey( key ) ) break; + else + { + int to_return = 0; + switch( key ){ + case XK_F1 : to_return = -59; break; + case XK_F2 : to_return = -60; break; + case XK_F3 : to_return = -61; break; + case XK_F4 : to_return = -62; break; + case XK_F5 : to_return = -63; break; + case XK_F6 : to_return = -64; break; + case XK_F7 : to_return = -65; break; + case XK_F8 : to_return = -66; break; + case XK_F9 : to_return = -67; break; + case XK_F10 : to_return = -68; break; + case XK_Home : to_return = -71; break; + case XK_Left : to_return = -75; break; + case XK_Up : to_return = -72; break; + case XK_Right : to_return = -77; break; + case XK_Down : to_return = -80; break; + case XK_End : to_return = -79; break; + case XK_Insert: to_return = -82; break; + case XK_Break : to_return = -3; break; + case XK_Prior : to_return = -73; break; + case XK_Next : to_return = -81; break; + } + if( to_return!=0 ) keycodes[ keytail++ ] = to_return; + else break; + } + + if( keytail == QSIZE ) keytail = 0; + if( keytail == keyhead ){ + keytail -- ; + if( keytail < 0 ) keytail = QSIZE ; + } + } + break; + + case MotionNotify: + case ButtonPress: + case ButtonRelease: + mouse_x = event.xmotion.x; + mouse_y = event.xmotion.y; + if( event.type == ButtonPress ){ + switch( event.xbutton.button ){ + case Button1 : mouse_l=1; mouse_l_prs++; + mouse_l_p_x = mouse_x; + mouse_l_p_y = mouse_y; + if( tracking ){ + tracking = 0; + RealiseCmd( END_OF_TRACK, NULL ); + } + break; + case Button2 : mouse_c=1; mouse_c_prs++; + mouse_c_p_x = mouse_x; + mouse_c_p_y = mouse_y; + break; + case Button3 : mouse_r=1; mouse_r_prs++; + mouse_r_p_x = mouse_x; + mouse_r_p_y = mouse_y; + break; + } + } + if( event.type == ButtonRelease ){ + switch( event.xbutton.button ){ + case Button1 : mouse_l=0; mouse_l_rel++; + mouse_l_r_x = mouse_x; + mouse_l_r_y = mouse_y; + break; + case Button2 : mouse_c=0; mouse_c_rel++; + mouse_c_r_x = mouse_x; + mouse_c_r_y = mouse_y; + break; + case Button3 : mouse_r=0; mouse_r_rel++; + mouse_r_r_x = mouse_x; + mouse_r_r_y = mouse_y; + break; + } + } + break; + + } /* end of switch */ + + } /* end of for */ + +} + + + +word cmd=0,w,h,x,y,curx,cury,kolb,wwyp,p,q,r,color; +word alfa,beta,aspect; +char c; +XImage *image; +XImage *XGetImage(); + + + +void RealiseCmd( cmd, pars ) int cmd; short *pars; { + + int i=1; + int cnt=0; + + switch( cmd ){ + + case CLS : + XSetForeground(theDisp,theGC,bcol); + XFillRectangle(theDisp,pixmap,theGC,0,0,iWIDE,iHIGH); + XFillRectangle(theDisp,window,theGC,0,0,iWIDE,iHIGH); + XSetForeground(theDisp,theGC,fcol); + break; + + case GROFF : + XFreePixmap(theDisp,pixmap); + XDestroyWindow(theDisp,window); + XCloseDisplay(theDisp); + exit(0); + break; + + case INKEY : + { + int keycode=0; + if( keyhead != keytail ){ + keycode = keycodes[ keyhead++ ]; + if( keyhead == QSIZE ) keyhead = 0; + } + put_word(keycode) + snd_father + } + break; + + case POINT : + get_shrt( x ); + get_shrt( y ); + XDrawPoint(theDisp,pixmap,theGC,x,y); + XDrawPoint(theDisp,window,theGC,x,y); + break; + + case DRAW : + get_shrt( curx ); + get_shrt( cury ); + get_shrt( x ); + get_shrt( y ); + XDrawLine(theDisp,pixmap,theGC,curx,cury,x,y); + XDrawLine(theDisp,window,theGC,curx,cury,x,y); + break; + + case CIRB : + get_shrt( x ); + get_shrt( y ); + get_shrt( r ); + get_shrt( aspect ); + get_shrt( alfa ); + get_shrt( beta ); + XDrawArc(theDisp,pixmap,theGC,x,y,r,aspect,alfa,beta); + XDrawArc(theDisp,window,theGC,x,y,r,aspect,alfa,beta); + break; + + case HFILL : + get_shrt( curx ); + get_shrt( cury ); + get_shrt( x ); + XDrawLine(theDisp,pixmap,theGC,curx,cury,x,cury); + XDrawLine(theDisp,window,theGC,curx,cury,x,cury); + break; + + case VFILL : + get_shrt( curx ); + get_shrt( cury ); + get_shrt( y ); + XDrawLine(theDisp,pixmap,theGC,curx,cury,curx,y); + XDrawLine(theDisp,window,theGC,curx,cury,curx,y); + break; + + case INPIX : + get_shrt( x ); + get_shrt( y ); + image=XGetImage(theDisp,pixmap,x,y,1,1,0x7fffffffL,ZPixmap); + color = XGetPixel(image,0,0); + XDestroyImage(image); + put_word(color) + snd_father + break; + + case GETMAP : + { + Pixmap map; + get_shrt( x ); + get_shrt( y ); + get_shrt( w ); + get_shrt( h ); + if( w>iWIDE ) w=iWIDE; + if( h>iHIGH ) h=iHIGH; + map = XCreatePixmap(theDisp,window,w,h,theDepth); + XCopyArea(theDisp,pixmap,map,theGC,x,y,w,h,0,0); + put_word(map) + snd_father + } + break; + + case PUTMAP : + case XORMAP : + case ORMAP : + { + Pixmap map; + switch( cmd ){ + case XORMAP: XSetFunction(theDisp,theGC,GXxor); break; + case ORMAP: XSetFunction(theDisp,theGC,GXor ); break; + } + get_word( map ); + get_shrt( curx ); + get_shrt( cury ); + get_shrt( w ); + get_shrt( h ); + if( w>iWIDE ) w=iWIDE; + if( h>iHIGH ) h=iHIGH; + XCopyArea(theDisp,map,pixmap,theGC,0,0,w,h,curx,cury); + XCopyArea(theDisp,map,window,theGC,0,0,w,h,curx,cury); + if( cmd != PUTMAP ) XSetFunction(theDisp,theGC,GXcopy); + } + break; + + case COLOR : + get_shrt( color ); + if( color == 0 ) fcol = black ; + else fcol = white ; + XSetForeground(theDisp,theGC,fcol); + break; + + case BORDER : + get_shrt( color ); + if( color == 0 ) bcol = black ; + else bcol = white ; + XSetBackground(theDisp,theGC,bcol); + break; + + case STYLE : + { + static char style_2[]={ 6, 3 }; + static char style_3[]={ 4, 6 }; + static char style_4[]={ 2, 3 }; + static char style_5[]={ 2, 9 }; + + get_shrt( style ); + switch( style ){ + case 0: + XSetForeground(theDisp,theGC,bcol); + XSetLineAttributes(theDisp,theGC,0,LineSolid,CapButt,JoinMiter); + break; + case 1: + XSetForeground(theDisp,theGC,fcol); + XSetLineAttributes(theDisp,theGC,0,LineSolid,CapButt,JoinMiter); + break; + case 2: + XSetLineAttributes(theDisp,theGC,0,LineDoubleDash, + CapButt,JoinMiter); + XSetDashes(theDisp,theGC,0,style_2,2); + break; + case 3: + XSetLineAttributes(theDisp,theGC,0,LineDoubleDash, + CapButt,JoinMiter); + XSetDashes(theDisp,theGC,0,style_3,2); + break; + case 4: + XSetLineAttributes(theDisp,theGC,0,LineDoubleDash, + CapButt,JoinMiter); + XSetDashes(theDisp,theGC,0,style_4,2); + break; + case 5: + XSetLineAttributes(theDisp,theGC,0,LineDoubleDash, + CapButt,JoinMiter); + XSetDashes(theDisp,theGC,0,style_5,2); + break; + } + } + break; + + case HASCII : + get_shrt( curx ); + get_shrt( cury ); + get_shrt( r ); + if( r==0 ){ + XSetForeground(theDisp,theGC,bcol); + XFillRectangle(theDisp,pixmap,theGC,curx,cury,8,8); + XFillRectangle(theDisp,window,theGC,curx,cury,8,8); + XSetForeground(theDisp,theGC,fcol); + }else{ + c = (char)r; + XDrawString(theDisp,pixmap,theGC,curx,cury+8,&c,1); + XDrawString(theDisp,window,theGC,curx,cury+8,&c,1); + } + break; + + case STATUS : + put_shrt(mouse_x) + put_shrt(mouse_y) + put_shrt(mouse_l) + put_shrt(mouse_r) + put_shrt(mouse_c) + snd_father + break; + + case GETPRESS : + case GETRELEASE : + { + int button; + get_shrt(button); + if( cmd == GETPRESS ) + switch( button ){ + + case 0: + put_shrt( mouse_l_p_x ); + put_shrt( mouse_l_p_y ); + put_shrt( mouse_l_prs ); + mouse_l_prs=0; + break; + + case 1: + put_shrt( mouse_r_p_x ); + put_shrt( mouse_r_p_y ); + put_shrt( mouse_r_prs ); + mouse_r_prs=0; + break; + + case 2: + put_shrt( mouse_c_p_x ); + put_shrt( mouse_c_p_y ); + put_shrt( mouse_c_prs ); + mouse_c_prs=0; + break; + + default:put_shrt( 0 ); + put_shrt( 0 ); + put_shrt( 0 ); + break; + + } + else + switch( button ){ + + case 0: + put_shrt( mouse_l_r_x ); + put_shrt( mouse_l_r_y ); + put_shrt( mouse_l_rel ); + mouse_l_rel=0; + break; + + case 1: + put_shrt( mouse_r_r_x ); + put_shrt( mouse_r_r_y ); + put_shrt( mouse_r_rel ); + mouse_r_rel=0; + break; + + case 2: + put_shrt( mouse_c_r_x ); + put_shrt( mouse_c_r_y ); + put_shrt( mouse_c_rel ); + mouse_c_rel=0; + break; + + default:put_shrt( 0 ); + put_shrt( 0 ); + put_shrt( 0 ); + break; + + } + put_shrt(mouse_l) + put_shrt(mouse_r) + put_shrt(mouse_c) + snd_father + } + break; + + case GETMOVEMENT : + { + static int x=0,y=0; + put_shrt(mouse_x-x) + put_shrt(mouse_y-y) + snd_father + x = mouse_x; + y = mouse_y; + } + break; + + case TRACK: + { + int x,y; + get_shrt( x ) /* these parameters are not used */ + get_shrt( y ) + tracking = 1; + /* now we wait to point and press left button */ + } + break; + + case END_OF_TRACK: + put_shrt( mouse_x ) + put_shrt( mouse_y ) + snd_father + break; + + default : + fprintf(stderr,"UKNOWN COMMAND for HERCULES emulation - %d\n",cmd); + fflush(stderr); + XFreePixmap(theDisp,pixmap); + XDestroyWindow(theDisp,window); + XCloseDisplay(theDisp); + exit(7); + + } + +} + diff --git a/sources/new-s5r4/info b/sources/new-s5r4/info new file mode 100644 index 0000000..d303e23 --- /dev/null +++ b/sources/new-s5r4/info @@ -0,0 +1,11 @@ +control.c: sendmsg1( &msg); /* send create request */ +control.c: sendmsg1( &msg); /* send RPC request */ +control.c: sendmsg1(&msg); /* send create acknowledge */ +control.c: sendmsg1(&msg); /* send RP return - acknowledge */ +object.c: sendmsg1( &msg);/* send remote kill request */ +process.c: sendmsg1( &msg); /* request remote resume */ +process.c: sendmsg1(&msg); /* send error message */ +process.c: sendmsg1( &msg ); +process.c: sendmsg1( &msg1 ); +process.c:void sendmsg1(msg) /* Send message via net */ +process.c:fprintf(stdout,"After sendmsg1\n"); diff --git a/sources/new-s5r4/inkeydos.c b/sources/new-s5r4/inkeydos.c new file mode 100644 index 0000000..7b7cf39 --- /dev/null +++ b/sources/new-s5r4/inkeydos.c @@ -0,0 +1,25 @@ +#include "graf\graf.h" +#include + +static union REGS r; + +int pascal inkey( dummy ) + void *dummy; +{ + r.h.ah = 0x01; + int86( 0x16, &r, &r); + if( r.x.ax == 0 ) return 0; + else + { + r.h.ah = 0x00; + int86( 0x16, &r, &r); + if( r.h.al != '\0' ) + return (int)(unsigned char)( r.h.al ); + else + if( r.h.ah & '\x80' ) + return (int)( -r.h.ah ); + else + return (int)(unsigned char)( r.h.ah ); + } +} + diff --git a/sources/new-s5r4/inkeyos2.c b/sources/new-s5r4/inkeyos2.c new file mode 100644 index 0000000..fbd976f --- /dev/null +++ b/sources/new-s5r4/inkeyos2.c @@ -0,0 +1,28 @@ +#define INCL_BASE +#include + +int pascal inkey(dummy) +int *dummy; +{ + KBDKEYINFO kdata; + int i; + unsigned u; + + KbdPeek(&kdata, 0); + if (kdata.fbStatus) + { + KbdCharIn(&kdata, 0, 0); + if (kdata.chChar != '\0') + { + u = kdata.chChar; + return(u); + } + else + { + i = kdata.chScan; + if (i < 0x80) return(-i); else return(i); + } + } + else + return(0); +} diff --git a/sources/new-s5r4/inkeyux.c b/sources/new-s5r4/inkeyux.c new file mode 100644 index 0000000..c7fc050 --- /dev/null +++ b/sources/new-s5r4/inkeyux.c @@ -0,0 +1,744 @@ +#include +#include +#include +#include +#include + +#include + + +#include "graf/graf.h" + +#define KB_BACKSPACE (int)'\b' /* kb */ +#define KB_ENTER (int)'\r' /* RT */ +#define KB_TAB (int)'\t' /* TB */ +#define KB_ESC 0x1b /* EC */ + +#define KB_HOME -71 /* kh or HM */ +#define KB_END -79 /* EN */ +#define KB_UP -72 /* ku or UP */ +#define KB_DOWN -80 /* kd */ +#define KB_LEFT -75 /* kl */ +#define KB_RIGHT -77 /* kr */ +#define KB_PGUP -73 /* PU */ +#define KB_PGDN -81 /* PD */ +#define KB_BACK_TAB -15 /* BT */ +#define KB_INS -82 /* al */ +#define KB_DEL -83 /* DL */ + +#define KB_F1 -59 /* k1 */ +#define KB_F2 -60 /* k2 */ +#define KB_F3 -61 /* k3 */ +#define KB_F4 -62 /* k4 */ +#define KB_F5 -63 /* k5 */ +#define KB_F6 -64 /* k6 */ +#define KB_F7 -65 /* k7 */ +#define KB_F8 -66 /* k8 */ +#define KB_F9 -67 /* k9 */ +#define KB_F10 -68 /* k0 */ + +#define KB_STR_EXISTS 1 /* string exists in tree or his prefix */ +#define KB_TOO_MANY_STRINGS 2 +#define KB_NULL_STRING 3 +#define KB_OUT_OF_MEMORY 4 +#define KB_OK 0 + + + +#include "depend.h" +#include "genint.h" +#include "int.h" +#include "process.h" +#include "intproto.h" + + +#define TERMINAL 0 +#define KEYBOARD 1 + +static char *capability,*capability_value; + +typedef struct _tree_node *tree; /* drzewo zawierajace ciagi znakow */ +struct _tree_node { /* odpowiadajace klawiszowi klawiatury */ + int key; + tree way; + int outkey; +}; + +#ifndef NO_PROTOTYPES +static int tfirst(int); +static int tnext(void); +static void *___allocate_object(unsigned); +static void ___free_object(void *); +static char *object_str(char *); /* allocate space and copy string */ +static int __testkey(int*,int*); +static int getkey(void); +static int __inkey(void); +static void kbinit(void); +static tree new_tree_node(void); +static int _create_new_leaf(tree,int,unsigned char *,int); +static int inskey(int,char *); +#else +static int tfirst(); +static int tnext(); +static void *___allocate_object(); +static void ___free_object(); +static char *object_str(); +static int __testkey(); +static int getkey(); +static int __inkey(); +static void kbinit(); +static tree new_tree_node(); +static int _create_new_leaf(); +static int inskey(); +#endif + + + + + +#define object_kill(i) (___free_object(i),(i)=NULL) +#define object_new(type) ((type *)___allocate_object(sizeof(type))) +#define object_dim(i,type) ((type *)___allocate_object((i)*sizeof(type))) + + + + +#define KB_NDEF 0xff /* KN - key suppressed by inkey() */ + +#define NODE_SIZE 100 + + +#define QSIZE 256 +static int cqueue[QSIZE]; /* implementacja kolejki */ +static int qh=0,qt=0,qs=0; +static int bget(){ + int c; + if( qs == 0 ) return -1; + c = cqueue[ qh++ ]; + qh &= QSIZE - 1 ; + qs--; + return c; +} +static void bput( c ) int c; { + if( qs == QSIZE ) return; + cqueue[ qt++ ] = c; + qt &= QSIZE - 1 ; + qs++; +} +static int qq; +static int bfirst(){ + if( qs == 0 ) return -1; + qq = qh + 1 ; + qq &= QSIZE - 1 ; + return cqueue[ qh ]; +} +static int bnext(){ + int c; + if( qq == qt ) return -1; + c = cqueue[ qq++ ]; + qq &= QSIZE - 1 ; + return c; +} + + +static tree troot=NULL; + +#ifndef NDEBUG +static FILE *f=NULL; +static void _show_tree(root,r) tree root;int r;{ + int i,j; + for(i=0;(i'7') return 1; + *ptr*=8; + *ptr+=*(tptr++)-'0'; + } + ptr++; ptr_size--; + } + break; + case '^': tptr++; + c=*(tptr++); + *(ptr++)=(char)((toupper(c))-'A'+1); ptr_size--; + break; + default: *(ptr++)=*(tptr++); ptr_size--; + } + *ptr='\0'; + if( ptr_size<=0 ){ + fprintf(stderr,"buffer exceeded in convert(%s)",__FILE__); + fflush(stderr); + exit(7); + } + return 0; +} + + +/* FUNCTIONS looking for entries in /ETC/TERMCAP */ + + + +static char etcname[80]; +static char termname[80]; +static char *fname; + + +static char *envset(envname,envfile) char *envname,*envfile;{ + extern char *getenv(); + char *TERM=getenv("TERM"); + char *env=getenv(envname); + char *str,*ptr; + FILE *f; + int c,continued=1; + + ptr=str=object_dim(32000,char); + if(str==NULL){ + fprintf(stderr,"Out of memory.\n"); + fflush(stderr); + exit(7); + } + + if(TERM==NULL){ + fprintf(stderr,"\n\renvironment variable TERM not found\n\r"); + fflush(stderr); + exit(7); + } + + strcpy(termname,TERM); + + f=fopen(env,"r"); + if( f==NULL ) f=fopen(envfile,"r"); else fname=env; + if( f==NULL ) f=fopen(strcat(strcpy(etcname,"/etc/"),envfile),"r"); + else fname=envfile; + if( f==NULL ) return NULL; + else fname=etcname; + + while( continued ){ + + char *rev,*tnm; + + if( find_name(f,termname)==0 ) return object_str(":"); + + *(ptr++)=':'; + c=' '; + do{ + c=next_char(f); + if( c!='\0' ) *(ptr++)=(char)c; + }while( c!='\0' ); + + *(ptr)='\0'; + rev=ptr-1; + while( rev>str && rev[-1]!=':' ) rev--; + if( rev[0]=='t' && rev[1]=='c' ){ + ptr=rev-1; + rev+=3; + tnm=termname; + while( *rev!=':' ) *(tnm++)=*(rev++); + *tnm='\0'; + continued=1; + }else continued=0; + + } + + ptr=object_str(str); + object_kill(str); + return ptr; + +} + +static int find_name(f,termname) FILE *f; char *termname;{ + int i,c,lastc,found=0; + fseek(f,0L,0); + + do{ + + do{ + c=fgetc(f); + if(c==EOF) return 0; + if(c=='#' || c=='\t' || c==':' || c=='\n') + while(c!='\n'){ + lastc=c; + c=fgetc(f); + if(c==EOF) return 0; + if( lastc=='\\' ) c=' '; + } + }while(c=='\n'); + + while( !found ){ + for(i=0;termname[i]!='\0';i++){ + if((char)c!=termname[i]) break; + c=fgetc(f); + } + if( termname[i]=='\0' ){ found=1; break; } + while( isalpha((char)c) ) c=fgetc(f); + if( c=='|' ) c=fgetc(f); + else{ ungetc('#',f); break; } + } + + } while( !found ); + + while(c!=':'){ + c=fgetc(f); + if(c==EOF) return 0; + } + + return 1; +} + + +static int next_char(f) FILE *f;{ + int c; + static int lastc='\0'; + if( lastc!='\0' ){ + c=lastc; + lastc='\0'; + return c; + } + c=fgetc(f); + if( c==EOF || c=='\n' ) return '\0'; + if( c=='\\' ){ + c=fgetc(f); + if( c=='\n' ){ + while( c=='\n' || c=='\t' || c==':' || c==' ' ) c=fgetc(f); + return c; + } + lastc=c; + return '\\'; + } + return c; +} + + + + +static void *___allocate_object(size) unsigned size;{ + char *p; + extern void *calloc(); + if(size==0) return NULL; + p=calloc(size,1); + if( p==NULL ){ + printf("\r\n"); + printf("=======================================\r\n"); + printf("Memory overflow ... \r\n"); + printf("=======================================\r\n"); + fflush(stdout); + system("stty sane"); + exit(7); + } + return (void *)p; +} + +static void ___free_object(ff) void *ff;{ + assert(ff!=NULL); + free((char *)ff); +} + +static char *object_str(str) char *str;{ + char *buf=object_dim(strlen(str)+1,char); + strcpy(buf,str); + return buf; +} diff --git a/sources/new-s5r4/inkeyux.o b/sources/new-s5r4/inkeyux.o new file mode 100644 index 0000000000000000000000000000000000000000..1b40a1a4f1841cb37ae034728942d98c6756fa09 GIT binary patch literal 12433 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 AS^xk5 literal 0 HcmV?d00001 diff --git a/sources/new-s5r4/int b/sources/new-s5r4/int new file mode 100644 index 0000000000000000000000000000000000000000..5a52cc9639a494a3fa0e8fb6344757815cd00d50 GIT binary patch literal 90112 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 (y) ? (x) : (y)) +#define absolute(x) ((x) >= 0 ? (x) : -(x)) + +/* LOGLAN's booleans : */ +#define LFALSE ((word)0) +#define LTRUE (~LFALSE) +#define lbool(b) ( (b) ? LTRUE : LFALSE ) + +/* Type of files : */ +#define TEXTF 1 /* text file */ +#define CHARF 2 /* file of char */ +#define INTF 3 /* file of integer */ +#define REALF 4 /* file of real */ +#define DIRECT 5 /* direct access file */ + +/* File status : */ +#define READING 0 /* sequential file opened for read */ +#define WRITING 1 /* sequential file opened for write */ +#define UPDATING 2 /* direct access file */ +#define UNKNOWN 3 /* file not opened */ + +/* Run time error types : */ + +#define RTESLCOF 0 /* SL chain cut off */ +#define RTEUNSTP 1 /* unimplemented standard procedure */ +#define RTEILLAT 2 /* illegal attach */ +#define RTEILLDT 3 /* illegal detach */ +#define RTECORTM 4 /* coroutine terminated */ +#define RTECORAC 5 /* coroutine active */ +#define RTEINVIN 6 /* array index error */ +#define RTEILLAB 7 /* incorrect array bounds */ +#define RTEINCQA 8 /* improper QUA */ +#define RTEINCAS 9 /* illegal assignment */ +#define RTEFTPMS 10 /* formal type missing */ +#define RTEILLKL 11 /* illegal kill */ +#define RTEILLCP 12 /* illegal copy */ +#define RTEINCHS 13 /* incompatible headers */ +#define RTEHNDNF 14 /* handler not found */ +#define RTEMEMOV 15 /* memory overflow */ +#define RTEFHTLG 16 /* formal header too long */ +#define RTEILLRT 17 /* illegal return */ +#define RTEREFTN 18 /* reference to NONE */ +#define RTEDIVBZ 19 /* division by zero */ +#define RTESYSER 20 /* system error */ +#define RTEILLIO 21 /* illegal I/O operation */ +#define RTEIOERR 22 /* I/O error */ +#define RTECNTOP 23 /* Cannot open file */ +#define RTEBADFM 24 /* Input data format bad */ +#define RTEILLRS 25 /* illegal resume */ +#define RTETMPRC 26 /* too many processes on one machine */ +#define RTEINVND 27 /* invalid node number */ +#define RTENEGST 28 /* negative step value */ +#define RTENONGL 29 /* only process may be global */ + +union value { + unsigned int xint; + word xword; + real xreal; + virtaddr xvirt; + word xbool; + }; + +/* Variables : */ + +extern memory M; /* main memory for code and data */ +extern union value *param; /* pointer to standard proc. param list */ +extern int offset[]; /* offset conversion table for compact. */ +extern int scot[]; /* signal to number conversion table */ +extern int primapet[]; /* appetites of primitive types */ +extern word ic; /* instruction counter */ +extern word lastic; /* previous ic for redecoding after comp. */ +extern int opcode; /* opcode of L-code instruction */ +extern word a1, a2, a3; /* arguments of L-code instruction */ + +/* kernel variables for the running system */ + +extern word memorysize; /* size of memory array for code and data */ +extern word dispoff; /* DISPLAY offset in process object */ +extern word disp2off; /* indirect DISPLAY offset in process object */ +extern word display; /* DISPLAY address - physical addresses */ +extern word display2; /* DISPLAY address - indirect addresses */ +extern word c1, c2; /* pointers to current object */ +extern word mainprog; /* main block object */ +extern word mnoff; /* offset of variable main */ + + +extern bool infmode; /* TRUE if compactification message printed */ +extern bool debug; /* TRUE if trace is printed */ +extern FILE *tracefile; /* output file for trace */ + +extern jmp_buf contenv; /* for continue execution */ + + + diff --git a/sources/new-s5r4/intdt.c b/sources/new-s5r4/intdt.c new file mode 100644 index 0000000..86470b2 --- /dev/null +++ b/sources/new-s5r4/intdt.c @@ -0,0 +1,96 @@ +#include "depend.h" +#include "genint.h" +#include "int.h" +#include "process.h" +#include "intproto.h" + +/* Variables common with generator : */ + +protdescr *prototype[ MAXPROT+1 ]; /* prototypes */ +word ipradr; /* address of primitive types descriptions */ +word temporary; /* address of global temporary variables */ +word strings; /* base for string constants */ +word lastprot; /* the last used prototype number */ +word freem; /* first free cell in M */ +word currfile = 2; /* current file virtual address */ + +/* Interpreter own variables : */ + +memory M; /* main memory for code and data */ +union value *param; /* for comunication with standard procs */ + +/* offset conversion table for compactification */ +int offset[] = { DUMMY, SL, DL, CL, CHD, VIRTSC }; + +/* signal to number conversion table */ +/* -1 stands for an unrecoverable error which cannot be serviced by handler */ + +int scot[] = +{ + 20, /* RTESLCOF */ + 20, /* RTEUNSTP */ + 20, /* RTEILLAT */ + 20, /* RTEILLDT */ + 20, /* RTECORTM */ + 20, /* RTECORAC */ + 23, /* RTEINVIN */ + 23, /* RTEILLAB */ + 21, /* RTEINCQA */ + 24, /* RTEINCAS */ + 20, /* RTEFTPMS */ + 20, /* RTEILLKL */ + 20, /* RTEILLCP */ + 24, /* RTEINCHS */ + -1, /* RTEHNDNF */ + 22, /* RTEMEMOV */ + 22, /* RTEFHTLG */ + -1, /* RTEILLRT */ + 21, /* RTEREFTN */ + 01, /* RTEDIVBZ */ + 02, /* RTESYSER */ + 02, /* RTEILLIO */ + 02, /* RTEIOERR */ + 02, /* RTECNTOP */ + 02, /* RTEBADFM */ + 20, /* RTEILLRS */ + 02, /* RTETMPRC */ + 02, /* RTEINVND */ + 23, /* RTENEGST */ + -1 /* RTENONGL */ +}; + +/* Primitive type appetites for moveparams() : */ + +int primapet[] = +{ + APINT, /* INTEGER */ + APREAL, /* REAL */ + APINT, /* BOOLEAN */ + APINT, /* CHAR */ + APREF, /* COROUTINE */ + APREF, /* PROCESS */ + APINT /* STRING */ +}; + +word ic; /* instruction counter */ +word lastic; /* previous ic for redecoding after compact. */ +int opcode; /* opcode of L-code instruction */ +word a1, a2, a3; /* arguments of L-code instructions */ + +/* kernel variables for the running system: */ + +word memorysize = DEFMEMSIZE; /* code and data memory size */ +word c1, c2; /* pointers to current object */ +word dispoff; /* DISPLAY offset in process object */ +word disp2off; /* indirect DISPLAY offset in process object */ +word display; /* DISPLAY address - physical addresses */ +word display2; /* DISPLAY address - indirect addresses */ +word mainprog; /* main block object */ +word mnoff; /* offset of variable main */ + + +bool infmode = FALSE; /* default: no compactification message */ +bool debug = FALSE; /* TRUE if trace is printed */ +FILE *tracefile; /* output file for trace */ + +jmp_buf contenv; /* for continue execution */ diff --git a/sources/new-s5r4/intdt.o b/sources/new-s5r4/intdt.o new file mode 100644 index 0000000000000000000000000000000000000000..2893281d4fb1f2526b6c6ca6a23dc7463591ced5 GIT binary patch literal 896 zcmZvZFGvJI6vjt6xM=X-1*=u@3>M8MlT{eT+1X{`W@nh)J2;zFj5fh$uqhZ6G#IQV zgVk&>C}L30@9oVU4{_kz_nUd&dvAtqPKbKl41+j~`?wX8fC1JI^aXuFAJ98AgWP|b z$2n;hYW?xh9;JghL=rLiXe`b8E9yTwqn_j^FV`qvUwys)!XZQ>ig=pwBDhJ1Sj!MG zdDkK@AZ|oHLfnjej<_B95^*Q;6{3b{@*|oRk*Q~o@jl}N#x#R!$$!lFgz+ikGsYK; zuNmJmzGHmP_<`{g<7dV%j9(eQG5%)Uz(YoFnTkyRyamp*ZcFW~&pRer5>m>n=#CGh z7E*UZNRbuNrD^&z*))7~2ELch%S;K_^Bx&)Az-EKxMSGlV1DdmGof{>N5 z-USu<=v0Ng$VwqQs;tN=WEzaILT;f{1qI4+2TD_PUf0dlijb-etzuAKdfaRX?J;!} h`cn=7r$&WFv??z!2sg7u?X7~+X81nsipmr{@e69ap49*V literal 0 HcmV?d00001 diff --git a/sources/new-s5r4/intproto.h b/sources/new-s5r4/intproto.h new file mode 100644 index 0000000..d1047b0 --- /dev/null +++ b/sources/new-s5r4/intproto.h @@ -0,0 +1,196 @@ +#ifndef NO_PROTOTYPES + +unsigned alarm( unsigned ); +double prandom( void ); + +void openrc(word,virtaddr *,word *); +void raise_signal(word,word,word *,word *); +void openobj(word,word *,word *); +void slopen(word,virtaddr *,word *,word *); +void errsignal(int); +void typep(word,word,word *,word *); +void copy(virtaddr *,virtaddr *); +void qua(virtaddr *,word); +void standard(word); +void disp(virtaddr *); +void gkill(virtaddr *); +void typref(virtaddr *,word); +void go(word,word); +void goloc(word,word); +void typed(word,word,word,word,virtaddr *); +void term(void); +void wind(void); +void trace(word); +void inner(word); +void backhd(virtaddr *,word *); +void backbl(virtaddr *,word *); +void backpr(virtaddr *,word *); +void back(virtaddr *,word *,word); +void detach(void); +void attach(virtaddr *); +void fin(word,virtaddr *,word *); +void heads(virtaddr *,word); +void resume(virtaddr *); +void passivate(int); +void enable(word,word); +void evaluaterpc(word); +void disable(word,word); +void rpc_accept(word); +void rpc3(void); +void popmask(word); +void askprot(virtaddr *); +bool member(virtaddr *,word *); +word virtprot(word); +word loadt(word,word); +bool is(virtaddr *,word); +bool inl(virtaddr *,word); +word shift(word,word); +void execute(void); +void abend(char *); +void addext(char *,char *); +void usage( void ); +void decode( void ); +void init_scheduler( void ); +void runsys( void ); +void schedule( void ); +void msginterrupt( message * ); +void loosen( void ); +void update( word, word ); +void compactify( void ); +void moveparams(word, word, message *, int, int); +void sendmsg1(message *); +word getnode(word); +void endprocess(int); +word entier(double); +char *asciiz( virtaddr * ); +void ranset(void); +void moveblock( char *,char *, word ); +void request( word, word *, word *); +word memavail( void ); +void newarry( word, word, word, virtaddr *, word *); +void initprocess( word,word,procaddr *); +void activate( word ); +void reset( word ); +void pushmask( word ); +void trapmsg( void ); +void rpc2( void ); +void endrun( int ); +void loadfile(word,word *,word *,FILE **); +word directio(virtaddr *,word,int (*)(),FILE *); +void nonstandard( word ); +void genfileobj(bool,word,char *,virtaddr *,word *); +void rewrite( word ); +void delete( virtaddr * ); +bool testeof( FILE * ); +bool testeoln( FILE * ); +char *tempfilename( void ); +word readint( FILE * ); +double readreal( FILE * ); +void writeint( word, word, FILE * ); +void writereal( double, word, word, FILE * ); +void writestring( word, word, FILE * ); +void readln( FILE * ); +void senderr( int, procaddr * ); +void rpcend( message * ); +void rpc1( message * ); + +#else + +unsigned alarm(); +int unlink(); +int ioctl(); + +void openrc(); +void raise_signal(); +void openobj(); +void slopen(); +void errsignal(); +void typep(); +void copy(); +void qua(); +void standard(); +void disp(); +void gkill(); +void typref(); +void go(); +void goloc(); +void typed(); +void term(); +void wind(); +void trace(); +void inner(); +void backhd(); +void backbl(); +void backpr(); +void back(); +void detach(); +void attach(); +void fin(); +void heads(); +void resume(); +void passivate(); +void enable(); +void evaluaterpc(); +void disable(); +void rpc_accept(); +void rpc3(); +void popmask(); +void askprot(); +bool member(); +word virtprot(); +word loadt(); +bool is(); +bool inl(); +word shift(); +void execute(); +void abend(); +void addext(); +void usage(); +void decode(); +void init_scheduler(); +void runsys(); +void schedule(); +void msginterrupt(); +void loosen(); +void update(); +void compactify(); +void moveparams(); +void sendmsg(); +word getnode(); +void endprocess(); +word entier(); +char *asciiz(); +void ranset(); +double prandom(); +void moveblock(); +void request(); +word memavail(); +void newarry(); +void initprocess(); +void activate(); +void pushmask(); +void trapmsg(); +void rpc2(); +void endrun(); +void loadfile(); +word directio(); +void nonstandard(); +void genfileobj(); +void reset(); +void rewrite(); +void delete(); +bool testeof(); +bool testeoln(); +char *tempfilename(); +word readint(); +double readreal(); +void writeint(); +void writereal(); +void writestring(); +void readln(); +void senderr(); +void rpcend(); +void rpc1(); + +#endif + diff --git a/sources/new-s5r4/link.lnk b/sources/new-s5r4/link.lnk new file mode 100644 index 0000000..643ca4e --- /dev/null +++ b/sources/new-s5r4/link.lnk @@ -0,0 +1 @@ +cint.o compact.o control.o util.o handler.o intdt.o memory.o object.o runsys.o typchk.o standard.o execute.o fileio.o nonstand.o process.o procaddr.o queue.o rpcall.o \ No newline at end of file diff --git a/sources/new-s5r4/makefile b/sources/new-s5r4/makefile new file mode 100644 index 0000000..2f49a94 --- /dev/null +++ b/sources/new-s5r4/makefile @@ -0,0 +1,102 @@ +SHELL=/bin/csh +#.SUFFIXES: .o .c + +############################################################################# +# switches : +# OBJECTADDR - switch on special process addressing - object simulates +# process pointer +# CDBG - turn on debugging of compactifier, compactifier appends to file +# 'trace' state of memory before & after the compactification, +# also a history of compactification & process number is dumped +# RPCDBG - debugging of alien call, all actions : alien call, acknowledges, +# passivations and returns are written to stderr +# NO_GRAPH - nonstand.c defines only INKEY grom IIUWGRAPH +# DLINK - DLINK network version +# TCPIP - TCPIP network version - needs also OBJECTADDR +# +# switches depending on environment : +# TURBOC - if using BORLAND TURBO-C compiler +# MSDOS/OS2/UNIX - choose operating system +# USE_CLOCK - scheduler should use clock() function to measure time +# USE_ALARM - scheduler should use alarm() function to measure time +# WORD_16BIT/DWORD_16BIT/WORD_32BIT - choose memory model : +# small 16-bit / large 16-bit / small 32-bit +# +# for DLINK use cinta.o ( cinta.asm ) +# for TCPIP use tcpip.o sock.o +# for no network simply leave empty +# NETFILE=tcpip.o sock.o + +#NETFILE=tcpip.o sock.o +NETFILE= + +#CC=gcc -m486 -DDJE -DUSE_CLOCK -DWORD_32BIT -Dpascal= +# MSDOS 32bit GNU CC + +#CC=cl -AL -Olsg -DMSDOS -DDWORD_16BIT # MSDOS 16bit LARGE +#CC=cl -AL -Olsg -DMSDOS -DWORD_16BIT # MSDOS 16bit SMALL + +UNIXPARS=-DUNIX -DWORD_32BIT -DUSE_ALARM -Dpascal= +UNIXPARSNG=$(UNIXPARS) -DNO_GRAPH + +#CC=cc $(UNIXPARSNG) -DNO_PROTOTYPES # SUN,HP +#CC=rcc $(UNIXPARSNG) -O # SCO - AT&T C compiler +#CC=cc -W1 $(UNIXPARSNG) # SCO +#CC=cc -W1 $(UNIXPARSNG) -DOBJECTADDR # SCO +#CC=cc -W1 $(UNIXPARSNG) -DOBJECTADDR -DTCPIP # SCO TCPIP +CC=gcc $(UNIXPARSNG) -DOBJECTADDR -DSYSV # GNU C++ TCPIP +#CC=cc -W1 $(UNIXPARS) -DSYSV -DXSIGHT # SCO with X11 graphics +#CC=gcc -g $(UNIXPARS) -DSYSV -DXSIGHT # SCO GCC with X11 graphics + +CCc=$(CC) # common version +#CCc=$(CC) -Fo$*.o # MSDOS MSC version + +target : int + +############################################################################# + + + +OBJ= cint.o compact.o control.o util.o handler.o intdt.o \ + memory.o object.o runsys.o standard.o \ + execute.o fileio.o nonstand.o process.o procaddr.o queue.o \ + rpcall.o typchk.o $(NETFILE) + +.c.o : + $(CCc) -c $*.c +.s.o: + as -o $*.o $*.s + +hgcint.exe: $(OBJ) inkeydos.o graf\lib\hgcmsf4.lib + link /e @link.lnk inkeydos.o, hgcint.exe, nul, graf\lib\hgcmsf4, ; + +egaint.exe: $(OBJ) inkeydos.o graf\lib\egamsf4.lib + link /e @link.lnk inkeydos.o, egaint.exe, nul, graf\lib\egamsf4, ; + +cgaint.exe: $(OBJ) inkeydos.o graf\lib\mgcmsf4.lib + link /e @link.lnk inkeydos.o, cgaint.exe, nul, graf\lib\mgcmsf4, ; + +cga64int.exe: $(OBJ) inkeydos.o graf\lib\mgc64mf4.lib + link /e @link.lnk inkeydos.o, cga64int.exe, nul, graf\lib\mgc64mf4, ; + +int386.exe: $(OBJ) + $(CC) @link.lnk -lm -lpc -lgrx -o svgaint + strip svgaint + coff2exe svgaint + rm svgaint +# move svgaint.exe ..\examp\svgaint.exe + +int: $(OBJ) inkeyux.o +# $(CC) $(OBJ) inkeyux.o -lm -lX11 -lmalloc -lsocket -o int + $(CC) $(OBJ) inkeyux.o -lm -o int + strip int +# mv int $(HOME)/LOGLAN.PAU/bin + +nonstand.o : nonstand.c dosgraf1.c dosgraf2.c os2graf2.c x11graf1.c x11graf2.c svga1.c svga2.c + +herc : herc.c + $(CC) herc.c -lX11 -lmalloc -lsocket -o herc + strip herc + +clean : + rm *.o diff --git a/sources/new-s5r4/memory.c b/sources/new-s5r4/memory.c new file mode 100644 index 0000000..b25e76b --- /dev/null +++ b/sources/new-s5r4/memory.c @@ -0,0 +1,225 @@ +#include "depend.h" +#include "genint.h" +#include "int.h" +#include "process.h" +#include "intproto.h" + +/* Memory management routines */ + +#ifndef NO_PROTOTYPES +static void compandtake(word, word *, word *, word *, bool); +static void sinsert(word); +#else +static void compandtake(); +static void sinsert(); +#endif + + +int compactify_allowed=1; +#define space 400 /* words */ + + +void request(app, ah, am) +word app, *ah, *am; +{ + word t2, t4, t5; + bool wascompactified, found; + + if (app >= MAXAPPT) errsignal(RTEMEMOV); + wascompactified = FALSE; + + if( compactify_allowed && thisp->force_compactification ){ + compactify(); + thisp->force_compactification=FALSE; + wascompactified=TRUE; + } + + if (thisp->freeitem != 0) /* reserve dictionary item */ + { + *ah = thisp->freeitem; + thisp->freeitem = M[ *ah ]; + } + else + { + *ah = thisp->lastitem-2; + if (*ah <= thisp->lastused + space) /* cannot take free item */ + { + if( compactify_allowed ) + if( !wascompactified ) compactify(),wascompactified=TRUE; + else ; + else + thisp->force_compactification=TRUE; + *ah = thisp->lastitem-2; + if (*ah <= thisp->lastused) errsignal(RTEMEMOV); + } + + thisp->lastitem = *ah; + M[ *ah+1 ] = 0; /* clear mark */ + } /* now we have a free dict. item */ + + + if (app == 2 && thisp->headk2 != 0) /* special case app=2 */ + { + *am = thisp->headk2; + thisp->headk2 = M[ *am+SHORTLINK ]; + } + else + { + word t1 = thisp->headk; + found = FALSE; + t4 = 0; + while (t1 != thisp->lower && !found) + { + t2 = M[ t1 ]; + if (t2 == app) found = TRUE; + else + if (t2-app >= 2) found = TRUE; + else + { + t4 = t1; + t1 = M[ t1+LONGLINK ]; + } + } + if( found ) { + t5 = M[ t1+SHORTLINK ]; + if (t5 != 0) M[ t5+LONGLINK ] = M[ t1+LONGLINK ]; + else t5 = M[ t1+LONGLINK ]; + if (t4 == 0) thisp->headk = t5; else M[ t4+LONGLINK ] = t5; + *am = t1; + if (t2 > app) /* at least two extra words */ + { + t5 = t1+app; + M[ t5 ] = t2-app; + sinsert(t5); + } + } + else + if ( thisp->lastitem - thisp->lastused > app + space ) + { + *am = thisp->lastused+1; + thisp->lastused += app; + } + else + { + M[ *ah ] = thisp->freeitem; /* return dictionary item */ + thisp->freeitem = *ah; + if( compactify_allowed ) + if( !wascompactified ) compactify(); + else ; + else + thisp->force_compactification=TRUE; + *ah = thisp->lastitem-2; /* reserve dictionary item */ + thisp->lastitem = *ah; + M[ *ah+1 ] = 0; /* clear mark */ + if ( thisp->lastitem - thisp->lastused > app ) { + *am = thisp->lastused+1; + thisp->lastused += app; + } + else + errsignal(RTEMEMOV); + } + } + + M[ *am ] = app; + for (t2 = *am+1; t2 < *am+app; t2++ ) M[ t2 ] = 0; + M[ *ah ] = *am; + +} + + +static void sinsert(am) /* Dispose of a memory item. */ +word am; +{ + word t1, t2, t3, t4; + + t1 = M[ am ]; /* appetite */ + if (t1 == 2) /* a special list should be used */ + { + M[ am+SHORTLINK ] = thisp->headk2; + thisp->headk2 = am; + } + else + { + t2 = thisp->headk; + t4 = 0; + while (TRUE) /* look for a proper place */ + { + t3 = M[ t2 ]; /* appetite */ + if (t1 == t3) /* an entry with matching appetite */ + { + M[ am+SHORTLINK ] = M[ t2+SHORTLINK ]; + M[ t2+SHORTLINK ] = am; + break; + } + else + if (t1 < t3) + { + M[ am+LONGLINK ] = t2; + M[ am+SHORTLINK ] = 0; + if (t4 == 0) thisp->headk = am; + else M[ t4+LONGLINK ] = am; + break; + } + else + { + t4 = t2; + t2 = M[ t2+LONGLINK ]; + } + } + } +} + + +void disp(virt) /* Simple kill. */ +virtaddr *virt; +{ + word t1, t2; + + t1 = M[ virt->addr+1 ]; + if (t1 == virt->mark) /* not none */ + { + t1++; /* advance mark */ + t2 = M[ virt->addr ]; /* am */ + M[ virt->addr+1 ] = t1; + if (t1 != MAXMARKER) /* mark still usable */ + { + M[ virt->addr ] = thisp->freeitem; + thisp->freeitem = virt->addr; + } /* now dictionary item is released */ + if (t2+M[ t2 ]-1 == thisp->lastused) /* on the boundary */ + thisp->lastused = t2-1; + else sinsert(t2); + } +} /* end disp */ + + +word memavail() /* Compute available memory size */ +{ + word t1, t2, avail; + + avail = thisp->lastitem-thisp->lastused-1; /* contiguos memory */ + t1 = thisp->headk2; /* go through killed 2 list */ + while (t1 != 0) + { + avail += 2; + t1 = M[ t1+SHORTLINK ]; + } + t1 = thisp->headk; + while (t1 != thisp->lower) /* go through killed object list */ + { + t2 = t1; + while (t2 != 0) + { + avail += M[ t2 ]; + t2 = M[ t2+SHORTLINK ]; + } + t1 = M[ t1+LONGLINK ]; + } + t1 = thisp->freeitem; /* go through free item list */ + while (t1 != 0) + { + avail += 2; + t1 = M[ t1 ]; + } + return(avail); +} /* end memavail */ diff --git a/sources/new-s5r4/memory.o b/sources/new-s5r4/memory.o new file mode 100644 index 0000000000000000000000000000000000000000..2f9b06ccc2c00bd57dffd9d012c63bdba88278e3 GIT binary patch literal 3536 zcmb7{ZD?Cn7{_muyX~$fHpOl_ofBbYx)&{Tpi!q?@s3idL}w;rXja-dD_K|5d$)?o z)-D@(cFD*G{U(T@U;HA9(+T2S9mW-3TAU~Y#eu_wTQFcg1dNOS=bWd>O_!mDZohNR zJv~jgoJ9?!3#g0OuR;y*s>v^+8 zdotTeUbF6gOU}-GPOxq(%wU&X%1_B9tU?0EX=>wSO0#x2X24m6CCwQ~2}3?`q5-E} z%w_|x%XRfM&@TE@#UHVfYyLD8BquXpUKKr!g#l~&Tn^`jjiVEbM)qXVCC$FI&<*3* z8aLq8=-%#~<#N&_n`a-sz>pY6(07{t6kNX$NIhQ}xOcy_1{zEGKGA&&W2IJF>M=QAum3=uw8N4og~e^0-yhn^da8ozLnrRIFHr z%h{6>Ykf+EY}x+QVwY`{UDj1N`&X^z2Ak~rzy0Oa|L>SY$f`4 zC9FnlNh*XQY4Uu~5CNIBo}I!*(PN80YJ{WJ)N*${sX!*{`Bu@&>+&kCnN{~YdQKO? zQmr9p4Pu#%|GM`%vGD8{o`}i&7xjUPYteO?bk%1+?0wp(avfE!Qrmoc7$PU{h+{I( zDq?&;RQO7F*VHX2?v>l>b8kJfdg^}^Ec(A}k6+)GXr)ER>8j(rTI(M4Q7^-BpZDG` zo<*nDt&#D@xgDp-rIu%_UaL^AHDcIwMqcJemTadAM-(xdfXm(*?XQW!vRanqix8mrHM_&z-jslhSw^NC zJ=n+@zZt4--YdW=Dcew~W)#%x{^$Geh`BMEklyvM0jx6U_H{{bT0$%wL$lF+(t# z^sEL+&z;PBLGpXMVsMDpE#@@yO_1c@zT(#bUAjV|INZ zHmu3<(6BZ7{L8VSMB?D#_=pxu#$U4I6P6Z>CzBJS`^Sb7TFiQ3bYk4QU5gEBv5C>K UiFgt_N95B3@dHDLhDHappetite, &t1, addr); + M[ *addr+PROTNUM ] = prot; + virt->addr = t1; + virt->mark = M[ t1+1 ]; +} /* end openrc */ + + +void slopen(prot, sladr, ah, am) +word prot; +virtaddr *sladr; +word *ah, *am; +{ + word t1, t2, virts; + + virts = thisp->prochead+M[ thisp->prochead ]+VIRTSC; + storevirt(*sladr, virts); /* preserve for compactifier */ + t1 = prototype[ prot ]->appetite; + + request(t1, ah, am); /* open field */ + + M[ *am+PROTNUM ] = prot; + t1 = *am+t1; /* LWA+1 of object */ + M[ t1+SL ] = M[ virts ]; /* prepare SL pointer */ + M[ t1+SL+1 ] = M[ virts+1 ]; + t2 = M[ display2+M[ c1+PROTNUM ] ]; /* ah of current */ + M[ t1+DL ] = t2; + M[ t1+DL+1 ] = M[ t2+1 ]; + +} /* end slopen */ + + +void openobj(prot, ah, am) +word prot; +word *ah, *am; +{ + virtaddr v1; + word t1; + + t1 = M[ display2+prototype[ prot ]->slprototype ]; + v1.addr = t1; /* ah of SL */ + v1.mark = M[ t1+1 ]; + slopen(prot, &v1, ah, am); +} /* end openobj */ + + +void newarry(low, up, kind, virt, am) /* Reserve room for array */ +word low, up, kind; +virtaddr *virt; +word *am; +{ + word ap; + + switch ((int) kind) + { + case AINT : ap = APINT; break; + case AREAL : ap = APREAL; break; + case AVIRT : ap = APREF; break; + case APROCESS : ap = APINT; break; + } + low *= ap; + up *= ap; + if (up < low) errsignal(RTEILLAB); /* illegal array bounds */ + low -= 3; + request(up-low+ap, &virt->addr, am); + M[ *am+1 ] = kind; + M[ *am+2 ] = low; + virt->mark = M[ virt->addr+1 ]; +} /* end newarry */ + + +void gkill(virt) /* Generalized killer */ +virtaddr *virt; +{ + word t1, t2, t3; + virtaddr vt; + protdescr *ptr; + message msg; + + if (isprocess(virt)) /* kill remote process */ + { + msg.control.type = KILLPR; + obj2mess( M, virt, &msg.control.receiver ); + sendmsg1( &msg);/* send remote kill request */ + } + else + if (virt->mark == M[ virt->addr+1 ]) + { + t1 = M[ virt->addr ]; /* am */ + t2 = M[ t1+PROTNUM ]; + if (t2 == AINT || t2 == AREAL || t2 == AVIRT) + disp(virt); /* simple kill for array */ + else + if (t2 == FILEOBJECT) + { /* First close file if opened */ + if (M[ t1+FSTAT ] != UNKNOWN) + if (fclose(MF(t1+FFILE))) errsignal(RTEILLIO); + /* Delete file if temporary */ + if (M[ t1+FTEMP ] == LTRUE) + if (unlink(MN(t1+FNAME))) errsignal(RTEILLIO); + free(MN(t1+FNAME)); + disp(virt); + } + else /* more than array or file */ + { + ptr = prototype[ t2 ]; + if (ptr->kind == RECORD) + disp(virt); + else + { + t3 = t1; + do + { + t3 += M[ t3 ]; /* LWA of object */ + if (M[ t3+STATSL ] != 0) errsignal(RTEILLKL); + t3 = M[ t3+DL ]; /* next object in DL */ + if (t3 == 0) errsignal(RTEILLKL); + t3 = M[ t3 ]; /* am of DL */ + } while (t3 != t1); + do /* kill DL chain */ + { + t3 += M[ t3 ]; + loadvirt(vt, t3+DL); + disp(virt); + virt->addr = vt.addr; + virt->mark = vt.mark; + t3 = M[ virt->addr ]; + } while (M[ virt->addr+1 ] == virt->mark); + } + } + } +} /* end gkill */ + + +/* Copy object to a new object and locate it by fresh. + */ + +void copy(old, fresh) +virtaddr *old, *fresh; +{ + word t1, t2, t3, virts; + protdescr *ptr; + bool notrecord; + + if (M[ old->addr+1 ] != old->mark) + { /* fine copy for none */ + fresh->addr = 0; + fresh->mark = 0; /* note M[ 1 ] <> 0 */ + } + else /* not none */ + { + t1 = M[ old->addr ]; /* am of old */ + notrecord = FALSE; /* assume it is a record */ + t2 = M[ t1+PROTNUM ]; + if (t2 != AINT && t2 != AREAL && t2 != AVIRT && t2 != FILEOBJECT) + { /* if not array nor file */ + ptr = prototype[ t2 ]; + if (ptr->kind != RECORD) /* our assumption was wrong */ + { + notrecord = TRUE; + t3 = t1+M[ t1 ]+DL; + if (M[ t3 ] != old->addr || M[ t3+1 ] != old->mark) + errsignal(RTEILLCP); /* non-terminated object */ + } + } + virts = thisp->prochead+M[ thisp->prochead ]+VIRTSC; + storevirt(*old, virts); /* preserve for compactification */ + request(M[ t1 ], &t2, &t3); /* book field */ + fresh->addr = t2; /* ah */ + fresh->mark = M[ fresh->addr+1 ]; + t1 = M[ M[ virts ] ]; + for (t2 = 1; t2 < M[ t1 ]; t2++ ) + M[ t3+t2 ] = M[ t1+t2 ]; + if (notrecord) + { + storevirt(*fresh, t3+M[ t3 ]+DL); /* loop up DL */ + M[ t3+M[ t3 ]+STATSL ] = 0; /* not in any SL chain */ + } + } +} /* end copy */ diff --git a/sources/new-s5r4/object.o b/sources/new-s5r4/object.o new file mode 100644 index 0000000000000000000000000000000000000000..5db9c9690d606fe9297ce5f11c3111550cb6ab08 GIT binary patch literal 3978 zcma)9eP~-%6n{;gTkKw!tY&VOP7oP_bLz&>RR-3w=XW7a|lDH|4an`P!Yx|RyKqcM1=_xnfhvqbeL_?y{-PveJ3w3ZK6KN`<-*o zx#ymHKJI;4+@xt=Hf!D!0#DBm0T<)qm)wjl%}A_ZIx%U6WHe6_*%gY}XXobTa$g#d z%7{2!a3$h&@EX!6#B_05#zP_^O+&^V52p&z0x5{8V2e`RqKhfHOhA7oF)?2IsP!Y; zw!TZ6a=CiH`U*gtEEorTgD=rwP;V}blti{9&5|%@r8z536m-8@w;^v3?SZ*Q!Y6e| zYqlv&N19P=J%XPTvwy$Jn~wg+rla!CrYz<V(5=_4P|KCCWY*#J zqLC{*nFoq-Ram+5)y$e)c`mc4xS0kfO{WQkQ@oqYuEO6^<*5^jE2_NGU(CErgu=%X zj!1-L!f+|<*61)p`t-@|mSpodGjy(KM6+J_fv`%WiXt;2M(MzO8BrRg4&XqBaeSC0#x?7EsLQ-O7)HirDj+RMOHr2K<*-4G8P5)Wj1GRR1Z8vG!?#w!8 zeogm<$3BK4bzpexs7qZ9kGN5MV1WK)@@i-M(C%7RXW(y+@ z-`(?yuRA35Ku1${oj=>v0;J0U@oDXd>Di^l>;2_1VAvg(RPx-t{@*VMyf%8%u*;xam@hyxy8TT_DWIPHCLGM%MCxF+2|Caeb z7!7z%_Es}K3Z(V607-v4kH5@#FA3p?1tfo-2h#kv7(Zt`3tS5MHBch?5?~m78!!Si zd3-11%Z#4@mqGqJ^C3*8`OEQY#rSGsfSY*yDaJnFbr|2n^4EC$Z6I>d@;;F4eg%YU z#u?`IMXvoD8Sem+{rj0uFrQ-n7~^-0mlziznPh)05T=cX7!NX@Wu&B#d=rrT=wW_8 z<6*`LAo+0$h^fXDt&H7_+kgmN%L~lE$#|4;lJPv_BK!{{I~y6FV9YX( zGk(Ab+hkuoh_^?t1`RvvS&KKyOFbKX^nE^hGicI(3BO12tLSg_(U1G+9?+!Ui8>r$ z`XkV3pUyrWKaIfVedFUk`k;?K;-f$G(R9~T{Q1mB9|x^`Mnb*<-PhZ@-s&CRJ<>mz z+;O{RSytar)*G;THEVbzIg|p9q=qxYnbDD?W~GwPWs~WQW_4>;dXN+}E3>mdJ)&8? z>ojWzsKK7m_3qr^?E{)Ml-$#kN{wn(GL=gA_YL(7YF6K_{y_kgQ^UQ>t_%K9vO5J3KO~{R1q3nSKBO literal 0 HcmV?d00001 diff --git a/sources/new-s5r4/os2graf2.c b/sources/new-s5r4/os2graf2.c new file mode 100644 index 0000000..ad066da --- /dev/null +++ b/sources/new-s5r4/os2graf2.c @@ -0,0 +1,3 @@ + case INKEY : + param[ 0 ].xword = inkey(NULL); + break; diff --git a/sources/new-s5r4/procaddr.c b/sources/new-s5r4/procaddr.c new file mode 100644 index 0000000..99de683 --- /dev/null +++ b/sources/new-s5r4/procaddr.c @@ -0,0 +1,212 @@ +#include "depend.h" +#include "genint.h" +#include "int.h" +#include "process.h" +#include "intproto.h" + +#include + +#define ldnode(addr) ((word) (addr & 0xFF)) +#define ldpix(addr) ((word) ((addr >> 8) & 0xFF)) +#define staddr(node, pix) ((word) ((pix << 8) | node)) + + +/* + These are converters from global to process pointers in memory + to global process pointers in message. + M denotes memory in which pair (pointer,object) exists or has to exist. + We want to create object denoting remote process instead of + dummy pointer without object. + The object will be like an arrayof integer of size 2. + arr[1..3] : arr[1]=node, arr[2]=pix. +*/ + +void obj2mess(M,obj,mess) + word *M; + virtaddr *obj; + procaddr *mess; +{ +#ifdef OBJECTADDR + word am; + if( obj->mark != M[obj->addr+1] ){ + mess->node=-1; + mess->pix =-1; + mess->mark=-1; + }else{ + am=M[obj->addr]; + mess->node=M[am+2]; + mess->pix =M[am+3]; + mess->mark=M[am+4]; + } +#else + mess->node=ldnode(obj->addr); + mess->pix =ldpix (obj->addr); + mess->mark=obj->mark; +#endif +} + +void mess2obj(p,mess,obj) + procdescr *p; + procaddr *mess; + virtaddr *obj; +{ + +#ifdef OBJECTADDR + + word am; + word *currM=M; + word currpix=thispix; + + extern int compactify_allowed; + compactify_allowed=0; + transfer(p-process); + hash_find(mess,obj); +/* + newarry(1,4,APROCESS,obj,&am); + M[am+2]=mess->node; + M[am+3]=mess->pix; + M[am+4]=mess->mark; +*/ + transfer(currpix); + M=currM; + + compactify_allowed=1; + +#else + obj->addr=staddr(mess->node,mess->pix); + obj->mark=mess->mark; + +#endif + +} + + + +bool isprocess(v) virtaddr *v; { + +#ifdef OBJECTADDR + + word am=M[v->addr]; +/* assert(v->mark<=M[v->addr+1]);*/ + if( v->mark!=M[v->addr+1] ) return 0; + else return ( M[am+1]==APROCESS ); + +#else + + return ( v->mark < 0 ); + +#endif + +} + + + +#ifdef OBJECTADDR + +/* hash entry is a word pointing to dictionary or 0 if empty */ + +#ifndef NO_PROTOTYPES +static int hash_check_item( word, procaddr * ); +static void hash_new_item( virtaddr *, procaddr * ); +static int hash_mess( procaddr * ); +static int hash_2( int ); +#else +static int hash_check_item(); +static void hash_new_item(); +#endif + +void hash_create(p,size) procdescr *p; int size;{ + /* create hash table for p process */ + int i; + if( p->hash!=NULL ) free( p->hash ); + p->hash_size = size; + p->hash = mallocate(size); + if( p->hash==NULL ) errsignal(RTEMEMOV); + for( i=0; ihash_size; i++ ) p->hash[i]=0; +} + + +/* find pointer in hash table, add if not exists */ + +void hash_find(mess,obj) procaddr *mess; virtaddr *obj; { + int i,first,jump; + word am; + first=hash_mess( mess ); + jump=hash_2(first); + for( i=first; thisp->hash[i]!=0; ){ + if( hash_check_item(thisp->hash[i],mess) ){ + obj->addr=thisp->hash[i]; + obj->mark=M[thisp->hash[i]+1]; + return; + } + i=(i+jump)%thisp->hash_size; + if( i==first ){ + int *curhash=thisp->hash; + int cursize=thisp->hash_size; +errsignal(RTEMEMOV); /* the rest is not debugged yet */ + thisp->hash_size = cursize*3-1; + thisp->hash = mallocate(thisp->hash_size); + if( thisp->hash==NULL ) errsignal(RTEMEMOV); + for( i=0; ihash_size; i++ ) thisp->hash[i]=0; + for( i=0; iaddr ); + return; + } + } + /* not exists yet */ + hash_new_item( obj, mess ); + thisp->hash[i]=obj->addr; +} + +void hash_set(mess,ah) procaddr *mess; word ah;{ + int i,first,jump; + word am; + first=hash_mess( mess ); + jump=hash_2(first); + for( i=first; thisp->hash[i]!=0; ){ + assert( !hash_check_item(thisp->hash[i],mess) ); + i=(i+jump)%thisp->hash_size; + if( i==first ) errsignal(RTEMEMOV); + } + /* not exists yet */ + assert( thisp->hash[i]==0 ); + thisp->hash[i]=ah; +} + +#endif + + +static int hash_check_item( ah, mess ) word ah; procaddr *mess; { + word am=M[ah]; + return ( mess->node==M[am+2] && mess->pix==M[am+3] && mess->mark==M[am+4] ); +} + +static void hash_new_item( obj, mess ) virtaddr *obj; procaddr *mess; { + word am; + newarry(1,4,APROCESS,obj,&am); + M[am+2]=mess->node; + M[am+3]=mess->pix; + M[am+4]=mess->mark; +} + +static int hash_mess( mess ) procaddr *mess;{ + word hash=mess->pix; + hash *= abs( mess->mark ); + hash += mess->node; + return hash % (thisp->hash_size); +} + +static int hash_2( hash_1 ) int hash_1;{ + return thisp->hash_size -2 - ( hash_1 % ( thisp->hash_size -2 ) ); +} + diff --git a/sources/new-s5r4/procaddr.o b/sources/new-s5r4/procaddr.o new file mode 100644 index 0000000000000000000000000000000000000000..12962206e28c185b4e31cfc72c0af851d56160de GIT binary patch literal 3594 zcma)8U2GIp6rSyFVOj>dK-HK)Qlkx^h|mW@Ng)k!43;!mic2K849j-PZY^!uA1Voi z%BBz3$x34&kp~hDzL}^b2EhliEsbpelU4{8eE|QGsoO*`m2PFBe&^1e?JV6jPSSqo zo_qf8Ip^N93tf^lSs~@W8m#FX73gQbB_}!~vhyM%qQb;KMfM!IU$G&b*>0aPv(=_7G}Ig$OnI!L4Z1DeZ5}q5+?=aAovyk# z%0@Glb2^35iG1ONa`Ms;`He55n)MUiV%~iu&W|7!);|JfJN1gs)EDwhur#7)CrNtF zM5402%KXGq?H^Wi*yN4i&((7iCl+Pu^8t}JM`IYhWNX;tC8b$4m-!|yX%R)^U%Pu3 z?D)(-P-fJNrJ0&F)U40kw;<1$0)weJEBEs}CL6p`V)?}TWs+3rknEPwK?PgP29HQY zUpgM5=I0eKnse-WN;yZTFh1bvQ7Rc4=Rfxym(S4ym2A6b;srY})Z4928H>sC+3Cwv z5`MjM^=h`N?+O~wik4T9`6tE7k~2}5MLAwmaVC@9WOrP5Tw|%jv+N72zz&rb^B7O5 zj6(B}tXgvk(J;K)7aww?cD04^V)eGS@=w9MiVqeRAm2bZp?ShP@hML1kZ|_D;h#)4 zlu7ZPCzyt(jH&mEFpFLs1H!+i)LXukde17o&%FH)ollu>0z$WZ<}_l$yMTV3cmvO& zBfNgXK+jRe*n(qpkTQg^f~6l`sct_w-EvCXxK%{6Vo zNQd596O6_5Xgt!@S+l=3wyIJp)ZVgXyWp;XZdgfUY23Hx!{g}A@CC5KkBO?lbvIv}p;~z}x9&vHDqIQQ z^gh7fDmVyVEcEv^H(>iKp^y47#rx#rg$S+rK+jkH85d6oHEnJK9$3Zsny~BcmGCd6 zcF63yv8;Z1Vn;~{1rjYDh^#It;w2FoBITD{u*%YzC649;X#}zbQCsn*)Ev56_O<8Q zJ?$>@t7*z%wexx~dlogxY=qqN=dZ}DYErCy{MNwxSWLhx1Y|aE+S~IU??2{{KWiki z#t{!opxvgBJ1+e-d~fNOoq#x*Eb{?QQ|zXhatj|n^{a0!05lbzQE?i4r#dd{*zjpim-iARH-u{J#_ zX?)(cMLMyIL2K_@Q#h&z + + +/* Process management */ + +procdescr process[ MAXPROCESS ]; /* process descriptor table */ +procdescr *thisp; /* pointer to current process descr */ +word thispix; /* current process index */ +queue ready; /* Round-Robin queue */ +bool network; /* TRUE if operating in network */ +message globmsgqueue[ MAXMSGQUEUE ]; /* queue of waiting messages */ +int msgready = 0; /* number of waiting messages */ +int msghead = 0, msgtail = 0; /* pointers to message queue */ +word ournode; /* this machine node number */ +word console; /* console node number */ +bool remote = FALSE; /* TRUE if remote node */ +bool reschedule = TRUE; /* TRUE if must re-schedule */ + + + +#ifndef NO_PROTOTYPES +static void ansprot(message *); +static void localkill(message *); +void transfer(word); +static void backcreate(message *); +static void createprocess(message *); +static void localerror(message *); +static void killprocess(word); +static void mkglobal(word); +word pix, ref; +#else +static void ansprot(); +static void localkill(); +void transfer(); +static void backcreate(); +static void createprocess(); +static void localerror(); +static void killprocess(); +static void mkglobal(); +#endif + + + +#if OS2 +PGINFOSEG ginf; /* pointer to Global Info Segment */ +#endif + + +#if USE_ALARM +# include +# ifndef NO_PROTOTYPES + static void signal_catch( void ); +# else + static void signal_catch(); +# endif + static void signal_catch(){ reschedule=TRUE; } +#endif + + +void init_scheduler(){ +#if USE_ALARM + signal(SIGALRM,signal_catch); + alarm(1); +#endif +} + +void schedule() /* Choose next ready process to exec */ +{ /* STRONGLY machine dependent */ +#if USE_ALARM + if(reschedule){ + alarm(0); + signal(SIGALRM,signal_catch); + alarm(1); +#elif USE_CLOCK + static char last; + char c; + c = clock() >> 5; /* the most expensive method */ + if (reschedule || c != last) /* context switch is needed */ + { + last = c; +#elif MSDOS && ( WORD_16BIT || DWORD_16BIT ) /* DOS real memory model */ + static char last; + char c; + static char *clk = (char *) 0x0040006CL; + c = *clk >> 1; + if (reschedule || c != last) /* context switch is needed */ + { + last = c; +#elif OS2 + static char last; + char c; + c = ginf->hundredths >> 3; + if (reschedule || c != last) /* context switch is needed */ + { + last = c; +#else +#error Scheduler time counting method not implemented ! +#endif + +#if TCPIP + while (qempty(ready)){ /* wait for event if no processes */ + tcpip_poll( -1 ); /* wait for message until arrives */ + trapmsg(); + } +#else + while (qempty(ready)) /* wait for event if no processes */ + trapmsg(); +#endif + ready = qrotate(ready); /* find another ready process */ + transfer(pfront(ready)); /* transfer control to it */ + reschedule = FALSE; + } +} + + +void transfer(pix) /* Context switch to another process */ +word pix; +{ + word apt; + if (pix == thispix) return; /* optimized for case of one process */ + + if( thisp != NULL ) /* previous process is alive */ + { + thisp->ic = ic; /* store previous context */ + thisp->c1 = c1; + thisp->c2 = c2; + } + thispix = pix; /* and load new context */ + thisp = &process[ thispix ]; + ic = thisp->ic; + c1 = thisp->c1; + c2 = thisp->c2; + M = thisp->M; + param = thisp->param; + apt = thisp->prochead+M[ thisp->prochead ]; + display = apt+dispoff; + display2 = apt+disp2off; +} + + +void activate(pix) /* Resume process on this node */ +word pix; +{ + process[ pix ].status = EXECUTING; /* flag process as ready to execute */ + ready = pinsert(ready, pix); /* insert into ready queue */ + reschedule = TRUE; /* force context switch */ +# ifdef RPCDBG + fprintf(stderr,"activate process %d\n",pix); +# endif +} + + +void passivate(newstatus) /* Passivate process */ +int newstatus; +{ + thisp->status = newstatus; /* change to some wait status */ + ready = qremove(ready); /* remove from ready queue */ + reschedule = TRUE; /* force context switch */ +# ifdef RPCDBG + fprintf(stderr,"passivate process %d to state %d\n",thispix,newstatus); +# endif +} + + +/* Copy parameters from object to message or vice versa. */ + + +void moveparams(pix, am, msg, par1, dir) + word pix, am; + message *msg; + int par1, dir; +{ + protdescr *ptr; + procdescr *p; + word i, tpd, ap, pd, prim, offset; + char *cp; + bool cflag, convert; + + p = &process[ pix ]; + ptr = prototype[ p->M[ am+PROTNUM ] ]; + cp = (char *) msg->params; + + for (i = 0; i < ptr->lthparlist; i++) /* loop through parameters */ + { + + offset = M[ ptr->parlist+i ]; + tpd = M[ ptr->pfdescr+i ]; /* type description of param */ + pd = M[ tpd ]; + + if (par1 == PARIN) + cflag = ( pd==PARIN || pd==PARINOUT || pd==FORMFUNC || pd==FORMPROC ); + else + cflag = ( pd==PAROUT || pd==PARINOUT ); + + if (cflag) + { + if (pd == FORMFUNC || pd == FORMPROC) + { + ap = APFMPROC; + convert = TRUE; + } + else + if (M[ M[ tpd+2 ] ] == CLASSTYPE) + { + ap = APREF; + convert = TRUE; + } + else + { + prim = M[ tpd+2 ]-ipradr; + ap = primapet[ prim ]; + convert = (prim == 4 || prim == 5); /* process or coroutine */ + } + + ap *= sizeof(word); /* param appetite in bytes */ + + switch (dir) /* copy parameter in right direction */ + { + + case LOADPAR : + + /* we always load parameters from OUR process */ + assert(pix==thispix); + + if (convert){ + procaddr pa; + { + word ah=M[am+offset]; + if( !isprocess((virtaddr*)(M+am+offset)) && + M[ ah+1 ] == M[ am+offset+1 ] + ) + if (prototype[ M[ M[ ah ]+PROTNUM ] ]->kind == PROCESS) + { + pa.node = ournode; + pa.pix = pix; + pa.mark = thisp->mark; + } + else + /*pat errsignal(RTENONGL); */ /* only process may be global */ + /*pat*/ obj2mess(p->M,(virtaddr*)(p->M+am+offset),&pa); + else + obj2mess(M,(virtaddr*)(M+am+offset),&pa); + } +/* + mkglobal(am+offset); + obj2mess(p->M,(virtaddr*)(p->M+am+offset),&pa); +*/ + moveblock((char *)&pa, cp, ap=sizeof(procaddr)); + }else + moveblock((char *) &p->M[ am+offset ], cp, ap); + break; + + + case SAVEPAR : + + if (convert){ + procaddr pa; + ap=sizeof(procaddr); + moveblock(cp,(char *)&pa, ap); + mess2obj(p,&pa,(virtaddr*)(p->M+am+offset)); + }else + moveblock(cp, (char *) &p->M[ am+offset ], ap); + break; + + } + + cp += ap; + assert(cp-msg->params <= sizeof(msg->params)); + } + } +} + + +word getnode(am) /* Determine node number for process */ +word am; +{ + protdescr *ptr; + word p; + int i; + + p = prototype[ M[ am+PROTNUM ] ]->preflist; + while (prototype[ M[ p ] ]->kind != PROCESS) p++; + ptr = prototype[ M[ p ] ]; + if (ptr->lthpreflist == 1) i = 0; + else i = prototype[ M[ p-1 ] ]->lthparlist; + return (M[ am+M[ ptr->parlist+i ] ]); +} + + +void resume(virt) /* Perform RESUME instruction */ +virtaddr *virt; +{ + message msg; + + if (isprocess(virt)) /* is it process realy ? */ + { + msg.control.type = RESUME; + obj2mess( M, virt, &msg.control.receiver ); + sendmsg1( &msg); /* request remote resume */ + } + else errsignal(RTEILLRS); /* illegal RESUME */ +} + + +static void createprocess(msg) /* Create new process */ +message *msg; +{ + word i, prot; + for (i = 0; i < MAXPROCESS; i++) /* find unused process descr. */ + if (!process[ i ].used && process[ i ].mark != -MAXMARKER) break; + if (i == MAXPROCESS) senderr(RTETMPRC, &(msg->control.sender) ); + if (process[ i ].M == NULL) /* memory not allocated yet */ + { + process[ i ].M = mallocate(memorysize+1); + if (process[ i ].M == NULL) senderr(RTEMEMOV, &msg->control.sender); + moveblock((char *) process[ 0 ].M, (char *) process[ i ].M, + freem * sizeof(word)); + } + prot = msg->control.par; /* process prototype number */ + initprocess(i, prot, &msg->control.sender); + moveparams(i, process[ i ].prochead, msg, PARIN, SAVEPAR); + process[ i ].status = GENERATING; /* execute process until RETURN */ + ready = pinsert(ready, i); + reschedule = TRUE; +} + + +static void killprocess(pix) /* Release process descriptor */ +word pix; +{ + qfree(process[ pix ].msgqueue); + qfree(process[ pix ].rpcwait); + sfree(process[ pix ].rpcmask); + + process[ pix ].used = FALSE; /* mark descriptor as unused */ + process[ pix ].mark--; /* decrement marker */ + + if( pix == thispix ) + { + thispix = -1; + thisp = NULL; + } +} + + +static void localkill(msg) +message *msg; +{ + word pix; + + pix = msg->control.receiver.pix; + +# if RPCDBG + fprintf( stderr, "kill process %d\n", pix ); +# endif + + if (process[ pix ].mark == msg->control.receiver.mark) /* not none */ + { + if (process[ pix ].status != STOPPED) /* is process suspended ? */ + senderr(RTEILLKL, &msg->control.sender); + killprocess(pix); + } +} + + +void endprocess(status) /* Terminate current process */ +int status; +{ + int i; + + passivate(STOPPED); +# if RPCDBG + fprintf( stderr, "terminate process %d\n", thispix ); +# endif + killprocess(thispix); + if( ournode != console ) longjmp(contenv, 1); + for (i = 0; i < MAXPROCESS; i++) + if (process[ i ].used) longjmp(contenv, 1); + endrun(status); +} + + +static void backcreate(msg) +message *msg; +{ + word pix, am; + procdescr *p; + + pix = msg->control.receiver.pix; + p = &process[ pix ]; + + am = p->M[ p->template.addr ]; /* template physical address */ + p->M[ temporary ] = am; + moveparams(pix, am, msg, PAROUT, SAVEPAR); + + /*store new process address */ + mess2obj(p,&(msg->control.sender),&(p->backobj)); + + activate(pix); /* end of waiting for NEW */ +} + + +void senderr(exception, virt) +int exception; +procaddr *virt; +{ + message msg; + + msg.control.type = ERRSIG; + msg.control.receiver=*virt; + msg.control.par = exception; + sendmsg1(&msg); /* send error message */ + longjmp(contenv, 1); /* continue from next instruction */ +} + + +static void localerror(msg) +message *msg; +{ + word pix; + int s; + + pix = msg->control.receiver.pix; + s = process[ pix ].status; + if (process[ pix ].mark == msg->control.receiver.mark && s != STOPPED) + { + if (s == WAITFORNEW || s == WAITFORRPC) activate(pix); + while (pfront(ready) != pix) + ready = qrotate(ready); + transfer(pfront(ready)); + errsignal(msg->control.par); + } +} + + +void askprot(virt) /* Ask for prototype of object */ +virtaddr *virt; +{ + word am; + message msg; + + if (isprocess(virt)) /* send question to remote process */ + { + obj2mess( M, virt, &msg.control.receiver ); + msg.control.type = ASKPRO; + sendmsg1( &msg ); + passivate(WAITASKPRO); + } + else + { + if (member(virt, &am)) + M[ temporary ] = M[ am+PROTNUM ]; + else errsignal(RTEREFTN); + } +} + + +static void ansprot(msg) /* Answer with prototype of process */ +message *msg; +{ + message msg1; + word pix; + + pix = msg->control.receiver.pix; + if (process[ pix ].mark == msg->control.receiver.mark) /* not none */ + { + msg1.control.receiver = msg->control.sender; + msg1.control.type = PROACK; + msg1.control.par = process[ pix ].prot; + sendmsg1( &msg1 ); + } + else senderr(RTEREFTN, &msg->control.sender); +} + + +/* Message send/receive handling : */ + +void msginterrupt(msg) /* Receive message interrupt handler */ + message *msg; +{ + moveblock((char *)msg, (char *)&globmsgqueue[ msgtail ], + (word) sizeof(message)); + msgtail = (msgtail+1) % MAXMSGQUEUE; + msgready++; +#if DLINK + if (msgready < MAXMSGQUEUE-1) /* leave one place for own message */ + net_attention(); +#endif +} + + +void sendmsg1(msg) /* Send message via net */ +message *msg; +{ + msg->control.sender.node = ournode; + msg->control.sender.pix = thispix; + msg->control.sender.mark = thisp->mark; + if( + msg->control.receiver.node == ournode + || + msg->control.receiver.node == 0 + ) + /* simulate receive message interrupt */ + { +#if DLINK + net_ignore(); /* disable attention */ +#endif + msg->control.receiver.node == ournode; + msginterrupt(msg); /* call directly interrupt handler */ + } + else + { +#if DLINK + if (!network) errsignal(RTEINVND); /* send message by net */ + while (net_send((int) msg->control.receiver.node, msg)) ; +#elif TCPIP + if (!network) errsignal(RTEINVND); /* send message by net */ + tcpip_send( msg ); +#else + errsignal(RTEINVND); +#endif + } +} + + +void trapmsg() /* Check for waiting message */ +{ + message *msg; + procdescr *p; + word pix; + +#if TCPIP + /* check for message on TCPIP socket & move to queue */ + if (msgready < MAXMSGQUEUE-1) /* there is place for new message */ + if( tcpip_poll( 0 ) ) /* check for message */ + if ( tcpip_recv( globmsgqueue + msgtail ) ){ + msgtail = (msgtail+1) % MAXMSGQUEUE; + msgready++; + } +#endif + + if (msgready > 0) /* at least one message is waiting */ + { +#if DLINK + net_ignore(); /* disable attention for a moment */ +#endif + msg = &globmsgqueue[ msghead ]; /* get first message from queue */ + msghead = (msghead+1) % MAXMSGQUEUE; +#ifdef RPCDBG + printf("Received message %d\n",msg->control.type); + fflush(stdout); +#endif + switch(msg->control.type) + { + case ERRSIG : + localerror(msg); + break; + + case RESUME : + pix = msg->control.receiver.pix; + if (process[ pix ].mark != msg->control.receiver.mark) + senderr(RTEREFTN, &msg->control.sender); + if (process[ pix ].status != STOPPED) + senderr(RTEILLRS, &msg->control.sender); + activate(pix); + break; + + case CREATE : + createprocess(msg); + break; + + case CREACK : + backcreate(msg); + break; + + case KILLPR : + localkill(msg); + break; + + case RPCALL : + rpc1(msg); + break; + + case RPCACK : + rpcend(msg); + break; + + case ASKPRO : + ansprot(msg); + break; + + case PROACK : + pix = msg->control.receiver.pix; + p = &process[ pix ]; + p->M[ temporary ] = msg->control.par; + activate(pix); + break; + + default : + fprintf( stderr, " Invalid message\n" ); + senderr(RTESYSER, &msg->control.sender); + } + msgready--; +#if DLINK + if (msgready < MAXMSGQUEUE-1) /* leave one place for own message */ + net_attention(); /* attention back on */ +#endif + } +} + + +static void mkglobal(ref) /* Make global a process reference */ + word ref; +{ + word ah; + ah = M[ ref ]; + if (!isprocess((virtaddr*)(M+ref)) && M[ ah+1 ] == M[ ref+1 ]) + if (prototype[ M[ M[ ah ]+PROTNUM ] ]->kind == PROCESS) + { + virtaddr va; + procaddr pa; + pa.node = ournode; + pa.pix = pix; + pa.mark = thisp->mark; + mess2obj(thisp,&pa,&va); + M[ ref ] = va.addr; + M[ ref+1 ] = va.mark; +#ifdef RPCDBG +fprintf(stderr,"mkglobal REAL (thisp=%d) isprocess:node=%d pix=%d mark=%d\n",thispix,pa.node,pa.pix,pa.mark);fflush(stderr); +#endif + } + else errsignal(RTENONGL); /* only process may be global */ +} + + + +/* +void show_m( char *s, message *msg ){ + char *n; + switch(msg->control.type) + { + case ERRSIG : n = "ERRSIG"; break; + case RESUME : n = "RESUME"; break; + case CREATE : n = "CREATE"; break; + case CREACK : n = "CREACK"; break; + case KILLPR : n = "KILLPR"; break; + case RPCALL : n = "RPCALL"; break; + case RPCACK : n = "RPCACK"; break; + case ASKPRO : n = "ASKPRO"; break; + case PROACK : n = "PROACK"; break; + default : n = "??????"; break; + } +#ifdef RPCDBG + printf( "message %s type %s from %d:%d:%d to %d:%d:%d\n", + s, n, + msg->control.sender.node, + msg->control.sender.pix, + msg->control.sender.mark, + msg->control.receiver.node, + msg->control.receiver.pix, + msg->control.receiver.mark + ); + fflush( stdout ); +#endif +} +*/ + diff --git a/sources/new-s5r4/process.h b/sources/new-s5r4/process.h new file mode 100644 index 0000000..c7e59c2 --- /dev/null +++ b/sources/new-s5r4/process.h @@ -0,0 +1,137 @@ +#include "queue.h" + + +/* Process management definitions : */ + +#define MAXPROCESS 64 /* maximum number of processes on one node */ +#define MAXMSGQUEUE 16 /* maximum number of waiting messages */ + +#if DLINK +#define MSGLENGTH 80 /* message length defined by D-Link driver */ +#elif TCPIP +#define MSGLENGTH 256 /* message length defined by me (PS) */ +#else +#define MSGLENGTH 256 /* message length defined by me (PS) */ +#endif + + +/* Process state : */ + +#define GENERATING 0 /* during generation of process object */ +#define STOPPED 1 /* non-active process (suspended by STOP) */ +#define EXECUTING 2 /* active process (ready to execute) */ +#define WAITFORNEW 3 /* waiting for NEW of another process */ +#define WAITFORRPC 4 /* waiting for remote procedure call */ +#define ACCEPTING 5 /* during execution of ACCEPT statement */ +#define WAITASKPRO 6 /* waiting for process prototype */ + +/* Process descriptor : */ + +typedef struct +{ + bool used; /* TRUE if in use by some process */ + word mark; /* process mark for proper detecting of none */ + int status; /* process state */ + word prot; /* process prototype number */ + memory M; /* pointer to memory array */ + union value param[ MAXPARAM ]; + word ic; /* instruction counter */ + word trlnumber; /* trace line number */ + word lower; /* first word of object area */ + word upper; /* last word in memory */ + word lastused; /* last word used by objects */ + word lastitem; /* first word used by dictionary */ + word freeitem; /* head of free dictionary item list */ + word headk; /* head of killed object list for size > 2 */ + word headk2; /* head of killed object list for size = 2 */ + word prochead; /* am of process object */ + virtaddr procref; /* process object virtual address */ + virtaddr template; /* remote process or procedure template */ + word c1, c2; /* pointers to current object */ + virtaddr backobj; /* adress of object just left */ + word blck1, blck2; /* used for LBLOCK1, LBLOCK2, LBLOCK3 */ + queue msgqueue; /* queue of messages for this process */ + queue rpcwait; /* queue of disabled RPC messages */ + stack rpcmask; /* stack of set of enabled remote procedures */ + bool force_compactification; /* next allocate will forace compact... */ + word *hash; /* table of pointers to processes in process */ + word hash_size; +} procdescr; + + +/* Message type : */ + +#define ERRSIG 0 /* error signal */ +#define RESUME 1 /* resume request */ +#define CREATE 2 /* create new process request */ +#define CREACK 3 /* create process acknowledge */ +#define KILLPR 4 /* kill process */ +#define RPCALL 5 /* remote procedure call request */ +#define RPCACK 6 /* remote procedure return */ +#define ASKPRO 7 /* ask for process prototype */ +#define PROACK 8 /* answer with process prototype */ + +typedef struct { + word node; + word pix; + word mark; +} procaddr; + +struct ctrlmsg +{ + procaddr sender; /* address of the sender and */ + procaddr receiver; /* receiver of the message */ + int type; /* message type */ + int par; /* prototype or error signal number */ +}; + +#define MAXPROCPAR (MSGLENGTH-sizeof(struct ctrlmsg)) + +typedef struct +{ + struct ctrlmsg control; + char params[ MAXPROCPAR ]; +} message; + +/* Direction of copying of parameters (for moveparams()) : */ + +#define LOADPAR 0 +#define SAVEPAR 1 + +typedef char *mask; + +extern procdescr process[]; /* process descriptor table */ +extern procdescr *thisp; /* pointer to current process descriptor */ +extern word thispix; /* current process index */ +extern queue ready; /* Round-Robin queue of ready processes */ +extern bool network; /* TRUE if operating in D-Link network */ +extern message globmsgqueue[]; /* queue of waiting messages */ +extern int msgready; /* number of waiting messages */ +extern int msghead, msgtail; /* pointers to message queue */ +extern word ournode; /* this machine node number */ +extern word console; /* console node number */ +extern bool remote; /* TRUE if remote node */ +extern bool reschedule; /* TRUE if rescheduling is mandatory */ + +#if OS2 +extern PGINFOSEG ginf; /* pointer to Global Info Segment */ +#endif + + + +#ifndef NO_PROTOTYPES +void obj2mess(word *,virtaddr *,procaddr*); +void mess2obj(procdescr *,procaddr *,virtaddr*); +bool isprocess(virtaddr *); +void hash_find(procaddr *,virtaddr *); +void hash_create(procdescr *,int); +void hash_set(procaddr *,word); +#else +void obj2mess(); +void mess2obj(); +bool isprocess(); +void hash_find(); +void hash_create(); +void hash_set(); +#endif + diff --git a/sources/new-s5r4/process.o b/sources/new-s5r4/process.o new file mode 100644 index 0000000000000000000000000000000000000000..011543c344e774cc00c3c30b1d4cac3236872a8c GIT binary patch literal 9339 zcma)C4|r77m47pNktqzxKnDpL+-WN!TB(9cW5K2@Q$ZGeg0WT`hhZ}LGbA&^%p33@ z+ojWK`+SZaS6D5peDK+B*?#@I?QYrHwIQ%11wReyQdZfOc6EK(NlR)Yo6=dczjN<- zFE2m>^X0wYx#ym9?z!ild*8k9Wr{~p9=}vkf{Og@t&$j;BC*MMr?>i92tZCT2AdC* z#{W>?PLhcl>*(m{X#Sut;jwxJrII-6^UFwI(H~7H*7szMt+LBe*)A*c%gC6b`^uNf zcB~^a6s2rAjqagp&5Cmi-Op2*nVQYitXbgZ5316260uz;e+JccX4uzIP5fNVz*Kb2 zv2QzYy|8JL9mUXE+@;d9;EiMK1_Ks_FRXIZ==1b>`i-9bzfnE?#b5y<$_sS!yk^WL zloqrWL$o1F!t^-CZb-TrT0oXeVIzMa=r$%SnU8&qbPgB&JAjJx$9#sERrOPi=8D-| zsS?^!^_=2}9V-e7;$=4ZjPrJ9AKC9+;q`f`ov=?6ozSel{}YK|beozgy`4CPU|)6} zjc7hL@Ks?zHRR}yS59|4xNMo;-jM~Nq%)~lJeyq@Q|4uFnU}jI)Ee#RjJJfM*=#(c zcchY`_4Bgxrz)}ZbzRxE>uya)GtsVWXz8+0w&US=s`Y9YcY#O(ksmA9P1t992%AUD z@QB&uH;xvAMT&!YZ=k4txQHJ2n*mc5u{Xj9b|8NsWHg`X4G#-3u$qP&wE8br53E-y zY!y?ht7;lH>?D!l2nLL%lcI9P`74La@Q~3{lnwD9t6n2)<+lc>r`MEcILQuTp9fwU;p62iBvMAPpN)I9KBF8Q=Z(|f*Uj*t)4mZNG{bd;ZhdBc#8dm_0rX@* zhZm&kEEM{@_9ww>FT=a`T}180%{p<0ay?L7lu)-_Ue;ICn!RHE_H?_-0cTnz6M1}v|XyO_>Noe|A?c|`VZ5%-Srhy0T+Q&d1ifZn#NO1LOtADsKW*WRZ6j-fGTSKwIs#4`Kplh%R0?^$|rUp<+|}5 zO3bnTo{fsllo$`+x>9er0>fBbE1&+$Y2^+_$!w}j^6t%Z09F*GvCl9sBEtq$E18esL(3)o5 z`o5Tt=$@(78%;=OAI(Nw70vpHtW0N9C@ ziu_=h^e9T_Zj8+4VM;{g!-RVevEPCtKOsk~4Z@guL21%jYu$K}(mxl{mt2f=uZk53 z{hM@qIQkb}718C*cCc4G>o9pnB}E3#o`2Y%ivhz92z#Z;(%)R;Ggo-khR+0ZpPpP2 zN$d0IGS8=3TQDCe&uJ{p59Ac*qm7u4D$X!5ksUI@ao&(pVjN{(^jQf{JGpQD`+H(k zc~ZG2vbTJJT&4M|*V~3l;|xiAG+%%0ny-|pR+|uX&R23h$K!RffH@miES1C9f|`$Q zr`X%m(`*cwL7$i+!*Zc_b|X}^X2kFZFjMfvb0AxH!sRE2sF_PY8hu_R!G zWbnTrTJkv&8kbDq%JmgiE)X6$x9;|e5L{%^)fWB+?&r7Crtxt}Rp~V-t2n=6t)-s` z!B6FQm3SH0J0w%CyCGc3)s#OjCFPw(3bx4e6ru7VM}+I+c0KkpA_8*C)UUNxbIn*j zZyTibpC0*|b)Bt;-R_EFp@OtN>oGP>Ncek2^ywvll+vso7{RkJaf!83cBkA7uZkFA zVfnRFViwSTRlh}e=`7g1aiAwd(f=HE$T%WTpvBdyam1Wv_`T(T>|$c3We7{E`P>M+ zJI{E^{_v3Qpe~r=KFM>^wNNBUal&+ySxM{mg>ByL^&30fsks|!h){WsGg{*OprKFI zd?e;k852N$u4||L#-8nXNn-RE{rgY)iX~X0XAMT|k>81_B&r*Yp2DkJtMWay#%ufk zq#AQc$DAcJj~a*Zs=+w00IwH_F{nmSBET$Ni;J;&SVkzm@5YzJ^vMH%B`=T0&horAOQ1 zQx!2E{r9ZPFC+Jq+9&8xwWkD{`~D(z-E+vuRRq`7q{N)SM+0xXXtY9Ah?Z zChL5)U!4t`W@Fu00+#w`A|k(mzsiRdC4}pTxcYGo;R@j8*Y&tGTxneH9?JQP4K?~V z@D|3&T`BsH^E(z^T2d!XzzRR9=pj_0lz2}Z@UYpMOwW04L1m8h3s#{eHYV~y9aufy zC*kk6<+E$x6XWa1by43djyCE*?F98(#IZshIEA4&x4)Y8Zdu0Tl?m#5x&8+e)Gw(> z{jZ<5{sQro33ANHi8nAZk)4+?^r)(spRYISk=uyUGMS6ztL<*I--=9-kB*NBFU2k( z5wv0=Cce?>l$XW$;QbGXi6ip04p}~yOmdRYyA~W@#`yN>WUbZrKXL+yqx<{lBZBUz z+hRp|bjPbTet~qJbNfG^rR$u)&b2n~>?Y3bxjoRvx!qzM6ev#aLq)`<7`E(v>1^RJ zJ=-0__L@D6wb{*g+!qbvbm+C;)XE4a=32iTklhz+9pZP-I5dPXRqZKJ=M80Pvr zx%@dG$vprhIZ6eR+XTcJ#{VQEy)vl*pMpmGzhnF^uonDoAhmk}h&R;!_khSO{~1PF z(y_GoeL&*Z0I{_A=WzMYfJh|&bwJWz%yQfF9W^{yd3yjU_EdymQ?aJY;5_)T8c6oyj1K{?0)Ho$|B3NejAh0@0?AJm&d&$V z1X4dW;MLIAfn@hwpV^JApJlFEZ9( zl2ADWya9MSmpd810$dFK_qn`}@kQVQ*n1OrBT$_t?cB_G8<6s84UqEbelACW2$fm{ zQoB2WH>3UqF86VHfXk=3JR8PHektQBAmznfjQ0a++`hr}2N*qgFGO;+!1=&gzy{zI zz*~SH1AYqa-v=c7ZOrdv{tn<$)F0;h)4*FHcQY1|Yry|oAlcasBs&8@vQvY_gzyd^ zT=Cxxr1fPJm$v{RI(-|LpJaR*h`;GS!fhe&6(Egg8A#*#dmxSH0=x+M3~&jM{P`@9 z>hELB0!hCINPb+3AP^>i6#p&26)0~5(l{E--^KV%#(!jdf$=zy;`m=c{P|DeMsfGx zM*PJh~jzv#_{^;onWb&jOzUQvDtv#qlVR+C2um4dpk1DObA*e56xSBuY9M?hKgADS zb7-t7$`o9*+xZ03w5k3i({zMD-UyjzK(At&KIJxnwr$2hV`-!{UdiI};G*9nxNQ1M zph>0?*WcBEE)>JqxtuzvZI8$1?rEpE93xyIpiI(*Wg&i+;sLzh={m6@{MJ zc3W?`=>K-nr(E=ii}pg%*7buR{}nHC!^N*>{(A7|yZF~Le+c}gF8*yU`c4=9c^6I3 zfBcDGifM|&gD(D;Ty)VzKMk7v?8kubW_k$gKkWqsA9M2`T=M?{nryGf+W!*EXf=xR zZ!Vc%vrHrM;gpMi+C^8PpJXSEwK)J9RpLj-Gr`A#_fgQ~!w_iNTaXOZEpf>=y69Cd z`YzBUyBlk5vy0!({BHP6-|@(PH`c?gE*aW~kZuX<-V-dd9&vcqmI41eHVwHSy6Al_ z`d?l2%b>|7ZN!cPpi$?1f4s5@}2397ZIjMDV#f z6OXn$B&c>!g3$5NTZv@iT`4_In2oi^TXLPCvmI^8XlEoA)nn~Sq$Am(N9@XsU8_W* zozYAeijEq$p=Y9Lw5UWjWm0;SY;S7Kq>{Q4K}|B-8ix)0OS~k|2E2^jfNPNw;ji;b zWDRKg@~%W$@ZCPu+A4|8C^|x%MQ#=pqcOc>vuH4#%fj(AzUMPz6LoVlT%o)CoG%*E zQ~E<`ushP3Xbb#GXF9r~={S6iMB*qUbu@~mE%7T2X5!kX)Xd^VnJK~T`ecqSv`i{2t)I+_vxjUZ)EOLn?anTP0q4V=-8 zcA^O-(wd3K5f2&?M{Q$AXQxv@sN>LraI}*u&|b2|sg0$Q*%Xa12tA(MOoGX_L|0mf zWpYU+vLPDVDE-1H#kttNtlFA^!nRu)6 E|3u>Y3IG5A literal 0 HcmV?d00001 diff --git a/sources/new-s5r4/queue.c b/sources/new-s5r4/queue.c new file mode 100644 index 0000000..35ae2fd --- /dev/null +++ b/sources/new-s5r4/queue.c @@ -0,0 +1,112 @@ +#include "depend.h" +#include "genint.h" +#include "int.h" +#include "process.h" +#include "intproto.h" + + +/* Queue management */ +/* Single linked circular lists with queue represented as pointer to rear */ + +queue qinit() /* Initialize empty queue */ +{ + return (NULL); +} /* end qinit */ + + +stack push(q, e) /* Insert element into the queue */ +stack q; +selem e; +{ + stack p; + + p = (stack) ballocate(sizeof(struct queuelem)); + if (p == NULL) errsignal(RTEMEMOV); + p->elem = e; + if (q == NULL) + { + p->next = p; /* the lonely element of the queue */ + q = p; + } + else + { + p->next = q->next; /* insert at rear */ + q->next = p; + } + return(q); +} /* end push */ + + +qelem qfront(q) /* Get first element of the queue */ +queue q; +{ + if (qempty(q)){ + fprintf( stderr, "getting first element from empty queue\n"); + errsignal(RTESYSER); + } + return (q->next->elem); +} /* end qfront */ + + +queue qremove(q) /* Remove front element from the queue */ +queue q; +{ + queue p; + + if (qempty(q)){ + fprintf( stderr, "removing first element from empty queue\n"); + errsignal(RTESYSER); + } + p = q->next; + q->next = q->next->next; + if (p == q) q = NULL; /* removing last element of the queue */ + free(p); + return(q); +} /* end qremove */ + + +queue qdelete(q, e) /* Delete arbitrary element */ +queue q; +qelem e; +{ + queue p, r, s; + + if (qempty(q)) return(q); + r = q; + p = r->next; + while (p->elem != e) + { + if (p == q) return(q); + r = p; + p = p->next; + } + r->next = p->next; + if (r == p) s = NULL; + else + if (p == q) s = r; + else s = q; + free(p); + return(s); +} /* end qdelete */ + + +queue qrotate(q) /* Remove front and insert at rear */ +queue q; +{ + if (qempty(q)){ + fprintf( stderr, "rotating empty queue\n"); + errsignal(RTESYSER); + } + return (q->next); +} /* end qrotate */ + + +void qfree(q) +queue q; +{ + while (!qempty(q)) + { + free(qfront(q)); + q = qremove(q); + } +} /* end qfree */ diff --git a/sources/new-s5r4/queue.h b/sources/new-s5r4/queue.h new file mode 100644 index 0000000..7682c00 --- /dev/null +++ b/sources/new-s5r4/queue.h @@ -0,0 +1,40 @@ +/* Header for queue management module */ + +typedef lword qelem; +typedef qelem selem; +struct queuelem { qelem elem; + struct queuelem *next; + }; +typedef struct queuelem *queue; +typedef queue stack; + +#ifndef NO_PROTOTYPES +queue qinit(void); +stack push(stack,selem); +qelem qfront(queue); +queue qremove(queue); +queue qdelete(queue,qelem); +queue qrotate(queue); +void qfree(queue); +#else +queue qinit(); +stack push(); +qelem qfront(); +queue qremove(); +queue qdelete(); +queue qrotate(); +void qfree(); +#endif + +#define qinsert(q, e) (((queue) push((stack) (q), (selem) (e)))->next) +#define qempty(q) ((q) == NULL) +#define pinsert(q, p) (qinsert(q, (qelem) (p))) +#define pfront(q) ((word) qfront(q)) +#define minsert(q, m) (qinsert(q, (qelem) (m))) +#define mfront(q) ((message *) qfront(q)) +#define mdelete(q, m) (qdelete(q, (qelem) (m))) +#define mpush(q, m) ((queue) push((stack) q, (selem) m)) +#define sfree(s) qfree((queue) s) +#define sinit qinit +#define pop(s) ((stack) qremove((queue) s)) +#define top(s) ((selem) qfront((queue) s)) diff --git a/sources/new-s5r4/queue.o b/sources/new-s5r4/queue.o new file mode 100644 index 0000000000000000000000000000000000000000..589f977ce49fee691d7b24c27b798e1b8249da48 GIT binary patch literal 1345 zcma)6&ui0A9Dm!o^*K5>a2H`p1O*RMa41p)nL@x{U}e^e%s9HVO=;6EO=Jo~qz?8B zN(C?e4<0;t5Co|@8SJ1FJPZVHLL@tQ7}`U0e!eeBsk(!YB%g1--_QI0d`Ys0u?u~y zvz|rLQiNIYgs?X@5~ZFJ_dfJ8)>!634H^ppa|TPp-pj46t;TY~ zRRcGh5+jWT&YV5+Ef5(}3zhr(y8THbch4on8Q8g-4T;eU)on#D z>lNL!mAqB0D0-!4-&E!t-O&eGoF7FUD?UO+MXJg>D6`_FQEzXYA9s;Xuiw)o|CU~< z-uTY|Vg0hOvEpVY#M@s~IE8p2C0R=*A+muiiVAcuCBh!0RqiBLR8F~}{EWBM+2XTp z`<;^UM&at~6Kwjke;7d9#T7*h+>vxPA=f|qrGjf3cOe;K3;k+*6IEC|? zmyW2JX5=!<-O~xb5AnC@Pg8bhz&}c*AfJr)Bitrh8E-sJ3hK$Q&!R=AaFy8G`nxja zPIK2uiEoSFo&M+eU|2@1FMf(;Z#|I17O%ycKODO0Jn!r6tJk6=Phw|3V?(RJ1g`hM zBx9+MKumw=b7Vh+5M-YKlKnW4?5BXV-v$l>PoP7Dw}8aI4J7_uAn_jniN6LU-hO=N zJAvR5U#?wU@&U-;%QYU!3UC6q#ujo24vzWFj`&u`AFY{ z{!S#3Gh~;s;}sAdf8xp&=JK F{tc3i)=2;W literal 0 HcmV?d00001 diff --git a/sources/new-s5r4/rm.bat b/sources/new-s5r4/rm.bat new file mode 100644 index 0000000..f7b31c3 --- /dev/null +++ b/sources/new-s5r4/rm.bat @@ -0,0 +1,9 @@ +@echo off +:begin +if "%1" == "" goto :end +echo %1 +del %1 +shift +goto :begin +:end + diff --git a/sources/new-s5r4/rpcall.c b/sources/new-s5r4/rpcall.c new file mode 100644 index 0000000..ce39f65 --- /dev/null +++ b/sources/new-s5r4/rpcall.c @@ -0,0 +1,266 @@ +#include "depend.h" +#include "genint.h" +#include "int.h" +#include "process.h" +#include "intproto.h" + + +#ifndef NO_PROTOTYPES +static bool isenabled(word,word); +static bool rpcready(word); +static void bitaccess(word,word,int *,char *); +static void dupmask(word); +#else +static bool isenabled(); +static bool rpcready(); +static void bitaccess(); +static void dupmask(); +#endif + + +void rpc1(msg) /* preprocess RPC request */ +message *msg; +{ + word pix, prot; + procdescr *p; + message *msg1; + + pix = msg->control.receiver.pix; + p = &process[ pix ]; + if (p->mark != msg->control.receiver.mark) + senderr(RTEREFTN, &msg->control.sender); + msg1 = (message *) ballocate(sizeof(message)); + if (msg1 == NULL) errsignal(RTEMEMOV); + moveblock((char *) msg, (char *) msg1, (word) sizeof(message)); + prot = msg->control.par; + if (isenabled(pix, prot)) + { + p->msgqueue = minsert(p->msgqueue, msg1); + if (p->status == ACCEPTING) activate(pix); + } + else p->rpcwait = minsert(p->rpcwait, msg1); +} + + +void rpc2() +{ + if (rpcready(thispix)) rpc3(); +} + + +void rpc3() /* Actual remote procedure call */ +{ + word prot, ah, am; + message *msg; + + msg = mfront(thisp->msgqueue); /* remove first RPC message (enabled) */ +# ifdef RPCDBG + fprintf( + stderr, "rpc(thisp=%d) from: node=%d, pix=%d, mark=%d\n", + thispix, + msg->control.sender.node, + msg->control.sender.pix, + msg->control.sender.mark + ); +# endif + thisp->msgqueue = qremove(thisp->msgqueue); + pushmask(thispix); /* disable all procedures */ + prot = msg->control.par; + + slopen(prot, &thisp->procref, &ah, &am); /* open procedure object */ + + { + virtaddr v; + mess2obj( thisp, &(msg->control.sender), &v ); + storevirt( v, am+M[ am ]+RPCDL ); /* set up remote DL */ + } + + moveparams(thispix, am, msg, PARIN, SAVEPAR); + + go(ah, am); /* transfer control to procedure */ + + free(msg); + +} + + +void rpcend(msg) /* After return from RPC */ +message *msg; +{ + word pix, am; + procdescr *p; + + pix = msg->control.receiver.pix; +#ifdef RPCDBG +fprintf(stderr,"activate after rpc(thisp=%d)\n",pix);fflush(stderr); +#endif + p = &process[ pix ]; + am = p->M[ temporary ]; /* template physical address */ + moveparams(pix, am, msg, PAROUT, SAVEPAR); + activate(pix); /* resume process waiting for RPC */ +} + + +static void bitaccess(pix, prot, bytenr, bitmask) +word pix, prot; +int *bytenr; +char *bitmask; +{ + int bitnr; + + bitnr = prot-prototype[ process[ pix ].prot ]->maskbase; + *bytenr = bitnr / 8; + *bitmask = (char)(unsigned char)( 1 << (bitnr % 8) ); +} + + +void enable(pix, prot) /* Enable remote procedure */ +word pix, prot; +{ + mask m; + int bytenr; + char bitmask; + + m = top(process[ pix ].rpcmask); + bitaccess(pix, prot, &bytenr, &bitmask); + m[ bytenr ] |= bitmask; +} + + +void disable(pix, prot) /* Disable remote procedure */ +word pix, prot; +{ + mask m; + int bytenr; + char bitmask; + + m = top(process[ pix ].rpcmask); + bitaccess(pix, prot, &bytenr, &bitmask); + m[ bytenr ] &= ~ bitmask; +} + + +static bool isenabled(pix, prot) /* Check if RPC allowed */ +word pix, prot; +{ + mask m; + int bytenr; + char bitmask; + + m = top(process[ pix ].rpcmask); + bitaccess(pix, prot, &bytenr, &bitmask); + return( m[ bytenr ] & bitmask ); +} + + +void pushmask(pix) /* Push empty RPC mask onto stack */ +word pix; +{ + mask m; + int i, size; + + size = prototype[ process[ pix ].prot ]->masksize; + m = (mask) ballocate(size); + if (m == NULL) errsignal(RTEMEMOV); + for (i = 0; i < size; i++ ) m[ i ] = '\0'; /* disable all */ + process[ pix ].rpcmask = push(process[ pix ].rpcmask, m); +} + + +static void dupmask(pix) /* Duplicate RPC mask from stack top */ +word pix; +{ + mask m; + int size; + + size = prototype[ process[ pix ].prot ]->masksize; + m = (mask) ballocate(size); + if (m == NULL) errsignal(RTEMEMOV); + moveblock(top(process[ pix ].rpcmask), m, (word) size); + process[ pix ].rpcmask = push(process[ pix ].rpcmask, m); +} + + +void popmask(pix) /* Pop RPC mask from stack (restore) */ +word pix; +{ + mask m; + + m = top(process[ pix ].rpcmask); + process[ pix ].rpcmask = pop(process[ pix ].rpcmask); + free((char *) m); +} + + +void evaluaterpc(pix) /* Check if any waiting RPC is enabled */ +word pix; +{ + queue q; + message *msg; + + q = process[ pix ].rpcwait; + if (!qempty(q)) + { + do + { + msg = mfront(q); + if (isenabled(pix, msg->control.par)) + { + process[ pix ].msgqueue = mpush(process[ pix ].msgqueue, msg); + process[ pix ].rpcwait = mdelete(process[ pix ].rpcwait, msg); + return; + } + q = qrotate(q); + } while (q != process[ pix ].rpcwait); + } +} + + +void rpc_accept(length) /* Accept remote procedure call */ +word length; +{ + int i; + + dupmask(thispix); + for (i = 0; i < length; i++) + enable(thispix, virtprot(M[ ic++ ])); + evaluaterpc(thispix); + if (!rpcready(thispix)) + passivate(ACCEPTING); +} + + +static bool rpcready(pix) +word pix; +{ + procdescr *p; + message *msg; + word prot; + + p = &process[ pix ]; + while (!qempty(p->msgqueue)) + { + msg = mfront(p->msgqueue); + prot = msg->control.par; + if (isenabled(pix, prot)) return(TRUE); + p->msgqueue = qremove(p->msgqueue); + p->rpcwait = minsert(p->rpcwait, msg); + } + return(FALSE); +} + + +word virtprot(prot) /* Get actual prototype for virtual */ +word prot; +{ + bool sign; + word virtnr; + + sign = (prot < 0); + prot = absolute(prot); + virtnr = prototype[ prot ]->virtnumber; + if (virtnr != -1) prot = M[ prototype[ thisp->prot ]->virtlist+virtnr ]; + if (sign) return(-prot); else return(prot); +} + + diff --git a/sources/new-s5r4/rpcall.o b/sources/new-s5r4/rpcall.o new file mode 100644 index 0000000000000000000000000000000000000000..9b55bc90e3f284c075f29e4e8bbb3ecddfddd9cd GIT binary patch literal 4496 zcmb7HeQX;=7GFCyHLcUQG<+0AM^!)^6rr|6g777%ZlQoImh=or;4Y4{Z5^E0^+#wC zp*`H_Ivp$p1b-ocS|n5fqJIFV>bR?%07q3$B59GRih!2SEw;cX`I-d`;rC`{!xAVp ztH{4MZ{EDGc{6V^&!=hkEzoAa8pibP@k@-c&r7w)TCRt<5n-_=k2Tp8JK#Iun`9H? zp9Fl9<<3zOeVu-MhgrPA^#+fH_>F;{)t!ZfSZNHLWxqNzGgEpqG~nB)!GitTd`-iU z>Gje`T`SHX=&+v<5&<#K^}0a|?GeEY3-etp=5XD?MANX}Y?BHqqm{z7QoO;(UWE_6 z_8Mu6Rd}ocH`t@ZhF7J{p4|ata{Px(tToS``o3(=J6V<#orjC5Bb;ymS)&} zA@U%=$b+CA0FQ)3zPi>58P}hEKT_-g1p5p2F2%0!vq__LQz^GZcma6F4aD6n>kXrf z*u`}4F>*k}5f?flW!=WOE~gFq7QscN4K`5@JVn~24IXc_b@|zm@;wfVf5!FC=FUfL z7WU8Rzd2RI)PQebfl8Tc?C1{^T_=pe1;?-tigAdf?EQic@c1z|fg(TQKU_~TLsR9> zvIyqJ2=7ESI&g<-Ll_qMh`P>Tk8g5~*Inas|4OycU29RHR8B>Q)qVB3wM?6?@xS`R zTqQ3WUcRQAMVnlY@M4n{9UgN=4~?{yCgzQQ*Ty1T@1%nfb4nwQHWDc5&O9D<#=mW2 zQHRH!a`%U%5$l%6oc%r`rw)IC;m)YDBUHBP_pWnYbn^rEe)E_~*PitM3rc$Jbxl=S zD3EDUAY2b48#pv1={do1D)oGyO%JS|jy>gaPV zRpf_`JPqFAul>q2WvUg$BwxMz=ksFN4~n&Dwd}MT z6K(c9CX!VQRu@CZiT7|ZxQ88x4(Kfp>gT0eKy}@B<#qbD-h>O3;T}D-wY_?~XT6Y| z+cg7zV+KbB@0#neGvZO;cE`)*p`Fp2)xD%fSqh5l%C&ngma3-&oM;d(Y;&nmYu#cz#lzSUEpE;qFBI3z2NZ>5AkA{)kjYjgCbc5J2Lu#OWOw;veYMFr^BO* z$g<_kHv7wv9=!9yYk+t^whsW$0B!}&1JY)m349-j_j3C;YTSwa3FGf-Udd0vBU`uNuDw?8NvW5D%^JR|p=4Rq?-3Zs0;It14;fF{E**11W)6IKpJmT$T8(>wl!w2m@iRb@|5T0ZK+?My|1r?|>lEG!Tn2txjYokOV*H{Se+i_# zFT&!BflGn3AD5}|H9(rbQ=zG_2)qP(b^*!WJ3#Vh0XBpDz8nZv`{O{$&u$>q(MxJv z0g|0={9pKI$YC3(KE;Q+nWf>Ah7^l$Iet+#;_LR%*Mp|D5$L+z!@tWzCzQ6XXtEW7kw-mz4x03DLqJafNoECPo(8)9?Do(vc<5I^ll(C#__v4umWO`VLm%?c zA9?6cJhTm(bQ*q5t9$t0gC;*G!9N3zxxOs|LGoE_)DlG>1HBA1$yYGBT=6TY!)`_2 zkD9s(H2%bQn}=SjWR9VJObodCNqQCRNCslLNiTs!%%US zVJ0;*mrbtJ%xo@`wDNh)%v(eKRxURynMkKIkOC{8+Ax$zYvy2P*y;oG0nJQ7I?)Hs zP*BWo)XYS(kQz=DETMLlW)?Q4^4Zj8G0a(s{w;#KQcY;)ruDhZPyv{;NUc;en8-tS zKAp*0Lof%oR%QAIG&3q~XA`-^AUxfW(aiNZOWK0hP-+ckGr2?#R{BzfL{dhC&0X%9Gn5idktbn^A-{oJbcD0n!4u`mMA@(QJYaH!K91w6btI1&QHQu0RIh Nc_N=zu_tBHegX+{?0x_M literal 0 HcmV?d00001 diff --git a/sources/new-s5r4/runsys.c b/sources/new-s5r4/runsys.c new file mode 100644 index 0000000..0b6d46d --- /dev/null +++ b/sources/new-s5r4/runsys.c @@ -0,0 +1,281 @@ + /* Loglan82 Compiler&Interpreter + Copyright (C) 1981-1993 Institute of Informatics, University of Warsaw + Copyright (C) 1993, 1994 LITA, Pau + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + contacts: Andrzej.Salwicki@univ-pau.fr + +or Andrzej Salwicki + LITA Departement d'Informatique + Universite de Pau + Avenue de l'Universite + 64000 Pau FRANCE + tel. ++33 59923154 fax. ++33 59841696 + +======================================================================= +*/ + +#include "depend.h" +#include "genint.h" +#include "int.h" +#include "process.h" +#include "intproto.h" + + +/* Initialize memory structures for objects, main object and a few goodies + * more. + */ + +void runsys() +{ + word apt, i; + procaddr father; + + for (i = 0; i < MAXPROCESS; i++ ) /* initialize process descriptors */ + { + process[ i ].used = FALSE; /* not used */ + process[ i ].mark = -1; /* initial mark for processes */ + process[ i ].M = NULL; /* memory not allocated */ + process[ i ].hash = NULL; + } + process[ 0 ].M = M; /* always contains code */ + dispoff = VIRTSC-(lastprot+1); /* DISPLAY offset in process object */ + disp2off = dispoff-(lastprot+1); /* indirect DISPLAY offset */ + ready = qinit(); /* initialize Round-Robin queue */ + ranset(); /* init pseudo-random no. generator */ + +#if OS2 + { + SEL gsel, lsel; + DosGetInfoSeg(&gsel, &lsel); + ginf = MAKEPGINFOSEG(gsel); + } +#endif + + if (!remote) /* create main process */ + { + father.node = 0; /* dummy DL for generated process */ + father.pix = 0; + father.mark = 0; + thispix = 0; /* current process index */ + thisp = &process[ thispix ]; /* current process descr pointer */ + initprocess((word) 0, (word) MAINBLOCK, &father); + mainprog = thisp->prochead; /* am of main */ + c1 = thisp->c1; /* pointers to current object */ + c2 = thisp->c2; + ic = thisp->ic; /* instruction counter */ + param = thisp->param; /* parameter vector */ + apt = mainprog+M[ mainprog ]; /* LWA+1 of main */ + display = apt+dispoff; /* DISPLAY in main */ + display2 = apt+disp2off; /* indirect DISPLAY in main */ + mnoff = 2; /* offset of variable mainprog */ + storevirt(thisp->procref, mainprog+mnoff); /* init variable main */ + M[ apt+STATSL ]++; /* flag main included in SL chain */ + thisp->status = STOPPED; + activate(thispix); /* activate main process */ + } + else /* remote */ + { + thispix = 1; /* a dirty trick: set junk current */ + thisp = &process[ thispix ]; /* process for first transfer() */ + } /* (must save 'context' somewhere) */ +#if DLINK + net_attention(); +#endif +} + + +void initprocess(pix, prot, father) /* Initialize process descriptor */ +word pix, prot; +procaddr *father; +{ + procdescr *p; + protdescr *ptr; + word i, j, ah, am, apt; + +#ifdef RPCDBG +fprintf(stderr,"new process(n,p,m) (%d,%d,%d)",0,pix,process[pix].mark); +fprintf(stderr," from (%d,%d,%d)\n",father->node,father->pix,father->mark); +#endif + + p = &process[ pix ]; + +#ifdef OBJECTADDR + hash_create(p,119); +#endif + p->used = TRUE; /* process descriptor is used */ + p->prot = prot; /* prototype number */ + p->freeitem = 0; /* null list of free dictionary items */ + p->upper = memorysize-1; /* highest memory address */ + p->lower = freem; /* lowest address for data */ + p->headk = p->lower; /* head of killed objects list */ + p->M[ p->headk ] = MAXAPPT; /* maximum appetite sentinel */ + p->headk2 = 0; + ah = p->upper-1; /* dict. item for process itself */ + p->lastitem = ah; /* first word used by dictionary */ + ptr = prototype[ prot ]; + if (p->upper - p->lower - ptr->appetite < 512) + if (prot == MAINBLOCK) + abend("Memory size too small (use /m option)\n"); + else errsignal(RTEMEMOV); + + /* generate process object */ + p->lastused = p->lower+ptr->appetite; + am = p->lower+1; + p->M[ am ] = ptr->appetite; + p->M[ am+PROTNUM ] = prot; + for (i = PROTNUM+1; i < ptr->appetite; i++) + p->M[ am+i ] = 0; + p->M[ ah ] = am; + p->M[ ah+1 ] = 0; + p->prochead = am; + p->procref.addr = ah; + p->procref.mark = 0; + p->c1 = am; /* initialize current object ptrs */ + p->c2 = am+ptr->span; + apt = am+ptr->appetite; + p->M[ apt+CHD ] = ah; /* initialize coroutine head ptr */ + p->M[ apt+CHD+1 ] = 0; + p->M[ apt+SL ] = DUMMY; /* dummy SL for process */ + p->M[ 1 ] = 1; /* absolute none */ + for (i = MAINBLOCK; i <= lastprot; i++) /* initialize DISPLAY */ + p->M[ apt+dispoff+i ] = 0; + p->M[ apt+disp2off+MAINBLOCK ] = DUMMY; /* dummmy entry for MAIN */ + j = ptr->preflist; /* set DISPLAY entries for process */ + + for (i = j+ptr->lthpreflist-1; i >= j; i--) + { + p->M[ apt+dispoff+M[ i ] ] = am; /* physical address */ + p->M[ apt+disp2off+M[ i ] ] = ah; /* indirect address */ + } + + { + virtaddr v; + mess2obj( p, father, &v ); + p->M[ apt+DL ] = v.addr; + p->M[ apt+DL+1 ] = v.mark; + } + p->msgqueue = qinit(); + p->rpcwait = qinit(); + p->rpcmask = sinit(); + pushmask(pix); /* initialy all RPCs are disabled */ + p->trlnumber = 0; /* trace line number */ + i = ptr->preflist; /* search for executable prefix */ + while (prototype[ p->M[ i ] ]->kind == RECORD) i++; + p->ic = prototype[ M[ i ] ]->codeaddr; /* first instruction address */ +#if RPCDBG +fprintf(stderr,"first instruction address %d of new process %d\n", p->ic, pix ); +#endif + p->force_compactification=FALSE; +} + + +bool member(virt, am) +virtaddr *virt; +word *am; +{ + *am = M[ virt->addr ]; + return (virt->mark == M[ virt->addr+1 ]); +} + + +void update(am, ah) /* Update DISPLAY */ +word am, ah; +{ + word t1, t2, t3, t4, t5, t6; + protdescr *ptr; + + while (TRUE) + { + t1 = am+M[ am ]; + M[ t1+STATSL ]++; /* flag object included in SL */ + ptr = prototype[ M[ am+PROTNUM ] ]; + t2 = ptr->preflist; + t3 = t2+ptr->lthpreflist-1; + for (t4 = t3; t4 >= t2; t4-- ) + { + t6 = M[ t4 ]; + t5 = display+t6; + if (M[ t5 ] == 0) /* entry to be updated */ + { + M[ t5 ] = am; + M[ display2+t6 ] = ah; + } + } + ah = M[ t1+SL ]; + if (ah == DUMMY) break; + if (M[ ah+1 ] != M[ t1+SL+1 ]) errsignal(RTESLCOF); + am = M[ ah ]; + } +} + + +void loosen() /* Loosen DISPLAY */ +{ + word t1, t2, t3; + protdescr *ptr; + + t1 = c1; + while (TRUE) + { + ptr = prototype[ M[ t1+PROTNUM ] ]; + t2 = ptr->preflist; + for (t3 = t2+ptr->lthpreflist-1; t3 >= t2; t3-- ) + M[ display+M[ t3 ] ] = 0; + t3 = t1+M[ t1 ]; + M[ t3+STATSL ]--; /* flag object removed from SL */ + t1 = M[ t3+SL ]; /* ah of SL */ + if (t1 == DUMMY) break; /* still not main */ + t1 = M[ t1 ]; /* am of SL */ + } +} + + +static int tracecnt = 0; /* To count trace messages in line */ + +void trace(lineno) /* Trace the program if debug mode */ +word lineno; +{ + thisp->trlnumber = lineno; + if (debug && lineno > 0) + { + tracecnt++; + if (tracecnt == MAXTRACNT) /* change line */ + { + tracecnt = 0; + fprintf(tracefile, "\n"); + } + fprintf(tracefile, "%6ld", (long) lineno); + } + trapmsg(); /* check for waiting message */ + rpc2(); /* check for RPC message */ +} + + +void endrun(status) +int status; +{ + fflush(stdout); + + fprintf(stderr, "\n\nEnd of LOGLAN-82 program execution\n");fflush(stderr); +#if DLINK + net_logoff(); +#endif + if (debug) fclose(tracefile); + exit(status); +} + + diff --git a/sources/new-s5r4/runsys.o b/sources/new-s5r4/runsys.o new file mode 100644 index 0000000000000000000000000000000000000000..28e55f86054dc4224d2843d7fa6ca9ef066f2d81 GIT binary patch literal 5214 zcmb7IeUMXE6@QxqNVg9*TNb2+wwZxiD*doqU|cEf3O*GiG#wh8)>&dmvb$OHMUvNo z<1S1CV{f0)INGUBJC&9?>eONUYNd{LfFeP3bm`PiJEDSvA`<-*{z32PhcX#LXXj(+qG?ylxVTVB5DKNnPmai__x}{h$8YIb2HtwJ5Ex!!1 zNRJh0uv6?r&xxLCcJ#}bLD6y{5}#1!XB2Q!v(1VtN-_;sH@17v@OH#Ryvm( z_|}&JY>A^~yw9AXm}42uwi0&KxquWD)yO9))(|$Yg9!hY`RarArP~jZS z_}{Y~J@eUZtUB_#FPcbYc6qb0FGRh$RLYx8gyM1Uax)wC-j(pC(z#eFd0VgO^BH@5 zKP=n2#R|CJzp!R=;xWYLw}0Lwm))RC8u!y^S^=H;b&?E!k>Ujr^T0kyG&@<)p8{&uu&3m5qnCG+!aaLQhKH7>)0>%D_!?Fw?%d&K z=^Qs1{{*AXfZsMdRTwC6Uxqyv<~{6YOFZ2}X-~nmu;6#GY08SHWYl@584W8?AM(3* z&#TM9f7Tt0l7O)K79KHi{l zRK7*({hs_$WKlF3(g+XWRDFo=-pM(YRXj7o5wXqKDW|XA)kn07^7t#6$4lpT>WP#K z!wt*tWr3PS1*{kDQ9X)xIU$L;=mX==e&_DTPynu12=WjM19k) z*8jDtiW;|k^>P+os`d-UX}@K7@QbZ^^Lc7-+K5)*^6b{AIH&(>aq2XDhI#CF8uW?4 zK4p*p6fxMp?(p;xv|sJ;zn~Zmx8ME_WH`rQximZuA*3Ra$Q+zeLPZJ&JeD}Q^E-!o za&s$-m4K*Lzg76|%Dm-!~5Ty)w+|DHqHqwOG?V+wOg}SOU;Hz+b@=s2rere2v){ngvPv@?O)oS^=kIghdNd0!MBgv`>0dUCzE zeDwcY_GCwc60y6y0oR|RHFD;XlJa_bo~K4)Mzi86FYd1Am5O$0WhnPEm8r?fY-}-~ zI7J#$*H$*P1EgYgU1WGDPTj#ybdAW{Cys&2%QFhpe9Gv2O{0~pYV^%+huM;e$uT?t#8eu zt9gDcz2}-YmN-kP9)IZC_Lb<7I+cxfrhj~EN4%bkb$boaUX2%(t+&@mM!cy}@1_Sn zx#?q@@A$}|H=Rk1WkLyWbZ0bd(v9cR3lIF`=ac;|uFE*F#(xJBLUNW%+=6*i49^5G zj|b(qe<{S|oc$v~&s0Jnc|{R@6u%S^hYH=4(tQ}CCPss zh)ak5P07Cq><9mS$^RI59r#0%KLVT&{y32I`~gVu{894%08$(^-~jMEko>1R8IE6l z7H&lgfqg()zd-UI0+OB&1Igdbl7C3@J0w3Tc?P6-zY6>Smb@VOA4n_#DgNIBN#7tC z;@9D|2%-t#_23@^-T-_9xEOdI2tQmGflDxNJ{TO4b6-c1s7`O=Me(`uqPRjp@_PbE z@~0)gA4ubW0^Wr6OTke6?vc1&;%9(2L(YI?{|J!u{YLV$v55F(5~n0SBk>i9$AGkc z9-4#Z-vFfi4@!Qc!~l@$Fedq;#KRKbkyrsz+|*>G?^Yo7iC^;DfMoAE$-f9Bdxs?d zXNeaiE<}@(p8F(5fK-<>@D|{1Af;}f#IHzv8i;kSXMrEYycdACV(CFC|A~~pD&$um9!Y!AcWXeSr}+Pc3@QH{`eGAk{P1UsLT^*(F@;VmG@YZozUYG~MQ$lH zovHZY&whpeow_z z@lZAgKBomEv1~duIx2`kPVI;#V;IRqLy=v8P%<0kY$BD5YQfw%R>XEnLJQL5w(3ME zmZXoU77X8w-$4w+gLDWVRbe3>f=aRp0;7o}w-^fNVvmMM`* + +#include "depend.h" +#include "genint.h" +#include "int.h" +#include "process.h" +#include "intproto.h" +#include "soct.h" +#include "sock.h" +#include "tcpip.h" + + +#ifndef FD_SET +#define BITS_PER_INT 32 +#define FD_SET(f,fds) (fds)->fds_bits[(f)/BITS_PER_INT]|=(1<<((f)%BITS_PER_INT)) +#define FD_ZERO(fds) { (fds)->fds_bits[0]=0; (fds)->fds_bits[1]=0; } +#endif + + + +#ifdef BZERO +void bzero( buf, size ) char *buf; int size; { + while( --size >= 0 ) + buf[size]='\0'; +} +void bcopy( from, to, size ) char *from,*to; int size; { + while( --size >= 0 ) + to[size]=from[size]; +} +#endif + + + +#ifndef INADDR_NONE +#define INADDR_NONE 0xffffffffUL +#endif + +/* Zerowanie adresu O.S.*/ +#define init_addr(addr) \ + bzero((char *)&(addr),sizeof(addr)); \ + (addr).sin_family=AF_INET; \ + (addr).sin_port=htons(0); \ + (addr).sin_addr.s_addr=htonl(INADDR_ANY); + + + +int host_addr( host, buf ) char *host; struct sockaddr_in *buf; { + + long inaddr; + int port; + struct hostent *hp; + char *addr; + + init_addr( *buf ); + + addr = strchr( host, ':' ); + if( addr == NULL ) + port = PORT; + else + { + *addr = '\0'; + addr++; + if( *addr!='\0' ) + if( sscanf( addr, "%d", &port ) != 1 ) usage(); + else; + else + port = PORT; + } + + buf->sin_port = htons( port ); + + /* try dotted-decimal address */ + if( (inaddr = inet_addr(host)) == INADDR_NONE ){ + if( (hp = gethostbyname(host)) == NULL ) + return -1; + assert( hp->h_length == sizeof( inaddr ) ); + bcopy( (char *)( hp->h_addr ), (char *)&( buf->sin_addr ), sizeof( inaddr ) ); + } + + return 0; +} + + +/* zwraca otwarte gniazdko */ + +int sock_open( socket_type, protocol, service, port ) + char *service; + char *protocol; + int socket_type,port; +{ + int fd; + struct sockaddr_in my_addr; + struct servent *sp; + struct protoent *pp; + + init_addr( my_addr ); + + if( (pp=getprotobyname(protocol)) == NULL ) + return -1; + + if( service != NULL ){ + if( (sp=getservbyname(service,protocol)) == NULL ) + return -1; + my_addr.sin_port = sp->s_port; + } + + if( port>0 ) + my_addr.sin_port = htons( port ); + + if( (fd = socket(AF_INET,socket_type,pp->p_proto)) < 0 ) + return -1; + + if( bind( fd, (struct sockaddr *)&my_addr, sizeof(my_addr) ) < 0 ) + return -1; + + return fd; +} + + + +int sock_poll( sock, ms ) int sock,ms; { + struct timeval timeout; + fd_set rd_fds; + int nfds; + FD_ZERO(&rd_fds); + timeout.tv_sec = ms/1000; + timeout.tv_usec = (ms%1000)*1000; + if( sock>=0 ) /* sock==-1 means we only sleep */ + FD_SET(sock,&rd_fds); + if( ms >= 0 ) + nfds = select(sock+1,&rd_fds,NULL,NULL,&timeout); + else + nfds = select(sock+1,&rd_fds,NULL,NULL,NULL); + errno=0; + return ( nfds == 1 ); +} + + + +static int send_wait_time = 0; + +void set_send_delay( ms ) int ms; { /* set delay to miliseconds */ + send_wait_time = ms; +} + +int sock_send( sock, buf, size, addr ) + int sock,size; + void *buf; + struct sockaddr_in *addr; +{ + struct sockaddr *adr; + + int namelen = sizeof( *addr ); + if( send_wait_time > 0 ) + sock_poll( -1, send_wait_time ); + if( sendto( sock, (char *)buf, size, 0, addr, namelen ) <= 0 ){ + fprintf( + stderr, + "socket send to %s:%d\n", + inet_ntoa( addr->sin_addr ), + (int)ntohs( addr->sin_port ) + ); + perror("send error"); + abend("send error"); + } + return 0; +} + +int sock_recv( sock, buf, size, addr ) + int sock,size; + void *buf; + struct sockaddr_in *addr; +{ + int recv_size; + int namelen = sizeof( struct sockaddr_in ); + if( ( recv_size = recvfrom( sock, buf, size, 0, addr, &namelen ) ) < 0 ){ + perror("recv"); + return -1; + } + if( namelen != sizeof( struct sockaddr_in ) ){ + printf("str sockaddr_in %d namelen %d\n",sizeof(struct sockaddr_in),namelen); + printf("addr %s\n",inet_ntoa(addr->sin_addr)); + abend("strenge message"); + } + return recv_size; +} + + + diff --git a/sources/new-s5r4/sock.h b/sources/new-s5r4/sock.h new file mode 100644 index 0000000..394a510 --- /dev/null +++ b/sources/new-s5r4/sock.h @@ -0,0 +1,81 @@ + /* Loglan82 Compiler&Interpreter + Copyright (C) 1981-1993 Institute of Informatics, University of Warsaw + Copyright (C) 1993, 1994 LITA, Pau + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + contacts: Andrzej.Salwicki@univ-pau.fr + +or Andrzej Salwicki + LITA Departement d'Informatique + Universite de Pau + Avenue de l'Universite + 64000 Pau FRANCE + tel. ++33 59923154 fax. ++33 59841696 + +======================================================================= +*/ + +#ifndef __SOCK_H__ +#define __SOCK_H__ + +#include +#include + +#ifndef NO_PROTOTYPES +#include +#endif + +#include +#include +#include +#include +#include +#include +#include + + +#ifndef NO_PROTOTYPES +int host_addr( char * /* host name */, struct sockaddr_in * ); +int sock_open( int socket_type, char *protocol, char *service, int port ); +int sock_recv( int sock, void *buf, int size, struct sockaddr_in *addr ); +int sock_send( int sock, void *buf, int size, struct sockaddr_in *addr ); +void set_send_delay ( int miliseconds ); +int sock_poll( int sock, int miliseconds ); + /* sock == -1 -> equivalent of sleep */ + /* miliseconds < 0 -> waits indefinitely */ +#else +int host_addr(); +int sock_open(); +int sock_srv_recv(); +int sock_srv_send(); +void set_send_delay(); +int sock_poll(); +#endif + + +#ifndef NO_PROTOTYPES +int sock_crc_recv( int sock, void *m, int size, struct sockaddr *addr ); +int sock_crc_send( int sock, void *m, int size, struct sockaddr *addr ); +#else +int sock_srv_crc_recv(); +int sock_srv_crc_send(); +#endif + +#endif + + + + diff --git a/sources/new-s5r4/soct.h b/sources/new-s5r4/soct.h new file mode 100644 index 0000000..21bd3a1 --- /dev/null +++ b/sources/new-s5r4/soct.h @@ -0,0 +1,6 @@ +#include +#include +#include +#include +#include +#include diff --git a/sources/new-s5r4/standard.c b/sources/new-s5r4/standard.c new file mode 100644 index 0000000..76bcd3d --- /dev/null +++ b/sources/new-s5r4/standard.c @@ -0,0 +1,456 @@ + /* Loglan82 Compiler&Interpreter + Copyright (C) 1981-1993 Institute of Informatics, University of Warsaw + Copyright (C) 1993, 1994 LITA, Pau + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + contacts: Andrzej.Salwicki@univ-pau.fr + +or Andrzej Salwicki + LITA Departement d'Informatique + Universite de Pau + Avenue de l'Universite + 64000 Pau FRANCE + tel. ++33 59923154 fax. ++33 59841696 + +======================================================================= +*/ + +#include "depend.h" +#include "genint.h" +#include "int.h" +#include "process.h" +#include "intproto.h" + +#include +#include + +/* Call standard procedure */ + +void standard(nrproc) /* Process call to a standard proc. */ +word nrproc; +{ + word t1, t2, t3, t5, t6; + double r; + bool absent; + int ch, n; + long tim; + char *cp; + FILE *fp; + + absent = FALSE; + +#ifdef TRACE + fprintf( stderr, "standard procedure %d\n", nrproc ); +#endif + + switch ((int) nrproc) + { + case 1 : /* new array */ + newarry(param[ 1 ].xword, param[ 0 ].xword, param[ 2 ].xword, + ¶m[ 3 ].xvirt, ¶m[ 4 ].xword); + break; + + case 2 : /* rew */ + case 3 : /* avf */ + case 4 : /* bsf */ + case 5 : /* weo */ + case 6 : /* putrec */ + case 7 : /* getrec */ + case 8 : /* ass */ + case 9 : /* assin */ + case 10 : /* assout */ + absent = TRUE; + break; + + case 11 : /* unpack:function(s:string):arrayof char */ + t1 = strings+param[ 0 ].xword+1; + t6 = M[ t1-1 ]; /* length of the string */ + if (t6 > 0) /* string not null */ + { + newarry((word) 1, t6, (word) AINT, ¶m[ 1 ].xvirt, &t5); + t5 += 3; + cp = (char *) &M[ t1 ]; + while (t6-- > 0) M[ t5++ ] = *cp++; + } + else /* null string */ + { + param[ 1 ].xvirt.addr = 0; + param[ 1 ].xvirt.mark = 0; + } + break; + + case 12 : /* random:function:real */ + param[ 0 ].xreal = (real)prandom(); + break; + + case 13 : /* time:function:integer */ + time(&tim); + param[ 0 ].xword = tim; + break; + + case 14 : /* sqrt:function(x:real):real */ + param[ 1 ].xreal = (real)sqrt((double) param[ 0 ].xreal); + break; + + case 15 : /* entier:function(x:real):integer */ + param[ 1 ].xword = entier((double) param[ 0 ].xreal); + break; + + case 16 : /* round:function(x:real):integer */ + param[ 1 ].xword = entier((double) (param[ 0 ].xreal+0.5)); + break; + + case 17 : /* unused */ + case 18 : /* intrinsic procedure */ + absent = TRUE; + break; + + case 19 : /* imin:function(x, y:integer):integer */ + param[ 2 ].xword = min(param[ 0 ].xword, param[ 1 ].xword); + break; + + case 20 : /* imax:function(x, y:integer):integer */ + param[ 2 ].xword = max(param[ 0 ].xword, param[ 1 ].xword); + break; + + case 21 : /* imin3:function(x, y, z:integer):integer */ + t1 = min(param[ 0 ].xword, param[ 1 ].xword); + param[ 3 ].xword = min(t1, param[ 2 ].xword); + break; + + case 22 : /* imax3:function(x, y, z:integer):integer */ + t1 = max(param[ 0 ].xword, param[ 1 ].xword); + param[ 3 ].xword = max(t1, param[ 2 ].xword); + break; + + case 23 : /* sin:function(x:real):real */ + param[ 1 ].xreal = (real)sin((double) param[ 0 ].xreal); + break; + + case 24 : /* cos:function(x:real):real */ + param[ 1 ].xreal = (real)cos((double) param[ 0 ].xreal); + break; + + case 25 : /* tan:function(x:real):real */ + r = cos((double) param[ 0 ].xreal); + if (r == 0.0) errsignal(RTEDIVBZ); + param[ 1 ].xreal = (real)sin((double) param[ 0 ].xreal) / r; + break; + + case 26 : /* exp:function(x:real):real */ + param[ 1 ].xreal = (real)exp((double) param[ 0 ].xreal); + break; + + case 27 : /* ln:function(x:real):real */ + param[ 1 ].xreal = (real)log((double) param[ 0 ].xreal); + break; + + case 28 : /* atan:function(x:real):real */ + param[ 1 ].xreal = (real)atan((double) param[ 0 ].xreal); + break; + + case 29 : /* endrun:procedure */ + endrun(0); + break; + + case 30 : /* ranset:procedure(x:real) */ + ranset(); + break; + + case 31 : /* clock */ + case 32 : /* option */ + case 33 : /* lock */ + case 34 : /* unlock */ + case 35 : /* sched, boy! */ + case 36 : /* date */ + case 37 : /* execpar */ + case 38 : /* test&set */ + absent = TRUE; + break; + + case 39 : /* eof */ + param[ 0 ].xbool = lbool(testeof(stdin)); + break; + + case 40 : /* eof(f) */ + loadfile((word) UNKNOWN, &t1, &t2, &fp); + t3 = M[ t2+FSTAT ]; + if (t3 == READING || t3 == UPDATING) + param[ 0 ].xbool = lbool(testeof(fp)); + else errsignal(RTEILLIO); + break; + + case 41 : /* readln */ + readln(stdin); + break; + + case 42 : /* readln(f) */ + loadfile((word) READING, &t1, &t2, &fp); + if (t1 != TEXTF) errsignal(RTEILLIO); + readln(fp); + break; + + case 43 : /* readchar */ + param[ 0 ].xword = getc(stdin); + break; + + case 44 : /* readchar(f) */ + loadfile((word) READING, &t1, &t2, &fp); + if (t1 != TEXTF) errsignal(RTEILLIO); + if ((ch = getc(fp)) == EOF) errsignal(RTEIOERR); + param[ 0 ].xword = ch; + break; + + case 45 : /* readint */ + param[ 0 ].xword = readint(stdin); + break; + + case 46 : /* readint(f) */ + loadfile((word) READING, &t1, &t2, &fp); + if (t1 != TEXTF) errsignal(RTEILLIO); + param[ 0 ].xword = readint(fp); + break; + + case 47 : /* readreal */ + param[ 0 ].xreal = (real)readreal(stdin); + break; + + case 48 : /* readreal(f) */ + loadfile((word) READING, &t1, &t2, &fp); + if (t1 != TEXTF) errsignal(RTEILLIO); + param[ 0 ].xreal = (real)readreal(fp); + break; + + case 49 : /* getchar(f) */ + loadfile((word) READING, &t1, &t2, &fp); + if (t1 != CHARF) errsignal(RTEILLIO); + if ((ch = getc(fp)) == EOF) errsignal(RTEIOERR); + param[ 0 ].xword = ch; + break; + + case 50 : /* getint(f) */ + loadfile((word) READING, &t1, &t2, &fp); + if (t1 != INTF) errsignal(RTEILLIO); + n = fread((char *) ¶m[ 0 ].xword, sizeof(word), 1, fp); + if (n != 1) errsignal(RTEIOERR); + break; + + case 51 : /* getreal(f) */ + loadfile((word) READING, &t1, &t2, &fp); + if (t1 != REALF) errsignal(RTEILLIO); + n = fread((char *) ¶m[ 0 ].xreal, sizeof(real), 1, fp); + if (n != 1) errsignal(RTEIOERR); + break; + + case 52 : /* getobject(f) */ + absent = TRUE; + break; + + case 53 : /* putchar(f) */ + loadfile((word) WRITING, &t1, &t2, &fp); + if (t1 != CHARF) errsignal(RTEILLIO); + ch = (char) param[ 0 ].xword; + if (putc(ch, fp) == EOF) errsignal(RTEIOERR); + break; + + case 54 : /* putint(f) */ + loadfile((word) WRITING, &t1, &t2, &fp); + if (t1 != INTF) errsignal(RTEILLIO); + n = fwrite((char *) ¶m[ 0 ].xword, sizeof(word), 1, fp); + if (n != 1) errsignal(RTEIOERR); + break; + + case 55 : /* putreal(f) */ + loadfile((word) WRITING, &t1, &t2, &fp); + if (t1 != REALF) errsignal(RTEILLIO); + n = fwrite((char *) ¶m[ 0 ].xreal, sizeof(real), 1, fp); + if (n != 1) errsignal(RTEIOERR); + break; + + case 56 : /* putobject(f) */ + case 57 : /* putstring(f) */ + absent = TRUE; + break; + + case 58 : /* writeln(f) */ + loadfile((word) WRITING, &t1, &t2, &fp); + if (t1 != TEXTF) errsignal(RTEILLIO); + if (putc('\n', fp) == EOF) errsignal(RTEIOERR); + if (fflush(fp)) errsignal(RTEIOERR); + break; + + case 59 : /* writeln */ + putc('\n', stdout); + break; + + case 60 : /* writechar(f) */ + loadfile((word) WRITING, &t1, &t2, &fp); + if (t1 != TEXTF) errsignal(RTEILLIO); + if (putc((char) param[ 0 ].xword, fp) == EOF) + errsignal(RTEIOERR); + break; + + case 61 : /* writechar */ + putc((char) param[ 0 ].xword, stdout); + break; + + case 62 : /* writeint(f) */ + loadfile((word) WRITING, &t1, &t2, &fp); + if (t1 != TEXTF) errsignal(RTEILLIO); + writeint(param[ 0 ].xword, param[ 1 ].xword, fp); + break; + + case 63 : /* writeint */ + writeint(param[ 0 ].xword, param[ 1 ].xword, stdout); + break; + + case 64 : /* writereal0(f) */ + case 66 : /* writereal1(f) */ + case 68 : /* writereal2(f) */ + loadfile((word) WRITING, &t1, &t2, &fp); + if (t1 != TEXTF) errsignal(RTEILLIO); + writereal((double) param[ 0 ].xreal, param[ 1 ].xword, + param[ 2 ].xword, fp); + break; + + case 65 : /* writereal0 */ + case 67 : /* writereal1 */ + case 69 : /* writereal2 */ + writereal((double) param[ 0 ].xreal, param[ 1 ].xword, + param[ 2 ].xword, stdout); + break; + + case 70 : /* writestring(f) */ + loadfile((word) WRITING, &t1, &t2, &fp); + if (t1 != TEXTF) errsignal(RTEILLIO); + writestring(param[ 0 ].xword, param[ 1 ].xword, fp); + break; + + case 71 : /* writestring */ + writestring(param[ 0 ].xword, param[ 1 ].xword, stdout); + break; + + case 72 : /* open temporary file */ + genfileobj(TRUE , param[ 1 ].xword, tempfilename(), + ¶m[ 0 ].xvirt, &t1); + break; + + case 73 : /* open external file */ + genfileobj(FALSE, param[ 1 ].xword, asciiz(¶m[ 2 ].xvirt), + ¶m[ 0 ].xvirt, &t1); + break; + + case 74 : /* eoln */ + param[ 0 ].xbool = lbool(testeoln(stdin)); + break; + + case 75 : /* eoln(f) */ + loadfile((word) READING, &t1, &t2, &fp); + if (t1 != TEXTF) errsignal(RTEILLIO); + param[ 0 ].xbool = lbool(testeoln(fp)); + break; + + case 76 : /* this coroutine */ + loadvirt(param[ 0 ].xvirt, + thisp->prochead+M[ thisp->prochead ]+CHD); + break; + + case 77 : /* this process */ + { + procaddr p; + virtaddr v; + p.node = ournode; + p.pix = thispix; + p.mark = thisp->mark; + mess2obj( thisp, &p, &v ); + param[ 0 ].xvirt = v; + } + break; + + case 78 : /* reset:procedure(f:file) */ + if (member(¶m[ 0 ].xvirt, &t2)) + reset(t2); + else errsignal(RTEREFTN); + break; + + case 79 : /* rewrite:procedure(f:file) */ + if (member(¶m[ 0 ].xvirt, &t2)) + rewrite(t2); + else errsignal(RTEREFTN); + break; + + case 80 : /* unlink:procedure(f:file) */ + delete(¶m[ 0 ].xvirt); + break; + + case 81 : /* seek:procedure(f:file, offset, base:integer) */ + storevirt(param[ 0 ].xvirt, currfile); + loadfile((word) UPDATING, &t1, &t2, &fp); + if (t1 != DIRECT) errsignal(RTEILLIO); + if (fseek(fp, (long) param[ 1 ].xword, (int) param[ 2 ].xword)) + errsignal(RTEIOERR); + break; + + case 82 : /* getrec(f, a, n) */ + loadfile((word) UPDATING, &t1, &t2, &fp); + if (t1 != DIRECT) errsignal(RTEILLIO); + param[ 1 ].xword = directio( + ¶m[ 0 ].xvirt, + param[ 1 ].xword, + (int (*)())fread, + fp + ); + break; + + case 83 : /* putrec(f, a, n) */ + loadfile((word) UPDATING, &t1, &t2, &fp); + if (t1 != DIRECT) errsignal(RTEILLIO); + param[ 1 ].xword = directio( + ¶m[ 0 ].xvirt, + param[ 1 ].xword, + (int (*)())fwrite, + fp + ); + break; + + case 84 : /* position:function(f:file):real */ + storevirt(param[ 0 ].xvirt, currfile); + loadfile((word) UPDATING, &t1, &t2, &fp); + if (t1 != DIRECT) errsignal(RTEILLIO); + param[ 1 ].xword =(int) ftell(fp); + break; + + case 98 : /* memavail:function:integer */ + param[ 0 ].xword = memavail(); + break; + + case 99 : /* exec:function(c:arrayof char):integer */ + cp = asciiz(¶m[ 0 ].xvirt); + param[ 1 ].xword = system(cp); + free(cp); + break; + + default : + nonstandard(nrproc); + break; + } +# if TRACE + fflush( stdout ); +# endif + if (absent) errsignal(RTEUNSTP); +} + + diff --git a/sources/new-s5r4/standard.o b/sources/new-s5r4/standard.o new file mode 100644 index 0000000000000000000000000000000000000000..1009924a00d4861803066d5b2e0665ed05959fe5 GIT binary patch literal 10908 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 +#include +#include "eventque.h" + +int Couleur,Fond,CurX,CurY; +int Coul[4],Pal; +int MOUSE_PRESENT =0; + +MouseEvent *evt; +EventQueue *q; +char *ret; + +void mousenit(int mo,int ke) +{ + MouseEventMode(1); + MouseInit(); + evt=(MouseEvent *)malloc(sizeof(MouseEvent)); + MouseEventEnable(ke,mo); + MOUSE_PRESENT=1; +} + +void mouseshow(void) +{ + MouseDisplayCursor(); +} + +void mousehide(void) +{ + MouseEraseCursor(); +} + +int mouse(v,p,h,l,r,c) +unsigned int *v,*p,*h,*l,*r,*c; +{ + EventRecord e; + MouseEvent *ev1; + short result=0; + + *v=0,*p=0,*h=0,*l=0,*r=0,*c=0; + + ev1=evt; + evt=(MouseEvent *)calloc(1,sizeof(MouseEvent)); + MouseGetEvent(M_EVENT | M_POLL | M_NOPAINT,evt); + *p=evt->kbstat; *l=evt->key; + *h=evt->x; *v=evt->y; + *r=evt->flags; *c=evt->buttons; + if(ev1->kbstat!=evt->kbstat || ev1->key!=evt->key || ev1->x!=evt->x || + ev1->y!=evt->y || ev1->flags!=evt->flags || ev1->buttons!=evt->buttons) + result=1; + free(ev1); + return(result); +} + +void afficheinteger(int x,int y,int valeur,int cf,int ce) +{ + char tst[20]; + + sprintf(tst,"%i",valeur); + GrTextXY(x,y,tst,ce,cf); + CurX+=8*strlen(tst); + if(CurX>GrMaxX()) + { + CurX=0; + CurY+=14; + } +} + + + +int readcara(int posx,int posy,int col_f,int col_e) +{ + char *t="_\0"; + int a; + + while(!kbhit()) + { + GrHLine(posx,posx+8,posy+13,col_f); + delay(200); + GrHLine(posx,posx+8,posy+13,col_e); + delay(100); + } + GrHLine(posx,posx+8,posy+13,col_f); + a=getxkey(); + if(!a) + return(getxkey()); + else + return(a); +} + + +void beep(void) +{ + printf("%c\n",7); +} + +int affiche_chaine(int x,int y,int lg,char *txtd,char *txtf,int av,int *ll,int col_e,int col_f) +{ + int larg; + char cara[2]; + + + if(!av) + { + for(sprintf(&cara[0],"%c\0",*txtf),larg=0;txtf>=txtd;txtf--) /* affiche arriere */ + { + GrTextXY(x+lg-larg,y,&cara[0],col_e,col_f); + larg+=8; + sprintf(&cara[0],"%c\0",*(txtf-1)); + if((lg-larg-8)<0) + break; + } + if(txtf<=txtd) + { + *ll-=6; + return(1); + } + else + return(0); + } + else + { + for(sprintf(&cara[0],"%c\0",*txtd),larg=0;txtd<=txtf;txtd++) /* affiche avant */ + { + GrTextXY(x+larg,y,&cara[0],col_e,col_f); + larg+=8; + sprintf(&cara[0],"%c\0",*(txtd+1)); + if((lg-larg-8)<0) + break; + } + if(txtd<=txtf) + return(0); + else + return(1); + } +} + +int gscanfnum(int x,int y,int lg,int min,int max,int deft,int col_f,int col_e,int col_c) +{ + + char t[10],a; + int larg=0,flg=0; + char *ptd,*ptc; + int i; + int cpt=0; + short chgt=0; + short signe=0; /* par defaut 0(+) sinon 1(-) */ + + ptc=ptd=&t[0]; + GrFilledBox(x,y,x+lg,y+14,col_f); + sprintf(t,"%lu\0",deft); + while(*ptc!='\0') ptc++; + GrTextXY(x+lg-strlen(t)*8,y,t,col_e,col_f); + do + { + a=readcara(x+lg-8,y,col_f,col_c); + switch(a) + { + case 8: + if(ptc>ptd) + { + ptc--; + cpt--; + if(flg) + larg-=8; + *(ptc)='\0'; + } + else + { + larg=0; + ptc=ptd; + beep(); + } + break; + case 13: + if(ptc==ptd) + { + *ptc='\0'; + a=11; + } + break; + case 43: + signe=0; + chgt=1; + if(cpt==0) + *ptc='\0'; + break; + case 45: + signe=1; + chgt=1; + if(cpt==0) + *ptc='\0'; + break; + default: + if(cpt<10) + { + if((a<='9') && (a>='0')) + { + *(ptc++)=a; + cpt++; + *ptc='\0'; + } + } + else + beep(); + break; + } + GrFilledBox(x,y,x+lg,y+14,col_f); + affiche_chaine(x,y,lg,ptd,ptc,flg,&larg,col_e,col_f); + if(chgt) + if(signe) + GrTextXY(x,y,"-",col_e,col_f); + else + GrTextXY(x,y,"+",col_e,col_f); + } + while((a!=13) && (a!=27)); + if(a==13) + { + i=atol(t); + if(signe) + i=-i; + if((i<=max) && (i>=min)) + return(i); + else + { + beep(); + return(gscanfnum(x,y,lg,min,max,deft,col_f,col_e,col_c)); + } + } + else + return(gscanfnum(x,y,lg,min,max,deft,col_f,col_e,col_c)); +} + + +/******************************************************************************/ +char *gschar(int x,int y,int lg,int *lgmax,char *defaut,int col_f,int col_e,int col_c) +{ + + char *ptd,*ptc,a; + int larg=0,flg=1; + + ptd=(char *)malloc(*lgmax); + ptc=ptd; + GrFilledBox(x,y,x+lg*8,y+14,col_f); + GrTextXY(x,y,defaut,col_e,col_f); + do + { + a=readcara((larg<(lg-1)*8) ? (x+larg) : (x+(lg-1)*8),y,col_f,col_c); + switch(a) + { + case 8: + if(ptc>ptd) + { + ptc--; + if(flg) + larg=(larg-8)>0 ? larg-8 : 0; + *(ptc)='\0'; + } + else + { + larg=0; + ptc=ptd; + beep(); + } + break; + case 13: + break; + default : + if(((ptc-ptd)/sizeof(char))<=*lgmax) + { + *(ptc++)=a; + *ptc='\0'; + if(flg) + larg+=8; + } + else + beep(); + } + GrFilledBox(x,y,x+lg*8,y+14,col_f); + flg=affiche_chaine(x,y,(lg-1)*8,ptd,ptc,flg,&larg,col_e,col_f); + } + while((a!=13) && (a!=27)); + if((a==27) || (ptd==ptc)) + { + ptc=ptd=defaut; + while(*ptc!='\0') ptc++; + } + else + *ptc='\0'; + GrFilledBox(x,y,x+lg*8,y+14,col_f); + affiche_chaine(x,y,lg*8,ptd,ptc,1,&larg,col_e,col_f); + *lgmax=(ptc>ptd)? ptc-ptd+1 : 0; + return(ptd); +} diff --git a/sources/new-s5r4/svga2.c b/sources/new-s5r4/svga2.c new file mode 100644 index 0000000..2510fba --- /dev/null +++ b/sources/new-s5r4/svga2.c @@ -0,0 +1,321 @@ +case GRON: switch (param[0].xword) + { + case 0: GrSetMode(GR_width_height_graphics, + 640,480,16); + Res_graph_X=640; + Res_graph_Y=480; + break; + case 1: GrSetMode(GR_width_height_graphics, + 640,480,256); + Res_graph_X=640; + Res_graph_Y=480; + break; + case 2: GrSetMode(GR_width_height_graphics, + 800,600,16); + Res_graph_X=800; + Res_graph_Y=600; + break; + + case 3: GrSetMode(GR_width_height_graphics, + 800,600,256); + Res_graph_X=800; + Res_graph_Y=600; + break; + case 4: GrSetMode(GR_width_height_graphics, + 1024,768,16); + Res_graph_X=1024; + Res_graph_Y=768; + break; + case 5: GrSetMode(GR_width_height_graphics, + 1024,768,256); + Res_graph_X=1024; + Res_graph_Y=768; + break; + case 6: GrSetMode(GR_width_height_graphics, + 1280,1024,16); + Res_graph_X=1280; + Res_graph_Y=1024; + break; + case 7: GrSetMode(GR_width_height_graphics, + 1280,1024,256); + Res_graph_X=1280; + Res_graph_Y=1024; + break; + case 8: GrSetMode(GR_width_height_graphics, + 1600,1280,16); + Res_graph_X=1600; + Res_graph_Y=1280; + break; + case 9: GrSetMode(GR_width_height_graphics, + 1600,1280,256); + Res_graph_X=1600; + Res_graph_Y=1280; + break; + default: GrSetMode(GR_width_height_graphics, + 320,200,256); + Res_graph_X=320; + Res_graph_Y=200; + } + GrClearScreen(0); + break; + +case POINT: CurX=param[0].xword; + CurY=param[1].xword; + GrPlot(CurX,CurY,Couleur); + break; + +case INPIX: CurX=param[0].xword; + CurY=param[1].xword; + param[2].xword=GrPixel(CurX,CurY); + break; + +case MOVE: CurX=param[0].xword; + CurY=param[1].xword; + break; + +case COLOR: Couleur=param[0].xword; + break; + +case PALETT: Coul[Pal++]=param[0].xword; + if (Pal==4) + { + GrSetColor(Coul[0],Coul[1],Coul[2],Coul[3]); + Pal=0; + } + break; + +case GROFF: if(MOUSE_PRESENT) MouseUnInit(); + GrSetMode(GR_80_25_text); + break; + +case DRAW: GrLine(CurX,CurY,param[0].xword,param[1].xword,Couleur); + CurX=param[0].xword; + CurY=param[1].xword; + break; + +case HFILL: GrHLine(CurX,param[0].xword,CurY,Couleur); + CurX=param[0].xword; + break; + +case VFILL: GrVLine(CurX,CurY,param[0].xword,Couleur); + CurY=param[0].xword; + break; + +case CLS: GrClearScreen(Fond); + break; + +case BORDER: Fond=param[0].xword; + break; + +case INXPOS: param[0].xword=CurX; + break; + +case INYPOS: param[0].xword=CurY; + break; + +case OUTSTRING: + { + char *Texte= (char *)(M + strings + param[ 2 ].xword + 1); + if(param[0].xint==-1) ax=CurX; + else ax=param[0].xint; + if(param[1].xint==-1) bx=CurY; + else bx=param[1].xint; + if(param[3].xint==-1) cx=Couleur; + else cx=param[3].xint; + if(param[4].xint==-1) dx=Fond; + else dx=param[4].xint; + GrTextXY(ax,bx,Texte,cx,dx); + if(param[0].xint==-1 && param[1].xint==-1) + { + CurX+=8*strlen(Texte); + if(CurX>GrMaxX()) + { + CurX=0; + CurY+=14; + } + } + } + break; + +case HASCII: + { + char *Texte=(char *)¶m[ 0 ].xword; + GrTextXY(CurX,CurY,Texte,Couleur,Fond); + CurX+=8; + if (CurX>GrMaxX()) + { + CurX=0; + CurY+=14; + } + } + break; + +case INKEY: + { + int Touche; + + Touche=kbhit(); + if (Touche) + param[0].xword=getkey(); + else + param[0].xword=0; + } + break; + +case GETMAP : { + int w,h; + GrContext *Destination; + + w=abs(param[0].xword-CurX)+1; + h=abs(param[1].xword-CurY)+1; + newarry((word)1,3,(word)AINT,¶m[2].xvirt,&am); + Destination=GrCreateContext(w,h, + NULL,NULL); + M[am+3]=(int)Destination; + M[am+4]=w; + M[am+5]=h; + GrBitBlt(Destination,0,0, + NULL,CurX,CurY,param[0].xword,param[1].xword, + GrWRITE); + } + break; + +case PUTMAP : if (member(¶m[0].xvirt,&am)) + GrBitBlt(NULL,CurX,CurY, + (GrContext *)M[am+3],0,0,M[am+4],M[am+5],GrWRITE); + else + errsignal(RTEREFTN); + break; + +case ORMAP : if (member(¶m[0].xvirt,&am)) + GrBitBlt(NULL,CurX,CurY, + (GrContext *)M[am+3],0,0,M[am+4],M[am+5],GrOR); + else + errsignal(RTEREFTN); + break; + +case XORMAP : if (member(¶m[0].xvirt,&am)) + GrBitBlt(NULL,CurX,CurY, + (GrContext *)M[am+3],0,0,M[am+4],M[am+5],GrXOR); + else + errsignal(RTEREFTN); + break; + +case INTENS : { + word am1,am2; + int i; + int pt1[30][2]; + + if(member(¶m[1].xvirt,&am1) && member(¶m[2].xvirt,&am2)) + { + if(param[0].xint>30) param[0].xint=30; + for(i=0;iEFyZv*w$*>+D*!YMry{ zRNZ_3IA?F8Gg<&4Bp3h{0FH{PV@(A3{~k4MH4asFMiEt60AScoQyc&=I-~nvG5^Az zw5^GZ{>3=_!?r+R3jjd;Zzd)!q9`Sy#we~N1^{?g>@fXX(^YehZGo~i0KD@LsaW?L zdxA4h-Sb3)$+e_1P&Z29OJeK*qGC#SiqWQ(FKaY#JY~a#Hi@4f+a4uwc-hZDtY1!% zLmqg#*m2m@T3xg%P$)hy9nCYD>%}Ao&D8&rqWo`386yG!DC7VD$*5%Ze-L2vkoChV5%x~;W2lYrl^LA%5bZwEbDsK6Z67f7zI)T z$R`sWH=jQN0C*aVBq!d(II~H+CV>j}9#_WPj&$=I62tIqH@nu2XODKN$7N^Eu6)jM z9S^#3JCu(${9h>DZ!n)F1$2r%nGXkhp=mAht^9%nMePTuW!QxxytALUZXZZ7@Ku))m;9k$pg1xFl$x4M#5H(_B zT_?5Lxe*!q1Ad5Qu!c%-g^{7@PI>2bXpeK6V{(R6r?p0vQES=E-x5dq-{^i;R z!v>Ll&Fnu5+0iN&>CX=HF#yTUDwhn71xj9-Rn%|O8!H2cDz|MJXF!h|RPG>>{^hBE z8lVG*-Y+0Ra-s3t0A+cbZW0Kly^nG>|LSQd#{+ZdJ+8UBvUU?mx7DPXN}R(3e<21F z5j7dpcOkW^<>mg0Hd-OnNJ6uA&GcO}zf_tP5hRVR8fGc3=sr{x|JfRz?vG(6mXOTb zq~LHJi7RfNz2Mk173WeA{3G?!LDO-QcnkT_dNC%@)>cfS%C(m%LT=v#lB1=yHM(#2 z=Hk-U<9!=l?(J-H@3m{45CtVTm5%88On>^4){s=sxINhL_XMF>%;MhP;?YE8iZNHu zhZjir`Uv8Ac>bGCf0ZN4)~k)aM++{_bOBj(G1JYsCAgE83#L({sD)ime;z8%rShlBaa#a&)U09gBm!Wd@qe)Fj2;a-c&DJ|=1<1{ zZB*#&qGK8AI@~BX%$~>0P(`VN@ls_*2Pdj9(`R&f4Qaz*n%BOhIVPue_o(r5CvsiJ zR30q+Vw_}(P?j!UX%Qu6`c@S{tdX>bKwSR*O3G9BgB|$V{wZ_;@`KOFfMWl#N0D&8 z_Qfm&lgCQqZ3Vi;x@5Y4F0zKNZ?FBj+#nP|J${bR>;xLzC;eDjVp8xow#S<7tL(GF zyh2d@Mo!w$P_rccA>DqtHAq4!$~bc(F>L>Y=>9;*o1K@HCVrV|_t_Y83E_QZ_{ASNdPia%826`2DzJG- z`+QVIa-YXK_qF<;(?|F|VEYm7XxaP+}h3OE{hvLrglqM(l z7%t>Ayp_j;nFoXlwTEQLJQ?gH>fbYh4AR$%IS(gWC)*bm7vDx;hw|&l>Ka8$kqUoX zK2M0=Uuafi)d$Oj`F>-c9f%2&l8bR9{sZXAfiEwNL-bwoVO>D^OOr56On8`&9qx%t*Cc0Z2%iE>gLZ=1gx`lvx;2kz65K4fuh0EtA|O^jbPF@ck? z9Z7Xmd5;vkbkmBdapUU56mXm?D^$GZr{+i*WL$FkCKs3l)%~-pjP)9N$8kk&(_=)- zrC+7(Jid)`cA~Sa?)PO*@(X`a$ueQ6ZfL}ovxg`2awNOxcYV#PwKAjIugUFB#~N>9 z*`b}Gt%5nP>CM>(?fZX~@dU;G71gupO*aYFjgJiXG!G#}$!@(~AGW}r%llF6^|-1@ zrmC86*jJRY^ZWjEf{CAShi3kNz3KTa+s?=5?F?>ZD`5)p<@Mm-%4LE)u{q-h}pw=13BRj4!H2 zCv62A|Hs53fRfBL_d9guGr#krV%PSQ+tyL88-p10VjS1Cc88zpcfI|-;|4Yfp$(mh zeEy+&%Xq{^{3H>1;T?@Pul)yVN`fz%PZ~<|)MGfJ5@PfmWHX8e^>XQ>KjCFrGIP5F z>J`O24lCtk$#w)VI_W16Au<2t)KUCt;)qn#A|Z#lzOYtamqgVy$>c{dBkBxne=_ z(Wh$MUdI`q-l~?gKdl^|Y9Xo{r7~bm1p!Glnn*^8E$lS72Mi1VZ>2spwb?`5M`V^` z?8xUCZ<)uZw}U;oYmMs*6=L6m;5RL2vXa{Af%d=dJwUxbsXA_LbMF8nMYk*zL<#IP260H7Z{$agrmjN=MI>YB~dP z?Wws-o^vuR~U@yl*q-)*zz`viqI$X)Ipvwo!S2;6%`djAT--dKh1S24lC4}Q|y3c-t zH|Tgx+t;J7(Grv2vVQ0z3hw9Fw5Dmq;T7>>kPx!uMmHBcQPe*Y2{J2%d6J%#r5{a$ z?s>m#s~8>rq|FFl1G7P8xHR6pHqgcvf62)JT!pVhiYakAQNU@6l%FGHpZfH)Cjt42 zD&sXHY%KV`Ini+$ViWoGp#{#%6hAWLPLZ=X4;O~U(Xij7Fm7M~Oz5}sie+`tnzB!cvmAVfo1Bq zpL@~eD$l*c9p2UVAUaz)D>u7}C9}jOwJ)+vC4=uO*EF6ZeF3eHUF*w2ZhfcH@EmPH z2h6oGUlT$zgGas$eM^^Qd2^oG;bOe!s-03^8X%=!;)hZ0_xQXm&ujIx-*EcLgCFrK z5>{G&NVm69j34@!$g`|^avB}4jD_+(*1z5rH9p$(G~WbCU^G-ri*6tgu%|?Y z69-6qgb<_J8&pR-WCPFRz>pHUPfq{v_rlze#gYjUT6sun;cDb?Gp_;L7!BrfL{*6J z?mDdw?vQzlYR)${5-0B6ppiVP)XwfNV*NTl_Fw4nSlM1X%YJVN-L41Jx#E5zqA^QO z%d0RhH8P@1?@*(W+eheJdrhLuG*H~i@jk%(nX~n1Da{bE{l^!V60$vxs(pV>Ra+1iue7@w| zQe0xA4We0(E5&z>Tdu-6=e0DOi+YtOXEm&`5~0%oR_LPyCM1j}e=f^ncR@9y2A zFyL7mh@N}%{}v=B$N&Ha3jlyFf3@>}6(mXkz~(1V>tAKD<&*2P&bhXIP1LZm?liKV zrf;^k@2zSw?$$U-U&x^acSy-z6!yo?QCWlfv*w-NXx)zMqE$q_3h2oM^^K$H@^Pn+ zeCe%FJ&J;xR$}LO3p{Z*w#;wVN($wINFX}h2oFM@=3Mvji99s+)so}oa(JCfa~N&=Y^mH%J@@B=_SW}Mcd~2| zDdRfow90XhbrW?>!!_!-qvV>%TSJ^QhE%1J&zM?@3k6*d&bQ93Ec74npPC*FvRy2v z+>jPpT~9ud_%CX^IAfNbe11gObSe4CxvgLSVSF2CUPJgA7a+Q1?a>%{J%kPf7pPb?E+?;q?N0^^mb-j&jcA8I6%KK8b_IREtRd6OucO4hjZ*1^69AVv@o{C!Q>(cyQLCZPR1|Zywe{>8`;yG`aH*hX zkcVt#hFSblc5sp2`q0L58IfqB3V&e#4Hh{F28!V0pzB!eD7jTHK&@-^;e4*I_Wqfe*U(4td?rOhNjb;Q z#;J~bT7&P`H zF!Pds`1}}heS!5%8{Y#tG};3~Cv59JUXlpum40gyV|lE*l5ZRq_{sUiYvoMv(`(fy zt=HEHgx5qLbhaVUE&ZXmT=V=s_hGUf`|iPLanM&&zLl%;G&wmJkQK+)>m~;VdT%VZ z8{atAH4}IMsh+Lg^^HOL6ESYN$9Z_yn!l29(JMs8@qlSGzUW z8v{XditE!&XK8D%au&Sjwlrzf_i4*SaX=TW!n{fL>r4rVf;qOA{EaVXB~aMwe%Hf< z#GMRL`Eph-0}2@qG$A(x+}ITFURd?wIOH@PJ6#Pi=)q$bXLL z>6c}%$B)Q<98KQMx6$h*p^s|suT*wTfpGtZ_s4jU4S|IKwinG)PyWJJfHVlbrF3%P z!J~YpDp!oeo3+=4u7%h6Zl$o_%qPa0zOE&s z`}9&am-C<}_gR%(Mj(84d%3~qiSkd*94Z@!%VS+6tuE7NiXTplT>6&OOl|yMu^CkY z{0AHp#d3iKbv&+Jyw1UN9hvRAUq`Q=21=RDz1{jguM0m-l?x0poxe2sSXr`iMclr` z*r}7TdoGvuZ9gVI%qjPo75*HpoA<7d-acKQmoK;Xb&$QjVo*4;=oor%MyqCxSfw7D zpk^fhmN%|YrLH?sNConWREIo#q*1GwhJxh3bh%@hesyhm(fzJTJ!tGUXNf5EJN&TQ zFnggkW4!A2xU3hX&$xI`8~3_y+9zBeEn>g|Cl+^#XStZaBHkEif4J zGL7QC1406Rk%hb}qJ-{zIq~Yve@->m&U}>f?Y9eo0S~$PpJ8^|h5q^YgnVMbfSzIA zYEd3@h)Q-qX27pi85#?#+2^B^-E!b$D znJMT7KIl{`&HiEjJ4+YpS0r?THbXA)N)p9%(RfBOIf&nYs8XsE0;7ch0+FJZo?dC;Z)&{Y`G+a^_AJa0k5>fi+ zD%%hTD#hB-v!0IwMO+fM41As7}+dq_Ma?VsPkqj`3x~3ShHqim?8dZ zcSvHmcKA^YJ?*YPO`521b=mRUkh57mBSO%O7hp$lKGw_~Am=$pOl@st9^i5J@KBJ| zFJCjd*`o(p+Su@(%*T1l)VH88ctV{xGLej1_>hfhWVHEkgYHO`^8;cwH+3@BVIq=r z?s4btAoP0C)x+&Y`i0FNGFHj^TqRDAqmXZ41aBIa^88Mr^ZagOTV)A#U}xewPRO{; z9;#ML;-iB38b9}mV|H(+ENRG&3gTY+yvE45y^OVH>FrA6PZF$5-;A%PQ2d?IoT8rv z;Ml?oO0ugogzRfl^4;oG{T2rbGQV8U)pK{jU-|`h_~IbOSqjLnQ%pUrm<~fajrwwM zy6b_-&$}h8{#)en%p`9?DC#6{KxAcwJuzx3&m>+TN)hUttXMw7xLCD;MCZSIXvM% ze9I9GF8BcvvZA4a06Ub_|%aen;8&Kch`2fNhIAoNDE1xNf9Z}DasEF z=}}?!!T5F->ChlT_*>PWDymX$(G|F<&h;=R*ob!@rnWsKLl_l(p+-Hi^lz9Z82D{J za;cCTDa#icrfRT@ND!mJx-#wt-?py$Pl- z1=leU`=Nr$$Qcf=fqhx9cl~|<;DZ>9vdbd=D=@qIyElm@+50C2%uh3dysCK*GbAZ@ z&4NAy2*R8$lGDk?9ysnosz5YP5|nOOzZ0=h1}mzZ8Uok*{opTbCNzV|81z@+z7&L4 zVEH7B?+uYK$(xY??Tc8Ta?Xd;0G{z+ov$N2SbvMKnXDs20*(?l?gO-@7MS<$YEIlH zSkf2N00hkpgoPeAh3O6BETM)Q!91=f)`abjeab?AKUg$E5RNh-nAYdK*f1QA^#DHH zt{{sPz$6YZj1LyYjYB(tkNiX9UbHT!nxr3%@!u+P1PU|lTacE@53!(S_#Qx2HToL~ zB@2_e8TrL%d*1YlOKpijZfC-ihf(hX)=ouy(*TT9py@_{`9B}>o}79^{%`w%r_d-- z*n-N(hjIRv=C8Y&0#{EaLaRrBx4^64eCH6o?M!%eP1V?+sH3Mel-|#>iil9;JA&hN1R%o`cD|v4KLpP`5xIk@8U(UuFX0aP0JuOhZ^lS#;o; z*1v0dO!PGa>^z=_!(W6<3%iW*Kft7koM<8AjGYs+8Up8p&3Ja6Pzgj)n)JA{&(8Ro z*>7UXrqNs2ZwdgzzXmX|V5`0^Nj5`s&+5ZrP2y08@kye%#V{O;A-^7fi2Wj`J^rOD zJAh9@x{IhXuow8UtCjTKx6~LJi<$OrpxQDHbq=2-(o+oWrgJ}^+a+GcmllY!3iT$- z6pkeC%W~5&*a{XqH;A1sfKu8Q?u~FAgs)5ppTX@Z5)#LA5a+d3 z@~hER2Hz3*mm^9Z_E(_kJ-A|l%p#m%z1VT6V4&DZ6|Cbs`~bdGB~v7r#4Ticq;1KE z$SG5V0L3krtks?bjOn}~s<+&pBv=~y7q~#(Ej-D332QZ9N^Xi$hm4o_OC%Zn>jy@d z^43VZt;$B7e=h_-rrC5}z;jaFapU~q-gb)wQ^C<;o|1fs!vY` z>Wt7zo#)4v{^!@BPdwAq1EXAjx&Q!Vb>FsD_Je>c=1#CLJcSmcBok@;r3DFzK&~hwFlqd;$5X{>xf89@suspe zfQ^O1)^i^S^lYUgjRtUF-tg+u&7_sl)ur>~;|k%dbRcvzldYJ|IRSUE5Kb=22_t+= zl3aJ`_J$^EHQaM+>ti6Z5pute%R@o(DB{N|;0|blAFlqq^2Fck_*Qn#ZY^lYz^3Jm zofGvT#r8BfzkZ`{Penh-y;Yubz>nI2#l7gK07UTZ`N3jzAO5+(`N!{VA+~e#LFe1o z^@cOLLC_a9UZ>Gr8`!j^VH*~mBVl33cCQUXwsU?%x)~PEXe#@#a0^A?&l=K?t?loReva4^(W%c}R#{D3%*E1Cqxl z1Ss9P$PQw=vCwaRXJLFnhG5YFg0~fP6p9qwGbPjt_9V+UIPZgAmK^0gx%QNX)V{)U zT)&FBZ+~hLb>ms@nCy1(=(#O8<}B|DbX`qL!eZ|GX*_?$&S<_?*}eUF)NC+m-2&AX z=oYoVXyzxJ4B~frEkocT0U;bv$0T7|8ccOh5K0~L+7Xz3*xq~7U0+@}IN;577%j$j z>5P2(IcWZ|f!=)lvAMCeQef(U?>aXZnoh}n;ENl3Zjjt@XG^zQc&#qC&^Y~Lp7 z576dD|5eOsLo5d(X$VKQTi)6u2FEgo)(LZ7&GV-jISlHj@XQ|*tlvc>_Ubo&vQ*?s zerrK$-eAsZBSxt)zq;u^tR=o%tG1(6w|W(xc&<{;Wab#0<1(lA9pSL35qVR3qjuoD zrc3kO`0CoRTDa!&|J6<@4-lamZ^hA^;uTl2MbZ{q-GH1z+&G(fi#Wg*C8c!Ik%46+((YSjzD!DrrtltOfU-YQePPGB5r*g z1b4~^EoT*pZY!f2?gS5u4ca%TirIbNDy=-!+txLdTFd{LT5I|EqMG>!z$e~KLyym+ zr@N+Wl&jo>|9!M=hAXkZPp1W}nW8T6s_!RS$fj`=^iUOYV3E3-D{j&@!(a+p?&YCS zv+_(hX67sM2?U7+L!P3~bTqi;bi6OTfU zJhprV$j?al<%U@5w%wxDG@HZaNuJ?tNJqAL1HN${t+(;<3nWnh#nN{9C2w@@eO~dZ zcEF(=)?EWW>nzB8;cw=O1PwsbPrethOIhMB1+(VKPr;8u>MkZXog4UOJ`zNb{>EWp zy9_jT>o*%nl!Tv%TLuDfVY8fbKtsKqf~vM45k*}`4%Zva(qrA@?{{8^v?K^h@o;?n zr(1i!ZTlej$;V6on)*_;(&;No2s>6VClHrisZUQ&Bh=G%;{qVHgI9Fh>D1v@pro#E zzCuY!Hiex4<}qcY^0pODBetJA`3vV%kFoJLMF3 zLuZ$AuPKnZ9tvYg-}g)I_vW;5h=SMXlX?15Dwn-ho^o9MSWbxg77qf)CF=8nH6ams zHb$fof6o_svbAwoT3)WNX}afuSAQX9DJf#NK`ryD+6-H)v?If2Y35pw>zh$uHyC77 zzzZC-2R!8>MbP^O6_^YjtU~;K1I@B1mPlinFTFNinqe0QxBck}qWo5PN_L@}&d056 z4`syVxN4_enIbxOAEu-i_e-*I4uce)Xv<5^_&`A4 zBo>b$mSw4gr!o+tF4DB&K)oz-BO#Lm*od-Mce(?IZ%fcN|CBB{RH0a}SD|E|A{Oi} zv_qhfIdX3!lvAanB^kMQ6UKAw_cL^qXhsCWgvV`WM`ABq;`zi*0@HN4DN+DM=-|Sh z0+dlIDQ$&AQs5?=xTk1Ux(gl_R9u!G->81$@0?p>i>%?`D9j)bA&AMhN@C-pHEYwW zTj0`)e8Rl`Qg6@`@j>{B8IP1OR3`yodaxob0{Nd48D7O47iIYz%46TVxOyb8WUl2Z#F4eP$k2b{<#VI_w&IKi*#TkbnoZ@ zPi&0g4kP0=x?w#zOrhc%g!_UbHA9KIA*8b~JKnnO1+1#QG77@pR0$JLl0?GuP<;(i zsjgSFQ3m)xUC`)1@mx4!W9=q!_b-o(RjpuM%km-p2Eo?%E0VsjW<#v>z8e#KW!1f{ zbMRfCQpE6l71iy+u|5*pnv~mt=FZlaw(B}tvA()p3>QtIb4se6N3L3Xrz4WVS%5I> zT>}XB>4BjXNPfA|*sgas1ZQ8lUEg`1Zg9IiHX{vI9o`??o+G}=1)O9u%dbLpO0p** zYUdx}BeIJZ%g5Z{ScnuW<=Ik3ZdhWtDjx*YJ0gRzZ|I1#yB+U*AAdZRKUK9W{?41s zR!_u(-OZKl!}5IWmlc<;nFbqm<6j`JW7JgN45|L3(lrznAYtN87uh&dRG*J^1rH0D zfV0H6G2l%jY}vm=0OL2tC?O>%ltB$OFck~<^{rJ8Hu&YQCMNVBr2SRL_|Ns@?>(dp zFw|shDd$ly#NtJGIRfk0j*#IvE*Qf;|2Xatc(H6sGF#hmIH;lo5#pj}WR&@S@B&_U zM#&qYQ7bxMszgYsu+eUCo(6zam!Oa%p?j#J2Yn&B#k*RX**Tsmd1ds)@1!a7V$DMPvJ?AI(%^o9c@hdV!o|6 zE_#QH<@GmfW3HbWbTn$hG{|o@7Z(>c1te*$a@3K_6%%i44r`fi>oa$mcLwDffD~D! zyFBP7J9is511n-ex0;0HneU7R_}%KlNIZa~z!srf@F|EN5c&iJxqtekk4X;!J9@$) zu0h;-pEP_Lzgmh^U?iJm9K?P4VTpUC=97)#kQj;0{4T5 zsO1&g;AqGXm`P#v55|Va#c*Wt$9kbA4uEC&_! zT6)VxR6JNf-%kRT7u`0I?@^LpX35F&?jwDlB#1KX&-jo=9o@ykfk3-F4#m}#t>%tR^AJ!C9F zSU~EZk~*S3V7Y^aBnzS7nqmX!)H=#JMH^W zfTCpJY0M)DZNU9j{`j@vb9a}qs?3cgrfA)%ZDNrEdJww>zVONov4{pEd@(MV&Wl+EO2Qk-kzx{x~fV_A;rnP^GqpwOk%hCH>yYvdq z&!l2ww8=&?6W#5N2*wg2=!`Ge2U&uYz9Tpu0Y{P!(ykX^%xAsH=k}P|=S1k|MBrC& zK5b-QzuKPi^OzclTdnUH-UX+R6+>vxfk!g_6>mbaZ@2-s>EwOFHhpPX)}lQ=aXXAlu2+8kfjk+xsjrCd%IZ`WJS{Y%iE|p9WOzb6u=xXt$erJ-`+30km(kTJCI8Z8rMyvML|*|u7GV|GmjlCzD>hPkU1WHm*bc6-(@cXqA%9^ z91(}>3Op{Z&IP+Ee~`ea~agN&b4MMIZoryOg#@O+YpIKxnQ zu(QfING;DnuIO`UTx+}-1&?+*r2`s+n!4168uMm4x=bQ4i2A??zdf1hmvk)Gj=I5b z8u*g26j@r5Z&dt6|YOfiL1)G8m3J>iP6Z zLtph%fn4rLKpS+_F3R{VAxd<;TNJhPduV`8t?Wg=X(W;!F+(ff=zC%XTzeT9byH}1 zDu(ks1!NiRwKh{sy)kOLnN&&xunb5vtu5TxZzB>uvMhR_tujo7K@9-_UliAF=q-7W6b7I-8**AA}M`gW}()mR7peo-Rb$l z{Vpt!5l^}UJzMgLF_vplHUl~Gz;sy5kAPN`i2pdcRfGOEh&pkQ-UoV)aHx2SR@Do& zm!v+lg+d@up>3-VPH_+8!SFH{OsQ6x>my6j=xW^iS2&a29?MoH;U=X-D6!gkx)-(} zjx|lV{YgJxCy0~>CVCDc0ae5(L_UXgI(h6^(E$F1qPzFTxS|PJyqew7WC+)&4vPkL za9li`Q0DIE0fuycZ9FwT0ADz2N4%?({%U;OsKBlue+v(az!hkGf&^Rdd?1-l%Yq-T z0zB$Hk-&f!8Ld^9#%XeDYY*yGY-C!v*!iIj3RS3dvFas4VQx4kh4GNIrw`o!OayAO z78$ad!N$q5TVyR{XsY`l7_}Q=yYUP>KtR1ATP4D?1A%6!+W3S zE1NbfY1&`r+4{!ON-J_3y0?w0R9RqGZ+n;{gm(Bwc|eIB3b97kiAU{I82|xbUuYGw>*a<#8vdO)n>1iUC)ekSLAG*FrnvnC_obxBjKfO> z43zCAUHW$_O2e)$aGfY~SSBi85ec^7a*EEXD?1yh?C1F40uJDiK}ktUJPU>X#tCyZUMKz!>9B&j{g|F?j~M_Ku`D=13PJg!A(78Uf!`>;n$4>zQ?-WO~@rxZBYCAJ; z*F09rzZ0$Gw4Pol$r3t)WA5Z{PS1{KV5Db?E*js1m`a(_9MjJ^Z=Ujyy`S;?Xojgf zoy|}`kouZ*k0^35|B}q-apD}7CIz@woDh#Od;R^I@%oYeOx zF;UNVTH=gQG?+zG8p&xfT@NQ_rit#rNFeD^1KW9*#@NJA4Fc_stn;Q56} zBR50=lpWvsO(8i{`ljvfRv02=kT%l+H$faa!d_BoeTFunKL#DrT<01+rbBCdr zGJlSh;pNDIPDWaCE>JL;5@*-ZyJ%g>%9pgr$(p4wF-n3CH!TiU>}T|Z-^K`w0T|y5 z0^a%yw}^tZbZL5;RdIGUFuwK=g$bA&Z$2{fmIAgFQWF|nSR<_!SInYw_8^$+0;|nv zCqelVivb83F(O@_uZylz^-%zNCE}_PR5R!8k zI+NaU=(n@pHRHEJAEp~x?u1V&iNU7A<`lZn-(aRq;!}rs-xU%8m|{VUwd{@fHA-*_ z5h=s7Z}QBf2~Wz+$#4<^=gpOa54s{66$r&8!jujS)atlghu9deSxjpbqzK!2zpr<3^jJ5Ml_a3S z9g`HYr(u`4jn;(kg-#D1s*yN`GrhrnC+`!w@8QyQv2m|=%KiL47{e*gLRG3M+>AqU z1MN(vCp|D()8Pt7Z#ps`jEV zy2TE8BYQ5M4BgB<=mP&kr0zY0=n<+t&n1nsi{y{d8TnCJ8jOMjjyLA6gajzOn6UQf zd*T5)a(iQwQr7(*KlFmyTCu z002UePtRiw=ks#iV2E9Pco=~5pw$~q8cj34Q11-)P| zy{AHbq+;uc3{fgrNnfLVTBJiC+K`k3Mu$e&X%^bN!){)QDFv9wrfRh=Hse(N`y=4G zXDj#X;I@K3w4_m@M)sgpHzaA`K&dgzSnkkwC;lYB#oHzXj%_vDBQX#`}WRm65?# zl^-e`VR=I=5oe`DNm&vDE1F72;ZS4NS}Udki83{ z1LxC=s;nDK0w(U@0Y20_dXaf3_>ig&lwc{+{e+thC^ME`ptaFH<8c9=$2^nTdhN`u^OX&afdfzHT!7IUH-i@iRW&n$t|Dc zxY+(j;4pQJy}Z^+V110d?)p4(;Y-+pzYCYNfx2UQ`ZT{v?DCuK^6DB1s=z**V03V% z`wwv%Mh<^VnhRyt{oylAgT;3Y>-aO(026vl|LvXg7$y{v9v{zZ8nKIGjR!Y#@GBN( zbTyL47|opPNJ@YFkM?-Y_cLW&I?x7E=6iW!fx}1^!X}M!H%4{SgQClAWR1wQM7dXb zk?qAK>?P<0s~aO?TLN$1+lxn9aIDxg53FS(%CgBa@?M$D?)iZqN(3TVIkUDGantV@h9pQ`&*3}eW@kUa z?GcF{2`i3xMi{rnxN(8cee}ygU%!uE=SHZz2T5Op;@MQNGRuS{u(WM1)IY83!t$4m z_qXS&uO=~^nGpaVzF%dxzhXaJYjI?sH9dc6pPHigUgZreegr6ExrZ<0r5oAo`Qo+2 zoYcQiz1mWN-lqK7Fil@`*I8b8QH556SZ@p^Djy!sZ^GqT`cVw^%lnboY=LAg^x8pn z>UysQHi~Qv!4G7K)=}S5`yQ?G=k($xvb*fN6R?s&Pv;HiU3b-Y%kl0jG?Mh%HT^>S zf!%dU;LqDz;CF#~aotd-KR`Dh=`Q0}n=@bII(>Vx<9%PwnpQ9ZUw8g^pD%sjhGxMif*sU;d0SpyKGCF7e9~_S_k*TTal`A?*Gum`IK)(T^ z0!X2VR)Z2_wCAt3s5%#oAr+`reo?~tLpn3;LxK5-Q0C&+lu zinJ{Mw+R{BnE^0!M2HU*`Z+cJcI*eEm0{Ppp?1iyilRvU@T!!WzHgB_9ujXEPINqefVz%$|d2-u?G)ko8L8U6P?Dnz>l9OZ_jrK)r?qOuOm2+ykzhBrh z@BL#rNn)vZFv@a>!qxDH!7?4$%w1p1$>!sY0CQk(CuGOz{{G3rVmIDsl+>3^*{>MS zmwB<%RBOaES6|2_33n!dP2ST5X2yVSP_onGZH4POD>wY^Fsw!TiJ(V-vr9+_YGxgh z{tuIC&Bfffpu=N+%j+u$OY4>0>->zf)8U~o{-X_ zZS*rBO!cm7(`KW%%y*XQkSHdDqigFJ+z;BY+>n2u_NYf^abZlS(#C1V)0-*1Z|!z_ z#lm^gpyB58aeeJT0NNrg0A&;Rsfmt_L_0g#WtrKzfA#jzYR$J7sj2O2+olO?L$M^l z`N}V?Ht7D_259{~_~h7yD}!fp=sJAyx0n4@Uzk5t*EVSVt&?LJ+Jlr)Ju5ePIhFvArnHtbFy5!Ff}^0c$a-7Nt4mf6C#;_-D7ZUpeMkyFD#me8l?&vzKl_wTs>*TFAEV0!XbhwAC&{-YuF6F!Hrcz2L*>Bt0un&U!v%@M+S zMrs?m;d|I~|E+_;!2RD_TlHE_kGgzOHA9n9Pm3+D271m#kmATlhoArbpWU9^JVXjl z_iOtLTbt$SPXpY#zYTgBM1Rhn4aL0d_U+rYv=R?Jzf5wdjiNS%Lrbug88yO@6q3*W zBtK6$5sUgENy~2Z`FMF(olTzLOTZJJp;cbu)yn?-ITkaX|L)qDN93fC?}+^P+vYMhhscfbgT*9U zC`nYE65=phC{1GOnCm1!iQz@zwu#7)+sp0C()AJoSBfj7(Fy~Nvup;?)mZSRdv}ba zTirjbX?zF4AB_W|!vV43faGvK zlhCz=iQMC~3_ok@pX4*9S7WYz%v75S0%P7e*_Ime?MDLAMtnHgUiI}(vZGrJfNgsM z0mn(?RNWlLV(RHLi@o=e(3ck+Hp_4IhUY-TbNjyK(7xp`xjYQ2wx7L0zBS7jYtJS3 zsgVxQP=^l^#;5|1j*JFF>YW+!4os0~S9kbm;+jv0uu8^GGG5M7*TzFAS}3%VPMXF7^GBr`MG(k`u*`@EEs_NI!SwaPT(f*s25!H#e^bT zU$3+y31}&y0Nd^iiVIwMqC^G^eh}D%GxF}kpfrL)DU1$B_fYd`3fp|azpYMqfW;j0 zfZH6w)n!q3vvAzU;MX%n{d1W?H?Yilljdlw7IxPdAo3-7-ouwZOezjX#(`YQ5hyU_ zb_5|UBp|20`2WJ$n8m~P?_eMbQj-I$0QqEj8YWOSC~jvUeB@HNKiMpg!Y_hGr#NG1 zDbr-&bXOIUpwEq|e`AmzxTN-M!~fu*F7EKY%EIP3-Us6^^hVx9Uhy0{TcXRXvsXI0@IZ3J5vZcl@C{v+K{a6~!0 zA1cd}sIR0%?9!j)-;Re(^S{UWs(RhZ91m0FW8?+Eirs|@@yp$b_tA?TM0f=gT0=A| zKs}}WW@@fA;8_}N`!|fxyo)HUNuj=o5@Cql&l1!OK(zRhTn`BX!jDKJ?7V&#;pwrf zAk~smhb?0Ofn+u_%+C8sQ6#O^;!=h8{uST zYmMpU+#Tv^BX`OQxeOX_?Z4V%Zga+1gS^gE~Zy;)J$DTMPzd15^VrwyCU zAtEenJLez1BO&z({DUwM7~VGeZ_ks$!uIuorTrn1nh`*F9Lb2*24Y=%N~qmXGnqZB za%}sADCa&4ir>(Xz%#mX>?|V1f6N5d-!Xg~^;MLpB-B2n>>qewH{noYXIsR$3Jd;0 z0d^BH6!*j{f@3x&{XcdD>lIAI1NQh+*iWB2+?8a+;n977;3m8ab>G16$8x^bEb7Y% zia1w5Q7!6IFyUXZA=F!O?hyji5dw@9?oP&Fe0@w_e0?klWX34%5Fnx#C9zu_(>vw1vTqK}+>Rzb zV&T|S@A{zg`35*GLoUXA(zN%hbM zt8{Ae?^6sXT=$E5p@Va26MM2_F(KUN9+AIc*r? zFGNN{0uDx>mtif-BMAU+fBia*FNUouWA=8keb`$)J)5g5uOg$2;$=R2=R-JqwbGw<#^#O#Pjp|9>Dy@#rw;P?>+ZFxcbH*(Sjz~ zv2EMd9pjE|+qP}b+_7!jwr$(C{pQ(bf4cHC!(r5E2}c+O4<8tSJDfdQ3q=9 z+?>(=6Vdy5o}~wbo~6fOUX1W0g8vv7jl;YK!JY8E@8VhnEnfr&cxKt#3r_pU*K)8Q z$!v1-n4O0a?t=J81b4!G+2h`cMDcvDi=%sr!+xAI!+u;C zZ7vPAR(akBLgleroJWt7Z)~E?ZNAMC`|F)UhZ(ak4S7~Y@J9FgJ}zbdVc`wFGnjl3 zA3(>vg3pbJGQW5gI`X*^u$Yd7k=q|UUlQc>FfX{yq3S45z+J1Axl`n{=)3-b?|@LP z;O)fDQh(H2JD0(+MY|2Nx5W%|$;X}ND(hS>Xv6NS&-h*AdvHwMx7gpSo6OswgU^d# zBUUz;yEEIiQ3KqqeRGRBE^sjx#!&}*#9QGwB(!^v_MpHK6gc|uV+gN6c>c z^TUn#`IfRr#_nFgedZtD7yqN%#WJmx-uo6VGk8xmZztY&>pMq)VmkYSD84u-)0<>e z)Fsb&MiDLaDV9G-&%>*tN2M@I#g>MxON6a;r!BJ+9`Eg=nm|ZVu(h+bN76QgnO>Q0 z>!unTc|!Y^jZ($ES5HABU^l95i0s*?EDno<7cQ6=rIJ>zzTb=NE{@okm-xMnzu7cAPgjLa zZ~q>Yg|_IQF2EoZ`ZmZ4tG{yWIYxh)WodX&zI=R8)IQ3$;bF{&-oQ)F4EUFB+E7vK zx=$+&AjdroICJx{OjR;9wr&ci-Pg_ zF}i9h(Jc{yuP&FlXoTM%x=TBGi{+TNT#(`}xh-IfLzg!ali&RbpwZ1?$Lh#_QMxa| zFqpBb{hMJeYfbf932b}}-3N8slTYV3IqHyHPu^sCcEf7jqW>^CfkIW_k{4qxt2va6MEl6W(X;e#~lxnRddBRuFg+S6MjUji1|(K z4P>BRP6WYF*jyBEA75Wl>Arj}#>ZVKX~B=K<}V#zXALerHw(_52_~P_+#9Vn#U@3I zy(!i6J!O&bQS|JO?skuQAgI=i!UYnH2VQk1A;nrys;IlI`~+dA{U4=4R2?y7Boq*x zn9%On9XlgF%TH4m+1BsR$3vJbdpI?%$Z+h>q4C)Pv6r`B30E&B+O(%;v_1*dL8*BMQQDK=QB_fo@{A>)eSG&Et%%DTeLQ zm#TOy1>A~0+pw9Jm=O;;zxi%5NruEp}L=q{AO zZ0Hg}bECY0r}*GtX+gshvgnxp1QVQ+pP5>)J=`o{kfQS$?9O(~F<6V%a$)`2-G*uG0U>a- zot2kr4^k0=MX|`MiUqSB{0VWTO^U)`+2s1lQzj}3FaTdbTMMJpedNAH}O~C>Kd)xyhL9s*CEa%==L#E++u*h^PT=U(k=ckYa^6An; zA|UZsY(XIQKvIR@rNU%NCiBNoRaW->Pf)Y>zd`^wR=Mm3fvYH@W_5InK23Tuk>znmQ}rW zen7Y@T}?dH&;lg@P@2mabz2yQM7er17qB4E;@8()^P>a>KlYqKwSKdVel@eTL;_+H z#k!rTj43bapzsx1J5|MpeMz|%ud#Y>NLv_ddrqk#>D{Y-z^GjEac@nr5^g;Y397i; zAa`#rea^9eF~ zygw@&kJ6_ZYp{}%+-^E@^LWO@HWc~K=ov~$+=9}hXtK(%?F!1gT2%Xu6L6)Ao_nj@ z6laSUp~<#=q+Mn7X^1TOlxBt{i_JVHbevY>EbiDiVh@+RmheK?c`Kcd(1Cg+{1d4R z8BJ)pkqZnsDfV?_$Df&*b<(pf4pqI!a7cgSxtK(m2hX~dCg#I%D`nT21I60ci~#7d zB3RnnrO^b;V6qL&G`DPlcDyrrNAi;%=P#q4hF@33iv(hCvkQfRwait4Cx6%2AvCEtBn+X8jAfX*^g%Ec5gvA+9knZh?W$Rbxu2 zAuXrPo@ae!W8+>Jo23aR*OqP>fuV!tkq>?yWlh|PD@?;E`L_w^%c*~+a%3`ukw0i> zX;FsSq!gQ89NXcdgdLL7jGbqc%u29y*tu35M=~QdA}uOK^5_Ybjw-Ie&Mz+tkocHH zvH^(visXqAOu3?a%+jogjNYsCg^VVuK5DrBZ!)CY5%W7?cJk?SO!Ae2d_PMA#*84+ zBNuI##CanQdst&_0ndpwMQmgyE(*&zhRT8x4Mr?K0^-N4xJBT=D6Nf_s8%alGHkbZ z|Ad$_f-2t0No{jljDwiVESGB}n(N_fl){H1+Dl&xvpcsp-c1fLUjpvH04IC#+}qv-gJVx<%l{CjcW?mU1~73`}8vZ zMDy}#PSz%y;zQUeGwwwkU*X^^Ej!3hdL-xAnW&a>@QI2TyEWDm5EYR~U=yWx{WXB* z*00izk6IADe zv5|7zexj}f(w$%>!{Xi$jT~kjyR-fBqfz_|;-11rJ>eS>!M-eZ3<4CyWx0z-F`xr< zY9aRedU5oQ747o!@<}G3%H?fJ+uPMzo@|Je{RyAY)Z1Q=nwx%$O3f+ljRWf3K!=+AoO2476S&-FN*LSFLnTs^gIz>@pv?XzrdlsL&mMaFRrYL(~mmrvmz$AT~uo^YYfz|r^^%KV}YXQ z&_~5`+scAToLJ3{&OCSfahB(0o_AIpCQSN+zz*m{?24qaM$RQCK~ZznmaC>wE65 z;R@*k3<7&Z$o~eCZ7k*Xu2{xM>z?V9j*5?p90ME2jpIfpfGMs($p^@zl-)4W1;W%t z{ywo@dVjF?B+7s{-6}HxyX)QmNqxmwDv3K|?xjU?EcC!0p76Afo+W`H?3xDNW7%^nBHk z>}2OXkF)VbY!>jVl!Z)jvOAox(oj4Z6UoJZQ984UNy_Gpl`P~V^c|M*V%9RMUF7ZS z-;O~gdq(79?HrD>WyaFGEU;HB6lM|it%w=A#_2St2ZGHpS(|RP(WRyqW6_D~Se7+Q zGRsQj*h&0-k=DB%NrN^j|LpeX^QhWVyC>Dt8SFSi@4NO#y1$!`_J^O~aixz`{(Zr` zLLC6I0(!4=0OYN?g7pOfFWqGaP*Pe;_=ov(=b6DG=$waHnyr(2xCr@r&=>%|0q^~t zW737B!x9C>4e$%Xkx0AMxiXv)c;~BtS#f0e##T~|Ws`xia24qw!4|}%Y5B3?7m_V1 z8zI5AWE+&G^|8Kr;`Y>JE|^kCh_8;Dwk*GC0ji%zd0jR!4t~(hL0K~8-*D0zS^N{~ z@?DcFE=9=Xw`|!@xiRiV^OvFY)Z~GTvSnPkgtYVDx;&N#GD@E0_3=0%0L_*NFRr$^JW6l!WvjEi8x^Dkl84EC-b??|-< zFBh5>r4;{69>3?1pZFf1s{7|yV7%T^gT-VAo^yls2hPNNIYmUtH6i=%hIP)lS@%Eyu25|hB-oISi`@QKE}xe^ISwCh8C{dVi>_v z#OmQVRaSjh=9lqr6q1U%urD5Jbg)k?H9L(dSrQSO*LOjo_{8YlO$NPBv_YZbv*gFwAchqOVg1Kf<4E0 zbc5f(uS+3=3|p{P+6t`;TJ-<*M}_QTkO9?pF~O1(dfW}|a>EC`6&xTojj(1X17SSn z3H1l_g7(+*gqsUVmi_5TxvBVh6D!7y=F&G;btl7kylHGt1LYA5jAy2?J!Xe78xY)M3p#BaL4SC_-Tzdl&=q-W|_vj+PHr+HimwLeDPIztfV4L0(A64&S1oS-3fxGRoGSzUoGM4z}T&(fv^zq)qxl&N3_V*sg$%%}nUBT6> zWukM;tDR2WJgvD4bLh)ZzZ8@7v2OHNifs`l=}I~3G0~X(in8+rGo5Pj?XVzGBL>$p zN<-Aay&}(?;wQ>_XZqFEmq+M)Q{Uu`n&qnVf{BlkY{(Bs61I#M@Pjvz>}+(wVdEl3jw~uFOPvO%g7rdv;{_6tATn z&t;@OjvbVFf99&@&3quxrQsgP=keIMkJUFXAM=;HJ!2bF)Gymyfa@2h|A9RAe+*dCo&Ekx9PP}ZrHnlp+>8t3p z5p3~AcOCEAReJfmoAN6WQ9CltQ#0)m5@WIf|%$V4p3V(N8NWU%akI#Imn8R}h z=X@j{n82M1=z2vl#MDT7ORBqOUsZO@X?+xK^)&B(V*+=+7Q)>&;hseQy)hTV((sz` zkK1-z!`)BAa{ZpVKegYv)9m>aTl1aI_lk;(zTEAwQ|NfNY+wAmkw>*v3_>MUX zsi*!z6cqqoApiLp{wjCdDf^l`5Yf17o$I=}D_AvuYj(vlN-@iK*jssCqgNzXYuO4U zIBA&l{_!T440un&k{Lg6)fR~S=F_cuOH=;Y!dQ_R$s3lY_7u8~@Bgy~kXm6e|+=G%P^RY259TlDC#0gj~vTnuPxGMXy z0?U-mxmBsarcla7b0wp*+O~DfFN|sCTRvU#4s?2UQyg<)?ktqX)cyl*$TGiUn(%F% zfn$GzJY{nP%RzJTbD-*3Z~qc>@fEXwFjL=t)zKxi_K)SlI~(6jnd1`)FIBSPR`sT9 zFVOm{6aLYxyZ$o=rsE8D=K6$L=GnZ3ZDh*FHZuKt#-o`CH>5^3ed}-K*7gWM_fpY^ zH_wpzi9#gb!#MZ*(=+>C^Kx|$A`{vW>)EU08QZ%uJk_68W4zi1&+$LRtAexfK2Jz9 z{X66t_A8`Z2m3$vH)yT}eCqnD_cPaUu+F$ue06&RCgqoo_$K9#Zu$+%KI`-yLzV9F zC%%+y(&-Om7t1!GRxZ}8uUBlfx~t6^Y4{Vjmu($P==N+c*u}QjEFBFaRbcLr4O_6) zIxOy#%|3h}QKZ4N{} zF*(=r*e~YE{7+}1q$p(~xo06xEzL5I;eA(St*qQQKLd>&DA1-;^t_=cPOl=X1z4B& zCD}PlJOG#WGmet^><{XF#kfBCUNB$l3C~`H?(oOON=r^2T;9M-*=xAIV^vxE2;X-Q z7LQr=qxk8w({B)ti6ZNjG1YP}i@Yf%Ig=$hwz9nE*`5*Z-w}xNxe`_2kEln*=ZEn> zPSf7|h|nb6#|=5>Xk|-;=QB^Skr1RgvD3a1>As*@9p$6nsEprP+@Buq-$UH@WhWn` zp)@J?X|iAChCj#IzV9VDKM0{-_m1T|KOa)QKZ-Li<|iME58p_g)vs~tRt1k`F`rHk zABhi79USW{C0R|}Pdxu#?&?Skh9jGLggB5`Pj>}-_N?RZ@K{;V;c&vj;sS%Ca1q(< z_TP;&(0JZSga%@;(eUU|F;q`?Z)@|1^cMUD&v~gB>KKU(3IefcEFblR;^2Nj@h{cm z@X=Vp=Gp7^iOA^aSkb|eaFmc7(f)i&Ss4iphW17xA{vSehlj;TLL=f}#4{4>35k~A z19Fm)kpV@_m*y4QwT2Bu4TR(2(QtDc>FFCX1ktzN>E9_fDs)BlzJGYJWQ;`N!{M<( zg5>oM4DVjW`RGoyM>e1C?HP>96y=UoLdLcmC#j>cRUWiZ#>hFmaQDc0_Ud{-zm5tz zgU72a;wJ)+10DtOu@k=k<&y%Rqvg&$0(X&sFAZ{sqcAW#Y<8$ip7;?qY^I!0;TbDg z*G~7&6WT;Y9O5yV=eS@Ev~R?YD$Gq7h2*uPKMD9TDof6N6OQ8l9o`SZma@=AWVCmAC zuz2MzTDCsHL2NnAL2R|UWSyB_)rc(ET+6~`+~>An9i-g61@uv{cvU^4*!*9r7rQ~+ za-oOWJ=Wt`KO}1%wnnQTR=F(`&|Ztghov06J@L8kfVTN)hmW5_;0rWXp`}*FPjFJ* z`Lp27fY*NZ9M0Icc(33G0QY~r{P0P@pZ$FN;0vv@^X;2GqW)irTI?+7xnS?!p7 zC_gn?kdd0pZHFfZNBexT!MW6yZlgVUuwY{v#a52+r6}0$<=}D-Ikr(@NblST`jX4u z;+Y3v69m|f^)hpl|(t&2B%g35*8;{9=R$ zApF0G5fvS%s&0q#ws>iteG}40vGgshHn$E7?p+Y}j;^VI@Bs*)f&X3t3U8SFG1hOu zR@_;@7XY8&qcWC9hOJLGZFTXnT=OBftG%qYH*&Dq@(*r=N49TbqBS>TMJGYL4g%Ra zA3SUwd%c0-va7}g7n@mlWM;uz0EaWmuxtt)f6CAl%QC%A&MW^#mpKxbZvngz@SMVX z0qE3P@R16+5kylEN2|cg<5TSERLhOT+SRDiJY}g}h^k%&FycHp0^-aj z;7Fd2AidXdJ{dUg5R6VN)d@x2mSSJ@;yr>Ro4iVAT&JC~EdcrcCvM(D1zOfi1ls$i zuIq0PzUvN#wfk5Se8t8I|Ly%XSn-ru|8ygzoJn!8Xfy+|=Y zdho@-5!ij$*AP2)l9s)u{C!;@hGAOR2V1v>0UQ9);q^&%P%FEG@PX%2(X7yhdyFF&M z)y9?Z4}r0iFc>7~sCwej2aSF|-CZ`(gyh z<87BWEwr|lXGh=2vwOhK_!&D^w+ry4m%S7>$PPzkyI&4I9r#0!dlp}8pr1c92%DQ) z(8I3fZ}cHzlqrNIyP$eM)-*~(%&UOOo-xoJvt7_sKQf!a>ml9n=%f8OY*I!W)oe>wT0-LztVl{YXrpl?~< zxN@1;`0OW)?%tSvWWAm{y?*iK@U#{E`p!ug^!loq621J)5yY0y%&o%nW<2}6%d}pb z*0>%CgIqezkgZZTl7F&YO?aW#h6Q|r`RW#i0I@Lo=9kcvxH9fZ9Lpg27MIv^WydYl z(7>C+&G{g&4&i?BPIS{dr}!TklmEiQE}#Ga?!R5*UG;Mb|IOnH3Cjt~2+@iCHjKC0 z|7!h%bXa!G6>mFE^7-+Vp*2G30VLKdY&G~HHT@;hM`^H5(qfzBJmzKNwF_SGviZrd zvWwqebIGtulBn>)G-}BqP44D7*nx4)VGFg!Ht&*fqkdXAbc(TAf+nBJoKC_m#uJy% z0>wwo6R7ukm$OP!K(?BO%Gg-)56uxz0FnT=^Nz;F3`=170@!!kED}7HNpiN2gHI6E z#6sf%b-M;#W~BeiE)F7&=(ay@I=~4Z2QmqKZVyVq>x!HkM(a242AIzcL2cqq!TN_k zL=5rx3>PryZcYW|*|{=*$KHNNPi z{xUL(G3M@)$P8-@?fTaLdINYMJKrw=@=uvI@tw|!T9a=v@@mD z_uD%N2L@;0U|3K6^r`al2m8Ok(FtjT6s^h#vwRDI6J7|iXZ~qj=qF|tA;0BEv9p4J zg`|8Hk0`Q7XI;kn5mix4=)vrAJI%sEFwD2hp7FM)AJZ-qeCB(r zlUbQDyMr&e+m)ykS?|?%QqQUDN8^cONq*geZd>Cyyp`?|x5KO~+ol6H-o$Va#c7ZbPj~1ldAEs&rjO6Yk)2k=N(H3^_$TxxpOoK&m9{{YzBY4 z$DPi~{Bo_#^QW4MrLeu6%mmvutJJtUHkK@vuCJx+ep&JTt<5rBkM;>S-gLanSW+ei#4q>|)xW77~1huVaP{9=Q zIyip^zYlt+YG@@sE)C++EEk60VJ&KJ`#)X?FLs|;ec79pG_;{u+O-hHfC)MmY9aS_ zy=hY)9X_*g)Wa@HEGwe!OQtgT3ZiJ+t$cm4V4j8TE9;$3s0#KD{0l=j>JzcXg^juj znl|2dWJ;CEJ91BL2K!cR3>>9Z>w~QD% z@cd`%J4}OE8aD;9KhRf9<1#GQ(;EMI>O}jnstwtgEJsI2N-^6^)1WKmY_84t>|m5o z=NRK##K5qnz&KU}kH~O*^NU?}TJS@@MR2Gr7?2tLVJEPcdvxTIOH~vu`0IP3mRwyB zY`{LExS*58WVM>M5MV{USn}}ja1=;rIxlC8&7fe$Ys(>XNR)WC(8O&2#O(b~BA}tn z;{IENe!r#9I_?kUgKM=`8-=sY(S>Vm-NQygb>lw`>iTY&qCJyIkhKb^c!OqWX5YE zl&R05MUVC+Nx4dcOx6;#_SKni`4aVqxUf0XpW4l?GAk<8u6fC^47%83LQfh6dOh1Y zjl04r`H(;3%(b2u)blk8H{a;PtwSGdUIi7y^qcrmF<_mqS?>jDZ%i=+LvZbZP3tgP zQa8H|i)`%WmH1#i`u$2%hM7J+Zci6_pWs_#Ah_$^z*ibRbI;Y6k;>EyD?t)IJV~19 z{U-dtiO06as^6+pUrPb0I_34>fn4!2?Hr^fUHJZ^PR7gR zGM1dY*gvpEp3Q8ZmwZdLj9?8hgKc!u>nE=nIc+mde?3m*MwQAWtj_UerO$oWvi^nr z@4Dq3BmjT`CIA4w7b?sD&C^oiGLm%siqZf8gZY@*007{}PU+WGEvU%q^nQGgTo6aq z5*zW;%>tQZDH)de=G;0mYxKqw5yORHI5vv4y&1Pmw_Gppq(MNdmk5d@sS;ZgC^L_2}63!?cjqXiz z+ZzsZa`x-Rj+Qb=7SXcP!l=45V6pflZx5&+Owz+0l4*4=8y--QAEYychA4RP;iA*( z(c6L&kUPyd)dG_)cN@_w-&!NgN4!CbK6nk<#FK)lNwcB^2HU0iavPpfr&pzUNt3nz zMBDtBAZzT!mP{6)%lOn*IR&(8@**FN>zqZZgtt8z*Vhxk(JS8TMdAb@bZbJUJg_qV@L)wI$x83HFC=^@8HGzq)AU$x_dZK_SI=p&0EMIB?** z;=qZh)r~}u6gY)5WBp+o)m>_RDBA!liMM8&Nf9*!F8N60vj(J__{EGbllU(z{Wwf0 zMU#ZSr_WsC^G7ooc~T(IDr;^LJ`Phk(($kI?7`j~-?A5taazD@NcdA7My+m z0gl`F3-wQ)r8(q(@B8;O+H5_iNvh~vY=-7T`|S--mB`GBq8 z`Fk#O;0C@Fx<>CSot4E z4Xq0u#BpdnMQO1b?6w^kp7w_(&@tbdH&zZJ@yJpht`M-PtxIpNVqxOteW3_rll_wy z>bRqd*X=2X&4Ju>qJAU*@xvszqj#0chC}5zgt|!SboqfCh-2_5A*2Ln0ggbMBG|Lc zX65S0L65#zPKdeb7Iv?A;gxrj-3Z(`4-qgi>cnwr2&;+QAKP3&kmJQr(D#FzYlqH2 zFG!l^d~V3bFekbc01C$ZQHfDv4Z7SZ;)0@aD0^J-27j86%7!Y^Zj|IZtNmy&W_h?D z#D|Pp`oL%;lxD8ZecsTYFLJI&&v#1Xo}K68a=J+R(eP{-G`9&7x)x$prH zB(2LnSw>dp=fU`p&(@hBe5HAui{i&F-738^^c%>Lqw{1}oqAxOdO7ik1B&m85L0W? z0${6>s3YcEpCiq+@{r6JeCxtA=6tB~0hKG3eJ9sLImkjZVX4xhPp&Uf+#|C zPxLkBNN9mVqEyb}07fF1VBZuqT$!NK+3XZA!!Twi+bh^`a2guhOFHHr{%zJzr)a)A zHl+BkJ^~G9ToFUw8kAUfl%sQl9g|@+QV_F4C?0lhiJ`+PvI9y(G9?s5%?=nu-UecB zVM+TxT5W?fSJcD>&N82L%AOtJ5f0c2{Md+0c6V8zJaxNRD#R2eo3|%js!Wemru+kp z0XViV8@kvzkrEgKUE8YMEVu`R5m-V%5hPa9udzQJp4plitEfmolpyUs^nEb~?Ftp$ z=|va$dlN|$Zqy96?mjL5`n;e7KE;uQF8%oc5s{Glo!m?1H`&w6(*zr?JI2}^*NmDQ z%n;k2`~50o0xKnUF}85!;0B5T(`}c_3YHzUCTJgNb`gy;VM$w#8jE4R^nHS5$jz5t zwIkT4F`H4FR=1O3UqX{fd4st0K5h^Xs`@=W^&Oy#haCse64;d7%uFP(4UHddn4 zB5^FEG%@xLLgG0a1Oy*-xpge!^Y9TL?A{4JW9Q*I=O(c&wmG5wRtgu z`L^@vdM2)%Xe4V1XLAtmif`^ZDZOr>Cb#ScouSLMq$6;_%%cis7FT&Y!d`}M9vn4! z;#5$0E+Vd(cUvy?jvMRSJ<)PzKy+T|G8p9uMz~*@m{jnXWu1duLg~!-l9*x`Y%@TTa3auUBqkI;4%3jjCw{o_L_GrPX}b z#_V}4Dah72JvD(2>8w*S;GqKT)($E4|5R3R6{eRpz&y0$KJ|Df^%!eY_RS^ruW0_f zp$f?S6oKN^)TQSAQObLjtFzl}FG}`myuDpRpoP(ljE> z$Gd{YUiPVm<+bgaaAy1PLaWlNZoG!rQvg;cZvxT$HUPe#?`pS*`kJ}9RvO-nS|epD(EUF2lLhQLl6kq1z!XJ$#er z(h%F?+($od$gg-%YOqvr<2z4~09Huz#Gxw}3f=EHkcC`Wekb19x9FU#&c;{Z3wlsf zW43r(z9^GQ_S|xocQQCz)eXgo7{=i@kYl<;p3iqZfpx_#>q{+h(Vnzty<$2n zpx!Y~3M>8Y)lo+%7mmKc?a{B7Hq5r^YtqIIFFEAut9403*O>SWb?$Z4g3)(sp~_`s z$L}KjCn{vN$2YJRjY(y*_)6s@MUX3eWZ}eO>G!xNSEqfX)*A$gv>xC~c2RACA#UvN zJbg=1*-Q%xJ+fqRpR!3u9woQY-B7__C|3Q$)G@PK*c&?3q}y%ZLi8&yVIzywY>%J( z_6AzHl!g_llE_Ni?Bpodwn?DuC$yh|xE+kXDOYZ7S6(T?EI(e@tG;N=a`b{9Y#OXv z2>%Y@1Jhd8lX}rTZ{1My1lPVH_UTE{J-=J&;uE)8u>U7b5Y@`Sp(-2=sqQZ18j{tZ zIwPu3HJqK`21>q+rVW(AuzMuBmGS2DujwR3x!yVX|6qBP|8U#yKmY*bU;qF*4-mhP zLV{o0K%xJ7BmP2pC@t|o005wy|3LXI$RA_AJuBma9FMkJ;^UG7{igYIu^*3F`;DlPq zv2ugzGNGy1Y>!BV?`1G>1X1l-Z!8ZcvGxw=x9ab-8$DBhl1tX$W! zhj|S8-jBY2kJe@z$B=TfS&?y}snCg5h+x%hmRw-FR@#7&i!d0mD~wp?fe5>t`Nx_- z#)Dzc){rEPRD^n*@<2%@)(lHLys3`hvr06ag1A@;VS+$}s4RaE-6hb*8NsspSlXT! zfRDC-LoG(lN{Y&Np&&hh%HAyCq7FNPvO%xQQKQcdpMg$_j@v{s0Lfj!C-A=@_t=FX zl!X+k9g>R(9WwspQNj|Tuo&jiTZ548-u8gI(98nAI)(gW)P`Mdf4r-b9zxm+MHA&P;4NyEs>X{8U4Ek#qROfr+!UG(gR4!2p z$z@mB0*Dxpd=jXMpjLhK<9abm90J^_fe#xRSo3%e_t2F4o!_G>%bH9?37z7(XIhZG zR6pNYv&tC3t{4NIaRcBj&-{vC^{+&xQSe!GIAHN++HuZ+6=O(@yL)pLdxM7%%hjq$ ztIKQHv2K8&tPh<$dii@1z9J@idqLmLDkd&ZpB9x?mK^^e`n&_qX1U8T=Q|chpxzb38?l47(?T z-v2mt0s^4C{)Wm0FaQ7@1OR~Nm7L@M4Ha2MQ3ZYx#{bMO^h^f-8ejsKIBxtFzVhAX z-T^;8R2m^3{E)CP&)%mK;~~X(J4<7RGU>cO1XE*CfB*1Ob)jZVbb%PC>3z@Q>B2u4T7Qih z2J)XLu|yMMXt+&?6aL`1`r6@=_MpO8!xdOI+=bhHs0oIi6BCjJ7R3QfsG6mMQ)#-N zM}ho5Xep~zVa(fmsXjymC`OrPig#=gTt6Z7I4W3i%7goSBuW#0sa&HFz$Rzf#syE# zI#aj;f^m|(cx$9=f=g}@fk_a|1G#EJ6c(GHrkSEfUh746r$R$PZ&G;wXzE4eow2`~ z#ggqLr{s2dYX7W#a%Gx3SFjdFNr|bvJU@XfI-$UY?kSNgt;@jZ*h~f{D9jk78bn#D z=RnYQuLt0DxNn0nItJQd+VqCtJ@+@qkf^2iEeJ!GsullP*?=MKkNWim#2QXnaFOUcN9>F;It#eWSno{+o zg3E60d(v2(NgyE)_WKIyj{x}t5f1%4uI|B+l!>JEBD$0sd%hD)KY2dxEoulR+SN1B`8GV}qhcwBu>Tb{Qsa$clTB~0L=C2!$e8t({$Ms6I6O4&I>OJoA*qYGV?37Qi zT+BZ?YI1p6!8!fub{HX!_K*oHO11bIEz_L$eUJ43Igfd=1uuMLKZrE+(vJyfzPi@J zRri-|`ewX!$1oVV9!tSt-@6$L{6lLmCJY+HBA596piPwmHkoj#J+B&J|mv>_hl47LoY3!Q2M0MG{m$lq?9}TwQQOf%l}} ziP_H=_P9z4==}R};kQ^6{wWX>D&LUuu6dj1I@DHiAgbx1Q*1noB0i`B|FsoE-?HVf z(*W~_MIO9q7sngVjOG=bK%@ONdZ+JNREK80fqP+8kJhP?nfopU3z<%YJdLm+I83)Y)nhmQf=r*L+nr{&-}0Vupu z{_LV4P#KJ3UgTj=Lmu5BG4Dx-#`H$u<#4-*vd z`JxI6*zW&M518Np009`konlQ)?EhbSVERvb_`+Z#1^@uPaqL(sz9_lNy9NJ7d7z;b z0ZEpiZg%{ZtYdRVb@u|e%Jy` zd)d4Rle}xHzag~Y;F>WCc|Ui@E&6I6?0D!mgNj|rhbRvO#oJH_s ^UuPJGQp1h9 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 z%0D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

    P WYNIK JEST FALSE +C RELCONV - TABLICA ZAMIANY POROWNAN PRZY ZAMIANIE ARGUMENTOW +C RLCASE - TYP POROWNANIA: 1,3,4-INTEGER,2-REAL,5,6-REFERENCYJNY +C ELEM - RODZAJ ELEMENTU + REAL X +cdsw&bc + real y, yy + integer*2 m(2) + equivalence (y, m(1)) +c + common/stream/ errflg,line,ibuf2(265),ibuf3(7),junk(260) +C + DATA RELCONV/3,4,7,8,5,6/,REL/2,5,1,3,4,6/ +C.......... + ELEM=0 + CALL SVALU2 +C WSTAW TYP I NAZWE LEWEGO ARGUMENTU + TLDIM=STACK(VLPREV-3) + TLBAS=STACK(VLPREV-4) + IDL=STACK(VLPREV-1) +C IS,IN ? + IF(WB.LT.3)GO TO 7000 + CALL SVALUE + IF(STACK(VALTOP)*STACK(VLPREV).EQ.0)GO TO 3200 +C WSTAW TYPY ARGUMENTOW + TRDIM=STACK(VALTOP-3) + TRBAS=STACK(VALTOP-4) + IDR=STACK(VALTOP-1) + ELEM=2 +C JAKA RELACJA? + IF(WB.LE.4)GO TO 200 +C < , <= , > , >= + CALL MARITH(1) + RLCASE=1 + IF(TRESLT.EQ.NRRE)RLCASE=2 + GO TO 300 +C = , <> +C WSTAW INFORMACJE O DOSTEPNOSCI TYPOW FORMALNYCH + 200 OBJL=STACK(VLPREV-6) + OBJR=STACK(VALTOP-6) + CALL MEQUAL(RLCASE) +C +C RLCASE OKRESLA TYP POROWNANIA: 1,3,4-INTEGER,2-REAL,5,6-REFERENCYJNE + 300 IF(CONVL.EQ.1)CALL SVREAL(VLPREV) + IF(CONVR.EQ.1)CALL SVREAL(VALTOP) + IDL=STACK(VLPREV-2) + IDR=STACK(VALTOP-2) +C IDL,IDR=WARTOSC LUB NUMER STALEJ LUB ATS LEWEGO,PRAWEGO ARGUMENTU + CALL SARGMT +C WYBIERZ TYP POROWNANIA: INTEGER,REAL,REFERENCYJNY + GO TO (1000,3000,1000,1000,5000,5000),RLCASE +C +C..........INTEGER +C +C +C STALE ARGUMENTY? + 1000 GO TO (1050,1200,1500,1300),ARG +C.....OBA STALE,WYZNACZ WARTOSC RELACJI + 1050 X=FLOAT(IDL-IDR) + GO TO 3100 +C.....LEWY STALY,PRAWY NIE. ZAMIEN. + 1200 OBJL=IDL + IDL=IDR + IDR=OBJL + WB=RELCONV(WB-2) + GO TO 1500 +C.....LEWY ROZNY OD STALEJ. +C POROWNANIE + 1300 RLCASE=103 +C ="POROWNANIE INTEGER"-3 + GO TO 1800 +C.....PRAWY STALY,LEWY NIE. + 1500 RLCASE=85 +C ="POROWNANIE ZE STALA"-3 +C CZY Z ZEREM? + IF(IDR.EQ.0)GO TO 3400 +C NIE +C +C.....GENERUJ POROWNANIE 2-ARG. + 1800 RESULT=TSTEMP(1) + CALL QUADR4(RLCASE+WB,RESULT,IDL,IDR) + GO TO 3200 +C +C +C..........POROWNANIE 2 ARGUMENTOW REAL +C + 3000 RLCASE=122 +C ="POROWNANIE REAL"-3 +cdsw GO TO (3050,3300,4000,1800),ARG +cdsw -------------------------- + go to (3050,3700,4000,1800),arg +cdsw -------------------------- +C.....OBA STALE. WYZNACZ WARTOSC RELACJI +cdsw&bc 3050 X=STALER(IDL)-STALER(IDR) +#if WSIZE == 4 + 3050 x=staler(idl)-staler(idr) +#else + 3050 n1 = idl*2-1 + m(1) = ipmem(n1) + m(2) = ipmem(n1+1) + yy = y + n1 = idr*2-1 + m(1) = ipmem(n1) + m(2) = ipmem(n1+1) + x = yy-y +#endif +c + 3100 IF ( X ) 3110,3120,3130 +C LEWY < PRAWY + 3110 RESULT=IAND(REL(WB-2),1) + GO TO 3150 +C LEWY = PRAWY + 3120 RESULT=IAND(REL(WB-2),2) + GO TO 3150 +C LEWY > PRAWY + 3130 RESULT=IAND(REL(WB-2),4) + 3150 IF(RESULT.NE.0)RESULT=-1 +C RESULT ZAWIERA REPREZENTACJE TRUE LUB FALSE + ELEM=1 +C +C +C.....ZASTAP OBA ARGUMENTY PRZEZ WYNIK TYPU BOOLEAN +C +C + 3200 TRESLT=NRBOOL + CALL SRESULT(ELEM) + RETURN +C +C +C.....LEWY STALY,PRAWY NIE. LEWY = 0.0 ? +cdsw3300 IF(STALER(IDL).NE. 0.0)GO TO 3700 +C LEWY=0.0, ZAMIEN POROWNANIA +cdsw WB=RELCONV(WB-2) +cdsw IDL=IDR +C.....GENERUJ POROWNANIE 1-ARG. + 3400 RESULT=TSTEMP(1) + CALL QUADR3(73+WB,RESULT,IDL) +C ZASTAP PRZEZ WARTOSC + GO TO 3200 +C.....LEWY ARG. STALY<>0.0 ,WSTAW STALA + 3700 IDL=SCREAL(IDL) + GO TO 1800 +C.....PRAWY STALY,LEWY NIE. PRAWY = 0.0 ? +cdsw 4000 IF(STALER(IDR).EQ. 0.0)GO TO 3400 +C NIE 0.0 , WSTAW STALA +cdsw ---------- added ------- +4000 continue +cdsw ------------------------ + IDR=SCREAL(IDR) + GO TO 1800 +C +C +C +C +C..........REFERENCYJNE. + 5000 GO TO (5050,5200,5300,5600),ARG +C OBA NONE ,WSTAW TRUE DLA = , FALSE DLA <> / -1 LUB 0 / + 5050 ELEM=1 + RESULT=WB-4 + GO TO 3200 +C.....LEWY NONE,PRAWY NIE. ZAMIEN + 5200 IDL=IDR +C.....PRAWY NONE,LEWY NIE + 5300 WB=WB+6 + GO TO 3400 +C.....OBA ROZNE OD NONE. ### BEZ DYNAMICZNEJ KONTROLI TYPOW ##### + 5600 RLCASE=120 +C ="EQ REF"-3 + GO TO 1800 +C +C.....RELACJA IS , IN +C +C ZBADAJ TYP LEWEGO + 7000 IF(STACK(VLPREV).EQ.0)GO TO 7100 + TLBAS=IAND(IPMEM(TLBAS),15) + IF((TLBAS.GT.7 .AND. TLBAS.LT.13).OR.TLDIM.GT.0)CALL MERR(475,IDL) +C ZBADAJ PRAWY : REKORD,KLASA? + 7100 IDL=STACK(VALTOP) + IF(IDL.EQ.0)GO TO 3200 + IF(IDL.EQ.8.OR.IDL.EQ.9)GO TO 7200 + CALL SERROR(476) + GO TO 3200 +C O.K. LEWY=NONE ? + 7200 IF(STACK(VLPREV).EQ.1)GO TO 7300 + ELEM=2 + RESULT=TSTEMP(1) + CALL QUADR4(54+WB,RESULT,STACK(VLPREV-2),STACK(VALTOP-4)) + GO TO 3200 +C LEWY=NONE : NONE IS -> FALSE , NONE IN -> TRUE + 7300 ELEM=1 + RESULT=1-WB + GO TO 3200 + END + SUBROUTINE SNEWARR +C----------------------------------------------------------------------------- +C +C OBSLUGUJE GENERACJE TABLICY. +C GORNE 3 ELEMENTY STOSU TO: ZMIENNA TABLICOWA,DOLNA GRANICA /UNIWERSALNY, +C STALA,WARTOSC/,GORNA GRANICA /NA CZUBKU/. +C ZDEJMUJE ZE STOSU 2 GORNE /1 ZOSTAWIA/,NIE WOLA SNEXT +C +C +C ##### OUTPUT CODE : 23 , 132 ,145 . +C +C ##### DETECTED ERROR(S) : 433 , 435 . +C +#include "stos.h" +#include "blank.h" +C +C + INTEGER AUX(4) +C RUNNING-SYSTEM IDENTIFIERS OF ARRAY ELEMENTS : INTEGER,REAL,--,REFERENCE +C + INTEGER I,N + DATA AUX / -1 , -3 , 0 , -2 / +C +C..... + CALL SINDTYP +C STALE GRANICE? + IF(STACK(VALTOP).NE.1 .OR. STACK(VLPREV).NE.1)GO TO 60 +C TAK. DOLNA < GORNA ? + IF(STACK(VLPREV-2).GT.STACK(VALTOP-2)) + X CALL SERRO2(433,VLPREV-9) +C NAZWA 3-GO OD GORY,2-GI MA APETYT 8 /STALA/ + 60 CONTINUE +C WSTAW GRANICE GORNA,DOLNA + DO 100 I=1,2 + CALL QUADR4(145,SVATS(VALTOP),1,I-1) +C WSTAW WARTOSC I-TEGO PARAMETRU +C PROCEDRA STANDARDOWA GENERACJI TABLICY MA NUMER 1 I PARAMETRY: +C 0 - UPPER ,1 - LOWER,2 - APETYT,3 - ADRES VIRT.NOWEJ TABLICY + CALL SPOP + 100 CONTINUE +C OBIE GRANICE WSTAWIONE. NA CZUBKU ZMIENNA.TABLICOWA? + LSTLSE=0 +C IF(STACK(VALTOP).EQ.0)GO TO 30 NO GLOBAL JUMPS + IF(STACK(VALTOP).EQ.0)RETURN + N=STACK(VALTOP-3) + IF(N.EQ.0)GO TO 300 +C O.K. WSTAW APETYT + N=SAPET(N-1,STACK(VALTOP-4)) + N=AUX(N) + CALL QUADR4(145,SCONST(N),1,2) + CALL QUADR2(132,1) +C WYGENEROWANA NOWA TABLICA.ODCZYTAJ I WPISZ JEJ ADRES + N=TSTEMP(4) + CALL QUADR4(23,N,1,3) + CALL SSTORE(VALTOP,N) + RETURN +C.....ERROR: ZMIENNA NIE JEST TYPU TABLICOWEGO + 300 CALL SERROR(435) + RETURN + END + SUBROUTINE SRESULT(ELEM) +C----------------------------------------------------------------------------- +C +C POMOCNICZA. ZASTEPUJE 2 GORNE ELEMENTY STOSU PRZEZ ELEMENT +C BEZ NAZWY TYPU ELEM. +C JESLI TO NIE UNIWERSALNY,TO WSTAWIA TYP /0,TRESLT/, +C ZERUJE SLOWO -5,DO SLOWA -2 WSTAWIA RESULT +C UZYWANA DLA ZASTAPIENIA 2 ARGUMENTOW PRZEZ WYNIK /WARTOSC/ OPERACJI. +C +#include "stos.h" +#include "blank.h" + + CALL SPOP + CALL SPOP + CALL SPUSH(ELEM) + STACK(VALTOP-1)=0 + IF(ELEM.EQ.0)RETURN + STACK(VALTOP-2)=RESULT + STACK(VALTOP-3)=0 + STACK(VALTOP-4)=TRESLT + STACK(VALTOP-5)=0 + RETURN + END + SUBROUTINE SRESLT1(TYPE) +C----------------------------------------------------------------------- +C +C ZASTEPUJE CZUBEK STOSU PRZEZ WARTOSC TYPU <0,TYPE> , +C BEZ NAZWY, DO SLOWA -2 WSTAWIA RESULT, ZERUJE SLOWA -5,-6 +C +C +#include "stos.h" +#include "blank.h" +C + CALL SPOP + CALL SPUSH(2) + STACK(VALTOP-1)=0 + STACK(VALTOP-2)=RESULT + STACK(VALTOP-3)=0 + STACK(VALTOP-4)=TYPE + STACK(VALTOP-5)=0 + STACK(VALTOP-6)=0 + RETURN + END + SUBROUTINE SVARADR +C---------------------------------------------------------------------- +C +C SPRAWDZA,CZY CZUBEK STOSU ZAWIERA ZMIENNA /ZMIENNA PROSTA, +C ELEMENT TABLICY,TABLICA STATYCZNA/. +C JESLI NIE, TO SYGNALIZUJE BLAD I ZASTEPUJE PRZEZ UNIWERSALNY. +C GENERUJE KOD WYLICZAJACY ADRES FIZYCZNY ZMIENNEJ. +C ATS WYLICZONEGO ADRESU ZWRACA NA ZMIENNA RESULT. +C +C ##### OUTPUT CODE : 29 , 30 . +C +C ##### DETECTED ERROR(S) : 420. +C +C +#include "stos.h" +#include "blank.h" +C +C + IDL=STACK(VALTOP) +C = RODZAJ ELEMENTU + IF(IDL.EQ.0)RETURN + IF(IDL.GT.5)GO TO 1000 + GO TO (1000,1000,300,400,500),IDL +C.....ZMIENNA + 300 N=STACK(VALTOP-2) + RESULT=TSTEMP(1) +C PRZEZ KROPKE ? + IF(STACK(VALTOP-7).EQ.0)GO TO 350 +C ... ZMIENNA PRZEZ KROPKE + CALL QUADR4(29,RESULT,SMEMBER(VALTOP),N) + RETURN +C ... ZMIENNA WIDOCZNA + 350 CALL QUADR3(30,RESULT,N) + RETURN +C.....ELEMENT TABLICY + 400 RESULT=SARRAY(VALTOP) + RETURN +C.....TABLICA STATYCZNA + 500 CONTINUE +C B R A K +C.....NIE ZMIENNA + 1000 CALL SERROR(420) +C ZASTAP PRZEZ UNIWERSALNY + CALL SPOP + CALL SPUSH(0) + STACK(VALTOP-1)=0 + RETURN + END + SUBROUTINE SBOOLEX(N) +C----------------------------------------------------------------------------- +C +C OBSLUGUJE 2-ARGUMENTOWE OPERACJE BOOLOWSKIE /N=1 --> AND, +C =0 --> OR / +C 2 GORNE ELEMENTY STOSU SA ARGUMENTAMI. +C +C +C ##### OUTPUT CODE : 100 , 101 , 140 . +C +C ##### DETECTED ERROR(S) : 417 . +C +#include "stos.h" +#include "option.h" +#include "blank.h" +CCCCCCCCCCCCCCCCCCCCCCC + INTEGER ELEM,ANDOPR +C SKOPIUJ PARAMETR + ANDOPR=N + CALL SVALU2 + CALL SVALUE +C.....USTAW TYP WYNIKU + TRESLT=NRBOOL +C ZBADAJ TYPY,NAJPIERW PRAWEGO. + IF(STACK(VALTOP).NE.0) CALL SCHECK(417,NRBOOL) +C SPRAWDZ LEWY ARGUMENT + ELEM=0 + IF(STACK(VLPREV).EQ.0)GO TO 120 + IDR=VALTOP + VALTOP=VLPREV +C TRICK + CALL SCHECK(417,NRBOOL) + VALTOP=IDR + IF(STACK(VALTOP).EQ.0)GO TO 120 +C.....ZATEM OBA ARGUMENTY O.K. ARGUMENY STALE? + CALL SARGMT + GO TO (170,130,160,100),ARG +C GENERUJ ZMIENNA ROBOCZA. + 100 RESULT=TSTEMP(1) + CALL QUADR4(100+ANDOPR,RESULT,STACK(VLPREV-2),STACK(VALTOP-2)) +C + 119 ELEM=2 +C +C.....ZASTAP PRZEZ WYNIK +C + 120 CALL SRESULT(ELEM) + RETURN +C +C +C.....LEWY ARGUMENT STALY,PRAWY NIE. +C DALEJ BEDZIE: ELEM=ATS WARTOSCI LUB ZMIENNEJ, RESULT=WARTOSC STALEJ. + 130 RESULT=STACK(VLPREV-2) + ELEM=STACK(VALTOP-2) +C.....WSPOLNA AKCJA DLA 1 ARGUMENTU STALEGO. ELEM,RESULT - JAK WYZEJ. + 140 IF(ANDOPR.EQ.1 .AND. RESULT.EQ.-1 .OR. + X ANDOPR.EQ.0 .AND. RESULT.EQ.0)GO TO 150 +C.....AND,FALSE LUB OR,TRUE . +C ZASTAP OBA WARTOSCIA RESULT, EWENT. GENERUJ NOP. + IF(.NOT.OPTOPT)CALL QUADR2(140,ELEM) + ELEM=1 + GO TO 120 +C.....AND,TRUE LUB OR,FALSE. ZASTAP OBA PRZEZ ROZNY OD STALEJ ARGUMENT. + 150 RESULT=ELEM + GO TO 119 +C.....PRAWY STALY,LEWY NIE. + 160 ELEM=STACK(VLPREV-2) + RESULT=STACK(VALTOP-2) + GO TO 140 +C.....0BA STALE + 170 RESULT=0 + ELEM=STACK(VALTOP-2)+STACK(VLPREV-2) + IF(ANDOPR.EQ.1 .AND. ELEM.EQ.-2 .OR. + X ANDOPR.EQ.0 .AND. ELEM.NE.0) RESULT=-1 + ELEM=1 + GO TO 120 + END + SUBROUTINE SARGMT +C----------------------------------------------------------------------- +C +C POMOCNICZA. BADA,CZY 2 GORNE ELEMENTY STOSU SA STALYMI. +C NADAJE ZMIENNEJ ARG WARTOSC : +C 1 - OBA STALE +C 2 - LEWY STALY,PRAWY NIE +C 3 - LEWY NIE,PRAWY STALY +C 4 - OBA ROZNE OD STALYCH +C +#include "stos.h" +#include "blank.h" +C +C + ARG=1 + IF(STACK(VALTOP).NE.1)ARG=2 + IF(STACK(VLPREV).NE.1)ARG=ARG+2 + RETURN + END + SUBROUTINE SINDEX +C----------------------------------------------------------------------------- +C +C OBSLUGUJE KOLEJNY INDEKS DLA TABLICY DYNAMICZNEJ. +C WOLANA PO WYSTAPIENIU "," LUB ")" +C CZUBEK STOSU ZAWIERA INDEKS . +C PONIZEJ ADRES TABLICY . +C ZASTEPUJE 2 GORNE ELEMENTY STOSU PRZEZ "ELEM.TABLICY" . +C +C +C +C ##### DETECTED ERROR(S) : 431 . +C +#include "stos.h" +#include "option.h" +#include "blank.h" +C + common/stream/ errflg,line,ibuf2(265),ibuf3(7),junk(260) +C.................. + CALL SVALU2 +C SPRAWDZ TYP INDEKSU + CALL SINDTYP + IF(STACK(VLPREV-3).GT.0)GO TO 200 +C ZA DUZO INDEKSOW + CALL SERRO2(431,VLPREV) + GO TO 300 +C O.K. + 200 STACK(VLPREV-3)=STACK(VLPREV-3)-1 +C ZASTAP PRZEZ "ELEM.TABLICY" + 300 STACK(VLPREV)=4 + STACK(VLPREV-7)= STACK(VALTOP-2) +C WARTOSC INDEKSU. STALY? + IF(STACK(VALTOP).EQ.1)STACK(VLPREV-2)= - STACK(VLPREV-2) + RETURN + END + SUBROUTINE SINDTYP +C---------------------------------------------------------------------- +C +C POMOCNICZA. SPRAWDZA,CZY CZUBEK STOSU ZAWIERA ELEMENT +C SPROWADZALNY DO WARTOSCI TYPU INTEGER. +C WYLICZA WARTOSC CZUBKA STOSU,DOKONUJE EWENTUALNEJ KONWERSJI DO INTEGER +C WOLANA PRZEZ PROCEDURY SINDEX,SINDXS DLA KONTROLI INDEKSU +C +C ##### DETECTED ERROR(S) : 412 . +C +#include "stos.h" +#include "blank.h" +C +C + CALL SVALUE + IF(STACK(VALTOP).EQ.0)RETURN +C NIE UNIWERSALNY,SPRAWDZ TYP + N=STACK(VALTOP-4) + IF(STACK(VALTOP-3).GT.0 .OR. (N.NE.NRUNIV .AND. N.NE.NRINT + X .AND. N.NE.NRRE) )GO TO 500 +C O.K. + IF(N.EQ.NRRE)CALL SVINT(VALTOP) + RETURN +C.....NIEPOPRAWNY TYP INDEKSU + 500 CALL SERROR(412) + RETURN + END + SUBROUTINE SASSIGN +C----------------------------------------------------------------------------- +C +C WERSJA 1982.02.12 +C +C PROCEDURA OBSLUGUJE WIELOKROTNE PODSTAWIENIE. +C WOLANA PRZEZ SDPDA PO POJAWIENIU SIE ASSIGN. +C DOKONUJE KONTROLI TYPOW, GENERUJE KOD DYNAMICZNEJ KONTROLI +C TYPOW I KONWERSJI ORAZ KOD NADAJACY WARTOSCI LEWYM STRONOM PODSTAWIENIA. +C CZUBEK STOSU ZAWIERA PRAWA STRONE PODSTAWIENIA +C PONIZEJ ,OD LSTFOR+1 DO LSTLSE ZNAJDUJA SIE LEWE STRONY PODSTAWIENIA +C /UNIWERSALNY,ZMIENNA -MOZE BYC PRZEZ KROPKE-,ELEMTABLICY,TABL.STATYCZNA/. +C WYROZNIA PRZYPADEK PODSTAWIENIA STALEJ REPREZENTOWANEJ PRZEZ ZERA. +C +C OBNIZA STOS , USTAWIA LSTLSE. +C +C +C ##### OUTPUT CODE : 150 , 170 . +C +C +C +#include "stos.h" +#include "option.h" +#include "blank.h" +C +CCCCCCCCCCCCCCCCCCCCC + INTEGER TYPL,TYPR +C TYPL,TYPR - ATS-Y TYPOW LEWEJ,PRAWEJ STRONY /DLA KONTROLI DYNAMICZNEJ/ + INTEGER VALUE,J,LSE +C VALUE=ATS PRAWEJ STRONY LUB 0,GDY TO STALA REPREZENTOWANA PRZEZ ZERA +C LSE=KOLEJNA LEWA STRONA +C +C............................................ + CALL SVALUE +C JESLI BRAK LEWYCH STRON LUB CZUBEK UNIWERSALNY-OBNIZ STOS + IF(STACK(VALTOP).EQ.0 .OR. LSTLSE.LE.LSTFOR)GO TO 1000 +C CZUBEK NIE JEST UNIWERSALNY,SA LEWE STRONY. +C +C.....OBEJRZYJ PRAWA STRONE PODSTAWIENIA + TYPR=STACK(VALTOP-5) + TYPL=0 + VALUE=SVATS(VALTOP) +C +C................ KONIEC PRZYGOTOWAN. WYKONAJ W PETLI PODSTAWIENIE. +C + 400 LSE=VLPREV +C +C....................POCZATEK PETLI DLA KOLEJNYCH LEWYCH STRON +C LSE WSKAZUJE KOLEJNA LEWA STRONE + 500 IF(STACK(LSE).EQ.0)GO TO 900 +C +C ZBADAJ POPRAWNOSC PODSTAWIENIA + TLDIM=STACK(LSE-3) + TLBAS=STACK(LSE-4) + OBJL=STACK(LSE-6) + IDL=STACK(LSE-1) + TRDIM=STACK(VALTOP-3) + TRBAS=STACK(VALTOP-4) + OBJR=STACK(VALTOP-6) + J=1+MSUBST(1) +C KONTROLA DYNAMICZNA? + IF(J.GE.4 .AND. OPTTYP)GO TO 800 +C KONWERSJA LUB KONTROLA DYNAMICZNA + GO TO (800,610,620,630,640,650,660),J +C +C.....INTEGER:=REAL + 610 CALL SVINT(VALTOP) + VALUE=STACK(VALTOP-2) +C JESLI STALA - WSTAW DO TABLICY SYMBOLI + IF(STACK(VALTOP).EQ.1)VALUE=SCONST(VALUE) + GO TO 800 +C +C.....REAL:=INTEGER + 620 CALL SVREAL(VALTOP) + VALUE=STACK(VALTOP-2) +C JESLI STALA - WSTAW DO TABLICY SYMBOLI + IF(STACK(VALTOP).EQ.1)VALUE=SCREAL(VALUE) + GO TO 800 +C +C.....OBIE STRONY ZNANEGO TYPU + 630 CALL QUADR3(150,VALUE,STACK(LSE-4)) + GO TO 800 +C +C.....TYP LEWEJ FORMALNY,PRAWEJ ZNANY + 640 IF(TYPR.EQ.0)TYPR=STYPST(VALTOP) + GO TO 660 +C +C.....TYP LEWEJ ZNANY,PRAWEJ FORMALNY + 650 TYPL=STYPST(LSE) + GO TO 700 +C +C.....TYPY OBYDWU STRON FORMALNE + 660 TYPL=STYPFT(LSE) + GO TO 700 +C +C +C..........KONTROLA DYNAMICZNA: TYPL,TYPR - TYPY LEWEJ,PRAWEJ STRONY + 700 CALL QUADR4(170,TYPL,VALUE,TYPR) +C +C.....WPISZ WARTOSC +C + 800 CALL SSTORE(LSE,VALUE) +C....................ZAKONCZENIE PETLI: +C CZY JEST KOLEJNE LSE? + 900 J=STACK(LSE) + LSE=LSE-STCKAP(J) + IF(LSE.GT.LSTFOR)GO TO 500 +C.................... OBNIZANIE STOSU + 1000 CONTINUE + 1020 CALL SPOP + IF(VALTOP.GT.LSTFOR)GO TO 1020 + LSTLSE=0 + RETURN + END + diff --git a/sources/pass1/al12.ff b/sources/pass1/al12.ff new file mode 100644 index 0000000..c0bcbbe --- /dev/null +++ b/sources/pass1/al12.ff @@ -0,0 +1,2448 @@ +C Loglan82 Compiler&Interpreter +C Copyright (C) 1981-1993 Institute of Informatics, University of Warsaw +C Copyright (C) 1993, 1994 LITA, Pau +C +C This program is free software; you can redistribute it and/or modify +C it under the terms of the GNU General Public License as published by +C the Free Software Foundation; either version 2 of the License, or +C (at your option) any later version. +C +C This program is distributed in the hope that it will be useful, +C but WITHOUT ANY WARRANTY; without even the implied warranty of +C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +C GNU General Public License for more details. File: LICENSE.GNU +C =============================================================== + + SUBROUTINE SPARAM +C----------------------------------------------------------------------------- +C +C WERSJA 1982.09.16 +C +C OBSLUGUJE TRANSMISJE I KONTROLE PARAMETRU AKTUALNEGO. +C NA CZUBKU STOSU JEST PARAMETR AKTUALNY, PONIZEJ WOLANA FUNKCJA, +C PROCEDURA,KLASA,REKORD,BLOK PREFIKSOWANY. +C PO OBSLUZENIU PARAMETRU ZDEJMUJE GO ZE STOSU. +C NIE WOLA SNEXT. +C +C UZYWANA ROWNIEZ DLA PROCEDUR I FUNKCJI STANDARDOWYCH. +C / TYLKO PARAMETRY INPUT, OUTPUT, IN-OUT / . +C +C +C KOLEJNOSC OBSLUGI PARAMETRU : +C 1) WOLA MPKIND OKRESLAJACE RODZAJ PARAMETRU : +C 0 - UNIWERSALNY +C 1 - INPUT +C 2 - OUTPUT +C 3 - TYPE +C 4 - FUNKCJA +C 5 - PROCEDURA +C 6 - IN-OUT +C I PRZYPISUJE PARAM ADRES OPISU PAR.FORMALNEGO W IPMEM +C +C 2) JESLI PAR.FORMALNY JEST UNIWERSALNY LUB PAR.AKTUALNY JEST +C UNIWERSALNY LUB NIEWLASCIWEGO RODZAJU, A PAR.FORM. <> "TYPE" - +C NIE ROBI NIC /POZA SYGNALIZACJA BLEDU/ +C +C 3) DLA PAR. INPUT : WOLA MPARIO /BADA ZGODNOSC TYPOW/ ,GENERUJE KOD +C EWENT. KONWERSJI LUB KONTROLI DYNAMICZNEJ I WPISUJE WARTOSC PAR. +C AKTUALNEGO DO GENEROWANEGO POLA DANYCH /DLA STALYCH REPREZENTO- +C WANYCH PRZEZ ZERA NIE WPISUJE NICZEGO/. +C DLA PROCEDURY,FUNKCJI STANDARDOWEJ NIE WPISUJE WARTOSCI +C PARAMETRU, LECZ ZAMIENIA NA STOSIE PARAMETR I PROCEDURE +C /FUNKCJE/ MIEJSCAMI, DZIEKI CZEMU PROCEDURA JEST NA STOSIE +C NAD WSZYTKIMI JUZ PRZETWORZONYMI PARAMETRAMI INPUT. +C +C +C DLA PAR. OUTPUT : WOLA MPARIO,ZABEZPIECZA ADRES ZMIENNEJ /ADR. +C TABLICY I INDEKS,ADR. PRZED KROPKA/ I TYP FORMALNY,WPISUJE +C OPIS PARAMETRU NA STOS I ZWIEKSZA LICZNIK PARAMETROW OUTPUT +C /JESLI BRAK MIEJSCA NA OPIS - NIE ZWIEKSZA/ +C +C DLA PAR. TYPE : WOLA MPARTP / ZAWSZE! ,DLA PAR.AKT. NIEPOPRAWNEGO +C LUB UNIWERSALNEGO PODAJE NRUNIV/ I WPISUJE TYP DO POLA DANYCH +C +C DLA PAR. FUNCTION,PROCEDURE : WOLA MPARPF , +C USTAWIA KIND , WOLA SPRFLD /GENERUJACA PROTOTYP +C WRAZ Z OTOCZENIEM/ +C WPISUJE PROTOTYP I OTOCZENIE PAR.AKTUALNEGO DO POLA DANYCH, +C EW. GENERUJE DYNAMICZNA KONTROLE ZGODNOSCI NAGLOWKOW. +C +C DLA PAR. IN-OUT : NAJPIERW OBSLUGUJE GO JAK PAR. OUTPUT, +C A NASTEPNIE JAK PAR.INPUT +C +C UZYWA: PHADR , NRPAR +C +C +C # OUTPUT CODE : 43 , 52 , 144 , 150 , 161 , 162 , 163 , +C 164 , 165 , 166 , 170 . +C +C ##### DETECTED ERROR(S) : 470 , 471 , 472 , 473 , 474 , 478 , 550 . +C +C +#include "stos.h" +#include "option.h" +#include "blank.h" +CCCCCCCCCCCCCCCCCCCCCC + INTEGER PARAM,APET,CONTRL,ATS,LNRPAR,PARKIND,ELEM +C PARAM = ADRES W IPMEM OPISU PARAMETRU FORMALNEGO +C APET = LICZBA SLOW NA PARAMETR FORMALNY +C CONTRL = INFORMACJA O KONWERSJI LUB KONTROLI DYNAMICZNEJ +C ATS = ATS WARTOSCI PAR. LUB ADR.FIZYCZNY DLA NIEZNANEGO OFFSETU +C PARKIND = RODZAJ PAR.FORMALNEGO, 1..7 ,=MPKIND( )+1 +C ELEM = RODZAJ ELEMNTU Z CZUBKA STOSU +C + LOGICAL DCONTR + DATA SPARAHEX /x'0800'/ +C =.TRUE. JESLI KONIECZNA DYNAMICZNA KONTROLA NAGLOWKOW PROC.,FUNC. +C +C............... + DCONTR=.FALSE. +C RODZAJ PAR.AKTUALNEGO ? + ELEM=STACK(VALTOP) +C RODZAJ PAR.FORMALNEGO ? + PARKIND=MPKIND(PARAM)+1 +C JESLI PAR.AKTUALNY UNIWERSALNY-POMIN + IF(ELEM.EQ.0.AND. PARKIND.NE.4)GO TO 9905 + GO TO(9905,1000,2000,3000,4000,4000,2000),PARKIND +C +C +C +C- - - - - - - - - - PAR. I N - O U T - - - - - - - +C +C ZMIEN KWALIFIKACJE NA INPUT /KOD ODCZYTUJACY WARTOSC JUZ WYGENEROWANY/ +C + 990 PARKIND=2 +C +C +C-------------------- PAR. I N P U T ------------ +C CZY POPRAWNY PAR. AKTUALNY? + 1000 IF(ELEM.LT.6 .OR. ELEM.EQ.12)GO TO 1003 +C NIEPOPRAWNY PAR. AKTUALNY + PARAM=470 + GO TO 9600 + 1003 LNRPAR=NRPAR +C PRZECHOWAJ NUMER PARAMETRU: NA CZUBKU MOZE BYC FUNKCJA BEZPARAMETROWA, +C ODCZYT JEJ WARTOSCI MOZE ZNISZCZYC NRPAR + CALL SVALUE + NRPAR=LNRPAR +C SPRAWDZ ZGODNOSC TYPOW + CONTRL=MPARIO(STACK(VALTOP-3),STACK(VALTOP-4),STACK(VALTOP-1), + X STACK(VALTOP-6)) + APET=SAPET(IPMEM(PARAM-4),IPMEM(PARAM-3)) + IF(CONTRL.EQ.1)CALL SVINT(VALTOP) + IF(CONTRL.EQ.2)CALL SVREAL(VALTOP) + ATS=STACK(VALTOP-2) +C ATS WARTOSCI PARAMETRU +C.....FUNKCJA,PROCEDURA STANDARDOWA ? + IF(STACK(VLPREV-4).LT.LPMSYS)GO TO 1800 +C NIE. + CALL SPHADR(VLPREV) +C CZY PAR.AKTUALNY JEST STALA? + IF(ELEM.EQ.1)GO TO (1007,1008,9905,9905),APET +C +C PARAMETR NIE JEST STALA + APET=APETYT(APET) + GO TO 1050 +C +C +C.....PAR.AKTUALNY JEST STALA. JESLI REPREZENTOWANA PRZEZ ZERA - NIC NIE +C ROB /INICJALIZACJA POLA WPISALA ZERA/ +C ... APETYT 1 ( INTEGER,BOOLEAN,CHAR,STRING ) + 1007 IF(ATS.EQ.0)GO TO 9905 +C WSTAW STALA INTEGER,SKOCZ DO WPISANIA WARTOSCI PARAMETRU + ATS=SCONST(ATS) + GO TO 9750 +C ... APETYT 2 ( REAL - TYP FORMALNY TU NIE WYSTAPI ) +cdsw&bc 1008 IF(STALER(ATS).EQ. 0.0)GO TO 9905 + 1008 continue +c +C WSTAW STALA REAL, SKOCZ DO WPISANIA WARTOSCI + ATS=SCREAL(ATS) + GO TO 9750 +C +C +C.....JESLI NIEPOTRZEBNA KONTROLA DYNAMICZNA - WPISZ WARTOSC + 1050 IF(CONTRL.LT.3 .OR. OPTTYP)GO TO 9750 + CONTRL=CONTRL-2 +C + IDR=STACK(VALTOP-5) +C IDR = ZMODYFIKOWANY TYP FORMALNY PARAMETRU AKTUALNEGO LUB ZERO +C +C CZY ZNANY OFFSET? /NIE,JESLI TO VIRTUAL LUB PARAMETR/ + IF(STACK(VLPREV-3).GE.16384)GO TO 1500 +C +C +C.....ZNANY OFFSET PARAMETRU. +C + GO TO(1100,1200,1300,1400),CONTRL +C.....KONTROLA DYNAMICZNA, OBA TYPY ZNANE + 1100 CALL QUADR3(150,ATS,IPMEM(PARAM-3)) + GO TO 9800 +C.....KONTROLA DYN.,TYP PAR.FORMALNEGO JEST FORMALNY,AKTUALNEGO ZNANY + 1200 IDR=STYPST(VALTOP) + GO TO 1400 +C.....KONTROLA DYN.,TYP PAR.FORMALNEGO JEST ZNANY,AKTUALNEGO FORMALNY + 1300 N=SPARST(PARAM) + GO TO 1450 +C.....KONTROLA DYN.,TYPY PAR.FORMALNEGO I AKTUALNEGO SA FORMALNE +cdsw 1400 N=SPARFT(PARAM) +cdsw ----------------------- + 1400 n = sparft(param,1) +cdsw ------------------------ + 1450 CALL QUADR4(170,N,ATS,IDR) + GO TO 9800 +C +C +C..............NIEZNANY OFFSET PARAMETRU. +C - TYP PAR.FORMALNEGO TRZEBA ODCZYTAC +C IDL,IDR = TYPY PAR.FORMALNEGO I AKTUALNEGO + 1500 CALL SPHADR(VLPREV) + IF(CONTRL.LT.3)IDR=STYPST(VALTOP) + CALL QUADR4(170,SFPRST(NRPAR),ATS,IDR) + GO TO 9700 +C +C.........PARAMETR INPUT PROCEDURY, FUNKCJI STANDARDOWEJ. +C ZAMIEN MIEJSCAMI OPISY PARAMETRU I FUNKCJI, TAK , BY FUNKCJA +C BYLA NAD SWOIMI ARGUMENTAMI. / OBA OPISY ZAJMUJA PO 8 SLOW / +C + 1800 DO 1810 K=0,7 + IDR=VALTOP-K + IDL=VLPREV-K + N=STACK(IDR) + STACK(IDR)=STACK(IDL) + STACK(IDL)=N + 1810 CONTINUE +C NA CZUBKU JEST FUNKCJA,PROCEDURA STANDARDOWA +C ZWIEKSZ LICZNIK PARAMETROW INPUT /SLOWO -2/ + STACK(VALTOP-2)=STACK(VALTOP-2)+1 +C WPISZ NUMER PARAMETRU DO SLOWA -1 + STACK(VLPREV-1)=NRPAR + RETURN +C +C +C-------------------- PAR. O U T P U T --------------- +C +C CZY PAR. AKTUALNY TO LSE? + 2000 IF(ELEM.GT.2 .AND. ELEM.LT.6)GO TO 2005 +C NIEPOPRAWNY PARAMETR /AKTUALNY/ OUTPUT + PARAM=471 + GO TO 9600 +C O.K. SPRAWDZ ZGODNOSC TYPOW + 2005 CONTRL=MPARIO(STACK(VALTOP-3),STACK(VALTOP-4),STACK(VALTOP-1), + X STACK(VALTOP-6)) +C ZABEZPIECZ ADRES ZMIENNEJ + CALL SAVEVAR(VALTOP) +C.....WPISZ OPIS PARAMETRU AKTUALNEGO. CZY JEST MIEJSCE? + IF(FSTOUT-VALTOP.GE.11)GO TO 2110 +C BRAK MIEJSCA NA STOSIE NA DODATKOWE INFORMACJE O PARAMETRZE. + PARAM=550 + GO TO 9600 +C O.K. JEST MIEJSCE + 2110 CONTINUE +C ZWIEKSZ LICZNIK PARAMETROW OUTPUT + STACK(VLPREV-3)=STACK(VLPREV-3)+1 +C POSTAC OPISU PARAMETRU OUTPUT: +C OPIS ZAJMUJE 11 SLOW, OZNACZONYCH -9,..,0,+1 +C SLOWA -9..0 ZAWIERAJA PRZEPISANY PAR.AKTUALNY +C /DLA ZMIENNEJ I ELEM.TABLICY SLOWA -9,-8 POZOSTAJA +C NIEWYKORZYSTANE/ +C SLOWO -1 ZAMIAST NAZWY ZAWIERA ADRES W IPMEM OPISU PARAMETRU +C FORMALNEGO +C SLOWO +1 = NUMER PARAMETRU /NRPAR/ +C SLOWO 0 W BITACH 9-11 INFORMACJE O KONTROLI /MPARIO(..)/ +C +C WPISZ NUMER PARAMETRU + STACK(FSTOUT-1)=NRPAR +C WPISZ RODZAJ ELEMENTU Z INFORMACJA O KONTROLI W BITACH 9-11 + STACK(FSTOUT-2)=ELEM+CONTRL*16 +C WPISZ ADRES OPISU PAR.FORMALNEGO + STACK(FSTOUT-3)=PARAM +C PRZEPISZ POZOSTALE 8 SLOW /BYC MOZE OSTATNIE 2 TO SMIECIE/ +C APET,CONTRL = DOLNY,GORNY INDEKS + APET=VALTOP-2 + CONTRL=FSTOUT-4 + 2115 STACK(CONTRL)=STACK(APET) + APET=APET-1 + CONTRL=CONTRL-1 + IF(CONTRL.GT.FSTOUT-12)GO TO 2115 +C SLOWA VALTOP-0,..,VALTOP-9 PRZEPISANE NA MIEJSCA FSTOUT-2,..,FSTOUT-11. +C + FSTOUT=FSTOUT-11 + GO TO 9905 + +C +C-------------------- PAR. T Y P E --------------------- +C +C CZY PAR.AKTUALNY TO NAZWA TYPU,REKORD,KLASA? + 3000 IF(ELEM.LT.7 .OR. ELEM.GT.9)GO TO 3800 +C O.K. + CALL MPARTP(STACK(VALTOP-3),STACK(VALTOP-4),STACK(VALTOP-6), + X STACK(VALTOP-1)) +C POBIERZ TYP + ATS=STACK(VALTOP-2) +C =0 : KLASA,REKORD,TYP PIERWOTNY +C >0 : ATS WARTOSCI PAR.TYPE LUB PARAMETRU TYPE + IF(ATS.EQ.0)ATS=STYPST(VALTOP) + APET=2 + GO TO 9750 +C +C.....UNIWERSALNY LUB NIEPOPRAWNY PARAMETR TYPE + 3800 CALL MPARTP(0,NRUNIV,0,STACK(VALTOP-1)) + IF(ELEM.EQ.0)GO TO 9905 + PARAM=472 + GO TO 9600 +C +C------------- PAR. F U N C T I O N , P R O C E D U R E ------ +C +C CZY PAR.AKTUALNY JEST FUNKCJA LUB PROCEDURA? + 4000 IF(ELEM.EQ.11 .OR. ELEM.EQ.12)GO TO 4010 +C NIEPOPRAWNY PAR. AKTUALNY + PARAM=479-PARKIND +C = 473 LUB 474 + GO TO 9600 +C FUNKCJA LUB PROCEDURA. + 4010 APET=STACK(VALTOP-4) +C = ADRES OPISU FUNKCJI,PROCEDURY +C CZY PAR.AKTUALNY JEST FUNKCJA,PROCEDURA STANDARDOWA ? + IF(APET.GE.LPMSYS)GO TO 4020 +C NIESTETY, TAK. + PARAM=478 + GO TO 9600 + 4020 CALL MPARPF(APET,STACK(VALTOP-1),STACK(VALTOP-6),DCONTR) +C JAKIEGO RODZAJU? + KIND=0 +C WEZ ZEROWE SLOWO OPISU + APET=IPMEM(APET) +C VIRTUALNA,JESLI BIT 4 = 1 + IF(IAND(APET,SPARAHEX).NE.0)KIND=1 +C LUB FORMALNA , JESLI BITY 8..11 = 2 LUB 3. WEZ TE BITY + APET=IAND(ISHFT(APET,-4),15) + IF(APET.EQ.2 .OR. APET.EQ.3)KIND=2 +C WYLICZ NUMER PROTOTYPU I OJCA SYNTAKTYCZNEGO PARAMETRU + ATS=SPRFLD(.TRUE.) + APET=3 + GO TO 9750 +C +C +C +C------------------------------- +C +C +C.....WSPOLNA SYGNALIZACJA BLEDU. +C PARAM= NUMER BLEDU + 9600 CALL SERROR(PARAM) + GO TO 9905 +C +C +C.....WPISANIE WARTOSCI PARAMETRU Z NIEZNANYM OFFSETEM + 9700 CONTRL=TSTEMP(1) + CALL SPHADR(VLPREV) +C WEZ ADRES FIZYCZNY PARAMETRU + CALL QUADR4(52,CONTRL,PHADR,NRPAR) +C WPISZ WARTOSC POD TEN ADRES + CALL QUADR3(160+APET,CONTRL,ATS) + GO TO 9900 +C +C.....WPISANIE WARTOSCI. CZY ZNANY OFFSET? + 9750 IF(STACK(VLPREV-3).GE.16384)GO TO 9700 +C +C.....WPISANIE WARTOSCI PARAMETRU ZE ZNANYM OFFSETEM + 9800 CONTINUE + CALL SPHADR(VLPREV) + CALL QUADR4(163+APET,PHADR,ATS,PARAM) +C WPISZ APET-SLOW DO POLA WSKAZANEGO PRZEZ ADRES FIZYCZNY PHADR +C +C +C.....JUZ PO WSZYSTKIM-LUB PARAMETR UNIWERSALNY. +C CZY DYNAMICZNA KONTROLA NAGLOWKOW? + 9900 IF(.NOT.DCONTR)GO TO 9905 +C TAK. ODTWORZ PELNY ADRES VIRTUALNY Z AH + APET=TSTEMP(4) + CALL QUADR3(43,APET,STACK(VLPREV-2)) + STACK(VLPREV-2)=APET + CALL QUADR3(144,APET,NRPAR) + PHADR=0 +C +C +C ... JESLI TO IN-OUT ,TO POTRAKTUJ GO TERAZ JAK INPUT + 9905 IF(PARKIND.EQ.7)GO TO 990 + CALL SPOP +C + RETURN + END + SUBROUTINE SVALU2 +C----------------------------------------------------------------------------- +cdsw procedura podzielona na svalue i svalue2 - entry usuniete +C +C ENTRY SVALUE +C +C +C SPRAWDZA,CZY ELEMENT Z CZUBKA STOSU /SVALUE/ LUB PONIZEJ /SVALU2/ +C REPREZENTUJE WARTOSC I WYLICZA TE WARTOSC. +C "UNIWERSALNY","STALA","WARTOSC" ZOSTAWIA BEZ ZMIAN. +C "ZMIENNA","ELEMTABLICY","TABLICA STATYCZNA","FUNKCJA"/BEZPARAMETROWA/ +C ZASTEPUJE PRZEZ "WARTOSC" I JESLI SA TYPU FORMALNEGO TO POBIERA +C TEN TYP. NIE MODYFIKUJE GO O LICZBE ARRAY-OF. +C POZOSTALE ZASTEPUJE PRZEZ "UNIWERSALNY" SYGNALIZUJAC BLAD. +C +C WEJSCIE SVALUE - DLA CZUBKA STOSU +C WEJSCIE SVALU2 - DLA ELEMENTU PONIZEJ CZUBKA +C +C ##### OUTPUT CODE : 61 , 62 , 63 , 84 , 85 , 86 . +C +C ##### DETECTED ERROR(S) : 450, 451, 452 , 453 , 454 . +C +#include "stos.h" +#include "blank.h" +CCCCCCCCCCCCCCCCCCCC + INTEGER ER(8) +C NUMERY BLEDOW "NIELEGALNE WYSTAPIENIE ... " +C + INTEGER ATS,ELEM,APET + DATA ER/452,451,451,0,450,0,453,454/ +C + K=VLPREV + 100 ELEM=STACK(K)-2 +C JESLI UNIWERSALNY,STALA,WARTOSC - KONIEC + IF(ELEM.LE.0)RETURN +C +C JESLI TYPU FORMALNEGO - WEZ TEN TYP + IF(STACK(K-5).NE.0)STACK(K-5)=STYPFT(K) +C +C ZMIENNA PROSTA? + IF(ELEM.EQ.1 .AND. STACK(K-7).EQ.0)GO TO 350 + IF(ELEM.GT.3)GO TO 600 +C +C WEZ NOWY ATS NA WARTOSC,WYZNACZ APETYT + APET=SAPET2(K) + +#if WSIZE == 4 +cvax changed because of real appettite = 1 + dswap = apet + if (dswap .eq. 2) dswap = 1 + ats = tstemp(dswap) +#else + ATS=TSTEMP(APET) +#endif + + APET=APETYT(APET) + GO TO (300,400,500),ELEM +C.....ZMIENNA PRZEZ KROPKE. ODCZYTAJ APET-SLOW. + 300 CALL QUADR4(83+APET,ATS,SMEMBER(K),STACK(K-2)) +C ZASTAP PRZEZ WARTOSC + 340 STACK(K-2)=ATS + 350 STACK(K)=2 + RETURN +C +C.....ELEM. TABLICY + 400 CALL QUADR3(60+APET,ATS,SARRAY(K)) + GO TO 340 +C +C.....TABLICA STATYCZNA + 500 CONTINUE +C B R A K +C........... +C JESLI NA CZUBKU NIE FUNKCJA, TO BLAD + 600 IF(ELEM.NE.10)GO TO 3000 +C FUNKCJA. /BEZPARAMETROWA/ + CALL SCALLB +C I TO WSZYSTKO. + RETURN +C +C.....OBSLUGA BLEDOW + 3000 ELEM=ER(ELEM-4) + CALL SERRO2(ELEM,K) +C ZASTAP ELEMENT PRZEZ "UNIWERSALNY",ZACHOWAJ NAZWE. + STACK(K)=0 + RETURN + END + SUBROUTINE SVALUE +C----------------------------------------------------------------------------- +cdsw procedura podzielona na svalue i svalue2 - entry usuniete +C +C ENTRY SVALUE +C +C +C SPRAWDZA,CZY ELEMENT Z CZUBKA STOSU /SVALUE/ LUB PONIZEJ /SVALU2/ +C REPREZENTUJE WARTOSC I WYLICZA TE WARTOSC. +C "UNIWERSALNY","STALA","WARTOSC" ZOSTAWIA BEZ ZMIAN. +C "ZMIENNA","ELEMTABLICY","TABLICA STATYCZNA","FUNKCJA"/BEZPARAMETROWA/ +C ZASTEPUJE PRZEZ "WARTOSC" I JESLI SA TYPU FORMALNEGO TO POBIERA +C TEN TYP. NIE MODYFIKUJE GO O LICZBE ARRAY-OF. +C POZOSTALE ZASTEPUJE PRZEZ "UNIWERSALNY" SYGNALIZUJAC BLAD. +C +C WEJSCIE SVALUE - DLA CZUBKA STOSU +C WEJSCIE SVALU2 - DLA ELEMENTU PONIZEJ CZUBKA +C +C ##### OUTPUT CODE : 61 , 62 , 63 , 84 , 85 , 86 . +C +C ##### DETECTED ERROR(S) : 450, 451, 452 , 453 , 454 . +C +#include "stos.h" +#include "blank.h" +CCCCCCCCCCCCCCCCCCCC + INTEGER ER(8) +C NUMERY BLEDOW "NIELEGALNE WYSTAPIENIE ... " +C + INTEGER ATS,ELEM,APET + DATA ER/452,451,451,0,450,0,453,454/ + K=VALTOP + 100 ELEM=STACK(K)-2 +C JESLI UNIWERSALNY,STALA,WARTOSC - KONIEC + IF(ELEM.LE.0)RETURN +C +C JESLI TYPU FORMALNEGO - WEZ TEN TYP + IF(STACK(K-5).NE.0)STACK(K-5)=STYPFT(K) +C +C ZMIENNA PROSTA? + IF(ELEM.EQ.1 .AND. STACK(K-7).EQ.0)GO TO 350 + IF(ELEM.GT.3)GO TO 600 +C +C WEZ NOWY ATS NA WARTOSC,WYZNACZ APETYT + APET=SAPET2(K) + +#if WSIZE == 4 +cvax changed with real appetite = 1 + dswap = apet + if (dswap .eq. 2) dswap = 1 + ats = tstemp(dswap) +#else + ATS=TSTEMP(APET) +#endif + + APET=APETYT(APET) + GO TO (300,400,500),ELEM +C.....ZMIENNA PRZEZ KROPKE. ODCZYTAJ APET-SLOW. + 300 CALL QUADR4(83+APET,ATS,SMEMBER(K),STACK(K-2)) +C ZASTAP PRZEZ WARTOSC + 340 STACK(K-2)=ATS + 350 STACK(K)=2 + RETURN +C +C.....ELEM. TABLICY + 400 CALL QUADR3(60+APET,ATS,SARRAY(K)) + GO TO 340 +C +C.....TABLICA STATYCZNA + 500 CONTINUE +C B R A K +C........... +C JESLI NA CZUBKU NIE FUNKCJA, TO BLAD + 600 IF(ELEM.NE.10)GO TO 3000 +C FUNKCJA. /BEZPARAMETROWA/ + CALL SCALLB +C I TO WSZYSTKO. + RETURN +C +C.....OBSLUGA BLEDOW + 3000 ELEM=ER(ELEM-4) + CALL SERRO2(ELEM,K) +C ZASTAP ELEMENT PRZEZ "UNIWERSALNY",ZACHOWAJ NAZWE. + STACK(K)=0 + RETURN + END + SUBROUTINE SVINT(ELEM) +C----------------------------------------------------------------------------- +C +C POMOCNICZA. ZASTEPUJE ELEMENT Z MIEJSCA ELEM STOSU /STALA, +C WARTOSC,ZMIENNA/ TYPU REAL PRZEZ STALA LUB WARTOSC TYPU INTEGER. +C GENERUJE KOD KONWERSJI. +C W PRZYPADKU STALEJ REAL O WARTOSCI WYKRACZAJACEJ POZA ZAKRES LICZB +C CALKOWITYCH SYGNALIZUJE ERROR 408 I ZASTEPUJE PRZEZ STALA INTEGER +C O TYM SAMYM ZNAKU I NAJWIEKSZYM MOZLIWYM MODULE. +C +C ##### OUTPUT CODE : 58 . +C +C ##### DETECTED ERROR(S) : 408 . +C +C +#include "stos.h" +#include "blank.h" +C +C + REAL X + real y + integer*2 m(2) + equivalence (y, m(1)) +C +#if WSIZE == 4 + DATA MAXINTEGER,MININTEGER / x'7FFFFFFF', x'80000000' / +#else + DATA MAXINTEGER,MININTEGER / x'7FFF', -x'7FFF' / +#endif +C +C +C..... + STACK(ELEM-4)=NRINT +C CZY STALA? + IF(STACK(ELEM).NE.1)GO TO 100 +C TAK + N=STACK(ELEM-2) +C SPRAWDZ WARTOSC STALEJ +#if WSIZE == 4 + X=STALER(N) +#else + n1 = n*2-1 + m(1) = ipmem(n1) + m(2) = ipmem(n1+1) + x = y +#endif +c + IF(X.LT.FLOAT(MININTEGER) .OR. X.GT.FLOAT(MAXINTEGER))GO TO 200 +CJF STACK(ELEM-2)=IFIX(X) +cdsw STACK(ELEM-2)= IIDINT(X) + stack(elem-2) = ifix(x) + RETURN +C WARTOSC LUB ZMIENNA; GENERUJ KONWERSJE + 100 N=TSTEMP(1) + CALL QUADR3(58,N,STACK(ELEM-2)) + STACK(ELEM-2)=N + STACK(ELEM)=2 + RETURN +C STALA REAL O WARTOSCI POZA ZAKRESEM LICZB CALKOWITYCH + 200 CALL SERRO2(408,ELEM) +C ZASTAP PRZEZ NAJWIEKSZA LICZBE CALKOWITA + N=MAXINTEGER + IF(X.LT.0.0)N=MININTEGER + STACK(ELEM-2)=N + RETURN + END + SUBROUTINE SVREAL(ELEM) +C----------------------------------------------------------------------------- +C +C POMOCNICZA. ZASTEPUJE ELEMENT /STALA,WARTOSC,ZMIENNA/ Z MIEJSCA +C ELEM STOSU TYPU INTEGER PRZEZ STALA LUB WARTOSC TYPU REAL. +C +C ##### OUTPUT CODE : 59 . +C +C +#include "stos.h" +#include "blank.h" +C +C + STACK(ELEM-4)=NRRE +C CZY TO STALA? + IF(STACK(ELEM).NE.1)GO TO 100 +C TAK + STACK(ELEM-2)=CREAL(FLOAT(STACK(ELEM-2))) + RETURN +C WARTOSC,ZMIENNA; GENERUJ KONWERSJE +#if WSIZE == 4 +100 n = tstemp(1) +#else +100 n = tstemp(2) +#endif + CALL QUADR3(59,N,STACK(ELEM-2)) + STACK(ELEM-2)=N + STACK(ELEM)=2 + RETURN + END + SUBROUTINE SPUSH(ELEM) +C------------------------------------------------------------------------ +C +C WSTAWIA NA STOS ELEMENT TYPU ELEM. USTAWIA VALTOP,VLPREV. +C +C PRZY PRZEPELNIENIU STOSU PRZERYWA KOMPILACJE !!! +C +C ( NA SKUTEK BRAKU NIELOKALNYCH SKOKOW NIE JEST MOZLIWY ) +C ( SKOK DO ETYKIETY 2000 W SPASS2 I KOMPILACJA KOLEJNYCH ) +C ( MODULOW. ) +C +C +C ##### DETECTED ERROR(S) : 550. /PRZEPELNIENIE STOSU / +C +C +#include "stos.h" +#include "blank.h" + VLPREV=VALTOP + VALTOP=VALTOP+STCKAP(ELEM) + IF(VALTOP.GE.FSTOUT)GO TO 100 + STACK(VALTOP)=ELEM + RETURN +C.....PRZEPELNIENIE STOSU + 100 CALL MERR(550,0) +C GO TO 2000 CHANGED TO COMMENT DUE TO A.I.L./P.G. 15.05.84 + call ffexit +C FOR STACK BEING OVERLOADED STOP THE COMPILATION +C ' FATAL ERROR ' + END + SUBROUTINE SPOP +C-------------------------------------------------------------------------- +C +C ZDEJMUJE 1 ELEMENT Z CZUBKA STOSU. USTAWIA VALTOP, VLPREV. +C +C +#include "stos.h" +#include "blank.h" +C + COMMON/SUMMARY/FREE +C +C + N=FSTOUT-VALTOP-1 + IF(N.LT.FREE)FREE=N +C + VALTOP=VLPREV + IF(VALTOP.LT.LSTSAF)LSTSAF=VALTOP + VLPREV=STACK(VALTOP) + VLPREV=STCKAP(VLPREV) +C =APETYT NOWEGO CZUBKA STOSU + VLPREV=VALTOP-VLPREV + RETURN + END + INTEGER FUNCTION SCONST(N) +C----------------------------------------------------------------------------- +C +C POMOCNICZA. +C ZWRACA NOWY ATS ATRYBUTU ZAWIERAJACEGO STALA O WARTOSCI N. +C +C ##### OUTPUT CODE : 199 . +C +C +#include "stos.h" +C +C..... + LSTEMP=LSTEMP-3 + SCONST=LSTEMP + CALL QUADR3(199,SCONST,N) + IF(FRSTTS.GE.LSTEMP)CALL SSTOVF + RETURN + END + INTEGER FUNCTION CREAL(X) +C---------------------------------------------------------------- +C +C ZWRACA ADRES STALEJ X TYPU REAL W TABLICY STALYCH +C +C ##### DETECTED ERROR(S) : 554 . +C + IMPLICIT INTEGER (A-Z) +#include "blank.h" +C +C + REAL X + +#if WSIZE == 4 +cvax data realsize/1/ +cvax the size of real numbers on vax is 4 bytes ( = the size of integer) + i = lpmem+1 +100 if (staler(i) .eq.x) goto 200 + i = i+1 +cail if (i .lt. irecn) goto 100 + if (i .le. irecn) goto 100 +Cail constant not found, i=irenc+1, append if enough room + if (irecn+1 .gt. ipmem(lmem)) goto 300 + irecn = irecn + 1 + staler(i) = x +200 creal = i +#else + real y + integer*2 m(2) + equivalence (y, m(1)) + INTEGER REALSIZE + DATA REALSIZE/2/ + y = x + i = lpmem + 1 + 100 if (ipmem(i) .eq. m(1) .and. ipmem(i+1) .eq. m(2)) goto 200 + i = i + 2 + if (i .lt. irecn) goto 100 + if (irecn + 2 .gt. ipmem(lmem)) goto 300 + irecn = irecn + 2 + ipmem(i ) = m(1) + ipmem(i+1) = m(2) + 200 creal = (i+1) / 2 + n1 = creal*2-1 + m(1) = ipmem(n1) + m(2) = ipmem(n1+1) +#endif + +cdsw&bc C = SIZE OF REAL VALUE (NUMBER OF WORDS) +cdsw&bc C LPMEM=INDEKS OSTATNIEGO SLOWA PRZEZ STALYMI REAL +cdsw&bc C IRECN=INDEKS OSTATNIEGO SLOWA ZAJETEGO PRZEZ STALE REAL +cdsw&bc N=(IRECN / REALSIZE)+1 +cdsw&bc C = INDEKS PIERWSZEGO WOLNEGO MIEJSCA W STALER +cdsw&bc CREAL=(LPMEM+REALSIZE-1)/REALSIZE+1 +cdsw&bc C = INDEKS PIERWSZEJ STALEJ W STALER +cdsw&bc C USTAW WARTOWNIKA +cdsw&bc STALER(N)=X +cdsw&bc 100 IF(STALER(CREAL).EQ.X)GO TO 200 +cdsw&bc CREAL=CREAL+1 +cdsw&bc GO TO 100 +cdsw&bc C JEST? +cdsw&bc 200 IF(CREAL.LT.N)RETURN +cdsw&bc IF(IRECN+REALSIZE .GT. IPMEM(LMEM))GO TO 300 +cdsw&bc IRECN=IRECN+REALSIZE + RETURN + 300 CALL SERRO2(554,0) + RETURN + END + INTEGER FUNCTION SCREAL(N) +C---------------------------------------------------------------------------- + +C POMOCNICZA. +C ZWRACA NOWY ATS ATRYBUTU ZAWIERAJACEGO STALA REAL O NUMERZE N +C +C ##### OUTPUT CODE : 197 . +C +#include "stos.h" +#include "blank.h" +C +C +#if WSIZE == 4 + data realsize /1/ +#else + data realsize /2/ +#endif + +C = SIZE OF REAL VALUE (NUMBER OF WORDS) +C LPMEM=INDEKS OSTATNIEGO SLOWA PRZEZ STALYMI REAL +C..... + LSTEMP=LSTEMP-3 + SCREAL=LSTEMP + K=(LPMEM+REALSIZE-1)/REALSIZE+1 +C K=INDEKS PIERWSZEJ STALEJ W STALER + K=REALSIZE*(N-K) +C = OFFSET WZGLEDEM ETYKIETY "RECON" RUN-TIME-U. + CALL QUADR3(197,SCREAL,K) + IF(FRSTTS.GE.LSTEMP)CALL SSTOVF + RETURN + END + + INTEGER FUNCTION SWHAT(IND) +C---------------------------------------------------------------------------- +C +C +C IND WSKAZUJE ZEROWE SLOWO OPISU ATRYBUTU /IND=MIDENT(NAZWA)/. +C FUNKCJA ROZPOZNAJE RODZAJ ATRYBUTU I ZWRACA JAKO WYNIK : +C 0 - "UNIWERSALNY" +C 1 - "STALA" +C 3 - "ZMIENNA" +C 5 - "TABLICA STATYCZNA" +C 7 - "TYP FORMALNY" / "NAZWA TYPU"/ +C 8 - "REKORD" +C 9 - "KLASA" +C 11 - "PROCEDURA" +C 12 - "FUNKCJA" +C 13 - "SYGNAL" +C 14 - "OPERATOR" +C +C W PRZYPADKU NIEPOPRAWNEGO OPISU ZWRACA UNIWERSALNY. +C..... + IMPLICIT INTEGER (A-Z) +#include "blank.h" +C +C +CCCCCCCCCCCCCCCCCCCCCCCCC + INTEGER TT(35),TT0(36) + EQUIVALENCE (TT0(2),TT(1)) + DATA TT0/0,0,8,9,0,9,7,9,8*0, + X 3,3,3,1,3,14,13,13,4*0, + X 0,10,12,12,11,11,10,13/ +C = RODZAJ ATRYBUTU : +C ELEMENTY 0..15 ODPOWIADAJA WARTOSCIOM 0..15 POLA "T" +C " 16..27 " " 5..16 POLA "ZP" +C " 28..35 " " 0..7 POLA "S" +C +C............ + N=IPMEM(IND) +C ... ODCZYTAJ POLE "T" , BITY 12..15 + K=IAND(N,15) + IF(K.NE.1)GO TO 200 +C ... NIE TYP. POLE "ZP" , BITY 8..11 + L=IAND(ISHFT(N,-4),15) + IF(L.GT.4)GO TO 150 +C ... PROCEDURA,FUNKCJA, POLE "S" , BITY 5..7 + L=IAND(ISHFT(N,-8),7)+17 + 150 K=L+11 + 200 SWHAT=TT(K) + RETURN + END + SUBROUTINE SCALLB +C----------------------------------------- +C +C WERSJA 1983.04.26 +C +C POCZATEK WYWOLANIA. CZUBEK STOSU ZAWIERA REKORD,KLASE,FUNKCJE, +C PROCEDURE,BLOK PREF,SYGNAL. +C JESLI NA STOSIE JEST MODUL BEZ PELNEGO ADR.VIRTUALNEGO +C /TYLKO ADR.POSREDNI , GDY LASTPR <> 0 / , TO ZASTEPUJE TEN ADRES +C PRZEZ PELNY ADR.VIRTUALNY. +C OTWIERA POLE DANYCH /PO WYZNACZENIU DYNAMICZNEGO PROTOTYPU WRAZ Z +C OTOCZENIEM/ - O ILE NIE JEST TO PROCEDURA,FUNKCJA STANDARDOWA +C PRZY BRAKU PARAMETROW FORMALNYCH / WB<>"(" / PRZECHODZI DO ZAKONCZENIA +C WYWOLANIA /WOLA SCALLE/. UWAGA: DLA FUNKCJI BEZPARAMETROWEJ WOLA +C SCALLE NAWET DLA WB="(". +C +C USTAWIA BITY 0-2 SLOWA -3 : +C 000 = ZWYKLY,LOKALNY MODUL BEZ PREFIKSU, +C 001 = NIELOKALNY LUB PREFIKSOWANY,ALE ZNANE OFFSETY, +C 010 = NIEZNANE OFFSETY PARAMETROW /VIRTUAL LUB PARAMETR/ +C INFORMACJA TA JEST UZYWANA PRZEZ SPARAM,SCALLE . +C +C WOLANA PRZEZ SDPDA: DLA NAZWY LUB NAZWY PO KROPCE KLASY,REKORDU, +C FUNKCJI,PROCEDURY,SYGNALU ORAZ DLA BLOKU PREF. +C WOLANA PRZEZ SVALUE: GDY NAZWA LUB NAZWA PO KROPCE KLASY,REKORDU,FUNKCJI +C WYSTAPILA PRZED "," LUB ")" . +C +C DLA FUNKCJI (NIE-STANDARDOWEJ) GASI FLREADY. +C +C ##### OUTPUT CODE : 1 , 3 , 4 , 5 , 43 . +C +C +#include "stos.h" +#include "blank.h" +C + INTEGER ELEM,IND,OPKOD,ADR,PROT,BT +cdsw DATA SCALBHX1,SCALBHX2 /Z2000, Z4000 / + data schx1, schx2 / x'2000', x'4000' / +C RODZAJ ELEMENTU,ADRES PROTOTYPU W IPMEM +C................ + ELEM=STACK(VALTOP) + IND=STACK(VALTOP-4) + PROT=IND +C +C..... ROZPOCZNIJ KONTROLE PARAMETROW + CALL MCALLO(IND,STACK(VALTOP-1),STACK(VALTOP-6),KIND) +cbc moved check for virtual address before check for standard procedure +C CZY JEST NA STOSIE WYWOLANIE WYMAGAJACE ZABEZPIECZENIA ADR. WIRTUALNEGO + IF(LASTPR.EQ.0)GO TO 200 +C TAK. WEZ PELNY ADRES VIRTUALNY + N=TSTEMP(4) + CALL QUADR3(43,N,STACK(LASTPR-2)) + STACK(LASTPR-2)=N +200 continue +C.....FUNKCJA,PROCEDURA STANDARDOWA ? + IF(IND.LT.LPMSYS)GO TO 1000 +C NIE. + FLREADY=.FALSE. +cbc + LASTPR=VALTOP + PHADR=TSTEMP(1) + N=ELEM-7 +C =RODZAJ ELEMENTU, 1..7 ZAMIAST 8..14 + BT=schx1 +C = BITY 0-1 KOPIOWANE DO SLOWA -1 , = ZNANE OFFSETY,NIELOKALNY LUB PREF. + GO TO (220,260,350,240,240,230),N +C - OPERATOR TU NIE WYSTAPI +C +C.....REKORD + 220 ADR=TSTEMP(4) + OPKOD=1 + GO TO 400 +C.....SYGNAL + 230 OPKOD=3 + PROT=IPMEM(PROT+1) +C = NUMER SYGNALU + GO TO 380 +C.....PROCEDURA,FUNKCJA. VIRTUAL LUB PARAMETR ? + 240 IF(KIND.EQ.0)GO TO 260 + BT=schx2 +C CZYLI NIEZNANE OFFSETY + GO TO 270 +C.....KLASA, CD. PROCEDURY,FUNKCJI +C LOKALNY BEZ PREFIKSU ? + 260 IF(LOCAL.EQ.2 .AND. IPMEM(PROT+21).EQ.0 .AND. STACK(VALTOP-7) + X .EQ.0) BT=0 + 270 IF(KIND.NE.2 .AND. STACK(VALTOP-7).EQ.0)GO TO 350 + OPKOD=5 + GO TO 360 +C.....BLOK PREFIKSOWANY + 350 OPKOD=4 + 360 PROT=SPRFLD(.FALSE.) +C = WYZNACZONY DYNAMICZNIE PROTOTYP /BYC MOZE WRAZ Z OTOCZENIEM/ + 380 ADR=TSTEMP(1) +C.....WSPOLNE OTWARCIE POLA DANYCH : OPENRC,RAISE,OPEN,SLOPEN +C /OPKOD = 1,3,4,5/ + 400 CALL QUADR4(OPKOD,ADR,PHADR,PROT) + STACK(VALTOP-2)=ADR + STACK(VALTOP-3)=BT +C OTWARCIE POLA DANYCH DOSTARCZA AH I ADR.FIZYCZNEGO +C.....CZY SA PARAMETRY AKTUALNE ? + 500 IF(WB.EQ.36)GO TO 550 +C BRAK PAR.AKTUALNYCH, KONCZ WYWOLANIE + 510 CALL SCALLE + RETURN +C DLA FUNKCJI BEZPARAMETROWEJ TEZ KONCZ WYWOLANIE + 550 IF(ELEM.EQ.12 .AND. IPMEM(IND+4).EQ.1)GO TO 510 + RETURN +C.....PROCEDURA,FUNKCJA STANDARDOWA + 1000 STACK(VALTOP-2)=0 + STACK(VALTOP-3)=0 +C WYZEROWANE LICZNIKI PAR. INPUT I OUTPUT + GO TO 500 + END + SUBROUTINE SCALLE +C------------------------------------------------------------------------- +C +C WERSJA 1984.04.10 +C +C OBSLUGUJE ZAKONCZENIE WYWOLANIA REKORDU,KLASY,BLOKU PREF., +C PROCEDURY,FUNKCJI,SYGNALU. +C +C WOLANA : PRZY BRAKU PARAMETROW AKTUALNYCH PRZEZ SCALLB LUB +C PO WYSTAPIENIU ")" PRZEZ SDPDA. +C +C WOLA MCALLC. +C ZABEZPIECZA STOS. +C PRZEKAZUJE STEROWANIE. +C ODCZYTUJE PARAMETRY OUTPUT I WARTOSC FUNKCJI. +C SPRAWDZA DLA PROCEDURY ISTNIENIE "CALL" I ZJADA. /JESLI BRAK "CALL" +C - ZASTEPUJE PRZEZ UNIWERSALNY/ +C DLA SYGNALU SPRAWDZA ISTNIENIE "RAISE" I ZJADA /JESLI BRAK "RAISE" +C - ZASTEPUJE PRZEZ UNIWERSALNY. +C REKORD,KLASE ZASTEPUJE PRZEZ WARTOSC / LUB ZDEJMUJE ZE STOSU +C JESLI WB = ZNACZNIK KONCA INSTRUKCJI LUB ETYKIETA /. +C FUNKCJE ZASTEPUJE PRZEZ WARTOSC. +C DLA BLOKU PREF.,PROCEDURY,SYGNALU OBNIZA STOS. +C DLA FUNKCJI,PROCEDURY,SYGNALU,BLOKU PREF. USUWA POLE DANYCH. +C +C +C DLA PROCEDURY,FUNKCJI STANDARDOWEJ GENERUJE : +C PRZEKAZANIE WARTOSCI PARAMETROW INPUT /OPKOD 145/ , +C PRZEKAZANIE STEROWANIA /OPKOD 132/ , +C ODCZYT PAR. OUTPUT I WARTOSCI FUNKCJI /OPKOD 23/ +C PRZEKAZANIE ODCZYTANYCH WARTOSCI PARAMETROW NA PAR.AKTUALNE +C ORAZ ZDEJMUJE ZE STOSU PARAMETRY INPUT LEZACE POD FUNKCJA,PROCEDURA. +C DODATKOWO, FUNKCJE ZASTEPUJE PRZEZ WARTOSC. +C +C +C +C ##### OUTPUT CODE : 2 , 21 , 54 , 58 , 59 , 132 , 143 , 145 , +C 150 , 153 , 159 , 160 , 170 . +C +C ##### DETECTED ERROR(S) : 450 , 453 . +C +#include "stos.h" +#include "option.h" +#include "blank.h" +C +C + COMMON / MASKS / MTP,MSPR,MOTHERS,MPAR,MASKTP,NOTTP, + * MPROCES, MCOR, MERPF, MBLOCK, MHAND + *, MNOTVIR +C +C ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** +C MASKI I WZORCE: +C MTP - MASKA DO WYCINANIA INFORMACJI DOTYCZACYCH TYPOW ZE SLOWA ZEROWEGO +C MOTHERS - -- -- -- -- -- INNYCH PROTOTYPOW +C MPAR - -- -- -- -- -- -- ZMIENNYCH I PARAMETROW +C MSPR - MASKA DLA SYSPREF ( DLA PROTOTYPOW SYNTAKTYCZNYCH ) +C MASKTP - ZAPRZECZENIE MASKI MTP +C NOTTP - WZORZEC DLA NIE-TYPU ( 1 ) +C MPROCES - WZORZEC DLA PROCESU ( 5 ) +C MCOR - WZORZEC DLA COROUTINY (7) +C MERPF - MASKA DO WYKRYWANIA BLEDNYCH LIST PARAMETROW +C MBLOCK - WZORZEC DLA BLOKU ( 0 PRZY PRZECIECIU Z MOTHERS ) +C MNOTVIR - WZORZEC DO KASOWANIA BITU "VIRTUAL" +C MHAND - WZORZEC DLA HANDLERA +C +CCCCCCCCCCCCCCCCCCCCCCCCCC + INTEGER OPKOD,N,ELEM,CONTRL,IND,ATS,M + LOGICAL STANDARD + DATA SCALEHEX / x'1FFF' / +C ELEM - WSKAZUJE 0-SLOWO OPISU PARAMETRU NA STOSIE +C CONTRL - INFORMACJA O KONTROLI /MPARIO(..)+1/ +C IND - ADRES W IPMEM OPISU PAR.FORMALNEGO +C ATS - ATS WARTOSCI PAR.FORMALNEGO LUB WARTOSCI FUNKCJI +C STANDARD - .TRUE. DLA PROCEDURY,FUNKCJI STANDARDOWEJ +C +C...... + CALL MCALLC + KIND=0 +C.....FUNKCJA,PROCEDURA STANDARDOWA ? + STANDARD=( STACK(VALTOP-4) .LT. LPMSYS ) + IF(STANDARD)GO TO 2000 +C NIE. +C JESLI REKORD - PRZESKOCZ + IF(STACK(VALTOP).EQ.8)GO TO 50 +C.....ZABEZPIECZ STOS + CALL SAFEST +C.....PRZEKAZ STEROWANIE + CALL SPHADR(VALTOP) + OPKOD=160 + IF(STACK(VALTOP-3).GT.8191)OPKOD=159 +C GOLOCAL LUB GO +C PRZEKAZ STEROWANIE Z ADRESEM FIZYCZNYM I AH NOWEGO OBIEKTU + CALL QUADR3(OPKOD,PHADR,STACK(VALTOP-2)) +C +C +C PO POWROCIE Z GENEROWANEGO OBIEKTU: +C +C + PHADR=TSTEMP(1) + ATS=TSTEMP(4) + STACK(VALTOP-2)=ATS +C NOWE ATS-Y NA ADR.FIZ. I VIRTUALNY + CALL QUADR3(2,ATS,PHADR) +C +C +C CZY PROC. VIRTUALNA LUB FORMALNA? TAK,JESLI BIT 1 =1 W SLOWIE -3 + IF(STACK(VALTOP-3).GE.16384)KIND=1 +C -OBOJETNE: FORMALNA CZY VIRTUALNA /CZY ZNANE OFFSETY/ +C +C +C +C.....JESLI SA PARAMETRY OUTPUT-ODCZYTAJ WARTOSCI + 50 M=IAND(STACK(VALTOP-3),SCALEHEX) +C M=LICZBA PARAMETROW OUTPUT + IF(M.EQ.0)GO TO 500 +C DLA PROCEDURY STANDARDOWEJ NAJPIERW ODCZYTAJ WARTOSCI WSZYSTKICH +C PARAMETROW + IF(.NOT.STANDARD)GO TO 100 + ELEM=FSTOUT-2 + DO 90 N=1,M +C ODCZYTAJ WARTOSC N-TEGO PAR.OUTPUT PROC.STANDARDOWEJ +C I WPISZ ATS TEJ WARTOSCI DO SLOWA -8 + ELEM=ELEM+11 + IND=STACK(ELEM-1) + NRPAR=STACK(ELEM+1) + 90 STACK(ELEM-8)=SGETPAR(IND,VALTOP) +C + 100 CONTINUE +C + DO 400 N=1,M +C OBSLUZ N-TY PARAMETR OUTPUT /OD PRAWEJ DO LEWEJ/ + FSTOUT=FSTOUT+11 + ELEM=FSTOUT-2 + CONTRL=IAND(ISHFT(STACK(ELEM),-4),7)+1 + STACK(ELEM)=IAND(STACK(ELEM),15) +C ODCZYTANE I WYZEROWANE BITY 9-11 + IND=STACK(ELEM-1) + NRPAR=STACK(ELEM+1) + IF(STANDARD)GO TO 102 +C ODCZYTAJ WARTOSC PARAMETRU OUTPUT + ATS=SGETPAR(IND,VALTOP) + GO TO 103 + 102 ATS=STACK(ELEM-8) +C +C KONWERSJA LUB DYNAMICZNA KONTROLA + 103 IF(CONTRL.GT.3 .AND.OPTTYP)GO TO 300 +C + IDR=STACK(ELEM-5) + IF(IDR.EQ.0)GO TO 105 + IDR=STYPFT(ELEM) +C IDR = TYP FORMALNY PAR.AKT. LUB ZERO +C + 105 GO TO (300,110,120,130,140,150,160),CONTRL +C +C KONWERSJA DO INTEGER + 110 OPKOD=TSTEMP(1) + CALL QUADR3(58,OPKOD,ATS) + ATS=OPKOD + GO TO 300 +C +C KONWERSJA DO REAL +#if WSIZE == 4 +120 opkod = tstemp(1) +#else +120 opkod = tstemp(2) +#endif + CALL QUADR3(59,OPKOD,ATS) + ATS=OPKOD + GO TO 300 +C +C KONTROLA DYN.,OBA TYPY STATYCZNE + 130 CALL QUADR3(150,ATS,STACK(ELEM-4)) + GO TO 300 +C +C.....ZNANY OFFSET? + 140 IF(KIND.NE.0)GO TO 165 + OPKOD=TSTEMP(2) + CALL QUADR4(21,OPKOD,IPMEM(IND-4),IPMEM(IND-3)) + GO TO 200 +C WSTAW TYP STATYCZNY PAR.AKTUALNEGO + 150 IDR=STYPST(ELEM) +C ZNANY OFFSET? + 160 IF(KIND.EQ.0)GO TO 170 +C NIEZNANY. ODCZYTAJ TYP PAR.FORMALNEGO + 165 OPKOD=SFPRST(NRPAR) + GO TO 200 +C ZNANY OFFSET +cdsw 170 OPKOD=SPARF2(IND) +cdsw ---------------------------- + 170 opkod = sparft(ind,2) +cdsw ----------------------------- +C +C OPKOD=ATS ODCZYTANEGO TYPU FORMALNEGO PAR.FORMALNEGO. + 200 CALL QUADR4(170,IDR,ATS,OPKOD) +C ZAKONCZONA KONTROLA LUB KONWERSJA. +C PODSTAW WARTOSC PAR.OUTPUT NA PAR.AKTUALNY + 300 CALL SSTORE(ELEM,ATS) +C ZAKONCZONA OBSLUGA KOLEJNEGO PARAMETRU OUTPUT +C + 400 CONTINUE +C +C + 500 ELEM=STACK(VALTOP)-7 +C = RODZAJ ELEMENTU : 1..6 ZAMIAST 8..13 /OPERATOR TU NIE WYSTAPI/ + GO TO (600,600,800,700,900,650),ELEM +C.....KLASA,REKORD. ZASTAP PRZEZ WARTOSC + 600 STACK(VALTOP)=2 + STACK(VALTOP-3)=0 + STACK(VALTOP-5)=0 +cbc kill template after return from process (opcode 222 LKILLTEMP) + prot = ipmem(stack(valtop-4)) + if (iand(prot, mtp) .eq. mproces) call quadr1(222) +cbc +C JESLI NA WEJSCIU JEST POCZATEK INSTRUKCJI LUB ETYKIETA - ZDEJMIJ +C ZE STOSU + IF(WB.EQ.32 .OR. WB.EQ.35 .OR. WB.EQ.44)CALL SPOP + GO TO 1000 +C.....SYGNAL. CZY JEST "RAISE" ? + 650 IF(WB.EQ.71)GO TO 670 +C BRAK RAISE - NIELEGALNE WYSTAPIENIE SYGNALU.ZASTAP PRZEZ UNIWERSALNY + CALL SERROR(453) + GO TO 720 +C ETYKIETA I USUNIECIE POLA DANYCH HANDLERA + 670 CALL SNEXT + IDL=153 + GO TO 810 +C.....PROCEDURA. CZY JEST CALL? + 700 IF(WB.EQ.7)GO TO 750 +C BRAK CALL - NIELEGALNE WYSTAPIENIE PROCEDURY. ZASTAP PRZEZ UNIWERSALNY + CALL SERROR(450) + 720 STACK(VALTOP)=0 + GO TO 1000 +C + 750 CALL SNEXT +C PROCEDURA STANDARDOWA ? + IF(STACK(VALTOP-4).LT.LPMSYS)GO TO 3000 +C NIE. +C.....BLOK PREFIKSOWANY. OBNIZ STOS,USUN POLE DANYCH + 800 IDL=143 + 810 CALL QUADR2(IDL,STACK(VALTOP-2)) + CALL SPOP + GO TO 1000 +C.....FUNKCJA. ZASTAP PRZEZ WARTOSC +C WEZ DLA RESULT: NUMER JAKO PARAMETRU, ADRES OPISU JAKO ATRYBUTU + 900 N=STACK(VALTOP-4) +C N=ADRES OPISU FUNKCJI W IPMEM +C PARAMETRY SA NUMEROWANE OD ZERA, RESULT WYSTEPUJE JAKO OSTATNI. + NRPAR=IPMEM(N+4)-1 + IND=IPMEM(N-5) + RESULT=SGETPAR(IND,VALTOP) +C = ATS ODCZYTANEJ WARTOSCI FUNKCJI +C FUNKCJA STANDARDOWA ? + IF(N.LT.LPMSYS)GO TO 4000 +C NIE. +C WSTAW TYP WARTOSCI + STACK(VALTOP-3)=IPMEM(N-4) + STACK(VALTOP-4)=IPMEM(N-3) +C CZY TYPU FORMALNEGO? + STACK(VALTOP-5)=0 + IF(IAND(IPMEM(N),4096).EQ.0)GO TO 950 +C A WIEC FUNKCJA TYPU FORMALNEGO. ZWYKLA ? + IF(KIND.EQ.1) GO TO 930 +C TAK. IDAC PO SL-ACH OD POLA DANYCH ODCZYTAJ TEN TYP + N=TSTEMP(2) + CALL QUADR4(54,N,STACK(VALTOP-2),STACK(VALTOP-4)) + GO TO 940 +C FUNKCJA FORMALNA LUB WIRTUALNA TYPU FORMALNEGO. ODCZYTAJ TEN TYP> + 930 N=SFPRST(NRPAR) + 940 STACK(VALTOP-5)=N +C +C ZASTAP PRZEZ WARTOSC + 950 STACK(VALTOP)=2 +C USUN POLE DANYCH + CALL QUADR2(143,STACK(VALTOP-2)) + STACK(VALTOP-2)=RESULT +C +C...............WSPOLNE ZAKONCZENIE.............. + 1000 PHADR=0 + LASTPR=0 + RETURN +C +C.....FUNKCJA,PROCEDURA STANDARDOWA. +C WPISZ WARTOSCI PARAMETROW INPUT. + 2000 OPKOD=STACK(VALTOP-4) + OPKOD=IPMEM(OPKOD+2) +C = NUMER FUNKCJI STANDARDOWEJ +C WYMAGA SPECJALNEGO TRAKTOWANIA ? + IF(OPKOD.GT.0)GO TO 2100 +C TAK + CALL SPECIAL + RETURN +C ... NORMALNIE OBSLUGIWANA + 2100 M=VALTOP-8*STACK(VALTOP-2) +C = ADRES PIERWSZEGO PAR.INPUT +C CZY SA / JESZCZE / PARAMETRY INPUT ? + 2200 IF(M.GE.VALTOP)GO TO 2400 +C WPISZ WARTOSC PARAMETRU + CALL QUADR4(145,SVATS(M),OPKOD,STACK(M-1)) + M=M+8 + GO TO 2200 +C +C ... PRZEKAZ STEROWANIE + 2400 CALL QUADR2(132,OPKOD) + GO TO 50 +C +C.....ZAKONCZENIE DLA PROCEDURY STANDARDOWEJ. +C ZDEJMIJ ZE STOSU WRAZ Z PARAMETRAMI INPUT + 3000 OPKOD=STACK(VALTOP-2)+1 + IF (OPKOD.LT.1)GO TO 3150 + DO 3100 M=1,OPKOD + CALL SPOP + 3100 CONTINUE +cbc 3150 RETURN + 3150 goto 1000 +cbc +C +C.....ZAKONCZENIE DLA FUNKCJI STANDARDOWEJ. +C ZASTAP FUNKCJE WRAZ Z PARAMETRAMI INPUT PRZEZ WARTOSC + 4000 OPKOD=STACK(VALTOP-2) + IF (OPKOD.LT.1)GO TO 4150 + DO 4100 M=1,OPKOD + CALL SPOP + 4100 CONTINUE + 4150 CALL SRESLT1(IPMEM(N-3)) + STACK(VALTOP-3)=IPMEM(N-4) +cbc RETURN + goto 1000 +cbc + END + SUBROUTINE SPECIAL +C---------------------------------------------------------------------------- +C +C OBSLUGUJE WYWOLANIE FUNKCJI STANDARDOWYCH WYMAGAJACYCH +C SPECJALNEJ OBSLUGI : +C +C NUMERY : +C -1 INOT +C -2 IOR +C -3 IAND +C -4 ISHFT +C -5 ORD +C -6 CHR +C -7 XOR +C +C NA CZUBKU STOSU ZNAJDUJE SIE FUNKCJA,POD NIA ARGUMENTY. +C PROCEDURA GENERUJE KOD I ZASTEPUJE NA STOSIE FUNKCJE WRAZ +C Z PARAMETRAMI PRZEZ JEJ WARTOSC. +C +C ##### OUTPUT CODE : 42 , 53 , 60 , 100 , 101 , 116 , 131 . +C +C +#include "stos.h" +#include "blank.h" +C +C + INTEGER ARGS(7) +C = LICZBA ARGUMENTOW + INTEGER OP(8) +C = OPKOD DO WYPISANIA +C + DATA ARGS/1,2,2,2,1,1,2/ + DATA OP/42,100,101,116,60,60,131,53/ +C +C + IND=STACK(VALTOP-4) +C = ADRES OPISU FUNKCJI + N=STACK(VALTOP-2) +C = LICZBA PAR. INPUT NA STOSIE , <= ARGS( .. ) + NR=-IPMEM(IND+2) +C = NUMER FUNKCJI, 1..7 + IF(ARGS(NR).EQ.2)GO TO 2000 +C +C.....JEDNOARGUMENTOWE. JEST ARGUMENT ? + IF(N.EQ.0)GO TO 1500 + CALL SPOP +C STALA? + IF(STACK(VALTOP).EQ.1)GO TO 1700 +C NIE + RESULT=TSTEMP(1) + CALL QUADR3(OP(NR),RESULT,STACK(VALTOP-2)) +C ... ZASTAP CZUBEK PRZEZ WARTOSC TEJ FUNKCJI + 1500 STACK(VALTOP)=2 + 1510 STACK(VALTOP-2)=RESULT + 1520 STACK(VALTOP-1)=0 + STACK(VALTOP-3)=IPMEM(IND-4) + STACK(VALTOP-4)=IPMEM(IND-3) + STACK(VALTOP-5)=0 + STACK(VALTOP-6)=0 + RETURN +C ... STALY ARGUMENT + 1700 IF(NR.NE.1)GO TO 1520 + RESULT=NOT(STACK(VALTOP-2)) + GO TO 1510 +C +C +C.....DWUARGUMENTOWE. CZY SA OBA ARGUMENTY ? + 2000 TRESLT=IPMEM(IND-3) + IF(N.EQ.2)GO TO 2200 +C NIE, 1 LUB 0 + IF(N.EQ.1)CALL SPOP + GO TO 1500 +C O.K. + 2200 CALL SPOP + CALL SARGMT + IDL=STACK(VLPREV-2) + IDR=STACK(VALTOP-2) +C = ATS-Y PIERWSZEGO I DRUGIEGO ARGUMENTU + GO TO (2300,2400,2500,2450),ARG +C ... OBA STALE + 2300 GO TO (2320,2320,2330,2340,2301,2301,2370),NR + 2301 CONTINUE +C IOR + 2320 RESULT=IOR(IDL,IDR) + GO TO 2350 +C IAND + 2330 RESULT=IAND(IDL,IDR) + GO TO 2350 +C ISHFT + 2340 RESULT=ISHFT(IDL,IDR) +C + 2350 CALL SRESULT(1) + RETURN +C XOR + 2370 RESULT=IEOR(IDL,IDR) + GO TO 2350 +C +C ... LEWY STALY,PRAWY NIE + 2400 IDL=SCONST(IDL) + 2450 RESULT=TSTEMP(1) + CALL QUADR4(OP(NR),RESULT,IDL,IDR) + 2460 CALL SRESULT(2) + RETURN +C +C ... PRAWY STALY,LEWY NIE + 2500 IF(NR.EQ.4)GO TO 2600 +C IOR,IAND,XOR + IDR=SCONST(IDR) + GO TO 2450 +C ... ISHFT( .. , CONST ) + 2600 NR=8 +cbc IDR=IAND(IDR,31) + IF(IDR.NE.0)GO TO 2450 + RESULT=IDL + GO TO 2460 + END + INTEGER FUNCTION STYPST(ELEM) +C----------------------------------------------------------------- +C POMOCNICZA. +C ZWRACA /NOWY/ ATS TYPU STATYCZNEGO ELEMENTU Z MIEJSCA ELEM STOSU +C I WSTAWIA TEN TYP +C +C ##### OUTPUT CODE : 21 . +C +#include "stos.h" +#include "blank.h" +C +C..... + STYPST=TSTEMP(2) + N=STACK(ELEM-3) + K=STACK(ELEM-4) + CALL QUADR4(21,STYPST,N,K) + RETURN + END + SUBROUTINE SPHADR(ELEM) +C---------------------------------------------------------------------- +C +C POMOCNICZA. +C GWARANTUJE,ZE PHADR ZAWIERA ADR.FIZYCZNY GENEROWANEGO OBIEKTU. +C JESLI PHADR=0,TO ODTWARZA ADR.FIZ. Z ADR.VIRT. ZE SLOWA -2 ELEMENTU +C ELEM STOSU. +C +C ##### OUTPUT CODE : 47 . +C +C +#include "stos.h" +#include "blank.h" +C..... + IF(PHADR.NE.0)RETURN +C ZATEM TRZEBA ODTWORZYC ADRES FIZYCZNY + PHADR=TSTEMP(1) + CALL QUADR3(47,PHADR,STACK(ELEM-2)) +C ODCZYTAJ ADR.FIZYCZNY Z VIRTUALNEGO BEZ MEMBER + RETURN + END +C + integer function sparft(ind, numdsw) +C----------------------------------------------------------------------------- +cdsw dodatkowy parametr numdsw = 1 - wejscie sparft, = 2 - wejscie sparf2 +C +C ENTRY SPARF2 +C +C POMOCNICZA. +C DLA WOLANEGO MODULU /ZNANE OFFSETY/ ZWRACA ATS ZMODYFIKOWANEGO +C TYPU FORMALNEGO PARAMETRU. +C +C WEJSCIE SPARF2 : WOLANY MODUL JEST NA CZUBKU STOSU /Z SCALLE/ +C WEJSCIE SPARFT : WOLANY MODUL JEST PONIZEJ CZUBKA /Z SPARAM/ +C +C IND - ADRES OPISU PAR. FORMALNEGO W IPMEM +C +C ##### OUTPUT CODE : 54 , 85 . +C +#include "stos.h" +#include "blank.h" +C + LOGICAL MLOCTP +C..... + ELEM=VLPREV +cdsw GO TO 1 +cdsw ------------------------ + if(numdsw.eq.1) go to 1 +cdsw ------------------------ +C +C----------------------- +cdsw ENTRY SPARF2(IND) + ELEM=VALTOP + 1 SPARFT=TSTEMP(2) +C CZY TEN TYP FORMALNY JEST ATRYBUTEM LOKALNYM? + L=IPMEM(IND-3) + IF(MLOCTP(L,STACK(ELEM-4)))GO TO 100 +C NIE.ODCZYTAJ IDAC PO SL-ACH + CALL QUADR4(54,SPARFT,STACK(ELEM-2),L) + GO TO 200 +C ATRYBUT LOKALNY + 100 CALL QUADR4(85,SPARFT,PHADR,IND) +C.....ZMODYFIKUJ TYP + 200 CALL SMODIFY(SPARFT,IPMEM(IND-4)) +cdsw SPARF2=SPARFT + RETURN + END + INTEGER FUNCTION SGETPAR(IND,ELEM) +C------------------------------------------------------------------------- +C +C POMOCNICZA. +C ODCZYTUJE WARTOSC FUNKCJI LUB PARAMETRU OUTPUT /IND=ADRES OPISU +C W IPMEM/ I ZWRACA /NOWY/ ATS TEJ WARTOSCI. +C UZYWANA ROWNIEZ DLA ODCZYTU PAR.OUTPUT LUB WARTOSCI FUNKCJI +C DLA PROCEDUR,FUNKCJI STANDARDOWYCH. +C ELEM-MIEJSCE STOSU Z WOLANYM MODULEM +C UZYWA NRPAR,PHADR. +C +C ##### OUTPUT CODE : 23 , 52 , 61 , 62 , 63 , 84 , 85 , 86 . +C +#include "stos.h" +#include "blank.h" +C + INTEGER APET,K +C..... + APET=SAPET(IPMEM(IND-4),IPMEM(IND-3)) + +#if WSIZE == 4 +cvax changed because of real appetite = 1 + dswap = apet + if (dswap .eq. 2) dswap = 1 + sgetpar = tstemp(dswap) +#else + SGETPAR=TSTEMP(APET) +#endif + + APET=APETYT(APET) +C STANDARDOWA? + IF(STACK(ELEM-4).LT.LPMSYS)GO TO 300 +C.....NIE +C CZY ZNANY OFFSET? TAK,JESLI W SLOWIE -3 BIT 1 =0. + IF(STACK(ELEM-3).GE.16384)GO TO 200 +C ZNANY OFFSET. ODCZYTAJ APET-SLOW + CALL QUADR4(83+APET,SGETPAR,PHADR,IND) + RETURN +C NIEZNANY OFFSET. WEZ ADRES FIZYCZNY PARAMETRU. + 200 K=TSTEMP(1) + CALL QUADR4(52,K,PHADR,NRPAR) +C ODCZYTAJ APET-SLOW + CALL QUADR3(60+APET,SGETPAR,K) + RETURN +C.....PROCEDURA,FUNKCJA STANDARDOWA + 300 APET=STACK(ELEM-4) + CALL QUADR4(23,SGETPAR,IPMEM(APET+2),NRPAR) + RETURN + END + INTEGER FUNCTION STYPFT(ELEM) +C----------------------------------------------------------------------------- +C +C POMOCNICZA. +C WYLICZA TYP FORMALNY ELEMENTU Z MIEJSCA ELEM STOSU /WARTOSC,ZMIENNA, +C ELEM.TABLICY,TABL.STATYCZNA,FUNKCJA/ I ZWRACA ATS TEGO TYPU. +C JESLI WB <> "(" MODYFIKUJE TEN TYP /ZWRACA ZMODYFIKOWANY/ +C +C ##### OUTPUT CODE : 15 , 22 , 54 , 85 . +C +#include "stos.h" +#include "blank.h" +C + INTEGER N,OPKOD + LOGICAL MLOCTP +C..... + N=STACK(ELEM)-1 + GO TO (200,300,200,300,199,199,199,199,199,199,300),N + 199 CONTINUE +C +C.....WARTOSC LUB ELEMENT TABLICY. TYP JUZ JEST WYLICZONY + 200 STYPFT=STACK(ELEM-5) + GO TO 335 +C +C.....ZMIENNA LUB TABLICA STATYCZNA. CZY PRZEZ KROPKE? + 300 IF(STACK(ELEM-7).EQ.0)GO TO 340 +C PRZEZ KROPKE. CZY TYP FORMALNY JEST ATRYBUTEM TEGO POLA? + IF(STACK(ELEM-5).LE.0)GO TO 310 +C ZATEM TO ATRYBUT LOKALNY.WEZ JEGO ADR.FIZYCZNY + N=SMEMBER(ELEM) + OPKOD=85 +C ="ODCZYTAJ 2 SLOWA" + GO TO 330 +C ODSZUKAJ TYP IDAC PO SL-ACH + 310 N=STACK(ELEM-7) + 320 OPKOD=54 +C ="ODCZYTAJ TYP FORMALNY IDAC PO SL-ACH" + 330 STYPFT=TSTEMP(2) + CALL QUADR4(OPKOD,STYPFT,N,STACK(ELEM-4)) +C +C.....JESLI WB <> "(" ZMODYFIKUJ TYP + 335 IF(WB.NE.36)CALL SMODIFY(STYPFT,STACK(ELEM-3)) + RETURN +C +C PRZEZ DISPLAY. CZY TYP MOZNA ODCZYTAC PRZEZ DISPLAY? + 340 IF(STACK(ELEM-5).GT.0)GO TO 350 +C ZATEM TRZEBA ISC PO SL-ACH OD MIEJSCA DEKLARACJI ZMIENNEJ +C SLOWO -5 = - SL TEJ ZMIENNEJ + N=TSTEMP(4) + CALL QUADR3(15,N,-STACK(ELEM-5)) +C N = ADR.VIRTUALNY POBRANY Z DISPLAYA + GO TO 320 +C TYP FORMALNY MOZNA ODCZYTAC POPRZEZ DISPLAY Z WARSTWY= STACK(ELEM-5) + 350 STYPFT=STACK(ELEM-4) + OPKOD=22 + N=STACK(ELEM-5) +C CZY TYP JEST ATRYBUTEM LOKALNYM? + IF(.NOT.MLOCTP(STYPFT,P))GO TO 330 +C TAK + STYPFT=TSINSE(STYPFT,2) + GO TO 335 + END + SUBROUTINE SMODIFY(N,L) +C--------------------------------------------------------------- +C +C POMOCNICZA. +C N=ATS TYPU FORMALNEGO , L=LICZBA ARRAY OF +C MODYFIKUJE TEN TYP O WLASCIWA LICZBE ARRAY-OF I ATS WYNIKOWEGO +C TYPU PODSTAWIA NA N. +C +C ##### OUTPUT CODE : 87 . +C + INTEGER TSTEMP + IF(L.EQ.0)RETURN +C A WIEC TRZEBA MODYFIKOWAC + K=TSTEMP(2) + CALL QUADR4(87,K,N,L) + N=K + RETURN + END + SUBROUTINE SSTORE(ELEM,ATS) +C----------------------------------------------------------------------------- +C +C GENERUJE PRZESLANIE WARTOSCI O ADRESIE ATS W TABLICY SYMBOLI NA +C ELEMENT /ZMIENNA,ELEM.TABLICY,TABL.STATYCZNA/ Z MIEJSCA ELEM STOSU. +C NIE DOKONUJE ZADNEJ KONTROLI. +C NIE ZMIENIA STOSU. +C LICZBA PRZESYLANYCH SLOW ZALEZY OD TYPU WARTOSCI ELEMENTU STOSU +C +C ##### OUTPUT CODE : 60 , 161 , 162 , 163 , 164 , 165 , 166 . +C +#include "stos.h" +#include "blank.h" +C + INTEGER APET,ADRES,N +C..... + N=STACK(ELEM)-2 + ADRES=STACK(ELEM-2) +C WYLICZ APETYT + APET=SAPET2(ELEM) + APET=APETYT(APET) + GO TO (300,400,500),N +C +C ZMIENNA. CZY PRZEZ KROPKE? + 300 IF(STACK(ELEM-7).EQ.0)GO TO 350 +C TAK. + CALL QUADR4(163+APET,SMEMBER(ELEM),ATS,ADRES) + CALL SCANCEL(ADRES) + RETURN +C ZMIENNA PRZEZ DISPLAY. + 350 CALL QUADR3(60,ADRES,ATS) +C "MOVE" + RETURN +C +C.....ELEM.TABLICY +C WPISZ APET-SLOW POD ADRES FIZYCZNY ELEMENTU TABLICY + 400 CALL QUADR3(160+APET,SARRAY(ELEM),ATS) +C +C TABLICA STATYCZNA + 500 CONTINUE +C B R A K + RETURN + END + INTEGER FUNCTION SARRAY(ELEM) +C----------------------------------------------------------------------------- +C +C POMOCNICZA. +C ZWRACA ATS ADRESU FIZYCZNEGO ELEMENTU TABLICY Z MIEJSCA ELEM STOSU +C USUWA EWENTUALNY MINUS W SLOWIE -2 +C +C ##### OUTPUT CODE : 64 , 65 , 102 , 103 , 104 , 105 . +C +#include "stos.h" +#include "option.h" +#include "blank.h" +C + INTEGER N,K +C..... + SARRAY=TSTEMP(1) + N=SAPET2(ELEM) + K=APETYT(N) + N=STACK(ELEM-7) +C CZY INDEKS JEST STALA? + IF(STACK(ELEM-2).LT.0)GO TO 100 +C.....NIE. + IF(K.EQ.1)GO TO 50 +C POMNOZ INDEKS PRZEZ 2 LUB 3 + N=TSTEMP(1) + CALL QUADR3(62+K,N,STACK(ELEM-7)) + 50 CALL QUADR4(102+OPTIND+OPTMEM,SARRAY,STACK(ELEM-2),N) + RETURN +C.....INDEKS JEST STALA + 100 N=SCONST(K*N) + STACK(ELEM-2)= - STACK(ELEM-2) + GO TO 50 + END + INTEGER FUNCTION SAPET2(ELEM) +C----------------------------------------------------------------------------- +C +C POMOCNICZA. ZWRACA APETYT /1,3,4/ DLA STALEJ,ZMIENNEJ,WARTOSCI +C Z MIEJSCA ELEM STOSU. +C +#include "stos.h" +#include "blank.h" +C + N=STACK(ELEM-3) + K=STACK(ELEM-4) + SAPET2=SAPET(N,K) + RETURN + END + INTEGER FUNCTION SAPET(K,N) +C----------------------------------------------------------------------------- +C +C POMOCNICZA. ZWRACA APETYT/1,2,4/ DLA WARTOSCI TYPU (K,N) +C 1 - INTEGER,BOOLEAN,STRING,CHAR +C 2 - REAL +C 4 - DOWOLNY TYP REFERENCYJNY +C +C + IMPLICIT INTEGER (A-Z) +#include "blank.h" +C +C +C TABLICOWY? + IF(K.GT.0)GO TO 100 +C = 1 ? + SAPET=1 + IF(N.EQ.NRINT)RETURN + IF(N.EQ.NRBOOL)RETURN + IF(N.EQ.NRCHR)RETURN + IF(N.EQ.NRTEXT)RETURN +C REAL? + SAPET=2 + IF(N.EQ.NRRE)RETURN +C REFERENCYJNY + 100 SAPET=4 + RETURN + END + INTEGER FUNCTION SMEMBER(ELEM) +C--------------------------------------------------------------------------- +C +C POMOCNICZA: ZWRACA /NOWY/ ATS ADRESU FIZYCZNEGO Z ADR.VIRT. ELEMENTU +C Z MIEJSCA ELEM STOSU. +C +C ##### OUTPUT CODE : 46 , 47 . +C +#include "stos.h" +#include "option.h" +#include "blank.h" +C +C + SMEMBER=TSTEMP(1) + N=STACK(ELEM-7) + CALL QUADR3(46+OPTMEM,SMEMBER,N) + RETURN + END + INTEGER FUNCTION SPRFLD(PARAM) +C---------------------------------------------------------------------------- +C +C ZWRACA /NOWY/ATS NUMERU PROTOTYPU LUB OJCA SYNT. I NUMERU PROTOTYPU. +C PARAM=.TRUE. -UZYWANE PRZY PRZEKAZYWANIU PARAMETRU AKTUALNEGO +C /NA CZUBKU NA PEWNO FUNKCJA,PROCEDURA/ +C DOSTARCZA OJCA SYNTAKTYCZNEGO I PROTOTYPU/SKLEJONE W 1 ARG./ +C WOLANA PRZEZ SPARAM. +C PARAM=.FALSE. -UZYWANE PRZY GENEROWANIU OBIEKTU KLASY,PROCEDURY,FUNKCJI +C LUB BLOKU PREF. DOSTARCZA NUMERU PROTOTYPU /DLA PARAMETRU LUB +C DOSTEPU PRZEZ KROPKE-ROWNIEZ OJCA SYNT./. +C CZUBEK STOSU ZAWIERA KLASE,BLOK PREF,PROCEDURE,FUNKCJE. +C WOLANA PRZEZ SCALLB. +C +C NIE UZYWANA DLA PROCEDUR,FUNKCJI STANDARDOWYCH. +C +C ##### OUTPUT CODE : 15 , 16, 20 , 44 , 45 , 86 , 112 . +C +C +#include "stos.h" +#include "option.h" +#include "blank.h" +CCCCCCCCCCCCCCCC + LOGICAL PARAM +C + INTEGER OPKOD,IND,ATS,N +C +C................. + SPRFLD=TSTEMP(1) + IND=STACK(VALTOP-4) +C IND=ADRES PROTOTYPU +C.....CZY TO PARAMETR,VIRTUAL CZY "ZWYKLY" PROTOTYP? + N=KIND+1 + GO TO (100,200,300),N +C.....ZWYKLY PROTOTYP.WSTAW JEGO NUMER. + 100 CALL QUADR3(16,SPRFLD,STACK(VALTOP-4)) +C DLA BLOKU PREF. TO JUZ WSZYSTKO + IF(STACK(VALTOP).EQ.10)RETURN +C CZY PRZEZ KROPKE? + IF(STACK(VALTOP-7).EQ.0)GO TO 150 +C TAK. + 125 ATS=STACK(VALTOP-7) +C.....SKLEJ ADRES VIRTUALNY /ATS/ I NUMER PROTOTYPU /SPRFLD/ W 1 ARGUMENT. + 130 OPKOD=112 +C OPKOD="SKLEJ W 1 ARG." + N=SPRFLD + 135 SPRFLD=TSTEMP(3) + CALL QUADR4(OPKOD,SPRFLD,ATS,N) + RETURN +C.....ZWYKLY PROTOTYP NIE PRZEZ KROPKE.JESLI NIE PARAMETR-KONIEC. + 150 IF(.NOT.PARAM)RETURN +C ZATEM PARAMETR.WEZ ADRES Z DISPLAYA. + ATS=TSTEMP(4) + CALL QUADR3(15,ATS,IPMEM(IND-1)) + GO TO 130 +C.....PROCEDURA,FUNKCJA VIRTUALNA. + 200 IF(STACK(VALTOP-7).EQ.0)GO TO 250 +C WYZNACZ PRZEZ KROPKE PROTOTYP VIRTUALA +cbc split opcode 44,45 into 228 (LASKPROT) and 44,45 (LVIRTDOT) +cbc in order to call virtual from process properly +cbc CALL QUADR4(44+OPTMEM,SPRFLD,STACK(VALTOP-7),IPMEM(IND+27)) + call quadr2(228, stack(valtop-7)) + call quadr3(44+optmem, sprfld, ipmem(ind+27)) +cbc + GO TO 125 +C WYZNACZ PRZEZ DISPLAY PROTOTYP VIRTUALA + 250 CALL QUADR4(20,SPRFLD,IPMEM(IND-1),IPMEM(IND+27)) + GO TO 150 +C.....PARAMETR. ODCZYTAJ + 300 IF(STACK(VALTOP-7).EQ.0)GO TO 350 +C A WIEC PRZEZ KROPKE.WEZ ADRES FIZYCZNY POLA. + ATS=SMEMBER(VALTOP) + N=IND + OPKOD=86 +C OPKOD="WCZYTAJ 3 SLOWA Z POLA O ADR.FIZYCZNYM..." +C ATS=ADR.FIZYCZNY,SPRFLD=ATS PARAMETRU + GO TO 135 +C PARAMETR PRZEZ DISPLAY + 350 SPRFLD=TSINSE(IND,LOCAL) + RETURN + END + INTEGER FUNCTION SFPRST(N) +C---------------------------------------------------- +C +C POMOCNICZA. N=NUMER PARAMETRU. ODCZYTUJE TYP +C /NIEZNANY W CZASIE KOMPILACJI/ N-TEGO PARAMETRU +C PROCEDURY,FUNKCJI VIRTUALNEJ LUB FORMALNEJ,ZWRACA JEGO ATS. +C +C ##### OUTPUT CODE : 40 . +C +#include "stos.h" +C +C +C + SFPRST=TSTEMP(2) + CALL QUADR4(40,SFPRST,PHADR,N) + RETURN + END + INTEGER FUNCTION SPARST(N) +C----------------------------------------------------------------------- +C +C POMOCNICZA.WSTAWIA TYP STATYCZNY PARAMETRU FORMALNEGO. +C N=ADRES OPISU PARAMETRU W IPMEM +C +C ##### OUTPUT CODE : 21 . +C + IMPLICIT INTEGER (A-Z) +#include "blank.h" +C +C + SPARST=TSTEMP(2) + CALL QUADR4(21,SPARST,IPMEM(N-4),IPMEM(N-3)) + RETURN + END + SUBROUTINE SAFE(N) +C--------------------------------------------------------------------- +C +C N = ADRES W TABLICY SYMBOLI LUB 0. +C JESLI N <> 0 ,GENERUJE NOWY ATRYBUT ROBOCZY I ZASTEPUJE NIM +C PARAMETR AKTUALNY,ZACHOWUJAC ZNAK. +C GENERUJE OPKOD MOVE&SAFE - NOWY ATRYBUT Z WARTOSCIA I APETYTEM +C STAREGO,WARTOSC W ZMIENNEJ ROBOCZEJ. +C +C ##### OUTPUT CODE : 195 . +C +#include "stos.h" +#include "blank.h" +C +C + IF(N.EQ.0)RETURN + LSTEMP=LSTEMP-3 + K=LSTEMP +C ABY ZACHOWAC EWENTUALNY MINUS + IF(N.GT.0) GO TO 100 + K= - K + N= - N + 100 CALL QUADR3(195,LSTEMP,N) + N=K + RETURN + END + INTEGER FUNCTION TSTEMP(N) +C------------------------------------------------------------------------ +C +C +C ##### OUTPUT CODE : 201 , 202 , 203 , 204 . +C +#include "stos.h" +#include "blank.h" +C +C + LSTEMP=LSTEMP-3 + TSTEMP=LSTEMP + CALL QUADR2(200+N,TSTEMP) + IF(FRSTTS.GE.LSTEMP)CALL SSTOVF + RETURN + END + INTEGER FUNCTION TSINSE(K,N) +C------------------------------------------------------------------------- +C +C K = ADRES OPISU ATRYBUTU W IPMEM +C N = WIDZIALNOSC : 0 - GLOBALNY,1 - PRZEZ DISPLAY,2 - LOKALNY ATRYBUT +C +C WYZNACZA ADRES OPISU ATRYBUTU W TABLICY SYMBOLI. +C UZYWA POMOCNICZEGO SLOWNIKA ZAWIERAJACEGO TYLKO ATRYBUTY UZYTE +C W BIEZACYM MODULE. +C +C ELEMENTY SLOWNIKA: +C SLOWO 0 = P /BIEZACY PROTOTYP/ ORAZ +C SLOWO +1 = ADRES OPISU ATRYBUTU W IPMEM +C <=> ATRYBUT JEST W SLOWNIKU. +C - I WTEDY SLOWO +1 OPISU +C ATRYBUTU ZAWIERA ADRES TEGO ELEMENTU SLOWNIKA +C +C SLOWO +2 = ADRES W TABLICY SYMBOLI +C +C JESLI SLOWO 0 <> P LUB SLOWO +1 <> ADRESU ATRYBUTU +C TO ATRYBUTU JESZCZE NIE MA W SLOWNIKU +C ELEMENTY SLOWNIKA DOPISYWANE SA NA LEWO OD LMEM +C IPMEM(LMEM) = INDEKS PIERWSZEGO OD PRAWEJ WOLNEGO +C +C +C +C ##### OUTPUT CODE : 205 , 206 , 207 . +C +C ##### DETECTED ERROR(S) : 553 , 554 . ( PRZEPELNIENIA ) +C +C +#include "stos.h" +#include "blank.h" +C +C +C +C + TSINSE=IPMEM(K+1) +C UZYTY JUZ W TYM MODULE? + IF(IPMEM(TSINSE).NE.P)GO TO 100 + IF(IPMEM(TSINSE+1).NE.K)GO TO 100 +C.....TAK. + TSINSE=IPMEM(TSINSE+2) + RETURN +C.....JESZCZE NIE. WYZNACZ NOWY ADRES W TABLICY SYMBOLI + 100 J=IPMEM(LMEM)-3 + IF(IRECN.GT.J)GO TO 200 + IPMEM(LMEM)=J + TSINSE=J+1 + IPMEM(TSINSE)=P + IPMEM(TSINSE+1)=K + IPMEM(TSINSE+2)=FRSTTS + IPMEM(K+1)=TSINSE + TSINSE=FRSTTS + FRSTTS=FRSTTS+3 + CALL QUADR3(205+N,TSINSE,K) + IF(FRSTTS.GE.LSTEMP)CALL SSTOVF + RETURN +C.....PRZEPELNIENIE TABLICY SYMBOLI LUB SLOWNIKA STALYCH REAL + 200 CALL SERRO2(504,0) + RETURN + END + SUBROUTINE SCANCEL(ADR) +C----------------------------------------------------------------------------- +C +C JESLI ATRYBUT WSKAZANY PRZEZ ADR BYL UZYTY /JEST W TABLICY +C SYMBOLI/ - PROCEDURA WYPISUJE OPKOD "CANCEL" , INACZEJ +C NIC NIE ROBI. +C +C UZYWANA PRZY ZMIANIE WARTOSCI ATRYBUTU DOSTEPNEGO PRZEZ KROPKE, +C DLA ZABEZPIECZENIA NASTEPNEGO PRZEBIEGU PRZED TRZYMANIEM +C INFORMACJI "WARTOSC ATRYBUTU W REJESTRZE" POMIMO /NIEJAWNEJ/ +C ZMIANY WARTOSCI TEGO ATRYBUTU PRZY UZYCIU DOSTEPU KROPKOWANEGO. +C +C ##### OUTPUT CODE : 158 . +C +C + IMPLICIT INTEGER (A-Z) +#include "blank.h" +C +C +C +C.....JEST W TABLICY SYMBOLI? + N=IPMEM(ADR+1) + IF(IPMEM(N).NE.P)RETURN + IF(IPMEM(N+1).NE.ADR)RETURN +C TAK + CALL QUADR2(158,IPMEM(N+2)) + RETURN + END + SUBROUTINE SAFEST +C------------------------------------------------------------------------- +C +C ZABEZPIECZA ELEMENTY STOSU PRZY GENERACJI NOWEGO MODULU: +C DLA ELEMENTOW BEDACYCH LSE ZABEZPIECZA ADRES TJ. WARTOSC WYRAZENIA +C PRZED KROPKA DLA ZMIENNEJ I TABLICY STATYCZNEJ, ADRES TABLICY DLA +C ELEMENTU TABLICY I WARTOSC INDEKSU - JESLI NIE STALA - DLA TABLIC. +C +C DLA ELEMENTOW POWYZEJ LSTLSE ZABEZPIECZA WARTOSC ZMIENNYCH. +C +C ##### OUTPUT CODE : 61 , 62 , 63 , 84 , 85 , 86 . +C +#include "stos.h" +#include "blank.h" +C +C + INTEGER K,ELEM,N,L +C......ZACZNIJ OD POPRZEDNIEGO + K=VLPREV +C CZY JEST COS NIEZABEZPIECZONEGO NAD OPISAMI PETLI FOR? + 100 IF(K.GT.LSTFOR .AND. K.GT.LSTSAF)GO TO 120 +C NIE + LSTSAF=VLPREV + RETURN +C TAK. + 120 ELEM=STACK(K) +C ELEM=RODZAJ ELEMENTU + IF(ELEM.LT.2 .OR. ELEM.GT.5)GO TO 1000 +C LSE? + IF(K.LE.LSTLSE)GO TO 200 +C.....A WIEC POWYZEJ LSE : WARTOSC,ZMIENNA,ELEM.TABLICY,TABLICA STATYCZNA. +C ZASTAP PRZEZ WARTOSC. + IF(ELEM.EQ.2)GO TO 150 + IF(ELEM.EQ.4)GO TO 160 +C B R A K DLA TABLICY STATYCZNEJ +C ... ZMIENNA. PRZEZ KROPKE? + IF(STACK(K-7).EQ.0)GO TO 140 +C TAK.ODCZYTAJ WARTOSC + N=SAPET2(K) +C N=RODZAJ APETYTU ZMIENNEJ +#if WSIZE == 4 +cvax changed because of real appetite = 1 + dswap = n + if (dswap .eq.2) dswap = 1 + l = tstemp(dswap) +#else + L=TSTEMP(N) +#endif + + N=APETYT(N) + CALL QUADR4(83+N,L,SMEMBER(K),STACK(K-2)) + 135 STACK(K-2)=L +C WPISZ 'WARTOSC' + 140 STACK(K)=2 + 150 CALL SAFE(STACK(K-2)) + GO TO 1000 +C ... ELEM.TABLICY. ODCZYTAJ WARTOSC + 160 N=SAPET2(K) +#if WSIZE == 4 +cvax changed because of real appetite = 1 + dswap = n + if (dswap .eq.2) dswap = 1 + l = tstemp(dswap) +#else + L=TSTEMP(N) +#endif + + N=APETYT(N) + CALL QUADR3(60+N,L,SARRAY(K)) + GO TO 135 +C.....LSE : ZMIENNA,ELEM.TABLICY,TABLICA STATYCZNA. + 200 CALL SAVEVAR(K) +C +C.....WEZ POPRZEDNI ELEMENT + 1000 K=K-STCKAP(ELEM) + GO TO 100 + END + SUBROUTINE SINDXS +C MAKIETA + RETURN + END + SUBROUTINE QUADR4(N1,N2,N3,N4) +C------------------------------------------------------------ +C +C WYPISUJE GENEROWANY KOD POSREDNI +C +#include "stos.h" +#include "blank.h" +C +C + COMMON/TEST/TESTC,TESTS,TESTH + LOGICAL TESTC,TESTS,TESTH + common/stream/errflg,line,ibuf2(265),ibuf3(7),junk(260) +C +C BUFOR ZAJMUJE SLOWA LMEM-259 .. LMEM-1 + + IPMEM(LSTWRD+1)=N1 + IPMEM(LSTWRD+2)=N2 + IPMEM(LSTWRD+3)=N3 + IPMEM(LSTWRD+4)=N4 + + IF(.NOT.TESTC) GOTO 1000 + call ffputcs(13,' *******************') + call ffputi (13,N1,8) + call ffputi (13,N2,8) + call ffputi (13,N3,8) + call ffputi (13,N4,8) + call ffputnl(13) +1000 CONTINUE + + LSTWRD=LSTWRD+4 + IF(LSTWRD.GE.LMEM-4)CALL QDROUT + RETURN + END + SUBROUTINE QUADR3(N1,N2,N3) +C------------------------------------------------------------ +C +C WYPISUJE GENEROWANY KOD POSREDNI +C +C +#include "stos.h" +#include "blank.h" +C + COMMON/TEST/TESTC,TESTS,TESTH + LOGICAL TESTC,TESTS,TESTH + common/stream/errflg,line,ibuf2(265),ibuf3(7),junk(260) +C +C +C BUFOR ZAJMUJE SLOWA LMEM-259 .. LMEM-1 + IPMEM(LSTWRD+1)=N1 + IPMEM(LSTWRD+2)=N2 + IPMEM(LSTWRD+3)=N3 + + IF(.NOT.TESTC) GOTO 1000 + call ffputcs(13,' *******************') + call ffputi (13,N1,8) + call ffputi (13,N2,8) + call ffputi (13,N3,8) + call ffputnl(13) +1000 CONTINUE + + LSTWRD=LSTWRD+3 + IF(LSTWRD.GE.LMEM-4)CALL QDROUT + RETURN + END + SUBROUTINE QUADR2(N1,N2) +C------------------------------------------------------------ +C +C WYPISUJE GENEROWANY KOD POSREDNI +C +#include "stos.h" +#include "blank.h" +C +C + COMMON/TEST/TESTC,TESTS,TESTH + LOGICAL TESTC,TESTS,TESTH + common/stream/errflg,line,ibuf2(265),ibuf3(7),junk(260) +C +C BUFOR ZAJMUJE SLOWA LMEM-259 .. LMEM-1 + IPMEM(LSTWRD+1)=N1 + IPMEM(LSTWRD+2)=N2 + + IF(.NOT.TESTC) GOTO 1000 + call ffputcs(13,' *******************') + call ffputi (13,N1,8) + call ffputi (13,N2,8) + call ffputnl(13) +1000 CONTINUE + + LSTWRD=LSTWRD+2 + IF(LSTWRD.GE.LMEM-4)CALL QDROUT + RETURN + END + SUBROUTINE QUADR1(N1) +C------------------------------------------------------------ +C +C WYPISUJE GENEROWANY KOD POSREDNI +C +#include "stos.h" +#include "blank.h" +C +C + COMMON/TEST/TESTC,TESTS,TESTH + LOGICAL TESTC,TESTS,TESTH + common/stream/errflg,line,ibuf2(265),ibuf3(7),junk(260) +C +C BUFOR ZAJMUJE SLOWA LMEM-259 .. LMEM-1 + LSTWRD=LSTWRD+1 + IPMEM(LSTWRD)=N1 + + IF(.NOT.TESTC) GOTO 1000 + call ffputcs(13,' *******************') + call ffputi (13,N1,8) + call ffputnl(13) +1000 CONTINUE + + IF(LSTWRD.GE.LMEM-4)CALL QDROUT + RETURN + END + SUBROUTINE QDROUT +C----------------------------------------------------------------------------- +C +C OPROZNIA BUFOR IPMEM Z GENEROWANYM KODEM POSREDNIM. +C PRZEPISUJE OSTATNIE 3 LICZBY NA POCZATEK,USTAWIA LSTWRD. +C JESLI ERRFLG=.TRUE. - NIE WYPISUJE NIC. +C +#include "stos.h" +#include "blank.h" +C +C +C BUFOR ZAJMUJE SLOWA LMEM-259 .. LMEM-1 + COMMON/STREAM/ERRFLG,LINE,IBUF2(265),IBUF3(7),JUNK(260) + LOGICAL ERRFLG +C +C..... + IF(ERRFLG)GO TO 100 +C WEZ NOWY NUMER REKORDU + call ffwrite_ints(18, ipmem(lmem-259), 256) + +cbc +cdsw ********************************* +C PRZEPISZ OSTATNIE 3 SLOWA NA POCZATEK + N=LMEM-259 + M=LMEM-3 + IPMEM(N)=IPMEM(M) + IPMEM(N+1)=IPMEM(M+1) + IPMEM(N+2)=IPMEM(M+2) + 100 LSTWRD=LSTWRD-256 + RETURN + END + SUBROUTINE SERROR(NUMER) +C------------------------------------------------------------------------ +cdsw procedura podzielona na serror i serro2 +C +C SYGNALIZUJE BLAD O PODANYM NUMERZE DLA NAZWY Z CZUBKA STOSU. +C DLA 'UNIWERSALNEGO' NIE ROBI NIC. +C +C +C ENTRY SERRO2 +C +C +#include "stos.h" +#include "blank.h" +C +C + COMMON/TEST/TESTC,TESTS,TESTH + LOGICAL TESTC,TESTS,TESTH +C +C + ELEM=VALTOP + 100 IF(STACK(ELEM).EQ.0)RETURN + NAZWA=STACK(ELEM-1) + + IF(.NOT.TESTC) GOTO 1000 + call ffputcs(13,' ERROR') + call ffputi (13,NUMER,6) + call ffputi (13,NAZWA,8) + call ffputnl(13) +1000 CONTINUE + + CALL MERR(NUMER,NAZWA) + RETURN + END + SUBROUTINE SERRO2(NUMER,elem) +C------------------------------------------------------------------------ +cdsw procedura podzielona na serror i serro2 +C +C SYGNALIZUJE BLAD O PODANYM NUMERZE DLA NAZWY Z CZUBKA STOSU. +C DLA 'UNIWERSALNEGO' NIE ROBI NIC. +C +C +C ENTRY SERRO2 +C +C +#include "stos.h" +#include "blank.h" +C +C + COMMON/TEST/TESTC,TESTS,TESTH + LOGICAL TESTC,TESTS,TESTH +C +C + 100 IF(STACK(ELEM).EQ.0)RETURN + NAZWA=STACK(ELEM-1) + + IF(.NOT.TESTC) GOTO 1000 + call ffputcs(13,' ERROR') + call ffputi (13,NUMER,6) + call ffputi (13,NAZWA,8) + call ffputnl(13) +1000 CONTINUE + + CALL MERR(NUMER,NAZWA) + RETURN + END + SUBROUTINE SSTOVF +C--------------------------------------------------------------------------- +C +C SYGNALIZUJE PRZEPELNIENIE TABLICY SYMBOLI - BLAD 553 +C I CZYSCI JA +C +C +#include "stos.h" +#include "blank.h" +cdsw&bc + common /stacks/ btsins, btstem +C +C +C +C +C....PRZEPELNIENIE TABLICY SYMBOLI + CALL MERR(553,0) +C OPROZNIJ TABLICE SYMBOLI +cdsw&bc FRSTTS=LPMEM+1 +c TEMPNR=LMEM-3 + frstts = btsins + tempnr = btstem-3 +c +cdsw ---------- added ----------- + lstemp = tempnr +cdsw ------------------------------ + IPMEM(LMEM)=BOTTOM-1 + RETURN + END + + + SUBROUTINE STEST +C--------------------------------------------------------------------- +C +C READ TESTING OPTIONS +#include "stos.h" +C +C + COMMON/TEST/TESTC,TESTS,TESTH + LOGICAL TESTC,TESTS,TESTH +C +cdsw BYTE CHARS(80) +cdsw BYTE HN,HNS,HY,HYS,HC,HS,HH +cdsw --------------------------------- + character chars(80) + character hn,hns,hy,hys,hc,hs,hh +cdsw --------------------------------- + DATA HN,HNS,HY,HYS,HC,HS,HH /'n','n','y','y','c','s','h'/ +C +C + TEST=.FALSE. + TESTC=.FALSE. + TESTS=.FALSE. + TESTH=.FALSE. + ATLINE=0 + RETURN + +100 call ffputcs(0,' TESTING ? Y/N:') + call ffgets (0,CHARS,80) + + IF(CHARS(1).EQ.HN .OR. CHARS(1).EQ.HNS)RETURN + IF(CHARS(1).NE.HY .AND. CHARS(1).NE.HYS) GO TO 100 + TEST=.TRUE. + + call ffputcs(0,' OPTIONS : C - code , S - stack , H - halt') + call ffputnl(0) + + call ffgets (0,CHARS,80) + + DO 200 N=1,80 + IF(CHARS(N).EQ.HC)TESTC=.TRUE. + IF(CHARS(N).EQ.HS)TESTS=.TRUE. + IF(CHARS(N).EQ.HH)TESTH=.TRUE. + 200 CONTINUE +cdsw IF(TESTH) CALL STOPAT + RETURN + END + SUBROUTINE SABORT + RETURN + END + SUBROUTINE SRCVOFF + RETURN + END + + + SUBROUTINE SLCSTOUT +C--------------------------------------------------------------------- +C +C WYPISUJE NA PLIK 15 HEKSADECYMALNA REPREZENTACJE +C TABLICY SYMBOLI I L-KODU. +C +#include "stos.h" +#include "blank.h" +C +C + COMMON/STREAM/ERRFLG,LINE,IBUF2(265),IBUF3(7),JUNK(260) + LOGICAL ERRFLG +C IBUF3 - OPIS STRUMIENIA Z WCZYTYWANYM I PRODUKOWANYM KODEM POSREDNIM +C +C + INTEGER BL(302) + EQUIVALENCE ( BL(1),IOP(1) ) + + integer*4 offset + integer*2 bigbuf + integer buf1(1) + common /combuf/ ind, length, bigbuf(16000) +cvax equivalence (bigbuf(1), buf1(1)) + character bufc(32000) + equivalence (bigbuf(1), buf1(1), bufc(1)) + +cdsw&ail + common /stacks/ btsins, btstem + +cbc +C +C.....SYMBOL TABLE +cdsw&ail +c adres stalej none jest przekazany na zmiennej LOCAL ( numer 300 ) + LOCAL = btstem-3 + call ffwrite_ints(15, bl(1), 302) +#if WSIZE == 4 +CPS tu bylo porownanie z 50000, co dla LPMEM=48000 dalo maximun +CPS 2000 slow na stale rzeczywiste - nie rozumiem skad to ograniczenie +CPS dlatego nie zmienilem go + if (irecn .gt. LPMEMSIZE+2000 ) call mdrop(0) +#endif + call ffwrite_ints(15, ipmem(1), irecn) +C.....L-CODE + offset=0 + call ffseek(18,offset) +3000 len=31744 + call ffread(18,buf1(1),len) + if (len .eq. 0) goto 3010 + wlen = len + call ffwrite(15,buf1(1),wlen) + if (len .eq. 31744) goto 3000 +3010 continue + RETURN + END + diff --git a/sources/pass1/al13.ff b/sources/pass1/al13.ff new file mode 100644 index 0000000..9293b1f --- /dev/null +++ b/sources/pass1/al13.ff @@ -0,0 +1,3175 @@ +C Loglan82 Compiler&Interpreter +C Copyright (C) 1981-1993 Institute of Informatics, University of Warsaw +C Copyright (C) 1993, 1994 LITA, Pau +C +C This program is free software; you can redistribute it and/or modify +C it under the terms of the GNU General Public License as published by +C the Free Software Foundation; either version 2 of the License, or +C (at your option) any later version. +C +C This program is distributed in the hope that it will be useful, +C but WITHOUT ANY WARRANTY; without even the implied warranty of +C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +C GNU General Public License for more details. File: LICENSE.GNU +C =============================================================== + +*DECK MPARPF + SUBROUTINE MPARPF (PAPROT, PAID, PAOB, DCONTR) +C-------------BADA ZGODNOSC PARAMETRU AKTUALNEGO (FUNKCJI/PROCEDURY) +C I PARAMETRU FORMALNEGO. +C PAPROT - NUMER PROTOTYPU AKTUALNEGO +C PAID - JEGO IDENTYFIKATOR ZE SCANNERA +C PAOB - DOSTEPNOSC PRZEZ DISPLAY +C DCONTR - NADAWANA JEST WARTOSC .TRUE., GDY KONIECZNA JEST +C KONTROLA DYNAMICZNA +C SYGNALIZOWANE BLEDY +C 626 - NIEZGODNOSC RODZAJOW PARAMETROW FORMALNEGO I AKTUAL- +C NEGO (FUNKCJA<->PROCEDURA) +C NIEZGODNE NAGLOWKI +C 627 - NIEZGODNE RODZAJE PARAMETROW +C 628 - TYPY PARAMETROW SA NIEZGODNEGO RODZAJU +C 629 - TYPY PARAMETROW MAJA ROZLACZNE SEKWENCJE PREFIKSOWE +C 630 - NIEZGODNE DLUGOSCI LIST +C INNE +C 631 - NIEZGODNE TYPY FUNKCJI AKTUALNEJ I FORMALNEJ +C 632 - PARAMETR AKTUALNY NIE JEST FUNKCJA ANI PROCEDURA +C 635 - PARAMETR AKTUALNY JEST FUNKCJA LUB PROCEDURA +C STANDARDOWA +C +C OPIS W DOKUMENTACJI: ?3.7.4 +C WERSJA Z DNIA: 19.01.82 +C DLUGOSC KODU: 807 +C............................................................................. +C + IMPLICIT INTEGER (A-Z) + LOGICAL DCONTR,BTEST +C *CALL BLANKSEM +C..... +#include "blank.h" +C +C !!!!!! END OF SUBSTITUTION OF COMDECK BLANKSEM FROM LOGLAN.14 !! +C *CALL STCON +C...... + LOGICAL UNICLL + COMMON /MCALLS/ CLLREC, UNICLL +C +C !!!!!! END OF SUBSTITUTION OF COMDECK STCON FROM LOGLAN.14 !! +C *CALL MPI2 +C......BLOK KOMUNIKACJI PROCEDUR MPARPF ORAZ MPIO2 + LOGICAL DCLASS, AFORM + COMMON /MPI2/ PFPF, PFPA, PF, APROT, AID, AOB, OLPMF, DCLASS, + X AFORM +C +C !!!!!! END OF SUBSTITUTION OF COMDECK MPI2 FROM LOGLAN.14 !! +C + APROT = PAPROT + AID = PAID + AOB = PAOB +C + DCONTR = .TRUE. +C +C SPRAWDZENIE, CZY BEDZIE KONTROLA STATYCZNA + IF (UNICLL) RETURN + IF ( IPMEM(CLLREC+7) .EQ. 0) RETURN + IF (APROT .EQ. NRUNIV) RETURN +C +C------ KONTROLA ZGODNOSCI RODZAJOW +C PF - OPIS PARAMETRU FORMALNEGO + PF = IPMEM(CLLREC+5) + PF = IPMEM(PF) + ZW = IPMEM(APROT) + ZW = IAND ( ISHFT(ZW, -8), 7) + 1 +C ZW - POLE S SLOWA ZEROWEGO PROTOTYPU AKTUALNEGO + GOTO (100, 100, 200, 100, 300, 100, 100, 100), ZW +C +C------ TO NIE JEST ANI FUNKCJA, ANI PROCEDURA + 100 CALL MERR(632, AID) + RETURN +C +C...... PARAMETR AKTUALNY JEST FUNKCJA + 200 PALGTH = -1 +C PALGTH - BEDZIE DLUGOSCIA LISTY PF DLA PROTOTYPU AKTUALNEGO + IF (IPMEM(CLLREC+7) .EQ. 4) GOTO 1000 + GOTO 900 +C +C...... PARAMETR AKTUALNY JEST PROCEDURA + 300 PALGTH = 0 + IF (IPMEM(CLLREC+7) .EQ. 5) GOTO 2000 +C +C------ NIEZGODNOSC RODZAJOW + 900 CALL MERR(626, AID) + GOTO 2000 +C +C +C***** PARAMETRY SA FUNKCJAMI + 1000 CONTINUE +C--- ZBADANIE, CZY PF NIE JEST FUNKCJA DRUGIEGO RZEDU JESLI TAK +C TO KONIECZNA JEST KONTROLA DYNAMICZNA + DCONTR = .TRUE. + IF (IPMEM(CLLREC+2) .EQ. 2) RETURN + DCONTR = .FALSE. +C--- ZBADANIE ZGODNOSCI TYPOW FUNKCJI FORMALNEJ I AKTUALNEJ + CALL MFUNEQ (APROT, AID, AOB, PF, DCONTR) + GOTO 3000 +C +C***** PARAMETRY SA PROCEDURAMI + 2000 DCONTR = .TRUE. + IF (IPMEM(CLLREC+2) .EQ. 2) RETURN + DCONTR = .FALSE. +C +C +C************************************************************************* +C WSPOLNA DLA FUNKCJI I PROCEDUR KONTROLA ZGODNOSCI LIST +C + 3000 CONTINUE + IF (APROT .GT. LPMSYS) GOTO 3010 +C --UZYTY MODUL STANDARDOWY + CALL MERR(635, AID) +C TWORZONY JEST MALY REKORD ZAMIANY TYPOW (W CZESCI PRZEZNACZONEJ +C NA PROTOTYPY UZYTKOWNIKA + 3010 OLPMF = LPMF + DCONTR = .FALSE. + AFORM = .FALSE. + IF (BTEST(IPMEM(APROT),11)) DCLASS = .TRUE. + IF (IAND(ISHFT(IPMEM(APROT),-4),15) .NE. 0) AFORM = .TRUE. + DCLASS = DCLASS .OR. AFORM +C...... INICJALIZACJA + PFEL = IPMEM(PF+3) +C ELEMENT LISTY PF FUN/PROC FORMALNEJ + PFLGTH = IPMEM(PF+4) + IF (IPMEM(CLLREC+7) .EQ. 4) PFLGTH = PFLGTH-1 + PAEL = IPMEM(APROT+3) +C ELEMENT LISTY PF FUN/PROC AKTUALNEJ + PALGTH = PALGTH + IPMEM(APROT+4) +C +C************* +C------ SPRAWDZENIE CZY SA JESZCZE PARAMETRY W OBYDWU LISTACH + IF ( (PALGTH .EQ. 0) .OR. (PFLGTH .EQ. 0) ) GOTO 6000 +C --- SKOK DO POROWNANIA DLUGOSCI LIST +C********************************* +C***** POBRANIE I PRZETWARZANIE KOLEJNYCH PARAMETROW +C + 4000 PFPF = IPMEM(PFEL) + PFPA = IPMEM(PAEL) +C -PFPF - PARAMETR FORMALNY FUN/PROC FORMALNEJ +C -PFPA - PARAMETR FORMALNY FUN/PROC AKTUALNEJ + KINDPF = IPMEM(PFPF) + KINDPF = IAND (ISHFT(KINDPF, -4), 15) + 1 + KINDPA = IPMEM(PFPA) + KINDPA = IAND(ISHFT(KINDPA, -4), 15) + 1 + GOTO (5000, 4100, 4200, 4200, 5000, 4300, 4300, 5000, + X 5000, 4300), KINDPF +C +C......PFPF JEST TYPEM FORMALNYM +C PFPA TEZ MUSI BYC TYPEM FORMALNYM (LUB PARAMETREM +C UNIWERSALNYM) +C WSTAWIENIE PARY DO MALEGO REKORDU + 4100 KINDPF = MGETM(2,0) + IPMEM(KINDPF) = PFPF + IPMEM(KINDPF+1) = PFPA + IF (KINDPA .EQ. 2) GOTO 5000 + IPMEM(KINDPF+1) = NRUNIV + IF (KINDPA .EQ. 1) GOTO 5000 +C SKOK DO SYGNALIZACJI BLEDU + GOTO 4900 +C +C......PFPF JEST FUNKCJA LUB PROCEDURA +C KONTROLA POLEGA JEDYNIE NA POROWNANIU RODZAJOW, GDYZ FUNKCJE I +C PROCEDURY FORMALNE 2 RZEDU NIE NIOSA ZADNEJ INFORMACJI + 4200 IF (KINDPA .EQ. KINDPF) GOTO 5000 + GOTO 4900 +C +C......PFPF JEST PARAMETREM INPUT/OUTPUT/INOUT +C WYWOLANIE PROCEDURY KONTROLUJACEJ ZGODNOSC TYPOW + 4300 IF (KINDPA .LE. 5 ) GOTO 4900 + CALL MPIO2 (DCONTR) + IF (KINDPF .EQ. KINDPA) GOTO 5000 +C +C......NIEZGODNE RODZAJE PFPF I PFPA + 4900 CALL MERR(627, AID) +C*****PRZESUNIECIE LIST PARAMETROW + 5000 PFEL = PFEL + 1 + PAEL = PAEL + 1 + PFLGTH = PFLGTH - 1 + PALGTH = PALGTH - 1 + IF ( (PFLGTH .NE. 0) .AND. (PALGTH .NE. 0) ) GOTO 4000 +C*************************************** +C +C****************** +C-------ZBADANIE ZGODNOSCI DLUGOSCI LIST PF +C ZNISZCZENIE MALEGO REKORDU + 6000 LPMF = OLPMF + IF (PFLGTH .EQ. PALGTH) GOTO 6300 + IF (PFLGTH .LT. PALGTH) GOTO 6100 +C LISTA AKTUALNA JEST KROTSZA, POWINNA BYC USZKODZONA BY NIE BYLO +C SYGNALIZACJI BLEDU +C ZW - POLE S PROTOTYPU APROT + IF ( (ZW .EQ. 4) .OR. (ZW .EQ. 6)) RETURN + GOTO 6200 +C TU: LISTA PF JEST KROTSZA, TA POWINNA BYC USZKODZONA BY NIE BYLO +C SYGNALIZACJI BLEDU + 6100 ZW = IPMEM(PF) + ZW = IAND(ISHFT(ZW, -8), 7) + 1 + IF ( (ZW .EQ. 4) .OR. (ZW .EQ. 6)) RETURN +C --- SYGNALIZACJA ROZNYCH DLUGOSCI LIST + 6200 CALL MERR (630, AID) + RETURN +C ---LISTY ROWNYCH DLUGOSCI, SYGNALIZACJA BLEDOW GDY (TYLKO) JEDNA Z NICH +C JEST USZKODZONA + 6300 IF ( (ZW .EQ. 4) .OR. (ZW .EQ. 6) ) GOTO 6100 +C ---LISTA PARAMETROW MODULU AKTUALNEGO NIE JEST USZKODZONA, FORMALNEGO +C ---TEZ NIE POWINNA BYC + ZW = IPMEM(PF) + ZW = IAND (ISHFT(ZW, -8), 7) + 1 + IF ( (ZW .EQ. 4) .OR. (ZW .EQ. 6) ) GOTO 6200 +C ---WSZYSTKO JEST W PORZADKU + RETURN + END +*DECK MFUNEQ + SUBROUTINE MFUNEQ (PA, AID, AOB, PF, DCONTR) +C--------------PROCEDURA POMOCNICZA BADAJACA ZGODNOSC TYPOW FUNKCJI +C AKTUALNEJ(PA) I FORMALNEJ (PF). +C POZOSTALE PARAMETRY JAK W MPARPF. +C W RAZIE POTRZEBY NADAJE WARTOSC ZMIENNEJ DCONTR. +C SYGNALIZOWANE BLEDY: +C 631 - NIEZGODNE TYPY FUNKCJI AKTUALNEJ I FORMALNEJ +C 633 - TYP FUNKCJI AKTUALNEJ JEST SLABIEJ OKRESLONY NIZ TYP +C FUNKCJI FORMALNEJ +C OPIS W DOKUMENTACJI: ?3.7.2 +C WERSJA Z DNIA: 19.01.82 +C DLUGOSC KODU: 663 +C............................................................................. +C + IMPLICIT INTEGER (A-Z) + LOGICAL DCONTR +C +C *CALL BLANKSEM +C..... +#include "blank.h" +C +C !!!!!! END OF SUBSTITUTION OF COMDECK BLANKSEM FROM LOGLAN.14 !! +C *CALL STCON +C...... + LOGICAL UNICLL + COMMON /MCALLS/ CLLREC, UNICLL +C +C !!!!!! END OF SUBSTITUTION OF COMDECK STCON FROM LOGLAN.14 !! +C *CALL MTPC +C......BLOK KOMUNIKACJI Z PROCEDURA MTPCON + COMMON /MTPC/ PRFXR, PRFXL +C +C !!!!!! END OF SUBSTITUTION OF COMDECK MTPC FROM LOGLAN.14 !! +C +C.....POBRANIE TYPU FUNKCJI AKTUALNEJ + TRDIM = IPMEM(PA-4) + TRBAS = IPMEM(PA-3) +C.....POBRANIE TYPU FUNKCJI FORMALNEJ + TLDIM = IPMEM(PF-4) + TLBAS = IPMEM(PF-3) +C.....MODYFIKACJA TYPU FUNKCJI FORMALNEJ W OPARCIU O REKORD KONTROLI + OBJL = IPMEM(CLLREC+3) + CALL MREPTP (TLDIM, TLBAS, OBJL) +C.....POBRANIE SLOW ZEROWYCH TYPOW BAZOWYCH - POLA T + AZW = IAND (IPMEM(TRBAS), 15) + FZW = IAND (IPMEM(TLBAS), 15) +C***************************** + IF ( (TLDIM .GT. 0) .OR. (TRDIM .GT. 0) ) GOTO 2000 +C******************* +C TYPY NIETABLICOWE +C +C.....ROZPOZNANIE PRZYPADKU TYPOW PIERWOTNYCH + IF (AZW .GE. 8) GOTO 100 + IF (FZW .GE. 8) GOTO 200 + GOTO 1000 +C --SKOK, GDY ZADEN TYP NIE JEST PIERWOTNY +C*****TYPY PIERWOTNE +C.....TRBAS (FUNKCJA AKTUALNA) JEST PIERWOTNY + 100 IF (TLBAS .EQ. NRUNIV) RETURN + IF (TLBAS .EQ. TRBAS) RETURN + GOTO 9100 +C --SKOK GDY TYPY SA NIEZGODNE +C.....TLBAS (FUNKCJA FORMALNA) JEST PIERWOTNY + 200 IF (TRBAS .EQ. NRUNIV) RETURN +C GOTO 9100 +C +C*****TYPY ZLOZONE NIETABLICOWE + 1000 IF ( (TLBAS .EQ. NRUNIV) .OR. (TRBAS .EQ. NRUNIV) ) RETURN +C.....OBYDWA TYPY SA KLASOWE, SYSTEMOWE LUB FORMALNE + IF (FZW .EQ. 6) GOTO 1100 + IF (AZW .EQ. 6) GOTO 9200 +C --TEN SKOK GDY TYP FUNKCJI AKTUALNEJ JEST SLABIEJ OKRESLONY - +C SYGNALIZACJA BLEDU +C.....OBYDWA TYPY SA KLASOWE LUB SYSTEMOWE +C TYP FUNKCJI FORMALNEJ MUSI PREFIKSOWAC TYP FUNKCJI AKTUALNEJ + IF (MPRFSQ (TLBAS, TRBAS) .NE. 0) GOTO 9000 +C --SKOK GDY TAK NIE JEST +C ...DODATKOWA KONTROLA DYNAMICZNA JEST POTRZEBNA, GDY WYWOLYWANY MODUL +C JEST WIRTUALNY + IF (IPMEM(CLLREC+2) .NE. 2) DCONTR = .TRUE. + RETURN +C +C.....TYP TLBAS FUNKCJI FORMALNEJ JEST FORMALNY + 1100 IF (AZW .EQ. 6) GOTO 1200 +C ...TU TYP TLBAS JEST FORMALNY, TRBAS NIE - ZAWSZE POTRZEBNA KONTROLA +C DYNAMICZNA + DCONTR = .TRUE. + RETURN +C.....OBYDWA TYPY SA FORMALNE +C - GDY WYWOLYWANY PROTOTYP JEST WIRTUALNY POTRZBNA KONTROLA DYNAMICZNA +C - W PRZECIWNYM PRZYPADKU ORAZ GDY TYPY ZAWSZE POCHODZA Z TEGO SAMEGO +C NIE MA KONTROLI DYNAMICZNEJ + 1200 IF (IPMEM(CLLREC+2) .NE. 0) GOTO 1250 + PRFXR = AOB + PRFXL = OBJL + IF (MTPCON(Z) .EQ. 1) RETURN +C ...POTRZEBNA KONTROLA DYNAMICZNA + 1250 DCONTR = .TRUE. + RETURN +C +C +C******************** +C TYPY ZLOZONE TABLICOWE (CO NAJMNIEJ JEDEN) + 2000 IF (TLDIM-TRDIM) 2100, 2200, 2300 +C +C.....TLDIMTRDIM +C POPRAWNE JEDYNIE, GDY OBA TYPY SA FORMALNE LUB UNIWERSALNE + 2300 IF (TRBAS .EQ. NRUNIV) RETURN + IF (AZW .NE. 6) GOTO 9100 + IF (TLBAS .EQ. NRUNIV) RETURN + IF (FZW .NE. 6) GOTO 9200 +C ...OBYDWA SA FORMALNE + DCONTR = .TRUE. + PRFXR = AOB + PRFXL = OBJL + IF (MTPCON(Z) .NE. 1) RETURN + IF (IPMEM(CLLREC+2) .NE. 0) RETURN + GOTO 9100 +C +C*********************************** +C SYGNALIZACJE BLEDOW +C BADANIE OKRESLONOSCI TYPOW + 9000 IF ( (AZW .EQ. 6) .AND. (FZW .NE. 6)) GOTO 9200 + IF ( (TLBAS .NE. NRCOR) .AND. + X ( (TRBAS .EQ. NRCOR) .OR. (TRBAS .EQ. NRPROC) ) ) + X GOTO 9200 +C +C.....TYPY NIEZGODNE + 9100 CALL MERR(631, AID) + RETURN +C.....TYP FUNKCJI AKTUALNEJ JEST SLABIEJ OKRESLONY + 9200 CALL MERR(633, AID) + RETURN + END +*DECK MPIO2 + SUBROUTINE MPIO2 (DCONTR) +C--------------PROCEDURA POMOCNICZA KONTROLUJACA ZGODNOSC TYPOW +C PARAMETROW FORMALNYCH 'INPUT'/'OUTPUT' DRUGIEGO +C RZEDU - TO ZNACZY WYSTEPUJACYCH W LISTACH ODPO- +C WIADAJACEJ MODULOWI FORMALNEMU (PF) ORAZ ODPO- +C WIADAJACEJ MODULOWI AKTUALNEMU (APROT) +C PFPF, PFPA - OPISY UZGADNIANYCH PARAMETROW +C /EWENTUALNA NIEZGODNOSC RODZAJOW PARAMETROW SYGNA- +C LIZOWANA JEST PRZEZ PROCEDURE MPARPF +C SYGNALIZOWANE BLEDY: +C 628 - NIEUZGODNIONE NAGLOWKI - TYPY PARAMETROW SA +C NIEZGODNYCH RODZAJOW +C 629 - NIEUZGODNIONE NAGLOWKI - TYPY PARAMETROW MAJA +C ROZLACZNE SEKWENCJE PREFIKSOWE +C 634 - NIEUZGODNIONE NAGLOWKI - TYP PARAMETRU W LISCIE +C AKTUALNEJ JEST SLABIEJ OKRESLONY +C +C OPIS W DOKUMENTACJI: ?3.7.3.5 +C WERSJA Z DNIA: 19.01.82 +C DLUGOSC KODU: 974 +C............................................................................. +C + IMPLICIT INTEGER (A-Z) + LOGICAL DCONTR,BTEST +C +C *CALL BLANKSEM +C..... +#include "blank.h" +C +C !!!!!! END OF SUBSTITUTION OF COMDECK BLANKSEM FROM LOGLAN.14 !! +C *CALL STCON +C...... + LOGICAL UNICLL + COMMON /MCALLS/ CLLREC, UNICLL +C +C !!!!!! END OF SUBSTITUTION OF COMDECK STCON FROM LOGLAN.14 !! +C *CALL MTPC +C......BLOK KOMUNIKACJI Z PROCEDURA MTPCON + COMMON /MTPC/ PRFXR, PRFXL +C +C !!!!!! END OF SUBSTITUTION OF COMDECK MTPC FROM LOGLAN.14 !! +C *CALL MPI2 +C......BLOK KOMUNIKACJI PROCEDUR MPARPF ORAZ MPIO2 + LOGICAL DCLASS, AFORM + COMMON /MPI2/ PFPF, PFPA, PF, APROT, AID, AOB, OLPMF, DCLASS, + X AFORM +C +C !!!!!! END OF SUBSTITUTION OF COMDECK MPI2 FROM LOGLAN.14 !! +C +C.....POBRANIE TYPOW PARAMETROW PFPF I PFPA + TRDIM = IPMEM(PFPA-4) + TRBAS = IPMEM(PFPA-3) + AZW = IAND (IPMEM(TRBAS), 15) + TLDIM = IPMEM(PFPF-4) + TLBAS = IPMEM(PFPF-3) + OBJL = IPMEM(CLLREC+3) +C.....ODDZIELENIE PRZYPADKU, GDY KTORYS Z TYPOW SAM JEST PARAMETREM PF +C LUB APROT + IF (IPMEM(TLBAS-1) .EQ. PF) GOTO 1000 +C --SKOK GDY TYP W MODULE FORMALNYM JEST WLASNYM PARAMETREM TEGO MODULU + IF (AZW .NE. 6) GOTO 2000 +C --SKOK GDY TYP W MODULE AKTUALNYM NIE JEST FORMALNY + IF (IPMEM(TRBAS-1) .EQ. APROT) GOTO 1000 + IF (AFORM) GOTO 2000 + IF (MPRFSQ(IPMEM(TRBAS-1), APROT) .EQ. 1) GOTO 1000 +C --SKOK GDY TYP W MODULE AKTUALNYM JEST WLASNYM PARAMETREM MODULU + GOTO 2000 +C +C***************************** +C W CO NAJMNIEJ JEDNYM MODULE TYP JEST WLASNY W DRUGIM TEZ POWINIEN +C BYC WLASNYM PARAMETREM I OBA POWINNY SOBIE ODPOWIADAC + 1000 IF (TLBAS .NE. NRUNIV) GOTO 1100 + IF (TLDIM .LE. TRDIM) RETURN + GOTO 9100 + 1100 IF (TRBAS .NE. NRUNIV) GOTO 1200 + IF (TLDIM .GE. TRDIM) RETURN + GOTO 9100 +C.....ZADEN TYP NIE JEST UNIWERSALNY, OBYDWA POWINNY BYC WLASNE I SOBIE +C ODPOWIADAJACE + 1200 IF (AZW .NE. 6) GOTO 9100 + IF (IPMEM(TRBAS-1) .EQ. APROT) GOTO 1300 + IF (AFORM) GOTO 9100 + IF (MPRFSQ(IPMEM(TRBAS-1), APROT) .NE. 1) GOTO 9100 + IF (IPMEM(TLBAS-1) .NE. PF) GOTO 9100 + IF (TLDIM .NE. TRDIM) GOTO 9100 +C.....OBYDWA TYPY SA WLASNE I MAJA ROWNE WYMIARY, +C SPRAWDZENIE ODPOWIEDNIOSCI + AZW = LPMF+1 + 1300 IF (IPMEM(AZW) .EQ. TLBAS) GOTO 1400 + AZW = AZW+2 + GOTO 1300 + 1400 TLBAS = IPMEM(AZW+1) + IF (TLBAS .EQ. TRBAS) RETURN + GOTO 9100 +C +C**************************************************** +C*******TYPY NIE SA WLASNYMI PARAMETRAMI MODULOW +C.....EWENTUALNA MODYFIKACJA TLBAS W OPARCIU O DUZY REKORD KONTROLI + 2000 CALL MREPTP (TLDIM, TLBAS, OBJL) + FZW = IAND(IPMEM(TLBAS), 15) + IF ( (TLDIM .NE. 0) .OR. (TRDIM .NE. 0) ) GOTO 3000 +C +C********************* +C TYPY NIETABLICOWE + IF ( (TRBAS .EQ. NRUNIV) .OR. (TLBAS .EQ. NRUNIV) ) RETURN +C.....ODDZIELENIE TYPOW PRYMITYWNYCH + IF (FZW .GE. 8) GOTO 2200 + IF (AZW .GE. 8) GOTO 2200 +C.....ZADEN TYP NIE JEST PRYMITYWNY +C.....ODDZILENIE TYPOW FORMALNYCH + IF (FZW .EQ. 6) GOTO 2300 + IF (AZW .EQ. 6) GOTO 9300 +C --TEN SKOK GDY TYP W MODULE FORMALNYM JEST STATYCZNIE OKRESLONY, +C NATOMIAST W MODULE AKTUALNYM JEST FORMALNY +C **OBYDWA TYPY SA STATYCZNIE OKRESLONE - KLASOWE LUB SYSTEMOWE + IF (TLBAS .EQ. TRBAS) GOTO 2100 + IF (MPRFSQ (TLBAS, TRBAS) .EQ. -1) GOTO 9200 +C --TYPY MAJA ROZLACZNE SEKWENCJE PREFIKSOWE - SKOK DO +C SYGNALIZACJI BLEDU + IF (DCLASS) DCONTR = .TRUE. + IF (IPMEM(CLLREC+2) .NE. 0) DCONTR = .TRUE. + RETURN +C DODATKOWA KONTROLA JEST POTRZEBNA GDY MODUL AKTUALNY NIE JEST +C RZECZYWISTY + 2100 IF ((IPMEM(CLLREC+2) .NE. 0) .AND. DCLASS) DCONTR = .TRUE. +C TYPY BYLY ROWNE - DODATKOWA KONTROLA DYNAMICZNA JEST +C POTRZEBNA GDY JEDNOCZESNIE MODUL WYWOLYWANY BYL WIRTUALNY +C ORAZ MODUL AKTUALNY NIE BYL RZECZYWISTY + RETURN +C +C **CO NAJMNIEJ JEDEN TYP JEST PRYMITYWNY, DRUGI POWINIEN BYC MU ROWNY + 2200 IF(TLBAS .EQ. TRBAS) RETURN + GOTO 9100 +C +C **CO NAJMNIEJ TYP TLBAS JEST FORMALNY +C TRBAS MOZE BYC WOWCZAS KLASOWY, SYSTEMOWY LUB FORMALNY + 2300 IF (AZW .EQ. 6) GOTO 2400 +C ...TYLKO TLBAS JEST FORMALNY - POTRZEBNA KONTROLA DYNAMICZNA + 2350 DCONTR = .TRUE. + RETURN +C ...OBYDWA TYPY SA FORMALNE +C KONTROLA DYNAMICZNA JEST ZAWSZE KONIECZNA, GDY WYWOLYWANY MODUL JEST +C WIRTUALEM + 2400 IF (IPMEM(CLLREC+2) .NE. 0) GOTO 2350 +C ...KONTROLI DYNAMICZNEJ NIE MA, GDY TYP JEST TEN SAM I ZAWSZE +C POCHODZI Z TEGO SAMEGO OBIEKTU + PRFXR = AOB + PRFXL = OBJL + IF (MTPCON(Z) .EQ. 1) RETURN + DCONTR = .TRUE. + RETURN +C +C +C**************************************** +C TYPY TABLICOWE + 3000 IF (TLDIM - TRDIM) 3100, 3200, 3300 +C +C.....TLDIMTRDIMCPOPRAWNE JEDYNIE, GDY OBYDWA TYPY SA FORMALNE LUB +C UNIWERSALNE + 3300 IF (TRBAS .EQ. NRUNIV) RETURN + IF (AZW .NE. 6) GOTO 9100 + IF (TLBAS .EQ. NRUNIV) RETURN + IF (FZW .NE. 6) GOTO 9300 +C ...OBYDWA TYPY SA FORMALNE + DCONTR = .TRUE. + PRFXR = AOB + PRFXL = OBJL + IF (MTPCON(Z) .NE. 1) RETURN + IF (IPMEM(CLLREC+2) .NE. 0) RETURN + IF (BTEST(IPMEM(APROT), 11)) RETURN + GOTO 9100 +C +C*************************************** +C SYGNALIZACJE BLEDOW + 9100 CALL MERR(628, AID) + RETURN +C BADANIE OKRESLONOSCI TYPOW + 9200 IF ( (TLBAS .NE. NRCOR) .AND. + X ( (TRBAS .EQ. NRCOR) .OR. (TRBAS .EQ. NRPROC))) GOTO 9300 + CALL MERR (629, AID) + RETURN + 9300 CALL MERR(634, AID) + RETURN + END +*DECK MPARIO + INTEGER FUNCTION MPARIO (ATDIM, ATBASE, ID, AOB) +C-------------BADA ZGODNOSC TYPU PARAMETRU AKTUALNEGO (ATDIM, ATBASE) +C Z TYPEM PARAMETRU FORMALNEGO (INPUT/OUTPUT). +C ID - IDENTYFIKATOR UZYWANY W SYGNALIZACJI BLEDOW (NP. NAZWA +C ZMIENNEJ, FUNKCJI) +C AOB - OBIEKT W CIAGU SL, Z KTOREGO BRANY JEST PARAMETR +C AKTUALNY, LUB 0 - GDY NIE JEST DOSTEPNY PRZEZ +C DISPLAY +C / WARTOSC FUNKCJI INFORMUJE O KONWERSJI LUB KONTROLI +C DYNAMICZNEJ - TAK JAK W MSUBST. +C ODPOWIEDNIOSC JEST NASTEPUJACA: +C - PARAMETR INPUT +C LEWA STRONA - PARAMETR FORMALNY +C PRAWA STRONA - PARAMETR AKTUALNY +C - PARAMETR OUTPUT +C LEWA STRONA - PARAMETR AKTUALNY +C PRAWA STRONA - PARAMETR FORMALNY +C DODATKOWE UWAGI KONTEKSTOWE: +C - W PRZYPADKU FUNKCJI I PROCEDUR WIRTUALNYCH - TYPY FOR- +C MALNE SA ZAWSZE ZGODNE (ROZNICA W DZIALANIU MSUBST), +C WYMAGANA JEST JEDNAK ZAWSZE KONTROLA DYNAMICZNA +C - GDY FUN/PROC JEST WIRTULNA LUB FORMALNA - TYPY KLASOWE SA +C ZGODNE JESLI SA WE WSPOLNEJ SEKWENCJI PREFIKSOWEJ- KONTRO- +C LA DYNAMICZNA ROWNIEZ ZAWSZE POTRZEBNA +C +C SYGNALIZOWANE BLEDY +C Z PROCEDURY MSUBST +C 609 - NIEZGODNE TYPY +C 610 - ROZLACZNE SEKWENCJE PREFIKSOWE +C +C OPIS W DOKUMENTACJI: ?3.6.2 +C WERSJA Z DNIA: 19.01.82 +C DLUGOSC KODU: 519 +C............................................................................. +C + IMPLICIT INTEGER (A-Z) + LOGICAL FNFORM +C FNFORM MA WARTOSC .TRUE. GDY PARAMETR FORMALNY NIE JEST +C TYPU FORMALNEGO +C *CALL BLANKSEM +C..... +#include "blank.h" +C +C !!!!!! END OF SUBSTITUTION OF COMDECK BLANKSEM FROM LOGLAN.14 !! +C *CALL STCON +C...... + LOGICAL UNICLL + COMMON /MCALLS/ CLLREC, UNICLL +C +C !!!!!! END OF SUBSTITUTION OF COMDECK STCON FROM LOGLAN.14 !! +C +C + FNFORM = .TRUE. + MPARIO = 0 +C...... KONTROLA WYWOLANIA UNIWERSALNEGO + IF (UNICLL) RETURN + IF (IPMEM(CLLREC+7) .EQ. 0) RETURN +C +C------POBRANIE TYPU PARAMETRU FORMALNEGO + PF = IPMEM(CLLREC+5) + PF = IPMEM(PF) +C ... PF OPIS PARAMETRU FORMALNEGO + FDIM = IPMEM(PF-4) + FBAS = IPMEM(PF-3) +C ...FDIM, FBAS - NIEZMODYFIKOWANY TYP PARAMETRU FORM. +C + FOB = IPMEM(CLLREC+3) +C PARAMETR FORMALNY "POCHODZI" Z TEGO SAMEGO OBIEKTU, CO OBIEKT +C WYWOLYWANY +C +C------BADANIE RODZAJU OBIEKTU WYWOLYWANEGO +C + IF (IPMEM(CLLREC+2) .NE. 0) GOTO 1000 +C +C------ WYWOLYWANY ZWYKLY OBIEKT +C...... MODYFIKACJA TYPU PARAMETRU FORMALNEGO + IF ( IAND( IPMEM(FBAS), 15) .EQ. 6) FNFORM = .FALSE. + CALL MREPTP(FDIM, FBAS, FOB) +C......BADANIE RODZAJU PARAMETRU FORMALNEGO + IF (IPMEM(CLLREC+7) .EQ. 6) GOTO 95 + IF (IPMEM(CLLREC+7) .EQ. 2) GOTO 100 +C --- KONTROLA PARAMETRU INPUT + TLDIM = FDIM + TLBAS = FBAS + OBJL = FOB + IDL = ID + TRDIM = ATDIM + TRBAS = ATBASE + IDR = ID + OBJR = AOB +C + MPARIO = MSUBST (Z) +C Z - SLEPY PARAMETR + IF (FNFORM) RETURN +C....ZMIANA INFORMACJI O KONTROLI DYNAMICZNEJ GDY PARAMETR +C FORMALNY JEST TYPU FORMALNEGO + 90 IF ( (MPARIO .EQ. 3) .OR. (MPARIO .EQ. 5) ) MPARIO = + X MPARIO + 1 + RETURN +C ---KONTROLA 'INOUT' - JAK OUTPUT PRZY PIERWSZYM WYWOLANIU, INPUT PRZY +C DRUGIM + 95 IPMEM(CLLREC+7) = -6 +C --- KONTROLA PARAMETRU OUTPUT + 100 TLDIM = ATDIM + TLBAS = ATBASE + IDL = ID + OBJL = AOB + TRBAS = FBAS + TRDIM = FDIM + IDR = ID + OBJR = FOB +C + MPARIO = MSUBST(Z) + IF (FNFORM) RETURN + 110 IF ( (MPARIO .EQ. 3) .OR. (MPARIO .EQ. 4) ) MPARIO = + X MPARIO + 2 + RETURN +C +C------ OBIEKTY FORMALNE I WIRTUALNE +C ---UWAGA: OBIEKTY WIRTUALNE NIGDY NIE SA DOSTEPNE PRZEZ DISPLAY + 1000 IF (IPMEM(CLLREC+2) .EQ. 1) FOB = 0 +C...... MODYFIKACJA TYPU PARAMETRU FORMALNEGO + IF ( IAND( IPMEM(FBAS), 15) .EQ. 6) FNFORM = .FALSE. + CALL MREPTP(FDIM, FBAS, FOB) +C...... BADANIE RODZAJU PARAMETRU FORMALNEGO + IF (IPMEM(CLLREC+7) .EQ. 2) GOTO 1100 +C --- KONTROLA PARAMETRU INPUT + TLDIM = FDIM + TLBAS = FBAS + IDL = ID + OBJL = FOB + TRDIM = ATDIM + TRBAS = ATBASE + IDR = ID + OBJR = AOB +C + MPARIO = MSUBST (Z) + IF (FNFORM) GOTO 1200 + GOTO 90 +C --- KONTROLA PARAMETRU OUTPUT + 1100 TLDIM = ATDIM + TLBAS = ATBASE + IDL = ID + OBJL = AOB + TRDIM = FDIM + TRBAS = FBAS + IDR = ID + OBJR = FOB +C + MPARIO = MSUBST (Z) +C...... SPRAWDZENIE, CZY NIE SA TO TYPY KLASOWE- DLA NICH ZAWSZE +C KONTROLA DYNAMICZNA + IF ( .NOT. FNFORM) GOTO 110 + 1200 IF(MPARIO .NE. 0) RETURN +C ... PF - OPIS PARAMETRU FORMALNEGO + IF (IPMEM(PF-4).NE.0) RETURN + PF = IPMEM(PF-3) +C ..PF - OPIS TYPU PARAMETRU + PF = IAND (IPMEM(PF), 15) + IF (PF .GE. 8) RETURN + MPARIO = 3 + RETURN + END +*DECK MSUBST + INTEGER FUNCTION MSUBST (X) +C X - SLEPY PARAMETR +C +C-------------PROCEDURA BADA POPRAWNOSC INSTRUKCJI PODSTAWIENIA. +C JEST ROWNIEZ WYWOLYWANA W PROCEDURZE KONTROLI +C TYPOW PARAMETROW FORMALNYCH I AKTUALNYCH. +C ZNACZENIE : +C - TLDIM, TLBAS - TYP LEWEJ STRONY INSTRUKCJI PODSTAWIENIA, +C OBJL - PROTOTYP, Z KTOREGO POCHODZI, LUB 0 - NIEDOSTEPNA +C PRZEZ DISPLAY +C IDL - IDENTYFIKATOR LEWEJ STRONY (DO SYGNALIZACJI +C BLEDOW), +C - ANALOGICZNIE DLA PRAWEJ STRONY - TRDIM, TRBAS, +C OBJR . +C // WARTOSC FUNKCJI OKRESLA RODZAJ KONWERSJI LUB KONTROLI +C DYNAMICZNEJ : +C 0 - OBIE STRONY SA TEGO SAMEGO TYPU, +C 1 - INTEGER := REAL +C 2 - REAL := INTEGER +C DYNAMICZNA KONTROLA TYPOW +C 3 - OBA TYPY OKRESLONE (STATYCZNIE) +C 4 - TYP LEWEJ STRONY FORMALNY, PRAWEJ OKRESLONY +C 5 - TYP LEWEJ STRONY OKRESLONY, PRAWEJ FORMALNY +C 6 - TYPY OBYDWU STRON FORMALNE +C ----SYGNALIZOWANE BLEDY +C 609 - NIEZGODNE TYPY W PODSTAWIENIU +C 610 - TYPY W PODSTAWIENIU MAJA ROZLACZNE SEKWENCJE PREFI- +C KSOWE +C 636 - NIEDOZWOLONE UZYCIE SEMAFORA +C +C OPIS W DOKUMENTACJI: ?2.7 +C WERSJA Z DNIA: 19.01.82 +C DLUGOSC KODU: 617 +C............................................................................. +C + IMPLICIT INTEGER (A-Z) +C +C *CALL BLANKSEM +C..... +#include "blank.h" +C +C !!!!!! END OF SUBSTITUTION OF COMDECK BLANKSEM FROM LOGLAN.14 !! +C *CALL MTPC +C......BLOK KOMUNIKACJI Z PROCEDURA MTPCON + COMMON /MTPC/ PRFXR, PRFXL +C +C !!!!!! END OF SUBSTITUTION OF COMDECK MTPC FROM LOGLAN.14 !! +C +C INICJOWANA WARTOSC MSUBST - 3 ODPOWIADAJACA KONTROLI DYNAMICZNEJ + MSUBST = 3 + IF ( (TLDIM .EQ. 0) .AND. (TLBAS .EQ. NRUNIV) ) RETURN + IF ( (TRDIM .EQ. 0) .AND. (TRBAS .EQ. NRUNIV) ) RETURN +C POWROTY - GDY JEDEN Z TYPOW JEST UNIWERSALNY +C + TPL = IAND (IPMEM(TLBAS), 15) + TPR = IAND(IPMEM(TRBAS), 15) +C TPL I TPR - POLA T Z OPISU TYPOW TLBAS I TRBAS + IF ( (TLDIM .NE. 0) .OR. (TRDIM .NE. 0) ) GOTO 1000 +C SKOK DO BADANIA PODSTAWIEN DLA TYPOW TABLICOWYCH +C------ TYPY NIETABLICOWE - ZADEN Z NICH NIE JEST JUZ UNIWERSALNY +C + GOTO (9000, 100, 100, 9500, 100, 200, 100, 300, 9100, 400, 500, + X 400, 9000, 9000), TPL +C +C...... TPL JEST TYPEM KLASOWYM LUB SYSTEMOWYM + 100 GOTO (9000, 110, 110, 9500, 110, 150, 110, 9000, 9100, 9000, + X 9000, 9000, 9000, 130), TPR +C ... TPR JEST ROWNIEZ TYPEM KLASOWYM LUB SYSTEMOWYM +C SPRAWDZENIE PREFIKSOWANIA + 110 IF ( MPRFSQ(TLBAS, TRBAS) ) 120, 130, 140 +C SEKWENCJE PREFIKSOWE ROZLACZNE - PODSTAWIENIE MOZE BYC POPRAW- +C NE JEDYNIE GDY JEDEN Z TYPOW JEST SYSTEMOWY + 120 IF ( (TRBAS .EQ. NRCOR) .OR. (TLBAS .EQ. NRCOR) ) RETURN + IF ( (TRBAS .EQ. NRPROC) .OR. (TLBAS .EQ. NRPROC) ) RETURN + CALL MERR(610, IDL) + RETURN +C +C TPL JEST PREFIKSEM TPR - KONTROLA DYNAMICZNA NIE JEST +C POTRZEBNA, TPR MOZE BYC ROWNIEZ NONE + 130 MSUBST = 0 + RETURN +C +C TPR JEST PREFIKSEM TPL - KONTROLA DYNAMICZNA JEST POTRZEBNA +C KONTEKSTOWO SYTUACJA JEST POPRAWNA + 140 RETURN +C ... TPR JEST FORMALNY + 150 MSUBST = 5 + RETURN +C +C +C...... TPL JEST TYPEM FORMALNYM - TPR MUSI BYC TYPEM FORMALNYM, KLASO- +C WYM, SYSTEMOWYM LUB NONE + 200 MSUBST = 4 + GOTO (9000, 210, 210, 9500, 210, 220, 210, 9000, 9100, 9000, + X 9000, 9000, 9000, 210) , TPR +C ...TPR - KLASOWY, SYSTEMOWY LUB NONE + 210 RETURN +C ... TPR - FORMALNY + 220 MSUBST = 6 + PRFXR = OBJR + PRFXL = OBJL + IF ( MTPCON(Z) .EQ. 1) MSUBST = 0 + RETURN +C +C +C...... TPL JEST ARYTMETYCZNY, TPR TEZ MUSI BYC ARYTMETYCZNY + 300 IF ( (TRBAS .NE. NRINT) .AND. (TRBAS .NE. NRRE) ) GOTO 9000 + MSUBST = 0 + IF (TLBAS .EQ. TRBAS) RETURN +C TU - TYPY ROZNE - POTRZEBNA KONWERSJA + MSUBST = 2 + IF (TLBAS .EQ. NRINT) MSUBST = 1 + RETURN +C +C...... TPL - INNY PRYMITYWNY, TPR MUSI BYC MU ROWNE + 400 MSUBST = 0 + IF (TLBAS .EQ. TRBAS) RETURN + GOTO 9000 +C.......TPL - FILE, TPR MUSI BYC FILE LUB NONE + 500 MSUBST = 0 + IF ((TLBAS .EQ. TRBAS) .OR. (TRBAS .EQ. NRNONE)) RETURN + GOTO 9000 +C +C +C------ CO NAJMNIEJ JEDEN TYP JEST TABLICOWY +C + 1000 IF (TLDIM - TRDIM) 2000, 3000, 4000 +C...... PRZYPADEK TLDIM < TRDIM +C WOWCZAS PODSTAWIENIE JEST POPRAWNE JEDYNIE, GDY TLBAS JEST FOR- +C MALNY LUB UNIWERSALNY. W PRZYPADKU, GDY OBA TYPY SA TYM SAMYM +C TYPEM FORMALNYM - MUSZA POCHODZIC Z ROZNYCH OBIEKTOW. + 2000 IF (TPL .EQ. 4) RETURN +C POWROT DLA TYPU UNIWERSALNEGO + IF (TPL .NE. 6) GOTO 9000 +C SKOK DO SYGNALIZACJI BLEDU DLA TYPU NIEFORMALNEGO + MSUBST = 4 + IF (TPR .EQ. 6) MSUBST = 6 + GOTO 8000 +C +C......PRZYPADEK TLDIM = TRDIM +C POPRAWNE, GDY +C - OBA TYPY BAZOWE SA ROWNE +C - CO NAJMNIEJ JEDEN JEST FORMALNY LUB UNIWERSALNY + 3000 IF ( (TPL .EQ. 4) .OR. (TPR .EQ. 4) ) RETURN +C POWROT - GDY JEDEN Z TYPOW JEST UNIWERSALNY +C + IF ( (TPL .EQ. 6) .AND. (TPR .EQ. 6) ) GOTO 3300 + IF (TPL .EQ. 6) GOTO 3100 + IF (TPR .EQ. 6) GOTO 3200 +C SKOKI ROZDZIELAJACE PRZYPADKI TYPOW FORMALNYCH +C ... PRZYPADEK, GDY TYPY NIE SA FORMALNE + MSUBST = 0 + IF (TLBAS .EQ. TRBAS) RETURN +C TU - NIEROWNE TYPY NIEFORMALNE - SKOK DO SYGNALIZACJI BLEDOW + GOTO 9000 +C +C ... TLBAS JEST FORMALNY, TRBAS NIE + 3100 MSUBST = 4 + RETURN +C ... TRBAS JEST FORMALNY, TLBAS NIE + 3200 MSUBST = 5 + RETURN +C ... TLBAS I TRBAS SA FORMALNE, SPRAWDZENIE,CZY SA ROWNE I LOKALNE +C (WTEDY NIE MA KONTROLI DYNAMICZNEJ) + 3300 MSUBST = 6 + PRFXR = OBJR + PRFXL = OBJL + IF ( MTPCON(Z) .EQ. 1) MSUBST = 0 + RETURN +C +C...... PRZYPADEK TLDIM > TRDIM +C POPRAWNE,GDY: +C - TYP NONE Z PRAWEJ STRONY +C - TRBAS JEST FORMALNY LUB UNIWERSALNY, W PRZYPADKU GDY OBA +C TYPY SA TYM SAMYM TYPEM FORMALNYM CO NAJMNIEJ JEDEN Z NICH +C MUSI BYC NIELOKALNY + 4000 MSUBST = 0 + IF (TPR .EQ. 4) RETURN +C POWROT DLA TYPU UNIWERSALNEGO Z PRAWEJ STRONY + IF ( (TPR .EQ. 14) .AND. (TRDIM .EQ. 0) ) RETURN +C POWROT DLA STALEJ NONE + IF (TPR .NE. 6) GOTO 9000 +C SKOK DO SYGNALIZACJI BLEDU DLA TYPU NIEFORMALNEGO + MSUBST = 5 + IF (TPL .EQ. 6) MSUBST = 6 +C GOTO 8000 - PRZEJSCIE DO BADANIA TYPOW TABLICOWYCH +C +C +C------ BADANIE ZGODNOSCI FORMALNYCH TYPOW TABLICOWYCH +C + 8000 PRFXR = OBJR + PRFXL = OBJL + IF ( MTPCON(Z) .EQ. 1) GOTO 9000 + RETURN +C +C +C +C------SYGNALZACJA BLEDOW + 9000 IF (TPR .EQ. 9) GOTO 9100 + CALL MERR(609, IDL) + 9500 RETURN + 9100 IF (TPL .EQ. 9) CALL MERR(636, IDL) + IF (TPR .EQ. 9) CALL MERR(636, IDR) + RETURN + END +*DECK MEQUAL + SUBROUTINE MEQUAL (CASE) +C-------------PROCEDURA BADA ZGODNOSC ARGUMENTOW RELACJI = I =/= . +C TYPY PRAWEGO I LEWEGO ARGUMENTU PRZEKAZANE SA PRZEZ +C BLOK /SEMANT/ , SA TO : +C TLDIM, TLBAS - DLA LEWEGO ARGUMENTU +C TRDIM, TRBAS - DLA PRAWEGO ARGUMENTU. +C ZMIENNE OBJL, OBJR - NUMERY PROTOTYPOW OBIEKTOW, KTORYCH +C ATRYBUTAMI SA ODPOWIEDNIO LEWY I PRAWY ARGUMENT OPERACJI. +C SA ONE ROWNE ZERU, GDY ARGUMENTY NIE SA DOSTEPNE PRZEZ +C DISPLAY. +C ZMIENNE IDL ORAZ IDR SLUZA DO IDENTYFIKACJI BLEDOW - SA +C TO IDENTYFIKATORY LEWEGO I PRAWEGO ARGUMENTU. +C // WARTOSCI PARAMETRU CASE PRZY WYJSCIU OKRESLAJA : +C 1 - OBA ARGUMENTY SA INTEGER +C 2 - CO NAJMNIEJ JEDEN ARGUMENT JEST TYPU REAL, DRUGI +C MUSI BYC ARYTMETYCZNY. ZMIENNE CONVL I CONVR OKRE- +C SLAJA EWENTUALNA KONWERSJE +C 3 - OBA ARGUMENTY SA BOOLOWSKIE +C 4 - OBA ARGUMENTY SA TYPU CHAR +C 5 - OBA ARGUMENTY SA TYPU REFERENCYJNEGO (ROWNIEZ +C TABLICOWEGO, TEGO SAMEGO FORMALNEGO I PLIKOWEGO) +C - ZGODNE STATYCZNIE +C 6 - J.W. - CO NAJMNIEJ JEDEN JEST FORMALNY I WYMAGANA +C DYNAMICZNA KONTROLA ZGODNOSCI +C ----SYGNALIZOWANE BLEDY: +C 606 - RODZAJE TYPOW WYSTEPUJACYCH W POROWNANIU SA NIEZGO- +C DNE +C 607 - W POROWNANIU BIORA UDZIAL TYPY KLASOWE Z ROZLACZNA +C SEKWENCJA PREFIKSOWA +C 608 - POROWNYWANY JEST TYP STRING +C 636 - NIEDOZWOLONE UZYCIE SEMAFORA +C +C OPIS W DOKUMENTACJI: ?2.6 +C WERSJA Z DNIA: 13.05.83 (FRIDAY) +C DLUGOSC KODU: 664 +C............................................................................. +C + IMPLICIT INTEGER (A-Z) +C +C *CALL BLANKSEM +C..... +#include "blank.h" +C +C !!!!!! END OF SUBSTITUTION OF COMDECK BLANKSEM FROM LOGLAN.14 !! +C *CALL MTPC +C......BLOK KOMUNIKACJI Z PROCEDURA MTPCON + COMMON /MTPC/ PRFXR, PRFXL +C +C !!!!!! END OF SUBSTITUTION OF COMDECK MTPC FROM LOGLAN.14 !! +C + CONVL = 0 + CONVR = 0 + TPL = IAND( IPMEM(TLBAS), 15) + TPR = IAND (IPMEM(TRBAS), 15) +C TPL,TPR - POLA T TYPOW BAZOWYCH LEWEJ I PRAWEJ STRONY + IF ((TLDIM .NE. 0) .OR. (TRDIM .NE. 0)) GOTO 1000 +C SKOK DO POROWNYWANIA TYPOW TABLICOWYCH +C + GOTO (9000, 100, 100, 200, 100, 300, 100, 400, 9100, 500, + X 800, 700, 9000, 300), TPL +C +C-----TPL JEST TYPEM KLASOWYM LUB SYSTEMOWYM + 100 CASE = 5 + GOTO (9000, 110, 110, 120, 110, 130, 110, 9000, 9100, 9000, + X 9000, 9000, 9000, 120), TPR +C....... TPR JEST TEZ TYPEM KLASOWYM LUB SYSTEMOWYM + 110 IF ((TRBAS .EQ. NRCOR) .OR. (TLBAS .EQ. NRCOR)) RETURN + IF ((TRBAS .EQ. NRPROC) .OR. (TLBAS .EQ. NRPROC)) RETURN +C PRZYPADEK, GDY OBA TYPY SA TYPAMI KLASOWYMI - WOWCZAS ICH +C SEKWENCJE PREFIKSOWE NIE MOGA BYC ROZLACZNE + IF ( MPRFSQ(TRBAS,TLBAS) .GE. 0) RETURN +C ROZLACZNE SEKWENCJE PREFIKSOWE PONIZEJ + CALL MERR(607, IDL) + RETURN +C +C....... TPR JEST TYPEM UNIWERSALNYM LUB TYPEM NONE + 120 RETURN +C +C....... TPR JEST TYPEM FORMALNYM + 130 CASE = 6 + RETURN +C +C +C----- TPL JEST TYPEM UNIWERSALNYM, WTEDY POROWNANIE JEST ZAWSZE +C POPRAWNE - O ILE TPR NIE JEST TYPEM TEKSTOWYM + 200 CASE = 5 + IF (TRBAS .EQ. NRTEXT) GOTO 700 + RETURN +C +C----- TPL JEST TYPEM FORMALNYM LUB TYPEM NONE - BY ZACHODZILA ZGODNOSC +C TO TPR MUSI BYC TYPEM FORMALNYM, KLASOWYM, SYSTEMOWYM, UNIWER- +C SALNYM LUB NONE + 300 CASE = 6 + IF ( (TPL .EQ. 14) .OR. (TPR .EQ. 14) ) CASE = 5 +C-----JESLI POROWNANIE NONE Z FILE + IF ((TPL .EQ. 14) .AND. (TPR .EQ. 11)) RETURN + IF (TPR .GE. 13) RETURN + IF (TPR .GE. 8) GOTO 9000 + IF (TPR .EQ. 6) GOTO 8000 + IF (TPR .GE. 1) RETURN + GOTO 9000 +C +C----- TPL JEST TYPEM ARYTMETYCZNYM, WTEDY TPR TEZ MUSI BYC ARYTMETYCZNE +C (LUB UNIWERSALNE) + 400 IF ((TRBAS .NE. NRINT) .AND. + X (TRBAS .NE. NRRE) .AND. + X (TRBAS .NE. NRUNIV)) GOTO 9000 + CASE = 2 +cdsw IF ((TPR .EQ.TPL) .AND. (TRBAS .EQ.NRINT)) CASE = 1 + IF ((trbas .EQ. tlbas) .AND. (TRBAS .EQ. NRINT) ) CASE = 1 + CONVL = 0 + CONVR = 0 + IF (CASE .EQ. 1) RETURN + IF (TLBAS .EQ. NRINT) CONVL = 1 + IF (TRBAS .EQ. NRINT) CONVR = 1 + RETURN +C +C-----TPL JEST TYPEM BOOLEAN LUB CHARACTER, WTEDY TPR MUSI BYC ROWNIEZ +C BOOLEAN LUB CHARACTER (LUB UNIWERSALNY) + 500 IF ((TRBAS .EQ. NRCHR) .OR. (TLBAS .EQ. NRCHR)) GOTO 600 + CASE = 3 + IF ((TRBAS .EQ. NRBOOL) .OR. (TRBAS .EQ. NRUNIV)) RETURN + GOTO 9000 +C +C-----TPL JEST TYPEM CHAR, WTEDY TPR MUSI BYC BADZ CHAR BADZ UNIWER- +C SALNY + 600 CASE = 4 + IF ((TRBAS .EQ. NRCHR) .OR. (TRBAS .EQ. NRUNIV)) RETURN + GOTO 9000 +C +C-----TPL JEST TYPEM TEKSTOWYM, NIEZALEZNIE OD TPR JEST TO BLAD + 700 CASE = 5 + CALL MERR(608, IDL) + IF (TRBAS .EQ. NRTEXT) CALL MERR(608, IDR) + RETURN +C +C-----TPL - FILE. TPR MUSI BYC FILE LUB UNIWERSALNY LUB NONE + 800 CASE = 5 + IF ((TPR .EQ. 11) .OR. (TRBAS .EQ. NRUNIV) + X .OR. (TRBAS .EQ. NRNONE)) RETURN + GOTO 9000 +C +C +C----- POROWNYWANIE TYPOW TABLICOWYCH + 1000 CASE = 5 + IF (TLDIM-TRDIM) 2000, 3000, 4000 +C...... PRZYPADEK TLDIM < TRDIM +C WOWCZAS POPRAWNE JEDYNIE, GDY TLBAS JEST FORMALNY, UNIWERSALNY +C LUB NONE +C W PRZYPADKU, GDY OBA TYPY SA TYM SAMYM TYPEM FORMALNYM MUSZA +C POCHODZIC Z ROZNYCH OBIEKTOW + 2000 IF ((TPL .EQ. 4) .OR. (TPL .EQ. 14)) RETURN + IF (TPL .NE. 6) GOTO 9000 +C KONTROLA, GDY CO NAJMNIEJ JEDENz JEST FORMALNY + GOTO 8500 +C +C...... PRZYPADEK TLDIM = TRDIM +C POPRAWNE, GDY : +C - OBA TYPY BAZOWE SA ROWNE +C LUB - CO NAJMNIEJ JEDEN Z NICH JEST FORMALNY LUB UNIWERSALNY + 3000 IF ( (TPR .EQ. 4) .OR. (TPL .EQ. 4) ) RETURN + IF ( (TPR .EQ. 6) .OR. (TPL .EQ. 6) ) GOTO 8000 +C SKOK, GDY CO NAJMNIEJ JEDEN TYP BAZOWY JEST FORMALNY + IF (TRBAS .EQ. TLBAS) RETURN + GOTO 9000 +C +C...... PRZYPADEK TLDIM > TRDIM +C POPRAWNE GDY TRBAS JEST FORMALNY, UNIWERSALNY LUB NONE - +C DALSZE UWAGI JAK PRZY TLDIM < TRDIM + 4000 IF ((TPR .EQ. 4) .OR. (TPR .EQ. 14)) RETURN + IF (TPR .NE. 6) GOTO 9000 + GOTO 8500 +C +C +C------ USTALENIE RODZAJU ZGODNOSCI TYPOW REFERENCYJNYCH, GDY CO +C NAJMNIEJ JEDEN Z NICH JEST TYPEM FORMALNYM +C + 8000 CASE = 6 + PRFXR = OBJR + PRFXL = OBJL + IF ( MTPCON(Z) ) 8200, 8200, 8100 +C MTPCON PRZYJMUJE NASTEPUJACE WARTOSCI +C -1 - TYP TEN SAM Z ROZNYCH OBIEKTOW +C 0 - TYPY ROZNE +C +1 - TYP TEN SAM Z TEGO SAMEGO OBIEKTU +C + 8100 CASE = 5 + 8200 RETURN +C +C...... UZTALENIE ZGODNOSCI TYPOW TABLICOWYCH - JEDEN Z NICH +C JEST FORMALNY +C + 8500 CASE = 6 + PRFXR = OBJR + PRFXL = OBJL + IF ( MTPCON(Z) .NE. 1) RETURN +C WPP - SYGNALIZACJA BLEDOW - NIE MA PODSTAWIENIA UNIFIKU- +C JACEGO +C +C +C +C------ SYGNALIZOWANIE BLEDOW + 9000 CASE = 5 + IF (TPR .EQ. 9) GOTO 9100 + IF ((TRDIM .EQ. 0) .AND. (TRBAS .EQ. NRTEXT)) CALL MERR(608, + X IDR) + CALL MERR(606, IDL) + RETURN +C --- SYGNALIZACJA BLEDOW - NIEDOZWOLONE UZYCIE SEMAFORA + 9100 CASE = 5 + IF (TPL .EQ. 9) CALL MERR(636, IDL) + IF (TPR .EQ. 9) CALL MERR(636, IDR) + RETURN + END +*DECK MPKIND + INTEGER FUNCTION MPKIND (ATTRAD) +C-------------FUNKCJA OKRESLAJACA RODZAJ KOLEJNEGO PARAMETRU +C FORMALNEGO +C / WARTOSCIA PARAMETRU ATTRAD JEST IDENTYFIKATOR +C (INDEKS W IPMEM) OPISU TEGO PARAMETRU +C / ZMIENNA NRPAR (Z BLOKU /SEMANT/) MA WARTOSC ROWNA +C NUMEROWI PARAMETRU WEWNATRZ LISTY PARAMETROW FORMAL- +C NYCH (0,1,2,...) +C / WARTOSC FUNKCJI OKRESLA RODZAJ PARAMETRU FORMALNEGO +C 0 - UNIWERSALNY +C 1 - INPUT +C 2 - OUTPUT +C 3 - TYP +C 4 - FUNKCJA +C 5 - PROCEDURA +C // FUNKCJA KORZYSTA Z PROCEDURY MNOPF +C SYGNALIZOWANY BLAD +C 622 (Z MNOPF) - ZA KROTKA LISTA PF +C +C OPIS W DOKUMENTACJI: ?3.4.3.2 +C WERSJA Z DNIA: 19.01.82 +C DLUGOSC KODU: 141 +C............................................................................. +C + IMPLICIT INTEGER (A-Z) + LOGICAL MNOPF +C *CALL BLANKSEM +C..... +#include "blank.h" +C +C !!!!!! END OF SUBSTITUTION OF COMDECK BLANKSEM FROM LOGLAN.14 !! +C *CALL STCON +C...... + LOGICAL UNICLL + COMMON /MCALLS/ CLLREC, UNICLL +C +C !!!!!! END OF SUBSTITUTION OF COMDECK STCON FROM LOGLAN.14 !! +C +C + MPKIND = 0 + ATTRAD = NRUNIV + IF (MNOPF(0)) RETURN +C +C***************************************************************************** +C PARAMETR ZOSTAL POBRANY + ATTRAD = IPMEM(CLLREC+5) + ATTRAD = IPMEM(ATTRAD) + NRPAR = IPMEM(CLLREC+4) +C------ ROZPOZNANIE BIEZACEGO PARAMETRU +C ZW - SLOWO ZEROWE OPISU PARAMETRU + ZW = IPMEM(ATTRAD) + ZW = IAND (ISHFT(ZW, -4), 15) +1 + GOTO (1000, 100, 200, 300, 1000, 400, 500, 1000, + X 1000, 600), ZW +C +C...... TYP FORMALNY + 100 MPKIND = 3 + GOTO 1000 +C +C...... FUNKCJA + 200 MPKIND = 4 + GOTO 1000 +C +C...... PROCEDURA + 300 MPKIND = 5 + GOTO 1000 +C +C...... INPUT + 400 MPKIND = 1 + GOTO 1000 +C +C...... OUTPUT + 500 MPKIND = 2 + GOTO 1000 +C +C.....INOUT + 600 MPKIND = 6 +C +C***************************************************************************** +C------ ZAKONCZENIE + 1000 IPMEM(CLLREC+7) = MPKIND + RETURN + END +*DECK MPARTP + SUBROUTINE MPARTP (ATDIM, ATBASE, OB, IDBASE) +C-------------PRZETWARZANIE PARAMETRU AKTUALNEGO BEDACEGO TYPEM +C DO REKORDU KONTROLI WPISUJE SIE INFORMACJE O TYPIE +C AKTUALNYM ZASTEPUJACYM TYP-PARAMETR FORMALNY. +C ATDIM, ATBASE - LICZBA ARRAY OF I TYP BAZOWY AKTUALNY +C OB - NUMER OBIEKTU Z CIAGU SL, Z KTOREGO JEST POBIERANY +C LUB ZERO, GDY NIE JEST DOSTEPNY PRZEZ DISPLAY +C IDBASE - NAZWA ZE SCANNERA TYPU BAZOWEGO (DO SYGNALIZACJI +C BLEDOW) +C +C SYGNALIZOWANE BLEDY +C 624 - TYP AKTUALNY NIE JEST REFERENCYJNY +C 625 - ATBASE NIE JEST TYPEM +C 637 - 'SEMAPHORE' NIE MOZE BYC TYPEM AKTUALNYM +C +C /PROCEDURA TWORZY NOWA CZWORKE TYPOW DO MODYFIKACJI +C +C OPIS W DOKUMENTACJI: ?3.5 +C WERSJA Z DNIA: 19.01.82 +C DLUGOSC KODU: 207 +C............................................................................. +C + IMPLICIT INTEGER (A-Z) +C *CALL BLANKSEM +C..... +#include "blank.h" +C +C !!!!!! END OF SUBSTITUTION OF COMDECK BLANKSEM FROM LOGLAN.14 !! +C *CALL STCON +C...... + LOGICAL UNICLL + COMMON /MCALLS/ CLLREC, UNICLL +C +C !!!!!! END OF SUBSTITUTION OF COMDECK STCON FROM LOGLAN.14 !! +C +C +C...... POWROTY DLA WYWOLANIA NIEKONTROLOWANEGO + IF (UNICLL) RETURN + IF (IPMEM(CLLREC+7) .EQ. 0) RETURN +C +C------UTWORZENIE NOWEJ CZWORKI W REKORDZIE KONTROLI + INSYS = .TRUE. + K = MGETM(4, 0) + INSYS = .FALSE. +C...... ZAPIS NUMERU TYPU FORMALNEGO + PF = IPMEM(CLLREC+5) + IPMEM(K) = IPMEM(PF) +C...... ZAPIS INFORMACJI O TYPIE AKTUALNYM + IPMEM(K+1) = ATDIM + IPMEM(K+2) = ATBASE + IPMEM(K+3) = OB +C...... KONTROLA, CZY TYP AKTUALNY JEST DOPUSZCZALNY + 100 PF = IPMEM(ATBASE) + PF = IAND(PF, 15) +C PF - POLE T Z OPISU TYPU ATBASE + IF (PF .EQ. 1) GOTO 200 +C ... ATBASE NIE JEST TYPEM + IF (PF .EQ. 9) GOTO 210 + IF (ATDIM .NE. 0) RETURN +C ---TYPY TABLICOWE SA REFERENCYJNE + IF (PF .LE. 7) RETURN +C ---POWROT DLA POZOSTALYCH TYPOW REFERENCYJNYCH +C +C------SYGNALIZACJA BLEDU - TYP AKTUALNY NIE JEST REFERENCYJNY + CALL MERR(624, IDBASE) + IPMEM(K+2) = NRUNIV + RETURN +C------SYGNALIZACJA BLEDU- PARAMETR ATBASE NIE JEST TYPEM + 200 CALL MERR(625, IDBASE) + 205 IPMEM(K+1) = 0 + IPMEM(K+2) = NRUNIV + RETURN +C-----PARAMETREM JEST TYP 'SEMAPHORE' - BLAD + 210 CALL MERR(637, 0) + GOTO 205 + END +*DECK MREPTP + SUBROUTINE MREPTP (TDIM, TBAS, OB) +C-------------PROCEDURA MODYFIKUJE TYP (TDIM, TBAS) PRZEZ +C ZASTAPIENIE EWENTUALNEGO TYPU FORMALNEGO TYPEM AKTUALNYM +C JEMU ODPOWIADAJACYM. +C TDIM, TBAS - OKRESLA ROWNIEZ TYP PO MODYFIKACJI +C DANE DOTYCZACE DOSTEPNOSCI : OB +C /PROCEDURA UZYWANA JEDYNIE, GDY WYWOLANIE JEST KONTROLO- +C WANE +C +C OPIS W DOKUMENTACJI: ?3.6.1 +C WERSJA Z DNIA: 19.01.82 +C DLUGOSC KODU: 112 +C............................................................................. +C + IMPLICIT INTEGER (A-Z) +C *CALL BLANKSEM +C..... +#include "blank.h" +C +C !!!!!! END OF SUBSTITUTION OF COMDECK BLANKSEM FROM LOGLAN.14 !! +C *CALL STCON +C...... + LOGICAL UNICLL + COMMON /MCALLS/ CLLREC, UNICLL +C +C !!!!!! END OF SUBSTITUTION OF COMDECK STCON FROM LOGLAN.14 !! +C +C K - INDEKS PIERWSZEJ PIATKI TYPOW ZASTEPOWANYCH +C L - INDEKS OSTATNIEJ PIATKI TYPOW ZASTEPOWANYCH + L = LPML - 4 + K = CLLREC + 8 +C...... SPRAWDZENIE, CZY LISTA TYPOW NIE JEST PUSTA + IF (K .GT. L) RETURN +C------ SZUKANIE W NIEPUSTEJ LISCIE +C + 10 IF (IPMEM(K) .EQ. TBAS) GOTO 20 +C ---SKOK, GDY TYP JEST ODNALEZIONY + IF (K .EQ. L) RETURN +C ---POWROT, GDY TYP NIE WYSTEPUJE W LISCIE + K = K+4 + GOTO 10 +C +C------ TYP ODNALEZIONY + 20 TDIM = TDIM + IPMEM(K+1) + TBAS = IPMEM(K+2) + OB = IPMEM(K+3) + RETURN + END +*DECK MCALLO + SUBROUTINE MCALLO (NRPROT, IDPROT, OB, KIND) +C-------------PROCEDURA OTWIERA REKORD KONTROLI STATYCZNEJ NOWEGO +C WYWOLANIA (WKLADAJAC NA STOS), INICJUJE TEN REKORD +C PARAMETRY WEJSCIOWE +C NRPROT - NUMER WYWOLYWANEGO PROTOTYPU +C IDPROT - NAZWA ZE SCANNERA WYWOLYWANEGO PROTOTYPU +C OB - NUMER OBIEKTU Z CIAGU SL, Z KTOREGO WYWOLYWANY +C PROTOTYP POCHODZI +C PARAMETR WYJSCIOWY +C KIND - WARTOSCI +C = 0 ZWYKLY PROTOTYP +C = 1 WIRTUALNY +C = 2 FORMALNY +C +C OPIS W DOKUMENTACJI: ?3.4.2 +C WERSJA Z DNIA: 19.01.82 +C DLUGOSC KODU: 262 +C............................................................................. +C + IMPLICIT INTEGER (A-Z) + LOGICAL BTEST +C +C *CALL BLANKSEM +C..... +#include "blank.h" +C +C !!!!!! END OF SUBSTITUTION OF COMDECK BLANKSEM FROM LOGLAN.14 !! +C *CALL STCON +C...... + LOGICAL UNICLL + COMMON /MCALLS/ CLLREC, UNICLL +C +C !!!!!! END OF SUBSTITUTION OF COMDECK STCON FROM LOGLAN.14 !! +*CALL MID + COMMON /MID/ PSTART, CHECKS +C +C------ UTWORZENIE REKORDU DLA WYWOLANIA UNIWERSALNEGO + KIND = 0 + UNICLL = .TRUE. + CHECKS = CHECKS+1 + INSYS = .TRUE. + RECORD = MGETM(2, 0) + IPMEM(RECORD) = CLLREC + CLLREC = RECORD+1 + INSYS = .FALSE. + IF (NRPROT .EQ. NRUNIV) RETURN +C------ UTWORZENIE REKORDU DLA WYWOLANIA KONTROLOWANEGO + INSYS = .TRUE. + UNICLL = .FALSE. + RECORD = MGETM(7, 0) + INSYS = .FALSE. +C...... INICJALIZACJA SLOW REKORDU +C RECORD - ZEROWE SLOWO WYWOLYWANEGO REKORDU + RECORD = IPMEM(NRPROT) + IPMEM(CLLREC) = NRPROT + IPMEM(CLLREC+1) = IDPROT +C...... ZBADANIE, CZY TO JEST PROTOTYP WIRTUALNY + KIND = 1 + IF (BTEST(RECORD, 11) ) GOTO 100 +C...... ZBADANIE, CZY TO PROTOTYP FORMALNY +C (PRZY POMOCY POLA ZP) + KIND = 0 + ZP = IAND(ISHFT(RECORD, -4), 15) + IF ( ZP .NE. 0) KIND = 2 +C --- ZBADANIE, CZY TO NIE JEST SYGNAL + IF (ZP .EQ. 11) KIND = 0 + 100 IPMEM(CLLREC+2) = KIND +C...... INICJALIZACJA DALSZYCH SLOW + IPMEM(CLLREC+3) = OB +C...... WYPELNIENIE INFORMACJI O LISCIE PARAMETROW + IPMEM(CLLREC+4) = -1 + IPMEM(CLLREC+5) = IPMEM(NRPROT+3) - 1 + IPMEM(CLLREC+6) = IPMEM(CLLREC+5) + IPMEM(NRPROT+4) +C...... SKROCENIE LISTY PF DLA FUNKCJI - OSTATNI ELEMENT JEST +C ZMIENNA RESULT + RECORD = IAND( ISHFT(RECORD, -8), 7) + IF (RECORD .EQ. 2) IPMEM(CLLREC+6) = + X IPMEM(CLLREC+6)-1 + RETURN + END +*DECK MCALLC + SUBROUTINE MCALLC +C-------------ZAKONCZENIE KONTROLI WYWOLANIA, ZBADANIE +C ZGODNOSCI LICZBY PARAMETROW FORMALNYCH I PARAME- +C TROW AKTUALNYCH +C ZDJECIE REKORDU KONTROLI ZE STOSU +C SYGNALIZOWANY BLAD +C 623 - LISTA PF JEST DLUZSZA OD LISTY PARAMETROW +C AKTUALNYCH +C +C OPIS W DOKUMENTACJI: ?3.4.4.2 +C WERSJA Z DNIA: 19.01.82 +C DLUGOSC KODU: 89 +C............................................................................. +C +C + IMPLICIT INTEGER (A-Z) +C +C *CALL BLANKSEM +C..... +#include "blank.h" +C +C !!!!!! END OF SUBSTITUTION OF COMDECK BLANKSEM FROM LOGLAN.14 !! +C *CALL STCON +C...... + LOGICAL UNICLL + COMMON /MCALLS/ CLLREC, UNICLL +C +C !!!!!! END OF SUBSTITUTION OF COMDECK STCON FROM LOGLAN.14 !! +*CALL MID + COMMON /MID/ PSTART, CHECKS +C +C + CHECKS = CHECKS - 1 + IF (UNICLL) GOTO 1000 +C +C****** KONTROLA DLUGOSCI LIST PF I PA + IF (IPMEM(CLLREC+5) .EQ. IPMEM(CLLREC+6) ) GOTO 1000 +C --- SYGNALIZACJA BLEDU + CALL MERR(623, IPMEM(CLLREC+1) ) +C +C****** ZDJECIE REKORDU ZE SZCZYTU STOSU + 1000 LPML = CLLREC-1 + CLLREC = IPMEM(CLLREC-1) + UNICLL = .FALSE. + IF (IPMEM(CLLREC) .EQ. 0) UNICLL = .TRUE. + RETURN + END +*DECK MNOPF + LOGICAL FUNCTION MNOPF (X) +C-------------FUNKCJA SLUZY DO POBRANIA NOWEGO PARAMETRU +C KONTROLUJE, CZY JEST TO MOZLIWE +C //PRZYJMUJE WARTOSC .TRUE. GDY LISTA PF JEST PUSTA, +C SYGNALIZUJE WOWCZAS (O ILE WYWOLYWANY PROTOTYP NIE +C MIAL USZKODZONEJ LISTY) BLAD +C ZMIENIA WYWOLANIE NA NIEKONTROLOWANE +C //GDY LISTA PF NIE JEST PUSTA +C AKTUALIZUJE SLOWA 5 I 6 W REKORDZIE KONTROLI +C //// X - PARAMETR NIEISTOTNY +C SYGNALIZOWANY BLAD +C 622 - LISTA PF KROTSZA OD LISTY PARAMETROW AKTUALNYCH +C +C OPIS W DOKUMENTACJI: ?3.4.3.1 +C WERSJA Z DNIA: 19.01.82 +C DLUGOSC KODU: 168 +C............................................................................. +C + IMPLICIT INTEGER (A-Z) + LOGICAL BTEST +C +C *CALL BLANKSEM +C..... +#include "blank.h" +C +C !!!!!! END OF SUBSTITUTION OF COMDECK BLANKSEM FROM LOGLAN.14 !! +C *CALL STCON +C...... + LOGICAL UNICLL + COMMON /MCALLS/ CLLREC, UNICLL +C +C !!!!!! END OF SUBSTITUTION OF COMDECK STCON FROM LOGLAN.14 !! +C + MNOPF = .TRUE. + IF (UNICLL) RETURN + MNOPF = .FALSE. +C +C****** MODYFIKACJA NUMEROW PARAMETRU FORMALNEGO I ELEMENTU LISTY + IPMEM(CLLREC+4) = IPMEM(CLLREC+4) + 1 + IPMEM(CLLREC+5) = IPMEM(CLLREC+5) + 1 +C------ KONTROLA DLUGOSCI LISTY PF I PA + IF (IPMEM(CLLREC+5) .LE. IPMEM(CLLREC+6) ) RETURN +C +C****** PRZYPADEK, GDY NIE MA JUZ POTRZEBNEGO PF +C -SYGNALIZACJA BLEDU, GDY WYWOLYWANY PROTOTYP NIE JEST +C USZKODZONY +C -SKROCENIE REKORDU KONTROLI STATYCZNEJ DO WYWOLANIA UNIWERSAL- +C NEGO +C + MNOPF = .TRUE. +C +C ZW - SLOWO ZEROWE PROTOTYPU + ZW = IPMEM(CLLREC) + ZW = IPMEM(ZW) +C ---SKOK DLA USZKODZONEJ LISTY + IF (BTEST(ZW, 13)) GOTO 100 +C +C------ SYGNALIZACJA BLEDU + CALL MERR(622, IPMEM(CLLREC+1)) +C------ SKROCENIE REKORDU KONTROLI + 100 CALL MUNICL + RETURN + END +*DECK MUNICL + SUBROUTINE MUNICL +C-------------PROCEDURA ZASTEPUJACA WYWOLANIE KONTROLOWANE +C WYWOLANIEM OBIEKTU UNIWERSALNEGO +C / JEST WYKONYWANA, GDY W WYWOLANIU BYLY BLEDY UNIE- +C MOZLIWIAJACE DALSZA POPRAWNA ANALIZE +C +C OPIS W DOKUMENTACJI: ?3.4.4.1 +C WERSJA Z DNIA: 19.01.82 +C DLUGOSC KODU: 31 +C............................................................................. +C + IMPLICIT INTEGER (A-Z) +C +C *CALL BLANKSEM +C..... +#include "blank.h" +C +C !!!!!! END OF SUBSTITUTION OF COMDECK BLANKSEM FROM LOGLAN.14 !! +C *CALL STCON +C...... + LOGICAL UNICLL + COMMON /MCALLS/ CLLREC, UNICLL +C +C !!!!!! END OF SUBSTITUTION OF COMDECK STCON FROM LOGLAN.14 !! +C + LPML = CLLREC+1 + UNICLL = .TRUE. + IPMEM(CLLREC) = 0 + RETURN + END +*DECK MTPCON + INTEGER FUNCTION MTPCON (X) +C X - "SLEPY" PARAMETR +C-------------POMOCNICZA FUNKCJA DO KONTROLI TYPOW FORMALNYCH. +C OKRESLA, CZY TYPY TRBAS I TLBAS ATRYBUTOW POCHODZACYCH +C Z OBIEKTOW/WARSTW PRFXR I PRFXL (DOSTEPNYCH PRZEZ DISPLAY +C ODPOWIEDNIO TE WARTOSCI SA WIEKSZE OD ZERA) SA TYM SAMYM +C TYPEM FORMALNYM. +C /WARTOSCI : +C -1 - TYP TEN SAM, Z ROZNYCH OBIEKTOW +C 0 - TYPY ROZNE +C +1 - TYP TEN SAM Z TEGO SAMEGO OBIEKTU +C +C OPIS W DOKUMENTACJI: ?2.2.3 +C WERSJA Z DNIA: 19.01.82 +C DLUGOSC KODU: 362 +C............................................................................. +C + IMPLICIT INTEGER (A-Z) +C +C *CALL BLANKSEM +C..... +#include "blank.h" +C +C !!!!!! END OF SUBSTITUTION OF COMDECK BLANKSEM FROM LOGLAN.14 !! +C *CALL MTPC +C......BLOK KOMUNIKACJI Z PROCEDURA MTPCON + COMMON /MTPC/ PRFXR, PRFXL +C +C !!!!!! END OF SUBSTITUTION OF COMDECK MTPC FROM LOGLAN.14 !! +C *CALL MOB +C......KOMUNIKACJA Z PROCEDURA MOBJFD + LOGICAL WCL1,WCL2 + COMMON /MOB/ STOB, PRFX1, PRFX2, SLOB1, SLOB2, WCL1, WCL2 +C +C !!!!!! END OF SUBSTITUTION OF COMDECK MOB FROM LOGLAN.14 !! +C +C******************************************* +C WARUNKI DOSTATECZNE NA TO BY TYP POCHODZIL Z TEGO +C SAMEGO OBIEKTU: +C - OBYDWA ATRYBUTY SA DOSTEPNE PRZEZ DISPLAY +C ORAZ JEDEN Z PONIZSZYCH +C (A) POCHODZA Z TEJ SAMEJ WARSTWY (TEN SAM NUMER +C W DISPLAY-U) +C (B) OBIEKTY W CIAGU SL DLA PROTOTYPU AKTUALNEGO, +C Z KTORYCH POCHODZA TYPY, SA ROWNE DLA OBYDWU +C ATRYBUTOW ORAZ W LANCUCHU SL OD PROTOTYPU +C AKTUALNEGO DO TEGO OBIEKTU NIE WYSTEPUJA ZADNE +C KLASY (NATOMIAST SAME OBIEKTY MOGA BYC KLASAMI) +C (C) WYSTARCZY, BY ATRYBUTY BYLY WLASNE W OBIEKTACH +C W CIAGU SL DLA PROTOTYPU AKTUALNEGO ORAZ POMIEDZY +C TYMI OBIEKTAMI NIE WYSTEPUJA ZADNE KLASY ( ORAZ +C OBIEKT Z TYPEM JEST TEN SAM) +C (D) ATRYBUTY SA LOKALNE W PROTOTYPIE AKTUALNYM +C (E) TYP NIE JEST ATRYBUTEM KLASY +C******************************************** +C + MTPCON = 0 + IF (TRBAS .NE. TLBAS) RETURN + MTPCON = -1 + IF ( (PRFXR .LE. 0) .OR. (PRFXL .LE. 0) ) RETURN +C******************************************** +C BADANIE WARUNKOW (A) - (E) + MTPCON = 1 + IF (PRFXR .EQ. PRFXL) RETURN +C --POWROT DLA PRZYPADKU (A) + SLOBR = IPMEM(TRBAS - 1) + IF (IPMEM(SLOBR) .GT. 15) RETURN +C --POWROT DLA PRZYPADKU (E) +C......ODNALEZIENIE W LANCUCHU SL DLA PROTOTYPU AKTUALNEGO +C P OBIEKTOW "PREFIKSOWANYCH" PRZEZ PROTOTYPY PRFXL I +C PRFXR + STOB = P + PRFX1 = PRFXR + PRFX2 = PRFXL + CALL MOBJFD + SLOBR = SLOB1 + SLOBL = SLOB2 +C SLOB - OBIEKTY W LANCUCHU SL +C WCL1 = .TRUE. GDY POMIEDZY P A DRUGIM Z TYCH OBIEKTOW +C WYSTEPUJE KLASA +C WCL2 = .TRUE. GDY POMIEDZY TYMI OBIEKTAMI WYSTEPUJE +C KLASA + IF ( (SLOBR .EQ. P) .AND. (SLOBL .EQ. P) ) RETURN +C --POWROT DLA PRZYPADKU (D) +C + MTPCON = -1 + IF (WCL2) RETURN +C --POMIEDZY OBIEKTAMI WYSTAPILA KLASA +C +C......TESTOWANIE PRZYPADKU (C) + IF ( (PRFXR .NE. SLOBR) .OR. (PRFXL .NE. SLOBL) ) + X GOTO 100 + STOB = SLOBR + PRFX1 = IPMEM(TRBAS-1) + PRFX2 = 0 + CALL MOBJFD + OBTPR = SLOB1 +C + STOB = SLOBL + PRFX1 = IPMEM(TLBAS-1) + PRFX2 = 0 + CALL MOBJFD + OBTPL = SLOB1 + IF (OBTPR .NE. OBTPL) RETURN + MTPCON = 1 + RETURN +C......TESTOWANIE PRZYPADKU (B) +C ODSZUKANIE OBIEKTOW, Z KTORYCH BRANY JEST TYP, GDY +C OTOCZENIAMI SA SLOB + 100 IF (WCL1) RETURN + IF (IAND(IPMEM(P), 15) .NE. 1) RETURN +C BY TYP NA PEWNO POCHODZIL Z TEGO SAMEGO OBIEKTU - P NIE MOZE BYC +C KLASA + STOB = SLOBR + PRFX1 = IPMEM(TRBAS-1) + PRFX2 = 0 + CALL MOBJFD + OBTPR = SLOB1 + IF (WCL1 .AND. (SLOBR .NE. OBTPR) ) RETURN + STOB = SLOBL + PRFX1 = IPMEM(TLBAS-1) + PRFX2 = 0 + CALL MOBJFD + OBTPL = SLOB1 + IF (WCL1 .AND. (SLOBL .NE. OBTPL) ) RETURN + IF (OBTPL .NE. OBTPR) RETURN +C --TYP BRANY Z ROZNYCH OBIEKTOW + MTPCON = 1 + RETURN + END +*DECK MDISTP + LOGICAL FUNCTION MDISTP (VSL, NRPROT, NRDIS) +C-------------FUNKCJA SPRAWDZA, CZY TYP FORMALNY OBIEKTU DOSTEPNEGO +C PRZEZ DISPLAY Z PROTOTYPU AKTUALNEGO JEST ROWNIEZ +C DOSTEPNY PRZEZ DISPLAY +C VSL - NUMER PROTOTYPU Z DEKLARACJA OBIEKTU +C NRPROT - NUMER PROTOTYPU TYPU FORMALNEGO +C /WYNIKI : NRDIS IDENTYFIKATOR PROTOTYPU, KTOREGO +C NUMER W DISPLAY-U TWORZY ADRES NRPROT +C /WARTOSCI +C - .TRUE. - TYP ZAWSZE DOSTEPNY PRZEZ DISPLAY +C - .FALSE. - TYP NIE JEST LUB NIE ZAWSZE JEST DOSTEPNY +C PRZEZ DISPLAY +C +C OPIS W DOKUMENTACJI: ?1.4.4 +C WERSJA Z DNIA: 19.01.82 +C DLUGOSC KODU: 314 +C............................................................................. +C +C + IMPLICIT INTEGER (A-Z) + LOGICAL BPREF + LOGICAL WCL, VWCL +cdsw DATA MDISTPHX /Z0FFF/ +C +C *CALL BLANKSEM +C..... +#include "blank.h" +C +C !!!!!! END OF SUBSTITUTION OF COMDECK BLANKSEM FROM LOGLAN.14 !! +C *CALL MOB +C......KOMUNIKACJA Z PROCEDURA MOBJFD + LOGICAL WCL1,WCL2 + COMMON /MOB/ STOB, PRFX1, PRFX2, SLOB1, SLOB2, WCL1, WCL2 +C +C !!!!!! END OF SUBSTITUTION OF COMDECK MOB FROM LOGLAN.14 !! +C +cdsw --------------------- + data mdishx / x'0fff'/ +cdsw ----------------------- + TPSL = IPMEM(NRPROT - 1) + NRDIS = TPSL +C WARSTWA, Z KTOREJ POCHODZI TYP NRPROT + MDISTP = .TRUE. + IF (VSL .EQ. TPSL) RETURN + IF (IAND(IPMEM(TPSL), mdishx ) .GT. 15) RETURN +C OBYDWIE WIELKOSCI POCHODZA Z TEJ SAMEJ WARSTWY LUB TYP NIE +C JEST ATRYBUTEM KLASY + MDISTP = .FALSE. +C......ZNALEZIENIE W LANCUCHU SL PROTOTYPU AKTUALNEGO +C OBIEKTU Z WARSTWA VSL + STOB = P + PRFX1 = VSL + PRFX2 = 0 + CALL MOBJFD + VOB = SLOB1 + VWCL = WCL2 +C......ZNALEZIENIE W LANCUCHU SL PROTOTYPU AKTUALNEGO +C OBIEKTU Z WARSTWA TPSL + STOB = P + PRFX1 = TPSL + CALL MOBJFD + TOB = SLOB1 + WCL = WCL2 + IF (TOB .EQ. VOB) GOTO 100 + IF (VWCL) RETURN + IF (WCL) RETURN +C......ZNALEZIENIE W LANCUCHU SL PROTOTYPU VOB OBIEKTU +C Z WARSTWA TPSL + STOB = VOB + PRFX1 = TPSL + CALL MOBJFD + TOBPR = SLOB1 + WCL = WCL2 + IF ( TOB .NE. TOBPR) GOTO 300 + IF ( .NOT. WCL) GOTO 200 + NRDIS = VOB + IF (VOB .NE. TOB) RETURN + MDISTP = .TRUE. + RETURN + 100 MDISTP = .TRUE. + NRDIS = VSL + RETURN + 200 NRDIS = TOBPR + MDISTP = .TRUE. + RETURN + 300 IF (IAND(IPMEM(VOB),15) .NE. 1) RETURN + IF (WCL) RETURN + IF (IAND(IPMEM(P), 15) .NE. 1) RETURN + IF (IAND(IPMEM(TOBPR), 15) .EQ. 1) GOTO 200 + IF (BPREF(TOB, IPMEM(TOBPR-6))) RETURN + GOTO 200 +C JESLI P I VOB NIE SA KLASAMI ORAZ TOB NIE JEST ROWN TOBPR A TALZE +C POMIEDZY VOB A TOBPR NIE MA KLAS - TYP JEST WIDOCZNY PRZEZ DISPLAY +C DODATKOWY WARUNEK: TOB NIE MOZE BYC PREFIKSOWANE PRZEZ TOBPR + END +*DECK MOBJFD + SUBROUTINE MOBJFD +C POMOCNICZA PROCEDURA PRZY KONTROLI TYPOW. +C WYSZUKUJE W LANCUCHU SL OBIEKTU STOB OBIEKTY +C "PREFIKSOWANE" (LUB ROWNE) PRZEZ PRFX1 I PRFX2 +C (JESLI PRFX2=0 TO TYLKO PRFX1) +C SLOB1 - OBIEKT ZAWIERAJACY WARSTWE PRFX1 +C SLOB2 - OBIEKT ZAWIERAJACY WARSTWE PRFX2 +C WCL1 = .TRUE. JESLI POMIEDZY STOB A TYMI OBIEKTAMI +C WYSTEPUJE KLASA +C WCL2 = .TRUE. JESLI POMIEDZY TYMI OBIEKTAMI WYSTE- +C PUJE KLASA +C +C OPIS W DOKUMENTACJI: ?1.4.3 +C WERSJA Z DNIA: 19.01.82 +C DLUGOSC KODU: 548 +C............................................................................. +C + IMPLICIT INTEGER (A-Z) + LOGICAL WCLPR, NOCL1, NOCL2, BPREF +cdsw DATA MOBJFDHX /Z0FFF/ +C *CALL BLANK +C..... +#include "blank2.h" +C +C !!!!!! END OF SUBSTITUTION OF COMDECK BLANK FROM LOGLAN.14 !! +C *CALL MOB +C......KOMUNIKACJA Z PROCEDURA MOBJFD + LOGICAL WCL1,WCL2 + COMMON /MOB/ STOB, PRFX1, PRFX2, SLOB1, SLOB2, WCL1, WCL2 +C +C !!!!!! END OF SUBSTITUTION OF COMDECK MOB FROM LOGLAN.14 !! +C +cdsw ------------------- + data mobjhx / x'0fff'/ +cdsw --------------------- +C......INICJALIZACJA + ACTOB = STOB +C -OBIEKT AKTUALNY W LANCUCHU SL + WCL1 = .FALSE. + WCL2 = .FALSE. + WCLPR = .FALSE. +C......SPRAWDZENIE, CZY PRFX SA KLASAMI JESLI TAK TO POBRANIE +C ICH NUMEROW W SENSIE ZBIOROW PREFIKSOW + NOCL1 = .TRUE. + NOCL2 = .TRUE. + ZWORD = IAND(IPMEM(PRFX1), 15) + IF ( (ZWORD .GE. 15) .OR. (ZWORD .EQ. 1) ) + X GOTO 100 + NOCL1 = .FALSE. + PRFN1 = IPMEM(PRFX1-6) +C --PRFN1 - NUMER W SENSIE PREFXSET +C + 100 IF (PRFX2 .EQ. 0) GOTO 3000 +C --SKOK DO WYSZUKIWANIA PROTOTYPU Z WARSTWA PRFX1 +C +C + IF ( (IPMEM(PRFX2) .GE. 15) .OR. (IPMEM(PRFX2) .EQ. 1) ) + X GOTO 200 + NOCL2 = .FALSE. + PRFN2 = IPMEM(PRFX2-6) +C + 200 CONTINUE + IF (PRFX1 .EQ. PRFX2) GOTO 3100 +C +C************WYSZUKIWANIE BLIZSZEGO OBIEKTU + 1000 IF (ACTOB .EQ. PRFX1) GOTO 2000 + IF (ACTOB .EQ. PRFX2) GOTO 3000 + IF (IPMEM(ACTOB) .EQ. 1) GOTO 1600 + IF ( IAND(ISHFT(IPMEM(ACTOB), -8), 7) .EQ. 7) GOTO 1600 +C --OMINIECIE BLOKU ZWYKLEGO I HANDLERA + IF (NOCL1) GOTO 1100 + IF (BPREF(ACTOB,PRFN1)) GOTO 2000 + 1100 IF (NOCL2) GOTO 1500 + IF (BPREF(ACTOB,PRFN2)) GOTO 3000 +C......POBRANIE KOLEJNEGO OBIEKTU Z LANCUCHA SL (PRZY +C JEDNOCZESNYM SPRAWDZENIU, CZY NIE JEST TO KLASA) + 1500 IF (ACTOB .EQ. STOB) GOTO 1600 + IF ( IAND(IPMEM(ACTOB), mobjhx ) .LE. 15) WCL1 = .TRUE. + 1600 ACTOB = IPMEM(ACTOB-1) + GOTO 1000 +C +C +C******WYSZUKIWANIE DRUGIEGO OBIEKTU, W PRZYPADKU GDY +C PIERWSZYM JEST ODPOWIADAJACY PRFX1 + 2000 SLOB1 = ACTOB + IF ( (IPMEM(ACTOB) .LE. 15) .AND. (IPMEM(ACTOB) .NE. 1) ) + X WCLPR = .TRUE. +C ***BADANIE KOLEJNYCH OBIEKTOW + 2100 CONTINUE + IF (ACTOB .EQ. PRFX2) GOTO 2500 + IF (IPMEM(ACTOB) .EQ. 1) GOTO 2300 + IF (IAND(ISHFT(IPMEM(ACTOB), -8), 7) .EQ. 7) GOTO 2300 + IF (NOCL2) GOTO 2200 + IF (BPREF(ACTOB, PRFN2)) GOTO 2500 + 2200 IF (ACTOB .EQ. SLOB1) GOTO 2300 + IF (IAND(IPMEM(ACTOB), mobjhx ) .LE. 15) WCL2 = .TRUE. + 2300 ACTOB = IPMEM(ACTOB-1) + GOTO 2100 +C +C +C ***OBIEKT DRUGI ODNALEZIONY + 2500 SLOB2 = ACTOB + IF ( SLOB1 .EQ. SLOB2) RETURN + WCL1 = ( (WCL1 .OR. WCL2) .OR. WCLPR) + RETURN +C +C +C******WYSZUKIWANIE DRUGIEGO OBIEKTU W PRZYPADKU, GDY PIERWSZYM +C JEST ODPOWIADAJACY PRFX2 (ROWNIEZ, GDY SZUKAMY JEDNEGO +C OBIEKTU) + 3000 SLOB2 = ACTOB + ZWORD = IAND(IPMEM(ACTOB), mobjhx ) + IF ( (ZWORD .LE. 15) .AND. (ZWORD .NE. 1) ) + X WCLPR = .TRUE. +C ***BADANIE KOLEJNYCH OBIEKTOW W CIAGU SL + 3100 CONTINUE + IF (ACTOB .EQ. PRFX1) GOTO 3500 + IF (IPMEM(ACTOB) .EQ. 1) GOTO 3300 + IF (NOCL1) GOTO 3200 + IF (BPREF(ACTOB, PRFN1)) GOTO 3500 + 3200 IF (ACTOB .EQ. SLOB2) GOTO 3300 + IF (IAND(IPMEM(ACTOB), mobjhx ) .LE. 15) WCL2 = .TRUE. + 3300 ACTOB = IPMEM(ACTOB-1) + GOTO 3100 +C +C +C ***ODNALEZIONY DRUGI OBIEKT + 3500 SLOB1 = ACTOB + IF (PRFX1 .NE. PRFX2) GOTO 3600 + WCL2 = .FALSE. + SLOB2 = ACTOB + 3600 CONTINUE + IF (SLOB1 .EQ. SLOB2) RETURN +C GDY OBA PREFIKSY PREFIKSUJA PIERWSZA NAPOTKANA +C KLASE TO NIE TRAKTUJEMY JEJ JAKO KLASY (TZN. +C WCL1 I WCL2 SA .FALSE. + WCL1 = ( (WCL1 .OR. WCL2) .OR. WCLPR) + RETURN + END +*DECK MARITH + SUBROUTINE MARITH ( OP ) +C-------------PROCEDURA BADA POPRAWNOSC ARGUMENTOW OPERACJI ARYTME- +C TYCZNYCH. +C TYPY LEWEGO I PRAWEGO ARGUMENTU DANE SA W BLOKU /SEMANT/ +C PRZEZ ZMIENNE TLDIM, TLBAS ORAZ TRDIM,TRBAS . +C ZMIENNE IDL I IDR (W /SEMANT/) SA IDENTYFIKATORAMI LEWE- +C GO I PRAWEGO ARGUMENTU (DO SYGNALIZACJI BLEDOW). +C PARAMETR OP OKRESLA RODZAJ OPERACJI: +C OP = 1 - DLA +,-,* ORAZ RELACJI <,>,<=,>= +C OP = 2 - DLA DIV I MOD +C OP = 3 - DLA / (WYNIK ZAWSZE REAL) +C NA ZMIENNA TRESLT W /SEMANT/ PODSTAWIANY JEST TYP +C WYNIKU OPERACJI . +C PROCEDURA PRZEKAZUJE INFORMACJE O KONWERSJI LEWEGO (CONVL) +C I PRAWEGO (CONVR) ARGUMENTU. WARTOSCI TYCH ZMIENNYCH +C OZNACZAJA : +C 0 - BEZ KONWERSJI +C 1 - INTEGER DO REAL +C ----SYGNALIZOWANE BLEDY : +C 604 - TYP ARGUMENTU OPERACJI LUB RELACJI NIE JEST ARYTME- +C TYCZNY, +C 605 - TYP ARGUMENTU DIV LUB MOD NIE JEST INTEGER +C +C OPIS W DOKUMENTACJI: ?2.4 +C WERSJA Z DNIA: 19.01.82 +C DLUGOSC KODU: 295 +C............................................................................. +C + IMPLICIT INTEGER (A-Z) +C +C *CALL BLANKSEM +C..... +#include "blank.h" +C +C !!!!!! END OF SUBSTITUTION OF COMDECK BLANKSEM FROM LOGLAN.14 !! +C +C +C------ KONTROLA TYPU LEWEGO ARGUMENTU + TL = TLBAS + IF (TLDIM .NE. 0) GOTO 100 +C SKOK - GDY JEST TO TYP TABLICOWY + IF ((TLBAS .EQ. NRINT) .OR. (TLBAS .EQ. NRRE) .OR. + X (TLBAS .EQ. NRUNIV) ) GOTO 200 +C +C...... TYP LEWEJ STRONY NIE JEST ARYTMETYCZNY + 100 TL = NRUNIV + CALL MERR(604, IDL) +C +C------KONTROLA TYPU PRAWEJ STRONY + 200 TR = TRBAS + IF (TRDIM .NE. 0) GOTO 300 + IF ((TRBAS .EQ. NRINT) .OR. (TRBAS .EQ. NRRE) .OR. + X (TRBAS .EQ. NRUNIV) ) GOTO 400 +C +C......TYP PRAWEJ STRONY NIE JEST ARYTMETYCZNY + 300 TR = NRUNIV + CALL MERR(604, IDR) +C +C +C------ SPRAWDZENIE ZALEZNE OD RODZAJU OPERACJI, USTALENIE KONWERSJI + 400 IF (OP-2) 500, 600, 700 +C +C..... OP = 1 - OPERACJE +,-,* ORAZ RELACJE + 500 TRESLT = NRRE +C TYP REAL JEST SILNIEJSZY OD INTEGER. PRZYJMUJE WIEC, ZE JEST +C TO TYP WYNIKU. + IF (TL .EQ. TR) TRESLT = TL + IF ((TR .EQ. NRUNIV) .OR. (TL .EQ. NRUNIV)) TRESLT = NRUNIV +C TYP WYNIKU JEST JUZ USTALONY +C PODANIE INFORMACJI O KONWERSJI + CONVL = 0 + IF (TL .NE. TRESLT) CONVL = 1 + CONVR = 0 + IF (TR .NE. TRESLT) CONVR = 1 + RETURN +C +C..... OP = 2 - OPERACJE DIV I MOD + 600 TRESLT = NRINT + CONVL = 0 + CONVR = 0 +C SPRAWDZENIE, CZY TYPY ARGUMENTOW NIE SA REAL + IF (TL .EQ. NRRE) CALL MERR(605, IDL) + IF (TR .EQ. NRRE) CALL MERR(605, IDR) + RETURN +C +C...... OP = 3 - OPERACJA / +C WYNIK MUSI BYC TYPU REAL, ARGUMENTY PODLEGAJA EWENTUALNEJ +C KONWERSJI + 700 TRESLT = NRRE + CONVL = 0 + CONVR = 0 + IF (TL .EQ. NRINT) CONVL = 1 + IF (TR .EQ. NRINT) CONVR = 1 + RETURN + END +*DECK MLOCTP + LOGICAL FUNCTION MLOCTP (TP, PROT) +C-------------FUNKCJA SPRAWDZA, CZY TYP TP JEST LOKALNYM ATRYBUTEM +C PROTOTYPU PROT +C +C OPIS W DOKUMENTACJI: ?1.4.2 +C WERSJA Z DNIA: 19.01.82 +C DLUGOSC KODU: 107 +C............................................................................. +C + IMPLICIT INTEGER (A-Z) + LOGICAL BPREF +C +C *CALL BLANKSEM +C..... +#include "blank.h" +C +C !!!!!! END OF SUBSTITUTION OF COMDECK BLANKSEM FROM LOGLAN.14 !! + MLOCTP = .TRUE. +C + SLTP = IPMEM(TP - 1) +C SLTP - MIEJSCE DEKLARACJI TP + IF (SLTP .EQ. PROT) RETURN + MLOCTP = .FALSE. + IF ( IAND( IPMEM(SLTP), 15) .EQ. 1) RETURN +C POWROT Z WARTOSCIA .FALSE. O ILE SLTP NIE MOZE PREFIKSOWAC +C PROTOTYPU PROT + IF ( IPMEM(PROT) .EQ. 1) RETURN + IF ( IAND(ISHFT(IPMEM(PROT), -8), 7) .EQ. 7) RETURN +C --HANDLER + IF ( BPREF (PROT, IPMEM(SLTP - 6) ) ) MLOCTP = .TRUE. + RETURN + END +*DECK MAQUAB + INTEGER FUNCTION MAQUAB ( IDB ) +C-------------FUNKCJA BADA POPRAWNOSC KONSTRUKCJI QUA IDB . +C TLDIM I TLBAS OKRESLAJA TYP WYRAZENIA PRZED QUA. IDL JEST +C NAZWA TEGO WYRAZENIA UZYWANA PRZY SYGNALIZACJI BLEDOW. +C IDB JEST NAZWA ZE SCANNERA WYSTEPUJACA PO QUA . +C // WARTOSCIA FUNKCJI JEST PROTOTYP ODPOWIADAJACY IDB +C LUB NRUNIV W PRZYPADKU BLEDOW. +C NAZWA IDB JEST WYSZUKIWANA W OTOCZENIU PROTOTYPU +C AKTUALNEGO (P Z BLOKU /SEMANT/). +C ----SYGNALIZOWANE BLEDY +C 600 (Z PROCEDURY MIDENT) - NIEDOSTEPNY IDENTYFIKATOR IDB +C PODOBNIE 619 I 620 +C 615 - TYP PRZED QUA NIE JEST KLASA UOGOLNIONA ANI TYPEM +C FORMALNYM +C 616 - IDENTYFIKATOR PO QUA NIE JEST TYPEM +C 617 - IDENTYFIKATOR PO QUA NIE JEST TYPEM KLASOWYM +C 618 - TYP PO QUA NIE JEST W SEKWENCJI PREFIKSOWEJ Z TLBAS +C +C +C OPIS W DOKUMENTACJI: ?1.5.2 +C WERSJA Z DNIA: 19.01.82 +C DLUGOSC KODU: 238 +C............................................................................. + IMPLICIT INTEGER (A-Z) +C +C *CALL BLANKSEM +C..... +#include "blank.h" +C +C !!!!!! END OF SUBSTITUTION OF COMDECK BLANKSEM FROM LOGLAN.14 !! +C +C ODSZUKIWANIE IDENTYFIKATORA + MAQUAB = MIDENT (IDB) +C +C......SPRAWDZENIE, CZY IDB JEST TYPEM KLASOWYM + IGT = IAND ( IPMEM(MAQUAB), 15) + GOTO (1000, 100, 100, 2000, 100, 200, 100, 200, 200, 200, + X 200, 200, 200, 200), IGT +C +C ...IDB JEST KLASA LUB TYPEM SYSTEMOWYM - GDY TO TYP SYSTEMOWY +C TO BLAD + 100 IF ( (MAQUAB .NE. NRCOR) .AND. (MAQUAB .NE. NRPROC) ) + X GOTO 2000 +C SKOK - GDY JEST TO ZWYKLY TYP KLASOWY +C +C ...IDB NIE JEST TYPEM KLASOWYM + 200 CALL MERR(617, IDB) + MAQUAB = NRUNIV + GOTO 2000 +C +C ...IDB NIE JEST TYPEM + 1000 CALL MERR(616, IDB) + MAQUAB = NRUNIV +C +C......BADANIE TYPU PRZED QUA + 2000 IF (TLDIM .NE. 0) GOTO 3000 +C SKOK - GDY PRZED QUA TYP TABLICOWY + IGT = IAND( IPMEM(TLBAS), 15) + GOTO (3000, 2100, 2100, 4000, 2100, 2200, 2100, 3000, 3000, + X 3000, 3000, 3000, 3000, 3000), IGT +C +C ...PRZED QUA TYP KLASOWY LUB SYSTEMOWY + 2100 IF (MAQUAB .EQ. NRUNIV) RETURN + IF ( (TLBAS .EQ. NRCOR) .OR. (TLBAS .EQ. NRPROC) ) RETURN + IF (MPRFSQ (TLBAS, MAQUAB) .GE. 0) RETURN +C TU - GDY SEKWENCJE PREFIKSOWE TYPOW KLASOWYCH SA ROZLACZNE + CALL MERR(618, IDB) + MAQUAB = NRUNIV + RETURN +C +C ...TYP PRZED QUA JEST FORMALNY + 2200 RETURN +C +C ...TYP PRZED QUA NIE JEST ODPOWIEDNI + 3000 CALL MERR(615, IDL) + MAQUAB = NRUNIV + 4000 RETURN + END +*DECK MTHIS + INTEGER FUNCTION MTHIS (ID) +C-------------FUNKCJA BADA POPRAWNOSC KONSTRUKCJI THIS ID, GDZIE +C ID JEST NAZWA ZE SCANNERA. KONSTRUKCJA WYSTEPUJE W MODU- +C LE O PROTOTYPIE AKTUALNYM P (Z BLOKU /SEMANT/). +C // WARTOSCIA FUNKCJI JEST PROTOTYP ID +C W PRZYPADKU BLEDU - WARTOSCIA JEST PROTOTYP UNIWERSALNY. +C ----SYGNALIZOWANE BLEDY +C 600 (Z PROCEDURY MIDENT) - NIEDOSTEPNY IDENTYFIKATOR ID +C PODOBNIE 619 I 620 +C 612 - ID NIE WYSTEPUJE W SEKWENCJI PREFIKSOWEJ ZADNEGO +C MODULU OBEJMUJACEGO P +C 613 - ID NIE JEST NAZWA KLASY UOGOLNIONEJ +C 614 - ID NIE JEST NAZWA TYPU +C +C OPIS W DOKUMENTACJI: ?1.5.1 +C WERSJA Z DNIA: 19.01.82 +C DLUGOSC KODU: 182 +C............................................................................. +C + IMPLICIT INTEGER (A-Z) + LOGICAL BPREF +C +C *CALL BLANKSEM +C..... +#include "blank.h" +C +C !!!!!! END OF SUBSTITUTION OF COMDECK BLANKSEM FROM LOGLAN.14 !! +C +C + MTHIS = MIDENT (ID) + IF (MTHIS .EQ. NRUNIV) RETURN +C + IGT = IAND (IPMEM(MTHIS), 15) + GOTO (9000, 100, 100, 9000, 100, 8000, 100, 8000, 8000, + X 8000, 8000, 8000, 8000, 8000), IGT +C +C-----PRZYPADEK, GDY ID JEST NAZWA TYPU KLASOWEGO LUB SYSTEMOWEGO +C PRZEJSCIE PO SL-ACH W POSZUKIWANIU MODULU PREFIKSOWANEGO +C PRZEZ ID +C PROT - PROTOTYP BADANY + 100 PROT = P + NRPRF = IPMEM(MTHIS - 6) +C NRPRF - NUMER PROTOTYPU W SENSIE ZBIORU PREFIKSOW + 200 ZWORD = IPMEM(PROT) +C ZWORD - SLOWO ZEROWE PROTOTYPU PROT - DO KONTROLI, CZY NIE +C JEST TO BLOK ZWYKLY, W POZOSTALYCH PRZYPADKACH BADAMY WARUNEK +C PREFIKSOWANIA + IF (ZWORD .EQ. 1) GOTO 250 +C SKOK - OMIJA BLOK ZWYKLY + IF (IAND(ISHFT(ZWORD, -8), 7) .EQ. 7) GOTO 250 +C SKOK - OMIJA PROTOTYP HANDLERA + IF (BPREF(PROT, NRPRF) ) RETURN +C POWROT JESLI PROT JEST PREFIKSOWANY PRZEZ ID + 250 PROT = IPMEM(PROT-1) + IF (PROT .NE. NBLSYS) GOTO 200 +C ITEROWANIE - GDY NIE DOSZLISMY DO BLOKU SYSTEMOWEGO +C.....ID NIE WYSTAPILO W SEKWENCJI PREFIKSOWEJ + CALL MERR(612, ID) + MTHIS = NRUNIV + RETURN +C.....ID WYSTAPILO JAKO PREFIKS PROTOTYPU PROT +C +C-----ID NIE JEST NAZWA KLASY UOGOLNIONEJ + 8000 CALL MERR(613, ID) + MTHIS = NRUNIV + RETURN +C +C +C-----ID NIE JEST TYPEM + 9000 CALL MERR(614, ID) + MTHIS = NRUNIV + RETURN + END +*DECK MDOT + INTEGER FUNCTION MDOT(TDIM, TBAS, IDA, ID) +C-------------FUNKCJA BADAJACA POPRAWNOSC WYRAZENIA KROPKOWANEGO +C TDIM, TBAS - TYP WYRAZENIA PRZED KROPKA, +C IDA - IDENTYFIKATOR WYRAZENIA PRZED KROPKA (DO SYGNALIZA- +C CJI BLEDOW), +C ID - NAZWA ZE SCANNERA IDENTYFIKATORA PO KROPCE. +C JESLI ATRYBUT JEST DOSTEPNY - WARTOSCIA MDOT JEST JEGO +C OPIS. +C JESLI ATRYBUT JEST NIEDOSTEPNY (NIEZADEKLAROWANY LUB +C "CLOSE") - WARTOSCIA (PO ZASYGNALIZOWANIU BLEDU) JEST +C ATRYBUT UNIWERSALNY. JESLI ATRYBUT BYL NIEZADEKLAROWANY +C - JEST ON WPROWADZANY. +C ----SYGNALIZOWANE BLEDY +C 601 - BLEDNY TYP PRZED KROPKA (PRYMITYWNY, FORMALNY, +C SYSTEMOWY LUB TABLICOWY), +C 602 - IDENTYFIKATOR PO KROPCE JEST "CLOSE", HIDDEN LUB NIE JEST +C TAKEN, +C 603 - IDENTYFIKATOR PO KROPCE NIE JEST ZADEKLAROWANY, +C 611 - PO KROPCE WYSTEPUJE IDENTYFIKATOR STALEJ "CONST". +C 621 - PO KROPCE WYSTEPUJE IDENTYFIKATOR HIDDEN LUB SPOZA +C LISTY TAKEN +C +C OPIS W DOKUMENTACJI: ?1.6.1 +C WERSJA Z DNIA: 19.01.82 +C DLUGOSC KODU: 382 +C............................................................................. +C + IMPLICIT INTEGER (A-Z) + LOGICAL MINSCP +C FUNKCJA POMOCNICZA DO BADANIA, CZY JESTESMY W ZASIEGU DEKLARACJI +C +C *CALL BLANKSEM +C..... +#include "blank.h" +C +C !!!!!! END OF SUBSTITUTION OF COMDECK BLANKSEM FROM LOGLAN.14 !! +C *CALL MEM +C..... +C KOMUNIKACJA Z PROCEDURA MEMPRF + COMMON /MEM/ NM, NH +C !!!!!! END OF SUBSTITUTION OF COMDECK MEM FROM LOGLAN.14 !! +C +C + IF (TDIM .NE. 0) GOTO 1000 +C +C------ TU TYPY NIETABLICOWE + TP = IAND(IPMEM(TBAS), 15) +C TP - POLE T Z OPISU TYPU TBAS +C + GOTO (1000, 100, 100, 500, 400, 1000, 400, 1000, 1000, 1000, + X 1000, 1000, 1000, 1000, 1000), TP +C +C------ TYPY POSIADAJACE ATRYBUTY (TZN. TYPY KLASOWE) + 100 NM = ID + NH = IAND ( ISHFT(NM, -1), 7) + 1 + MDOT = MEMPRF (TBAS) + IF (MDOT .NE. 0) GOTO 200 +C------ TU - IDENTYFIKATOR NIEZADEKLAROWANY + CALL MERR(603, ID) + MDOT = INSERT(ID, IPMEM(TBAS+10), 0) + MDOT = NRUNIV + RETURN +C------ TU - GDY IDENTYFIKATOR WYSTEPUJE (LUB BYL DODEKLAROWANY) + 200 IF (IPMEM(MDOT+1) .EQ. 0) GOTO 220 +C SKOK - IDENTYFIKATOR JEST DOSTEPNY I NIE JEST CHRONIONY + IF ( IPMEM(MDOT+1) .EQ. 1 ) GOTO 300 +C SKOK - JESLI IDENTYFIKATOR JEST "CLOSE" + IF (IPMEM(MDOT+1) .EQ. 4) GOTO 250 +C SKOK - JESLI IDENTYFIKATOR JEST 'NOT TAKEN' +C ---TU IDENTYFIKATOR JEST 'HIDDEN' + IF (.NOT. OWN) GOTO 250 +C ---TERAZ NALEZY SPRAWDZIC, CZY IDENTYFIKATOR NIE BYL 'CLOSE' JUZ +C W PREFIKSIE + IF (IPMEM(TBAS+19) .EQ. 0) GOTO 210 +C ---TBAS JEST NIEPREFIKSOWANY + PRID = MEMPRF (TBAS+19) + IF (PRID .EQ. 0) GOTO 210 + IF (IPMEM(PRID+2) .NE. IPMEM(MDOT+2)) GOTO 210 +C ---IDENTYFIKATOR NIE BYL DEKLAROWANY W PREFIKSIE + IF (IPMEM(PRID+1) .EQ. 1) GOTO 250 +C ---SKOK - IDENTYFIKATOR BYL 'CLOSE' JUZ W PREFIKSIE +C---SPRAWDZENIE, CZY JESTESMY W ZASIEGU DEKLARACJI MODULU CHRONIACEGO ATRYBUT + 210 IF (.NOT. MINSCP(TBAS)) GOTO 250 + 220 MDOT = IPMEM(MDOT+2) + RETURN +C +C------ TU IDENTYFIKATORY "HIDDEN" LUB "NOT TAKEN" + 250 CALL MERR(621, ID) + IF (.NOT. OWN) NRE = INSERT(ID, IPMEM(TBAS+10), 0) + IF (OWN .AND. (IPMEM(MDOT+1) .LT. 4) ) GOTO 255 + IPMEM(MDOT+1) = 0 + IPMEM(MDOT+2) = NRUNIV + 255 MDOT = NRUNIV + RETURN +C +C +C------ TU IDENTYFIKATORY "CLOSE" LUB STALE "CONST" + 300 NRE = 602 + NM = IPMEM(MDOT+2) + IF (NM .EQ. NRUNIV) GOTO 350 +C --BADANIE, CZY TO STALA 'CONST' + NM = ISHFT( IPMEM(NM), -4) + NM = IAND(NM, 15) + IF (NM .NE. 8) GOTO 350 + NRE = 611 + GOTO 360 + 350 IF (.NOT. OWN) GOTO 360 + IF (MINSCP(TBAS)) GOTO 220 + 360 CALL MERR(NRE, ID) + IF (.NOT. OWN) NRE = INSERT(ID, IPMEM(TBAS+10), 0) + MDOT = NRUNIV + RETURN + +C +C------OBIEKTY COROUTINE LUB PROCESS + 400 IF ((TBAS .NE. NRCOR) .AND. (TBAS .NE. NRPROC)) GOTO 100 +C +C------NIEPOPRAWNY TYP PRZED KROPKA + 1000 CALL MERR(601, IDA) +C------ TYP PRZED KROPKA JEST UNIWERSALNY + 500 MDOT = NRUNIV + RETURN + END +*DECK MINSCP + LOGICAL FUNCTION MINSCP (T) +C-----------------FUNKCJA BADA,CZY PROTOTYP AKTUALNY JEST WEWENATRZ +C DEKLARACJI MODULU T, TZN. CZY T LEZY W LANCUCHU SL +C PROTOTYPU P +C +C.................................................................... +C + IMPLICIT INTEGER (A-Z) +C +C *CALL BLANKSEM +C..... +#include "blank.h" +C +C !!!!!! END OF SUBSTITUTION OF COMDECK BLANKSEM FROM LOGLAN.14 !! +C + MINSCP = .TRUE. + PR = P + 100 IF (PR .EQ. T) RETURN + IF (PR .EQ. NBLSYS) GOTO 200 + PR = IPMEM(PR-1) + GOTO 100 + 200 MINSCP = .FALSE. + RETURN + END +*DECK MPROTO + SUBROUTINE MPROTO +C---------------------------------PROCEDURA POMOCNICZA - OTWIERA POMOCNICZA +C STRUKTURE DANYCH PRZY WEJSCIU DO INSTRUKCJI NOWEGO +C PROTOTYPU +C +C............................................................................ +C + IMPLICIT INTEGER (A-Z) +C +C *CALL BLANKSEM +C..... +#include "blank.h" +C +C !!!!!! END OF SUBSTITUTION OF COMDECK BLANKSEM FROM LOGLAN.14 !! +*CALL MID + COMMON /MID/ PSTART, CHECKS +C +C + CHECKS = 0 + INSYS = .TRUE. + PSTART = MGETM(8,0) + INSYS = .FALSE. + RETURN + END +*DECK MPROTC + SUBROUTINE MPROTC +C---------------------------------PROCEDURA POMOCNICZA - ZAMYKA POMOCNICZA +C STRUKTURE DANYCH PRZY WYJSCIU Z PROTOTYPU +C +C........................................................................ +C + IMPLICIT INTEGER (A-Z) +C +C *CALL BLANKSEM +C..... +#include "blank.h" +C +C !!!!!! END OF SUBSTITUTION OF COMDECK BLANKSEM FROM LOGLAN.14 !! +*CALL MID + COMMON /MID/ PSTART, CHECKS +C +C + LPML = PSTART + RETURN + END +*DECK MIDENT + INTEGER FUNCTION MIDENT(ID) +C-------------------------------FUNKCJA WYSZUKUJE W PROTOTYPIE AKTUALNYM P +C I JEGO OTOTCZENIU NAZWE ID (HASH ZE SCANNERA). +C WYSZUKIWANIE ODBYWA SIE NAJPIERW W STRUKTURZE +C POMOCNICZEJ +C +C............................................................................. +C + IMPLICIT INTEGER (A-Z) +C +C *CALL BLANKSEM +C..... +#include "blank.h" +C +C !!!!!! END OF SUBSTITUTION OF COMDECK BLANKSEM FROM LOGLAN.14 !! +*CALL MID + COMMON /MID/ PSTART, CHECKS +C +C +C *****SZUKANIE NAZWY W LOKALNEJ STRUKTURZE DANYCH + MIDENT = MEMBER(ID, IPMEM(PSTART)) + IF (MIDENT .EQ. 0) GOTO 100 +C ----NAZWA ODNALEZIONA - NA PEWNO JEST POPRAWNA, NIE TRZEBA SYGNALIZOWAC +C ZADNYCH BLEDOW +C NALEZY JEDYNIE USTAWIC ZMIENNE INFORMUJACE O DOSTEPIE + OBJECT = IPMEM(MIDENT+1) + LOCAL = IPMEM(MIDENT+4) + MIDENT = IPMEM(MIDENT+2) + OWN = (LOCAL .LT. 0) + IF (OWN) LOCAL = -LOCAL-1 + RETURN +C ----NAZWA NIE ZOSTALA ODNALEZIONA - SZUKANIE PRZY POMOCY MIDB + 100 MIDENT = MIDB(ID) +C ----JESLI MOZEMY WSTAWIAC DO LISTY POMOCNICZEJ, TO WSTAWIAMY, WPP POWROT + IF ((LPML+5) .GT. LPMF) CHECKS = CHECKS+1 + IF (CHECKS .GT. 0) GOTO 200 + INSYS = .TRUE. + NADR = MGETM(5,0) + INSYS = .FALSE. + MIDENT = IPMEM(MIDENT+2) + IPMEM(NADR) = ID + IPMEM(NADR+1) = OBJECT + IPMEM(NADR+2) = MIDENT + IPMEM(NADR+4) = LOCAL + IF (OWN) IPMEM(NADR+4) = -(LOCAL+1) + NH = IAND(ISHFT(ID, -1), 7) + PSTART + IPMEM(NADR+3) = IPMEM(NH) + IPMEM(NH) = NADR + RETURN + 200 MIDENT = IPMEM(MIDENT+2) + RETURN + END +*DECK MIDB + INTEGER FUNCTION MIDB (ID) +C-------------FUNKCJA WYSZUKUJE W PROTOTYPIE AKTUALNYM P ( /SEMANT/) +C I JEGO OTOCZENIU NAZWE ID (HASH ZE SCANNERA). +C (.) JESLI NAZWA TA JEST DOSTEPNA, TO : +C -NADAJE ZMIENNEJ LOCAL WARTOSC +C WYSTAPIENIA IDENTYFIKATORA), +C -WARTOSCIA FUNKCJI JEST INDEKS OPISU TEGO IDENTYFIKA- +C TORA . +C (.) JESLI NAZWA NIE JEST DOSTEPNA LUB JEST NIEZADEKLAROWA- +C NA - DODEKLAROWUJE JA, SYGNALIZUJE BLAD I NADAJE WAR- +C TOSC ATRYBUTU UNIWERSALNEGO. +C ----SYGNALIZOWANE BLEDY: +C 600 - NIEZADEKLAROWANY (LUB NIEDOSTEPNY) IDENTYFIKATOR +C 619 - UZYCIE IDENTYFIKATORA HIDDEN +C 620 - UZYCIE IDENTYFIKATORA SPOZA LISTY TAKEN +C +C +C OPIS W DOKUMENTACJI: ?1.4.1 +C WERSJA Z DNIA: 19.01.82 +C DLUGOSC KODU: 155 +C............................................................................. + IMPLICIT INTEGER (A-Z) +C +C *CALL BLANKSEM +C..... +#include "blank.h" +C +C !!!!!! END OF SUBSTITUTION OF COMDECK BLANKSEM FROM LOGLAN.14 !! +C +C + MIDB = MEMSL (ID, P) +C MEMSL MA WARTOSC ZERO, JESLI NAZWA NIE ZOSTALA ODNALEZIONA +C LUB JEST INDEKSEM W LISCIE HASH-U. +C OWN MA WARTOSC .TRUE. - GDY IDENTYFIKATOR ZOSTAL ZNALEZIONY +C BEZPOREDNIOW PROTOTYPIE (A NIE JEGO PREFIKSIE) - MOZE BYC +C WTEDY HIDDEN . + IF (MIDB .EQ. 0) GOTO 1000 +C------TU PRZYPADEK NAZWY ODNALEZIONEJ +C...... SPRAWDZENIE DOSTEPNOSCI IDENTYFIKATORA + IF ( IPMEM(MIDB + 1) .GE. 4 ) GOTO 1200 +C IDENTYFIKATOR NIE JEST NA LISCIE TAKEN + IF ( (IPMEM(MIDB+1) .GE. 2) .AND. (.NOT. OWN) ) GOTO 1300 +C IDENTYFIKATOR JEST HIDDEN W KTORYMS Z PREFIKSOW + RETURN +C +C------TU PRZYPADEK NAZWY NIEODNALEZIONEJ + 1000 CALL MERR(600, ID) +C DODEKLAROWANIE NAZWY - ELEMENTU LISTY HASH-U + 1100 MIDB = INSERT(ID, IPMEM(P+10), 0) + LOCAL = 2 + RETURN +C +C...... SYGNALIZACJE BLEDOW DLA NIEDOSTEPNYCH ATRYBUTOW + 1200 CALL MERR(620, ID) + IF (.NOT. OWN) GOTO 1100 + IPMEM(MIDB+1) = 0 + IPMEM(MIDB+2) = NRUNIV + RETURN + 1300 CALL MERR(619, ID) + GOTO 1100 +C + END +*NEWDECK MEMSL + INTEGER FUNCTION MEMSL (NAME, IDPROT) +C-------------WYSZUKUJE NAZWE NAME W PROTOTYPIE IDENTYFIKOWANYM PRZEZ +C IDPROT ORAZ JEGO OTOCZENIU (PO SL-ACH). WARTOSCIA JEST +C ELEMENT LISTY HASH-U Z TA NAZWA LUB 0 - GDY TEJ NAZWY +C NIE BYLO. +C / JESLI NAZWA WYSTAPILA BEZPOSREDNIO W IDPROT LUB JEGO +C PREFIKSACH - WARTOSCIA +C ZMIENNEJ LOCAL Z BLOKU // JEST 2, WPP 0 LUB 1 +C / PO ODNALEZIENIU NAZWY ELEMENT PRZESUWANY NA POCZATEK +C LISTY HASH-U. +C / OWN MA WARTOSC .TRUE. JESLI NAZWA ODNALEZIONA JEST +C BEZPOSREDNIO W PROTOTYPIE A NIE W PREFIKSIE. +C TO ZNACZY TAM WYSTEPUJE W LISCIE - DO KONTROLI PROTEKCJI. +C /OBJECT - PROTOTYP OBIEKTU, W KTORYM ODNALEZIONO ATRYBUT O +C NAZWIE NAME +C +C OPIS W DOKUMENTACJI: B.III.2.4 +C WERSJA Z DNIA: 19.01.82 (MJL) +C DLUGOSC KODU: 117 +C....................................................................... +C + IMPLICIT INTEGER (A-Z) +C +C *CALL BLANK +C..... +#include "blank2.h" +C +C !!!!!! END OF SUBSTITUTION OF COMDECK BLANK FROM LOGLAN.14 !! +C *CALL MEM +C..... +C KOMUNIKACJA Z PROCEDURA MEMPRF + COMMON /MEM/ NM, NH +C !!!!!! END OF SUBSTITUTION OF COMDECK MEM FROM LOGLAN.14 !! +C + NM = NAME + NH = IAND( ISHFT(NAME, -1), 7) + 1 +C NH - WARTOSC FUNKCJI HASZUJACEJ DLA SZUKANEJ NAZWY +C + LOCAL = 2 + ISL = IDPROT +C ISL - IDENTYFIKATOR KOLEJNYCH PROTOTYPOW +C +C ***** +C +C WYSZUKUJEMY W PREFIKSACH PROTOTYPU ISL + 10 MEMSL = MEMPRF(ISL) + IF (MEMSL .NE. 0) GOTO 20 +C POWROT, GDY NAZWA JUZ ODNALEZIONA +C +C ..... NAZWA NIEODNALEZIONA W PROTOTYPIE ISL - POBRANIE NOWEGO PROTOTY- +C PU + IF (ISL .EQ. NBLSYS) GOTO 1000 +C SKOK - JESLI DOSZLISMY DO BLOKU SYSTEMOWEGO NIE ZNAJDUJAC +C NAZWY - BEDZIE TO POWROT + ISL = IPMEM(ISL-1) + LOCAL = 1 + GOTO 10 +C ***** +C .... NAZWA ODNALEZIONA + 20 IF (ISL .EQ. NBLUS) LOCAL = 0 + RETURN +C +C .... NAZWA NIEODNALEZIONA + 1000 MEMSL =0 + RETURN + END +*DECK MEMPRF + INTEGER FUNCTION MEMPRF ( IDPROT) +C-------------WYSZUKUJE NAZWE NM W PROTOTYPIE IDENTYFIKOWANYM PRZEZ +C IDPROT ORAZ JEGO PREFIKSACH. WARTOSCIA JEST +C ELEMENT LISTY HASH-U Z TA NAZWA LUB 0 - GDY TEJ NAZWY +C NIE BYLO. +C / JESLI NAZWA WYSTAPILA BEZPOSREDNIO W IDPROT WARTOSCIA +C / ZMIENNEJ OWN JEST .TRUE., JESLI W PREFIKSACH - .FALSE. +C //PO ODNALEZIENIU NAZWY ELEMENT PRZESUWANY NA POCZATEK +C LISTY HASH-U. +C OPIS W DOKUMENTACJI: B.III.2.3 +C WERSJA Z DNIA: 19.01.82 (MJL) +C DLUGOSC KODU: 261 +C....................................................................... +C +C + IMPLICIT INTEGER (A-Z) +C +C *CALL BLANK +C..... +#include "blank2.h" +C +C !!!!!! END OF SUBSTITUTION OF COMDECK BLANK FROM LOGLAN.14 !! +C *CALL MEM +C..... +C KOMUNIKACJA Z PROCEDURA MEMPRF + COMMON /MEM/ NM, NH +C !!!!!! END OF SUBSTITUTION OF COMDECK MEM FROM LOGLAN.14 !! +C +C + IPR = IDPROT + OBJECT = IDPROT + OWN = .TRUE. +C IPR - IDENTYFIKATOR KOLEJNYCH PROTOTYPOW +C + IF (IPMEM(IPR) .EQ. 1) GOTO 500 + IF (IAND( ISHFT(IPMEM(IPR), -4), 15) .NE. 0) GOTO 500 +C SKOK, GDY BYL TO ZWYKLY BLOK LUB PROTOTYP FORMALNY, NIE MA +C WTEDY PRZEJSCIA PO PREFIKSACH + IF (IAND(ISHFT(IPMEM(IPR), -8), 7) .EQ. 7) GOTO 500 +C SKOK - GDY BYL TO PROTOTYP HANDLERA, NIE MA PRZEJSCIA PO PREFIKSACH +C I,J - WSKAZNIKI PRZECHODZENIA PO LISCIE HASH-U - J AKTUALNY, +C I POPRZEDNI +C ***** + 10 J = IPR+ NH+ 9 + J = IPMEM(J) + I = -1 +C ..... SZUKANIE W PROTOTYPIE IPR + 20 IF (J.EQ.0) GOTO 25 +C SKOK - NAZWA NIEODNALEZIONA - POBIERAMY KOLEJNY PROTOTYP +C + IF (IPMEM(J).EQ. NM) GOTO 100 +C SKOK - NAZWA ODNALEZIONA +C + I =J + J = IPMEM (J+3) + GOTO 20 +C ..... +C NAZWA NIEODNALEZIONA W PREFIKSIE IPR - POBRANIE NOWEGO +C PREFIKSU +C + 25 OWN = .FALSE. +C PRZEJSCIE DO PREFIKSU + IPR = IPMEM(IPR+21) + IF (IPR .NE. 0) GOTO 10 + GOTO 1000 +C +C ***** +C +C ..... NAZWA ODNALEZIONA + 100 MEMPRF = J + OBJECT = IPMEM(J+2) +C MIEJSCE DEKLARACJI + OBJECT = IPMEM(OBJECT-1) + IF (I.NE.-1) GOTO 110 + RETURN +C PRZESUNIECIE ELEMENTU NA POCZATEK LISTY + 110 IPMEM(I+3) = IPMEM (J+3) + I = IPR+ NH + 9 + IPMEM(J+3) = IPMEM(I) + IPMEM(I) = J + RETURN +C +C.....BLOKI ZWYKLE, HANDLERY I PROTOTYPY FORMALNE + 500 MEMPRF = MEMBER(NM, IPMEM(IPR+10)) + RETURN +C +C +C .... NAZWA NIEODNALEZIONA + 1000 MEMPRF =0 + RETURN + END +*DECK INSERT + INTEGER FUNCTION INSERT (NAME, THASH, NROVF) +C-------------WPROWADZA NOWY ELEMENT O KLUCZU NAME DO TABLICY HASH-U +C THASH. DZIALA POPRAWNIE POD WARUNKIEM, ZE W TABLICY ELE- +C MENT TAKI JESZCZE NIE WYSTAPIL. +C WARTOSCIA INSERT JEST IDENTYFIKATOR TEGO ELEMENTU. +C / WARTOSCI POCZATKOWE UTWORZONEGO ELEMENTU +C POLE NAZWY - NAME +C BITY HIDDEN, CLOSE, NOT TAKEN - 0 +C IDENTYFIKATOR ATRYBUTU - NRUNIV +C / NROVF - NUMER SYGNALIZOWANEGO PRZEPELNIENIA +C +C OPIS W DOKUMENTACJI: B.III.2.1 +C WERSJA Z DNIA: 19.01.82 (MJL) +C DLUGOSC KODU: 95 +C....................................................................... +C + IMPLICIT INTEGER (A-Z) + INTEGER THASH(8) +C +C *CALL BLANK +C..... +#include "blank2.h" +C +C !!!!!! END OF SUBSTITUTION OF COMDECK BLANK FROM LOGLAN.14 !! +C +C ..... REZERWACJA PAMIECI NA ELEMENT LISTY HASH-U + INSERT = MGETM(4, NROVF) +C +C ..... NADANIE WARTOSCI POCZATKOWYCH I DOLACZENIE DO LISTY HASH-1 + IPMEM(INSERT) = NAME + IPMEM(INSERT +2) = NRUNIV + NH = IAND( ISHFT(NAME, -1), 7) + 1 + IPMEM(INSERT+3) = THASH (NH) + THASH(NH) = INSERT + RETURN + END +*DECK MEMBER + INTEGER FUNCTION MEMBER (NAME, THASH) +C-------------SPRAWDZA, CZY W TABLICY HASH-U THASH WYSTEPUJE NAZWA +C NAME. JESLI TAK - WARTOSCIA JEST IDENTYFIKATOR ELEMENTU +C LISTY HASH-U Z TA NAZWA. JESLI NIE - WARTOSCIA JEST 0 . +C / JESLI NAZWA WYSTAPILA - ELEMENT JEJ ODPOWIADAJACY JEST +C PRZESUWANY NA POCZATEK LISTY. +C +C OPIS W DOKUMENTACJI: B.III.2.2 +C WERSJA Z DNIA: 19.01.82 (MJL) +C DLUGOSC KODU: 155 +C...................................................................... +C + IMPLICIT INTEGER (A-Z) + INTEGER THASH (8) +C +C *CALL BLANK +C..... +#include "blank2.h" +C +C !!!!!! END OF SUBSTITUTION OF COMDECK BLANK FROM LOGLAN.14 !! + NH = IAND( ISHFT(NAME, -1), 7) + 1 +C NH - WARTOSC FUNKCJI HASZUJACEJ - INDEKS W TABLICY THASH SLOWA +C ZAWIERAJACEGO POCZATEK LISTY +C +C I,J - WSKAZNIKI PORUSZANIA SIE PO LISCIE +C J - WSKAZNIK AKTUALNY, I - POPRZEDNI + I=-1 + J = THASH(NH) +C + 10 IF (J.EQ.0) GOTO 200 +C SKOK - JESLI ATRYBUT NIE ZOSTAL ODNALEZIONY +C + IF (IPMEM(J) .EQ. NAME ) GOTO 100 +C SKOK - JESLI ATRYBUT ODNALEZIONY + I = J + J = IPMEM(J+3) + GOTO 10 +C +C ..... NAZWA ODNALEZIONA + 100 MEMBER = J + IF (I.NE. -1) GOTO 110 + RETURN +C PRZESUNIECIE ELEMENTU LISTY NA POCZATEK LISTY + 110 IPMEM(I+3) = IPMEM(J+3) + IPMEM(J+3) = THASH(NH) + THASH(NH) = J + RETURN +C +C ..... NAZWA NIEODNALEZIONA + 200 MEMBER = 0 + RETURN + END +*DECK MGETM + INTEGER FUNCTION MGETM(ISIZE, NROVF) +C-------------REZERWUJE W PAMIECI IPMEM ISIZE KOMOREK. WAROSCIA MGETM +C JEST INDEKS PIERWSZEJ Z TYCH KOMOREK. +C REZERWACJA JEST DOKONYWANA W CZESCI SYSTEMOWEJ JESLI WAR- +C TOSC ZMIENNEJ INSYS (BLOK //) JEST .TRUE., W PRZE- +C CIWNYM PRZYPADKU - W CZESCI UZYTKOWNIKA. +C /// GDY REZERWACJA TA NIE JEST MOZLIWA - WYWOLYWANA JEST +C PROCEDURA MDROP PRZERYWAJACA PROCES KOMPILACJI +C NROVF - NUMER SYGNALIZOWANEGO PRZEPELNIENIA +C +C OPIS W DOKUMENTACJI: B.III.1 +C WERSJA Z DNIA: 19.01.82 (MJL) +C DLUGOSC KODU: 145 +C........................................................................... +C +C ZAREZERWOWANA PAMIEC JEST WYZEROWANA +C + IMPLICIT INTEGER (A-Z) +C +C *CALL BLANK +C..... +#include "blank2.h" +C +C !!!!!! END OF SUBSTITUTION OF COMDECK BLANK FROM LOGLAN.14 !! +C + IF ( (LPML+ISIZE) .GT. LPMF) GOTO 1000 +C SKOK - GDY WOLNY OBSZAR JEST ZA MALY + IF (INSYS) GOTO 100 +C +C ..... PRZYDZIAL PAMIECI W CZESCI UZYTKOWNIKA + LPMF = LPMF - ISIZE + DO 50 I = 1, ISIZE + J = LPMF + I + IPMEM(J) = 0 + 50 CONTINUE + MGETM = LPMF + 1 + GOTO 500 +C +C ..... PRZYDZIAL PAMIECI W CZESCI SYSTEMOWEJ + 100 MGETM = LPML + DO 150 I = 1, ISIZE + J = LPML + I + IPMEM(J - 1) = 0 + 150 CONTINUE + LPML = LPML + ISIZE +C.....SPRAWDZENIE WYKORZYSTANIA PAMIECI + 500 X = LPMF-LPML + IF (X .LT. COM(4)) COM(4) = X + RETURN +C +C +C ..... BRAK MIEJSCA W PAMIECI + 1000 CALL MDROP(NROVF) +C + END +*DECK MPRFSQ + INTEGER FUNCTION MPRFSQ (IDPR1, IDPR2) +C-------------BADA RODZAJ PREFIKSOWANIA TYPOW IDPR1 I IDPR2 +C WARTOSCI +C -1 - ROZLACZNE SEKWENCJE PREFIKSOWE +C 0 - IDPR1 PREFIKSUJE IPR2 +C +1 - IDPR2 PREFIKSUJE IDPR1 +C OBA TYPY MOGA BYC TYPAMI UNIWERSALNYMI +C +C OPIS W DOKUMENTACJI: B.III.4.3 +C WERSJA Z DNIA: 19.01.82 (MJL) +C DLUGOSC KODU: 79 +C........................................................................ +C + IMPLICIT INTEGER (A-Z) + LOGICAL BPREF +C +C *CALL BLANK +C..... +#include "blank2.h" +C +C !!!!!! END OF SUBSTITUTION OF COMDECK BLANK FROM LOGLAN.14 !! +C + K1 = IPMEM(IDPR1-6) + K2 = IPMEM(IDPR2-6) +C K1,K2 - NUMERY TYPOW W SENSIE PREFIXSET + IF (BPREF(IDPR2, K1)) GOTO 20 + IF (BPREF(IDPR1, K2)) GOTO 30 +C +C ..... ROZLACZNE SEKWENCJE PREFIKSOWE + MPRFSQ = -1 + RETURN +C ..... IDPR1 PREFIKSUJE IDPR2 + 20 MPRFSQ = 0 + RETURN +C ..... IDPR2 PREFIKSUJE IDPR1 + 30 MPRFSQ = +1 + RETURN +C + END +*DECK BPREF + LOGICAL FUNCTION BPREF (IDPROT, NRPREF) +C-------------BPREF SPRAWDZA, CZY TYP IDENTYFIKOWANY PRZEZ IDPROT JEST +C PREFIKSOWANY PRZEZ KLASE, KTOREJ NUMER W SENSIE PREFIXSET +C JEST ROWNY NRPREF. +C WARTOSC .TRUE. - JEST PREFIKSOWANY +C +C +C OPIS W DOKUMENTACJI: B.III.4.1 +C WERSJA Z DNIA: 19.03.82 (MJL) +C DLUGOSC KODU: 255 +C......................................................................... +C + IMPLICIT INTEGER (A-Z) + LOGICAL BTEST +C +C *CALL BLANK +C..... +#include "blank2.h" +C +C !!!!!! END OF SUBSTITUTION OF COMDECK BLANK FROM LOGLAN.14 !! +C + IF (NRPREF .GT. 47) GOTO 300 + K=NRPREF/16 + IF ( IAND(IPMEM(IDPROT), 15) .NE. 1) GOTO 100 + BPREF = .FALSE. + IF (IPMEM(IDPROT+21) .EQ. 0 ) RETURN + K = IPMEM(IDPROT+21) -3-K + GOTO 200 + 100 K=IDPROT-3-K + 200 K=IPMEM(K) +C K SLOWO W PREFIXSET, W KTORYM NALEZY ZBADAC BIT ODPOWIADAJACY +C NRPREF +C + L=IAND(NRPREF,15) +C L - NUMER TESTOWANEGO BITU - L = IMOD(NRPREF,16) +C + BPREF = BTEST (K,L) + RETURN + 300 BPREF = .TRUE. + IPR = IDPROT + IF (IAND(IPMEM(IPR), 15) .EQ. 1) IPR = IPMEM(IPR+21) + IF (IPR .EQ. 0) GOTO 500 + IF (IPR .EQ. NRUNIV) RETURN + IDL = IPMEM(IPR+23) + IPR = IPMEM(IPR+22) + 400 PRFX= IPMEM(IPR) + IF (IPMEM(PRFX-6) .EQ. NRPREF) RETURN + IDL = IDL-1 + IPR = IPR+1 + IF (IDL .NE. 0) GOTO 400 + 500 BPREF = .FALSE. + RETURN + END + + SUBROUTINE MDROP(NROVFL) +C-------------PROCEDURA PRZERYWA DZIALANIE MODULU. +C WYWOLYWANA JEST W PRZYPADKU PRZEPELNIEN JAKIEJKOLWIEK TAB- +C LICY KOMPILATORA. +C NROVFL - NUMER PRZEPELNIENIA (INFORMACJA O TABLICY) +C //WYWOLUJE PROCEDURE MERR , BUFORY STRUMIENI PRZESYLA DO +C OBSZARU KOMUNIKACYJNEGO W BLOKU //. +C USTAWIA FLAGE "DROPOWANIA". +C +C OPIS W DOKUMENTACJI: B.I.2 +C WERSJA Z DNIA: 19.01.82 (MJL) +C DLUGOSC KODU: 101 +C...................................................................... +C + IMPLICIT INTEGER (A-Z) +C +C..... +#include "blank3.h" + LOGICAL ERRFLG +C + COMMON /STREAM/ ERRFLG, LINE, IBUF2(265), IBUF3(7),JUNK(260) +C ERRFLG - FLAGA BLEDOW +C +C SYGNALIZOWANIE BLEDU + LINE = 9999 + CALL MERR(NROVFL, 0) +C + DROPFG = .TRUE. +C ERRFG = .TRUE. + IOP(1) = IOP(1)+7 + CALL MESS + CALL ML2 + RETURN + END + + SUBROUTINE MERR(NRE, ID) +C--------------PROCEDURA WPISUJACA SYGNALIZACJE BLEDOW NA STRUMIEN 2 +C NRE - NUMER BLEDU +C ID - IDENTYFIKACJA BLEDU, TO ZNACZY +C -IDENTYFIKATOR ZE SCANNERA, +C -ZANEGOWANY ZNAK W PRAWYM BAJCIE, +C -ZERO OZNACZAJACE BRAK IDENTYFIKATORA. +C //PROCEDURA W RAZIE POTRZEBY NISZCZY DOTYCHCZASOWY +C ZAPIS ZNAJDUJACY SIE NA STRUMIENIU SO (KOD DLA ASSEMBLERA) +C ORAZ USTAWIA FLAGE BLEDOW ERRFLG. +C +C OPIS W DOKUMENTACJI: B.I.1 +C WERSJA Z DNIA: 19.01.82 (MJL) +C DLUGOSC KODU: 146 +C................................................................. +C + IMPLICIT INTEGER (A-Z) +C +C *CALL STREAM + LOGICAL ERRFLG + COMMON /STREAM/ ERRFLG, LINE, IBUF2(265), IBUF3(7),JUNK(260) +C ERRFLG - FLAGA BLEDOW +C !!!!!! END OF SUBSTITUTION OF COMDECK STREAM FROM LOGLAN.14 !! +C *CALL MJLMSG + COMMON /MJLMSG/ IERC, MSG +C !!!!!! END OF SUBSTITUTION OF COMDECK MJLMSG FROM LOGLAN.14 !! + +cdeb --------------------- added =---------------- + common /debug/deb,breakt(500),brnr,maxbr + logical deb +cdeb --------------------------------------- +C +C +C----- ZBADANIE, CZY JEST TO PIERWSZY SYGNALIZOWANY BLAD + IF (ERRFLG) GOTO 100 + +C..... PRZYPADEK, GDY BLAD JEST SYGNALIZOWANY PO RAZ PIERWSZY + ERRFLG = .TRUE. +C --- L-CODE WRITTEN DIRECTLY IN THE SIEMENS VERSION +C --- IN THE SIEMENS VERSION OF THE COMPILER IBUF2 IS USED ONLY +C --- TO LOCATE THERE INFORMATION ABOUT ERRORS. SO NOW IT IS THE +C --- PROPER TIME TO OPEN IT +cdeb + deb = .false. +cdeb + +c --- unit 19 (ibuf2) - do bledow (direct) + CALL OPENF(IBUF2,19) +C OD TEJ PORY BUFOR ZACZYNA ODPOWIADAC STRUMIENIOWI O DOSTEPIE +C BEZPOSREDNIM . JEGO BUDOWA: +C SLOWA 1-7 -BUFOR DLA PROCEDUR ZAPISU I ODCZYTU (OPIS STRUMIENIA) +C SLOWO 8 -NUMER AKTUALNIE ZAPISYWANEGO BLOKU +C SLOWO 9 -INDEKS PIERWSZEJ WOLNEJ POZYCJI BLOKU AKTUALNIE TWORZO- +C NEGO +C SLOWO 10 -LICZBA TROJEK WPISANYCH DO BLOKU +C SLOWA 10-265 -AKTUALNIE TWORZONY BLOK (TROJKI ZAPISYWANE OD SLO- +C WA 11) +C + IBUF2(8) = 0 + IBUF2(9) = 11 +C +C-----WPISANIE SYGNALIZACJI BLEDU + 100 IERC = IERC+1 + POZ = IBUF2(9) +C POZ - AKTUALNA POZYCJA DO WYPELNIENIA +C ZAPISANIE NUMERU LINII, NUMERU BLEDU I IDENTYFIKACJI + IBUF2(POZ) = LINE + IBUF2(POZ+1) = NRE + IBUF2(POZ+2) = ID +C MODYFIKACJA BUFORA + POZ = POZ+3 + IBUF2(9) = POZ + IF (POZ .LE. 263) RETURN +C ..... JESLI BLOK ZOSTAL ZAPELNIONY, ZAPISANIE GO NA DYSK + IBUF2(8) = IBUF2(8) + 1 + IBUF2(9) = 11 + IBUF2(10) = 85 + CALL PUT(IBUF2, IBUF2(10)) + RETURN + END + + SUBROUTINE MADATR (IDATR, IDPROT, NROVF) +C-------------WPROWADZA ATRYBUT O IDENTYFIKATORZE IDATR DO LISTY ATRYBU- +C TOW PROTOTYPU IDPROT. W OPISIE ATRYBUTU NADAJE WARTOSC +C POLOM DECLPLACE/SL ORAZ NUMERU ATRYBUTU +C // NROVF - NUMER SYGNALIZOWANEGO PRZEPELNIENIA +C +C OPIS W DOKUMENTACJI: B.III.3 +C WERSJA Z DNIA: 19.01.82 (MJL) +C DLUGOSC KODU: 99 +C......................................................................... +C + IMPLICIT INTEGER (A-Z) +C +C *CALL BLANK +C..... +#include "blank2.h" +C +C !!!!!! END OF SUBSTITUTION OF COMDECK BLANK FROM LOGLAN.14 !! +C + IACT = MGETM(2, NROVF) + IPMEM(IACT) = IDATR + IOST = IPMEM(IDPROT+7) +C IOST - OSTATNI ELEMENT LISTY ATRYBUTOW +C ..... DOLACZENIE IACT DO LISTY ATRYBUTOW + IPMEM(IOST+1) = IACT + IPMEM(IDPROT+7) = IACT +C ..... NADANIE WARTOSCI SL ORAZ NUMERU ATRYBUTU + IOST = IPMEM(IOST) +C IOST - OSTATNI ATRYBUT - INDEKS OPISU + IPMEM(IDATR-1) = IDPROT + IPMEM(IDATR-2) = IPMEM(IOST-2) + 1 + RETURN + END + SUBROUTINE MSETB (IDPROT, NRPREF) +C-------------W ZBIORZE PREFIXSET TYPU IDENTYFIKOWANEGO PRZEZ IDPROT +C USTAWIA BIT NRPREF NA 1 +C +C OPIS W DOKUMENTACJI: B.III.4.2 +C WERSJA Z DNIA: 19.03.82 (MJL) +C DLUGOSC KODU: 87 +C....................................................................... +C + IMPLICIT INTEGER (A-Z) +C +C *CALL BLANK +C..... +#include "blank2.h" +C +C !!!!!! END OF SUBSTITUTION OF COMDECK BLANK FROM LOGLAN.14 !! +C + IF (NRPREF .GT. 47) RETURN + K= NRPREF/16 + K= IDPROT-3-K +C K - INDEKS MODYFIKOWANEGO ELEMENTU PREFIXSET +C + L= IAND(NRPREF,15) +C L - NUMER ZAPALANEGO BITU + L= ISHFT(1,L) +C + IPMEM(K) = IOR ( IPMEM(K), L) + RETURN + END + diff --git a/sources/pass1/blank.doc b/sources/pass1/blank.doc new file mode 100644 index 0000000..8695f23 --- /dev/null +++ b/sources/pass1/blank.doc @@ -0,0 +1,60 @@ +C Loglan82 Compiler&Interpreter +C Copyright (C) 1981-1993 Institute of Informatics, University of Warsaw +C Copyright (C) 1993, 1994 LITA, Pau +C +C This program is free software; you can redistribute it and/or modify +C it under the terms of the GNU General Public License as published by +C the Free Software Foundation; either version 2 of the License, or +C (at your option) any later version. +C +C This program is distributed in the hope that it will be useful, +C but WITHOUT ANY WARRANTY; without even the implied warranty of +C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +C GNU General Public License for more details. File: LICENSE.GNU +C =============================================================== + +c + COMMON /BLANK/ COM(278), + X LMEM , LPMEM , IRECN , ISFIN , LPMSYS, LPML , LPMF , + X NRINT , NRRE , NRBOOL, NRCHR , NRCOR , NRPROC, NRTEXT, + X NRUNIV, NATTR , NRNONE, NBLSYS, NBLUS , NEMPTY, INSYS , + X LOCAL , OWN , OBJECT, + X IPMEM(5000) +C +C COM - OBSZAR KOMUNIKACYJNY STRUMIENI +C LMEM - (=5000) ROZMIAR CALEJ PAMIECI GLOWNEJ +C LPMEM - PODZIAL PAMIECI NA CZESCI IPMEM I ISMEM +C IRECN - INDEKS SZCZYTU STOSU STALYCH REAL +C ISFIN - INDEKS SZCZYTU SLOWNIKA PROTOTYPOW +C +C LPMSYS - INDEKS PIERWSZEGO SLOWA W IPMEM OBSZARU NIEPRZEZ- +C NACZONEGO NA PROTOTYPY SYSTEMOWE +C LPML - INDEKS PIERWSZEGO SLOWA OBSZARU WOLNEGO W IPMEM +C LPMF - INDEKS OSTATNIEGO SLOWA WOLNEGO OBSZARU W IPMEM +C +C IDENTYFIKATORY PROTOTYPOW SYSTEMOWYCH +C NRINT - IDENTYFIKATOR PROTOTYPU INTEGER +C NRRE - REAL +C NRBOOL - BOOLEAN +C NRCHR - CHARACTER +C NRCOR - COROUTINE +C NRPROC - PROCESS +C NRTEXT - STRING (TEXT) +C NRUNIV - IDENTYFIKATOR PROTOTYPU UNIWERSALNEGO +C NATTR - IDENTYFIKATOR PSEUDO-ATRYBUTU (Z NUMEREM -1) +C NRNONE - IDENTYFIKATOR PROTOTYPU TYPU NONE (UNIWERSALNY +C REFERENCYJNY) +C NBLSYS - IDENTYFIKATOR BLOKU SYSTEMOWEGO +C NBLUS - BLOKU GLOWNEGO UZYTKOWNIKA +C +C INSYS - FLAGA SPOSOBU REZERWACJI (PRZEZ MGETM) PAMIECI +C W IPMEM - .TRUE. JESLI REZERWACJA W CZESCI SYSTE- +C MOWEJ +C LOCAL - FLAGA DOSTEPU DO OBIEKTOW - 2 JESLI OBIEKT +C BYL LOKALNY, 1 - GDY Z SL, 0 - GDY Z BLOKU GLOWNEGO +C OWN - FLAGA DOSTEPU DO OBIEKTOW - .TRUE. JESLI OBIEKT NIE +C POCHODZI Z PREFIKSOW (TYLKO Z WLASCIWEGO OBIEKTU) +C OBJECT - PROTOTYP OBIEKTU, Z KTOREGO POCHODZIL OSTATNIO +C SZUKANY IDENTYFIKATOR (OBIEKT POCHODZACY Z CIAGU SL) +C + diff --git a/sources/pass1/blank.h b/sources/pass1/blank.h new file mode 100644 index 0000000..5db1c28 --- /dev/null +++ b/sources/pass1/blank.h @@ -0,0 +1,35 @@ +C Loglan82 Compiler&Interpreter +C Copyright (C) 1981-1993 Institute of Informatics, University of Warsaw +C Copyright (C) 1993, 1994 LITA, Pau +C +C This program is free software; you can redistribute it and/or modify +C it under the terms of the GNU General Public License as published by +C the Free Software Foundation; either version 2 of the License, or +C (at your option) any later version. +C +C This program is distributed in the hope that it will be useful, +C but WITHOUT ANY WARRANTY; without even the implied warranty of +C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +C GNU General Public License for more details. File: LICENSE.GNU +C =============================================================== + +C + LOGICAL INSYS, OWN + COMMON /BLANK/ IOP(4), + X P, + X TLDIM, TLBAS, IDL, OBJL, + X TRDIM, TRBAS, IDR, OBJR, + X TRESLT, + X CONVL, CONVR, + X NRPAR, + X IX (261), + X LMEM , LPMEM , IRECN , ISFIN , LPMSYS, LPML , LPMF , + X NRINT , NRRE , NRBOOL, NRCHR , NRCOR , NRPROC, NRTEXT, + X NRUNIV, NATTR , NRNONE, NBLSYS, NBLUS , NEMPTY, INSYS , + X LOCAL, OWN, OBJECT, + X IPMEM(5000) + REAL STALER(100) + INTEGER STACK(5000) + EQUIVALENCE(STALER(1),IPMEM(1)) + EQUIVALENCE(STACK(1),IPMEM(1)) + diff --git a/sources/pass1/blank2.h b/sources/pass1/blank2.h new file mode 100644 index 0000000..5a370f1 --- /dev/null +++ b/sources/pass1/blank2.h @@ -0,0 +1,23 @@ +C Loglan82 Compiler&Interpreter +C Copyright (C) 1981-1993 Institute of Informatics, University of Warsaw +C Copyright (C) 1993, 1994 LITA, Pau +C +C This program is free software; you can redistribute it and/or modify +C it under the terms of the GNU General Public License as published by +C the Free Software Foundation; either version 2 of the License, or +C (at your option) any later version. +C +C This program is distributed in the hope that it will be useful, +C but WITHOUT ANY WARRANTY; without even the implied warranty of +C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +C GNU General Public License for more details. File: LICENSE.GNU +C =============================================================== + + LOGICAL INSYS, OWN + COMMON /BLANK/ COM(278), + X LMEM , LPMEM , IRECN , ISFIN , LPMSYS, LPML , LPMF , + X NRINT , NRRE , NRBOOL, NRCHR , NRCOR , NRPROC, NRTEXT, + X NRUNIV, NATTR , NRNONE, NBLSYS, NBLUS , NEMPTY, INSYS , + X LOCAL , OWN , OBJECT, + X IPMEM(5000) + diff --git a/sources/pass1/blank3.h b/sources/pass1/blank3.h new file mode 100644 index 0000000..25fd989 --- /dev/null +++ b/sources/pass1/blank3.h @@ -0,0 +1,20 @@ +C Loglan82 Compiler&Interpreter +C Copyright (C) 1981-1993 Institute of Informatics, University of Warsaw +C Copyright (C) 1993, 1994 LITA, Pau +C +C This program is free software; you can redistribute it and/or modify +C it under the terms of the GNU General Public License as published by +C the Free Software Foundation; either version 2 of the License, or +C (at your option) any later version. +C +C This program is distributed in the hope that it will be useful, +C but WITHOUT ANY WARRANTY; without even the implied warranty of +C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +C GNU General Public License for more details. File: LICENSE.GNU +C =============================================================== + + LOGICAL ERRFG, DROPFG + COMMON /BLANK/ IOP(4), + X ERRFG, DROPFG, ISBUF2(265), ISBUF3(7), + X IX(5024) + diff --git a/sources/pass1/debug.f b/sources/pass1/debug.f new file mode 100644 index 0000000..3c521b3 --- /dev/null +++ b/sources/pass1/debug.f @@ -0,0 +1,494 @@ +C Loglan82 Compiler&Interpreter +C Copyright (C) 1981-1993 Institute of Informatics, University of Warsaw +C Copyright (C) 1993, 1994 LITA, Pau +C +C This program is free software; you can redistribute it and/or modify +C it under the terms of the GNU General Public License as published by +C the Free Software Foundation; either version 2 of the License, or +C (at your option) any later version. +C +C This program is distributed in the hope that it will be useful, +C but WITHOUT ANY WARRANTY; without even the implied warranty of +C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +C GNU General Public License for more details. File: LICENSE.GNU +C =============================================================== + + subroutine ts1 + implicit integer(a-z) +c wolana po it1 +c wpisuje do tablicy prs nazwe i numer linii prototypu +c prs(2*i-1) = nazwa, prs(2*i) = numer linii prototypu i +c prototypy liczone od isfin do lpmem + common /debpr/ prs(600) + common /BLANK/ com(278), + x lmem,lpmem,irecn,isfin, + x com1(20), + x mem(5000) + + do 100 i=isfin,lpmem + k = mem(i) + p = mem(k) +c k - adres slowa zerowego prototypu o numerze i + j = i-isfin+1 +c nazwa + prs(2*j-1) = -100 +c blok i handler nie maja nazwy + if(p.ne.1.and.p.ne.8) prs(2*j-1) = mem(k+10) +c numer linii + prs(2*j) = mem(k+9) +100 continue + call dsw + return + end + + subroutine TS2 + implicit integer(a-z) +c przebieg wolany po DSW +c wypelnia prototypy debuggera prawie do konca +c DISPNR(3) i dla zmiennych OFFSET (3) = adres prototypu kompilacjnego +c +c ----------------------------------------------------- +c BUDOWA PROTOTYPOW +c +c -1 nazwa modulu ( hash ze scannera) +c 0 case +c 1 SL - numer prot. debuggera w IDICT +c 2 numer linii z poczatkien definicji +c 3 dispnr +c 4 prefiks - numer prot. debuggera w IDICT +c 5 mala tablica hash nazw atrybutow +c . (jak w DSW) +c 12 +c 13 elementy listy hash i prototypy zmiennych +c . i stalych +c . +c ---------------------------------------------------- +c +c ZMIENNA +c +c 0 case +c 1 liczba array of +c 2 typ - numer prototypu debuggera w IDICT +c 3 offset +c 4 SL - numer prototypu debuggera w IDICT +c +c UWAGA: typ: typ formalny = -10, typ prymitywny = -typ kompilacyjny +c typ uniwersalny = 0, typ process/coroutine = -typ komp. +c +c --------------------------------------------------- +c +c STALA +c +c 0 case +c 1 typ - numer prototypu ( dla typu prymitywnego = -typ komp.) +c 2 adres stalej w tablicy stalych +c +c UWAGA: procedura, funkcja i typ formalny nie maja prototypow, ale +c wystepuja w tablicy hash (malej) +c +c -------------------------------------------------- +c +c CASE: 1 - block, 2 - klasa, 3 - procedura, 4 - funkcja +c 5 - zmienna +c 7 - funkcja form., 8 - proc. form, +c 9 - stala +c 10 - process, 11 - coroutina, 12 - rekord +c 14 - handler, 15 - sygnal +c +c -------------------------------------------------- +c +c ELEMENT LISTY HASH +c +c 0 nazwa ze scannera +c 1 NT/H/C - 3 bity +c 2 numer prototypu debuggera: dla unitow - w IDICT, dla zmiennych +c i stalych = -adres bezp. protrotypu +c proc/fun/typ formalny = -7,-8,-10 +c +c ---------------------------------------------------- + +c------------------------------------------------------- +c budowa pliku 21: +c hash(8000), idict(500), ind,prot(ind) +c------------------------------------------------------- + + common /BLANK/ com(8000) + call deb2 + call AL1 + return + end + + subroutine deb2 +c glowna procedura tworzaca prototypy debuggera + implicit integer (a-z) + logical btest + common /BLANK/ com(278), + x lmem,lpmem,irecn,isfin, + x com2(7), + x nrcor, nrproc, + x com3(5), + x nblus, + x com1(5), + x mem(8000) + + common /pr/ prot(5000),ind +c prot - tablica na prototypy debuggera +c ind - ostatnie zajete miejsce w tablicy + + common/debpr/prs(600) +c prs zawiera nazwy i numery linii kolejnych prototypow +c prs(2*i-1) = nazwa, prs(2*i) = nr. linii prot. i-tego +c prototypy liczone sa od isfin do lpmem + + dimension idict(500),chang(500) +cps dimension idict(300),chang(300) +c idict(i) - adres w prot prototypu o numerze disp. i-1 +c chang(i) - numer z parsera prototypu o numerze w idict=i + + data idict/500*0/ +cps data idict/300*0/ + +c curr - pierwsze wolne miejsce w tablicy prot +c zw - miejsce slowa zerowego biezacego prototypu + + ind = 0 + curr = 1 +c przepelnienie ? + if(lpmem-isfin+1 .gt. 500) call mdrop(199) +cps if(lpmem-isfin+1 .gt. 300) call mdrop(199) + +c------- budowa tablicy chang + p = nblus + i = 1 +10 continue + k = mem(p) +c pomijamy formalne i sygnaly + if(btest(k,4).or.btest(k,5)) go to 11 + if(btest(k,7)) go to 11 + chang(i) = findnr(p) + i = i+1 + 11 p = mem(p+2) + if(p.ne.0) go to 10 +c----------- + + k = nblus + i = 1 +c----------- glowna petla +5000 continue +c k - adres slowa zerowego prototypu kompilacyjnego + call zerow(k,case1) +c sygnal nie ma prototypu + if(case1.eq.15) go to 5001 +c formalne tez nie maja prototypow + if(case1.eq.7.or.case1.eq.8.or.case1.eq.-10) go to 5001 + zw = curr+1 + idict(i) = zw + call getm(4) +c wypelnienie pierwszych 4-ech slow opisu +c nazwa + j = chang(i) + prot(curr) = prs(2*j-1) +c case + prot(zw) = case1 +c SL + p = mem(k-1) + prot(zw+1) = findsc(p)-1 +c numer linii + prot(zw+2) = prs(2*j) + call getm(10) + curr = curr+14 + if(case1.eq.14) go to 12 +c handler nie ma prefiksu + id = mem(k+21) + j = findsc(id) + if(j.eq.0) go to 12 + prot(zw+4) = j-1 + 12 prot(zw+3) = k +c k - ident. opisu wstawiany w miejsce przyszlego dispnr +c wypelniamy tablice hash'u +c curr - teraz bedzie oznaczlo pierwsze wolne miejsce do tworzenia +c elementow listy + + curr1 = curr + do 101 j=5,12 + prot(zw+j) = curr + t = k+j+5 + l = mem(t) + 102 if(l.eq.0) go to 151 +c miejsce na element listy + curr = curr+3 + call getm(3) + l = mem(l+3) + go to 102 + 151 call getm(1) + curr = curr+1 + 101 continue + +c teraz beda wypelniane elementy listy i tworzone nowe prototypy +c curr - pierwsze wolne miejsce do tworzenia prototypow +c curr1 - wskaznik do chodzenia po elementach listy + + do 100 j=5,12 + t = k+j+5 + l = mem(t) + 30 if(l.eq.0) go to 150 +c l - poiter do nastepnego elementu listy +c element listy hash'u +c nazwa ze scannera + prot(curr1) = mem(l) +c NT/H/C + prot(curr1+1) = mem(l+1) + id = mem(l+2) +c id opisu w ipmem + call zerow(id,case) + if(case.eq.7.or.case.eq.8.or.case.eq.-10.or.case.eq.15) goto 250 + if(case.eq.5) go to 200 + if(case.eq.9) go to 400 + +c unit - nie bedzie nowego opisu + prot(curr1+2) = findsc(id)-1 + go to 90 + +c zmienna + 200 t = mem(l+1) + if(btest(t,2)) go to 300 +c nowy opis zmiennej + prot(curr1+2) = -curr +c adres bezposredni prototypu debuggera + call getm(5) +c wpisanie numeru opisu do mem(l+1) + mem(l+1) = curr*8 +c case + prot(curr) = case + prot(curr+1) = mem(id-4) +c process/ coroutine systemowe ? + p = mem(id-3) + t = -p + if(p.eq.nrproc.or.p.eq.nrcor) go to 240 + call zerow(p,t) + if(t.ne.2.and.t.lt.10) go to 240 +c typ klasowy - nie prymitywny i nie formalny + t = findsc(mem(id-3))-1 + 240 prot(curr+2) = t +c id prototypu w ipmem zamiast offsetu + prot(curr+3) = id +c sl + prot(curr+4) = findsc(mem(id-1))-1 + curr = curr+5 + go to 90 +c zmienna not taken +300 t = ishft(t,-8) + prot(curr1+2) = -t + go to 90 + +c stala - nowy opis + 400 call getm(3) + prot(curr1+2) = -curr +c -adres bezposredni prototypu debuggera + prot(curr) = case +c typ prymitywny + call zerow(mem(id-3),t) + prot(curr+1) = t +c ident. stalej w tablicy stalych + prot(curr+2) = mem(id-1) + curr = curr+3 + go to 90 + +c proc/fun/typ formalne - nie ma prototypu + 250 if(case.ne.-10) case = -case + prot(curr1+2) = case + +c nastepny element listy + 90 curr1 = curr1+3 + l = mem(l+3) + go to 30 +c straznik + 150 curr1 = curr1+1 + 100 continue + + i = i+1 +5001 continue + k = mem(k+2) + if(k.ne.0) go to 5000 +c-------------------- koniec wypelniania prototypow + +c skasowanie zapamietanej uprzednio w MEM informacji dla zmiennych + + id = X'0007' + do 111 i = isfin, lpmem + k = mem(i) + do 112 j = 1,8 + t = k+j+9 + l = mem(t) + 110 if(l.eq.0) go to 112 +c wyzerowanie bitow 3-15 + mem(l+1) = iand(mem(l+1),id) + l = mem(l+3) + go to 110 + 112 continue + 111 continue + +c wypisanie idict + call out(idict,500) +cps call out(idict,300) +c wypisanie ind - ostatnie zajete miejsce w prot + call out(ind,1) +c wypisanie prot do miejsca ind + call out(prot,ind) + return + end + + subroutine getm(n) + implicit integer(a-z) + common /pr/ prot(5000), ind +c sprawdza, czy jest jeszcze miejsce w PROT +c ind - ostatnie zajete + ind = ind+n + if(ind.le.5000) return +c przepelnienie - za duzo prototypow + call mdrop(41) + return + end + + subroutine out(tab,n) + implicit integer(a-z) + dimension tab(n) + call ffwrite_ints(21, tab, n) + return + end + + subroutine zerow(kk,id) + implicit integer(a-z) + logical btest + common /BLANK/ com(302), mem(6890) +c odkodowuje slowo zerowe o adresie kk, wynik na id (case) +c dla typow prymitywnych wynik = -kk +c dlA typu uniwersalnego wynik = 0 + + k = mem(kk) +c uniwersalny ? + if(k.eq.4) go to 300 +c prymitywny ? + if(btest(k,3)) go to 5 + if(btest(k,1).and..not.btest(k,2)) go to 10 + if(btest(k,2).and..not.btest(k,1).and..not.btest(k,0)) go to 100 + if(btest(k,2).and.btest(k,0).and..not.btest(k,1)) go to 30 + if(btest(k,1).and.btest(k,2).and.btest(k,0)) go to 40 + if(btest(k,2).and.btest(k,1).and..not.btest(k,0)) go to 90 + if(.not.btest(k,2).and..not.btest(k,1).and.btest(k,0)) go to 100 + +c typ prymitywny +5 id = -kk + return +c klasa lub rekord + 10 id = 12 + if(btest(k,0)) id = 2 + return +c process + 30 id = 10 + return +c coroutine + 40 id = 11 + return +c typ formalny + 90 id = -10 + return +c stala + 150 id = 9 + return +c zmienna + 140 id = 5 + return +c block + 160 id = 1 + return +c funkcja formalna + 110 id = 7 + return +c proc. formalna + 120 id = 8 + return +c funkcja + 170 id = 4 + return +c procedura + 180 id = 3 + return +c handler + 190 id = 14 + return +c sygnal + 155 id = 15 + return +c nie typ +100 continue + if(btest(k,7).and..not.btest(K,6).and..not.btest(k,5).and. + x btest(k,4))go to 140 + if(btest(k,7)) go to 200 + if(btest(k,6)) go to 140 + if(btest(k,5).and..not.btest(k,4)) go to 110 + if(btest(k,5).and.btest(k,4)) go to 120 + if(.not.btest(k,5)) go to 220 +c stala/signal + 200 continue + if(.not.btest(k,6).and..not.btest(k,5).and..not.btest(k,4)) + x go to 150 + if(.not.btest(k,6).and.btest(k,5).and.btest(k,4)) go to 155 +c procedura/funkcja/blok + 220 continue + if(.not.btest(k,10).and..not.btest(k,9)) go to 160 + if(.not.btest(k,10).and.btest(k,9)) go to 170 + if(btest(k,10).and..not.btest(k,9).and..not.btest(k,8)) + x go to 180 + if(btest(k,10).and.btest(k,9).and.btest(k,8)) go to 190 +c typ uniwersalny +300 id=0 + return + end + + integer function findnr(id) + implicit integer(a-z) + common /BLANK/ com(278), + x lmem,lpmem,irecn,isfin, + x com1(20), + x mem(7890) + if(id.eq.0) go to 1010 + do 1000 i = isfin,lpmem + k = mem(i) +c adres slowa zerowego + if(k.ne.id) go to 1000 + findnr = i-isfin+1 + return +1000 continue +1010 findnr = 0 + return + end + + integer function findsc(id) + implicit integer(a-z) + common /BLANK/ com(278), + x com2(18), + x nblus, + x com1(5), + x mem(7890) + logical btest + p = nblus + i = 1 + 100 continue + if(p.eq.0) go to 120 + k = mem(p) +c formalne i sygnaly sa pomijane w numeracji +c formalne + if(btest(k,4).or.btest(k,5)) go to 111 +c sygnal + if(btest(k,7)) go to 111 + if(id.eq.p) go to 110 + i = i+1 +111 p = mem(p+2) + go to 100 +120 findsc = 0 + return +110 findsc = i + return + end + diff --git a/sources/pass1/dsw.f b/sources/pass1/dsw.f new file mode 100644 index 0000000..e528096 --- /dev/null +++ b/sources/pass1/dsw.f @@ -0,0 +1,4305 @@ +C Loglan82 Compiler&Interpreter +C Copyright (C) 1981-1993 Institute of Informatics, University of Warsaw +C Copyright (C) 1993, 1994 LITA, Pau +C +C This program is free software; you can redistribute it and/or modify +C it under the terms of the GNU General Public License as published by +C the Free Software Foundation; either version 2 of the License, or +C (at your option) any later version. +C +C This program is distributed in the hope that it will be useful, +C but WITHOUT ANY WARRANTY; without even the implied warranty of +C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +C GNU General Public License for more details. File: LICENSE.GNU +C =============================================================== + + SUBROUTINE DSW +C +C * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +C ( BYLY ) PROGRAM GLOWNY +C * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +C + IMPLICIT INTEGER (A - Z ) +C +C + COMMON /MJLMSG/ IERC,MSG + integer*4 msg +C +C +C BUFORY +C +C +C.....BLOK KOMUNIKACJI ZE STRUMIENIAMI + LOGICAL ERRFLG + COMMON /STREAM/ ERRFLG, LINE, IBUF2(265), IBUF3(7),JUNK(260) +C +C +C..... +c$include:'blank.for' + +cdeb --------------------- added ------------------- + common /debug/ deb, breakt(500),brnr,maxbr + logical deb +cdeb ------------------------------------------------ +C + IERC=0 + msg = 'dsw ' +C +C + CALL INITMK +C SUBROUTINE INIT RENAMED TO INITMK 03.01.84 ********************** + CALL DPASS +C +C +C + CALL MESS +cdeb CALL AL1 +cdeb ------------- added -------------- + if(deb.and..not.errflg) go to 1000 + call al1 + return +1000 call ts2 +cdeb ---------------------------------- + END + + BLOCK DATA BLKD + IMPLICIT INTEGER (A-Z) +C +cdeb + common /pr/ prot(5000),ind +c prot - tablica na prototypy debuggera +c ind - ostatnie zajete miejsce w tablicy +cdeb +C +C + COMMON / YNIT / NULLWD(23), SIZEPR(23), NULLPOZ(23), CONSTWD, + * VARWD,VARPOM,INPFW,OUTPFW, INOUT +cdsw INTEGER SIZEPR, CONSTWD, VARWD, VARPOM, OUTPFW, INOUT +C +C ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** +C NULLWD(I) - WZORZEc SLOWA ZEROWEGO DLA PROTOTYPU RODZAJU I +C SIZEPR(I) - ROZMIAR POLA W IPMEM -- -- -- +C NULLPOZ(I) - POZYCJA SLOWA ZEROWEGO -- -- -- +C CONSTWD - WZORZEC SLOWA ZEROWEGO DLA CONST +C VARWD - -- -- -- -- DLA ZMIENNEJ +C VARPOM - -- -- -- -- ZMIENNEJ POMOCNICZEJ +C INPFW - -- -- -- -- ZMIEMNEJ INPUT +C OUTPFW - -- -- -- -- ZMIENNEJ OUTPUT +C INOUT - -- -- -- --- ZMIENNEJ INOUT +C +C + COMMON / MASKS / MTP,MSPR,MOTHERS,MPAR,MASKTP,NOTTP, + * MPROCES, MCOR, MERPF, MBLOCK, MHAND + *, MNOTVIR +C +C ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** +C MASKI I WZORCE: +C MTP - MASKA DO WYCINANIA INFORMACJI DOTYCZACYCH TYPOW ZE SLOWA ZEROWEGO +C MOTHERS - -- -- -- -- -- INNYCH PROTOTYPOW +C MPAR - -- -- -- -- -- -- ZMIENNYCH I PARAMETROW +C MSPR - MASKA DLA SYSPREF ( DLA PROTOTYPOW SYNTAKTYCZNYCH ) +C MASKTP - ZAPRZECZENIE MASKI MTP +C NOTTP - WZORZEC DLA NIE-TYPU ( 1 ) +C MPROCES - WZORZEC DLA PROCESU ( 5 ) +C MCOR - WZORZEC DLA COROUTINY (7) +C MERPF - MASKA DO WYKRYWANIA BLEDNYCH LIST PARAMETROW +C MBLOCK - WZORZEC DLA BLOKU ( 0 PRZY PRZECIECIU Z MOTHERS ) +C MNOTVIR - WZORZEC DO KASOWANIA BITU "VIRTUAL" +C MHAND - WZORZEC DLA HANDLERA +C +C +cdeb------------------------------------------ +cdeb COMMON /NAMES/ RESNM,MAINM + common /names/ resnm,mainm,brenam +cdeb------------------------------------------ +C +C NAZWY ZE SCANNERA +C * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +C +C +C COMMON / WYDR / KD(8), KSP(4) +C REAL KD,KSP +C +C BLOK UZYWANY W PROCEDURYCH DRUKUJACYCH. +C KD(KIND+1) - ODPOWIEDNI TEKST DLA PROTOTYPU RODZAJU KIND +C KSP(KSPEC+1) - ODPOWIEDNI TEKST DLA PROTOTYPU RODZAJU KSPEC. +C ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** +C +C* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +C RODZAJE PROTOTYPOW: +C 1 - BLOK, 2 - REKORD, 3 - PROCEDURA, 4 - FUNKCJA, 5 - PROC. Z BLEDNA PF +C 6 - FUNKCJA Z BLEDNA LISTA PF, 7 - KLASA Z BLEDNA LISTA PF +C 8 - BLOK PREFIKSOWANY, 9 - PROCEDURA VIRTUALNA, 10 I FUNKCJA VIRTUALNA +C 11 - PROC. VIRTUALNA Z BLEDNA PF, 12 - FUNKCJA VIRTUALNA Z BLEDNA PF +C 13 - PROCEDURA FORMALNA, 14 - FUNKCJA FORMALNA, 15 - PROC. FORMALNA +C Z BLEDNA LISTA PF, 16 - FUNKCJA FORMALNA Z BLEDNA LISTA PF, +C 17 - TYP FORMALNY, 18 - PROCEDURA FORMALNA II-GO RZEDU, +C 19 - FUNKCJA FORMALNA II-GO RZEDU +C 20 - TYP FORMALNY II-GO RZEDU +C 21 - SYGNAL, 22 - SYGNAL Z USZKODZONA LISTA PF, 23 - HANDLER +C* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +C +C + DATA SIZEPR/23,33,28,31,28,31,33,28,30,33,30,33,20,23,20,23, + * 5,5,7,5,19, 19, 21/ + DATA NULLPOZ/2,7,2,5,2,5,7,2,2,5,2,5,2,5,2,5,2,2,4,2,1,1,2/ + DATA CONSTWD,VARWD,VARPOM,INPFW,OUTPFW / 129,113,65,81,97 / + DATA INOUT /145/ + DATA NOTTP,MPROCES,MCOR,MBLOCK /1,5,7,0 / +C DATA KD(1) /5HTYP F/ +C DATA KD(2)/4HKLAS/ +C DATA KD(3) / 4HFUN / +C DATA KD(4) / 4HPROC/ +C DATA KD(5) / 4HBLOK/ +C DATA KD(6) /4HBLPR/ +C DATA KD(7) /6HSIGNAL/ +C DATA KD(8) /5HHANDL/ +C DATA KSP(1) /4HREK / +C DATA KSP(2) / 4HKLAS/ +C DATA KSP(3) / 4HPRSS/ +C DATA KSP(4) / 4HCORO/ + DATA RESNM,MAINM / 2769,819 / +cdeb ------------- added --------------- + data brenam /7797/ +cdeb ---------------------------------- + DATA NULLWD / 1,2,1025,513,9217,8705,8194,257,3073,2561,11265, + * 10753,1073,545,9265,8737,22,1073,545,22,177,8369,1793/ +cdeb + data prot /5000*-100/ +cdeb + END + SUBROUTINE DPASS +C +C * * * * * * * * * * * * * * * * * * ** * * * * * * * * * * * * +C PODPROGRAM REALIZUUACY PRZETWARZANIE PROTOTYPOW +C * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +C + IMPLICIT iNTEGER (A-Z) +C + COMMON / QUEUE / BQUEUE, EQUEUE, IFIRST, LAST, EMPTY +cdsw INTEGER BQUEUE, EQUEUE + LOGICAL EMPTY +C +C ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** +C ZMIENNE SLUZACE DO ORGANIZACJI KOLEJKI PROTOTYPOW +C BQUEUE - POCZATEK POLA W IPMEM PRZEZNACZONEGO NA KOLEJKE +C EQUEUE - KONIEC -- -- -- -- -- +C IFIRST - PIERWSZY ELEMENT KOLEJKI +C LAST - OSTATNI ELEMENT KOLEJKI +C EMPTY = TRUE, GDY KOLEJKA JEST PUSTA +C +C +C + COMMON / YNIT / NULLWD(23), SIZEPR(23), NULLPOZ(23), CONSTWD, + * VARWD,VARPOM,INPFW,OUTPFW, INOUT +cdsw INTEGER SIZEPR, CONSTWD, VARWD, VARPOM, OUTPFW +C +C ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** +C NULLWD(I) - WZORZEc SLOWA ZEROWEGO DLA PROTOTYPU RODZAJU I +C SIZEPR(I) - ROZMIAR POLA W IPMEM -- -- -- +C NULLPOZ(I) - POZYCJA SLOWA ZEROWEGO -- -- -- +C CONSTWD - WZORZEC SLOWA ZEROWEGO DLA CONST +C VARWD - -- -- -- -- DLA ZMIENNEJ +C VARPOM - -- -- -- -- ZMIENNEJ POMOCNICZEJ +C INPFW - -- -- -- -- ZMIEMNEJ INPUT +C OUTPFW - -- -- -- -- ZMIENNEJ OUTPUT +C INOUT - -- -- -- -- --- ZMIENNEJ INOUT +C +C +C ..... ZMIENNE GLOBALNE +C +C..... + LOGICAL INSYS, OWN + COMMON /BLANK/ COM(278), + X LMEM , LPMEM , IRECN , ISFIN , LPMSYS, LPML , LPMF , + X NRINT , NRRE , NRBOOL, NRCHR , NRCOR , NRPROC, NRTEXT, + X NRUNIV, NATTR , NRNONE, NBLSYS, NBLUS , NEMPTY, INSYS , + X LOCAL , OWN , OBJECT, + X IPMEM(5000) +C +C COM - OBSZAR KOMUNIKACYJNY STRUMIENI +C LMEM - (=5000) ROZMIAR CALEJ PAMIECI GLOWNEJ +C LPMEM - PODZIAL PAMIECI NA CZESCI IPMEM I ISMEM +C IRECN - INDEKS SZCZYTU STOSU STALYCH REAL +C ISFIN - INDEKS SZCZYTU SLOWNIKA PROTOTYPOW +C +C LPMSYS - INDEKS PIERWSZEGO SLOWA W IPMEM OBSZARU NIEPRZEZ- +C NACZONEGO NA PROTOTYPY SYSTEMOWE +C LPML - INDEKS PIERWSZEGO SLOWA OBSZARU WOLNEGO W IPMEM +C LPMF - INDEKS OSTATNIEGO SLOWA WOLNEGO OBSZARU W IPMEM +C +C IDENTYFIKATORY PROTOTYPOW SYSTEMOWYCH +C NRINT - IDENTYFIKATOR PROTOTYPU INTEGER +C NRRE - REAL +C NRBOOL - BOOLEAN +C NRCHR - CHARACTER +C NRCOR - COROUTINE +C NRPROC - PROCESS +C NRTEXT - STRING (TEXT) +C NRUNIV - IDENTYFIKATOR PROTOTYPU UNIWERSALNEGO +C NATTR - IDENTYFIKATOR PSEUDO-ATRYBUTU (Z NUMEREM -1) +C NRNONE - IDENTYFIKATOR PROTOTYPU TYPU NONE (UNIWERSALNY +C REFERENCYJNY) +C NBLSYS - IDENTYFIKATOR BLOKU SYSTEMOWEGO +C NBLUS - BLOKU GLOWNEGO UZYTKOWNIKA +C +C INSYS - FLAGA SPOSOBU REZERWACJI (PRZEZ MGETM) PAMIECI +C W IPMEM - .TRUE. JESLI REZERWACJA W CZESCI SYSTE- +C MOWEJ +C LOCAL - FLAGA DOSTEPU DO OBIEKTOW - 2 JESLI OBIEKT +C BYL LOKALNY, 1 - GDY Z SL, 0 - GDY Z BLOKU GLOWNEGO +C OWN - FLAGA DOSTEPU DO OBIEKTOW - .TRUE. JESLI OBIEKT NIE +C POCHODZI Z PREFIKSOW (TYLKO Z WLASCIWEGO OBIEKTU) +C OBJECT - PROTOTYP OBIEKTU, Z KTOREGO POCHODZIL OSTATNIO +C SZUKANY IDENTYFIKATOR (OBIEKT POCHODZACY Z CIAGU SL) +C +C + + COMMON / DGLOB/ INDICT,INDSPR,INDPR,IHBEG,LASTPR,INDPREF +C +C ** ** ** ** *** ** ** ** ** ** ** ** ** ** ** ** ** +C BLOK ZAWIERA DANE O PRZETWARZANYM PROTOTYPIE +C INDICT - INDEKS PRZETWARZANEGO PROTTYPU W IDICT +C INDSPR - IDENTYFIKATOR PROTOTYPU W ISMEM +C INDPR - IDENTYFIKATOR PROTOTYPU W IPMEM +C IHBEG - ADRES PIERWSZEGO SLOWA TABLICY HASHU +C IDPREF - IDENTYFIKATOR BEZPOSREDNIEGO PREFIKSU PRZETWARZANEGO +C PROTOTYPU +C LASTPR - IDENTYFIKATOR POPRZEDNIO PRZETWARZANEGO PROTOTYPU +C +C +cdeb COMMON/NAMES/RESNM,MAINM +cdeb ------------------------------------- + common /names/ resnm, mainm, brenam +cdeb ------------------------------------ +C NAZWY ZE SCANNERA +C +C + COMMON /PREFS/ LPREFS +C +C ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** +C LPREFS - OSTATNIO PRZYDZIELONY NUMER W PREFIXSET +C +C +C +C.....BLOK KOMUNIKACJI ZE STRUMIENIAMI + LOGICAL ERRFLG + COMMON /STREAM/ ERRFLG, LINE, IBUF2(265), IBUF3(7),JUNK(260) + +c system class prototypes: + common /syspro/ prgraph, prmouse +C +C +C UTWORZENIE PROTOTYPU BLOKU GLOWNEGO + I=IPMEM(LPMEM) + LINE = IPMEM(I+9) + LASTPR = NBLSYS + NBLUS=INITPR(1,0) +C USTAWIENIE SL BLOKU GLOWNEGO NA SYSTEMOWY + IPMEM(NBLUS-1) = NBLSYS +cdsw + ipmem(nblus+2) = prgraph + ipmem(prgraph+2) = prmouse + lastpr = prmouse + +C DOLACZENIE NAZWY I ATRYBUTU MAIN + I=MGETM(6,41)+4 + IPMEM(I)=VARWD + IPMEM(I+1)=1 + CALL MADATR(I,NBLUS,41) + IPMEM(I-3)=NRPROC + IPMEM(I)=IAP(I) + K=IDPUT(MAINM,IPMEM(NBLUS+10)) + IPMEM(K+2)=I + CALL DPUTQ(LPMEM,NBLUS) + 100 IF(EMPTY) GO TO 300 + CALL DGETQ + CALL PROTP1 + CALL PROTP2 + GO TO 100 + 300 CONTINUE +C KONIEC PRZETWARZANIA PROTOTYPOW + IPMEM(NBLSYS+3) = LPREFS +C ... PRZECHOWANIE INFORMACJI O LICZBIE KLAS + RETURN + END + SUBROUTINE INITMK +C +C * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +C INICJALIZACJA LOKALNA +C * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +C + IMPLICIT INTEGER(A-Z) +C +C +cdsw ------------------------------------------------ + common/signs/nrsig,hliste +cdsw ----------------------------------------------- +cdsw COMMON /SIGNALS/ NRSIG, HLISTE +C +C NRSIG - OSTATNIO PRZYDZIELONY NUMER SYGNALU +C HLISTE - OSTATNI ELEMENT LISTY SYGNALOW (W KAZDYM MODULE ) +C +C +C + COMMON / QUEUE / BQUEUE, EQUEUE, IFIRST, LAST, EMPTY +cdsw INTEGER BQUEUE, EQUEUE + LOGICAL EMPTY +C +C ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** +C ZMIENNE SLUZACE DO ORGANIZACJI KOLEJKI PROTOTYPOW +C BQUEUE - POCZATEK POLA W IPMEM PRZEZNACZONEGO NA KOLEJKE +C EQUEUE - KONIEC -- -- -- -- -- +C IFIRST - PIERWSZY ELEMENT KOLEJKI +C LAST - OSTATNI ELEMENT KOLEJKI +C EMPTY = TRUE, GDY KOLEJKA JEST PUSTA +C +C + COMMON /PREFS/ LPREFS +C +C ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** +C LPREFS - OSTATNIO PRZYDZIELONY NUMER W PREFIXSET +C +C + COMMON / MASKS / MTP,MSPR,MOTHERS,MPAR,MASKTP,NOTTP, + * MPROCES, MCOR, MERPF, MBLOCK, MHAND + *, MNOTVIR +C +C ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** +C MASKI I WZORCE: +C MTP - MASKA DO WYCINANIA INFORMACJI DOTYCZACYCH TYPOW ZE SLOWA ZEROWEGO +C MOTHERS - -- -- -- -- -- INNYCH PROTOTYPOW +C MPAR - -- -- -- -- -- -- ZMIENNYCH I PARAMETROW +C MSPR - MASKA DLA SYSPREF ( DLA PROTOTYPOW SYNTAKTYCZNYCH ) +C MASKTP - ZAPRZECZENIE MASKI MTP +C NOTTP - WZORZEC DLA NIE-TYPU ( 1 ) +C MPROCES - WZORZEC DLA PROCESU ( 5 ) +C MCOR - WZORZEC DLA COROUTINY (7) +C MERPF - MASKA DO WYKRYWANIA BLEDNYCH LIST PARAMETROW +C MBLOCK - WZORZEC DLA BLOKU ( 0 PRZY PRZECIECIU Z MOTHERS ) +C MNOTVIR - MASKA DO KASOWANIA BITU "VIRTUAL" +C +C + COMMON / YNIT / NULLWD(23), SIZEPR(23), NULLPOZ(23), CONSTWD, + * VARWD,VARPOM,INPFW,OUTPFW, INOUT +cdsw INTEGER SIZEPR, CONSTWD, VARWD, VARPOM, OUTPFW, INOUT +C +C ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** +C NULLWD(I) - WZORZEc SLOWA ZEROWEGO DLA PROTOTYPU RODZAJU I +C SIZEPR(I) - ROZMIAR POLA W IPMEM -- -- -- +C NULLPOZ(I) - POZYCJA SLOWA ZEROWEGO -- -- -- +C CONSTWD - WZORZEC SLOWA ZEROWEGO DLA CONST +C VARWD - -- -- -- -- DLA ZMIENNEJ +C VARPOM - -- -- -- -- ZMIENNEJ POMOCNICZEJ +C INPFW - -- -- -- -- ZMIEMNEJ INPUT +C OUTPFW - -- -- -- -- ZMIENNEJ OUTPUT +C INOUT - -- -- -- --- ZMIENNEJ INOUT +C +C +C ..... ZMIENNE GLOBALNE +C +C..... + LOGICAL INSYS, OWN + COMMON /BLANK/ COM(278), + X LMEM , LPMEM , IRECN , ISFIN , LPMSYS, LPML , LPMF , + X NRINT , NRRE , NRBOOL, NRCHR , NRCOR , NRPROC, NRTEXT, + X NRUNIV, NATTR , NRNONE, NBLSYS, NBLUS , NEMPTY, INSYS , + X LOCAL , OWN , OBJECT, + X IPMEM(5000) +C +C COM - OBSZAR KOMUNIKACYJNY STRUMIENI +C LMEM - (=5000) ROZMIAR CALEJ PAMIECI GLOWNEJ +C LPMEM - PODZIAL PAMIECI NA CZESCI IPMEM I ISMEM +C IRECN - INDEKS SZCZYTU STOSU STALYCH REAL +C ISFIN - INDEKS SZCZYTU SLOWNIKA PROTOTYPOW +C +C LPMSYS - INDEKS PIERWSZEGO SLOWA W IPMEM OBSZARU NIEPRZEZ- +C NACZONEGO NA PROTOTYPY SYSTEMOWE +C LPML - INDEKS PIERWSZEGO SLOWA OBSZARU WOLNEGO W IPMEM +C LPMF - INDEKS OSTATNIEGO SLOWA WOLNEGO OBSZARU W IPMEM +C +C IDENTYFIKATORY PROTOTYPOW SYSTEMOWYCH +C NRINT - IDENTYFIKATOR PROTOTYPU INTEGER +C NRRE - REAL +C NRBOOL - BOOLEAN +C NRCHR - CHARACTER +C NRCOR - COROUTINE +C NRPROC - PROCESS +C NRTEXT - STRING (TEXT) +C NRUNIV - IDENTYFIKATOR PROTOTYPU UNIWERSALNEGO +C NATTR - IDENTYFIKATOR PSEUDO-ATRYBUTU (Z NUMEREM -1) +C NRNONE - IDENTYFIKATOR PROTOTYPU TYPU NONE (UNIWERSALNY +C REFERENCYJNY) +C NBLSYS - IDENTYFIKATOR BLOKU SYSTEMOWEGO +C NBLUS - BLOKU GLOWNEGO UZYTKOWNIKA +C +C INSYS - FLAGA SPOSOBU REZERWACJI (PRZEZ MGETM) PAMIECI +C W IPMEM - .TRUE. JESLI REZERWACJA W CZESCI SYSTE- +C MOWEJ +C LOCAL - FLAGA DOSTEPU DO OBIEKTOW - 2 JESLI OBIEKT +C BYL LOKALNY, 1 - JESLI POCHODZIL Z SL, 0 - GDY Z BL. GL. +C OWN - FLAGA DOSTEPU DO OBIEKTOW - .TRUE. JESLI OBIEKT NIE +C POCHODZI Z PREFIKSOW (TYLKO Z WLASCIWEGO OBIEKTU) +C +C +C +C INICJALIZACJA ZMIENNYCH Z BLOKOW WSPOLNYCH, KTORE NIE SA +C INICJALIZOWANE W BLOCK DATA +C +C COMMON /YNIT/ +C NADANIE APETYTOW DLA TYPOW FORMALNYCH +C DLA TYPOW FORMALNYCH - BIT 14 JEST ZAPALONY + MTP = ISHFT (1,14) + NULLWD(17) = IOR ( NULLWD(17),MTP ) + NULLWD(20) = IOR ( NULLWD(20),MTP ) +C DLA POCEDUR/FUNKCJI FORMALNYCH - BIT 15 JEST ZAPALONY + MTP = ISHFT (1,15) + NULLWD(13) = IOR (NULLWD(13),MTP ) + NULLWD(14) = IOR (NULLWD(14),MTP ) + NULLWD(15) = IOR ( NULLWD(15),MTP ) + NULLWD(16) = IOR ( NULLWD(16),MTP ) + NULLWD(18) = IOR ( NULLWD(18),MTP ) + NULLWD(19) = IOR ( NULLWD(19),MTP ) +C +C COMMON / QUEUE / + BQUEUE=MGETM(LMEM/50,341) + EQUEUE=LPML-1 + EMPTY=.TRUE. + LAST=BQUEUE-2 + IFIRST=BQUEUE +C +C COMMON / PREFS / +cdsw LPREFS=IPMEM(NBLSYS+3) +cdsw MAXPF=47 +C +C COMMON / MASKS / + MTP=15 + MSPR=7 + MOTHERS=ISHFT(7,8) + MPAR=ISHFT(15,4) + MASKTP=NOT(MTP) + MNOTVIR=ISHFT(1,11) + MNOTVIR=NOT(MNOTVIR) + MHAND = ISHFT ( 7,8 ) + MERPF = ISHFT (1,13) +C +C COMMON /SIGNALS/ + NRSIG = 100 +C +C INICJALIZACJA ZMIENNYCH GLOBALNYCH - CHWILOWA + INSYS=.FALSE. + RETURN + END + SUBROUTINE PROTP1 +C +C ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** +C PODPROGRAM SLUZY DO PRZETWARZANIA(OSTATECZNEGO) PROTOTYPU, +C RAZEM Z PRZETWARZANIEM ZEWNETRZNYM ( WSTEPNYM) JEGO ATRYBUTOW LOKALNYCH. +C PROTOTYP JEST ZADANY PRZEZ ZMIENNE Z BLOKU /DGLOB/ +C PIERWSZA CZESC PRZETWARZANIA +C ** ** ** ** ** ** ** ** ** ** * ** ** ** ** ** ** ** +C + IMPLICIT INTEGER (A-Z) +C INSERTION OF + LOGICAL BTEST +C BECAUSE OF TYPECONFLICT 03.01.84 +C + COMMON / DGLOB/ INDICT,INDSPR,INDPR,IHBEG,LASTPR,INDPREF +C +C ** ** ** ** *** ** ** ** ** ** ** ** ** ** ** ** ** +C BLOK ZAWIERA DANE O PRZETWARZANYM PROTOTYPIE +C INDICT - INDEKS PRZETWARZANEGO PROTTYPU W ISDICT +C INDSPR - IDENTYFIKATOR PROTOTYPU W ISMEM +C INDPR - IDENTYFIKATOR PROTOTYPU W IPMEM +C IHBEG - ADRES PIERWSZEGO SLOWA TABLICY HASHU +C IDPREF - IDENTYFIKATOR BEZPOSREDNIEGO PREFIKSU PRZETWARZANEGO +C PROTOTYPU +C LASTPR - IDENTYFIKATOR POPRZEDNIO PRZETWARZANEGO PROTOTYPU +C +C +C ..... ZMIENNE GLOBALNE +C +C..... + LOGICAL INSYS, OWN + COMMON /BLANK/ COM(278), + X LMEM , LPMEM , IRECN , ISFIN , LPMSYS, LPML , LPMF , + X NRINT , NRRE , NRBOOL, NRCHR , NRCOR , NRPROC, NRTEXT, + X NRUNIV, NATTR , NRNONE, NBLSYS, NBLUS , NEMPTY, INSYS , + X LOCAL , OWN , OBJECT, + X IPMEM(5000) +C +C +C +C + COMMON / YNIT / NULLWD(23), SIZEPR(23), NULLPOZ(23), CONSTWD, + * VARWD,VARPOM,INPFW,OUTPFW, INOUT +cdsw INTEGER SIZEPR, CONSTWD, VARWD, VARPOM, OUTPFW +C +C ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** +C NULLWD(I) - WZORZEC SLOWA ZEROWEGO DLA PROTOTYPU RODZAJU I +C SIZEPR(I) - ROZMIAR POLA W IPMEM -- -- -- +C NULLPOZ(I) - POZYCJA SLOWA ZEROWEGO -- -- -- +C CONSTWD - WZORZEC SLOWA ZEROWEGO DLA CONST +C VARWD - -- -- -- -- DLA ZMIENNEJ +C VARPOM - -- -- -- -- ZMIENNEJ POMOCNICZEJ +C INPFW - -- -- -- -- ZMIEMNEJ INPUT +C OUTPFW - -- -- -- -- ZMIENNEJ OUTPUT +C INOUT - -- -- -- -- ZMIENNEJ INOUT +C +C + COMMON / MASKS / MTP,MSPR,MOTHERS,MPAR,MASKTP,NOTTP, + * MPROCES, MCOR, MERPF, MBLOCK, MHAND, MNOTVIRT +C +C ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** +C MASKI I WZORCE: +C MTP - MASKA DO WYCINANIA INFORMACJI DOTYCZACYCH TYPOW ZE SLOWA ZEROWEGO +C MOTHERS - -- -- -- -- -- INNYCH PROTOTYPOW +C MPAR - -- -- -- -- -- -- ZMIENNYCH I PARAMETROW +C MSPR - MASKA DLA SYSPREF ( DLA PROTOTYPOW SYNTAKTYCZNYCH ) +C MASKTP - ZAPRZECZENIE MASKI MTP +C NOTTP - WZORZEC DLA NIE-TYPU ( 1 ) +C MPROCES - WZORZEC DLA PROCESU ( 5 ) +C MCOR - WZORZEC DLA COROUTINY (7) +C MERPF - MASKA DO WYKRYWANIA BLEDNYCH LIST PARAMETROW +C MBLOCK - WZORZEC DLA BLOKU ( 0 PRZY PRZECIECIU Z MOTHERS ) +C +C +C +C.....BLOK KOMUNIKACJI ZE STRUMIENIAMI + LOGICAL ERRFLG + COMMON /STREAM/ ERRFLG, LINE, IBUF2(265), IBUF3(7),JUNK(260) +C +C +C +C BUFORY +C +cdeb COMMON /NAMES/ RESNM, MAINM +cdeb ---------------------------------- + common /names/ resnm, mainm,brenam +cdeb -------------------------------- +C +C NAZWY ZE SCANNERA +C +C +C +C +cbc + common /option/ opt +cbc + LOGICAL POM, HAND +C HAND - CZY TO JEST PROTOTYP HANDLERA +C +C +C NADANIE WARTOSCI POZOSTALYM ZMIENNYM Z BLOKU /DGLOB/ + INDSPR = IPMEM(INDICT) + IHBEG = INDPR+10 + I=IPMEM(INDPR) + HAND = .FALSE. + IF ( IAND(I,MOTHERS) .EQ. MHAND ) HAND = .TRUE. + INDPREF = IPMEM(INDPR+21) +C JESLI BLOK LUB HANDLER - TO ZERO + IF(IAND(I,MTP).EQ.NOTTP.AND.IAND(I,MOTHERS).EQ.MBLOCK.OR.HAND) + * INDPREF = 0 +C . . . . +C PRZEPISANIE INFORMACJI DLA ANDRZEJA + IPMEM(INDPR+8)=IPMEM(INDSPR-3) + IPMEM(INDPR+9)=IPMEM(INDSPR-2) + IPMEM(INDPR+18)=IPMEM(INDSPR-1) +C EWENTUALNE POPRAWIENIE SPECYFIKACJI - JESLI PREFIKS +C NIE JEST REKORDEM + IF(INDPREF.EQ.0) GO TO 50 + IF(BTEST(IPMEM(INDPREF),0)) CALL CHECK(INDPR) + GO TO 60 +C JESLI JEST LISTA TAKEN - TO BLAD + 50 I=IPMEM(INDSPR+7) + IF(I.EQ.0) GO TO 60 + LINE=IPMEM(I+1) + CALL MERR(310,NEMPTY) + 60 INSYS=.FALSE. + IF(HAND) GO TO 70 +C +C---- --------------------------------------------------------------- +C PRZETWARZANIE NAGLOWKA + CALL HEADER +C +C ---------------------------------------------------------------- +C DLA PROCESU - SPRAWDZENIE, CZY NIE MA PF OUTPUT LUB INOUT +C +cbc check if parameters fit into one message +c + I = IAND(IPMEM(INDPR),MTP) + IF(I.NE.MPROCES) GO TO 70 +C PROCES + I = IPMEM(INDPR+3) + K = IPMEM(INDPR+4) + IF(K.EQ.0) GO TO 76 + K = K+I-1 +cbc check if first parameter is integer + j = ipmem(indpr+22) +80 p = ipmem(j) + tp = iand(ipmem(p), mtp) + if (tp .eq. mproces) goto 81 + j = j+1 + goto 80 +c p = address of first process prototype in prefix sequence +81 l = ipmem(p+4) + p = ipmem(p+21) + if (p .eq. 0) goto 82 + if (l .eq. ipmem(p+4)) goto 76 + i = i+ipmem(p+4) +82 continue +c i = address of first parameter of process + if (ipmem(ipmem(i)-3) .eq. nrint) goto 75 + line = ipmem(indspr+9) + call merr(370, nempty) +75 continue + i = ipmem(indpr+3) +C +cbc + apet = 0 +cbc + DO 77 J = I,K + NM = IPMEM(J) +C NM - IDENTYFIKATOR PARAMETRU +CBC +c check for formal type + zp = ishft(iand(ipmem(nm), mpar), -4) + if (zp .eq. 1) goto 74 +c check for formal procedure + if (zp .eq. 3) goto 73 +c check if not array + if (ipmem(nm-4) .gt. 0) goto 74 + tp = iand(ipmem(ipmem(nm-3)), mtp) +c check if formal parameter type is process or int,real,char,bool,string +cpat if (tp .eq. mproces .or. tp .eq. 8 .or. tp .eq. 10 .or. +cpat * tp .eq. 12) goto 78 + goto 78 +74 line = ipmem(indspr+9) + call merr(370 ,nempty) + goto 77 +78 continue +c compute formal parameter appetite in bytes + if (zp .eq. 2) goto 73 +c variable + ap = sapet(0, ipmem(nm-3)) + if (ap .eq. 4) ap = 2 + goto 72 +c formal procedure or function +73 ap = 3 +c sum up appetites +72 apet = apet + ap +cbc +c NM = ISHFT(IAND(IPMEM(NM),MPAR),-4) +c IF(NM.NE.6.AND.NM.NE.9) GO TO 77 +c BLAD - JEST PARAMETR OUTPUT LUB INOUT +c LINE = IPMEM(INDSPR+9) +c CALL MERR(370,NEMPTY) +cbc +c + 77 CONTINUE +cbc + if (.not. btest(opt, 12)) maxap = 34 + if ( btest(opt, 12)) maxap = 15 + if (apet .le. maxap) goto 70 + line = ipmem(indspr+9) + call merr(370, nempty) + goto 70 + 76 line = ipmem(indspr+9) + call merr(370, nempty) +c +Cbc +C ----------------------------------------------------------------- +C PRZETWARZANIE WSTEPNE LOKALNYCH PROTOTYPOW -- ETAP I +C +C POM = FALSE, GDY PRZETWARZAMY TYPY +C POM = TRUE, GDY PRZETWARZAMY PROCEDURY/FUNKCJE/BLOKI/HANDLERY + 70 POM=.FALSE. + I=IPMEM(INDSPR+5) + 100 IF(I.EQ.0) GO TO 200 + J=IPMEM(I) + J=IPMEM(J) +C J - IDENTYFIKATOR PROTOTYPU LOKALNEGO W ISMEM +C NM - NAZWA PROTOTYPU + NM=NEMPTY + IF(IPMEM(J).NE.1 .AND. IPMEM(J).NE.8) NM=IPMEM(J+10) +C OKRESLENIE RODZAJU PROTOTYPU ( W SENSIE BLOKU INIT) + K=IPMEM(J) +C WYKRYCIE HANDLERA + IF(K.EQ.8) K=K+15 +C WYKRYCIE BLOKU PREFIKSOWANEGO + IF(K.EQ.1.AND.IPMEM(J+2).NE.0) K=8 +C WYKRYCIE WIRTUALI + LINE = IPMEM(J+9) +C INSERTION OF LAST STATEMENT DUE TO CORRECTION GIVEN TO ME IN WARSAW +C IF(BTEST(IPMEM(J+8),15)) K=K+6 +C INSERTION OF THE FOLLOWING STATEMENTS DUE TO CORRECTIONS (SEE ABOVE) + IF (.NOT. BTEST(IPMEM(J+8),15) ) GOTO 110 + IF (K.LT.3.OR.K.GT.6) GOTO 120 + K=K+6 + IF (INDPREF.NE.0) GOTO 110 + IF (IAND(IPMEM(INDPR),MTP).NE.NOTTP) GOTO 110 + CALL MERR(330,NM) + K=K-6 + GOTO 110 +120 CALL MERR(329,NM) +C END OF INSERTION OF STATEMENTS +C WYWOLANIE INITPR +C LINE=IPMEM(J+9) +C DELETION OF PREVIOUS STATEMENT DUE TO CORRECTION +C K=INITPR(K,NM) +110 K=INITPR(K,NM) +C INSERTION OF LABEL 110 DUE TO CORRECTIONS +C W POLU SL PROTOTYPU (W ISMEM) ZAPAMIETUJEMY JEGO IDENTYFIKATOR +C W IPMEM + IPMEM(J+1) = K +C PRZEJSCIE DO NASTEPNEGO PROTOTYPU W LISCIE + I=IPMEM(I+1) + GO TO 100 +C PRZETWARZANIE BLOKOW, FUNKCJI I PROCEDUR + 200 IF(POM) GO TO 300 + POM=.TRUE. + I=IPMEM(INDSPR+6) +C JESLI PROTOTYP ZAWIERA BLOKI, FUNKCJE LUB PROCEDURY, TO ZMIENIAMY +C MU KWALIFIKACJE NA PELNA KLASE + IF(I.NE.0) CALL CHECK(INDPR) + GO TO 100 +C +C + 300 CONTINUE +C +C ------------------------------------------------------------------------ +C PRZETWARZANIE LISTY SYGNALOW +C + I = IPMEM(INDSPR-4) + 350 IF (I.EQ.0) GO TO 500 + NM = IPMEM(I+2) + LINE = IPMEM(I+1) + K = IPMEM(I) +12 +C UTWORZENIE PROTOTYPU + K=INITPR(K,NM) +C ZAPAMIETANIE IDENTYFIKATORA PROTOTYPU SEMANTYCZNEGO + IPMEM(I) = K + I=IPMEM(I+3) + GO TO 350 +C +C + 500 CONTINUE +C +C JESLI HANDLER TO KONIEC + IF ( HAND ) GO TO 1100 +C --- --- --- --- --- --- --- --- --- --- --- --- ---- ----- +C PRZETWARZANIE LISTY STALYCH +C + I=IPMEM(INDSPR+4) + 600 IF(I.EQ.0) GO TO 700 + J=MGETM(6,41)+4 +C J - IDENTYFIKATOR OPISU STALEJ + IPMEM(J)=CONSTWD +C THIS AND THE NEXT 3 LINES ARE IRRELEVANT 8.5.84 +C SZUKAMY TYPU STALEJ - ZAKLADAMY POPRAWNOSC TYPU +C ZERO OZNACZA STALA ZDEFINIOWANA PRZEZ WYRAZENIE + IF(IPMEM(I+2).EQ.0)GO TO 630 +C +C TYLKO DLA STALEJ TEKSTOWEJ : + K=MEMBER(IPMEM(I+2),IPMEM(NBLSYS+10)) +C LAST STATEMENT CHANGED TO COMMENT DUE TO CORRECTIONS FROM WARSAW 8.5.84 +C THIS AND THE NEXT 2 LINES ARE IRRELEVANT 8.5.84 + IPMEM(J-3)=IPMEM(K+2) +C LAST STATEMENT CHANGED TO COMMENT DUE TO CORRECTIONS FROM WARSAW 8.5.84 +C PRZEPISANIE ADRESU STALEJ + 630 IPMEM(J-1)=IPMEM(I+4) +C WSTAWIENIE STALEJ DO ZBIORU IDENTYFIKATOROW + LINE=IPMEM(I+1) + K=IDPUT(IPMEM(I),IPMEM(IHBEG)) + IF(K.EQ.0) GO TO 650 +C NIE MA PODWOJNEJ DEKLARACJI + IPMEM(K+2) = J +C USTAWINIE BITU CLOSE + IPMEM(K+1) = 1 +C PRZEJSCIE DO NASTEPNEGO ELEMENTU LISTY + 650 I=IPMEM(I+5) + GO TO 600 +C +C + 700 CONTINUE +C +C ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- +C PRZETWARZANIE LISTY ZMIENNYCH +C +C + I=IPMEM(INDSPR+3) + 800 IF(I.EQ.0) GO TO 1000 + J=MGETM(6,41)+4 +C J- IDENTYFIKATOR OPISU ZMIENNEJ + IPMEM(J) = VARWD +C WSTAWIENIE DO ZBIORU IDENTYFIKATOROW + LINE=IPMEM(I+1) + K=IDPUT(IPMEM(I),IPMEM(IHBEG)) + IF(K.EQ.0) GO TO 900 +C NIE MA PODWOJNEJ DEKLARACJI + IPMEM(K+2)=J +C WSTAWIENIE DO LISTY ATRYBUTOW + 900 CALL MADATR(J,INDPR,41) +C ZAPAMIETANIE 1 W POLU USED - DLA AIL + IPMEM(J+1)=1 +C ZAMIAST NAZWY ZMIENNEJ(W ISMEM) ZAPAMIETUJEMY JEJ IDENTYFIKATOR W IPMEM + IPMEM(I)=J +C PRZEJSCIE DO NASTEPNEGO ELEMENTU LISTY + I=IPMEM(I+4) + GO TO 800 +C +C + 1000 CONTINUE +C +C +C DOLACZENIE DO ZBIORU IDENTYFIKATOROW ID. RESULT DLA FUNKCJI + I=ISHFT(IAND(IPMEM(INDPR),MOTHERS),-8) + IF(I.LT.2.OR.I.GT.3) GO TO 1050 + J=MEMBER(RESNM,IPMEM(IHBEG)) + IF(J.NE.0) GO TO 1050 + J=INSERT(RESNM,IPMEM(IHBEG),41) + IPMEM(J+2)= IPMEM(INDPR-5) + 1050 CONTINUE +C +C +C---- ---- ---- ----- ---- ----- ----- ---- ----- ----- ----- ----- -- +C TWORZENIE ZBIORU IDENTYFIKATOROW +C +C JESLI JEST PREFIKS, TO UZUPELNIAMY ZBIOR IDENTYFIKATOROW + IF(INDPREF.EQ.0) GO TO 1100 + CALL MERGEID +C +C + 1100 CONTINUE + RETURN + END + SUBROUTINE PROTP2 +C +C ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** +C PODPROGRAM SLUZY DO PRZETWARZANIA(OSTATECZNEGO) PROTOTYPU, +C RAZEM Z PRZETWARZANIEM ZEWNETRZNYM ( WSTEPNYM) JEGO ATRYBUTOW LOKALNYCH. +C PROTOTYP JEST ZADANY PRZEZ ZMIENNE Z BLOKU /DGLOB/ +C DRUGA CZESC PRZETWARZANIA +C ** ** ** ** ** ** ** ** ** ** * ** ** ** ** ** ** ** +C + IMPLICIT INTEGER (A-Z) + LOGICAL POM +C INSERTION OF + LOGICAL BTEST +C BECAUSE OF TYPECONFLICT 03.01.84 +C + COMMON / DGLOB/ INDICT,INDSPR,INDPR,IHBEG,LASTPR,INDPREF +C +C ** ** ** ** *** ** ** ** ** ** ** ** ** ** ** ** ** +C BLOK ZAWIERA DANE O PRZETWARZANYM PROTOTYPIE +C INDICT - INDEKS PRZETWARZANEGO PROTTYPU W ISDICT +C INDSPR - IDENTYFIKATOR PROTOTYPU W ISMEM +C INDPR - IDENTYFIKATOR PROTOTYPU W IPMEM +C IHBEG - ADRES PIERWSZEGO SLOWA TABLICY HASHU +C IDPREF - IDENTYFIKATOR BEZPOSREDNIEGO PREFIKSU PRZETWARZANEGO +C PROTOTYPU +C LASTPR - IDENTYFIKATOR POPRZEDNIO PRZETWARZANEGO PROTOTYPU +C +C +C +C + COMMON / VIRT / LISTVB,LISTVE,OWNVIR + LOGICAL OWNVIR +C +C ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** +C ROBOCZY BLOK WSPOLNY. +C LISTVB - POCZATEK ROBOCZEJ LISTY VIRTLIST +C LISTVE - KONIEC ROBOCZEJ LISTY VIRTLIST +C OWNVIR = TRUE, JESLI W PROTOTYPIE BYLY WLASNE VIRTUALE +C +C ..... ZMIENNE GLOBALNE +C +C..... + LOGICAL INSYS, OWN + COMMON /BLANK/ COM(278), + X LMEM , LPMEM , IRECN , ISFIN , LPMSYS, LPML , LPMF , + X NRINT , NRRE , NRBOOL, NRCHR , NRCOR , NRPROC, NRTEXT, + X NRUNIV, NATTR , NRNONE, NBLSYS, NBLUS , NEMPTY, INSYS , + X LOCAL , OWN , OBJECT, + X IPMEM(5000) +C +C +C +C..... +C KOMUNIKACJA Z PROCEDURA MEMPRF + COMMON /MEM/ NME, NH +C NME - SZUKANA NAZWA +C NH - JEJ HASZ +C +C +cdsw COMMON /SIGNALS/ NRSIG, HLISTE +cdsw ------------------------------------------------- + common /signs/ nrsig, hliste +cdsw ------------------------------------------------- +C +C NRSIG - OSTATNIO PRZYDZIELONY NUMER SYGNALU +C HLISTE - OSTATNI ELEMENT LISTY SYGNALOW (W KAZDYM MODULE ) +C +C +C + COMMON / MASKS / MTP,MSPR,MOTHERS,MPAR,MASKTP,NOTTP, + * MPROCES, MCOR, MERPF, MBLOCK, MHAND, MNOTVIRT +C +C +C.....BLOK KOMUNIKACJI ZE STRUMIENIAMI + LOGICAL ERRFLG + COMMON /STREAM/ ERRFLG, LINE, IBUF2(265), IBUF3(7) ,JUNK(260) +C +C +C +C ---- ------ ------ ------ ------- ------- ------- ------------ +C +C WSTEPNE PRZETWARZANIE PROTOTYPOW LOKALNYCH -- ETAP II +C +C +C ----- ------ ------ ----- ----- ----- ----- ----- ----- ----- +C PRZETWARZANIE SYGNALOW +C + LN = 0 + I=IPMEM(INDSPR-4) + 100 IF ( I.EQ.0 ) GO TO 500 + CALL SIGNAL(I) + I = IPMEM(I+3) + GO TO 100 +C +C + 500 CONTINUE +C +C ------ ------ ------ ------ ------ ------- ------ ---- +C PRZEPISANIE LISTY VIRTLIST Z PREFIKSU +C + LISTVE=0 + LISTVB=LPML + IF(INDPREF.EQ.0) GO TO 1200 + I=IPMEM(INDPREF+25) +C I - DLUGOSC LISTY WIRTLIST Z PREFIKSU + IF(I.EQ.0) GO TO 1200 + IF(I.LT.0) I=-I +C JEST LISTY WIRTLIST W PREFIKSIE + INSYS=.TRUE. + LISTVB=MGETM(I,41) + LISTVE=LPML-1 + INSYS=.FALSE. +C PRZEPISYWANIE + K=IPMEM(INDPREF+24) +C K - POCZATEK LISTY VIRTLIST W PREFIKSIE + DO 1111 J=1,I + IJ1 = LISTVB+J-1 + IJ2 = K+J-1 + 1111 IPMEM(IJ1) = IPMEM(IJ2) + 1200 OWNVIR=.FALSE. +C PUSTA LISTA LOKALNYCH HANDLEROW + HLISTE = 0 +C PRZETWARZANIE WSZYSTKICH PROTOTYP6W + POM=.FALSE. + I=IPMEM(INDSPR+5) +C ZACZYNAMY OD TYPOW + 1300 IF(I.EQ.0) GO TO 1400 + CALL BEGPROT(IPMEM(I)) + I=IPMEM(I+1) + GO TO 1300 + 1400 IF(POM) GO TO 1600 + POM=.TRUE. +C PROCEDURY, FUNKCJE I BLOKI + I=IPMEM(INDSPR+6) + GO TO 1300 +C +1600 CONTINUE +C JESLI HANDLER TO KONIEC + IF ( IAND(IPMEM(INDPR),MOTHERS).EQ.MHAND) GO TO 4000 +C +C UTUPELNIENIE INFORMACJI I WIRTUALACH + IF(OWNVIR) GO TO 1700 +C NIE BYLO WLASNYCH WIRTUALI + IF(INDPREF.EQ.0) GO TO 1900 +C DOWIAZUJEMY SIE DO LISTY VIRTLIST Z PREFIKSU, ZMIENIAJAC DLUGOSC NA UJEMNA + IPMEM(INDPR+24) = IPMEM(INDPREF+24) + IPMEM(INDPR+25) = -IPMEM(INDPREF+25) + GO TO 1900 +C BYLY WLSNE WIRTUALE - PRZEPISUJEMY LISTE VIRTLIST + 1700 I=LISTVE-LISTVB+1 + K = MGETM(I,41) + IPMEM(INDPR+24) = K + DO 1777 J=1,I + IJ1=K+J-1 + IJ2=LISTVB+J-1 + 1777 IPMEM(IJ1) = IPMEM(IJ2) + IPMEM(INDPR+25) = I +C ZWALNIAMY PAMIEC PRZEZNACZONA NA VIRTLIST W CZESCI SYSTEMOWEJ + 1900 CONTINUE + LPML=LISTVB +C +C + 2000 CONTINUE +C +C ---- ----- ----- -------- ---------- ------- ---- ----- ------- +C NADAWANIE TYPOW ZMIENNYM +C + I=IPMEM(INDSPR+3) + IF(I.EQ.0) GO TO 2400 + 2100 J=IPMEM(I) +C J - IDENTYFIKATOR OPISU ZMIENNEJ W IPMEM + NM=IPMEM(I+2) +C NM - NAZWA TYPU + LINE=IPMEM(I+1) + K=IFTYPE(NM) + IPMEM(J-3) = K + IPMEM(J-4) = IPMEM(I+3) +C NADANIE APETYTU ZMIENNEJ + IPMEM(J) = IAP(J) +C JESLI TO JEST TYP FORMALNY, TO POPRAWIAMY SLOWO ZEROWE OPISU ZMIENNEJ + IF(IAND(IPMEM(K),MTP).NE.6) GO TO 2350 + IPMEM(J) = IOR(IPMEM(J),ISHFT(1,12)) +C JESLI TYP FORMALNY JEST NIELOKALNY, TO ZMIENIAMY RODZAJ PROTOTYPU +C NA KLASE PELNA + IF(LOCAL.EQ.2) GO TO 2350 + CALL CHECK(INDPR) + 2350 I=IPMEM(I+4) + IF(I.NE.0) GO TO 2100 +C +C + 2400 CONTINUE +C +C ---- ------ ----- --- ---- ------ ----- ------ ---------- +C SPRAWDZENIE POPRAWNOSCI LIST HIDDEN I CLOSE I UZUPELNIENIE INFORMACJI +C +C JESLI PROTOTYP NIE JEST KLASA TO PRZECHODZIMY DALEJ + IF(IPMEM(INDSPR).NE.2.AND.IPMEM(INDSPR).NE.7) GO TO 3000 + I=IPMEM(INDSPR+12) +C K = 0 -- CLOSE, K=1 -- HIDDEN + K=1 + 2500 IF(I.EQ.0) GO TO 2700 + NME=IPMEM(I) + LN=LINE + LINE=IPMEM(I+1) +C NME - NAZWA W LISCIE HIDDEN(CLOSE) + NH=IAND(ISHFT(NME,-1),7)+1 + J=MEMPRF(INDPR) + IF(J.EQ.0) GO TO 2600 +C NAZWA JEST ZADEKLAROWANA +C JESLI NAZWA JEST HIDDEN LUB NOT TAKEN, TO BLAD + NM=IPMEM(J+1) + IF(BTEST(NM,2)) GO TO 2660 + IF(OWN) GO TO 2550 + IF(BTEST(NM,1)) GO TO 2650 +C NAZWA POCHODZI Z PREFIKSU + NM=INSERT(NME,IPMEM(IHBEG),41) + IPMEM(NM+2) = IPMEM(J+2) + IPMEM(NM+1)= IPMEM(J+1) + J=NM +C USTAWIAMY BIT K W ELEMENCIE LISTY HASHU + 2550 IPMEM(J+1) = IOR(IPMEM(J+1),ISHFT(1,K)) +C PRZECHODZIMY DO NASTEPNEGO ELEMENTU LISTY + 2560 I=IPMEM(I+2) + GO TO 2500 +C NAZWA NIEZADEKLAROWANA + 2600 J=INSERT(NME,IPMEM(IHBEG),41) + CALL MERR(305,NME) + GO TO 2550 +C NAZWA HIDDEN - NIEDOSTEPNA + 2650 CALL MERR(319,NME) + GO TO 2560 +C NAZWA NOT TAKEN - NIEDOSTEPNA + 2660 CALL MERR(320,NME) + GO TO 2560 + 2700 IF(K.EQ.0) GO TO 3000 + K=0 + I=IPMEM(INDSPR+13) + GO TO 2500 +C +C + 3000 CONTINUE +C +C---- ------ ------ ------ ------- ------- -------- ------- +C KOMPATYBILNOSC VIRTUALI +C + IF(.NOT.BTEST(IPMEM(INDPR),11)) GO TO 4000 +C PROTOTYP JEST VIRTUALEM +C SPRAWDZAMY, CZY ISTNIEJE WYZSZY VIRTUAL + LINE=LN + IF(IPMEM(INDPR+26).EQ.0) GO TO 4000 + CALL VIRTCOM +C +C + 4000 CONTINUE +C +C ------ ------ ------ ------ ------ ------ ------------- --- +C ZAKONCZENIE - ZAPAMIETUJEMY IDENTYFIKATOR PROTOTYPU W SLOWNIKU +C ISDICT +C + IPMEM(INDICT) = INDPR +C + RETURN + END + INTEGER FUNCTION IAP(IND) +C +C WYLICZA APETYT ATRYBUTU IND : +C 0 (00) - INTEGER,BOOLEAN,CHAR,STRING +C 1 (01) - REAL, FORMAL TYPE +C 2 (10) - FORMAL PROCEDURE,FORMAL FUNCTION +C 3 (11) - REFERENCE +C W WYNIKU ZMIENIA SLOWO ZEROWE +C + IMPLICIT INTEGER(A-Z) +C +C..... + LOGICAL INSYS, OWN + COMMON /BLANK/ COM(278), + X LMEM , LPMEM , IRECN , ISFIN , LPMSYS, LPML , LPMF , + X NRINT , NRRE , NRBOOL, NRCHR , NRCOR , NRPROC, NRTEXT, + X NRUNIV, NATTR , NRNONE, NBLSYS, NBLUS , NEMPTY, INSYS , + X LOCAL , OWN , OBJECT, + X IPMEM(5000) +C +C + COMMON / MASKS / MTP,MSPR,MOTHERS,MPAR,MASKTP,NOTTP, + * MPROCES, MCOR, MERPF, MBLOCK, MHAND, MNOTVIRT +C +C + J=IPMEM(IND-3) +C J - IDENT TYPU + I=IAND(IPMEM(J),MTP) + IAP=0 + IF(I.LT.8.OR.I.EQ.11) IAP = 3 + IF(J.EQ.NRRE) IAP=1 + IF(IPMEM(IND-4).NE.0) IAP=3 +C ZMIANA SLOWA ZEROWEGO + IAP=IOR(IPMEM(IND),ISHFT(IAP,14)) + RETURN + END + SUBROUTINE BEGPROT(NRSDIC) +C +C * * * * * * * * * * * * * * * * * * * +C PODPROGRAM SLUZY DO WSTEPNEGO PRZETWARZANIA PROTOTYPOW LOKALNYCH +C W PROTOTYPIE IDENTYFIKOWANYM PRZEZ INDPR. +C DLA KAZDEGO PROTOTYPU: +C - ANALIZUJE JEGO PREFIKS +C - UZUPELNIA INFORMACJE O RODZAJU PROTOTYPU +C - JESLI PROTOTYP JEST PROCEDURA LUB FUNKCJA VIRTUALNA, TO SZUKA +C BEZPOSREDNIO WYZSZEGO VIRTUALA I WSTAWIA IDENTYFIKATOR PROTOTYPU +C DO LISTY VIRTLIST PROTOTYPU OBEJMUJACEGO. +C - DLA FUNKCJI -- ZNAJDUJE JEJ TYP. +C PODPROGRAM WSTAWIA PARE ( NRSDIC, IDENT. W IPMEM) DO KOLEJKI +C PROTOTYPOW. +C NRSDIC - INDEKS PROTOTYPU W IPMEM. +C W IPMEM W POLU SL ZAPAMIETANY JEST IDENTYFIKATOR TEGO PROTOTYPU W +C IPMEM. +C * * * * * * * * * * * * * * * * * +C +C + IMPLICIT INTEGER(A-Z) +C +C + LOGICAL IFCLASS,BPREF,ONLY +C +C INSERTION OF + LOGICAL BTEST +C BECAUSE OF TYPECONFLICT 03.01.84 +C +C +C..... + LOGICAL INSYS, OWN + COMMON /BLANK/ COM(278), + X LMEM , LPMEM , IRECN , ISFIN , LPMSYS, LPML , LPMF , + X NRINT , NRRE , NRBOOL, NRCHR , NRCOR , NRPROC, NRTEXT, + X NRUNIV, NATTR , NRNONE, NBLSYS, NBLUS , NEMPTY, INSYS , + X LOCAL , OWN , OBJECT, + X IPMEM(5000) +C +C + COMMON / DGLOB/ INDICT,INDSPR,INDPR,IHBEG,LASTPR,INDPREF +C +C ** ** ** ** *** ** ** ** ** ** ** ** ** ** ** ** ** +C BLOK ZAWIERA DANE O PRZETWARZANYM PROTOTYPIE +C INDICT - INDEKS PRZETWARZANEGO PROTTYPU W ISDICT +C INDSPR - IDENTYFIKATOR PROTOTYPU W ISMEM +C INDPR - IDENTYFIKATOR PROTOTYPU W IPMEM +C IHBEG - ADRES PIERWSZEGO SLOWA TABLICY HASHU +C IDPREF - IDENTYFIKATOR BEZPOSREDNIEGO PREFIKSU PRZETWARZANEGO +C PROTOTYPU +C LASTPR - IDENTYFIKATOR POPRZEDNIO PRZETWARZANEGO PROTOTYPU +C +C + COMMON / VIRT / LISTVB,LISTVE,OWNVIR + LOGICAL OWNVIR +C +C ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** +C ROBOCZY BLOK WSPOLNY. +C LISTVB - POCZATEK ROBOCZEJ LISTY VIRTLIST +C LISTVE - KONIEC ROBOCZEJ LISTY VIRTLIST +C OWNVIR = TRUE, JESLI W PROTOTYPIE BYLY WLASNE VIRTUALE +C +C + COMMON / MASKS / MTP,MSPR,MOTHERS,MPAR,MASKTP,NOTTP, + * MPROCES, MCOR, MERPF, MBLOCK, MHAND + *, MNOTVIR +C +C + COMMON /PREFS/ LPREFS +C +C ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** +C LPREFS - OSTATNIO PRZYDZIELONY NUMER W PREFIXSET +C +C +C.....BLOK KOMUNIKACJI ZE STRUMIENIAMI + LOGICAL ERRFLG + COMMON /STREAM/ ERRFLG, LINE, IBUF2(265), IBUF3(7),JUNK(260) +C +C + COMMON / DONLY / IONLY,ONIL + LOGICAL ONIL +C +C ROBOCZY BLOK,UZYWANY PRZY TWORZENIU ZBIORU IDENTYFIKAROROW +C IONLY - POCZATEK LISTY TAKEN +C ONIL - TRUE, GDY JEST TAKEN NONE +C +C +C +C +C * * * * * * * * * * * * * +C NADANIE WARTOSCI ZMIENNYM. +C IDSMEM - IDENTYFIKATOR W IPMEM PRZETWARZANEGO PROTOTYPU. +C IDPMEM - IDENTYFIKATOR PROTOTYPU W IPMEM. +C ISYS = 1 DLA COROUTINE, ISYS = 2 DLA PROCESS. +C LINE - NR LINII DEKLARACJI PROTOTYPU. +C * * * * * * * * * * * * * +C +C + IDSMEM = IPMEM(NRSDIC) + IDPMEM = IPMEM(IDSMEM+1) +C JESLI HANDLER - TO DO PRZETWARZANIE HANDLERA + IF(IPMEM(IDSMEM).EQ.8) GO TO 2500 + ISYS=IAND(IPMEM(IDSMEM+8),MSPR) + LINE = IPMEM(IDSMEM+9) +C +C +C * * * * * * * * * * * * * * * +C PRZETWARZANIE PREFIKSU +C * * * * * * * * * * * * * * +C +C I - NAZWA PREFIKSU + I = IPMEM(IDSMEM+2) +C IDPR - BEDZIE IDENTYFIKATOREM PREFIKSU + IDPR = 0 + IF( I.EQ.0) GO TO 500 +C JEST PREFIKS + IDPR = MEMSL(I,INDPR) + IF(IDPR.NE.0) GO TO 50 +C PREFIKS JEST NIEZADEKLAROWANY + CALL MERR(308,I) + GO TO 500 +C BADAMY, CZY PREFIKS JEST DOSTEPNY + 50 IRODZ=IPMEM(IDPR+1) + IF(BTEST(IRODZ,2)) GO TO 60 + IF(.NOT.BTEST(IRODZ,1) .OR.OWN)GO TO 100 +C NAZWA PROFIKSU JEST HIDDEN - BLAD + CALL MERR(322,I) + GO TO 150 +C NAZWA PREFIKSU JEST NOT-TAKEN + 60 CALL MERR(323,I) + GO TO 150 +C BADAMY, CZY PREFIKS JEST KLASA + 100 IDPR = IPMEM(IDPR+2) + IF(IDPR.EQ.NRUNIV) GO TO 150 +C IRODZ - CZESC T W SLOWIE ZEROWYM PREFIKSU + IRODZ=IAND(IPMEM(IDPR),MTP) + IF(IFCLASS(IRODZ)) GO TO 200 +C PREFIKS NIE JEST KLASA + CALL MERR(301,I) + 150 IDPR=0 + GO TO 210 +C +C PREFIKS JEST POPRAWNY + 200 CONTINUE +C JESLI PREFIKS MIAL BLEDNA LISTE PF, TO POPRAWIAMY +C SLOWO ZEROWE + IF(IAND(IPMEM(IDPR),MERPF).EQ.0) GO TO 250 +C POPRAWIAMY SLOWO ZEROWE + 210 IPMEM(IDPMEM) = IOR(IPMEM(IDPMEM),MERPF) + 250 CONTINUE + IF(IDPR.EQ.0) GO TO 500 +C WSTAWIAMY IDENTYFIKATOR BEZPOSREDMIEGO PREFIKSU DO OPISU PROTOTYPU + IPMEM(IDPMEM+21) = IDPR +C PRZEPISANIE LISTY PREFIKSLIST Z PREFIKSU I DOLACZENIE SIEBIE +C NA KONCU LISTY +C I - DLUGOSC LISTY PREFIKSLIST Z PREFIKSU - 1 +C J - POCZATEK PREFIXLIST Z PREFIKSU +C J1 - POCZATEK TWORZONEJ LISTY PREFIKSLIST + I=IPMEM(IDPR+23) + J = IPMEM(IDPR+22) + J1 = MGETM(I+1,41) + DO 222 II=1,I + IJ1=J1+II-1 + IJ2=J+II-1 + 222 IPMEM(IJ1) = IPMEM(IJ2) +C DOLOCZAMY SIEBIE DO LISTY PREFIXLIST I WSTAWIAMY PREFIXLIST DO +C OPISU PROTOTYPU + IJ1=J1+I + IPMEM(IJ1) = IDPMEM + IPMEM(IDPMEM+22)=J1 + IPMEM(IDPMEM+23) = I+1 +C +C SPRAWDZENIE POPRAWNOSCI PREFIKSOW SYSTEMOWYCH +C TWORZENIE PREFIXSET +C +C +C +C I=1 JESLI PREFIKS JEST COROUTINA +C I=2 JESLI PREFIKS JEST PRECESEM +C I=0 W PRZECIWNYM PRZYPADKU + I=0 + IF(BPREF(IDPR,IPMEM(NRCOR-6))) I=1 + IF(BPREF(IDPR,IPMEM(NRPROC-6))) I=2 +C JESLI PROTOTYP NIE JEST KLASA, TO PRZECHODZIMY DO BADANIA POPRAWNOSCI +C PREFIKSOWANIA + J=IAND(IPMEM(IDPMEM),MTP) + IF(J.EQ.NOTTP) GO TO 800 +C PRZEPISANIE PREFIXSET Z PREFIKSU + IPMEM(IDPMEM-3) = IPMEM(IDPR-3) + IPMEM(IDPMEM-4) = IPMEM(IDPR-4) + IPMEM(IDPMEM-5) = IPMEM(IDPR-5) +C ROZPOZNAMIE RODZAJU PROTOTYPU + IF(ISYS.LT.I) ISYS=I + 300 IF(ISYS.EQ.0) GO TO 400 +C +C PROTOTYP JEST COROUTINA LUB PROCESEM + CALL CHECK(INDPR) +C USTAWIAMY ODPOWIEDNIE BITY W PREFIXSET + I=IPMEM(IDPMEM) + CALL MSETB(IDPMEM,IPMEM(NRCOR-6)) + IF(ISYS.NE.2) GO TO 350 + CALL MSETB(IDPMEM,IPMEM(NRPROC-6)) +C POPRAWIAMY SLOWO ZEROWE PROTOTYPU - TO JEST PROCES + IPMEM(IDPMEM) = IOR(IAND(I,MASKTP),MPROCES) + GO TO 400 +C POPRAWIAMY SLOWO ZEROWE - TO JEST COROUTINA + 350 IPMEM(IDPMEM) = IOR(IAND(I,MASKTP),MCOR) +C PRZYDZIELENIE NUMERU W SENSIE PREFIXSET + 400 LPREFS = LPREFS+1 + CALL MSETB(IDPMEM,LPREFS) + IPMEM(IDPMEM-6) = LPREFS +C JESLI KLASA MA BLEDNA LISTE PF, TO POPRAWIAMY NA PELNA + IF(IAND(IPMEM(IDPMEM),MERPF).NE.0) + * CALL CHECK(IDPMEM) +C JESLI W KLASIE BYLY INSTRUKCJE, TO POPRAWIAMY NA KLASE PELNA + IF(BTEST(IPMEM(IDSMEM+8),13)) CALL CHECK(IDPMEM) + GO TO 1000 +C +C NIE BYLO PREFIKSU, LUB BYL BLEDNY PREFIKS. +C JESLI PROTOTYP JEST BLOKIEM, TO KONCZYMY PRZETWARZANIE PREFIKSOW + 500 CONTINUE + J1 = IPMEM(IDPMEM) + IF(IAND(J1,MTP).EQ.NOTTP.AND.IAND(J1,MOTHERS).EQ.MBLOCK) + * GO TO 1000 +C DOLOCZAMY SIEBIE JAKO JEDYNY ELEMENT LISTY PREFIKSOW + J = MGETM(1,41) + IPMEM(J) = IDPMEM + IPMEM(IDPMEM+22) = J + IPMEM(IDPMEM+23) = 1 +C JESLI PROTOTYP NIE JEST KLASA, TO KONIEC PRZETWARZANIA PREFIKSOW + IF(IAND(J1,MTP).EQ.NOTTP) GO TO 1000 +C USTAWIAMY BIT 2 W PREFIKSSET NA 1 I PRZECHODZIMY DO USTALENIA RODZAJU +C KLASY + CALL MSETB(IDPMEM,2) + GO TO 300 +C +C SPRAWDZENIE POPRAWNOSCI PREFIKSOW SYSTEMOWYCH + 800 IF(I.EQ.0) GO TO 1000 +C COROUTINE LUB PROCES NIE PREFIKSUJE KLASY + CALL MERR(303,IPMEM(IDSMEM+2)) +C +C +C --- --- --- --- --- --- --- --- --- --- --- --- +C PRZETWARZANIE INFORMACJI O WIRTUALACH +C + 1000 CONTINUE +C +C JESLI TO NIE JEST WIRTUAL, TO PRZECHODZIMY DALEJ + IF(.NOT.BTEST(IPMEM(IDSMEM+8),15)) GO TO 2000 +C TO JEST WIRTUAL. +C JESLI PROTOTYP OBEJMUJACY JEST BLOKIEM NIEPREFIKSOWANYM, TO KASUJEMY +C WIRTUALE + IF(IPMEM(INDPR).NE.1) GO TO 1001 + IPMEM(IDPMEM)=IAND(IPMEM(IDPMEM),MNOTVIR) + GO TO 2000 +C +C BIT NR 11 W SLOWIE ZEROWYM JEST JUZ USTAWIONY PRZEZ PODPROGRAM INITPR +C OWNVIR = .TRUE., JESLI W PROTOTYPIE INDPR SA WLASNE WIRTUALE +C + 1001 OWNVIR=.TRUE. +C CZUKA,Y BEZPOSREDNIO WYZSZEGO VIRTUALA + IF(INDPREF.EQ.0) GO TO 1300 +C PROTOTYP OBEJMUJACY MA PREFIKS +C I - NAZWA VIRTUALA + I=IPMEM(IDSMEM+10) +C SPRAWDZAMY,CZY WIRTUAL JEST NA LISCIE TAKEN Z PREFIKSU + IONLY=IPMEM(INDSPR+7) + ONIL=BTEST(IPMEM(INDSPR+8),14) + IF(.NOT.ONLY(I)) GO TO 1300 + J=MEMSL(I,INDPREF) + IF(J.EQ.0) GO TO 1300 + IF(LOCAL.NE.2.OR.BTEST(IPMEM(J+1),1)) GO TO 1300 + IF(BTEST(IPMEM(J+1),2)) GO TO 1300 + J = IPMEM(J+2) +C SPRAWDZAMY,CZY TO JEST WIRTUAL + IF(.NOT.BTEST(IPMEM(J),11)) GO TO 1300 +C ZNALEZLISMY BEZPOSREDNIO WYZSZY WIRTUAL +C J - IDENTYFIKATOR BEZPOSREDNIO WYZSZEGO WIRTUALA +C I - NUMER WIRTUALNY + I = IPMEM(J+27) + IPMEM(IDPMEM+26) = J + IPMEM(IDPMEM+27) = I +C WSTAWIAMY WIRTUAL DO VIRTLIST (ROBOCZEJ) PROTOTYPU OBEJMUJACEGO + IJ1=LISTVB+I + IPMEM(IJ1) = IDPMEM + GO TO 2000 +C +C NIE BYLO BEZPOSREDNIO WYZSZEGO WIRTUALA + 1300 CONTINUE + INSYS = .TRUE. + LISTVE = MGETM(1,41) +C DOKLADAMY NUMER WIRTUALNY + IPMEM(IDPMEM+27) = LISTVE-LISTVB + INSYS=.FALSE. + IPMEM(LISTVE)=IDPMEM +C +C +C -- -- -- -- -- -- -- -- --- -- -- -- --- -- -- +C DLA FUNKCJI -- PRZETWARZANIE JEJ TYPU +C + 2000 CONTINUE +C +C BADAMY, CZY PROTOTYP JEST FUNKCJA + I = ISHFT(IAND(IPMEM(IDPMEM),MOTHERS),-8) + IF(I.NE.2) GO TO 3000 +C SZUKAMY TYPU; J - NAZWA TYPU + J = IPMEM(IDSMEM+12) + I=IFTYPE(J) +C SPRAWDZAMY, CZY TO JEST TYP FORMALNY +C I - IDENTYFIKATOR TYPU + IF(IAND(IPMEM(I),MTP).NE.6) GO TO 2100 +C TO JEST TYP FORMALBY - ZMIANA SLOWA ZEROWEGO W PROTOTYPIE FUNKCJI + IPMEM(IDPMEM)= IOR(IPMEM(IDPMEM),ISHFT(1,12)) +C WSTAWIENIE TYPU + 2100 IPMEM(IDPMEM-3) = I + IPMEM(IDPMEM-4) = IPMEM(IDSMEM+13) + GO TO 3000 +C +C + 2500 CONTINUE +C +C --- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- +C PRZETWARZANIE HANDLERA +C + CALL HANDLER ( IDSMEM ) +C +C +C +C ---- ---- ---- ---- ---- ---- ---- ---- +C WSTAWINEI PARY (NRSDIC,IDPMEM) DO KOLEJKI PROTOTYPIOW +C + 3000 CONTINUE + CALL DPUTQ(NRSDIC,IDPMEM) + RETURN + END + LOGICAL FUNCTION IFCLASS(IX) + +C ***************** +C FUNKCJA DAJE ODPOWIEDZ, CZY DANY PROTOTYP JEST KLASA +C IX - CZESC T ZE SLOWA ZEROWEGO PROTOTYPU +C +C **************** +C + IFCLASS=IX.EQ.2 .OR. IX.EQ.3 .OR. IX.EQ.5 .OR. IX.EQ.7 + RETURN + END + INTEGER FUNCTION INITPR(KIND,NAME) +C +C * * * * * * * * * * * * * * * * * +C FUNKCJA WYKONUJE WSTEPNE CZYNNOSCI ( REZERWACJA MIEJSCA,USTAWIENIE +C LISTY ATRYBUTOW I TABLICY HASHU ) DLA PROTOTYPU. +C NAME - NAZWA PROTOTYPU +C KIND - RODZAJ PROTOTYPU +C WARTOSCIA FUNKCJI JEST IDENTYFIKATOR UTWORZONEGO PROTOTYPU. +C * * * * * * * * * * * * * * * * * +C +C + IMPLICIT INTEGER(A-Z) +C +C + COMMON / YNIT / NULLWD(23), SIZEPR(23), NULLPOZ(23), CONSTWD, + * VARWD,VARPOM,INPFW,OUTPFW, INOUT +cdsw INTEGER SIZEPR, CONSTWD, VARWD, VARPOM, OUTPFW +C +C ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** +C NULLWD(I) - WZORZEC SLOWA ZEROWEGO DLA PROTOTYPU RODZAJU I +C SIZEPR(I) - ROZMIAR POLA W IPMEM -- -- -- +C NULLPOZ(I) - POZYCJA SLOWA ZEROWEGO -- -- -- +C CONSTWD - WZORZEC SLOWA ZEROWEGO DLA CONST +C VARWD - -- -- -- -- DLA ZMIENNEJ +C VARPOM - -- -- -- -- ZMIENNEJ POMOCNICZEJ +C INPFW - -- -- -- -- ZMIEMNEJ INPUT +C OUTPFW - -- -- -- -- ZMIENNEJ OUTPUT +C INOUT - -- -- -- -- ZMIENNEJ INOUT +C +C +C + COMMON / DGLOB/ INDICT,INDSPR,INDPR,IHBEG,LASTPR,INDPREF +C +C ** ** ** ** *** ** ** ** ** ** ** ** ** ** ** ** ** +C BLOK ZAWIERA DANE O PRZETWARZANYM PROTOTYPIE +C INDICT - INDEKS PRZETWARZANEGO PROTTYPU W ISDICT +C INDSPR - IDENTYFIKATOR PROTOTYPU W ISMEM +C INDPR - IDENTYFIKATOR PROTOTYPU W IPMEM +C IHBEG - ADRES PIERWSZEGO SLOWA TABLICY HASHU +C IDPREF - IDENTYFIKATOR BEZPOSREDNIEGO PREFIKSU PRZETWARZANEGO +C PROTOTYPU +C LASTPR - IDENTYFIKATOR POPRZEDNIO PRZETWARZANEGO PROTOTYPU +C +C ..... ZMIENNE GLOBALNE +C +C +C..... + LOGICAL INSYS, OWN + COMMON /BLANK/ COM(278), + X LMEM , LPMEM , IRECN , ISFIN , LPMSYS, LPML , LPMF , + X NRINT , NRRE , NRBOOL, NRCHR , NRCOR , NRPROC, NRTEXT, + X NRUNIV, NATTR , NRNONE, NBLSYS, NBLUS , NEMPTY, INSYS , + X LOCAL , OWN , OBJECT, + X IPMEM(5000) +C +cdeb ----------- added --------------------- + common /names/ resnm, mainm, brenam +c nazwy ze scannera + + common /brid/ breaklid +c numer w displayu (dla interpretera) prototypu breakl +cdeb --------------------------------------- +C +C +C REZERWACJA MIEJSCA I USTAWIENIE SLOWA ZEROWEGO + IF(KIND.GE.13 .AND.KIND.LE. 16) INSYS=.TRUE. + INITPR = MGETM(SIZEPR(KIND),341) + INSYS=.FALSE. + INITPR=INITPR+NULLPOZ(KIND) + IPMEM(INITPR) = NULLWD(KIND) +C DOLACZENIE DO LISTY NEXTDECL + IPMEM(LASTPR+2) = INITPR + LASTPR = INITPR +cdeb ----------- added -------------------- + if(name.ne.brenam) go to 82 +c przekazanie na zmiennej breaklid numeru prototypu +c procedury breakl +c obliczenie numeru prototypu + i = nblus + breaklid = 0 + 80 k = ipmem(i) +c formaLNE i sygnaly sa pomijane + if(iand(ishft(k,-4),15).ne.0) go to 81 + if(i.eq.lastpr) go to 82 + breaklid = breaklid+1 + 81 i = ipmem(i+2) + if(i.ne.0) go to 80 + 82 continue +cdeb --------------------------------------- + IF ( KIND .GE.17.AND.KIND.LE.20) GO TO 100 +C INICJALIZACJA LISTY ATRYBUTOW + IPMEM(INITPR+7) = INITPR+5 + IPMEM(INITPR+5) = NATTR +C USTAWIENIE SL + 100 IPMEM(INITPR-1) = INDPR +C WSTAWIENIE 1 DO POLA USED - DLA AIL + IPMEM(INITPR+1) = 1 +C DLA BLOKOW I HANDLEROW - KONIEC + IF(KIND.EQ.1.OR. KIND.EQ.8 .OR. KIND.EQ.23) RETURN +C WSTAWIENIE NAZWY PROTOTYPU DO TABLICY HASH'U +C JESLI TO JEST PROTOTYP FORMALNY II-GO RZEDU, TO ELEMENTY LISTY HASH'U SA +C TWORZONE W CZESCI SYSTEMOWEJ + IF( KIND.GE.18 .AND. KIND.LE.20 ) INSYS = .TRUE. + IF( NAME .EQ.NEMPTY) GO TO 200 + I = IDPUT(NAME,IPMEM(IHBEG)) + IF ( I.EQ.0) GO TO 200 + IPMEM(I+2) = INITPR +C DLA SYGNALOW - KONIEC + 200 IF ( KIND.GE.21 ) RETURN +C WSTAWIENIE DO LISTY ATRYBUTOW ( PROTOTYPU INDPR ) +C JESLI INDPR JEST FORMALNY, TO LISTA ATRYBUTOW JEST TWORZONA +C W CZESCI SYSTEMOWEJ + CALL MADATR(INITPR,INDPR,41) + INSYS = .FALSE. + RETURN + END + SUBROUTINE MERGEID +C +C * * * * * * * * * * * * * * * * * +C PODPROGRAM DOKLADA DO ZBIORU IDENTYFIKATOROW PROTOTYPU INDPR +C IDENTYFIKATORY Z PREFIKSU TAKIE,ZE: +C - JESZCZE ICH NIE MA +C - NIE MA ICH NA LISCIE TAKEN +C PODPROGRAM JEST WYWOLYWANY O ILE BYL PREFIKS. +C * * * * * * * * * * * * * * * * * +C + IMPLICIT INTEGER (A-Z) +C + LOGICAL ONLY +C +C INSERTION OF + LOGICAL BTEST +C BECAUSE OF TYPECONFLICT 03.01.84 + COMMON / DGLOB/ INDICT,INDSPR,INDPR,IHBEG,LASTPR,INDPREF +C +C ** ** ** ** *** ** ** ** ** ** ** ** ** ** ** ** ** +C BLOK ZAWIERA DANE O PRZETWARZANYM PROTOTYPIE +C INDICT - INDEKS PRZETWARZANEGO PROTTYPU W ISDICT +C INDSPR - IDENTYFIKATOR PROTOTYPU W ISMEM +C INDPR - IDENTYFIKATOR PROTOTYPU W IPMEM +C IHBEG - ADRES PIERWSZEGO SLOWA TABLICY HASHU +C IDPREF - IDENTYFIKATOR BEZPOSREDNIEGO PREFIKSU PRZETWARZANEGO +C PROTOTYPU +C LASTPR - IDENTYFIKATOR POPRZEDNIO PRZETWARZANEGO PROTOTYPU +C +C +C..... + LOGICAL INSYS, OWN + COMMON /BLANK/ COM(278), + X LMEM , LPMEM , IRECN , ISFIN , LPMSYS, LPML , LPMF , + X NRINT , NRRE , NRBOOL, NRCHR , NRCOR , NRPROC, NRTEXT, + X NRUNIV, NATTR , NRNONE, NBLSYS, NBLUS , NEMPTY, INSYS , + X LOCAL , OWN , OBJECT, + X IPMEM(5000) +C + LOGICAL ERRFLG + COMMON/STREAM/ERRFLG,LINE,IBUF2(265),IBUF3(7),JUNK(260) + COMMON/MEM/NM,NH + COMMON/DONLY/IONLY,ONIL + LOGICAL ONIL +C +C ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** +C ROBOCZY BLOK, UZYWANY PRZY TWORZENIU ZBIORU IDENTYFIKATOROW +C IONLY - POCZATEK LISTY TAKEN W ISMEM +C ONIL=TRUE, GDY JEST TAKEN NIL +C +C +C +C SPRAWDZAMY, CZY BYLO TAKEN NIL + ONIL=BTEST(IPMEM(INDSPR+8),14) + IF(ONIL) GO TO 500 +C +C * * * * * * +C SPRAWDZENIE POPRAWNOSCI LISTY TAKEN +C * * * * * * +C +C IHBEGP -- POCZATEK LISTY IDENTYFIKATOROW W PREFIKSIE + IHBEGP=INDPREF+10 + IONLY=IPMEM(INDSPR+7) + IF(IONLY .EQ.0) GO TO 500 +C J - POPRZEDNI ELEMENT LISTY +C I - BIEZACY ELEMENT LISTY + J=0 + I=IONLY + 100 NM=IPMEM(I) + LINE=IPMEM(I+1) + NH=IAND(ISHFT(NM,-1),7)+1 + M=MEMPRF(INDPREF) +C M - ELEMENT LISTY HASHU, JESLI NAZWA NM JEST ZADEKLAROWANA W PREFIKSACH + IF(M .EQ. 0) GO TO 400 +C SPRAWDZAMY, CZY NAZWA JEST HIDDEN + IF(BTEST(IPMEM(M+1),1)) GO TO 300 +C SPRAWDZAMY,CZY NAZWA JEST NOT TAKEN + IF(BTEST(IPMEM(M+1),2)) GO TO 250 +C POPRAWNY ELEMENT LISTY TAKEN + J=I + 200 I=IPMEM(I+2) + IF(I.NE.0) GO TO 100 + GO TO 500 +C NAZWA JEST NOT TAKEN - USUWAMY Z LISTY TAKEN + 250 CALL MERR(321,NM) + GO TO 200 +C NAZWA JEST HIDDEN + 300 CALL MERR(304,NM) + GO TO 200 +C NAZWA NIEZADEKLAROWANA + 400 CALL MERR(305,NM) +C DOKLADAMY NAZWE DO ZBIORU IDENTYFIKATOROW + M = MEMBER(NM,IPMEM(IHBEG)) + IF(M.NE.0) GO TO 200 + M=INSERT(NM,IPMEM(IHBEG),341) + GO TO 200 +C +C * * * * * * +C LACZENIE ZBIOROW IDENTYFIKATOROW +C * * * * * * +C + 500 CONTINUE +C PRZEGLADAMY KOLEJNE PREFIKSY + IDP= INDPREF + 800 CONTINUE +C IE - KONIEC TABLICY IDENTYFIKATOROW W PREFIKSIE + IE= IDP+17 +C IHBEGP - POCZATEK LISTY IDENTYFIKATOROW W PREFIKSIE + IHBEGP=IDP+10 + DO 555 I=IHBEGP,IE,1 +C I - INDEKS KOLEJNEGO ELEMENTU TABLICY HASHU +C J - ELEMENT TABLICY HASHU + J=IPMEM(I) + IF(J.EQ.0) GO TO 555 + 600 CONTINUE +C JESLI NAZWA JEST HIDDEN - TO DALEJ + IF(BTEST(IPMEM(J+1),1)) GO TO 700 +C JESLI NAZWA JEST NOT TAKEN - TO DALEJ + IF(BTEST(IPMEM(J+1),2)) GO TO 700 + NM=IPMEM(J) + IF(ONLY(NM)) GO TO 700 +C NAZWY NIE MA NA LISCIE TAKEN + NH=IAND(ISHFT(NM,-1),7)+1 +C SZUKAMY NAZWY OD INDPR PO PREFIKSACH + IND = INDPR + 610 M = IND+9+NH + M = IPMEM(M) + 620 IF(M.EQ.0) GO TO 650 + IF(IPMEM(M).EQ.NM) GO TO 670 + M = IPMEM(M+3) + GO TO 620 + 650 IND = IPMEM(IND+21) + GO TO 610 +C NAZWA MUSI ZOSTAC ZNALEZIONA +C JESLI NAZWA BYLA ZNALEZIONA PONIZEJ IDP, TO +C ALBO BYLA JUZ ROZPATRYWANA, ALBO BYLA JUZ NOT TAKEN, +C ALBO JEST LOKALNA W INDPR + 670 IF(IND.NE.IDP) GO TO 700 +C NAZWE TRZEBA DOSTAWIC + M=INSERT(NM,IPMEM(IHBEG),341) + IPMEM(M+1) = 4 + IPMEM(M+2) = IPMEM(J+2) + 700 J=IPMEM(J+3) + IF(J.NE.0) GO TO 600 + 555 CONTINUE +C PRZECHODZIMY DO NATEPNEGO PREFIKSU + IDP=IPMEM(IDP+21) + IF(IDP.NE.0) GO TO 800 + RETURN + END + LOGICAL FUNCTION ONLY(NAME) +C +C * * * * * * * * * * * * * * * * * * * * * * +C FUNKCJA SPRAWDZA, CZY NAZWA NAME JEST NA LISCIE TAKEN +C POCZATEK LISTY TAKEN - IONLY +C * * * * * * * * * * * * * * * * * +C +C + IMPLICIT INTEGER(A-Z) +C +C..... + LOGICAL INSYS, OWN + COMMON /BLANK/ COM(278), + X LMEM , LPMEM , IRECN , ISFIN , LPMSYS, LPML , LPMF , + X NRINT , NRRE , NRBOOL, NRCHR , NRCOR , NRPROC, NRTEXT, + X NRUNIV, NATTR , NRNONE, NBLSYS, NBLUS , NEMPTY, INSYS , + X LOCAL , OWN , OBJECT, + X IPMEM(5000) +C +C + COMMON / DONLY / IONLY,ONIL + LOGICAL ONIL +C +C ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** +C ROBOCZY BLOK, UZYWANY PRZY TWORZENIU ZBIORU IDENTYFIKATOROW +C IONLY - POCZATEK LISTY TAKEN W ISMEM +C ONIL=TRUE, GDY JEST TAKEN NIL + +C +C JESLI LISTA TAKEN JEST PUSTA, TO ZAKLADAMY, ZE SA W NIEJ WSZYSTKIE +C NAZWY +C + ONLY=.FALSE. + IF(ONIL) RETURN + IF(IONLY.EQ.0) GO TO 200 + I=IONLY + 100 IF(IPMEM(I).EQ.NAME) GO TO 200 + I=IPMEM(I+2) + IF(I.NE.0) GO TO 100 +C NAZWY NIE MA NA LISCIE TAKEN + RETURN +C NAZWA JEST NA LISCIE TAKEN + 200 ONLY=.TRUE. + RETURN + END + SUBROUTINE CHECK ( IND ) +C +C * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +C POPRAWIA BIT OZNACZAJACY PELNA KLASE POCZAWSZY OD PROTOTYPU IND +C KONCZY, JESLI TEN BIT JEST 1 +C * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +C + IMPLICIT INTEGER(A-Z) +C +C INSERTION OF + LOGICAL BTEST +C BECAUSE OF TYPECONFLICT 03.01.84 +C +C..... + LOGICAL INSYS, OWN + COMMON /BLANK/ COM(278), + X LMEM , LPMEM , IRECN , ISFIN , LPMSYS, LPML , LPMF , + X NRINT , NRRE , NRBOOL, NRCHR , NRCOR , NRPROC, NRTEXT, + X NRUNIV, NATTR , NRNONE, NBLSYS, NBLUS , NEMPTY, INSYS , + X LOCAL , OWN , OBJECT, + X IPMEM(5000) +C +C COM - OBSZAR KOMUNIKACYJNY STRUMIENI +C LMEM - (=5000) ROZMIAR CALEJ PAMIECI GLOWNEJ +C LPMEM - PODZIAL PAMIECI NA CZESCI IPMEM I ISMEM +C IRECN - INDEKS SZCZYTU STOSU STALYCH REAL +C ISFIN - INDEKS SZCZYTU SLOWNIKA PROTOTYPOW +C +C LPMSYS - INDEKS PIERWSZEGO SLOWA W IPMEM OBSZARU NIEPRZEZ- +C NACZONEGO NA PROTOTYPY SYSTEMOWE +C LPML - INDEKS PIERWSZEGO SLOWA OBSZARU WOLNEGO W IPMEM +C LPMF - INDEKS OSTATNIEGO SLOWA WOLNEGO OBSZARU W IPMEM +C +C +C + J=IND + 100 I=IPMEM(J) + IF(BTEST(I,0)) RETURN + IPMEM(J) = IOR(I,1) + J=IPMEM(J-1) + GO TO 100 + END + INTEGER FUNCTION IDPUT(NAME,THASH) +C +C * * * * * * * * * * * * * * * * * +C FUNKCJA WSTAWIA NAZWE NAME DO TABLICY THASH UPRZEDNIO SPRWDZAJAC, +C CZY NAZWA JUZ TAM JEST. +C JESLI JEST, TO WARTOSCIA FUNKCJI JEST 0 I WYKONYWANE SA REAKCJE NA BLAD +C ( BLAD NIE JEST SYGNALIZOWANY ) +C JESLI NIE MA , TO WARTOSCIA FUNKCJI JEST WSTAWIANY ELEMENT +C LISTY HASHU. +C * * * * * * * * * * * * * * * * * +C +C + IMPLICIT INTEGER(A-Z) +C +C..... + LOGICAL INSYS, OWN + COMMON /BLANK/ COM(278), + X LMEM , LPMEM , IRECN , ISFIN , LPMSYS, LPML , LPMF , + X NRINT , NRRE , NRBOOL, NRCHR , NRCOR , NRPROC, NRTEXT, + X NRUNIV, NATTR , NRNONE, NBLSYS, NBLUS , NEMPTY, INSYS , + X LOCAL , OWN , OBJECT, + X IPMEM(5000) +C +C COM - OBSZAR KOMUNIKACYJNY STRUMIENI +C LMEM - (=5000) ROZMIAR CALEJ PAMIECI GLOWNEJ +C LPMEM - PODZIAL PAMIECI NA CZESCI IPMEM I ISMEM +C IRECN - INDEKS SZCZYTU STOSU STALYCH REAL +C ISFIN - INDEKS SZCZYTU SLOWNIKA PROTOTYPOW +C +C LPMSYS - INDEKS PIERWSZEGO SLOWA W IPMEM OBSZARU NIEPRZEZ- +C NACZONEGO NA PROTOTYPY SYSTEMOWE +C LPML - INDEKS PIERWSZEGO SLOWA OBSZARU WOLNEGO W IPMEM +C LPMF - INDEKS OSTATNIEGO SLOWA WOLNEGO OBSZARU W IPMEM +C +C +cdsw INTEGER THASH(8) + dimension thash(8) +C +C +C SPRAWDZENIE, CZY NAZWA JEST W TABLICY + I=MEMBER(NAME,THASH) + IF(I.NE.0) GO TO 100 +C NAZWY NIE MA - WSTAWIAMY + IDPUT = INSERT ( NAME,THASH,341) + RETURN +C +C NAZWA JEST - PODWOJNA DEKLARACJA + 100 IDPUT = 0 + CALL MERR(309,NAME) +C SKASOWANIE W ELEMENCIE LISTY HASHU INFORMACJI O HIDDEN I CLOSE + IPMEM(I+1) = 0 +C DOWIAZANIE NAZWY DO OBIEKTU UNIVERSAL + IPMEM(I+2) = NRUNIV + RETURN + END + INTEGER FUNCTION IFTYPE ( NAME) +C +C * * * * * * * * * * * * * * * * * +C FUNKCJA ZNAJDUJE NAZWE NAME W PROTOTYPIE O IDENTYFIKATORZE INDPR +C I DALEJ O SL-ACH. SPRAWDZA,CZY JEST TO NAZWA TYPU. +C IFTYPE = IDENTYFIKATOR TYPU, JESLI TYP JEST POPRAWNY +C IFTYPE = NRUNIV, GDY TYP JEST NIEZADEKLAROWANY LUB NIEDOSTEPNY +C * * * * * * * * * * * * * * * * * +C + IMPLICIT INTEGER(A-Z) +C +C INSERTION OF + LOGICAL BTEST +C BECAUSE OF TYPECONFLICT 03.01.84 +C +C..... + LOGICAL INSYS, OWN + COMMON /BLANK/ COM(278), + X LMEM , LPMEM , IRECN , ISFIN , LPMSYS, LPML , LPMF , + X NRINT , NRRE , NRBOOL, NRCHR , NRCOR , NRPROC, NRTEXT, + X NRUNIV, NATTR , NRNONE, NBLSYS, NBLUS , NEMPTY, INSYS , + X LOCAL , OWN , OBJECT, + X IPMEM(5000) +C +C COM - OBSZAR KOMUNIKACYJNY STRUMIENI +C LMEM - (=5000) ROZMIAR CALEJ PAMIECI GLOWNEJ +C LPMEM - PODZIAL PAMIECI NA CZESCI IPMEM I ISMEM +C IRECN - INDEKS SZCZYTU STOSU STALYCH REAL +C ISFIN - INDEKS SZCZYTU SLOWNIKA PROTOTYPOW +C +C LPMSYS - INDEKS PIERWSZEGO SLOWA W IPMEM OBSZARU NIEPRZEZ- +C NACZONEGO NA PROTOTYPY SYSTEMOWE +C LPML - INDEKS PIERWSZEGO SLOWA OBSZARU WOLNEGO W IPMEM +C LPMF - INDEKS OSTATNIEGO SLOWA WOLNEGO OBSZARU W IPMEM +C +C +C + COMMON / DGLOB/ INDICT,INDSPR,INDPR,IHBEG,LASTPR,INDPREF +C +C ** ** ** ** *** ** ** ** ** ** ** ** ** ** ** ** ** +C BLOK ZAWIERA DANE O PRZETWARZANYM PROTOTYPIE +C INDICT - INDEKS PRZETWARZANEGO PROTTYPU W ISDICT +C INDSPR - IDENTYFIKATOR PROTOTYPU W ISMEM +C INDPR - IDENTYFIKATOR PROTOTYPU W IPMEM +C IHBEG - ADRES PIERWSZEGO SLOWA TABLICY HASHU +C IDPREF - IDENTYFIKATOR BEZPOSREDNIEGO PREFIKSU PRZETWARZANEGO +C PROTOTYPU +C LASTPR - IDENTYFIKATOR POPRZEDNIO PRZETWARZANEGO PROTOTYPU +C +C + COMMON / MASKS / MTP,MSPR,MOTHERS,MPAR,MASKTP,NOTTP, + * MPROCES, MCOR, MERPF, MBLOCK, MHAND, MNOTVIRT +C +C ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** +C MASKI I WZORCE: +C MTP - MASKA DO WYCINANIA INFORMACJI DOTYCZACYCH TYPOW ZE SLOWA ZEROWEGO +C MOTHERS - -- -- -- -- -- INNYCH PROTOTYPOW +C MPAR - -- -- -- -- -- -- ZMIENNYCH I PARAMETROW +C MSPR - MASKA DLA SYSPREF ( DLA PROTOTYPOW SYNTAKTYCZNYCH ) +C MASKTP - ZAPRZECZENIE MASKI MTP +C NOTTP - WZORZEC DLA NIE-TYPU ( 1 ) +C MPROCES - WZORZEC DLA PROCESU ( 5 ) +C MCOR - WZORZEC DLA COROUTINY (7) +C MERPF - MASKA DO WYKRYWANIA BLEDNYCH LIST PARAMETROW +C MBLOCK - WZORZEC DLA BLOKU ( 0 PRZY PRZECIECIU Z MOTHERS ) +C +C +C +C + IFTYPE=MEMSL(NAME,INDPR) + IF(IFTYPE.EQ.0) GO TO 200 + I=IPMEM(IFTYPE+1) + IF(BTEST(I,2)) GO TO 100 + IF(.NOT.BTEST(I,1) .OR. OWN) GO TO 400 +C NAZWA JEST HIDDEN + CALL MERR(317,NAME) + GO TO 150 +C NAZWA JEST NOT TAKEN + 100 CALL MERR(318,NAME) + 150 IFTYPE=NRUNIV + RETURN +C NAZWA JEST ZADEKLAROWANA + 400 IFTYPE = IPMEM(IFTYPE + 2) +C SPRAWDZENIE, CZY TO JEST NAZWA TYPU + IF(IAND(IPMEM(IFTYPE),MTP).NE.NOTTP) RETURN +C TO NIE JEST NAZWA TYPU + IFTYPE = NRUNIV + CALL MERR(307,NAME) + RETURN +C NAZWA JEST NIEZADEKLAROWANA - DKLADAMY JA DO BIEZACEGO PROTOTYPU + 200 CALL MERR(306,NAME) + IFTYPE = INSERT(NAME,IPMEM(IHBEG),341) + IFTYPE = NRUNIV + RETURN + END + SUBROUTINE DPUTQ (NSDIC,IDPMEM) +C +C * * * * * * * * * * * * * * * * * +C PODPROGRAM WSTAWIA PARE (NSDIC,IDPMEM) DO KOLEJKI PROTOTYPOW +C * * * * * * * * * * * * * * * * * +C + IMPLICIT INTEGER(A-Z) +C +C + COMMON / QUEUE / BQUEUE, EQUEUE, IFIRST, LAST, EMPTY +cdsw INTEGER BQUEUE, EQUEUE + LOGICAL EMPTY +C +C ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** +C ZMIENNE SLUZACE DO ORGANIZACJI KOLEJKI PROTOTYPOW +C BQUEUE - POCZATEK POLA W IPMEM PRZEZNACZONEGO NA KOLEJKE +C EQUEUE - KONIEC -- -- -- -- -- +C IFIRST - PIERWSZY ELEMENT KOLEJKI +C LAST - OSTATNI ELEMENT KOLEJKI +C EMPTY = TRUE, GDY KOLEJKA JEST PUSTA +C +C +C..... + LOGICAL INSYS, OWN + COMMON /BLANK/ COM(278), + X LMEM , LPMEM , IRECN , ISFIN , LPMSYS, LPML , LPMF , + X NRINT , NRRE , NRBOOL, NRCHR , NRCOR , NRPROC, NRTEXT, + X NRUNIV, NATTR , NRNONE, NBLSYS, NBLUS , NEMPTY, INSYS , + X LOCAL , OWN , OBJECT, + X IPMEM(5000) +C +C COM - OBSZAR KOMUNIKACYJNY STRUMIENI +C LMEM - (=5000) ROZMIAR CALEJ PAMIECI GLOWNEJ +C LPMEM - PODZIAL PAMIECI NA CZESCI IPMEM I ISMEM +C IRECN - INDEKS SZCZYTU STOSU STALYCH REAL +C ISFIN - INDEKS SZCZYTU SLOWNIKA PROTOTYPOW +C +C LPMSYS - INDEKS PIERWSZEGO SLOWA W IPMEM OBSZARU NIEPRZEZ- +C NACZONEGO NA PROTOTYPY SYSTEMOWE +C LPML - INDEKS PIERWSZEGO SLOWA OBSZARU WOLNEGO W IPMEM +C LPMF - INDEKS OSTATNIEGO SLOWA WOLNEGO OBSZARU W IPMEM +C +C +C +C JESLI DOSZLISMY DO KONCA OBSZARU PRZEZNACZONEGO NA KOLJKE, TO +C ZACZYNAMY OD POCZATKU + IF ( LAST.EQ.EQUEUE-1) LAST=BQUEUE-2 + IF(LAST.EQ.IFIRST-2.AND..NOT.EMPTY) GO TO 100 +C JEST MIEJSCE NA DOSTAWIANIE ELEMENTU DO KOLEJKI + EMPTY=.FALSE. + LAST = LAST+2 + IPMEM(LAST) = NSDIC + IPMEM(LAST+1) = IDPMEM + RETURN +C +C PRZEPELNIENIE OBSZARU PRZEZNACZONEGO NA KOLEJKE +C PRZERWANIE KOMPILACJI + 100 CALL MDROP(343) + RETURN + END + SUBROUTINE DGETQ +C +C +C * * * * * * * * * * * * * * * * * +C PODPROGRAM POBIERA PIERWSZY ELEMENT Z KOLEJKI PROTOTYPOW I +C WSTAWIA NA ZMIENNE INDICT I INDPR Z BLOKU DGLOB. +C NIE SPRAWDZA, CZY KOLEJKA JEST PUSTA. +C JESLI NA SKUTEK WYKONANIA OPERACJI KOLEJKA BEDZIE PUSTA, TO ZMIENNA +C EMPTY DOSTAJE WARTOSC TRUE . +C * * * * * * * * * * * * * * * * * +C +C + IMPLICIT INTEGER(A-Z) +C +C..... + LOGICAL INSYS, OWN + COMMON /BLANK/ COM(278), + X LMEM , LPMEM , IRECN , ISFIN , LPMSYS, LPML , LPMF , + X NRINT , NRRE , NRBOOL, NRCHR , NRCOR , NRPROC, NRTEXT, + X NRUNIV, NATTR , NRNONE, NBLSYS, NBLUS , NEMPTY, INSYS , + X LOCAL , OWN , OBJECT, + X IPMEM(5000) +C +C COM - OBSZAR KOMUNIKACYJNY STRUMIENI +C LMEM - (=5000) ROZMIAR CALEJ PAMIECI GLOWNEJ +C LPMEM - PODZIAL PAMIECI NA CZESCI IPMEM I ISMEM +C IRECN - INDEKS SZCZYTU STOSU STALYCH REAL +C ISFIN - INDEKS SZCZYTU SLOWNIKA PROTOTYPOW +C +C LPMSYS - INDEKS PIERWSZEGO SLOWA W IPMEM OBSZARU NIEPRZEZ- +C NACZONEGO NA PROTOTYPY SYSTEMOWE +C LPML - INDEKS PIERWSZEGO SLOWA OBSZARU WOLNEGO W IPMEM +C LPMF - INDEKS OSTATNIEGO SLOWA WOLNEGO OBSZARU W IPMEM +C +C +C + COMMON / QUEUE / BQUEUE, EQUEUE, IFIRST, LAST, EMPTY +cdsw INTEGER BQUEUE, EQUEUE + LOGICAL EMPTY +C +C ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** +C ZMIENNE SLUZACE DO ORGANIZACJI KOLEJKI PROTOTYPOW +C BQUEUE - POCZATEK POLA W IPMEM PRZEZNACZONEGO NA KOLEJKE +C EQUEUE - KONIEC -- -- -- -- -- +C IFIRST - PIERWSZY ELEMENT KOLEJKI +C LAST - OSTATNI ELEMENT KOLEJKI +C EMPTY = TRUE, GDY KOLEJKA JEST PUSTA +C + COMMON / DGLOB/ INDICT,INDSPR,INDPR,IHBEG,LASTPR,INDPREF +C +C ** ** ** ** *** ** ** ** ** ** ** ** ** ** ** ** ** +C BLOK ZAWIERA DANE O PRZETWARZANYM PROTOTYPIE +C INDICT - INDEKS PRZETWARZANEGO PROTTYPU W ISDICT +C INDSPR - IDENTYFIKATOR PROTOTYPU W ISMEM +C INDPR - IDENTYFIKATOR PROTOTYPU W IPMEM +C IHBEG - ADRES PIERWSZEGO SLOWA TABLICY HASHU +C IDPREF - IDENTYFIKATOR BEZPOSREDNIEGO PREFIKSU PRZETWARZANEGO +C PROTOTYPU +C LASTPR - IDENTYFIKATOR POPRZEDNIO PRZETWARZANEGO PROTOTYPU +C +C +C + INDICT = IPMEM(IFIRST) + INDPR = IPMEM(IFIRST+1) + IF(LAST.EQ.IFIRST) GO TO 100 +C KOLEJKA MA CO NAJMNIEJ 2 ELEMENTY + IF(IFIRST.EQ.EQUEUE-1) GO TO 50 + IFIRST = IFIRST+2 + RETURN + 50 IFIRST = BQUEUE + RETURN +C +C KOLEJKA BEDZIE PUSTA + 100 EMPTY = .TRUE. + IFIRST=BQUEUE + LAST=BQUEUE-2 + RETURN + END + SUBROUTINE HEADER +C +C +C**********************************************C +C PODPROGRAM PRZETWARZA LISTE PARAMETROW FORMALNYCH +C PROTOTYPU INDPR +C ********************************************** +C + IMPLICIT INTEGER(A-Z) + LOGICAL PQ,ISTPF,FORM2 +C INSERTION OF + LOGICAL BTEST +C BECAUSE OF TYPECONFLICT 03.01.84 +C +C ..... ZMIENNE GLOBALNE +C +C..... + LOGICAL INSYS, OWN + COMMON /BLANK/ COM(278), + X LMEM , LPMEM , IRECN , ISFIN , LPMSYS, LPML , LPMF , + X NRINT , NRRE , NRBOOL, NRCHR , NRCOR , NRPROC, NRTEXT, + X NRUNIV, NATTR , NRNONE, NBLSYS, NBLUS , NEMPTY, INSYS , + X LOCAL , OWN , OBJECT, + X IPMEM(5000) +C +C COM - OBSZAR KOMUNIKACYJNY STRUMIENI +C LMEM - (=5000) ROZMIAR CALEJ PAMIECI GLOWNEJ +C LPMEM - PODZIAL PAMIECI NA CZESCI IPMEM I ISMEM +C IRECN - INDEKS SZCZYTU STOSU STALYCH REAL +C ISFIN - INDEKS SZCZYTU SLOWNIKA PROTOTYPOW +C +C LPMSYS - INDEKS PIERWSZEGO SLOWA W IPMEM OBSZARU NIEPRZEZ- +C NACZONEGO NA PROTOTYPY SYSTEMOWE +C LPML - INDEKS PIERWSZEGO SLOWA OBSZARU WOLNEGO W IPMEM +C LPMF - INDEKS OSTATNIEGO SLOWA WOLNEGO OBSZARU W IPMEM +C +C +C + COMMON / DGLOB/ INDICT,INDSPR,INDPR,IHBEG,LASTPR,INDPREF +C +C ** ** ** ** *** ** ** ** ** ** ** ** ** ** ** ** ** +C BLOK ZAWIERA DANE O PRZETWARZANYM PROTOTYPIE +C INDICT - INDEKS PRZETWARZANEGO PROTTYPU W ISDICT +C INDSPR - IDENTYFIKATOR PROTOTYPU W ISMEM +C INDPR - IDENTYFIKATOR PROTOTYPU W IPMEM +C IHBEG - ADRES PIERWSZEGO SLOWA TABLICY HASHU +C IDPREF - IDENTYFIKATOR BEZPOSREDNIEGO PREFIKSU PRZETWARZANEGO +C PROTOTYPU +C LASTPR - IDENTYFIKATOR POPRZEDNIO PRZETWARZANEGO PROTOTYPU +C +C + COMMON /DWORK/ IDPAR,LFORMB,LFORME,FORM2,SYGN + LOGICAL SYGN +C +C * * * * * * * * * * * * * * * * * * * * +C IDPAR - INDEKS SLOWA ZEROWEGO BIEZACEGO PARAMETRU W ISMEM +C LFORMB,LFORME - PIERWSZY I OSTATNI ELEMENT ROBOCZEJ LISTY PF +C FORM2=TRUE, GDY PRZETWAEZAMY PARAMETRY II-GO RZEDU +C SYGN = TRUE, GDY SA TO PARAMETRY SYGNALU +C +C + COMMON / MASKS / MTP,MSPR,MOTHERS,MPAR,MASKTP,NOTTP, + * MPROCES, MCOR, MERPF, MBLOCK,MHAND,MNOTVIR +C +C ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** +C MASKI I WZORCE: +C MTP - MASKA DO WYCINANIA INFORMACJI DOTYCZACYCH TYPOW ZE SLOWA ZEROWEGO +C MOTHERS - -- -- -- -- -- INNYCH PROTOTYPOW +C MPAR - -- -- -- -- -- -- ZMIENNYCH I PARAMETROW +C MSPR - MASKA DLA SYSPREF ( DLA PROTOTYPOW SYNTAKTYCZNYCH ) +C MASKTP - ZAPRZECZENIE MASKI MTP +C NOTTP - WZORZEC DLA NIE-TYPU ( 1 ) +C MPROCES - WZORZEC DLA PROCESU ( 5 ) +C MCOR - WZORZEC DLA COROUTINY (7) +C MERPF - MASKA DO WYKRYWANIA BLEDNYCH LIST PARAMETROW/ +C MBLOCK - WZORZEC DLA BLOKU ( 0 PRZY PRZECIECIU Z MOTHERS ) +C MNOTVIR - WZORZEC DO KASOWANIA BITU "WIRTUAL" +C MHAND - MASKA DLA HANDLERA +C +C +C + COMMON / YNIT / NULLWD(23), SIZEPR(23), NULLPOZ(23), CONSTWD, + * VARWD,VARPOM,INPFW,OUTPFW, INOUT +cdsw INTEGER SIZEPR, CONSTWD, VARWD, VARPOM, OUTPFW +C +C ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** +C NULLWD(I) - WZORZEC SLOWA ZEROWEGO DLA PROTOTYPU RODZAJU I +C SIZEPR(I) - ROZMIAR POLA W IPMEM -- -- -- +C NULLPOZ(I) - POZYCJA SLOWA ZEROWEGO -- -- -- +C CONSTWD - WZORZEC SLOWA ZEROWEGO DLA CONST +C VARWD - -- -- -- -- DLA ZMIENNEJ +C VARPOM - -- -- -- -- ZMIENNEJ POMOCNICZEJ +C INPFW - -- -- -- -- ZMIEMNEJ INPUT +C OUTPFW - -- -- -- -- ZMIENNEJ OUTPUT +C INOUT - --- -- -- --- ZMIENNEJ INOUT +C +C - - - - - - - - - - - - - - - - +C +C SPRAWDZENIE,CZY TYP FORMALNY NIE WYSTEPUJE PO UZYCIU +C JESLI BLOK - TO IDZIEMY DALEJ + IF(IPMEM(INDSPR).EQ.1) GO TO 1000 + SYGN = ISHFT(IAND(IPMEM(INDPR),MPAR),-4).EQ.11 + IDPAR = IPMEM(INDSPR+11) + IF(SYGN) IDPAR = IPMEM(INDSPR+4) + FORM2=.FALSE. + 100 IF(IDPAR.EQ.0) GO TO 1000 + K=IPMEM(IDPAR) + 150 IF (FORM2) GO TO 350 + IF(K.EQ.7) GO TO 900 + IF(K.EQ.3.OR.K.EQ.5) GO TO 200 + I1=IDPAR+5 + IF(K.GE.8) I1=IDPAR+4 + I=IPMEM(I1) +C I - NAZWA TYPU PARAMETRU +C SPRAWDZAMY,CZY TEN TYP JEST POZNIEJ W LISCIE PARAMETROW +C OD IDPAR DO KONCA LISTY + PQ=ISTPF(I,.TRUE.) + IF(PQ) IPMEM(I1)=NEMPTY + IF(K.GE.8) GO TO 900 +C TERAZ SPRAWDZAMY PARAMETRY II-GO RZEDU + 200 LFORMB=IDPAR + FORM2=.TRUE. + IDPAR=IPMEM(LFORMB+4) + 300 IF(IDPAR.EQ.0) GO TO 800 + K=IPMEM(IDPAR) + GO TO 150 + 350 IF(K.LT.8) GO TO 700 + I=IPMEM(IDPAR+4) +C SZUKAMY TYPU OD IDPAR DO KONCA LISTY II-GO RZEDU + PQ=ISTPF(I,.TRUE.) + IF(.NOT.PQ) GO TO 400 + IPMEM(IDPAR+4) = NEMPTY + GO TO 700 +C SZUKAMY TYPU WCZESNIEJ W LISCIE II-GO RZEDU BEZ +C SYGNALIZACJI BLEDU + 400 PQ = ISTPF(I,.FALSE.) + IF( PQ ) GO TO 700 +C SZUKAMY W ZEWNETRZNEJ LISCIE PF OD PRZERABIANEJ +C PROCEDURY/FUNKCJI DO KONCA + K=IDPAR + IDPAR=LFORMB + PQ = ISTPF(I,.TRUE.) + IF(PQ) IPMEM(K+4) = NEMPTY + IDPAR=K + 700 IDPAR = IPMEM(IDPAR+3) + GO TO 300 + 800 FORM2=.FALSE. + IDPAR=LFORMB + 900 IDPAR = IPMEM(IDPAR+3) + GO TO 100 +C +C - - - - - - - - - - - - - - - - - +C +C PRZETWARZANIE PARAMETROW +C + 1000 CONTINUE +C +C PRZYGOTOWANIA DO PRZETWARZANIA LISTY PF + BEGM=LPML + INSYS=.TRUE. + LFORMB=MGETM(2,341) + LFORME=LFORMB + FORM2=.FALSE. + INSYS=.FALSE. +C JESLI BLOK TO NIE POSIADA PARAMETROW + IF(IPMEM(INDSPR).EQ.1) GO TO 1500 +C +C PRZETWARZANIE PARAMETROW + IDPAR=IPMEM(INDSPR+11) + IF(SYGN) IDPAR = IPMEM(INDSPR+4) + 1100 IF(IDPAR.EQ.0) GO TO 1500 + K=IPMEM(IDPAR) + IF(K.EQ.7) GO TO 1200 + IF(K.GE.8) GO TO 1300 +C PROCEDURA / FUNKCJA FORMALNA + CALL CHECK(INDPR) + CALL PROCFUN + GO TO 1400 +C TYP FORMALNY + 1200 CALL TYPEF + GO TO 1400 +C ZMIENNA + 1300 CALL VARIAB + 1400 IDPAR=IPMEM(IDPAR+3) + GO TO 1100 +C + 1500 CONTINUE +C DOLACZENIE RESULT +C JESLI TO JEST FUNKCJA +C UWAGA - NAZWA RESULT DOLACZANA W PROTP1 + IF(IPMEM(INDSPR).NE.4.AND.IPMEM(INDSPR).NE.6) GO TO 2000 + I=MGETM(6,341) + 4 + IPMEM(I) = OUTPFW + CALL PUTPF(I) + CALL MADATR(I,INDPR,341) +C ZAPAMIETANIE 1 W POLU USED - DLA AIL + IPMEM(I+1)=1 + IPMEM(INDPR-5) = I +C DOLACZENIE TYPU + IPMEM(I-4) = IPMEM(INDPR-4) + IPMEM(I-3) = IPMEM(INDPR-3) +C WYLICZENIE APETYTU RESULT + IPMEM(I) = IAP(I) +C JESLI TO BYL TYP FORMALNY, TO ZMIANA SLOWA ZEROWEGO + IF(BTEST(IPMEM(INDPR),12)) + * IPMEM(I) = IOR(IPMEM(I),ISHFT(1,12 )) +C +C + 2000 CONTINUE + FORM2=.FALSE. + IF(INDPREF.EQ.0) GO TO 1700 +C JESLI PREFIKS MIAL BLEDNA LISTE PF, TO NIE DOKLADAMY WLASNEJ + IF (IAND(IPMEM(INDPREF),MERPF).NE.0) GO TO 1850 +C DOPISANIE SWOJEJ LISTY PF + 1700 CALL COPY +C DOLACZENIE LISTY PF Z PREFIKSU + IF(INDPREF.EQ.0) GO TO 3000 + 1850 I=IPMEM(INDPREF+3) + J=IPMEM(INDPREF+4) + IF(J.EQ.0) GO TO 3000 + K=MGETM(J,341) + DO 1666 I1=1,J + I2=K+I1-1 + I3=I+I1-1 + 1666 IPMEM(I2) = IPMEM(I3) + IPMEM(INDPR+3) = K + IPMEM(INDPR+4) = IPMEM(INDPR+4)+J + 3000 CONTINUE +C ZAKONCZENIE + LPML=BEGM + RETURN + END + LOGICAL FUNCTION ISTPF(NM,PQ) +C +C * * * * * * * * * * * * * * * * * * * * * * * * +C FUNKCJA SPRAWDZA,CZY TYP O NAZWIE NM WYSTEPUJE JAKO +C FORMALNY W LISCIE PARAMETROW. +C JESLI PQ=.TRUE., TO SZUKAMY OD IDPAR DO KONCA LISTY +C I W RAZIE ZNALEZIENIA SYGNALIZUJEMY BLAD. +C JESLI PQ=.FALSE., TO SZUKAMY OD POCZATKU LOKALNEJ LISTY +C PARAMETROW(LFORMAB) DO IDPAR I NIE SYBNALIZUJEMY BLEDU. +C * * * * * * * * * * * * * * * * * * * * * * * * * * * * +C + IMPLICIT INTEGER(A-Z) + LOGICAL PQ +C +C ..... ZMIENNE GLOBALNE +C +C..... + LOGICAL INSYS, OWN + COMMON /BLANK/ COM(278), + X LMEM , LPMEM , IRECN , ISFIN , LPMSYS, LPML , LPMF , + X NRINT , NRRE , NRBOOL, NRCHR , NRCOR , NRPROC, NRTEXT, + X NRUNIV, NATTR , NRNONE, NBLSYS, NBLUS , NEMPTY, INSYS , + X LOCAL , OWN , OBJECT, + X IPMEM(5000) +C +C COM - OBSZAR KOMUNIKACYJNY STRUMIENI +C LMEM - (=5000) ROZMIAR CALEJ PAMIECI GLOWNEJ +C LPMEM - PODZIAL PAMIECI NA CZESCI IPMEM I ISMEM +C IRECN - INDEKS SZCZYTU STOSU STALYCH REAL +C ISFIN - INDEKS SZCZYTU SLOWNIKA PROTOTYPOW +C +C LPMSYS - INDEKS PIERWSZEGO SLOWA W IPMEM OBSZARU NIEPRZEZ- +C NACZONEGO NA PROTOTYPY SYSTEMOWE +C LPML - INDEKS PIERWSZEGO SLOWA OBSZARU WOLNEGO W IPMEM +C LPMF - INDEKS OSTATNIEGO SLOWA WOLNEGO OBSZARU W IPMEM +C + COMMON /DWORK/ IDPAR,LFORMB,LFORME,FORM2,SYGN + LOGICAL FORM2, SYGN +C +C * * * * * * * * * * * * * * * * * * * * +C IDPAR - INDEKS SLOWA ZEROWEGO BIEZACEGO PARAMETRU W IPMEM +C LFORMB,LFORME - PIERWSZY I OSTATNI ELEMENT ROBOCZEJ LISTY PF +C FORM2=TRUE, GDY PRZETWAEZAMY PARAMETRY II-GO RZEDU +C SYNG = TRUE, GDY SA TO PARAMETRY SYGNALU +C +C +C.....BLOK KOMUNIKACJI ZE STRUMIENIAMI + LOGICAL ERRFLG + COMMON /STREAM/ ERRFLG, LINE, IBUF2(265), IBUF3(7),JUNK(260) +C +C +C +C + K=0 + IF(.NOT. PQ) K=IDPAR + I=IPMEM(IDPAR+3) + IF(.NOT.PQ) I=IPMEM(LFORMB+4) + ISTPF=.FALSE. + 100 IF(I.EQ.K) RETURN + IF(IPMEM(I).NE.7) GO TO 200 +C TYP FORMALNY + IF(IPMEM(I+2) .EQ. NM) GO TO 400 + 200 I=IPMEM(I+3) + GO TO 100 +C ZNALEZIONY TYP + 400 ISTPF=.TRUE. + IF(.NOT.PQ)RETURN + LINE=IPMEM(IDPAR+1) + CALL MERR(316,NM) + RETURN + END + SUBROUTINE PUTPF(ID) +C +C * * * * * * * * * * * * * * * * * * * * * * * * * +C WSTAWIA PARAMETR O IDENTYFIKATORZE ID DO LISTY PF +C * * * * * * * * * * * * * * * * * * * * * * * *** +C + IMPLICIT INTEGER(A-Z) +C +C ..... ZMIENNE GLOBALNE +C +C..... + LOGICAL INSYS, OWN + COMMON /BLANK/ COM(278), + X LMEM , LPMEM , IRECN , ISFIN , LPMSYS, LPML , LPMF , + X NRINT , NRRE , NRBOOL, NRCHR , NRCOR , NRPROC, NRTEXT, + X NRUNIV, NATTR , NRNONE, NBLSYS, NBLUS , NEMPTY, INSYS , + X LOCAL , OWN , OBJECT, + X IPMEM(5000) +C +C COM - OBSZAR KOMUNIKACYJNY STRUMIENI +C LMEM - (=5000) ROZMIAR CALEJ PAMIECI GLOWNEJ +C LPMEM - PODZIAL PAMIECI NA CZESCI IPMEM I ISMEM +C IRECN - INDEKS SZCZYTU STOSU STALYCH REAL +C ISFIN - INDEKS SZCZYTU SLOWNIKA PROTOTYPOW +C +C LPMSYS - INDEKS PIERWSZEGO SLOWA W IPMEM OBSZARU NIEPRZEZ- +C NACZONEGO NA PROTOTYPY SYSTEMOWE +C LPML - INDEKS PIERWSZEGO SLOWA OBSZARU WOLNEGO W IPMEM +C LPMF - INDEKS OSTATNIEGO SLOWA WOLNEGO OBSZARU W IPMEM +C +C +C + COMMON /DWORK/ IDPAR,LFORMB,LFORME,FORM2,SYGN + LOGICAL FORM2, SYGN +C +C * * * * * * * * * * * * * * * * * * * * +C IDPAR - INDEKS SLOWA ZEROWEGO BIEZACEGO PARAMETRU W ISMEM +C LFORMB,LFORME - PIERWSZY I OSTATNI ELEMENT ROBOCZEJ LISTY PF +C FORM2=TRUE, GDY PRZETWAEZAMY PARAMETRY II-GO RZEDU +C SYGN = TRUE, GDY TO SA PARAMETRY SYGNALU +C +C +C +C + INSYS=.TRUE. + K=MGETM(2,341) + IPMEM(K) = ID + IPMEM(LFORME+1) = K + LFORME=K + INSYS=.FALSE. + RETURN + END + SUBROUTINE COPY +C +C * * * * * * * * * * * * * * * * * * * * * * * * * +C KOPIUJE LISTE PF DO PAMIECI UZYTKOWNIKA +C I DOWIAZUJE DO PROTOTYPU INDPR +C * * * * * * * * * * * * * * * * * * * ** * * * * +C + IMPLICIT INTEGER(A-Z) +C +C ..... ZMIENNE GLOBALNE +C +C..... + LOGICAL INSYS, OWN + COMMON /BLANK/ COM(278), + X LMEM , LPMEM , IRECN , ISFIN , LPMSYS, LPML , LPMF , + X NRINT , NRRE , NRBOOL, NRCHR , NRCOR , NRPROC, NRTEXT, + X NRUNIV, NATTR , NRNONE, NBLSYS, NBLUS , NEMPTY, INSYS , + X LOCAL , OWN , OBJECT, + X IPMEM(5000) +C +C COM - OBSZAR KOMUNIKACYJNY STRUMIENI +C LMEM - (=5000) ROZMIAR CALEJ PAMIECI GLOWNEJ +C LPMEM - PODZIAL PAMIECI NA CZESCI IPMEM I ISMEM +C IRECN - INDEKS SZCZYTU STOSU STALYCH REAL +C ISFIN - INDEKS SZCZYTU SLOWNIKA PROTOTYPOW +C +C LPMSYS - INDEKS PIERWSZEGO SLOWA W IPMEM OBSZARU NIEPRZEZ- +C NACZONEGO NA PROTOTYPY SYSTEMOWE +C LPML - INDEKS PIERWSZEGO SLOWA OBSZARU WOLNEGO W IPMEM +C LPMF - INDEKS OSTATNIEGO SLOWA WOLNEGO OBSZARU W IPMEM +C +C +C + COMMON /DWORK/ IDPAR,LFORMB,LFORME,FORM2,SYGN + LOGICAL FORM2, SYGN +C +C * * * * * * * * * * * * * * * * * * * * +C IDPAR - INDEKS SLOWA ZEROWEGO BIEZACEGO PARAMETRU W ISMEM +C LFORMB,LFORME - PIERWSZY I OSTATNI ELEMENT ROBOCZEJ LISTY PF +C FORM2=TRUE, GDY PRZETWAEZAMY PARAMETRY II-GO RZEDU +C SYN = TRUE, GDY TO SA PARAMETRY SYGNALU +C +C + COMMON / DGLOB/ INDICT,INDSPR,INDPR,IHBEG,LASTPR,INDPREF +C +C ** ** ** ** *** ** ** ** ** ** ** ** ** ** ** ** ** +C BLOK ZAWIERA DANE O PRZETWARZANYM PROTOTYPIE +C INDICT - INDEKS PRZETWARZANEGO PROTTYPU W ISDICT +C INDSPR - IDENTYFIKATOR PROTOTYPU W ISMEM +C INDPR - IDENTYFIKATOR PROTOTYPU W IPMEM +C IHBEG - ADRES PIERWSZEGO SLOWA TABLICY HASHU +C IDPREF - IDENTYFIKATOR BEZPOSREDNIEGO PREFIKSU PRZETWARZANEGO +C PROTOTYPU +C LASTPR - IDENTYFIKATOR POPRZEDNIO PRZETWARZANEGO PROTOTYPU +C +C +C +C + I=IPMEM(LFORMB+1) + K=0 + L=0 + J=0 + IF(I.EQ.0) GO TO 400 + L=MGETM(1,341) + J=L + 100 X=IPMEM(I) + IPMEM(J) = X +C JESLI TO SA PARAMETRY II-GO RZEDU,TO POPRAWIAMY SL NA INDPR + IF(FORM2) IPMEM(X-1) = INDPR + I=IPMEM(I+1) + K=K+1 + IF(I.EQ.0) GO TO 200 + J=MGETM(1,341) + GO TO 100 + 200 CONTINUE +C L - PIERWSZY PARAMETR +C J - OSTATNI PARAMETR +C TRZEBA ZAMIENIC ICH KOLEJNOSC + I1=J + I2=L + 300 IF (I1.GE.I2) GO TO 400 + X=IPMEM(I1) + IPMEM(I1)=IPMEM(I2) + IPMEM(I2)=X + I1=I1+1 + I2=I2-1 + GO TO 300 + 400 IPMEM(INDPR+3) = J + IPMEM(INDPR+4) = K + RETURN + END + SUBROUTINE TYPEF +C +C * * * * * * * * * * * * * * * * * * * * * * * * * * * * +C PRZETWARZA TYP FORMALNY. +C INFORMACJE O PARAMETRZE - W BLOKU DWORK +C * * * * * * * * * * * * * * * * * * * * * * * * * * * * +C + IMPLICIT INTEGER(A-Z) +C +C ..... ZMIENNE GLOBALNE +C +C..... + LOGICAL INSYS, OWN + COMMON /BLANK/ COM(278), + X LMEM , LPMEM , IRECN , ISFIN , LPMSYS, LPML , LPMF , + X NRINT , NRRE , NRBOOL, NRCHR , NRCOR , NRPROC, NRTEXT, + X NRUNIV, NATTR , NRNONE, NBLSYS, NBLUS , NEMPTY, INSYS , + X LOCAL , OWN , OBJECT, + X IPMEM(5000) +C +C COM - OBSZAR KOMUNIKACYJNY STRUMIENI +C LMEM - (=5000) ROZMIAR CALEJ PAMIECI GLOWNEJ +C LPMEM - PODZIAL PAMIECI NA CZESCI IPMEM I ISMEM +C IRECN - INDEKS SZCZYTU STOSU STALYCH REAL +C ISFIN - INDEKS SZCZYTU SLOWNIKA PROTOTYPOW +C +C LPMSYS - INDEKS PIERWSZEGO SLOWA W IPMEM OBSZARU NIEPRZEZ- +C NACZONEGO NA PROTOTYPY SYSTEMOWE +C LPML - INDEKS PIERWSZEGO SLOWA OBSZARU WOLNEGO W IPMEM +C LPMF - INDEKS OSTATNIEGO SLOWA WOLNEGO OBSZARU W IPMEM +C +C +C + COMMON /DWORK/ IDPAR,LFORMB,LFORME,FORM2,SYGN + LOGICAL FORM2, SYGN +C +C * * * * * * * * * * * * * * * * * * * * +C IDPAR - INDEKS SLOWA ZEROWEGO BIEZACEGO PARAMETRU W ISMEM +C LFORMB,LFORME - PIERWSZY I OSTATNI ELEMENT ROBOCZEJ LISTY PF +C FORM2=TRUE, GDY PRZETWAEZAMY PARAMETRY II-GO RZEDU +C SYGN = TRUE, GDY TO SA PARAMETRY SYGNALU +C +C +C +C.....BLOK KOMUNIKACJI ZE STRUMIENIAMI + LOGICAL ERRFLG + COMMON /STREAM/ ERRFLG, LINE, IBUF2(265), IBUF3(7),JUNK(260) +C +C +C UTWORZENIE OPISU + LINE=IPMEM(IDPAR+1) + KIND=17 + IF(FORM2) KIND=20 + ID=INITPR(KIND,IPMEM(IDPAR+2)) +C WSTAWIENIE DO LISTY PF + CALL PUTPF(ID) + RETURN + END + SUBROUTINE VARIAB +C +C * * * * * * * * * * * * * * * * * * * * * * ** * * * * +C PRZETWARZA PARAMETR BEDACY ZMIENNA +C INFORMACJE O PARAMETRZE - W BLOKU DWORK +C * * * * * * * * * * * * * * * * * * * * * * * * * * * +C + IMPLICIT INTEGER(A-Z) +C +C ..... ZMIENNE GLOBALNE +C +C..... + LOGICAL INSYS, OWN + COMMON /BLANK/ COM(278), + X LMEM , LPMEM , IRECN , ISFIN , LPMSYS, LPML , LPMF , + X NRINT , NRRE , NRBOOL, NRCHR , NRCOR , NRPROC, NRTEXT, + X NRUNIV, NATTR , NRNONE, NBLSYS, NBLUS , NEMPTY, INSYS , + X LOCAL , OWN , OBJECT, + X IPMEM(5000) +C +C COM - OBSZAR KOMUNIKACYJNY STRUMIENI +C LMEM - (=5000) ROZMIAR CALEJ PAMIECI GLOWNEJ +C LPMEM - PODZIAL PAMIECI NA CZESCI IPMEM I ISMEM +C IRECN - INDEKS SZCZYTU STOSU STALYCH REAL +C ISFIN - INDEKS SZCZYTU SLOWNIKA PROTOTYPOW +C +C LPMSYS - INDEKS PIERWSZEGO SLOWA W IPMEM OBSZARU NIEPRZEZ- +C NACZONEGO NA PROTOTYPY SYSTEMOWE +C LPML - INDEKS PIERWSZEGO SLOWA OBSZARU WOLNEGO W IPMEM +C LPMF - INDEKS OSTATNIEGO SLOWA WOLNEGO OBSZARU W IPMEM +C +C +C + COMMON /DWORK/ IDPAR,LFORMB,LFORME,FORM2,SYGN + LOGICAL FORM2, SYGN +C +C * * * * * * * * * * * * * * * * * * * * +C IDPAR - INDEKS SLOWA ZEROWEGO BIEZACEGO PARAMETRU W ISMEM +C LFORMB,LFORME - PIERWSZY I OSTATNI ELEMENT ROBOCZEJ LISTY PF +C FORM2=TRUE, GDY PRZETWAEZAMY PARAMETRY II-GO RZEDU +C SYGN = TRUE, GDY TO SA PARAMETRY SYGNALU +C +C +C + COMMON / DGLOB/ INDICT,INDSPR,INDPR,IHBEG,LASTPR,INDPREF +C +C ** ** ** ** *** ** ** ** ** ** ** ** ** ** ** ** ** +C BLOK ZAWIERA DANE O PRZETWARZANYM PROTOTYPIE +C INDICT - INDEKS PRZETWARZANEGO PROTTYPU W ISDICT +C INDSPR - IDENTYFIKATOR PROTOTYPU W ISMEM +C INDPR - IDENTYFIKATOR PROTOTYPU W IPMEM +C IHBEG - ADRES PIERWSZEGO SLOWA TABLICY HASHU +C IDPREF - IDENTYFIKATOR BEZPOSREDNIEGO PREFIKSU PRZETWARZANEGO +C PROTOTYPU +C LASTPR - IDENTYFIKATOR POPRZEDNIO PRZETWARZANEGO PROTOTYPU +C +C + COMMON / MASKS / MTP,MSPR,MOTHERS,MPAR,MASKTP,NOTTP, + * MPROCES, MCOR, MERPF, MBLOCK,MHAND,MNOTVIR +C +C ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** +C MASKI I WZORCE: +C MTP - MASKA DO WYCINANIA INFORMACJI DOTYCZACYCH TYPOW ZE SLOWA ZEROWEGO +C MOTHERS - -- -- -- -- -- INNYCH PROTOTYPOW +C MPAR - -- -- -- -- -- -- ZMIENNYCH I PARAMETROW +C MSPR - MASKA DLA SYSPREF ( DLA PROTOTYPOW SYNTAKTYCZNYCH ) +C MASKTP - ZAPRZECZENIE MASKI MTP +C NOTTP - WZORZEC DLA NIE-TYPU ( 1 ) +C MPROCES - WZORZEC DLA PROCESU ( 5 ) +C MCOR - WZORZEC DLA COROUTINY +C MERPF - MASKA DO WYKRYWANIA BLEDNYCH LIST PARAMETROW +C MBLOCK - WZORZEC DLA BLOKU ( 0 PRZY PRZECIECIU Z MOTHERS ) +C +C +C + COMMON / YNIT / NULLWD(23), SIZEPR(23), NULLPOZ(23), CONSTWD, + * VARWD,VARPOM,INPFW,OUTPFW, INOUT +cdsw INTEGER SIZEPR, CONSTWD, VARWD, VARPOM, OUTPFW +C +C ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** +C NULLWD(I) - WZORZEC SLOWA ZEROWEGO DLA PROTOTYPU RODZAJU I +C SIZEPR(I) - ROZMIAR POLA W IPMEM -- -- -- +C NULLPOZ(I) - POZYCJA SLOWA ZEROWEGO -- -- -- +C CONSTWD - WZORZEC SLOWA ZEROWEGO DLA CONST +C VARWD - -- -- -- -- DLA ZMIENNEJ +C VARPOM - -- -- -- -- ZMIENNEJ POMOCNICZEJ +C INPFW - -- -- -- -- ZMIEMNEJ INPUT +C OUTPFW - -- -- -- -- ZMIENNEJ OUTPUT +C INOUT - -- -- --- -- ZMIENNEJ INOUT +C +C +C.....BLOK KOMUNIKACJI ZE STRUMIENIAMI + LOGICAL ERRFLG + COMMON /STREAM/ ERRFLG, LINE, IBUF2(265), IBUF3(7),JUNK(260) +C +C + LINE = IPMEM(IDPAR+1) + NM=IPMEM(IDPAR+2) +C . . . +C UTWORZENIE OBIEKTU + ID=MGETM(6,341)+4 + IPMEM(ID) = INPFW + IF(IPMEM(IDPAR).EQ.9) IPMEM(ID)=OUTPFW + IF(IPMEM(IDPAR).EQ.10) IPMEM(ID)=INOUT +C WSTAWIENIE DO ZBIORU IDENTYFIKATOROW + IF(FORM2) INSYS=.TRUE. + K=IDPUT(NM,IPMEM(IHBEG)) + IF(K.EQ.0) GO TO 200 + IPMEM(K+2) = ID +C WSTAWIENIE DO LISTY ATRYBUTOW + 200 CALL MADATR(ID,INDPR,341) +C ZAPAMIETANIE 1 W POLU USED - DLA AIL + IPMEM(ID+1)=1 +C WSTAWIENIE DO LISTY PF + CALL PUTPF(ID) +C +C ROZPOZNANIE TYPU + NM=IPMEM(IDPAR+4) + K=IFTYPE(NM) + IPMEM(ID-3) = K + IPMEM(ID-4) = IPMEM(IDPAR+5) +C WSTAWIENIE APETYTU + IPMEM(ID) = IAP(ID) +C JESLI TYP JEST FORMALNY, TO POPRAWIAMY SLOWO ZEROWE + IF(IAND(IPMEM(K),MTP) .NE. 6) RETURN + IPMEM(ID) = IOR(IPMEM(ID),ISHFT(1,12)) +C JESLI TYP FORMALNY JEST NIELOKALNY, TO POPRAWIAMY SPECYFIKACJE +C PROTOTYPU + IF(LOCAL.EQ.2) RETURN + IF(FORM2) GO TO 300 + CALL CHECK(INDPR) +C JESLI SYGNAL - TO BLAD + 250 IF(SYGN) CALL MERR(361,NM) + RETURN +C JESLI TYP POCHODZI Z TEJ SAMEJ LISTY PARAMETROW CO PROCEDUURA FORMALNA, +C TO DOBRZE + 300 IF(IPMEM(K-1).EQ.IPMEM(INDPR-1)) RETURN + GO TO 250 + END + SUBROUTINE PROCFUN +C +C * * * * * * ** * * * * * * * * * * * * * * * * * * * * * +C PRZETWARZA PROCEDURE LUB FUNKCJE FORMALNA I-GO RZEDU +C INFORMACJE O PARAMETRZE W BLOKU DWORK +C * * * * * * * * * * * * * * * * * * * * * * * * * * * * +C + IMPLICIT INTEGER(A-Z) +C +C ..... ZMIENNE GLOBALNE +C +C..... + LOGICAL INSYS, OWN + COMMON /BLANK/ COM(278), + X LMEM , LPMEM , IRECN , ISFIN , LPMSYS, LPML , LPMF , + X NRINT , NRRE , NRBOOL, NRCHR , NRCOR , NRPROC, NRTEXT, + X NRUNIV, NATTR , NRNONE, NBLSYS, NBLUS , NEMPTY, INSYS , + X LOCAL , OWN , OBJECT, + X IPMEM(5000) +C +C COM - OBSZAR KOMUNIKACYJNY STRUMIENI +C LMEM - (=5000) ROZMIAR CALEJ PAMIECI GLOWNEJ +C LPMEM - PODZIAL PAMIECI NA CZESCI IPMEM I ISMEM +C IRECN - INDEKS SZCZYTU STOSU STALYCH REAL +C ISFIN - INDEKS SZCZYTU SLOWNIKA PROTOTYPOW +C +C LPMSYS - INDEKS PIERWSZEGO SLOWA W IPMEM OBSZARU NIEPRZEZ- +C NACZONEGO NA PROTOTYPY SYSTEMOWE +C LPML - INDEKS PIERWSZEGO SLOWA OBSZARU WOLNEGO W IPMEM +C LPMF - INDEKS OSTATNIEGO SLOWA WOLNEGO OBSZARU W IPMEM +C +C +C + COMMON / DGLOB/ INDICT,INDSPR,INDPR,IHBEG,LASTPR,INDPREF +C +C ** ** ** ** *** ** ** ** ** ** ** ** ** ** ** ** ** +C BLOK ZAWIERA DANE O PRZETWARZANYM PROTOTYPIE +C INDICT - INDEKS PRZETWARZANEGO PROTTYPU W ISDICT +C INDSPR - IDENTYFIKATOR PROTOTYPU W ISMEM +C INDPR - IDENTYFIKATOR PROTOTYPU W IPMEM +C IHBEG - ADRES PIERWSZEGO SLOWA TABLICY HASHU +C IDPREF - IDENTYFIKATOR BEZPOSREDNIEGO PREFIKSU PRZETWARZANEGO +C PROTOTYPU +C LASTPR - IDENTYFIKATOR POPRZEDNIO PRZETWARZANEGO PROTOTYPU +C +C +C + COMMON /DWORK/ IDPAR,LFORMB,LFORME,FORM2,SYGN + LOGICAL FORM2, SYGN +C +C * * * * * * * * * * * * * * * * * * * * +C IDPAR - INDEKS SLOWA ZEROWEGO BIEZACEGO PARAMETRU W ISMEM +C LFORMB,LFORME - PIERWSZY I OSTATNI ELEMENT ROBOCZEJ LISTY PF +C FORM2=TRUE, GDY PRZETWAEZAMY PARAMETRY II-GO RZEDU +C SYGN = TRUE, GDY TO SA PARAMETRY SYGNALU +C +C + COMMON /DCOPIES/ INDPRC,IHBEGC, IDPARC,LFBC,LFEC +C +C * * * * * * * * * * * * * * * * * * * * * * +C KOPIE ZMIENNYCH Z DGLOB I DWORK +C INDPRC - KOPIA INDPR +C IHBEGC - KOPIA IHBEG +C IDPARC - KOPIA IDPAR +C LFBC - KOPIA LFORMB +C LFEC - KOPIA LFORME +C +C + COMMON / YNIT / NULLWD(23), SIZEPR(23), NULLPOZ(23), CONSTWD, + * VARWD,VARPOM,INPFW,OUTPFW, INOUT +cdsw INTEGER SIZEPR, CONSTWD, VARWD, VARPOM, OUTPFW +C +C ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** +C NULLWD(I) - WZORZEC SLOWA ZEROWEGO DLA PROTOTYPU RODZAJU I +C SIZEPR(I) - ROZMIAR POLA W IPMEM -- -- -- +C NULLPOZ(I) - POZYCJA SLOWA ZEROWEGO -- -- -- +C CONSTWD - WZORZEC SLOWA ZEROWEGO DLA CONST +C VARWD - -- -- -- -- DLA ZMIENNEJ +C VARPOM - -- -- -- -- ZMIENNEJ POMOCNICZEJ +C INPFW - -- -- -- -- ZMIEMNEJ INPUT +C OUTPFW - -- -- -- -- ZMIENNEJ OUTPUT +C INOUT - -- -- -- --- ZMIENNEJ INOUT +C +C + COMMON / MASKS / MTP,MSPR,MOTHERS,MPAR,MASKTP,NOTTP, + * MPROCES, MCOR, MERPF, MBLOCK,MHAND,MNOTVIR +C +C ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** +C MASKI I WZORCE: +C MTP - MASKA DO WYCINANIA INFORMACJI DOTYCZACYCH TYPOW ZE SLOWA ZEROWEGO +C MOTHERS - -- -- -- -- -- INNYCH PROTOTYPOW +C MPAR - -- -- -- -- -- -- ZMIENNYCH I PARAMETROW +C MSPR - MASKA DLA SYSPREF ( DLA PROTOTYPOW SYNTAKTYCZNYCH ) +C MASKTP - ZAPRZECZENIE MASKI MTP +C NOTTP - WZORZEC DLA NIE-TYPU ( 1 ) +C MPROCES - WZORZEC DLA PROCESU ( 5 ) +C MCOR - WZORZEC DLA COROUTINY (7) +C MERPF - MASKA DO WYKRYWANIA BLEDNYCH LIST PARAMETROW +C MBLOCK - WZORZEC DLA BLOKU ( 0 PRZY PRZECIECIU Z MOTHERS ) +C +C.....BLOK KOMUNIKACJI ZE STRUMIENIAMI + LOGICAL ERRFLG + COMMON /STREAM/ ERRFLG, LINE, IBUF2(265), IBUF3(7),JUNK(260) +C +C +C +C + NM=IPMEM(IDPAR+2) + LN=IPMEM(IDPAR+1) + LINE=LN +C . . . +C BEGM - POCZATEK WOLNEGO POLA W PAMIECI SYSTEMOWEJ + BEGM=LPML + LP=LASTPR +C UTWORZENIE OPISU PARAMETRU + K=IPMEM(IDPAR) + 10 + I=INITPR(K,NM) +C ZAPAMIETANIE KOPII + INDPRC=INDPR + IHBEGC=IHBEG + IDPARC=IDPAR + LFBC=LFORMB + LFEC=LFORME +C ZAMIANA ZMIENNYCH OKRESLAJACYCH PRZETWARZANY PROTOTYP + INDPR=I + IHBEG=I+10 + INSYS=.TRUE. + LFORMB=MGETM(2,341) + LFORME=LFORMB + FORM2=.TRUE. +C +C - - - - - - - - - - - - - - - - - - - +C PRZETWARZANIE LISTY PF II-GO RZEDU +C +C + INSYS=.FALSE. + IDPAR=IPMEM(IDPAR+4) + 100 IF(IDPAR.EQ.0) GO TO 500 + KD=IPMEM(IDPAR) + IF(KD.EQ.7) GO TO 200 + IF(KD.GE.8) GO TO 300 +C PROCEDURA/FUNKCJA II-GO RZEDU + CALL PROCF2 + GO TO 400 +C TYP FORMALNY + 200 CALL TYPEF + GO TO 400 +C ZMIENNA + 300 CALL VARIAB + 400 IDPAR = IPMEM(IDPAR+3) + GO TO 100 +C + 500 CONTINUE +C +C - - - - - - - - - - - - - - - - - +C CZYNNOSCI ORGANIZACYJNE(PAMIEC) I ZAKONCZENIE +C PRZETWARZANIA PROCEDURY/FUNKCJI +C + LINE=LN +C DOLACZENIE RESULT - JESLI TO JEST FUNKCJA + IF(K.EQ.13.OR.K.EQ.15) GO TO 700 + I=MGETM(6,341) +4 + IPMEM(I) = OUTPFW + CALL MADATR(I,INDPR,341) + CALL PUTPF(I) +C ZAPAMIETANIE IDENTYFIKATORA RESULT + IPMEM(INDPR-5)=I +C UWAGA - NAZWY RESULT NIE TRZEBA ZAPAMIETYWAC + 700 CONTINUE +C PRZEPISANIE PROTOTYPU DO CZESCI UZYTKOWNIKA + IF(K.EQ.14 .OR. K.EQ.16) GO TO 750 + I=INDPR-2 + J=7 + KD=MGETM(7,341) + INDPR=KD+2 + GO TO 800 + 750 I=INDPR-5 + J=10 + KD=MGETM(10,341) + INDPR=KD+5 + 800 CONTINUE + DO 888 II=1,J + I1=KD+II-1 + I2=I+II-1 + 888 IPMEM(I1) = IPMEM(I2) +C ZMIANA DOWIAZANIA NEXTDECL W PROTOTYPIE POPRZEDZAJACYM ( LP ) + IPMEM(LP+2) = INDPR + IF(IPMEM(INDPR+2).EQ.0) LASTPR = INDPR +C PRZEPISANIE LISTY PF + CALL COPY +C POPRAWIENIE ID PROTOTY@PU W TABLICY HASH + I=MEMBER(NM,IPMEM(IHBEGC)) + IPMEM(I+2) = INDPR +C POPRAWIENIE ID PROTOTYPU W LISCIE ATRYBUTOW + I=IPMEM(INDPR-2) +C I - NUMER ATRYBUTU + KD=IPMEM(INDPRC+6) + 920 J=IPMEM(KD) + IF(IPMEM(J-2).EQ.I) GO TO 950 + KD=IPMEM(KD+1) + GO TO 920 +C KD - ATRYBUT + 950 IPMEM(KD) = INDPR +C COFNIECIE PAMIECI SYSTEMOWEJ + LPML=BEGM +C COFNIECIE ZMIENNYCH Z DWORK + LFORMB=LFBC + LFORME=LFEC + IDPAR=IDPARC + FORM2=.FALSE. +C DOLACZENIE SIEBIE DO LISTY PF + CALL PUTPF(INDPR) +C COFNIECIE ZMIENNYCH Z DGLOB + I=INDPR + INDPR=INDPRC + IHBEG=IHBEGC +C +C JESLI FUNKCJA - TO NADANIE TYPU + IF(K.EQ.13 .OR. K.EQ.15) GO TO 1000 + NM=IPMEM(IDPAR+5) + J=IFTYPE(NM) + IPMEM(I-3) = J + IPMEM(I-4) = IPMEM(IDPAR+6) + K=IPMEM(I-5) + IPMEM(K-4) = IPMEM(I-4) + IPMEM(K-3) = J +C JESLI TO JEST TYP FORMALNY, TO POPRAWIAMY SLOWO ZEROWE + IF(IAND(IPMEM(J),MTP).NE.6) GO TO 1000 + IPMEM(I) = IOR(IPMEM(I),ISHFT(1,12)) + IPMEM(K) = IOR(IPMEM(K),ISHFT(1,12)) +C JESLI TYP FORMALNY JEST NIELOKALNY, TO ZLE DLA SYGNALU + IF(LOCAL.EQ.2 .OR. .NOT.SYGN) GO TO 1000 + CALL MERR(361,NM) + 1000 CONTINUE +C WYPISUJEMY INFORMACJE O PARAMETRACH II-GO RZEDU +C K=IPMEM(I+3) +C IF(IPMEM(I+4).EQ.0)RETURN +C J=IPMEM(I+4)+K-1 +C DO 1111 II=K,J +C I=IPMEM(II) +C NM=ISHFT(IAND(IPMEM(I),MPAR),-4) +C IF(NM.GE.4) GO TO 1112 +C CALL ffwrite(BO(2),"IDENTYFIKATOR =",17) +C CALL ffwrint(BO(2),I) +C CALL WRITEPR(I) +C GO TO 1111 +C1112 CALL WATTR(I) +C1111 CONTINUE +C . . . + RETURN + END + SUBROUTINE PROCF2 +C +C ** ** ** ** * * * * * * * * * * * * * * * * * +C PRZETWARZA PROCEDURE/FUNKCJE FORMALNA II-GO RZEDU +C PARAMETR DANY PRZEZ ZMIENNE Z BLOKU DWORK +C * * * * * * * * * * * * * * * * * * * * * * *** * +C + IMPLICIT INTEGER(A-Z) +C +C +C ..... ZMIENNE GLOBALNE +C +C..... + LOGICAL INSYS, OWN + COMMON /BLANK/ COM(278), + X LMEM , LPMEM , IRECN , ISFIN , LPMSYS, LPML , LPMF , + X NRINT , NRRE , NRBOOL, NRCHR , NRCOR , NRPROC, NRTEXT, + X NRUNIV, NATTR , NRNONE, NBLSYS, NBLUS , NEMPTY, INSYS , + X LOCAL , OWN , OBJECT, + X IPMEM(5000) +C +C COM - OBSZAR KOMUNIKACYJNY STRUMIENI +C LMEM - (=5000) ROZMIAR CALEJ PAMIECI GLOWNEJ +C LPMEM - PODZIAL PAMIECI NA CZESCI IPMEM I ISMEM +C IRECN - INDEKS SZCZYTU STOSU STALYCH REAL +C ISFIN - INDEKS SZCZYTU SLOWNIKA PROTOTYPOW +C +C LPMSYS - INDEKS PIERWSZEGO SLOWA W IPMEM OBSZARU NIEPRZEZ- +C NACZONEGO NA PROTOTYPY SYSTEMOWE +C LPML - INDEKS PIERWSZEGO SLOWA OBSZARU WOLNEGO W IPMEM +C LPMF - INDEKS OSTATNIEGO SLOWA WOLNEGO OBSZARU W IPMEM +C +C +C +C + COMMON /DWORK/ IDPAR,LFORMB,LFORME,FORM2,SYGN + LOGICAL FORM2, SYGN +C +C * * * * * * * * * * * * * * * * * * * * +C IDPAR - INDEKS SLOWA ZEROWEGO BIEZACEGO PARAMETRU W ISMEM +C LFORMB,LFORME - PIERWSZY I OSTATNI ELEMENT ROBOCZEJ LISTY PF +C FORM2=TRUE, GDY PRZETWAEZAMY PARAMETRY II-GO RZEDU +C SYGN = TRUE, GDY TO SA PARAMETRY SYGNALU +C +C +C.....BLOK KOMUNIKACJI ZE STRUMIENIAMI + LOGICAL ERRFLG + COMMON /STREAM/ ERRFLG, LINE, IBUF2(265), IBUF3(7),JUNK(260) +C +C + LINE=IPMEM(IDPAR+1) + NM=IPMEM(IDPAR+2) +C DOLACZENIE DO LISTY PF ATRYBUTU DODATKOWEGO(BRAK) +C UTWORZENIE PROTOTYPU + K=IPMEM(IDPAR)+15 + I=INITPR(K,NM) +C DOLACZENIE DO LISTY PF + CALL PUTPF(I) +C EWENTUALNIE TYP FUNKCJI - BRAK + IF(K.EQ.18) RETURN + IPMEM(I-3)=NRUNIV + RETURN + END + SUBROUTINE VIRTCOM +C +C * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +C SPRAWDZA KOMPATYBILNOSC WIRTUALI + +C * * * * * * * * * * * * * * * * * ** * * * * * * * * * * * +C + IMPLICIT INTEGER (A-Z) + LOGICAL PARCOM,P +C +C ..... ZMIENNE GLOBALNE +C +C..... + LOGICAL INSYS, OWN + COMMON /BLANK/ COM(278), + X LMEM , LPMEM , IRECN , ISFIN , LPMSYS, LPML , LPMF , + X NRINT , NRRE , NRBOOL, NRCHR , NRCOR , NRPROC, NRTEXT, + X NRUNIV, NATTR , NRNONE, NBLSYS, NBLUS , NEMPTY, INSYS , + X LOCAL , OWN , OBJECT, + X IPMEM(5000) +C +C COM - OBSZAR KOMUNIKACYJNY STRUMIENI +C LMEM - (=5000) ROZMIAR CALEJ PAMIECI GLOWNEJ +C LPMEM - PODZIAL PAMIECI NA CZESCI IPMEM I ISMEM +C IRECN - INDEKS SZCZYTU STOSU STALYCH REAL +C ISFIN - INDEKS SZCZYTU SLOWNIKA PROTOTYPOW +C +C LPMSYS - INDEKS PIERWSZEGO SLOWA W IPMEM OBSZARU NIEPRZEZ- +C NACZONEGO NA PROTOTYPY SYSTEMOWE +C LPML - INDEKS PIERWSZEGO SLOWA OBSZARU WOLNEGO W IPMEM +C LPMF - INDEKS OSTATNIEGO SLOWA WOLNEGO OBSZARU W IPMEM +C +C +C + COMMON / DGLOB/ INDICT,INDSPR,INDPR,IHBEG,LASTPR,INDPREF +C +C ** ** ** ** *** ** ** ** ** ** ** ** ** ** ** ** ** +C BLOK ZAWIERA DANE O PRZETWARZANYM PROTOTYPIE +C INDICT - INDEKS PRZETWARZANEGO PROTTYPU W ISDICT +C INDSPR - IDENTYFIKATOR PROTOTYPU W ISMEM +C INDPR - IDENTYFIKATOR PROTOTYPU W IPMEM +C IHBEG - ADRES PIERWSZEGO SLOWA TABLICY HASHU +C IDPREF - IDENTYFIKATOR BEZPOSREDNIEGO PREFIKSU PRZETWARZANEGO +C PROTOTYPU +C LASTPR - IDENTYFIKATOR POPRZEDNIO PRZETWARZANEGO PROTOTYPU +C +C +C + COMMON / MASKS / MTP,MSPR,MOTHERS,MPAR,MASKTP,NOTTP, + * MPROCES, MCOR, MERPF, MBLOCK,MHAND,MNOTVIR +C +C ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** +C MASKI I WZORCE: +C MTP - MASKA DO WYCINANIA INFORMACJI DOTYCZACYCH TYPOW ZE SLOWA ZEROWEGO +C MOTHERS - -- -- -- -- -- INNYCH PROTOTYPOW +C MPAR - -- -- -- -- -- -- ZMIENNYCH I PARAMETROW +C MSPR - MASKA DLA SYSPREF ( DLA PROTOTYPOW SYNTAKTYCZNYCH ) +C MASKTP - ZAPRZECZENIE MASKI MTP +C NOTTP - WZORZEC DLA NIE-TYPU ( 1 ) +C MPROCES - WZORZEC DLA PROCESU ( 5 ) +C MCOR - WZORZEC DLA COROUTINY (7) +C MERPF - MASKA DO WYKRYWANIA BLEDNYCH LIST PARAMETROW +C MBLOCK - WZORZEC DLA BLOKU ( 0 PRZY PRZECIECIU Z MOTHERS ) +C +C +C +C.....BLOK KOMUNIKACJI ZE STRUMIENIAMI + LOGICAL ERRFLG + COMMON /STREAM/ ERRFLG, LINE, IBUF2(265), IBUF3(7),JUNK(260) +C +C + COMMON /DWV/ NM,INDV,FORM2,TPVI,INDPR1,INDV1 + LOGICAL FORM2,TPVI +C +C ** ** ** ** ** ** ** ** ** ** *** ** ** ** ** ** ** +C ROBOCZY BLOK DO KOMPATYBILNOSCI VIRTUALI +C NM - NAZWA WIRTUALA +C INDV - IDENTYFIKATOR WYZSZEGO VIRTUALA +C FORM2 - TRUE, GDY PRZETWARZAMY PF II-GO RZEDU +C TPVI - GDY CHODZI O TYP FUNKCJI WIRTUALNEJ +C INDPR1,INDV1 - IDENTYFIKATORY PRZETWARZANYCH PROCEDUR/FUNKCJI +C FORMALNYCH +C +C + TPVI=.FALSE. + FORM2=.FALSE. + INDV=IPMEM(INDPR+26) + NM=IPMEM(INDSPR+10) + LINE=IPMEM(INDSPR+9) +C KONTROLA RODZAJOW WIRTUALI + IRU=ISHFT(IAND(IPMEM(INDV),MOTHERS),-8) + IRL=ISHFT(IAND(IPMEM(INDPR),MOTHERS),-8) + IF (IRU.EQ.IRL) GO TO 50 +C BLAD RODZAJOW + CALL MERR(331,NM) +C JESLI TO SA FUNKCJE - TO SPRAWDZAMY TYPY + 50 IF(IRL.EQ.4 .OR. IRU.EQ.4) GO TO 100 + TPVI=.TRUE. + CALL TYPECOM(INDV,INDPR) + TPVI = .FALSE. + 100 I=IPMEM(INDPR+3) + IL=IPMEM(INDPR+4) +C DLA FUNKCJI TRZEBA POMINAC RESULT + IF(IRL.EQ.2) IL=IL-1 + J=IPMEM(INDV+3) + JU=IPMEM(INDV+4) + IF(IRU.EQ.2) JU=JU-1 +C I,IL - POCZATEK I DLUGOSC LISTY PF DLA INDPR +C J,JU - POCZATEK I DLUGOSC LISTY PF DLA INDV + IF(IL+JU.EQ.0) GO TO 1000 + IF(IL.NE.JU) GO TO 800 +C ZGODNA LICZBA PARAMETROW + 200 IL=IL+I-1 + JU=JU+J-1 + NM=NEMPTY +C SPRAWDZENIE ZGODNOSCI PARAMETROW +C PROCEDURA PARCOM DAJE TRUE, GDY TRZEBA +C DALEJ SPRAWDZAC ZGODNOSC PF II-GO RZEDU +C (TZN. SA TO PROCEDURY/FUNKCJE) + 300 IF(.NOT.PARCOM(IPMEM(J),IPMEM(I))) GO TO 700 +C SPRAWDZAMY ZGODNOSC PF II-GO RZEDU + FORM2=.TRUE. + INDPR1=IPMEM(I) + INDV1=IPMEM(J) + IRL1=ISHFT(IAND(IPMEM(INDPR1),MOTHERS),-8) + IRU1=ISHFT(IAND(IPMEM(INDV1),MOTHERS),-8) + I1=IPMEM(INDPR1+3) + IL1=IPMEM(INDPR1+4) +C DLA FUNKCJI - POMIJAMY RESULT + IF(IRL1.EQ.2) IL1 = IL1-1 + J1=IPMEM(INDV1+3) + JU1=IPMEM(INDV1+4) + IF(IRU1.EQ.2) JU1 = JU1-1 + IF(IL1+JU1.EQ.0) GO TO 600 + IF(IL1.NE.JU1) GO TO 500 + 350 IL1=IL1+I1-1 + JU1=JU1+J1-1 +C SPRAWDZANIE ZGODNOSCI PARAMETROW II-GO RZEDU + 400 P=PARCOM(IPMEM(J1),IPMEM(I1)) + I1=I1+1 + J1=J1+1 + IF(I1.LE.IL1.AND.J1.LE.JU1) GO TO 400 + GO TO 600 +C NIEZGODNA LICZBA PARAMETROW + 500 CONTINUE + IF(IL1.LT.JU1) GO TO 530 +C SPRAWDZAMY,CZY LISTA KROTSZA JEST BLEDNA + IF(IAND(IPMEM(INDV1),MERPF).NE.0) GO TO 550 + CALL MERR(336,NM) + GO TO 550 + 530 IF(IAND(IPMEM(INDPR1),MERPF).NE.0) GO TO 550 + CALL MERR(336,NM) + 550 IF(IL1*JU1.NE.0) GO TO 350 + 600 CONTINUE +C KONIEC SPRAWDZANIA PARAMETROW II-GO RZEDU + FORM2=.FALSE. + 700 I=I+1 + J=J+1 + IF(I.LE.IL.AND.J.LE.JU) GO TO 300 +C KONIEC PARAMETROW + GO TO 1000 +C NIEZGODNA LICZBA PARAMETROW + 800 IF(IL.LT.JU) GO TO 850 + IF(IAND(IPMEM(INDV),MERPF).NE.0) GO TO 900 +C KROTSZA LISTA PF NIE JEST BLEDNA + CALL MERR(333,NM) + GO TO 900 + 850 IF(IAND(IPMEM(INDPR),MERPF).NE.0) GO TO 900 + CALL MERR(333,NM) + 900 IF(IL*JU.NE.0) GO TO 200 +C + 1000 CONTINUE +C ZAKONCZENIE + RETURN + END + LOGICAL FUNCTION PARCOM(PARU,PARL) +C +C * * * * * * * * * * * * * * * * * * * * * * ** * * * * * * * * * * +C SPRAWDZA ZGODNOSCI PARAMETROW O IDENTYFIKATORACH PARU I PARL +C PARCOM=.TRUE., GDY OBA PARAMETRY SA PROCEDURA LUB FUNKCJA +C * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +C + IMPLICIT INTEGER(A-Z) +C +C ..... ZMIENNE GLOBALNE +C +C..... + LOGICAL INSYS, OWN + COMMON /BLANK/ COM(278), + X LMEM , LPMEM , IRECN , ISFIN , LPMSYS, LPML , LPMF , + X NRINT , NRRE , NRBOOL, NRCHR , NRCOR , NRPROC, NRTEXT, + X NRUNIV, NATTR , NRNONE, NBLSYS, NBLUS , NEMPTY, INSYS , + X LOCAL , OWN , OBJECT, + X IPMEM(5000) +C +C COM - OBSZAR KOMUNIKACYJNY STRUMIENI +C LMEM - (=5000) ROZMIAR CALEJ PAMIECI GLOWNEJ +C LPMEM - PODZIAL PAMIECI NA CZESCI IPMEM I ISMEM +C IRECN - INDEKS SZCZYTU STOSU STALYCH REAL +C ISFIN - INDEKS SZCZYTU SLOWNIKA PROTOTYPOW +C +C LPMSYS - INDEKS PIERWSZEGO SLOWA W IPMEM OBSZARU NIEPRZEZ- +C NACZONEGO NA PROTOTYPY SYSTEMOWE +C LPML - INDEKS PIERWSZEGO SLOWA OBSZARU WOLNEGO W IPMEM +C LPMF - INDEKS OSTATNIEGO SLOWA WOLNEGO OBSZARU W IPMEM +C +C +C + COMMON /DWV/ NM,INDV,FORM2,TPVI,INDPR1,INDV1 + LOGICAL FORM2,TPVI +C +C ** ** ** ** ** ** ** ** ** ** *** ** ** ** ** ** ** +C ROBOCZY BLOK DO KOMPATYBILNOSCI VIRTUALI +C NM - NAZWA WIRTUALA +C INDV - IDENTYFIKATOR WYZSZEGO VIRTUALA +C FORM2 - TRUE, GDY PRZETWARZAMY PF II-GO RZEDU +C TPVI - GDY CHODZI O TYP FUNKCJI WIRTUALNEJ +C INDPR1,INDV1 - IDENTYFIKATORY PRZETWARZANYCH PROCEDUR/FUNKCJI +C FORMALNYCH +C +C +C + COMMON / MASKS / MTP,MSPR,MOTHERS,MPAR,MASKTP,NOTTP, + * MPROCES, MCOR, MERPF, MBLOCK,MHAND,MNOTVIR +C +C ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** +C MASKI I WZORCE: +C MTP - MASKA DO WYCINANIA INFORMACJI DOTYCZACYCH TYPOW ZE SLOWA ZEROWEGO +C MOTHERS - -- -- -- -- -- INNYCH PROTOTYPOW +C MPAR - -- -- -- -- -- -- ZMIENNYCH I PARAMETROW +C MSPR - MASKA DLA SYSPREF ( DLA PROTOTYPOW SYNTAKTYCZNYCH ) +C MASKTP - ZAPRZECZENIE MASKI MTP +C NOTTP - WZORZEC DLA NIE-TYPU ( 1 ) +C MPROCES - WZORZEC DLA PROCESU ( 5 ) +C MCOR - WZORZEC DLA COROUTINY (7) +C MERPF - MASKA DO ROZPOZNANIA BLEDNYCH LIST PF +C MBLOCK - WZORZEC DLA BLOKU ( 0 PRZY PRZECIECIU Z MOTHERS ) +C +C +C +C.....BLOK KOMUNIKACJI ZE STRUMIENIAMI + LOGICAL ERRFLG + COMMON /STREAM/ ERRFLG, LINE, IBUF2(265), IBUF3(7),JUNK(260) +C +C + IDU=ISHFT(IAND(IPMEM(PARU),MPAR),-4) + IDL=ISHFT(IAND(IPMEM(PARL),MPAR),-4) + PARCOM=.FALSE. +C . . . +C KONTROLA RODZAJOW + IF(IDU.EQ.IDL) GO TO 100 +C NIEZGODNE RODZAJE + I=334 + IF (FORM2) I=337 + CALL MERR(I,NM) +C JESLI OBA PARAMETRY SA ZMIENNYMI, TO KONTROLA TYPOW + 100 IF((IDU.EQ.5.OR.IDU.EQ.6.OR.IDU.EQ.9) + * .AND. (IDL.EQ.5.OR.IDL.EQ.6.OR.IDL.EQ.9)) GO TO 300 + IF(IDU.NE.2.AND.IDU.NE.3 .OR. IDL.NE.2.AND.IDL.NE.3) + * RETURN + PARCOM=.TRUE. +C JESLI OBIE FUNKCJE I-GO RZEDU - TO KONTROLA TYPOW + IF(IDU.NE.2.OR.IDL.NE.2) RETURN + IF(FORM2) RETURN +C KONTROLA TYPOW + 300 CALL TYPECOM(PARU,PARL) + RETURN + END + SUBROUTINE TYPECOM (TPU,TPL) +C +C * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +C KONTROLA ZGODNOSCI TYPOW +C TPU,TPL - IDENTYFIKATORY ZMIENNYCH(FUNKCJI) +C TPVI=.TRUE., GDY TO SA TYPY FUNKCJI VIRTUALNYCH +C * * * * * * * * * * * * * * * * * * * * * * * * * * * * +C + IMPLICIT INTEGER(A-Z) + LOGICAL POMU,POML,BPREF +C +C ..... ZMIENNE GLOBALNE +C +C..... + LOGICAL INSYS, OWN + COMMON /BLANK/ COM(278), + X LMEM , LPMEM , IRECN , ISFIN , LPMSYS, LPML , LPMF , + X NRINT , NRRE , NRBOOL, NRCHR , NRCOR , NRPROC, NRTEXT, + X NRUNIV, NATTR , NRNONE, NBLSYS, NBLUS , NEMPTY, INSYS , + X LOCAL , OWN , OBJECT, + X IPMEM(5000) +C +C COM - OBSZAR KOMUNIKACYJNY STRUMIENI +C LMEM - (=5000) ROZMIAR CALEJ PAMIECI GLOWNEJ +C LPMEM - PODZIAL PAMIECI NA CZESCI IPMEM I ISMEM +C IRECN - INDEKS SZCZYTU STOSU STALYCH REAL +C ISFIN - INDEKS SZCZYTU SLOWNIKA PROTOTYPOW +C +C LPMSYS - INDEKS PIERWSZEGO SLOWA W IPMEM OBSZARU NIEPRZEZ- +C NACZONEGO NA PROTOTYPY SYSTEMOWE +C LPML - INDEKS PIERWSZEGO SLOWA OBSZARU WOLNEGO W IPMEM +C LPMF - INDEKS OSTATNIEGO SLOWA WOLNEGO OBSZARU W IPMEM +C +C +C + COMMON / MASKS / MTP,MSPR,MOTHERS,MPAR,MASKTP,NOTTP, + * MPROCES, MCOR, MERPF, MBLOCK,MHAND,MNOTVIR +C +C ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** +C MASKI I WZORCE: +C MTP - MASKA DO WYCINANIA INFORMACJI DOTYCZACYCH TYPOW ZE SLOWA ZEROWEGO +C MOTHERS - -- -- -- -- -- INNYCH PROTOTYPOW +C MPAR - -- -- -- -- -- -- ZMIENNYCH I PARAMETROW +C MSPR - MASKA DLA SYSPREF ( DLA PROTOTYPOW SYNTAKTYCZNYCH ) +C MASKTP - ZAPRZECZENIE MASKI MTP +C NOTTP - WZORZEC DLA NIE-TYPU ( 1 ) +C MPROCES - WZORZEC DLA PROCESU ( 5 ) + +C MERPF - MASKA DO ROZPOZNAWANIA BLEDNYCH LIST PARAMETROW +C MBLOCK - WZORZEC DLA BLOKU ( 0 PRZY PRZECIECIU Z MOTHERS ) +C +C +C + COMMON /DWV/ NM,INDV,FORM2,TPVI,INDPR1,INDV1 + LOGICAL FORM2,TPVI +C +C ** ** ** ** ** ** ** ** ** ** *** ** ** ** ** ** ** +C ROBOCZY BLOK DO KOMPATYBILNOSCI VIRTUALI +C NM - NAZWA WIRTUALA +C INDV - IDENTYFIKATOR WYZSZEGO VIRTUALA +C FORM2 - TRUE, GDY PRZETWARZAMY PF II-GO RZEDU +C TPVI - GDY CHODZI O TYP FUNKCJI WIRTUALNEJ +C INDPR1,INDV1 - IDENTYFIKATORY PRZETWARZANYCH PROCEDUR/FUNKCJI +C FORMALNYCH +C +C +C +C U - TYP WYZSZY +C IARU,IARL - ILOSC ARRAY OF +C ITU,ITL - IDENTYFIKATORY TYPOW +C IDENU,IDNEL - WARTOSCI MTP ZE SLOWA ZEROWEGO TYPOW + ITU=IPMEM(TPU-3) + ITL=IPMEM(TPL-3) + IARU=IPMEM(TPU-4) + IARL=IPMEM(TPL-4) +C JESLI TYPY SA IDENTYCZNE, TO DOBRZE + IF(IARU.EQ.IARL.AND.ITL.EQ.ITU) RETURN +C JESLI JEDEN Z TYPOW JEST UNIWERSALNY, TO DOBRZE + IF(ITL.EQ.NRUNIV.OR.ITU.EQ.NRUNIV) RETURN +C JESLI TYPY ROZNIA SIE TYLKO ARRAY OF , TO ZLE + IF(IARU.NE.IARL.AND.ITL.EQ.ITU) GO TO 999 + IDENU=IAND(IPMEM(ITU),MTP) + IDENL=IAND(IPMEM(ITL),MTP) + IF(IDENU.EQ.6) GO TO 500 +C TYP WYZSZY NIE JEST FORMALNY +C JESLI NIE ZGADZA SIE ARRAY OF , TO BLAD + IF(IARU.NE.IARL) GO TO 999 +C JESLI SA TABLICOWE, TO MUSZA BYC ROWNE + IF(IARU.NE.0.AND.ITU.NE.ITL) GO TO 999 +C JESLI JESZCZE SA TU TYPY PRYMITYWNE, TO BLAD(MUSZA BYC ROWNE) + IF(IDENU.GE.8 .AND. IDENU.LT.13) GO TO 999 + IF(IDENL .GE. 8 .AND. IDENL .LT. 13) GO TO 999 + IF(ITU.EQ.NRCOR) GO TO 200 + IF(ITU.EQ.NRPROC) GO TO 300 +C TYP WYZSZY JEST KLASOWY +C TYPY MAJA BYC W SEKWENCJI PREFIKSOWEJ + IF(IDENL.EQ.6) GO TO 999 + I=IPMEM(ITU-6) + J=IPMEM(ITL-6 ) + IF(BPREF(ITL,I)) RETURN + IF(TPVI) GO TO 999 + IF(BPREF(ITU,J)) RETURN + GO TO 999 +C WYZSZY - SAMA COROUTINA + 200 IF(IDENL.EQ.5 .OR. IDENL.EQ.7) RETURN + IF(BPREF(ITL,IPMEM(NRCOR-6))) RETURN + IF(BPREF(ITL,IPMEM(NRPROC-6))) RETURN + GO TO 999 +C WYZSZY - SAM PROCESS + 300 IF(IDENL.EQ.5) RETURN + IF(BPREF(ITL,IPMEM(NRPROC-6))) RETURN + GO TO 999 +C +C WYZSZY - TYP FORMALNY + 500 CONTINUE + I=NRPAR(ITU,.TRUE.) + J=NRPAR(ITL,.FALSE.) +C I,J - NUMERY TYPOW W LISCIE INDV(INDPR) +C JESLI TO SA PARAMETRY II-GO RZEDU, TO TAKZE +C W LISCIE PF INDV1(INDPR1) + IF(I+J.EQ.0) GO TO 700 + IF(I.NE.J) GO TO 999 + IF(IARU.NE.IARL) GO TO 999 +C TRZEBA SPARWDZIC, CZY OBA TYPY SA PARAMETRAMI +C TEGO SAMEGO RZEDU + I=IPMEM(ITU-1) + J=IPMEM(ITL-1) +C I,J - SLE + POMU=IAND(IPMEM(I),MPAR).NE.0 + POML=IAND(IPMEM(J),MPAR).NE.0 + IF(POMU.AND.POML.OR..NOT.(POMU.OR.POML))RETURN + GO TO 999 +C +C TO NIE JEST WLASNY PARAMETR + 700 CONTINUE + IF(IARU.NE.0) GO TO 800 +C JESLI WYZSZY NIE JEST TABLICOWY, TO ZLE, GDY +C NIZSZY JEST PRYMITYWNY NIETABLICOWY + IF(IARL.NE.0) RETURN + IF(IDENL.GE.8.AND.IDENL.LT.13) GO TO 999 + RETURN +C WYZSZY JEST TYPEM TABLICOWYM + 800 IF(IDENL.EQ.6) RETURN + IF(IARU.LE.IARL) RETURN +C SYGNALIZACJA BLEDOW + 999 I=335 + IF (TPVI) I=332 + IF(FORM2) I=338 + CALL MERR(I,NM) + RETURN + END + INTEGER FUNCTION NRPAR(IDT,UP) +C +C * * * * * * *** * * * * * * * * * * * * * * * * * * * * * +C SPRAWDZA,CZY TYP IDT JEST PARAMETREM INDPR(INDV) +C UP=.TRUE. - CHODZI O WIRTUAL WYZSZY (INDV) +C NRPAR - NUMER IDT JAKO PARAMETRU ( LUB 0) +C JESLI FORM2=.TRUE., TO BADA TEZ, CZY TYP JEST PARAMETREM/ +C INDV1(ODP. INDPR1) +C * * * * * * * * * * * * * * * * * * * * * * * * * ** * * * +C + IMPLICIT INTEGER(A-Z) + LOGICAL UP,BPREF +C +C ..... ZMIENNE GLOBALNE +C +C..... + LOGICAL INSYS, OWN + COMMON /BLANK/ COM(278), + X LMEM , LPMEM , IRECN , ISFIN , LPMSYS, LPML , LPMF , + X NRINT , NRRE , NRBOOL, NRCHR , NRCOR , NRPROC, NRTEXT, + X NRUNIV, NATTR , NRNONE, NBLSYS, NBLUS , NEMPTY, INSYS , + X LOCAL , OWN , OBJECT, + X IPMEM(5000) +C +C COM - OBSZAR KOMUNIKACYJNY STRUMIENI +C LMEM - (=5000) ROZMIAR CALEJ PAMIECI GLOWNEJ +C LPMEM - PODZIAL PAMIECI NA CZESCI IPMEM I ISMEM +C IRECN - INDEKS SZCZYTU STOSU STALYCH REAL +C ISFIN - INDEKS SZCZYTU SLOWNIKA PROTOTYPOW +C +C LPMSYS - INDEKS PIERWSZEGO SLOWA W IPMEM OBSZARU NIEPRZEZ- +C NACZONEGO NA PROTOTYPY SYSTEMOWE +C LPML - INDEKS PIERWSZEGO SLOWA OBSZARU WOLNEGO W IPMEM +C LPMF - INDEKS OSTATNIEGO SLOWA WOLNEGO OBSZARU W IPMEM +C +C +C + COMMON / DGLOB/ INDICT,INDSPR,INDPR,IHBEG,LASTPR,INDPREF +C +C ** ** ** ** *** ** ** ** ** ** ** ** ** ** ** ** ** +C BLOK ZAWIERA DANE O PRZETWARZANYM PROTOTYPIE +C INDICT - INDEKS PRZETWARZANEGO PROTTYPU W ISDICT +C INDSPR - IDENTYFIKATOR PROTOTYPU W ISMEM +C INDPR - IDENTYFIKATOR PROTOTYPU W IPMEM +C IHBEG - ADRES PIERWSZEGO SLOWA TABLICY HASHU +C IDPREF - IDENTYFIKATOR BEZPOSREDNIEGO PREFIKSU PRZETWARZANEGO +C PROTOTYPU +C LASTPR - IDENTYFIKATOR POPRZEDNIO PRZETWARZANEGO PROTOTYPU +C +C +C + COMMON / MASKS / MTP,MSPR,MOTHERS,MPAR,MASKTP,NOTTP, + * MPROCES, MCOR, MERPF, MBLOCK,MHAND,MNOTVIR +C +C ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** +C MASKI I WZORCE: +C MTP - MASKA DO WYCINANIA INFORMACJI DOTYCZACYCH TYPOW ZE SLOWA ZEROWEGO +C MOTHERS - -- -- -- -- -- INNYCH PROTOTYPOW +C MPAR - -- -- -- -- -- -- ZMIENNYCH I PARAMETROW +C MSPR - MASKA DLA SYSPREF ( DLA PROTOTYPOW SYNTAKTYCZNYCH ) +C MASKTP - ZAPRZECZENIE MASKI MTP +C NOTTP - WZORZEC DLA NIE-TYPU ( 1 ) +C MPROCES - WZORZEC DLA PROCESU ( 5 ) +C MCOR - WZORZEC DLA COROUTINY (7) +C MERPF - MASKA DO ROZPOZNAWANIA BLEDNYCH LIST PARAMETROW +C MBLOCK - WZORZEC DLA BLOKU ( 0 PRZY PRZECIECIU Z MOTHERS ) +C +C +C + COMMON /DWV/ NM,INDV,FORM2,TPVI,INDPR1,INDV1 + LOGICAL FORM2,TPVI +C +C ** ** ** ** ** ** ** ** ** ** *** ** ** ** ** ** ** +C ROBOCZY BLOK DO KOMPATYBILNOSCI VIRTUALI +C NM - NAZWA WIRTUALA +C INDV - IDENTYFIKATOR WYZSZEGO VIRTUALA +C FORM2 - TRUE, GDY PRZETWARZAMY PF II-GO RZEDU +C TPVI - GDY CHODZI O TYP FUNKCJI WIRTUALNEJ +C INDPR1,INDV1 - IDENTYFIKATORY PRZETWARZANYCH PROCEDUR/FUNKCJI +C FORMALNYCH +C +C +C +C + NRPAR=0 +C JESLI TYP NIE JEST FORMALNY, TO KONIEC + I=IAND(IPMEM(IDT),MTP) + IF(I.NE.6) RETURN +C IND - TU SZUKAMY PARAMETRU + IF(FORM2) GO TO 500 + 300 IND=INDPR + IF(UP) IND=INDV + IS=IPMEM(IDT-1) +C IS - SL TYPU +C SPRAWDZAMY, CZY I=IND LUB JEGO PREFIKS + IF(IS.EQ.IND) GO TO 100 +C JESLI IS NIE JEST KLASA, TO KONIEC + IF(IAND(IPMEM(IS),MTP).EQ.1) RETURN + IF(.NOT.BPREF(IND,IPMEM(IS-6))) RETURN +C TO JEST PARAMETR + 100 I=IPMEM(IND+3) + 200 NRPAR=NRPAR+1 + IF(IPMEM(I).EQ.IDT) RETURN + I=I+1 + GO TO 200 +C SZUKAMY W LISCIE II-GO RZEDU + 500 IND=INDPR1 + IF(UP) IND=INDV1 + IF(IS.NE.IND) GO TO 300 + GO TO 100 + END + SUBROUTINE SIGNAL ( IDSIG ) +C + IMPLICIT INTEGER (A-Z) +C +C * * * * * * ** * * * * * * * * * * ** * * * * * * * * * * * * * * * * * +C PRZETWARZA SYGNAL O IDENTYFIKATORZE ( SYNTAKTYCZNYM ) IDSIG +C TWORZY DLA NIEGO KOMPLETNY PROTOTYP +C * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +C +C +C..... + LOGICAL INSYS, OWN + COMMON /BLANK/ COM(278), + X LMEM , LPMEM , IRECN , ISFIN , LPMSYS, LPML , LPMF , + X NRINT , NRRE , NRBOOL, NRCHR , NRCOR , NRPROC, NRTEXT, + X NRUNIV, NATTR , NRNONE, NBLSYS, NBLUS , NEMPTY, INSYS , + X LOCAL , OWN , OBJECT, + X IPMEM(5000) +C +C COM - OBSZAR KOMUNIKACYJNY STRUMIENI +C LMEM - (=5000) ROZMIAR CALEJ PAMIECI GLOWNEJ +C LPMEM - PODZIAL PAMIECI NA CZESCI IPMEM I ISMEM +C IRECN - INDEKS SZCZYTU STOSU STALYCH REAL +C ISFIN - INDEKS SZCZYTU SLOWNIKA PROTOTYPOW +C +C LPMSYS - INDEKS PIERWSZEGO SLOWA W IPMEM OBSZARU NIEPRZEZ- +C NACZONEGO NA PROTOTYPY SYSTEMOWE +C LPML - INDEKS PIERWSZEGO SLOWA OBSZARU WOLNEGO W IPMEM +C LPMF - INDEKS OSTATNIEGO SLOWA WOLNEGO OBSZARU W IPMEM +C +C + COMMON / DGLOB/ INDICT,INDSPR,INDPR,IHBEG,LASTPR,INDPREF +C +C ** ** ** ** *** ** ** ** ** ** ** ** ** ** ** ** ** +C BLOK ZAWIERA DANE O PRZETWARZANYM PROTOTYPIE +C INDICT - INDEKS PRZETWARZANEGO PROTTYPU W ISDICT +C INDSPR - IDENTYFIKATOR PROTOTYPU W ISMEM +C INDPR - IDENTYFIKATOR PROTOTYPU W IPMEM +C IHBEG - ADRES PIERWSZEGO SLOWA TABLICY HASHU +C IDPREF - IDENTYFIKATOR BEZPOSREDNIEGO PREFIKSU PRZETWARZANEGO +C PROTOTYPU +C LASTPR - IDENTYFIKATOR POPRZEDNIO PRZETWARZANEGO PROTOTYPU +C +C +C +cdsw COMMON /SIGNALS/ NRSIG, HLISTE +cdsw ----------------------------------------------------- + common /signs/ nrsig, hliste +cdsw ----------------------------------------------------- +C +C NRSIG - OSTATNIO PRZYDZIELONY NUMER SYGNALU +C HLISTE - OSTATNI ELEMENT LISTY SYGNALOW (W KAZDYM MODULE ) +C +C.....BLOK KOMUNIKACJI ZE STRUMIENIAMI + LOGICAL ERRFLG + COMMON /STREAM/ ERRFLG, LINE, IBUF2(265), IBUF3(7),JUNK(260) +C . . . +C +C NRPR - NUMER PROTOTYPU SEMANTYCZNEGO + NRPR = IPMEM(IDSIG) + NM = IPMEM(IDSIG+2) + LINE = IPMEM(IDSIG+1) +C USTAWIENIE BITU CLOSE + I = MEMSL (NM, INDPR ) + IPMEM(I+1) = 1 +C PRZYDZIELENIE NUMERU SYGNALU + NRSIG = NRSIG+1 + IPMEM(NRPR+1) = NRSIG +C ZAPAMIETANIE SYNTAKTYCZNEJ LISTY PARAMETROW W PROTOTYIE SYGNALU (KONTROLA) + IPMEM(NRPR+8) = IPMEM(IDSIG+4) +C +C PRZETWARZANIE NAGLOWKA +C ZAPAMIETANIE KOPII ZMIENNYZCH OKRESLAJACYCH PRZETWARZANY PROTOTYP + INDC = INDSPR + INDPRC = INDPR + PREFC = INDPREF + IHBEGC = IHBEG +C NADANIE NOWYCH WARTOSCI + INDPR = NRPR + INDSPR = IDSIG + IHBEG = INDPR+10 + INDPREF = 0 +C PRZETWARZANIE NAGLOWKA + CALL HEADER +C PRZYWROCENIE WARTOSCI ZMIENNYM + INDPR = INDPRC + INDSPR = INDC + IHBEG = IHBEGC + INDPREF = PREFC +C . . . + RETURN + END + SUBROUTINE HANDLER ( IDSMEM ) +C + IMPLICIT INTEGER ( A-Z ) +C INSERTION OF + LOGICAL BTEST +C BECAUSE OF TYPECONFLICT 03.01.84 +C +C ** * * * * ** * * * * * * * * * ** * * * * * ** ** ** * ** * * *** * ** +C PRZETWARZA PROTOTYP HANDLERA +C IDSMEM - IDENTYFIKATOR PROTOTYPU SYNTAKTYCZNEGO +C * * * * * * * * * * * * * * * * *** * * * * * * * * * *** * * * * * * +C +C +C..... + LOGICAL INSYS, OWN + COMMON /BLANK/ COM(278), + X LMEM , LPMEM , IRECN , ISFIN , LPMSYS, LPML , LPMF , + X NRINT , NRRE , NRBOOL, NRCHR , NRCOR , NRPROC, NRTEXT, + X NRUNIV, NATTR , NRNONE, NBLSYS, NBLUS , NEMPTY, INSYS , + X LOCAL , OWN , OBJECT, + X IPMEM(5000) +C +C COM - OBSZAR KOMUNIKACYJNY STRUMIENI +C LMEM - (=5000) ROZMIAR CALEJ PAMIECI GLOWNEJ +C LPMEM - PODZIAL PAMIECI NA CZESCI IPMEM I ISMEM +C IRECN - INDEKS SZCZYTU STOSU STALYCH REAL +C ISFIN - INDEKS SZCZYTU SLOWNIKA PROTOTYPOW +C +C LPMSYS - INDEKS PIERWSZEGO SLOWA W IPMEM OBSZARU NIEPRZEZ- +C NACZONEGO NA PROTOTYPY SYSTEMOWE +C LPML - INDEKS PIERWSZEGO SLOWA OBSZARU WOLNEGO W IPMEM +C LPMF - INDEKS OSTATNIEGO SLOWA WOLNEGO OBSZARU W IPMEM +C +C +C + COMMON / DGLOB/ INDICT,INDSPR,INDPR,IHBEG,LASTPR,INDPREF +C +C ** ** ** ** *** ** ** ** ** ** ** ** ** ** ** ** ** +C BLOK ZAWIERA DANE O PRZETWARZANYM PROTOTYPIE +C INDICT - INDEKS PRZETWARZANEGO PROTTYPU W ISDICT +C INDSPR - IDENTYFIKATOR PROTOTYPU W ISMEM +C INDPR - IDENTYFIKATOR PROTOTYPU W IPMEM +C IHBEG - ADRES PIERWSZEGO SLOWA TABLICY HASHU +C IDPREF - IDENTYFIKATOR BEZPOSREDNIEGO PREFIKSU PRZETWARZANEGO +C PROTOTYPU +C LASTPR - IDENTYFIKATOR POPRZEDNIO PRZETWARZANEGO PROTOTYPU +C +C +C +cdsw COMMON /SIGNALS/ NRSIG, HLISTE +cdsw ---------------------------------------------------------- + common /signs/ nrsig, hliste +cdsw ---------------------------------------------------------- +C +C NRSIG - OSTATNIO PRZYDZIELONY NUMER SYGNALU +C HLISTE - OSTATNI ELEMENT LISTY SYGNALOW (W KAZDYM MODULE ) +C +C +C + COMMON / MASKS / MTP,MSPR,MOTHERS,MPAR,MASKTP,NOTTP, + * MPROCES, MCOR, MERPF, MBLOCK, MHAND,MNOTVIR +C +C ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** +C MASKI I WZORCE: +C MTP - MASKA DO WYCINANIA INFORMACJI DOTYCZACYCH TYPOW ZE SLOWA ZEROWEGO +C MOTHERS - -- -- -- -- -- INNYCH PROTOTYPOW +C MPAR - -- -- -- -- -- -- ZMIENNYCH I PARAMETROW +C MSPR - MASKA DLA SYSPREF ( DLA PROTOTYPOW SYNTAKTYCZNYCH ) +C MASKTP - ZAPRZECZENIE MASKI MTP +C NOTTP - WZORZEC DLA NIE-TYPU ( 1 ) +C MPROCES - WZORZEC DLA PROCESU ( 5 ) +C MCOR - WZORZEC DLA COROUTINY (7) +C MERPF - MASKA DO ROZPOZNAWANIA BLEDNYCH LIST PARAMETROW +C MBLOCK - WZORZEC DLA BLOKU ( 0 PRZY PRZECIECIU Z MOTHERS ) +C MNOTVIR - WZORZEC DO KASOWANIA BITU "VIRTUAL" +C +C + COMMON /COPSIG/ BEGADR, IDHAND +C +C BLOK SLUZACY DO KOMUNIKACJI Z PROCEDURA KOPIUJACA POSZCZEGOLNE PROTOTYPY +C IDHAND - IDENTYFIKATOR HANDLERA +C BEGADR - PIERWSZY ELEMENT SLOWNIKA ZAMIANY STARYCH ADRESOW NA NOWE +C KAZDY ELEMENT SLOWNIKA ZAJMUJE 2 SLOWA: STARY ADRES, NOWY ADRES. +C OSTATNI ELEMENT SLOWNIKA - LPML-2 +C +C +C.....BLOK KOMUNIKACJI ZE STRUMIENIAMI + LOGICAL ERRFLG + COMMON /STREAM/ ERRFLG, LINE, IBUF2(265), IBUF3(7),JUNK(260) +C +C +C + IDHAND = IPMEM(IDSMEM+1) + LINE = IPMEM(IDSMEM+9) +C +C PRZEJSCIE PO LISCIE NAZW SYGNALOW +C ODNALEZIENIE SYGNALOW, SPRAWDZENIE ICH POPRAWNOSCI, UTWORZENIE LISTY +C HANDLEROW +C LS - KOLEJNY ELEMENT LISTY +C POR - ELEMENT LISTY Z KTORYM BEDZIEMY POROWNYWAC +C NAGLOWKI KOLEJNYCH SYGNALOW + LS = IPMEM(IDSMEM+10) + I = 0 + IF(LS.EQ.0) GO TO 810 +C TO NIE JEST HANDLER OTHERS + POR = LS + 50 NM = IPMEM(LS) +C . . . + I = MEMSL(NM, INDPR) + IF (I.EQ.0) GO TO 100 + IF ( BTEST(IPMEM(I+1),2)) GO TO 150 + IF ( .NOT. BTEST(IPMEM(I+1),1) .OR. OWN ) GO TO 300 +C NAZWA JEST HIDDEN + CALL MERR(351,NM) + GO TO 200 +C NAZWA JEST NOT TAKEN + 150 CALL MERR (352, NM) + GO TO 200 +C NAZWA NIEZADEKLAROWANA + 100 CALL MERR (350, NM) +C JESLI TO JEST ELEMENT, Z KTORYM MAMY POROWNYWAC, TO GO PRZESUWAMY + 200 IF(POR.EQ.LS) POR = IPMEM(LS+1) + GO TO 1000 +C +C NAZWA JEST ZADEKLAROWANA +C SPRAWDZAMY, CZY TO JEST NAZWA SYGNALU + 300 IDSIG = IPMEM(I+2) + J = IPMEM(IDSIG) + J = ISHFT(IAND(J,MPAR),-4) + IF(J.NE.11) GO TO 250 +C TO JEST PROTOTYP SYGNALU +C JESLI TO JEST PIERWSZY, TO PRZECHODZIMY DO NASTEPNEGO + IF(LS.EQ.IPMEM(IDSMEM+10)) GO TO 800 + IF(LS.EQ.POR) GO TO 800 +C SPRAWDZAMY ZGODNOSC PARAMETROW + IF(IAND(IPMEM(IDSIG),MERPF).NE.0) GO TO 400 +C JESLI LS MA DOBRA LISTE PARAMETROW, A POR ZLA - TO ZMIENIAMY POR + J = IPMEM(POR) + IF(IAND(IPMEM(J),MERPF).EQ.0) GO TO 400 + POR = LS + GO TO 800 +C TO NIE JEST PROTOTYP SYGNALU + 250 CALL MERR ( 353,NM ) + GO TO 200 +C +C SPRAWDZAMY ZGODNOSC LISTY PARAMETROW + 400 CALL SPRPAR ( IDSIG, IPMEM(POR), NM) +C DOLACZAMY DO LISTY HANDLEROW + 800 I = IPMEM(IDSIG+1) +C SPRAWDZAMY, CZY HANDLER SI NIE POWTARZA + 810 IF(HLISTE.EQ.0) GO TO 830 + J=IPMEM(INDPR+20) + 820 IF(IPMEM(J).NE.I) GO TO 840 + CALL MERR(362,NM) + GO TO 950 + 840 J=IPMEM(J+2) + IF(J.NE.0) GO TO 820 + 830 J = MGETM(3,341) + IPMEM(J) = I + IPMEM(J+1) = IDHAND +C . . . + IF(HLISTE.EQ.0) GO TO 850 + IPMEM(HLISTE+2)=J + GO TO 900 + 850 IPMEM(INDPR+20) = J + 900 HLISTE = J + IPMEM(INDPR+19) = IPMEM(INDPR+19) + 1 +C JESLI HANDLER OTHERS, TO KONIEC + IF(I.EQ.0) RETURN +C ZAPAMIETUJEMY IDENTYFIKATOR PROTOTYPU W POLU NAZWY + 950 IPMEM(LS) = IDSIG + 1000 LS = IPMEM(LS+1) + IF(LS.NE.0) GO TO 50 +C +C KOPIOWANIE ATRYBUTOW +C POR - Z TEGO SIE KOPIUJE DO HANDLERA +C POR = 0 - NIE BYLO ANI JEDNEGO POPRAWNEGO SYGNALU + IF(POR.EQ.0) RETURN + BEGADR = LPML + IDSIG = IPMEM(POR) +C WSTAWIENIE DO HANDLERA DOWIAZANIA DO SYGNALU + IPMEM(IDHAND+3) = IDSIG +C +C KOPIOWANIE LISTY ATRYBUTOW RAZEM Z KOPIOWANIEM PROTOTYPOW + I = IPMEM(IDSIG+6) + J = IDHAND+5 +C I - KOLEJNY ELEMENT LISTY ATRYBUTOW PROTOTYPU IDSIG +C J - OSTATNIO SKOPIOWANY ELEMENT LISTY PROTOTYPU IDHAND + IF(I.EQ.0) RETURN + 1100 IPMEM(J+1) = MGETM(2,341) + J = IPMEM(J+1) + IPMEM(J) = ICPROT(IPMEM(I)) + I = IPMEM(I+1) + IF(I.NE.0) GO TO 1100 +C USTAWIENIE OSTATNIEGO ATRYBUTU PROTOTYPU IDHAND + IPMEM(IDHAND+7) = J +C +C KOPIOWANIE TABLICY HASH'U + LPML = LPML-2 +C LPML - OSTATNI ELEMENT SLOWNIKA ZAMIANY ADRESOW + IHSIG = IDSIG+9 + IHHAND = IDHAND+9 +C + DO 1500 I=1,8 +C I - KOLEJNY ELEMENT TABLICY HASH'U PROTOTYPU IDSIG + J = IHSIG+I + J = IPMEM(J) +C J - KOLEJNY ELEMENT LISTY HASH'U PROTOTYPU IDSIG + IF(J.EQ.0) GO TO 1500 + K = IHHAND+I-3 +C K - OSTATNIO SKOPIOWANY ELEMENT LISTY HASH'U PROTOTYPU IDHAND + 1200 IPMEM(K+3) = MGETM(4,341) + K = IPMEM(K+3) + IPMEM(K) = IPMEM(J) + IPMEM(K+1) = IPMEM(J+1) +C SZUKANIE ODPOWIEDNIEGO ADRESU + II = IPMEM(J+2) + DO 1300 IJ = BEGADR, LPML, 2 + IF(IPMEM(IJ).EQ.II) GO TO 1400 + 1300 CONTINUE + 1400 IPMEM(K+2) = IPMEM(IJ+1) + J = IPMEM(J+3) + IF(J.NE.0) GO TO 1200 + 1500 CONTINUE +C +C KONIEC KOPIOWANIA - ZWALNIAMY PAMIEC PRZEZNACZONA NA SLOWNIK + LPML = BEGADR + RETURN + END + SUBROUTINE SPRPAR ( EL, ELPOR, NM ) +C +C * * * * * * * * * ** * * * * ** * * * * * * * * * * * * * * * * * * * * +C POROWNUJE LISTY PARAMETROW SYGNALU O IDENTYFIKATORZE EL I SYGNALU +C O ODENTYFIKATORZE ELPOR +C ELPOR - WZORCOWY SYGNAL DO POOWNYWANIA +C NM - NAZWA SYGNALU EL +C * * * * * * * * * * * * **** * * * * * ** * * * ** * * * * * * ** *** +C + IMPLICIT INTEGER ( A - Z ) +C +C +C..... + LOGICAL INSYS, OWN + COMMON /BLANK/ COM(278), + X LMEM , LPMEM , IRECN , ISFIN , LPMSYS, LPML , LPMF , + X NRINT , NRRE , NRBOOL, NRCHR , NRCOR , NRPROC, NRTEXT, + X NRUNIV, NATTR , NRNONE, NBLSYS, NBLUS , NEMPTY, INSYS , + X LOCAL , OWN , OBJECT, + X IPMEM(5000) +C +C COM - OBSZAR KOMUNIKACYJNY STRUMIENI +C LMEM - (=5000) ROZMIAR CALEJ PAMIECI GLOWNEJ +C LPMEM - PODZIAL PAMIECI NA CZESCI IPMEM I ISMEM +C IRECN - INDEKS SZCZYTU STOSU STALYCH REAL +C ISFIN - INDEKS SZCZYTU SLOWNIKA PROTOTYPOW +C +C LPMSYS - INDEKS PIERWSZEGO SLOWA W IPMEM OBSZARU NIEPRZEZ- +C NACZONEGO NA PROTOTYPY SYSTEMOWE +C LPML - INDEKS PIERWSZEGO SLOWA OBSZARU WOLNEGO W IPMEM +C LPMF - INDEKS OSTATNIEGO SLOWA WOLNEGO OBSZARU W IPMEM +C +C + COMMON / MASKS / MTP,MSPR,MOTHERS,MPAR,MASKTP,NOTTP, + * MPROCES, MCOR, MERPF, MBLOCK, MHAND,MNOTVIR +C +C ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** +C MASKI I WZORCE: +C MTP - MASKA DO WYCINANIA INFORMACJI DOTYCZACYCH TYPOW ZE SLOWA ZEROWEGO +C MOTHERS - -- -- -- -- -- INNYCH PROTOTYPOW +C MPAR - -- -- -- -- -- -- ZMIENNYCH I PARAMETROW +C MSPR - MASKA DLA SYSPREF ( DLA PROTOTYPOW SYNTAKTYCZNYCH ) +C MASKTP - ZAPRZECZENIE MASKI MTP +C NOTTP - WZORZEC DLA NIE-TYPU ( 1 ) +C MPROCES - WZORZEC DLA PROCESU ( 5 ) +C MCOR - WZORZEC DLA COROUTINY (7) +C MERPF - MASKA DO ROZPOZNAWANIA BLEDNYCH LIST PARAMETROW +C MBLOCK - WZORZEC DLA BLOKU ( 0 PRZY PRZECIECIU Z MOTHERS ) +C MNOTVIR - WZORZEC DO KASOWANIA BITU "VIRTUAL" +C +C +C +C LISTE - LISTA PARAMETROW ( SYNTAKTYCZNA! ) SYGNALU EL +C LPOR - LISTA PARAMETROW SYGNALU ELPOR +C LISTY SA PRZECHOWANE W SLOWIE +8 PROTOTYPU SYGNALU +C + LISTE = IPMEM(EL+8) + LPOR = IPMEM(ELPOR+8) + 50 IF ( LISTE + LPOR .EQ.0 ) RETURN + IF ( LISTE*LPOR.EQ.0) GO TO 900 +C POROWNYWANIE + KIND = IPMEM(LPOR) + KD = IPMEM(LISTE) + NMP = IPMEM(LISTE+2) +C NMP - NAZWA PARAMETRU LISTE +C KONTROLA RODZAJOW + IF(KD.EQ.KIND) GO TO 70 +C MOZE SA NIEZGODNE RODZAJE + IF ( KIND.GE.7 .OR. KD.GE.7 ) GO TO 100 +C SPRAWDZAMY, CZY RODZAJE SA ZGODNE Z DOKLADNOSCIA DO BLEDNYCH LIST PF + IF(IABS(KIND-KD).NE.2) GO TO 100 +C KONTROLA NAZW + 70 IF ( NMP.NE.IPMEM(LPOR+2) ) GO TO 200 + IF (KIND.LE.6) GO TO 300 + IF (KIND.EQ.7) GO TO 400 +C ZMIENNE - POROWNUJEMY TYPY + IF(IPMEM(LISTE+4).NE.IPMEM(LPOR+4)) GO TO 250 + IF(IPMEM(LISTE+5).NE.IPMEM(LPOR+5)) GO TO 250 +C NIE MA BLEDU - NASTEPNY ELEMENT LISTY + 400 LISTE = IPMEM(LISTE+3) + LPOR = IPMEM(LPOR+3) + GO TO 50 +C +C NIEZGODNE RODZAJE + 100 CALL MERR (355,NMP) + GO TO 400 +C ROZNE NAZWY + 200 CALL MERR (356,NMP) + GO TO 400 +C ROZNE TYPY + 250 CALL MERR(354,NMP) + GO TO 400 +C +C PROCEDURY/FUNKCJE +C SPRAWDZAMY PARAMETRY II-GO RZEDU + 300 I = IPMEM(LISTE+4) + K = IPMEM(LPOR+4) +C I - ELEMENTY LISTY II-GO RZEDU PARAMETRU LISTE +C K - ELEMENTY LISTY II-GO RZEDU PARAMETRU LPOR + 350 IF ( I+K.EQ.0) GO TO 800 + IF ( I*K.EQ.0 ) GO TO 700 +C KONTROLA + IF ( IPMEM(I).NE.IPMEM(K) ) GO TO 500 +C NIE KONTROLUJE SIE NAZW + IF ( IPMEM(I).LE.7 ) GO TO 600 +C KONTROLA TYPOW + IF ( IPMEM(I+4).NE.IPMEM(K+4) ) GO TO 550 + IF ( IPMEM(I+5).NE.IPMEM(K+5) ) GO TO 550 +C NIE MA BLEDOW + 600 I = IPMEM(I+3) + K = IPMEM(K+3) + GO TO 350 +C NIEZGODNE RODZAJE + 500 CALL MERR ( 357,IPMEM(I+2) ) + GO TO 600 +C ROZNE TYPY + 550 CALL MERR ( 358, IPMEM(I+2) ) + GO TO 600 +C ROZNE DLUGOSCI LIST PARAMETROW II-GO RZEDU +C JESLI KROTSZA LISTA JEST BLEDNA, TO NIE MA SYGNALIZACJI + 700 IF ( I.EQ.0 ) GO TO 750 +C K - KROTSZA + KD = IPMEM(LPOR) + 710 IF ( KD.EQ.5.OR.KD.EQ.6) GO TO 800 + CALL MERR(359,NMP) + GO TO 800 + 750 KD = IPMEM(LISTE) + GO TO 710 +C +C KONIE LIST II-GO RZEDU +C KONTROLA TYPOW - JESLI FUNKCJE + 800 IF ( KIND.EQ.3 .OR. KIND.EQ.5 ) GO TO 400 + IF(IPMEM(LISTE+5).NE.IPMEM(LPOR+5)) GO TO 250 + IF(IPMEM(LISTE+6).NE.IPMEM(LPOR+6)) GO TO 250 + GO TO 400 +C +C NIEZGODNE DLUGOSCI LIST PARAMETROW I-GO RZEDU +C JESLI LISTA KROTSZA JEST BLEDNA, TO NIE MA SYGNALIZACJI + 900 IF ( LISTE.EQ.0 ) GO TO 950 + IF(IAND(IPMEM(ELPOR),MERPF).EQ.0) CALL MERR(360,NM) + RETURN + 950 IF(IAND(IPMEM(EL),MERPF).EQ.0) CALL MERR(360,NM) + RETURN + END + INTEGER FUNCTION ICPROT ( IDPR ) +C +C ** * * * * * * * ** *** ** * * * * * * * * * * ** * * * * * * * +C KOPIUJE PROTOTYP IDPR ( PROTOTYP PARAMETRU FORMALNEGO). +C UAKTUALNIA SLOWNIK ZAMIANY ADRESOW PROTOTYPOW. +C WYNIKIEM FUNKCJI JEST IDENTYFIKATOR UTWORZONEGO PROTOTYPU. +C * * * * * * * * * ** * * * * * * * * * ** * * * * * * * * * * * +C + IMPLICIT INTEGER ( A - Z ) +C +C +C ..... ZMIENNE GLOBALNE +C +C..... + LOGICAL INSYS, OWN + COMMON /BLANK/ COM(278), + X LMEM , LPMEM , IRECN , ISFIN , LPMSYS, LPML , LPMF , + X NRINT , NRRE , NRBOOL, NRCHR , NRCOR , NRPROC, NRTEXT, + X NRUNIV, NATTR , NRNONE, NBLSYS, NBLUS , NEMPTY, INSYS , + X LOCAL , OWN , OBJECT, + X IPMEM(5000) +C +C COM - OBSZAR KOMUNIKACYJNY STRUMIENI +C LMEM - (=5000) ROZMIAR CALEJ PAMIECI GLOWNEJ +C LPMEM - PODZIAL PAMIECI NA CZESCI IPMEM I ISMEM +C IRECN - INDEKS SZCZYTU STOSU STALYCH REAL +C ISFIN - INDEKS SZCZYTU SLOWNIKA PROTOTYPOW +C +C LPMSYS - INDEKS PIERWSZEGO SLOWA W IPMEM OBSZARU NIEPRZEZ- +C NACZONEGO NA PROTOTYPY SYSTEMOWE +C LPML - INDEKS PIERWSZEGO SLOWA OBSZARU WOLNEGO W IPMEM +C LPMF - INDEKS OSTATNIEGO SLOWA WOLNEGO OBSZARU W IPMEM +C +C +C + COMMON / DGLOB/ INDICT,INDSPR,INDPR,IHBEG,LASTPR,INDPREF +C +C ** ** ** ** *** ** ** ** ** ** ** ** ** ** ** ** ** +C BLOK ZAWIERA DANE O PRZETWARZANYM PROTOTYPIE +C INDICT - INDEKS PRZETWARZANEGO PROTTYPU W ISDICT +C INDSPR - IDENTYFIKATOR PROTOTYPU W ISMEM +C INDPR - IDENTYFIKATOR PROTOTYPU W IPMEM +C IHBEG - ADRES PIERWSZEGO SLOWA TABLICY HASHU +C IDPREF - IDENTYFIKATOR BEZPOSREDNIEGO PREFIKSU PRZETWARZANEGO +C PROTOTYPU +C LASTPR - IDENTYFIKATOR POPRZEDNIO PRZETWARZANEGO PROTOTYPU +C +C +C + COMMON / MASKS / MTP,MSPR,MOTHERS,MPAR,MASKTP,NOTTP, + * MPROCES, MCOR, MERPF, MBLOCK,MHAND,MNOTVIR +C +C ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** +C MASKI I WZORCE: +C MTP - MASKA DO WYCINANIA INFORMACJI DOTYCZACYCH TYPOW ZE SLOWA ZEROWEGO +C MOTHERS - -- -- -- -- -- INNYCH PROTOTYPOW +C MPAR - -- -- -- -- -- -- ZMIENNYCH I PARAMETROW +C MSPR - MASKA DLA SYSPREF ( DLA PROTOTYPOW SYNTAKTYCZNYCH ) +C MASKTP - ZAPRZECZENIE MASKI MTP +C NOTTP - WZORZEC DLA NIE-TYPU ( 1 ) +C MPROCES - WZORZEC DLA PROCESU ( 5 ) +C MCOR - WZORZEC DLA COROUTINY (7) +C MERPF - MASKA DO ROZPOZNAWANIA BLEDNYCH LIST PARAMETROW +C MBLOCK - WZORZEC DLA BLOKU ( 0 PRZY PRZECIECIU Z MOTHERS ) +C +C +C + COMMON /COPSIG/ BEGADR, IDHAND +C +C BLOK SLUZACY DO KOMUNIKACJI Z PROCEDURA KOPIUJACA POSZCZEGOLNE PROTOTYPY +C IDHAND - IDENTYFIKATOR HANDLERA +C BEGADR - PIERWSZY ELEMENT SLOWNIKA ZAMIANY STARYCH ADRESOW NA NOWE +C KAZDY ELEMENT SLOWNIKA ZAJMUJE 2 SLOWA: STARY ADRES, NOWY ADRES. +C OSTATNI ELEMENT SLOWNIKA - LPML-2 +C +C +C + KIND = ISHFT ( IAND(IPMEM(IDPR),MPAR),-4) + IF(KIND.GT.3) GO TO 400 + GO TO (100,200,300), KIND +C +C TYP FORMALNY + 100 ICPROT = MGETM(5,341) + 2 +C DOLACZENIE DO LISTY NEXTDECL + IPMEM(LASTPR+2) = ICPROT + LASTPR = ICPROT + GO TO 1000 +C +C FUNKCJA FORMALNA + 200 ICPROT = MGETM(10,341) + 5 + GO TO 500 +C +C PROCEDURA FORMALNA + 300 ICPROT = MGETM(7,341) + 2 +C +C KOPIOWAIE LISTY PARAMETROW II-GO RZEDU + 500 J = IPMEM(IDPR+4) + IPMEM(ICPROT+3) = MGETM(J,341) + IPMEM(ICPROT+4) = J + IF(J.EQ.0) GO TO 1000 +C + DO 700 K=1,J + II = IPMEM(IDPR+3) +K-1 + II = IPMEM(II) +C II - IDENTYFIKATOR STAREGO PARAMETRU +C I - ROZMIAR PROTOTYPU + I = 6 + IJ=4 + KD=ISHFT(IAND(IPMEM(II),MPAR),-4) + IF(KD.GT.4) GO TO 520 + IF(KD.EQ.2) GO TO 510 +C PROCEDURA LUB TYP + I=5 + IJ=2 + GO TO 520 + 510 I=7 +C IJ - IDENTYFIKATOR NOWEGO PROTOTYPU + 520 IJ = MGETM(I,341) + IJ + IPMEM(IJ) = IPMEM(II) + IPMEM(IJ-1) = ICPROT + IPMEM(IJ-2) = IPMEM(II-2) + IPMEM(IJ+1) = IPMEM(II+1) + IF(KD.LT.5) GO TO 650 +C DLA ZMIENNEJ - WPISANIE TYPU + 550 I = IPMEM(II-3) + IPMEM(IJ-4) = IPMEM(II-4) + IPMEM(IJ-3) = I +C SPRAWDZENIE, CZY JEST TO FORMALNY TYP LOKALNY + I2 = LPML-2 + IF(I2.LT.BEGADR) GO TO 690 + DO 600 I1 = BEGADR,I2,2 + IF(IPMEM(I1).EQ.I) GO TO 610 + 600 CONTINUE +C NIE MA TYPU + GO TO 690 + 610 IPMEM(IJ-3) = IPMEM(I1+1) + GO TO 690 +C DOLOZENIE ADRESU DO SLOWNIKA ( DLA ZMIENNEJ NIE WARTO ) + 650 INSYS = .TRUE. + I1 = MGETM(2,341) + IPMEM(I1) = II + IPMEM(I1+1) = IJ + INSYS = .FALSE. +C WSTAWIENIE ADRESU PROTOTYPU DO LISTY PARAMETROW + 690 I1 = IPMEM(ICPROT+3) +K-1 + IPMEM(I1) = IJ + 700 CONTINUE +C + IF(KIND.EQ.3) GO TO 1000 +C FUNKCJA - USTAWIENIE IDENTYFIKATORA RESULT + IPMEM(ICPROT-5) = IJ + GO TO 800 +C +C ZMIENNE + 400 ICPROT = MGETM(6,341) + 4 +C KOPIOWANIE TYPU ZMIENNEJ LUB FUNKCJI + 800 IPMEM(ICPROT-4) = IPMEM(IDPR-4) + I = IPMEM(IDPR-3) + IPMEM(ICPROT-3) = I +C SPRAWDZAMY, CZY TO JET TYP FORMALNY LOKALNY + K = LPML-2 + IF(K.LT.BEGADR) GO TO 1000 +C JEST NIEPUSTY SLOWNIK ZAMIANY ADRESOW + DO 820 J=BEGADR, K,2 + IF(IPMEM(J).EQ.I) GO TO 850 + 820 CONTINUE +C NIE MA TAKIEGO TYPU + GO TO 870 + 850 IPMEM(ICPROT-3) = IPMEM(J+1) +C JESLI ZMIENNA TO NIE WSTAWIAMY DO NEXTDECL + 870 IF(KIND.GE.5) GO TO 1000 +C DLA FUNKCJI - WSTAWIENIE TYPU DO ATRYBUTU RESULT + K = IPMEM(ICPROT-5) + IPMEM(K-4) = IPMEM(ICPROT-4) + IPMEM(K-3) = IPMEM(ICPROT-3) +C +C UZUPELNIENIE SLOWA ZEROWEGO, ADRESU ATRUBUTU I USED + 1000 IPMEM(ICPROT-2) = IPMEM(IDPR-2) + IPMEM(ICPROT-1) = IDHAND + IPMEM(ICPROT) = IPMEM(IDPR) + IPMEM(ICPROT+1) = IPMEM(IDPR+1) +C +C UZUPELNIENIE SLOWNIKA ZAMIANY ADRESOW + INSYS = .TRUE. + K = MGETM(2,341) + IPMEM(K) = IDPR + IPMEM(K+1) = ICPROT + INSYS = .FALSE. +C + RETURN + END + diff --git a/sources/pass1/f2c.h b/sources/pass1/f2c.h new file mode 100644 index 0000000..23b2df7 --- /dev/null +++ b/sources/pass1/f2c.h @@ -0,0 +1,209 @@ +/* f2c.h -- Standard Fortran to C header file */ + +/** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." + + - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ + +#ifndef F2C_INCLUDE +#define F2C_INCLUDE + +typedef long int integer; +typedef char *address; +typedef short int shortint; +typedef float real; +typedef double doublereal; +typedef struct { real r, i; } complex; +typedef struct { doublereal r, i; } doublecomplex; +typedef long int logical; +typedef short int shortlogical; + +#define TRUE_ (1) +#define FALSE_ (0) + +/* Extern is for use with -E */ +#ifndef Extern +#define Extern extern +#endif + +/* I/O stuff */ + +#ifdef f2c_i2 +/* for -i2 */ +typedef short flag; +typedef short ftnlen; +typedef short ftnint; +#else +typedef long flag; +typedef long ftnlen; +typedef long ftnint; +#endif + +/*external read, write*/ +typedef struct +{ flag cierr; + ftnint ciunit; + flag ciend; + char *cifmt; + ftnint cirec; +} cilist; + +/*internal read, write*/ +typedef struct +{ flag icierr; + char *iciunit; + flag iciend; + char *icifmt; + ftnint icirlen; + ftnint icirnum; +} icilist; + +/*open*/ +typedef struct +{ flag oerr; + ftnint ounit; + char *ofnm; + ftnlen ofnmlen; + char *osta; + char *oacc; + char *ofm; + ftnint orl; + char *oblnk; +} olist; + +/*close*/ +typedef struct +{ flag cerr; + ftnint cunit; + char *csta; +} cllist; + +/*rewind, backspace, endfile*/ +typedef struct +{ flag aerr; + ftnint aunit; +} alist; + +/* inquire */ +typedef struct +{ flag inerr; + ftnint inunit; + char *infile; + ftnlen infilen; + ftnint *inex; /*parameters in standard's order*/ + ftnint *inopen; + ftnint *innum; + ftnint *innamed; + char *inname; + ftnlen innamlen; + char *inacc; + ftnlen inacclen; + char *inseq; + ftnlen inseqlen; + char *indir; + ftnlen indirlen; + char *infmt; + ftnlen infmtlen; + char *inform; + ftnint informlen; + char *inunf; + ftnlen inunflen; + ftnint *inrecl; + ftnint *innrec; + char *inblank; + ftnlen inblanklen; +} inlist; + +#define VOID void + +union Multitype { /* for multiple entry points */ + shortint h; + integer i; + real r; + doublereal d; + complex c; + doublecomplex z; + }; + +typedef union Multitype Multitype; + +typedef long Long; + +struct Vardesc { /* for Namelist */ + char *name; + char *addr; + Long *dims; + int type; + }; +typedef struct Vardesc Vardesc; + +struct Namelist { + char *name; + Vardesc **vars; + int nvars; + }; +typedef struct Namelist Namelist; + +#define abs(x) ((x) >= 0 ? (x) : -(x)) +#define dabs(x) (doublereal)abs(x) +#define min(a,b) ((a) <= (b) ? (a) : (b)) +#define max(a,b) ((a) >= (b) ? (a) : (b)) +#define dmin(a,b) (doublereal)min(a,b) +#define dmax(a,b) (doublereal)max(a,b) + +/* procedure parameter types for -A and -C++ */ + +#define F2C_proc_par_types 1 +#ifdef __cplusplus +typedef int /* Unknown procedure type */ (*U_fp)(...); +typedef shortint (*J_fp)(...); +typedef integer (*I_fp)(...); +typedef real (*R_fp)(...); +typedef doublereal (*D_fp)(...), (*E_fp)(...); +typedef /* Complex */ VOID (*C_fp)(...); +typedef /* Double Complex */ VOID (*Z_fp)(...); +typedef logical (*L_fp)(...); +typedef shortlogical (*K_fp)(...); +typedef /* Character */ VOID (*H_fp)(...); +typedef /* Subroutine */ int (*S_fp)(...); +#else +typedef int /* Unknown procedure type */ (*U_fp)(); +typedef shortint (*J_fp)(); +typedef integer (*I_fp)(); +typedef real (*R_fp)(); +typedef doublereal (*D_fp)(), (*E_fp)(); +typedef /* Complex */ VOID (*C_fp)(); +typedef /* Double Complex */ VOID (*Z_fp)(); +typedef logical (*L_fp)(); +typedef shortlogical (*K_fp)(); +typedef /* Character */ VOID (*H_fp)(); +typedef /* Subroutine */ int (*S_fp)(); +#endif +/* E_fp is for real functions when -R is not specified */ +typedef VOID C_f; /* complex function */ +typedef VOID H_f; /* character function */ +typedef VOID Z_f; /* double complex function */ +typedef doublereal E_f; /* real function with -R not specified */ + +/* undef any lower-case symbols that your C compiler predefines, e.g.: */ + +#ifndef Skip_f2c_Undefs +#undef cray +#undef gcos +#undef mc68010 +#undef mc68020 +#undef mips +#undef pdp11 +#undef sgi +#undef sparc +#undef sun +#undef sun2 +#undef sun3 +#undef sun4 +#undef u370 +#undef u3b +#undef u3b2 +#undef u3b5 +#undef unix +#undef vax +#endif +#endif diff --git a/sources/pass1/hash.f b/sources/pass1/hash.f new file mode 100644 index 0000000..3509414 --- /dev/null +++ b/sources/pass1/hash.f @@ -0,0 +1,1663 @@ +C Loglan82 Compiler&Interpreter +C Copyright (C) 1981-1993 Institute of Informatics, University of Warsaw +C Copyright (C) 1993, 1994 LITA, Pau +C +C This program is free software; you can redistribute it and/or modify +C it under the terms of the GNU General Public License as published by +C the Free Software Foundation; either version 2 of the License, or +C (at your option) any later version. +C +C This program is distributed in the hope that it will be useful, +C but WITHOUT ANY WARRANTY; without even the implied warranty of +C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +C GNU General Public License for more details. File: LICENSE.GNU +C =============================================================== + + SUBROUTINE DATA2 + IMPLICIT INTEGER (A-Z) +C +C INITIATES VARIABLES IN THE BLANK COMMON +C + COMMON /BLANK/ + $ C0M(4), + O S, ADRES, K, SCOMA, SDOT, SEMICOL, + 1 SCOLON, SLEFT, SRIGHT, SBECOME, STAR, SRELAT, + 2 SEOF, SIDENT, SCONST, SAND, SARRAY, SARROF, + 3 SATTACH, SBEGIN, SBLOCK, SBOOL, SCALL, SCASE, + 4 SCLASS, SCLOSE, SCONS, SCOPY, SCOROUT, SDETACH, + 5 SDIM, SDO, SDOWN, SELSE, SEND, SESAC, + 6 SEXIT, SEXTERN, SFI, SFOR, SFUNCT, SIF, + 7 SINNER, SINPUT, SINT, SKILL, SLOCK, SNEW, + 8 SNONE, SNOT, SOD, SOR, SORIF, SOTHER, + 9 SOUTPUT, SPREF, SPRCD, SQUA, SREAD, SRESUME, + O SRETURN, STEP, STOP, STAKEN, STHEN, STHIS, + A STO, STYPE, SUNIT, SVAR, SVIRTUAL, SWAIT, + B SWHEN, SWHILE, SWRIT, SWRITLN, STRUE, SALL, + C WAND, WARRAY, WASSIGN, WASSCON, WATTACH, WBLOCK, + D WCALL, WCASE, WCASEL, WCOMA, WCNSTB, WCNSTC, + E WCNSTI, WCNSTN, WCNSTR, WCNST, WCOPY, WDETACH, + F WDOT, WDOWNTO, WEOF, WESAC, WFIN, WFIRST, + G WFOREND, WFORVAR, WFROM, WIDENT, WIFFALS, WIFTRUE + + common /BLANK/ + H WINNER, WINSTREND,WJUMP, WKILL, WLABEL, WLEFT, + I WLOCK, WLOW, WLSE, WNEW, WNEWARRAY,WNOT, + J WOPERAT, WOPT, WOR, WOTHER, WPREF, WPRIM, + K WQUA, WREAD, WRELAT, WRESUME, WRETURN, WRIGHT, + L WSTART, WSTEP, WSTOP, WTHIS, WTO, WAIT, + M WRITE, WRITELN, WBOUND, UNICAL, + N COM(132), + O LMEM, LPMEM, IRECN, ISFIN, LPMSYS, LPML, + P LPMF, NRINT, NRRE, NRBOOL, NRCHAR, NRCOR, + Q NRPROC, NRTEXT, NRUNIV, NATTR, NRNONE, NBLSYS, + R NBLUS, NEMPTY, INSYS, LOCAL, OWN, OBJECT, + S HASH(8000), M, NAME(10), NLAST, NL, + T KEYS(200), + U TRANS1(13,13), TRANS2(13,13), B0, B(70), + V SKOK0, SKOK(70), KK, MM, STAN, STAN1, + W AUX, K1, SY, SY1, NU, JK1, EXP, + X SIGN, INTPART, FRAC, OKEY, FRACT,JK2,NB, + Y TL, BYTE, TEXT(20), + Z TOP, IN, NEXT, STACK(500) + + common /BLANK/ + * RESZTA(3652) + +C RESZTA = REMAINDER + REAL FRACT,NU + + DO 10 I=1,8000 + HASH(I)=0 +10 CONTINUE +cdsw &bc +c +c hash table contains following unused tokens: +c +c ACCEPT 2053 +c ENABLE 2047 +c DISABLE 2041 +c QUIT 2033 +c +cdsw db01op 7725 + + HASH ( 59 ) = 1038 + HASH ( 60 ) = -2343 + HASH ( 79 ) = 1048 + HASH ( 81 ) = 2058 + HASH ( 82 ) = -2691 + HASH ( 85 ) = 1051 + HASH ( 86 ) = -2271 + HASH ( 95 ) = 2065 + HASH ( 96 ) = -2689 + HASH ( 97 ) = 2066 + HASH ( 98 ) = -2639 + HASH ( 115 ) = 2075 + HASH ( 116 ) = -2681 + HASH ( 179 ) = 1098 + HASH ( 180 ) = -2669 + HASH ( 189 ) = 1103 + HASH ( 190 ) = -2285 + HASH ( 195 ) = 1106 + HASH ( 196 ) = -2865 + HASH ( 209 ) = 1113 + HASH ( 210 ) = -2289 + HASH ( 237 ) = 2136 + HASH ( 238 ) = -2485 + HASH ( 307 ) = 1162 + HASH ( 308 ) = -2607 + HASH ( 317 ) = 1167 + HASH ( 323 ) = 1170 + HASH ( 324 ) = -7999 + HASH ( 331 ) = 1174 + HASH ( 332 ) = -2523 + HASH ( 333 ) = 1175 + HASH ( 334 ) = 2861 + HASH ( 335 ) = 1176 + HASH ( 336 ) = -2609 + HASH ( 343 ) = 1180 + HASH ( 344 ) = 2605 + HASH ( 579 ) = 1298 + HASH ( 580 ) = -2835 + HASH ( 691 ) = 1354 + HASH ( 692 ) = -2637 + HASH ( 717 ) = 1367 + HASH ( 719 ) = 1368 + HASH ( 720 ) = -2833 + HASH ( 819 ) = 1418 + HASH ( 820 ) = -2831 + HASH ( 827 ) = 1422 + HASH ( 828 ) = -2327 + HASH ( 835 ) = 1426 + HASH ( 836 ) = -2395 + HASH ( 847 ) = 1432 + HASH ( 848 ) = -2829 + HASH ( 955 ) = 1486 + HASH ( 956 ) = -2827 + HASH ( 975 ) = 1496 + HASH ( 976 ) = -2825 + HASH ( 987 ) = 1502 + HASH ( 988 ) = -1989 + HASH ( 1081 ) = 1549 + HASH ( 1105 ) = 1561 + HASH ( 1106 ) = -2363 + HASH ( 1109 ) = 1563 + HASH ( 1110 ) = 2819 + HASH ( 1113 ) = 1565 + HASH ( 1114 ) = -2815 + HASH ( 1115 ) = 1566 + HASH ( 1116 ) = -2807 + HASH ( 1203 ) = 1610 + HASH ( 1204 ) = -2493 + HASH ( 1231 ) = 1624 + HASH ( 1232 ) = -2241 + HASH ( 1237 ) = 1627 + HASH ( 1238 ) = -2797 + HASH ( 1243 ) = 1630 + HASH ( 1244 ) = -2341 + HASH ( 1303 ) = 651 + HASH ( 1304 ) = -2615 + HASH ( 1305 ) = 652 + HASH ( 1306 ) = -2305 + HASH ( 1325 ) = 662 + HASH ( 1326 ) = -2381 + HASH ( 1327 ) = 663 + HASH ( 1328 ) = -2999 + HASH ( 1335 ) = 667 + HASH ( 1336 ) = -2997 + HASH ( 1337 ) = 668 + HASH ( 1338 ) = -7839 + HASH ( 1339 ) = 669 + HASH ( 1340 ) = -2985 + HASH ( 1371 ) = 1694 + HASH ( 1372 ) = -2777 + HASH ( 1437 ) = 718 + HASH ( 1438 ) = -2973 + HASH ( 1451 ) = 725 + HASH ( 1452 ) = -2969 + HASH ( 1457 ) = 728 + HASH ( 1458 ) = -2965 + HASH ( 1459 ) = 1738 + HASH ( 1460 ) = -2659 + HASH ( 1463 ) = 731 + HASH ( 1464 ) = -2267 + HASH ( 1467 ) = 1742 + HASH ( 1468 ) = -2775 + HASH ( 1487 ) = 1752 + HASH ( 1488 ) = -2583 + HASH ( 1557 ) = 778 + HASH ( 1558 ) = -2955 + HASH ( 1571 ) = 785 + HASH ( 1572 ) = -2949 + HASH ( 1573 ) = 786 + HASH ( 1574 ) = -2103 + HASH ( 1579 ) = 789 + HASH ( 1580 ) = -2941 + HASH ( 1585 ) = 792 + HASH ( 1586 ) = -2927 + HASH ( 1591 ) = 1804 + HASH ( 1592 ) = -2189 + HASH ( 1595 ) = 1806 + HASH ( 1596 ) = -2751 + HASH ( 1601 ) = 1809 + HASH ( 1602 ) = -7981 + HASH ( 1603 ) = 1810 + HASH ( 1604 ) = -2663 + HASH ( 1609 ) = 1813 + HASH ( 1610 ) = -2463 + HASH ( 1619 ) = 1818 + HASH ( 1620 ) = -2591 + HASH ( 1625 ) = 1821 + HASH ( 1626 ) = -2743 + HASH ( 1635 ) = 1826 + HASH ( 1636 ) = -2003 + HASH ( 1685 ) = 842 + HASH ( 1686 ) = -2349 + HASH ( 1687 ) = 843 + HASH ( 1688 ) = -7835 + HASH ( 1693 ) = 846 + HASH ( 1694 ) = -2909 + HASH ( 1701 ) = 850 + HASH ( 1702 ) = -2905 + HASH ( 1713 ) = 856 + HASH ( 1714 ) = 2899 + HASH ( 1715 ) = 1866 + HASH ( 1716 ) = -2731 + HASH ( 1719 ) = 859 + HASH ( 1720 ) = -2283 + HASH ( 1723 ) = 1870 + HASH ( 1724 ) = -2647 + HASH ( 1729 ) = 1873 + HASH ( 1730 ) = -2727 + HASH ( 1731 ) = 1874 + HASH ( 1732 ) = -2593 + HASH ( 1743 ) = 1880 + HASH ( 1749 ) = 1883 + HASH ( 1750 ) = -2721 + HASH ( 1751 ) = 1884 + HASH ( 1752 ) = 2425 + HASH ( 1763 ) = 1890 + HASH ( 1764 ) = -2719 + HASH ( 1829 ) = 1367 + HASH ( 1830 ) = 2253 + HASH ( 1831 ) = 653 + HASH ( 1832 ) = -1829 + HASH ( 1833 ) = 1742 + HASH ( 1834 ) = -1831 + HASH ( 1835 ) = 917 + HASH ( 1836 ) = -2893 + HASH ( 1837 ) = 918 + HASH ( 1838 ) = -2399 + HASH ( 1839 ) = 919 + HASH ( 1840 ) = -2891 + HASH ( 1841 ) = 920 + HASH ( 1842 ) = -2617 + HASH ( 1849 ) = 924 + HASH ( 1850 ) = -2889 + HASH ( 1859 ) = 929 + HASH ( 1860 ) = -2887 + HASH ( 1869 ) = 1943 + HASH ( 1870 ) = -2717 + HASH ( 1873 ) = 1945 + HASH ( 1874 ) = -2709 + HASH ( 1941 ) = 970 + HASH ( 1942 ) = -2877 + HASH ( 1957 ) = 978 + HASH ( 1958 ) = 2339 + HASH ( 1969 ) = 984 + HASH ( 1970 ) = -2873 + HASH ( 1971 ) = 1994 + HASH ( 1972 ) = -2699 + HASH ( 1981 ) = 990 + HASH ( 1982 ) = -2871 + HASH ( 1987 ) = 2002 + HASH ( 1988 ) = -2697 + HASH ( 1989 ) = 1422 + HASH ( 1990 ) = -1991 + HASH ( 1991 ) = 1755 + HASH ( 1992 ) = -1993 + HASH ( 1993 ) = 1563 + HASH ( 1995 ) = 1890 + HASH ( 1996 ) = -1997 + HASH ( 1997 ) = 1614 + HASH ( 1998 ) = -1999 + HASH ( 1999 ) = 1755 + HASH ( 2000 ) = -2001 + HASH ( 2001 ) = 1563 + HASH ( 2003 ) = 1806 + HASH ( 2004 ) = -2005 + HASH ( 2005 ) = 1755 + HASH ( 2006 ) = -2007 + HASH ( 2007 ) = 1563 + HASH ( 2017 ) = 1559 + HASH ( 2019 ) = 1874 + HASH ( 2020 ) = -2017 + HASH ( 2021 ) = 1810 + HASH ( 2022 ) = -2019 + HASH ( 2023 ) = 1624 + HASH ( 2024 ) = -2021 + HASH ( 2025 ) = 1741 + HASH ( 2027 ) = 778 + HASH ( 2028 ) = -2025 + HASH ( 2029 ) = 1496 + HASH ( 2030 ) = -2027 + HASH ( 2031 ) = 1181 + HASH ( 2033 ) = 1694 + HASH ( 2034 ) = -2031 + HASH ( 2035 ) = 14 + HASH ( 2037 ) = 725 + HASH ( 2038 ) = -2035 + HASH ( 2039 ) = 1802 + HASH ( 2040 ) = -2037 + HASH ( 2041 ) = 850 + HASH ( 2042 ) = -2039 + HASH ( 2043 ) = 1358 + HASH ( 2045 ) = 651 + HASH ( 2046 ) = -2043 + HASH ( 2047 ) = 919 + HASH ( 2048 ) = -2045 + HASH ( 2049 ) = 1629 + HASH ( 2051 ) = 782 + HASH ( 2052 ) = -2049 + HASH ( 2053 ) = 652 + HASH ( 2054 ) = -2051 + HASH ( 2055 ) = 2254 + HASH ( 2056 ) = 7827 + HASH ( 2057 ) = 1810 + HASH ( 2058 ) = -2055 + HASH ( 2059 ) = 661 + HASH ( 2060 ) = -2057 + HASH ( 2061 ) = 1742 + HASH ( 2062 ) = -2059 + HASH ( 2063 ) = 14 + HASH ( 2064 ) = 7985 + HASH ( 2065 ) = 1187 + HASH ( 2066 ) = -2063 + HASH ( 2067 ) = 1884 + HASH ( 2068 ) = -2065 + HASH ( 2069 ) = 1175 + HASH ( 2070 ) = -2067 + HASH ( 2071 ) = 908 + HASH ( 2073 ) = 1883 + HASH ( 2074 ) = -2071 + HASH ( 2075 ) = 1630 + HASH ( 2076 ) = -2073 + HASH ( 2077 ) = 908 + HASH ( 2078 ) = 7945 + HASH ( 2079 ) = 1883 + HASH ( 2080 ) = -2077 + HASH ( 2081 ) = 1038 + HASH ( 2082 ) = -2079 + HASH ( 2083 ) = 1492 + HASH ( 2085 ) = 1362 + HASH ( 2086 ) = -2083 + HASH ( 2087 ) = 1943 + HASH ( 2088 ) = -2085 + HASH ( 2089 ) = 916 + HASH ( 2090 ) = 7957 + HASH ( 2091 ) = 1806 + HASH ( 2092 ) = -2089 + HASH ( 2093 ) = 797 + HASH ( 2094 ) = 2041 + HASH ( 2095 ) = 1742 + HASH ( 2096 ) = -2093 + HASH ( 2097 ) = 850 + HASH ( 2098 ) = -2095 + HASH ( 2099 ) = 908 + HASH ( 2101 ) = 929 + HASH ( 2102 ) = -2099 + HASH ( 2103 ) = 1739 + HASH ( 2105 ) = 16 + HASH ( 2107 ) = 1175 + HASH ( 2108 ) = -2105 + HASH ( 2109 ) = 1883 + HASH ( 2110 ) = -2107 + HASH ( 2111 ) = 1884 + HASH ( 2112 ) = -2109 + HASH ( 2113 ) = 1566 + HASH ( 2114 ) = -2111 + HASH ( 2115 ) = 1864 + HASH ( 2117 ) = 1559 + HASH ( 2118 ) = -2115 + HASH ( 2119 ) = 1103 + HASH ( 2120 ) = -2117 + HASH ( 2121 ) = 29 + HASH ( 2122 ) = 2119 + HASH ( 2123 ) = 1559 + HASH ( 2124 ) = -2121 + HASH ( 2125 ) = 1103 + HASH ( 2126 ) = -2123 + HASH ( 2127 ) = 20 + HASH ( 2129 ) = 652 + HASH ( 2130 ) = -2127 + HASH ( 2131 ) = 1883 + HASH ( 2132 ) = -2129 + HASH ( 2133 ) = 665 + HASH ( 2135 ) = 1750 + HASH ( 2136 ) = -2133 + HASH ( 2137 ) = 2136 + HASH ( 2138 ) = -2135 + HASH ( 2139 ) = 25 + HASH ( 2141 ) = 1418 + HASH ( 2142 ) = -2139 + HASH ( 2143 ) = 1563 + HASH ( 2144 ) = -2141 + HASH ( 2145 ) = 665 + HASH ( 2146 ) = 2075 + HASH ( 2147 ) = 1878 + HASH ( 2148 ) = -2145 + HASH ( 2149 ) = 1630 + HASH ( 2150 ) = -2147 + HASH ( 2151 ) = 665 + HASH ( 2152 ) = 2081 + HASH ( 2153 ) = 1878 + HASH ( 2154 ) = -2151 + HASH ( 2155 ) = 1038 + HASH ( 2156 ) = -2153 + HASH ( 2157 ) = 33 + HASH ( 2158 ) = 2069 + HASH ( 2159 ) = 1618 + HASH ( 2160 ) = -2157 + HASH ( 2161 ) = 1175 + HASH ( 2162 ) = -2159 + HASH ( 2163 ) = 1564 + HASH ( 2164 ) = 2161 + HASH ( 2165 ) = 2201 + HASH ( 2166 ) = -2163 + HASH ( 2167 ) = 1175 + HASH ( 2168 ) = -2165 + HASH ( 2169 ) = 1564 + HASH ( 2170 ) = 2167 + HASH ( 2171 ) = 2137 + HASH ( 2172 ) = -2169 + HASH ( 2173 ) = 1175 + HASH ( 2174 ) = -2171 + HASH ( 2175 ) = 34 + HASH ( 2176 ) = 2023 + HASH ( 2177 ) = 1633 + HASH ( 2178 ) = -2175 + HASH ( 2179 ) = 1624 + HASH ( 2180 ) = -2177 + HASH ( 2181 ) = 2146 + HASH ( 2182 ) = 2149 + HASH ( 2183 ) = 1809 + HASH ( 2184 ) = -2181 + HASH ( 2185 ) = 1630 + HASH ( 2186 ) = -2183 + HASH ( 2187 ) = 919 + HASH ( 2188 ) = 7785 + HASH ( 2189 ) = 1742 + HASH ( 2190 ) = -2187 + HASH ( 2191 ) = 24 + HASH ( 2193 ) = 846 + HASH ( 2194 ) = -2191 + HASH ( 2195 ) = 2002 + HASH ( 2196 ) = -2193 + HASH ( 2197 ) = 923 + HASH ( 2199 ) = 1741 + HASH ( 2200 ) = -2197 + HASH ( 2201 ) = 728 + HASH ( 2202 ) = -2199 + HASH ( 2203 ) = 925 + HASH ( 2205 ) = 1365 + HASH ( 2206 ) = -2203 + HASH ( 2207 ) = 1610 + HASH ( 2208 ) = -2205 + HASH ( 2209 ) = 1500 + HASH ( 2210 ) = 2173 + HASH ( 2211 ) = 1870 + HASH ( 2212 ) = -2209 + HASH ( 2213 ) = 1175 + HASH ( 2214 ) = -2211 + HASH ( 2215 ) = 1751 + HASH ( 2216 ) = 2207 + HASH ( 2217 ) = 1870 + HASH ( 2218 ) = -2215 + HASH ( 2219 ) = 1610 + HASH ( 2220 ) = -2217 + HASH ( 2221 ) = 14 + HASH ( 2222 ) = 7963 + HASH ( 2223 ) = 2197 + HASH ( 2224 ) = -2221 + HASH ( 2225 ) = 1821 + HASH ( 2226 ) = -2223 + HASH ( 2227 ) = 27 + HASH ( 2229 ) = 1368 + HASH ( 2230 ) = -2227 + HASH ( 2231 ) = 792 + HASH ( 2232 ) = -2229 + HASH ( 2233 ) = 21 + HASH ( 2235 ) = 1173 + HASH ( 2236 ) = -2233 + HASH ( 2237 ) = 1999 + HASH ( 2238 ) = -2235 + HASH ( 2239 ) = 29 + HASH ( 2240 ) = 2179 + HASH ( 2241 ) = 1175 + HASH ( 2242 ) = -2239 + HASH ( 2243 ) = 788 + HASH ( 2244 ) = 2087 + HASH ( 2245 ) = 1610 + HASH ( 2246 ) = -2243 + HASH ( 2247 ) = 1943 + HASH ( 2248 ) = -2245 + HASH ( 2249 ) = 1870 + HASH ( 2250 ) = -2251 + HASH ( 2251 ) = 2141 + HASH ( 2253 ) = 1742 + HASH ( 2254 ) = -2255 + HASH ( 2255 ) = 1806 + HASH ( 2256 ) = -2257 + HASH ( 2257 ) = 29 + HASH ( 2258 ) = 2259 + HASH ( 2259 ) = 1742 + HASH ( 2260 ) = -2261 + HASH ( 2261 ) = 2075 + HASH ( 2262 ) = -2263 + HASH ( 2263 ) = 1181 + HASH ( 2264 ) = -2265 + HASH ( 2265 ) = 14 + HASH ( 2266 ) = 2061 + HASH ( 2267 ) = 906 + HASH ( 2268 ) = -2269 + HASH ( 2269 ) = 20 + HASH ( 2270 ) = 7797 + HASH ( 2271 ) = 1559 + HASH ( 2272 ) = 2273 + HASH ( 2273 ) = 1051 + HASH ( 2274 ) = -2275 + HASH ( 2275 ) = 1551 + HASH ( 2276 ) = -2277 + HASH ( 2277 ) = 15 + HASH ( 2279 ) = 1432 + HASH ( 2280 ) = -2281 + HASH ( 2281 ) = 1998 + HASH ( 2282 ) = 7991 + HASH ( 2283 ) = 672 + HASH ( 2285 ) = 1173 + HASH ( 2286 ) = -2287 + HASH ( 2287 ) = 21 + HASH ( 2288 ) = 2125 + HASH ( 2289 ) = 656 + HASH ( 2290 ) = -2291 + HASH ( 2291 ) = 14 + HASH ( 2293 ) = 1098 + HASH ( 2294 ) = -2295 + HASH ( 2295 ) = 1804 + HASH ( 2296 ) = -2297 + HASH ( 2297 ) = 1170 + HASH ( 2299 ) = 1175 + HASH ( 2300 ) = -2301 + HASH ( 2301 ) = 1294 + HASH ( 2302 ) = -2303 + HASH ( 2303 ) = 34 + HASH ( 2304 ) = 2213 + HASH ( 2305 ) = 782 + HASH ( 2306 ) = -2307 + HASH ( 2307 ) = 1755 + HASH ( 2308 ) = -2309 + HASH ( 2309 ) = 1563 + HASH ( 2310 ) = 2053 + HASH ( 2311 ) = 792 + HASH ( 2312 ) = -2313 + HASH ( 2313 ) = 1486 + HASH ( 2314 ) = -2315 + HASH ( 2315 ) = 1755 + HASH ( 2316 ) = -2317 + HASH ( 2317 ) = 1563 + HASH ( 2318 ) = 2231 + HASH ( 2319 ) = 1368 + HASH ( 2320 ) = -2321 + HASH ( 2321 ) = 1038 + HASH ( 2322 ) = -2323 + HASH ( 2323 ) = 1755 + HASH ( 2324 ) = -2325 + HASH ( 2325 ) = 1563 + HASH ( 2327 ) = 1422 + HASH ( 2328 ) = -2329 + HASH ( 2329 ) = 1755 + HASH ( 2330 ) = -2331 + HASH ( 2331 ) = 1563 + HASH ( 2332 ) = 7847 + HASH ( 2333 ) = 28 + HASH ( 2335 ) = 789 + HASH ( 2336 ) = -2333 + HASH ( 2337 ) = 1358 + HASH ( 2339 ) = 978 + HASH ( 2340 ) = -2337 + HASH ( 2341 ) = 29 + HASH ( 2342 ) = 2185 + HASH ( 2343 ) = 29 + HASH ( 2344 ) = 2155 + HASH ( 2345 ) = 919 + HASH ( 2347 ) = 1561 + HASH ( 2348 ) = -2345 + HASH ( 2349 ) = 1870 + HASH ( 2351 ) = 27 + HASH ( 2352 ) = 2101 + HASH ( 2353 ) = 1610 + HASH ( 2354 ) = -2351 + HASH ( 2355 ) = 908 + HASH ( 2356 ) = -2353 + HASH ( 2357 ) = 929 + HASH ( 2358 ) = -2355 + HASH ( 2359 ) = 28 + HASH ( 2360 ) = 2347 + HASH ( 2361 ) = 1559 + HASH ( 2362 ) = -2359 + HASH ( 2363 ) = 1874 + HASH ( 2364 ) = -2361 + HASH ( 2365 ) = 20 + HASH ( 2366 ) = 2335 + HASH ( 2367 ) = 1548 + HASH ( 2368 ) = -2365 + HASH ( 2369 ) = 789 + HASH ( 2370 ) = -2367 + HASH ( 2371 ) = 925 + HASH ( 2373 ) = 1500 + HASH ( 2374 ) = -2371 + HASH ( 2375 ) = 1738 + HASH ( 2376 ) = -2373 + HASH ( 2377 ) = 27 + HASH ( 2379 ) = 718 + HASH ( 2380 ) = -2377 + HASH ( 2381 ) = 918 + HASH ( 2382 ) = -2379 + HASH ( 2383 ) = 1756 + HASH ( 2385 ) = 1102 + HASH ( 2386 ) = -2383 + HASH ( 2387 ) = 1565 + HASH ( 2388 ) = -2385 + HASH ( 2389 ) = 1870 + HASH ( 2390 ) = 7917 + HASH ( 2391 ) = 1358 + HASH ( 2392 ) = -2389 + HASH ( 2393 ) = 846 + HASH ( 2394 ) = -2391 + HASH ( 2395 ) = 23 + HASH ( 2397 ) = 34 + HASH ( 2399 ) = 1629 + HASH ( 2400 ) = -2397 + HASH ( 2401 ) = 1757 + HASH ( 2402 ) = 2299 + HASH ( 2403 ) = 1806 + HASH ( 2404 ) = -2401 + HASH ( 2405 ) = 1175 + HASH ( 2406 ) = -2403 + HASH ( 2407 ) = 25 + HASH ( 2408 ) = 2247 + HASH ( 2409 ) = 788 + HASH ( 2410 ) = -2407 + HASH ( 2411 ) = 1368 + HASH ( 2412 ) = -2409 + HASH ( 2413 ) = 1943 + HASH ( 2414 ) = -2411 + HASH ( 2415 ) = 25 + HASH ( 2416 ) = 2319 + HASH ( 2417 ) = 788 + HASH ( 2418 ) = -2415 + HASH ( 2419 ) = 1368 + HASH ( 2420 ) = -2417 + HASH ( 2421 ) = 1945 + HASH ( 2423 ) = 25 + HASH ( 2425 ) = 1884 + HASH ( 2426 ) = -2423 + HASH ( 2427 ) = 23 + HASH ( 2429 ) = 1181 + HASH ( 2430 ) = -2427 + HASH ( 2431 ) = 2058 + HASH ( 2432 ) = -2429 + HASH ( 2433 ) = 667 + HASH ( 2434 ) = 2225 + HASH ( 2435 ) = 1561 + HASH ( 2436 ) = -2433 + HASH ( 2437 ) = 1821 + HASH ( 2438 ) = -2435 + HASH ( 2439 ) = 25 + HASH ( 2440 ) = 2431 + HASH ( 2441 ) = 1181 + HASH ( 2442 ) = -2439 + HASH ( 2443 ) = 2058 + HASH ( 2444 ) = -2441 + HASH ( 2445 ) = 25 + HASH ( 2446 ) = 2437 + HASH ( 2447 ) = 1561 + HASH ( 2448 ) = -2445 + HASH ( 2449 ) = 1821 + HASH ( 2450 ) = -2447 + HASH ( 2451 ) = 25 + HASH ( 2452 ) = 1833 + HASH ( 2453 ) = 1422 + HASH ( 2454 ) = -2451 + HASH ( 2455 ) = 1822 + HASH ( 2456 ) = -2453 + HASH ( 2457 ) = 1742 + HASH ( 2458 ) = -2455 + HASH ( 2459 ) = 20 + HASH ( 2461 ) = 1490 + HASH ( 2462 ) = -2459 + HASH ( 2463 ) = 1568 + HASH ( 2464 ) = -2461 + HASH ( 2465 ) = 924 + HASH ( 2467 ) = 1548 + HASH ( 2468 ) = -2465 + HASH ( 2469 ) = 1627 + HASH ( 2470 ) = -2467 + HASH ( 2471 ) = 27 + HASH ( 2472 ) = 2091 + HASH ( 2473 ) = 984 + HASH ( 2474 ) = -2471 + HASH ( 2475 ) = 1418 + HASH ( 2476 ) = -2473 + HASH ( 2477 ) = 1806 + HASH ( 2478 ) = -2475 + HASH ( 2479 ) = 1943 + HASH ( 2480 ) = 2047 + HASH ( 2481 ) = 859 + HASH ( 2482 ) = -2479 + HASH ( 2483 ) = 919 + HASH ( 2484 ) = -2481 + HASH ( 2485 ) = 27 + HASH ( 2486 ) = 2137 + HASH ( 2487 ) = 28 + HASH ( 2488 ) = 2219 + HASH ( 2489 ) = 930 + HASH ( 2490 ) = -2487 + HASH ( 2491 ) = 1364 + HASH ( 2492 ) = -2489 + HASH ( 2493 ) = 1486 + HASH ( 2494 ) = -2491 + HASH ( 2495 ) = 1167 + HASH ( 2497 ) = 878 + HASH ( 2498 ) = -2495 + HASH ( 2499 ) = 663 + HASH ( 2500 ) = -2497 + HASH ( 2501 ) = 15 + HASH ( 2502 ) = 2499 + HASH ( 2503 ) = 850 + HASH ( 2504 ) = -2501 + HASH ( 2505 ) = 663 + HASH ( 2506 ) = -2503 + HASH ( 2507 ) = 3 + HASH ( 2509 ) = 673 + HASH ( 2510 ) = -2507 + HASH ( 2511 ) = 1174 + HASH ( 2512 ) = -2509 + HASH ( 2513 ) = 673 + HASH ( 2514 ) = 2511 + HASH ( 2515 ) = 1174 + HASH ( 2516 ) = -2513 + HASH ( 2517 ) = 3 + HASH ( 2518 ) = 2515 + HASH ( 2519 ) = 1175 + HASH ( 2520 ) = -2517 + HASH ( 2521 ) = 1174 + HASH ( 2522 ) = -2519 + HASH ( 2523 ) = 1175 + HASH ( 2524 ) = 2521 + HASH ( 2525 ) = 669 + HASH ( 2526 ) = 2457 + HASH ( 2527 ) = 1614 + HASH ( 2528 ) = -2525 + HASH ( 2529 ) = 1742 + HASH ( 2530 ) = -2527 + HASH ( 2531 ) = 1485 + HASH ( 2532 ) = 2529 + HASH ( 2533 ) = 2066 + HASH ( 2534 ) = -2531 + HASH ( 2535 ) = 1742 + HASH ( 2536 ) = -2533 + HASH ( 2537 ) = 14 + HASH ( 2538 ) = 2483 + HASH ( 2539 ) = 1173 + HASH ( 2540 ) = -2537 + HASH ( 2541 ) = 847 + HASH ( 2542 ) = -2539 + HASH ( 2543 ) = 919 + HASH ( 2544 ) = -2541 + HASH ( 2545 ) = 663 + HASH ( 2547 ) = 669 + HASH ( 2548 ) = -2545 + HASH ( 2549 ) = 25 + HASH ( 2550 ) = 2357 + HASH ( 2551 ) = 929 + HASH ( 2552 ) = -2549 + HASH ( 2553 ) = 23 + HASH ( 2555 ) = 1866 + HASH ( 2556 ) = -2553 + HASH ( 2557 ) = 28 + HASH ( 2558 ) = 2311 + HASH ( 2559 ) = 792 + HASH ( 2560 ) = -2557 + HASH ( 2561 ) = 23 + HASH ( 2563 ) = 1810 + HASH ( 2564 ) = -2561 + HASH ( 2565 ) = 1047 + HASH ( 2566 ) = 2563 + HASH ( 2567 ) = 1810 + HASH ( 2568 ) = -2565 + HASH ( 2569 ) = 13 + HASH ( 2570 ) = 2143 + HASH ( 2571 ) = 1563 + HASH ( 2572 ) = -2569 + HASH ( 2573 ) = 27 + HASH ( 2575 ) = 785 + HASH ( 2576 ) = -2573 + HASH ( 2577 ) = 1367 + HASH ( 2579 ) = 920 + HASH ( 2580 ) = -2577 + HASH ( 2581 ) = 13 + HASH ( 2583 ) = 1943 + HASH ( 2584 ) = -2581 + HASH ( 2585 ) = 923 + HASH ( 2586 ) = 2543 + HASH ( 2587 ) = 1874 + HASH ( 2588 ) = -2585 + HASH ( 2589 ) = 919 + HASH ( 2590 ) = -2587 + HASH ( 2591 ) = 1757 + HASH ( 2593 ) = 1422 + HASH ( 2595 ) = 1558 + HASH ( 2596 ) = 2375 + HASH ( 2597 ) = 1485 + HASH ( 2598 ) = -2595 + HASH ( 2599 ) = 1738 + HASH ( 2600 ) = -2597 + HASH ( 2601 ) = 29 + HASH ( 2603 ) = 1103 + HASH ( 2604 ) = -2601 + HASH ( 2605 ) = 1180 + HASH ( 2606 ) = -2603 + HASH ( 2607 ) = 1485 + HASH ( 2609 ) = 27 + HASH ( 2611 ) = 1565 + HASH ( 2612 ) = 2405 + HASH ( 2613 ) = 1175 + HASH ( 2614 ) = -2611 + HASH ( 2615 ) = 28 + HASH ( 2617 ) = 15 + HASH ( 2618 ) = 2579 + HASH ( 2619 ) = 665 + HASH ( 2620 ) = 2131 + HASH ( 2621 ) = 1883 + HASH ( 2622 ) = -2619 + HASH ( 2623 ) = 1365 + HASH ( 2625 ) = 2066 + HASH ( 2626 ) = -2623 + HASH ( 2627 ) = 1821 + HASH ( 2628 ) = -2625 + HASH ( 2629 ) = 1354 + HASH ( 2630 ) = -2627 + HASH ( 2631 ) = 21 + HASH ( 2632 ) = 2629 + HASH ( 2633 ) = 1173 + HASH ( 2634 ) = -2631 + HASH ( 2635 ) = 2976 + HASH ( 2636 ) = -2633 + HASH ( 2637 ) = 1821 + HASH ( 2638 ) = -2635 + HASH ( 2639 ) = 1485 + HASH ( 2640 ) = 7831 + HASH ( 2641 ) = 14 + HASH ( 2642 ) = 2249 + HASH ( 2643 ) = 669 + HASH ( 2644 ) = -2641 + HASH ( 2645 ) = 1175 + HASH ( 2646 ) = -2643 + HASH ( 2647 ) = 1750 + HASH ( 2648 ) = -2645 + HASH ( 2649 ) = 1934 + HASH ( 2650 ) = 2559 + HASH ( 2651 ) = 1175 + HASH ( 2652 ) = -2649 + HASH ( 2653 ) = 1501 + HASH ( 2654 ) = -2651 + HASH ( 2655 ) = 792 + HASH ( 2656 ) = -2653 + HASH ( 2657 ) = 14 + HASH ( 2658 ) = 2599 + HASH ( 2659 ) = 1180 + HASH ( 2660 ) = -2657 + HASH ( 2661 ) = 661 + HASH ( 2662 ) = 2567 + HASH ( 2663 ) = 1047 + HASH ( 2664 ) = -2661 + HASH ( 2665 ) = 1756 + HASH ( 2666 ) = 2293 + HASH ( 2667 ) = 1358 + HASH ( 2668 ) = -2665 + HASH ( 2669 ) = 1485 + HASH ( 2670 ) = -2667 + HASH ( 2671 ) = 23 + HASH ( 2673 ) = 917 + HASH ( 2674 ) = -2671 + HASH ( 2675 ) = 1181 + HASH ( 2676 ) = -2673 + HASH ( 2677 ) = 2075 + HASH ( 2678 ) = -2675 + HASH ( 2679 ) = 14 + HASH ( 2680 ) = 2677 + HASH ( 2681 ) = 1181 + HASH ( 2682 ) = -2679 + HASH ( 2683 ) = 14 + HASH ( 2685 ) = 1173 + HASH ( 2686 ) = -2683 + HASH ( 2687 ) = 2065 + HASH ( 2688 ) = -2685 + HASH ( 2689 ) = 919 + HASH ( 2690 ) = 2687 + HASH ( 2691 ) = 1181 + HASH ( 2692 ) = 2443 + HASH ( 2693 ) = 21 + HASH ( 2694 ) = 2195 + HASH ( 2695 ) = 1930 + HASH ( 2696 ) = -2693 + HASH ( 2697 ) = 1757 + HASH ( 2698 ) = -2695 + HASH ( 2699 ) = 27 + HASH ( 2701 ) = 27 + HASH ( 2702 ) = 2419 + HASH ( 2703 ) = 2062 + HASH ( 2704 ) = -2701 + HASH ( 2705 ) = 1368 + HASH ( 2706 ) = -2703 + HASH ( 2707 ) = 27 + HASH ( 2708 ) = 2421 + HASH ( 2709 ) = 1614 + HASH ( 2710 ) = -2707 + HASH ( 2711 ) = 788 + HASH ( 2712 ) = 2413 + HASH ( 2713 ) = 1368 + HASH ( 2714 ) = -2711 + HASH ( 2715 ) = 1943 + HASH ( 2716 ) = -2713 + HASH ( 2717 ) = 1181 + HASH ( 2718 ) = 2715 + HASH ( 2719 ) = 1614 + HASH ( 2720 ) = 1995 + HASH ( 2721 ) = 1934 + HASH ( 2722 ) = 2621 + HASH ( 2723 ) = 1180 + HASH ( 2725 ) = 1873 + HASH ( 2726 ) = -2723 + HASH ( 2727 ) = 919 + HASH ( 2728 ) = 2725 + HASH ( 2729 ) = 23 + HASH ( 2730 ) = 2555 + HASH ( 2731 ) = 1294 + HASH ( 2732 ) = -2729 + HASH ( 2733 ) = 1488 + HASH ( 2734 ) = 2447 + HASH ( 2735 ) = 1746 + HASH ( 2736 ) = -2733 + HASH ( 2737 ) = 1821 + HASH ( 2738 ) = -2735 + HASH ( 2739 ) = 1561 + HASH ( 2740 ) = 2737 + HASH ( 2741 ) = 1821 + HASH ( 2742 ) = -2739 + HASH ( 2743 ) = 921 + HASH ( 2744 ) = 2741 + HASH ( 2745 ) = 14 + HASH ( 2746 ) = 2477 + HASH ( 2747 ) = 1563 + HASH ( 2748 ) = -2745 + HASH ( 2749 ) = 1617 + HASH ( 2750 ) = -2747 + HASH ( 2751 ) = 1418 + HASH ( 2752 ) = -2749 + HASH ( 2753 ) = 1751 + HASH ( 2754 ) = 2535 + HASH ( 2755 ) = 1886 + HASH ( 2756 ) = -2753 + HASH ( 2757 ) = 1742 + HASH ( 2758 ) = -2755 + HASH ( 2759 ) = 1422 + HASH ( 2760 ) = 2757 + HASH ( 2761 ) = 1822 + HASH ( 2762 ) = -2759 + HASH ( 2763 ) = 1742 + HASH ( 2764 ) = -2761 + HASH ( 2765 ) = 1373 + HASH ( 2766 ) = 2763 + HASH ( 2767 ) = 1822 + HASH ( 2768 ) = -2765 + HASH ( 2769 ) = 1742 + HASH ( 2770 ) = -2767 + HASH ( 2771 ) = 661 + HASH ( 2772 ) = 2769 + HASH ( 2773 ) = 1742 + HASH ( 2774 ) = -2771 + HASH ( 2775 ) = 653 + HASH ( 2776 ) = 2773 + HASH ( 2777 ) = 10 + HASH ( 2778 ) = 2033 + HASH ( 2779 ) = 28 + HASH ( 2780 ) = 2469 + HASH ( 2781 ) = 924 + HASH ( 2782 ) = -2779 + HASH ( 2783 ) = 1548 + HASH ( 2784 ) = -2781 + HASH ( 2785 ) = 1627 + HASH ( 2786 ) = -2783 + HASH ( 2787 ) = 14 + HASH ( 2788 ) = 2785 + HASH ( 2789 ) = 1947 + HASH ( 2790 ) = -2787 + HASH ( 2791 ) = 909 + HASH ( 2792 ) = -2789 + HASH ( 2793 ) = 1548 + HASH ( 2794 ) = -2791 + HASH ( 2795 ) = 1627 + HASH ( 2796 ) = -2793 + HASH ( 2797 ) = 911 + HASH ( 2798 ) = 2795 + HASH ( 2799 ) = 15 + HASH ( 2800 ) = 2571 + HASH ( 2801 ) = 2962 + HASH ( 2802 ) = -2799 + HASH ( 2803 ) = 1563 + HASH ( 2804 ) = -2801 + HASH ( 2805 ) = 1949 + HASH ( 2806 ) = 2113 + HASH ( 2807 ) = 1881 + HASH ( 2808 ) = -2805 + HASH ( 2809 ) = 14 + HASH ( 2810 ) = 2387 + HASH ( 2811 ) = 1180 + HASH ( 2812 ) = -2809 + HASH ( 2813 ) = 1760 + HASH ( 2814 ) = -2811 + HASH ( 2815 ) = 1102 + HASH ( 2816 ) = -2813 + HASH ( 2817 ) = 1167 + HASH ( 2818 ) = 2803 + HASH ( 2819 ) = 1563 + HASH ( 2820 ) = -2817 + HASH ( 2821 ) = 29 + HASH ( 2822 ) = 2029 + HASH ( 2823 ) = 1496 + HASH ( 2824 ) = -2821 + HASH ( 2825 ) = 1486 + HASH ( 2826 ) = 2823 + HASH ( 2827 ) = 32 + HASH ( 2829 ) = 13 + HASH ( 2830 ) = 2279 + HASH ( 2831 ) = 1175 + HASH ( 2832 ) = 7821 + HASH ( 2833 ) = 788 + HASH ( 2834 ) = 2705 + HASH ( 2835 ) = 1365 + HASH ( 2837 ) = 29 + HASH ( 2838 ) = 2613 + HASH ( 2839 ) = 1566 + HASH ( 2840 ) = -2837 + HASH ( 2841 ) = 1175 + HASH ( 2842 ) = -2839 + HASH ( 2843 ) = 27 + HASH ( 2844 ) = 2841 + HASH ( 2845 ) = 1038 + HASH ( 2846 ) = -2843 + HASH ( 2847 ) = 1870 + HASH ( 2848 ) = -2845 + HASH ( 2849 ) = 1175 + HASH ( 2850 ) = -2847 + HASH ( 2851 ) = 29 + HASH ( 2852 ) = 2849 + HASH ( 2853 ) = 1630 + HASH ( 2854 ) = -2851 + HASH ( 2855 ) = 1175 + HASH ( 2856 ) = -2853 + HASH ( 2857 ) = 27 + HASH ( 2858 ) = 2855 + HASH ( 2859 ) = 1486 + HASH ( 2860 ) = -2857 + HASH ( 2861 ) = 1175 + HASH ( 2862 ) = -2859 + HASH ( 2863 ) = 919 + HASH ( 2864 ) = 7973 + HASH ( 2865 ) = 845 + HASH ( 2866 ) = -2863 + HASH ( 2867 ) = 1559 + HASH ( 2868 ) = 2237 + HASH ( 2869 ) = 1874 + HASH ( 2870 ) = -2867 + HASH ( 2871 ) = 1484 + HASH ( 2872 ) = -2869 + HASH ( 2873 ) = 27 + HASH ( 2875 ) = 14 + HASH ( 2877 ) = 1372 + HASH ( 2878 ) = -2875 + HASH ( 2879 ) = 661 + HASH ( 2880 ) = 2551 + HASH ( 2881 ) = 1751 + HASH ( 2882 ) = -2879 + HASH ( 2883 ) = 1870 + HASH ( 2884 ) = -2881 + HASH ( 2885 ) = 929 + HASH ( 2886 ) = -2883 + HASH ( 2887 ) = 1181 + HASH ( 2888 ) = 2885 + HASH ( 2889 ) = 652 + HASH ( 2891 ) = 13 + HASH ( 2892 ) = 2589 + HASH ( 2893 ) = 1806 + HASH ( 2895 ) = 1880 + HASH ( 2897 ) = 2071 + HASH ( 2898 ) = -2895 + HASH ( 2899 ) = 856 + HASH ( 2900 ) = -2897 + HASH ( 2901 ) = 31 + HASH ( 2902 ) = 2097 + HASH ( 2903 ) = 850 + HASH ( 2904 ) = -2901 + HASH ( 2905 ) = 22 + HASH ( 2906 ) = 2903 + HASH ( 2907 ) = 785 + HASH ( 2908 ) = 2393 + HASH ( 2909 ) = 1866 + HASH ( 2910 ) = -2907 + HASH ( 2911 ) = 14 + HASH ( 2912 ) = 2655 + HASH ( 2913 ) = 1175 + HASH ( 2914 ) = -2911 + HASH ( 2915 ) = 1949 + HASH ( 2916 ) = -2913 + HASH ( 2917 ) = 1752 + HASH ( 2918 ) = -2915 + HASH ( 2919 ) = 792 + HASH ( 2920 ) = -2917 + HASH ( 2921 ) = 1634 + HASH ( 2922 ) = 2919 + HASH ( 2923 ) = 792 + HASH ( 2924 ) = -2921 + HASH ( 2925 ) = 29 + HASH ( 2926 ) = 2923 + HASH ( 2927 ) = 1500 + HASH ( 2928 ) = -2925 + HASH ( 2929 ) = 667 + HASH ( 2930 ) = 2575 + HASH ( 2931 ) = 785 + HASH ( 2932 ) = -2929 + HASH ( 2933 ) = 14 + HASH ( 2934 ) = 2369 + HASH ( 2935 ) = 1564 + HASH ( 2936 ) = -2933 + HASH ( 2937 ) = 789 + HASH ( 2938 ) = -2935 + HASH ( 2939 ) = 28 + HASH ( 2940 ) = 2937 + HASH ( 2941 ) = 668 + HASH ( 2942 ) = -2939 + HASH ( 2943 ) = 27 + HASH ( 2944 ) = 2931 + HASH ( 2945 ) = 1870 + HASH ( 2946 ) = -2943 + HASH ( 2947 ) = 652 + HASH ( 2948 ) = -2945 + HASH ( 2949 ) = 667 + HASH ( 2950 ) = -2947 + HASH ( 2951 ) = 1806 + HASH ( 2953 ) = 778 + HASH ( 2954 ) = -2951 + HASH ( 2955 ) = 1365 + HASH ( 2956 ) = 2953 + HASH ( 2957 ) = 1557 + HASH ( 2958 ) = 2201 + HASH ( 2959 ) = 728 + HASH ( 2960 ) = -2957 + HASH ( 2961 ) = 23 + HASH ( 2962 ) = 2959 + HASH ( 2963 ) = 906 + HASH ( 2964 ) = -2961 + HASH ( 2965 ) = 1557 + HASH ( 2966 ) = -2963 + HASH ( 2967 ) = 20 + HASH ( 2969 ) = 1548 + HASH ( 2970 ) = -2967 + HASH ( 2971 ) = 23 + HASH ( 2973 ) = 1042 + HASH ( 2974 ) = -2971 + HASH ( 2975 ) = 1551 + HASH ( 2977 ) = 2222 + HASH ( 2978 ) = -2975 + HASH ( 2979 ) = 1738 + HASH ( 2980 ) = -2977 + HASH ( 2981 ) = 667 + HASH ( 2982 ) = -2979 + HASH ( 2983 ) = 785 + HASH ( 2984 ) = 2547 + HASH ( 2985 ) = 1866 + HASH ( 2986 ) = -2983 + HASH ( 2987 ) = 15 + HASH ( 2988 ) = 2981 + HASH ( 2989 ) = 2200 + HASH ( 2990 ) = -2987 + HASH ( 2991 ) = 1738 + HASH ( 2992 ) = -2989 + HASH ( 2993 ) = 667 + HASH ( 2994 ) = -2991 + HASH ( 2995 ) = 34 + HASH ( 2996 ) = 2993 + HASH ( 2997 ) = 1738 + HASH ( 2998 ) = -2995 + HASH ( 2999 ) = 13 + HASH ( 3000 ) = 2505 + HASH ( 7719 ) = 1742 + HASH ( 7721 ) = 1561 + HASH ( 7723 ) = 3841 + HASH ( 7724 ) = -7721 + HASH ( 7725 ) = 843 + HASH ( 7726 ) = -7723 + HASH ( 7727 ) = 1550 + HASH ( 7728 ) = 7725 + HASH ( 7729 ) = 3841 + HASH ( 7730 ) = -7727 + HASH ( 7731 ) = 843 + HASH ( 7732 ) = -7729 + HASH ( 7733 ) = 1569 + HASH ( 7735 ) = 3841 + HASH ( 7736 ) = -7733 + HASH ( 7737 ) = 781 + HASH ( 7738 ) = -7735 + HASH ( 7739 ) = 1804 + HASH ( 7740 ) = -7737 + HASH ( 7741 ) = 1569 + HASH ( 7742 ) = 7739 + HASH ( 7743 ) = 3841 + HASH ( 7744 ) = -7741 + HASH ( 7745 ) = 1485 + HASH ( 7746 ) = -7743 + HASH ( 7747 ) = 1804 + HASH ( 7748 ) = -7745 + HASH ( 7749 ) = 1551 + HASH ( 7750 ) = 7731 + HASH ( 7751 ) = 3841 + HASH ( 7752 ) = -7749 + HASH ( 7753 ) = 843 + HASH ( 7754 ) = -7751 + HASH ( 7755 ) = 1569 + HASH ( 7756 ) = 7753 + HASH ( 7757 ) = 3841 + HASH ( 7758 ) = -7755 + HASH ( 7759 ) = 843 + HASH ( 7760 ) = -7757 + HASH ( 7761 ) = 1569 + HASH ( 7762 ) = 7747 + HASH ( 7763 ) = 1 + HASH ( 7764 ) = -7761 + HASH ( 7765 ) = 1485 + HASH ( 7766 ) = -7763 + HASH ( 7767 ) = 1804 + HASH ( 7768 ) = -7765 + HASH ( 7769 ) = 1569 + HASH ( 7770 ) = 7767 + HASH ( 7771 ) = 1 + HASH ( 7772 ) = -7769 + HASH ( 7773 ) = 781 + HASH ( 7774 ) = -7771 + HASH ( 7775 ) = 1804 + HASH ( 7776 ) = -7773 + HASH ( 7777 ) = 1804 + HASH ( 7778 ) = 7775 + HASH ( 7779 ) = 33 + HASH ( 7780 ) = 7777 + HASH ( 7781 ) = 1537 + HASH ( 7782 ) = -7779 + HASH ( 7783 ) = 781 + HASH ( 7784 ) = -7781 + HASH ( 7785 ) = 1804 + HASH ( 7786 ) = -7783 + HASH ( 7787 ) = 1551 + HASH ( 7788 ) = 7759 + HASH ( 7789 ) = 1 + HASH ( 7790 ) = -7787 + HASH ( 7791 ) = 843 + HASH ( 7792 ) = -7789 + HASH ( 7793 ) = 1301 + HASH ( 7795 ) = 906 + HASH ( 7796 ) = -7793 + HASH ( 7797 ) = 731 + HASH ( 7798 ) = -7795 + HASH ( 7799 ) = 14 + HASH ( 7801 ) = 1563 + HASH ( 7802 ) = -7799 + HASH ( 7803 ) = 1821 + HASH ( 7804 ) = -7801 + HASH ( 7805 ) = 1998 + HASH ( 7806 ) = 7719 + HASH ( 7807 ) = 1432 + HASH ( 7808 ) = -7805 + HASH ( 7809 ) = 1742 + HASH ( 7810 ) = -7807 + HASH ( 7811 ) = 14 + HASH ( 7813 ) = 667 + HASH ( 7814 ) = -7811 + HASH ( 7815 ) = 789 + HASH ( 7816 ) = -7813 + HASH ( 7817 ) = 846 + HASH ( 7818 ) = -7815 + HASH ( 7819 ) = 1748 + HASH ( 7821 ) = 1418 + HASH ( 7822 ) = -7819 + HASH ( 7823 ) = 1757 + HASH ( 7824 ) = 7809 + HASH ( 7825 ) = 1624 + HASH ( 7826 ) = -7823 + HASH ( 7827 ) = 1742 + HASH ( 7828 ) = -7825 + HASH ( 7829 ) = 1873 + HASH ( 7831 ) = 2066 + HASH ( 7832 ) = -7829 + HASH ( 7833 ) = 1569 + HASH ( 7834 ) = 7791 + HASH ( 7835 ) = 1 + HASH ( 7836 ) = -7833 + HASH ( 7837 ) = 1047 + HASH ( 7839 ) = 1810 + HASH ( 7840 ) = -7837 + HASH ( 7841 ) = 1173 + HASH ( 7843 ) = 1994 + HASH ( 7844 ) = -7841 + HASH ( 7845 ) = 1418 + HASH ( 7846 ) = -7843 + HASH ( 7847 ) = 1422 + HASH ( 7848 ) = -7845 + HASH ( 7849 ) = 1501 + HASH ( 7851 ) = 1998 + HASH ( 7852 ) = -7849 + HASH ( 7853 ) = 910 + HASH ( 7854 ) = -7851 + HASH ( 7855 ) = 1948 + HASH ( 7856 ) = -7853 + HASH ( 7857 ) = 1432 + HASH ( 7858 ) = -7855 + HASH ( 7859 ) = 1501 + HASH ( 7861 ) = 1998 + HASH ( 7862 ) = -7859 + HASH ( 7863 ) = 1870 + HASH ( 7864 ) = -7861 + HASH ( 7865 ) = 1806 + HASH ( 7866 ) = -7863 + HASH ( 7867 ) = 1357 + HASH ( 7868 ) = 7865 + HASH ( 7869 ) = 1112 + HASH ( 7870 ) = -7867 + HASH ( 7871 ) = 924 + HASH ( 7872 ) = -7869 + HASH ( 7873 ) = 1115 + HASH ( 7874 ) = -7871 + HASH ( 7875 ) = 1885 + HASH ( 7876 ) = -7873 + HASH ( 7877 ) = 1806 + HASH ( 7878 ) = -7875 + HASH ( 7879 ) = 32 + HASH ( 7880 ) = 7877 + HASH ( 7881 ) = 856 + HASH ( 7882 ) = -7879 + HASH ( 7883 ) = 1175 + HASH ( 7884 ) = -7881 + HASH ( 7885 ) = 1888 + HASH ( 7886 ) = -7883 + HASH ( 7887 ) = 1806 + HASH ( 7888 ) = -7885 + HASH ( 7889 ) = 909 + HASH ( 7890 ) = 7887 + HASH ( 7891 ) = 1614 + HASH ( 7892 ) = -7889 + HASH ( 7893 ) = 1884 + HASH ( 7894 ) = -7891 + HASH ( 7895 ) = 1806 + HASH ( 7896 ) = -7893 + HASH ( 7897 ) = 29 + HASH ( 7899 ) = 919 + HASH ( 7900 ) = -7897 + HASH ( 7901 ) = 918 + HASH ( 7902 ) = -7899 + HASH ( 7903 ) = 1567 + HASH ( 7904 ) = -7901 + HASH ( 7905 ) = 1878 + HASH ( 7906 ) = -7903 + HASH ( 7907 ) = 1038 + HASH ( 7908 ) = -7905 + HASH ( 7909 ) = 27 + HASH ( 7910 ) = 7817 + HASH ( 7911 ) = 1816 + HASH ( 7912 ) = -7909 + HASH ( 7913 ) = 1947 + HASH ( 7914 ) = -7911 + HASH ( 7915 ) = 972 + HASH ( 7916 ) = -7913 + HASH ( 7917 ) = 846 + HASH ( 7918 ) = -7915 + HASH ( 7919 ) = 1500 + HASH ( 7920 ) = 7895 + HASH ( 7921 ) = 1042 + HASH ( 7922 ) = -7919 + HASH ( 7923 ) = 667 + HASH ( 7924 ) = -7921 + HASH ( 7925 ) = 1878 + HASH ( 7926 ) = -7923 + HASH ( 7927 ) = 1806 + HASH ( 7928 ) = -7925 + HASH ( 7929 ) = 1806 + HASH ( 7930 ) = 7907 + HASH ( 7931 ) = 906 + HASH ( 7932 ) = -7929 + HASH ( 7933 ) = 917 + HASH ( 7934 ) = -7931 + HASH ( 7935 ) = 1883 + HASH ( 7936 ) = -7933 + HASH ( 7937 ) = 1038 + HASH ( 7938 ) = -7935 + HASH ( 7939 ) = 1820 + HASH ( 7940 ) = 7937 + HASH ( 7941 ) = 1742 + HASH ( 7942 ) = -7939 + HASH ( 7943 ) = 1881 + HASH ( 7944 ) = -7941 + HASH ( 7945 ) = 1038 + HASH ( 7946 ) = -7943 + HASH ( 7947 ) = 23 + HASH ( 7948 ) = 7927 + HASH ( 7949 ) = 1176 + HASH ( 7950 ) = -7947 + HASH ( 7951 ) = 1181 + HASH ( 7952 ) = -7949 + HASH ( 7953 ) = 1564 + HASH ( 7954 ) = -7951 + HASH ( 7955 ) = 1881 + HASH ( 7956 ) = -7953 + HASH ( 7957 ) = 1806 + HASH ( 7958 ) = -7955 + HASH ( 7959 ) = 1948 + HASH ( 7960 ) = 7803 + HASH ( 7961 ) = 669 + HASH ( 7962 ) = -7959 + HASH ( 7963 ) = 1821 + HASH ( 7964 ) = -7961 + HASH ( 7965 ) = 1563 + HASH ( 7967 ) = 1756 + HASH ( 7968 ) = -7965 + HASH ( 7969 ) = 798 + HASH ( 7970 ) = -7967 + HASH ( 7971 ) = 846 + HASH ( 7972 ) = -7969 + HASH ( 7973 ) = 1106 + HASH ( 7974 ) = -7971 + HASH ( 7975 ) = 1563 + HASH ( 7977 ) = 1756 + HASH ( 7978 ) = -7975 + HASH ( 7979 ) = 798 + HASH ( 7980 ) = -7977 + HASH ( 7981 ) = 1568 + HASH ( 7982 ) = -7979 + HASH ( 7983 ) = 1181 + HASH ( 7985 ) = 1175 + HASH ( 7986 ) = -7983 + HASH ( 7987 ) = 14 + HASH ( 7988 ) = 7857 + HASH ( 7989 ) = 1948 + HASH ( 7990 ) = -7987 + HASH ( 7991 ) = 1432 + HASH ( 7992 ) = -7989 + HASH ( 7993 ) = 17 + HASH ( 7995 ) = 665 + HASH ( 7996 ) = -7993 + HASH ( 7997 ) = 1051 + HASH ( 7998 ) = -7995 + HASH ( 7999 ) = 1952 + HASH ( 8000 ) = -7997 + COM(1) = 95 + KEYS ( 1 ) = 168 + KEYS ( 2 ) = 81 + KEYS ( 3 ) = 872 + KEYS ( 4 ) = 95 + KEYS ( 5 ) = 217 + KEYS ( 6 ) = 97 + KEYS ( 7 ) = 152 + KEYS ( 8 ) = 115 + KEYS ( 9 ) = 440 + KEYS ( 10 ) = 179 + KEYS ( 11 ) = 696 + KEYS ( 12 ) = 195 + KEYS ( 13 ) = 16 + KEYS ( 14 ) = 317 + KEYS ( 15 ) = 409 + KEYS ( 16 ) = 333 + KEYS ( 17 ) = 408 + KEYS ( 18 ) = 343 + KEYS ( 19 ) = 80 + KEYS ( 20 ) = 579 + KEYS ( 21 ) = 224 + KEYS ( 22 ) = 691 + KEYS ( 23 ) = 56 + KEYS ( 24 ) = 719 + KEYS ( 25 ) = 768 + KEYS ( 26 ) = 819 + KEYS ( 27 ) = 407 + KEYS ( 28 ) = 847 + KEYS ( 29 ) = 192 + KEYS ( 30 ) = 955 + KEYS ( 31 ) = 8016 + KEYS ( 32 ) = 975 + KEYS ( 33 ) = 520 + KEYS ( 34 ) = 1081 + KEYS ( 35 ) = 544 + KEYS ( 36 ) = 1109 + KEYS ( 37 ) = 784 + KEYS ( 38 ) = 1113 + KEYS ( 39 ) = 761 + KEYS ( 40 ) = 1115 + KEYS ( 41 ) = 184 + KEYS ( 42 ) = 1237 + KEYS ( 43 ) = 400 + KEYS ( 44 ) = 1303 + KEYS ( 45 ) = 536 + KEYS ( 46 ) = 1327 + KEYS ( 47 ) = 144 + KEYS ( 48 ) = 1335 + KEYS ( 49 ) = 88 + KEYS ( 50 ) = 1339 + KEYS ( 51 ) = 608 + KEYS ( 52 ) = 1371 + KEYS ( 53 ) = 664 + KEYS ( 54 ) = 1437 + KEYS ( 55 ) = 176 + KEYS ( 56 ) = 1451 + KEYS ( 57 ) = 512 + KEYS ( 58 ) = 1457 + KEYS ( 59 ) = 208 + KEYS ( 60 ) = 1459 + KEYS ( 61 ) = 64 + KEYS ( 62 ) = 1467 + KEYS ( 63 ) = 72 + KEYS ( 64 ) = 1557 + KEYS ( 65 ) = 513 + KEYS ( 66 ) = 1571 + KEYS ( 67 ) = 688 + KEYS ( 68 ) = 1579 + KEYS ( 69 ) = 704 + KEYS ( 70 ) = 1585 + KEYS ( 71 ) = 792 + KEYS ( 72 ) = 1595 + KEYS ( 73 ) = 448 + KEYS ( 74 ) = 1603 + KEYS ( 75 ) = 816 + KEYS ( 76 ) = 1625 + KEYS ( 77 ) = 40 + KEYS ( 78 ) = 1693 + KEYS ( 79 ) = 712 + KEYS ( 80 ) = 1701 + KEYS ( 81 ) = 112 + KEYS ( 82 ) = 1713 + KEYS ( 83 ) = 824 + KEYS ( 84 ) = 1715 + KEYS ( 85 ) = 216 + KEYS ( 86 ) = 1723 + KEYS ( 87 ) = 488 + KEYS ( 88 ) = 1729 + KEYS ( 89 ) = 832 + KEYS ( 90 ) = 1743 + KEYS ( 91 ) = 8009 + KEYS ( 92 ) = 1749 + KEYS ( 93 ) = 840 + KEYS ( 94 ) = 1763 + KEYS ( 95 ) = 496 + KEYS ( 96 ) = 1835 + KEYS ( 97 ) = 640 + KEYS ( 98 ) = 1839 + KEYS ( 99 ) = 728 + KEYS ( 100 ) = 1849 + KEYS ( 101 ) = 120 + KEYS ( 102 ) = 1859 + KEYS ( 103 ) = 616 + KEYS ( 104 ) = 1869 + KEYS ( 105 ) = 633 + KEYS ( 106 ) = 1873 + KEYS ( 107 ) = 8008 + KEYS ( 108 ) = 1941 + KEYS ( 109 ) = 504 + KEYS ( 110 ) = 1957 + KEYS ( 111 ) = 136 + KEYS ( 112 ) = 1969 + KEYS ( 113 ) = 848 + KEYS ( 114 ) = 1971 + KEYS ( 115 ) = 744 + KEYS ( 116 ) = 1981 + KEYS ( 117 ) = 856 + KEYS ( 118 ) = 1987 + KEYS ( 119 ) = 456 + KEYS ( 120 ) = 2387 + KEYS ( 121 ) = 776 + KEYS ( 122 ) = 2499 + KEYS ( 123 ) = 776 + KEYS ( 124 ) = 2505 + KEYS ( 125 ) = 121 + KEYS ( 126 ) = 2529 + KEYS ( 127 ) = 464 + KEYS ( 128 ) = 2567 + KEYS ( 129 ) = 224 + KEYS ( 130 ) = 2629 + KEYS ( 131 ) = 160 + KEYS ( 132 ) = 2677 + KEYS ( 133 ) = 24 + KEYS ( 134 ) = 2687 + KEYS ( 135 ) = 632 + KEYS ( 136 ) = 2705 + KEYS ( 137 ) = 200 + KEYS ( 138 ) = 2715 + KEYS ( 139 ) = 592 + KEYS ( 140 ) = 2725 + KEYS ( 141 ) = 517 + KEYS ( 142 ) = 2737 + KEYS ( 143 ) = 104 + KEYS ( 144 ) = 2741 + KEYS ( 145 ) = 32 + KEYS ( 146 ) = 2757 + KEYS ( 147 ) = 96 + KEYS ( 148 ) = 2763 + KEYS ( 149 ) = 516 + KEYS ( 150 ) = 2773 + KEYS ( 151 ) = 625 + KEYS ( 152 ) = 2785 + KEYS ( 153 ) = 808 + KEYS ( 154 ) = 2795 + KEYS ( 155 ) = 777 + KEYS ( 156 ) = 2803 + KEYS ( 157 ) = 777 + KEYS ( 158 ) = 2819 + KEYS ( 159 ) = 528 + KEYS ( 160 ) = 2823 + KEYS ( 161 ) = 762 + KEYS ( 162 ) = 2841 + KEYS ( 163 ) = 514 + KEYS ( 164 ) = 2849 + KEYS ( 165 ) = 760 + KEYS ( 166 ) = 2855 + KEYS ( 167 ) = 48 + KEYS ( 168 ) = 2861 + KEYS ( 169 ) = 736 + KEYS ( 170 ) = 2885 + KEYS ( 171 ) = 720 + KEYS ( 172 ) = 2899 + KEYS ( 173 ) = 406 + KEYS ( 174 ) = 2903 + KEYS ( 175 ) = 624 + KEYS ( 176 ) = 2919 + KEYS ( 177 ) = 552 + KEYS ( 178 ) = 2923 + KEYS ( 179 ) = 513 + KEYS ( 180 ) = 2931 + KEYS ( 181 ) = 697 + KEYS ( 182 ) = 2937 + KEYS ( 183 ) = 128 + KEYS ( 184 ) = 2953 + KEYS ( 185 ) = 512 + KEYS ( 186 ) = 2959 + KEYS ( 187 ) = 648 + KEYS ( 188 ) = 2981 + KEYS ( 189 ) = 648 + KEYS ( 190 ) = 2993 + RETURN + END + diff --git a/sources/pass1/ifun.f b/sources/pass1/ifun.f new file mode 100644 index 0000000..bd4bfd4 --- /dev/null +++ b/sources/pass1/ifun.f @@ -0,0 +1,72 @@ +C Loglan82 Compiler&Interpreter +C Copyright (C) 1981-1993 Institute of Informatics, University of Warsaw +C Copyright (C) 1993, 1994 LITA, Pau +C +C This program is free software; you can redistribute it and/or modify +C it under the terms of the GNU General Public License as published by +C the Free Software Foundation; either version 2 of the License, or +C (at your option) any later version. +C +C This program is distributed in the hope that it will be useful, +C but WITHOUT ANY WARRANTY; without even the implied warranty of +C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +C GNU General Public License for more details. File: LICENSE.GNU +C =============================================================== + + integer function ibset(i,j) + integer i, j + ibset= or(i,lshift(1,j)) + return + end + + integer function ibclr(i,j) + integer i,j + ibclr = xor(i,and(i,lshift(1,j))) + return + end + + logical function btest(i,j) + integer i,j + btest = and(i,lshift(1,j)) .ne. 0 + return + end + + integer function iand(i,j) + integer i,j + iand = and(i,j) + return + end + + integer function ior(i,j) + integer i,j + ior = or(i,j) + return + end + + integer function ieor(i,j) + integer i,j + ieor = xor(i,j) + return + end + + integer function ishft(i,j) + integer i,j + if (j .eq. 0) goto 11 + if (j .gt. 0) goto 10 + i=and(i,X'7fffffff') + ishft = rshift(i,-j) + return + 10 ishft = lshift(i,j) + return + 11 ishft = i + return + end + + character function int2char(i) + integer i + int2char=char(i) + return + end + + + diff --git a/sources/pass1/it0.ff b/sources/pass1/it0.ff new file mode 100644 index 0000000..41e6c5e --- /dev/null +++ b/sources/pass1/it0.ff @@ -0,0 +1,1025 @@ +C Loglan82 Compiler&Interpreter +C Copyright (C) 1981-1993 Institute of Informatics, University of Warsaw +C Copyright (C) 1993, 1994 LITA, Pau +C +C This program is free software; you can redistribute it and/or modify +C it under the terms of the GNU General Public License as published by +C the Free Software Foundation; either version 2 of the License, or +C (at your option) any later version. +C +C This program is distributed in the hope that it will be useful, +C but WITHOUT ANY WARRANTY; without even the implied warranty of +C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +C GNU General Public License for more details. File: LICENSE.GNU +C =============================================================== + +c files used by compiler : +c +c unit file description +c +c 13 output sequential (F) listing (.LST) (ML2, ) +c 14 temporary direct (C) code after parser (WAN1, ML2) +c 15 output sequential (C) L-code (.LCD) (WAN1, ML2) +c 16 temporary sequential (C) listing (WAN1, ML2) +c 17 input sequential (C) source (WAN1, ML2) +c 18 temporary sequential (C) L-code (WAN1, AL11) +c 19 temporary direct (C) errors (WAN2, ML2) +c 21 output sequential (C) debugger (WAN1, ML2) +c + subroutine LOGLAN(parlen,parbuf) + integer parlen + character parbuf(1) + IMPLICIT INTEGER (A-Z) +c parlen - dlugosc linii z parametrami dla kompilatora +c parbuf - bufor zawierajacy parametry dla kompilatora +C======================================================================C +C C +C LOGLAN L-COMPILER C +C ================= C +C C +C AUTHORS: C +C C +C DANKA SZCZEPANSKA-WASERSZTRUM C +C MAREK J. LAO C +C ANDRZEJ I. LITWINIUK C +C WOJTEK A. NYKOWSKI C +C C +C IIUW, WARSZAWA, 1982 C +C C +C PORTED TO SIEMENS 7760 BS2000 BY: C +C C +C PAWEL K. GBURZYNSKI C +C MANFRED KRAUSE C +C ANDRZEJ I. LITWINIUK C +C C +C IIPMCAU, KIEL, MAY-JUNE 1984 C +C C +C PORTED TO IBM PC BY C +C Danuta Szczepanska C +C Boleslaw Ciesielski C +C Teresa Przytycka C +C C +C PORTED TO VAX / VMS BY C +C Danuta Szczepanska C +C Andrzej Litwiniuk C +C C +C PORTED TO XENIX SCO BY C +C Pawel Susicki C +C C +C PORTED TO UNIX SCO BY C +C Pawel Susicki C +C C +C PORTED TO SUN SPARC BY C +C Pawel Susicki C +C C +C======================================================================C + IMPLICIT INTEGER (A-Z) + COMMON /BLANK/ C0M(4) , S, ADRES , K + common /mjlmsg/ierc,msg + integer*4 msg +C======================================================================C +C THE FOLLOWING FILE UNITS ARE USED: C +C C +C 1 - INTERACTIVE INPUT FROM THE TERMINAL C +C 2 - INTERACTIVE OUTPUT TO THE TERMINAL C +C 13 - LISTING OUTPUT C +C 14 - WORKING FILE SCRATCH C +C 15 - L-CODE OUTPUT C +C 16 - PARTIAL LISTING FROM PARSER C +C 17 - SOURCE INPUT TO THE COMPILER C +C 18 - AUXILIARY SOURCE INPUT C +C 19 - SCRATCH FILE INCLUDING INFO ABOUT COMPILATION ERRORS C +C======================================================================C +cdsw byte jfname + character jfname, param + + common /par/ param(256),dl, pozopt +c param - line of program parameters +c dl - length of program parameters +c pozopt - options position in param + + common /jf/jfname(72),jf + + call ffputnl(0) + call ffputcs(0,' LOGLAN-82 UNIX Compiler, Version 2.1') + call ffputnl(0) + call ffputcs(0,' January 10, 1993') + call ffputnl(0) + call ffputcs(0,' (C)Copyright Institute of Informatics,') + call ffputcs(0,' University of Warsaw') + call ffputcs(0,' (C)Copyleft LITA Universite de Pau') + call ffputnl(0) + + ierc = 0 + msg = 'it0 ' + do 10 jf=1,70 +10 jfname(jf) = ' ' + do 15 i=1, parlen +15 param(i)=parbuf(i) + dl=parlen + if(dl.ne.0) go to 100 + pozopt = 0 +200 continue +c prompt + + call ffputcs(0,' File name: ') + call ffgets (0,param,70) + + dl = 70 +c file name is in param +100 continue + do 20 pozopt=1,dl + if(param(pozopt).ne.' ') go to 30 + 20 continue + go to 200 + 30 jf = 0 +50 if(param(pozopt).eq.' '.or.param(pozopt).eq.',' .or. + * param(pozopt).eq.';') go to 300 + if (jf.ge.70) go to 40 + jf = jf+1 + jfname(jf) = param(pozopt) + 40 pozopt = pozopt+1 + if(pozopt .le. dl) go to 50 + 300 if (jf.eq.0) go to 200 + 500 continue + CALL DATA3 + CALL DATA + CALL DATA2 + CALL MESS + CALL WAN + END + + + SUBROUTINE DATA3 + IMPLICIT INTEGER (A-Z) +C +C INITIATES THE BLANK COMMON +C FIXES DIVISION OF IPMEM INTO COMPILER TABLES +C +C + LOGICAL INSYS, OWN + COMMON /BLANK/ COM(278), + X LMEM , LPMEM , IRECN , ISFIN , LPMSYS, LPML , LPMF , + X NRINT , NRRE , NRBOOL, NRCHR , NRCOR , NRPROC, NRTEXT, + X NRUNIV, NATTR , NRNONE, NBLSYS, NBLUS , NEMPTY, INSYS , + X LOCAL , OWN , OBJECT, + x IPMEM(5000) +cdsw&bc X IPMEM(50000) +C +C COM - OBSZAR KOMUNIKACYJNY STRUMIENI +C LMEM - (=32000) ROZMIAR CALEJ PAMIECI GLOWNEJ +C LPMEM - PODZIAL PAMIECI NA CZESCI IPMEM I ISMEM +C IRECN - INDEKS SZCZYTU STOSU STALYCH REAL +C ISFIN - INDEKS SZCZYTU SLOWNIKA PROTOTYPOW +C +C LPMSYS - INDEKS PIERWSZEGO SLOWA W IPMEM OBSZARU NIEPRZEZ- +C NACZONEGO NA PROTOTYPY SYSTEMOWE +C LPML - INDEKS PIERWSZEGO SLOWA OBSZARU WOLNEGO W IPMEM +C LPMF - INDEKS OSTATNIEGO SLOWA WOLNEGO OBSZARU W IPMEM +C +C IDENTYFIKATORY PROTOTYPOW SYSTEMOWYCH +C NRINT - IDENTYFIKATOR PROTOTYPU INTEGER +C NRRE - REAL +C NRBOOL - BOOLEAN +C NRCHR - CHARACTER +C NRCOR - COROUTINE +C NRPROC - PROCESS +C NRTEXT - STRING (TEXT) +C NRUNIV - IDENTYFIKATOR PROTOTYPU UNIWERSALNEGO +C NATTR - IDENTYFIKATOR PSEUDO-ATRYBUTU (Z NUMEREM -1) +C NRNONE - IDENTYFIKATOR PROTOTYPU TYPU NONE (UNIWERSALNY +C REFERENCYJNY) +C NBLSYS - IDENTYFIKATOR BLOKU SYSTEMOWEGO +C NBLUS - BLOKU GLOWNEGO UZYTKOWNIKA +C +C INSYS - FLAGA SPOSOBU REZERWACJI (PRZEZ MGETM) PAMIECI +C W IPMEM - .TRUE. JESLI REZERWACJA W CZESCI SYSTE- +C MOWEJ +C LOCAL - FLAGA DOSTEPU DO OBIEKTOW - 2 JESLI OBIEKT +C BYL LOKALNY, 1 - GDY Z SL, 0 - GDY Z BLOKU GLOWNEGO +C OWN - FLAGA DOSTEPU DO OBIEKTOW - .TRUE. JESLI OBIEKT NIE +C POCHODZI Z PREFIKSOW (TYLKO Z WLASCIWEGO OBIEKTU) +C OBJECT - PROTOTYP OBIEKTU, Z KTOREGO POCHODZIL OSTATNIO +C SZUKANY IDENTYFIKATOR (OBIEKT POCHODZACY Z CIAGU SL) +C +C +C IN THIS PLACE THE SIZE OF IPMEM MAY BE REDECLARED; THEN THE +C VARIABLE LMEM (BELOW) SHOULD BE SET TO THE LENGTH OF IPMEM. +C +C +C IPMEM - MAIN MEMORY AREA OF THE COMPILER +C LPML - ADDRESS OF THE FIRST - +C LPMF - ADDRESS OF THE LAST FREE WORD IN IPMEM +C ISFIN - TOP OF THE DICTIONARY OF PROTOTYPES +C LPMEM - DIVISION POINT OF IPMEM +C LMEM - LENGTH OF IPMEM +C + COM(1)=0 + + lmem = LMEMSIZE + lpmem = LPMEMSIZE+1 + + IF (LPMEM.GT.4550) GO TO 1 +C --- SIZE OF IPMEM TOO SMALL + call ffputcs(0,' Fatal Error: Memory overflow ') + call ffputnl(0) + call ffexit +c-- +1 DO 10 I=3738,LMEM +10 IPMEM(I)=0 + +C --- 2 BELOW STANDS FOR THE SIZE OF REAL NUMBER EXPRESSED IN THE +C --- NUMBER OF INTEGERS WHICH COVERS THIS SIZE. +cvax the size of real numbers on vax is 4 bytes ( = the size of integer) +cvax LPML=LPMEM+2 +cdsw lpml - first free place in real constants +cdsw in the future - (lpmem+1) = 0.0, (lpmem+2) = 1.0 + lpml = lpmem + WORDS_IN_REAL + +C +C THE FIRST REAL CONSTANT IS 0.0 +C + LPMF=LMEM + ISFIN=LPMEM-1 + RETURN + END + + SUBROUTINE DATA + IMPLICIT INTEGER (A-Z) +cdsw INTEGER DATAHEX1,DATAHEX2,DATAHEX3 +cdsw DATA DATAHEX1,DATAHEX2,DATAHEX3 /Z802F,Z0000,ZFFFF/ + +C +C INITIATES THE BLANK COMMON +C + DIMENSION X(169),Y(169) + COMMON /BLANK/ + $ C0M(4), + O S, ADRES, K, SCOMA, SDOT, SEMICOL, + 1 SCOLON, SLEFT, SRIGHT, SBECOME, STAR, SRELAT, + 2 SEOF, SIDENT, SCONST, SAND, SARRAY, SARROF, + 3 SATTACH, SBEGIN, SBLOCK, SBOOL, SCALL, SCASE, + 4 SCLASS, SCLOSE, SCONS, SCOPY, SCOROUT, SDETACH, + 5 SDIM, SDO, SDOWN, SELSE, SEND, SESAC, + 6 SEXIT, SEXTERN, SFI, SFOR, SFUNCT, SIF, + 7 SINNER, SINPUT, SINT, SKILL, SLOCK, SNEW, + 8 SNONE, SNOT, SOD, SOR, SORIF, SOTHER, + 9 SOUTPUT, SPREF, SPRCD, SQUA, SREAD, SRESUME, + O SRETURN, STEP, STOP, STAKEN, STHEN, STHIS, + A STO, STYPE, SUNIT, SVAR, SVIRTUAL, SWAIT, + B SWHEN, SWHILE, SWRIT, SWRITLN, STRUE, SALL, + C WAND, WARRAY, WASSIGN, WASSCON, WATTACH, WBLOCK, + D WCALL, WCASE, WCASEL, WCOMA, WCNSTB, WCNSTC, + E WCNSTI, WCNSTN, WCNSTR, WCNST, WCOPY, WDETACH, + F WDOT, WDOWNTO, WEOF, WESAC, WFIN, WFIRST, + G WFOREND, WFORVAR, WFROM, WIDENT, WIFFALS, WIFTRUE + + common /BLANK/ + H WINNER, WINSTREND,WJUMP, WKILL, WLABEL, WLEFT, + I WLOCK, WLOW, WLSE, WNEW, WNEWARRAY,WNOT, + J WOPERAT, WOPT, WOR, WOTHER, WPREF, WPRIM, + K WQUA, WREAD, WRELAT, WRESUME, WRETURN, WRIGHT, + L WSTART, WSTEP, WSTOP, WTHIS, WTO, WAIT, + M WRITE, WRITELN, WBOUND, UNICAL, + N COM(132), + O LMEM, LPMEM, IRECN, ISFIN, LPMSYS, LPML, + P LPMF, NRINT, NRRE, NRBOOL, NRCHAR, NRCOR, + Q NRPROC, NRTEXT, NRUNIV, NATTR, NRNONE, NBLSYS, + R NBLUS, NEMPTY, INSYS, LOCAL, OWN, OBJECT, + S HASH(8000), M, NAME(10), NLAST, NL, + T KEYS(200), + U TRANS1(13,13), TRANS2(13,13), B0, B(70), + V SKOK0, SKOK(70), KK, MM, STAN, STAN1, + W AUX, K1, SY, SY1, NU, JK1, EXP, + X SIGN, INTPART, FRAC, OKEY, FRACT,JK2,NB, + Y TL, BYTE, TEXT(20), + Z TOP, IN, NEXT, STACK(500) + + common /BLANK/ + * RESZTA(3652) + REAL FRACT,NU + EQUIVALENCE (TRANS1(1,1),X(1)) + EQUIVALENCE (TRANS2(1,1),Y(1)) + LOGICAL OKEY +C DATA M,HASH,NAME,NLAST,NL /1009,3000*0,10*0,3001,10/ +c #8027 zmienione na #002F - w zapisie uzupelnieniowym + dathx1 = X'002F' + dathx2 = X'0000' +c #ffff zmienione na -#0001 + dathx3 = -X'0001' + M=1009 +cdsw NLAST=3001 + nlast =8001 + NL=10 +cdsw DO 2 I=1,3000 +cdsw2 HASH(I)=0 + DO 3 I=1,NL +3 NAME(I)=0 +C DATA TRANS2 /1,3,5,8,3,10,10,16,18,1,10,10,20,2,1,1,8,1,14,14,16, +C ,18, +C ,1,14,1,20,1,3,1,9,11,14,14,16,18,1,14,14,20,1,3,6,8,12,14,14,16, +C ,18,1,14,14,20,1,4,7,8,4,15,15,16,18,1,14,14,20,1,3,1,8,13,14,14,16 +C ,,18,1,14,14,20,1,4,7,8,4,15,15,16,18,1,14,14,20,1,3,7,8,3,14,14,16 +C ,,18,1,14,14,20,1,3,6,10,3,14,14,16,18,1,14,14,20,1,3,1,8,3,14,14, +C ,16, +C ,18,1,14,14,20,7*1,17,14*1,19,15*1,21/ +C DATA TRANS1 /1,1,9,5*1,16,17,1,1,1,2,4,4,2,4,2,2,2,16,17,2,4,2,1,5 +C ,,10,1,1,5,5,5,16,17,5,5,5,1,7,11,7,1,7,7,7,16,17,7,7,7,1,5,12,7,5, +C ,15,1,7,16,17,7,7,7,1,6,13,7,1,6,6,6,16,17,6,6,6,1,6,12,7,6,15,1,7, +C ,16,17,7,7,7,1,7,12,7,7,7,7,7,16,17,7,7,7,1,8,11,1,8,8,8,8,16,17,8, +C ,8,8,1,6,14,6,6,6,6,6,16,17,6,6,6,7*3,1,3,3,3,3,3,8*1,17,1,1,1,1, +C ,13*18/ +C DATA B0,B/10*2,4*1,4,21*1,0,0,3,6,5,10,10,7,12,10,11,8*10,9,3*10, +C ,8,11*10/ +C DATA SKOK0,SKOK /47*6,1,2,3,4,4,5,18*6/ +C --- +cdsw C0M(2)=DATAHEX1 +cdsw C0M(3)=DATAHEX2 +cdsw C0M(4)=DATAHEX3 + c0m(2)=dathx1 + c0m(3)=dathx2 + c0m(4)=dathx3 + CALL OPTDEF +C --- + SKOK0=6 + DO 4 I=1,70 +4 SKOK(I)=6 + SKOK(47)=1 + SKOK(48)=2 + SKOK(49)=3 + SKOK(50)=4 + SKOK(51)=4 + SKOK(52)=5 + SIDENT=1 + DO 5 I=1,200 +5 KEYS(I)=0 +C DATA S,ADRES,STAN,K,SY,AUX,EXP,SIGN,INTPART,FRAC /10*0/ + S=0 + ADRES=0 + STAN=0 + K=0 + SY=0 + AUX=0 + EXP=0 + SIGN=0 + INTPART=0 + FRAC=0 +C DATA OKEY,NU /.FALSE.,0.0/ + OKEY=.FALSE. + NU=0.0 + SCONST=1000 + SEOF=70 + SAND=67 + SARRAY=18 + SARROF=81 + SATTACH=11 + SBEGIN=83 + SBLOCK=22 + SBOOL=85 + SCALL=9 + SCASE=16 + SCHAR=71 + SCLASS=86 + SCLOSE=87 + SCONS=88 + SCOPY=69 + SCOROUT=78 + SDETACH=5 + SDIM=89 + SDO=14 + SDOWN=90 + SELSE=62 + SEND=80 + SESAC=91 + SEXIT=15 + SEXTERN=92 + SFI=63 + SFOR=17 + SFUNCT=93 + SIF=2 + SINNER=6 + SINPUT=95 + SINT=64 + SKILL=10 + SLOCK=7 + SNEW=24 + SNONE=1002 + SNOT=66 + SOD=65 + SOR=68 + SORIF=97 + SOTHER=98 + SOUTPUT=99 + SPREF=23 + SPRCD=101 + SQUA=76 + SREAD=8 + SRESUME=12 + SRETURN=4 + STEP=102 + STOP=13 + STAKEN=103 + STHEN=61 + STHIS=74 + STO=104 + STRUE=1001 + STYPE=105 + SUNIT=77 + SVAR=106 + SVIRTUAL=107 + SWAIT=21 + SWHEN=109 + SWHILE=3 + SWRIT=19 + SWRITLN=20 + SCOMA=42 + SDOT=38 + SEMICOL=45 + SCOLON=47 + SLEFT=52 + SRIGHT=53 + SBECOME=54 + STAR=50 + SRELAT=51 +C DATA BYTE,TL,NB,TEXT /64,20,2,20*0/ + BYTE=64 + TL=132 + NB=2 +CBC TEXT(1)=1 + text(1)=2 + + B0=2 + DO 7 I=1,9 +7 B(I)=2 + DO 8 I=10,35 +8 B(I)=1 + B(14)=4 + B(36)=0 + B(37)=0 + B(38)=3 + B(39)=6 + B(40)=5 + B(41)=10 + B(42)=10 + B(43)=7 + B(44)=12 + B(45)=10 + B(46)=11 + DO 9 I=47,54 +9 B(I)=10 + B(55)=9 + B(56)=10 + B(57)=10 + B(58)=10 + B(59)=8 + DO 10 I=60,70 +10 B(I)=10 + CALL DAATA + RETURN + END + + SUBROUTINE DAATA + IMPLICIT INTEGER (A-Z) + DIMENSION X(169),Y(169) + COMMON /BLANK/ + $ C0M(4), + O S, ADRES, K, SCOMA, SDOT, SEMICOL, + 1 SCOLON, SLEFT, SRIGHT, SBECOME, STAR, SRELAT, + 2 SEOF, SIDENT, SCONST, SAND, SARRAY, SARROF, + 3 SATTACH, SBEGIN, SBLOCK, SBOOL, SCALL, SCASE, + 4 SCLASS, SCLOSE, SCONS, SCOPY, SCOROUT, SDETACH, + 5 SDIM, SDO, SDOWN, SELSE, SEND, SESAC, + 6 SEXIT, SEXTERN, SFI, SFOR, SFUNCT, SIF, + 7 SINNER, SINPUT, SINT, SKILL, SLOCK, SNEW, + 8 SNONE, SNOT, SOD, SOR, SORIF, SOTHER, + 9 SOUTPUT, SPREF, SPRCD, SQUA, SREAD, SRESUME, + O SRETURN, STEP, STOP, STAKEN, STHEN, STHIS, + A STO, STYPE, SUNIT, SVAR, SVIRTUAL, SWAIT, + B SWHEN, SWHILE, SWRIT, SWRITLN, STRUE, SALL, + C WAND, WARRAY, WASSIGN, WASSCON, WATTACH, WBLOCK, + D WCALL, WCASE, WCASEL, WCOMA, WCNSTB, WCNSTC, + E WCNSTI, WCNSTN, WCNSTR, WCNST, WCOPY, WDETACH, + F WDOT, WDOWNTO, WEOF, WESAC, WFIN, WFIRST, + G WFOREND, WFORVAR, WFROM, WIDENT, WIFFALS, WIFTRUE + + common /BLANK/ + H WINNER, WINSTREND,WJUMP, WKILL, WLABEL, WLEFT, + I WLOCK, WLOW, WLSE, WNEW, WNEWARRAY,WNOT, + J WOPERAT, WOPT, WOR, WOTHER, WPREF, WPRIM, + K WQUA, WREAD, WRELAT, WRESUME, WRETURN, WRIGHT, + L WSTART, WSTEP, WSTOP, WTHIS, WTO, WAIT, + M WRITE, WRITELN, WBOUND, UNICAL, + N COM(132), + O LMEM, LPMEM, IRECN, ISFIN, LPMSYS, LPML, + P LPMF, NRINT, NRRE, NRBOOL, NRCHAR, NRCOR, + Q NRPROC, NRTEXT, NRUNIV, NATTR, NRNONE, NBLSYS, + R NBLUS, NEMPTY, INSYS, LOCAL, OWN, OBJECT, + S HASH(8000), M, NAME(10), NLAST, NL, + T KEYS(200), + U TRANS1(13,13), TRANS2(13,13), B0, B(70), + V SKOK0, SKOK(70), KK, MM, STAN, STAN1, + W AUX, K1, SY, SY1, NU, JK1, EXP, + X SIGN, INTPART, FRAC, OKEY, FRACT,JK2,NB, + Y TL, BYTE, TEXT(20), + Z TOP, IN, NEXT, STACK(500) + + common /BLANK/ + * RESZTA(3652) + REAL FRACT,NU + EQUIVALENCE(TRANS1(1,1),X(1)) + EQUIVALENCE(TRANS2(1,1),Y(1)) + X( 1)=1 + X( 2)=1 + X(3)=9 + X(4)=1 + X(5)=1 + X(6)=1 + X(7)=1 + X(8)=1 + X(9)=16 + X(10)=17 + X(11)=1 + X(12)=1 + X(13)=1 + X(14)=2 + X(15)=4 + X(16)=4 + X(17)=2 + X(18)=4 + X(19)=2 + X(20)=2 + X(21)=2 + X(22)=16 + X(23)=17 + X(24)=2 + X(25)=4 + X(26)=2 + X(27)=1 + X(28)=5 + X(29)=10 + X(30)=1 + X(31)=1 + X(32)=5 + X(33)=5 + X(34)=5 + X(35)=16 + X(36)=17 + X(37)=5 + X(38)=5 + X(39)=5 + X(40)=1 + X(41)=7 + X(42)=11 + X(43)=7 + X(44)=1 + X(45)=7 + X(46)=7 + X(47)=7 + X(48)=16 + X(49)=17 + X(50)=7 + X(51)=7 + X(52)=7 + X(53)=1 + X(54)=5 + X(55)=12 + X(56)=7 + X(57)=5 + X(58)=15 + X(59)=1 + X(60)=7 + X(61)=16 + X(62)=17 + X(63)=7 + X(64)=7 + X(65)=7 + X(66)=1 + X(67)=6 + X(68)=13 + X(69)=7 + X(70)=1 + X(71)=6 + X(72)=6 + X(73)=6 + X(74)=16 + X(75)=17 + X(76)=6 + X(77)=6 + X(78)=6 + X(79)=1 + X(80)=6 + X(81)=12 + X(82)=7 + X(83)=6 + X(84)=15 + X(85)=1 + X(86)=7 + X(87)=16 + X(88)=17 + X(89)=7 + X(90)=7 + X(91)=7 + X(92)=1 + X(93)=7 + X(94)=12 + X(95)=7 + X(96)=7 + X(97)=7 + X(98)=7 + X(99)=7 + X(100)=16 + X(101)=17 + X(102)=7 + X(103)=7 + X(104)=7 + X(105)=1 + X(106)=8 + X(107)=11 + X(108)=1 + X(109)=8 + X(110)=8 + X(111)=8 + X(112)=8 + X(113)=16 + X(114)=17 + X(115)=8 + X(116)=8 + X(117)=8 + X(118)=1 + X(119)=6 + X(120)=14 + X(121)=6 + X(122)=6 + X(123)=6 + X(124)=6 + X(125)=6 + X(126)=16 + X(127)=17 + X(128)=6 + X(129)=6 + X(130)=6 + DO 13 I=131,143 +13 X(I)=3 + X(138)=1 + DO 14 I=144,156 +14 X(I)=1 + X(152)=17 + DO 15 I=157,169 +15 X(I)=18 + Y(1)=1 + Y(2)=3 + Y(3)=5 + Y(4)=8 + Y(5)=3 + Y(6)=10 + Y(7)=10 + Y(8)=16 + Y(9)=18 + Y(10)=1 + Y(11)=10 + Y(12)=10 + Y(13)=20 + Y(14)=2 + Y(15)=1 + Y(16)=1 + Y(17)=8 + Y(18)=1 + Y(19)=14 + Y(20)=14 + Y(21)=16 + Y(22)=18 + Y(23)=1 + Y(24)=14 + Y(25)=1 + Y(26)=20 + Y(27)=1 + Y(28)=3 + Y(29)=1 + Y(30)=9 + Y(31)=11 + Y(32)=14 + Y(33)=14 + Y(34)=16 + Y(35)=18 + Y(36)=1 + Y(37)=14 + Y(38)=14 + Y(39)=20 + Y(40)=1 + Y(41)=3 + Y(42)=6 + Y(43)=8 + Y(44)=12 + Y(45)=14 + Y(46)=14 + Y(47)=16 + Y(48)=18 + Y(49)=1 + Y(50)=14 + Y(51)=14 + Y(52)=20 + Y(53)=1 + Y(54)=4 + Y(55)=7 + Y(56)=8 + Y(57)=4 + Y(58)=15 + Y(59)=15 + Y(60)=16 + Y(61)=18 + Y(62)=1 + Y(63)=14 + Y(64)=14 + Y(65)=20 + Y(66)=1 + Y(67)=3 + Y(68)=1 + Y(69)=8 + Y(70)=13 + Y(71)=14 + Y(72)=14 + Y(73)=16 + Y(74)=18 + Y(75)=1 + Y(76)=14 + Y(77)=14 + Y(78)=20 + Y(79)=1 + Y(80)=4 + Y(81)=7 + Y(82)=8 + Y(83)=4 + Y(84)=15 + Y(85)=15 + Y(86)=16 + Y(87)=18 + Y(88)=1 + Y(89)=14 + Y(90)=14 + Y(91)=20 + Y(92)=1 + Y(93)=3 + Y(94)=7 + Y(95)=8 + Y(96)=3 + Y(97)=14 + Y(98)=14 + Y(99)=16 + Y(100)=18 + Y(101)=1 + Y(102)=14 + Y(103)=14 + Y(104)=20 + Y(105)=1 + Y(106)=3 + Y(107)=6 + Y(108)=10 + Y(109)=3 + Y(110)=14 + Y(111)=14 + Y(112)=16 + Y(113)=18 + Y(114)=1 + Y(115)=14 + Y(116)=14 + Y(117)=20 + Y(118)=1 + Y(119)=3 + Y(120)=1 + Y(121)=8 + Y(122)=3 + Y(123)=14 + Y(124)=14 + Y(125)=16 + Y(126)=18 + Y(127)=1 + Y(128)=14 + Y(129)=14 + Y(130)=20 + DO 50 I=131,168 +50 Y(I)=1 + Y(138)=17 + Y(153)=19 + Y(169)=21 + RETURN + END + + SUBROUTINE OPTDEF + IMPLICIT INTEGER (A-Z) +C --- READS INPUT PARAMETERS; APPROPRIATELY MODIFIES OPTION WORD + COMMON /BLANK/ + $ C0M(4), + O S, ADRES, K, SCOMA, SDOT, SEMICOL, + 1 SCOLON, SLEFT, SRIGHT, SBECOME, STAR, SRELAT, + 2 SEOF, SIDENT, SCONST, SAND, SARRAY, SARROF, + 3 SATTACH, SBEGIN, SBLOCK, SBOOL, SCALL, SCASE, + 4 SCLASS, SCLOSE, SCONS, SCOPY, SCOROUT, SDETACH, + 5 SDIM, SDO, SDOWN, SELSE, SEND, SESAC, + 6 SEXIT, SEXTERN, SFI, SFOR, SFUNCT, SIF, + 7 SINNER, SINPUT, SINT, SKILL, SLOCK, SNEW, + 8 SNONE, SNOT, SOD, SOR, SORIF, SOTHER, + 9 SOUTPUT, SPREF, SPRCD, SQUA, SREAD, SRESUME, + O SRETURN, STEP, STOP, STAKEN, STHEN, STHIS, + A STO, STYPE, SUNIT, SVAR, SVIRTUAL, SWAIT, + B SWHEN, SWHILE, SWRIT, SWRITLN, STRUE, SALL, + C WAND, WARRAY, WASSIGN, WASSCON, WATTACH, WBLOCK, + D WCALL, WCASE, WCASEL, WCOMA, WCNSTB, WCNSTC, + E WCNSTI, WCNSTN, WCNSTR, WCNST, WCOPY, WDETACH, + F WDOT, WDOWNTO, WEOF, WESAC, WFIN, WFIRST, + G WFOREND, WFORVAR, WFROM, WIDENT, WIFFALS, WIFTRUE + + common /BLANK/ + H WINNER, WINSTREND,WJUMP, WKILL, WLABEL, WLEFT, + I WLOCK, WLOW, WLSE, WNEW, WNEWARRAY,WNOT, + J WOPERAT, WOPT, WOR, WOTHER, WPREF, WPRIM, + K WQUA, WREAD, WRELAT, WRESUME, WRETURN, WRIGHT, + L WSTART, WSTEP, WSTOP, WTHIS, WTO, WAIT, + M WRITE, WRITELN, WBOUND, UNICAL, + N COM(132), + O LMEM, LPMEM, IRECN, ISFIN, LPMSYS, LPML, + P LPMF, NRINT, NRRE, NRBOOL, NRCHAR, NRCOR, + Q NRPROC, NRTEXT, NRUNIV, NATTR, NRNONE, NBLSYS, + R NBLUS, NEMPTY, INSYS, LOCAL, OWN, OBJECT, + S HASH(8000), M, NAME(10), NLAST, NL, + T KEYS(200), + U TRANS1(13,13), TRANS2(13,13), B0, B(70), + V SKOK0, SKOK(70), KK, MM, STAN, STAN1, + W AUX, K1, SY, SY1, NU, EXP, + X SIGN, INTPART, FRAC, OKEY, FRACT, NB, + Y TL, BYTE, TEXT(20), + Z TOP, IN, NEXT, STACK(500) + + common /BLANK/ + * RESZTA(3652) + + character param + common /par/ param(256),dl, pozopt +c param - line of program parameters +c dl - length of program parameters +c pozopt - options position in param +C +C + ext = 0 + if(pozopt .gt.dl .or. dl .eq. 0) go to 1000 + 80 k = pozopt + do 101 pozopt = k,dl + if(param(pozopt).ne.' ') go to 102 +101 continue + go to 1000 +102 if ( ext .eq. 1) go to 105 + ext = 1 + if(param(pozopt).eq.';') go to 9999 + if(param(pozopt) .ne.',') go to 105 + pozopt = pozopt+1 + go to 80 +105 i = 0 + do 103 k = pozopt, dl + if(i.ge.70) go to 107 + i = i+1 + 103 skok(i) = ichar(param(k)) + 107 i = i+1 + do 112 k = i,70 + 112 skok(k) = 0 + go to 2000 +1000 continue + +cvax ------added +cps write(*,1) +cps1 format ( +cps * ' Specify compilation options : (default = D-S-L-O+T+M+I+)'$) + +cps 3 do 111 k=1,70 +cps111 skok(k) = 0 +cps read (*,2) skok +cps2 format(70a1) + 2000 continue + K=1 +C +10 znak = iand(X'ff', skok(k)) + K=K+1 + IF (ZNAK.EQ.ICHAR(' ')) GO TO 10 + IF (ZNAK.EQ.ICHAR(',')) GO TO 10 + IF (ZNAK.EQ.0) GOTO 9999 +C +20 sign = iand(X'ff', skok(k)) + K=K+1 + IF (SIGN.EQ.ICHAR(' ')) GOTO 20 + IF (SIGN.EQ.ICHAR('+')) GOTO 30 + IF (SIGN.EQ.ICHAR('-')) GOTO 30 +C --- BAD OPTION +29 call ffputcs(0,' Bad option - ignored') + call ffputnl(0) + go to 9999 +30 IF (ZNAK.GT.ICHAR('Z')) ZNAK = ZNAK-32 +C IF (ZNAK.EQ.ICHAR('C')) GOTO 670 + IF (ZNAK.EQ.ICHAR('D')) GOTO 680 +C IF (ZNAK.EQ.ICHAR('F')) GOTO 700 +cdsw IF (ZNAK.EQ.ICHAR('I')) GOTO 730 + IF (ZNAK.EQ.ICHAR('L')) GOTO 760 +cdsw IF (ZNAK.EQ.ICHAR('M')) GOTO 770 + IF (ZNAK.EQ.ICHAR('O')) GOTO 790 +C --- IF (ZNAK.EQ.ICHAR('P')) GOTO 800 +cdeb + IF (ZNAK.EQ.ICHAR('S')) GOTO 830 +cdeb + IF (ZNAK.EQ.ICHAR('T')) GOTO 840 + if (znak.eq.ichar('H')) go to 620 + GOTO 29 +c opcja 'H' - duza pamiec +c rozpoznano 'H' +620 continue +#if ! ( DISABLE_H == 1 ) + if(sign.eq.ichar('+')) go to 625 + c0m(4) = ibclr(c0m(4),12) + go to 10 +625 c0m(3) = ibset(c0m(3),12) +#endif + go to 10 +C ROZPOZNANO 'C' +C ****** "ROZPOZNANO" MEANS "RECOGNIZED" +C 670 IF (SIGN.EQ.ICHAR('+')) GO TO 675 +C C0M(4)=IBCLR(C0M(4),5) +C GOTO 10 +C 675 C0M(3)=IBSET(C0M(3),5) +C GOTO 10 +C ROZPOZNANO 'D' +680 IF (SIGN.EQ.ICHAR('+')) GO TO 685 + C0M(4)=IBCLR(C0M(4),4) + GOTO 10 +685 C0M(3)=IBSET(C0M(3),4) + GOTO 10 +C ROZPOZNANO 'F' +C 700 IF (SIGN.EQ.ICHAR('+')) GOTO 705 +C C0M(4)=IBCLR(C0M(4),6) +C GOTO 10 +C 705 C0M(3)=IBSET(C0M(3),6) +C GOTO 10 +C ROZPOZNANO 'I' +C 730 IF (SIGN.EQ.ICHAR('+')) GOTO 735 +C C0M(4)=IBCLR(C0M(4),2) +C GOTO 10 +C 735 C0M(3)=IBSET(C0M(3),2) +C GOTO 10 +C ROZPOZNANO 'L' +760 IF (SIGN.EQ.ICHAR('+')) GOTO 765 + C0M(4)=IBCLR(C0M(4),15) + GOTO 10 +765 C0M(3)=IBSET(C0M(3),15) + GOTO 10 +C ROZPOZNANO 'M' +C 770 IF (SIGN.EQ.ICHAR('+')) GOTO 775 +C C0M(4)=IBCLR(C0M(4),0) +C GOTO 10 +C 775 C0M(3)=IBSET(C0M(3),0) +C GOTO 10 +C ROZPOZNANO 'O' +790 IF (SIGN.EQ.ICHAR('+')) GOTO 795 + C0M(4)=IBCLR(C0M(4),1) + GOTO 10 +795 C0M(3)=IBSET(C0M(3),1) + GOTO 10 +C ROZPOZNANO 'P' +C 800 IF (SIGN.EQ.ICHAR('+')) GOTO 805 +C C0M(4)=IBCLR(C0M(4),14) +C GOTO 10 +C 805 C0M(3)=IBSET(C0M(3),14) +C GOTO 10 +cdeb added +C ROZPOZNANO 'S' + 830 IF (SIGN.EQ.ICHAR('+')) GOTO 835 + C0M(4)=IBCLR(C0M(4),13) + GOTO 10 + 835 C0M(3)=IBSET(C0M(3),13) + GOTO 10 +cdeb +C ROZPOZNANO 'T' +840 IF (SIGN.EQ.ICHAR('+')) GOTO 845 + C0M(4)=IBCLR(C0M(4),3) + GOTO 10 +845 C0M(3)=IBSET(C0M(3),3) + GOTO 10 +9999 C0M(2)=IOR(C0M(3),IAND(C0M(4),C0M(2))) + + call ffputnl(0) + call ffputcs(0,' Pass One') + call ffputnl(0) + call ffputnl(0) + + RETURN + END + + SUBROUTINE MESS +C----------------DISPLAYS END-OF-PASS INFORMATION + IMPLICIT INTEGER (A-Z) +C +#include "blank.h" + COMMON /MJLMSG/ IERC, MSG + integer*4 msg +C --- + IOP(1) = IOP(1)+1 + IF (IERC .EQ. 0) RETURN +C --- + IF (IOP(1).LE.7) RETURN +C --- + END + diff --git a/sources/pass1/it1.ff b/sources/pass1/it1.ff new file mode 100644 index 0000000..736170d --- /dev/null +++ b/sources/pass1/it1.ff @@ -0,0 +1,1892 @@ +C Loglan82 Compiler&Interpreter +C Copyright (C) 1981-1993 Institute of Informatics, University of Warsaw +C Copyright (C) 1993, 1994 LITA, Pau +C +C This program is free software; you can redistribute it and/or modify +C it under the terms of the GNU General Public License as published by +C the Free Software Foundation; either version 2 of the License, or +C (at your option) any later version. +C +C This program is distributed in the hope that it will be useful, +C but WITHOUT ANY WARRANTY; without even the implied warranty of +C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +C GNU General Public License for more details. File: LICENSE.GNU +C =============================================================== + + subroutine it1 +C--------------LACZNIK 1------------------------------- +C - PRZESYLA CZESC INFORMACJI ZE SCANNERA NA PLIKI +C - INICJUJE ZMIENNE DLA POTRZEB ANALIZY DEKLARACJI +C I POZNIEJSZYCH PRZEBIEGOW +C - SORTUJE TOPOLOGICZNIE DEKLARACJE TYPOW +C +C OPIS W DOKUMENTACJI: D.I.2 +C WERSJA Z DNIA: 19.01.82 +C DLUGOSC KODU: 116 +C........................................................... +C + IMPLICIT INTEGER (A-Z) +C INSERTION OF + LOGICAL BTEST +C BECAUSE OF TYPECONFLICT 03.01.84 +C+ +C- +CALL STREAM + LOGICAL ERRFLG + COMMON /STREAM/ ERRFLG, LINE, IBUF2(265), IBUF3(7),JUNK(260) +CALL BLANK + LOGICAL INSYS, OWN + COMMON /BLANK/ COM(278), + X LMEM , LPMEM , IRECN , ISFIN , LPMSYS, LPML , LPMF , + X NRINT , NRRE , NRBOOL, NRCHR , NRCOR , NRPROC, NRTEXT, + X NRUNIV, NATTR , NRNONE, NBLSYS, NBLUS , NEMPTY, INSYS , + X LOCAL , OWN , OBJECT, + X IPMEM(5000) + integer*4 msg + COMMON /MJLMSG/ IERC, MSG +CALL # + LOGICAL SYSPP +cdsw COMMON /SYSPP/ SYSPP + common /sysppc/ syspp + + +cdeb ----------- added ---------------------- +c new common blockfor the debugger + common /debug/ deb,breakt(500),brnr,maxbr + logical deb +c deb = true - compilation with the debugger +c breakt - array of static break points +c brnr - index in breakt +c maxbr - maximal number of static break points +cdeb ---------------------------------------- + +C +cdsw DATA IDENT /4HIT1 / +C + IERC = 0 + MSG = 'it1 ' +C ---ZBADANIE, CZY MA BYC DZIALANIE W OTOCZENIU SYSPP + SYSPP = BTEST(COM(3), 14) +C*********** SCIAGNIECIE BUFOROW PLIKOW +C --- BUFFERS NEED NOT BE FETCHED IN THE 'ONE-OVERLAY' VERSION +C CALL MGTBUF + NEMPTY = 0 + CALL APARS +C*********** INICJALIZACJA ZMIENNYCH GLOBALNYCH + IPMEM(ISFIN-8) = COM(2) + LPMF = ISFIN -9 +C + LPML = 1 + COM(4) = LPMEM + INSYS = .TRUE. +C*********** INICJALIZACJA PROTOTYPOW SYSTEMOWYCH + CALL INIT +C*********** SORTOWANIE TOPOLOGICZNE TYPOW + I = LPMEM +C...........POBRANIE ELEMENTU ZE SLOWNIKA + 100 PROT = IPMEM(I) +C ... PROT - PROTOTYP, KTOREGO DEKLARACJE SA SORTOWANE + IF (PROT.NE. 0) CALL TORD(PROT) + I = I-1 + IF (I .GE. ISFIN) GOTO 100 +C************ PRZESLANIE BUFOROW +C --- BUFFERS NEED NOT BE SENT IN THE 'ONE-OVERLAY' VERSION +C CALL MPTBUF + CALL MESS + IF (SYSPP) CALL MPPMES +cdeb CALL DSW +cdeb ------------- added --------------- + if(deb.and..not.errflg) go to 1000 + call dsw + return +1000 call ts1 +cdeb ----------------------------------- + END + + + SUBROUTINE MPPMES +C------------------DRUKUJE INFORMACJE O PRZYLACZENIU BIBLIOTEKI SYSPP + IMPLICIT INTEGER(A-Z) +CALL STREAM +CALL # + call ffputspaces(6,10) + call ffputcs(6,'-- SYSPP LIBRARY ADDED') + call ffputnl(6) + RETURN + END + + + SUBROUTINE APARS +C---------------PRZESYLA TABLICE HASH-U SCANNERA NA STRUMIEN SC +C DO POCZATKOWYCH BLOKOW +C +C OPIS W DOKUMENTACJI: D.I.3 +C WERSJA Z DNIA: 19.01.82 +C DLUGOSC KODU: 338 +C............................................................. + IMPLICIT INTEGER (A-Z) +C +CALL BLANK + LOGICAL INSYS, OWN + COMMON /BLANK/ COM(278), + X LMEM , LPMEM , IRECN , ISFIN , LPMSYS, LPML , LPMF , + X NRINT , NRRE , NRBOOL, NRCHR , NRCOR , NRPROC, NRTEXT, + X NRUNIV, NATTR , NRNONE, NBLSYS, NBLUS , NEMPTY, INSYS , + X LOCAL , OWN , OBJECT, + x hash(8000) +cdsw X IPMEM(5000) +CALL STREAM + LOGICAL ERRFLG + COMMON /STREAM/ ERRFLG, LINE, IBUF2(265), IBUF3(7),JUNK(260) + +CALL # +C +C------PRZEWINIECIE STRUMIENIA SC + CALL SEEK(IBUF3, 0) +C------PRZEPISANIE BLOKOW TWORZACYCH TABLICE HASH-U +cdsw ---------------------- +c dodane przepisywanie tablicy hash2 + do 100 i=1,8000,256 + call put (ibuf3,hash(i)) +100 continue + RETURN + END + SUBROUTINE INIT +C--------------INICJALIZACJA PROTOTYPOW SYSTEMOWYCH +C +C OPIS W DOKUMENTACJI: D.I.4 +C WERSJA Z DNIA: 19.01.82 +C DLUGOSC KODU: 1079 +C............................................................... +C + IMPLICIT INTEGER (A-Z) +CALL BLANK + LOGICAL INSYS, OWN + COMMON /BLANK/ COM(278), + X LMEM , LPMEM , IRECN , ISFIN , LPMSYS, LPML , LPMF , + X NRINT , NRRE , NRBOOL, NRCHR , NRCOR , NRPROC, NRTEXT, + X NRUNIV, NATTR , NRNONE, NBLSYS, NBLUS , NEMPTY, INSYS , + X LOCAL , OWN , OBJECT, + X IPMEM(5000) +CALL # + logical btest + LOGICAL SYSPP +cdsw COMMON /SYSPP/ SYSPP + common /sysppc/syspp +C +C.....NAZWY HASH-U ZE SCANNERA +C#F + COMMON /HNAMES/ INTNM, RENM, BOOLNM, CHRNM, CORNM, + X PROCNM, TEXTNM, FILENM + +C + common /option/opt + + common /prefs/lprefs +c lprefs - ostatnio przydzielony numer w prefixset + +c grpref - numer prefiksu klasy IIUWGRAPH +c mousepref - numer prefiksu klasy MOUSE + +c system class prototypes: + common /syspro/prgraph, prmouse +c prgraph - prototype of IIUWGRAPH +c prmouse - prototype of MOUSE + +cdsw DATA INTNM,RENM,BOOLNM,CHRNM,CORNM,PROCNM,TEXTNM,FILENM +cdsw X /24,40,8,16,2919,2785,48,56/ +C NATTR - ATRYBUT "-1" (1 SLOWO, 2 DOMYSLNE) +cdsw DATA INHEX1,INHEX2,INHEX3,INHEX4,INHEX5,INHEX6,INHEX7,INHEX8, +cdsw XINHEX9,INHEX10,INHEX11,INHEX12,INHEX13,INHEX14,INHEX15,XX +cdsw X/Z0008,Z8008,Z000A,Z000B,ZC007,ZC005,Z000C,Z0004,ZC00E,Z8051, +cdsw X Z8061,Z0051,Z0061,ZC061,ZC051,Z0004/ +cdsw -------------------------------------------------------------- +c #8008 --> -#7ff8, #c007 --> -#3ff9, #c005 --> -#3ffb, +c #c00e --> -#3ff2, #8051 --> -#7faf, #8061 --> -#7f9f, +c #c061 --> -#3f9f, #c051 --> -#3faf + data inhex1,inhex2,inhex3,inhex4,inhex5,inhex6,inhex7,inhex8, + * inhex9,inhx10,inhx11,inhx12,inhx13,inhx14,inhx15,xx + */x'0008',-x'7ff8', x'000a',x'000b', + *-x'3ff9',-x'3ffb', x'000c',x'0004', + *-x'3ff2',-x'7faf',-x'7f9f',x'0051', + * x'0061',-x'3f9f',-x'3faf',x'0004'/ +cdeb ------------------- added ---------------- + data inhx16, inhx17,inhx18 / x'0091', x'8091', x'c091' / +cdeb ---------------------------------------- + + intnm=24 + renm=40 + boolnm = 8 + chrnm = 16 + cornm = 2919 + procnm = 2785 + textnm = 48 + filenm = 56 + +cdsw ---------------------------------------------------------------- + NATTR = LPML+2 + IPMEM(LPML) = -1 + LPML = LPML+1 +C +C NRINT + NRINT = MGETM(3, 41) + IPMEM(NRINT) = INHEX1 +C NRRE + NRRE = MGETM(3,41) + IPMEM(NRRE) = INHEX2 +C +C NRBOOL + NRBOOL = MGETM(3, 41) + IPMEM(NRBOOL) = INHEX3 +C +C NRCHR + NRCHR = MGETM (3, 41) + IPMEM(NRCHR) = INHEX3 +C#F +C +C NRFILE + NRFILE = MGETM(3, 41) + IPMEM(NRFILE) = INHEX4 +C +C NRCOR + NRCOR = MGETM(9, 41) + 7 + IPMEM(NRCOR) = INHEX5 +C NUMER W ZBIORZE PREFIKSOW ORAZ SLOWO Z TEGO ZBIORU + IPMEM(NRCOR-1) = 0 + CALL MSETB(NRCOR, 0) + CALL MSETB(NRCOR, 2) +C +C NRPROC + NRPROC = MGETM(9, 41) + 7 + IPMEM(NRPROC) = INHEX6 + IPMEM(NRPROC-6) = 1 + CALL MSETB(NRPROC, 0) + CALL MSETB(NRPROC, 1) + CALL MSETB(NRPROC, 2) +C +C NRTEXT + NRTEXT = MGETM(3, 41) + IPMEM(NRTEXT) = INHEX7 +C +C NRUNIV + NRUNIV = MGETM(9, 41) + 7 + IPMEM(NRUNIV) = INHEX8 + IPMEM(NRUNIV-6) = 2 + IPMEM(NRUNIV-5) = XX + IPMEM(NRUNIV-4) = XX + IPMEM(NRUNIV-3) = XX +C +C NRNONE + NRNONE = MGETM(9, 41) + 7 + IPMEM(NRNONE) = INHEX9 + IPMEM(NRNONE-6) = 2 + CALL MSETB(NRNONE, 2) +C +cdsw +c stala intsize + wrds1 = mgetm(6, 41)+4 + ipmem(wrds1-3) = nrint + ipmem(wrds1+1) = 1 + ipmem(wrds1) = X'0081' +#if ( WSIZE == 4 ) + i = 4 +#else + i = 2 +#endif + if( btest(opt,12) ) i = 4 + ipmem(wrds1-1) = i +c stala realsize + wrds2 = mgetm(6, 41)+4 + ipmem(wrds2-3) = nrint + ipmem(wrds2+1) = 1 + ipmem(wrds2) = X'0081' + i = 4 + if( btest(opt,12) ) i = 8 + ipmem(wrds2-1) = i + +C +C......INICJALIZACJA BLOKU SYSTEMOWEGO + NBLSYS = MGETM(21, 41) + 2 + IPMEM(NBLSYS) = 1 + IPMEM(NBLSYS+3) = 2 +C USTAWIENIE SL DLA COROUTINE I PROCESS + IPMEM(NRCOR-1) = NBLSYS + IPMEM(NRPROC-1) = NBLSYS + +C inicjalizacja lprefs + lprefs = 2 +C +C......INICJALIZACJA FUNKCJI I PROCEDUR STANDARDOWYCH +C ...PARAMETRY - ICH OPISY +C INPR - INPUT REAL + INPR = MGETM(6,41)+4 + IPMEM(INPR-3) = NRRE + IPMEM(INPR+1) = 1 + IPMEM(INPR) = INHX10 +C OUTPR - OUTPUT REAL (I RESULT) + OUTPR = MGETM(6,41)+4 + IPMEM(OUTPR-3) = NRRE + IPMEM(OUTPR+1) = 1 + IPMEM(OUTPR) = INHX11 +C INPI - INPUT INTEGER + INPI = MGETM(6, 41) +4 + IPMEM(INPI-3) = NRINT + IPMEM(INPI+1) = 1 + IPMEM(INPI) = INHX12 +C OUTPI - OUTPUT INTEGER (I RESULT) + OUTPI = MGETM(6, 41) +4 + IPMEM(OUTPI-3) = NRINT + IPMEM(OUTPI+1) = 1 + IPMEM(OUTPI) = INHX13 +C INPCH - INPUT CHARACTER + INPCH = MGETM(6, 41) +4 + IPMEM(INPCH-3) = NRCHR + IPMEM(INPCH+1) = 1 + IPMEM(INPCH) = INHX12 +C OUTPCH - OUTPUT CHARACTER (I RESULT) + OUTPCH = MGETM(6, 41) +4 + IPMEM(OUTPCH-3) = NRCHR + IPMEM(OUTPCH+1) = 1 + IPMEM(OUTPCH) = INHX13 +C OUTPB - OUTPUT BOOLEAN (I RESULT) + OUTPB = MGETM(6, 41) +4 + IPMEM(OUTPB-3) = NRBOOL + IPMEM(OUTPB+1) = 1 + IPMEM(OUTPB) = INHX13 +C OUTACH - OUTPUT ARRAYOF CHAR (I RESULT) + OUTACH = MGETM(6, 41) +4 + IPMEM(OUTACH-4) = 1 + IPMEM(OUTACH-3) = NRCHR + IPMEM(OUTACH+1) = 1 + IPMEM(OUTACH) = INHX14 +C#F NOWE OPISY PARAMETROW DLA PLIKOW +C INPF - INPUT FILE + INPF = MGETM(6, 41) + 4 + IPMEM(INPF - 3) = NRFILE + IPMEM(INPF+1) = 1 + IPMEM(INPF) = INHX15 +C INPTX - INPUT TEXT (=STRING) + INPTX = MGETM(6, 41) + 4 + IPMEM(INPTX-3) = NRTEXT + IPMEM(INPTX+1) = 1 + IPMEM(INPTX) = INHX12 +C INPARI - INPUT ARRAYOF INTEGER + INPARI = MGETM(6, 41) + 4 + IPMEM(INPARI-4) = 1 + IPMEM(INPARI-3) = NRINT + IPMEM(INPARI+1) = 1 + IPMEM(INPARI) = INHX15 +cdsw --------------- for exec--- +c inparch - input arrayof char + inparch = mgetm(6,41)+4 + ipmem(inparch) = inhx15 + ipmem(inparch+1) = 1 + ipmem(inparch-3) = nrchr + ipmem(inparch-4) = 1 +c +c +cdeb --------------- added ------------ +c inoui - inout integer + inoui = mgetm(6,41)+4 + ipmem(inoui-3) = nrint + ipmem(inoui+1) = 1 + ipmem(inoui) = inhx16 + +c inour - inout real + inour = mgetm(6,41)+4 + ipmem(inour-3) = nrre + ipmem(inour+1) = 1 + ipmem(inour) = inhx17 + +c inouari - inout arrayof integer + inouari = mgetm(6,41)+4 + ipmem(inouari-4) = 1 + ipmem(inouari-3) = nrint + ipmem(inouari+1) = 1 + ipmem(inouari) = inhx18 +cdeb ------------------------------- +C +C ...LISTY PARAMETROW FORMALNYCH +C FPL1 - (INPUT REAL): REAL + FPL1 = MGETM(2, 41) + IPMEM(FPL1) = INPR + IPMEM(FPL1+1) = OUTPR +C FPL2 - (INPUT INTEGER, INPUT INTEGER, INPUT INTEGER): INTEGER + FPL2 = MGETM(4, 41) + IPMEM(FPL2) = INPI + IPMEM(FPL2+1) = INPI + IPMEM(FPL2+2) = INPI + IPMEM(FPL2+3) = OUTPI +C FPL3 - (INPUT REAL): INTEGER + FPL3 = MGETM(2, 41) + IPMEM(FPL3) = INPR + IPMEM(FPL3+1) = OUTPI +C FPL4 - :BOOLEAN + FPL4 = MGETM(1, 41) + IPMEM(FPL4) = OUTPB +C +C FPL5 - (INPUT INTEGER): CHARACTER + FPL5 = MGETM(2, 41) + IPMEM(FPL5) = INPI + IPMEM(FPL5+1) = OUTPCH +C +C FPL6 - (INPUT CHARACTER): INTEGER + FPL6 = MGETM(2, 41) + IPMEM(FPL6) = INPCH + IPMEM(FPL6+1) = OUTPI +C +C FPL7 - (OUTPUT INTEGER, INTEGER, INTEGER) + FPL7 = MGETM(3, 41) + IPMEM(FPL7) = OUTPI + IPMEM(FPL7+1) = OUTPI + IPMEM(FPL7+2) = OUTPI +C FPL8 - (INPUT TEXT, OUTPUT ARRAY OF CHAR) + FPL8 = MGETM(2, 41) + IPMEM(FPL8) = INPTX + IPMEM(FPL8+1) = OUTACH +C#F NOWE LISTY DLA PLIKOW +C +C FPL9 - (INPUT FILE, INPUT INTEGER, INPUT ARRAYOF INTEGER) + FPL9 = MGETM(3, 41) + IPMEM(FPL9) = INPF + IPMEM(FPL9+1) = INPI + IPMEM(FPL9+2) = INPARI +C +C FPL10 - (INPUT FILE, INPUT TEXT) + FPL10 = MGETM(2, 41) + IPMEM(FPL10) = INPF + IPMEM(FPL10+1) = INPTX + +cdeb ------------ added -------------- +c fpl11 - (input integer, inout arrayof integer, integer, +c arrayof integer, real, integer) + fpl11 = mgetm(6,41) + ipmem(fpl11) = inpi + ipmem(fpl11+1) = inouari + ipmem(fpl11+2) = inoui + ipmem(fpl11+3) = inouari + ipmem(fpl11+4) = inour + ipmem(fpl11+5) = inoui + +c fpl12 - (input integer, inout integer, integer,arrayof integer) + fpl12 = mgetm(4,41) + ipmem(fpl12) = inpi + ipmem(fpl12+1) = inoui + ipmem(fpl12+2) = inoui + ipmem(fpl12+3) = inouari + +c fpl18 - (input file,file) + fpl18 = mgetm(2,41) + ipmem(fpl18) = inpf + ipmem(fpl18+1) = inpf +cdeb -------------------------------- +cdsw ---------- for exec ------ +c fpl13 - (input arrayof char, input arrayof char):integer + fpl13 = mgetm(2,41) + ipmem(fpl13) = inparch + ipmem(fpl13+1) = outpi +c fpl14 - input file, input integer, input integer + fpl14 = mgetm(3,41) + ipmem(fpl14) = inpf + ipmem(fpl14+1) = inpi + ipmem(fpl14+2) = inpi +c fpl15 - input integer, input integer, input integer, input integer + fpl15 = mgetm(4,41) + ipmem(fpl15) = inpi + ipmem(fpl15+1) = inpi + ipmem(fpl15+2) = inpi + ipmem(fpl15+3) = inpi +c fpl16 - input file, output integer + fpl16 = mgetm(2,41) + ipmem(fpl16) = inpf +#if ( WSIZE == 4 ) + ipmem(fpl16+1) = outpi +#else +CPS - pozycja w pliku : REAL ??? ! + ipmem(fpl16+1) = outpr +#endif + + +C ...PROTOTYPY FUNKCJI STANDARDOWYCH I ICH WLACZENIE DO LISTY HASHU +C INOT: FUNCTION(INPUT X: INTEGER) : INTEGER + CALL MSTAFP(2613, FPL2+2, 2, 0, NRINT, OUTPI, -1, nblsys) +C IOR: FUNCTION (INPUT X: INTEGER INPUT Y: INTEGER): INTEGER + CALL MSTAFP(335, FPL2+1, 3, 0, NRINT, OUTPI, -2, nblsys) +C IAND: FUNCTION (INPUT X: INTEGER INPUT Y: INTEGER): INTEGER + CALL MSTAFP(307, FPL2+1, 3, 0, NRINT, OUTPI, -3, nblsys) +C ISHFT: FUNCTION (INPUT X: INTEGER INPUT Y: INTEGER): INTEGER + CALL MSTAFP(2605, FPL2+1, 3, 0, NRINT, OUTPI, -4, nblsys) +C EOF: FUNCTION: BOOLEAN +cfile CALL MSTAFP(1841, FPL4, 1, 0, NRBOOL, OUTPB, 39, nblsys) +C ENTIER: FUNCTION (INPUT X: REAL): INTEGER + CALL MSTAFP(2589, FPL3, 2, 0, NRINT, OUTPI, 15, nblsys) +C RANDOM: FUNCTION: REAL + CALL MSTAFP(2599, FPL1+1, 1, 0, NRRE, OUTPR, 12, nblsys) +C TIME: FUNCTION: INTEGER + CALL MSTAFP(1731, FPL3+1, 1, 0, NRINT, OUTPI, 13, nblsys) +C SQRT: FUNCTION (INPUT X: REAL): REAL + CALL MSTAFP(1619, FPL1, 2, 0, NRRE, OUTPR, 14, nblsys) +C ROUND: FUNCTION (INPUT X: REAL): INTEGER + CALL MSTAFP(1487, FPL3, 2, 0, NRINT, OUTPI, 16, nblsys) +C EOLN: FUNCTION: BOOLEAN +cfile CALL MSTAFP(2579, FPL4, 1, 0, NRBOOL, OUTPB, 74, nblsys) +C ORD: FUNCTION(INPUT X: CHARACTER): INTEGER + CALL MSTAFP(2571, FPL6, 2, 0, NRINT, OUTPI, -5, nblsys) +C CHR: FUNCTION(INPUT X: INTEGER): CHARACTER + CALL MSTAFP(2575, FPL5, 2, 0, NRCHR, OUTPCH, -6, nblsys) +C SIN: FUNCTION(INPUT REAL): REAL + CALL MSTAFP(2563, FPL1, 2, 0, NRRE, OUTPR, 23, nblsys) +C COS: FUNCTION(INPUT REAL): REAL + CALL MSTAFP(2559, FPL1, 2, 0, NRRE, OUTPR, 24, nblsys) +C TAN: FUNCTION (INPUT REAL): REAL + CALL MSTAFP(2555, FPL1, 2, 0, NRRE, OUTPR, 25, nblsys) +C EXP: FUNCTION (INPUT REAL): REAL + CALL MSTAFP(2551, FPL1, 2, 0, NRRE, OUTPR, 26, nblsys) +C LN: FUNCTION (INPUT REAL): REAL + CALL MSTAFP(717, FPL1, 2, 0, NRRE, OUTPR, 27, nblsys) +C ATAN: FUNCTION (INPUT REAL): REAL + CALL MSTAFP(2547, FPL1, 2, 0, NRRE, OUTPR, 28, nblsys) +C IMIN: FUNCTION (INUT INTEGER, INPUT INTEGER): INTEGER + CALL MSTAFP(331, FPL2+1, 3, 0, NRINT, OUTPI, 19, nblsys) +C IMIN3: FUNCTION (INPUT INTEGER, INPUT INTEGER, INPUT INTEGER): INTEGER + CALL MSTAFP(2521, FPL2, 4, 0, NRINT, OUTPI, 21, nblsys) +C IMAX: FUNCTION (INPUT INTEGER, INPUT INTEGER): INTEGER + CALL MSTAFP(2515, FPL2+1, 3, 0, NRINT, OUTPI, 20, nblsys) +C IMAX3: FUNCTION (INPUT INTEGER, INPUT INTEGER, INPUT INTEGER): INTEGER + CALL MSTAFP(2511, FPL2, 4, 0, NRINT, OUTPI, 22, nblsys) +C XOR: FUNCTION(INPUT X,Y: INTEGER): INTEGER + CALL MSTAFP(237, FPL2+1, 3, 0, NRINT, OUTPI, -7, nblsys) +C PANELKEYS: FUNCTION: INTEGER + CALL MSTAFP (1203, FPL3+1, 1, 0, NRINT, OUTPI, 18, nblsys) +C ENDRUN : PROCEDURE + CALL MSTAFP(2483, 0, 0, 0, 0, 0, 29, nblsys) +C RANSET: PROCEDURE(INPUT X: REAL) + CALL MSTAFP(2375, FPL1, 1, 0, 0, 0, 30, nblsys) +C CLOCK: PROCEDURE(OUTPUT H,M,S: INTEGER) + CALL MSTAFP(2369, FPL7, 3, 0, 0, 0, 31, nblsys) +C OPTIONS: FUNCTION: INTEGER + CALL MSTAFP(1105, FPL3+1, 1, 0, NRINT, OUTPI, 32, nblsys) +C DATE: PROCEDURE (OUTPUT Y,M,D: INTEGER) + CALL MSTAFP(1685, FPL7, 3, 0, 0, 0, 36, nblsys) +C EXECPAR: FUNCTION: ARRAYOF CHAR + CALL MSTAFP(2357, FPL8+1, 1, 1, NRCHR, OUTACH, 37, nblsys) +C UNPACK: FUNCTION( INPUT TEXT): ARRAYOF CHAR + CALL MSTAFP(2247, FPL8, 2, 1, NRCHR, OUTACH, 11, nblsys) +cdsw --- removed ------ +C#F NOWE PROCEDURY DLA PLIKOW +C REW: PROCEDURE(INPUT FILE) +cdsw CALL MSTAFP(2339, FPL9, 1, 0, 0, 0, 2, nblsys) +C AVF: PROCEDURE(INPUT FILE, INPUT INTEGER) +cdsw CALL MSTAFP(1343, FPL9, 2, 0, 0, 0, 3, nblsys) +C BVF: PROCEDURE(INPUT FILE, INPUT INTEGER) +cdsw CALL MSTAFP(1471, FPL9, 2, 0, 0, 0, 4, nblsys) +C WEO: PROCEDURE(INPUT FILE) +cdsw CALL MSTAFP( 89, FPL9, 1, 0, 0, 0, 5, nblsys) +C PUtREC: PROCEDURE(INPUT FILE, INPUT INTEGER, INPUT ARRAYOF INTEGER) +cdsw CALL MSTAFP(1243, FPL9, 3, 0, 0, 0, 6, nblsys) +C GETREC: PROCEDURE(INPUT FILE, INPUT INTEGER, INPUT ARRAYOF INTEGER) +cdsw CALL MSTAFP( 59, FPL9, 3, 0, 0, 0, 7, nblsys) +C ASS: PROCEDURE(INPUT FILE, INPUT TEXT) +cdsw CALL MSTAFP(2335, FPL10, 2, 0, 0, 0, 8, nblsys) +C ASSIN: PROCEDURE(INPUT STRING) +cdsw CALL MSTAFP(2241, FPL10+1, 1, 0, 0, 0, 9, nblsys) +C ASSOUT: PROCEDURE(INPUT STRING) +cdsw CALL MSTAFP(2235, FPL10+1, 1, 0, 0, 0, 10, nblsys) +cfile --------------- added ---------------------- +c reset: procedure(input file) + call mstafp(2253,fpl9,1,0,0,0,78, nblsys) +c rewrite:procedure(input file) + call mstafp(2259,fpl9,1,0,0,0,79, nblsys) +c unlink:procedure(input file) + call mstafp(2087,fpl9,1,0,0,0,80, nblsys) +c seek:procedure(input file,input integer, input integer) + call mstafp(2091,fpl14,3,0,0,0,81, nblsys) +c position : function(input file):integer +#if ( WSIZE == 4 ) + call mstafp(2023, fpl16, 2, 0, nrint, outpi, 84, nblsys) +#else + call mstafp(2023, fpl16, 2, 0, nrre, outpr, 84, nblsys) +#endif +c memavail : function:integer + call mstafp(7847, fpl2+3, 1, 0, nrint, outpi, 98, nblsys) +c exec:function(input arrayof char):integer + call mstafp(2101,fpl13,2,0,nrint,outpi,99, nblsys) +C +cdeb ------------ debugger ------------ +c db01ox:procedure(nr:integer; inout ref1:arrayof integer, +c offset:integer, ref2:arrayof integer, realval:real, +c intval:integer ); + call mstafp(7759,fpl11,6,0,0,0,150, nblsys) + +c sccd01ox : procedure(nr:integer; inout max,lp:integer, bufor:arrayof int ); + call mstafp(7739,fpl12,4,0,0,0,151, nblsys) + +c scnd01ox:procedure(output s,k,adres:integer); + call mstafp(7747,fpl7,3,0,0,0,152, nblsys) + +c db01of : procedure(input f1,f2:file); + call mstafp(7753,fpl18,2,0,0,0,153, nblsys) + +c db01oe : procedure; + call mstafp(7731,0,0,0,0,0, 154, nblsys) +cdeb ------------------------------------------- + +cgr ------------- grafika ------------------ + +c utworzenie klasy IIUWGRAPH + prgraph = mstacl(323, nblsys) + grpref = lprefs + + outari = mgetm(6,41)+4 + ipmem(outari-4) = 1 + ipmem(outari-3) = nrint + ipmem(outari+1) = 1 + ipmem(outari) = inhx14 + + toto = mgetm(6,41) + ipmem(toto) = inpi + ipmem(toto+1) = inpi + ipmem(toto+2) = inpi + ipmem(toto+3) = inpi + ipmem(toto+4) = inpi + ipmem(toto+5) = inpi + + toto2 = mgetm(5,41) + ipmem(toto2) = inpi + ipmem(toto2+1) = inpi + ipmem(toto2+2) = inpi + ipmem(toto2+3) = inpi + ipmem(toto2+4) = inpi + + toto3 = mgetm(10,41) + ipmem(toto3) = inpi + ipmem(toto3+1) = inpi + ipmem(toto3+2) = inpi + ipmem(toto3+3) = inpi + ipmem(toto3+4) = inpi + ipmem(toto3+5) = inpi + ipmem(toto3+6) = inpi + ipmem(toto3+7) = inpi + ipmem(toto3+8) = inpi + ipmem(toto3+9) = outpi + + fpl22 = mgetm(9,41) + ipmem(fpl22) = inpi + ipmem(fpl22+1) = inpi + ipmem(fpl22+2) = inpi + ipmem(fpl22+3) = inpr + ipmem(fpl22+4) = inpr + ipmem(fpl22+5) = inpi + ipmem(fpl22+6) = inpi + ipmem(fpl22+7) = inpi + ipmem(fpl22+8) = inpi + + fpl23 = mgetm(3,41) + ipmem(fpl23) = inpi + ipmem(fpl23+1) = inpi + ipmem(fpl23+2) = outari + + toto5 = mgetm(9,41) + ipmem(toto5) = inpi + ipmem(toto5+1) = inpi + ipmem(toto5+2) = inpi + ipmem(toto5+3) = inpi + ipmem(toto5+4) = inptx + ipmem(toto5+5) = inpi + ipmem(toto5+6) = inpi + ipmem(toto5+7) = inpi + ipmem(toto5+8) = outach + + toto6 = mgetm(5,41) + ipmem(toto6) = inpi + ipmem(toto6+1) = inpi + ipmem(toto6+2) = inptx + ipmem(toto6+3) = inpi + ipmem(toto6+4) = inpi + + toto7 = mgetm(5,41) + ipmem(toto7) = inpi + ipmem(toto7+1) = inpari + ipmem(toto7+2) = inpari + ipmem(toto7+3) = inpi + ipmem(toto7+4) = inpi + + toto8 = mgetm(8,41) + ipmem(toto8) = inpi + ipmem(toto8+1) = inpi + ipmem(toto8+2) = inpi + ipmem(toto8+3) = inpi + ipmem(toto8+4) = inpi + ipmem(toto8+5) = inpi + ipmem(toto8+6) = inpi + ipmem(toto8+7) = inpi + +c gron:procedure(input integer) + call mstafp(85,fpl2,1,0,0,0,100, prgraph) + +c groff: procedure + call mstafp(2273,0,0,0,0,0,101, prgraph) + +c cls: procedure + call mstafp(2335,0,0,0,0,0,102, prgraph) + +c point: procedure(input integer, input integer) + call mstafp(1231,fpl2,2,0,0,0,103, prgraph) + +c move: procedure(input integer, input integer) + call mstafp(2279,fpl2,2,0,0,0,104, prgraph) + +c draw: procedure(input integer, input integer) + call mstafp(1719,fpl2,2,0,0,0,105, prgraph) + +c hfill: procedure(input integer) + call mstafp(189,fpl2,1,0,0,0,106, prgraph) + +c vfill: procedure(input integer) + call mstafp(2237,fpl2,1,0,0,0,107, prgraph) + +c color: procedure(input integer) + call mstafp(2231,fpl2,1,0,0,0,108, prgraph) + +c style: procedure(input integer) + call mstafp(2225,fpl2,1,0,0,0,109, prgraph) + +c patern: procedure(input integer,input integer,input integer,input integer, +c input integer,input boolean) + call mstafp(2219,toto,6,0,0,0,110, prgraph) + +c intens: procedure(input integer,arrayof int,arrayof int,int,int) + call mstafp(2213,toto7,5,0,0,0,111, prgraph) + +c pallet: procedure(input integer) + call mstafp(2207,fpl2,1,0,0,0,112, prgraph) + +c border: procedure(input integer) + call mstafp(2201,fpl2,1,0,0,0,113, prgraph) + +c video: procedure(input array of integer) + call mstafp(2195,fpl9+2,1,0,0,0,114, prgraph) + +c hpage: procedure(input integer, input integer, input integer) + call mstafp(209,fpl2,3,0,0,0,115, prgraph) + +c nocard: function: integer + call mstafp(2029,fpl2+3,1,0,nrint,outpi,116, prgraph) + +c pushxy: procedure + call mstafp(2185,0,0,0,0,0,117, prgraph) + +c popxy: procedure + call mstafp(2179,0,0,0,0,0,118, prgraph) + +c inxpos: function: integer + call mstafp(2173,fpl2+3,1,0,nrint,outpi,119, prgraph) + +c inypos: function: integer + call mstafp(2167,fpl2+3,1,0,nrint,outpi,120, prgraph) + +c inpix: function(input integer, input integer): integer + call mstafp(2161,fpl2+1,3,0,nrint,outpi,121, prgraph) + +c getmap: function(input integer, input integer): array of integer + call mstafp(2155,fpl23,3,1,nrint,outari,122, prgraph) + +c putmap: procedure(input array of integer) + call mstafp(2149,fpl9+2,1,0,0,0,123, prgraph) + +c ormap: procedure(input array of integer) + call mstafp(2143,fpl9+2,1,0,0,0,124, prgraph) + +c xormap: procedure(input array of integer) + call mstafp(2137,fpl9+2,1,0,0,0,125, prgraph) + +c track: procedure(input integer, input integer,input integer,input integer) + call mstafp(2131,toto2,5,0,0,0,126, prgraph) + +c inkey: function: integer + call mstafp(2299,fpl2+3,1,0,nrint,outpi,127, prgraph) + +c hascii: procedure(input integer) + call mstafp(2293,fpl2,1,0,0,0,128, prgraph) + +c hfont: function(input integer,input integer,input integer,input integer) +c (intput integer,input integer,input integer,input integer,input integer): +c integer new name : gscnum + call mstafp(2125,toto3,10,0,nrint,outpi,129, prgraph) + +c hfont8: function(input int, input int,input int,input int,input string +c intput int,input int,input int) : arrayof char + call mstafp(2119,toto5,9,1,nrchr,outari,130, prgraph) + +c outstring: procedure(input int,input int,input string,input int,input int) + call mstafp(2113,toto6,5,0,0,0,131, prgraph) + +c cirb: procedure(input x,y,rx,ry,start,end,c,motif :integer) + call mstafp(1573,toto8,8,0,0,0,132, prgraph) + +cdsw -------------- mouse ------------------------ + prmouse = mstacl(7991, nblsys) + mousepref = lprefs + +c fpl30 - output int, output bool + fpl30 = mgetm(2,41) + ipmem(fpl30) = outpi + ipmem(fpl30+1) = outpb + +c fpl31 - input integer, output integerl, output integer, output integer, +c output integer, output integer, output integer + fpl31 = mgetm(7, 41) + ipmem(fpl31) = outpi + ipmem(fpl31+1) = outpi + ipmem(fpl31+2) = outpi + ipmem(fpl31+3) = outpi + ipmem(fpl31+4) = outpi + ipmem(fpl31+5) = outpi + ipmem(fpl31+6) = outpb + + toto4 = mgetm(2, 41) + ipmem(toto4) = inpi + ipmem(toto4+1) = inpi + + +c init : procedure(mouse,keyboard:integer); + call mstafp(7985, toto4, 2, 0, 0, 0,200,prmouse) + +c showcursor : procedure; + call mstafp(1601, 0, 0, 0, 0, 0, 201, prmouse) + +c hidecursor : procedure; + call mstafp(7973, 0, 0, 0, 0, 0, 202, prmouse) + +c status : procedure(output h,v:integer, l, r, c:boolean) + call mstafp(7963, fpl31+2, 5, 0, 0, 0, 203, prmouse) + +c setposition : procedure(h,v:integer); + call mstafp(7957, fpl2, 2, 0, 0, 0, 204, prmouse) + +c getpress : function( output h,v,p,l,r,c : integer) : boolean + call mstafp(7945, fpl31, 7, 0, nrbool, outpb, 205, prmouse) + +c getrelease : function( output h,v,p,l,r,c : integer) : boolean + call mstafp(7937, fpl31, 7, 0, nrbool, outpb, 206, prmouse) + +c setwindow : procedure ( l,r,t,b:integer) + call mstafp(7887, fpl15, 4, 0, 0, 0, 207, prmouse) + +c defcursor : procedure (select, x, y:integer) + call mstafp(7917, fpl2, 3, 0, 0, 0, 210, prmouse) + +c getmovement : procedure ( input mo,ke:integer) + call mstafp(7907, toto4, 2, 0, 0, 0, 211, prmouse) + +c setevent : procedure( m:integer ) +c call mstafp(7865 , fpl2, 1, 0, 0, 0, 212, prmouse) + +c setspeed : procedure ( speed:integer) + call mstafp(7895, fpl2, 1, 0, 0, 0, 215, prmouse) + +c setmargins : procedure( l, r, t, b : integer) + call mstafp(7927, fpl15, 4, 0, 0, 0, 216, prmouse) + +c setthreshold : procedure(t:integer) + call mstafp(7877, fpl2, 1, 0, 0, 0, 219, prmouse) + +c signal mouseevent +c call mstasg(7857 , 70, prmouse) + + +C +C.........UTWORZENIE I WSTAWIENIE DO TABLICY HASHU BLOKU GLOWNEGO +C PROTOTYPOW SYGNALOW STANDARDOWYCH +C +C NUMERROR + CALL MSTASG( 987, 1, nblsys) +C SYSERROR + CALL MSTASG(1635, 2, nblsys) +C LOGERROR + CALL MSTASG(2319, 20, nblsys) +C ACCERROR + CALL MSTASG(1305, 21, nblsys) +C MEMERROR + CALL MSTASG( 827, 22, nblsys) +C CONERROR + CALL MSTASG(2311, 23, nblsys) +C TYPERROR + CALL MSTASG(1995, 24, nblsys) +C + + i = nblsys+10 +C.......UZUPELNIENIE TABLICY HASHU BLOKU GLOWNEGO O TYPY STANDARDOWE + XX = INSERT(INTNM, IPMEM(I), 41) + IPMEM(XX+2) = NRINT + XX = INSERT(RENM, IPMEM(I), 41) + IPMEM(XX+2) = NRRE + XX = INSERT(BOOLNM, IPMEM(I), 41) + IPMEM(XX+2) = NRBOOL + XX = INSERT(CHRNM, IPMEM(I), 41) + IPMEM(XX+2) = NRCHR +C#F + XX = INSERT(FILENM, IPMEM(I), 41) + IPMEM(XX+2) = NRFILE + XX = INSERT(CORNM, IPMEM(I), 41) + IPMEM(XX+2) = NRCOR + XX = INSERT(PROCNM, IPMEM(I), 41) + IPMEM(XX+2) = NRPROC + XX = INSERT(TEXTNM, IPMEM(I), 41) + IPMEM(XX+2) = NRTEXT + XX = INSERT(NEMPTY, IPMEM(I), 41) + IPMEM(XX+2) = NRUNIV +cdsw +c stala intsize + xx = insert(2069,ipmem(i),41) + ipmem(xx+2) = wrds1 +c stala realsize + xx = insert(2061,ipmem(i),41) + ipmem(xx+2) = wrds2 + + +C +C + LPMSYS = LPML +C +C*******INICJALIZACJA SYSPP - W RAZIE POTRZEBY + IF (SYSPP) CALL MLSPP + RETURN + END + +cdsw SUBROUTINE MSTASG( HNAME, NRSIG) + subroutine mstasg( hname, nrsig, sl) +C------------- TWORZENIE PROTOTYPU SYGNALU STANDARDOWEGO +C JEST ON SKROCONY I NIE POSIADA TABLICY HASHU +C NAZW ATRYBUTOW. OSTATNIM SLOWEM JEST +7. +C PROCEDURA WYWOLYWANA JEDYNIE Z INIT +C WERSJA Z DN. 16 05 83 + + IMPLICIT INTEGER(A-Z) +CALL BLANK + LOGICAL INSYS, OWN + COMMON /BLANK/ COM(278), + X LMEM , LPMEM , IRECN , ISFIN , LPMSYS, LPML , LPMF , + X NRINT , NRRE , NRBOOL, NRCHR , NRCOR , NRPROC, NRTEXT, + X NRUNIV, NATTR , NRNONE, NBLSYS, NBLUS , NEMPTY, INSYS , + X LOCAL , OWN , OBJECT, + X IPMEM(5000) +CALL # + data msthex /x'00b1'/ + +C GENERACJA I INICJLIZACJA PROTOTYPU + IPROT = MGETM(9, 41) + 1 +cdsw IPMEM(IPROT-1) = NBLSYS + ipmem(iprot-1) = sl + IPMEM(IPROT) = MSTHEX + IPMEM(IPROT+1) = NRSIG +C +C DODANIE NQZWY SYGNALU DO TBLICY HASHU W NBLYS +cdsw XX = INSERT(HNAME, IPMEM(NBLSYS+10), 41) + xx = insert(hname, ipmem(sl+10), 41) +C NAZWA SYGNALU JEST CLOSED + IPMEM(XX+1) = 1 + IPMEM(XX+2) = IPROT + RETURN + END + + SUBROUTINE MSTAFP( HNAME, FPLIST, FPLENG, NDIM, NTYPE, NRESLT, + x nrfp, sl) +cdsw X NRFP) +C----------------PROCEDURA TWORZY PROTOTYP FUNKCJI STANDARDOWEJ +C I PROCEDURY STANDARDOWEJ - WTEDY NTYPE=0 +C HNAME - NAZWA ZE SCANNERA TWORZONEJ FUNKCJI +C FPLIST, FPLENG - INDEKS LISTY PAR. FORM. I JEJ DLUGOSC +C NDIM, NTYPE - TYP FUNKCJI +C NRESLT - OPIS ATRYBUTU RESULT +C NRFP - ROZROZNIENIE FUNKCJI - WARTOSC DLA GENERATORA KODU +c sl - adres prototypu obejmujacego +C +C WERSJA Z DNIA: 19.01.82 +C (DLA PROCEDURY INIT) +C DLUGOSC KODU: 157 +C.................................................................. +C + IMPLICIT INTEGER (A-Z) +C +CALL BLANK + LOGICAL INSYS, OWN + COMMON /BLANK/ COM(278), + X LMEM , LPMEM , IRECN , ISFIN , LPMSYS, LPML , LPMF , + X NRINT , NRRE , NRBOOL, NRCHR , NRCOR , NRPROC, NRTEXT, + X NRUNIV, NATTR , NRNONE, NBLSYS, NBLUS , NEMPTY, INSYS , + X LOCAL , OWN , OBJECT, + X IPMEM(5000) +CALL # +C +C +CDSW DATA MAFPHEX1,MAFPHEX2 /Z0201,Z0401/ + data mafhx1, mafhx2 / x'0201',x'0401'/ + + +cdsw I = NBLSYS+10 + i = sl+10 +C + IF (NTYPE .EQ. 0) GOTO 100 +C-----FUNKCJA + IPROT = MGETM(10, 41) + 5 + IPMEM(IPROT-5) = NRESLT + IPMEM(IPROT-4) = NDIM + IPMEM(IPROT-3) = NTYPE + IPMEM(IPROT) = mafhx1 + GOTO 200 +C-----PROCEDURA + 100 IPROT = MGETM(7, 41) + 2 + IPMEM(IPROT) = mafhx2 +C-----OBYDWIE RAZEM +cdsw 200 IPMEM(IPROT-1) = NBLSYS + 200 ipmem(iprot-1) = sl + IPMEM(IPROT+1) = 1 + IPMEM(IPROT+2) = NRFP + IPMEM(IPROT+3) = FPLIST + IPMEM(IPROT+4) = FPLENG + XX = INSERT(HNAME, IPMEM(I), 41) + IPMEM(XX+2) = IPROT + RETURN + END + +cdsw new procedure + + integer function mstacl ( hname, sl) + implicit integer (a-z) + +CALL BLANK + LOGICAL INSYS, OWN + COMMON /BLANK/ COM(278), + X LMEM , LPMEM , IRECN , ISFIN , LPMSYS, LPML , LPMF , + X NRINT , NRRE , NRBOOL, NRCHR , NRCOR , NRPROC, NRTEXT, + X NRUNIV, NATTR , NRNONE, NBLSYS, NBLUS , NEMPTY, INSYS , + X LOCAL , OWN , OBJECT, + X IPMEM(5000) + + common /prefs/lprefs +c lprefs - ostatnio przydzielony numer w prefixset + + insys = .false. + prot = mgetm(33,41) + 7 + ipmem(prot) = 3 + ipmem(prot-1) = sl + ipmem(prot+9) = 0 + xx = insert(hname, ipmem(sl+10), 41) + ipmem(xx+2) = prot +c ustawienie prefixset i prefixlist + i = mgetm(1,41) + ipmem(i) = prot + ipmem(prot+22) = i + ipmem(prot+23) = 1 + call msetb(prot,2) + lprefs = lprefs+1 + call msetb(prot,lprefs) + ipmem(prot-6) = lprefs +c inicjalizacja listy atrybutow + ipmem(prot+7 ) = prot+5 + ipmem(prot+5) = nattr + mstacl = prot + insys = .true. + return + end + + SUBROUTINE MLSPP +C-----------------------INICJUJE PROTOTYPY ANALIZY SEMANTYCZNEJ DLA +C KLASY SYSPP +C + IMPLICIT INTEGER (A-Z) +C +CALL BLANK + LOGICAL INSYS, OWN + COMMON /BLANK/ COM(278), + X LMEM , LPMEM , IRECN , ISFIN , LPMSYS, LPML , LPMF , + X NRINT , NRRE , NRBOOL, NRCHR , NRCOR , NRPROC, NRTEXT, + X NRUNIV, NATTR , NRNONE, NBLSYS, NBLUS , NEMPTY, INSYS , + X LOCAL , OWN , OBJECT, + X IPMEM(5000) +cdsw DATA MLSPHEX1,MLSPHEX2,MLSPHEX3 /ZC007,ZC061,ZC051/ +c #c007 --> -#3ff9, #c061 --> -#3f9f, #c051 --> -#3faf + data mlphx1, mlphx2, mlphx3 / -x'3ff9', -x'3f9f',-x'3faf' / +CALL # +C +C----------POPRAWIENIE SLOW +3 I +4 W BLOKU SYSTEMOWYM +C +4 - JEST SYSPP + IPMEM(NBLSYS+4) = 1 +C +3 - OSTATNIO UZYTY NUMER W SENSIE PREFIXSET + IPMEM(NBLSYS+3) = IPMEM(NBLSYS+3)+4 +C +C **** UTWORZENIE KLASY SYSPP + SYSPP = MLINCL (2, 3, NBLSYS, NBLSYS) + IPMEM(NBLSYS+8) = SYSPP +C **** UTWORZENIE KLASY PROCES + PPROC = MLINCL(2469, 4, SYSPP, SYSPP) +C --POPRAWIENIE NA COROUTINE + CALL MSETB(PPROC, 0) + IPMEM(PPROC) = mlphx1 +C **** UTWORZENIE KLASY SLOWNIK + SLOW = MLINCL(1609, 5, SYSPP, PPROC) +C **** UTWORZENIE KLASY SEMAFOR + SEM = MLINCL(2477, 6, SYSPP, SLOW) +C +C****** WNETRZE KLASY PROCES +C ----WAITN: FUNCTION: PROCES +C --LISTA PF + PFL = MGETM(1, 41) +C --PROTOTYP + PROT = MLINFP(2431, PFL, 1, 0, PPROC, PPROC, SEM) + PREV = PROT +C --OPIS PARAMETRU + PAR = MLPAR(0, PPROC, 2, mlphx2 , PROT) + IPMEM(PROT-5) = PAR + IPMEM(PFL) = PAR +C ----STOPAR: PROCEDURE(INPUT Z: SEMAFOR) +C --LISTA PF + PFL = MGETM(1, 41) +C --PROTOTYP + PROT = MLINFP(2437, PFL, 1, 0, 0, PPROC, PREV) + PREV = PROT +C --OPIS PF + IPMEM(PFL) = MLPAR(0, SEM, 2, mlphx3 , PROT) +C ----WAITP: FUNCTION(INPUT Y:PROCES): PROCES +C --LISTA PF + PFL = MGETM(2, 41) +C PROTOTYP + PROT = MLINFP(2443, PFL, 2, 0, PPROC, PPROC, PREV) + PREV = PROT +C --OPISY PF + IPMEM(PFL) = MLPAR(0, PPROC, 2, mlphx3 , PROT) + PAR = MLPAR(0, PPROC, 4, mlphx2 , PROT) + IPMEM(PFL+1) = PAR + IPMEM(PROT-5) = PAR +C ----STOPP: PROCEDURE + PROT = MLINFP(2449, 0, 0, 0, 0, PPROC, PREV) + PREV = PROT +C ----RESUMEP: PROCEDURE(INPUT X: PROCES) +C --LISTA PF + PFL = MGETM(1, 41) +C --PROTOTYP + DUPA = DUPA +C BEZ TEJ DUPY FTS DAJE ZLY KOD WYNIKOWY + PROT = MLINFP(2457, PFL, 1, 0, 0, PPROC, PREV) + PREV = PROT +C --OPIS PF + IPMEM(PFL) = MLPAR(0, PPROC, 2, mlphx3 , PROT) +C +C ***** WNETRZE SLOWNIK (KLASA LINK JEST NIEWIDOCZNA!!!) +C ----AMEMBER: FUNCTION: PROCES +C --LISTA PF + PFL = MGETM (1, 41) +C --PROTOTYP + PROT = MLINFP(1325, PFL, 1, 0, PPROC, SLOW, PREV) + PREV = PROT +C --OPIS PF + PAR = MLPAR(0, PPROC, 2, mlphx2 , PROT) + IPMEM(PFL) = PAR + IPMEM(PROT-5) = PAR +C ----DELETE: PROCEDURE(INPUT X: PROCES) +C --LISTA PF + PFL = MGETM(1, 41) +C --PROTOTYP + PROT = MLINFP(2393, PFL, 1, 0, 0, SLOW, PREV) + PREV = PROT +C --OPIS PF + IPMEM(PFL) = MLPAR(0, PPROC, 3, Mlphx3 , PROT) +C ----MIN: FUNCTION: PROCES +C --LISTA PF + PFL =MGETM(1, 41) +C --PROTOTYP + PROT = MLINFP(835, PFL, 1, 0, PPROC, SLOW, PREV) + PREV = PROT +C --OPIS PF + PAR = MLPAR(0, PPROC, 2, MLphx2 , PROT) + IPMEM(PFL) = PAR + IPMEM(PROT-5) = PAR +C ----EMPTY: FUNCTION: BOOLEAN +C --LISTA PF + PFL = MGETM(1, 41) +C --PROTOTYP + PROT = MLINFP(1837, PFL, 1, 0, NRBOOL, SLOW, PREV) + PREV = PROT +C --OPIS PF + PAR = MLPAR(0, NRBOOL, 2,mlphx2 , PROT) + IPMEM(PFL) = PAR + IPMEM(PROT-5) = PAR +C ----INSERT: PROCEDURE(INPUT X: PROCES) +C --LISTA PF + PFL = MGETM(1, 41) +C --PROTOTYP + PROT = MLINFP(2405, PFL, 1, 0, 0, SLOW, PREV) + PREV = PROT +C --OPIS PF + IPMEM(PFL) = MLPAR(0, PPROC, 2, mlphx3 , PROT) +C +C ***** WNETRZE SEMAFOR +C ----UNLOCKP: PROCEDURE +C --PROTOTYP + PROT = MLINFP(2413, 0, 0, 0, 0, SEM, PREV) + PREV = PROT +C ----LOCKP: PROCEDURE +C --PROTOTYP + PROT = MLINFP(2419, 0, 0, 0, 0, SEM, PREV) + PREV = PROT +C ----UP: PROCEDURE +C --PROTOTYP + PROT = MLINFP(2421, 0, 0, 0, 0, SEM, PREV) + PREV = PROT +C ----TSP: FUNCTION: BOOLEAN +C --LISTA PF + PFL = MGETM(1, 41) +C --PROTOTYP + PROT =MLINFP(2425, PFL, 1, 0, NRBOOL, SEM, PREV) +C --OPIS PF + PAR = MLPAR(0, NRBOOL, 2, mlphx2 , PROT) + IPMEM(PFL) = PAR + IPMEM(PROT-5) = PAR +C +C******I TO JUZ KONIEC INICJALIZACJI + RETURN + END + INTEGER FUNCTION MLINCL(HNAME, PREFNR, SL, PREV) +C---------------------INICJUJE PROTOTYPY KLAS BIBLIOTECZNYCH Z SYSPP +C + IMPLICIT INTEGER (A-Z) +C +CALL BLANK + LOGICAL INSYS, OWN + COMMON /BLANK/ COM(278), + X LMEM , LPMEM , IRECN , ISFIN , LPMSYS, LPML , LPMF , + X NRINT , NRRE , NRBOOL, NRCHR , NRCOR , NRPROC, NRTEXT, + X NRUNIV, NATTR , NRNONE, NBLSYS, NBLUS , NEMPTY, INSYS , + X LOCAL , OWN , OBJECT, + X IPMEM(5000) +cdsw DATA MLCLHEX1,MLCLHEX2,MLCLHEX3 /ZC003,ZA021,Z8000/ +c #c003 --> -#3ffd, #a021 --> -#5fdf, #8000 --> undef + data mlchx1, mlchx2 /-x'3ffd', -x'5fdf' / + mlchx2 = ishft(X'0001',15) +CALL # +C + MLINCL = MGETM(33, 41)+7 + PREFL = MGETM(1, 41) + IPMEM(PREFL) = MLINCL + IPMEM(MLINCL-6) = PREFNR + IPMEM(MLINCL-3) = 4 + CALL MSETB(MLINCL, PREFNR) + IPMEM(MLINCL-1) = SL + IPMEM(MLINCL) = mlchx1 + IPMEM(MLINCL+1) = mlchx2 + IPMEM(MLINCL+9) = mlchx3 + IPMEM(MLINCL+22) = PREFL + IPMEM(MLINCL+23) = 1 +C----DOLACZENIE DO LISTY NEXTDECL + IPMEM(PREV+2) = MLINCL + XX = INSERT(HNAME, IPMEM(SL+10), 41) + IPMEM(XX+2) = MLINCL + RETURN + END + INTEGER FUNCTION MLINFP (HNAME, FPLIST, FPLENG, NDIM, NTYPE, + X SL, PREV) +C-----------------------INICJUJE PROTOTYPY FUNKCJI I PROCEDUR Z SYSPP +C + IMPLICIT INTEGER (A-Z) +C +CALL BLANK + LOGICAL INSYS, OWN + COMMON /BLANK/ COM(278), + X LMEM , LPMEM , IRECN , ISFIN , LPMSYS, LPML , LPMF , + X NRINT , NRRE , NRBOOL, NRCHR , NRCOR , NRPROC, NRTEXT, + X NRUNIV, NATTR , NRNONE, NBLSYS, NBLUS , NEMPTY, INSYS , + X LOCAL , OWN , OBJECT, + X IPMEM(5000) +cdsw DATA MLFPHEX1,MLFPHEX2/Z0201,Z0401/ + data mlfhx1, mlfhx2/x'0201',x'0401'/ +CALL # +C + I = SL+10 + IF (NTYPE .EQ. 0) GOTO 100 +C-----FUNCKJA + MLINFP = MGETM(29, 41)+5 + IPMEM(MLINFP-4) = NDIM + IPMEM(MLINFP-3) = NTYPE +C ---OPIS ATRYBUTU RESULT POWINIEN BYC WSTAWIONY NA ZEWNATRZ + IPMEM(MLINFP) = mlfhx1 + GOTO 200 +C-----PROCEDURA + 100 MLINFP = MGETM(26, 41)+2 + IPMEM(MLINFP) = mlfhx2 +C-----OBYDWIE + 200 IPMEM(MLINFP-1) = SL + IPMEM(MLINFP+1) = 1 + IPMEM(MLINFP+3) = FPLIST + IPMEM(MLINFP+4) = FPLENG +C----DOLACZENIE DO NEXTDECL + IPMEM(PREV+2) = MLINFP + XX = INSERT(HNAME, IPMEM(I), 41) + IPMEM(XX+2) = MLINFP + RETURN + END + INTEGER FUNCTION MLPAR (NDIM, NTYPE, OFF, ZERWRD, SL) +C----------------WPROWADZA OPIS PARAMETRU FORMALNEGO WRAZ Z OFFSETEM +C + IMPLICIT INTEGER (A-Z) +C +CALL BLANK + LOGICAL INSYS, OWN + COMMON /BLANK/ COM(278), + X LMEM , LPMEM , IRECN , ISFIN , LPMSYS, LPML , LPMF , + X NRINT , NRRE , NRBOOL, NRCHR , NRCOR , NRPROC, NRTEXT, + X NRUNIV, NATTR , NRNONE, NBLSYS, NBLUS , NEMPTY, INSYS , + X LOCAL , OWN , OBJECT, + X IPMEM(5000) +CALL # +C + MLPAR = MGETM(6, 41)+4 + IPMEM(MLPAR-4) = NDIM + IPMEM(MLPAR-3) = NTYPE + IPMEM(MLPAR-1) = SL + IPMEM(MLPAR) = ZERWRD + IPMEM(MLPAR+1) = OFF + RETURN + END + SUBROUTINE TORD (PRNR) +C--------------PROCEDURA PORZADKUJACA TYPY KLASOWE DEKLAROWANE W PROTO- +C TYPIE O ADRESIE PRNR . SORTOWANIE TOPOLOGICZNE ODBYWA SIE +C ZE WZGLEDU NA PREFIKSOWANIE. +C WYJSCIEM Z PROCEDURY JEST UPORZADKOWANA (W PROTOTYPIE PRNR) +C LISTA TYPOW W KOLEJNOSCI OBROBKI DEKLARACJI. EWENTUALNE CYKLE +C SA ROZERWANE. +C SYGNALIZOWANY BLAD: +C 399 - TYPY KLASOWE TWORZA CYKL ZE WZGLEDU NA PREFIKSOWANIE +C (PROCEDURA TSORT) +C 398 - PREFIKS I TYP PREFIKSOWANY JEST TEN SAM +C +C----------------------------------------------------------------------------- +C POMOCNICZE STRUKTURY DANYCH +C +C W CZASIE TWORZENIA GRAFU DO SORTOWANIA UZYWANA JEST LOKALNA TABLICA +C HASH'U THASH. ELEMENT LISTY HASH'U BEDACY JEDNOCZESNIE ELEMENTEM +C DO SORTOWANIA MA NASTEPUJACA BUDOWE: +C --> 0 - NAZWA MODULU +C +1 - LICZNIK ODWOLAN W CZSIE SORTOWANIA +C +2 - POCZATEK LISTY NASTEPNIKOW, TZN. ELEMENTOW PREFIKSOWANYCH +C PRZEZ DANA KLASE +C +3 - NASTEPNY ELEMENT W LISCIE HASH-U +C W CZASIE SORTOWANIA - FLAGA "PROCESSED"= 1 GDY ELEMENT JEST +C JUZ WSORTOWANY +C +4 - NUMER PROTOTYPU W SLOWNIKU ISDICT, +C 0 - GDY NAZWA OPISUJE PROTOTYP NIEZADEKLAROWANY W PRNR +C -1 - GDY TYP DEKLAROWANY BYL WIELOKROTNIE +C +5 - NEXTZERO - INDEKS NASTEPNEGO ELEMENTU Z ZEROWYM LICZNIKIEM +C PO WSORTOWANIU - INDEKS ELEMENTU NASTEPNEGO W UTWORZONYM +C PORZADKU LINIOWYM +C +6 - INDEKS NASTEPNEGO ELEMENTU W LISCIE DO SORTOWANIA +C (UZYWANY DO WYKRYCIA CYKLI) +C +7 - ELEMENT DO SORTOWANIA ODPOWIADAJACY BEZPOSREDNIEMU +C PREFIKSOWI (UZYWANY PRZY ROZRYWANIU CYKLI) +C +C ELEMENT LISTY NASTEPNIKOW (WSKAZYWANEJ PRZEZ SLOWO +2) MA POSTAC +C --> 0 - ELEMENT DO SORTOWANIA ODPOWIADAJACY TYPOWI PREFIKSOWANEMU, +C 0 - GDY TEN NASTEPNIK ZOSTAL USUNIETY (ROZERWANY CYKL) +C +1 - NASTEPNY ELEMENT LISTY +C +C ELEMENTY WIELOKROTNIE DEKLAROWANE TWORZA POMOCNICZA LISTE WSKAZY- +C WANA PRZEZ ZMIENNA ELIST POSTACI: +C --> 0 - NUMER PROTOTYPU W SLOWNIKU ISDICT +C +1 - NASTEPNY ELEMENT LISTY +C +C +C TE STRUKTURY PRZECHOWYWANE SA W IPMEM ZA CZESCIA PRZEZNACZONA +C NA PROROTYPY SYSTEMOWE. REZERWACJA PAMIECI JEST WYKONYWANA PRZEZ +C PROCEDURE MGETM . +C +C----------------------------------------------------------------------------- +C +C +C +C OPIS W DOKUMENTACJI: D.II.4.1 +C WERSJA Z DNIA: 19.01.82 +C DLUGOSC KODU: 220 +C.......................................................................... +C + IMPLICIT INTEGER (A-Z) +C +CALL STREAM + LOGICAL ERRFLG + COMMON /STREAM/ ERRFLG, LINE, IBUF2(265), IBUF3(7),JUNK(260) +CALL BLANK + LOGICAL INSYS, OWN + COMMON /BLANK/ COM(278), + X LMEM , LPMEM , IRECN , ISFIN , LPMSYS, LPML , LPMF , + X NRINT , NRRE , NRBOOL, NRCHR , NRCOR , NRPROC, NRTEXT, + X NRUNIV, NATTR , NRNONE, NBLSYS, NBLUS , NEMPTY, INSYS , + X LOCAL , OWN , OBJECT, + X IPMEM(5000) +CALL TC + COMMON /TC/ SLIST, ELIST, SNUMB, ILT, ZFIRST, INORD, OUTORD +CALL # +C............................................................................. +C WSTEPNE ZBADANIE PROTOTYPU PRNR +C SORTOWANIE NIE JEST WYKONYWANE, GDY LISTA TYPOW ZAWIERA MNIEJ NIZ +C DWA ELEMENTY +C + ILT = IPMEM(PRNR+5) + IF (ILT .EQ. 0) RETURN + IF ( IPMEM(ILT+1) .EQ. 0) GOTO 300 +C +C............................................................................. +C +C INICJALIZACJA ZMIENNYCH + SLIST = 0 + ELIST = 0 + SNUMB = 0 + OLPML = LPML + INORD = MGETM(8,0) + OUTORD = INORD + ZFIRST = 0 +C +C******************************************* +C UTWORZENIE GRAFU POWIAZAN ORAZ LIST TYPOW DO SORTOWANIA +C + CALL TGRAPH +C +C******************************************* +C SORTOWANIE TOPOLOGICZNE +C + IF (SNUMB .EQ. 0) GOTO 200 +C --LISTA DO SORTOWANIA JEST PUSTA +C + CALL TZLINK +C -- LACZENIE W LISTE ELEMENTOW Z ZEROWYM LICZNIKIEM +C + 100 CALL TSORT + IF (SNUMB .EQ. 0) GOTO 200 +C -- GDY SNUMB JEST ROZNE OD ZERA, TO ISTNIEJE CYKL. WOWCZAS +C ROZERWANIE CYKLU I MODYFIKACJA GRAFU ORAZ LISTY ELEMENTOW +C Z ZEROWYM LICZNIKIEM I PONOWNE SORTOWANIE +C + CALL TSPLIT + GOTO 100 +C +C******************************************** +C ODTWORZENIE LISTY TYPOW W KOLEJNOSCI DO OBROBKI +C DEKLARACJI +C + 200 CALL TORDER(PRNR) + LPML = OLPML + RETURN +C +C************************************************ +C SPRAWDZENIE, CZY TYP DO SORTOWANIA NIE JEST PREFIKSOWANY +C PRZEZ SAMEGO SIEBIE + 300 ILT = IPMEM(ILT) +C ILT - NUMER W ISDICT PROTOTYPU SORTOWANEGO + ILT = IPMEM(ILT) +C ILT - PROTOTYP SORTOWANY + IF ( IPMEM(ILT+2) .EQ. NEMPTY) RETURN +C PROTOTYP NIE JEST PREFIKSOWANY - POWROT + NAME = IPMEM(ILT+10) + IF ( NAME .NE. IPMEM(ILT+2) ) RETURN +C NAZWY SA ROZNE - POWROT +C ...SYGNALIZACJA BLEDU + LINE = IPMEM(ILT+9) + CALL MERR(398, NAME) + IPMEM(ILT+2) = NEMPTY + IPMEM(ILT) = 7 +C ZAMARKOWANIE USZKODZONEJ LISTY PARAMETROW + RETURN + END + SUBROUTINE TGRAPH +C--------------UTWORZENIE GRAFU POWIAZAN, LIST TYPOW DO SORTOWANIA +C ORAZ WIELOKROTNIE DEKLAROWANYCH +C +C OPIS W DOKUMENTACJI: D.II.4.2 +C WERSJA Z DNIA: 19.01.82 +C DLUGOSC KODU: 590 +C...................................................................... +C + IMPLICIT INTEGER (A-Z) +cdsw INTEGER THASH(8) + dimension thash(8) +C POMOCNICZA TABLICA HASH-U +C +CALL BLANK + LOGICAL INSYS, OWN + COMMON /BLANK/ COM(278), + X LMEM , LPMEM , IRECN , ISFIN , LPMSYS, LPML , LPMF , + X NRINT , NRRE , NRBOOL, NRCHR , NRCOR , NRPROC, NRTEXT, + X NRUNIV, NATTR , NRNONE, NBLSYS, NBLUS , NEMPTY, INSYS , + X LOCAL , OWN , OBJECT, + X IPMEM(5000) +CALL TC + COMMON /TC/ SLIST, ELIST, SNUMB, ILT, ZFIRST, INORD, OUTORD +CALL STREAM + LOGICAL ERRFLG + COMMON /STREAM/ ERRFLG, LINE, IBUF2(265), IBUF3(7),JUNK(260) +CALL # +C ZNACZENIE ZMIENNYCH +C ILT - ELEMENT LISTY DEKLAROWANYCH TYPOW +C DICTN - NUMER PROTOTYPU W SLOWNIKU ISDICT +C PRAD - ADRES PROTOTYPU W IPMEM +C NAME - NAZWA TYPU +C IHT - ELEMENT LISTY HASH-U +C +C + DO 10 I=1,8 + THASH(I) = 0 + 10 CONTINUE +C +C***************************************************************************** +C PRZETWARZANIE ELEMENTU ILT Z LISTY TYPOW +C + 1000 DICTN = IPMEM(ILT) + PRAD = IPMEM(DICTN) + NAME = IPMEM(PRAD+10) + IF (NAME .EQ. NEMPTY) GOTO 2500 +C NAZWA PUSTA - SKOK DO WPISANIA TYPU DO LISTY TYPOW ZLE +C ZADEKLAROWANYCH +C--------------------------------------------------------------------------- +C SPRAWDZENIE, CZY TYP NIE JEST PREFIKSOWANY SAM SOBA + IF ( NAME .NE. IPMEM(PRAD+2) ) GOTO 1050 + LINE = IPMEM(PRAD+9) + CALL MERR(398, NAME) + IPMEM(PRAD+2) = NEMPTY + IPMEM(PRAD) = 7 + 1050 CONTINUE +C----------------------------------------------------------------------------- +C ODSZUKANIE NAZWY + IHT = MEMBER(NAME, THASH) + IF (IHT .EQ. 0) GOTO 1100 +C.....TU - NAZWA JUZ WYSTEPUJE W LISCIE HASH-U +C SPRAWDZENIE ,CZY POPRZEDNIE WYSTAPIENIE NIE BYLO DEKLARACJA NAZWY, +C JESLI TAK -TO BLAD + IF ( IPMEM(IHT+4) .NE. 0) GOTO 2000 +C BYLA WCZESNIEJ DEKLAROWANA, SKOK DO ZLE ZADEKLAROWANEGO TYPU + GOTO 1200 +C +C----------------------------------------------------------------------------- +C TWORZENIE NOWEGO ELEMENTU LISTY DO SORTOWANIA + 1100 IHT = MGETM(8,0) + IPMEM(IHT) = NAME + I = IAND (ISHFT(NAME,-1), 7) + 1 + IPMEM(IHT+3) = THASH(I) + THASH(I) = IHT +C WLACZENIE DO LISTY TYPOW DO SORTOWANIA + IPMEM(IHT+6) = SLIST + SLIST = IHT + SNUMB = SNUMB+1 +C WPISANIE NUMERU PROTOTYPU + 1200 IPMEM(IHT+4) = DICTN +C +C----------------------------------------------------------------------------- +C SPRAWDZENIE PREFIKSOWANIA +C INP - NAZWA BEZPOSREDNIEGO PREFIKSU + INP = IPMEM(PRAD+2) + IF (INP .EQ. 0) GOTO 5000 +C TYP NIE JEST PREFIKSOWANY - SKOK DO POBRANIA NASTEPNEGO +C ELEMENTU LISTY TYPOW +C----------------------------------------------------------------------------- +C WYSZUKANIE NAZWY PREFIKSU +C PRAD - ELEMENT DO SORTOWANIA ODPOWIADAJACY PREFIKSOWI + PRAD = MEMBER (INP, THASH) + IF (PRAD .NE. 0) GOTO 1300 +C SKOK, GDY ELEMENT ODPOWIADAJACY PREFIKSOWI JEST JUZ +C W LISCIE DO SORTOWANIA +C WPROWADZENIE NOWEGO OPISU + PRAD = MGETM(8, 0) + IPMEM(PRAD) = INP + I = IAND (ISHFT(INP,-1), 7) + 1 + IPMEM(PRAD+3) = THASH(I) + THASH(I) = PRAD + IPMEM(PRAD+6) = SLIST + SLIST = PRAD + SNUMB = SNUMB + 1 +C--------UTWORZENIE POWIAZANIA + 1300 I = MGETM(2,0) + IPMEM(I) = IHT + IPMEM(I+1) = IPMEM(PRAD+2) + IPMEM(PRAD+2) = I + IPMEM(IHT+7) = PRAD + IPMEM(IHT+1) = 1 +C-------PRZEJSCIE DO POBIERANIA NASTEPNEGO ELEMENTU LISTY TYPOW + GOTO 5000 +C +C----------------------------------------------------------------------------- +C TYPY ZLE ZADEKLAROWANE +C +C------TYPY DEKLAROWANE WIELOKROTNIE + 2000 IF ( IPMEM(IHT+4) .EQ. -1) GOTO 2500 +C-------PRZESUNIECIE TYPU WCZESNIEJ DEKLAROWANEGO DO LISTY TYPOW +C ZLE ZADEKLAROWANYCH + INP = IHT + I = IPMEM(INP+4) + IPMEM(INP+4) = -1 + IHT = MGETM(2,0) + IPMEM(IHT) = I + IPMEM(IHT+1) = ELIST + ELIST = IHT +C-------USUNIECIE KRAWEDZI W PREFIKSIE TEGO TYPU + IHT = IPMEM(INP+7) +C IHT - GDY ROZNE OD ZERA JEST OPISEM ELEMENTU ODPOWIADAJACEGO +C PREFIKSOWI + IF (IHT .EQ. 0) GOTO 2500 +C.....USUNIECIE KRAWEDZI W LISCIE NASTEPNIKOW PREFIKSU + IHT = IPMEM(IHT+2) +C IHT - ELEMENT LISTY NASTEPNIKOW + 2100 IF (IHT .EQ. 0) GOTO 2500 + IF ( IPMEM(IHT) .EQ. INP) GOTO 2200 +C TO BYL ELEMENT ODPOWIADAJACY POLACZENIU + IHT = IPMEM(IHT+1) + GOTO 2100 + 2200 IPMEM(IHT) = 0 + IPMEM(INP+1) = 0 +C------DOLACZENIE AKTUALNEGO TYPU DO LISTY TYPOW ZLE ADEKLAROWANYCH + 2500 IHT = MGETM(2,0) + IPMEM(IHT) = DICTN + IPMEM(IHT+1) = ELIST + ELIST = IHT +C----------------------------------------------------------------------------- +C POBRANIE NASTEPNEGO ELEMENTU LISTY TYPOW + 5000 ILT = IPMEM(ILT+1) + IF (ILT .NE. 0) GOTO 1000 +C***************************************************************************** + RETURN + END + SUBROUTINE TZLINK +C--------------LACZENIE W LISTE ROZPOCZYNAJACA SIE OD ZFIRST +C ELEMENTOW Z ZEROWYM LICZNIKIEM. +C ///PRZY OKAZJI USUNIECIE W PROTOTYPACH PREFIKSOW ODPOWIADAJACYCH +C TYPOM WIELOKROTNIE DEKLAROWANYM +C +C OPIS W DOKUMENTACJI: D.II.4.3 +C WERSJA Z DNIA: 19.01.82 +C DLUGOSC KODU: 135 +C........................................................................ +C + IMPLICIT INTEGER (A-Z) +C +CALL BLANK + LOGICAL INSYS, OWN + COMMON /BLANK/ COM(278), + X LMEM , LPMEM , IRECN , ISFIN , LPMSYS, LPML , LPMF , + X NRINT , NRRE , NRBOOL, NRCHR , NRCOR , NRPROC, NRTEXT, + X NRUNIV, NATTR , NRNONE, NBLSYS, NBLUS , NEMPTY, INSYS , + X LOCAL , OWN , OBJECT, + X IPMEM(5000) +CALL TC + COMMON /TC/ SLIST, ELIST, SNUMB, ILT, ZFIRST, INORD, OUTORD +CALL # +C + I = SLIST +C***************************************************************************** + 1000 IPR = IPMEM(I+7) + IF ( IPMEM(IPR+4) .NE. -1) GOTO 1100 +C--------USUNIECIE PREFIKSU Z PROTOTYPU , GDY PREFIKS +C BYL TYPEM ZLE ZADEKLAROWANYM + IPR = IPMEM(I+4) + IPR = IPMEM(IPR) + IPMEM(IPR+2) = NEMPTY + IPMEM(IPR) = 7 +C ZAMARKOWANIE BLEDNEJ LISTY PARAMETROW + IPMEM(I+1) = 0 + 1100 IF (IPMEM(I+1) .NE. 0) GOTO 1500 + IPMEM(I+5) = ZFIRST + ZFIRST = I + 1500 IPMEM(I+3) = 0 +C USTAWIENIE FLAGI "PROCESSED" +C------POBRANIE NASTEPNEGO ELEMENTU LISTY DO SORTOWANIA + I = IPMEM(I+6) + IF (I .NE. 0) GOTO 1000 +C***************************************************************************** + RETURN + END + SUBROUTINE TSORT +C--------------SORTOWANIE TOPOLOGICZNE - CZESC WLASCIWA +C +C OPIS W DOKUMENTACJI: D.II.4.4 +C WERSJA Z DNIA: 19.01.82 +C DLUGOSC KODU: 146 +C................................................................... +C + IMPLICIT INTEGER (A-Z) +C +CALL BLANK + LOGICAL INSYS, OWN + COMMON /BLANK/ COM(278), + X LMEM , LPMEM , IRECN , ISFIN , LPMSYS, LPML , LPMF , + X NRINT , NRRE , NRBOOL, NRCHR , NRCOR , NRPROC, NRTEXT, + X NRUNIV, NATTR , NRNONE, NBLSYS, NBLUS , NEMPTY, INSYS , + X LOCAL , OWN , OBJECT, + X IPMEM(5000) +CALL TC + COMMON /TC/ SLIST, ELIST, SNUMB, ILT, ZFIRST, INORD, OUTORD +CALL # +C +C ILT - ROZPATRYWANY ELEMENT Z ZEROWYM LICZNIKIEM + 1000 ILT = ZFIRST + IF (ILT .EQ. 0) RETURN + ZFIRST = IPMEM(ILT + 5) + IPMEM(OUTORD+5) = ILT + OUTORD = ILT + SNUMB = SNUMB - 1 +C USTAWIENIE FLAGI "PROCESSED" + IPMEM(ILT+3) = 1 +C ZMNIEJSZENIE LICZNIKOW ELEMENTOM PREFIKSOWANYM +C PRZEZ ILT +C ....SPRAWDZENIE, CZY SORTOWANY PROTOTYP NIE JEST PROTOTYPEM +C ZLYCH DEKLARACJI - DLA NIEGO NIE MA ELEMENTOW PREFIKSOWANYCH + IF (IPMEM(ILT+4) .EQ. -1) GOTO 1500 +C INE - ELEMENT LISTY NASTEPNIKOW + INE = IPMEM(ILT+2) + 1100 IF (INE .EQ. 0) GOTO 1500 + I = IPMEM(INE) + IF (I .EQ. 0) GOTO 1200 +C SKOK, GDY POLACZENIE JEST OMINIETE +C I -ELEMENT ODPOWIADAJACY TYPOWI PREFIKSOWANEMU + IPMEM(I+1) = 0 + IPMEM(I+5) = ZFIRST + ZFIRST = I +C POBRANIE NASTEPNEGO ELEMENTU LISTY NASTEPNIKOW + 1200 INE = IPMEM(INE+1) + GOTO 1100 +C-------POBRANIE NASTEPNEGO ELEMENTUU DO SORTOWANIA + 1500 GOTO 1000 + END + SUBROUTINE TSPLIT +C--------------PROCEDURA ROZRYWANIA CYKLI W LISCIE TYPOW DO +C PRZETWORZENIA. +C ZNAJDUJE TYP NAJWCZESNIEJ DEKLAROWANY, USUWA MU PREFIKS +C I MODYFIKUJE GRAF DO SORTOWANIA +C SYGNALIZOWANY BLAD: +C 399 - WYSTAPIENIE CYKLU W PREFIKSOWANIU +C +C OPIS W DOKUMENTACJI: D.II.4.5 +C WERSJA Z DNIA: 19.01.82 +C DLUGOSC KODU: 287 +C.................................................................. +C + IMPLICIT INTEGER (A-Z) +C +CALL STREAM + LOGICAL ERRFLG + COMMON /STREAM/ ERRFLG, LINE, IBUF2(265), IBUF3(7),JUNK(260) +CALL BLANK + LOGICAL INSYS, OWN + COMMON /BLANK/ COM(278), + X LMEM , LPMEM , IRECN , ISFIN , LPMSYS, LPML , LPMF , + X NRINT , NRRE , NRBOOL, NRCHR , NRCOR , NRPROC, NRTEXT, + X NRUNIV, NATTR , NRNONE, NBLSYS, NBLUS , NEMPTY, INSYS , + X LOCAL , OWN , OBJECT, + X IPMEM(5000) +CALL TC + COMMON /TC/ SLIST, ELIST, SNUMB, ILT, ZFIRST, INORD, OUTORD +CALL # +C +C ILT - ELEMENT LISTY DO SORTOWANIA ODPOWIADAJACY NAJWCZESNIEJ +C DEKLAROWANEMU PROTOTYPOWI +C LMIN - NUMER NAJWCZESNIEJSZEJ LINII +C IE - AKTUALNY ELEMENT LISTY DO SORTOWANIA +C + IE = SLIST + LMIN = 32767 +C NAJWIEKSZA STALA CALKOWITA +C***************************************************************************** + 1000 CONTINUE + IF (IPMEM(IE+3) .EQ. 1) GOTO 1500 +C SKOK, GDY TEN TYP JEST JUZ PRZETWORZONY + IPR = IPMEM(IE+4) + IPR = IPMEM(IPR) +C IPR - PROTOTYP TYPU ODPOWIADAJACEGO IE + LINE = IPMEM(IPR+9) + IF (LINE .GT. LMIN) GOTO 1500 +C....TU POTENCJALNY KANDYDAT NA USUNIECIE CYKLU +C SPRAWDZENIE, CZY TEN ELEMENT WYSTEPUJE W CYKLU + ILOOP = IE +C MARKOWANIE CYKLU + 1100 IPMEM(ILOOP+3) = -1 + ILOOP = IPMEM(ILOOP+7) +C TO JEST PREFIKS ILOOP + IF (IPMEM(ILOOP+3) .NE. -1) GOTO 1100 + IF (ILOOP .NE. IE) GOTO 1200 +C --WYSTAPIL W CYKLU + LMIN = LINE + ILT = IE +C --PRZYWROCENIE STAREGO MARKOWANIA CYKLU + 1200 ILOOP = IE + 1300 IPMEM(ILOOP+3) = 0 + ILOOP = IPMEM(ILOOP+7) + IF (IPMEM(ILOOP+3) .NE. 0) GOTO 1300 +C---------POBRANIE NASTEPNEGO ELEMENTU LISTY DO SORTOWANIA + 1500 IE = IPMEM(IE+6) + IF (IE .NE. 0) GOTO 1000 +C +C***************************************************************************** +C ILT JEST PROTOTYPEM TYPU NAJWCZESNIEJ DEKLAROWANEGO + IPR = IPMEM(ILT+4) + IPR = IPMEM(IPR) + NAME = IPMEM(IPR+10) + LINE = LMIN +C ...SYGNALIZACJA BLEDU + CALL MERR(399, NAME) +C......USUNIECIE PREFIKSU + IPMEM(IPR+2) = 0 +C......"USZKODZENIE" LISTY PARAMETROW + IPMEM(IPR) = 7 +C.....WSTAWIENIE DO LISTY ELEMENTOW Z ZEROWYM LICZNIKIEM + ZFIRST = ILT +C------USUNIECIE POWIAZANIA Z PREFIKSEM + IPR = IPMEM(ILT+7) +C IPR - ELEMENT LISTY DO SORTOWANIA ODPOWIADAJACY PREFIKSOWI + IPR = IPMEM(IPR+2) +C LISTA NASTEPNIKOW PREFIKSU + 2000 IF (IPMEM(IPR) .EQ. ILT) GOTO 2100 + IPR = IPMEM(IPR+1) + GOTO 2000 + 2100 IPMEM(IPR) = 0 + RETURN + END + SUBROUTINE TORDER (PRNR) +C------------WPISANIE DO LISTY TYPOW PRNR TYPOW TAM DEKLAROWANYCH +C W KOLEJNOSCI OBROBKI DEKLARACJI +C +C OPIS W DOKUMENTACJI: D.II.4.6 +C WERSJA Z DNIA: 19.01.82 +C DLUGOSC KODU: 117 +C......................................................................... +C +C + IMPLICIT INTEGER(A-Z) +C +CALL BLANK + LOGICAL INSYS, OWN + COMMON /BLANK/ COM(278), + X LMEM , LPMEM , IRECN , ISFIN , LPMSYS, LPML , LPMF , + X NRINT , NRRE , NRBOOL, NRCHR , NRCOR , NRPROC, NRTEXT, + X NRUNIV, NATTR , NRNONE, NBLSYS, NBLUS , NEMPTY, INSYS , + X LOCAL , OWN , OBJECT, + X IPMEM(5000) +CALL TC + COMMON /TC/ SLIST, ELIST, SNUMB, ILT, ZFIRST, INORD, OUTORD +CALL # +C + ILT = IPMEM(PRNR+5) +C ILT - ELEMENT LISTY TYPOW DEKLAROWANYCH +C +C***************************************************************************** +C WPISANIE TYPOW Z LISTY INORD (NA POCZATKU JEST STRAZNIK) + 1000 INORD = IPMEM(INORD+5) + IF (INORD .EQ. 0) GOTO 2000 + IF (IPMEM(INORD+4) .LE. 0) GOTO 1000 +C -OMINIECIE TYPOW NIELOKALNYCH + IPMEM(ILT) = IPMEM(INORD+4) + ILT = IPMEM(ILT+1) + GOTO 1000 +C***************************************************************************** +C WPISANIE TYPOW Z LISTY TYPOW ZLE ZADEKLAROWANYCH + 2000 IF (ELIST .EQ. 0) RETURN + IPMEM(ILT) = IPMEM(ELIST) + ELIST = IPMEM(ELIST+1) + ILT = IPMEM(ILT+1) + GOTO 2000 + END + + diff --git a/sources/pass1/logdeb.log b/sources/pass1/logdeb.log new file mode 100644 index 0000000..0ab022c --- /dev/null +++ b/sources/pass1/logdeb.log @@ -0,0 +1,1952 @@ +program pr; +(*********************************************************************) +(* *) +(* L O G D E B *) +(* *) + +(*$D-*) +(*$L-*) + +UNIT logdeb : CLASS; + +(*====================================================================*) +(* *) +(* L O G D E B *) +(* *) +(* D E B U G G E R F O R L O G L A N *) +(* *) +(* WERSJA 2 ( 1985 ) *) +(* *) +(* TERESA PRZYTYCKA *) +(* *) +(*====================================================================*) + +(*====================================================================*) +(* *) +(* Adapted to the Loglan interpreter. *) +(* Uses special standard procedures DB01OX, SCCD01OX, SCND01OX, *) +(* DB01OF for communication with the interpreter. *) +(* Uses auxilliary files name.deb (name - file name of the source *) +(* loglan program) and temp.deb. *) +(* The copy of output is printed to the file debug.ech *) +(* *) +(* June 1986, D.Szczepanska *) +(*====================================================================*) + +(*============================================*) +(* WYDRUKI KOTROLNE : STRUMIEN LO *) +(* +i - PRZED INSTRUKCJA *) +(* ++i - PO INSTRUKCJI *) +(* i - szczegolowosc wydrukow kontrolnych *) +(*============================================*) + + +VAR LINENR:INTEGER, (* NR LINII MIEJSCA WYSTAPIENA PZETWANIA *) + LINENR1:INTEGER, (* NR LINII Z OSTATNIM PRZERWANIEM *) + linenr2:integer, (* nr linii do ktorej ciagnie sie "do" *) + DISPNR :INTEGER, (* DISPNR OBIEKTU,KTOREGO WYKONYWANIE ZOSTALO *) + UNITCASE : INTEGER,(* TYP JEDNOSTKI SYNTAKTYCZNEJ PUNKTU *) + (* OBSERWACJI *) + (* PRZERWANE A POZNIEJ ZMIENNA ROBOCZA DO *) + (* PRZECHOWYWANIA WYNIKU Z PROCEDURY FIND *) + BREAKT (* TABLICA Z NUMERAMI LINII PUNKTUW LAMIACYCH *) + :ARRAYOF INTEGER, + + BREAKTL:ARRAYOF BR, (* TABLICA INFORMACJI O PUNKTACH LAMIACYCH *) + (* ODPOWIADAJACA TABLICY BREAKT *) + MOV :MOVEL, (* POCZATEK LISTY ZMIAN PONKTOW OBSERWACJI *) + CADR, (* ADRES OBIEKTU, KTOREG OBLICZENIA *) + (* ZOSTALY PRZERWANE *) + OBSADR, (* ADRES OBIEKTU BEDACEGO PUNKTEM *) + (* OBSERWACJI *) + (* PRZERWANE *) + CCOR : ARRAYOF INTEGER, (* AKTYWNA COROUTINA *) + ctxt : arrayof integer, (* bufor na biezaca lnie wejsciowa *) + protf :FILE , (* PLIK O DOSTEPIE sekwencyjnym,binarny *) + (* zawierajacy breakt i prototypy debuggera *) + CO :FILE , (* PLIK NA KTORY WYSYLA WYNKI DEBUGGER *) + LO :FILE , (* KOPIA WYNIKOW PRZY WLACZONYM ECHU *) + PROTNR :INTEGER , (* NR PROTOTYPU OBIEKTU BEDACEGO *) + (* PUNKTEM OBSERWACJI *) + SINGLESTEP:boolean, (* CZY PRZERWANIE JEST GENEROWANE PO KAZDEJ *) + (* INSTRUKCJI LOGLANOWEJ *) + GGO :integer, (* GO = TRUE POWODUJE WYKONYWANIE PROGRAMU *) + (* BEZ PRZERWAN, JEDYNIE Z SYGNALIZACJA *) + (* PUNKTOW LAMIACYCH W POSTACI SLADU *) + ECHO : BOOLEAN, (* CZY JEST PISANA KOPIA WYNKOW NA LO *) + CBR :BR , (* PUNKT LAMIACY OBSLUGIWANY W BIEZACYM *) + (* PRZERWANIU *) + CIND : INTEGER, (* INDEKS W TABLICY BIEZACEGO PRZERWANIA *) + (* STRUKTURU DANYCH DO KOMUNIKACJI Z BAZA *) + (* DANYCH PROTOTYPOW *) + IDICT , (* slownik prototypow debuggera *) + prot (* tablica zawierajaca prototypy debuggera *) + : arrayof integer, + + GOTXT : ARRAYOF INTEGER, (* TEKST INSTRUKCJI GO *) + + first:boolean, (* true for the first interrupt *) + lastbr:integer, (* last used in breakt *) + DECL : DEC ; (* LISTA BANKOW INSTRUKCJI *) + + +CONST MAXBR=500, (* MAKSYMALNA LICZBA PUNKTOW LAMIACYCH *) + MAXIDICT = 499; (* ROZMIAR TABLICY IDICT *) +VAR I:INTEGER ; (* GLOBaLNA POMOCNICZA *) +var glovirt:arrayof integer, gloreal:real; (*globalne pomocnicze *) +var maxprot:integer; (* rozmiar tablicy PROT *) + +(*=====================================================================*) +(* S T R U K T U R Y D A N Y C H *) +(*=====================================================================*) + +UNIT INSTR : CLASS ; (* ELEMENT LISY INSTRUKCJI *) +VAR MARK:INTEGER, + TXT :ARRAYOF INTEGER, + NEXT :INSTR; +END; + +UNIT KILLI :PROCEDURE(INOUT I:INSTR); +VAR J :INSTR; +BEGIN + J:=I; + WHILE J=/= NONE DO J:=J.NEXT;KILL(I.TXT);KILL(I);I:=J OD; +END; + +(*---------------------------------------------------------------------*) + +UNIT BR : CLASS ; (* OPIS PUNKTU PRZERYWAJACEGO *) +VAR MARK : INTEGER, + CONDTXT : ARRAYOF INTEGER, + INS : INSTR ; +END; + +UNIT KILLB :PROCEDURE(INOUT B:BR); +BEGIN + KILL(B.CONDTXT);CALL KILLI(B.INS) ; KILL(B) +END; + +(*-------------------------------------------------------------------*) + +UNIT DEC :CLASS; (* ELEMENT LIST BANKOW INSTRUKCJI *) +VAR ID :INTEGER, + INS : INSTR, + NEXT : DEC; +END; + +(*----------------------------------------------------------------*) + +UNIT MOVEL : CLASS(MARK,PROT :INTEGER,ADR,COR : ARRAYOF INTEGER); + +(* ELEMENT LISTY ZMIAN PUNKTOW OBSERWACJI *) +(* ZNACZENIE ATRYBUTOW : MARK - ETYKIETA INSTRUKCJI MOVE *) +(* PROT - NR PROTOTUPU PUNKTU OBSERWACJI *) +(* ADR - ADRES PUNKTU OPSERWACJI *) +(* COR - OBSERWOWANA COROUTINA *) +VAR NEXT :MOVEL; +END; +(*------------------------------------------------------------------*) + +(*===================================================================*) +(* CONTROL - PREFIX DLA COROUTIN UZYTKOWNIKA, KTORE MOGA BYC *) +(* OBSERWOWANE PO EWENTUALNYN BLEDZIE WYKONANIA *) +(*===================================================================*) + +(*===================================================================*) +(* *) +(* S T R I N G S *) +(* *) +(*===================================================================*) + +const + t1 = " RUNERROR", + T2 = " CONERROR", + T3 = " LOGERROR", + T4 = " TYPERROR", + T5 = " SYSERROR", + T6 = " NUMERROR", + T7 = " MEMERROR", + T8 = " UNHANDLED", + T9 = " BREAK POINT : ", + T10 = " INSTANCE OF ", + T11 = " BLOCK", + T12 = " HANDLER", + T13 = " DECLARED IN LINE", + T14 = " --- END OF LIST ---", + T15 = " NOT IMPLEMENTED", + T16 = " ARRAY OF", + T17 = " OF ", + T18 = " FORMAL TYPE", + T19 = " NONE VALUE OF FORMAL TYPE", + T20 = " INTEGER", + T21 = " BOOL", + T22 = " CHAR", + T23 = " REAL", + T24 = " STRING", + T25 = " TRUE", + T26 = " FALSE", + T27 = " !!! ERROR NR", + T28 = " LINENR :", + t29 = " OBSERVATION POINT:"; + + +(*============================================================*) +(* CONTROL - prefix for user's coroutines *) +(*============================================================*) + +UNIT CONTROL:CLASS; + +HANDLERS +WHEN ACCERROR : writeln(co,t1); call runerror; +WHEN CONERROR : writeln(co,t2); call runerror; +WHEN LOGERROR : writeln(co,t3); call runerror; +WHEN TYPERROR : writeln(co,t4); call runerror; +WHEN SYSERROR : writeln(co,t5); call runerror; +WHEN NUMERROR : writeln(co,t6); call runerror; +WHEN MEMERROR : writeln(co,t7); call runerror; +OTHERS : WRITELN(CO,t8);CALL RUNERROR; +END HANDLERS; +BEGIN END; + +(*=====================================================================*) + +(*******************************************************************) +(* *) +(* B R E A K L *) +(* *) +(*-----------------------------------------------------------------*) +(* PROCEDURA WYWOLYWANA PRZEZ PROCEDURE RUNING SYSTEMU :TRACE *) +(* SPRAWDZA CZY W DANEJ LINI WYKONYWANEGO PROGRAMU JEST *) +(* ZADEKLAROWANY BREAK POINT.JESLI TAK WYWOLUJE PROCEDURE INTERPR *) +(*******************************************************************) + +UNIT BREAKL:PROCEDURE; + +VAR BREAKP: BOOLEAN, + K:INTEGER; + +BEGIN + (* linenr := line of the break point, dispnr := number of interrupted + object, cadr := address of interrupted object *) + call db01ox(28,glovirt, linenr, cadr, gloreal, dispnr); +if ggo=4 then call endrun fi; +if ggo=/=3 then + cind := 0; cbr := none; +(*+ WRITELN(LO," LINENR",LINENR," LINENR1",LINENR1); ++*) + if linenr1=0 then first:=true; fi; + IF SINGLESTEP OR LINENR1=0 THEN BREAKP:=TRUE + ELSE + IF LINENR =/= LINENR1 THEN + K:=0; + FOR I:=1 TO lastbr DO + IF BREAKT(I)=LINENR THEN K:=LINENR ; CIND:=I;EXIT FI; + OD; + IF K =/= 0 THEN CBR:=BREAKTL(CIND); + BREAKP:=TRUE + FI + FI; + FI; + LINENR1:=LINENR; + IF BREAKP THEN (* jest przerwanie w lnii linenr *) + if ggo=1 andif linenr > linenr2 then ggo := 0 fi; + if ggo = 0 then + (* ccor - address of an active coroutine head *) + call db01ox (0,ccor,i,glovirt,gloreal,i); + CALL INTERPR; + else + writeln(co,t9,linenr); + if echo then writeln(lo,t9,linenr) fi; + FI; + FI; +fi; +END;(* BREAKL *) + + +(************************************************************) +(* *) +(* I N I C B R *) +(* *) +(*----------------------------------------------------------*) +(* PROCEDURA INICJALIZUJACA DZIALANIE DEBUGGERA. *) +(* WYKONUJE KOLEJNO NASTEPUJACE KROKI : *) +(* 1.ZNAJDUJE ADRES PROTOTYPU INSTRUKCJI BREAKL *) +(* I EXPORTUJE GO DLA PROCEDURY RAN. SYS. TRACE *) +(* 2.KOPIUJE ZE STRUMIENIA SC TABLICE HASHU, *) +(* OTWIERA STRUMIEN SC DLA PROCEDUR LOGLANOWYCH, *) +(* OTWIERA STRUMIEN CI ,INICJALIZUJE ZMIENNE SCANERA *) +(* 3.INICJALIZUJE TABLICE BREAKT I DISPT, *) +(* OTWIERA STRUMIENI SC ORAZ CO *) +(************************************************************) + +UNIT INICBR:PROCEDURE; + var i, brnr : integer; +BEGIN + (* files openning *) + open(protf,integer, unpack("debug.tmp")); + call reset(protf); + (* copy of the debugger output *) + open(lo,text,unpack( "debug.ech")); + call rewrite(lo); + open (co,text,unpack("SYS$OUTPUT")); (* output of the debugger *) + call rewrite(co); + (* breakt *) + array breakt dim (1:maxbr); + get (protf, brnr); + array breaktl dim (1:maxbr); + for i:=1 to brnr do + get (protf, breakt(i)); + od; + for i := brnr+1 to maxbr do + breakt(i) := 0; + od; + (* initialization of lastbr *) + lastbr := 1; + while lastbr <= maxbr do + if breakt(lastbr) = 0 then exit fi; + lastbr := lastbr+1; + od; + lastbr := lastbr-1; + (* idict *) + array idict dim (0:maxidict); + for i:=0 to maxidict do + get(protf,idict(i)); + od; + (* maxprot *) + get(protf,maxprot); + (* prot *) + array prot dim (1:maxprot); + for i:=1 to maxprot do + get(protf,prot(i)); + od; + (* protf must be removed from directory *) + (* killing of protf and transferring the variable lo to the interpreter *) + call db01of(protf,lo); +end inicbr ; + +(*********** PROCEDURY TESTUJACE ***************************) + +UNIT TEST1:PROCEDURE (INPUT T:ARRAYOF INTEGER ); + +(* PROCEDURA DRUKUJE ZAWARTOSC TABLICY T *) + +VAR I,J:INTEGER; +BEGIN +J:=0; +WRITELN(LO); +FOR I:=LOWER(T) TO UPPER(T) DO + IF J=10 THEN WRITELN(LO); J:=0 FI; + WRITE (LO,T(I)); + J:=J+1; +OD; +WRITELN(LO); +END (* TEST1 *) ; + +UNIT OUTREF:PROCEDURE(ADRES:ARRAYOF INTEGER); +VAR I,J:INTEGER; +BEGIN + (* (i,j) := virtual address refval *) + call db01ox(30,adres,i,glovirt,gloreal,j); +(*+ writeln(lo,"refval",i,j); ++*) +END; + +(************************************************************) +(* *) +(* I N T E R P R *) +(* *) +(*----------------------------------------------------------*) +(* PROCEDURA CZYTA I INTERPROTUJE INSTRUKCJE WYSYLANE PRZEZ *) +(* UZYTKOWNIKA DO DEBUGGERA . *) +(* WYJSCIE DLA INSTRUKCJI - STRUMIEN CI *) +(* WYNIKI - STRUMIEN CO *) +(* EWENTUALNA KOPIA - STRUMIEN LO *) +(************************************************************) + +UNIT INTERPR :PROCEDURE ; + +SIGNAL DEBERROR(NR :INTEGER); + +VAR S,K,ADRES : INTEGER , (* ZMIENNE NA WYNIKI PROCEDURY SCAN *) + STP : BOOLEAN, (* CZY NAPOTKANO INSTRUKCJE GO *) + (* BUFORY DLA WARTASCI ZMIENNYCH *) + (* 1 -DLA WYNIKOW CZESCIWYCH PRZY ASSIGN *) + INTVAL,INTVAL1 : INTEGER, + RELVAL,RELVAL1 : REAL , + CHAVAL,CHAVAL1 : CHAR , + REFVAL,REFVAL1 : ARRAYOF INTEGER, + R,R1 : INTEGER, (* BUFORY NA LICZBE ARRAYOF *) + REFFVAL : ARRAYOF INTEGER, + PROTDEB,PROTDEB1,OFFSET1,OFFSET,MODE,MODE1:INTEGER, + + HELP:INSTR, + MA:INTEGER; (* MARKER INTERPRETOWANEJ INSTRUKCJI *) + +(*------ TYPY PREDEFINIOWANE -----------------*) + +CONST INTT = -2, + BOOLT =-8, + RELT =-5, + CHT =-11, + STRT =-35, + NONT = -12, + FORT =-10, + filt = -14, + cortt = -24, + proctt = -33; + +(* TYPY JEDNOSTEK SYNTAKTYCZNYCH *) + +CONST VART = 5 , (* ZMIENNA *) + CORT = 11 , (* COROUTINA *) + RECT = 12 , (* REKORD *) + BLCT= 1 , (* BLOCK *) + HANT = 14 ; (* HANDLER *) + +(* KODY ZNAKOW *) +CONST ELN=13, + bl = 32, + SR =59; + + +(* S T A L E S C A N E R A *) + +(* IDENTYFIKATORY : S=1,ADRES = *) +CONST ADELETE = 2393, + ASTORE = 7803, + AGO = 79 , + AREMOVE = 7809, + ASSIGN = 1337, + AMOVE = 2279, + ADECLARE= 7817, + AMARK = 7821, + AWITH = 7831, + AREPORT = 7827; +const +(* SLOWA KLUCZOWE S = *) + sident = 1, + SOUTPUT = 95, + SOR = 68, + SAND = 67, + SNOT = 66, + STO = 104, + SWHEN = 109, + SWRITE = 19, + SBREAK = 33, + SRETURN = 4 , + SSTEP =102, + SDO = 14, + SCALL = 9 , + SEND = 80, + SEOF = 70, + SNONE = 1002, + SBOL = 1001, (* ADRES = 1 DLA FALSE 2 TRUE *) + SCOLON = 47, + SEMICOL = 45, + SLPAR = 52, + SART = 51, + adlt = 5, + adle = 6, + adeq = 3, + adne = 4, + adgt = 7, + adge = 8, + SRPAR = 53, + SCOM = 42, + SDOT = 38, + SAST = 50, (* *-ADRES= ,- -ADRES=4*) + adast = 5, + admin = 4, + adadd = 3, + SCONST =1000, + kint = 3, + kch = 6; + +(*==================================================================*) +(* KOMUNIKACJA Z UZYTKOWNIKIEM *) +(* ---------------------------- *) +(* ODBYWA SIE LINIAMI ZA POSREDNICTWEM BUFORA SCANNERA *) +(*==================================================================*) + +UNIT INTEX : PROCEDURE (OUTPUT TX:ARRAYOF INTEGER); +(* PROCEDURA CZYTA LINE Z BUFORA SCANNERA DO TABLICY TX *) +VAR CH,MAX:INTEGER; +BEGIN +(*+ WRITELN(LO); ++*) +(*+ WRITELN(LO," INTEX"); ++*); + (* max := max from scanner *) + call sccd01ox(0,max,i,tx); +ARRAY TX DIM(1:MAX+1); + (* TX := bufor from scanner *) + call sccd01ox(1,max,max,tx); +(*+ for i:=1 to max do ++*) +(*+ IF(I MOD 10) =1 THEN WRITELN(LO);WRITE(LO," "); FI;++*) +(*+ WRITE(LO,TX(I));++*) +(*+ od; ++*) + ch := 0; i := 1; + do + if i >= max then exit fi; + if tx(i) = eln then exit fi; + ch := tx(i); i := I+1 + od; + if ch=/=sr then + tx(i) := sr; i := i+1; + fi; + tx(i) := eln; + I:=I+1; + WHILE IAP-3+I-INTVAL THEN RAISE DEBERROR(33) FI; + +CASE TYP +WHEN RELT: + (* relval := array element *) + call db01ox(6,refval,ind,glovirt,relval,intval); +(*+ WRITELN(LO," TAKEARR IND RELVAL",IND,RELVAL)++*); + +WHEN INTT,BOOLT : + (* intval := array element *) + call db01ox(7,refval,ind,glovirt,relval,intval); +(*+ WRITELN(LO,"TAKEARR IND, INTVAL ",IND,INTVAL )++*); + +WHEN CHT: + (* chaval := array element *) + call db01ox(8,refval,ind,glovirt,relval,i); + chaval := chr(i); +(*+ WRITELN(LO," TAKEARR IND ,CHAVAL",IND,CHAVAL )++*); + + WHEN STRT :WRITELN(CO,t15); + +OTHERWISE + (* refval := array element *) + call db01ox(9,refval,ind,glovirt,relval,intval); +(*+ WRITELN(LO," TAKEARR REFVAL ")++*); +ESAC; +END (* TAKEARR *); + + +(*-----------------------------------------------------------*) +(* E N D P R O C E D U R T A K E ... *) +(*-----------------------------------------------------------*) + +(*================ I N F ==================================*) + +UNIT INF:PROCEDURE; +BEGIN + WRITE(CO,t10);IF ECHO THEN WRITE(LO,t10) FI; + i := idict(protnr); + unitcase := prot(i); + IF UNITCASE=BLCT (* BLOCK *) THEN WRITE(CO,t11); + IF ECHO THEN WRITE(LO,t11) FI; + ELSE + IF UNITCASE=HANT THEN WRITE(CO, t12); + IF ECHO THEN WRITE(LO,t12) FI + ELSE + CALL WRID(prot(I-1), 10); + FI + FI; + WRITE(CO,t13);IF ECHO THEN WRITE(LO,t13) FI; + I:=I+2; + WRITELN(CO,prot(I));IF ECHO THEN WRITELN(LO,prot(I)) FI; +END inf; + +(*===========================================================*) + +(* ----------------------------------------------------------*) +(* *) +(* F I N D L I N *) +(* reads line number, label or dot *) +(* returns index (in breakt) of the line identified by the *) +(* given symbol *) +(*-----------------------------------------------------------*) + + unit findlin:function:integer; + var i:integer; + begin + if s=sdot then result:=cind + else + if s=sident then + for i:=1 to lastbr do + if breakt(i)=/=0 andif breaktl(i)=/=none andif + breaktl(i).mark = adres then result := i; + exit; + fi; + od + else + if s=/=sconst or k=/=kint then raise deberror(1) fi; + (* searching for the index in breakt *) + for i:=1 to lastbr do + if breakt(i) = adres then exit fi; + od; + if i<=lastbr andif breakt(i) = adres then result := i fi; + fi + fi; + if result=0 then raise deberror(18) fi; + (*+ writeln(lo," findlin :", result); ++*) + end findlin; + +(*-----------------------------------------------------------*) +(* *) +(* D E L (DELETE ) *) +(* *) +(* PROCEDURA USUWA PUNKT PRZERYWAJACY OKRESLAONY PRZEZ *) +(* ETYKIETE LUB NUMER LINII *) +(*-----------------------------------------------------------*) + +UNIT DEL : PROCEDURE; +VAR I:INTEGER; +BEGIN + CALL SCAN; + i := findlin; + if i=cind then raise deberror(39) fi; + if breaktl(i) =/= none then call killb(breaktl(i)) fi; + breakt(i) := breakt(lastbr); + if cind = lastbr then cind := i fi; + breaktl(i) := breaktl(lastbr); + lastbr := lastbr-1; +END (* DEL *) + +(*-------------------------------------------------------------*) +(* *) +(* B R E (BREAK) *) +(* *) +(* DEKLARACJA PUNKTU PRZERYWAJECEGO. PUNKT TEM MOZE BYC *) +(* OZNACZONY ETYKIETA. MOZE BYC TO WARUNKOWY PUNKT PRZERYWAJACY*) +(*-------------------------------------------------------------*) + +UNIT BRE : PROCEDURE; +VAR I:INTEGER; +BEGIN + CALL SCAN; (* CZYTAMY NR LINII *) + IF S =/= SCONST or K<>kint THEN RAISE DEBERROR(1) FI; + FOR I:=1 TO lastbr DO IF BREAKT(I)=ADRES THEN RAISE DEBERROR(17) FI OD; + IF lastbr = maxbr THEN RAISE DEBERROR(16) fi; + (* NO SPACE IN BREAK POINTS TABLE *) + lastbr := lastbr+1; + BREAKT(lastbr):=ADRES; + BREAKTL(lastbr):=NEW BR; + if adres = linenr then cind := lastbr fi; + CALL SCAN; (* CZY JEST TO WARUNKOWY PUNKT ? *) + IF S=SWHEN THEN CALL INTEX(BREAKTL(lastbr).CONDTXT); (* TAK-ZAPAMIETUJEMY *) + (* TEKST Z WARUNKIEM *) + (* PRZESKAKUJEMY TEKST WARUNKU *) + WHILE S=/=SEMICOL AND NOT(S=sident AND ADRES=AWITH) DO CALL SCAN OD + FI; + IF S=sident AND ADRES = AWITH THEN CALL SCAN; (* BEDZIE ETYKIETA *) + IF S=/=sident THEN RAISE DEBERROR(1) (*IDENTIFIER EXPECTED *) FI; + BREAKTL(lastbr).MARK:=ADRES; + call scan; + FI; +END (* BRE *); + +(*--------------------------------------------------------------------*) +(* *) +(* M A R K *) +(* *) +(*--------------------------------------------------------------------*) + + unit mark:procedure; + (* marks the given break point *) + begin + call scan; + i := findlin; + call scan; + if s=/= sident then raise deberror(1) fi; + if breaktl(i)=none then breaktl(i):=new br fi; + breaktl(i).mark:=adres; + end mark; + +(*--------------------------------------------------------------------*) +(* *) +(* G O O *) +(* *) +(* return to user program execution *) +(* - without parameters - standard execution *) +(* - * - execution with trace, without breaks *) +(* - line number - execution with traceand without breaks *) +(* up to the given line, then standard execution *) +(* - + - execution without trace and without breaks *) +(* - - - abort *) +(*--------------------------------------------------------------------*) + + unit goo:procedure; + var pom:movel; + begin + stp := true; (* stop ! *) + call scan; + if s=sconst and k=3 then + ggo:=1; linenr2:=adres + else + if s=sast then + case adres + when adast: ggo:=2 (* * *); + when adadd: ggo:=3 (* + *); + when admin: ggo:=4 (* - *); + otherwise raise deberror(34) + esac + else + if s=/= semicol then raise deberror(10) fi + fi + fi; + (* deallocation *) + pom := mov.next; + while pom=/=none do + kill(mov); mov:=pom; pom:=pom.next + od; + kill (mov) + end goo; + +(*--------------------------------------------------------------------*) +(* *) +(* R E P O R T *) +(* *) +(*--------------------------------------------------------------------*) +UNIT REPORT : PROCEDURE; +VAR POM:INSTR, + P2:DEC, + M,I,K1:INTEGER; +BEGIN +CALL SCAN; +IF S=SBREAK THEN (* REPORT BREAK *) + CALL SCAN; + IF S=SAST THEN (* REPORT BREAK * *) + writeln(co); + WRITELN(CO," LIST OF BREAK POINTS"); + WRITELN(CO," LINE NR / MARKER / INSTR. LIST "); + FOR I:=1 TO lastbr DO + IF BREAKT(I)=/=0 THEN + WRITELN(CO," ");WRITE(CO,BREAKT(I):8); write(co, " "); + IF BREAKTL(I)=/=NONE THEN + IF BREAKTL(I).MARK=/=0 THEN + WRITE(CO," "); + CALL WRID(BREAKTL(I).MARK, 17) + ELSE WRITE(CO," ") FI; + IF BREAKTL(I).INS=/=NONE THEN WRITE(CO," YES") + ELSE WRITE(CO," NO") FI + ELSE WRITE(CO," NO") FI + FI + OD; + WRITELN(CO," "); + WRITELN(CO, " "); + ELSE (* REPORT BREAK - IDENTYFIKATOR , NR LINII lub kropka *) + i := findlin; + if i=0 then raise deberror(18) fi; (* break point doesn't exist *) + if breaktl(i)=/=none then m:=breaktl(i).mark fi; + writeln(co); + write(co," BREAK POINT - LINE :", breakt(i)); + if m=/=0 then write(co," MARKER :"); call wrid(m, 10) fi; + writeln(co); + if breaktl(i) =/= none then + pom := breaktl(i).ins; + while pom=/=none do + call wrlin(pom.txt); + pom := pom.next; + od; + fi; + writeln(co) + fi; + call scan + ELSE (* OCZEKUJEMY REPORT DECLARE *) +IF ADRES=ADECLARE THEN + CALL SCAN;P2 := DECL; + IF S =/= sident THEN + IF S = SAST THEN (* LISTA WSZYSTKICH BANKOW INSTRUKCJI *) + WRITELN(CO," LIST OF DELCARED BANKS :"); + WHILE P2 =/= NONE DO + WRITE(CO," ");CALL WRID(P2.ID, 10);WRITELN(CO); + P2 := P2.NEXT; + OD; + WRITELN(CO) + ELSE RAISE DEBERROR(1) + FI + ELSE (* LISTA INSTRUKCJI BANKU O PODANUM IDENTYFIKATORZE *) + WHILE P2=/=NONE DO + IF P2.ID = ADRES THEN EXIT FI;P2:=P2.NEXT; + OD; + IF P2=NONE THEN RAISE DEBERROR(13) + ELSE + POM := P2.INS; + WHILE POM =/= NONE DO + CALL WRLIN(POM.TXT); + POM := POM.NEXT + OD; + WRITELN(CO); + FI + FI; + call scan +else + if s=semicol then (* report; *) + writeln(co,t9,linenr);write(co,t29); + if echo then writeln(lo,t9,linenr); write(lo,t29) fi; + call inf; + ELSE RAISE DEBERROR(14) FI +FI +fi; +END report; + +(*----------------------------------------------------------*) +(* *) +(* S T O R E *) +(* *) +(* ZWIAZANIE listy INSTRUKCJI Z podanym PUNKTEM *) +(* przerywajacym *) +(*----------------------------------------------------------*) + +UNIT STORE :PROCEDURE; +VAR POM,POM1:INSTR, + lin : integer; +BEGIN +CALL SCAN; +lin := findlin; +call scan; +if s =/= semicol then raise deberror(10) fi; +if breaktl(lin)=none then breaktl(lin) := new br fi; +pom,pom1 := breaktl(lin).ins; +while pom=/=none do pom1:=pom; pom:=pom.next od; +do + call newlin; + call scan; + if s = send then exit fi; + pom := new instr; + call intex(pom.txt); + if s=sident then pom.mark:=adres fi; + if pom1=none then breaktl(lin).ins:=pom + else pom1.next:=pom fi; + pom1 := pom + od +end store; + +(*----------------------------------------------------------*) +(* *) +(* R E M O V E *) +(* *) +(* USUNIECIE INSTRUKCJI ZWIAZANEJ Z AKTUALNYM PUNKTEM *) +(* PRZERYWAJECYM. (PODAJE SIE ETYKIETE USUWANEJ INSTRUKCJI) *) +(*----------------------------------------------------------*) + +UNIT REMOVE :PROCEDURE; +VAR POM,POM1:INSTR; +var ok:boolean; +BEGIN + CALL SCAN; + i := findlin; + call scan; + if i=0 then raise deberror(18) fi; + (* ODCZYTALISMY ETYKIETE ,SZUKAMY INSTRUKCJI DO USUNECIA *) + IF BREAKTL(i)=NONE THEN POM:=NONE + ELSE POM:=BREAKTL(i).INS + FI; + pom1 := pom; + WHILE POM =/= NONE DO + (*+ writeln(lo," marker :", pom.mark); ++*) + IF POM.MARK = ADRES THEN (* ZNALEZLISMY, KOPIUJEMY *) + ok := true; + if pom.next=/= none then + if pom = pom1 then + (* element jest na poczatku listy *) + breaktl(i).ins:=pom.next + else + pom1.next:=pom.next + fi; + pom.next := none; + fi; + CALL KILLI (POM) + ELSE POM1:=POM;POM:=POM.NEXT + FI + OD; + if not ok then raise deberror(38) fi; +END; + +(*---------------------------------------------------*) +(* *) +(* D E C L A R E *) +(* *) +(* DEKLARACJA BANKU INSTRUKCJI *) +(*---------------------------------------------------*) + +UNIT DECLARE :PROCEDURE; +VAR POM : DEC, + P1,P2 : INSTR; +BEGIN + CALL SCAN; + IF S =/= sident THEN RAISE DEBERROR(1) FI; + (* PRZECZYTALISMY IDENTYFIKATOR PRZYSZLEGO BANKU *) + POM := NEW DEC; + POM.ID := ADRES; + POM.NEXT:=DECL; + (* DOLACZYLISMY INFORMACJE O NOWYM BANKU DO LISTY BANKOW *) + DECL := POM; CALL NEWLIN;CALL SCAN; + WHILE S =/= SEND DO + (* KOPIUJEMY INSTRUKCJE *) + P1 := NEW INSTR; + CALL INTEX(P1.TXT); + CALL NEWLIN; + IF P2 = NONE THEN POM.INS := P1 + ELSE P2.NEXT := P1 FI; + p2 := p1; + CALL SCAN + OD +END declare; + +(*----------------------------------------------*) +(* *) +(* C A L *) +(* *) +(* WYKONANIE INSTRUKCJI Z BANKU INSTRUKCJI *) +(*----------------------------------------------*) + +UNIT CAL : PROCEDURE; +VAR POM : DEC, + MC : INTEGER, + P2 :INSTR; +BEGIN + MC := MA; + CALL INTEX(ctxt); + (* PRZECHOWANIE BUFORA SCANERA *) + CALL SCAN ;IF S =/= sident THEN RAISE DEBERROR(1) FI; + POM := DECL; + WHILE POM =/= NONE DO + IF POM.ID = ADRES THEN EXIT FI; + POM := POM.NEXT; + OD; + IF POM = NONE THEN RAISE DEBERROR(13) + ELSE + P2 := POM.INS; + WHILE P2 =/= NONE DO + CALL OUTEX(P2.TXT); + CALL WRLIN(P2.TXT); + CALL SCAN; + CALL INTLIN; + P2 := P2.NEXT + OD; + FI; + MA :=MC; + CALL NEWLIN; +END cal; + +(*---------------------------------------------------------*) +(* *) +(* A S S I G N *) +(* *) +(* INTERPRERACJA INSTRUKCJI PODSTAWIENIA *) +(*---------------------------------------------------------*) + +UNIT ASSIG :PROCEDURE; +BEGIN + CALL SCAN; + CALL FIND(FALSE); + (* ODCZYTANE WARTOSCI prawej STRONY PODSTAWIENIA *) + MODE1:=MODE; PROTDEB1:=PROTDEB; INTVAL1:= INTVAL; + (* ZAPAMIETANIE WAROTSCI WYNIKOW PROCEDURY FIND *) + REFVAL1:=REFVAL; RELVAL1:= RELVAL; CHAVAL1:= CHAVAL; + (*+ WRITELN(LO," ",MODE,PROTDEB,INTVAL,RELVAL); ++*) + IF S=/= STO THEN RAISE DEBERROR(11) FI; + CALL SCAN; + CALL FIND(TRUE); + (* ODCZYTANIE PRAWEJ STRONY WYRAZENIA *) + (*+ WRITELN(LO," ",MODE,PROTDEB,INTVAL,RELVAL,OFFSET); ++*) + IF PROTDEB1=INTT AND PROTDEB=RELT THEN RELVAL1:=INTVAL1 FI; + IF PROTDEB1=RELT AND PROTDEB=INTT THEN INTVAL1:=RELVAL1 FI; + IF PROTDEB1*PROTDEB<0 THEN RAISE DEBERROR(19) FI; + IF PROTDEB=NONT THEN RAISE DEBERROR(15) FI; + IF PROTDEB1=NONT THEN PROTDEB1:=1 FI; + (*+WRITELN(LO," ",MODE,RELVAL1,INTVAL1);++*) + IF MODE1>3 THEN IF MODE<3 THEN RAISE DEBERROR(19) FI FI; + CALL OUTREF(REFFVAL); + CALL OUTREF(REFVAL); + CALL OUTREF(REFVAL1); + +CASE MODE +(* PODSTAWIENIE WARTOSCI PRZEBIEGA ROZNIE W ZALEZNOSCI *) +(* OD SPOSOBU ADRESACJI I TYPU ZMIENNEJ *) + WHEN 1,2,5,6 : (* assign an object attribute *) + IF REFFVAL=NONE THEN RAISE DEBERROR(15) FI; + IF MODE1>3 OR PROTDEB>0 THEN + (* refval1 --> address (refval,offset) *) + call db01ox(10,refval,offset,refval1,relval,intval); + ELSE + + case protdeb + WHEN INTT,BOOLT: + (* intval1 --> address(refval,offset) *) + call db01ox(11,refval,offset,glovirt,relval,intval1); + WHEN CHT : + (* chaval1 --> address (refval,offset) *) + i := ord(chaval1); + call db01ox(12,refval,offset,glovirt,relval,i); + WHEN RELT : + (* relval1 --> address (refval,offset) *) + call db01ox(13,refval,offset,glovirt,relval1,intval); + esac + FI; + + WHEN 3,4: (* assign an array element *) + IF REFFVAL = NONE THEN RAISE DEBERROR(15) FI; + IF MODE1>3 OR PROTDEB>0 THEN + OFFSET:=OFFSET*2; + (* refval1 ---> array element of an address (refval,offset) *) + call db01ox(14,refval,offset,refval1,relval,intval); + + ELSE CASE PROTDEB + WHEN INTT,BOOLT : + (* intval1 --> array element *) + call db01ox(15,refval,offset,glovirt,relval,intval1); + WHEN CHT : + (* chaval1 --> array element *) + i := ord(chaval1); + call db01ox(16,refval,offset,glovirt,relval,i); + WHEN RELT : + (* relval1 --> array element *) + OFFSET:=OFFSET*3; + call db01ox(17,refval,offset,glovirt,relval1,intval); + ESAC + FI +ESAC +END assig; + +(*========================================================*) +(* *) +(* O U T P ( OUTPUT ) *) +(* *) +(* WYPISANIE WARTOSCI WYRAZENIA LUB JEGO TYPU *) +(*========================================================*) + +UNIT OUTP : PROCEDURE; + var i,j:integer; +BEGIN +CALL SCAN; +CALL FIND(FALSE); +IF S=SAST AND ADRES=adast then +(* WYPISANIE TYPU WYRAZENIA *) + IF R=/=0 THEN + WRITE(CO,t16,R,t17); + IF ECHO THEN WRITE(LO,t16,R,t17) FI; + IF PROTDEB=FORT THEN WRITELN(CO,t18); + IF ECHO THEN WRITELN(LO,t18) FI;RETURN + FI; + FI; +IF PROTDEB=FORT or protdeb =cortt or protdeb = proctt THEN + IF REFVAL=NONE THEN WRITELN(CO,t19); + IF ECHO THEN WRITELN(LO,t19) FI; RETURN FI; +(* protdeb := dispnr of the object refval *) + call db01ox(18,refval,i,glovirt,gloreal,protdeb); +FI; + IF PROTDEB<0 THEN + CASE -PROTDEB + WHEN 2:WRITE(CO,t20); IF ECHO THEN WRITE(LO,t20) FI; + WHEN 8:WRITE(CO,t21);IF ECHO THEN WRITE(LO,t21) FI; + WHEN 11:WRITE(CO,t22);IF ECHO THEN WRITE(LO,t22) FI; + WHEN 5:WRITE(CO,t23);IF ECHO THEN WRITE(LO,t23) FI; + WHEN 35:WRITE(CO,t24);IF ECHO THEN WRITE(LO,t24) FI; + OTHERWISE ; + ESAC; + ELSE + i := idict(protdeb); + WRITE(CO," "); IF ECHO THEN WRITE(LO," ") FI; + CALL WRID(prot(I-1), 10) + FI; + WRITELN(CO); IF ECHO THEN WRITELN(LO) FI; + call scan; +ELSE +(* WYPISANIE WARTOSCI WYRAZENIA *) +IF S=/=SEMICOL THEN RAISE DEBERROR(10) FI; +IF MODE >= 4 THEN RAISE DEBERROR(20) FI; +IF PROTDEB=INTT THEN WRITELN(CO," ",INTVAL); + IF ECHO THEN WRITELN(LO," ",INTVAL) FI; +ELSE +IF PROTDEB=RELT THEN WRITELN (CO," ",RELVAL); + IF ECHO THEN WRITELN(LO," ",RELVAL) FI +ELSE +IF PROTDEB=CHT THEN WRITELN(CO," ",CHAVAL); + IF ECHO THEN WRITE(LO," ",CHAVAL) FI +ELSE +IF PROTDEB=BOOLT THEN IF INTVAL = -1 THEN WRITELN(CO,t25); + IF ECHO THEN WRITELN(LO,t25) FI; + ELSE WRITELN(CO,t26); + IF ECHO THEN WRITELN(LO,t26) FI + FI +ELSE + call db01ox(30,refval,i,glovirt,gloreal,j); + writeln(co, " virtual address ",i,j); + if echo then writeln(lo," virtual address ",i,j) fi; +FI FI FI FI +FI +END; + +(*-----------------------------------------------*) +(* *) +(* M O V E *) +(* *) +(* ZMIANA PUNKTU OBSERWACJI *) +(*-----------------------------------------------*) + +UNIT MOVE :PROCEDURE; +VAR M:MOVEL, C:ARRAYOF INTEGER; + +BEGIN +CALL SCAN;C:=MOV.COR; +i := idict(protnr); +(*+ CALL OUTREF(MOV.ADR); CALL OUTREF(C); ++*) +IF S=SAST AND ADRES=adast THEN + (* IDZIEMY PO PREFIKSIE *) + IF PROTNR<0 THEN RAISE DEBERROR(31) FI; + CALL SCAN;IF S=/=SART OR ADRES=/=adgt THEN RAISE DEBERROR (28) FI; + I:=I+4; (* ADRES numeru PROTOTYPU PREFIKSU *) + PROTDEB:=prot(I); + (* protdeb - adres prototypu prefiksu *) + (* ODCZYTANIE PROTOTYPU DEBUGGERA PREFIKSU *) + IF PROTDEB=0 (* NIE MA PREFIKSU *) THEN RAISE DEBERROR(31) FI; + M:=NEW MOVEL(MA,PROTDEB,MOV.ADR,MOV.COR); + M.NEXT:=MOV ; MOV:=M; PROTNR:=PROTDEB; CALL INF; + call scan; (* przeczytanie ';' *) + RETURN +FI; +if s=/= 1 then (* poruSZAMY SIE PO SL LUB DL LUB CL *) + IF UNITCASE=RECT THEN RAISE DEBERROR(35) FI; + IF S=SART AND ADRES=adeq THEN (* = *) (* SL *) + IF PROTNR=0 THEN RAISE DEBERROR(30) FI; (* main block *) + CALL SCAN; + IF S=/=SART OR ADRES=/=7 THEN RAISE DEBERROR(28) FI; + I:=I+1; PROTDEB:=prot(I);(* SL *) + (* ODCZYTANIE ADRESU OBIEKTU WSKAZYWANEGO PRZEZ SL *) + (* refval := address of the SL of mov.adr *) + call db01ox(19,mov.adr,offset,refval,relval,intval); + C:=FINDCR(REFVAL); + call scan; (* wczytanie ';' *) + ELSE + IF S=SAST AND ADRES= admin THEN (* - *) (* DL *) + IF PROTNR=0 THEN RAISE DEBERROR(30) FI; (* main block *) + IF UNITCASE=CORT (* COROUTINE *) THEN RAISE DEBERROR(32) FI; + CALL SCAN; + IF S=/=SART OR ADRES=/=adgt THEN RAISE DEBERROR(28) FI; + (* ODCZYTENIE OBIEKTU WSKAZYWNEGO PRZEZ DL *) + (* refval := address of the DL of the object mov.adr *) + call db01ox(20,mov.adr,offset,refval,relval,intval); + IF MOV.ADR=REFVAL THEN RAISE DEBERROR(36) FI; + call scan; (* wczytanie srednika *) + (* MOVE DL W IBIEKCIE STERMINOWANYM *) + ELSE (* CL *) + IF S=/=SART OR ADRES =/= adgt THEN RAISE DEBERROR(28) FI; + CALL SCAN; + IF S =/= SART OR ADRES =/= adgt THEN RAISE DEBERROR(28) FI; + (* ODCZYTUJEMY CL *) + IF MOV.COR=NONE THEN RAISE DEBERROR(37) FI; + (* JESTESMY W OBIEKCIE NALEZACYM DO LANCUCHA COROUTINY *) + (* refval := address of the CL of the object mov.cor *) + call db01ox(21,mov.cor,offset,refval,relval,intval); + C:=REFVAL; + IF REFVAL=NONE THEN RAISE DEBERROR(15) FI; + IF CCOR=REFVAL THEN (* WRACAMY DO AKTYWNEJ COROUTINY *) + REFVAL:=CADR; + ELSE (* ODCZYTUJEMY ADRES OBJEKTU WSKAZYWANEGO PRZEZ DL GLOWY *) + (* refval := address of DL of the object C *) + call db01ox(22,c,offset,refval,relval,intval); + FI; + call scan; (* wczytanie srednika *) + FI; + (*+ CALL OUTREF(REFVAL); ++*) + IF REFVAL=NONE THEN RAISE DEBERROR(15) FI; + (* ODCZYTUJEMY DISPNR NOWEGO PUNKTU OBSERWACJI *) + (* protdeb := dispnr of the object refval *) + call db01ox(23,refval,offset,glovirt,relval,protdeb); + (*+ WRITELN(LO," PR=",PROTDEB)++*); +FI +ELSE +(* MOVE DO OBIEKTU OKRESLONEGO PRZEZ WYRAZENIE *) +(*+ WRITELN(LO," MOVE DO OBIEKTU"); ++*) +CALL FIND(TRUE); +if refval=none then raise deberror(15) fi; +IF PROTDEB<0 THEN RAISE DEBERROR(21) FI; +i := idict(protdeb); UNITCASE:=prot(I); +IF UNITCASE=/=RECT THEN C:=FINDCR(REFVAL) ELSE C:=NONE FI; +FI; +PROTNR:=PROTDEB; +(* UAKTUALNIENIE LISTY BREAKL *) +M:=NEW MOVEL(MA,PROTDEB,REFVAL,C); M.NEXT:=MOV; MOV:=M; +(*+ WRITELN(LO," NOWY PUNKT OBSERWACJI"); ++*) +(*+ CALL OUTREF(REFVAL); ++*) +OBSADR:=REFVAL; (* adres obiektu bedacego punktem obserwacji *) +CALL INF; +END move; + + +(*--------------------------------------------------*) +(* *) +(* R E T (RETURN) *) +(* *) +(* POWROT DO POPRZEDNIEGO PUNKTU OBSERWACJI *) +(*--------------------------------------------------*) + +UNIT RET :PROCEDURE; +VAR P1,POM :MOVEL; +BEGIN +CALL SCAN; +(*+ CALL OUTREF(MOV.ADR); ++*) +POM:= MOV; +IF S=SAST and adres = adast THEN (* KASUJ WSZYSTKIE ZMIANY *) + WHILE POM.NEXT=/=NONE DO MOV:=MOV.NEXT; KILL(POM); POM:=MOV OD; + call scan +ELSE IF S=SEMICOL THEN (* COFAMY SIE JEDEN KROK *) + IF MOV.NEXT=NONE THEN RAISE DEBERROR(22) FI; + MOV:=MOV.NEXT; KILL (POM) + ELSE (* COFAMY SIE DO PUNKTU OBSERWACJI, KTORY OBOWIAZYWAL *) + (* PRZED INSTRUKCJA MOVE O ETYKIECI = ADRES *) + IF S=/=sident THEN RAISE DEBERROR(1) FI; + WHILE POM=/=NONE DO + IF POM.MARK=ADRES THEN EXIT FI; + POM:=POM.NEXT; + OD; + IF POM=NONE THEN RAISE DEBERROR(22) FI; + P1:=MOV; + WHILE MOV=/=POM DO MOV:=MOV.NEXT; KILL(P1); P1:=MOV OD; + MOV:=MOV.NEXT; KILL (P1); + call scan; + FI +FI; +(* AKTUALIZUJEMY PUNKT OBSERWACJI *) +OBSADR:=MOV.ADR; +PROTNR:=MOV.PROT; +i := idict(protnr); unitcase := prot(i); +CALL INF; +END; + +(*--------------------------------------------------------------------*) +(* *) +(* F I N D *) +(* *) +(*--------------------------------------------------------------------*) +(* PROCEDURA ODCZYTUJE WARTOSC ZMIENNEJ A DLA LEXPR ROWNIEZ JEJ ADRES *) +(* WYNIKI ZWRACA NA ZMIENNYCH GLOBALNYCH protdeb,DISPNR,OFFSET,R *) +(* (LICZBA ARRAY OF ) I MODE - SPOSOB ADRESOWANIA *) +(* WARTOSCI LICZBOWE NA INTVAL ,REFVAL ,CHAVAL,RELVAL W ZALEZNOSCI *) +(* OD TYPU WARTOSCI *) +(*--------------------------------------------------------------------*) + +UNIT FIND : PROCEDURE (LEXPR :BOOLEAN); + +(* mode = 0 - nie zmienna (stala) *) +(* 1 - zmienna czytana jako offset w obiekcie *) +(* 2 - j.w. *) +(* 3 - zmienna czytana jako element tablicy *) +(* 4 - tablica czytana jako element tablicy *) +(* 5 - tablica czytana jako element w obiekcie *) +(* 6 - tablica czytana jako offset w obiekcie *) + + +UNIT SZUKATR:PROCEDURE(ADRES:INTEGER;INOUT ADRPROT:INTEGER; + OUTPUT OFFSET,R:INTEGER;OUTPUT TAK:BOOLEAN); + +(* SZUKA W PROTOTYPIE O ADRESIE ADRPROT ZMIENNEJ O ADRESIE *) +(* W TABLICY HASH ROWNYM ADRes *) +(* WYNIK: OFFSET-OFFSET ZMIENNEJ,R-LICZBA ARRAYOF TYPU ZMIENNEJ,TAK-WSKAZUJE*) +(* CZY ZNALEZIONO ZMIENNA,ADRPROT- JEST TYPEM ZMIENNEJ*) + +VAR L,ADR,PROTDEB:INTEGER; + +BEGIN +(*+WRITELN(LO," SZUATR ADRES=",ADRES,"ADRPROT = ",ADRPROT)++*); +OFFSET:=(ADRES-1)/2;(*+WRITELN(LO," L1",OFFSET)++*); +OFFSET:=OFFSET MOD 8; +(*+ WRITELN(LO," L2",OFFSET)++*); +OFFSET:=OFFSET+5; +L:=ADRPROT+OFFSET; +(*+ WRITELN(LO," L3",L)++*); +ADR:=prot(L); +(*+ WRITELN(LO," ADR",ADR)++*); + (* ADR-POCZATEK LISTY HASHU*) +DO + r := prot(adr); + (* r - kolejny element listy *) + IF R = -100 THEN EXIT FI; + IF ADRES = R THEN (*TO JEST NASZA ZMIENNA*) + ADR:=ADR+2; + adrprot := -prot(adr); + if adrprot <= 15 then (* to nie jest zmienna *) + raise deberror(29) fi; + (* zmienna lub stala *) + EXIT + ELSE ADR:=ADR+3 + FI +OD; +IF R =/= -100 THEN (* ZNALEZLISMY PROTOTYP ZMIENNEJ*) + TAK:=TRUE; + IF prot(ADRPROT)=VART THEN (*JEST TO ZMIENNA LUB PARAMETR*) + ADR:=ADRPROT+1; + R:= prot(ADR); (* R:= LICZBA ARRAY OF *) + ADR:=ADR +1; + ADRPROT:=prot(ADR); + ADR:=ADR+1; + OFFSET:=prot(ADR); + ELSE (*CASE=/=5*) RAISE DEBERROR(29) FI; +ELSE (* NIE ZNALEZLISMY ZMIENNEJ*) +TAK:=FALSE +FI; +END SZUKATR; + +UNIT SEP :FUNCTION:BOOLEAN; +(* SPREWDZA CZY PRZECZYTANY PRZEZ SCANER SYMBOL JEST SEPERATOREM *) +(* DLA WYRAZENIA *) +BEGIN RESULT:= S=SEMICOL OR S=STO OR S=SRPAR OR S=SLPAR OR S=SCOM + OR S=SART OR S=SAST AND ADRES=adast OR S=SOR OR S=SAND OR S=SNOT + OR S=SWHEN OR (S=1 AND ADRES=AWITH) + OR PROTDEB<0 AND PROTDEB =/=FORT and protdeb <> cortt and protdeb <> proctt +END sep; + +VAR ADRPROT,A,LINDEKSOW : INTEGER, + BOL,SL,POKROPCE:BOOLEAN, + CURADR : ARRAYOF INTEGER, + MIN : INTEGER; + +BEGIN (* of find *) +MIN:=1; +(* ZAKLADAMY ,ZE JEST PRZECZYTANY SYMBOL *) +(*PROTNR-NR PROTOTYPU DEBUGGERA AKTUALNEGO OBIEKTU*) +IF S=/=sident THEN MODE:=0; + IF LEXPR THEN RAISE DEBERROR(1) FI; + IF S=SNONE THEN PROTDEB:=NONT;CALL SCAN;REFVAL:=NONE ;RETURN FI; + IF S=SBOL THEN PROTDEB:=BOOLT; + IF ADRES=1 THEN INTVAL:=0 ELSE INTVAL:=-1 FI; + CALL SCAN; RETURN FI; + IF S=SAST AND ADRES=admin THEN(* MINUS*) MIN:=-1;CALL SCAN FI; + IF S=/=SCONST THEN RAISE DEBERROR(1) FI; + CASE K + WHEN kint : PROTDEB:=INTT;INTVAL:=ADRES*MIN; + WHEN 4,5 :RAISE DEBERROR(23); + WHEN kch : PROTDEB:=CHT; + chaval := chr(adres); + ESAC; + CALL SCAN; + RETURN; +FI; +A,PROTDEB:=PROTNR; +CURADR:=OBSADR; +DO +(*+WRITELN(LO," OUTP IN DO ")++*); +adrprot := idict(protdeb); +IF SL THEN A:=PROTDEB FI; (*A JEST PROTOTYPEM ZMIENIAJACYM SIE TYLKO DLA + MODULOW PO SL*) +SL:=FALSE; +I:=ADRPROT+3; DISPNR:=prot(I); +(*+WRITELN(LO," DISPNR = ",DISPNR," ADRPROT = ",ADRPROT)++*); +(* ODCZYTANIE NR DISPLAYA Z PROTOTYPU AKT OBIEKTU*) +CALL SZUKATR(ADRES, ADRPROT, OFFSET, R, BOL); + (*PO WYWOLANIU ADRPROT JEST NR TYPU PIERWOTNEGO LUB NR PROTOTYPU *) + (*O ILE ZNALEZIONO ZMIENNA *) + (* W P.P. ADRPROT SIE NIE ZMIENIA*) +IF BOL THEN (*ZNALEZLISMY ZMIENNA*) + POKROPCE:=FALSE; + DO (*PETLA DO WYPISANIA ZMIENNEJ a wlasciwie do rozpoznania wyr. do konca*) + LINDEKSOW:=0; + PROTDEB:=ADRPROT; + IF R=0 AND NOT POKROPCE THEN (*JEST TO ZMIENNA NIEABLICOWA BEZ KROPKI*) + (*+WRITELN(LO," ***LICZYMY WARTOSC PIERWSZEGO IDENT")++*); + REFFVAL,REFVAL:=CURADR; + CALL TAKEREF(OFFSET,ADRPROT); + PROTDEB:=ADRPROT; + MODE:=1;CALL SCAN; + FI; + IF R=0 AND POKROPCE THEN (*REFVAL JEST ADRESEM OBIEKTU PRZED KROPKA*) + (*+WRITELN(LO," ***LICZYMY WARTOSC IDENT PO KROPCE")++*); + REFFVAL:=REFVAL; + CALL TAKEREF(OFFSET,ADRPROT);PROTDEB:=ADRPROT; + MODE:=2; + CALL SCAN; + FI; + IF R=/=0 AND NOT POKROPCE AND LINDEKSOW=0 THEN (* PIERWSZY INDEKS *) + (*+WRITELN(LO," ***LICZYMY WARTOSC ZMIENNEJ INDEKSOWANEJ")++*); + REFFVAL,REFVAL:=CURADR; + CALL TAKEREF(OFFSET,1); + MODE:=5; + CALL SCAN; + IF S=/=SLPAR THEN EXIT EXIT + ELSE + CALL SCAN; (*CZYTA INDEKS,TO MUSI BYC STALA*) + MIN:=1; + IF S=SAST AND ADRES=admin THEN MIN:=-1;CALL SCAN FI; + (*+ WRITELN(LO," ***CZYTA INDEKS")++*); + IF S=SCONST AND K=3 THEN LINDEKSOW:=1; + (*+WRITELN(LO," ***LICZY WARTOSC TABLICY")++*); + REFFVAL:=REFVAL; + IF R=1 THEN CALL TAKEARR(ADRES*MIN,ADRPROT) + ELSE CALL TAKEARR(ADRES*MIN,1) FI; + OFFSET:=ADRES;MODE:=4; + (*+ WRITELN(LO," ***WARTOSC ZMIENNEJ INDEKSOWANEJ") ++*); + ELSE RAISE DEBERROR(1) (*INDEKS NIE JEST STALA*) + FI; + CALL SCAN; (* OGRANICZNIKI LUB ")"*) + IF S=/=SRPAR THEN (*S=/=")"*) + IF S =/=SCOM THEN RAISE DEBERROR(5) FI; + ELSE (*S=")" *) + (*+WRITELN(LO," ***PRZECZYTALISMY PRAWY NAWIAS")++*); + IF R=1 THEN MODE:=3 FI; + CALL SCAN; + IF SEP THEN R:=R-LINDEKSOW FI; + FI + FI; (*S=/=52 0R ADRES=/=3 *) +FI; + +IF R>1 OR R=1 AND POKROPCE THEN +DO (*PETLA OBSLUGUJE ZMIENNE TABLICOWE PO KROPCE LUB O WIECEJ NIZ + JEDNYM INDEKSIE*) + (*S- WARTOSC INDEKSU*) + CALL SCAN; + MIN:=1; + IF S=SAST AND ADRES=admin (*MINUS*) THEN MIN:=-1; CALL SCAN FI; + IF S=SCONST AND K=kint THEN LINDEKSOW := LINDEKSOW+1; + IF LINDEKSOW=R THEN + REFFVAL:=REFVAL;CALL TAKEARR(ADRES,ADRPROT); + MODE:=4;OFFSET:=ADRES; + ELSE + REFFVAL:=REFVAL; + CALL TAKEARR(ADRES, 1); (*ADRES=WARTOSC(S)*) + MODE:=3; + (* TYP DANY JAKO 1 OZNACZA TYP REFERENC.*) + FI; + ELSE RAISE DEBERROR(1) (*INDEKS NIE JEST STALA*) + FI; + CALL SCAN; (*OGRANICZNIKI*) + IF S=SRPAR THEN IF R=LINDEKSOW THEN MODE:=3 FI; + CALL SCAN ; IF SEP THEN R:=R-LINDEKSOW;EXIT FI; + ELSE + IF LINDEKSOW < R THEN + IF S =/= SCOM THEN RAISE DEBERROR(5) FI + ELSE RAISE DEBERROR(6); (*ZA DLUGIE WYRAZENIE INDEKSOWE *) + FI + FI; +if lindeksow=r then exit fi; +OD; +FI; + if protdeb > 0 or protdeb = fort or protdeb = proctt or protdeb = cortt then + (* TRZEBA ZNALESC PROTOTYP TYPU AKTUALNEGO *) + IF REFVAL=NONE THEN RAISE DEBERROR(15) FI; + (* protdeb := protnumber of the actual type *) + call db01ox(24,refval,offset,glovirt,relval,protdeb); + (*+ WRITELN(LO," PROTDEB =",PROTDEB);++*) + fi; +IF SEP THEN EXIT EXIT FI; +IF S=SDOT THEN +IF R=/=0 AND LINDEKSOW=/=R OR PROTDEB <0 THEN RAISE DEBERROR(24) FI; + (*+ WRITELN(LO," ***CZYTAMY KROPKE") ++*); + POKROPCE:=TRUE; + CALL SCAN; (*CZYTA ZMIENNA PO KROPCE*) + (*+ WRITELN (LO," ***CZYTAMY IDENT PO KROPCE")++*); + adrprot := idict(protdeb); + CALL SZUKATR(ADRES,ADRPROT,OFFSET,R,BOL); + (*ZNAJDUJE ZMIENNA ZAPISANA W ADRES I BEDACA + ATRYBUTEM PROTOTYPU ADRPROT*) + IF NOT BOL THEN RAISE DEBERROR(7) FI; + IF R=/=0 THEN (* ATRYBUTEM JEST TABLICA *) + CALL SCAN; + IF S=/=SLPAR THEN + IF S=/=SEMICOL and S=/=STO THEN RAISE DEBERROR(10) FI; + MODE:=6;EXIT EXIT; + FI; + REFFVAL:=REFVAL; + CALL TAKEREF(OFFSET,1); + MODE:=4; + FI; +FI +OD +ELSE (*NIE ZNALEZLISMY ZMIENNEJ, TRZEBA ISC DO PREFIKSU*) + adrprot := idict(protdeb); + I:=ADRPROT+4; (* ADRPROT+4 =ADRES PROTOTYPU PREFIKSU *) + PROTDEB:=prot(I); + (*+WRITELN(LO," **** PROTDEB",PROTDEB)++*); + IF PROTDEB<=0 (*NIE MA PREFIKSU WIEC IDZIEMY PO SL*) THEN + IF A=0 THEN (* MODUL GLOWNY *) RAISE DEBERROR(9) FI; + SL:=TRUE; + (*+WRITELN(LO," A =",A)++*); + adrprot := idict(a); + I:=ADRPROT+1; (* BUFFP(I) = NUMER PROTUTYPU SL *) + IF UNITCASE=RECT THEN RAISE DEBERROR(9) FI; + (* SZUKAMY DALEJ TYLKO WTEDY, GDY NIE JEST TO REKORD *) + PROTDEB:=prot(I); + (* curadr := address of SL of the object curadr *) + glovirt := curadr; + call db01ox(25,glovirt,offset,curadr,relval,intval); + (*+WRITELN(LO," +++ PROTDEB",PROTDEB)++*); +FI +FI +OD; +END FIND; + +(* ------------------------------------------------------------------- *) + +UNIT FINDCR:FUNCTION( INPUT C1:ARRAYOF INTEGER):ARRAYOF INTEGER; +(* SZUKA GLOWY COROUTINY DLA INSTANCJI O ADRESIE C1 *) +VAR J:INTEGER; +BEGIN + (*+WRITELN(LO," FINDCR");++*) +DO + IF C1=NONE THEN EXIT FI;; + (*+ CALL OUTREF(C1); ++*) + RESULT:=C1; + (* i := dispnr of the object c1 *) + call db01ox(26,c1,offset,refval,relval,i); + (*+ WRITELN(LO," I=",I); ++*) + IF I=0 THEN EXIT FI; + J:=I; + DO (* SZUKAMY W CIAGU PREFIKSOWYM COROUTINY *) + j := idict(j); + (*+ WRITELN(LO," J=",J); ++*) + IF prot(J)=11 THEN EXIT EXIT FI; + J:=J+4; J:=prot(J); + (*+ WRITELN(LO," J=",J); ++*) + IF J<=0 THEN EXIT FI; + OD; + (* PORUSZAMY SIE PO DL *) + (* c1 := DL of the object c1 *) + glovirt := c1; + call db01ox(27,glovirt,offset,c1,relval,intval); + IF RESULT=C1 THEN RESULT:=NONE ; EXIT FI; + (* ZAPETLENIE DL WSKAZUJE NA OBIEKT STERMINOWANY *) +OD; +END; + +(*-------------------------------------------------------*) +(* *) +(* C O N D *) +(* *) +(* SPRAWDZENIE WARUNKU BOOLOWSKIEGO PRZY WARUNKOWYM *) +(* PUNKCIE PRZERYWAJACYM *) +(*-------------------------------------------------------*) +UNIT COND :FUNCTION:BOOLEAN; +VAR BL:BOOLEAN; +BEGIN +CALL SCAN;WHILE S=/=SWHEN DO CALL SCAN OD; +(* ROZPOCZYNAMY INTERPRETACJE WARUNKU *) +RESULT:=TRUE; +DO (* PETLA PO "AND" *) + CALL SCAN; + IF S = SNOT THEN CALL SCAN;RESULT:=NOT COND1 AND RESULT + ELSE IF S=/=SLPAR THEN RESULT:=COND1 AND RESULT + ELSE + (* PETLA PO "OR" *) + DO BL:=FALSE;CALL SCAN; + IF S= SNOT THEN CALL SCAN;BL:=BL OR NOT COND1 + ELSE BL:=BL OR COND1 FI; + IF S=SRPAR THEN CALL SCAN; EXIT FI; + IF S =/= SOR THEN RAISE DEBERROR(25) FI; + OD; + RESULT:=RESULT AND BL; + FI + FI; + IF ADRES=AWITH OR S=SEMICOL THEN EXIT FI; + IF S =/= SAND THEN RAISE DEBERROR(26) FI; + IF NOT RESULT THEN EXIT FI; +OD +END cond; + +UNIT COND1 : FUNCTION:BOOLEAN; +(* WARUNEK - WYRAZENIE *) +VAR OPER :INTEGER; +BEGIN +CALL FIND(FALSE); +(* ZAKLADAMY ,ZE JEST PRZECZYTANY SYMBOL *) +(*+WRITELN(LO," ",PROTDEB,INTVAL,RELVAL,CHAVAL,MODE) ++*); +IF S=/=SART THEN + IF PROTDEB=BOOLT THEN RESULT:=INTVAL=/=0 + ELSE RAISE DEBERROR(8) FI +ELSE OPER:=ADRES;PROTDEB1:=PROTDEB;MODE1:=MODE;REFVAL1:=REFVAL; + INTVAL1:=INTVAL;CHAVAL1:=CHAVAL;RELVAL1:=RELVAL; + CALL SCAN; + CALL FIND(FALSE); + (*+WRITELN(LO," ",PROTDEB,INTVAL,RELVAL,CHAVAL,MODE) ++*); + IF (PROTDEB=INTT OR PROTDEB=RELT) AND MODE<4 AND + (PROTDEB1=INTT OR PROTDEB1=RELT) AND MODE1<4 THEN + IF PROTDEB=INTT THEN RELVAL:=INTVAL FI; + IF PROTDEB1=INTT THEN RELVAL1:=INTVAL1 FI; + CASE OPER + WHEN adeq :RESULT:=RELVAL1=RELVAL; + WHEN adne :RESULT:=RELVAL1=/=RELVAL; + WHEN adgt :RESULT:=RELVAL1>RELVAL ; + WHEN adge :RESULT:=RELVAL1>=RELVAL ; + WHEN adlt :RESULT:=RELVAL10 OR MODE>4) AND + (PROTDEB1=NONT OR PROTDEB1>0 OR MODE1>4) + OR PROTDEB1=PROTDEB AND MODE1<4 AND MODE<4 THEN + IF PROTDEB=BOOLT THEN + CASE OPER + WHEN adeq: RESULT:=INTVAL1=INTVAL; + WHEN adne: RESULT:=INTVAL1=/=INTVAL; + OTHERWISE RAISE DEBERROR(8) + ESAC + ELSE + IF PROTDEB=CHT THEN + CASE OPER + WHEN adeq:RESULT:=CHAVAL1=CHAVAL; + WHEN adne:RESULT:=CHAVAL1=/=CHAVAL; + OTHERWISE RAISE DEBERROR(8) + ESAC + ELSE + CASE OPER + WHEN adeq:RESULT:=REFVAL1=REFVAL; + WHEN adne:RESULT:=REFVAL1=/=REFVAL; + OTHERWISE RAISE DEBERROR(8) + ESAC + FI + FI + ELSE RAISE DEBERROR(8) FI + FI +FI +END COND1; + + +(*===========================================*) +UNIT INTLIN :PROCEDURE; + +(* INTERPRETACJA LINII *) + +VAR POM: MOVEL; + +BEGIN +MA := 0; +DO +IF S= SEMICOL THEN CALL SCAN FI; +IF S=sident THEN (* IDENTYFIKATOR *) + IF ADRES=AGO THEN call goo; exit else + IF ADRES=AREPORT THEN CALL REPORT ;EXIT ELSE + IF ADRES=AREMOVE THEN CALL REMOVE ;call scan;EXIT ELSE + IF ADRES=ASTORE THEN CALL STORE ;call scan;EXIT ELSE + IF ADRES=AMOVE THEN CALL MOVE;EXIT ELSE + IF ADRES=ASSIGN THEN CALL ASSIG;EXIT ELSE + IF ADRES=ADELETE THEN CALL DEL ;call scan;EXIT ELSE + IF ADRES=ADECLARE THEN CALL DECLARE;call scan;EXIT ELSE + IF ADRES=AMARK THEN call mark;call scan; exit else +MA :=ADRES; CALL SCAN; +IF S=/= SCOLON THEN RAISE DEBERROR(4) +FI;CALL SCAN; +FI FI FI FI FI FI FI FI FI +ELSE (* SLOWO KLUCZOWE *) + CASE S + WHEN SOUTPUT : CALL OUTP ; EXIT ; + WHEN SWRITE : ECHO:=NOT ECHO ;call scan;EXIT; + WHEN SBREAK : CALL BRE ;EXIT; + WHEN SRETURN: CALL RET; EXIT ; + WHEN SCALL : CALL CAL ;EXIT; + WHEN SSTEP : call scan; + SINGLESTEP:=NOT SINGLESTEP;EXIT ; + OTHERWISE RAISE DEBERROR(3); EXIT + ESAC +FI; +OD; +END; + +HANDLERS +WHEN DEBERROR : + if nr<>0 then + WRITE(CO," !!! ERROR NR ",NR, " - "); + case nr + when 1: writeln(co,"IDENTIFIER EXPECTED"); + when 2: writeln(co,"INTEGER CONSTANT EXPECTED"); + when 3: writeln(co,"INCORRECT INSTRUCTION NAME"); + when 4: writeln(co,"':' EXPECTED"); + when 5: writeln(co,"',' EXPECTED"); + when 6: writeln(co,"TOO MANY INDICES"); + when 7: writeln(co,"IDENTIFIER AFTER '.' MUST BE AN ATTRIBUTE"); + when 8: writeln(co,"INCORRECT CONDITION"); + when 9: writeln(co,"UNDECLARED IDENTIFIER"); + when 10: writeln(co,"';' EXPECTED"); + when 11: writeln(co,"'TO' EXPECTED"); + when 12: writeln(co,"UNRECOGNIZED INSTRUCTION"); + when 13: writeln(co,"UNRECOGNIZED BANK"); + when 14: writeln(co,"ERROR IN REPORT PARAMETER"); + when 15: writeln(co,"REFERENCE TO NONE"); + when 16: writeln(co,"TOO MANY BREAK POINTS"); + when 17: writeln(co,"BREAK POINT DECLARED TWICE"); + when 18: writeln(co,"UNRECOGNIZED BREAK POINT"); + when 19: writeln(co,"INCOMPATIBLE TYPES IN ASSIGN STATEMENT"); + when 20: writeln(co,"TRY TO OUTPUT A REFERENCE TYPE VARIABLE"); + when 21: writeln(co,"MOVE ARGUMENT IS NOT OF A REFERENCE TYPE"); + when 22: writeln(co,"UNRECOGNIZED MOVE INSTRUCTION"); + when 23: writeln(co,"REAL AND STRING CONSTANTS ARE FORBIDDEN"); + when 24: writeln(co,"'.' AFTER AN ARRAY"); + when 25: writeln(co,"'OR' EXPECTED"); + when 26: writeln(co,"'AND' EXPECTED"); + WHEN 27: WRITELN(co,"';' OR '*' OR IDENTIFIER EXPECTED"); + when 28: writeln(co,"'->' OR '=>' OR '>>' OR '*>' EXPECTED"); + when 29: writeln(co,"VARIABLE EXPECTED"); + when 30: writeln(co,"TRY TO GO OUTSIDE THE MAIN BLOCK"); + when 31: writeln(co,"EMPTY PREFIX"); + when 32: writeln(co,"MOVE -> IN COROUTINE HEAD"); + when 33: writeln(co,"INDEX OUT OF RANGE"); + when 34: writeln(co,"WRONG PARAMETER OF GO"); + when 35: writeln(co,"MOVE IN RECORD OBJECT"); + when 36: writeln(co,"MOVE '->' IN TERMINATED OBJECT"); + when 37: writeln(co,"THIS IS NOT A COROUTINE"); + when 38: writeln(co,"WRONG MARK"); + when 39: writeln(co,"TRY TO DELETE CURRENT BREAK POINT"); + esac; + fi; + + CALL NEWLIN; + WIND; +END HANDLERS; + + +(*=============================================*) +BEGIN (***** INTERPR ******) +PROTNR:=dispnr; +(*+CALL OUTREF(CADR);++*) +OBSADR:=CADR; +IF CBR=NONE THEN HELP:=NONE +ELSE + if cbr.condtxt =/= none then call outex(cbr.condtxt); + if not cond then return fi; + fi; + help := cbr.ins; + IF CBR.MARK =/=0 THEN WRITE(CO," "); + IF ECHO THEN WRITE(LO," ") FI; + CALL WRID(CBR.MARK, 10) + FI; +FI; +if first then (* first interrupt *) + writeln(co,' '); + writeln(co," LOGLAN DEBUGGER "); + writeln(co,' '); +if echo then writeln(lo,' '); + writeln(lo," LOGLAN DEBUGGER "); + writeln(lo,' '); fi; + first := false; + writeln(co,"INITIAL BREAK AT LINE ",linenr) +else + writeln(co,t9,linenr); + if echo then writeln(lo,t9,linenr) fi; +fi; + +mov := new movel(0,protnr,cadr,findcr(cadr)); +(*+WRITELN(LO," DISPNR :",DISPNR)++*); +CALL INF; +CALL NEWLIN; +(* SCANER CZYTA TEREAZ TEREAZ OD NOWEJ LINII *) +WHILE NOT STP DO +IF HELP =/= NONE THEN (* WYKONANIE INSTRUKCJI ZWIAZANYCH *) + CALL OUTEX(HELP.TXT); + CALL WRLIN(HELP.TXT); + CALL SCAN; + CALL INTLIN; + (* NASTEPNA INSTRUKCJA Z LISTY *) + HELP:=HELP.NEXT +ELSE + call sccd01ox(5,i,i,ctxt); (* prompt *) + CALL SCAN;WHILE S=SEMICOL DO + call sccd01ox(5,i,i,ctxt); + call scan + od; + CALL INTEX(ctxt); + IF ECHO THEN CALL WRLIN(ctxt) FI; CALL INTLIN; +FI; +OD; + +END (***** INTERPR ******); + +UNIT RUNERROR :PROCEDURE; +BEGIN +(* ODTWARZMY SRODOWISKO MODULU W KTORYM WYSTAPIL BLAD *) +(* OBIEKT TEN JEST WSKAZYWANY PRZEZ DL HANDLERA *) + (* dispnr := number of interrupted object, + obsadr := address of interrupted object *) + call db01ox(29,glovirt,linenr,obsadr,gloreal,dispnr); + cadr := obsadr; + (* ccor - address of an active coroutine head *) + call db01ox(0,ccor,dispnr,glovirt,gloreal,dispnr); +(* linenr = line of the last break = (sometimes) line of the error occurrence *) + write(co,t28,linenr); + if echo then write(lo,t28,linenr) fi; + cind := 0; + call interpr; + call endrun +END runerror; + +HANDLERS +WHEN ACCERROR : writeln(co,t1); call runerror; +WHEN CONERROR : writeln(co,t2); call runerror; +WHEN LOGERROR : writeln(co,t3); call runerror; +WHEN TYPERROR : writeln(co,t4); call runerror; +WHEN SYSERROR : writeln(co,t5); call runerror; +WHEN NUMERROR : writeln(co,t6); call runerror; +WHEN MEMERROR : writeln(co,t7); call runerror; +OTHERS : WRITELN(CO,t8);CALL RUNERROR; +END HANDLERS; + +BEGIN (**** MAIN DEBUGGER *****) + CALL INICBR; +(*+WRITELN(LO," RETURN AFTER INICBR ")++*); + inner; + call db01oe; (* end of block prefixed by LOGDEB *) +END logdeb; +(*******************************************************************) +begin + pref logdeb +(*$d+*) +(*$l+*) + block + var ix : integer; + begin + ix := 100; + break; + writeln(" ok "); + end; +end + diff --git a/sources/pass1/loglan b/sources/pass1/loglan new file mode 100644 index 0000000000000000000000000000000000000000..beb38611ae6f6bff61778692ee4709628ba44755 GIT binary patch literal 200098 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

    }1ziBZ2;s64tK%t$ORz=i*$o zil~e6#%%ASrjWxn0U)b{Fa7E`MfwcRqpy*s`QNl`y( zH4nnhKf4FyQe`@XILkC&d#p-vvb!LPip9RBvg9s)9VC|>6@W8d%%{~ASlc^7%OFq( zQ*2LBMkTrPPhLrGG3701I2>6v%!eCWYZr3gapdMPfo+tITfy9u&9)|l*aF!&s%|`zexJQFsk}XowABjMI&!jebQ$9 zy0)@rG9YuaZFC(JRR;r6AD&C6l0;XzZFx9X_u5)j)bit5rVXnOM=&Dw@J~ z(3LK=nrv+&Y>L~qgb>g=CU%LhN4Dy1asULb97lKIP z1<8=pb;EIc`FA1#UaP0EaZXOf%FS1!-}!TV=4Afo;ET&<^iXM+N>M7@SK>&@u=JLC zTA--le!$45VJYo)9-`!1B8_~M2B2hnT8EKTbiHO*mB52}(ieN>Na@q7hhs$i^NUpA z%8><0?6L9Cwc^C1D)aB=@)U8Y5V_SA0%yZy@+@%AS8MtjWN}$3`cBVEp%f^EmP|y} z>Lnc$<3mxh-;)Nf{-gt>?Mg$=_;&SsYBN@BUf`Ya46b8==hoG*73U`lyf7LE(WIg| z%qvV^L~?0ITnBe>|BeDXNJeru@)hwJV`SWWa|EM zk8GRhk#SY`JoYYWEVs7~duz(=jVjROnv-Wr|M)X4nuQZflGaDeA4#p(jI?rwU)CG? zy_%S8{`}D2XmB6RE%4yZ=bWBE5Xtbx7?1BCy1DS&lH^7yda3Hi)T_*r&j-6+XS`_Rl1WC0bN2olAiE*`CZ9{wi21?FRd{5r+u=ZRlgPa z^K$xMI@pYkh_>cRwGNAv@7pb$Na9>4G=t0s`Z-F5q1xVEN?)cBcSxa%%SmysuG8Pi z=CO`rwW1akl_go}=PIGnin}uSxV5qwTiB$j?op}-h+z}CL2p;pevXtHo@5=v!CjXY zt~^>)VpDzGK5!T*pVj4eYJ)W1+}ChKqH(VaIA-O!3ST+MwL9YLj|-C-jS{B6)Q6s4 z?4QJkvsw0`Gp?(ZN^GB|9`*3#7-=3+f{CN!!D4w^gpb=Ce|cBp0j->C zd;fPOhpjF{*A-d)9KiNu{hHL0{7F~WzwrU8zGsI=K2MBt6N;*q3##PYHrH-h9X9Qw z4&~%XDM|MED(W&SiV@xwGp?#!dHs)yC71`Y+gzC15WP+Fk*FN!E-^3yn+R<3eEq@I;iaH*B%!b{>pQ&}YQv{D$~ zM$TWU>SIy(g04leEb_@)Ct@187LSGLN@skmQwbiIzLN0mtS97SKK%#A1Lo7zLeE<& zGM#d@#&A0*d4A@EJU4**nS&E+SL=E4)O#DS+?BnnN|w8`MT4*H)ysFrdr>zR`fiZ{ z4LRlGdagt3LEo1DDW2ul?X^0y_0sq}1Z}=8KMeoCztfmh;vVkKX9W4Jnr?Cyq^ig* zQd+K*Z*;rqt4L>IO>&cL*L!{b8!De0Qz?Sly?Ze8clLM8X5JBqp~KjF>L}P zQ_`6q`?Sk2+1&V=4<|K}Kf9<#5c_IF3>q}By(CqUuPXiBOXUh}8~DVFj-wt@ehY4F z9r>;%-4ds+Hc)YP(u=aQtY7^#eex)|?7HlzOlBVFY1Q$Ge1_6+O4o^mk!wX!(UZ?= zN~WgFlYq&2S3XtqZk3zmuSq=lI$8F`!sKl16Ami>T4Kz#$z63X$WAI|kZ0Nrn&9+g zqPF(|rkI?zdRXtRrF0#o=_*XMA~Yn?`c-P*b(M@vHH7Y}s^nLHUO&|K78&o|adHYS z-S!>YhE!sC@iI$u%T)8be&9v@$gRXEuY93+K6{!=qO7f<@JCC|cyJh`mFICitxTr9%WTpWgTxr2~9<5k; z8SX1INM~w;!dSM<w(fO8@XZd!6$)PJ5;84%ON=xpwzNZRVI{N^E^@ z1)TOFs$E6J@p1lI+xs436r@^cQ2z8P4GNs{=pRR#dO6ZRjuyv}{uR}y=Gw%SC)?xh zWj(EuQ=vn$L<3amgKTjZokeoXkcu^#1Ef>h%^>UrxY9YHYe`{}vRm;pDCWF1tMp3E zAB_2LzdAp&d+AaH6PjD&gm1`{MgM(QL_d&5uY7Lwx?@#23Y7DYZ8!@XqG$~gQt7Hn z_ke6PeSnmilc>?0H#Q=A=JxDGiv4bc{EZ7&zulG6sSk2XI|Cvp#qo|-%(5F3)5@u@qiNtR{x zSl$JUtn!z}5NE6Z7|nC!7hJ)k=k>VLR^*$;7h8i>M=q~1=dbC)G)`~Xj8_WZ{H3$9 zZ@!5Yp5~Gj))cOuYCFC#Ny9&rXycl~$VZ9I#+#P&DowVYf4NdsoiGBd!>$3ftys0y z$D7z1wyO!~;!C!twElMb)eec>63=4}@^D()`ycX@P7EUCf<1|IJ&Dxz>IU&-by>Sw zXLOzjNH>-?ZKNBTtGSFDb4Q_7m6NuZ&}&Tfy58rJ4BO>XSEE-HSzG+i+maOXmlhga z%Qg26quS?Us?KP_do5Tkd7&ZB8x$NvWilk{Wp@)#JKcV6{x(I_DNW+*6%T5hCBCCaynQ`O;6Iu|tC)1UElbp6BEoY-V7-Q$bGqM>wr_j>B zpQkFQbho~?)J|K`Rqe?hW@GWgb6yuc$+r~s#oQ?$Jh|t!Rr#u(*Phr_^_W_1eCa$( zKNffCJ?nZM!|$}U$vmR5ToHUFt#C?u3G)aS-a1N;KIPBFj#W*jP`GAvYJUe6qfaes zy{Ma{k_J#5j`~wW>ub;fwWx(s>zI>ElX5dxvaDS;s>Hvc#2-8h!~34@dAy4EwdtZy zaY59_D*nZ}E!*m}J?-k1T^{E3toiPqi>vwE*2QP$Z&Pyr$y?mY9jF3oD$KvKuorVu zN2(Eb@FXVN659EbLF%{P$)Bu@VwKr*as6G>Ge|CbYj7!zK>H2LXmYiU68|H)o?LEY>yA^bMSmjSP?n9U#ubR?v9L&&#?wE}i==Pbmk#ob{7T z-zRue2!C#6I>FMWC$kdy3B%jTGWyVSYCj_U*O&`xM&_p*pWbR4=)mqmgMNFydTL+8 ze3i>bgC`HD!no4y3So&^yLJl|)t?qy&1>WiN#f75L_v-j@4FM@=`X`%feoI}M(Y2NsYZeYcoA zPC2zo0=JAb8@G~H{Z{19DKrR@7MMIr`4=3npx6iZ_7@eKh=XdA;)DOYyecD{mj@Hl zb@}tw&egk;>P$L4=WEo6i(l_OD#iqjC`{g|Q)Gjip!{$*C+f$l)c#yEs;GOe(Uy;^ zHnC7FfE^0s`WxeS2I_%1o@Vt{tql7Hurz%H+tmUDf#K32Rexv=zcOT z*@@4^D}6qf$`>BcF6t+B`eHb4z!8n_H!>dG|MTDM9k%zs$8Z?*4Ex zAOHHXW7*?OsTpa0KG(Rm^p&qNo5kbxwY?iv!O0``%g82{rlQghZb?i3mr;64zm`h# zGt;y0bFR(xYFtV3yEeB*rhlE0;ox#)$ph)h0wa0F$pev0viQCtUU_hBZmnV#6tg9@ zo(InRCGA2QZMPwYmisWhBKAeDE#1EpM`dpd8TYhf6yI;ME#_%K?Q^TT`PWrjnA6Gs zo+tjyUHm|Cg^mXQoCLFvqdR6Q@~@9uXOtVC4wlYWPv|rFm8lwfLY{rZy=+B8DRS#% z{s$TN%5KifN*C{QXi(lsdmh*w>={NAVNsd#1~Go~uS|>Jqxv38PZ-z2e1DJc0SfVi zJAWKfaLFJ4bDxqP7aMQsO+)2-v^-}1Zq9*ypTT51Z%^GE(_VJV!L*!O4jap-)UF$> z{ghOK1dDVlE(tyf>!h(OoTIPOl5x$^<3{(4#!&Z*b0HTsIv9-3DdX|-PM>Tg?B zq7%9LpwYNh2UB^|nW2g$%5=r<`C3)q^c9Y3?Ul8uyfWlP1*Ul{hoi-dN_`B11HFo@ z%Vzo0c;6@ozG9yY0FfK7&VNa2?!YE;jq)H;%2_G1vOPn<$T{f@m^6qqsgM0Vp=rq- zcY;;FV`3P&8|Bg@n(#qds8jAky!O9>MvcP3vWq_l{+R}O)KwLmD#lq-oF25jP&ppH)}RO&YFyC z`Kq}>!=TPE;!H5-y8OEO<21&V*nhR`T*m%FgRuOvvjz~NE>?YsX^Ke|>R&3-0-IXZ zzsTSKw_~ym=R(+T4Id<*jdE4FZLq z>h72NLDGx9Q`En?P9}e|57J9R zj25y=X5#x2E!iuugH=T98!CGp0LMvrChhFA|CMU#$40+PKjv9=d)((tVhBjj4YP-s z$BawTPmAtI>qw6$Ci&IhuBwe0txre|7Ys>XQ+L28YMGIC*ObXZUj6u_{G6rtswXF)~RmW83s-lZix@;bx7F<$k5Mo>R>{ zVvq8vI4mtT+bI&&BZ^sxD@|}km0A>^OC+rHPHrq8*aqeFQ~Dj-pW~Jx;el9;L?R5< zS<`~O+#gf|9tLaF)c*8kR=*vU+`);wxI=?xxWYzzPVjEpNxXL6Luz?wT!lWli;2$B zcaB9bE0|iFXY}Wu-pZKLi;l3k)~!t(XuY6Yg_InI$l|gwThh{d7Z|(v%Ls zahce+7478En|1?-q!c&m^nCSXKB~-dPBC+$(q|7+0lTH+JGt4;l1)A>>1${i3?D4Ci4IXeo<|vt-Cr<90qXsqUFgW8ea`Or;20Sf()da`3#nP&GJ5kQ| zx1b__eHy4b9@wYcSkIh(*SRHKoIZF?_*TEAvuJYVOPLRsH9-&lN^xv!p_sX^r&Vsr zFOC1T`RmI1xxbWCH`>ZNCAW2FDW{QQ8r z{KbVi@}f`Sq{=f4{IWVrI-2%hN68DtzT2 z?}p`nI&o;sFf%iY^-ADjN?e*QAI(u)OP?KfA9f=xRs75N_8EINvD~Qi%ST)tMK{|@ ze|jTY2K&%JHfe)=pUpQ?4tNcWYZN;{x#;_*UFuC`a7A5WTHJYAbMcMXFBC3M0i zhcw@~I4VYZ@is<=dVfBouRbo}*59Mn7JZ&qwrCt>3iZEafvl$+vg<`pEY_f@DQ+|e9o*oO48ZrSIcdS9Oop=iAo!}@qOU1 z4)s&Ih^KOUS`~5{t)oG*vFz63S6^qxja>{|jbLB~pDd5-XYRt|{W-NP%EHn$(r-c^uND<= zZk3Mmr{$D!Zj*+EAJMW&Rbs^3L$GD2@h%I4_g&rGMiLajcxgOADwmwXfkQ z4x^8G?5-o3NcDuS7aY@3(dAFiWh#)Qy7kso#?sYMQ4ywA32S@(u~P}=hG6waI8914 zlx6#Xlb15DgWa zii!CiT9(P1C!S^v9 zml<@|>2U%*M+HpZjhBezq4D`WyD+Iq-s$ePzFBSk*N?cZJJs4RxSZ7WYHjk2b=hN8 zs_bKKN3Qp|Rcc+`ce=`x7I@EQ7WoI?<2D$g%sw^p3HA*=$G+<(+P6jaU76UY{IE}L zSoYQVgks#7m&{c$^yr2;eNeq7b~VpTPf^r1J4%P%8clH?IozX5>KBvuKnrPy`WfTZ zzfz{Yuv9DEW_0;HEMtgb&8^aL{uMl9%>S#X*q&Aoce;g1qN@>w({)r@@z3FO#qAmV zqpobT9j&92_>zv&N~D+a=0!<)?@{RLD)@(*6BQqv@0Zj?>=U|P6cJ9)C-H1S*NN9& z=XYiu?-h~w3t#azRX%`z0)vmvH3pWFX<Ge?5)jrf&Ul z6Ak4vUZYMLix7K}ELA>p`nUMMEXUf_I~dkh50Z1(rDSSXe@;WFV)P7->Ln!~`IH1s zD-o=gAfn8}PrRR%5g~cabMH^#o>r-oEZu<0T$F#NRtc#|eAD|?jlPm{sgvK@)z3=MX2CoQej$O9rm5=8v9F=r^}dK_ zclwFS^l7D^T$PNA>DRXh+DRb>f;m!8Js4xh*5|0tN2jM%k!Z@Q#J_Vxu%PSOo>qld zbX_^}w}@3=vbdt_{GL`BUD0)WSquB%`3ILJ<5>DHX;JwFWhK3nYgQ^*e6Q85MI((w z3-Djr;3Lsn5yjx6qtYL#nzAcZ^#AOgoqQ%ki{FVKyZFkL)X6g9YEi`QK@DHI(hizU zOfsuoJs{_6SRYs})z|Y-qE|OQ^c#R&0XYKs{t>_Vi=A7x)V`K%oC6QB78<0N4#UxQ z6{qyR&mTKR$9+jrNAxEz0c6{yMg1aCHSrCQ6M1pwrC4~ZO7esIQ-2mUGnSdCxzmTm zG0SRKzl!C$AChlkwf6y`ohRXEq>jxz=@(f>`&%D44G< z@vFbm&)G97Dup=nQmWQ3Dg~c|6_u)=iZ9c+oO58sBMsIa8M1~$XtDN*Ub0G?7TuRZfQUmnVC3q1LXq|0`_-or^@j#Sfr zDw{e=zj$+^lYeh|A^V*<=dzVqKYep-NVZAh?^DF_cC9>~{)d>PW$N52*~+_mG^{42 zmV89-K1*Ac{ugBk8g2{ggWXE{VUH;}Q7MOYoB;a%FW>F;MFay1(zL~e)zyE4yKrNJ zGUn-YIkUF+vk2!lDCgQ<-Xa$F*%sy~qqOufN>!(&@4B)m_0-KaLswn0Uiah6Q$M}b z72>MN-hdtc*nvMr4(cMFj|+2@dE9IVfF%oQDNnduw{q-NufRj%HSlmt+r7Mj%}TuClA{7l4W!+UZ2Z;#(d{pV{DH55?lUhi?mrum8^a}(+BTUQZ8;N)wLh{J>4fV*JkvD{TjDzev-+U zFJtnSV!bqPExH4{Wgu_S(-3RH4g^I>r&bB$*%1pkMUq5r9in9xb&&ddJ8Y%w!q%P$ zwUdV6xee0E|0TC%@&5(2_imtS_{>ur+^c$0zy(#3+;PIQ!}`SUhYL2x@x$R=A4(JW zm^yA8oS1(ZyJ5sj&ei9}ogrOs<5-({9P1zVEre3c?BcW#^6<#9>{bHYl~bm<-87N- zibNdm(Q%CC4j)nzn!><9jgP-vpJt_Lc3`k9D+_i?AnDX9VQuep^;rq21cBe@#xe3{fNXmi{-EtZ2qcBH->A0&}>&WfR z3eVs*J;EQvru1suunIqwAwh-zRNBtsKi~Q!JwD}-dRR6OsBVk;NzOrE9$ww2guX;a zR6-3-!0tP^D@!ygdTMQN3zZZHoR?g{K~nS48q2G@cJ;LijxRjpHH~xJ*otiAzZfpF zqy@a5%jTXLTO52E>eY!a!k!SbFga`d%?P7!NM^XMQ?ASHS26zUv)PVm+4pz6b5O%# zIM)7bAG|(&%0Q0kD1Cv1#!cFPMli5fuF|AEwf5dW(C6qA`R0{X9P>&Z56cIX=U;w? zi8u~-o7bd1yxoZ5kQ6juai9PdoPK>B}J-fyQx7dA{ z5?Z3tm(l90d{oVGXa0p#Htn#jx$yvM$MhP()B?)0c zycI^`v8z2gD*f_7%JleD<=3a5!gQI^cf%3xa#Ss`_3wYp$r~#k)Wr>i`j^}Y$&toy z+|bi1TPkZm_8D?4)IX@b53b-S*~$l(L`46q_rqYGL-b~?18A_BLFLuns~fo}V+`#j z1za{-yY`bvnfY{_xQyHPImkC!rl}>-z4Jffk;bA+)8H8OJ_BGDlR*dH>|QYGwZrdk zV43VF4R%8^3pUt2F$s=cMpSEw){xd{#7vasHr`i&kwyLZ-dT6`GcgynP;7I;#uvjWHYwfucqsZ z-IB-qwB9oLG||GRr>A-`RXdj`N#$KLaf1plpxg@eHVbFlx_WCSu1`Bxw4q1!FIh-F zs&iR)yl8Zf>YtC3{Pb_qDx2{DRpyLOCzoieUagE(RNvuyZYrgp24hs>Jq{SEE{em8 zV$L5GQ-8-Ccz3JBZM^$y<&W97y_mPA$7KoV2VBA7t!Gf9Wm}<>S&s9`1n5p)^Si5R z5IW1DJE3#AM914bpi`}P2)fI9hoRFfI|4myS<5`)S~d^*+mN+#G1TeJgFb25Qs^y~ zErU*X9xI@?TGkDHn>!!4xdgi2vTabU^_n=fSnNDzKv%d#Ew7(i@zKZwdOGre?zL7Da$rM=Q)*)(EXNef-dAqO?(Bdw`>daZKu2&+F;op>76XS6@26U zG{!ByiVXeQ*0)?n$t{})J>s|2+|Fo+9$pk+&->%x)H--Uh9`L<<$2bEyG z1JJvy*Ld~RitkxA4Z7K~+0d|M&Cq)-Yk|Ju^yWbiI=y!2ht^vFoo8PyhQ4LJCD6;Q zw;39?Yzs7E+2C90@QfC`1r6$Q9;48ymK}vYY+1!ZnzLn<(38%i5#o*G#GMB9gw0T+ zWzEpXEo+Brn5)@^gl-S}pch)U1iHkwbV8?EmWRIUZn*+F&9ZLj)7I;U8Z27}-ROGT z4!zj29ndq@8-k`=wimkGvQg+ImK}vIbi*E8MEkSNJE8AJ8-i${YD3UXuHXF-jR)BQ zXdwJ@4TF?rmC)zH2asQMUDXUNbYEzJ-t2tmLD$%pcIa)6y8vnkzd%=6Zwd7G*6W0> zwk!`_Z`lgyt(J8|Ke22xwAivi=xwH*&^sKu8(L!79_WsfRE|;Tot7PiZnR#-b?Jaq z2|eY3wHms|EvyFmp}kfIMGLEkeqdQ6be~H!4SK}hXo5av*$k){y$rhFvRTlh;WcQz zWzEno+tLATuxt_ZMeD7Aik5Xlk6E@6y5Hs41ii~~w?dz`Y#a1m%Lb{IZ#eEw=xdH! zasAYa?^sp|z0`i04Gmk?4DGUB3-k@AHxKG^dP|`nTW=ZkWY`CN$9mn+hpe{>iXpof znrmOJfqv-TxE6YiW&Kc$qU)iknGMjZ9J&#@$}u)U7g@F$id42hudr+@6sc^7qL=M} zE^z1|6ft%}FSl$r6fq7%XF88jC|cN2=p5@+{8ic;E1~I@RYNgS*Fa}kRtG)hR2rce zU#3B4IVA)LQK~JHxp%^inp;H~&0=f4IOh=T?NII(hL2` zvNh1R+-256pFCS8_d_v+t%Lqxz4g$2?ob<`XD!=n$f4CxblMu|hnCer>ug^=)ZpA2p=iX@ zpzm9+37T%b8PFeG`!k{N-z@06)|(AQJ7|WUwyXt;6171wl+1^oa%emBP1kt`ROd#w z7z$4=fp%GMDHJ|f27TSK92B*%9QvANozU4%FAqI#*$SxLHm`!ByY)g}ap)Q-*1~I{ zFI(0RO}8!Upf|aNt%oA+2Iz~{+XzM6P0*v3ZH9D1HZ2E=7P}34*rD5@D8~-y3ziK+ zpLXlq4gI^V-vfQ#p+iutxA#JSZ`m;PBImImiWTbt=pl!epcq~bK?9Z@h9Zw63U!G_ zp=<4zqtIupSFt2*la-HA2xQr$P5y)&!kvOJ_h0jyn^2 zt4lcx`lR({Ls93=(8n!nfu>n+9`pgnZG%2-nh)J$y>=+#E`SP_bwCk!5%eL)SPWfn zS_1v8^_D^rcNw(WvK;gh+q@k5r9IRM-5Bi(y4!jypcsm~p}Qj@+4;DaISk?hGIL2b=KFmDfDf(mu1jpmgS%rOO`|Wg4C|6PAFPk9=gPOE1-Jk)(xF+y;V?@w-;))-Wn*z z@wL#!mi0s7t98&E%hp3TIF*f1(uSam9J(2bQGN^b3d^=aVd*yLyNN? z#R#$!dbwr0p;%DtfzG#V2#T873pu%A;G-_&KIo-Z+YiNnc>wBivoAq0*dBtOaoodD zY>XU%raSH^RO^OwRH2qtyd9aVs2Yk>@*3z&ht@&gauwA>uZbxS+UNne35rUc0iEg? zGoh&RS9xEQX>zEPCXyI$2XRX%{ z#h%4F==YYbha$ZV(C;kU2t|6EAbm}Z-5Mx*(H7`8*4qljtgsFGwPo9(NN)#p(6T`& z(%TKi@_i5VONS0Y5o0g(bIXRIh_Mg)oEy%5Xqqd(1U1+%hoGN1#$hPdq@z%rh8%@{ z;?RnBr0u^F>T`*zGg%GvUd!sB7^fSd*qWIJec!1xLD3gyLNU6`g625xY$$qkGxW4$ zv_P>!ng@N`vNkALD?v|L)(%D47C;yH)TslCjA55CgnsSX-z}N@%pU0T)*F({ z*6)S>-m+onOt+H#Q1qx06lWiYpaJV0hJIwLjzE8O4UR%Favp^~W4(%{Y5%Q+9<;0) ziZxmdv@2Q;6k~in^l9rgLeXcYLHAqMBy!niK=)ZT6N>a^LA7z>3`Kg)(8sOU0!4cB zpnENAgW}}89g0*spjbUGg8Hnt7z)2Eg#c%f_U(o4v}}#^TnlTZ=Mwcpk?%U_4(qLlBHss9l8g4uVq6}%!hlSTPz!fqHpbo zz7uOD=q87jpe9>&2zr-ghoKE_lcP}d!K2VS99nTB=Ln8b3Ef~>H55In2D%_x6BOGf z_0aX!YlPx_U>bCtWld1D*cs3@md%8sh0TJFxswrG%xQn369d|Lb$R1h(y~(nr(6?fygD$fy2gTKcPU!tkB@bQV z&=pW@8+Svmw`>&@(|#|c51lfFt1CVZA{pQr-!D*Lu65nCX6Gz~h_dQA{J?|5wsdsS`5X8?-J-lhc1PpO)itnspOzo@hpd?TCWp|R8~N- zchn6Xi_JuZdOqrf^yNg_Ri?KV`lI#wAvd9Qz&q^H^-wHOHbBo>ZKGt?+YH6N{}$+X z4&4gH<*Dt^dKY&G^c#l`LXNr{h~B#gI_SV5D9-WrLceiohoM*r?1O%3z5P(s#sTQ( zmX)BG=MFLMK|U8j9Xl13h59Iw;nL_0aEK-bN@^defl$t=9yF zuVz5^SvC`jzCBwqcc^CQ;|^_sVzn_3y4SKcD9&!@L-$zL4n>I;KwY-91B$qdpg!v@ z&h(Z-QRmB`)eg-;aTR|#)MHsE6umJI-Q|>5K#_7cRB(N)f}&mZLZ7q`)<7S1y{&~l z?DYDf=*jD#J1kodMUUE;(I)72r@R?@q0`$UnPY5)VhyY4$A9S;2`=KcL0q6mHqXZ?h8}v<=_b?PK_6XE! zy-_GySjA201-we=2B%yNg`aDnha960indV?{n3^-LN9b1p9Wp$xJ}TIWiz0Atv3_; zjz`B?&_e6YhNAyALswhY0>zqi9`vyDZOioLLswd_9s0Ce=K|vcfU>J~x&=zJGL zF{Lbl-sHGTp{s4nGUzhPa!{-TmqV9Y)(OQfTORtQ(^~<(-9GJxUT?isP|W|mP^)EY zpqLldLSMIi{ZOor*Fkfww;qbP8=%)%wh_9){@Vn7({VRL5qAspD(h{9BJMWmBFnZz zF-Giwo_5^9Om8Q2q4jn{amjQK^gZhhK>+jhUg))a}#>DH@;?s5IrKxbK22SpzB(2Fc< zgd&e=(3zGsLH9cD4CtWqmvcd$`-2un`-7sFErCw7-co3Pv_GiIvK$m=@yns9mUTk0rq4sav&}1@ zu&*0B=1aP(pjbWhLcg|EYoKAbp|#K-t=A8I%d&OQi7xqisL6G{5i)E7e(6GPhGJ6N z0^JjnDHOxiHt6FvYC9B5fk7xt*$K^Y=x!)3G3|j4+LR$EQr-)VST+pBfVmHPk{|>)qgx6svEDN1>(of>+OZEvr)rPoGk2vu8(mG zigTU=&_j+}g2H`=pm*5j!%)(gprZ9gp%?>>LZ7j$B1a!{Kdyuxw5%G6^<540fMs>i zJFQm_-5iZ6)0+m}Z@nfc8te?{z1Euv#SY>u=#$o)4aFW(GgNDvTc9ZKJm_BQwLwv~ z`OqcyK|2)J`4&J0>vce}hq(yqvuv^S?9(OC9kyjD6gQPEgH~HF2Sr0%4&83OPAD2v z9=h9lE1+m3-Oyc@t%9N)z0jSOt%0Jw^h0rL#yaQ@hpvZWpxFTRIk$~agT1>6iff&l zp}0b~1-jjFw?eUc*#_O~xZ9z)ys`tj)p~-jG61u^%YAEWr2Kt@rvJQ&& zTn}Auy+$bJxoOZtE@cz6-ucdeuCd-sDDs^JEwpSll(Z}8YRg)n*zcVOJ?!+_polvk zy3%^>kekZ_;7OZT{Ybhzse@us*9c9)KJLkbzVG|inxMFsZ3gr`%Vt6^bfwOMF7(VZ z8;ZEi(9_myfgP5%8o%i=nvIv;^8^*-|JHSq5Ef z19DI#w;cMK^*W(Ahsr~bTebp<^tz#cvuqUY-0t)(C~?r$KLVa!pWJJOjGVdNZN$-Yn>o zmd%D5Jf*fkF;dKf?saGz^h2MI&xh`@tR0Fmw*!im+9IgWp^Kq7<5>dztz}E0Z+V7X z2AyyFa?pC`yBzAVUZ?czf;@D$Wh=EsO-s{jI zC}~U3txkCuO4<^1v-S2vXL?jEL9yR>2zr-84@0qYFbaLco;(V@!=V+ArX{L`Zm_Hx zigU9X=xvtOL9tiU2t|ENgRXOE6ZA2+wHeSgmd%7VIJa5QLd#}DQE$!A)t0qDk#ZXp zDbI(lbZ9$tl~Y*&U13=V^g_!PL6=*$7`oCeVhQw^eYF%?Y`-jnF0)<^igUB&(504j zLT|HP9=gP`70?aNqZ@j?Wvigbw-;))Yz@@pv0^Rsb?4g;#aeA0G}n6Tp;$9*fL>$S zMrf(?*aXe7Y%>&jY=K^7*;Xjd^|nFZb{^ZItK24cK(DagAQV^Nc0w0gwi}A{_COa{ zHUz~wY8Z;8_&(@-hwg{sYU%;#Jj+VZInM16^isE%jV^hOLakQ^#aV7W^did|p*?O_)1WggYl5PO&VU*$n+YYWKT3P zjb`Xn>$N~J3e1CQEo+0K9P=TI+JSJ|0_YUWIx^WJ=x5GiF%*N|66i$hErss0$;+TB z%W_a`4=;zNTGk1LtMbqk%T_?sqR~m_Gow{d3>&@BpL|#S8YoV#*Ft}^tRIT>)1Dh;i2@~;7@%DaT?)nBO3R?H zTb6@1y1guizGhiP3q!k8*@SGfX*0yTlSp|B#5x+<3WeS_=m!qn4&7+l0j)O;LbscC zLV7dMuBzS8BbM!v%v1aj^fk-&LUH5mFx2W8`=C#o_Cr^i4nXToCFnZSA*jQt9EL7+ z%15C6mW@J>SauX@v8-Y{L!xDsP%L<=p;x(-HPHP|xekg8iS^K+<2FKHw%#fh~d>9d|MGikQ@-=eSFu*I2d;T5MSky4bSi&{D_kgx+RZ9$IhN3g|)0x}mL( zy9)ZeWxY^^_0~WSTecP&vR*&*h-K@bHp|vSU$$%m)Na{EC^_APrZ~OL&`UjiY=O2~ zwiUX-vTe|yW!s^PEZYG!+NXoi#g^@a2JNfe(505`fo5B82)f>~z0geCG7LRv**<8u z^VknPWZ40z(|RT7VapCdEl%$+^oV6gpkeEcLSMG*C{(g76_0URV_7BC=D5|+w=JuI zE_b`CgT7~3J=AW!M(AgjO@j_Qy(Z`a_vsnXD%(60dWB`Ppg3`#4b8Qz8CqfcTA)iU zn+N3_w+*_|viZ;*mbF8%>|6k~+rAFyKI<)lMs3St=poCNKx>@GQs`mJmO(rK$9Rx~ z9$+X}^nw{1|PW!s^+WVQoZ;c^T@v5UJC+HJkv zP+Uyf19ez$2#U)F|>hhn>ET_#%(Y0D?xk;~)UdfDP-HHB(TlRN==$_eRPd-XVdc{p#uIQHGa zmmW7f;;%j-eQ}-AQG7mrbxlp7VtmBpS^cu`@fkli{8i&Jo*3TqTE13vSJT~17>HQ zU3%;LI&WEi(`~bwuD$8D+i$t`{Y|g@%ZnZG|jy9 z<(J;tdB<(H+?>ldHC_Jx+w-^NyYe?R-TH10-hJzB@4GR7%e!u$Rnc_K`)~Q6lFHwq zu1w^zH{1?iub%Mw`%1SUeP5%@${6wsGw7GpUZ+iLJ%(!4ZTk*bY||cEHp>x zdm3^-%>>s;a9(aS6TH#!XGZ+%iO(xXS22FN;Wk6Jm}Z}peCTy&Wl{XZs$W)DS2P`~ z(m_wFe&4wA=Y<#UsyccO-GexD1$UjzS0n@+fVecvlgRy^9T{%NQ9o9(+c89!g(vLySDMV z1Hr28%DAcPv}4X=u4F3@99*X_u*z`#l`H1o7%^t$TLUi6^O-qmUUpYwl(^8K!;h{~ z!fXCUu86dq%v@V`=az`Wn}5!yk(b)YrSxU}T>GyaKFpmFr30*bvk$U0z46BUjmw)Z zyY04HZ+mT1)0H>9?^asptu(ZEFTeFeZY(tST~*uXFoy8AtE%p`j991274^{FB>ts1 ztZ15A@xM4nC+OqLLbz$&ZDX_e}%Gzn0s1*AVd)kv9}p z)I$`Ir`tPOG5^*x!3O9O&-oi6rjCj)>4$HjqpTXDYJ_@|Aqx6C=CHX960iJeQ8^9l zps2+<(V$2<4eW$UKdDnGrfr<&7(!p^*?vCh&?1h=CV61j&qD zRfi##&CrpIMj@7<$c~bE#LaR{%b|kmFY>$F`DrTG8#Q(lO@BNpp3#D@rm~?-wj`4+ z%4m5;of+jbT9HwAM$0m)cs0Hv8y@2(5A_vl0NJIcYUngm4HPGDbr7=+diBskQzI1D z_NGDCSk?rwdO~joL~TITc=%1GnaHj+&4R8o&4%Jsq8Yl(vKHtn(>y3#+y-55*?cHY zblai7vTOnLI#UPKVOj*e&9oSbD=$l+C6+CPUT<0k#mR3Dy1}yLP&9!~h;=gM$V2Zi zt$^B0-B7gPRglKVT~)nMEb7)kzp|g#LT_+rKXi#{9W>vx9=g%A0eYutBlIrQCMdR2 zHbXaAwgp;X+6rl`;*}aujcGd+jdcg~Zp#KC!%pC4({8BMvPrUyZ%n~p$n$!;&r?=LJHhF)gc2VH2| z55=f*0BW|Z1kEuWf?jPp4878H1bUUJpT^#1S_}1>)<7qi)@4*Pn98!An++9dSou(K zl7FKNwK1bjP`GC^6zyya6m5PhqnZG5$CEDJQ3{Mw3zmyJ_yEEDYg$+ZQY;Q)x8STqxe?|wO7;8#U^yNcY=;4fxWHbszQ#cAm z{b)ZXs1l0M>P%LX$?7ty&!`a!3#LI~K~okw1B#SqX0lmOOc}GGsPASd>boTiotIHt zrZ+#M_KX%lVL=BJ7A(p_7iY92qoq(-undYem4l-FEYD<}nO;7Vt;nc5qg7B?&bTbqq`4%YRZq4+zL1DpmC@k2Kg$`!4Go#&5 zq_PK!{x<~i$E|jm+Hj_}FH_r}(SeLgP#ACs3Ih&jp+_|n309f%xG3dv!O_(Ig_>cSfr+>V?9BHBeZvHVf^~XkA9@ zp|D^B6wP2G6w8cFnQU`LTQb_3(YB1XLt()VC@dJvLU(4gJEKMh)E*6}Oetbkz=MoT zYKh0HB)Gd(zxQ&im1BvBN!26mcf|5|3M-GdA&J-YmDC)i_TY2kY28;I@9&d%IpRfr z%b}RDI-%&Zc_^xFMHbo(#aOl~qh2Vf7%0}5YoSQFKhs;6(RwJB3LBsplQ%*UV^c<( zp|D^}Cff={1#Zh|JCsxm6c!9Zk>1WsZ+9l!110wtWwO0c_+U7b?So?e+7Ct3JphFT zrHl?iVZmW2EI0y%1*4hX(TpnoHMO7;3cYG5EU1B^!PY_HgL){sZzB{IOv|VV3JYdH zVZlr&Ql6FR&CaM93Lms&dh?)|)7qdIq~=3mL3T$U-}yuwYR}i=nV!2^1DA zg~EbmnO-iVvEVtAp!_9WR4$ilfpcg-zad6Z9? zp>x??7ap^6p+Sd5Db)U}H`aJtyEbu-RYfEMR(>ONi&Ax3J)>{DtEu0ym`SCszlg$@ z|A^x~AAt(NC#s?J1woh_>w#&cnnc~n+kJJ|l;0CDEC03Cy!QAL^7io( zd02^Pzosk^9Xb)g1^GEWt%3{lv)GpXi%+K8oR9oTUt^FVPaf5VX5Glk$tbIkFyXIO zp4d|*qxQ$~{QPSI7UZuAcuW4KfQ9+)fJJ;jiE_t5d)G%t{)fu~ybC+5IWc#HJP)q) zzmW$}j4a2(M-~3|od2yXvnP#zRN=47`QO_o39tAw;b-Uk?{&`!KR;JVc+OjT&A-HX zB3}GEvPf2r{e_zL0879A1!^LxU6`olv{4wzTu3sseti`q=LqwZuEXu$TmHxn^GUh3 z%=ImHc(Q?h1))(7mq7YjJ{njEI-xNyT!FBd*WRuBx0ZZK6e{E zSFO_8s&}gxi`YZv+kdZ(Mq4^VZL2{$uSMBQ^IrfLBVNvy?U^tizsc!;>5SQGXO+jKU@blqM~W-ISvrMo%x8nNF`lm~ zY2S!fr(cMTdA>5XW`^LD(%)U1ev-L#|C{hQ*N!f{uxa7-3p+Zv^6`eZUh>xKn=Y9@ z|FZcN_##)Qa@X)vdgK4#{xfnXaZ^SJ9z_uJ%|DFaK}f1!@#__T8y6l+A7S&4U3-j{ z6DT3q7j%?<>t{J-=m^yZP(|TxYfJs^R%!Yz$KM#MKhkHYy_T_dF-4C3yd}^~(#N$B zj)0ayF@@xyxIDNViVLHi5FSM@54AvrIjSnYDcd(k)#!IrCtLB_EkEX(%uQ3t8s(W; zm(U_+p;>6yJcZhiw>y_9oFawUR@gGB!mrv;Xtu)ENfn-yLd!&j97jO~TUQ`Fy>1hKlOLXE@Aqb)v6G5^Zy$ zJIWH3ghUtdPc>R#keW;KvT+jVD|&USzB#A$!WapZ;;L*>y%kjXxI}G#!__t_0m3UZS~qDMHUGYwLQuGq6O_E)=m`U z7b2CFw5)Jnl=`UE)v&X~)zOkjne9&hBZ_d;5!8#a2uVSd3*R$}5P7vMuPYR_`MFV( zjK_-YQEs}lTdY0KNoqQYWd$|gzMA+LPSjhWVM~N}tJF2CS7j!+9qf7yiOzd&qE2X> zj|vS*MrsY23tS<8qeK=tkunz~HkFn4ucX&zy}e;nG||Z`ZkDv?PfV3>RY%n4RG-W9 z?5l~??nq@$N=)IOYJh*wEyKSm;)3VqR%Tma&VItRe(gG%TO>cuqk-q7k<*9~D=~RQ z-$2f_sP*5<@;TzYkyt%DXGX;NlSEW&T9|87thp0nHASoi$BoslSW_pDwdlC9Iuz?E zF0iXQU7#hC=&C@u11jWV=|6~mVU7lxC{Yq~mbA7>Yj)-e_5X#rrHXa4V=0w!v2uzv z!GRHLnPOd3Zdz-G?U;3w(>u-2o{q@p+hINYCy6x^ z*}~jD#d=Y>Z6)c}AMfXY^helt&B}6k5>=(0b3ZyH{m07nM<>x&335l|;Um)TL%%TR zIi;vLhSr37j8Ys`tcB&dR7-b4DaLZCB((HW=Q2vJ}i(%pV)2B%G)OW2{qvIYNpH0lm1iar!(7B&rwM)Y@Z}<_;tSG-B+GZ$0WMW zr%m}Rkp4~O`irGM!LK!{hZgBClKz}>{iT!WH%ot>^p{A#s$4%eiT+q?S|LUiw|-`rVS;j)en*oOKs<>OHVqNl#NDRPs{mU&a~8 z5aMxXbXr=lWYOlyxO1Ax&*=X9Le?>zq>(L@p1a&l7C`*-qOiVfQMgKm{d`!{8lz+YPZ%zDL%fD=4-_Jqh(xhB!luO6+=TcZsIICW*_xM*< z+)1;F)YVW*|2T`(mmDYcLW63FB*qr>Hfe<-tvODlM4f-Krm!_EJFZEE290TG%Lkc% zT|afoX05VW8i}}yYkWq-x0559SGwa$9;I^%PhCI?{S#8iPE*R3*5iE_DfFt1d{il{ zQwr&V{Qt6@QKGUs&Z$4-){^4H;lRVJC-F7P?#+_PQ!CzR{& zd|v%Q>3@gYG&29}d0ze9(*JC^{@&-+ACmrU<@)<3(f4TIN&CqSOaBe!`UfV_SF_Ej z#pd=)|Fm-bLzC!_`KKiPpK?_`EANr#)jur#e@4GBN3(pK?`3h19w+X?+^FLHb$LFO z6_`8LFioC?+>Z3vZ0XI;N5?%+q_eNvY>nbhn7L#2tya9#%JZq0?u2~C4(p`Dtb@HBS;t9$c84tyneX zrJ5(*p(cK2X`*lgu(vge=USw{j~(_&YjwWjj=9Vf-fmO8O~;G3;JESH6>s_R;w?IE zybi@{CSF!sOD55EZ_o^#TP*!b=QBwwTBf*@*49$R+ryRHET84lox}%mCY6)E9;nas z^OK~l=|8usiG(_(zr0+(Tl%h_v30s;&73C8+zRQ>E7$Lp{senmZq0nTRno61*Izq{ zzNV_2W~tm7>Ff0avfq0h{gV6#DGcn))@0kI>V=HP`_iTvOmfSRWor;ka)pMCh?vJT zPlon7rS(B+=O$_=di?W@9J4=1WfOmvpeDw$?9Wqz>z&}z$gymWRXJpMZUcEw^pj^R z#mucIv~+-*6*K)!ljx7Rd872VmFsVLUj5C|??t~bM@1hSEp6MjN#d#w7v{Dq-h%Rc zc1)r>HtTMe{ZbO`<xAOMg`Q8xno@ABRXEWJa$?7HhSb6ky5;scxA;iA2*)w?ZKyMRuqYj*YGd-t!7)tLw zM?DGcLW3rUq%&HvFh_Bc58qd*gLUL|w?pYQV{x>lnZ%L(N`JCwx;3IyF&0hj^8b{T zZlWmdIXg2?W8?oRj&7(Z{eQ&03wTu3)jvGB3>`vi6w-AL_-pj zaIszhMLb$m#F>f}0ys%!9HOz_Xp5C`w6*`*zFK`-yi|km3RT;p(iZCtt8Mo*ye(E* zV@2})erxZ2&Y8)iwa@qeo^PJ#oY`mZwbx#2?X}ll`*QZ#=;e79415mqxJyGV_Oea; z97SFw>EPcLHA?it%Mo) zndi%1o|Rr6*^-hDYeKypKfi{Co!Z@b#es`1?f0_ve7vcQkFv)~lb4i9k&cW6uZGB` zrvt}B%}?jFGK3MJz~`j8_LaQlzsv33LA-2iNwubvqN=@lb))`*|zj6@7M3-i-6 zB6-QkWNd8m%=n8#6K9klTl}0rv|7_AL-d!xf4n=GE=5{$&Zy)t;9Wo>k3xVoA!KvT z0prjD9Bd%prq>8)WK}{C6lw(JI{|`>|Z+x{MV$(htBw!18wdK`J}( zN2%y7F2tdJ74E}cC>YOu4me=EsG)|{@ z`{3MHs=XbA2thn{>jQ?wr>C=S_rht_V1YnH0(K3%O z04Em{bPDN%uOj^?AJqTCLSl~^f~i*k1`L#m!w8K*yu6cdqm@l24L6e1(XDNH>G zcOX3-sa#hRuT5nBzsEr4Q<;fr8m}N15~SOb)YFM$CrdaPaOttQQQ~}Xb|FpIiJMb( z(pQ{@RCFS^gKlXt;QUUr$DkWOcHd!Pzl@E_s!!wEJ4{)M9K63@@QT{`em&Ig!`xIZP_m0ex zt>~khS&ueFwzVwt`m8elrBPP-xOdz`nDiVx9a=i%I= z!p*6ELV`ax6nn*x3)Y>9#XU`TVJbii0C4VC{KfMGpTXp>R(rg-m9$l zDboSFq%;{TORgT_Tr7PLO<{5i2zv{qYGS3ke|>~>_t*^YvHdBQhA{12sulK$B-$U*~S*Y7$@P@guO4{Dnk$Jy0a^28(u^IE3#`;z2pRR2g#t}Lbf8B)XMTyf)sKRUJI%hKx>UwqC8 zae1Y-;ds*hCH?+_fFGJwk}Sg80`#WRGcm5=8!u;p%M>5t(Mq`3F)E5#o$UeWzI~gY7m;P2SmCFw;jP+1FZG}3nUz`lI+p3Y7KNyO+Z&+qlPIS zz1q{`Idm=RYj6!xEFwJ?^k(>)iIy!YTR#aUK>w*4ZSkBQhC z9c`c5L8?&`&T@h?kJ=PMrF9{MXzUmt2`!*{2SOeH2V7)sK?ae!ubwX~Gg+`$hKx`) zqSo8T1m{~%$U8a?hgM=}zJiG9X|kPUQRGuHcCuB$*XL7;`j#l}Y-be1eL<>AeEY~` zIWwgsOYuFVE~Nz|jW2yS5~;|CK(A(uF>34KpptOHSZuYAfqTibpeQG376X#^=v)RK z`LWA@$7;!&GLOzR>DFdUvme7S) zWTXP8iER2p?a!jp62cmEgz}OSp#ltJIM(MQXg$Rwl~PW!j4ZI{p0%OPNSfgk1%oz5 zVto42iYPWU9aTj{f#{bsK`5NeRR)=W#tOXLC+JiQG6n827$4bPxF)pC+><1)=to$UtlB z7Nl5#n{XFpLnB=&7*@p+<&Oa>#hc-YiVad(kvh>J?~A=rDTT$#QpAuZ2?^;EQlufB zi^x=mXav(BBdMj>?*!h~6!WsCzKC)~mPinN$wR($JdYqliiPXmhL6tj0+^}`&<0b? z1x~0_{2^!!wjfWlVo`!nWlE5SC*g7(W7->ALi8xx-rlx)um5d9#Li!iHrXQ=S(fW3 zq}Z$52!_#9oMn58w)dQx}!>a9emC_PX6NQhU7I}x32`d2;yHOWB(;a|!`F{`#c zxlP-T(9*x+vcOUvy*TcM@a2oIz4p3j_%fXAxcrK1uUIma<`S*m&Yn42b`=C#)GenS zT9|l&-NS3K<6E3(5UCDLJ+$!Z0=46dhZg#1W)NQThz^D7a%Z1zyv%Qgfu9astOWkM zGvQShaJ;X8uqohvUBJ?Q1-ST=gCN;Og=~Li5DY_2>TsaK>zq@%6Ym~;ikkknA0>8v zysJt5;mkt|lSe{wglkC-a&xp!JG3y@0X+51%F%lO*LEiODZalODhGHn)ui^F3Pf(4 zE;Vp2OD(Cui?OD=9!2ayNWP+1fmBA(krG^+X~X@7AP zPcFXW`r!j7kLKWO{rvbwXW?t1TrM@(_8960dDzCCIr+>bp2BJRIGE;Y2DlwXY(=*6 zW2M5~i-$0@+FqO-)Z{$1y8!7{8fw)kruDGy#!WeW^64u*X_3)Sf zIt%|OKYoo*DhFeK_P5l~<{)LkoM3%#uG6Lq7@h%_vS3#e4f=gLV{Q zXn=K*W4z!{2HDZa&tWJ`0(JYf#t_W`OBQ$oU6)r=Tv=0cV3)CM!<)NZ)p}BHS!rw@w z_DalnI9A$Mlq{+Z{g;56cmLztid$3%yt@?hCnCL_t9t>j9z;}p`-o(uw^G2PJ0iVQ z%=zlKNa?&{-vCn$rePeBu%`^Wtn11_I>z8l>T%HQr&PeQm2Dtue}k+JsRfx&3o&*D z4*AvkZyoAOeQ>gP8`3q$hS;7Br`+oJMd%O%p*vPng!(PXw1UZV_R`|%F0@H~^e|jz zM#sB*VY}nK#b0fVS23b6ItvGh02MrgCG1-TYMS)91+h@F3~}+TpCtsR+&%zeb#eD0 z_o+ zai0+ScOkUk#u1Xz^WT2qcRBl5-o0B7_4TBf;Oyt~QeD`(bKZkAVndw+jJ!ZdHCi4B zgsXq?$}3eCnXV;_&`T>IM*MK1sR_la)zUKVUCnY7wIu zu_I{DVaH{Tnd-vz!D<#wUWM$T|kj}4mZFg%Qd0* zNcsXv|1Ts#l{S;3CW+a^LWTKEyUwT4Yhu3`J5fr35eAlXV0{vQgO0JW(zp~~q~?GCQx8(gVEv$_RocO0KC2T4Q9RZdA>Yp8 z=FZ|<3U)$}-A{Xh9CqVE2yx1ro}60u76jJfc|WerZxsZlzg-ZxA6FNyUGG4~??T47 z%5ZJQbqub@aP7ji7uSAV0pPIgIJGEU{R0OY8U3R2@#j$8)M&gLlP<0RnWGOPp|kjH zrlGl11{oW}8~)5dgDi*SY*k+loiWTBx8dFbU)%xh*j#h@v3y&o85XnHkPj(`A)o`a{z z7Kt995XNQrH3^b506kPp1IjVp1VD?hFf3#CX_RLEnh*MnpTMd)`h=hqF`)Cr8P{Nq@{g}R7-+lkjo_|5(8f1{%(Lg` z8W9e02T+Q)%E-ahzwc=#CUHl~-OVU2|A$xHfKs+t3uL04&GmI$m_4vv_Smx7I#g(whJ=RBQ3? zA=clCe!el9;ml7ph$fFB$UMv#5x*awB;DrX(}E)jJu6v4svcR>O}Odj*YcDRcZGRq1nd8yee2pKg6=0Tv6Y_heNEU4zXk5MYH?8dbhSJ?*zfho9}a4pA0uoU}j>6SaXR~KQg*4Ex4AqB5s zfsDkij@MQfb>PUVSDCX?GE-mMQfzzcutQk0+Ew$$|m%M)E(~|Ve z@TH3uQ1^RIW~{$`Fm@K;y;hD5cc?AKxl1Th;H`V;%q$SkR_m_N))Suxz<>rd7|3kK z%?Hb1U+@4@9l4F7=}P|vW8yGEa>Ab~xsRiFoLm(v$46mK{bNC(XSg2)B2Po4BYA)N zzXUFI#v=RG1)Z1lwWy8Ae|15NPQMT7&Ui^|QEh^Gtef~XlNkdM=VVgikP<#k;nV&1 zVi1id5EJjk>cn(3|9Ed_XlsBL8)uOZz9q6~ z^wA^YRg7zCdoWSXv0~5RT^d6};tW3b6Wda<=85g)d#u<-TCru%7Ik%HN$$pdBDoZC z!=VMAtgxg!x;0rzlGYrr$-Pa;U4P4P#A)^=x$RwtnVb=b){(-oQajBmY{AcMF+7YM@6lz3_6GlbqX<#+!qHPR=58mR3ZK)mll{0tEDw2TW$ zoKMF03Uy&u%-;a0E90Ax=%%bhN{X#dR-lrDg4NXP?PKG;B{vS4r+yw4N5VNBBAKVY z{SjuQNPe0k(%C3LpQtGV$d{96FpJRgb^nDCrrabegrobdD#b>JAa&&2!24Qg+ zSCXvCAc>D2mJk$~--5*WxdpLfQ-*XR3#=+lY|C_5Jd%`Vi93ROa7TO~#YfEf53D6`Q8<$pPl-L5vn?v2C`E7##{`90bG^{e%D;FO0RpRz5mwX*}pU(Gm}Jt_2?9C#U>3EOPv7F5yME z+$8q&+~fk}tF+lNgIk;|mkQOhlY!W7KW(Te(k6u`s|fe;y9vE}$*Vjq#GVefu&yru zau}nbidZ3-Q}PU}A$i6K;Dp893yJlNWqMzb;S_Ig=;_rr3VxS)ckkK{B5My$kDe(h z(<|kq&o!?l%f|x2jLP!y_**qbZ;@i&gd})7v_?w_r5KG(qn6I&lrlDj_2#~hp}W^o zcCYrcQs#ixPzPq4Fv=9qI@FGZOYEU|0To2Jq)fi-EZE7`aDWUjV%@Y3&c^hC(=~(o z80}0)>5hbG>C}^dpm9Kg%ppktb4dFUfnFAqAniX!-bCa8z6FFhimXyXp*y~baA)jb z=Ov#?@0nzJXK^QD@m&Ep|4r(gJ7m&m9xRc17vb9?pRNyn05E4Jiq4baDqn^l+6;dX zTE;uIBwTU};dLM!B=!k4$;bgi*6r6&bIZv{Vi$NS*fsXhNiW3zSrBW~WRf*YCMDUV zzHvLrJkS|AfMvMO$fr$eiY;4;6Nz~R|LOx49LCqTfQi1Eh!3`m&rdPpq*oIPVMlJQ zL4<_jdyr9Ji-JrsIi?o`S&6i-Sf+3ds9#gpRh|T&F;=#P^3U*9Gp3@QSDq6)Yzq$9 z#lVu0>nh(w@v)IxdKtx6%`}|7ud5sb{~qaskd$X2xUO=dPT$Y`4SDjPN;*bv*-JVm z=Sd%qaURm&WBTEF(ti%$6zTlPY345gvXtrnb(N>;^ubL3WuEk7b$S``|0qxT@j87N z({Im{-lypw$@FXUq<^B*k7jy9p7fx`A7=XGJn27$?+^Y;n0|P_^k@V04bIs{cWLXe9I>lH4@43c> zWkB#01trr9TmOu2z87= z0_f%btMmw9s|=ouV02Vva0>rNR0dDye`#fKD*i(q2OwRCDAaRUhQfrUvjmM$c0W6d z5K=!#bIoc5rtW}^KUr%-5$s^nC5Uu*Q!TfE7KV_tANXYMvkcFyKCaSmGWAUO2V7s9 zSk4q7ePWP7WRl)pccXn0mtq2ES6^03+q|_uv&MHA@FEu(H9U^dJcc^hBsIM(+hKv~ zz#3V4(+{s-s9ANgS?zxCP@n2qXNs~cQi}2J&maR1bZ(6kB{Ql!zk}tukw|TEmht)2 zhp>((C>_Q+%Ne;0IPrN-%y%Lx5S`*g89R?zM-fOMCA5+WlOXLB9|bW+KN>(-IDR7* z_)aidLzoX&*RY$ zc1r{FZby(`LA_CgYL9eRGx2CoMGvZ37-y^N(PZV^_Ou+b{Mto+h*nq&bt9HO)Pr0e zarb+OUYDQ)mjl)*+w~w+4|a>!v-c?JkYk#e&g#Sg@DL9}T`7hV#T^GRUxm}e@qn*3 z;QpmH(9FJ^3hQj3U}A5<ot1`vKzXiOWlJ| z7{FMMN9cHFW0VH|i2!rlz@HxCUmzil{&Z*xws8>^`a_6Vz9GAI3qPDXIXYJd!qHIn z=VX5;P*_&yM;@AepPij-!V1}!nQ#W->rD912w&-J1T*ZV`3yEHa^!$@l8~t9{2(WLj0*qG2`Ir z4K_T45t}4_>)mj6LPh=t&D_=*>1|SHBgi$xZLwo@QBt;Es9yC$ySq*zF$81o=;1oB zJk+rl(y>XHI%t+81XhGPw)v8<9NQ>K2wWHH;E>Jc!T}_+B?*BmLmdfU(jyij0zkOT zm-J{!pjvVvusGDw=u3L6Brr#k5V!_AGJQ!;LM@{cj8L#i0?$oq!iTOXzJQ>JBGf_m zNt4)JlBW2~%6&-v851U-L&C4_chSCxpqB7a14vj(O0znps_GJ~&;GS`lORG98PZnQ zKlMVJI%dsDzH(sPQEBn+UC8#;Kk6>pn#L|)an3`~J5ge1Gj;S1=xA=-&5V15so#gz zq#byu&ZB(%mVHc;^6G@1>7d;BgB?gQzEU)H&5@~*cG^9&1<8gQ*jP?G#+=89aU2vG z_FBCI@0jtGL1qfI(-ZQ?e z@$kO}l<@zYO8LrfbYo?ZUr>!sME}bFF`AZbpwqxj%#L99;q<9Yc4-CHdMJGf+bIEg4_w zDBS4=Z4NynN2na~TT5lmJTtRt;kNkaLZ!1Cy9bp-?bW?%Vl8!uQ^3_pDP)Ya z@x#+^@uWMPE$DC&!gvCq z0|;?F%<5>n*j2BwM4eYap8B=SCl))SDBBV671R&VO{a(vI#+CpfPu=Sfea+6ub`yN zGx~wgJs3Y`e&9X7$@L&_WkgNHs+(`+L>-Hj2JZtx>SkABYM3Ur@hTU3wt0U`Aa z&H?py6`(luZoY*X_3~+W_7+~$#Ix~yoQLn&T0DFHo;v?LDKK**G^n}a4B59xJuldnuKIIMTu!K)?1p@ zgD`6|%>ohTUz#wOIJx7iup_DxlacO@KCR3tW|URRT| zy4FjGN@o|_&v@$Bd5wX(gOVm&f+izLor=6@mzfU%(`AsfqTz))ekB#g zTm}4K2?O-Sq;wpbkH`26M--J47(4JwK#ckTP0`@s7o}rMET5A4B2t~*q)fUuhSb?m zf8Bc6y4-p&3T1F9;EE1+_AtYpe0ux^$Ef9{wG)(lVK_=;RuII$33U}NHEC<$<9&EUb3?l z-=p$PBW^EtC|GA1tFChnyXz9w3CumG0gu-16d_>4MW)vy&G`VBGC0M{ojx{Y_7{q? zlZa2#h=mC#s^}5v73mP*h-?6@nFb(0fDh}1G{aCa_zks>LqoDCweFi7k1@ydSvmM= z_E7saOeyQihxq%;-`5ynDvEDB1*XEmerhYx^$2goMAc`QEZc}{BrcoAe<8+aR_!wd z$De)9X=Ge`j?Il%QOw0_&K7aQ7({2RIUGar=sBj}!sK3WQFOdTLZobFzWv~iVhz6| zlaa;h#ob0cpeV}>7*oNIem!Vm5GOE*yPa`b5rwkjG-U;O?7-z7C^rm*I$k1|R71!w zDDry*TL-L+rj`^2cf=83BMKaROPM6;@W6(SX6uubp?MEApTexp?03E;OwLL9(cd6FY|jT!ALGk&wht#_^h^ZeUH6$K!P(kIXMYrWJQi^DcuR)SbX+HEaYT`16aw?F*Pl zp4CFqKuR?Yy`*8bra=%TF9ushr5!|%-k{IlAshp$1PE0H4U__-lYC-}9_#D}LN(;~ z+6WJGX-7c4|EgyIv`wkdmi`g4{4;n4mKEFLP>wEdn)Dw9u?kJKWZ2-#V4JKjgKi(? z7&(gfhbt!aO2WTFzu=8qBNA7aXj`UZ@JIjeOgefOZ-FY6V6_;uLAF!@p#pV>X z`&ZgLbfGK)89izT{wO9**R!09oG7V1otZW<(*wwqX_jUw^4E?A`dDcW>yT>D2*;x| zvmVC^^`ALftGg!n(s$7wC=K1Go`pg%z%WSmKy1bM!P+Ol<% z%6~)v^vN%UH9wYN&PvMXuNWiKJsFJl@H(KZ#*=*hd_ssFm8}=T;RDR$)oJt?&BaEI zHnYVyW2!}0OQIHoC}$O!^hEJCG&FO#4}M_%D!>;exryd+638~;YdSqg+X|Kx__%B+ z>f>Lybe6J0e{YDU>l2Ms23PWbj%SM{v+dQmC6|skMWS_9XkSYKo&d77W{UqLwdU`B zo+ZE6V;&gITwPBpNU+5mJ;JpI#RRMcU@qU5pRD%vSCG;MDZtVHAdeKZ0*F`k_Zlcb z?<=NY%;>N^*Mgdk?p2dfU!u@^P&js(XZ>`_CX)3yaL`QYie`rv>iC5%*6>mgy5nie zNAPW6uA5nM8%owPYZs-a%>IVz*IZ(7=(cOsLQu&*mf5EvyXZ&HcA?9ZzME~}b@QP3 zaE!B_SjS>!8mjC|i3L^P%NFNu;#4z?#u&ZGoS@qt3&@qbPu|g%whKhodqA()GR_+I zxUU2Wed;cjB_?eHSrwBu*k!fI$Ev_7tMh{Z4R*Tr({m^RBt0L}SC%i!ULs+mwhx3;8*d zzXW7E(@Fc?)wVK0g=_sbtPFX6s^-`kh7;m&ZA8i=xb~QTR~|C3qW7xjH=KD+a;Qk>n=U7zX@zhamoo-9aP7ghU@YR1_DC3M z6&MvFZs(DJ$2D>y@}CU23218w*Wy|^3D3AjV#kTCCTBAh{vAwkqv@*`{|EoFs4zBk z$DmQrO?e2c87Xj?dHAN9&8h!!FfKZFj*5SO4mvK`o4ktF>;}B#WsN)JGA49uO3P(E zB;w&137$9NQjkmSF`y5Z!qtmwBxIv-Er5Jh;@XI73$C5VAq+W91>XxO3&>y#WTSA6 zgzTo`T7ZkVdm+b>kU=f3mAD?krFcOeTOc2Ws{}Gx37PD~UfYC9%Yfo zAOt|$_N?VL?fD=?ipeClNW5J}`5wC+c8k_3b2Hotw+KV;Mmlz&cPD$w_V0lb=P^?E zcaH37Z0sZ)F*Z5tiLv`^)>vsq6CxOO>3BO-$cdHOQ5YYEQaDx&V=t$4*iW*I+ffFT zDM_PS#CQx~`~6&7=WRuuw`(@oe7kW*H%ryxDUn}7u<|MW{-~@pD?1Q zVM<7Z@+UxL6)E*Cs-9`a`pH1d_}bVHy7RV{wG_(N&l(WDx(aDx4IGc1KR_MwvjamA z$P9AX@zq>xOcn#4%rdtRvkW-fS>?aLXAm_**#?6=>xRmzs>b1HL=qPhQmA%3pTnOg zBK08j*=Nr0;-k2=9!nvYB`91VGaa2n9(qNET9DoL29?2?YyiWZomBA)Wd6af6r2W% z9C5_FV!j9c$S*mLqcS^>w5((5-EZ17Gg4WvpOKd|F?&Bjn%7Rds5|X{!+Yb-D-`T? z2w6?hLzi8w{dLHs+MlDLv*Sa00-=u0fKSnRC=!!c%T051@x|PoFGZE8^O4b1Gbczw z9mP@}f_nO646&b(go4<4mf7%&R~kSP>gc1#pH7qIThJ9Ke>!b| zZ$Yt}TeziE9rog{v1= z30%98xCp4ZYbSRto_dw>xyE~bh0mvX&mxU6-t#`D5BHuq$jB6V&m3xGJ_390(1@fL zMvpf-SQI_Wc?%*?4`XhCVym-Ecr#z>`cok&HgkvMnU!{5`UP$}$yGD(2$Q2`JndEx zr5b9#33N#F$ozv1IQ#dXSoS|XHLzuWVG0U?eg`st3wnk4Y<&s<16k7c+%&IKQdc4k zyEu%BYD=01AKH?J{T%sqA4;a%UXJ^AzB&$E7;N3ONI*%wtG<&z;H)V6^CJtfvTvR-A6w)%?=tXOE&sANM8rT zU0R%?iJs={WBylnfR-f)>F(zLOs23(du9t&-XyBtL4tS0pqqoDN9jOO>=_L)g__RS zaAd~jWKz6X5b4FDWU1HytYJ|&7y^ig9VXb>8cdx{!nHlyOZz;|jH}vD!f?RZPfAY& zrR3D#OB7jt@lpR zJdb1u6g|I3BHio+Q6gK#S=Fmsi>T;nD97_2SiPb4Q!rIi8Qg?$Y__&1Pf}nd09A+m z1VTBOO~@LkNPa>FgYnE}Yn57wWh<0D4>7{@LrC+SpjIJf?_tOu7z~ZQ1R>3iivKsL zC}w2O5JYMsmq_Ic3ahR%P#)%#5b`)TdzY$V{!+%ijy})icbNb9to+YX24mC+f|n8e zA%YwDw+R2?M8EuY0X}+sWw4h2mCgue`R-6lwyldSmx#LI+Y}`*wn4MavrkudJqZFv z65ALOAnB%OD2NWz>?@FCG*m~_lfDZyeV@l_Yn7yRiEk~0X%V&4o7DXk*4ah%X$~^E zN&RJlpMPR2W@6+AcR=v?eIGCbm;i*u@@#-p{H!aF?14`D6 zE+V5#@aQK~)8~ki&(2Nrbr%zafpAuLu@t21?&5un`rK+GGeu-3%$oQLl-sUTPG@}& zcg8Xv+n2p8>h&MH)U6h ztiD1#rvr~q$=*fPYNe8~dKqdpkB020aK?=H3s>gV+84t9o6*8iT1dNd`b@VW3j5d< zCC(RlRj-{W2z88%6KX+(WseOTUQZzN@`0?mYMXA^_x65f_5vJZoyT19>M`3ikYpOS zOmgYHF*@HC5>f|3R6VkJx-$~m8fw1}2rGl4lp~#~tbxD#95G!%n*0sKQ=l1A1wiFY zBlysM;I=u)NNc!}-LYDB8wsuPafPwxM=U`-@n66uQrpc!Hk}|+^VgC!HxyZux^1k> zE)5l?j3{~$o0$ZZ&702jY)yC_)oY~0wPZ7gsdWRU20p0N?7-!&L%FsTmY8Pg>Se@2 zteL4=61Mh8D%uA+r@!T`UDvEX@uTe8Y~TAK7IChGF%w`K249 zKKh|czu&n1KsrfUexy6K)Rl9f{JOOy%ehE`O&XMfDU|vWJ3&1}@Opy(kl&P4Ty9 zy4j*K0vR4kW%>2#QmEryqz)v{FIKq5U_I+Do1{@J^IGR4Rpg`t6PsTo7!iK`nOjYF3y>A?ENSB^d#qkKAIP)^_`3Q2Bki_Y3%z(3f zHIlzX)qq+Y}WDMTB9le233sgUJpVHv9aD5O}!lk%--+& zVMIaKYlY)VrFsf5Kw-vGlSlKi-h$!{<{*Ujf!5X zM<}88-%A` zxNx=!4FfD3eP{jdD$?9U#wN=70yoy_MQ3$N4Sa2viq#72WhbtkTtwM$vlEu6wMVphfR+;7qWD)NjMKF~afG z<(c6Idd9pPD%PW#LLIA++P`5s8>kz9L%~|7xyY>E$D=WC#vh@SG$Wi_d-=PrmeXSg z`A;E6ub5tdN-_FkSYh$enmk1>pftXkUG$ZB^t3dqLY*i{y%a-rH0{h+y>d)(sO|VZ zyfVgDS5V)pVXKnmBF%EPiBS7tuv?YoY%luY(aLhRnNa%;Y+vPFlv4W+#c~^%?K7mRyQxV}4oJv~vNjtK&IjdOy zWL>^K!Ot!)i;Gw6p%sI6S7lI!UPtMnS255Vq3S>N`a`H+mg4X@5>=Wt>LQ9z`&96w zUw{m?p9b>v%Z{P;6A{j&z_t&gZY6pqyEd)cmp)Hv^&}`WPdH#R^y^G#7l#kcK^f$# z^NyA_Bq}GX40?0X6VM)Y0%+ALL?<{)g$xO*2q1p399xDp^->@Nk z<ueSVYn4GiZnSt3_HMX%ZFeHS=U(V$vKmg3c~2Ofv>23* zHBfeKZ?S2Bb)4NM+Kx8g?#q_f6Ih(hV=C1cob!-JxhJ9!%FpQKr~UQv6B$nz+xn&| zVsgROw@)37f*K8=&SWd-!SpoN0zO5CzeM>|KKPZ=_T&N;n2IY1VHr(u7MCvX{JmCDdcA1aB7uH0f?l38J0%mNgn z_iXLM0G^%9e|_S1W}+0KlZPM7b-LNHX!K8AIlhQaT*QHQ2#^>oK}M8I~Vb$c&E5jmnU)P2B} z=|RdaY|xu}qa{@zeg`8Is)>3(kkL(XPmZ?e>(2sn#EVC>91 z?EqvMRsUa6b%>cJ5+)v#?m*|I|J9#Pe(mXc`SQbu2-p_#5b*JrG3d1GMrFc&=X>vm zg!XyDfp{MR1NvR?GiHcw>*x-3%tB`y4^ovs6sdzLzOFkorun@TqkT$~0EPutt~}db zc76JA|L1UAgM?toOo=i9DEimjQdOVu)rZ#|3)ZMyAhYx81xuC;+D{7oV;vLvH2a|fnr3X4M>eXKjJ zC(@G2m4ggD$67J#f8CHS#h~4a4OMU3B0hd21z^sYQR+mGZ2cliHixD{H=}%0@Jeki zSnEmJg01frK~Xk&0Bm!yBMch4m5`7xS(>y>HpWDfi4m+ajIS!H&ToOUGH|5r%Iz}P zwzFGoB~j-wYHrjdh}5*drQHU3M;>KUcEYl}&o1T{eh*8N2(+Sho@QoRPIR&f92R@s z4~8%+r02wJS>u}?6od~S!W3G(dysLoqbCqdVX6K_wVbmykMIMc|CTKPyY{hG&-6bWTn&N}dPjlBhw^B)^s4c|_? z+VLfbP3`q!Su3ITkG+hn>rlt*j1ZgB{aJr*|LYOa(`-vX0!&PQ&p}jAe=!i%D-MK2 zS)SJ;vzqOZMVBBpL!E(`%wjkOmS5e_gs`ngWf{9sz(60EvQnSk2Sr?BXI@3~rfb#v z5W{XXu^xPN&e-Q939$xg1F$ryv!>A?F&@M+3I<7i7dTCOI+>zuzaPf3U&D8vrODsI z+mlrFUO3mL7dH5)lDhXA3L*PPD;9eRu|I%*s~>g)p+~5l$Zp46KSH>pyKQv5cO3a}fE@4p}F=XEX zK+hO?7EkJSKI>EB-XelFJgcjalU7}K0=n+R3DuJef06JWQK|c6te__>k`mSv8EYg= zwZjmu7ZVYG{0DI2&3wGRH!^hlb4XSND5mF|Mm$-XL+j!iB_5td^Ex=xF&_;}1IoO= znG{o7?slcc5@V22>;8@w8iHvj zO4s_vw-&={GD$uCjU3S&l3|z@O%OVk*$=k0Hkfg%b#}BB8I^a~${hwUpkfbwmT@;G zYg{khYvKPf`kOU+_3521^(VuEqVvmmF;dkXDe$9SM{MRkgtW5yMtJf<@Fu9SnKj;u zpvWHGE3Gzv_L;ipf3^cU)5bfF@D8jHl5rXu)vx z)su{-*A#Goy4!IJ0DP?zl`Gxf{w|DbX=8gH$=-LuRP#3fHZ8WS_cBm|w)NvVnUMlS z_Axr_2V~gYfh4sarEr@Q4Ka+0NC5BWNoVm85iA6hm6w%|b?uQsL~1hxm|?OngB3V4 zXvF{4gK1b1_ehI^P ze?b{cLmAVmhI`p*iK2%)`&iE}lQ{ea_E0n5@!KRb6GP`y+lU!@*2Yd6i>dtX?JlV@ zS&SWFVhh@1Fpe@}$u#=SBznmkm_^*PZav7(8nG_%(-41QaH4z~Z4nj7bUsFz>C72r zPL}f_ML@)mE}0>b2((K^a9IRji6@xxJi8D!F@{qP1f?MB_p?*fAc*lf*m_1)_c4jP z$5{E;ygo=RIDDC%1{Ji4Fh`U5n#3rHG$i;|i%g7fMak!QO@zzGEvZl+PTE5sT=lWq zu5ATfEp02-L#wr_~Mvt@J=lO_p_JgR*G=xlXZd=rb!8t(HUbsoL(BCSgp`EoMOVvUhPq4fB zz7Jbh?#X>@di>f0K2s})nk33Mv9|Epdi-(7ERSZC$FM}e?r^fDB)Z6iWR%9JA+cBD zRm@w^=Jb-*$1%)CFCIUK-}F4lmIKRIXZLt23T|pb z0=RjeE{|=%+A%`Wki!U_{?dAro@P>?9KGuu%A4B>p*;INV_z9B0!NERcQb;%l!Ldr zDT|SkERs@^gVJmoJY?QGf?Ko)_~ZLZcLX;>JZuI}^ER=ZkBPZ@^YgQ?eroC|IOP-{ z+{JXT3|Z8U$@sEvafG79rxpcXpP}zO%1&TA&|v)1Cn@nNrkAumxFgt#D&f!aDdm^# z2tH)WPnI(jf8mfVof)w8nhH|V(H(6x1QIGSSJNW|-UkqKioYiCge(FDKC-_vvcE|a zIK~nv$kUApu`h-q7b7WoPa$}N&L>MQa#i*f+{ zoM6*^MM90J;26v2FmE1t>L&r>!hfMAicUkQ9iRV|<5JCGpiDTmo%mW z16|uB`=Gi+J??$HrFcW5X73Y-_N17cWZb%~@4Sr~*ONGXLB{uuVB%QZ>JlSym+rAL zScYKC36wyO&b`lc%>t=AxwI}pIy?(kuHmu@Hz+>A02sE)C(u(mY=fpELQT#0I$}rZ z!M(U?oRC!y<7831vEY<|7IWC>2`B6GM2kt@xLdTWdcCv6bv;9B?su`1tF z!cG|(+MoyYFkf^o+*Pk>@^BBmIe0THUcc~<0Xp|do5DH!f<0)6&>Kr*N2N$3PrPqm zf>;@Z9O1$1NrLkPUe6tHpS0ff6KemWg!SaX2@;lRzV>4ztmmmPkOaK!4r(uyuol2- zv_N=t!t~dm$C_zBJug8NLeFb-%(d_y0lXjPrxxZp4@L$j?e`)A-)#{5w;`-%wxds1 zo;NLX(ebT=6OTeGdQNfcQ3rMe84Y?-i;p41TJ#?$9QIy-)>RR-9iVN_2-elx z7`dZi7~;icK10t=Z{wJr(C{MZZt;f$hfx$Ke9+dVN-)N>I3CB~AA-`3AC0rfM%Hx`+qA41TRECy2;K3N2*tSi zd8R-XYjkD;f;EYjyd1>XDG5EjAwIL77AIb~IFu|vSCZ~!gr_yOn;XnpaB)IXbUreH z44f!2xG6lu&@I@>68wabX!` zHSh{@^f!e2Z9_O80X^A#A%^=@KDU8CZ}A)i9yP%$ToiMxu8A?Zxe_+li!7b;h<6|C zKP&%d8IQXQhZHtiofS&|Ie9Y+^*JQ1R;_i#^i~er_h2SPMDr5VV*t^#fo_3;A7EkF zVxnWUL7ikMcja`KMY;<})uA6BBb{Qzu;meofX4rfXDLYwnmD?hpHm{aQ`Jf1v6Af#46dfpyk+dOB`Kyj-gc zwVwln7_TCM#nB3_vZ3}u>|fCRN~paE63CooH#B(m#$XXMb+k59-@9GJ*fYUnUBy|n zw)tX}4$rnq|M%@tvRrsH?U}9D#F+NH9xh;wwwQQK+9^x_NQ)NT# zf56;*<^+>LOiOwuF!lv$OSGc^fnl$nhe`L7(?zCQ^I9dW`^-~i;+R_*?8#m18$<1z zfkoFrbgI_xS)E!-$sfE%w#?$t9p3{%alLR?nE4hSJmF)WiEV*hUW!DDGo${x3Otfp z;8-L$+Q*_LWO3Ptg#n`g9hJa|DS-XJ;%fW|uZyt9!w()%6C1Gxy=GCW~Np4@xDD}bD;7uR9Be(?*)Q`&14C#XtO)X{b^m>Fo z{?Bgn*AjCii@*NwdSsSox?)qkWCby+pnP^hjB_8HptWXAz%$#Q-V#H>vO z0n{t(P4w zdV|l_(V)z?iL%R=_CH8VKa0l231`xhX+)=#qqd;r8cT_zt4mW7>R5;PENZ@(P0epG zr$TDNAWc&UWabD6rq{2u_k5h%XOZyQAPW{APWr-XApAmO2^of#_ReK?B|FJp5c}agq zl1rRK3vtgeI!kg6Iuf7cqL#SzS`?pGa{s`b2Z@u_av`oMmpCtJuAexG7UGWUN8C>#&WY#?bpDERI&g`)y7rzD6iSeVx%+ z5}N{|pktR?Vix2OGuGAY^DN3-VnUXfQF4@}<7GL+W+4?4EmRyjI+uz^P`pnxOD#1! zHDk8kQiylPyA=I~cqpiBiY7)US~;!PM&k>ZfWKhwp255sOVu^GN%#fs}zjKATe@RBQ{S6m*wVo4x8YjJe( zvT%e6XNSWr*Tq&`enoisitDaivG|(s;>#9ayX3lS0Vi_N_7vZ9!zV4LK?-<QgS=wSDk2LP$uE9zPto@ z(yffqlW^$;2&XtlHc{r6ih_)YcMnOg(m?ba)5~?3{!#j39ln_1MF>mgbd(_ynO=zy zK4=DO&!5A93=NCY49dBx3i+HyK8cnm$qNK69m#vf+Z z`Xm=7gYa0~_L8#){|+D2pQ!f1yDPK|on@4iBz)^AstP_G6rJIw`#!|v{}SB|z7H`) zuddafd0S2{_FqjT_yV|melK=%yh=)n-h@xLfqk;E6o-c%h0<5!n^q=De|FOY@pu;I zI*X?--BBDlPjYF_)(L0d2fntqG#-jmeFD5HidBBK22*G1pGY^PM3?E8DFV@HPL!0M zFcIQkN$xo|(s4gV+|@@oO-pc&qyW7~APIepH{$V8uXxoKKo4#^?&=er%U!UiU9epO zR;E`Zwq1uYBL%E(`U=Hj=R>19@-B%i*3~}`4?47pp;gQ^LjWL5{eh|pzV9fmWqO51 zU^yJ>NbEGka@tfk9L|=mE=k5p#Sh&F4PYHO?Z}_xli7tR}X!w%K{f!It@I0UriC8zix$Nv+q3NI6$hAbhE=&RL~R>ML&I@sdbyZvRD> zF7!fX-*d_`5W9sK-e^i)46^L>wy|#t{UXh8hRA~ z-H*!&={P==+-|so#8okSAbO+*=HUk@*TlxY{2#Ka`5c28%74S9M|oz5H@efD{RBk?r-o%#CbolGCOX^bIyIc3q049|~?XQ5x0qZqhMWlVv|HfN)5b&CN zv3?C{u+lOsFq(rkL3u5|ax zzX4C{KHZIb=#H0gPwWYzhr?vw)X>+TX6*Cd(#?1ja;&RjzMY6(Gbbe|x;LfyA9}tx z@*T7ttO?;MR^5%@lZc zp{px*ST33*J1)-0qHgr3oHiQ^zDYYAQV#kd&+p_Pc&&pieKeLpLIf&&bOo#-wj_%dN zJ|0bMnME##UZrbsgFP%B#-~n;4cY;;;A!fRHA9oA&neQC#ix#GJ8a8BBZaF=+(cz+-xT|GrZ(&*# zmN$Hn6v)7QpppU8Z!?(NZ!=C{+TOAIHL&ySeB{iGa4R<)uB)3nAL6QSoLyhtFlp)+ z1L5%8hPnmen(MAve$}!oR)i;o=UuU4a=7vGXn5+>KvVVXh$mZGP32p}6 zi}*I;m`!s01uCI=_BeNymtU<BEbLW2i z=VavI*4{6i^g@xOC-nC3a*hDj$v5EW%ZKh*iF>6$gxcE!sL;oNr#3wecPPe zn1N(y%@tj`1BRLdPv?l{B%_yNf7}NC!?d%vu%5%xS`2Aivl~h&z3-*Fx>T0nvK!0@4DB*EOApG<1gUcoGlJlgQx+o*}@4 zRZl#V8DPm}gGvAI*&vppbyfTu0s`7L_6cX2vC!=ps`X`#MuJo)rgz~3k!Yz<5xGMq zHOc>T8Ac@@2mjzB2Sz&edwBFD;PKBFH@r;41nU1Uw&PW&gPUOJ_N%}*2BFiT@1YYB zn1R4h4ohbuz?!5|QXSQAaZB;Zj6n6cRkQs1V%>+EEh=cd=)_|sr@je1D2IZCwW_B8 zWqf}FdVv&ELeDW0Lv{Y4qlkZk_Re#L`Xpn#ia^C}Tb(BSJ2YtOxW934j1Sp3APYSg z6b#+F(u)A;6&v3^0<#2CR*>CqlP2K9g@yo>xpoT^3iwHSmZr;G+4ghEl&)n|@5(i! z;axKP;#xw(yOe|~-dFOo?6jfeQx{!`5IP*V@v^9@hsPi9uqq(Va3^dOBdXj$;r*EfEc1gwC~FzJ#=Jth`UqdyE9uyq(zN z4oq=SF^Tjo(MVlMz1F53pztOhI=Vx*mjOCCTE{O#Dl=D(W+-&W0ff0DJBp_-Gysmu zkz!hUIc}9Z*Wg2>$#RA}i<{|((g0No{Hnv!%$6u$f_q<3;CXBNWs(RwOX~`L9(w+9 z@o&#yLQ)`M)e2r)n!JVaOB3tlFU91g35i1%aiS#);P?PI`Ll3*033~5!ou+ZaPnv2 z_<+SpAU6!(4%a7Vsbs>03E^>PE(u4Pn;V-YH13A*xT%w;-Y`@Q353hB3VgQJSpF(Y z&KZ%MJMx+JgN7`MPYpzeB(brrLlxkZjbuTS`W22BfG63M9MqH?+~iDOS%|^M?~|V` z^u`nwEs;6ZO|^~9k&1BZg-wxgO?5*t@Z0G)Ed*!wqxi%m4&4{tNiI4b74IYLpqSsjqHnF@=Fv64@Vp9>NBK zg|iZ#-`vVbWABi;h$@avo84uUBgjtK#LU3T< zyPo|O=WBeLwXe#%&o4Ngt~8zw6s9aT$L1cH6;)x zJ7Goy%tUnVKx-`oqHAzwBhXSdjWsoMn^{0h{iK@O>biyiBuuS_*j%zbdUEO?%1}4E zVGcMwrM0=bp=C~;A+En_qKJW@TUwjz8fJqux6z4WH$%q>pE~G$P z1*m?QwdM#k%Zj)qJQJ#n+N^HAFx)sV(mbniK7kuQJ0W*_FgT?;`#(2`u&f~u=)@Y3rev;I}GYdPFfT#{V#;u#S)O~~z^rEzX+)7;iP@O2H@ z@!F_0M`puxpz&)v8-U`0kD1{a7lywaX>JT?D4j^|i~_c}WJp9S>Rj3>Om>YYQ8qm& zQ=SwpYqsp{9J=-9$>2%CmuT?!*YM`*x)yYlw)O)RCPG?&!)%v$Tjf@<#E#95w0d>t zDTAazgtU?2nbob;VHmD(-6@S>F)Xmp{~9gY)yx6$&Tp=3jUW|<0un*zAr`(>$~0+0 ztB+O7oNd+B&CS&pHqNRDc+8m2g$V(-{k6=U(Nfb~*TinI3Fag`qY;KAjK+saNXky&*O?1HU*h9zsQjf5q>j#eb#1%0*@ z25c@o5?Bp4YXA+XA<|p{0Z6+-r`|drMk`P;ALXHa(JIz8z_?Uc>Z;Mg8)nv{8f;#p zDKo=!*uw~KjZ{xJU9(lKdz?T;O?7>JML2Agq@p1*-}mTgpsx~452SP28VP7E?hhsi zT`0GnJUz`a%j^fxx?o6LZw?kq8_KYkXGUXVeFW9!(^R(z(TTh%p6$(-Pxp6uGtR1m zFPAS5J%_r6)(Bh>U%EIHHX4f2+T2+0auH~$Lmv@wpM6|q^+L9aEgr3iED&={=wj-9 z1={9NHw#)azZTS1z^GYol8s1wxccfDk@}V}`%=`qF&23}7h3#&5Y3UMh`5`AN1Ca? zOmaI$X>igXwltx3JS@6oY8y)R;L-EJ4zm%!xGqC!3-zV;??|XodJxk;jb5qv$ks9L2O`GMxMuwm{oat63aF&@>N-nGG0~X>Nn3=up!0y;1Ec)}PXP@0o43b(;oP^g@oE4aR_JOP-R+&?Bpo z`+)>}&|a(1d3;GAmenI8w0@eCA1;vF*Z0ep0}$}H&=x2zhIR0~sX)4in%jc$OF$3o zgpzC#VtT$6eY4TnobJ*$%;+zJ9722++?Oo}$Tk}v^SSba8w95V-h{4KxF)u1q}jqa z%~(IT;_NtD+7l){I9?N5N)zm_DcVy`(qc{xO0u`-|aFb>>&Tl}##|S1M=J=l*XPn1TiO=to8sp5> z>4BHIP;6Nm)_-L$*{`m_9 zySDZgRG$7n`>-UkdT3&s-MDX}+6E`K_6$b;#J0p6l`qG3b{4;l?185VU-=mCu@T9c zg~j@;FTDcG`<5@KCrz(L|i@s~tvg;N{ue$ciaAf7>S1gZS zb=|doX^1?qbk)>_Z$w^?#RP6%sG}RXV)1gjUV!vC(=RaT7sRfLhHtp)%4-)d3s9a& zPc!{goB!GSsqPtp?Y6GJNua&QoHf^Vq|UL8LlrOTjfWq$9Aq>+vOD9Ss0kF<^owVQkpE@ z*fd|&3g)t!%8ypo1H(@j_)!Kv zFmA#Prk=PcG^aFQ5zCPU>p{--lJz|(8jBh?!R!Gil_*bEmFARU2V5Q;$et`}a(*Bf z9smY&Xvw$*9gnvRVBk9>rnf4(2v(v!h!vlIpKRyE!$w#^p?J5&O}E1*p0X-S=71u z$>$=7J@^zpFdX>kVQlj}b}bfS2TjL4_Ron$Y&Eb}Ka@Z zvc}o-p{te7KGdZX08#URp)>Mm)0RR&#_?giH9@KPCT#iX+m(zwhQOmu>SjR^wx`K< zuHN`urx1o6sUS=;PPlq_XJjMGAFa!m*bz|tAATlW_8jPT4^e$E#uy zUr#HV{_5CD>qe1WdjI6(MKg1b7iDhzplC+U@fmxHGPA0(%JHHqd#u<$?0D?e^6lgA z*q+_^z*RMtaYv2I*svVjIJ5hi`Rp}+=BeCSd|hK(#kOTDj6eMO|D~Qg7u)p1G!2_Y z?eg-{*Nq)EGTp3Ui;+W{w2b^RS12I@Ap#)+Ap#)+Ap#)+-&h3pUHsm0huVJ?`P&&k z7RDdlqln*xMaTGXUKRSG%+J+p(HgWGF-m*9<_pl#-!~x#Wm>@}e}A3x1gr~xfh>G; zJbDJ1QRYeH=fm!3A=9hi&(P_}A%o_l_0+$K96iK;{O}9lCFl|A$lDY>4L6}&rXPim zp{1xc^L5a5$nWHLMfvDW^jq{6`k3ol4}Zh@^U-rmI|N$^T7c#uzkT`x=(m73pq1!Z z^bR^i{T?_I`7`7PkYgY&q24aMqZZq-;TKWS!%XjE`Z>4({SeioJ`=snwEx<003JlE z5TEO#HLwOGZ(p>M>4(q)rk_Gg#_QN7NxRrKZf8t6)D%$sJbx`mw$H|LIc@z<(5CXb zjpfr(8z#~yA(I{}DJPpwu`sEZ&U+r7kL_seJV(9cGN)ZHS;u0)a!H| zuho)xuo=_tw?6VS^wsDAR%``pvGeV)9^49TUytuG&qIgMR@QyN9iJUVEr7pu(og!T z5z>qL>PBRnvRZtehvB(MPi;mYvya7);^ifGjF(cEA4Hdm9)8B)RY|_dMew{ zS1so%;-+NP6UAdzDW8*GW-?!1eNq_mMDEY&vrf8ZQh7QP8d&+u1ZABijoQ$5HOtz{ zI45%F%K3VzKPp6Hka1PhP;)e#KNI=WFB(nnaqirt-T3BjGz#5@JZ$0t_h}i;#5gn_ zO+;hRSad7uiwe*r)Eo6dHzU0>67pl0XfhgsD5mcnlkTVx6(QQ9 z^!soa>WORz?R*o{L(vdKCo{fupP5QadRW)9os6DwPr~En{)L&k)M-N+B zjae^)^%}EY2J4;AK9V}89bS8t+cF5PLmX$IZzD$UJ;9{TA*Y>A=+MV*lhCnjlkse& zW8NyqujLftac-r{5<2#+)5-k5qRY6PcwH{_L@cHKb0 z`7G21HAB~;wx|JWgtE~Us5!a@eFrr~P0)>~H5!B*D)_tb26R2@jryRQQ2`o^97?z! z?2r1QLR5qXpn=E`SlT0p*Y;ApJQi8p+$;9#J)FflMJ3W`=po2v6m53LjK2qCwAF3#u%pJbP5S;Uh8*>D=nyXP!R599EW|7lakGmwcW@Xl?gjO*hzZclRx@7xPn9f*QTAD0l zwg11uBf}@qL1cOdQ#DxLM&1&?L^N+~4=wZ((qh_6Yx$URdx~NI7AkdyvIT8N?$KvH zM~WYk*TA}{5vqscLHnU4>nn8G7nWx-Z{2@N9>4w zYxO#Dcx+!BAHOhgdmKg_9$$9@*aS63O;K{)#_$ZJ{VBe0jIL2Ov_7bPpr4C;$M_(> z0QoZTMc_-o7l03cALiV@@k2ZfGtedIQj{DnVZ-veuj%j{?L;XlpE7cHA}_}XwnC3l zsUerTuq+Bjz^GV^h|wuqYE5z0^Zb1ent_Z^o0?^f0nS;TtV6WnxrAotSqH)3ictyh~sjdB0{N@11$*7Bmvwf##wqXe;tv-gGTt_Py4#Va>WH|3ahR~3D42qF1M!ujYAS37H8==|AOCFByMY_pL zGDO>ut>9_hhwes}O6XMNX}|;fPwMk_q_od%pG%(S&r?iy>P~*g z@@(qv=0yH_>biCA*7JrOvq+cioV@X$?;|1ye0y@fcj}hT%jwjiTgR>@L?>Z&x(Qjn zPo$~un$FAZYQAjJo?lO5_}pvra^ghb|FC*qPLCW;BRfBv#O68qU6VLgBT=+Xb0%4x z>q6%X;ooMbVrTsk4q*Ne^rm_ddQ<%z4u(%dE%Gpo?F4n|M5v_(!x8W%sM}jWU0EA? z!(Rw}2z`2ADt7++(7W<=sM~iy9ls1}-RV#p7eVj1ZqSE7Bj{aO6MDB+hCVdjo0W?1 ztUa)p`PERn&xYQ4L!l3a9?)AN2Tq4Ip?6YMcsHyF?}2a6OvMk{&G264mqQ;sGvF*Z z270S>gWg)#LZ1fJp?7%|SOSmUn~Ls-d!bK*EznyppZITq%bDK_XG3qp(QrHL&GMHd z^E+S{xD#FpUxpcQ7d#uj0#k4wJUSy4f3P_O?PZ82;Ed&6wl4%*YL5AEMnh4zdO-<^tk z$v=hm-4?<;I04$L&4HcZ`Oq%qyLYAH9`7v9vkUXe((FQ?t zedWW4;Z<-kycjNl5nKv?cSkDDBenxR!u$&OC|m&jj4=&94tv2TU=wK0wM*eLcn-|a4UQPE`yul9JmFJhbGVJ1x=up4Y$KO&|GTO z;ICi`{u=(__Ehv5+zVfa>)?L47`_3gL36M5hX-LhXs4kTJOs~xZ^DmA7-gcSH()JZ z!`onOxCGXL!(m<68rFjsKodiGznLtmlw?%jgNLC>q_#klPOXH!;B0s^90q&CT-XOT zgay!KR(;`a5@Pj(>tTPm02acQ`na3};3Vn?!hUd2IS0cm=7+!ra44(>hrv%soHZOC zfab;80L_&(ADS;~95f$S2WalCi=a8Tj*@)Kyj#yh^Ks3A=Hx1b=J4tW`7eI%u}M^& z84el!o`qaev $*.f + $(F2C) $*.f + rm $*.f + $(CC) $(CCPARS) -c $*.c + rm $*.c + +.f.o : + $(F2C) $*.f + $(CC) $(CCPARS) -c $*.c + rm $*.c + +.c.o : + $(CC) $(CPPMEM) $(CCPARS) -c $*.c + +clean: + -rm -f *.o + -rm -f loglan.exe + -rm -f loglan.out + -rm -f state.rst + +al11.o : al11.ff blank.h blank2.h option.h stos.h +al12.o : al12.ff blank.h blank2.h option.h stos.h +al13.o : al13.ff blank.h blank2.h option.h stos.h +it0.o : it0.ff blank.h blank2.h option.h stos.h + diff --git a/sources/pass1/makefile b/sources/pass1/makefile new file mode 100644 index 0000000..0473327 --- /dev/null +++ b/sources/pass1/makefile @@ -0,0 +1,99 @@ +############################################################################# + +WSIZE=4 # 2 for 16-bit system, 4 for 32-bit system + +#CPPMEM=-DLMEMSIZE=32000 -DLPMEMSIZE=22000 # 16-bit version +CPPMEM= -DLMEMSIZE=70000 -DLPMEMSIZE=48000 # 32-bit VAX & MSDOS GCC +#CPPMEM=-DLMEMSIZE=100000 -DLPMEMSIZE=70000 # 32-bit UNIX + +WORDS_IN_REAL=1 # 2 on 16-bit, 1 on 32-bit +DISABLE_H=1 # 0=enable H option on 16-bit, 1=disable on 32-bit + +# MSC version +#CPP=cl -EP +#CC=cl -AH -Oelsgc -Fo$*.o + +# GCC under MSDOS version i.e. DJ GNU C++ +#CPP=cpp -P +#CC=gcc -O -m486 + +# UNIX version +CPP=gcc -x c -E -P # GNU cpp +#CPP=/lib/cpp -P # MICROSOFT cpp +#CC=cc -I. -Oactl -CSON # UNIX SCO +#CC=cc -I. -Od # UNIX SCO - with respect to +# # MICROSOFT compiler +#CC=cc -I. +Np650 -DNO_PROTOTYPES # UNIX HP +#CC=cc -I. -DNO_PROTOTYPES # SUN SPARC +CC=gcc -O # GCC + + +target : loglan + + +############################################################################# + + + +.SUFFIXES: +.SUFFIXES: .o .ff +.SUFFIXES: .o .f +.SUFFIXES: .o .c + +SHELL=/bin/sh + +OBJ=al11.o al12.o al13.o \ + debug.o dsw.o hash.o ifun.o it0.o it1.o \ + memfil.o resume.o scan.o spgrec.o \ + wan1.o wan2.o wan3.o \ + ml2.o ml3.o \ + main.o stdio.o + +F2C=f2c -I$(WSIZE) -NL400 + +#F2C=f2c -I$(WSIZE) +CCPARS=-I. -DWSIZE=$(WSIZE) + + + +loglan16.exe : $(OBJ) + link /e /farcalls @msdos.lnk + +loglan32.exe : $(OBJ) + $(CC) -o loglan.out @unix.lnk + strip loglan.out + aout2exe loglan.out + rm loglan.out + +loglan : $(OBJ) + $(CC) $(OBJ) -o loglan + strip loglan +# mv loglan $(HOME)/bin + + +.ff.o : + $(CPP) $(CCPARS) $(CPPMEM) -DWORDS_IN_REAL=$(WORDS_IN_REAL) -DDISABLE_H=$(DISABLE_H) $*.ff > $*.f + $(F2C) $*.f + rm $*.f + $(CC) $(CCPARS) -c $*.c + rm $*.c + +.f.o : + $(F2C) $*.f + $(CC) $(CCPARS) -c $*.c + rm $*.c + +.c.o : + $(CC) $(CPPMEM) $(CCPARS) -c $*.c + +clean: + -rm -f *.o + -rm -f loglan.exe + -rm -f loglan.out + -rm -f state.rst + +al11.o : al11.ff blank.h blank2.h option.h stos.h +al12.o : al12.ff blank.h blank2.h option.h stos.h +al13.o : al13.ff blank.h blank2.h option.h stos.h +it0.o : it0.ff blank.h blank2.h option.h stos.h + diff --git a/sources/pass1/memfil.c b/sources/pass1/memfil.c new file mode 100644 index 0000000..deb541d --- /dev/null +++ b/sources/pass1/memfil.c @@ -0,0 +1,215 @@ + /* Loglan82 Compiler&Interpreter + Copyright (C) 1981-1993 Institute of Informatics, University of Warsaw + Copyright (C) 1993, 1994 LITA, Pau + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + +======================================================================= +*/ + +/***************************************************************** + * * + * Package of the I/O routines to be called from FORTRAN, VAX * + * according to the Standard of VAX-11 Procedure Calls. * + * For the LOGLAN-82 VAX/VMS Compiler * + * * + * (C) Andrzej I. Litwiniuk (AIL) * + * Institute of Informatics * + * University of Warsaw * + * * + * Version 1988.10.17 * + * * + *****************************************************************/ + +#if WSIZE==4 + typedef long word; +#elif WSIZE==2 + typedef short word; +#else + Define WSIZE to 2 or 4 ! +#endif + +#include +#include +#include +#include "f2c.h" + +FILE *file_arr[30]={NULL}; +static char *file_names[30]={NULL}; + +void ffopen_(stream,name,one) /* open file for binary reading */ +word *stream; +char *name; +long one; +{ + FILE *f=fopen(name,"rb"); /* read binary */ + if (f == NULL) { printf("file %s cannot be opened\n",name); exit(1); } + file_arr[*stream]=f; +} + +void ffcreat_(stream,name,one) /* open a new file for binary writing */ +word *stream; +char *name; +long one; +{ + FILE *f=fopen(name,"wb"); /* write binary */ + if (f == NULL) { printf("file %s cannot be opened\n",name); exit(1); } + file_arr[*stream]=f; + if( file_names[*stream] != NULL ) free( file_names[*stream] ); + file_names[*stream]=(char *)malloc( strlen(name)+1 ); + strcpy( file_names[*stream], name ); +} + +static int tmp_files[10]; +static int tmp_cnt=0; +static void clean_tmp() +{ + int i; + for( i=0; i + +#if WSIZE==4 + typedef long word; +#elif WSIZE==2 + typedef short word; +#else + Define WSIZE to 2 or 4 ! +#endif + +extern FILE *file_arr[]; + + +#ifndef NO_PROTOTYPES +static char *find_msg( int ); +#else +static char *find_msg(); +#endif + + +void listing_error_line__( lun, line, nr, errno, nameid ) + word *lun,*line,*nr,*errno; + char *nameid; +{ + FILE *f=stdout; + if( *lun != 0L ) f=file_arr[*lun]; + fprintf(f,"*** %6d ERROR %6d %s %8.8s\n",(int)(*line),(int)(*nr),find_msg((int)(*errno)),nameid); +} + + + +static char declaration_part_overloaded[]={"***DECLARATION PART OVERLOADED"}; +static char class_identifier_expected[]={"CLASS IDENTIFIER EXPECTED"}; +static char null_program[]={"NULL PROGRAM"}; +static char too_many_prototypes[]={"***TOO MANY PROTOTYPES"}; +static char undeclared_identifier[]={"UNDECLARED IDENTIFIER"}; +static char diff_lengths[]={"DIFFERENT LENGTHS OF THE 2ND PARAMETERS LISTS"}; +static char incompat_kinds[]={"INCOMPATIBLE KINDS OF THE 2ND LEVEL PARAMETERS"}; + + +static struct { int errno; char *errmsg; } err_tab[]={ + +{ 0,declaration_part_overloaded }, +{ 10,"***TOO MANY ERRORS" }, +{ 41,declaration_part_overloaded }, +{ 101,"\":=\" EXPECTED" }, +{ 102,"\";\" EXPECTED" }, +{ 103,"\"THEN\" EXPECTED" }, +{ 104,"\"FI\"/\"ELSE\" EXPECTED" }, +{ 105,"\"OD\" EXPECTED" }, +{ 106,"\"(\" EXPECTED" }, +{ 107,"\")\" EXPECTED" }, +{ 108,"\"DO\" EXPECTED" }, +{ 109,"IDENTIFIER EXPECTED" }, +{ 110,"TOO MANY EXITS" }, +{ 111,"ILLEGAL CHARACTER" }, +{ 112,"WRONG STRUCTURE OF \"IF\"-STATEMENT" }, +{ 113,"\"END\" MISSING" }, +{ 114,"\".\" EXPECTED" }, +{ 115,"ILLEGAL CONSTANT IN EXPRESSION" }, +{ 116,"\"=\" EXPECTED" }, +{ 117,"CONSTANT EXPEXCTED" }, +{ 118,"\":\" EXPECTED" }, +{ 119,"UNIT KIND SPECIFICATION EXPECTED" }, +{ 120,"\"HIDDEN\" OR \"CLOSE\" OCCURRED TWICE" }, +{ 121,"HIDDEN OR CLOSE OUT OF A CLASS" }, +{ 122,"\"BLOCK\" EXPECTED" }, +{ 123,"OBJECT EXPRESSION IS NOT A GENERATOR" }, +{ 124,"\"DIM\" EXPECTED" }, +{ 125,"\"TO\"/\"DOWNTO\" EXPECTED" }, +{ 126,"ILLEGAL ARITHMETIC OPERATOR" }, +{ 127,"DECLARATION PART EXPECTED" }, +{ 128,"INCORRECT IDENTIFIER AT \"END\"" }, +{ 129,"WRONG STRUCTURE OF \"CASE\"-STATEMENT" }, +{ 130,"WRONG STRUCTURE OF \"DO\"-STATEMENT" }, +{ 131,"ILLEGAL USE OF \"MAIN\"" }, +{ 132,"\"WHEN\" EXPECTED" }, +{ 133,"TOO MANY BRANCHES IN \"CASE\"-STATEMENT" }, +{ 134,"\"BEGIN\" MISSING" }, +{ 135,"BAD OPTION" }, +{ 136,"IS IT REALLY A LOGLAN PROGRAM ???" }, +{ 137,"\"BLOCK\" MISSING -PARSING BEGAN" }, +{ 138,"\"REPEAT\" OUT OF A LOOP" }, +{ 139,"THERE IS NO PATH TO THIS STATEMENT" }, +{ 140,"\"ANDIF\"/\"ORIF\" MIXED" }, +{ 141,"ARRAY OF \"SEMAPHORE\" IS ILLEGAL" }, +{ 142,"WRONG HANDLER END" }, +{ 143,"LASTWILL INSIDE A STRUCTURED STATEMENT" }, +{ 144,"REPEATED LASTWILL" }, +{ 145,"NO PARAMETER SPECIFICATION" }, +{ 146,"WRONG REGISTER SPECIFICATION" }, +{ 147,"\",\" EXPECTED" }, +{ 191,null_program }, +{ 196,"***TOO MANY IDENTIFIERS" }, +{ 197,"***TOO MANY FORMAL PARAMETERS" }, +{ 198,"***PARSER STACK OVERLOADED" }, +{ 199,too_many_prototypes }, +{ 201,"WRONG REAL CONSTANT" }, +{ 202,"WRONG COMMENT" }, +{ 203,"WRONG CHARACTER CONSTANT" }, +{ 204,"WRONG INTEGER CONSTANT" }, +{ 205,"INTEGER OVERFLOW" }, +{ 206,"REAL OVERFLOW" }, +{ 211,"IDENTIFIER TOO LONG" }, +{ 212,"STRING TOO LONG" }, +{ 301,"PREFIX IS NOT A CLASS" }, +{ 303,"COROUTINE/PROCESS ILLEGAL HERE AS PREFIX" }, +{ 304,"HIDDEN IDENTIFIER CANNOT BE TAKEN" }, +{ 305,undeclared_identifier }, +{ 306,"UNDECLARED TYPE IDENTIFIER" }, +{ 307,"TYPE IDENTIFIER EXPECTED" }, +{ 308,"UNDECLARED PREFIX IDENTIFIER" }, +{ 309,"DECLARED MORE THAN ONCE" }, +{ 310,"TAKEN LIST IN UNPREFIXED UNIT" }, +{ 316,"FORMAL TYPE SPECIFICATION AFTER USING" }, +{ 317,"HIDDEN TYPE IDENTIFIER" }, +{ 318,"TYPE IDENTIFIER NOT TAKEN" }, +{ 319,"HIDDEN IDENTIFIER IN THE LIST" }, +{ 320,"IDENTIFIER IN THE LIST NOT TAKEN" }, +{ 321,"IDENTIFIER CANNOT BE TAKEN" }, +{ 322,"HIDDEN PREFIX IDENTIFIER" }, +{ 323,"PREFIX IDENTIFIER NOT TAKEN" }, +{ 329,"ONLY PROCEDURE AND FUNCTION MAY BE VIRTUAL" }, +{ 330,"VIRTUAL IN UNPREFIXED BLOCK/PROCEDURE/FUNCTION" }, +{ 331,"INCOMPATIBLE KINDS OF VIRTULS" }, +{ 332,"INCOMPATIBLE TYPES OF VIRTUALS" }, +{ 333,"DIFFERENT LENGTH OF FORM. PARAM. LISTS IN VIRTUALS" }, +{ 334,"INCOMPATIBLE KINDS OF THE 1ST LEVEL PARAMETERS" }, +{ 335,"INCOMPATIBLE TYPES OF THE 1ST LEVEL PARAMETERS" }, +{ 336,diff_lengths }, +{ 337,incompat_kinds }, +{ 338,"INCOMPATIBLE TYPES OF THE 2ND LEVEL PARAMETERS" }, +{ 341,"***DECLARATION PART OVERLOADED" }, +{ 342,"***TOO MANY CLASSES DECLARED" }, +{ 343,too_many_prototypes }, +{ 350,"UNDECLARED SIGNAL IDENTIFIER" }, +{ 351,"HIDDEN SIGNAL IDENTIFIER" }, +{ 352,"SIGNAL IDENTIFIER NOT TAKEN" }, +{ 353,"SIGNAL IDENTIFIER EXPECTED" }, +{ 354,"DIFFERENT TYPES OF PARAMETERS" }, +{ 355,"INCOMPATIBLE KINDS OF THE PARAMETERS" }, +{ 356,"DIFFERENT IDENTIFIERS OF PARAMETERS" }, +{ 357,incompat_kinds }, +{ 358,"DIFFERENT TYPES OF THE 2ND LEVEL PARAMETERS" }, +{ 359,diff_lengths }, +{ 360,"DIFFERENT LENGTHS OF FORM. PARAM. LISTS IN SIGNALS" }, +{ 361,"NON-LOCAL FORMAL TYPE CANNOT BE USED" }, +{ 362,"REPEATED HANDLER FOR SIGNAL" }, +{ 370,"ONLY \"INPUT\" IS LEGAL HERE" }, +{ 398,"CLASS PREFIXED BY ITSELF" }, +{ 399,"CYCLE IN PREFIX SEQUENCE" }, +{ 401,"WRONG LABEL IN \"CASE\"" }, +{ 402,"\"CASE\"-STATEMENT NESTED TOO DEEPLY" }, +{ 403,"TOO LONG SPAN OF \"CASE\" LABELS" }, +{ 404,"REPEATED LABEL IN \"CASE\"-STATEMENT" }, +{ 405,"ILLEGAL TYPE OF \"CASE\" EXPRESSION" }, +{ 406,"DIFFERENT TYPES OF LABELS AND \"CASE\" EXPRESSION" }, +{ 407,"NON-LOGICAL EXPRESSION AFTER \"IF\"/\"WHILE\"" }, +{ 408,"REAL CONSTANT OUT OF INTEGER RANGE" }, +{ 410,"SIMPLE VARIABLE EXPECTED" }, +{ 411,"NON-INTEGER CONTROL VARIABLE" }, +{ 412,"NON-INTEGER EXPRESSION" }, +{ 413,"FILE EXPRESSION EXPECTED" }, +{ 414,"STRING EXPRESSION EXPECTED" }, +{ 415,"REFERENCE EXPRESSION EXPECTED" }, +{ 416,"ARRAY EXPRESSION EXPECTED" }, +{ 417,"BOOLEAN EXPRESSION EXPECTED" }, +{ 418,"SEMAPHORE VARIABLE EXPECTED" }, +{ 419,"ILLEGAL TYPE IN \"OPEN\"" }, +{ 420,"VARIABLE EXPECTED" }, +{ 421,"CLASS IDENTIFIER AFTER \"NEW\" EXPECTED" }, +{ 422,"PROCEDURE IDENTIFIER AFTER \"CALL\" EXPECTED" }, +{ 423,"\"NEW\" MISSING" }, +{ 424,"\"CALL\" MISSING" }, +{ 425,"\"INNER\" OUT OF A CLASS" }, +{ 426,"\"INNER\" OCCURRED MORE THAN ONCE" }, +{ 427,"\"WIND\"/\"TERMINATE\" OUT OF A HANDLER" }, +{ 428,"\"INNER\" INSIDE LASTWILL" }, +{ 429,"DEFINITION CANNOT BE REDUCED TO CONSTANT" }, +{ 430,"UNDEFINED CONSTANT IN THE DEFINITION" }, +{ 431,"WRONG NUMBER OF INDICES" }, +{ 432,"INDEX OUT OF RANGE" }, +{ 433,"UPPER BOUND LESS THAN LOWER BOUND" }, +{ 434,"TOO MANY SUBSCRIPTS" }, +{ 435,"VARIABLE IS NOT ARRAY" }, +{ 440,"TYPE IDENTIFIER EXPECTED AFTER \"ARRAYOF\"" }, +{ 441,"INCORRECT FORMAT IN \"WRITE\"" }, +{ 442,"ILLEGAL EXPRESSION IN \"WRITE\"" }, +{ 443,"ILLEGAL TYPE OF VARIABLE IN \"READ\"" }, +{ 444,"NO DATA FOR I/O TRANSFER" }, +{ 445,"ILLEGAL EXPRESSION IN \"PUT\"" }, +{ 446,"ILLEGAL TYPE OF VARIABLE IN \"GET\"" }, +{ 448,"\"RAISE\" MISSING" }, +{ 449,"SIGNAL IDENTIFIER AFTER \"RAISE\" EXPECTED" }, +{ 450,"ILLEGAL PROCEDURE OCCURRENCE" }, +{ 451,"ILLEGAL CLASS OCCURRENCE" }, +{ 452,"ILLEGAL TYPE OCCURRENCE" }, +{ 453,"ILLEGAL SIGNAL OCCURRENCE" }, +{ 454,"ILLEGAL OPERATOR OCCURRENCE" }, +{ 455,"WRONG NUMBER OF OPERANDS" }, +{ 460,"DIVIDED BY ZERO" }, +{ 469,"WRONG REGISTER NUMBER" }, +{ 470,"ILLEGAL INPUT PARAMETER" }, +{ 471,"ILLEGAL OUTPUT PARAMETER" }, +{ 472,"ILLEGAL TYPE PARAMETER" }, +{ 473,"ILLEGAL PROCEDURE PARAMETER" }, +{ 474,"ILLEGAL FUNCTION PARAMETER" }, +{ 475,"ILLEGAL LEFT SIDE OF \"IS\"/\"IN\"" }, +{ 476,"ILLEGAL RIGHT SIDE OF \"IS\"/\"IN\"" }, +{ 477,"ILLEGAL PARAMETER OF \"ATTACH\"" }, +{ 478,"ILLEGAL TYPE OF EXPRESSION" }, +{ 479,"NEGATIVE STEP VALUE" }, +{ 500,"***PROGRAM UNEXPECTEDLY HARD" }, +{ 550,"***STACK OVERLOADED" }, +{ 551,"***TOO MANY AUXILIARY VARIABLES NEEDED" }, +{ 552,"***TOO MANY AUXILIARY REFERENCE VARIABLES NEEDED" }, +{ 553,"***STATEMENT SEQUENCE TOO LONG OR TOO COMPLICATED" }, +{ 554,"***REAL CONSTANTS DICTIONARY OVERFOW" }, +{ 600,undeclared_identifier }, +{ 601,"ILLEGAL TYPE BEFORE \".\"" }, +{ 602,"CLOSE IDENTIFIER AFTER \".\"" }, +{ 603,"UNDECLARED IDENTIFIER AFTER \".\"" }, +{ 604,"ILLEGAL OPERAND TYPE" }, +{ 605,"ILLEGAL TYPE IN \"DIV\"/\"MOD\" TERM" }, +{ 606,"INCOMPATIBLE TYPES IN COMPARISON" }, +{ 607,"UNRELATED CLASS TYPES IN COMPARISON" }, +{ 608,"STRINGS CANNOT BE COMPARED" }, +{ 609,"INCOMPATIBLE TYPES IN ASSIGNMENT/TRANSMISSION" }, +{ 610,"UNRELATED CLASS TYPES IN ASSIGNMENT/TRANSMISSION" }, +{ 611,"CONSTANT AFTER \".\"" }, +{ 612,"THIS CLASS DOES NOT OCCUR IN SL-CHAIN" }, +{ 613,class_identifier_expected }, +{ 614,class_identifier_expected }, +{ 615,"ILLEGAL TYPE BEFORE \"QUA\"" }, +{ 616,"ILLEGAL TYPE AFTER \"QUA\"" }, +{ 617,"ILLEGAL TYPE AFTER \"QUA\"" }, +{ 618,"UNRELATED TYPES IN \"QUA\"-EXPRESSION" }, +{ 619,"HIDDEN IDENTIFIER" }, +{ 620,"NON-TAKEN IDENTIFIER" }, +{ 621,"INVISIBLE IDENTIFIER AFTER \".\"" }, +{ 622,"FORMAL PARAMETER LIST SHORTER" }, +{ 623,"FORMAL PARAMETER LIST LONGER" }, +{ 624,"ACTUAL PARAMETER IS NOT A REFERENCE TYPE" }, +{ 625,"ACTUAL PARAMETER IS NOT A TYPE" }, +{ 626,"PROCEDURE-FUNCTION CONFLICT BETWEEN PARAMETERS" }, +{ 627,"UNMATCHED HEADS - WRONG KINDS OF PARAMETERS" }, +{ 628,"UNMATCHED HEADS-INCOMPATIBLE TYPES IN LISTS" }, +{ 629,"UNMATCHED HEADS-UNRELATED CLASS TYPES IN LISTS" }, +{ 630,"UNMATCHED HEADS-DIFFERENT NUMBERS OF PARAMETERS" }, +{ 631,"INCOMPATIBLE TYPES OF FUNCTION PARAMETERS" }, +{ 632,"FUNCTION/PROCEDURE EXPECTED" }, +{ 633,null_program }, +{ 634,"UNMATCHED HEADS-TOO WEAK TYPE IN ACTUAL LIST" }, +{ 635,"STANDARD FUNCTION/PROCEDURE CANNOT BE ACTUAL PAR." }, +{ 636,"ILLEGAL USE OF SEMAPHORE" }, +{ 637,"\"SEMAPHORE\" TYPE CANNOT BE USED" } + +}; + + +static char *find_msg( errno ) int errno;{ + int l=0; + int u=sizeof(err_tab)/sizeof(err_tab[0]); + while( l!=u ){ + int m= ( l+u )/2 ; + if( errno > err_tab[m].errno ) l=m; + else + if( errno < err_tab[m].errno ) u=m; + else + l=u=m; + } + if( err_tab[l].errno != errno ) + return "UNKNOWN ERROR MESSAGE NUBER - INTERNAL COMPILER ERROR"; + return err_tab[l].errmsg; +} + diff --git a/sources/pass1/msdos.lnk b/sources/pass1/msdos.lnk new file mode 100644 index 0000000..384779f --- /dev/null +++ b/sources/pass1/msdos.lnk @@ -0,0 +1,13 @@ +it0+ +(hash)+ +(wan1+wan2+wan3+scan)+ +(it1+dsw)+ +(al11+al12+resume+spgrec)+ +al13+ +(ml2)+ +debug+memfil+main+ifun+stdio+ml3 +loglan + + + + diff --git a/sources/pass1/names/doctext.pas b/sources/pass1/names/doctext.pas new file mode 100644 index 0000000..b73a1d6 --- /dev/null +++ b/sources/pass1/names/doctext.pas @@ -0,0 +1,24 @@ +program doctext(input,output,infile,outfile); +const ff = 12; + lf = 10; + cr = 13; +var c:char; + infile,outfile:file of char; +begin + reset(infile); rewrite(outfile); + read(infile,c); + if c <> '1' then write(outfile,c); + while not eof(infile) do + begin + read(infile,c); + if ord(c) = lf then + begin + if not eof(infile) then + begin + read(infile,c); + if c = '1' then write(outfile,chr(ff)) else + if c <> '+' then write(outfile,chr(lf)); + end else write(outfile,chr(lf)); + end else write(outfile,c); + end + end. \ No newline at end of file diff --git a/sources/pass1/names/exec.pas b/sources/pass1/names/exec.pas new file mode 100644 index 0000000..70269be --- /dev/null +++ b/sources/pass1/names/exec.pas @@ -0,0 +1,222 @@ +module execprog[]; +(*CBC B.Ciesielski *) +(* PASCAL routines for EXEC standard function *) + +var + pspdd : word; + defdsdd : word; + envdd : word; + cesxqq [external] : word; ! ES register from Pascal + addr_ptr : ads of word; + ax,bx,cx,dx,si,di : word; ! General Registers + ds,es : word; ! Segment Registers + errcode : word; ! Error code returned from DOS + +procedure dos(var ax,bx,cx,dx,si,di,ds,es,errcode : word); external; + +procedure initdd(var ax,bx,cx,dx,si,di,ds,es : word); +{INITDD Initialize registers for call to DOS.} + begin {initdd} + ds := defdsdd; ! Program Data Segment + es := ds; + si := 0; + di := 0; + ax := 0; + bx := 0; + cx := 0; + dx := 0 + end; {initdd} + +procedure asciizdd(const lstr : lstring; var astr : string); +{ASCIIZDD This procedure converts a lstring variable to a ASCIIZ string. + An asciiz string is terminated by a byte of zeroes.} + var + len,alen : byte; + begin {asciizdd} + len := lstr.len; + alen := wrd(upper(astr)); + if (len >= alen) then + len := alen - 1; + movel(adr lstr[1],adr astr[1],len); + astr[len + 1] := chr(0) + end; {asciizdd} + +procedure initsup; +(* initialize system pointers *) + begin + pspdd := cesxqq; ! Program segment prefix + addr_ptr := ads cesxqq; + defdsdd := addr_ptr.s; ! Default data segment + addr_ptr.s := pspdd; ! Program environment address + addr_ptr.r := #2c; ! is at offset #2c in PSP. + envdd := addr_ptr^ + end; {initsup} + +procedure setblkmm(blkseg,blksize : word; var block,ercode : word); +{SETBLKMM Modifies Allocated Blocks. The memory block pointed to by + blkseg is modified to the size (in paragraphs) of blksize. The + block increases or decreases in size to that specified in blksize. + If the block cannot grow to blksize, the largest possible expansion + is made, and new block size is returned in block. The values for + the returned error code are: + + 0 - Successful reallocation. The new block size + (in paragraphs) is in block. + 1 - Memory control blocks destroyed + 2 - Insufficient memory on a grow request. The + new block size is in block. + 3 - The pointer in blkseg points to a block which + has not been allocated. + >99 - Unidentified error. } + + begin {setblkmm} + + initdd(ax,bx,cx,dx,si,di,ds,es); ! Initialize registers + ax := byword(#4a,0); ! DOS Function 4ah + es := blkseg; + bx := blksize; + + dos(ax,bx,cx,dx,si,di,ds,es,errcode); + + block := bx; + case errcode of + 0 : ercode := 0; + 7 : begin ! Destroyed control blocks + block := 0; + ercode := 1 + end; + 8 : ercode := 2; ! Not enough memory + 9 : begin + block := 0; ! Illegal block request + ercode := 3 + end + otherwise + block := 0; + ercode := 100 + errcode + end {case} + + end; {setblkmm} + +procedure shrinkmm(var ercode : word); +{SHRINKMM Release all memory not needed by the executing program. This + procedure makes a call to SETBLKMM to release all memory which has + been allocated, but which is not needed. DOS normally allocates all + memory to a program, so memory must be released before other calls to + ALLOCMM are made. The required memory is calculated as the code size + plus the data space. The code size is essentially the default data + segment minus the program segment prefix. The data space is the mini- + mum of #1000 paragraphs (64K bytes) or the remainder of memory. The + value of the error code returned is that returned by SETBLKMM.} + + var + topmem_ptr : ads of word; ! Pointer to word containing + topmem : word; ! top of memory. + data_seg : word; ! data segment start + code_size : word; + data_space : word; + blksize : word; ! Total block size needed + + begin {shrinkmm} + + topmem_ptr.s := pspdd; + topmem_ptr.r := 2; ! At offset 2 in PSP + topmem := topmem_ptr^; + data_seg := defdsdd; ! Default data segment + if (data_seg < pspdd) then ! data_seg can be "negative" + data_seg := topmem - (pspdd - data_seg); + code_size := data_seg - pspdd; + data_space := topmem - data_seg; + if (data_space < #1000) then + blksize := code_size + data_space + else + blksize := code_size + #1000; + + setblkmm(pspdd,blksize,blksize,ercode) + + end; {shrinkmm} + +procedure execmm (const proc_name, cmd_line : lstring; + var ercode : word) [public]; +{EXECMM Load and execute a program. This procedure loads and executes + another program. The program path name is given in proc_name; the + command line is given in cmd_line. The specified program will be + loaded and executed as if invoked from DOS with the given command + line. The spawned program returns control to the calling procedure + when execution ends, either normally or using a Ctrl/Break sequence. + The values of the returned error code are: + + 0 - Successful execution and return. + (*) 1 - Memory control blocks destroyed when trying + to reserve memory. + (*) 2 - Insufficient memory when trying to reserve + memory. + (*) 3 - Illegal block change request when trying to + reserve memory. + 4 - Executable file not found. + 5 - Access denied. The file does not allow read + access. + 6 - Insufficient memory to load the new procedure. + (*) 7 - Invalid environment created in the called + program. + (*) 8 - Invalid format in the environment. + 9 - Invalid Path Name. Probably illegal characters + are present in the proc_name parameter. + >99 - Unidentified error + + Errors marked with (*) are internal errors and should not + normally occur. Errors 1 - 3 indicate problems with the + SHRINKMM procedure, and errors 7 & 8 are internal errors + within EXECMM (the construction of the parameter block).} + + type + parm_block = record ! Parameter block + env_sadd : word; ! Segment address of environment + cmd_addr : adsmem; ! Address of command line + fb1_addr : adsmem; ! Address of first FCB + fb2_addr : adsmem ! Address of second FCB + end; + var + procz : string(255); ! ASCIIZ procedure name + block_val : parm_block; ! Constructed parameter block + + begin {execmm} + initsup; + shrinkmm(ercode); ! Release available memory + + if (ercode = 0) then ! Now load the program + begin + with block_val do + begin + env_sadd := envdd; ! Copy parent's environment + cmd_addr := ads cmd_line[0]; + fb1_addr.s := pspdd; + fb1_addr.r := #5c; + fb2_addr.s := pspdd; + fb2_addr.r := #6c + end; + initdd(ax,bx,cx,dx,si,di,ds,es); + ax := byword(#4b,0); ! DOS function 4bh + bx := wrd(adr block_val); + cx := 0; + asciizdd(proc_name,procz); + dx := wrd(adr procz); ! Path name as an asciiz string + + dos(ax,bx,cx,dx,si,di,ds,es,errcode); + + case errcode of + 0 : ercode := 0; + 1 : ercode := 9; ! Invalid path name + 2 : ercode := 4; ! File not found + 5 : ercode := 5; ! Access denied + 8 : ercode := 6; ! Insufficient memory + 10 : ercode := 7; ! Invalid environoment + 11 : ercode := 8; ! Invalid format + otherwise + ercode := 100 + errcode + end {case} + + end + + end; {execmm} + +end. diff --git a/sources/pass1/names/names b/sources/pass1/names/names new file mode 100644 index 0000000..a547f19 --- /dev/null +++ b/sources/pass1/names/names @@ -0,0 +1,12 @@ +write +begin +end +if +then +else +put +box +iiuwgraph +mouse +case +esac diff --git a/sources/pass1/names/nazwy.pas b/sources/pass1/names/nazwy.pas new file mode 100644 index 0000000..bba2a8e --- /dev/null +++ b/sources/pass1/names/nazwy.pas @@ -0,0 +1,72 @@ +program nazwy(input,output,names,result,fhash); +(* program czyta ciag identyfikatorow z pliku names *) +(* na plik result wypisuje pary (nazwa, numer z hash'u ) *) +(* na plik fhash wypisuje ciag podstawien tworzacy zmodyfikowana tablice hash *) +const dl = 10; +type tname = array[1..10] of integer; + thash = array[1..8000] of integer; +var name:tname; + hash : thash; + nlast : integer; + a1,b1,i,j,n:integer; + a,b:char; + names,fhash,result:text; + str:lstring(20); +function search(vars k:integer; vars name:tname; vars hash:thash; + vars nlast:integer):integer [fortran];extern; +procedure init(vars hash:thash) [fortran];extern; +begin + (* inicjalizacja *) + reset(names); + rewrite(result); + rewrite(fhash); + for i := 1 to 8000 do hash[i] := 0; + nlast := 8001; + (* inicjalizacja tablicy hash *) + init(hash); + writeln(' koniec inicjalizacji tablicy hash '); + + while not eof(names) do + begin + i := 0; + j := 0; + str.len := wrd(20); + while not eoln(names) do + begin + read(names,a); + j := j+1; + str[j] := a; + if a<'a'then a1 := ord(a) - ord('0') else + a1 := ord(a) - ord('a')+10; + if not eoln(names) then + begin + read(names,b); + j := j+1; + str[j] := b; + i := i+1; + if b<'a' then b1 := ord(b) - ord('0') else + b1 := ord(b) - ord('a')+10; + if a1 = 0 then a1 := 60; + name[i] := a1*64+b1; + end else + begin + i := i+1; + name[i] := a1; + end; + end; + (* koniec nazwy *) + n := search(i,name,hash,nlast); + str.len := wrd(j); + writeln(result,' ',str, ' ',n); + readln(names); + end; + + (* wypisanie tablicy hash *) + for i := 1 to 8000 do + begin + if hash[i] <> 0 then + writeln(fhash,' ','HASH (',i:6,' ) =',hash[i]:6); + end; + end. + + diff --git a/sources/pass1/names/printmem.pas b/sources/pass1/names/printmem.pas new file mode 100644 index 0000000..d1dab8e --- /dev/null +++ b/sources/pass1/names/printmem.pas @@ -0,0 +1,126 @@ +procedure printmem; +var i,j,k:integer; +begin + writeln; writeln(' ================ zmienne ============================'); + writeln; writeln; + writeln(' strings ', strings); + writeln(' ipradr ', ipradr); + writeln(' display(fiz) ', display); + writeln(' display2 ', display2); + writeln(' temporary ',temporary); + writeln(' main ', main); + writeln(' lower ', lower); + writeln(' upper ', upper); + writeln(' free ', free); + writeln(' freeitem ', freeitem); + writeln(' lastused ', lastused); + writeln(' headk ', headk); + writeln(' headk2 ', headk2); + writeln; writeln; + writeln(' element slownika dla none ', m^[0],' ', m^[1]); + writeln; writeln; + writeln('================= opisy typow pierwotnych i listy ==============='); + j := 0; + for i := ipradr to display-1 do + begin + if j mod 5 = 0 then + begin + writeln; + write(' ',i:7,'***'); + end; + j := j+1; + write(m^[i]:9); + end; + writeln; writeln; + writeln('======================= display ==============='); + writeln; writeln; + for i := 0 to lastprot do + begin + write(' ',display+i:7,display2+i:7, '(',i:5,')',m^[display+i], m^[display2+i]); + writeln; + end; + writeln; writeln; + writeln(' ================= obiekt main ================'); + i := m^[main]; + j := 0; + for k := main to main+i-1 do + begin + if j mod 5 = 0 then + begin + writeln; + write(' ',k:7,'***'); + end; + j := j+1; + write(m^[k]:9); + end; + writeln; writeln; + writeln('===================== obiekty (lower to latused) =========='); + writeln; writeln; + j :=0; + for i := lower to lastused do + begin + if j mod 5 = 0 then + begin + writeln; + write(' ',i:7,'***'); + end; + j := j+1; + write(m^[i]:9); + end; + writeln; writeln; + writeln('======================= tablica H (upper downto lastitem) ====='); + writeln; writeln; + i := upper-1; + while i>= lastitem do + begin + writeln(' ',i:7,'***',m^[i]:9, m^[i+1]:9); + i:=i-2; + end; + writeln; writeln; + writeln('================================================================='); +end (* printmem *); + + + procedure printkind(kind:protkind); + begin + case kind of + class : writeln(' class'); + lrecord: writeln(' record'); + coroutine: writeln(' coroutine'); + process: writeln(' process); + block : writeln(' block'); + prefblock: writeln(' prefblock'); + lfunction: writeln(' function'); + lprocedure: writeln(' procedure'); + handler: writeln(' handler'); + end; + end; + +procedure printprot; +var i:integer; +begin + writeln; writeln; + writeln('================ prototypes ============== '); + writeln(' lastprot ', lastprot); + for i := mainblock to lastprot do + with prototype[i]^ do + begin + writeln; writeln; + write(' prototyp nr ',i);printkind(kind); + writeln(' SL ', slprototype); + writeln(' codeaddr ', codeaddr); + writeln(' appetite ', appetite); + writeln(' span ', span); + writeln(' reflist ', reflist, lthreflist); + writeln(' parlist ', parlist,lthparlist); + writeln(' preflist ',preflist, lthpreflist); + writeln(' virtlist ', virtlist); + if (kind = lfunction) or (kind = lprocedure) then + begin + writeln(' pardescr ', pfdescr); + if kind = lfunction then + writeln(' type ', finaltype); + end; + end; + end (* printprot *); + \ No newline at end of file diff --git a/sources/pass1/names/search.for b/sources/pass1/names/search.for new file mode 100644 index 0000000..06fd3e1 --- /dev/null +++ b/sources/pass1/names/search.for @@ -0,0 +1,1169 @@ + subroutine init(hash) + implicit integer*2 (a-z) + dimension hash(8000) + HASH ( 59 ) = 1038 + HASH ( 60 ) = -2343 + HASH ( 81 ) = 2058 + HASH ( 82 ) = -2691 + HASH ( 85 ) = 1051 + HASH ( 86 ) = -2271 + HASH ( 95 ) = 2065 + HASH ( 96 ) = -2689 + HASH ( 97 ) = 2066 + HASH ( 98 ) = -2639 + HASH ( 115 ) = 2075 + HASH ( 116 ) = -2681 + HASH ( 179 ) = 1098 + HASH ( 180 ) = -2669 + HASH ( 189 ) = 1103 + HASH ( 190 ) = -2285 + HASH ( 195 ) = 1106 + HASH ( 196 ) = -2865 + HASH ( 209 ) = 1113 + HASH ( 210 ) = -2289 + HASH ( 237 ) = 2136 + HASH ( 238 ) = -2485 + HASH ( 307 ) = 1162 + HASH ( 308 ) = -2607 + HASH ( 317 ) = 1167 + HASH ( 331 ) = 1174 + HASH ( 332 ) = -2523 + HASH ( 333 ) = 1175 + HASH ( 334 ) = 2861 + HASH ( 335 ) = 1176 + HASH ( 336 ) = -2609 + HASH ( 343 ) = 1180 + HASH ( 344 ) = 2605 + HASH ( 579 ) = 1298 + HASH ( 580 ) = -2835 + HASH ( 691 ) = 1354 + HASH ( 692 ) = -2637 + HASH ( 717 ) = 1367 + HASH ( 719 ) = 1368 + HASH ( 720 ) = -2833 + HASH ( 819 ) = 1418 + HASH ( 820 ) = -2831 + HASH ( 827 ) = 1422 + HASH ( 828 ) = -2327 + HASH ( 835 ) = 1426 + HASH ( 836 ) = -2395 + HASH ( 847 ) = 1432 + HASH ( 848 ) = -2829 + HASH ( 955 ) = 1486 + HASH ( 956 ) = -2827 + HASH ( 975 ) = 1496 + HASH ( 976 ) = -2825 + HASH ( 987 ) = 1502 + HASH ( 988 ) = -1989 + HASH ( 1081 ) = 1549 + HASH ( 1105 ) = 1561 + HASH ( 1106 ) = -2363 + HASH ( 1109 ) = 1563 + HASH ( 1110 ) = 2819 + HASH ( 1113 ) = 1565 + HASH ( 1114 ) = -2815 + HASH ( 1115 ) = 1566 + HASH ( 1116 ) = -2807 + HASH ( 1203 ) = 1610 + HASH ( 1204 ) = -2493 + HASH ( 1231 ) = 1624 + HASH ( 1232 ) = -2241 + HASH ( 1237 ) = 1627 + HASH ( 1238 ) = -2797 + HASH ( 1243 ) = 1630 + HASH ( 1244 ) = -2341 + HASH ( 1303 ) = 651 + HASH ( 1304 ) = -2615 + HASH ( 1305 ) = 652 + HASH ( 1306 ) = -2305 + HASH ( 1325 ) = 662 + HASH ( 1326 ) = -2381 + HASH ( 1327 ) = 663 + HASH ( 1328 ) = -2999 + HASH ( 1335 ) = 667 + HASH ( 1336 ) = -2997 + HASH ( 1339 ) = 669 + HASH ( 1340 ) = -2985 + HASH ( 1371 ) = 1694 + HASH ( 1372 ) = -2777 + HASH ( 1437 ) = 718 + HASH ( 1438 ) = -2973 + HASH ( 1451 ) = 725 + HASH ( 1452 ) = -2969 + HASH ( 1457 ) = 728 + HASH ( 1458 ) = -2965 + HASH ( 1459 ) = 1738 + HASH ( 1460 ) = -2659 + HASH ( 1463 ) = 731 + HASH ( 1464 ) = -2267 + HASH ( 1467 ) = 1742 + HASH ( 1468 ) = -2775 + HASH ( 1487 ) = 1752 + HASH ( 1488 ) = -2583 + HASH ( 1557 ) = 778 + HASH ( 1558 ) = -2955 + HASH ( 1571 ) = 785 + HASH ( 1572 ) = -2949 + HASH ( 1573 ) = 786 + HASH ( 1574 ) = -2103 + HASH ( 1579 ) = 789 + HASH ( 1580 ) = -2941 + HASH ( 1585 ) = 792 + HASH ( 1586 ) = -2927 + HASH ( 1591 ) = 1804 + HASH ( 1592 ) = -2189 + HASH ( 1595 ) = 1806 + HASH ( 1596 ) = -2751 + HASH ( 1603 ) = 1810 + HASH ( 1604 ) = -2663 + HASH ( 1609 ) = 1813 + HASH ( 1610 ) = -2463 + HASH ( 1619 ) = 1818 + HASH ( 1620 ) = -2591 + HASH ( 1625 ) = 1821 + HASH ( 1626 ) = -2743 + HASH ( 1635 ) = 1826 + HASH ( 1636 ) = -2003 + HASH ( 1685 ) = 842 + HASH ( 1686 ) = -2349 + HASH ( 1693 ) = 846 + HASH ( 1694 ) = -2909 + HASH ( 1701 ) = 850 + HASH ( 1702 ) = -2905 + HASH ( 1713 ) = 856 + HASH ( 1714 ) = 2899 + HASH ( 1715 ) = 1866 + HASH ( 1716 ) = -2731 + HASH ( 1719 ) = 859 + HASH ( 1720 ) = -2283 + HASH ( 1723 ) = 1870 + HASH ( 1724 ) = -2647 + HASH ( 1729 ) = 1873 + HASH ( 1730 ) = -2727 + HASH ( 1731 ) = 1874 + HASH ( 1732 ) = -2593 + HASH ( 1743 ) = 1880 + HASH ( 1749 ) = 1883 + HASH ( 1750 ) = -2721 + HASH ( 1751 ) = 1884 + HASH ( 1752 ) = 2425 + HASH ( 1763 ) = 1890 + HASH ( 1764 ) = -2719 + HASH ( 1829 ) = 1367 + HASH ( 1830 ) = 2253 + HASH ( 1831 ) = 653 + HASH ( 1832 ) = -1829 + HASH ( 1833 ) = 1742 + HASH ( 1834 ) = -1831 + HASH ( 1835 ) = 917 + HASH ( 1836 ) = -2893 + HASH ( 1837 ) = 918 + HASH ( 1838 ) = -2399 + HASH ( 1839 ) = 919 + HASH ( 1840 ) = -2891 + HASH ( 1841 ) = 920 + HASH ( 1842 ) = -2617 + HASH ( 1849 ) = 924 + HASH ( 1850 ) = -2889 + HASH ( 1859 ) = 929 + HASH ( 1860 ) = -2887 + HASH ( 1869 ) = 1943 + HASH ( 1870 ) = -2717 + HASH ( 1873 ) = 1945 + HASH ( 1874 ) = -2709 + HASH ( 1941 ) = 970 + HASH ( 1942 ) = -2877 + HASH ( 1957 ) = 978 + HASH ( 1958 ) = 2339 + HASH ( 1969 ) = 984 + HASH ( 1970 ) = -2873 + HASH ( 1971 ) = 1994 + HASH ( 1972 ) = -2699 + HASH ( 1981 ) = 990 + HASH ( 1982 ) = -2871 + HASH ( 1987 ) = 2002 + HASH ( 1988 ) = -2697 + HASH ( 1989 ) = 1422 + HASH ( 1990 ) = -1991 + HASH ( 1991 ) = 1755 + HASH ( 1992 ) = -1993 + HASH ( 1993 ) = 1563 + HASH ( 1995 ) = 1890 + HASH ( 1996 ) = -1997 + HASH ( 1997 ) = 1614 + HASH ( 1998 ) = -1999 + HASH ( 1999 ) = 1755 + HASH ( 2000 ) = -2001 + HASH ( 2001 ) = 1563 + HASH ( 2003 ) = 1806 + HASH ( 2004 ) = -2005 + HASH ( 2005 ) = 1755 + HASH ( 2006 ) = -2007 + HASH ( 2007 ) = 1563 + HASH ( 2017 ) = 1559 + HASH ( 2019 ) = 1874 + HASH ( 2020 ) = -2017 + HASH ( 2021 ) = 1810 + HASH ( 2022 ) = -2019 + HASH ( 2023 ) = 1624 + HASH ( 2024 ) = -2021 + HASH ( 2025 ) = 1741 + HASH ( 2027 ) = 778 + HASH ( 2028 ) = -2025 + HASH ( 2029 ) = 1496 + HASH ( 2030 ) = -2027 + HASH ( 2031 ) = 1181 + HASH ( 2033 ) = 1694 + HASH ( 2034 ) = -2031 + HASH ( 2035 ) = 14 + HASH ( 2037 ) = 725 + HASH ( 2038 ) = -2035 + HASH ( 2039 ) = 1802 + HASH ( 2040 ) = -2037 + HASH ( 2041 ) = 850 + HASH ( 2042 ) = -2039 + HASH ( 2043 ) = 1358 + HASH ( 2045 ) = 651 + HASH ( 2046 ) = -2043 + HASH ( 2047 ) = 919 + HASH ( 2048 ) = -2045 + HASH ( 2049 ) = 1629 + HASH ( 2051 ) = 782 + HASH ( 2052 ) = -2049 + HASH ( 2053 ) = 652 + HASH ( 2054 ) = -2051 + HASH ( 2055 ) = 2254 + HASH ( 2057 ) = 1810 + HASH ( 2058 ) = -2055 + HASH ( 2059 ) = 661 + HASH ( 2060 ) = -2057 + HASH ( 2061 ) = 1742 + HASH ( 2062 ) = -2059 + HASH ( 2063 ) = 14 + HASH ( 2065 ) = 1187 + HASH ( 2066 ) = -2063 + HASH ( 2067 ) = 1884 + HASH ( 2068 ) = -2065 + HASH ( 2069 ) = 1175 + HASH ( 2070 ) = -2067 + HASH ( 2071 ) = 908 + HASH ( 2073 ) = 1883 + HASH ( 2074 ) = -2071 + HASH ( 2075 ) = 1630 + HASH ( 2076 ) = -2073 + HASH ( 2077 ) = 908 + HASH ( 2079 ) = 1883 + HASH ( 2080 ) = -2077 + HASH ( 2081 ) = 1038 + HASH ( 2082 ) = -2079 + HASH ( 2083 ) = 1492 + HASH ( 2085 ) = 1362 + HASH ( 2086 ) = -2083 + HASH ( 2087 ) = 1943 + HASH ( 2088 ) = -2085 + HASH ( 2089 ) = 916 + HASH ( 2091 ) = 1806 + HASH ( 2092 ) = -2089 + HASH ( 2093 ) = 797 + HASH ( 2094 ) = 2041 + HASH ( 2095 ) = 1742 + HASH ( 2096 ) = -2093 + HASH ( 2097 ) = 850 + HASH ( 2098 ) = -2095 + HASH ( 2099 ) = 908 + HASH ( 2101 ) = 929 + HASH ( 2102 ) = -2099 + HASH ( 2103 ) = 1739 + HASH ( 2105 ) = 16 + HASH ( 2107 ) = 1175 + HASH ( 2108 ) = -2105 + HASH ( 2109 ) = 1883 + HASH ( 2110 ) = -2107 + HASH ( 2111 ) = 1884 + HASH ( 2112 ) = -2109 + HASH ( 2113 ) = 1566 + HASH ( 2114 ) = -2111 + HASH ( 2115 ) = 1864 + HASH ( 2117 ) = 1559 + HASH ( 2118 ) = -2115 + HASH ( 2119 ) = 1103 + HASH ( 2120 ) = -2117 + HASH ( 2121 ) = 29 + HASH ( 2122 ) = 2119 + HASH ( 2123 ) = 1559 + HASH ( 2124 ) = -2121 + HASH ( 2125 ) = 1103 + HASH ( 2126 ) = -2123 + HASH ( 2127 ) = 20 + HASH ( 2129 ) = 652 + HASH ( 2130 ) = -2127 + HASH ( 2131 ) = 1883 + HASH ( 2132 ) = -2129 + HASH ( 2133 ) = 665 + HASH ( 2135 ) = 1750 + HASH ( 2136 ) = -2133 + HASH ( 2137 ) = 2136 + HASH ( 2138 ) = -2135 + HASH ( 2139 ) = 25 + HASH ( 2141 ) = 1418 + HASH ( 2142 ) = -2139 + HASH ( 2143 ) = 1563 + HASH ( 2144 ) = -2141 + HASH ( 2145 ) = 665 + HASH ( 2146 ) = 2075 + HASH ( 2147 ) = 1878 + HASH ( 2148 ) = -2145 + HASH ( 2149 ) = 1630 + HASH ( 2150 ) = -2147 + HASH ( 2151 ) = 665 + HASH ( 2152 ) = 2081 + HASH ( 2153 ) = 1878 + HASH ( 2154 ) = -2151 + HASH ( 2155 ) = 1038 + HASH ( 2156 ) = -2153 + HASH ( 2157 ) = 33 + HASH ( 2158 ) = 2069 + HASH ( 2159 ) = 1618 + HASH ( 2160 ) = -2157 + HASH ( 2161 ) = 1175 + HASH ( 2162 ) = -2159 + HASH ( 2163 ) = 1564 + HASH ( 2164 ) = 2161 + HASH ( 2165 ) = 2201 + HASH ( 2166 ) = -2163 + HASH ( 2167 ) = 1175 + HASH ( 2168 ) = -2165 + HASH ( 2169 ) = 1564 + HASH ( 2170 ) = 2167 + HASH ( 2171 ) = 2137 + HASH ( 2172 ) = -2169 + HASH ( 2173 ) = 1175 + HASH ( 2174 ) = -2171 + HASH ( 2175 ) = 34 + HASH ( 2176 ) = 2023 + HASH ( 2177 ) = 1633 + HASH ( 2178 ) = -2175 + HASH ( 2179 ) = 1624 + HASH ( 2180 ) = -2177 + HASH ( 2181 ) = 2146 + HASH ( 2182 ) = 2149 + HASH ( 2183 ) = 1809 + HASH ( 2184 ) = -2181 + HASH ( 2185 ) = 1630 + HASH ( 2186 ) = -2183 + HASH ( 2187 ) = 919 + HASH ( 2189 ) = 1742 + HASH ( 2190 ) = -2187 + HASH ( 2191 ) = 24 + HASH ( 2193 ) = 846 + HASH ( 2194 ) = -2191 + HASH ( 2195 ) = 2002 + HASH ( 2196 ) = -2193 + HASH ( 2197 ) = 923 + HASH ( 2199 ) = 1741 + HASH ( 2200 ) = -2197 + HASH ( 2201 ) = 728 + HASH ( 2202 ) = -2199 + HASH ( 2203 ) = 925 + HASH ( 2205 ) = 1365 + HASH ( 2206 ) = -2203 + HASH ( 2207 ) = 1610 + HASH ( 2208 ) = -2205 + HASH ( 2209 ) = 1500 + HASH ( 2210 ) = 2173 + HASH ( 2211 ) = 1870 + HASH ( 2212 ) = -2209 + HASH ( 2213 ) = 1175 + HASH ( 2214 ) = -2211 + HASH ( 2215 ) = 1751 + HASH ( 2216 ) = 2207 + HASH ( 2217 ) = 1870 + HASH ( 2218 ) = -2215 + HASH ( 2219 ) = 1610 + HASH ( 2220 ) = -2217 + HASH ( 2221 ) = 14 + HASH ( 2223 ) = 2197 + HASH ( 2224 ) = -2221 + HASH ( 2225 ) = 1821 + HASH ( 2226 ) = -2223 + HASH ( 2227 ) = 27 + HASH ( 2229 ) = 1368 + HASH ( 2230 ) = -2227 + HASH ( 2231 ) = 792 + HASH ( 2232 ) = -2229 + HASH ( 2233 ) = 21 + HASH ( 2235 ) = 1173 + HASH ( 2236 ) = -2233 + HASH ( 2237 ) = 1999 + HASH ( 2238 ) = -2235 + HASH ( 2239 ) = 29 + HASH ( 2240 ) = 2179 + HASH ( 2241 ) = 1175 + HASH ( 2242 ) = -2239 + HASH ( 2243 ) = 788 + HASH ( 2244 ) = 2087 + HASH ( 2245 ) = 1610 + HASH ( 2246 ) = -2243 + HASH ( 2247 ) = 1943 + HASH ( 2248 ) = -2245 + HASH ( 2249 ) = 1870 + HASH ( 2250 ) = -2251 + HASH ( 2251 ) = 2141 + HASH ( 2253 ) = 1742 + HASH ( 2254 ) = -2255 + HASH ( 2255 ) = 1806 + HASH ( 2256 ) = -2257 + HASH ( 2257 ) = 29 + HASH ( 2258 ) = 2259 + HASH ( 2259 ) = 1742 + HASH ( 2260 ) = -2261 + HASH ( 2261 ) = 2075 + HASH ( 2262 ) = -2263 + HASH ( 2263 ) = 1181 + HASH ( 2264 ) = -2265 + HASH ( 2265 ) = 14 + HASH ( 2266 ) = 2061 + HASH ( 2267 ) = 906 + HASH ( 2268 ) = -2269 + HASH ( 2269 ) = 20 + HASH ( 2271 ) = 1559 + HASH ( 2272 ) = 2273 + HASH ( 2273 ) = 1051 + HASH ( 2274 ) = -2275 + HASH ( 2275 ) = 1551 + HASH ( 2276 ) = -2277 + HASH ( 2277 ) = 15 + HASH ( 2279 ) = 1432 + HASH ( 2280 ) = -2281 + HASH ( 2281 ) = 1998 + HASH ( 2283 ) = 672 + HASH ( 2285 ) = 1173 + HASH ( 2286 ) = -2287 + HASH ( 2287 ) = 21 + HASH ( 2288 ) = 2125 + HASH ( 2289 ) = 656 + HASH ( 2290 ) = -2291 + HASH ( 2291 ) = 14 + HASH ( 2293 ) = 1098 + HASH ( 2294 ) = -2295 + HASH ( 2295 ) = 1804 + HASH ( 2296 ) = -2297 + HASH ( 2297 ) = 1170 + HASH ( 2299 ) = 1175 + HASH ( 2300 ) = -2301 + HASH ( 2301 ) = 1294 + HASH ( 2302 ) = -2303 + HASH ( 2303 ) = 34 + HASH ( 2304 ) = 2213 + HASH ( 2305 ) = 782 + HASH ( 2306 ) = -2307 + HASH ( 2307 ) = 1755 + HASH ( 2308 ) = -2309 + HASH ( 2309 ) = 1563 + HASH ( 2310 ) = 2053 + HASH ( 2311 ) = 792 + HASH ( 2312 ) = -2313 + HASH ( 2313 ) = 1486 + HASH ( 2314 ) = -2315 + HASH ( 2315 ) = 1755 + HASH ( 2316 ) = -2317 + HASH ( 2317 ) = 1563 + HASH ( 2318 ) = 2231 + HASH ( 2319 ) = 1368 + HASH ( 2320 ) = -2321 + HASH ( 2321 ) = 1038 + HASH ( 2322 ) = -2323 + HASH ( 2323 ) = 1755 + HASH ( 2324 ) = -2325 + HASH ( 2325 ) = 1563 + HASH ( 2327 ) = 1422 + HASH ( 2328 ) = -2329 + HASH ( 2329 ) = 1755 + HASH ( 2330 ) = -2331 + HASH ( 2331 ) = 1563 + HASH ( 2333 ) = 28 + HASH ( 2335 ) = 789 + HASH ( 2336 ) = -2333 + HASH ( 2337 ) = 1358 + HASH ( 2339 ) = 978 + HASH ( 2340 ) = -2337 + HASH ( 2341 ) = 29 + HASH ( 2342 ) = 2185 + HASH ( 2343 ) = 29 + HASH ( 2344 ) = 2155 + HASH ( 2345 ) = 919 + HASH ( 2347 ) = 1561 + HASH ( 2348 ) = -2345 + HASH ( 2349 ) = 1870 + HASH ( 2351 ) = 27 + HASH ( 2352 ) = 2101 + HASH ( 2353 ) = 1610 + HASH ( 2354 ) = -2351 + HASH ( 2355 ) = 908 + HASH ( 2356 ) = -2353 + HASH ( 2357 ) = 929 + HASH ( 2358 ) = -2355 + HASH ( 2359 ) = 28 + HASH ( 2360 ) = 2347 + HASH ( 2361 ) = 1559 + HASH ( 2362 ) = -2359 + HASH ( 2363 ) = 1874 + HASH ( 2364 ) = -2361 + HASH ( 2365 ) = 20 + HASH ( 2366 ) = 2335 + HASH ( 2367 ) = 1548 + HASH ( 2368 ) = -2365 + HASH ( 2369 ) = 789 + HASH ( 2370 ) = -2367 + HASH ( 2371 ) = 925 + HASH ( 2373 ) = 1500 + HASH ( 2374 ) = -2371 + HASH ( 2375 ) = 1738 + HASH ( 2376 ) = -2373 + HASH ( 2377 ) = 27 + HASH ( 2379 ) = 718 + HASH ( 2380 ) = -2377 + HASH ( 2381 ) = 918 + HASH ( 2382 ) = -2379 + HASH ( 2383 ) = 1756 + HASH ( 2385 ) = 1102 + HASH ( 2386 ) = -2383 + HASH ( 2387 ) = 1565 + HASH ( 2388 ) = -2385 + HASH ( 2389 ) = 1870 + HASH ( 2391 ) = 1358 + HASH ( 2392 ) = -2389 + HASH ( 2393 ) = 846 + HASH ( 2394 ) = -2391 + HASH ( 2395 ) = 23 + HASH ( 2397 ) = 34 + HASH ( 2399 ) = 1629 + HASH ( 2400 ) = -2397 + HASH ( 2401 ) = 1757 + HASH ( 2402 ) = 2299 + HASH ( 2403 ) = 1806 + HASH ( 2404 ) = -2401 + HASH ( 2405 ) = 1175 + HASH ( 2406 ) = -2403 + HASH ( 2407 ) = 25 + HASH ( 2408 ) = 2247 + HASH ( 2409 ) = 788 + HASH ( 2410 ) = -2407 + HASH ( 2411 ) = 1368 + HASH ( 2412 ) = -2409 + HASH ( 2413 ) = 1943 + HASH ( 2414 ) = -2411 + HASH ( 2415 ) = 25 + HASH ( 2416 ) = 2319 + HASH ( 2417 ) = 788 + HASH ( 2418 ) = -2415 + HASH ( 2419 ) = 1368 + HASH ( 2420 ) = -2417 + HASH ( 2421 ) = 1945 + HASH ( 2423 ) = 25 + HASH ( 2425 ) = 1884 + HASH ( 2426 ) = -2423 + HASH ( 2427 ) = 23 + HASH ( 2429 ) = 1181 + HASH ( 2430 ) = -2427 + HASH ( 2431 ) = 2058 + HASH ( 2432 ) = -2429 + HASH ( 2433 ) = 667 + HASH ( 2434 ) = 2225 + HASH ( 2435 ) = 1561 + HASH ( 2436 ) = -2433 + HASH ( 2437 ) = 1821 + HASH ( 2438 ) = -2435 + HASH ( 2439 ) = 25 + HASH ( 2440 ) = 2431 + HASH ( 2441 ) = 1181 + HASH ( 2442 ) = -2439 + HASH ( 2443 ) = 2058 + HASH ( 2444 ) = -2441 + HASH ( 2445 ) = 25 + HASH ( 2446 ) = 2437 + HASH ( 2447 ) = 1561 + HASH ( 2448 ) = -2445 + HASH ( 2449 ) = 1821 + HASH ( 2450 ) = -2447 + HASH ( 2451 ) = 25 + HASH ( 2452 ) = 1833 + HASH ( 2453 ) = 1422 + HASH ( 2454 ) = -2451 + HASH ( 2455 ) = 1822 + HASH ( 2456 ) = -2453 + HASH ( 2457 ) = 1742 + HASH ( 2458 ) = -2455 + HASH ( 2459 ) = 20 + HASH ( 2461 ) = 1490 + HASH ( 2462 ) = -2459 + HASH ( 2463 ) = 1568 + HASH ( 2464 ) = -2461 + HASH ( 2465 ) = 924 + HASH ( 2467 ) = 1548 + HASH ( 2468 ) = -2465 + HASH ( 2469 ) = 1627 + HASH ( 2470 ) = -2467 + HASH ( 2471 ) = 27 + HASH ( 2472 ) = 2091 + HASH ( 2473 ) = 984 + HASH ( 2474 ) = -2471 + HASH ( 2475 ) = 1418 + HASH ( 2476 ) = -2473 + HASH ( 2477 ) = 1806 + HASH ( 2478 ) = -2475 + HASH ( 2479 ) = 1943 + HASH ( 2480 ) = 2047 + HASH ( 2481 ) = 859 + HASH ( 2482 ) = -2479 + HASH ( 2483 ) = 919 + HASH ( 2484 ) = -2481 + HASH ( 2485 ) = 27 + HASH ( 2486 ) = 2137 + HASH ( 2487 ) = 28 + HASH ( 2488 ) = 2219 + HASH ( 2489 ) = 930 + HASH ( 2490 ) = -2487 + HASH ( 2491 ) = 1364 + HASH ( 2492 ) = -2489 + HASH ( 2493 ) = 1486 + HASH ( 2494 ) = -2491 + HASH ( 2495 ) = 1167 + HASH ( 2497 ) = 878 + HASH ( 2498 ) = -2495 + HASH ( 2499 ) = 663 + HASH ( 2500 ) = -2497 + HASH ( 2501 ) = 15 + HASH ( 2502 ) = 2499 + HASH ( 2503 ) = 850 + HASH ( 2504 ) = -2501 + HASH ( 2505 ) = 663 + HASH ( 2506 ) = -2503 + HASH ( 2507 ) = 3 + HASH ( 2509 ) = 673 + HASH ( 2510 ) = -2507 + HASH ( 2511 ) = 1174 + HASH ( 2512 ) = -2509 + HASH ( 2513 ) = 673 + HASH ( 2514 ) = 2511 + HASH ( 2515 ) = 1174 + HASH ( 2516 ) = -2513 + HASH ( 2517 ) = 3 + HASH ( 2518 ) = 2515 + HASH ( 2519 ) = 1175 + HASH ( 2520 ) = -2517 + HASH ( 2521 ) = 1174 + HASH ( 2522 ) = -2519 + HASH ( 2523 ) = 1175 + HASH ( 2524 ) = 2521 + HASH ( 2525 ) = 669 + HASH ( 2526 ) = 2457 + HASH ( 2527 ) = 1614 + HASH ( 2528 ) = -2525 + HASH ( 2529 ) = 1742 + HASH ( 2530 ) = -2527 + HASH ( 2531 ) = 1485 + HASH ( 2532 ) = 2529 + HASH ( 2533 ) = 2066 + HASH ( 2534 ) = -2531 + HASH ( 2535 ) = 1742 + HASH ( 2536 ) = -2533 + HASH ( 2537 ) = 14 + HASH ( 2538 ) = 2483 + HASH ( 2539 ) = 1173 + HASH ( 2540 ) = -2537 + HASH ( 2541 ) = 847 + HASH ( 2542 ) = -2539 + HASH ( 2543 ) = 919 + HASH ( 2544 ) = -2541 + HASH ( 2545 ) = 663 + HASH ( 2547 ) = 669 + HASH ( 2548 ) = -2545 + HASH ( 2549 ) = 25 + HASH ( 2550 ) = 2357 + HASH ( 2551 ) = 929 + HASH ( 2552 ) = -2549 + HASH ( 2553 ) = 23 + HASH ( 2555 ) = 1866 + HASH ( 2556 ) = -2553 + HASH ( 2557 ) = 28 + HASH ( 2558 ) = 2311 + HASH ( 2559 ) = 792 + HASH ( 2560 ) = -2557 + HASH ( 2561 ) = 23 + HASH ( 2563 ) = 1810 + HASH ( 2564 ) = -2561 + HASH ( 2565 ) = 1047 + HASH ( 2566 ) = 2563 + HASH ( 2567 ) = 1810 + HASH ( 2568 ) = -2565 + HASH ( 2569 ) = 13 + HASH ( 2570 ) = 2143 + HASH ( 2571 ) = 1563 + HASH ( 2572 ) = -2569 + HASH ( 2573 ) = 27 + HASH ( 2575 ) = 785 + HASH ( 2576 ) = -2573 + HASH ( 2577 ) = 1367 + HASH ( 2579 ) = 920 + HASH ( 2580 ) = -2577 + HASH ( 2581 ) = 13 + HASH ( 2583 ) = 1943 + HASH ( 2584 ) = -2581 + HASH ( 2585 ) = 923 + HASH ( 2586 ) = 2543 + HASH ( 2587 ) = 1874 + HASH ( 2588 ) = -2585 + HASH ( 2589 ) = 919 + HASH ( 2590 ) = -2587 + HASH ( 2591 ) = 1757 + HASH ( 2593 ) = 1422 + HASH ( 2595 ) = 1558 + HASH ( 2596 ) = 2375 + HASH ( 2597 ) = 1485 + HASH ( 2598 ) = -2595 + HASH ( 2599 ) = 1738 + HASH ( 2600 ) = -2597 + HASH ( 2601 ) = 29 + HASH ( 2603 ) = 1103 + HASH ( 2604 ) = -2601 + HASH ( 2605 ) = 1180 + HASH ( 2606 ) = -2603 + HASH ( 2607 ) = 1485 + HASH ( 2609 ) = 27 + HASH ( 2611 ) = 1565 + HASH ( 2612 ) = 2405 + HASH ( 2613 ) = 1175 + HASH ( 2614 ) = -2611 + HASH ( 2615 ) = 28 + HASH ( 2617 ) = 15 + HASH ( 2618 ) = 2579 + HASH ( 2619 ) = 665 + HASH ( 2620 ) = 2131 + HASH ( 2621 ) = 1883 + HASH ( 2622 ) = -2619 + HASH ( 2623 ) = 1365 + HASH ( 2625 ) = 2066 + HASH ( 2626 ) = -2623 + HASH ( 2627 ) = 1821 + HASH ( 2628 ) = -2625 + HASH ( 2629 ) = 1354 + HASH ( 2630 ) = -2627 + HASH ( 2631 ) = 21 + HASH ( 2632 ) = 2629 + HASH ( 2633 ) = 1173 + HASH ( 2634 ) = -2631 + HASH ( 2635 ) = 2976 + HASH ( 2636 ) = -2633 + HASH ( 2637 ) = 1821 + HASH ( 2638 ) = -2635 + HASH ( 2639 ) = 1485 + HASH ( 2641 ) = 14 + HASH ( 2642 ) = 2249 + HASH ( 2643 ) = 669 + HASH ( 2644 ) = -2641 + HASH ( 2645 ) = 1175 + HASH ( 2646 ) = -2643 + HASH ( 2647 ) = 1750 + HASH ( 2648 ) = -2645 + HASH ( 2649 ) = 1934 + HASH ( 2650 ) = 2559 + HASH ( 2651 ) = 1175 + HASH ( 2652 ) = -2649 + HASH ( 2653 ) = 1501 + HASH ( 2654 ) = -2651 + HASH ( 2655 ) = 792 + HASH ( 2656 ) = -2653 + HASH ( 2657 ) = 14 + HASH ( 2658 ) = 2599 + HASH ( 2659 ) = 1180 + HASH ( 2660 ) = -2657 + HASH ( 2661 ) = 661 + HASH ( 2662 ) = 2567 + HASH ( 2663 ) = 1047 + HASH ( 2664 ) = -2661 + HASH ( 2665 ) = 1756 + HASH ( 2666 ) = 2293 + HASH ( 2667 ) = 1358 + HASH ( 2668 ) = -2665 + HASH ( 2669 ) = 1485 + HASH ( 2670 ) = -2667 + HASH ( 2671 ) = 23 + HASH ( 2673 ) = 917 + HASH ( 2674 ) = -2671 + HASH ( 2675 ) = 1181 + HASH ( 2676 ) = -2673 + HASH ( 2677 ) = 2075 + HASH ( 2678 ) = -2675 + HASH ( 2679 ) = 14 + HASH ( 2680 ) = 2677 + HASH ( 2681 ) = 1181 + HASH ( 2682 ) = -2679 + HASH ( 2683 ) = 14 + HASH ( 2685 ) = 1173 + HASH ( 2686 ) = -2683 + HASH ( 2687 ) = 2065 + HASH ( 2688 ) = -2685 + HASH ( 2689 ) = 919 + HASH ( 2690 ) = 2687 + HASH ( 2691 ) = 1181 + HASH ( 2692 ) = 2443 + HASH ( 2693 ) = 21 + HASH ( 2694 ) = 2195 + HASH ( 2695 ) = 1930 + HASH ( 2696 ) = -2693 + HASH ( 2697 ) = 1757 + HASH ( 2698 ) = -2695 + HASH ( 2699 ) = 27 + HASH ( 2701 ) = 27 + HASH ( 2702 ) = 2419 + HASH ( 2703 ) = 2062 + HASH ( 2704 ) = -2701 + HASH ( 2705 ) = 1368 + HASH ( 2706 ) = -2703 + HASH ( 2707 ) = 27 + HASH ( 2708 ) = 2421 + HASH ( 2709 ) = 1614 + HASH ( 2710 ) = -2707 + HASH ( 2711 ) = 788 + HASH ( 2712 ) = 2413 + HASH ( 2713 ) = 1368 + HASH ( 2714 ) = -2711 + HASH ( 2715 ) = 1943 + HASH ( 2716 ) = -2713 + HASH ( 2717 ) = 1181 + HASH ( 2718 ) = 2715 + HASH ( 2719 ) = 1614 + HASH ( 2720 ) = 1995 + HASH ( 2721 ) = 1934 + HASH ( 2722 ) = 2621 + HASH ( 2723 ) = 1180 + HASH ( 2725 ) = 1873 + HASH ( 2726 ) = -2723 + HASH ( 2727 ) = 919 + HASH ( 2728 ) = 2725 + HASH ( 2729 ) = 23 + HASH ( 2730 ) = 2555 + HASH ( 2731 ) = 1294 + HASH ( 2732 ) = -2729 + HASH ( 2733 ) = 1488 + HASH ( 2734 ) = 2447 + HASH ( 2735 ) = 1746 + HASH ( 2736 ) = -2733 + HASH ( 2737 ) = 1821 + HASH ( 2738 ) = -2735 + HASH ( 2739 ) = 1561 + HASH ( 2740 ) = 2737 + HASH ( 2741 ) = 1821 + HASH ( 2742 ) = -2739 + HASH ( 2743 ) = 921 + HASH ( 2744 ) = 2741 + HASH ( 2745 ) = 14 + HASH ( 2746 ) = 2477 + HASH ( 2747 ) = 1563 + HASH ( 2748 ) = -2745 + HASH ( 2749 ) = 1617 + HASH ( 2750 ) = -2747 + HASH ( 2751 ) = 1418 + HASH ( 2752 ) = -2749 + HASH ( 2753 ) = 1751 + HASH ( 2754 ) = 2535 + HASH ( 2755 ) = 1886 + HASH ( 2756 ) = -2753 + HASH ( 2757 ) = 1742 + HASH ( 2758 ) = -2755 + HASH ( 2759 ) = 1422 + HASH ( 2760 ) = 2757 + HASH ( 2761 ) = 1822 + HASH ( 2762 ) = -2759 + HASH ( 2763 ) = 1742 + HASH ( 2764 ) = -2761 + HASH ( 2765 ) = 1373 + HASH ( 2766 ) = 2763 + HASH ( 2767 ) = 1822 + HASH ( 2768 ) = -2765 + HASH ( 2769 ) = 1742 + HASH ( 2770 ) = -2767 + HASH ( 2771 ) = 661 + HASH ( 2772 ) = 2769 + HASH ( 2773 ) = 1742 + HASH ( 2774 ) = -2771 + HASH ( 2775 ) = 653 + HASH ( 2776 ) = 2773 + HASH ( 2777 ) = 10 + HASH ( 2778 ) = 2033 + HASH ( 2779 ) = 28 + HASH ( 2780 ) = 2469 + HASH ( 2781 ) = 924 + HASH ( 2782 ) = -2779 + HASH ( 2783 ) = 1548 + HASH ( 2784 ) = -2781 + HASH ( 2785 ) = 1627 + HASH ( 2786 ) = -2783 + HASH ( 2787 ) = 14 + HASH ( 2788 ) = 2785 + HASH ( 2789 ) = 1947 + HASH ( 2790 ) = -2787 + HASH ( 2791 ) = 909 + HASH ( 2792 ) = -2789 + HASH ( 2793 ) = 1548 + HASH ( 2794 ) = -2791 + HASH ( 2795 ) = 1627 + HASH ( 2796 ) = -2793 + HASH ( 2797 ) = 911 + HASH ( 2798 ) = 2795 + HASH ( 2799 ) = 15 + HASH ( 2800 ) = 2571 + HASH ( 2801 ) = 2962 + HASH ( 2802 ) = -2799 + HASH ( 2803 ) = 1563 + HASH ( 2804 ) = -2801 + HASH ( 2805 ) = 1949 + HASH ( 2806 ) = 2113 + HASH ( 2807 ) = 1881 + HASH ( 2808 ) = -2805 + HASH ( 2809 ) = 14 + HASH ( 2810 ) = 2387 + HASH ( 2811 ) = 1180 + HASH ( 2812 ) = -2809 + HASH ( 2813 ) = 1760 + HASH ( 2814 ) = -2811 + HASH ( 2815 ) = 1102 + HASH ( 2816 ) = -2813 + HASH ( 2817 ) = 1167 + HASH ( 2818 ) = 2803 + HASH ( 2819 ) = 1563 + HASH ( 2820 ) = -2817 + HASH ( 2821 ) = 29 + HASH ( 2822 ) = 2029 + HASH ( 2823 ) = 1496 + HASH ( 2824 ) = -2821 + HASH ( 2825 ) = 1486 + HASH ( 2826 ) = 2823 + HASH ( 2827 ) = 32 + HASH ( 2829 ) = 13 + HASH ( 2830 ) = 2279 + HASH ( 2831 ) = 1175 + HASH ( 2833 ) = 788 + HASH ( 2834 ) = 2705 + HASH ( 2835 ) = 1365 + HASH ( 2837 ) = 29 + HASH ( 2838 ) = 2613 + HASH ( 2839 ) = 1566 + HASH ( 2840 ) = -2837 + HASH ( 2841 ) = 1175 + HASH ( 2842 ) = -2839 + HASH ( 2843 ) = 27 + HASH ( 2844 ) = 2841 + HASH ( 2845 ) = 1038 + HASH ( 2846 ) = -2843 + HASH ( 2847 ) = 1870 + HASH ( 2848 ) = -2845 + HASH ( 2849 ) = 1175 + HASH ( 2850 ) = -2847 + HASH ( 2851 ) = 29 + HASH ( 2852 ) = 2849 + HASH ( 2853 ) = 1630 + HASH ( 2854 ) = -2851 + HASH ( 2855 ) = 1175 + HASH ( 2856 ) = -2853 + HASH ( 2857 ) = 27 + HASH ( 2858 ) = 2855 + HASH ( 2859 ) = 1486 + HASH ( 2860 ) = -2857 + HASH ( 2861 ) = 1175 + HASH ( 2862 ) = -2859 + HASH ( 2863 ) = 919 + HASH ( 2865 ) = 845 + HASH ( 2866 ) = -2863 + HASH ( 2867 ) = 1559 + HASH ( 2868 ) = 2237 + HASH ( 2869 ) = 1874 + HASH ( 2870 ) = -2867 + HASH ( 2871 ) = 1484 + HASH ( 2872 ) = -2869 + HASH ( 2873 ) = 27 + HASH ( 2875 ) = 14 + HASH ( 2877 ) = 1372 + HASH ( 2878 ) = -2875 + HASH ( 2879 ) = 661 + HASH ( 2880 ) = 2551 + HASH ( 2881 ) = 1751 + HASH ( 2882 ) = -2879 + HASH ( 2883 ) = 1870 + HASH ( 2884 ) = -2881 + HASH ( 2885 ) = 929 + HASH ( 2886 ) = -2883 + HASH ( 2887 ) = 1181 + HASH ( 2888 ) = 2885 + HASH ( 2889 ) = 652 + HASH ( 2891 ) = 13 + HASH ( 2892 ) = 2589 + HASH ( 2893 ) = 1806 + HASH ( 2895 ) = 1880 + HASH ( 2897 ) = 2071 + HASH ( 2898 ) = -2895 + HASH ( 2899 ) = 856 + HASH ( 2900 ) = -2897 + HASH ( 2901 ) = 31 + HASH ( 2902 ) = 2097 + HASH ( 2903 ) = 850 + HASH ( 2904 ) = -2901 + HASH ( 2905 ) = 22 + HASH ( 2906 ) = 2903 + HASH ( 2907 ) = 785 + HASH ( 2908 ) = 2393 + HASH ( 2909 ) = 1866 + HASH ( 2910 ) = -2907 + HASH ( 2911 ) = 14 + HASH ( 2912 ) = 2655 + HASH ( 2913 ) = 1175 + HASH ( 2914 ) = -2911 + HASH ( 2915 ) = 1949 + HASH ( 2916 ) = -2913 + HASH ( 2917 ) = 1752 + HASH ( 2918 ) = -2915 + HASH ( 2919 ) = 792 + HASH ( 2920 ) = -2917 + HASH ( 2921 ) = 1634 + HASH ( 2922 ) = 2919 + HASH ( 2923 ) = 792 + HASH ( 2924 ) = -2921 + HASH ( 2925 ) = 29 + HASH ( 2926 ) = 2923 + HASH ( 2927 ) = 1500 + HASH ( 2928 ) = -2925 + HASH ( 2929 ) = 667 + HASH ( 2930 ) = 2575 + HASH ( 2931 ) = 785 + HASH ( 2932 ) = -2929 + HASH ( 2933 ) = 14 + HASH ( 2934 ) = 2369 + HASH ( 2935 ) = 1564 + HASH ( 2936 ) = -2933 + HASH ( 2937 ) = 789 + HASH ( 2938 ) = -2935 + HASH ( 2939 ) = 28 + HASH ( 2940 ) = 2937 + HASH ( 2941 ) = 668 + HASH ( 2942 ) = -2939 + HASH ( 2943 ) = 27 + HASH ( 2944 ) = 2931 + HASH ( 2945 ) = 1870 + HASH ( 2946 ) = -2943 + HASH ( 2947 ) = 652 + HASH ( 2948 ) = -2945 + HASH ( 2949 ) = 667 + HASH ( 2950 ) = -2947 + HASH ( 2951 ) = 1806 + HASH ( 2953 ) = 778 + HASH ( 2954 ) = -2951 + HASH ( 2955 ) = 1365 + HASH ( 2956 ) = 2953 + HASH ( 2957 ) = 1557 + HASH ( 2958 ) = 2201 + HASH ( 2959 ) = 728 + HASH ( 2960 ) = -2957 + HASH ( 2961 ) = 23 + HASH ( 2962 ) = 2959 + HASH ( 2963 ) = 906 + HASH ( 2964 ) = -2961 + HASH ( 2965 ) = 1557 + HASH ( 2966 ) = -2963 + HASH ( 2967 ) = 20 + HASH ( 2969 ) = 1548 + HASH ( 2970 ) = -2967 + HASH ( 2971 ) = 23 + HASH ( 2973 ) = 1042 + HASH ( 2974 ) = -2971 + HASH ( 2975 ) = 1551 + HASH ( 2977 ) = 2222 + HASH ( 2978 ) = -2975 + HASH ( 2979 ) = 1738 + HASH ( 2980 ) = -2977 + HASH ( 2981 ) = 667 + HASH ( 2982 ) = -2979 + HASH ( 2983 ) = 785 + HASH ( 2984 ) = 2547 + HASH ( 2985 ) = 1866 + HASH ( 2986 ) = -2983 + HASH ( 2987 ) = 15 + HASH ( 2988 ) = 2981 + HASH ( 2989 ) = 2200 + HASH ( 2990 ) = -2987 + HASH ( 2991 ) = 1738 + HASH ( 2992 ) = -2989 + HASH ( 2993 ) = 667 + HASH ( 2994 ) = -2991 + HASH ( 2995 ) = 34 + HASH ( 2996 ) = 2993 + HASH ( 2997 ) = 1738 + HASH ( 2998 ) = -2995 + HASH ( 2999 ) = 13 + HASH ( 3000 ) = 2505 + + return + end + + + INTEGER*2 FUNCTION SEARCH(K,name,hash,nlast) + IMPLICIT INTEGER*2 (A-Z) + dimension hash(8000), name(10) + + m = 1009 + NAME1=NAME(1) + I=MOD(NAME1,M) + I=I*2+1 + IF (HASH(I).NE.0) GOTO 3 + SEARCH=I + HASH(I)=NAME1 + GOTO 11 +1 IF (I.NE.0) GOTO 3 +2 NLAST=NLAST-2 + IF (NLAST.LT.0) write(*,99) + 99 format(' przepelnienie') + IF (HASH(NLAST).NE.0) GOTO 2 + SEARCH=NLAST + HASH(NLAST)=NAME(1) + HASH(J+1)=NLAST + I=NLAST + GOTO 11 +3 IF (HASH(I).EQ.NAME1) GOTO 4 + J=I + I=HASH(J+1) + GOTO 10 +4 IF ((K.NE.1).OR.(HASH(I+1).LT.0)) GOTO 5 + SEARCH=I + RETURN +5 J=I + P=1 +6 T=HASH(J+1) + P=P+1 + IF (P.LE.K) GOTO 8 + IF (T.LT.0) GOTO 7 + SEARCH=I + RETURN +7 J=-T + I=HASH(J+1) + GOTO 10 +8 IF (T.LT.0) GOTO 9 + I=T + GOTO 1 +9 J=-T + IF (NAME(P).EQ.HASH(J)) GOTO 6 + I=HASH(J+1) +10 IF (I.GE.0) GOTO 1 + J=-I + I=HASH(J+1) + GOTO 10 +11 P=2 +12 IF (P.GT.K) RETURN +13 NLAST=NLAST-2 + IF (NLAST.LT.0) write(*,99) + IF (HASH(NLAST).NE.0) GOTO 13 + HASH(NLAST)=NAME(P) + HASH(I+1)=-NLAST + I=NLAST + P=P+1 + GOTO 12 + END diff --git a/sources/pass1/option.h b/sources/pass1/option.h new file mode 100644 index 0000000..b2acc22 --- /dev/null +++ b/sources/pass1/option.h @@ -0,0 +1,3 @@ +C + COMMON/OPTION/OPTMEM,OPTOPT,OPTIND,OPTTYP,OPTTRC,OPTCSC,OPTCSF + LOGICAL OPTOPT,OPTTYP,OPTTRC diff --git a/sources/pass1/resume.f b/sources/pass1/resume.f new file mode 100644 index 0000000..58e7216 --- /dev/null +++ b/sources/pass1/resume.f @@ -0,0 +1,131 @@ +C Loglan82 Compiler&Interpreter +C Copyright (C) 1981-1993 Institute of Informatics, University of Warsaw +C Copyright (C) 1993, 1994 LITA, Pau +C +C This program is free software; you can redistribute it and/or modify +C it under the terms of the GNU General Public License as published by +C the Free Software Foundation; either version 2 of the License, or +C (at your option) any later version. +C +C This program is distributed in the hope that it will be useful, +C but WITHOUT ANY WARRANTY; without even the implied warranty of +C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +C GNU General Public License for more details. File: LICENSE.GNU +C =============================================================== + +CBC B.Ciesielski added concurrent statements +CBC 1987.04.15 1. RESUME same as ATTACH, opcode 220 +CBC 1987.04.24 2. added missing STORAGE:2 metacommand +CBC 1987.11.18 3. added procedure SCONC +C + SUBROUTINE SRESUM +C------------------------------------------------------ +C +C NA CZUBKU JEST ARGUMENT RESUME. BADA TYP,GENERUJE KOD, +C ZDEJMUJE ZE STOSU. +C +C ##### OUTPUT CODE : 220 . +C +C ##### DETECTED ERROR(S) : 477 +C +C............. /STOS/ ..... + IMPLICIT INTEGER (A-Z) + COMMON /STOS/ BOTTOM,VALTOP,VLPREV,STCKAG,STCKA0,STCKAP(14), + X APETYT(4),LSTLSE,LSTFOR,KIND,PHADR,LASTPR,FSTOUT, + X CONSNR(8),LSTSAF,LSTEMP,TEMPNR,LSTWRD,QRECNR,WB, + X RESULT,FRSTTS,UNIT,INNER,LSTWILL,TEST,ARG,ATLINE, + X FILE,FLARGS,FLMODF,FLREADY,ICOUNT,OCOUNT + LOGICAL LSTWILL,FLREADY,TEST +C + COMMON/OPTION/OPTMEM,OPTOPT,OPTIND,OPTTYP,OPTTRC,OPTCSC,OPTCSF + LOGICAL OPTOPT,OPTTYP,OPTTRC +C + LOGICAL INSYS, OWN + COMMON /BLANK/ IOP(4), + X P, + X TLDIM, TLBAS, IDL, OBJL, + X TRDIM, TRBAS, IDR, OBJR, + X TRESLT, + X CONVL, CONVR, + X NRPAR, + X IX (261), + X LMEM , LPMEM , IRECN , ISFIN , LPMSYS, LPML , LPMF , + X NRINT , NRRE , NRBOOL, NRCHR , NRCOR , NRPROC, NRTEXT, + X NRUNIV, NATTR , NRNONE, NBLSYS, NBLUS , NEMPTY, INSYS , + X LOCAL, OWN, OBJECT, + X IPMEM(5000) + REAL STALER(100) + INTEGER STACK(5000) + EQUIVALENCE(STALER(1),IPMEM(1) ) + EQUIVALENCE(STACK(1),IPMEM(1)) +C +C + INTEGER ELEM +C......... + CALL SVALUE + IF(STACK(VALTOP).EQ.0)RETURN + IF(STACK(VALTOP-3).GT.0)GO TO 500 + ELEM=STACK(VALTOP-4) + ELEM=IAND(IPMEM(ELEM),15) + IF(ELEM.GT.7 .AND. ELEM.LT.13 .OR. ELEM.EQ.2)GO TO 500 + ELEM=STACK(VALTOP-2) +C RESUME( NONE ) ? + IF(STACK(VALTOP).EQ.1)ELEM=LMEM-3 +C = ATS NONE + CALL QUADR2(220,ELEM) + RETURN +C NIEPOPRAWNY TYP ARGUMENTU RESUME + 500 CALL SERROR(477) + RETURN + END + + subroutine sconc(action) + IMPLICIT INTEGER (A-Z) + COMMON /STOS/ BOTTOM,VALTOP,VLPREV,STCKAG,STCKA0,STCKAP(14), + X APETYT(4),LSTLSE,LSTFOR,KIND,PHADR,LASTPR,FSTOUT, + X CONSNR(8),LSTSAF,LSTEMP,TEMPNR,LSTWRD,QRECNR,WB, + X RESULT,FRSTTS,UNIT,INNER,LSTWILL,TEST,ARG,ATLINE, + X FILE,FLARGS,FLMODF,FLREADY,ICOUNT,OCOUNT + LOGICAL LSTWILL,FLREADY,TEST +C + LOGICAL INSYS, OWN + COMMON /BLANK/ IOP(4), + X P, + X TLDIM, TLBAS, IDL, OBJL, + X TRDIM, TRBAS, IDR, OBJR, + X TRESLT, + X CONVL, CONVR, + X NRPAR, + X IX (261), + X LMEM , LPMEM , IRECN , ISFIN , LPMSYS, LPML , LPMF , + X NRINT , NRRE , NRBOOL, NRCHR , NRCOR , NRPROC, NRTEXT, + X NRUNIV, NATTR , NRNONE, NBLSYS, NBLUS , NEMPTY, INSYS , + X LOCAL, OWN, OBJECT, + X IPMEM(5000) + REAL STALER(100) + INTEGER STACK(5000) + EQUIVALENCE(STALER(1),IPMEM(1) ) + EQUIVALENCE(STACK(1),IPMEM(1)) +c +c generate proper opcode + call quadr1(action) +c process next identifier +100 call snext + if (wb .ne. 28) goto 200 + call snext +c check if procedure or function + ind = mident(wb) + elem = swhat(ind) + if (elem .ne. 11 .and. elem .ne. 12) goto 110 +c output prototype address + call quadr1(ind) + goto 100 +110 call serror(478) + goto 100 +c end of identifier list +200 call quadr1(0) +c generate ACCEPT2 if necessary + if (action .eq. 225) call quadr1(226) + return + end + diff --git a/sources/pass1/rm.bat b/sources/pass1/rm.bat new file mode 100644 index 0000000..25b506f --- /dev/null +++ b/sources/pass1/rm.bat @@ -0,0 +1,9 @@ +@echo off +:begin +if "%1" == "" goto :end +echo %1 +del %1 +shift +goto :begin +:end + diff --git a/sources/pass1/scan.ff b/sources/pass1/scan.ff new file mode 100644 index 0000000..07b91fb --- /dev/null +++ b/sources/pass1/scan.ff @@ -0,0 +1,915 @@ +C Loglan82 Compiler&Interpreter +C Copyright (C) 1981-1993 Institute of Informatics, University of Warsaw +C Copyright (C) 1993, 1994 LITA, Pau +C +C This program is free software; you can redistribute it and/or modify +C it under the terms of the GNU General Public License as published by +C the Free Software Foundation; either version 2 of the License, or +C (at your option) any later version. +C +C This program is distributed in the hope that it will be useful, +C but WITHOUT ANY WARRANTY; without even the implied warranty of +C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +C GNU General Public License for more details. File: LICENSE.GNU +C =============================================================== + + SUBROUTINE SCAN + IMPLICIT INTEGER (A-Z) + COMMON /BUFF/ INSTR(265),BUFOR(85),LP,LN,MAX,JNK(266) + COMMON /STREAM/ ERRFLG,LINE,IBUF2(265),IBUF3(7),ON,JUNK(259) + COMMON /BLANK/ + $ C0M(4), + O S, ADRES, K, SCOMA, SDOT, SEMICOL, + 1 SCOLON, SLEFT, SRIGHT, SBECOME, STAR, SRELAT, + 2 SEOF, SIDENT, SCONST, SAND, SARRAY, SARROF, + 3 SATTACH, SBEGIN, SBLOCK, SBOOL, SCALL, SCASE, + 4 SCLASS, SCLOSE, SCONS, SCOPY, SCOROUT, SDETACH, + 5 SDIM, SDO, SDOWN, SELSE, SEND, SESAC, + 6 SEXIT, SEXTERN, SFI, SFOR, SFUNCT, SIF, + 7 SINNER, SINPUT, SINT, SKILL, SLOCK, SNEW, + 8 SNONE, SNOT, SOD, SOR, SORIF, SOTHER, + 9 SOUTPUT, SPREF, SPRCD, SQUA, SREAD, SRESUME, + O SRETURN, STEP, STOP, STAKEN, STHEN, STHIS, + A STO, STYPE, SUNIT, SVAR, SVIRTUAL, SWAIT, + B SWHEN, SWHILE, SWRIT, SWRITLN, STRUE, SALL, + C WAND, WARRAY, WASSIGN, WASSCON, WATTACH, WBLOCK, + D WCALL, WCASE, WCASEL, WCOMA, WCNSTB, WCNSTC, + E WCNSTI, WCNSTN, WCNSTR, WCNST, WCOPY, WDETACH, + F WDOT, WDOWNTO, WEOF, WESAC, WFIN, WFIRST, + G WFOREND, WFORVAR, WFROM, WIDENT, WIFFALS, WIFTRUE + + common /BLANK/ + H WINNER, WINSTREND,WJUMP, WKILL, WLABEL, WLEFT, + I WLOCK, WLOW, WLSE, WNEW, WNEWARRAY,WNOT, + J WOPERAT, WOPT, WOR, WOTHER, WPREF, WPRIM, + K WQUA, WREAD, WRELAT, WRESUME, WRETURN, WRIGHT, + L WSTART, WSTEP, WSTOP, WTHIS, WTO, WAIT, + M WRITE, WRITELN, WBOUND, UNICAL, + N COM(132), + O LMEM, LPMEM, IRECN, ISFIN, LPMSYS, LPML, + P LPMF, NRINT, NRRE, NRBOOL, NRCHAR, NRCOR, + Q NRPROC, NRTEXT, NRUNIV, NATTR, NRNONE, NBLSYS, + R NBLUS, NEMPTY, INSYS, LOCAL, OWN, OBJECT, + S HASH(8000), M, NAME(10), NLAST, NL, + T KEYS(200), + U TRANS1(13,13), TRANS2(13,13), B0, B(70), + V SKOK0, SKOK(70), KK, MM, STAN, STAN1, + W AUX, K1, SY, SY1, NU, JK1, EXP, + X SIGN, INTPART, FRAC, OKEY, FRACT,JK2,NB, + Y TL, BYTE, TEXT(20), + Z TOP, IN, NEXT, STACK(500) + + common /BLANK/ + * RESZTA(3652) + + REAL FRACT,NU +cdsw&bc + logical overfl + LOGICAL OK,OKEY + INTEGER SD,SE,SL,SR,SS,ST + data sd,se,sl,sr,ss,st /2,61,40,41,47,42/ + DATA SCANHEX /x'7FFF'/ +C + overfl = .FALSE. + OK=.FALSE. + IF (.NOT.OKEY) GOTO 111 + K=K1 + IF (SY.EQ.70) GOTO 3001 +C INSERTED DUE TO T.SZCZEPANEK + SY=SY1 + OKEY=.FALSE. + GOTO 2000 +101 CALL ERROR(111) + LP=LP+1 +111 IF (LP.LT.MAX) GOTO 1 + CALL READIN +1 IF (BUFOR(1).EQ.SD) GOTO 3001 + Z=BUFOR(LP) + ZNAK=ORD(Z) +C ZNAK MEANS CHARACTER + IF (STAN.LT.10) GOTO 10 +C WITHIN COMMENT - COMPOUND SYMBOLS ARE NOT PICKED UP +C THE SAME FOR TEXT AND CHARACTER CONSTANTS + IF (STAN.EQ.11) GOTO 11 + GOTO 8 +10 IF (ZNAK.EQ.63) GOTO 101 +11 I=SKOK(ZNAK) + GOTO (2,3,4,5,6,8),I +2 IF (BUFOR(LP+1).NE.SE) GOTO 8 + GOTO 7 +3 IF (BUFOR(LP+1).NE.SR) GOTO 8 + GOTO 7 +4 IF (BUFOR(LP+1).NE.SS) GOTO 8 + IF (BUFOR(LP+2).NE.SE) GOTO 8 + LP=LP+1 + GOTO 7 +C --- ALLOW FOR "<>" TO STAND FOR "NON EQUAL" +5 IF (ZNAK.NE.50) GO TO 5055 + IF (BUFOR(LP+1) .NE. ICHAR('>')) GO TO 5055 + ZNAK = 49 + GO TO 7 +C --- +5055 IF (BUFOR(LP+1).NE.SE) GOTO 8 + GOTO 7 +6 IF (BUFOR(LP+1).NE.ST) GOTO 8 +C BEGINNING OF COMMENT HAS BEEN RECOGNIZED '(*'. CHECK FOR A LISTING +C CONTROL OPTION FOLLOWING THE COMMENT ANNOUNCEMENT. IF ONE OCCURRS +C THEN THE LISTING CONTROL VARIABLE IS TO BE SET PROPERLY + IF (BUFOR(LP+2).NE.ICHAR('$')) GOTO 7 + LP=LP+3 + CALL OPTSET +7 LP=LP+1 + ZNAK=ZNAK+7 +8 LP=LP+1 +C END OF DETECTING COMPOUND SYMBOLS +C THE AUTOMATON - PART I + J=B(ZNAK)+1 + I=TRANS1(J,STAN+1) + GOTO (190,20,30,40,50,60,70,80,90,100,110,120,130,140,150,160,170, + ,180),I +20 SY=SEARCH(MM) + K=0 + KLUCZ=KEY(SY) + IF (KLUCZ.EQ.(SIDENT*8)) K=2 + K=K/2 + OK=.TRUE. + GOTO 190 +30 IF (KK.LT.NB) GOTO 31 + IF (MM.LT.TL) GOTO 32 + CALL ERROR(212) + GOTO 190 +31 KK=KK+1 +cbc COM(MM)=ISHFT(COM(MM),8)+Z + com(mm)=ior(ishft(z, 8), com(mm)) +cbc + GOTO 190 +32 KK=1 + MM=MM+1 + com(MM)=Z + GOTO 190 +40 IF (KK.LT.NB) GOTO 41 + IF (MM.LT.NL) GOTO 42 + CALL ERROR(211) + GOTO 190 +41 KK=KK+1 + NAME(MM)=NAME(MM)*BYTE+ZNAK + GOTO 190 +42 KK=1 + MM=MM+1 + NAME(MM)=ZNAK + IF (ZNAK.EQ.0) NAME(MM)=60 + GOTO 190 +50 K=2 +cdsw&bc IF (INTPART.LT.0) GOTO 52 + if (overfl) goto 52 + SY=INTPART + GOTO 53 +52 SY=SCANHEX + CALL ERROR(205) +53 INTPART=0 + OK=.TRUE. + GOTO 190 +70 CALL ERROR(201) +60 IF (SIGN.EQ.1) EXP=-EXP + EXP=EXP-FRAC +cdsw&bc IF (INTPART.LT.0) GOTO 191 + if (overfl) goto 191 + FRACT=INTPART + GOTO 192 +191 FRACT=NU +192 IF (EXP) 200,210,193 +193 DO 195 J=1,EXP +CJF IF (FRACT.GT.0.7237005E75) GOTO 207 +195 FRACT=FRACT*10.0 + GOTO 210 +CJF 207 CALL ERROR(206) +CJF GOTO 210 +200 EXP=-EXP + DO 205 J=1,EXP +CJF IF (FRACT.GT.0.AND.FRACT.LT.0.5397605E-77) GOTO 207 +205 FRACT=FRACT*0.1 +210 K=4 + NU=FRACT + OK=.TRUE. + SIGN=0 + EXP=0 + INTPART=0 + FRAC=0 + GOTO 190 +80 K=6 + SY=38 + OK=.TRUE. + GOTO 190 +90 INTPART=ZNAK + GOTO 190 +110 FRAC=0 +130 FRAC=FRAC+1 +cdsw&bc 100 IF (INTPART.LT.0) GOTO 102 +100 if (overfl) goto 102 + NU=INTPART +cdsw&bc check for overflow +#if ( WSIZE == 4 ) +cailvaxC max. integer on VAX is 2147483647 + if ( (intpart .gt. 214748364) .or. ((intpart .eq. 214748364) + C .and. (znak .gt. 7)) ) overfl = .TRUE. + if (overfl) goto 102 +#else + if (intpart .gt. 3275) overfl = .TRUE. +#endif + INTPART=INTPART*10+ZNAK +cdsw&bc IF (INTPART.GE.0) GOTO 190 +#if ( WSIZE == 4 ) +cailvaxC overfl is .FALSE. here + goto 190 +#else + if (.not. overfl) goto 190 +#endif +102 NU=NU*10.0+ZNAK + GOTO 190 +120 EXP=ZNAK + GOTO 190 +140 EXP=EXP*10+ZNAK + GOTO 190 +150 SIGN=1 + GOTO 190 +160 STAN1=STAN + GOTO 190 +170 CALL ERROR(202) + GOTO 190 +180 IF (EXP.LT.0) GOTO 181 + IF (ZNAK.EQ.44) GOTO 190 + ZNAK=36 + STAN=0 +cdsw&bc + exp = 0 +c + CALL ERROR(203) + GOTO 190 +181 EXP=Z + ZNAK=0 +190 CONTINUE +C THE AUTOMATON - PART II +1000 J=B(ZNAK)+1 + I=TRANS2(J,STAN+1) + GOTO (1300,1020,1030,1040,1050,1060,1070,1080,1090,1100,1110,1120, + ,1130,1140,1150,1160,1170,1180,1190,1200,1210),I +1020 STAN=0 + GOTO 1300 +1030 KK=1 + MM=1 + NAME(1)=ZNAK + STAN=1 + GOTO 1300 +1040 KK=2 + MM=1 + NAME(1)=14*BYTE+ZNAK + STAN=1 + GOTO 1300 +1050 STAN=2 + GOTO 1300 +1060 STAN=5 + GOTO 1300 +1070 STAN=9 + GOTO 1300 +1080 STAN=8 + GOTO 1300 +1090 STAN=3 + GOTO 1300 +1100 SY=ZNAK + GOTO 2070 +1110 STAN=4 + GOTO 1300 +1120 CALL ERROR(204) +1130 STAN=6 + GOTO 1300 +1140 IF (OK) GOTO 1145 + STAN=0 + SY=ZNAK + GOTO 2070 +1145 K1=6 + SY1=ZNAK + STAN=0 + OKEY=.TRUE. + GOTO 1300 +1150 STAN=7 + GOTO 1300 +1160 KK=2 + MM=1 +cdsw&bc + com(2) = 0 +c + STAN=10 + GOTO 1300 +1170 STAN=0 + K=4 + S=SCONST + CALL TINSER + GOTO 3000 +1180 STAN=11 + GOTO 1300 +1190 STAN=STAN1 + GOTO 1300 +1200 STAN=12 + EXP=-1 + GOTO 1300 +1210 K=6 + STAN=0 + S=SCONST + ADRES=EXP + EXP=0 + GOTO 3000 +1300 CONTINUE +C END OF THE SECOND PHASE + IF (.NOT.OK) GOTO 111 +2000 K=K+1 + GOTO (2010,2020,2030,2040,2050,2060,2070),K +2010 K=KLUCZ + S=K/8 + ADRES=1+MOD(K,8) + K=SY + GOTO 3000 +2020 S=SIDENT + ADRES=SY + GOTO 3000 +2030 S=SCONST +C INTEGER CONSTANT RECOGNIZED + ADRES=SY +cdsw + sy = 0 + GOTO 3000 +2040 S=SCONST + CALL TINSER + GOTO 3000 +2050 S=SCONST + ADRES=EMBEDE(NU) + GOTO 3000 +2060 S=SCONST + ADRES=EXP + GOTO 3000 +2070 K=SY-37 + GOTO (2150,2102,2103,2104,2150,2150,2150,2150,2150,2150,2105,2106, + ,2107,2108,2150,2150,2150,2150,2109,2110,2111),K +2102 S=STAR + ADRES=3 + GOTO 3000 +2103 S=STAR + ADRES=4 + GOTO 3000 +2104 S=STAR + ADRES=6 + GOTO 3000 +2105 S=STAR + ADRES=5 + GOTO 3000 +2106 S=SRELAT + ADRES=3 + GOTO 3000 +2107 S=SRELAT + ADRES=5 + GOTO 3000 +2108 S=SRELAT + ADRES=7 + GOTO 3000 +2109 S=SRELAT + ADRES=4 + GOTO 3000 +2110 S=SRELAT + ADRES=6 + GOTO 3000 +2111 S=SRELAT + ADRES=8 + GOTO 3000 +2150 S=SY +3000 CONTINUE + RETURN +3001 K=6 + S=70 + OKEY=.TRUE. + SY1=70 +C THE LAST TWO STATEMENT ARE INSERTED DUE TO T.SZCZEPANEK + RETURN + END + + SUBROUTINE READIN + IMPLICIT INTEGER (A-Z) + COMMON /BUFF/ INSTR(265),BUFOR(85),LP,LN,MAX,POSTR(265),STATUS +C +C POSTR - BUFFER FOR AUXILIARY INPUT FILE +C VARIABLE STATUS DESCRIBES THE STATUS OF INPUT: +C 1 - SOURCE TEXT IS READ FROM THE AUXILIARY INPUT +C 0 - SOURCE TEXT IS READ FROM THE STANDARD INPUT +C -1 - SOURCE TEXT HAS BEEN READ UNTIL THE LAST END. NOW THE STANDARD +C INPUT IS BEING SKIPPED UNTIL EOF +C + COMMON /LISTING/ OUTSTR(265) + COMMON /STREAM/ ERRFLG,LINE,IBUF2(265),IBUF3(7),ON,JUNK(259) + COMMON /BLANK/ C0M(4) + LOGICAL BTEST + character*1 bufor1(85) + character int2char + integer bufor2(43) + equivalence (bufor1(1), bufor2(1)) + + I=1 + LP=1 + GOTO 2 +C NOW ONE LINE IS READ FROM THE INPUT FILE +1 LN=LN+1 + call ffwrhex(16, ln) +c + IF (BTEST(C0M(2),15)) GOTO 1001 + call ffwrite_char(16, '0') +c + GOTO 1002 +1001 call ffwrite_char(16, '1') +c +1002 CONTINUE +c end of line - write CR/LF + call ffwrite_char(16, int2char(13)) + call ffwrite_char(16, int2char(10)) +2 call nextch(17, bufor(1)) + bufor(1) = iand(X'FF',bufor(1)) + IF (BUFOR(1).EQ.1) GOTO 1 + IF (BUFOR(1).EQ.2) RETURN +3 I=I+1 + call nextch(17, bufor(i)) + bufor(i) = iand(X'FF',bufor(i)) + if (bufor(i) .eq. 1) goto 90 + if (i .lt. 84) goto 3 + max = i + goto 100 +90 max = i-1 +100 continue + LN=LN+1 + call ffwrhex(16, ln) +c + IF (BTEST(C0M(2),15)) GOTO 110 + call ffwrite_char(16, '0') +c + GOTO 115 +110 call ffwrite_char(16, '1') +c +115 CONTINUE + BUFOR(max+1)=1 + do 120 i=1,max +120 bufor1(i) = char(bufor(i)) + call ffwrite(16, bufor2(1), max) +c + call ffwrite_char(16, int2char(13) ) + call ffwrite_char(16, int2char(10) ) + DO 140 I=MAX+1,85 +140 BUFOR(I)=ICHAR(' ') + MAX=MAX+2 + RETURN + END + + SUBROUTINE ERROR(K) +C LIS OF THE ERRORS DIAGNOSED BY THE PARSER +C +C 101 - := EXPECTED +C 102 - ; " +C 103 - 'THEN' " +C 104 - 'FI', 'ELSE' " +C 105 - 'OD' " +C 106 - ( " +C 107 - ) " +C 108 - 'DO' " +C 109 - IDENTIFIER " +C 110 - TOO MANY EXIT-S +C 111 - ILLEGAL CHARACTER +C 112 - STRUCTURE ERROR IN 'IF THEN ELSE FI' +C 113 - ???????????????????????????????????????????????? +C 114 - DOT MISSING +C 115 - WRONG OCCURRENCE OF A CONSTANT IN EXPRESSION +C 116 - = MISSING +C 117 - CONSTANT MISSING +C 118 - DELIMITER MISSING +C 119 - CLASS/ PROCEDURE / FUNCTION EXPECTED +C 120 - 'HIDDEN HIDDEN' OR 'CLOSE CLOSE' +C 121 - HIDDEN OUTSIDE CLASS +C 122 - 'BLOCK' MISSING +C 123 - OBJECTEXPRESSION IS NOT A GENERATOR +C 124 - 'DIM' MISSING +C 125 - 'TO' / 'DOWNTO' MISSING +C 126 - ILLEGAL OCCURRENCE OF AN ARITHMETIC OPERATOR +C 127 - DECLARATIONS EXPECTED (UNIT, VAR, CONST) +C 128 - THE NAME OCCURRING AFTER 'END' DOESN-T MATCH THE UNIT NAME +C 129 - CASE...ESAC STRUCTURE ERROR +C 130 - DO...OD STRUCTURE ERROR +C 131 - ILLEGAL OCCURRENCE OF MAIN +C 132 - WHEN EXPECTED +C 133 - TOO MANY CASES IN 'CASE' (UPPER LIMIT = 127) +C 134 - 'BEGIN' MISSING +C 135 - ERROR IN OPTION DEFINITON IN COMMENT +C 136 - NULL PROGRAM +C 137 - WRONG HEADER OF THE SOURCE PROGRAM (BLOCK/PROGRAM MISSING) +C 138 - TOO MANY REPEAT STATEMENTS +C 139 - UNREACHABLE INSTRUCTIONS AFTER EXIT +C 140 - ANDIF'S AND ORIF'S INTERLEAVE +C 141 - SEMAPHORE TYPE PRECEDED BY ARRAYOF +C 142 - HANDLER IMPROPERLY ENDED +C 143 - LASTWILL OCCURRS WITHIN A COMPOUND STATEMENT OR WITHIN A HANDLER +C 144 - LASTWILL OCURRS TWICE +C 145 - NO PARAMETER SPECIFICATION +C 146 - WRONG REGISTER SPECIFICATION (IMPOSSIBLE IN THE PORTABLE VERSION) +C 147 - +C OVERFLOW-TYPE ERRORS: SCANNING STOPS ON ANY OF THEM +C 191 - NULL PROGRAM - THE INPUT FILE IS EMPTY +C 196 - HASH TABLE OVERFLOW +C 197 - VARIABLE OR FORMAL PARAMETER LIST TOO LONG (LENGTH>132) +C 198 - PARSER STACK OVERFLOW +C 199 - IPMEM TABLE OVERFLOW - NO ROOM FOR MORE PROTOTYPES +C SCANNER ERRORS: +C 201 - ERROR IN REAL CONSTANT +C 202 - COMMENT STRUCTURE ERROR +C 203 - ERROR IN CHARACTER CONSTANT +C 204 - ERROR IN CONSTANT +C 205 - VALUE OF A INTEGER CONSTANT EXCEEDS MACHINE ARITHMETIC +C 206 - REAL +C 211 - IDENTIFIER TOO LONG (INITIAL 20 CHARACTERS ARE SIGNIFICANT) +C 212 - TEXT TOO LONG (INITIAL 264 CHARACTERS ARE SIGNIFICANT) + IMPLICIT INTEGER (A-Z) + COMMON /BUFF/ INSTR(265),BUFOR(85),LP,LN,MAX,JNK(266) + COMMON /LISTING/ OUTSTR(265) + COMMON /STREAM/ ERRFLG,LINE,IBUF2(265),IBUF3(7),ON,JUNK(259) + COMMON /BLANK/ C0M(4) , S , ADRES , KA , RESZTA(8185) + LOGICAL BTEST + character int2char + DATA EL,EP /0,0/ + + IF ((EL.EQ.LN).AND.(EP.GE.LP-1)) GOTO 15 + call ffwrhex(16, ln) +c + IF (BTEST(C0M(2),15)) GOTO 1 + call ffwrite_char(16, '0') +c + GOTO 2 +1 call ffwrite_char(16, '1') +c +2 CONTINUE + IF (LP.LT.3) GO TO 6 + DO 5 I=3,LP +5 call ffwrite_char(16, ' ') +6 CONTINUE + call ffwrite_char(16, '?') + call ffwrint(16, k) +c end of line - write CR/LF + call ffwrite_char(16, int2char(13) ) + call ffwrite_char(16, int2char(10) ) +c + LINE=LN + IF ((K.GT.190).AND.(K.LT.200)) CALL OVERF(K) + CALL MERR(K,0) +15 EP=LP + EL=LN + RETURN + END + + INTEGER FUNCTION ORD(X) + IMPLICIT INTEGER (A-Z) +cdsw BYTE TAB(122) + dimension tab(122) +C --- ORIGINAL TABLE (FOR ISO-7 CODE) CHANGED TO WORK FOR EBCDIC + DATA TAB /8*63,36,3*63,37,19*36,63,43,4*63,44,52,53,48,39, + ,42,40,38,41,0,1,2,3,4,5,6,7,8,9,47,45,50,49,51,63,63, + ,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29, + ,30,31,32,33,34,35,4*63,46, + ,63,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29, + ,30,31,32,33,34,35/ + Z=X + IF (Z.GT.122) GOTO 10 + ORD=TAB(Z) + RETURN +10 ORD = 63 + RETURN + END + + INTEGER FUNCTION SEARCH(K) + IMPLICIT INTEGER (A-Z) + COMMON /BLANK/ COM(302), + 1 HASH(8000), M, NAME(10), NLAST, NL, + 2 KEYS(200), + 3 SCANER(522), STOS(503), RESZTA(3652) + + NAME1=NAME(1) + I=MOD(NAME1,M) + I=I*2+1 + IF (HASH(I).NE.0) GOTO 3 + SEARCH=I + HASH(I)=NAME1 + GOTO 11 +1 IF (I.NE.0) GOTO 3 +2 NLAST=NLAST-2 + IF (NLAST.LT.0) CALL ERROR(196) + IF (HASH(NLAST).NE.0) GOTO 2 + SEARCH=NLAST + HASH(NLAST)=NAME(1) + HASH(J+1)=NLAST + I=NLAST + GOTO 11 +3 IF (HASH(I).EQ.NAME1) GOTO 4 + J=I + I=HASH(J+1) + GOTO 10 +4 IF ((K.NE.1).OR.(HASH(I+1).LT.0)) GOTO 5 + SEARCH=I + RETURN +5 J=I + P=1 +6 T=HASH(J+1) + P=P+1 + IF (P.LE.K) GOTO 8 + IF (T.LT.0) GOTO 7 + SEARCH=I + RETURN +7 J=-T + I=HASH(J+1) + GOTO 10 +8 IF (T.LT.0) GOTO 9 + I=T + GOTO 1 +9 J=-T + IF (NAME(P).EQ.HASH(J)) GOTO 6 + I=HASH(J+1) +10 IF (I.GE.0) GOTO 1 + J=-I + I=HASH(J+1) + GOTO 10 +11 P=2 +12 IF (P.GT.K) RETURN +13 NLAST=NLAST-2 + IF (NLAST.LT.0) CALL ERROR(196) + IF (HASH(NLAST).NE.0) GOTO 13 + HASH(NLAST)=NAME(P) + HASH(I+1)=-NLAST + I=NLAST + P=P+1 + GOTO 12 + END + + INTEGER FUNCTION EMBEDE(X) +C --- NAME CHANGED TO AVOID CONFLICTS IN THE 'ONE-PROGRAM' VERSION +C --- OF THE COMPILER + IMPLICIT INTEGER(A-Z) + COMMON /BLANK/ COM(278), + X LMEM , LPMEM , IRECN , ISFIN , LPMSYS, LPML , LPMF , + X NRINT , NRRE , NRBOOL, NRCHR , NRCOR , NRPROC, NRTEXT, + X NRUNIV, NATTR , NRNONE, NBLSYS, NBLUS , NEMPTY, INSYS , + X LOCAL , OWN , OBJECT, + x ipmem(12890) +cdsw X IPMEM(7890) + LOGICAL INSYS, LOCAL, OWN +C IPMEM - MAIN MEMORY +C ISFIN - TOP OF THE PROTOTYPE DICTIONARY STACK +C LPMEM - DIVISION POINT OF IPMEM + REAL X, STALE(200) + EQUIVALENCE (IPMEM(1), STALE(1)) + +#if ! ( WSIZE == 4 ) + real y + integer*2 m(2) + equivalence (y, m(1)) +#endif + + EMBEDE = 1 + +#if ( WSIZE == 4 ) +cvax one real constant in one ipmem element (4 bytes) + i = lpmem-1 + goto 10 +5 i = i+1 + if (stale(i).eq.x) goto 20 +10 if (i+1.lt.lpml) goto 5 + if (lpml+1.gt.lpmf) goto 300 + i = lpml + lpml=lpml+1 + stale(i) = x +20 embede = i +#else +C --- LENGTH OF REALS ON SIEMENS IS 2 + y = x + i = lpmem-2 + goto 10 +5 i = i + 2 + if (ipmem(i) .eq. m(1) .and. ipmem(i+1) .eq. m(2)) go to 20 +10 if (i+2 .lt. lpml) go to 5 + if (lpml+2 .gt. lpmf) go to 300 + i = lpml + lpml = lpml + 2 + ipmem(i ) = m(1) + ipmem(i+1) = m(2) +20 embede = (i+1) / 2 +#endif + return + +300 CALL ERROR(199) + RETURN + END + + + SUBROUTINE TINSER + IMPLICIT INTEGER (A-Z) + COMMON /BLANK/ + $ C0M(4), + O S, ADRES, K, SCOMA, SDOT, SEMICOL, + 1 SCOLON, SLEFT, SRIGHT, SBECOME, STAR, SRELAT, + 2 SEOF, SIDENT, SCONST, SAND, SARRAY, SARROF, + 3 SATTACH, SBEGIN, SBLOCK, SBOOL, SCALL, SCASE, + 4 SCLASS, SCLOSE, SCONS, SCOPY, SCOROUT, SDETACH, + 5 SDIM, SDO, SDOWN, SELSE, SEND, SESAC, + 6 SEXIT, SEXTERN, SFI, SFOR, SFUNCT, SIF, + 7 SINNER, SINPUT, SINT, SKILL, SLOCK, SNEW, + 8 SNONE, SNOT, SOD, SOR, SORIF, SOTHER, + 9 SOUTPUT, SPREF, SPRCD, SQUA, SREAD, SRESUME, + O SRETURN, STEP, STOP, STAKEN, STHEN, STHIS, + A STO, STYPE, SUNIT, SVAR, SVIRTUAL, SWAIT, + B SWHEN, SWHILE, SWRIT, SWRITLN, STRUE, SALL, + C WAND, WARRAY, WASSIGN, WASSCON, WATTACH, WBLOCK, + D WCALL, WCASE, WCASEL, WCOMA, WCNSTB, WCNSTC, + E WCNSTI, WCNSTN, WCNSTR, WCNST, WCOPY, WDETACH, + F WDOT, WDOWNTO, WEOF, WESAC, WFIN, WFIRST, + G WFOREND, WFORVAR, WFROM, WIDENT, WIFFALS, WIFTRUE + + common /BLANK/ + H WINNER, WINSTREND,WJUMP, WKILL, WLABEL, WLEFT, + I WLOCK, WLOW, WLSE, WNEW, WNEWARRAY,WNOT, + J WOPERAT, WOPT, WOR, WOTHER, WPREF, WPRIM, + K WQUA, WREAD, WRELAT, WRESUME, WRETURN, WRIGHT, + L WSTART, WSTEP, WSTOP, WTHIS, WTO, WAIT, + M WRITE, WRITELN, WBOUND, UNICAL, + N COM(132), + O LMEM, LPMEM, IRECN, ISFIN, LPMSYS, LPML, + P LPMF, NRINT, NRRE, NRBOOL, NRCHAR, NRCOR, + Q NRPROC, NRTEXT, NRUNIV, NATTR, NRNONE, NBLSYS, + R NBLUS, NEMPTY, INSYS, LOCAL, OWN, OBJECT, + S HASH(8000), M, NAME(10), NLAST, NL, + T KEYS(200), + U TRANS1(13,13), TRANS2(13,13), B0, B(70), + V SKOK0, SKOK(70), KK, MM, STAN, STAN1, + W AUX, K1, SY, SY1, NU, JK1, EXP, + X SIGN, INTPART, FRAC, OKEY, FRACT,JK2,NB, + Y TL, BYTE, TEXT(20), + Z TOP, IN, NEXT, STACK(500) + + common /BLANK/ + * RESZTA(3652) + REAL FRACT,NU + COMMON /STREAM/ ERRFLG,LINE,IBUF2(265),BUF(7),ON,BUFOUT(256), + X POSIT,RECNR,NEKST + LOGICAL ERRFLG + logical btest + character int2char + + integer zero(2) + character stringbuffer(2) + integer istringbuffer(1) + equivalence (stringbuffer(1),istringbuffer(1)) +cvax + character zeroc(8) + equivalence (zero(1), zeroc(1)) +c + data zero /0, 0/ +cbc + ADRES=0 + IF (ERRFLG) RETURN + IF (COM(2).EQ.0) RETURN + ADRES=TEXT(1) + LENGTH=2*MM-2 + IF (COM(MM).LT.256) LENGTH=LENGTH-1 +c write string length (in bytes) + call ffwrite_ints(15, length, 1) +c write string itself without any padding + l = length / 2 +cdsw - poprawka na wszelki wypadek + if (l.eq.0) goto 101 +c + do 100 i = 1, l + stringbuffer(1)=int2char(iand(com(1+i),X'FF')) + stringbuffer(2)=int2char(ishft(com(1+i),-8)) +100 call ffwrite(15,istringbuffer(1),2) +101 continue + if (mod(length, 2) .ne. 1) goto 102 + stringbuffer(1)=int2char(iand(com(2+l),X'FF')) + call ffwrite(15, istringbuffer(1), 1) +102 continue + +c compute the number of trailing zero bytes +#if ( WSIZE == 4 ) + wrdsiz = 4 +#else + wrdsiz=2 + if (btest(c0m(2), 12)) wrdsiz=4 +#endif + + fill=wrdsiz-mod(length, wrdsiz) +c and write them + call ffwrite(15, zero, fill) +c compute next string address + text(1) = text(1) + 1 + (length+fill)/wrdsiz + RETURN + END + + INTEGER FUNCTION KEY ( ADR ) + +C +C COMPUTES KEY OF THE ENCOUNTERED WORD. IT-S ADDRESS IS PASSED THRU +C ADR. +C +C STRUCTURE OF KEY TABLE: +C +C KEYS(2*N) - ADDRESS OF A KEYWORD +C KEYS(2*N-1) - KEY OF THIS WORD +C +C NOTE: FOR THE WORDS THAT DO NOT OCCUR IN THE DICTIONARY +C THE FUNCTION RETURNS IDENTIFIER KEYS +C + IMPLICIT INTEGER (A-Z) + COMMON /BLANK/ C0M(146),COM(132),XX(8037),KEYS(200),RESZTA(4677) +C --- SPECIAL CHECK IS MADE HERE FOR THE ENTRIES WHICH ARE MISSING +C --- IN THE HASH TABLE AND IN 'KEYS' +C +C --- READLN + IF (ADR.NE.1833) GO TO 9999 + KEY = 256 + RETURN +C --- END OF CHECK FOR MISSING KEYS +c get +9999 if(adr.ne.59) go to 9998 + key = 249 + return +c put +9998 if(adr.ne.1243) go to 9997 + key = 248 + return +c file +9997 if(adr.ne.2339) go to 9996 + key = 518 + return +c open +9996 if(adr.ne.2347) go to 9995 + key = 240 + return +c eof +9995 if(adr.ne. 1841) go to 9994 + key = 480 + return +c eoln +9994 if(adr.ne.2579) go to 9993 + key = 481 + return +c text - key jak dla string +9993 if(adr.ne.2249) go to 9992 + key = 517 + return +c direct - klasa 64/7 - jak dla typow pierwotnych +9992 if (adr .ne. 2097) goto 8888 + key = 519 + return +c putrec - klasa 34/0 +8888 if (adr .ne. 2075) goto 8889 + key = 272 + return +c getrec - klasa 34/1 +8889 if (adr .ne. 2081) go to 8890 + key = 273 + return +cbc ----- added concurrent statements +c enable - klasa 35/0 +8890 if (adr .ne. 2047) goto 8891 + key = 280 + return +c disable - klasa 35/1 +8891 if (adr .ne. 2041) goto 8892 + key = 281 + return +c accept - klasa 36/0 +8892 if (adr .ne. 2053) goto 8893 + key = 288 + return +cbc ----------- end +c break +8893 if(adr.ne.1463) go to 9991 + key = 264 + return +9991 CONTINUE + KEY=1*8 + LEFT=1 + RIGHT=COM(1) + IF (KEYS(2*LEFT)-ADR) 30,20,10 +10 RETURN +20 POINT=LEFT + GOTO 200 +30 IF (KEYS(2*RIGHT)-ADR) 10,40,50 +40 POINT=RIGHT + GOTO 200 +50 POINT=(LEFT+RIGHT)/2 + IF (KEYS(2*POINT)-ADR) 100,200,300 +100 IF (LEFT.EQ.POINT) RETURN + LEFT=POINT + GOTO 50 +200 KEY=KEYS(2*POINT-1) + RETURN +300 RIGHT=POINT + GOTO 50 + END + diff --git a/sources/pass1/spgrec.f b/sources/pass1/spgrec.f new file mode 100644 index 0000000..c63f859 --- /dev/null +++ b/sources/pass1/spgrec.f @@ -0,0 +1,106 @@ +C Loglan82 Compiler&Interpreter +C Copyright (C) 1981-1993 Institute of Informatics, University of Warsaw +C Copyright (C) 1993, 1994 LITA, Pau +C +C This program is free software; you can redistribute it and/or modify +C it under the terms of the GNU General Public License as published by +C the Free Software Foundation; either version 2 of the License, or +C (at your option) any later version. +C +C This program is distributed in the hope that it will be useful, +C but WITHOUT ANY WARRANTY; without even the implied warranty of +C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +C GNU General Public License for more details. File: LICENSE.GNU +C =============================================================== + + subroutine spgrec(action) + IMPLICIT INTEGER (A-Z) + COMMON /STOS/ BOTTOM,VALTOP,VLPREV,STCKAG,STCKA0,STCKAP(14), + X APETYT(4),LSTLSE,LSTFOR,KIND,PHADR,LASTPR,FSTOUT, + X CONSNR(8),LSTSAF,LSTEMP,TEMPNR,LSTWRD,QRECNR,WB, + X RESULT,FRSTTS,UNIT,INNER,LSTWILL,TEST,ARG,ATLINE, + X FILE,FLARGS,FLMODF,FLREADY,ICOUNT,OCOUNT + LOGICAL LSTWILL,FLREADY,TEST +C + LOGICAL INSYS, OWN + COMMON /BLANK/ IOP(4), + X P, + X TLDIM, TLBAS, IDL, OBJL, + X TRDIM, TRBAS, IDR, OBJR, + X TRESLT, + X CONVL, CONVR, + X NRPAR, + X IX (261), + X LMEM , LPMEM , IRECN , ISFIN , LPMSYS, LPML , LPMF , + X NRINT , NRRE , NRBOOL, NRCHR , NRCOR , NRPROC, NRTEXT, + X NRUNIV, NATTR , NRNONE, NBLSYS, NBLUS , NEMPTY, INSYS , + X LOCAL, OWN, OBJECT, + X IPMEM(5000) + REAL STALER(100) + INTEGER STACK(5000) + EQUIVALENCE(STALER(1),IPMEM(1) ) + EQUIVALENCE(STACK(1),IPMEM(1)) + logical conv +c +c second parameter - buffer array + flargs = 2 + call svalu2 +c check if one-dimensional array + if (stack(vlprev-3) .ne. 1) goto 30 +c check if primitive type + n = stack(vlprev-4) + if (n .ne. nrint .and. n .ne. nrre .and. n .ne. nrbool .and. + * n .ne. nrchr) goto 40 + call quadr4(145, svats(vlprev), action, 0) +c third parameter - byte count +c duplicate stack top +200 conv = .FALSE. + elem = stack(valtop) + call spush(elem) + do 100 i=1, stckap(elem) + stack(valtop-i+1)=stack(vlprev-i+1) +100 continue + call svalue +c check if not array + if (stack(valtop-3) .gt. 0) goto 20 +c check if integer + if (stack(valtop-4) .eq. nrint) goto 300 +c not integer, check if real + if (stack(valtop-4) .ne. nrre) goto 20 +c real, convert to integer + conv = .TRUE. + call svint(valtop) +300 continue + call quadr4(145, svats(valtop), action, 1) + call spop +c check if variable or array element + n = stack(valtop) + if (n .ne. 3 .and. n .ne. 4) goto 10 + ats = tstemp(1) +c generate LCALLPROCSTAND + call quadr2(132, action) +c read output parameter + call quadr4(23, ats, action, 1) + if ( .not. conv) go to 400 +c convert to real + ats1 = tstemp(2) + call quadr3(59, ats1, ats) + ats = ats1 +400 continue + call sstore(valtop, ats) + call spop + return +c error recovery +10 call serror(420) + call spop + return +20 call serror(478) + call spop + call spop + return +30 call serror(416) + goto 200 +40 call serror(478) + goto 200 + end + diff --git a/sources/pass1/statist.f b/sources/pass1/statist.f new file mode 100644 index 0000000..0d7aa6c --- /dev/null +++ b/sources/pass1/statist.f @@ -0,0 +1,117 @@ + SUBROUTINE MSTAT +C----------------DRUKOWANIE STATYSTYK KOMPILATORA +C +C BEZ OPISU W DOKUMENTACJI (CZESC ML2) +C WERSJA Z DNIA: 19.01.82 +C DLUGOSC KODU: 751 +C........................................................................... +C + IMPLICIT INTEGER (A-Z) + REAL USED, TOTAL +C + COMMON /BLANK/ IOP(4), ERRLINE, ERRCNT, + X COM(272), + X LMEM , LPMEM , IRECN , ISFIN , LPMSYS, LPML , LPMF , + X XFIL(17), + X IPMEM(5000) + COMMON /LYST/ PAGESZ, PAGENR, LINPG, + X LN1, LGTH1, BUFLN1(30), + X LN2, LGTH2, BUFLN2(30), + X LUN + integer*4 bufln1, bufln2 +C + COMMON /MSTA/ MLFREE, WNFREE, WNSTK, AL1BLK, AL1STK, + X AL2BLK, AL2SYM, AL2OTH, WNBLK, TLP, TLM, + X WNSUS, TOTMEM +C + IF (IOP(1) .EQ. 9) RETURN +C --POWROT GDYZ WYABORTOWANY ZOSTAL PARSER + CALL PGINIT + + call ffputspaces(lun,22) + call ffputcs(lun,'- STATISTICS') + call ffputnl(lun) + call ffputspaces(lun,24) + call ffputcs(lun,'STORAGE') + call ffputi (lun,TOTMEM,6) + call ffputcs(lun,'K WORDS') + call ffputnl(lun) + call ffputcs(lun,'PARSER') + call ffputnl(lun) + + IUS = TLM-TLP + TOTAL = IUS + IUS = IUS-WNFREE + USED = IUS + TOTAL = USED/TOTAL + TOTAL = TOTAL*100.0 + IUS = TOTAL + + call ffputspaces(lun,30) + call ffputcs(lun,'DECL. PART') + call ffputi (lun,WNFREE,6) + call ffputcs(lun,'WORDS LEFT') + call ffputi (lun,IUS,6) + call ffputcs(lun,'% USED') + call ffputnl(lun) + + USED = WNSUS + IUS = TLP-3738 + TOTAL = IUS + TOTAL = USED/TOTAL + TOTAL = TOTAL*100.0 + IUS = TOTAL + + call ffputspaces(lun,30) + call ffputcs(lun,'STACK') + call ffputspaces(lun,5) + call ffputi (lun,WNSTK,6) + call ffputcs(lun,' WORDS USED') + call ffputi (lun,IUS,6) + call ffputcs(lun,'% USED') + call ffputnl(lun) + + WNBLK=WNBLK-12 + + call ffputspaces(lun,37) + call ffputi (lun,WNBLK,6) + call ffputcs(lun,'+12 BLOCK(S) WRITTEN') + call ffputnl(lun) + + call ffputspaces(lun,24) + call ffputcs(lun,'SEMANTIC ANALISIS') + call ffputnl(lun) + + TOTAL = TLP + IUS = TLP-MLFREE + USED = IUS + TOTAL = USED/TOTAL + TOTAL = TOTAL*100.0 + IUS = TOTAL + + call ffputspaces(lun,30) + call ffputcs(lun,'DECL. PART') + call ffputi (lun,MLFREE,6) + call ffputcs(lun,' WORDS LEFT') + call ffputi (lun,IUS,6) + call ffputcs(lun,'% USED') + call ffputnl(lun) + + IF ((IOP(1) .GE. 10) .AND. (IOP(1) .LE. 12)) RETURN + + call ffputspaces(lun,30) + call ffputcs(lun,'STACK') + call ffputspaces(lun,22) + call ffputi (lun,AL1STK,6) + call ffputcs(lun,'% USED') + call ffputnl(lun) + + AL1BLK = AL1BLK+1 + + call ffputspaces(lun,40) + call ffputi (lun,AL1BLK,6) + call ffputcs(lun,' BLOCK(S) WRITTEN') + call ffputnl(lun) + + RETURN + END diff --git a/sources/pass1/stdio.c b/sources/pass1/stdio.c new file mode 100644 index 0000000..2489e41 --- /dev/null +++ b/sources/pass1/stdio.c @@ -0,0 +1,66 @@ + /* Loglan82 Compiler&Interpreter + Copyright (C) 1981-1993 Institute of Informatics, University of Warsaw + Copyright (C) 1993, 1994 LITA, Pau + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + +======================================================================= +*/ + +#include + +#if WSIZE==4 + typedef long word; +#elif WSIZE==2 + typedef short word; +#else + Define WSIZE to 2 or 4 ! +#endif + + +extern FILE *file_arr[]; + + +#define sunit FILE *f=stdout; if((int)(*unit)!=0L) f=file_arr[*unit]; + + +void ffputnl_(unit) word *unit;{ + sunit + fprintf(f,"\n"); +} +void ffputff_(unit) word *unit;{ + sunit + fprintf(f,"\f"); +} +void ffputspaces_(unit,count) word *unit,*count;{ + sunit + fprintf(f,"%*s",(int)(*count),""); +} +void ffputi_(unit,i,count) word *unit,*i,*count;{ + sunit + fprintf(f,"%*d",(int)(*count),(int)(*i)); +} +void ffputcs_(unit,s,count) word *unit; long count; char *s;{ + sunit + fprintf(f,"%*.*s",(int)count,(int)count,s); +} +void ffputs_(unit,s,count,one) word *unit,*count; char *s; long one;{ + sunit + fprintf(f,"%*.*s",(int)(*count),(int)(*count),s); +} +void ffgets_(unit,s,count,one) word *unit,*count; char *s; long one;{ + FILE *f=stdin; if((int)(*unit)!=0) f=file_arr[*unit]; + fgets(s,(int)(*count),f); +} +void ffexit_(){ exit(0); } + + diff --git a/sources/pass1/stos.h b/sources/pass1/stos.h new file mode 100644 index 0000000..5aa08cb --- /dev/null +++ b/sources/pass1/stos.h @@ -0,0 +1,24 @@ +C Loglan82 Compiler&Interpreter +C Copyright (C) 1981-1993 Institute of Informatics, University of Warsaw +C Copyright (C) 1993, 1994 LITA, Pau +C +C This program is free software; you can redistribute it and/or modify +C it under the terms of the GNU General Public License as published by +C the Free Software Foundation; either version 2 of the License, or +C (at your option) any later version. +C +C This program is distributed in the hope that it will be useful, +C but WITHOUT ANY WARRANTY; without even the implied warranty of +C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +C GNU General Public License for more details. File: LICENSE.GNU +C =============================================================== + +C............. /STOS/ ..... + IMPLICIT INTEGER (A-Z) + COMMON /STOS/ BOTTOM,VALTOP,VLPREV,STCKAG,STCKA0,STCKAP(14), + X APETYT(4),LSTLSE,LSTFOR,KIND,PHADR,LASTPR,FSTOUT, + X CONSNR(8),LSTSAF,LSTEMP,TEMPNR,LSTWRD,QRECNR,WB, + X RESULT,FRSTTS,UNIT,INNER,LSTWILL,TEST,ARG,ATLINE, + X FILE,FLARGS,FLMODF,FLREADY,ICOUNT,OCOUNT + LOGICAL LSTWILL,FLREADY,TEST + diff --git a/sources/pass1/unix.lnk b/sources/pass1/unix.lnk new file mode 100644 index 0000000..fe5cae7 --- /dev/null +++ b/sources/pass1/unix.lnk @@ -0,0 +1,2 @@ +stdio.o memfil.o al11.o al12.o al13.o debug.o dsw.o hash.o ifun.o it0.o it1.o resume.o scan.o spgrec.o wan1.o wan2.o wan3.o ml2.o ml3.o main.o + diff --git a/sources/pass1/wan1.ff b/sources/pass1/wan1.ff new file mode 100644 index 0000000..5c66853 --- /dev/null +++ b/sources/pass1/wan1.ff @@ -0,0 +1,937 @@ +C Loglan82 Compiler&Interpreter +C Copyright (C) 1981-1993 Institute of Informatics, University of Warsaw +C Copyright (C) 1993, 1994 LITA, Pau +C +C This program is free software; you can redistribute it and/or modify +C it under the terms of the GNU General Public License as published by +C the Free Software Foundation; either version 2 of the License, or +C (at your option) any later version. +C +C This program is distributed in the hope that it will be useful, +C but WITHOUT ANY WARRANTY; without even the implied warranty of +C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +C GNU General Public License for more details. File: LICENSE.GNU +C =============================================================== + + + SUBROUTINE WAN + IMPLICIT INTEGER (A-Z) + LOGICAL INSYS, OWN + COMMON /BLANK/ COM(278), + X LMEM , LPMEM , IRECN , ISFIN , LPMSYS, LPML , LPMF , + X NRINT , NRRE , NRBOOL, NRCHR , NRCOR , NRPROC, NRTEXT, + X NRUNIV, NATTR , NRNONE, NBLSYS, NBLUS , NEMPTY, INSYS , + X LOCAL , OWN , OBJECT, + X IPMEM(5000) +C +C COM - OBSZAR KOMUNIKACYJNY STRUMIENI +C LMEM - (=32000) ROZMIAR CALEJ PAMIECI GLOWNEJ +C LPMEM - PODZIAL PAMIECI NA CZESCI IPMEM I ISMEM +C IRECN - INDEKS SZCZYTU STOSU STALYCH REAL +C ISFIN - INDEKS SZCZYTU SLOWNIKA PROTOTYPOW +C +C LPMSYS - INDEKS PIERWSZEGO SLOWA W IPMEM OBSZARU NIEPRZEZ- +C NACZONEGO NA PROTOTYPY SYSTEMOWE +C LPML - INDEKS PIERWSZEGO SLOWA OBSZARU WOLNEGO W IPMEM +C LPMF - INDEKS OSTATNIEGO SLOWA WOLNEGO OBSZARU W IPMEM +C +C IDENTYFIKATORY PROTOTYPOW SYSTEMOWYCH +C NRINT - IDENTYFIKATOR PROTOTYPU INTEGER +C NRRE - REAL +C NRBOOL - BOOLEAN +C NRCHR - CHARACTER +C NRCOR - COROUTINE +C NRPROC - PROCESS +C NRTEXT - STRING (TEXT) +C NRUNIV - IDENTYFIKATOR PROTOTYPU UNIWERSALNEGO +C NATTR - IDENTYFIKATOR PSEUDO-ATRYBUTU (Z NUMEREM -1) +C NRNONE - IDENTYFIKATOR PROTOTYPU TYPU NONE (UNIWERSALNY +C REFERENCYJNY) +C NBLSYS - IDENTYFIKATOR BLOKU SYSTEMOWEGO +C NBLUS - BLOKU GLOWNEGO UZYTKOWNIKA +C +C INSYS - FLAGA SPOSOBU REZERWACJI (PRZEZ MGETM) PAMIECI +C W IPMEM - .TRUE. JESLI REZERWACJA W CZESCI SYSTE- +C MOWEJ +C LOCAL - FLAGA DOSTEPU DO OBIEKTOW - 2 JESLI OBIEKT +C BYL LOKALNY, 1 - GDY Z SL, 0 - GDY Z BLOKU GLOWNEGO +C OWN - FLAGA DOSTEPU DO OBIEKTOW - .TRUE. JESLI OBIEKT NIE +C POCHODZI Z PREFIKSOW (TYLKO Z WLASCIWEGO OBIEKTU) +C OBJECT - PROTOTYP OBIEKTU, Z KTOREGO POCHODZIL OSTATNIO +C SZUKANY IDENTYFIKATOR (OBIEKT POCHODZACY Z CIAGU SL) +C + +cdeb ----------- added ---------------------- +c new common blockfor the debugger + common /debug/ deb,breakt(500),brnr,maxbr + logical deb +c deb = true - compilation with the debugger +c breakt - array of static break points +c brnr - index in breakt +c maxbr - maximal number of static break points +cdeb ---------------------------------------- + + COMMON /MJLMSG/IERC,MSG + + common /option/opt + integer*4 msg + +cdsw DATA IDENT /4HWAN / + +cdsw MSG = IDENT + msg = 'wan ' + IERC = 0 + CALL DATA1 +cdeb + if(deb) call inbr +cdeb + CALL E0 + opt = com(2) + CALL END +cdeb + if(deb) call endbr +cdeb + CALL MESS + CALL IT1 + END + + SUBROUTINE DATA1 + IMPLICIT INTEGER (A-Z) + character jfname(72) + common /jf/jfname(72),jf + integer*2 bigbuf + common /combuf/ ind, length, bigbuf(16000) +C +C OPENS FILES +C + LOGICAL ERRFLG + COMMON /STREAM/ ERRFLG,LINE,IBUF2(265),BUF(7),ON,BUFOUT(256), + X POSIT,RECNR,NEXT + COMMON /LISTING/ OUTSTR(265) + COMMON /BUFF/ INSTR(265),BUFOR(85),LP,LN,MAX,POSTR(265),STATUS + COMMON /BLANK/ + $ C0M(4), + O S, ADRES, K, SCOMA, SDOT, SEMICOL, + 1 SCOLON, SLEFT, SRIGHT, SBECOME, STAR, SRELAT, + 2 SEOF, SIDENT, SCONST, SAND, SARRAY, SARROF, + 3 SATTACH, SBEGIN, SBLOCK, SBOOL, SCALL, SCASE, + 4 SCLASS, SCLOSE, SCONS, SCOPY, SCOROUT, SDETACH, + 5 SDIM, SDO, SDOWN, SELSE, SEND, SESAC, + 6 SEXIT, SEXTERN, SFI, SFOR, SFUNCT, SIF, + 7 SINNER, SINPUT, SINT, SKILL, SLOCK, SNEW, + 8 SNONE, SNOT, SOD, SOR, SORIF, SOTHER, + 9 SOUTPUT, SPREF, SPRCD, SQUA, SREAD, SRESUME, + O SRETURN, STEP, STOP, STAKEN, STHEN, STHIS, + A STO, STYPE, SUNIT, SVAR, SVIRTUAL, SWAIT, + B SWHEN, SWHILE, SWRIT, SWRITLN, STRUE, SALL, + C WAND, WARRAY, WASSIGN, WASSCON, WATTACH, WBLOCK, + D WCALL, WCASE, WCASEL, WCOMA, WCNSTB, WCNSTC, + E WCNSTI, WCNSTN, WCNSTR, WCNST, WCOPY, WDETACH, + F WDOT, WDOWNTO, WEOF, WESAC, WFIN, WFIRST, + G WFOREND, WFORVAR, WFROM, WIDENT, WIFFALS, WIFTRUE + + common /BLANK/ + H WINNER, WINSTREND,WJUMP, WKILL, WLABEL, WLEFT, + I WLOCK, WLOW, WLSE, WNEW, WNEWARRAY,WNOT, + J WOPERAT, WOPT, WOR, WOTHER, WPREF, WPRIM, + K WQUA, WREAD, WRELAT, WRESUME, WRETURN, WRIGHT, + L WSTART, WSTEP, WSTOP, WTHIS, WTO, WAIT, + M WRITE, WRITELN, WBOUND, UNICAL, + N COM(132), + O LMEM, LPMEM, IRECN, ISFIN, LPMSYS, LPML, + P LPMF, NRINT, NRRE, NRBOOL, NRCHAR, NRCOR, + Q NRPROC, NRTEXT, NRUNIV, NATTR, NRNONE, NBLSYS, + R NBLUS, NEMPTY, INSYS, LOCAL, OWN, OBJECT, + S HASH(8000), M, NAME(10), NLAST, NL, + T KEYS(200), + U TRANS1(13,13), TRANS2(13,13), B0, B(70), + V SKOK0, SKOK(70), KK, MM, STAN, STAN1, + W AUX, K1, SY, SY1, NU, EXP, + X SIGN, INTPART, FRAC, OKEY, FRACT, NB, + Y TL, BYTE, TEXT(20), + Z TOP, IN, NEKST, STACK(500) + + common /BLANK/ + * RESZTA(3652) + +cdsw error !!!! + real fract, nu +c + logical btest + character int2char + +cdeb ----------- added ---------------------- +c new common blockfor the debugger + common /debug/ deb,breakt(500),brnr,maxbr + logical deb +c deb = true - compilation with the debugger +c breakt - array of static break points +c brnr - index in breakt +c maxbr - maximal number of static break points + +cdeb ---------------------------------------- + + + DIMENSION W(63) + EQUIVALENCE (W(1),WAND) + +cdsw kod spacji ascii + data data1hex /x'2020'/ + + +cdeb +c nadanie wartosci zmiennej deb - czy zapalona opcja S + deb = .false. + if(btest(c0m(2),13)) deb = .true. +cdeb + + DO 10 I=1,63 +10 W(I)=I + UNICAL = 3 +C --- +c unit 16 - roboczy listing (sequential ) + call ffcrtmp(16) +C --- WRITE LISTING OPTION FLAG + call ffwrhex(16, c0m(2)) +C --- + ERRFLG = .FALSE. + +cdsw *********** new file ************** +c unit 18 - roboczy,sekwencyjny do kodu posredniego + call ffcrtmp(18) + +c ------ unit 14 (buf) - kod posredni (direct) + CALL OPENF(BUF,14) + POSIT=1 +cdsw RECNR=12 +cdsw NEXT=13 + recnr = 32 + next = 33 + call seek(buf,recnr) +C DATA BUFOR,LN,LP,MAX /85*4Z2020,0,81,81/ + LN=0 + LP=81 + MAX=81 + + do 9997 jf=1,70 + if (jfname(jf).eq.'.') go to 9998 + if (jfname(jf).eq.' ') goto 9996 +9997 continue +9996 if(jf+4.gt.70) goto 9991 + jfname(jf) = '.' + jfname(jf+1) = 'l' + jfname(jf+2) = 'o' + jfname(jf+3) = 'g' +9998 continue + jfname(jf+4) = int2char(0) +9991 jfname(70) = int2char(0) +c unit 17 - input (sequential) + call ffopen(17,jfname(1)) + length = 0 + ind = 1 + + jfname(jf+1)='l' + jfname(jf+2)='c' + jfname(jf+3)='d' + jfname(jf+4)=int2char(0) + call ffcreat(15, jfname(1)) + + STATUS=0 + DO 1 I=1,85 +1 BUFOR(I)=DATA1HEX + ON=49 + BEGIN=1 + IEND=0 +800 CALL READIN + I=1 +900 if(ord(bufor(i)).ne.ord(ichar(' '))) goto 1000 + I=I+1 + IF (I.GT.MAX) GOTO 800 + GOTO 900 +1000 IF (BUFOR(I ).NE.ICHAR('P').AND.BUFOR(I).NE.ICHAR('p')) + X GOTO 2500 + IF (BUFOR(I+1).NE.ICHAR('R').AND.BUFOR(I+1).NE.ICHAR('r')) + X GOTO 2500 + IF (BUFOR(I+2).NE.ICHAR('O').AND.BUFOR(I+2).NE.ICHAR('o')) + X GOTO 2500 + IF (BUFOR(I+3).NE.ICHAR('G').AND.BUFOR(I+3).NE.ICHAR('g')) + X GOTO 2500 + IF (BUFOR(I+4).NE.ICHAR('R').AND.BUFOR(I+4).NE.ICHAR('r')) + X GOTO 2500 + IF (BUFOR(I+5).NE.ICHAR('A').AND.BUFOR(I+5).NE.ICHAR('a')) + X GOTO 2500 + IF (BUFOR(I+6).NE.ICHAR('M').AND.BUFOR(I+6).NE.ICHAR('m')) + X GOTO 2500 + IF (BUFOR(I+7).EQ.1) GOTO 1100 + if(ord(bufor(i+7)) .ne. ord(ichar(' '))) goto 2500 +1100 I=I+8 + IF (I.LT.MAX) GOTO 1200 +1150 CALL READIN + I=1 +1200 if(ord(bufor(i)).ne.ord(ichar(' '))) goto 1300 + I=I+1 + IF (I.GT.MAX) GOTO 1150 + GOTO 1200 +1300 BEGIN=I + IEND=I-1 +1350 IF ((ORD(BUFOR(I)).LT.10).OR.(ORD(BUFOR(I)).GT.35)) GOTO 1500 +1400 I=I+1 + IF (BUFOR(I).GE.ICHAR('0').AND.BUFOR(I).LE.ICHAR('9')) GOTO 1400 + GOTO 1350 +1500 IEND=I-1 +C +C INITIALIZE STRINGS OUTPUT TO LFILE WITH EMPTY STRING +C + +2500 continue + +C write length of empty string + call ffwrite_ints(15, 0, 1) +C write empty string itself + call ffwrite_ints(15, 0, 1) + +#if ! ( WSIZE == 4 ) +C if H+ + if (btest(c0m(2), 12)) call ffwrite_ints(15, 0, 1) +#endif +cbc +C +C INITIATE THE TABLE OF REAL CONSTANTS +C THE TWO INITIAL CONSTANTS, WHICH ALWAYS RESIDE IN THE TABLE ARE +C 0.0 AND 1.0 +C + EXP=EMBEDE(0.0) + EXP=EMBEDE(1.0) + LP=IEND+1 + I=0 + IF (IEND.LT.BEGIN) GOTO 3500 + S=SBLOCK + GOTO 4000 +3500 IF (S.EQ.70) CALL ERROR(191) +3550 CALL SCAN +3600 IF (S.EQ.SBLOCK) GOTO 4000 + I=1 + IF (S.EQ.SBEGIN) GOTO 4000 + IF (S.EQ.SUNIT) GOTO 4000 + IF (S.EQ.SVAR) GOTO 4000 + IF (S.EQ.SCONS) GOTO 4000 + IF (S.EQ.SEND) GOTO 4000 + IF (S.EQ.SPRCD) GOTO 4000 + IF (S.EQ.SFUNCT) GOTO 4000 + IF (S.EQ.SCLASS) GOTO 4000 + IF (S.EQ.SIDENT) GOTO 3550 + IF (S.EQ.STAKEN) GOTO 4000 + IF (S.EQ.SCLOSE) GOTO 4000 + IF (S.LT.25) GOTO 4000 + IF (S.NE.70) GOTO 3550 + CALL ERROR(136) +4000 IF (I.EQ.1) CALL ERROR(137) + RETURN + END + +cdeb new procedures + + subroutine inbr + implicit integer(a-z) + +cdeb ----------- added ---------------------- +c new common blockfor the debugger + common /debug/ deb,breakt(500),brnr,maxbr + logical deb +c deb = true - compilation with the debugger +c breakt - array of static break points +c brnr - index in breakt +c maxbr - maximal number of static break points +cdeb ---------------------------------------- + + character jfname + character int2char + common /jf/ jfname(72), jf + + brnr = 0 + maxbr = 500 + do 10 i=1,maxbr + 10 breakt(i) = 0 +c file na hash, breakt, keys + jfname(jf+1) = 'd' + jfname(jf+2) = 'e' + jfname(jf+3) = 'b' + jfname(jf+4) = int2char(0) + call ffcreat(21, jfname(1)) + return + end + + subroutine addbr(l) + implicit integer(a-z) + +cdeb ----------- added ---------------------- +c new common blockfor the debugger + common /debug/ deb,breakt(500),brnr,maxbr + logical deb +c deb = true - compilation with the debugger +c breakt - array of static break points +c brnr - index in breakt +c maxbr - maximal number of static break points +cdeb ---------------------------------------- + +c wstawia do breakt linie o numerze l + + if(.not. deb) return + do 100 i=1,brnr +c czy juz jest + if(l.eq.breakt(i)) return +100 continue +c nowy punkt lamiacy + if(brnr.ge.maxbr) return +c nadmiarowe punkty lamiace sa ignorowane + brnr = brnr+1 + breakt(brnr) = l + return + end + + subroutine endbr + implicit integer(a-z) + common /BLANK/ com(302), + x hash(8000), dow(13), keys(200), + x rest(2000) + +cdeb ----------- added ---------------------- +c new common blockfor the debugger + common /debug/ deb,breakt(500),brnr,maxbr + logical deb +c deb = true - compilation with the debugger +c breakt - array of static break points +c brnr - index in breakt +c maxbr - maximal number of static break points +cdeb ---------------------------------------- + +c wypisuje na plik 21 tablice hash + call ffwrite_ints(21, hash, 8000) +cps call ffwrite_ints(21, keys, 200) +cps call ffwrite_ints(21, brnr, 1) +cps call ffwrite_ints(21, breakt, brnr) + return + end + +cdeb + + + SUBROUTINE PEND + IMPLICIT INTEGER (A-Z) + logical errflg + integer endmsg(20) + character*40 endms1 + equivalence (endmsg(1), endms1) + COMMON /LISTING/ OUTSTR(265) + COMMON /STREAM/ ERRFLG,LINE,IBUF2(265),IBUF3(7),ON,JUNK(259) + COMMON /BUFF/ INSTR(265),BUFOR(85),LP,LN,MAX,JNK(266) + COMMON /BLANK/ C0M(4) + LOGICAL BTEST + character int2char + data endms1 /'end of parsing -------------------------'/ + LN=LN+1 + call ffwrhex(16, ln) +c + IF (BTEST(C0M(2),15)) GOTO 1 + call ffwrite_char(16, '0') +c + GOTO 2 +1 call ffwrite_char(16, '1') +c +2 CONTINUE + call ffwrite(16, endmsg(1), 40) +c end of line - write CR/LF + call ffwrite_char(16, int2char(13)) + call ffwrite_char(16, int2char(10)) +3 IF (BUFOR(1).EQ.2) RETURN + CALL READIN + GOTO 3 + END + + + + + SUBROUTINE E0 +C ORGANIZATION OF THE STACK: +C STACK(TOP) - STACK TOP FOR THE INVOKING MODULE +C STACK(TOP+1) - NUMBER OF THE INVOKING MODULEY +C STACK(TOP+2) - NUMBER OF THE RETURN POINT TO THE INVOKING MODULE +C THE LOCAL VARIABLES, IF ANY ARE USED IN THE MODULE, ARE ALLOCATED ON THE +C STACK STARTING FROM TOP+3 UP. +C AN INVOKING MODULE HAS TO APPROPRIATELY INCREMENT THE TOP OF THE STACK +C RESPECTING ITS LOCAL VARIABLES, THEN STORE ITS NUMBER AND RETURN POINT +C ON THE STACK AND TRANSFER THE CONTROL TO THE SUPERVISING PROGRAM (RETURN). +C AFTER RETURN FROM THE CALLED PROGRAM THE STACK TOP IS APPROPRIATELY +C RESET BY THE SUPERVISING PROGRAM. +C THE PATTERN OF TRANSFERRING CONTROL: +C NEXT= N - CONTROL TO BE PASSED TO THE MODULE NUMBER N; +C NEXT= 0 - RETURN TO THE CALLER. +C UPON ENTRY TO A SUBPROGRAM +C PARAMETER - KEEPS THE NUMBER OF PLACE FROM WHICH THE COMPUTATIONS HAVE TO +C BE CONTINUED + IMPLICIT INTEGER (A-Z) + COMMON /BLANK/ + $ C0M(4), + O S, ADRES, K, SCOMA, SDOT, SEMICOL, + 1 SCOLON, SLEFT, SRIGHT, SBECOME, STAR, SRELAT, + 2 SEOF, SIDENT, SCONST, SAND, SARRAY, SARROF, + 3 SATTACH, SBEGIN, SBLOCK, SBOOL, SCALL, SCASE, + 4 SCLASS, SCLOSE, SCONS, SCOPY, SCOROUT, SDETACH, + 5 SDIM, SDO, SDOWN, SELSE, SEND, SESAC, + 6 SEXIT, SEXTERN, SFI, SFOR, SFUNCT, SIF, + 7 SINNER, SINPUT, SINT, SKILL, SLOCK, SNEW, + 8 SNONE, SNOT, SOD, SOR, SORIF, SOTHER, + 9 SOUTPUT, SPREF, SPRCD, SQUA, SREAD, SRESUME, + O SRETURN, STEP, STOP, STAKEN, STHEN, STHIS, + A STO, STYPE, SUNIT, SVAR, SVIRTUAL, SWAIT, + B SWHEN, SWHILE, SWRIT, SWRITLN, STRUE, SALL, + C WAND, WARRAY, WASSIGN, WASSCON, WATTACH, WBLOCK, + D WCALL, WCASE, WCASEL, WCOMA, WCNSTB, WCNSTC, + E WCNSTI, WCNSTN, WCNSTR, WCNST, WCOPY, WDETACH, + F WDOT, WDOWNTO, WEOF, WESAC, WFIN, WFIRST, + G WFOREND, WFORVAR, WFROM, WIDENT, WIFFALS, WIFTRUE + + common /BLANK/ + H WINNER, WINSTREND,WJUMP, WKILL, WLABEL, WLEFT, + I WLOCK, WLOW, WLSE, WNEW, WNEWARRAY,WNOT, + J WOPERAT, WOPT, WOR, WOTHER, WPREF, WPRIM, + K WQUA, WREAD, WRELAT, WRESUME, WRETURN, WRIGHT, + L WSTART, WSTEP, WSTOP, WTHIS, WTO, WAIT, + M WRITE, WRITELN, WBOUND, UNICAL, + N COM(132), + O LMEM, LPMEM, IRECN, ISFIN, LPMSYS, LPML, + P LPMF, NRINT, NRRE, NRBOOL, NRCHAR, NRCOR, + Q NRPROC, NRTEXT, NRUNIV, NATTR, NRNONE, NBLSYS, + R NBLUS, NEMPTY, INSYS, LOCAL, OWN, OBJECT, + $ scaner(8735) +cdsw $ SCANER(3735), + + common /BLANK/ + Z TOP, IN, NEXT, STACK(500), + * RESZTA(3652) + STACK(1)=0 + STACK(2)=0 + STACK(3)=0 + TOP=1 +C NOTE: THE FIRST CALL OF E11, I.E. FOR THE MAIN BLOCK, IS NON-STANDARD. +C IN IS ASSIGNED VALUE 5 INSTEAD OF STANDARD (1). THIS FACILITATES +C THE TEXT ANALYSIS OF A PROGRAM WHICH DOESN-T START WITH 'BLOCK'. + IN = 5 + NEXT=11 + IF (S.EQ.70) GOTO 10025 + IF (S.NE.SBLOCK) CALL ERROR(122) + CALL OUTPUT(WBLOCK,ISFIN) + STACK(TOP+4)=0 + GOTO 110 +C E11 IS CALLED WITH THE PARAMETER (TOP+4)=0, WHICH MEANS THAT NO PREFIX +C IS SPECIFIED. E11 ANALYSES THE ENTIRE SYNTACTICAL UNIT. +10 CALL E1 + GOTO 1000 +20 CALL E2 + GOTO 1000 +30 CALL E3 + GOTO 1000 +40 CALL E4 + GOTO 1000 +50 CALL E5 + GOTO 1000 +60 CALL E6 + GOTO 1000 +70 CALL E7 + GOTO 1000 +80 CALL E8 + GOTO 1000 +90 CALL E9 + GOTO 1000 +100 CALL E10 + GOTO 1000 +110 CALL E11 + GOTO 1000 +120 CALL E12 + GOTO 1000 +130 CALL E13 +1000 IN = 1 + IF (NEXT.EQ.0) GOTO 1002 +1001 CONTINUE + GOTO (10,20,30,40,50,60,70,80,90,100,110,120,130),NEXT +1002 IN = STACK(TOP+2) + NEXT = STACK(TOP+1) + TOP = STACK(TOP) + IF (TOP.GT.0) GOTO 1001 +10025 CALL PEND + RETURN + END + + SUBROUTINE E1 +C E1 - RECOGNIZES BOOLEAN EXPRESSION +C LOCAL VARIABLES: +C STACK(TOP+3) - NUMBER OF RECOGNIZED AND-S +C STACK(TOP+4) - NUMBER OF RECOGNIZED OR-S +C STACK(TOP+5) - RELATION CODE +C STACK(TOP+6) - 1 IFF 'NOT' HAS BEEN ENCOUNTERED, 0 IN THE OPPOSITE CASE + IMPLICIT INTEGER (A-Z) + COMMON /BLANK/ + $ C0M(4), + O S, ADRES, K, SCOMA, SDOT, SEMICOL, + 1 SCOLON, SLEFT, SRIGHT, SBECOME, STAR, SRELAT, + 2 SEOF, SIDENT, SCONST, SAND, SARRAY, SARROF, + 3 SATTACH, SBEGIN, SBLOCK, SBOOL, SCALL, SCASE, + 4 SCLASS, SCLOSE, SCONS, SCOPY, SCOROUT, SDETACH, + 5 SDIM, SDO, SDOWN, SELSE, SEND, SESAC, + 6 SEXIT, SEXTERN, SFI, SFOR, SFUNCT, SIF, + 7 SINNER, SINPUT, SINT, SKILL, SLOCK, SNEW, + 8 SNONE, SNOT, SOD, SOR, SORIF, SOTHER, + 9 SOUTPUT, SPREF, SPRCD, SQUA, SREAD, SRESUME, + O SRETURN, STEP, STOP, STAKEN, STHEN, STHIS, + A STO, STYPE, SUNIT, SVAR, SVIRTUAL, SWAIT, + B SWHEN, SWHILE, SWRIT, SWRITLN, STRUE, SALL, + C WAND, WARRAY, WASSIGN, WASSCON, WATTACH, WBLOCK, + D WCALL, WCASE, WCASEL, WCOMA, WCNSTB, WCNSTC, + E WCNSTI, WCNSTN, WCNSTR, WCNST, WCOPY, WDETACH, + F WDOT, WDOWNTO, WEOF, WESAC, WFIN, WFIRST, + G WFOREND, WFORVAR, WFROM, WIDENT, WIFFALS, WIFTRUE + + common /BLANK/ + H WINNER, WINSTREND,WJUMP, WKILL, WLABEL, WLEFT, + I WLOCK, WLOW, WLSE, WNEW, WNEWARRAY,WNOT, + J WOPERAT, WOPT, WOR, WOTHER, WPREF, WPRIM, + K WQUA, WREAD, WRELAT, WRESUME, WRETURN, WRIGHT, + L WSTART, WSTEP, WSTOP, WTHIS, WTO, WAIT, + M WRITE, WRITELN, WBOUND, UNICAL, + N COM(132), + O LMEM, LPMEM, IRECN, ISFIN, LPMSYS, LPML, + P LPMF, NRINT, NRRE, NRBOOL, NRCHAR, NRCOR, + Q NRPROC, NRTEXT, NRUNIV, NATTR, NRNONE, NBLSYS, + R NBLUS, NEMPTY, INSYS, LOCAL, OWN, OBJECT, + $ scaner(8735) +cdsw $ SCANER(3735) + + common /BLANK/ + Z TOP, IN, NEXT, STACK(500), + * RESZTA(3652) +cdsw INTEGER WEOF0,WEOF1,WEOLN0,WEOLN1 +cdsw DATA WEOF0,WEOF1,WEOLN0,WEOLN1/79,80,85,86/ + DATA SEOFSI/60/ + GOTO (10,20,30,40),IN +10 STACK(TOP+4)=0 +411 STACK(TOP+4)=STACK(TOP+4)+1 + IF (STACK(TOP+4).GT.1) CALL SCAN + STACK(TOP+3)=0 +420 STACK(TOP+3)=STACK(TOP+3)+1 + IF (STACK(TOP+3).GT.1) CALL SCAN + STACK(TOP+6)=0 + IF (S.NE.SNOT) GOTO 400 + STACK(TOP+6)=1 + CALL SCAN +400 IF (S.NE.STRUE) GOTO 401 +C A BOOLEAN CONSTANT HAS BEEN ENCOUNTERED. ITS WRITING OUT IS SPLIT +C INTO TWO STAGES BECAUSE THE VALUE TRUE (-1) CANNOT STAND FOR THE +C SECOND PARAMETER OF THE WRITING PROCEDURE (OUTPUT). + CALL OUTPUT(WCNSTB,-1) + CALL OUTPUT(1-ADRES,-1) + CALL SCAN + GOTO 300 +401 IF (S.NE.SEOFSI) GOTO 402 + IF (ADRES.NE.1) ADRES=7 +C 79+7-1=85 + STACK(TOP+5)=SEOFSI+18+ADRES + CALL SCAN + IF (S.NE.SLEFT) GOTO 444 + STACK(TOP+5)=STACK(TOP+5)+1 + CALL SCAN + CALL SLAD(4,1,4) + NEXT=3 + RETURN +C CALL OBJECTEXPRESSION /E3/ +40 IF (S.EQ.SRIGHT) GOTO 430 + CALL ERROR(107) + GOTO 444 +430 CALL SCAN +444 CALL OUTPUT(STACK(TOP+5),-1) + GOTO 300 +C +402 CALL SLAD(4,1,2) + NEXT=2 +C CALL E2 - ARITHMETIC EXPRESSION + RETURN +20 IF (S.NE.SRELAT) GOTO 300 + IF (ADRES.GT.2) GOTO 22 +C RECOGNIZED RELATION IS OR IN + STACK(TOP+5)=ADRES + CALL SCAN + IF (S.EQ.SCOROUT) GOTO 205 + IF (S.EQ.SIDENT) GOTO 21 + CALL ERROR(109) + ADRES=0 + GOTO 21 +205 CALL OUTPUT(WIDENT,K) +C FOR "PROCESS", "COROUTINE" THE HASH ADDRESS IS PASSED BY K + GOTO 215 +21 CALL OUTPUT(WIDENT,ADRES) +215 CALL SCAN + CALL OUTPUT(WRELAT,STACK(TOP+5)) + GOTO 300 +22 STACK(TOP+5)=ADRES + CALL SCAN + CALL SLAD(4,1,3) + NEXT=2 +C NEXT CALL FOR E2 - ARITHMETIC EXPRESSION + RETURN +30 CALL OUTPUT(WRELAT,STACK(TOP+5)) +300 IF (STACK(TOP+6).EQ.1) CALL OUTPUT(WNOT,-1) + IF (STACK(TOP+3).GT.1) CALL OUTPUT(WAND,-1) + IF (S.EQ.SAND) GOTO 420 + IF (STACK(TOP+4).GT.1) CALL OUTPUT(WOR,-1) + IF (S.EQ.SOR) GOTO 411 + NEXT=0 + RETURN + END + SUBROUTINE E2 +C +C E2 - RECOGNIZES ARITHMETIC EXPRESSION +C LOKAL VARIABLES: +C STACK(TOP+3) - MULTIPLICATIVE (HIGHER PRIORITY) OPERATOR +C STACK(TOP+4) - ADDITIVE (LOWER PRIORITY) OPERATOR +C STACK(TOP+5) - CONTAINS 1 IF SIGN CHANGE IS REQUIRED, 0 IF NOT, +C STACK(TOP+6) - CONTAINS 1 IF "ABS" HAS OCCURRED, +C STACK(TOP+7) - KEEPS LOWER/UPPER OPERATOR KIND, +C STACK(TOP+8) - INCLUDES 1 IF THE VARIABLE AFTER LOWER/UPPER IS IN +C PARANTHESES. +C NOTE: THE LAST TWO FIELDS ARE ONLY USED IF THE PERTINET +C OPERATOR HAS BEEN ENCOUNTERED. THUS THIS PROCEDURE MAY +C BE INVOKED WITH DIFFERENT SIZES OF THE AREA FOR LOCAL +C VARIABLES, DEPENDING ON THE CONTENTS. +C + IMPLICIT INTEGER (A-Z) + COMMON /BLANK/ + $ C0M(4), + O S, ADRES, K, SCOMA, SDOT, SEMICOL, + 1 SCOLON, SLEFT, SRIGHT, SBECOME, STAR, SRELAT, + 2 SEOF, SIDENT, SCONST, SAND, SARRAY, SARROF, + 3 SATTACH, SBEGIN, SBLOCK, SBOOL, SCALL, SCASE, + 4 SCLASS, SCLOSE, SCONS, SCOPY, SCOROUT, SDETACH, + 5 SDIM, SDO, SDOWN, SELSE, SEND, SESAC, + 6 SEXIT, SEXTERN, SFI, SFOR, SFUNCT, SIF, + 7 SINNER, SINPUT, SINT, SKILL, SLOCK, SNEW, + 8 SNONE, SNOT, SOD, SOR, SORIF, SOTHER, + 9 SOUTPUT, SPREF, SPRCD, SQUA, SREAD, SRESUME, + O SRETURN, STEP, STOP, STAKEN, STHEN, STHIS, + A STO, STYPE, SUNIT, SVAR, SVIRTUAL, SWAIT, + B SWHEN, SWHILE, SWRIT, SWRITLN, STRUE, SALL, + C WAND, WARRAY, WASSIGN, WASSCON, WATTACH, WBLOCK, + D WCALL, WCASE, WCASEL, WCOMA, WCNSTB, WCNSTC, + E WCNSTI, WCNSTN, WCNSTR, WCNST, WCOPY, WDETACH, + F WDOT, WDOWNTO, WEOF, WESAC, WFIN, WFIRST, + G WFOREND, WFORVAR, WFROM, WIDENT, WIFFALS, WIFTRUE + + common /BLANK/ + H WINNER, WINSTREND,WJUMP, WKILL, WLABEL, WLEFT, + I WLOCK, WLOW, WLSE, WNEW, WNEWARRAY,WNOT, + J WOPERAT, WOPT, WOR, WOTHER, WPREF, WPRIM, + K WQUA, WREAD, WRELAT, WRESUME, WRETURN, WRIGHT, + L WSTART, WSTEP, WSTOP, WTHIS, WTO, WAIT, + M WRITE, WRITELN, WBOUND, UNICAL, + N COM(132), + O LMEM, LPMEM, IRECN, ISFIN, LPMSYS, LPML, + P LPMF, NRINT, NRRE, NRBOOL, NRCHAR, NRCOR, + Q NRPROC, NRTEXT, NRUNIV, NATTR, NRNONE, NBLSYS, + R NBLUS, NEMPTY, INSYS, LOCAL, OWN, OBJECT, + $ scaner(8735) +cdsw $ SCANER(3735), + + common /BLANK/ + Z TOP, IN, NEXT, STACK(500), + * RESZTA(3652) + EQUIVALENCE (WEOF,WSIGN) + DATA SLOWUP,WLOWER /79,64/ + DATA SIGN/58/ +C********************************************************************** +C****** SLOWUP, WLOWER, WUPPER SHOUD BE PUT INTO BLANK +C****** COMMON AT THE NEAREST OPPORTUNITY. +C****** *********** 13.01.1982 ************* +C********************************************************************** + GOTO (10,20,30,40,50),IN +C +C INITIALIZE LOCAL VARIABLES +C +10 STACK(TOP+4)=0 + STACK(TOP+5)=0 + STACK(TOP+6)=0 +C +C CHECK FOR MINUS (-) +C + IF (S.NE.STAR) GOTO 100 + IF (ADRES.GT.4) GOTO 80 + GOTO (100,100,70,75),ADRES +C +C THERE WAS MINUS +C +75 STACK(TOP+5)=1 + GOTO 90 +C +C PLUS (+) ENCOUNTERED +C +70 CALL SCAN + GOTO 100 +C +C THE EXPRESSION STARTS WITH * , / , DIV , MOD +C +80 CALL ERROR(126) +90 CALL SCAN +100 STACK(TOP+3)=0 +C +C START OF ANALYSING A SUM COMPONENT +C +110 IF (STACK(TOP+4).NE.0) CALL SCAN +C +C START OF ANALYSING A MULTIPLICATIVE COMPONENT +C +120 IF (STACK(TOP+3).NE.0) CALL SCAN +C +C CHECK FOR ABS +C + IF (S.NE.STAR) GOTO 122 + IF (ADRES.NE.1) GOTO 122 +C +C ABS ENCOUNTERED +C + STACK(TOP+6)=1 + CALL SCAN +C +C CHECK FOR A CONSTANT, IF AFFIRMATIVE THEN RECOGNIZE ITS TYPE +C +122 IF (S.NE.SCONST) GOTO 130 + GOTO (210,210,125,127,123,128),K +C +C REAL CONSTANT +C +123 CALL OUTPUT(WCNSTR,ADRES) + CALL SCAN + GOTO 180 +C +C INTEGER CONSTANT +C +125 CALL OUTPUT(WCNSTI,ADRES) + CALL SCAN + GOTO 180 +C +C STRING CONSTANT +C +127 CALL OUTPUT(WCNST,ADRES) + GOTO 129 +C +C CHARACTER CONSTANT +C +128 CALL OUTPUT(WCNSTC,ADRES) +129 CALL SCAN +C +C CHECK AGAINST AN OCCURRENCE OF A STRING/CHAR CONSTANT WITHIN AN EXPRESSION +C + IF (STACK(TOP+3)+STACK(TOP+4)+STACK(TOP+5)+STACK(TOP+6).NE.0) + X CALL ERROR(115) + GOTO 210 +C +C CHECK IF THE MULTIPLICATIVE COMPONENT IS AN EXPRESSION +C +130 IF (S.NE.SLEFT) GOTO 160 + CALL SCAN + CALL SLAD(4,2,2) + NEXT=1 + RETURN +C +C CALL E1 - BOOLEAN EXPRESSION +C AFTER RETURN CHECK IF THE EXPRESSION IS TERMINATED BY THEW RIGHT +C PARANTHESIS +C +20 IF (S.EQ.SRIGHT) GOTO 140 + CALL ERROR(101) + GOTO 180 +140 CALL SCAN + GOTO 180 +160 IF (S.EQ.SLOWUP) GOTO 170 + IF (S.EQ.SIGN) GOTO 165 + CALL SLAD(4,2,3) + NEXT=3 +C +C CALL E3 - OBJECTEXPRESSION TO ANALYSE THE VARIABLE +C RETURN TO LABEL 30 BELOW - JUMP OPTIMIZATION +C + RETURN +C +C "SIGN" ENCOUNTERED, ARITHMETIC EXPRESSION SHOULD FOLOW. +C +165 CALL SCAN + CALL SLAD(5,2,5) + NEXT=1 + RETURN +C +C CALL E1 TO ANALYSE THE EXPRESSION +C +50 CALL OUTPUT(WSIGN,-1) + GOTO 180 +C +C LOWER/UPPER HAS BEEN ENCOUNTERED. WE HAVE TO REMEMBER WHICH ONE AND CALL +C OBJECTEXPRESSION TO ANALYSE THE VARIABLE. THE LOCAL VARIABLE FIELD IS +C INCREASED TO 5 VARIABLES. +C +170 STACK(TOP+7)=ADRES + CALL SCAN + STACK(TOP+8)=0 + IF (S.NE.SLEFT) GOTO 172 +C THERE WAS A LEFT PARANTHESIS + STACK(TOP+8)=1 + CALL SCAN +172 CALL SLAD(6,2,4) + NEXT=3 + RETURN +C CALL E3 - OBJECT EXPRESSION, AFTER RETURN THE OPERATOR TYPE +C (LOWER/UPPER) IS TO BE WRITTEN +40 CALL OUTPUT(WLOWER+STACK(TOP+7)-1,-1) + IF (STACK(TOP+8).EQ.0) GOTO 30 + IF (S.EQ.SRIGHT) GOTO 44 +C NO MATCHING RIGHT PARANTHESIS + CALL ERROR(101) + GOTO 30 +44 CALL SCAN +30 CONTINUE +180 IF (STACK(TOP+6).NE.1) GOTO 185 +C +C ABS BEFORE THE MULTIPLICATIVE COMPONENT +C + CALL OUTPUT(WOPERAT,1) + STACK(TOP+6)=0 +185 IF (STACK(TOP+5).NE.1) GOTO 190 +C +C MINUS BEFORE THE MULTIPLICATIVE COMPONENT +C + CALL OUTPUT(WOPERAT,2) + STACK(TOP+5)=0 +190 IF (STACK(TOP+3).NE.0) CALL OUTPUT(WOPERAT,STACK(TOP+3)) + STACK(TOP+3)=0 +C +C AND OF THE ANALYSIS OF THE COMPONENT, CHECK WHETHER MORE COMPONENTS ARE +C EXPECTED, E.G. IF THERE OCCURRS * , / , DIV , MOD +C + IF (S.NE.STAR) GOTO 200 + IF (ADRES.LT.5) GOTO 200 + STACK(TOP+3)=ADRES + GOTO 120 +C +C END OF MULTIPLICATIVE SEQUENCE +C +200 IF (STACK(TOP+4).NE.0) CALL OUTPUT(WOPERAT,STACK(TOP+4)) + STACK(TOP+4)=0 +C +C END OF AN ADDITIVE COMPONENT, CHECK FOR MORE (+,-) +C + IF (S.NE.STAR) GOTO 210 + IF (ADRES.LT.3) GOTO 210 + STACK(TOP+4)=ADRES + GOTO 110 +C +C END OF ADDITIVE SEQUENCE +C +210 NEXT=0 + RETURN + END + diff --git a/sources/pass1/wan2.f b/sources/pass1/wan2.f new file mode 100644 index 0000000..40748be --- /dev/null +++ b/sources/pass1/wan2.f @@ -0,0 +1,1767 @@ +C Loglan82 Compiler&Interpreter +C Copyright (C) 1981-1993 Institute of Informatics, University of Warsaw +C Copyright (C) 1993, 1994 LITA, Pau +C +C This program is free software; you can redistribute it and/or modify +C it under the terms of the GNU General Public License as published by +C the Free Software Foundation; either version 2 of the License, or +C (at your option) any later version. +C +C This program is distributed in the hope that it will be useful, +C but WITHOUT ANY WARRANTY; without even the implied warranty of +C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +C GNU General Public License for more details. File: LICENSE.GNU +C =============================================================== + + subroutine e3 +C E3 - RECOGNIZES OBJECTEXPRESSION +C NO LOCAL VARIABLES + IMPLICIT INTEGER (A-Z) + COMMON /BLANK/ + $ C0M(4), + O S, ADRES, K, SCOMA, SDOT, SEMICOL, + 1 SCOLON, SLEFT, SRIGHT, SBECOME, STAR, SRELAT, + 2 SEOF, SIDENT, SCONST, SAND, SARRAY, SARROF, + 3 SATTACH, SBEGIN, SBLOCK, SBOOL, SCALL, SCASE, + 4 SCLASS, SCLOSE, SCONS, SCOPY, SCOROUT, SDETACH, + 5 SDIM, SDO, SDOWN, SELSE, SEND, SESAC, + 6 SEXIT, SEXTERN, SFI, SFOR, SFUNCT, SIF, + 7 SINNER, SINPUT, SINT, SKILL, SLOCK, SNEW, + 8 SNONE, SNOT, SOD, SOR, SORIF, SOTHER, + 9 SOUTPUT, SPREF, SPRCD, SQUA, SREAD, SRESUME, + O SRETURN, STEP, STOP, STAKEN, STHEN, STHIS, + A STO, STYPE, SUNIT, SVAR, SVIRTUAL, SWAIT, + B SWHEN, SWHILE, SWRIT, SWRITLN, STRUE, SALL, + C WAND, WARRAY, WASSIGN, WASSCON, WATTACH, WBLOCK, + D WCALL, WCASE, WCASEL, WCOMA, WCNSTB, WCNSTC, + E WCNSTI, WCNSTN, WCNSTR, WCNST, WCOPY, WDETACH, + F WDOT, WDOWNTO, WEOF, WESAC, WFIN, WFIRST, + G WFOREND, WFORVAR, WFROM, WIDENT, WIFFALS, WIFTRUE + + common /BLANK/ + H WINNER, WINSTREND,WJUMP, WKILL, WLABEL, WLEFT, + I WLOCK, WLOW, WLSE, WNEW, WNEWARRAY,WNOT, + J WOPERAT, WOPT, WOR, WOTHER, WPREF, WPRIM, + K WQUA, WREAD, WRELAT, WRESUME, WRETURN, WRIGHT, + L WSTART, WSTEP, WSTOP, WTHIS, WTO, WAIT, + M WRITE, WRITELN, WBOUND, UNICAL, + N COM(132), + O LMEM, LPMEM, IRECN, ISFIN, LPMSYS, LPML, + P LPMF, NRINT, NRRE, NRBOOL, NRCHAR, NRCOR, + Q NRPROC, NRTEXT, NRUNIV, NATTR, NRNONE, NBLSYS, + R NBLUS, NEMPTY, INSYS, LOCAL, OWN, OBJECT, + $ scaner(8735) +cdsw $ SCANER(3735), + common /BLANK/ + Z TOP, IN, NEXT, STACK(500), + * RESZTA(3652) + + GOTO (10,20,30,40),IN +10 IF (S.NE.SIDENT) GOTO 200 + CALL SLAD(0,3,2) + STACK(TOP+4)=0 +C PARAMETER VALUE IS ASSIGNED: THERE IS NO "NEW" + NEXT=5 +C E5 - FUNCTION + RETURN +C RETURN TO LABEL 20, RESULTING FROM JUMP OPTIMIZATION. +200 IF (S.NE.STHIS) GOTO 250 + CALL SCAN + IF (S.EQ.SIDENT) GOTO 210 + CALL ERROR(109) + GOTO 300 +210 CALL OUTPUT(WTHIS,ADRES) + CALL SCAN + GOTO 300 +250 IF (S.EQ.SNEW) GOTO 270 + IF (S.NE.SNONE) GOTO 255 + CALL OUTPUT(WCNSTN,-1) + CALL SCAN + GOTO 1000 +255 CALL ERROR(109) + CALL OUTPUT(WIDENT,0) + GOTO 300 +270 STACK(TOP+7)=ADRES + CALL SCAN + IF (S.NE.SIDENT) GOTO 280 + CALL SLAD(0,3,3) + NEXT=5 +C E5 - FUNCTION + RETURN +280 CALL ERROR(109) + CALL OUTPUT(WIDENT,0) +20 CONTINUE +30 CONTINUE +40 CONTINUE +300 IF (S.EQ.SDOT) GOTO 350 + IF (S.NE.SQUA) GOTO 1000 +C QUA + CALL SCAN + IF (S.NE.SIDENT) GOTO 260 + CALL OUTPUT(WQUA,ADRES) + CALL SCAN + IF (S.EQ.SDOT) GOTO 350 + CALL ERROR(114) + GOTO 351 +260 CALL ERROR(109) + GOTO 250 +C DOT +350 CALL SCAN +351 STACK(TOP+7)=0 + IF (S.NE.SNEW) GOTO 380 + STACK(TOP+7)=ADRES + CALL SCAN +380 IF (S.EQ.SIDENT) GOTO 390 + CALL ERROR(109) + GOTO 250 +390 CALL OUTPUT(WDOT,-1) + CALL SLAD(0,3,4) +C RETURN INTO SOME OTHER PLACE + NEXT=5 + RETURN +C E5 - FUNCTION +1000 NEXT=0 + RETURN + END + + SUBROUTINE E4 +C E4 - RECOGNIZES EXPRESSION +C STACK(TOP+3) - NUMBER OF ARRAYOF'S ENCOUNTERED + IMPLICIT INTEGER (A-Z) + COMMON /BLANK/ + $ C0M(4), + O S, ADRES, K, SCOMA, SDOT, SEMICOL, + 1 SCOLON, SLEFT, SRIGHT, SBECOME, STAR, SRELAT, + 2 SEOF, SIDENT, SCONST, SAND, SARRAY, SARROF, + 3 SATTACH, SBEGIN, SBLOCK, SBOOL, SCALL, SCASE, + 4 SCLASS, SCLOSE, SCONS, SCOPY, SCOROUT, SDETACH, + 5 SDIM, SDO, SDOWN, SELSE, SEND, SESAC, + 6 SEXIT, SEXTERN, SFI, SFOR, SFUNCT, SIF, + 7 SINNER, SINPUT, SINT, SKILL, SLOCK, SNEW, + 8 SNONE, SNOT, SOD, SOR, SORIF, SOTHER, + 9 SOUTPUT, SPREF, SPRCD, SQUA, SREAD, SRESUME, + O SRETURN, STEP, STOP, STAKEN, STHEN, STHIS, + A STO, STYPE, SUNIT, SVAR, SVIRTUAL, SWAIT, + B SWHEN, SWHILE, SWRIT, SWRITLN, STRUE, SALL, + C WAND, WARRAY, WASSIGN, WASSCON, WATTACH, WBLOCK, + D WCALL, WCASE, WCASEL, WCOMA, WCNSTB, WCNSTC, + E WCNSTI, WCNSTN, WCNSTR, WCNST, WCOPY, WDETACH, + F WDOT, WDOWNTO, WEOF, WESAC, WFIN, WFIRST, + G WFOREND, WFORVAR, WFROM, WIDENT, WIFFALS, WIFTRUE + + common /BLANK/ + H WINNER, WINSTREND,WJUMP, WKILL, WLABEL, WLEFT, + I WLOCK, WLOW, WLSE, WNEW, WNEWARRAY,WNOT, + J WOPERAT, WOPT, WOR, WOTHER, WPREF, WPRIM, + K WQUA, WREAD, WRELAT, WRESUME, WRETURN, WRIGHT, + L WSTART, WSTEP, WSTOP, WTHIS, WTO, WAIT, + M WRITE, WRITELN, WBOUND, UNICAL, + N COM(132), + O LMEM, LPMEM, IRECN, ISFIN, LPMSYS, LPML, + P LPMF, NRINT, NRRE, NRBOOL, NRCHAR, NRCOR, + Q NRPROC, NRTEXT, NRUNIV, NATTR, NRNONE, NBLSYS, + R NBLUS, NEMPTY, INSYS, LOCAL, OWN, OBJECT, + $ scaner(8735) +cdsw $ SCANER(3735), + common /BLANK/ + Z TOP, IN, NEXT, STACK(500), + * RESZTA(3652) + + GOTO (10,20),IN +10 STACK(TOP+3)=0 + IF (S.NE.SARROF) GOTO 13 +11 STACK(TOP+3)=STACK(TOP+3)+1 + CALL SCAN + IF (S.EQ.SARROF) GOTO 11 +13 IF (S.EQ.SCOROUT) GOTO 15 + IF (S.EQ.SINT) GOTO 16 + NEXT=1 + IF (STACK(TOP+3).GT.0) NEXT=3 + CALL SLAD(1,4,2) + RETURN +C CALL E1 - BOOLEXPRESSION +C OR E3 - OBJECTEXPRESSION +15 CALL OUTPUT(WIDENT,K) +C COROUTINE OR PROCESS ENCOUNTERED + GOTO 19 +16 CALL OUTPUT(WPRIM,ADRES) +19 CALL SCAN +20 IF (STACK(TOP+3).NE.0) CALL OUTPUT(WARRAY,STACK(TOP+3)) + NEXT=0 + RETURN + END + + SUBROUTINE E5 +C E5 - FUNCTION +C STACK(TOP+3) - COUNTS NUMBER OF EXTERNAL PARANTHESES PAIRS +C STACK(TOP+4) - PARAMETR - 0 THERE WAS NO NEW/START +C 1 NEW +C 2 START + IMPLICIT INTEGER (A-Z) + COMMON /BLANK/ + $ C0M(4), + O S, ADRES, K, SCOMA, SDOT, SEMICOL, + 1 SCOLON, SLEFT, SRIGHT, SBECOME, STAR, SRELAT, + 2 SEOF, SIDENT, SCONST, SAND, SARRAY, SARROF, + 3 SATTACH, SBEGIN, SBLOCK, SBOOL, SCALL, SCASE, + 4 SCLASS, SCLOSE, SCONS, SCOPY, SCOROUT, SDETACH, + 5 SDIM, SDO, SDOWN, SELSE, SEND, SESAC, + 6 SEXIT, SEXTERN, SFI, SFOR, SFUNCT, SIF, + 7 SINNER, SINPUT, SINT, SKILL, SLOCK, SNEW, + 8 SNONE, SNOT, SOD, SOR, SORIF, SOTHER, + 9 SOUTPUT, SPREF, SPRCD, SQUA, SREAD, SRESUME, + O SRETURN, STEP, STOP, STAKEN, STHEN, STHIS, + A STO, STYPE, SUNIT, SVAR, SVIRTUAL, SWAIT, + B SWHEN, SWHILE, SWRIT, SWRITLN, STRUE, SALL, + C WAND, WARRAY, WASSIGN, WASSCON, WATTACH, WBLOCK, + D WCALL, WCASE, WCASEL, WCOMA, WCNSTB, WCNSTC, + E WCNSTI, WCNSTN, WCNSTR, WCNST, WCOPY, WDETACH, + F WDOT, WDOWNTO, WEOF, WESAC, WFIN, WFIRST, + G WFOREND, WFORVAR, WFROM, WIDENT, WIFFALS, WIFTRUE + + common /BLANK/ + H WINNER, WINSTREND,WJUMP, WKILL, WLABEL, WLEFT, + I WLOCK, WLOW, WLSE, WNEW, WNEWARRAY,WNOT, + J WOPERAT, WOPT, WOR, WOTHER, WPREF, WPRIM, + K WQUA, WREAD, WRELAT, WRESUME, WRETURN, WRIGHT, + L WSTART, WSTEP, WSTOP, WTHIS, WTO, WAIT, + M WRITE, WRITELN, WBOUND, UNICAL, + N COM(132), + O LMEM, LPMEM, IRECN, ISFIN, LPMSYS, LPML, + P LPMF, NRINT, NRRE, NRBOOL, NRCHAR, NRCOR, + Q NRPROC, NRTEXT, NRUNIV, NATTR, NRNONE, NBLSYS, + R NBLUS, NEMPTY, INSYS, LOCAL, OWN, OBJECT, + $ scaner(8735) +cdsw $ SCANER(3735), + common /BLANK/ + Z TOP, IN, NEXT, STACK(500), + * RESZTA(3652) + + GOTO (10,20,30),IN +10 STACK(TOP+3)=0 + CALL OUTPUT(WIDENT,ADRES) + CALL SCAN + IF (STACK(TOP+4)-1) 15,13,12 +12 CALL OUTPUT(WSTART,-1) + GOTO 15 +13 CALL OUTPUT(WNEW,-1) +15 IF (S.NE.SLEFT) GOTO 1000 + IF (STACK(TOP+3).GE.2) GOTO 1000 +C ANALYSIS OF THE ACTUAL PARAMETER + CALL OUTPUT(WLEFT,-1) + CALL SCAN + CALL SLAD(2,5,2) + NEXT=4 + RETURN +C CALL E4 - EXPRESSION +20 IF (S.NE.SCOMA) GOTO 28 +22 CALL SCAN + CALL OUTPUT(WCOMA,-1) + CALL SLAD(2,5,3) + NEXT=4 + RETURN +C NEXT CALL FOR E4 +30 IF (S.EQ.SCOMA) GOTO 22 +28 IF (S.NE.SRIGHT) CALL ERROR(107) + IF (S.EQ.SRIGHT) CALL SCAN + CALL OUTPUT(WRIGHT,-1) + STACK(TOP+3)=STACK(TOP+3)+1 + GOTO 15 +1000 NEXT=0 + RETURN + END + + SUBROUTINE E6 +C RECOGNIZES THE SEQUENCE V1,V2,V3,. . . ,VN:= EXPR +C OR V1,V2, . . . ,VN := COPY ( OBJECT EXPR. ) +C GENERATES WLSE V1 WLSE . . . WLSE EXPR /WCOPY/ WASSIGN + IMPLICIT INTEGER (A-Z) + COMMON /BLANK/ + $ C0M(4), + O S, ADRES, K, SCOMA, SDOT, SEMICOL, + 1 SCOLON, SLEFT, SRIGHT, SBECOME, STAR, SRELAT, + 2 SEOF, SIDENT, SCONST, SAND, SARRAY, SARROF, + 3 SATTACH, SBEGIN, SBLOCK, SBOOL, SCALL, SCASE, + 4 SCLASS, SCLOSE, SCONS, SCOPY, SCOROUT, SDETACH, + 5 SDIM, SDO, SDOWN, SELSE, SEND, SESAC, + 6 SEXIT, SEXTERN, SFI, SFOR, SFUNCT, SIF, + 7 SINNER, SINPUT, SINT, SKILL, SLOCK, SNEW, + 8 SNONE, SNOT, SOD, SOR, SORIF, SOTHER, + 9 SOUTPUT, SPREF, SPRCD, SQUA, SREAD, SRESUME, + O SRETURN, STEP, STOP, STAKEN, STHEN, STHIS, + A STO, STYPE, SUNIT, SVAR, SVIRTUAL, SWAIT, + B SWHEN, SWHILE, SWRIT, SWRITLN, STRUE, SALL, + C WAND, WARRAY, WASSIGN, WASSCON, WATTACH, WBLOCK, + D WCALL, WCASE, WCASEL, WCOMA, WCNSTB, WCNSTC, + E WCNSTI, WCNSTN, WCNSTR, WCNST, WCOPY, WDETACH, + F WDOT, WDOWNTO, WEOF, WESAC, WFIN, WFIRST, + G WFOREND, WFORVAR, WFROM, WIDENT, WIFFALS, WIFTRUE + + common /BLANK/ + H WINNER, WINSTREND,WJUMP, WKILL, WLABEL, WLEFT, + I WLOCK, WLOW, WLSE, WNEW, WNEWARRAY,WNOT, + J WOPERAT, WOPT, WOR, WOTHER, WPREF, WPRIM, + K WQUA, WREAD, WRELAT, WRESUME, WRETURN, WRIGHT, + L WSTART, WSTEP, WSTOP, WTHIS, WTO, WAIT, + M WRITE, WRITELN, WBOUND, UNICAL, + N COM(132), + O LMEM, LPMEM, IRECN, ISFIN, LPMSYS, LPML, + P LPMF, NRINT, NRRE, NRBOOL, NRCHAR, NRCOR, + Q NRPROC, NRTEXT, NRUNIV, NATTR, NRNONE, NBLSYS, + R NBLUS, NEMPTY, INSYS, LOCAL, OWN, OBJECT, + $ scaner(8735) +cdsw $ SCANER(3735), + common /BLANK/ + Z TOP, IN, NEXT, STACK(500), + * RESZTA(3652) + + GOTO (10,20,30,40),IN +10 CALL OUTPUT(WLSE,-1) + IF (S.NE.SCOMA) GOTO 120 +100 CALL SCAN + CALL SLAD(0,6,2) + NEXT=3 +C CALL OBJECTEXPRESSION + RETURN +20 CALL OUTPUT(WLSE,-1) + IF (S.EQ.SCOMA) GOTO 100 +120 IF (S.NE.SBECOME) CALL ERROR(109) + CALL SCAN + IF (S.NE.SCOPY) GOTO 130 + CALL SCAN + IF (S.NE.SLEFT) GOTO 110 + CALL SCAN + GOTO 111 +110 CALL ERROR(106) +111 CALL SLAD(0,6,3) + NEXT=3 + RETURN +C CALL OBJECTEXPRESSION /E3/ +30 IF (S.NE.SRIGHT) GOTO 112 + CALL SCAN + GOTO 113 +112 CALL ERROR(107) +113 CALL OUTPUT(WCOPY,WASSIGN) + NEXT=0 + RETURN +130 CALL SLAD(0,6,4) + NEXT=1 +C CALL BOOLEXPRESSION + RETURN +40 CONTINUE + CALL OUTPUT(WASSIGN,-1) + NEXT=0 + RETURN + END + + SUBROUTINE E7 + IMPLICIT INTEGER (A-Z) +C +C RECOGNIZES AN ARITHMETIC EXPRESSION COMPOSED OF CONSTANTS +C +C LOCAL VARIABLES: +C STACK(TOP+3) - MULTIPLICATIVE OPERATOR, +C STACK(TOP+4) - ADDITIVE OPERATOR, +C STACK(TOP+5) - 1 = UNARY MINUS FLAG. +C + COMMON /BLANK/ + $ C0M(4), + O S, ADRES, K, SCOMA, SDOT, SEMICOL, + 1 SCOLON, SLEFT, SRIGHT, SBECOME, STAR, SRELAT, + 2 SEOF, SIDENT, SCONST, SAND, SARRAY, SARROF, + 3 SATTACH, SBEGIN, SBLOCK, SBOOL, SCALL, SCASE, + 4 SCLASS, SCLOSE, SCONS, SCOPY, SCOROUT, SDETACH, + 5 SDIM, SDO, SDOWN, SELSE, SEND, SESAC, + 6 SEXIT, SEXTERN, SFI, SFOR, SFUNCT, SIF, + 7 SINNER, SINPUT, SINT, SKILL, SLOCK, SNEW, + 8 SNONE, SNOT, SOD, SOR, SORIF, SOTHER, + 9 SOUTPUT, SPREF, SPRCD, SQUA, SREAD, SRESUME, + O SRETURN, STEP, STOP, STAKEN, STHEN, STHIS, + A STO, STYPE, SUNIT, SVAR, SVIRTUAL, SWAIT, + B SWHEN, SWHILE, SWRIT, SWRITLN, STRUE, SALL, + C WAND, WARRAY, WASSIGN, WASSCON, WATTACH, WBLOCK, + D WCALL, WCASE, WCASEL, WCOMA, WCNSTB, WCNSTC, + E WCNSTI, WCNSTN, WCNSTR, WCNST, WCOPY, WDETACH, + F WDOT, WDOWNTO, WEOF, WESAC, WFIN, WFIRST, + G WFOREND, WFORVAR, WFROM, WIDENT, WIFFALS, WIFTRUE + + common /BLANK/ + H WINNER, WINSTREND,WJUMP, WKILL, WLABEL, WLEFT, + I WLOCK, WLOW, WLSE, WNEW, WNEWARRAY,WNOT, + J WOPERAT, WOPT, WOR, WOTHER, WPREF, WPRIM, + K WQUA, WREAD, WRELAT, WRESUME, WRETURN, WRIGHT, + L WSTART, WSTEP, WSTOP, WTHIS, WTO, WAIT, + M WRITE, WRITELN, WBOUND, UNICAL, + N COM(132), + O LMEM, LPMEM, IRECN, ISFIN, LPMSYS, LPML, + P LPMF, NRINT, NRRE, NRBOOL, NRCHAR, NRCOR, + Q NRPROC, NRTEXT, NRUNIV, NATTR, NRNONE, NBLSYS, + R NBLUS, NEMPTY, INSYS, LOCAL, OWN, OBJECT, + $ scaner(8735) +cdsw $ SCANER(3735), + common /BLANK/ + Z TOP, IN, NEXT, STACK(500), + * RESZTA(3652) + + GOTO (10,20),IN +10 STACK(TOP+3)=0 + STACK(TOP+4)=0 + STACK(TOP+5)=0 + IF (S.NE.STAR) GOTO 100 + IF (ADRES.EQ.4) GOTO 82 + IF (ADRES.EQ.3) GOTO 85 +C MOD, DIV, * ALBO / + CALL ERROR(126) +C MINUS (-) OCCURRS BEFORE EXPRESSION +82 STACK(TOP+5)=1 +C PLUS (+) BEFORE EXPRESSION - IGNORE IT +85 CALL SCAN +C MAIN LOOP +100 IF (S.EQ.SLEFT) GOTO 120 + IF (S.EQ.SIDENT) GOTO 110 + IF (S.NE.SCONST) GOTO 1000 +C CONSTANT - TYPE STILL UNKNOWN + GOTO (1000,1000,101,102,103,102),K +C INTEGER (K=3) +101 CALL OUTPUT(WCNSTI,ADRES) + GOTO 179 +C TEXT (K=4) OR CHAR (K=6) +102 CALL ERROR(115) + CALL OUTPUT(WCNSTI,0) + GOTO 179 +C REAL (K=5) +103 CALL OUTPUT(WCNSTR,ADRES) + GOTO 179 +C IDENTIFIER ENCOUNTERED +110 CALL OUTPUT(WIDENT,ADRES) + GOTO 179 +C LEFT PARANTHESIS ENCOUNTERED (RECURRENCE) +120 CALL SCAN + CALL SLAD(3,7,2) + NEXT=12 + RETURN +C RECURSIVE CALL OF E12 TO ANALYSE THE +C SUBEXPRESSION +20 IF (S.EQ.SRIGHT) GOTO 179 + CALL ERROR(107) + GOTO 1000 +C------------- END OF THE MAIN LOOP +179 CALL SCAN +180 IF (STACK(TOP+5).EQ.0) GOTO 185 +C MINUS BEFORE EXCPRESSION + CALL OUTPUT(WOPERAT,2) + STACK(TOP+5)=0 +185 IF (STACK(TOP+3).NE.0) CALL OUTPUT(WOPERAT,STACK(TOP+3)) + STACK(TOP+3)=0 + IF (S.NE.STAR) GOTO 190 + IF (ADRES.LT.5) GOTO 190 +C MOD, DIV, * OR / - NEXT FACTOR EXPECTED + STACK(TOP+3)=ADRES + GOTO 85 +190 IF (STACK(TOP+4).NE.0) CALL OUTPUT(WOPERAT,STACK(TOP+4)) + STACK(TOP+4)=0 + IF (S.NE.STAR) GOTO 1000 + IF (ADRES.LT.2) GOTO 1000 +C + OR - (MINUS) - NEXT COMPONENT EXPECTED + STACK(TOP+4)=ADRES + GOTO 85 +1000 NEXT=0 + RETURN + END + + SUBROUTINE E8 +C +C RECOGNIZES THE SEQUENCE OF INSTRUCTIONS UNTIL A TERMINAL SYMBOL +C THE PARAMETER IS PASSED BY STACK(TOP+7) +C +C STACK(TOP+3) +C STACK(TOP+4) - NUMBERS OF THE GENERATED LABELS +C . . . OTHERS +C STACK(TOP+7) - A INPUT PARAMETER WHICH DETERMINES THE SET OF THE +C TERMINAL SYMBOLS +C MEANING: +C 1 - INSTRUCTIONS UNTIL WHEN/OTHERS/END +C 2 - .................. ELSE/FI +C 3 - .................. FI +C 4 - .................. OD +C 5 - .................. END +C 6 - .................. WHEN/OTHERWISE/ESAC +C 7 - .................. ESAC +C + IMPLICIT INTEGER (A-Z) + logical errflg + COMMON /STREAM/ ERRFLG,LINE,IBUF2(265),BUF(7),ON,BUFOUT(256), + X POSIT,RECNR,NEKST + COMMON /BUFF/ INSTR(265),BUFOR(85),LP,LN,MAX,JNK(266) + COMMON /BLANK/ + $ C0M(4), + O S, ADRES, K, SCOMA, SDOT, SEMICOL, + 1 SCOLON, SLEFT, SRIGHT, SBECOME, STAR, SRELAT, + 2 SEOF, SIDENT, SCONST, SAND, SARRAY, SARROF, + 3 SATTACH, SBEGIN, SBLOCK, SBOOL, SCALL, SCASE, + 4 SCLASS, SCLOSE, SCONS, SCOPY, SCOROUT, SDETACH, + 5 SDIM, SDO, SDOWN, SELSE, SEND, SESAC, + 6 SEXIT, SEXTERN, SFI, SFOR, SFUNCT, SIF, + 7 SINNER, SINPUT, SINT, SKILL, SLOCK, SNEW, + 8 SNONE, SNOT, SOD, SOR, SORIF, SOTHER, + 9 SOUTPUT, SPREF, SPRCD, SQUA, SREAD, SRESUME, + O SRETURN, STEP, STOP, STAKEN, STHEN, STHIS, + A STO, STYPE, SUNIT, SVAR, SVIRTUAL, SWAIT, + B SWHEN, SWHILE, SWRIT, SWRITLN, STRUE, SALL, + C WAND, WARRAY, WASSIGN, WASSCON, WATTACH, WBLOCK, + D WCALL, WCASE, WCASEL, WCOMA, WCNSTB, WCNSTC, + E WCNSTI, WCNSTN, WCNSTR, WCNST, WCOPY, WDETACH, + F WDOT, WDOWNTO, WEOF, WESAC, WFIN, WFIRST, + G WFOREND, WFORVAR, WFROM, WIDENT, WIFFALS, WIFTRUE + + common /BLANK/ + H WINNER, WINSTREND,WJUMP, WKILL, WLABEL, WLEFT, + I WLOCK, WLOW, WLSE, WNEW, WNEWARRAY,WNOT, + J WOPERAT, WOPT, WOR, WOTHER, WPREF, WPRIM, + K WQUA, WREAD, WRELAT, WRESUME, WRETURN, WRIGHT, + L WSTART, WSTEP, WSTOP, WTHIS, WTO, WAIT, + M WRITE, WRITELN, WBOUND, UNICAL, + N COM(132), + O LMEM, LPMEM, IRECN, ISFIN, LPMSYS, LPML, + P LPMF, NRINT, NRRE, NRBOOL, NRCHAR, NRCOR, + Q NRPROC, NRTEXT, NRUNIV, NATTR, NRNONE, NBLSYS, + R NBLUS, NEMPTY, INSYS, LOCAL, OWN, OBJECT, + $ scaner(8735) +cdsw $ SCANER(3735), + common /BLANK/ + Z TOP, IN, NEXT, STACK(500), + * RESZTA(3652) + +cdsw EQUIVALENCE (AUX,SCANER(3698)) + EQUIVALENCE (AUX,SCANER(8698)) + EQUIVALENCE (WSTART,WUNLOCK) +C******************************************************************* +C*** NOTE ********************************************************** +C*** SMAIN HAS TO BE INSERTED INTO THE BLANK COMMON ON OCCASION *** +C*** OF SOME OTHER CHANGES *********************** 10/11/1981 ****** +C*** WSTART SHOULD BE CHANGED TO WUNLOCK *************************** +C******************************************************************* + smain = 96 + wind = 69 + wwlock = 66 + wwunlock = 67 + sothrs = 57 + wwread = 73 + wreadl = 74 + wioend = 50 + wopen1 = 77 + wopen2 = 78 + wput = 75 + wget = 76 + wparin = 81 + wassem = 84 + wputrec = 89 + wgetrec = 90 +cbc added concurrent statements + wenab = 91 + wdisab = 92 + waccep = 93 + wprend = 94 + senab = 35 +cbc + + GOTO (10,20,30,40,50,60,70,80,90,100,110,120,130,140,150,160, + X170,180,190,200,210,220,230,240,250,260,270,280,290,300,310, + x320,330,340,350,360,370,380),in +cdsw x320,330,340,350),in +cfileX320,330,340),IN +C CHECK WHETHER SYMBOL S MAY START AN INSTRUCTION +6 CALL ERROR(102) +8 CALL SCAN +cbc 10 if(s.gt.34) go to 1111 +10 if (s .gt. 36) goto 1111 + IF (S.GT.0) GOTO 15 + CALL ERROR(102) + GOTO 999 +15 IF (AUX.NE.0) CALL SELOPT + CALL OUTPUT(WINSTREND,LN) + GOTO (101,201,301,401,501,601,701,801,901,1001,1101,1201,1301 + 1,1401,1501,1601,1701,1801,1901,2001,2101,2201,2301,101,2501 + 2,2601,2701,2801,2901,3001,3101,3201,3301,3401,3501,3601),s +cbc 2,2601,2701,2801,2901,3001,3101,3201,3301,3401),s +C----- S = SIDENT - ASSIGNMENT STATEMENT OR OBJECT GENERATOR +101 CONTINUE + CALL SLAD(5,8,12) + NEXT=3 +C CALL OBJECT EXPRESSION /E3/ TO ANALYSE THE VARIABLE + GO TO 7766 +120 CONTINUE + IF (S.EQ.SEMICOL) GOTO 125 + IF (S.EQ.SBECOME) GOTO 111 + IF (S.EQ.SCOMA) GOTO 111 + GOTO 1111 +C INITIAL FRAGMENT OF AN ASSIGNMENT STATEMENT HAS BEEN RECOGNIZED +111 CALL SLAD(5,8,2) + NEXT=6 + GO TO 7766 +C CALL ASSIGNMENT /E6/ +C RETURN TO LABEL 20 BELOW +C /JUMP OPTIMIZATION/ +C +C < VARIABLE > ; IS RECOGNIZED +C CHECK FOR A PENDING NEW OR START +125 IF (STACK(TOP+15).EQ.0) CALL ERROR(123) + GOTO 1000 +C----- S = IF INSTRUCTION: IF EXPR. THEN INSTR. ( ELSE INSTR. ) FI +C STACK(TOP+5)=0 THERT WAS NO ORIF/ANDIF +C =1 THERE WAS ANDIF +C =2 THERE WAS ORIF +C STACK(TOP+4) - LABEL BEHIND THEN OR ELSE +C DEPENDING ON THE CONTENTS OF STACK(TOP+5) +C STACK(TOP+3) - USED TO COUN EXITS FOR THE SEQUENCES:I IF EXPR. THEN EXIT.. +201 STACK(TOP+5)=0 + STACK(TOP+4)=UNICAL + UNICAL=UNICAL+1 +202 CALL SCAN + CALL SLAD(5,8,3) + NEXT=1 + GO TO 7766 +C CAL BOOLEXPRESSION /E1/ +30 IF (S.EQ.SORIF) GOTO 203 + IF (S.EQ.STHEN) GOTO 204 + CALL ERROR(103) + CALL OUTPUT(WLABEL,STACK(TOP+4)) + GOTO 1000 +C CALL ORIF +203 IF (STACK(TOP+5).EQ.0) STACK(TOP+5)=ADRES + IF (STACK(TOP+5).NE.ADRES) CALL ERROR(140) + CALL OUTPUT(WIDENT+ADRES,STACK(TOP+4)) +C IF ANDIF THEN ADRES=1 & WIDENT+ADRES=WIFFALS +C IF ORIF THEN ADRES=2 & WIDENT+ADRES=WIFTRUE + GOTO 202 +204 CALL SCAN +C THEN ENCOUNTERED, CHECK IF THERE WAS ORIF OR ANDIF + IF (STACK(TOP+5).EQ.2) GOTO 215 + IF (STACK(TOP+5).EQ.1) GOTO 214 + STACK(TOP+3)=0 +205 IF (S.NE.SEXIT) GOTO 207 +C EXIT/REPEAT ENCOUNTERED + STACK(TOP+3)=STACK(TOP+3)+1 + IF (ADRES.EQ.2) GOTO 206 + CALL SCAN + GOTO 205 +C (EXIT)+ REPEAT ENCOUNTERED +206 CALL OUTPUT(WIFTRUE,EXYT(STACK(TOP+3),0)) + CALL SCAN + GOTO 208 +C S =/= EXIT +207 IF (STACK(TOP+3).EQ.0) GOTO 214 + CALL OUTPUT(WIFTRUE,EXYT(STACK(TOP+3),1)) +C IF EXPR. THEN (EXIT)+ REPEAT +208 IF (S.EQ.SFI) GOTO 999 + IF (S.EQ.SELSE) GOTO 211 + IF (S.NE.SEMICOL) GOTO 209 + CALL SCAN + GOTO 208 +C THERE ARE INSTRUCTIONS BEHIND EXIT +209 CALL ERROR(139) + CALL SLAD(5,8,29) + NEXT=8 + STACK(TOP+7)=2 + GO TO 7766 +C CALL E8 TO ANALYSE A SEQUENCE OF STATEMENTS ENDED BY ELSE OR FI +290 IF (S.NE.SELSE) GOTO 999 +211 CALL SCAN + CALL SLAD(5,8,30) + NEXT=8 + STACK(TOP+7)=3 + GO TO 7766 +C CALL E8 TO ANALYSE INMSTRUCTIONS AFTER ELSE +300 IF (S.EQ.SFI) GOTO 999 +C A MISSING "FI" IS DIAGNOSED IN SOME OTHER PLACE. HERE WE JUMP TO 1000 +C TO AVOID READING OF THE NEXT INPUT SYMBOL + GOTO 1000 +C +C ANALYSIS FOR IF EXPR. THEN ...... +214 STACK(TOP+3)=STACK(TOP+4) + CALL OUTPUT(WIFFALS,STACK(TOP+3)) + GOTO 217 +C ORIF OCCURRED, A LABEL (FOR ELSE OR FI) HAS TO BE RESERVED +215 STACK(TOP+3)=UNICAL + UNICAL=UNICAL+1 + CALL OUTPUT(WIFFALS,STACK(TOP+3)) + CALL OUTPUT(WLABEL,STACK(TOP+4)) +217 CALL SLAD(5,8,4) + NEXT=8 + STACK(TOP+7)=2 +C A VALUE IS ASSIGNED TO THE PARAMETER OF E8 + GO TO 7766 +C ANALYSIS AFTER THEN +40 IF (S.EQ.SELSE) GOTO 241 + IF (S.NE.SFI) GOTO 271 +C A "FI" UNPRECEDED BY "ELSE" +221 CALL OUTPUT(WLABEL,STACK(TOP+3)) + GOTO 999 +C ELSE ENCOUNTERED, WE SHOULD RESERVE A LABEL TO JUMP BEHIND FI +241 STACK(TOP+4)=UNICAL + UNICAL=UNICAL+1 + CALL SCAN + CALL OUTPUT(WJUMP,STACK(TOP+4)) + CALL OUTPUT(WLABEL,STACK(TOP+3)) + CALL SLAD (5,8,5) + NEXT=8 + STACK(TOP+7)=3 +C PARAMETER FOR E8 + GO TO 7766 +C ANALYSIS OF INSTRUCTIONS AFTER ELSE +50 IF (S.NE.SFI) GOTO 271 + CALL OUTPUT(WLABEL,STACK(TOP+4)) + GOTO 999 +271 CALL ERROR(104) + GOTO 1000 +C----- S = WHILE +301 STACK(TOP+3)=UNICAL + STACK(TOP+4)=UNICAL+1 +C RESERVATION OF LABELS: +C STACK(TOP+3) - BEGINNING OF THE LOOP (THE BOOLEAN CONDITION) +C STACK(TOP+4) - END OF THE LOOP + UNICAL=UNICAL+2 + CALL SCAN + CALL OUTPUT(WLABEL,STACK(TOP+3)) + CALL OUTPUT(WINSTREND,LN) + CALL SLAD(5,8,6) + NEXT=1 + GO TO 7766 +C CALL BOOLEXPRESSION /E1/ +60 CALL OUTPUT(WIFFALS,STACK(TOP+4)) +C CONDITIONAL JUMP BEHIND DO + IF (S.EQ.SDO) GOTO 307 + CALL ERROR(108) + GOTO 309 +307 CALL SCAN +309 CONTINUE + CALL SLAD(5,8,7) + NEXT=8 + STACK(TOP+7)=4 +C PARAMETER PASSING + GO TO 7766 +C ANALYSIS OF THE INTERIOR OF THE DO LOOP /E8/ +70 CALL OUTPUT(WJUMP,STACK(TOP+3)) +C JUMP TO THE BEGINNING OF THE LOOP + CALL OUTPUT(WLABEL,STACK(TOP+4)) + IF (S.EQ.SOD) GOTO 999 + CALL ERROR(105) + GOTO 1000 +C----- S = RETURN +401 CALL OUTPUT(WRETURN,-1) +cbc added enable/disable option + call scan +405 if (s .ne. senab) goto 415 + call output(wenab+adres-1, -1) +410 call scan + if (s .ne. sident) goto 420 + call output(wident, adres) + call scan + if (s .eq. scoma) goto 410 + goto 405 +415 call output(wprend, -1) + goto 1000 +420 call error(109) + goto 1000 +cbc end +C----- S = DETACH +501 CALL OUTPUT(WDETACH,-1) + GOTO 999 +C----- S = INNER +601 CALL OUTPUT(WINNER,-1) + GOTO 999 +C----- S = LOCK +701 STACK(TOP+3)=6 +C FURTHER ANALYSIS AS FOR KILL, RESUME, ETC. + GOTO 1302 +C----- S = READ +801 CALL SCAN + STACK(TOP+3)=0 +C STACK(TOP+3)= 0 - READ +C 1 - READLN + IF (S.EQ.SLEFT) GOTO 803 + CALL ERROR(106) + GOTO 804 +803 CALL SCAN +804 CALL SLAD(5,8,9) + NEXT=3 + GO TO 7766 +C CALL OBJECTEXPRESSION FOR READ( VARIABLE, . . . ,VARIABLE ) +90 CALL OUTPUT(WWREAD,-1) +C CHECK IF END OF THE READ LIST + IF (S.EQ.SCOMA) GOTO 803 +808 IF (S.EQ.SRIGHT) GOTO 810 + CALL ERROR(107) + GOTO 812 +810 CALL SCAN +812 IF (STACK(TOP+3).GT.0) CALL OUTPUT(WREADL,-1) + CALL OUTPUT(WIOEND,-1) + GOTO 1000 +C----- S= CALL +901 CALL SCAN + STACK(TOP+3)=0 +C +C STACK(TOP+3) - 0 - CALL +C 1 - RAISE +C +C --- ADDED CHECK FOR STHIS AND SNEW + IF (S.EQ.SIDENT.OR.S.EQ.STHIS.OR.S.EQ.SNEW) GOTO 905 +C --- + CALL ERROR(109) + GOTO 1000 +905 CALL SLAD(5,8,10) + NEXT=3 + GO TO 7766 +C CALL OBJECTEXPRESSION TO ANALYSE THE EXPRESSION +C WRITE WCALL OR WRAISE DEPENDING ON THE CONTENTS OF STACK(TOP+3) +100 CALL OUTPUT(WCALL+STACK(TOP+3)*64,-1) + GOTO 1000 +C----- S = KILL +1001 STACK(TOP+3)=1 + GOTO 1302 +C----- S = ATTACH +1101 STACK(TOP+3)=2 + GOTO 1302 +C----- S = RESUME +1201 STACK(TOP+3)=3 + GOTO 1302 +C----- S = STOP +1301 STACK(TOP+3)=4 +C THE MEANING OF STACK(TOP+3): +C 1 - KILL +C 2 - ATTACH +C 3 - RESUME +C 4 - STOP +C 5 - WAIT +C 6 - LOCK +C 7 - UNLOCK + CALL SCAN + IF (S.EQ.SLEFT) GOTO 1303 +C STOP WITHOUT PARAMETER + CALL OUTPUT(WSTOP,-1) + GOTO 1000 +1302 CALL SCAN + IF (S.EQ.SLEFT) GOTO 1303 + CALL ERROR(106) + GOTO 1304 +1303 CALL SCAN +1304 IF (S.EQ.SMAIN) GOTO 1320 + CALL SLAD(5,8,11) + NEXT=3 + GO TO 7766 +C CALL OBJECTEXPRESSION. /E3/ TO ANALYSE THE EXPRESSION AFTER +C KILL, ATTACH, RESUME, STOP, WAIT, LOCK +110 IF (S.EQ.SRIGHT) GOTO 1305 + CALL ERROR(107) + GOTO 1306 +1305 CALL SCAN +C JUMP ACCORDING TO THE PREVIOUSLY RECOGNIZED STATEMENT TYPE +1306 K=STACK(TOP+3) + GOTO (1307,1308,1309,1310,1311,1312,1313),K +1307 CALL OUTPUT(WKILL,-1) + GOTO 1000 +1308 CALL OUTPUT(WATTACH,-1) + GOTO 1000 +1309 CALL OUTPUT(WRESUME,-1) + GOTO 1000 +1310 CALL OUTPUT(WSTOP,-1) + GOTO 1000 +1311 CALL OUTPUT(WAIT,-1) + GOTO 1000 +1312 CALL OUTPUT(WWLOCK,-1) + GOTO 1000 +1313 CALL OUTPUT(WWUNLOCK,-1) + GOTO 1000 +C MAIN ENCOUNTERED, CHECK IF THE CONTEXT IS RESUME/ATTACH +1320 IF (STACK(TOP+3).EQ.2) GOTO 1330 + IF (STACK(TOP+3).EQ.3) GOTO 1340 + CALL ERROR(131) + GOTO 1345 +C RECOGNIZED ATTACH(MAIN) +1330 CALL OUTPUT(WIDENT,K) + CALL OUTPUT(WATTACH,-1) + GOTO 1345 +1340 CALL OUTPUT(WIDENT,K) + CALL OUTPUT(WRESUME,-1) +1345 CALL SCAN + IF (S.EQ.SRIGHT) GOTO 999 + CALL ERROR(107) + GOTO 1000 +C----- S = DO +C STACK(TOP+3) - LABEL OF THE BEGINNING OF THE LOOP BODY +C STACK(TOP+4) - LABEL OF THE FIRST STATEMENT BEHIND THE LOOP BODY +1401 STACK(TOP+3)=UNICAL + STACK(TOP+4)=UNICAL+1 + UNICAL=UNICAL+2 + CALL SCAN + CALL OUTPUT(WLABEL,STACK(TOP+3)) + CALL SLAD(5,8,13) + STACK(TOP+7)=4 + NEXT = 8 + GO TO 7766 +C CALL E8 (INSTRUCTION) WITH PARAMETER 4 +130 CALL OUTPUT(WINSTREND,LN) + CALL OUTPUT(WJUMP,STACK(TOP+3)) + CALL OUTPUT(WLABEL,STACK(TOP+4)) + IF (S.EQ.SOD) GOTO 999 + CALL ERROR(105) + GOTO 1000 +C----- S = EXIT +1501 STACK(TOP+3)=0 +1505 STACK(TOP+3)=STACK(TOP+3)+1 + IF (ADRES.EQ.2) GOTO 1550 + CALL SCAN + IF (S.EQ.SEXIT) GOTO 1505 + CALL OUTPUT(WJUMP,EXYT(STACK(TOP+3),1)) + GOTO 1000 +1550 CALL OUTPUT(WJUMP,EXYT(STACK(TOP+3),0)) + GOTO 999 +C----- S = CASE +1601 STACK(TOP+3)=UNICAL+1 + STACK(TOP+4)=UNICAL+162 + STACK(TOP+5)=1 + STACK(TOP+6)=1 + UNICAL=UNICAL+163 +C +C STACK(TOP+3) - BASIC CASE LABEL, NOT USED +C STACK(TOP+4) - END LABEL OF THE CASE STATEMENT +C STACK(TOP+5) - COUNTER OF WHEN'S (NUMBER OF WHEN'S LIMITED BY 160) +C STACK(TOP+6) - 0 = OVERFLOW FLAG (TOO MANY WHEN'S) +C NOTE: THE BASIC LABEL IS RESERVED ESPECIALLY FOR AIL, NOT USED IN HERE. +C LABELS FOR WHEN'S ARE OF THE FORM: BASIS + I , WHERE I = 1 .. 160 +C TOTAL NUMBER OF RESERVED LABELS IS 163. +C + CALL SCAN + CALL SLAD(5,8,26) + NEXT=2 + GO TO 7766 +C CALL E2 - ARITHEXPRESSION TO ANALYSE THE EXPRESSION AFTER CASE +260 CALL OUTPUT(WCASE,STACK(TOP+3)) + IF (S.EQ.SWHEN) GOTO 1605 + CALL ERROR(132) + GOTO 1607 +1605 CALL SCAN +C RECOGNITION OF THE SELECTION LABEL +1607 IF (STACK(TOP+6).EQ.0) GOTO 1621 + IF (S.EQ.SIDENT) GOTO 1610 + IF (S.EQ.SCONST) GOTO 1615 +1608 CALL ERROR(117) + CALL OUTPUT(WIDENT,0) + GOTO 1620 +C IDENTIFIER RECOGNIZED +1610 CALL OUTPUT(WIDENT,ADRES) + GOTO 1620 +C CONSTANT RECOGNIZED +1615 IF (K.EQ.6) GOTO 1618 + IF (K.NE.3) GOTO 1608 +C INTEGER CONSTANT + CALL OUTPUT(WCNSTI,ADRES) + GOTO 1620 +C CHARACTER CONSTANT +1618 CALL OUTPUT(WCNSTC,ADRES) +1620 CALL OUTPUT(WCASEL,STACK(TOP+3)+STACK(TOP+5)) +1621 CALL SCAN + IF (S.EQ.SCOLON) GOTO 1625 + IF (S.NE.SCOMA) GOTO 1623 +C COMA ENCOUNTERED - FURTHER LABEL LIST EXPECTED + CALL SCAN + GOTO 1607 +C NEITHER SEMICOLON NOR COMMA (ERROR AND WE CONTINUE AS FOR +C SEMICOLON - INSTRUCTIONS) +1623 CALL ERROR(118) + GOTO 1626 +C SEMICOLON ENCOUNTERED - INSTRUCTIONS ARE TO BE ANALYSED +1625 CALL SCAN +1626 IF (STACK(TOP+5).NE.161) GOTO 1627 +C TO MANY WHEN'S + CALL ERROR(133) + STACK(TOP+6)=0 + GOTO 1628 +1627 CALL OUTPUT(WLABEL,STACK(TOP+3)+STACK(TOP+5)) + STACK(TOP+5)=STACK(TOP+5)+1 +1628 CALL SLAD(5,8,27) + NEXT=8 + STACK(TOP+7)=6 + GO TO 7766 +C CALL E8 TO ANALYSE THE INSTRUCTION LIST ENDED BY WHEN, OTHERWISE +C OR ESAC (PARAMETER = 6) +270 CALL OUTPUT(WJUMP,STACK(TOP+4)) + IF (S.EQ.SWHEN) GOTO 1605 + IF (S.NE.SOTHER) GOTO 1655 +C OTHERWISE ENCOUNTERED + CALL OUTPUT(WOTHER,-1) + CALL SCAN + CALL SLAD (5,8,28) + NEXT=8 + STACK(TOP+7)=7 + GO TO 7766 +C CALL E8 TO ANALYSE THE INSTRUCTION SEQUENCE ENDED BY ESAC (PARAMETER=7) +C AFTER RETURN JUMP BEHIND CASE IS NOT TO BE GENERATED +280 CONTINUE +C ESAC ENCOUNTERED (A MISSING ESAC IS DIAGNOSED ON SOME OTHER LEVEL). +C HERE, TO PROVIDE CODE CONSISTENCY, WE ASSUME THAT AN ESAC HAS OCCURRED +C ANYWAY. +1655 CALL OUTPUT(WESAC,-1) + CALL OUTPUT(WLABEL,STACK(TOP+4)) + IF (S.EQ.SESAC) GOTO 999 + CALL ERROR(129) + GOTO 1000 +C----- S = FOR +1701 CALL SCAN + CALL SLAD(5,8,21) + NEXT=3 + GO TO 7766 +C CALL E3 T OANALYSE THE VARIABLE +210 CALL OUTPUT(WFORVAR,-1) + IF (S.EQ.SBECOME) GOTO 1703 + CALL ERROR(101) + GOTO 1000 +1703 CALL SCAN + CALL SLAD(5,8,22) + NEXT=2 + GO TO 7766 +C CALL E2 - ARITHEXPRESSION TO ANALYSE BOUNDS +220 CALL OUTPUT(WFROM,-1) + IF (S.NE.STEP) GOTO 1705 + CALL SCAN + CALL SLAD(5,8,23) + NEXT=2 + GO TO 7766 +C CALL E2 TO ANALYZE THE STEP +230 CALL OUTPUT(WSTEP,-1) +1705 IF (S.EQ.STO) GOTO 1707 + IF (S.EQ.SDOWN) GOTO 1709 + CALL ERROR(125) + GOTO 1000 +C STACK(TOP+3)=0 IFF "TO" ENCOUNTERED, OTHERWISE -1 STANDS FOR "DOWNTO" +1707 STACK(TOP+3)=0 + GOTO 1711 +1709 STACK(TOP+3)=1 +1711 CALL SCAN + CALL SLAD(5,8,24) + NEXT=2 + GO TO 7766 +C CALL E2 TO ANALYSE BOUNDS OF THE FOR LOOP +240 IF (STACK(TOP+3).EQ.1) GOTO 1713 + CALL OUTPUT(WTO,-1) + GOTO 1715 +1713 CALL OUTPUT(WDOWNTO,-1) +C STACK(TOP+3) LABEL OF THE END OF THE LOOP (BEFORE OD!) +C STACK(TOP+4) LABEL OF THE FIRST INSTRUCTION BEHIND THE LOOP +C STACK(TOP+5) LABEL OF THE BEGINNING OF THE LOOP +1715 STACK(TOP+3)=UNICAL + STACK(TOP+4)=UNICAL+1 + STACK(TOP+5)=UNICAL+2 + UNICAL=UNICAL+3 + CALL OUTPUT(STACK(TOP+5),STACK(TOP+4)) + IF (S.EQ.SDO) GOTO 1717 + CALL ERROR(108) + GOTO 1000 +1717 CALL SCAN + CALL SLAD(5,8,25) + STACK(TOP+7)=4 + NEXT=8 + GO TO 7766 +C CALL E8 TO ANALYSE THE INSTRUCTION SEQUENCE +C WITH PARAMETER = 4, I.E. "OD" IS THE TERMINAL SYMBOL +250 CALL OUTPUT(WLABEL,STACK(TOP+3)) + CALL OUTPUT(WFOREND,-1) + CALL OUTPUT(WJUMP,STACK(TOP+5)) + CALL OUTPUT(WLABEL,STACK(TOP+4)) + IF (S.EQ.SOD) GOTO 999 + CALL ERROR(105) + GOTO 1000 +C----- S = ARRAY +1801 CALL SCAN + CALL SLAD(5,8,18) + NEXT=3 + GO TO 7766 +C CALL E3 TO ANALYSE THE VARIABLE +180 IF (S.EQ.SDIM) GOTO 1810 + CALL ERROR(124) + GOTO 1000 +1810 CALL SCAN + IF (S.EQ.SLEFT) GOTO 1820 + CALL ERROR(106) + GOTO 1000 +1820 CALL OUTPUT(WLSE,-1) + CALL SCAN + CALL SLAD(5,8,19) + NEXT=2 + GO TO 7766 +C CALL E2 - ARITHEXPRESSION TO ANALYSE BOUNDS OF THE "FOR" +190 CALL OUTPUT(WLOW,-1) + IF (S.EQ.SCOLON) GOTO 1830 + CALL ERROR(118) + GOTO 1000 +1830 CALL SCAN + CALL SLAD(5,8,20) + NEXT=2 + GO TO 7766 +C CALL E2 - ARITHEXPRESSION +200 CALL OUTPUT(WNEWARRAY,-1) + IF (S.EQ.SRIGHT) GOTO 999 + CALL ERROR(107) + GOTO 1000 +C----- S = WRITE +1901 STACK(TOP+6)=0 + CALL SCAN + IF (S.EQ.SLEFT) GOTO 2003 + CALL ERROR(106) + GOTO 1000 +C----- S = WRITELN +2001 STACK(TOP+6)=1 +C STACK(TOP+6) - 0 - THERE WAS WRITE, 1 - THERE WAS WRITELN + CALL SCAN +C CHECK IF THERE ARE PARAMETERS OF WRITELN + IF (S.EQ.SLEFT) GOTO 2003 + CALL OUTPUT(WRITELN,WIOEND) + GOTO 1000 +2003 CALL SCAN + CALL SLAD(5,8,16) + NEXT=4 + GO TO 7766 +C CALL E4 - EXPRESSION TO ANALYSE PARAMETERS OF WRITE(LN)N +C STACK(TOP+5) - INCLUDES NUMBER OF THE EXPRESSIONS USED TO DESCRIBE +C THE OUTPUT FORMAT +160 STACK(TOP+5)=0 +170 IF (S.NE.SCOLON) GOTO 2010 + STACK(TOP+5)=STACK(TOP+5)+1 + IF (STACK(TOP+5).GT.2) GOTO 2015 + CALL SCAN + CALL SLAD(5,8,17) + NEXT=2 + GO TO 7766 +C CALL ARITHEXPRESSION TO ANALYSE FORMATS +C RETURN TO LABEL 170 (OPTIMIZATION) +2010 CALL OUTPUT(WRITE,STACK(TOP+5)) +C CHECK FOR END OF WRITE / WRITELN + IF (S.EQ.SCOMA) GOTO 2003 + IF (S.EQ.SRIGHT) GOTO 2020 +2015 CALL ERROR(107) + GOTO 1000 +C WRITE INFORMATION ABOUT THE OCCURRENCE OF WRITELN +2020 IF (STACK(TOP+6).EQ.1) CALL OUTPUT(WRITELN,-1) + CALL OUTPUT(WIOEND,-1) + GOTO 999 +C----- S = WAIT +2101 STACK(TOP+3)=5 +C ANALYSIS OF WAIT AS FOR KIL, RESUME, AND SO ON. + GOTO 1302 +C----- S = BLOCK +2201 STACK(TOP+5)=0 + CALL OUTPUT(WBLOCK,ISFIN) +C STACK(TOP+5) INCLUDES PREFIX ADDRESS, HERE 0 FOR REGULAR BLOCK, +C JUMP OUT - FURTHER ANALYSIS AS FOR A PREFIXED BLOCK + GOTO 2310 +C----- S = PREF +2301 CALL SCAN + IF (S.EQ.SIDENT) GOTO 2302 + CALL ERROR(109) + GOTO 1000 +C PREFIX ENCOUNTERED - STORE ITS ADDRESS INTO STACK(TOP+5) +2302 STACK(TOP+5)=ADRES + CALL OUTPUT(WPREF,ISFIN) + CALL SCAN + IF (S.EQ.SBLOCK) GOTO 2310 + IF (S.EQ.SLEFT) GOTO 2303 + CALL ERROR(122) + GOTO 1000 +C ANALYSIS OF THE PARAMETERS OF THE PREFIX +2303 CALL OUTPUT(WLEFT,-1) +2304 CALL SCAN + CALL SLAD(5,8,14) + NEXT=4 + GO TO 7766 +C CALL E4 - EXPRESSION TO ANALYSE THE ACTUAL PARAMETERS +C OF THE PREFIX +140 IF (S.EQ.SCOMA) GOTO 2305 + IF (S.EQ.SRIGHT)GOTO 2306 + CALL ERROR(107) + GOTO 1000 +2305 CALL OUTPUT(WCOMA,-1) + GOTO 2304 +2306 CALL SCAN + CALL OUTPUT(WRIGHT,-1) +C COMMON ANALYSIS FOR ALL BLOCKS +C POSITIONS ARE STORED INTO THE INTERMEDIATE CODE +2310 CALL MARK(STACK(TOP+3),STACK(TOP+4)) + STACK(TOP+6)=UNICAL + NEXT=STACK(TOP+5) + CALL SLAD(5,8,15) + STACK(TOP+4)=NEXT +C ASSIGNMENT OF THE PARAMETER'S VALUE - BLOCK PREFIX + NEXT=11 + GO TO 7766 +C CALL E11 TO ANALYSE THE ENTIRE BLOCK +C AFTER RETURN WE RECLAIM THE PLACE FROM WHICH THE INTERMEDIATE CODE FOR +C THE GIVEN BLOCK IS TO BE CONTINUED +150 CALL FIND(STACK(TOP+3),STACK(TOP+4)) + UNICAL=STACK(TOP+6) + CALL OPTOUT + GOTO 1000 +C----- S = UNLOCK +2501 STACK(TOP+3)=7 +C FURTHER ANALYSIS AS FOR KILL, RESUME, ETC. + GOTO 1302 +C----- S = RAISE +2601 STACK(TOP+3)=1 + CALL SCAN + IF (S.EQ.SIDENT) GOTO 905 +C FURTHER ANALYSIS AS FOR CALL (BUT STACK(TOP+3)=1) + CALL ERROR(109) + GOTO 1000 +C----- S = WIND, TERMINATE +2701 CALL OUTPUT(WIND+ADRES-1,-1) + GOTO 999 +C----- S = LASTWILL +2801 IF (STACK(TOP+7).EQ.5) GOTO 1114 + CALL ERROR(143) + GOTO 999 +C----- S = ASSEMBLER +C --- ASSEMBLER INSERTIONS NOT IMPLEMENTED +2901 CALL ERROR(106) +2904 IF (S.EQ.SEND) GOTO 999 + CALL SCAN + GOTO 2904 +330 CALL ERROR(118) + GO TO 2904 +C----- S = OPEN +3001 CALL SCAN + IF (S.EQ.SLEFT) GOTO 3010 + CALL ERROR(106) + GOTO 1000 +3010 CALL SCAN + CALL SLAD(5,8,31) + NEXT=3 + GO TO 7766 +C CALL E3 - OBJECTEXPRESSION TO ANALYSE THE VARIABLE +310 STACK(TOP+3)=WOPEN1 +cfile ----------- added --------------------------- + if(s.ne.scoma) go to 3013 + call scan + call slad(5,8,35) + next = 4 + go to 7766 +c call expression to analyse the second parameter +cfile -------------------------------------------- +350 IF (S.EQ.SRIGHT) GOTO 3025 + IF (S.EQ.SCOMA) GOTO 3015 +3013 CALL ERROR(107) +3014 IF (S.EQ.SEND) GOTO 1000 + CALL SCAN + GOTO 3014 +3015 CALL SCAN + CALL SLAD(5,8,34) + NEXT=4 + GO TO 7766 +C CALL EXPRESSION TO ANALYSE THE THIRD PARAMETER +340 STACK(TOP+3)=WOPEN2 +3025 CALL OUTPUT(STACK(TOP+3),-1) + IF (S.NE.SRIGHT) GOTO 3013 + GOTO 999 +C----- S = PUT/GET +3101 STACK(TOP+3)=WPUT+ADRES-1 +C STACK(TOP+3) - WPUT ALBO WGET + CALL SCAN + IF (S.EQ.SLEFT) GOTO 3110 + CALL ERROR(106) + GOTO 1000 +3110 CALL SCAN +cdsw CALL SLAD(2,8,32) + call slad(5,8,32) + NEXT=3 + GO TO 7766 +C CALL E3 (OBJECTEXPRESSION) TO ANALYSE THE PARAMETER OF PUT/GET +320 CALL OUTPUT(STACK(TOP+3),-1) + IF (S.EQ.SRIGHT) GOTO 3140 + IF (S.EQ.SCOMA) GOTO 3120 + CALL ERROR(107) + GOTO 3180 +3120 CALL SCAN + CALL SLAD(5,8,32) + NEXT=4 + GO TO 7766 +C CALL EXPRESSION TO ANALYSE THE PARAMETER OF PUT/GET +C NOTE: RETURN INTO NON-STANDARD PLACE +3140 CALL SCAN +3180 CALL OUTPUT(WIOEND,-1) + GOTO 1000 +C----- S = READLN +3201 STACK(TOP+3)=1 + CALL SCAN + IF (S.EQ.SLEFT) GOTO 803 + GOTO 812 +cdeb ----------- added -------------- +c------- s = break +3301 call addbr(ln) + go to 999 +cdeb ---------------------------------- +cdsw -- added: +c ----- s = putrec/getrec +3401 addr = adres + stack(top+3) = wput+addr-1 + call scan + if (s .eq. sleft) goto 3410 + call error(106) + goto 1000 +3410 call scan + call slad(5, 8, 36) + next = 3 + goto 7766 +360 if (s .ne. scoma) goto 3420 + call output(stack(top+3), -1) + stack(top+3) = wputrec+addr-1 + call scan + call slad(5, 8, 37) + next = 4 + goto 7766 +370 if (s .ne. scoma) goto 3420 + call scan + call slad(5, 8, 38) + next = 4 + goto 7766 +380 if (s .ne. sright) goto 3013 + call output(stack(top+3), -1) + call output(wioend, -1) + goto 999 +3420 call error(147) + goto 1000 +cdsw -- end +cbc added concurrent statements +c ----- s = enable/disable +3501 call output(wenab+adres-1, -1) +3510 call scan + if (s .ne. sident) goto 3520 + call output(wident, adres) + call scan + if (s .eq. scoma) goto 3510 + call output(wprend, -1) + goto 1000 +3520 call error(109) + goto 1000 +c ----- s = accept +3601 call output(waccep, -1) + call scan + if (s .ne. sident) goto 3620 + call output(wident, adres) + call scan + if (s .eq. scoma) goto 3510 +3620 call output(wprend, -1) + goto 1000 +cbc end +C ----- END OF INSTRUCTIONS ---------------------------------- +999 CALL SCAN +20 CONTINUE +C RETURN FROM ASSIGNMENT /JUMP OPTIMIZATION/ +80 CONTINUE +C LABEL 80 (A GARBAGE FROM THE OLD VERSION OF THE PARSER) +C RETAINED TO PRESERVE THE CONTINUITY OF THE REMAINING LABEL NUMBERS +C (USED TO MARK RETURN POINTS FROM RECURSIVE CALLS) +1000 CONTINUE +C INSTRUCTIONS RECOGNIZED +C CHECK FOR A TERMINAL SYMBOL +1111 IF (S.EQ.SEMICOL) GOTO 8 + IF (S.EQ.SELSE) GOTO 1116 + IF (S.EQ.SFI) GOTO 1115 + IF (S.EQ.SOD) GOTO 1117 + IF (S.EQ.SEND) GOTO 1114 + IF (S.EQ.SOTHER) GOTO 1119 + IF (S.EQ.SOTHRS) GOTO 1120 + IF (S.EQ.SWHEN) GOTO 1119 + IF (S.EQ.SESAC) GOTO 1118 + IF (S.EQ.SVAR) GOTO 1113 + IF (S.EQ.SUNIT) GOTO 1113 + IF (S.EQ.SCONS) GOTO 1113 + IF (S.NE.SEOF) GOTO 6 +1113 CALL ERROR(113) +1114 NEXT=0 + GO TO 7766 +1115 IF (STACK(TOP+7).EQ.3) GOTO 1114 +1116 IF (STACK(TOP+7).EQ.2) GOTO 1114 + CALL ERROR(112) + GOTO 8 +1117 IF (STACK(TOP+7).EQ.4) GOTO 1114 + CALL ERROR(130) + GOTO 8 +1118 IF (STACK(TOP+7).EQ.7) GOTO 1114 + IF (STACK(TOP+7).EQ.6) GOTO 1114 + CALL ERROR(129) + GOTO 8 +1119 IF (STACK(TOP+7).EQ.6) GOTO 1114 + IF (STACK(TOP+7).EQ.1) GOTO 1114 + CALL ERROR(129) + GOTO 8 +1120 IF (STACK(TOP+7).EQ.1) GOTO 1114 + CALL ERROR(129) + GOTO 8 +7766 CONTINUE + RETURN + END + + SUBROUTINE E9 +C +C AUGMENTS THE PROTOTYPE BY THE STARTING PLACE OF THE INTERMEDIATE +C CODE FOR THE PARSED SYNTACTICAL UNIT +C +C STACK(TOP+3) - ENTRY: PROTOTYPE ADDRESS +C CONT.: ENDUNIT LABEL +C STACK(TOP+4) - COPY OF THE PROTOTYPE ADRESS +C + IMPLICIT INTEGER(A-Z) + COMMON /STREAM/ ERRFLG,LINE,IBUF2(265),BUF(7),ON,BUFOUT(256), + X POSIT,RECNR,NEKST + COMMON /BUFF/ INSTR(265),BUFOR(85),LP,LN,MAX,JNK(266) + COMMON /BLANK/ + $ C0M(4), + O S, ADRES, K, SCOMA, SDOT, SEMICOL, + 1 SCOLON, SLEFT, SRIGHT, SBECOME, STAR, SRELAT, + 2 SEOF, SIDENT, SCONST, SAND, SARRAY, SARROF, + 3 SATTACH, SBEGIN, SBLOCK, SBOOL, SCALL, SCASE, + 4 SCLASS, SCLOSE, SCONS, SCOPY, SCOROUT, SDETACH, + 5 SDIM, SDO, SDOWN, SELSE, SEND, SESAC, + 6 SEXIT, SEXTERN, SFI, SFOR, SFUNCT, SIF, + 7 SINNER, SINPUT, SINT, SKILL, SLOCK, SNEW, + 8 SNONE, SNOT, SOD, SOR, SORIF, SOTHER, + 9 SOUTPUT, SPREF, SPRCD, SQUA, SREAD, SRESUME, + O SRETURN, STEP, STOP, STAKEN, STHEN, STHIS, + A STO, STYPE, SUNIT, SVAR, SVIRTUAL, SWAIT, + B SWHEN, SWHILE, SWRIT, SWRITLN, STRUE, SALL, + C WAND, WARRAY, WASSIGN, WASSCON, WATTACH, WBLOCK, + D WCALL, WCASE, WCASEL, WCOMA, WCNSTB, WCNSTC, + E WCNSTI, WCNSTN, WCNSTR, WCNST, WCOPY, WDETACH, + F WDOT, WDOWNTO, WEOF, WESAC, WFIN, WFIRST, + G WFOREND, WFORVAR, WFROM, WIDENT, WIFFALS, WIFTRUE + common /BLANK/ + H WINNER, WINSTREND,WJUMP, WKILL, WLABEL, WLEFT, + I WLOCK, WLOW, WLSE, WNEW, WNEWARRAY,WNOT, + J WOPERAT, WOPT, WOR, WOTHER, WPREF, WPRIM, + K WQUA, WREAD, WRELAT, WRESUME, WRETURN, WRIGHT, + L WSTART, WSTEP, WSTOP, WTHIS, WTO, WAIT, + M WRITE, WRITELN, WBOUND, UNICAL, + N COM(132), + O LMEM, LPMEM, IRECN, ISFIN, LPMSYS, LPML, + P LPMF, NRINT, NRRE, NRBOOL, NRCHAR, NRCOR, + Q NRPROC, NRTEXT, NRUNIV, NATTR, NRNONE, NBLSYS, + R NBLUS, NEMPTY, INSYS, LOCAL, OWN, OBJECT, + $ scaner(8735) +cdsw $ SCANER(3735), + common /BLANK/ + Z TOP, IN, NEXT, STACK(500), + * RESZTA(3652) + DIMENSION IPMEM(7890) + EQUIVALENCE (SCANER(1),IPMEM(1)) + DATA SLASTW/28/ + DATA WLASTW/72/ + + GOTO (10,20,30),IN +10 STACK(TOP+4)=STACK(TOP+3) + UNICAL=1 + NRRE=STACK(TOP+4) +C PROTOTYPE ADDRESS IS MOVED TO VARIABLE NRRE TO SPARE SOME CODE +C CHECK IF ANYTHING HAS BEEN SENT TO THE INTERMEDIATE CODE + IF (IPMEM(NRRE-3).NE.0) GOTO 15 + IPMEM(NRRE-3)=RECNR + IPMEM(NRRE-2)=POSIT +15 STACK(TOP+3)=UNICAL + UNICAL=UNICAL+1 + CALL OUTPUT(WFIRST,LN) + IF (S.EQ.SBEGIN) CALL SCAN + CALL OPTOUT + IF (S.EQ.SEND) GOTO 22 + CALL SLAD(2,9,2) + NEXT=8 + STACK(TOP+7)=5 + RETURN +C CALL E8 - INSTRUCTIONS +C PARAMETER = 5 /AN INSTRUCTION SEQUENCE +C TERMINATED BY END / +20 IF (S.NE.SLASTW) GOTO 22 +C LASTWILL OCCURRED - END OF CODE SHOULD BE ASSUMED AND THE PARSING SHOULD +C CONTINUE. END-LABEL IS TO BE CHANGED! + CALL OUTPUT(WLASTW,STACK(TOP+3)) + CALL OUTPUT(LN,-1) + STACK(TOP+3)=UNICAL + UNICAL=UNICAL+1 +21 CALL SCAN + IF (S.EQ.SCOLON) CALL SCAN + CALL SLAD(2,9,3) + NEXT=8 + STACK(TOP+7)=5 + RETURN +C CALL E8 TO ANALYSE INSTRUCTIONS AFTER LASTWILL +30 IF (S.EQ.SLASTW) GOTO 32 +22 CALL OUTPUT(WFIN,STACK(TOP+3)) + CALL OUTPUT(LN,-1) + NEXT = 0 + RETURN +32 CALL ERROR(144) + GOTO 21 + END + + SUBROUTINE E10 + IMPLICIT INTEGER (A-Z) +C +C RECOGNIZES SEQUENCE OF DECLARATIONS +C UPDATES THE PROTOTYPE WHOSE ADDRESS IS PASSED BY +C BY STACK(TOP+3) +C CREATES LISTS OF CONSTANTS; FOR ENUMERATION CONSTANTS CREATES DESCRIPTIONS +C INCLUDING NAMES OF THE CONSTANTS AND THE NUMBERS OF THEIR DECLARATION LINES. +C STACK(TOP+4) - STACK(TOP+5) - DESCRIBE THE PLACE IN THE INTERMEDIATE +C CODE IN THE CASE WHEN THE SUBMODULE INSTRUCTIONS HAVE TO BE WRITTEN +C AFTER AN OCCURRENCE OF ENUMERATION CONSTANTS. +C N O T E: THE MEANING OF THE PROTOTYPE WORD #-1 IS CHANGED. IT INCLUDES: +C 0 - THERE ARE NO ENUMERATION CONSTANTS +C -1 - CONSTANTS ARE WRITTEN INTO, WORKING FILE LEFT OK +C 1 - THE CONSTANTS ARE FOLLOWED BY THE CODE FOR SUBMODULES +C +C +C------------------------------------------------------------------- +C CONSTANT LIST ITEM: +C +C 0 ! NAME +C ---+------------------------ +C +1 ! DECL. LINE NUMBERA +C ---+------------------------ +C +2 ! TYPE NUMBER +C ---+------------------------ +C +3 ! 0 (ZERO) +C ---+------------------------ +C +4 ! ADDRESS IN DICTIONARY OR VALUE +C ---+------------------------ +C +5 ! THE NEXT ITEM +C ---+------------------------ +C +C------------------------------------------------------------------------ +C SIGNAL LIST ITEM:: +C +C ----+------------------- +C 0 ! KIND +C ----+------------------- +C +1 ! LINE NUMBER IN THE SOURCE TEXT +C ----+------------------- +C +2 ! NAME +C ----+------------------- +C +3 ! THE NEXT ITEM IN THE LIST +C ----+------------------- +C +4 ! FORMAL PARAMETER LIST +C ----+------------------- +C +C WHERE KIND = +C 9 - SIGNAL CONSTRUCTED PROPERLY +C 10 - SIGNAL WITH A FAULTY PARAMETER LIST +C + COMMON /BLANK/ + $ C0M(4), + O S, ADRES, K, SCOMA, SDOT, SEMICOL, + 1 SCOLON, SLEFT, SRIGHT, SBECOME, STAR, SRELAT, + 2 SEOF, SIDENT, SCONST, SAND, SARRAY, SARROF, + 3 SATTACH, SBEGIN, SBLOCK, SBOOL, SCALL, SCASE, + 4 SCLASS, SCLOSE, SCONS, SCOPY, SCOROUT, SDETACH, + 5 SDIM, SDO, SDOWN, SELSE, SEND, SESAC, + 6 SEXIT, SEXTERN, SFI, SFOR, SFUNCT, SIF, + 7 SINNER, SINPUT, SINT, SKILL, SLOCK, SNEW, + 8 SNONE, SNOT, SOD, SOR, SORIF, SOTHER, + 9 SOUTPUT, SPREF, SPRCD, SQUA, SREAD, SRESUME, + O SRETURN, STEP, STOP, STAKEN, STHEN, STHIS, + A STO, STYPE, SUNIT, SVAR, SVIRTUAL, SWAIT, + B SWHEN, SWHILE, SWRIT, SWRITLN, STRUE, SALL, + C WAND, WARRAY, WASSIGN, WASSCON, WATTACH, WBLOCK, + D WCALL, WCASE, WCASEL, WCOMA, WCNSTB, WCNSTC, + E WCNSTI, WCNSTN, WCNSTR, WCNST, WCOPY, WDETACH, + F WDOT, WDOWNTO, WEOF, WESAC, WFIN, WFIRST, + G WFOREND, WFORVAR, WFROM, WIDENT, WIFFALS, WIFTRUE + common /BLANK/ + H WINNER, WINSTREND,WJUMP, WKILL, WLABEL, WLEFT, + I WLOCK, WLOW, WLSE, WNEW, WNEWARRAY,WNOT, + J WOPERAT, WOPT, WOR, WOTHER, WPREF, WPRIM, + K WQUA, WREAD, WRELAT, WRESUME, WRETURN, WRIGHT, + L WSTART, WSTEP, WSTOP, WTHIS, WTO, WAIT, + M WRITE, WRITELN, WBOUND, UNICAL, + N COM(132), + O LMEM, LPMEM, IRECN, ISFIN, LPMSYS, LPML, + P LPMF, NRINT, NRRE, NRBOOL, NRCHAR, NRCOR, + Q NRPROC, NRTEXT, NRUNIV, NATTR, NRNONE, NBLSYS, + R NBLUS, NEMPTY, INSYS, LOCAL, OWN, OBJECT, + $ scaner(8735) +cdsw $ SCANER(3735), + common /BLANK/ + Z TOP, IN, NEXT, STACK(500), + * RESZTA(3652) + +cdsw INTEGER IPMEM(1000) + dimension ipmem(7890) + COMMON /STREAM/ ERRFLG,LINE,IBUF2(265),BUF(7),ON,BUFOUT(256), + X POSIT,RECNR,NEKST + COMMON /BUFF/ INSTR(265),BUFOR(85),LP,LN,MAX,JNK(266) + EQUIVALENCE (SCANER(1),IPMEM(1)) + DATA SIGNAL/56/ + DATA SHANDL/55/ + +C RECOGNITION OF DECLARATIONS + GOTO (10,20,30),IN +30 CONTINUE +10 IF (S.EQ.SCONS) GOTO 200 + IF (S.EQ.SVAR) GOTO 110 + IF (S.EQ.SUNIT) GOTO 125 + IF (S.EQ.SIGNAL) GOTO 500 + IF (S.EQ.SHANDL) GOTO 1000 + IF (S.EQ.SBEGIN) GOTO 1000 + IF (S.EQ.SEND) GOTO 1000 + IF (S.EQ.70) GOTO 1000 + IF ((S.GT.1).AND.(S.LT.25)) GOTO 1000 + IF (S.NE.SEMICOL) CALL ERROR(127) + IF (S.EQ.SBECOME) GOTO 1000 +15 CALL SCAN + GOTO 10 +C CHECK FOR FURTHER CONSTANT DECLARATIONS (COMMA) +C---------- VARIABLES +110 I=1 + J=0 +111 CALL SCAN + IF (S.EQ.SIDENT) GOTO 112 + CALL ERROR(109) + GOTO 10 +112 J=J+1 + K=I+J + IF (K.GT.132) CALL ERROR(197) +C THE IDENTIFIER IS APPENDED TO THE LIST OF VARIABLES IN ARRAY COM. +C THE LIMIT FOR THE LENGTH OF THAT LIST IS 132. EXCEEDING THIS LIMIT +C CAUSES PARSER ERROR 137. + COM(K)=ADRES +C NOTE: K IS USED ABOVE + CALL SCAN + IF (S.EQ.SCOMA) GOTO 111 + IF (S.EQ.SCOLON) GOTO 113 + CALL ERROR(118) + GOTO 10 +113 CALL SCAN + CALL ADDVAR(COM(2),J) + +C CHECK FOR MORE DECLARATIONS OF VARIABLES (COMMA) + IF (S.EQ.SCOMA) GOTO 110 + IF (S.EQ.SBEGIN) GOTO 1000 + IF (S.EQ.SEND) GOTO 1000 + IF (S.EQ.SEMICOL) GOTO 15 + CALL ERROR(102) + GOTO 10 +C---------- SUBMODULE +125 NRRE=STACK(TOP+3)-1 + IF (IPMEM(NRRE).GE.0) GOTO 128 +C ENUMERATION CONSTANTS ARE ALREADY WRTITTEN INTO THE INTERMEDIATE CODE + IPMEM(NRRE)=1 + CALL MARK(STACK(TOP+4),STACK(TOP+5)) +128 CALL SLAD(3,10,3) + CALL SCAN + NEXT=11 + RETURN +C CALL E11 - SYNTACTIC UNIT - MODULE +C RETURN TO THE BEGINNING (JUMP OPTIMIZATION) +C---------- CONSTANT +200 CALL SCAN + IF (S.EQ.SIDENT) GOTO 202 + CALL ERROR(109) + GOTO 10 +202 STACK(TOP+6)=ADRES + CALL SCAN + IF ((S.EQ.SRELAT).AND.(ADRES.EQ.3)) GOTO 205 + CALL ERROR(116) + GOTO 10 +C "CONST IDENT =" ENCOUNTERED +205 CALL SCAN +C RESERVATION OF IPMEM SPACE FOR THE CONSTANT DESCRIPTION + LPMF=LPMF-6 + IF (LPMF.LT.LPML) CALL ERROR(199) + IPMEM(LPMF+1)=STACK(TOP+6) + IPMEM(LPMF+2)=LN + NRRE=STACK(TOP+3)+4 + IPMEM(LPMF+6)=IPMEM(NRRE) + IPMEM(NRRE)=LPMF+1 +C RECOGNITION OF THE TYPE + IF (S.EQ.STRUE) GOTO 300 + IF (S.NE.SCONST) GOTO 300 + IF (K.EQ.4) GOTO 250 + IF (K.NE.6) GOTO 300 +C CHARACTER CONSTANT (K=6) + IPMEM(LPMF+3)=16 + GOTO 260 +C TEXT CONSTANT (K=4) +250 IPMEM(LPMF+3)=48 +260 IPMEM(LPMF+5)=ADRES + CALL SCAN + GOTO 350 +C EXPRESSION ?? +300 NRRE=STACK(TOP+3)-1 + IF (IPMEM(NRRE).EQ.0) GOTO 310 +C ANYTHING WRITTEN INTO INTERMEDIATE CODE ? + IF (IPMEM(NRRE).EQ.-1) GOTO 325 +C YES BUT A SUBMODULE HAS BEEN WRITTEN + CALL FIND(STACK(TOP+4),STACK(TOP+5)) +C THE PLACE IN THE INTERTMEDIATE CODE HAS BEEN FOUND + IPMEM(NRRE)=-1 + GOTO 325 +C THE INITIAL INSTRUCTIONS OF THE INTERMEDIATE CODE +310 IPMEM(NRRE)=-1 + IPMEM(NRRE-1)=POSIT + IPMEM(NRRE-2)=RECNR +325 CALL OUTPUT(WINSTREND,LN) + CALL OUTPUT(WIDENT,STACK(TOP+6)) + CALL OUTPUT(WLSE,-1) + CALL SLAD(3,10,2) + NEXT=12 + RETURN +C CALL E12 TO ANALYSE THE EXPRESSION +20 CALL OUTPUT(WASSCON,-1) +350 IF (S.EQ.SCOMA) GOTO 200 + IF (S.EQ.SBEGIN) GOTO 1000 + IF (S.EQ.SEND) GOTO 1000 + IF (S.EQ.SEMICOL) GOTO 15 + CALL ERROR(102) + GOTO 10 +1000 NRRE=STACK(TOP+3)-1 + + IF (IPMEM(NRRE).LE.0) GOTO 1010 +C SUBMODULES WERE PRECEDED BY ENUMERATION CONSTANTS - THE BEGINNING +C OF CODE HAS TO BE FOUND + CALL FIND(STACK(TOP+4),STACK(TOP+5)) +1010 NEXT=0 + RETURN +C---------- SIGNAL DECLARATION +500 CALL SCAN + IF (S.EQ.SIDENT) GOTO 505 + CALL ERROR(109) + GOTO 10 +C CREATION OF THE SIGNAL DESCRIPTION +505 LPMF=LPMF-5 + IF (LPMF.LT.LPML) CALL ERROR(199) + IPMEM(LPMF+1)=9 + IPMEM(LPMF+2)=LN + IPMEM(LPMF+3)=ADRES +C THE SYNTACTIC FATHER IS APPENDED TO THE LIST OF SIGNALS (PROTOTYPE WORD #4) + NRCOR=STACK(TOP+3)-4 + NRCHAR=IPMEM(NRCOR) + IPMEM(NRCOR)=LPMF+1 + IPMEM(LPMF+4)=NRCHAR +C THE SIGNAL DESCRIPTION IS CREATED AND APPENDED + CALL SCAN + IF (S.EQ.SCOMA) GOTO 500 + IF (S.EQ.SEMICOL) GOTO 15 + IF (S.EQ.SLEFT) GOTO 508 + CALL ERROR(102) + GOTO 10 +c +cdsw&bc 508 STACK(TOP+5)=LPMF+1 +c CALL ADDPAR(STACK(TOP+5)+4,STACK(TOP+5)) +508 continue + call addpar(lpmf+5, lpmf+1) +cdsw&bc + IF (S.EQ.SRIGHT) GOTO 510 + CALL ERROR(107) + GOTO 10 +510 CALL SCAN + IF (S.EQ.SCOMA) GOTO 500 + IF (S.EQ.SEMICOL) GOTO 15 + CALL ERROR(102) + GOTO 10 + END + diff --git a/sources/pass1/wan3.f b/sources/pass1/wan3.f new file mode 100644 index 0000000..c7f74a4 --- /dev/null +++ b/sources/pass1/wan3.f @@ -0,0 +1,1573 @@ +C Loglan82 Compiler&Interpreter +C Copyright (C) 1981-1993 Institute of Informatics, University of Warsaw +C Copyright (C) 1993, 1994 LITA, Pau +C +C This program is free software; you can redistribute it and/or modify +C it under the terms of the GNU General Public License as published by +C the Free Software Foundation; either version 2 of the License, or +C (at your option) any later version. +C +C This program is distributed in the hope that it will be useful, +C but WITHOUT ANY WARRANTY; without even the implied warranty of +C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +C GNU General Public License for more details. File: LICENSE.GNU +C =============================================================== + + SUBROUTINE E11 + IMPLICIT INTEGER (A-Z) +C +C RECOGNIZES SYNTACTICAL UNIT - CREATES THE PROTOTYPE +C STACK(TOP+3) - ADDRESS OF THE CURRENT PROTOTYPE +C INITIALLY 1 FOR VIRTUAL, 0 OTHERWISE +C STACK(TOP+4) - UNIT NAME +C FOR A BLOCK - ITS PREFIX SEND FROM E8 +C STACK(TOP+5) - PREFIX (IF ONE OCCURRED) +C STACK(TOP+6) - PROTOTYPE NUMBER +C +C---------------------------------------------------------------------- +C PROTOTYPE - STRUCTURE: +C +C -5 ! NOT USED +C ----+------------------------ +C -4 ! SIGNAL LIST +C ----+------------------------ +C -3 ! INTERMEDIATE CODE BLOCK NUMBER +C ----+------------------------ +C -2 ! INTERMEDIATE CODE WORD NUMBER IN A BLOCK +C ----+------------------------ +C -1 ! 0 = NO ENUMERATION CONSTANTS +C ----+------------------------ +C 0 ! KIND +C ----+------------------------ +C +1 ! SL - NUMBER IN ISDICT +C ----+------------------------ +C +2 ! PREFIX - NAME +C ----+------------------------ +C +3 ! VARIABLE LIST +C ----+------------------------ +C +4 ! CONSTANT LIST +C ----+------------------------ +C +5 ! CLASS LIST +C ----+------------------------ +C +6 ! THE LIST OF BLOCKS, FUNCTIONS AND PROCEDURES +C ----+------------------------ +C +7 ! TAKEN LIST +C ----+------------------------ +C +8 ! SYSTEM PREFIX +C ----+------------------------ +C +9 ! SOURCE TEXT LINE NUMBER +C ----+------------------------ +C REMAINDER FOR FUNCTIONS, PROCEDURES AND CLASSES +C ----+------------------------ +C +10 ! NAME +C ----+------------------------ +C +11 ! FORMAL PARAMETER LIST +C ----+------------------------ +C REMAINDER FOR FUNCTIONS REMAINDER FOR CLASSES +C ----+------------------------ ----+----------------- +C +12 ! NAME OF RESULT TYPE +12 ! HIDDEN LIST +C ----+------------------------ ----+----------------- +C +13 ! NUMBER OF ARRAYOF'S +13 ! CLOSE LIST +C ----+------------------------ ----+----------------- +C +C WHERE KIND = +C 1 - BLOCK +C 2 - CLASS/COROUTINE/PROCESS +C 3 - PROCEDURE +C 4 - FUNCTION +C 5 - "3" WITH ERRONEOUS PARAMETER LIST +C 6 - "4" " " " " +C 7 - "2" " " " " +C SYSTEM PREFIX = +C 2 - PROCESS +C 1 - COROUTINE +C 0 - OTHER +C THE SYSTEM PREFIX IS AUGMENTED BY +C 2**13 - IF INSTRUCTIONS ARE PRESENT +C 2**14 - FOR SPECIFICATION TAKEN NONE +C 2**15 - FOR SPECIFICATION VIRTUAL +C +C LIST ITEM FOR TAKEN, CLOSE, HIDDEN: +C +C 0 ! NAME +C ---+-------------------------- +C +1 ! OCCURRENCE LINE NUMBER IN THE SOURCE TEXT +C ---+-------------------------- +C +2 ! THE NEXT ITEM +C ---+-------------------------- +C +C SUBMODULE LIST ITEM: +C +C 0 ! PROTOTYPE NUMBER IN THE DICTIONARY +C ---+-------------------------- +C +1 ! THE NEXT ELEMENT +C +C + COMMON /BLANK/ + $ C0M(4), + O S, ADRES, K, SCOMA, SDOT, SEMICOL, + 1 SCOLON, SLEFT, SRIGHT, SBECOME, STAR, SRELAT, + 2 SEOF, SIDENT, SCONST, SAND, SARRAY, SARROF, + 3 SATTACH, SBEGIN, SBLOCK, SBOOL, SCALL, SCASE, + 4 SCLASS, SCLOSE, SCONS, SCOPY, SCOROUT, SDETACH, + 5 SDIM, SDO, SDOWN, SELSE, SEND, SESAC, + 6 SEXIT, SEXTERN, SFI, SFOR, SFUNCT, SIF, + 7 SINNER, SINPUT, SINT, SKILL, SLOCK, SNEW, + 8 SNONE, SNOT, SOD, SOR, SORIF, SOTHER, + 9 SOUTPUT, SPREF, SPRCD, SQUA, SREAD, SRESUME, + O SRETURN, STEP, STOP, STAKEN, STHEN, STHIS, + A STO, STYPE, SUNIT, SVAR, SVIRTUAL, SWAIT, + B SWHEN, SWHILE, SWRIT, SWRITLN, STRUE, SALL, + C WAND, WARRAY, WASSIGN, WASSCON, WATTACH, WBLOCK, + D WCALL, WCASE, WCASEL, WCOMA, WCNSTB, WCNSTC, + E WCNSTI, WCNSTN, WCNSTR, WCNST, WCOPY, WDETACH, + F WDOT, WDOWNTO, WEOF, WESAC, WFIN, WFIRST, + G WFOREND, WFORVAR, WFROM, WIDENT, WIFFALS, WIFTRUE + + common /BLANK/ + H WINNER, WINSTREND,WJUMP, WKILL, WLABEL, WLEFT, + I WLOCK, WLOW, WLSE, WNEW, WNEWARRAY,WNOT, + J WOPERAT, WOPT, WOR, WOTHER, WPREF, WPRIM, + K WQUA, WREAD, WRELAT, WRESUME, WRETURN, WRIGHT, + L WSTART, WSTEP, WSTOP, WTHIS, WTO, WAIT, + M WRITE, WRITELN, WBOUND, UNICAL, + N COM(132), + O LMEM, LPMEM, IRECN, ISFIN, LPMSYS, LPML, + P LPMF, NRINT, NRRE, NRBOOL, NRCHAR, NRCOR, + Q NRPROC, NRTEXT, NRUNIV, NATTR, NRNONE, NBLSYS, + R NBLUS, NEMPTY, INSYS, LOCAL, OWN, OBJECT, + $ scaner(8735) +cdsw $ SCANER (3735), + common /BLANK/ + Z TOP, IN, NEXT, STACK(500), + * RESZTA(3652) + + DIMENSION IPMEM(7890) + EQUIVALENCE (IPMEM(1),SCANER(1)) + COMMON /BUFF/ INSTR(265),BUFOR(85),LP,LN,MAX,JNK(266) +C NOTE: FOR THE MAIN BLOCK THE ENTRY IS NON-STANDARD - IN=4 JUMP TO +C LABEL 1 + LOGICAL BTEST + DATA SHANDL/55/ + +C ORIGINAL GOTO-STATEMENT *********************************************** +C GOTO (1,200,300,400,0),IN ************************ 03.01.84 +C CHANGED TO *********************************************** + GOTO (1,200,300,400,1),IN +C BECAUSE LABEL 0 IS UNDEFINED *********************************************** +1 STACK(TOP+3)=0 + STACK(TOP+5)=0 + STACK(TOP+6)=ISFIN + ISFIN=ISFIN-1 +C CHECK FOR THE MAIN BLOCK (I.E. IF IN = 5) + IF (IN.EQ.5) GOTO 1460 + IF (S.EQ.SBLOCK) GOTO 15 +C UNIT + IF (S.NE.SVIRTUAL) GOTO 3 + STACK(TOP+3)=1 + CALL SCAN +3 IF (S.NE.SIDENT) GOTO 3010 + STACK(TOP+4)=ADRES + CALL SCAN + GOTO 3030 +C NAME MISSING +3010 CALL ERROR(109) + STACK(TOP+4)=0 +3030 IF (S.NE.SCOLON) GOTO 3050 + CALL SCAN + GOTO 3080 +C COLON MISSING +3050 CALL ERROR(118) +3080 IF (S.NE.SIDENT) GOTO 5 +C PREFIX PRESENT + STACK(TOP+5)=ADRES + CALL SCAN +C RECOGNITION OF THE UNIT KIND +5 IF (S.EQ.SFUNCT) GOTO 10 + IF (S.EQ.SPRCD) GOTO 12 + IF (S.EQ.SCLASS) GOTO 14 + IF (S.EQ.SCOROUT) GOTO 16 + CALL ERROR(119) +C UNKNOWN KIND +C IF NAME WAS PRESENT ASSUME PROCEDURE + IF (STACK(TOP+4).NE.0) GOTO 12 +207 NEXT=0 + RETURN +10 LPMF=LPMF-19 + IPMEM(LPMF+6)=4 + GOTO 20 +12 LPMF=LPMF-17 + IPMEM(LPMF+6)=3 + GOTO 20 +14 LPMF=LPMF-19 + IPMEM(LPMF+6)=2 + IPMEM(LPMF+14)=0 + GOTO 20 +1460 IF (S.NE.SEMICOL) GOTO 1480 + CALL SCAN + GOTO 1460 +1480 IF (BTEST(C0M(2),14)) GOTO 2795 +15 LPMF=LPMF-15 + IF (STACK(TOP+1).EQ.10) CALL ERROR(119) + IPMEM(LPMF+6)=1 + IF (LPMF.LT.LPML) CALL ERROR(199) + STACK(TOP+3)=LPMF+6 + NEXT=STACK(TOP+3) +C A LOCAL USAGE OF VARIABLE NEXT + IPMEM(NEXT+9)=LN + IPMEM(NEXT+2)=STACK(TOP+4) +C PREFIX SENT FROM E8 + GOTO 262 +16 LPMF=LPMF-19 + IPMEM(LPMF+6)=2 + IPMEM(LPMF+14)=ADRES +C THE PROTOTYPE IS ALREADY CREATED +20 CONTINUE + IF (LPMF.LT.LPML) CALL ERROR(199) + IF (STACK(TOP+3).EQ.1) + * IPMEM(LPMF+14)=IBSET(IPMEM(LPMF+14),15) +C STARTING FROM THIS POINT STACK(TOP+3) +C INCLUDES PROTOTYPE ADDRESS + STACK(TOP+3)=LPMF+6 + NEXT=STACK(TOP+3) +C A LOCAL USAGE OF VARIABLE NEXT + IPMEM(NEXT+9)=LN + IPMEM(NEXT+10)=STACK(TOP+4) + IPMEM(NEXT+2)=STACK(TOP+5) + CALL SCAN +C +C ANALYSIS OF THE FORMAL PARAMETERS +C + IF (S.NE.SLEFT) GOTO 2050 + CALL ADDPAR(STACK(TOP+3)+11,STACK(TOP+3)) + IF (S.EQ.SRIGHT) CALL SCAN +2050 NEXT=STACK(TOP+3) +C NEXT LOCAL USAGE OF VARIABLE NEXT +C JUMP OUT IF NOT A FUNCTION + IF (IPMEM(NEXT).NE.4) GOTO 25 + IF (S.NE.SCOLON) GOTO 2080 + CALL SCAN + GOTO 2090 +C COLON MISSING - ERROR +2080 CALL ERROR(118) +2090 STACK(TOP+4)=0 + IF (S.NE.SARROF) GOTO 22 +21 STACK(TOP+4)=STACK(TOP+4)+1 + CALL SCAN + IF (S.EQ.SARROF) GOTO 21 +C FUNCTION TYPE ? +22 IPMEM(NEXT+13)=STACK(TOP+4) + IF (S.EQ.SINT) IPMEM(NEXT+12)=ADRES*8 + IF (S.EQ.SCOROUT) IPMEM(NEXT+12)=K + IF (S.EQ.SIDENT) IPMEM(NEXT+12)=ADRES + IF (IPMEM(NEXT+12).EQ.0) GOTO 2250 + CALL SCAN + GOTO 25 +C TYPE MISSING - ERROR +2250 CALL ERROR(109) +25 IF (S.EQ.SEMICOL) GOTO 262 + CALL ERROR(102) +C SEMICOLON EXPECTED +262 NRRE=STACK(TOP+6) + IPMEM(NRRE)=NEXT +C PROTOTYPE ADDRESS IS PUT INTO THE DICTIONARY + IN=TOP +265 IN=STACK(IN) +C JUMP OUT FOR THE MAIN BLOCK + IF (IN.EQ.0) GOTO 275 + IF (STACK(IN+1).EQ.13) GOTO 266 + IF (STACK(IN+1).NE.11) GOTO 265 +C AN E11 (SYNTACTIC UNIT) OR E13 (HANDLER) OBJECT BEING THE SYNTACTIC FATHER +C OF THE CURRENT OBJECT HAS BEEN FOUND WITHIN THE DL-CHAIN. +C E11 - MOVE PROTOTYPE ADDRESS TO STACK('PERTINENT' TOP + 3) + IN = STACK(IN) + NRRE = STACK(IN+3)+6 + GOTO 267 +C E13 - MOVE PROTOTYPE ADDRESS TO STACK('PERTINENT' TOP + 4) +266 IN=STACK(IN) + NRRE = STACK(IN+4)+6 +267 IPMEM(NEXT+1)=STACK(IN+6) + LPMF=LPMF-2 +C UPDATE THE SUBMODULE LIST FOR THE FATHER + IF (LPMF.LT.LPML) CALL ERROR(199) + IF ((IPMEM(NEXT).EQ.2).OR.(IPMEM(NEXT).EQ.7)) NRRE=NRRE-1 + IPMEM(LPMF+2)=IPMEM(NRRE) + IPMEM(NRRE)=LPMF+1 + IPMEM(LPMF+1)=STACK(TOP+6) + GOTO 285 +275 IPMEM(NEXT+1)=0 + IF (S.NE.SBLOCK) GOTO 287 +285 CALL SCAN +287 IF (S.NE.STAKEN) GOTO 35 + CALL SCAN + IF (S.EQ.SEMICOL) GOTO 29 +27 IF (S.NE.SIDENT) GOTO 2805 + LPMF=LPMF-3 + IF (LPMF.LT.LPML) CALL ERROR(199) + IPMEM(LPMF+1)=ADRES + IPMEM(LPMF+2)=LN + IPMEM(LPMF+3)=IPMEM(NEXT+7) + IPMEM(NEXT+7)=LPMF+1 + CALL SCAN + IF (S.NE.SCOMA) GOTO 28 + CALL SCAN + GOTO 27 +C ADD THE SYSPP SYSTEM PREFIX +2795 CONTINUE + STACK(TOP+3)=LPMF+23 + STACK(TOP+6)=ISFIN+1 + CALL SCAN + GOTO 36 +28 IF (S.EQ.SEMICOL) GOTO 30 +2805 CALL ERROR(102) + GOTO 35 +29 IPMEM(NEXT+8)=IBSET(IPMEM(NEXT+8),14) +30 CALL SCAN +35 IF (S.EQ.SCLOSE) GOTO 350 +36 NEXT=STACK(TOP+3) + CALL SLAD(4,11,2) + STACK(TOP+3)=NEXT + NEXT=10 + RETURN +C CALL E10 TO ANALYSE THE DECLARATION SEQUENCE +200 IF (S.EQ.SHANDL) GOTO 380 +203 NEXT=STACK(TOP+3) + IF (S.EQ.SBEGIN) GOTO 210 + IF (S.EQ.SEND) GOTO 212 + IF (S.LT.1) GOTO 205 + IF (S.GT.24) GOTO 205 + CALL ERROR(134) + GOTO 210 +205 IF (S.EQ.SBECOME) GOTO 210 + IF (IPMEM(NEXT-1).EQ.0) GOTO 209 +C ENUMERATION CONSTANTS OCCURRED - END CODE + CALL OUTPUT(WFIRST,LN) + CALL OUTPUT(WFIN,1) + CALL OUTPUT(LN,-1) +209 CALL ERROR(113) + GOTO 207 +210 IPMEM(NEXT+8)=IBSET(IPMEM(NEXT+8),13) +212 CALL SLAD(4,11,3) + STACK(TOP+3)=NEXT + NEXT=9 + RETURN +C CALL E9 TO ANALYSE THE INSTRUCTION SEQUENCE +C E9 FILLS UP WORDS -1,-2,-3 FOR THE PROTOTYPE WHOSE +C ADDRESS IS PASSED THROUGH STACK(TOP+3) +C +300 IF (TOP.EQ.1) GOTO 207 +C +C IF IT WAS THE MAIN BLOCK JUMP OUT TO 207 +C + CALL SCAN + NEXT=STACK(TOP+3) +C +C A LOCAL USAGE OF VARIABLE NEXT - IT INCLUDES THE PROTOTYPE ADDRESS. +C CHECK IF THE PARSED UNIT WAS A BLOCK. IF SO THEN JUMP OUT AND TERMINATE +C PARSING. OTHERWISE CHECK WHETHER "END" IS FOLLOWED BY AN IDENTIFIER +C + IF (IPMEM(NEXT).EQ.1) GOTO 207 + IF (S.NE.SIDENT) GOTO 207 +C +C "END" IS FOLLOWED BY AN IDENTIFIER. WE HAVE TO CHECK WHETHER +C IT MATCHES THE IDENTIFIER FROM THE PROTOTYPE. +C + NEXT=NEXT+10 + IF (ADRES.EQ.IPMEM(NEXT)) GOTO 308 + CALL ERROR(128) + GOTO 207 +C NAME IS OK +308 CALL SCAN + GOTO 207 +3460 CALL ERROR(102) + GOTO 3485 +3470 CALL ERROR(109) + GOTO 3485 +3480 CALL ERROR(121) + CALL SCAN +C LOOK FOR A REASONABLE SYMBOL +3485 IF (S.EQ.SBEGIN) GOTO 200 + IF (S.EQ.SEND) GOTO 212 + IF (S.EQ.SUNIT) GOTO 35 + IF (S.EQ.SVAR) GOTO 35 + IF (S.EQ.SCONS) GOTO 35 + IF (S.EQ.SCLOSE) GOTO 350 + IF (S.EQ.70) GOTO 207 + IF (S.EQ.1) GOTO 3488 + IF (S.LT.25) GOTO 200 +3488 CALL SCAN + GOTO 3485 +350 NRRE=STACK(TOP+3) + IF ((IPMEM(NRRE).NE.2).AND.(IPMEM(NRRE).NE.7)) GOTO 3480 +351 STACK(TOP+4)=ADRES + CALL SCAN + IF (S.NE.SCLOSE) GOTO 355 + IF (ADRES.EQ.STACK(TOP+4)) CALL ERROR(120) + GOTO 365 +C HIDDEN OR PROTECTED ENCOUNTERED +355 IF (S.NE.SIDENT) GOTO 3470 + LPMF=LPMF-3 + IF (LPMF.LT.LPML) CALL ERROR(199) + IPMEM(LPMF+1)=ADRES + IPMEM(LPMF+2)=LN + NEXT=STACK(TOP+3)+STACK(TOP+4)+11 + IPMEM(LPMF+3)=IPMEM(NEXT) + IPMEM(NEXT)=LPMF+1 + CALL SCAN + IF (S.EQ.SEMICOL) GOTO 30 + IF (S.NE.SCOMA) GOTO 3460 + CALL SCAN + GOTO 355 +C HIDDEN PROTECTED ENCOUNTERED +365 CALL SCAN + IF (S.NE.SIDENT) GOTO 3470 + LPMF=LPMF-6 + IF (LPMF.LT.LPML) CALL ERROR(199) + IPMEM(LPMF+1)=ADRES + IPMEM(LPMF+4)=ADRES + IPMEM(LPMF+2)=LN + IPMEM(LPMF+5)=LN + NEXT=STACK(TOP+3)+12 + IPMEM(LPMF+3)=IPMEM(NEXT) + IPMEM(NEXT)=LPMF+1 + IPMEM(LPMF+6)=IPMEM(NEXT+1) + IPMEM(NEXT+1)=LPMF+4 + CALL SCAN + IF (S.EQ.SEMICOL) GOTO 30 + IF (S.NE.SCOMA) GOTO 3460 + GOTO 365 +C HANDLER ENCOUNTERED +380 NEXT=STACK(TOP+3) +C PROTOTYPE ADDRESS IS SAVED + IF (IPMEM(NEXT-1).NE.0) CALL MARK(STACK(TOP+4),STACK(TOP+5)) + CALL SLAD(4,11,4) + NEXT=13 + RETURN +C CALL E13 TO ANALYSE THE HANDLER +400 NEXT=STACK(TOP+3) + IF (IPMEM(NEXT-1).NE.0) CALL FIND(STACK(TOP+4),STACK(TOP+5)) + CALL SCAN +C SKIP THE SEQUENCE "END HANDLERS(;)" +C END HANDLERS (;) + IF (S.EQ.SHANDL) CALL SCAN + IF (S.EQ.SEMICOL) CALL SCAN + GOTO 203 + END + + SUBROUTINE E12 + IMPLICIT INTEGER (A-Z) +C +C RECOGNIZES BOOLEAN EXPRESSIONS BUILT UP OF CONSTANTS +C +C LOCAL VARIABLES: +C STACK(TOP+3) - INCLUDES 1 WHEN "AND" IS TO BE WRITTEN +C STACK(TOP+4) - ........ 1 .... "OR" .. .. .. ....... +C STACK(TOP+5) - ........ 1 .... "NOT" .. .. .. ....... +C STACK(TOP+6) - INCLUDES RELATION CODE (SOMETIMES) +C + COMMON /BLANK/ + $ C0M(4), + O S, ADRES, K, SCOMA, SDOT, SEMICOL, + 1 SCOLON, SLEFT, SRIGHT, SBECOME, STAR, SRELAT, + 2 SEOF, SIDENT, SCONST, SAND, SARRAY, SARROF, + 3 SATTACH, SBEGIN, SBLOCK, SBOOL, SCALL, SCASE, + 4 SCLASS, SCLOSE, SCONS, SCOPY, SCOROUT, SDETACH, + 5 SDIM, SDO, SDOWN, SELSE, SEND, SESAC, + 6 SEXIT, SEXTERN, SFI, SFOR, SFUNCT, SIF, + 7 SINNER, SINPUT, SINT, SKILL, SLOCK, SNEW, + 8 SNONE, SNOT, SOD, SOR, SORIF, SOTHER, + 9 SOUTPUT, SPREF, SPRCD, SQUA, SREAD, SRESUME, + O SRETURN, STEP, STOP, STAKEN, STHEN, STHIS, + A STO, STYPE, SUNIT, SVAR, SVIRTUAL, SWAIT, + B SWHEN, SWHILE, SWRIT, SWRITLN, STRUE, SALL, + C WAND, WARRAY, WASSIGN, WASSCON, WATTACH, WBLOCK, + D WCALL, WCASE, WCASEL, WCOMA, WCNSTB, WCNSTC, + E WCNSTI, WCNSTN, WCNSTR, WCNST, WCOPY, WDETACH, + F WDOT, WDOWNTO, WEOF, WESAC, WFIN, WFIRST, + G WFOREND, WFORVAR, WFROM, WIDENT, WIFFALS, WIFTRUE + + common /BLANK/ + H WINNER, WINSTREND,WJUMP, WKILL, WLABEL, WLEFT, + I WLOCK, WLOW, WLSE, WNEW, WNEWARRAY,WNOT, + J WOPERAT, WOPT, WOR, WOTHER, WPREF, WPRIM, + K WQUA, WREAD, WRELAT, WRESUME, WRETURN, WRIGHT, + L WSTART, WSTEP, WSTOP, WTHIS, WTO, WAIT, + M WRITE, WRITELN, WBOUND, UNICAL, + N COM(132), + O LMEM, LPMEM, IRECN, ISFIN, LPMSYS, LPML, + P LPMF, NRINT, NRRE, NRBOOL, NRCHAR, NRCOR, + Q NRPROC, NRTEXT, NRUNIV, NATTR, NRNONE, NBLSYS, + R NBLUS, NEMPTY, INSYS, LOCAL, OWN, OBJECT, + $ scaner(8735) +cdsw $ SCANER(3735), + common /BLANK/ + Z TOP, IN, NEXT, STACK(500), + * RESZTA(3652) + + GOTO (10,20,30),IN +10 STACK(TOP+3)=0 + STACK(TOP+4)=0 + STACK(TOP+5)=0 +80 IF (S.NE.SNOT) GOTO 100 +C NOT OCCURRED + STACK(TOP+5)=1 +85 CALL SCAN +C MAIN LOOP +100 IF (S.EQ.STRUE) GOTO 130 +C THERE SHOULD BE AN IDENTIFIER + CALL SLAD(4,12,2) + NEXT=7 + RETURN +C CALL E7 - TO ANALYSE ARITHEXPRESSION +20 IF (S.NE.SRELAT) GOTO 200 +C '=' OCCURRED (OR SOMETHING ALIKE) +C IT SHOULD BE STORED IN STACK (TOP+6) +115 STACK(TOP+6)=ADRES + CALL SCAN + CALL SLAD(4,12,3) + NEXT=7 + RETURN +C ARTITHEXPRESSION CALLED AGAIN +30 CALL OUTPUT(WOPERAT,STACK(TOP+6)) + GOTO 200 +C LOGICAL CONSTANT +130 CALL OUTPUT(WCNSTB,-1) + CALL OUTPUT(1-ADRES,-1) +C END OF MAIN LOOP +195 CALL SCAN +200 IF (STACK(TOP+5).EQ.0) GOTO 205 + CALL OUTPUT(WNOT,-1) + STACK(TOP+5)=0 +205 IF (STACK(TOP+3).EQ.0) GOTO 210 + CALL OUTPUT(WAND,-1) + STACK(TOP+3)=0 +210 IF (S.NE.SAND) GOTO 220 + STACK(TOP+3)=1 + CALL SCAN + GOTO 80 +220 IF (STACK(TOP+4).EQ.0) GOTO 230 + CALL OUTPUT(WOR,-1) + STACK(TOP+4)=0 +230 IF (S.NE.SOR) GOTO 1000 + STACK(TOP+4)=1 + CALL SCAN + GOTO 80 +1000 NEXT=0 + RETURN + END + + SUBROUTINE E13 + IMPLICIT INTEGER (A-Z) +C RECOGNIZES HANDLER, BUILDS UP ITS PROTOTYPE +C LOKAL VARIABLES: +C STACK(TOP+3) - END-OF-CODE LABEL +C STACK(TOP+4) - HANDLER PROTOTYPE ADDRESS +C STACK(TOP+5) - INCLUDES 1 IF "OTHERS" OCCURRED +C STACK(TOP+6) - PROTOTYPE NUMBER +C THE FOLLOWING BLANK-COMMON VARIABLES ARE USED AS LOCAL ONES: +C NRCHAR - HEAD OF THE CREATED LIST OF NAMES +C NRCOR +C NRRE +C NRBLUS +C +C---------------------------------------------------------------------- +C HANDLER PROTOTYPE: +C +C ----+------------------- +C -5 ! NOT USED +C ----+------------------- +C -4 ! NOT USED +C ----+------------------- +C -3 ! SCRATCH FILE CODE RECORD NUMBER +C ----+------------------- +C -2 ! NUMBER OF WORD IN THE CODE RECORD +C ----+------------------- +C -1 ! NOT USED +C ----+------------------- +C 0 ! KIND = 8 +C ----+------------------- +C +1 ! SL - NUMBER IN ISDICT +C ----+------------------- +C +2 ! NOT USED +C ----+------------------- +C +3 ! NOT USED +C ----+------------------- +C +4 ! NOT USED +C ----+------------------- +C +5 ! NOT USED +C ----+------------------- +C +6 ! SUBBLOCK LIST +C ----+------------------- +C +7 ! NOT USED +C ----+------------------- +C +8 ! NOT USED +C ----+------------------- +C +9 ! SOURCE TEXT LINE NUMBER +C ----+------------------- +C +10 ! LIST OF NAMES +C ----+------------------- +C +C NAME LIST ITEM: +C +C ----+------------------- +C 0 ! NAME +C ----+------------------- +C +1 ! NEXT ITEM POINTER +C ----+------------------- +C +C NOTE ! EMPTY LIST OF NAMES CORRESPONDS TO THE PROTOTYPE OF A HANDLER +C FOR "OTHERS" +C + COMMON /STREAM/ ERRFLG,LINE,IBUF2(265),BUF(7),ON,BUFOUT(256), + X POSIT,RECNR,NEKST + COMMON /BUFF/ INSTR(265),BUFOR(85),LP,LN,MAX,JNK(266) + COMMON /BLANK/ + $ C0M(4), + O S, ADRES, K, SCOMA, SDOT, SEMICOL, + 1 SCOLON, SLEFT, SRIGHT, SBECOME, STAR, SRELAT, + 2 SEOF, SIDENT, SCONST, SAND, SARRAY, SARROF, + 3 SATTACH, SBEGIN, SBLOCK, SBOOL, SCALL, SCASE, + 4 SCLASS, SCLOSE, SCONS, SCOPY, SCOROUT, SDETACH, + 5 SDIM, SDO, SDOWN, SELSE, SEND, SESAC, + 6 SEXIT, SEXTERN, SFI, SFOR, SFUNCT, SIF, + 7 SINNER, SINPUT, SINT, SKILL, SLOCK, SNEW, + 8 SNONE, SNOT, SOD, SOR, SORIF, SOTHER, + 9 SOUTPUT, SPREF, SPRCD, SQUA, SREAD, SRESUME, + O SRETURN, STEP, STOP, STAKEN, STHEN, STHIS, + A STO, STYPE, SUNIT, SVAR, SVIRTUAL, SWAIT, + B SWHEN, SWHILE, SWRIT, SWRITLN, STRUE, SALL, + C WAND, WARRAY, WASSIGN, WASSCON, WATTACH, WBLOCK, + D WCALL, WCASE, WCASEL, WCOMA, WCNSTB, WCNSTC, + E WCNSTI, WCNSTN, WCNSTR, WCNST, WCOPY, WDETACH, + F WDOT, WDOWNTO, WEOF, WESAC, WFIN, WFIRST, + G WFOREND, WFORVAR, WFROM, WIDENT, WIFFALS, WIFTRUE + + common /BLANK/ + H WINNER, WINSTREND,WJUMP, WKILL, WLABEL, WLEFT, + I WLOCK, WLOW, WLSE, WNEW, WNEWARRAY,WNOT, + J WOPERAT, WOPT, WOR, WOTHER, WPREF, WPRIM, + K WQUA, WREAD, WRELAT, WRESUME, WRETURN, WRIGHT, + L WSTART, WSTEP, WSTOP, WTHIS, WTO, WAIT, + M WRITE, WRITELN, WBOUND, UNICAL, + N COM(132), + O LMEM, LPMEM, IRECN, ISFIN, LPMSYS, LPML, + P LPMF, NRINT, NRRE, NRBOOL, NRCHAR, NRCOR, + Q NRPROC, NRTEXT, NRUNIV, NATTR, NRNONE, NBLSYS, + R NBLUS, NEMPTY, INSYS, LOCAL, OWN, OBJECT, + $ scaner(8735) +cdsw $ SCANER(3735), + common /BLANK/ + Z TOP, IN, NEXT, STACK(500), + * RESZTA(3652) + + DIMENSION IPMEM(1000) + EQUIVALENCE (IPMEM(1),SCANER(1)) +cdsw EQUIVALENCE (AUX,SCANER(3698)) + EQUIVALENCE (AUX,SCANER(8698)) + EQUIVALENCE (WSTART,WUNLOCK) + DATA SOTHRS/57/ + + GOTO (10,20),IN +10 NRCHAR=0 + STACK(TOP+5)=0 + CALL SCAN + IF (S.EQ.SWHEN) GOTO 100 + IF (S.EQ.SOTHRS) GOTO 200 + CALL ERROR(132) +90 NEXT=0 + RETURN +C IS THERE AN IDENTIFIER? +100 CALL SCAN + IF (S.EQ.SIDENT) GOTO 110 + CALL ERROR(108) + GOTO 90 +C THERE IS +110 LPMF=LPMF-2 + IF (LPMF.LT.LPML) CALL ERROR(199) +C CREATE AN ENTRY TO THE NAME LIST + IPMEM(LPMF+2)=NRCHAR + NRCHAR=LPMF+1 + IPMEM(NRCHAR)=ADRES + CALL SCAN +C END OF LIST? + IF (S.EQ.SCOLON) GOTO 118 +C CONTINUATION? + IF (S.EQ.SCOMA) GOTO 100 +C NONE OF ABOVE - ERROR + CALL ERROR(118) + GOTO 90 +118 CALL SCAN +120 LPMF=LPMF-17 + IF (LPMF.LT.LPML) CALL ERROR(199) +C SLOT FOR THE PROTOTYPE AND HANDLER +C DESCRIPTION FOR THE SYNTACTIC FATHER + NRCOR=LPMF+7 + STACK(TOP+4)=NRCOR + STACK(TOP+6)=ISFIN + IPMEM(ISFIN)=NRCOR + ISFIN=ISFIN-1 + IPMEM(NRCOR+ 0)=8 + IPMEM(NRCOR+ 9)=LN + IPMEM(NRCOR+10)=NRCHAR +C UPDATE FATHER'S SUBMODULE LIST + NRRE=STACK(TOP) + IPMEM(NRCOR+ 1)=STACK(NRRE+6) + NRBLUS=STACK(NRRE+3) + IPMEM(LPMF+1)=STACK(TOP+6) + IPMEM(LPMF+2)=IPMEM(NRBLUS+6) + IPMEM(NRBLUS+6)=LPMF+1 +C PREPARE THE INTERMEDIATE CODE + IPMEM(NRCOR- 2)= POSIT + IPMEM(NRCOR- 3)= RECNR + CALL OUTPUT(WFIRST,LN) + CALL OPTOUT + UNICAL=2 + STACK(TOP+3)=1 + CALL SLAD(4,13,2) + NEXT=8 + STACK(TOP+7)=1 + RETURN +C CALL E8 TO ANALYSE STATEMENT-LIST +C PARAMETER = 1 +20 CALL OUTPUT(WFIN,STACK(TOP+3)) + CALL OUTPUT(LN,-1) + NRCHAR=0 + IF (S.EQ.SWHEN) GOTO 100 + IF (S.EQ.SOTHRS) GOTO 200 + IF (S.EQ.SEND) GOTO 90 +C WRONG END OF HANDLER + CALL ERROR(142) + GOTO 90 +C OTHERS OCCURRED +200 IF (STACK(TOP+5).NE.0) CALL ERROR(129) + STACK(TOP+5)=1 + CALL SCAN + IF (S.EQ.SCOLON) CALL SCAN + GOTO 120 + END + + INTEGER FUNCTION EXYT(K,L) + IMPLICIT INTEGER (A-Z) + COMMON /BLANK/ com(9037), top, in, next, stack(500), reszta(3652) +C +C THIS FUNCTION RETURNS THE NUMBER OF THE PERTINENT LABEL +C DEPENDING ON THE VALUE OF THE SECOND PARAMETER, WE CHOOSE +C THE STARTING LOOP LABEL /FOR L = 0/ OR THE ENDING ONE /L=1/ +C + Z=TOP + A=K + GOTO 2 +1 Z=STACK(Z) +2 IF (STACK(Z+1).EQ.8) GOTO 10 + IF (STACK(Z+1).EQ.13) GOTO 3 + IF (STACK(Z+1).NE.9) GOTO 1 +C +C EXIT IS MADE TO THE END OF THE SYNTACTIC UNIT (E9) +C OR HANDLER (E13) +C +3 IF (A.GT.1) CALL ERROR(110) + IF (L.EQ.0) CALL ERROR(138) + Z=STACK(Z) + EXYT=STACK(Z+3) + RETURN +C +C DO . . . OD - TYPE LOOP DETECTED +C +10 IF (STACK(Z+2).EQ.13) GOTO 15 + IF (STACK(Z+2).EQ.7) GOTO 15 + IF (STACK(Z+2).NE.25) GOTO 1 +15 CONTINUE +C +C FOR... AND WHILE... ARE ALSO ADMITTED.. +C + A=A-1 + IF (A.GT.0) GOTO 1 +C JUMP OUT IF THE NUMBER OF LOOPS IS LESS THAN THE NUMBER OF +C EXITS + Z=STACK(Z) + A=Z+L+3 + EXYT=STACK(A) + RETURN + END + + SUBROUTINE MARK(A,B) + IMPLICIT INTEGER(A-Z) + COMMON /STREAM/ ERRFLG,LINE,IBUF2(265),BUF(7),ON,BUFOUT(256), + X POSIT,RECNR,NEXT +C +C MARKS THE CURRENT LOCATION OF THE SCRATCH FILE +C MEANING OF PARAMETERS (EXIT ONLY): +C A - RECORD NUMBER +C B - POSITION (WORD NUMBER) IN THE RECORD +C + A=RECNR + B=POSIT + CALL PUT(BUF,BUFOUT) + IF (RECNR.NE.NEXT-1) CALL SEEK(BUF,NEXT) + RECNR=NEXT + NEXT=NEXT+1 + POSIT=1 + RETURN + END + + SUBROUTINE FIND (A,B) + IMPLICIT INTEGER (A-Z) +C +C THIS PROCEDURE RESETS THE POSITION OF THE SCRATCH FILE ACCORDING TO +C THE PARAMETERS: A - RECORD NUMBER +C B - WORD NUMBER +C + COMMON /STREAM/ ERRFLG,LINE,IBUF2(265),BUF(7),ON,BUFOUT(256), + X POSIT,RECNR,NEXT + CALL PUT(BUF,BUFOUT) + CALL SEEK(BUF,A) + CALL GET(BUF,BUFOUT) + CALL SEEK(BUF,A) + RECNR=A + POSIT=B + RETURN + END + + SUBROUTINE OPTOUT + IMPLICIT INTEGER(A-Z) +C WRITES TO THE INTERMEDIATE CODE INFORMATION ABOUT ALL OPTIONS +C (WORD C0M(2)) WITHOUT L-OPTION. CLEARS AUX. + COMMON /BLANK/ c0m(4), blank0(121), wopt, blank1(8873), aux + + DO 100 I=2,8 + CALL OUTPUT(WOPT,I*(-1+2*IAND(1,ISHFT(C0M(2),2-I)))) +100 CONTINUE + AUX=0 + RETURN + END + + SUBROUTINE SELOPT + IMPLICIT INTEGER (A-Z) +C WRITES TO THE INTERMEDIATE CODE INFORMATIONS ABOUT ALL OPTIONS FOR WHICH +C THE CORRESPONDING BITS IN WORD AUX ARE SET. +C CLEARS AUX. + COMMON /BLANK/ C0M(4),BLANK0(121),WOPT,BLANK1(8873),AUX + + LOGICAL BTEST + DO 100 I=2,8 + IF (BTEST(AUX,I-2)) + X CALL OUTPUT(WOPT,I*(-1+2*IAND(1,ISHFT(C0M(2),2-I)))) +100 CONTINUE + AUX=0 + RETURN + END + + SUBROUTINE OUTPUT(A,B) + IMPLICIT INTEGER (A-Z) +C +C WRITES INTERMEDIATE CODE TO THE SCRATCH FILE +C + COMMON /STREAM/ ERRFLG,LINE,IBUF2(265),BUF(7),ON,BUFOUT(256), + X POSIT,RECNR,NEXT + COMMON /BUFF/ INSTR(265),BUFOR(85),LP,LN,MAX,POSTR(265),STATUS + IF (B.NE.-1) GOTO 100 + BUFOUT(POSIT)=A + IF (POSIT.EQ.255) GOTO 50 + POSIT=POSIT+1 + RETURN +50 BUFOUT(256)=NEXT + POSIT=1 + CALL PUT(BUF,BUFOUT) + IF (RECNR.NE.NEXT-1) CALL SEEK(BUF,NEXT) + RECNR=NEXT + NEXT=NEXT+1 + RETURN +100 IF (POSIT.LT.255) GOTO 150 + BUFOUT(255)=A + BUFOUT(256)=NEXT + POSIT=2 + CALL PUT(BUF,BUFOUT) + IF (RECNR.NE.NEXT-1) CALL SEEK(BUF,NEXT) + RECNR=NEXT + NEXT=NEXT+1 + BUFOUT(1)=B + RETURN +150 BUFOUT(POSIT)=A + BUFOUT(POSIT+1)=B + POSIT=POSIT+2 + IF (POSIT.EQ.256) GOTO 50 + RETURN + END + + SUBROUTINE END + IMPLICIT INTEGER (A-Z) + COMMON /BLANK/ COM(278), + X LMEM , LPMEM , IRECN , ISFIN , LPMSYS, LPML , LPMF , + X NRINT , NRRE , NRBOOL, NRCHR , NRCOR , NRPROC, NRTEXT, + X NRUNIV, NATTR , NRNONE, NBLSYS, NBLUS , NEMPTY, INSYS , + X LOCAL , OWN , OBJECT, + X IPMEM(7890) + LOGICAL INSYS, LOCAL, OWN +C IPMEM - MAIN MEMORY +C LPML - ADDRESS OF THE FIRST - +C LPMF - ADDRESS OF THE LAST - FREE WORD IN IPMEM +C ISFIN - TOP OF THE PROTOTYPE DICTIONARY STACK +C LPMEM - DIVISION POINT FOR IPMEM + COMMON /LISTING/ OUTSTR(265) + COMMON /BUFF/ INSTR(265),BUFOR(85),LP,LN,MAX,POSTR(265),STATUS + COMMON /STREAM/ ERRFLG,LINE,IBUF2(265),BUF(7),ON,BUFOUT(256), + X POSIT,RECNR,NEXT + LOGICAL ERRFLG +CPS character auxc(4) +CPS equivalence (auxc(1), aux) +CPS data aux /-1/ + character int2char + + IPMEM(ISFIN-1)=LPMF-LPML+1 + NATTR=ISFIN-1 +10 NATTR=NATTR-1 + IF (IPMEM(NATTR).EQ.0) GOTO 10 +cdsw IPMEM(ISFIN)=NATTR-3738 + IPMEM(ISFIN)=NATTR-8738 + ISFIN=ISFIN+1 + LPMEM=LPMEM-1 + IRECN=LPML-1 + IF (LPMF.EQ.LMEM) CALL ERROR(191) + NATTR=IPMEM(LPMEM) +C CHECK IF THE PROTOTYPE DICTIONARY INCLUDES ANY ADDRESS +C OR IF THE FIRST PROTOTYPE IS BUILT CORRECTLY + IF (IPMEM(LPMEM).EQ.0) CALL ERROR(191) + IF (IPMEM(NATTR).EQ.0) CALL ERROR(191) +cdsw CALL CLOSF(OUTSTR) +cdsw CALL CLOSF(INSTR) + CALL PUT(BUF,BUFOUT(1)) + COM(2)=NEXT + IF (ERRFLG) GOTO 1 +cdsw znacznik konca stringow +cbc WRITE(15) -1 + call ffwrite_ints( 15, -1, 1 ) +cbc +1 CONTINUE +c end of file 16 + call ffwrite_char(16, int2char(26)) +C --- MPTBUF SEEMS NOT NECESSARY IN THE 'ONE-OVERLAY' VERSION +C CALL MPTBUF + RETURN + END + + SUBROUTINE SLAD(NROFVAR,NR,MIEJSCE) + IMPLICIT INTEGER (A-Z) + COMMON /BLANK/ COM(9037), TOP, IN, NEXT, STACK(500), RESZTA(3652) +C PREPARES STACK FOR CALL OF ANOTHER PROCEDURE +C PARAMETERS: +C NROFVAR - NUMBER OF THE LOCAL VARIABLES ALLOCATED ON THE STACK +C NR - NUMBER OF THE CALLING PROCEDURE +C SLAD - NUMBER OF THE RETURN POINT + EQUIVALENCE(COM(282),ISFIN) +cdsw IF (TOP+3748.GT.ISFIN) CALL ERROR(198) + IF (TOP+8748.GT.ISFIN) CALL ERROR(198) +C CHECK IF THE STACK ISN'T TOO LONG + Z=TOP + TOP=TOP+NROFVAR+3 + STACK(TOP)=Z + STACK(TOP+1)=NR + STACK(TOP+2)=MIEJSCE + IN=1 + RETURN + END + + SUBROUTINE ADDPAR(LHEAD,MFIELD) + IMPLICIT INTEGER (A-Z) +C +C APPENDS PARAMETERS TO THE CREATED PROTOTYPE +C PARAMETERS: LHEAD - BEGINNING OF THE PARAMETER LIST +C MFIELD - ADDRESS OF THE PLACE TO BE CHANGED IN CASE OF +C ERRONEOUS LIST +C MODIFICATION FUNCTION: +C CONVERT: [1..10] ------> [1,7,5,6,5,6,7,8,10,10] +C THE FOLLOWING BLANK-COMMON VARIABLES ARE USED: +C OBJECT - LAST ELEMENT ON THE PARAMETER LIST (LINK FIELD) +C KIND - A LOCAL VARIABLE +C NRRE - COUNTS NUMBER OF OCCURRENCES OF ARRAYOF'S +C NATTR - KEEPS THE RECOGNIZED TYPE +C NRCHR - A LOCAL VARIABLE (LOOP LIMIT) +C NRCOR - AS ABOVE +C NRTEXT - SAVES THE VALUE OF VARIABLE OBJECT +C NRPROC - ADDRESS OF THE PLACE TO BE WVERWRITTEN +C NBLUS - ANALYSIS LEVEL 1 - PARAMETER LIST +C 2 - SIMPLIFIED LIST +C--------------------------------------------------------------------- +C ITEM OF THE FORMAL PARAMETER LIST: +C +C 0 ! KIND +C ---+------------------ +C -1 ! SOURCE TEXT LINE NUMBER +C +--+------------------ +C -2 ! NAME +C +--+------------------ +C +3 ! NEXT ITEM INDEX +C REMAINDER FOR VARIABLES FOR PROCEDURES AND FUNCTIONS +C ---+------------------------------------------------------------ +C +4 ! TYPE NUMBER ! +4 ! FORMAL PARAMETER LIST +C ---+-----------------------+------------------------------------ +C +5 ! ARRAYOF COUNT ! +5 ! TYPE NAME (KIND = FUNCTION) +C ----+------------------------------------ +C +6 ! NUMBER OF ARRAYOF'S (KIND = FUNCTION) +C WHERE KIND: +C 3 - PROCEDURE +C 4 - FUNCTION +C 5 - PROCEDURE WITH ERRONEOUS PARAMETER LIST +C 6 - FUNCTION " " " " +C 7 - TYPE +C 8 - VARIABLE "INPUT" +C 9 - VARIABLE "OUTPUT" +C 10 - VARIABLE "INOUT" +C + DIMENSION CONVERT(10) + COMMON /BLANK/ + $ C0M(4), + O S, ADRES, K, SCOMA, SDOT, SEMICOL, + 1 SCOLON, SLEFT, SRIGHT, SBECOME, STAR, SRELAT, + 2 SEOF, SIDENT, SCONST, SAND, SARRAY, SARROF, + 3 SATTACH, SBEGIN, SBLOCK, SBOOL, SCALL, SCASE, + 4 SCLASS, SCLOSE, SCONS, SCOPY, SCOROUT, SDETACH, + 5 SDIM, SDO, SDOWN, SELSE, SEND, SESAC, + 6 SEXIT, SEXTERN, SFI, SFOR, SFUNCT, SIF, + 7 SINNER, SINPUT, SINT, SKILL, SLOCK, SNEW, + 8 SNONE, SNOT, SOD, SOR, SORIF, SOTHER, + 9 SOUTPUT, SPREF, SPRCD, SQUA, SREAD, SRESUME, + O SRETURN, STEP, STOP, STAKEN, STHEN, STHIS, + A STO, STYPE, SUNIT, SVAR, SVIRTUAL, SWAIT, + B SWHEN, SWHILE, SWRIT, SWRITLN, STRUE, SALL, + C WAND, WARRAY, WASSIGN, WASSCON, WATTACH, WBLOCK, + D WCALL, WCASE, WCASEL, WCOMA, WCNSTB, WCNSTC, + E WCNSTI, WCNSTN, WCNSTR, WCNST, WCOPY, WDETACH, + F WDOT, WDOWNTO, WEOF, WESAC, WFIN, WFIRST, + G WFOREND, WFORVAR, WFROM, WIDENT, WIFFALS, WIFTRUE + + common /BLANK/ + H WINNER, WINSTREND,WJUMP, WKILL, WLABEL, WLEFT, + I WLOCK, WLOW, WLSE, WNEW, WNEWARRAY,WNOT, + J WOPERAT, WOPT, WOR, WOTHER, WPREF, WPRIM, + K WQUA, WREAD, WRELAT, WRESUME, WRETURN, WRIGHT, + L WSTART, WSTEP, WSTOP, WTHIS, WTO, WAIT, + M WRITE, WRITELN, WBOUND, UNICAL, + N COM(132), + O LMEM, LPMEM, IRECN, ISFIN, LPMSYS, LPML, + P LPMF, NRINT, NRRE, NRBOOL, NRCHAR, NRCOR, + Q NRPROC, NRTEXT, NRUNIV, NATTR, NRNONE, NBLSYS, + R NBLUS, NEMPTY, INSYS, LOCAL, OWN, OBJECT, + $ scaner(8735) +cdsw $ SCANER(3735), + common /BLANK/ + Z TOP, IN, NEXT, STACK(500), + * RESZTA(3652) + + DIMENSION IPMEM(7890) + EQUIVALENCE (IPMEM(1),SCANER(1)) + COMMON /BUFF/ INSTR(265),BUFOR(85),LP,LN,MAX,JNK(266) + DATA CONVERT/1,7,5,6,5,6,7,8,10,10/ + + OBJECT=LHEAD + NBLUS=1 +10 CALL SCAN +11 IF (S.EQ.SINPUT) GOTO 100 + IF (S.EQ.SIDENT) GOTO 150 + IF (S.EQ.STYPE) GOTO 300 + IF (S.EQ.SFUNCT) GOTO 400 + IF (S.EQ.SPRCD) GOTO 500 +C NO KEYWORDS HAVE BEEN FOUND WHICH COULD PROPERLY START THE PARAMETER LIST +C NOW WE SHOULD FIND A PERTINENT DELIMITER-SYMBOL TO CONTINUE ANALYSIS +C THE PROTOTYPE IS ALSO TO BE CHANGED + CALL ERROR(107) +C LOCAL USAGE OF VARIABLES NRCHAR +C AND NRCOR (CODE OPTIMIZATION) +80 NRCHAR=MFIELD + NRCOR=IPMEM(NRCHAR) + IPMEM(NRCHAR)=CONVERT(NRCOR) +81 IF (S.LT.25) GOTO 90 + IF (S.EQ.SBECOME) GOTO 90 + IF (S.EQ.SRIGHT) GOTO (90,550),NBLUS + IF (S.EQ.SEND) GOTO 90 + IF (S.EQ.SBEGIN) GOTO 90 + IF (S.EQ.SCONS) GOTO 90 + IF (S.EQ.SUNIT) GOTO 90 + IF (S.EQ.STAKEN) GOTO 90 + IF (S.EQ.SCLOSE) GOTO 90 + IF (S.EQ.SEOF) GOTO 90 + IF (S.EQ.SINPUT) GOTO 100 + IF (S.EQ.STYPE) GOTO 300 + IF (S.EQ.SFUNCT) GOTO (400,600),NBLUS + IF (S.EQ.SPRCD) GOTO (500,700),NBLUS + IF (S.EQ.SRELAT) GOTO 90 + IF (S.EQ.SAND) GOTO 90 + CALL SCAN + GOTO 81 +CPS 85 CALL SCAN +90 RETURN +100 KIND=7+ADRES +C KIND INCLUDES 8 - INPUT +C 9 - OUTPUT +C 10 - INOUT + GOTO 210 +150 KIND=8 + J=1 + GOTO 222 +210 J=1 +220 CALL SCAN +222 J=J+1 + IF (J.GT.132) CALL ERROR(197) + IF (S.EQ.SIDENT) GOTO 225 + CALL ERROR(109) +C ERROR IN SPECIFICATION OF INPUT/OUTPUT-TYPE PARAMETERS +C THE TYPE OF THE VARIABLES IS UNDEFINED + COM(J)=0 + NRRE=0 + NATTR=0 + GOTO 255 +225 COM(J)=ADRES + CALL SCAN + IF (S.EQ.SCOMA) GOTO 220 + IF (S.EQ.SCOLON) GOTO 230 + CALL ERROR(118) + GOTO 11 +230 NRRE=0 +240 CALL SCAN + IF (S.NE.SARROF) GOTO 250 + NRRE=NRRE+1 + GOTO 240 +250 NATTR=0 + IF (S.EQ.SCOROUT) NATTR=K + IF (S.EQ.SINT) NATTR=ADRES*8 + IF (S.EQ.SIDENT) NATTR=ADRES + IF (NATTR.EQ.0) CALL ERROR(109) +255 NRCHAR=2 + NRCOR=J + DO 260 J=NRCHAR,NRCOR + LPMF=LPMF-6 + IF (LPMF.LT.LPML) CALL ERROR(199) + IPMEM(LPMF+1)=KIND + IPMEM(LPMF+2)=LN + IPMEM(LPMF+3)=COM(J) + IPMEM(OBJECT)=LPMF+1 + OBJECT=LPMF+4 + IPMEM(LPMF+5)=NATTR + IPMEM(LPMF+6)=NRRE +260 CONTINUE + IF (NATTR.EQ.0) GOTO 80 + CALL SCAN + IF (S.EQ.SCOMA) GOTO 210 + IF (S.EQ.SEMICOL) GOTO (10,541),NBLUS + IF (S.EQ.SRIGHT) GOTO (90,550),NBLUS + CALL ERROR(102) + GOTO (80,545),NBLUS +300 CALL SCAN + IF (S.EQ.SIDENT) GOTO 310 + CALL ERROR(109) + GOTO (80,545),NBLUS +310 LPMF=LPMF-4 + IF (LPMF.LT.LPML) CALL ERROR(199) + IPMEM(LPMF+1)=7 + IPMEM(LPMF+2)=LN + IPMEM(LPMF+3)=ADRES + IPMEM(OBJECT)=LPMF+1 + OBJECT=LPMF+4 + CALL SCAN + IF (S.EQ.SEMICOL) GOTO (10,541),NBLUS + IF (S.EQ.SRIGHT) GOTO (90,550),NBLUS + IF (S.EQ.SCOMA) GOTO 320 + CALL ERROR(107) + GOTO (80,545),NBLUS +320 CALL SCAN + IF (S.EQ.SIDENT) GOTO 310 + CALL ERROR(109) + GOTO (80,545),NBLUS +400 KIND=4 + GOTO 510 +500 KIND=3 +510 CALL SCAN + IF (S.EQ.SIDENT) GOTO 520 + CALL ERROR(109) + GOTO 80 +520 LPMF=LPMF+2*KIND-15 + IF (LPMF.LT.LPML) CALL ERROR(199) + IPMEM(LPMF+1)=KIND + IPMEM(LPMF+2)=LN + IPMEM(LPMF+3)=ADRES + IPMEM(OBJECT)=LPMF+1 + OBJECT=LPMF+4 + CALL SCAN + NRPROC=LPMF +C THE POINTER TO THE CURRENT ELEMENT OF THE PARAMETER LIST IS SAVED + IF (S.EQ.SLEFT) GOTO 540 + IF (KIND.EQ.4) GOTO 530 + IF (S.EQ.SEMICOL) GOTO 10 + IF (S.EQ.SRIGHT) RETURN + CALL ERROR(107) + GOTO 80 +530 NRRE=0 + IF (S.EQ.SCOLON) GOTO 531 + CALL ERROR(118) + GOTO 535 +531 CALL SCAN + IF (S.NE.SARROF) GOTO 535 + NRRE=NRRE+1 + GOTO 531 +535 NATTR=0 + IF (S.EQ.SCOROUT) NATTR=K + IF (S.EQ.SINT) NATTR=ADRES*8 + IF (S.EQ.SIDENT) NATTR=ADRES + IPMEM(NRPROC+6)=NATTR + IPMEM(NRPROC+7)=NRRE + IF (NATTR.EQ.0) GOTO 537 + CALL SCAN + GOTO 538 +537 CALL ERROR(109) + GOTO 80 +538 IF (S.EQ.SRIGHT) RETURN + IF (S.EQ.SEMICOL) GOTO 10 + CALL ERROR(107) + GOTO 80 +540 NRTEXT=OBJECT + OBJECT=OBJECT+1 + NBLUS=2 +541 CALL SCAN + IF (S.EQ.SINPUT) GOTO 100 + IF (S.EQ.SIDENT) GOTO 150 + IF (S.EQ.STYPE) GOTO 300 + IF (S.EQ.SFUNCT) GOTO 600 + IF (S.EQ.SPRCD) GOTO 700 + IF (S.EQ.SRIGHT) GOTO 550 + CALL ERROR(107) +545 IF (IPMEM(NRPROC+1).LT.5) IPMEM(NRPROC+1)=IPMEM(NRPROC+1)+2 +C ERRONEOUS PARAMETER LIST. WE SHOULD FIND A SYMBOL WHICH WOULD +C ALLOW FOR A FURTHER (REASONABLE) ANALYSIS OF THE SOURCE TEXT. +C THE SEARCHING IS COMMON FOR BOTH PARAMETER LEVELS. + GOTO 80 +550 NBLUS=1 + OBJECT=NRTEXT + CALL SCAN + IF (IPMEM(OBJECT-3).EQ.4) GOTO 530 + IF (S.EQ.SEMICOL) GOTO 10 + IF (S.EQ.SRIGHT) RETURN + CALL ERROR(107) + GOTO 80 +600 KIND=4 + GOTO 710 +700 KIND=3 +710 CALL SCAN + IF (S.EQ.SIDENT) GOTO 720 + CALL ERROR(109) + GOTO 545 +720 LPMF=LPMF-4 + IF (LPMF.LT.LPML) CALL ERROR(199) + IPMEM(LPMF+1)=KIND + IPMEM(LPMF+2)=LN + IPMEM(LPMF+3)=ADRES + IPMEM(OBJECT)=LPMF+1 + OBJECT=LPMF+4 + CALL SCAN + IF (S.EQ.SRIGHT) GOTO 550 + IF (S.EQ.SEMICOL) GOTO 541 + CALL ERROR(107) + GOTO 545 + END + + SUBROUTINE ADDVAR(SKAD,ILE) + IMPLICIT INTEGER (A-Z) +C +C APPENDS THE LIST OF VARIABLES TO THE LIST IN THE PROTOTYPE +C RECOGNIZES TYPES OF VARIABLES +C STACK(TOP+3) - PROTOTYPE ADDRESS +C +C ILE - LENGTH OF THE LIST OF VARIABLES +C SKAD - BEGINNING OF THE LIST - VARIABLES ARE LOCATED IN CONSECUTIVE +C WORDS +C +C-------------------------------------------------------------------- +C VARIABLE LIST ITEM: +C 0 ! NAME OF THE VARIABLE +C ---+------------------------ +C +1 ! DECLARATION LINE NUMBER IN THE SOURCE TEXT +C ---+------------------------ +C +2 ! TYPE NAME +C ---+------------------------ +C +3 ! NUMBER OF ARRAYOF'S +C ---+------------------------ +C +4 ! NEXT ITEM POINTER +C + DIMENSION SKAD(2) + COMMON /BUFF/ INSTR(265),BUFOR(85),LP,LN,MAX,JNK(266) + COMMON /BLANK/ + $ C0M(4), + O S, ADRES, K, SCOMA, SDOT, SEMICOL, + 1 SCOLON, SLEFT, SRIGHT, SBECOME, STAR, SRELAT, + 2 SEOF, SIDENT, SCONST, SAND, SARRAY, SARROF, + 3 SATTACH, SBEGIN, SBLOCK, SBOOL, SCALL, SCASE, + 4 SCLASS, SCLOSE, SCONS, SCOPY, SCOROUT, SDETACH, + 5 SDIM, SDO, SDOWN, SELSE, SEND, SESAC, + 6 SEXIT, SEXTERN, SFI, SFOR, SFUNCT, SIF, + 7 SINNER, SINPUT, SINT, SKILL, SLOCK, SNEW, + 8 SNONE, SNOT, SOD, SOR, SORIF, SOTHER, + 9 SOUTPUT, SPREF, SPRCD, SQUA, SREAD, SRESUME, + O SRETURN, STEP, STOP, STAKEN, STHEN, STHIS, + A STO, STYPE, SUNIT, SVAR, SVIRTUAL, SWAIT, + B SWHEN, SWHILE, SWRIT, SWRITLN, STRUE, SALL, + C WAND, WARRAY, WASSIGN, WASSCON, WATTACH, WBLOCK, + D WCALL, WCASE, WCASEL, WCOMA, WCNSTB, WCNSTC, + E WCNSTI, WCNSTN, WCNSTR, WCNST, WCOPY, WDETACH, + F WDOT, WDOWNTO, WEOF, WESAC, WFIN, WFIRST, + G WFOREND, WFORVAR, WFROM, WIDENT, WIFFALS, WIFTRUE + + common /BLANK/ + H WINNER, WINSTREND,WJUMP, WKILL, WLABEL, WLEFT, + I WLOCK, WLOW, WLSE, WNEW, WNEWARRAY,WNOT, + J WOPERAT, WOPT, WOR, WOTHER, WPREF, WPRIM, + K WQUA, WREAD, WRELAT, WRESUME, WRETURN, WRIGHT, + L WSTART, WSTEP, WSTOP, WTHIS, WTO, WAIT, + M WRITE, WRITELN, WBOUND, UNICAL, + N COM(132), + O LMEM, LPMEM, IRECN, ISFIN, LPMSYS, LPML, + P LPMF, NRINT, NRRE, NRBOOL, NRCHAR, NRCOR, + Q NRPROC, NRTEXT, NRUNIV, NATTR, NRNONE, NBLSYS, + R NBLUS, NEMPTY, INSYS, LOCAL, OWN, OBJECT, + $ scaner(8735) +cdsw $ SCANER(3735), + common /BLANK/ + Z TOP, IN, NEXT, STACK(500), + * RESZTA(3652) + + DIMENSION IPMEM(7890) + EQUIVALENCE (SCANER(1),IPMEM(1)) + EQUIVALENCE (SOUTPUT,SEMAPH) + +C VARIABLE ARR COUNTS THE NUMBER OF ARRAYOF'S ENCOUNTERED + ARR=0 + IF (S.NE.SARROF) GOTO 2 +1 ARR=ARR+1 + CALL SCAN + IF (S.EQ.SARROF) GOTO 1 +C TYPE OF THE VARIABLE IS RECOGNIZED +2 IF (S.EQ.SINT) GOTO 10 + IF (S.EQ.SCOROUT) GOTO 8 + IF (S.EQ.SIDENT) GOTO 6 + IF (S.EQ.SEMAPH) GOTO 4 +C ERROR IN DECLARATION - UNIVERSAL TYPE (0) IS ASSUMED + ADRES=0 + CALL ERROR(109) +4 KIND=32 + IF (ARR.EQ.0) GOTO 90 + ARR=0 + CALL ERROR(141) + GOTO 90 +6 KIND=ADRES + GOTO 90 +8 KIND=K +C COROUTINE / PROCESS ARE TREATED AS IDENTIFIERS +C VARIABLE K INCLUDES HASH TABLE ADDRESS + GOTO 90 +10 KIND=ADRES*8 +90 CALL SCAN +C THE VARIABLE LIST IS COPIED INTO THE CREATED VARIABLE DESCRIPTIONS + DO 100 I=1,ILE + LPMF=LPMF-5 + IF (LPMF.LT.LPML) CALL ERROR(199) +C ERROR(199) - PARSER TABLE OVERFLOW + IPMEM(LPMF+1)=SKAD(I) + IPMEM(LPMF+2)=LN + IPMEM(LPMF+3)=KIND + IPMEM(LPMF+4)=ARR +C THE NEW ELEMENT IS APPENDED TO THE VARIABLE LIST +C NRRE - SCRATCH - BEGINNING OF THE LIST (TAKEN FROM THE PROTOTYPE) + NRRE=STACK(TOP+3)+3 + IPMEM(LPMF+5)=IPMEM(NRRE) + IPMEM(NRRE)=LPMF+1 +100 CONTINUE + RETURN + END + + + SUBROUTINE OVERF(K) + IMPLICIT INTEGER (A-Z) + COMMON /LISTING/ OUTSTR(265) + COMMON /BUFF/ INSTR(265),BUFOR(85),LP,LN,MAX,POSTR(265),STATUS + COMMON /STREAM/ ERRFLG,LINE,IBUF2(265),BUF(7),ON,BUFOUT(256), + X POSIT,RECNR,NEXT +1 IF (BUFOR(1).EQ.2) GOTO 2 + CALL READIN + GOTO 1 +2 CALL APARS +cdsw CALL CLOSF(OUTSTR) +cdsw CALL CLOSF(INSTR) + CALL MDROP(K) + RETURN + END + + SUBROUTINE OPTSET + IMPLICIT INTEGER (A-Z) +C SETS UP THE OPTION WORD - C0M(2) +CJF CALLED WHENEVER '(*[' IS ENCOUNTERED +C CALLED WHENEVER '(*$' IS ENCOUNTERED +CJF VARIABLE LP IS ASSUMED TO POINT TO THE FIRST CHARACTER FOLLOWING '[' +C VARIABLE LP IS ASSUMED TO POINT TO THE FIRST CHARACTER FOLLOWING '$' +C IT IS ADVANCED BY OPTSET +C +C MEANING OF THE PARTICULAR BITS IC C0M(2) +C BIT(S) MEANING +C 0 - OPTION MEMBER-CONTROL ( 1 - ON, 0 - OFF ) M +C 1 - OPTION OPTIMIZATION O +C 2 - OPTION INDEX-CONTROL I +C 3 - OPTION TYPE-CONTROL T +C 4 - OPTION TRACE-CONTROL D +C 5 - OPTION CASE-CONTROL (NOT USED IN THE L-COMPILER) C +C 6 - OPTION FAST CASE " F +C 7-12 NOT USED +C 13 - OPTION FOR T.SZCZEPANEK " S +C 14 - OPTION PSEUDO-PARALLEL " P +C 15 - OPTION LISTING L +C +C NOTE: PARTICULAR BITS IN AUX (0-12) CORRESPOND TO THE CHANGES IN +C C0M(2). THEY ARE SET UP WHEN THE CORRESPONDING OPTIONS ARE SELECTED +C +C NOTE: THE NUMBERS OF OPTIONS WRITTEN TO THE INTERMEDIATE CODE RESULT +C FROM ADDING 2 TO THE CORRESPONDING BIT NUMBERS. +C +C WORDS C0M(3) AND C0M(4) ARE USED TO FORCE EXTERNAL SETTING OF OPTIONS. +C EXTERNAL SETTING (VIA RESPONSE TO THE COMPILER PROMPT) TAKES PRECEDENCE. +C OPTION 'P' (14) CAN BE SET ONLY EXTERNALLY. +C INITIAL VALUES: +C C0M(2) - X'802F' +C C0M(3) - X'0000' +C COM(4) - X'FFFF' +C + COMMON /STREAM/ ERRFLG,LINE,IBUF2(265),BUF(7),ON,BUFOUT(256), + X POSIT,RECNR,NEKST + COMMON /BUFF/ INSTR(265),BUFOR(85),LP,LN,MAX,JNK(266) + COMMON /BLANK/ C0M(4),BLANK(8995),AUX,BLANK1(4192) + +C RECOGNIZE THE OPTION +cdsw ------------ changed to lower-case or upper case letters ----- +10 continue + x = ord(bufor(lp)) + if(x.ne.ord(ichar('l'))) goto 100 +cdsw10 IF (BUFOR(LP).NE.ICHAR('L')) GOTO 100 +cdsw ------------------------------------------- +C 'L' RECOGNIZED + IF (BUFOR(LP+1).EQ.ICHAR('-')) GOTO 50 + IF (BUFOR(LP+1).EQ.ICHAR('+')) GOTO 30 + CALL ERROR(135) +30 C0M(2)=IBSET(C0M(2),15) + GOTO 80 +50 C0M(2)=IBCLR(C0M(2),15) +C MASK UP THE OPTIONS WHICH HAVE BEEN DECLARED EXTERNALLY +cdsw&bc 80 C0M(2)=IOR(C0M(3),IAND(C0M(4),C0M(2))) +80 continue +c + IF (BUFOR(LP+2).NE.ICHAR(',')) GOTO 9999 + LP=LP+3 + GOTO 10 +cdsw ---------------- changed ------------- +100 if(x.ne.ord(ichar('m')))goto 200 +cdsw100 IF (BUFOR(LP).NE.ICHAR('M')) GOTO 200 +cdsw-------------------------------------------- +C 'M' RECOGNIZED - MEMBER-CONTROL + IF (BUFOR(LP+1).EQ.ICHAR('-')) GOTO 150 + IF (BUFOR(LP+1).EQ.ICHAR('+')) GOTO 130 + CALL ERROR(135) +130 C0M(2)=IBSET(C0M(2),0) + GOTO 180 +150 C0M(2)=IBCLR(C0M(2),0) +180 AUX=IBSET(AUX,0) + IF (BUFOR(LP+2).NE.ICHAR(',')) GOTO 9999 + LP=LP+3 + GOTO 10 +cdsw ---------------- changed --------------- +200 if(x.ne.ord(ichar('o'))) go to 300 +cdsw200 IF (BUFOR(LP).NE.ICHAR('O')) GOTO 300 +cdsw ----------------------------------------- +C 'O' RECOGNIZED - OPTIMIZATION + IF (BUFOR(LP+1).EQ.ICHAR('-')) GOTO 250 + IF (BUFOR(LP+1).EQ.ICHAR('+')) GOTO 230 + CALL ERROR(135) +230 C0M(2)=IBSET(C0M(2),1) + GOTO 280 +250 C0M(2)=IBCLR(C0M(2),1) +280 AUX=IBSET(AUX,1) + IF (BUFOR(LP+2).NE.ICHAR(',')) GOTO 9999 + LP=LP+3 + GOTO 10 +cdsw ------------------- changed --------- +300 if(x.ne.ord(ichar('i'))) go to 400 +cdsw300 IF (BUFOR(LP).NE.ICHAR('I')) GOTO 400 +cdsw ---------------------------------------- +C 'I' RECOGNIZED - INDEX-CONTROL + IF (BUFOR(LP+1).EQ.ICHAR('-')) GOTO 350 + IF (BUFOR(LP+1).EQ.ICHAR('+')) GOTO 330 + CALL ERROR(135) +330 C0M(2)=IBSET(C0M(2),2) + GOTO 380 +350 C0M(2)=IBCLR(C0M(2),2) +380 AUX=IBSET(AUX,2) + IF (BUFOR(LP+2).NE.ICHAR(',')) GOTO 9999 + LP=LP+3 + GOTO 10 +cdsw ------------ changed ----------------- +400 if(x.ne.ord(ichar('t'))) go to 500 +cdsw400 IF (BUFOR(LP).NE.ICHAR('T')) GOTO 500 +cdsw ------------------------------------- +C 'T' RECOGNIZED - TYPE-CONTROL + IF (BUFOR(LP+1).EQ.ICHAR('-')) GOTO 450 + IF (BUFOR(LP+1).EQ.ICHAR('+')) GOTO 430 + CALL ERROR(135) +430 C0M(2)=IBSET(C0M(2),3) + GOTO 480 +450 C0M(2)=IBCLR(C0M(2),3) +480 AUX=IBSET(AUX,3) + IF (BUFOR(LP+2).NE.ICHAR(',')) GOTO 9999 + LP=LP+3 + GOTO 10 +cdsw ------------- changed ---------------- +500 if(x.ne.ord(ichar('d'))) go to 600 +cdsw500 IF (BUFOR(LP).NE.ICHAR('D')) GOTO 600 +cdsw --------------------------------------- +C 'D' RECOGNIZED - TRACE-CONTROL + C0M(2)=IBCLR(C0M(2),4) + IF (BUFOR(LP+1).EQ.ICHAR('-')) GOTO 550 + IF (BUFOR(LP+1).NE.ICHAR('+')) CALL ERROR(135) +530 C0M(2)=IBSET(C0M(2),4) +550 AUX=IBSET(AUX,4) + IF (BUFOR(LP+2).NE.ICHAR(',')) GOTO 9999 + LP=LP+3 + GOTO 10 +cdsw --------------- changed ---------------------- +600 if(x.ne.ord(ichar('c'))) go to 700 +cdsw600 IF (BUFOR(LP).NE.ICHAR('C')) GOTO 700 +cdsw ---------------------------------------------- +C 'C' RECOGNIZED - CASE-CONTROL + C0M(2)=IBSET(C0M(2),5) + IF (BUFOR(LP+1).EQ.ICHAR('-')) GOTO 630 + IF (BUFOR(LP+1).NE.ICHAR('+')) CALL ERROR(135) + GOTO 650 +630 C0M(2)=IBCLR(C0M(2),5) +650 AUX=IBSET(AUX,5) + IF (BUFOR(LP+2).NE.ICHAR(',')) GOTO 9999 + LP=LP+3 + GOTO 10 +cdsw --------- changed ------------------------ +700 if(x.ne.ord(ichar('f'))) go to 800 +cdsw700 IF (BUFOR(LP).NE.ICHAR('F')) GOTO 800 +cdsw ----------------------------------------- +C 'F' RECOGNIZED - FAST CASE + C0M(2)=IBCLR(C0M(2),6) + IF (BUFOR(LP+1).EQ.ICHAR('+')) GOTO 730 + IF (BUFOR(LP+1).NE.ICHAR('-')) CALL ERROR(135) + GOTO 650 +730 C0M(2)=IBSET(C0M(2),6) +750 AUX=IBSET(AUX,6) + IF (BUFOR(LP+2).NE.ICHAR(',')) GOTO 9999 + LP=LP+3 + GOTO 10 +800 LP=LP-3 +C NO VALID OPTION HAS BEEN RECOGNIZED + CALL ERROR(135) +cdsw&bc 9999 C0M(2)=IOR(C0M(3),IAND(C0M(4),C0M(2))) +9999 continue +c + RETURN + END + diff --git a/sources/readme b/sources/readme new file mode 100644 index 0000000..9d6db2f --- /dev/null +++ b/sources/readme @@ -0,0 +1,34 @@ +Here you have the sources. + They are in Unix format. Use unix2dos to read them in DOS. + +Unix users: + You should build + 1. the crosscompiler F2C used by make to construct loglan + 2. loglan i.e. pass1 + 3. gen i.e. pass2 + 4. int i.e. the executor +You have four directories. In each directory locate the file + makefile +- do a copy of it +- modify the makefile in accordance to your equipment and needs +- execute: + make +- store the resulting executable where you wish to keep executables + +Attention! + in INT you should build "int" and "herc" +do: + make --in order to make int + make herc --in order to make herc a graphic partner of int +__________________________ +New: new version "xint" of int and "xiuwgraf" are available. Not integrated yet. + 25 October 1993 + +============================================================================= +RESEARCH. + +We are in train of constructing new pass1 for the present Loglan82 as well +as for new Loglan93. +Should you feel interested in cooperation, contact + salwicki@infpc1.univ-pau.fr + diff --git a/utils/editor.dos/edibase0.dba b/utils/editor.dos/edibase0.dba new file mode 100644 index 0000000..becc8b9 --- /dev/null +++ b/utils/editor.dos/edibase0.dba @@ -0,0 +1,105 @@ +template("program","program",[txtfield(0,0,7,"program"),field("name",u,0,7,8,ref(0)," ",0),txtfield(0,15,1,";"),tmpfield("body1",1,0)],5,14) +template("program-block","program",[txtfield(0,0,5,"block"),tmpfield("body1",1,0)],5,14) +template("block","block",[txtfield(0,0,5,"block"),tmpfield("body",1,0),txtfield(9,14,1,";")],6,15) +template("pref...block","block",[txtfield(0,0,4,"pref"),field("prefix_id",ru,0,4,13,ref(0)," ",0),field("actual_pars",ru,0,17,15,ref(0)," ",0),txtfield(0,32,5,"block"),tmpfield("body",1,0),txtfield(9,14,1,";")],6,15) +template("body1","aux",[field("declarations",rli,0,2,14,ref(0),"",0),txtfield(1,0,5,"begin"),field("statements",rli,2,2,12,ref(0),"",0),txtfield(3,0,3,"end"),field("comment",ru,3,3,11,ref(0)," ",0)],4,14) +template("body","aux",[field("declarations",rli,0,2,14,ref(0),"",0),txtfield(1,0,5,"begin"),field("statements",rli,2,2,12,ref(0),"",0),field("lastwill",rt,3,2,10,ref(0),"",0),txtfield(4,0,3,"end"),field("comment",ru,4,3,11,ref(0)," ",0)],5,14) +template("lastwill","lastwill",[txtfield(0,0,9,"lastwill:"),field("statements",rli,0,9,12,ref(0),"",0)],1,21) +template("declarations","declaration",[txtfield(0,0,2," "),field("declaration",rem,0,2,13,ref(0),"",0),txtfield(0,15,2," ")],1,17) +template("constant","constant1",[txtfield(0,0,5,"const"),field("id",u,0,5,6,ref(0)," ",0),txtfield(0,11,1,"="),field("value",u,0,12,9,ref(0)," ",0),txtfield(0,21,1,";")],1,22) +template("grouped_var","grouped_var1",[txtfield(0,0,3,"var"),field("id_list",u,0,3,14,ref(0)," {,} ",0),txtfield(0,17,1,":"),field("type",tm,0,18,6,ref(0),"",0),txtfield(0,24,1,";")],1,25) +template("primitive","primitive_type",[field("prim_id",m,0,0,16,ref(0),"",0)],1,16) +template("identifier","id_type",[field("id",u,0,0,11,ref(0)," ",0)],1,11) +template("class","class",[tmpfield("head",0,0),txtfield(0,26,5,"class"),field("parameters",rli,0,31,12,ref(0),"",0),txtfield(0,43,1,";"),tmpfield("tch_body",1,0),txtfield(8,14,1,";")],9,15) +template("function","function",[tmpfield("head",0,0),txtfield(0,26,8,"function"),field("parameters",rli,0,34,12,ref(0),"",0),txtfield(0,46,1,":"),field("type",tm,0,47,6,ref(0),"",0),txtfield(0,53,1,";"),field("taken",rt,1,2,7,ref(0),"",0),tmpfield("body",2,0),txtfield(6,14,1,";")],7,15) +template("procedure","procedure",[tmpfield("head",0,0),txtfield(0,26,9,"procedure"),field("parameters",rli,0,35,12,ref(0),"",0),txtfield(0,47,1,";"),field("taken",rt,1,2,7,ref(0),"",0),tmpfield("body",2,0),txtfield(6,14,1,";")],7,15) +template("virt_function","virt_function",[tmpfield("virt_head",0,0),txtfield(0,34,8,"function"),field("parameters",rli,0,42,12,ref(0),"",0),txtfield(0,54,1,":"),field("type",tm,0,55,6,ref(0),"",0),txtfield(0,61,1,";"),field("taken",rt,1,2,7,ref(0),"",0),tmpfield("body",2,0),txtfield(6,14,1,";")],7,15) +template("virt_procedure","virt_procedure",[tmpfield("virt_head",0,0),txtfield(0,34,9,"procedure"),field("parameters",rli,0,43,12,ref(0),"",0),txtfield(0,55,1,";"),field("taken",rt,1,2,7,ref(0),"",0),tmpfield("body",2,0),txtfield(6,14,1,";")],7,15) +template("coroutine","coroutine",[tmpfield("head",0,0),txtfield(0,26,9,"coroutine"),field("parameters",rli,0,35,12,ref(0),"",0),txtfield(0,47,1,";"),tmpfield("tch_body",1,0),txtfield(8,14,1,";")],9,15) +template("process","process",[tmpfield("head",0,0),txtfield(0,26,7,"process"),field("parameters",rli,0,33,12,ref(0),"",0),txtfield(0,45,1,";"),tmpfield("tch_body",1,0),txtfield(8,14,1,";")],9,15) +template("head","aux",[txtfield(0,0,4,"unit"),field("name",u,0,4,8,ref(0)," ",0),txtfield(0,12,1,":"),field("prefix_id",ru,0,13,13,ref(0)," ",0)],1,26) +template("virt_head","aux",[txtfield(0,0,12,"unit virtual"),field("name",u,0,12,8,ref(0)," ",0),txtfield(0,20,1,":"),field("prefix_id",ru,0,21,13,ref(0)," ",0)],1,34) +template("tch_body","aux",[field("taken",rt,0,2,7,ref(0),"",0),field("close",rt,1,2,7,ref(0),"",0),field("hidden",rt,2,2,8,ref(0),"",0),tmpfield("body",3,0)],7,14) +template("taken","taken",[txtfield(0,0,5,"taken"),field("taken",ru,0,5,14,ref(0)," {,} ",0),txtfield(0,19,1,";")],1,20) +template("close","close",[txtfield(0,0,5,"close"),field("close",ru,0,5,14,ref(0)," {,} ",0),txtfield(0,19,1,";")],1,20) +template("hidden","hidden",[txtfield(0,0,6,"hidden"),field("hidden",ru,0,6,14,ref(0)," {,} ",0),txtfield(0,20,1,";")],1,21) +template("signal","signal1",[txtfield(0,0,6,"signal"),field("id",u,0,6,6,ref(0)," ",0),field("s_parameters",rli,0,12,12,ref(0),"",0),txtfield(0,24,1,";")],1,25) +template("s_parameters","parameter",[txtfield(0,0,1,"("),field("s_parameter",rem,0,1,11,ref(0),"",0),txtfield(0,12,1,")")],1,13) +template("input","input_par",[txtfield(0,0,5,"input"),tmpfield("io_rest",0,5)],1,30) +template("output","output_par",[txtfield(0,0,6,"output"),tmpfield("io_rest",0,6)],1,31) +template("inout","in_out_par",[txtfield(0,0,5,"inout"),tmpfield("io_rest",0,5)],1,30) +template("io_rest","aux",[field("id_list",u,0,0,14,ref(0)," {,} ",0),txtfield(0,14,1,":"),field("type",tm,0,15,6,ref(0),"",0),field("sep",rt,0,21,3,ref(0),"<;>",0),txtfield(0,24,1," ")],1,25) +template("sep","sep",[txtfield(0,0,1,";")],1,1) +template("type","type_par",[txtfield(0,0,4,"type"),field("id",u,0,4,6,ref(0)," ",0),field("sep",rt,0,10,3,ref(0),"<;>",0),txtfield(0,13,1," ")],1,14) +template("func_par","fun_par",[txtfield(0,0,8,"function"),field("id",u,0,8,6,ref(0)," ",0),field("sep",rt,0,14,3,ref(0),"<;>",0),txtfield(0,17,1," ")],1,18) +template("proc_par","proc_par",[txtfield(0,0,9,"procedure"),field("id",u,0,9,6,ref(0)," ",0),field("sep",rt,0,15,3,ref(0),"<;>",0),txtfield(0,18,1," ")],1,19) +template("parameters","parameter",[txtfield(0,0,1,"("),field("parameter",rem,0,1,11,ref(0),"",0),txtfield(0,12,1,")")],1,13) +template("fun_param","fun_param",[txtfield(0,0,8,"function"),field("s_parameters",rli,0,8,12,ref(0),"",0),txtfield(0,20,1,":"),field("type",tm,0,21,6,ref(0),"",0),field("sep",rt,0,27,3,ref(0),"<;>",0),txtfield(0,30,1," ")],1,31) +template("proc_param","proc_param",[txtfield(0,0,9,"procedure"),field("s_parameters",rli,0,9,12,ref(0),"",0),field("sep",rt,0,21,3,ref(0),"<;>",0),txtfield(0,24,1," ")],1,25) +template("handlers","handlers",[txtfield(0,0,8,"handlers"),field("s_handlers",rli,1,1,12,ref(0),"",0),field("others",rli,2,1,8,ref(0),"",0),txtfield(3,0,3,"end")],4,3) +template("s_handlers","handler",[txtfield(0,0,1," "),field("s_handler",re,0,1,11,ref(0),"",0),txtfield(0,12,1," ")],1,13) +template("s_handler","handler1",[txtfield(0,0,4,"when"),field("id_list",u,0,4,14,ref(0)," {,} ",0),field("s_parameters",rli,0,18,12,ref(0),"",0),txtfield(0,30,1,":"),field("statements",rli,1,1,12,ref(0),"",0)],2,13) +template("others","block_stat",[txtfield(0,1,6,"others"),field("statement",rem,1,2,11,ref(0),"",0)],2,13) +template("statements","statement",[txtfield(0,0,2," "),field("statement",rem,0,2,11,ref(0),"",0),txtfield(0,13,2," ")],1,15) +template("ifthen","aux",[txtfield(0,0,2,"if"),field("if_cond",u,0,2,8,ref(0)," ",0),txtfield(0,10,4,"then"),field("then_statements",rli,1,4,12,ref(0),"",0)],2,16) +template("then_statements","statement",[txtfield(0,0,1," "),field("statement",rem,0,1,11,ref(0),"",0),txtfield(0,12,1," ")],1,13) +template("else_statements","statement",[txtfield(0,0,1," "),field("statement",rem,0,1,11,ref(0),"",0),txtfield(0,12,1," ")],1,13) +template("if_then","if_then",[tmpfield("ifthen",0,0),txtfield(2,0,3,"fi;")],3,3) +template("if_then_else","if_then_else",[tmpfield("ifthen",0,0),txtfield(2,2,4,"else"),field("else_statements",rli,3,4,12,ref(0),"",0),txtfield(4,0,3,"fi;")],5,3) +template("do","do",[txtfield(0,0,2,"do"),field("statements",rli,1,2,12,ref(0),"",0),txtfield(2,0,3,"od;")],3,3) +template("while","while",[txtfield(0,0,5,"while"),field("cond",u,0,5,8,ref(0)," ",0),tmpfield("do",1,2)],4,5) +template("for","aux",[txtfield(0,0,3,"for"),field("id",u,0,3,6,ref(0)," ",0),txtfield(0,9,2,":="),field("start_expr",u,0,11,14,ref(0)," ",0)],1,25) +template("for_to","for_to",[tmpfield("for",0,0),txtfield(0,25,2,"to"),field("stop_expr",u,0,27,13,ref(0)," ",0),tmpfield("do",1,2)],4,5) +template("for_step_to","for_step_to",[tmpfield("for",0,0),txtfield(0,25,4,"step"),field("step",u,0,29,8,ref(0)," ",0),txtfield(0,37,2,"to"),field("stop_expr",u,0,39,13,ref(0)," ",0),tmpfield("do",1,2)],4,5) +template("for_downto","for_downto",[tmpfield("for",0,0),txtfield(0,25,6,"downto"),field("stop_expr",u,0,31,13,ref(0)," ",0),tmpfield("do",1,2)],4,5) +template("for_step_downto","for_step_downto",[tmpfield("for",0,0),txtfield(0,25,4,"step"),field("step",u,0,29,8,ref(0)," ",0),txtfield(0,37,6,"downto"),field("stop_expr",u,0,43,13,ref(0)," ",0),tmpfield("do",1,2)],4,5) +template("case","case",[txtfield(0,0,4,"case"),field("ac_expr",u,0,4,8,ref(0)," ",0),field("selectors",rli,1,2,11,ref(0),"",0),field("others",rli,2,2,8,ref(0),"",0),txtfield(3,0,5,"esac;")],4,5) +template("selectors","selector",[txtfield(0,0,1," "),field("selector",re,0,1,10,ref(0),"",0),txtfield(0,7,1," ")],1,8) +template("selector","selector1",[txtfield(0,0,4,"when"),field("value_list",u,0,4,20,ref(0)," {,} ",0),txtfield(0,24,1,":"),field("statements",rli,1,2,12,ref(0),"",0)],2,14) +template("read","read",[txtfield(0,0,6,"read ("),field("var_list",u,0,6,16,ref(0)," {,} ",0),txtfield(0,22,2,");")],1,24) +template("write","write",[txtfield(0,0,7,"write ("),field("exf_list",u,0,7,18,ref(0)," {,} ",0),txtfield(0,25,2,");")],1,27) +template("writeln(...)","writeln",[txtfield(0,0,9,"writeln ("),field("expr_list",u,0,9,18,ref(0)," {,} ",0),txtfield(0,2,2,");")],1,29) +template("writeln","writeln",[txtfield(0,0,8,"writeln;")],1,8) +template("assign","assign",[field("var_list",u,0,0,16,ref(0)," {,} ",0),txtfield(0,16,2,":="),field("expr",u,0,18,8,ref(0)," ",0),txtfield(0,26,1,";")],1,27) +template("copy","copy",[field("var_list",u,0,0,16,ref(0)," {,} ",0),txtfield(0,16,9,":= copy ("),field("object_expr",u,0,25,15,ref(0)," ",0),txtfield(0,40,2,");")],1,42) +template("call","call",[txtfield(0,0,4,"call"),field("procedure_expr",u,0,4,18,ref(0)," ",0),field("actual_pars",ru,0,22,15,ref(0)," ",0),txtfield(0,37,1,";")],1,38) +template("new_array","new_array",[txtfield(0,0,9,"new_array"),field("var",u,0,9,7,ref(0)," ",0),txtfield(0,16,5,"dim ["),field("lower_bound",u,0,21,15,ref(0)," ",0),txtfield(0,36,1,":"),field("upper_bound",u,0,37,15,ref(0)," ",0),txtfield(0,52,2,"];")],1,54) +template("kill","kill",[txtfield(0,0,6,"kill ("),field("object_expr",u,0,6,15,ref(0)," ",0),txtfield(0,21,2,");")],1,23) +template("attach","attach",[txtfield(0,0,8,"attach ("),field("object_expr",u,0,8,15,ref(0)," ",0),txtfield(0,23,2,");")],1,25) +template("detach","detach",[txtfield(0,0,7,"detach;")],1,7) +template("lock","lock",[txtfield(0,0,6,"lock ("),field("var",u,0,6,7,ref(0)," ",0),txtfield(0,13,2,");")],1,15) +template("unlock","unlock",[txtfield(0,0,8,"unlock ("),field("var",u,0,8,7,ref(0)," ",0),txtfield(0,15,2,");")],1,17) +template("ts","ts",[txtfield(0,0,4,"lock ("),field("var",u,0,4,7,ref(0)," ",0),txtfield(0,11,2,");")],1,13) +template("stop(...)","stop",[txtfield(0,0,6,"stop ("),field("var",u,0,6,7,ref(0)," ",0),txtfield(0,13,2,");")],1,15) +template("stop","stop",[txtfield(0,0,5,"stop;")],1,5) +template("resume","resume",[txtfield(0,0,8,"resume ("),field("object_expr",u,0,8,15,ref(0)," ",0),txtfield(0,23,2,");")],1,25) +template("wait","wait",[txtfield(0,0,5,"wait;")],1,5) +template("raise","raise",[txtfield(0,0,5,"raise"),field("id",u,0,5,6,ref(0)," ",0),field("actual_pars",ru,0,11,15,ref(0)," ",0),txtfield(0,26,1,";")],1,27) +template("wind","wind",[txtfield(0,0,5,"wind;")],1,5) +template("terminate","terminate",[txtfield(0,0,10,"terminate;")],1,10) +template("repeat","repeat",[txtfield(0,0,7,"repeat;")],1,7) +template("inner","inner",[txtfield(0,0,6,"inner;")],1,6) +template("return","return",[txtfield(0,0,7,"return;")],1,7) +menu_temp("program_unit",1,70,["program","program-block"]) +menu_temp("type",1,67,["primitive","identifier","array"]) +menu_temp("prim_id",1,68,["integer","real","boolean","character","string","semaphore","process","coroutine"]) +menu_temp("elem_id",1,66,[" integer"," real"," boolean"," character"," string"," semaphore"," process"," coroutine"," identifier"]) +menu_temp("declaration",1,63,["constant","grouped_var","signal","handlers","class","function","procedure","virt_function","virt_procedure","coroutine","process"]) +menu_temp("s_parameter",1,69,["input","output","inout","fun_par","proc_par","type"]) +menu_temp("parameter",1,67,["input","output","inout","fun_param","proc_param","type"]) +menu_temp("statement",1,53,["assign","copy","call","new_array","kill","exit","repeat","exit repeat","return","inner","block","pref...block","COMPOUND_STATEMENT","INPUT/OUTPUT_STATEMENT","COROUTINE_STATEMENT","PROCESS_STATEMENT","SIGNAL/HANDLER_STATEMENT","SEMAPHORE_STATEMENT"]) +menu_temp("COMPOUND_STATEMENT",1,62,["if_then","if_then_else","do","while","for_to","for_downto","for_step_to","for_step_downto","case"]) +menu_temp("INPUT/OUTPUT_STATEMENT",1,65,["read","write","writeln","writeln(...)"]) +menu_temp("COROUTINE_STATEMENT",1,71,["attach","detach"]) +menu_temp("PROCESS_STATEMENT",1,71,["attach","detach","resume","wait","stop","stop(...)"]) +menu_temp("SIGNAL/HANDLER_STATEMENT",1,68,["raise","return","terminate","wind"]) +menu_temp("SEMAPHORE_STATEMENT",1,68,["lock","unlock","ts","stop(...)"]) +windowsize(17,77) +windowstart(0,0) +mycursord(0,0) +insmode +keys([]) +fkeys([fkey(1),fkey(2)]) +arrows([right,left,up,down,pgup,pgdn,end,home,ctrlend,ctrlhome,esc]) +object(1) +helpfile("edihelp0.hlp") diff --git a/utils/editor.dos/edihelp0.def b/utils/editor.dos/edihelp0.def new file mode 100644 index 0000000..9d0fce5 --- /dev/null +++ b/utils/editor.dos/edihelp0.def @@ -0,0 +1,3 @@ +helptext("scr1_help",112,7,"text operations",1,44,20,35,0) +helptext("top_line_help",112,7,"top line menu operations",1,44,20,35,502) +helptext("scr_help",112,7,"structure operations",1,44,20,35,729) diff --git a/utils/editor.dos/edihelp0.hlp b/utils/editor.dos/edihelp0.hlp new file mode 100644 index 0000000..c641e53 --- /dev/null +++ b/utils/editor.dos/edihelp0.hlp @@ -0,0 +1,3 @@ +h("Esc escape from the field \n (no changes are made)\nReturn end of typing\n (all correct changes are\n respected)\n<- move the cursor to the\n previous character \n-> move the cursor to the\n next character\nHome move the cursor to the\n first character\nEnd move the cursor to the\n last character\nIns change the typing mode\n (insert/overwrite)\nDel delete the given character\nBdel delete the previous charac\n ter") +h("Edit activation of the struc-\n tural editing\nFiles enables operations on\n files\nSetup enables window resizing\n and changes of the actual\n directory\nQuit exit from the editor\n") +h("F2 resize a window\nEsc escape to the main menu\nEnter develop the distinguished\n field (replace the nonter\n minal by a new value)\nAlt-a add a field of the same\n type after the distin-\n guished field\nAlt-b add a field of the same\n type before the distin-\n guished field\nAlt-d delete the distinguished\n field\nAlt-e extend the distinguished\n field to its super-struc\n ture\nAlt-f add the first field to\n the list containing\n the distinguished field\nAlt-l add the last field to\n the list containing\n the distinguished field\nAlt-m modify the distinguished\n field\nAlt-n narrow the distinguished\n field to its first sub-\n structure\nAlt-p prune the distinguished\n field (replace the field\n by a nonterminal)\n") diff --git a/utils/editor.dos/editor0.exe b/utils/editor.dos/editor0.exe new file mode 100644 index 0000000000000000000000000000000000000000..d40f0fec6d80dc84e479f3c5f38a91234e72e5c3 GIT binary patch literal 235206 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 id(STRING) +ID_LIST = ID_LIST1 -> id_list(ID_LIST1) +ID_LIST1 = ID+ separator comma + +VAR_LIST = VAR_LIST1 -> var_list(VAR_LIST1) +VAR_LIST1 = VAR+ separator comma + +VAL_LIST = VAL_LIST1 -> val_list(VAL_LIST1) +VAL_LIST1 = VAL+ separator comma + +AP_LIST = lpar AP_LIST1 rpar -> aplist(AP_LIST1) +AP_LIST1 = APAR+ separator comma + +INDICES = A_EXPR+ separator comma + +EXF_LIST = WR_EXPR+ separator comma +WR_EXPR = VAR_FUN WR_EXPR1 -> wr_exp(VAR_FUN,WR_EXPR1) +WR_EXPR1 = colon A_EXPR WR_EXPR2 -> wr_exp1(A_EXPR,WR_EXPR2), + -> wr_exp11 +WR_EXPR2 = colon A_EXPR -> wr_exp2(A_EXPR), + -> wr_exp22 + + +VAL = id(STRING) -> id(STRING), + int(INTEGER) -> int(INTEGER), + char(CHAR) -> char(CHAR) + +APAR = integer -> integer, + real -> real, + boolean -> boolean, + character -> character, + string -> string, + semaphore -> semaphore, + coroutine -> coroutine, + process -> process, + EXPR -> expr(EXPR) + +CS_TYPE = coroutine ->coroutine, + process -> process, + id(STRING) -> id(STRING) + +A_EXPR = A_EXPR plus A_EXPR -> plus(A_EXPR,A_EXPR), + A_EXPR minus A_EXPR -> minus(A_EXPR,A_EXPR) + -- + A_EXPR times A_EXPR -> times(A_EXPR,A_EXPR), + A_EXPR divides A_EXPR -> divides(A_EXPR,A_EXPR), + A_EXPR div A_EXPR -> div(A_EXPR,A_EXPR), + A_EXPR mod A_EXPR -> mod(A_EXPR,A_EXPR) + -- + minus A_EXPR -> min(A_EXPR), + lpar A_EXPR rpar -> A_EXPR, + int(INTEGER) -> int(INTEGER), + r(REAL) -> r(REAL), + VAR_FUN -> var_fun(VAR_FUN) + + +B_EXPR = B_EXPR or_ B_EXPR -> or_(B_EXPR,B_EXPR) + -- + B_EXPR and_ B_EXPR -> and_(B_EXPR,B_EXPR) + -- + ACO_EXPR nequal ACO_EXPR -> nequal(ACO_EXPR,ACO_EXPR), + ACO_EXPR equal ACO_EXPR -> equal(ACO_EXPR,ACO_EXPR), + A_EXPR lesseq A_EXPR -> lesseq(A_EXPR,A_EXPR), + A_EXPR less A_EXPR -> less(A_EXPR,A_EXPR), + A_EXPR greatereq A_EXPR -> greatereq(A_EXPR,A_EXPR), + A_EXPR greater A_EXPR -> greater(A_EXPR,A_EXPR), + O_EXPR is CS_TYPE -> is(O_EXPR,CS_TYPE), + O_EXPR in CS_TYPE -> in(O_EXPR,CS_TYPE) + -- + not_ B_EXPR -> not_(B_EXPR), + lpar B_EXPR rpar -> B_EXPR, + ts lpar VAR rpar -> ts(VAR), + VAR_FUN -> var_fun(VAR_FUN), + true_ -> true_, + false_ -> false_ + + +C_EXPR = VAR_FUN -> var_fun(VAR_FUN) + -- + char(CHAR) -> char(CHAR) + +O_EXPR = none -> none, + wait -> wait, + THIS dot O_EXPR1 -> dot(THIS,O_EXPR1), + this ID -> this(ID), + O_EXPR1 -> o_exp1(O_EXPR1) +O_EXPR1 = O_EXPR2 dot O_EXPR1 -> dot(O_EXPR2,O_EXPR1), + O_EXPR3 -> o_exp3(O_EXPR3) +O_EXPR2 = VAR_FUN2 qua ID -> qua(VAR_FUN2,ID), + O_EXPR3 -> o_exp3(O_EXPR3) +O_EXPR3 = new ID lpar AP_LIST1 rpar ->new(ID,AP_LIST1), + new ID -> new1(ID), + VAR_FUN2 -> var_fun2(VAR_FUN2) + +AC_EXPR = A_EXPR -> a_exp(A_EXPR), + C_EXPR -> c_exp(C_EXPR) + +ACO_EXPR = A_EXPR -> a_exp(A_EXPR), + C_EXPR -> c_exp(C_EXPR), + O_EXPR -> o_exp(O_EXPR) + +EXPR = A_EXPR -> a_exp(A_EXPR), + B_EXPR -> b_exp(B_EXPR), + C_EXPR -> c_exp(C_EXPR), + O_EXPR -> o_exp(O_EXPR) + +THIS = this ID -> this(ID) + +VAR_FUN = THIS dot VAR_FUN1 -> dot(THIS,VAR_FUN1), + VAR_FUN1 -> var_fun1(VAR_FUN1) +VAR_FUN1 = O_EXPR2 dot VAR_FUN1 -> dot(O_EXPR2,VAR_FUN1), + VAR_FUN2 -> var_fun2(VAR_FUN2) +VAR_FUN2 = ID lpar AP_LIST1 rpar -> fcall(ID,AP_LIST1), + ID lbra INDICES rbra -> indvar(ID,INDICES), + id(STRING) -> id(STRING) + +VAR = THIS dot VAR1 -> dot(THIS,VAR1), + VAR1 -> var1(VAR1) +VAR1 = O_EXPR2 dot VAR1 -> dot(O_EXPR2,VAR1), + VAR2 -> var2(VAR2) +VAR2 = ID lbra INDICES rbra -> indvar(ID,INDICES), + id(STRING) -> id(STRING) + +VAR_MAIN = main -> main, + VAR -> var(VAR) + +IF_B_EXPR = IF_B_EXPR orif IF_B_EXPR -> orif(IF_B_EXPR,IF_B_EXPR) + -- + IF_B_EXPR andif IF_B_EXPR -> andif(IF_B_EXPR,IF_B_EXPR) + -- + B_EXPR -> b_exp(B_EXPR) + +SIMP_EXPR = minus SIMP_EXPR1 -> min(SIMP_EXPR1), + int(INTEGER) -> int(INTEGER), + r(REAL) -> r(REAL), + id(STRING) -> id(STRING), + char(CHAR) -> char(CHAR), + str(STRING) -> str(STRING) + +SIMP_EXPR1 = int(INTEGER) -> int(INTEGER), + r(REAL) -> r(REAL), + id(STRING) -> id(STRING) + diff --git a/utils/editor.dos/prolog.err b/utils/editor.dos/prolog.err new file mode 100644 index 0000000..8c084fd --- /dev/null +++ b/utils/editor.dos/prolog.err @@ -0,0 +1,157 @@ + 1 Illegal character. + 3 Illegal keyword. + 4 Use the format CODE=dddd or TRAIL=dddd. + 5 This size must not exceed 64K. + 10 Illegal character. + 11 Character constants should be terminated by a ' + 12 The comment is not terminated by */ + 14 The name is too long. (max. 250 characters) + 15 The textstring is too long. (max. 250 characters) + 16 The textstring should be terminated with a " in the same line. + 17 Real constant is out of range. + 18 A hex digit is expected after a dollar sign. +100 Undeclared domain (or mis-spelling). +102 Standard domains must not be declared. +103 This domain was declared previously. +104 Syntax error: = or , expected. +105 Name expected (either a domain or a functor). +106 Alternatives in a list declaration are illegal. +107 This functor has already been used in the domain declaration. +108 Functor name expected. +109 Domain name expected. +110 Syntax error in domain declaration. ) or , expected. +111 WARNING: Domain used as a functor. (F10=Ok, Esc=Abort). +112 WARNING: Domain declaration with a single functor. (F10=Ok, Esc=Abort). +200 Illegal start of domain declaration. +201 This name is reserved for a standard predicate. +202 This predicate is already declared. +204 Domain name or ) expected. +205 Undeclared domain or mis-spelling. +206 Too many parameters used in this predicate. +208 Syntax error in predicate declaration. ) or , expected. +209 Illegal number of parameters. +210 Only one database predicate declaration is allowed. +211 This predicate is declared as a database predicate. +220 Syntax error in declaration of global predicates: "-" expected. +221 Syntax error. "(" expected. +222 Syntax error in flowpattern. "i" or "o" expected +223 Flowpattern has the wrong length. +226 Syntax error. "predicates" or "domains" expected. +227 Project name expected. +228 At most one internal goal may be specified. +229 The include file does not exist. +230 Include files may not be used recursively. This file is already included. +231 Too many include files. The maximum is 10. +232 The include file is too big. +233 "database" declarations must precede "predicates". +234 Global predicates must be declared first. +235 The FILE domain can not be a local domain. +400 Syntax error. (Illegal start of predicate declaration). +401 No clauses for this predicate. +402 Syntax error. AND , or . expected. +403 Predicate name expected. +404 Undeclared predicate or mis-spelling. +405 ( expected. +406 ) or , expected. +407 Illegal number of parameters: refer to declaration. +408 This sign should be followed by a number. +409 Syntax error - this token is misplaced. +410 Variable expected. +411 , expected. +412 Syntax error. +413 Syntax error. , | or ] expected. +414 Number or variable expected. +415 Clauses for the same predicate should be grouped. +416 Comparison operator expected i.e. one of < <= >= >< <>. +417 Text after . is prohibited here. +418 Unexpected end of text. +419 Syntax error in clause body. +420 WARNING: The variable is only used once. ( F10=Ok, Esc=abort ). +421 The parameter is missing. +422 . :- or IF expected. +423 , or ) expected. +424 This facility is not implemented in this version. +425 A list should be terminated by a ] +426 Initializing a "database" is not allowed in a submodule. +427 To generate an object module the program must contain a goal. +428 The free variable in findall can only be used inside findall. +429 The free variable in findall does not occur in the predicate. +450 Syntax error. +600 Too many domain names. +601 Too many alternatives in the domain declaration. +602 Too many predicate names. +603 Too many parameters in this clause. +604 Too many literals in this clause. +605 Too many clauses. +606 Too many arguments. +607 Too many domain names on the left hand side of a domain declaration. +608 Too many database predicates. +610 Code array too small: use code=size to get more space. +611 Trail array too small: use trail=size to get more space. +612 Overflow: too many structures in clause. +614 Object module too big. (split into smaller modules ). +701 An internal system error has occurred. Please contact your dealer. +1000 The parameters in makewindow are illegal. +1001 The cursor values are illegal. +1002 Stack overflow. Re-configure with Setup if necessary. +1003 Heap overflow. Not enough memory or an endless loop. +1004 Arithmetic overflow. +1005 The window referred to is unknown. +1006 There is not enough room in the editor for the text. +1007 Heap overflow. Not enough memory or an endless loop. +1008 Code overflow. Use code=size to get more space. +1009 Trail overflow. Use trail=size to get more space. +1010 Attempt to open a previously opened file. +1011 Attempt to re-assign input device to a unopened file. +1012 Attempt to re-assign output device to a unopened file. +1013 'system' call tries to execute a program which is too big or resident. +1014 Division by zero. +1015 Illegal window number. +1016 Maximun number of windows exceeded. +1018 The file isn't open. +1019 Illegal file mode. (Should be the range 0-1). +1020 Free variables are not allowed here. +1021 Negative values or Zero are not allowed as parameter to LOG and LN. +1022 Negative values are not allowed as parameter to SQRT. +1023 Overflow in real operation. +2000 Not enough storage space for the text. +2001 Can't execute a write operation. +2002 Impossible to open : +2003 Impossible to erase : +2004 Illegal disk : +2005 >>> Text buffer full <<< +2006 Can't execute a read operation. +2200 Type error. +2201 Free variable in expression. +2204 The variable will never become bound at this occurance. +2205 Type error: Illegal variable type for this position. +2206 Type error: The functor does not belong to the domain. +2207 Type error: The compound object has the wrong number of arguments. +2208 Expressions may not contain objects of this type. +2209 Comparisons may only be made between standard types. +2210 Objects from these domains cannot be compared. +2211 There is no corresponding list domain. +2212 Type error: This parameter can't handle compound objects. +2213 Type error: This argument can't be a real. +3001 Loop in the flow analysis. Don't use a compound flowpattern here. +3002 WARNING: Composite flowpattern. (F10=ok, Esc=abort) +3003 This flowpattern doesn't exist for the standard predicate. +3004 Free variable in NOT. +3005 Free variables are not allowed here. +3006 The last variable in FINDALL must be free. +3007 Free variable in expression. +3008 WARNING: The variable is not bound in this clause. (F10=ok, Esc=abort) +3009 WARNING: Two free variables in expression. (F10=ok, Esc=abort) +3010 WARNING: Variable used twice with output flowpattern.(F10=ok, Esc=abort) +3011 WARNING: this will create a free variable. ( F10=Ok, Esc=abort ). +3012 The variable is not bound in this clause. ( Declare reference domain ) +3013 Two free variables in expression. ( Declare reference domain ) +3014 Variable used twice with output flowpattern. ( Declare reference domain ) +3015 This will create a free variable. ( Declare reference domain ) +3016 Occur check: A variabel can not contain itself. +4001 WARNING: non deterministic clause. ( F10=Ok, Esc=abort ). +4002 WARNING: non deterministic predicate. ( F10=Ok, Esc=abort ). +5001 Error in reading symbol table. +5003 Error in writing symbol table. +5103 Use the graphics predicate to initialize the screen. +5107 Illegal screen mode. (Should be in range 1-5). diff --git a/utils/editor.dos/readme b/utils/editor.dos/readme new file mode 100644 index 0000000..df30a92 --- /dev/null +++ b/utils/editor.dos/readme @@ -0,0 +1,27 @@ + + + EDYTOR STRUKTURALNY JEZYKA LOGLAN + wersja z listopada 1989 roku + + Jerzy Bartoszek + Osrodek Informatyki Politechniki Poznanskiej + Pl. M.Sklodowskiej-Curie 5 + 60-965 Poznan + + +1.Do poprawnego dzialania edytora niezbedne sa + nastepujace pliki: + EDITOR0.EXE zawierajacy program edytora, + EDIBASE0.DBA zawierajacy baze danych, + EDIHELP0.DEF zawierajacy definicje helpow, + EDIHELP0.HLP zawierajacy tresc helpow. +2.Plik EDYTRAP2.CHI zawiera instrukcje uzytkowania. + Podczas dzialania edytora jest dostepny + (za pomoca F1) help. +3.Plik GRAMMAR0 zawiera gramatyke wyrazen wpisywanych + tekstowo przez uzytkownika. Postac tych wyrazen moze + nieznacznie odbiegac od standartu. +4.Plik PROLOG.ERR zawiera teksty bledow prologowych. +5.Edytor wywoluje sie poleceniem EDITOR0. + Jego dzialanie konczy Quit z glownego menu. + diff --git a/utils/lotek/aide_lot.ek b/utils/lotek/aide_lot.ek new file mode 100644 index 0000000..de73ec5 --- /dev/null +++ b/utils/lotek/aide_lot.ek @@ -0,0 +1,121 @@ + + Warsaw 1990, Michal Pakier + + Loglan Environment Manager + -------------------------- + +1:Program installation +---------------------- + Just run LOTEK.EXE - the system contains some additional files but you + need not know anything about that. + + The whole system comprises of the following files : + LOTEK.EXE - main program, + MPLOGED.EXE - editor, + LSTTEST.EXE - auxiliary file used during compilation, + LOTEK.HLP - help file text, + LOTEKINS.EXE - installation file. + +2:Text editor +------------- + You may treat the whole program as a Loglan-oriented editor. + It supports the following facilities : + 1.Block operations + All common block operations, such as deleting, moving, copying, + indenting, unindenting, saving, loading, are implemented as well as some + sophisticated ones : moving and copying with whole block adjusting, + making a frame in comments for blocks (you may set such frame parameters + as width, pattern, text adjusting inside the block). + You may also copy or move a block into itself (while moving,the block + will be adjusted in such a way that the block beginning will be placed + at the cursor position). + 2.Find and replace word operations + You may find or find and replace given word or the word pointed + by the cursor. You may also change small letters into capital ones + (or the other way round) in Loglan keywords globally or locally. + There is a function that changes all the characters into small + or capital letters (globally, locally or in comments). + 3.Fast moving round the text + You may mark two positions in the text and go to that places + from anywhere. You may go to the text beginning or end, too. + 4.Help + You may always press the F1 key to get short review of all available + at the moment operations. + 5.Macro instructions + They really make writing programs much easier than when you have to get + round without them. + You may bind a macro instruction to every key from among [a..z,0..9, + F1..F10]. A macro is then called just by pressing the Alt key + with desired key. + A macro may be any sequence of characters. Using macros you may define + on-line some useful operarations, eg inserting a blank line, upcasing + words, marking blocks, ... + 6.File handling + The following operations are implemented : + loading a file from disc, + editing a file (unnamed new file has name 'noname.log'), + saving a file to disc, + changing a file name. + You may also choose a file for editing from among last ten used. + +3:Windows +--------- + You may use three windows. + The first one is the main window, in which you may process everything that + is supported by the system. In the second window you cannot only compile + programs and process operations from window 'Execute'. The third window + does not let you edit but is used for viewing the database that contains + data about Loglan. + You may use up to two windows at the same time. The main window is always + visible so you cannot use both of the additional windows at the same time. + While being in the main window you may move or copy a block from another + visible window (all options are available). + +4:Compiling +----------- + You may compile a file from the main window without returning to DOS. + You may execute the first, the second pass of compilation, run compiled + program, trace run program. + You do not have to remember which passes of compilation have been executed + or whether have they been executed at all - LOTEK will take care of it. + You may view found errors after the first pass of compilation. Information + about errors will displayed in the bottom line and the cursor will indicate + the position of its occurence. + +5:Window 'Execute' +------------------ + You may define this window during the installation. It lets you call any DOS + function or any executable program. After this call you will find yourself + back in the editor as if you were doing nothing but editing. You may pass + command line parameters (name of edited file) to called programs, too. + +6:Database +---------- + It is meant to be a database on Loglan but you may set any other database + instead (created by program MPH) during installation. + Such a database consists of maximum 6 windows, every of which may comprise + of maximum 22 lines. Every line is mapped to any length contents and every + contents line is mapped to any length text. + While viewing the database you may evoke some of the editor functions : + namely finding given word and marking a block. A marked block may be later on + moved to the main program. + It is possible to have the information from the database you are interested + in in one window and to edit your program in the main window. +7:Using LOTEK +--- ---------- + Just run the program LOTEK. + There are displayed all the functions available at the moment at the bottom + of the screen. If you want to have more room for editing, just press the F10 + key and this information will disappear. + LOTEK saves all the options on file MPLED.DAT before exit, so when you run + LOTEK once more you will find yourself in exactly the same conditions + (ie the same file, the same cursor position, the same options, ...) as you + were in when using LOTEK for the last time. + The editor has a built-in mechanism protecting the monitor - there will + appear a sky on the screen after two minutes during which you have not + pressed any key. The sky will vanish when you press any key. + LOTEK always saves the last but one version of the program, which is being + edited, so you have a copy of the program. This file's name is the same as + yours file but its extension is .BAK. + +  \ No newline at end of file diff --git a/utils/lotek/anglotek.hlp b/utils/lotek/anglotek.hlp new file mode 100644 index 0000000..c192d95 --- /dev/null +++ b/utils/lotek/anglotek.hlp @@ -0,0 +1,561 @@ +(* Loglanizator Tekstowy wersja 1.0 1990 Warszawa Michal Pakier *) +===============REKORD 1=======================================|=============== ++ 22 2 + Using the editor LOTEK version 1.0 + + ³F2..............Save File +Scrolling text ³ cursor moves ³F3........File operations + by line: ³ one word ³F4..Errors of compilation +^U.............up ³ relatively to ³F8.....Auxiliary programs +^D...........down ³ the line above ³F9......Compilation & run + by page: ³^N........to right³F10...........Menu on/off +PgDn.........down ³^P.........to left³F5................Windows +PgUp...........up ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ- + Jump to ³^K.......block operations³^Y.....delete line +^PgDn.....begin of³^Q.......replace & search³ + text ³^J..........Jumps in text³ delete character +^PgUp.......end of³^W....Windows operations ³BackSpace..to left + text ³^V.........Macrocommands ³Del.......to right +^Home.....begin ofÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ- + window ³^A...............delete to the begin of line +^End.......end of ³^S.................delete to the end of line + window ³F1........On line HELP;press when in trouble +ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ- + + Help on HELP press <0> +===============REKORD 2=======================================|=============== ++ 11 + HELP on HELP. + + In any moment you can press the key F1 and obtain an infor- +mation on currently available actions. It may suggest further +request of more detailed informations. In such a case press one +of keys {0,1,2,3,4,5,6,7,8,9}, which is shown on screen in the +angles e.g.<2>. + + + Esc leaving Help + F1 principal information of Help +===============REKORD 3=======================================|=============== ++ 8 4 + Saving file on disk (F2,F3S) + +It may happen that for some reason we cannot write file back to +the directory from which it is read. In such a case press (F3L) +and choose the directory in which we have all rights next you +can write file using F3 W. + + More on file operations, press <0> +===============REKORD 4=======================================|=============== ++ 15 23 3 24 25 26 41 + File operations (F3) + +permit to load, write file or to begin a new file to edit + +Your choices: + + L Loading a file from disk <0> + S Saving file on disk <1> + N New file edition <2> + W Write a file on disk <3> + P Pick one of the lastly used files <4> + O different Options <5> + G Information on the edited files and on + free memory + Q Quit the LOTEK environment +===============REKORD 5=======================================|=============== ++ 16 + Correction of ERRORS + +This option facilitates correction of errors in Loglan program. +In the lowest line you see number of line with error and short +description of the error. The cursor is placed on the error's +occurrence. In certain cases it locates precisely the line and +the column of error, if it is not the case then only line is +shown and its first column. If you have menu bar (F10) then a +submenu concerning errors' scrolling appears. +You have the following choices: + Ctrl F5 - Move to the first error + Ctrl F6 - Move to the last error + Ctrl F8 - Show Next error + Ctrl F7 _ Show previous error + Ctrl F10 - Exit from the mode errors' corrrection +Press F4 for exit from errors' correction. +===============REKORD 6=======================================|=============== ++ 8 + CHANGING WINDOW + + You can open a new window or change the active one. + F Full screen all other windows are closed + H Help on Loglan here you can consult doc on Loglan + use Tab to move between documents + A Auxiliary window + M Main window +===============REKORD 7=======================================|=============== ++ 17 22 + AUXILIARY PROGRAMS + +You can execute programs which appear in this window without +exiting LOTEK. This window may be defined by you (see lotek.pth +and LOTEKINS.EXE). It enables, among others, certain operations +on the file being edited, the name of the file is transmitted +as parameter to the called program. As one of options you can +put the LOTEKINS program which can facilitate modifications of +the window. You can put a call of a program in this window in- +to a macrocommand <0>. +(Example: If we have a computer with two monitors and if you +put instructions C COLOR (mode co80) and M MONO (mode mono) +then macrocommand @8M@5H@5F will allow to consult do- +cumentation on the monitor controlled by Hercules card and +macro @8C@5M@5F will permit editing on a colour monitor, +still having database on Loglan on white & black monitor.) + +===============REKORD 8=======================================|=============== ++ 11 36 + COMPILING YOUR PROGRAM + +Your choices are: + L: Pass 1 Compilation-first phase(program Loglan). During + this pass all syntax errors are detected.(Use F4) + G: Pass 2 Second or First and second phase of compilation + (program Gen). + R: Run Program execution (with compilation if needed). + D: Debuger First the program is executed and then you can + watch command after command its execution. + O: Options Different options of compilation <0> +===============REKORD 9=======================================|=============== ++ 17 27 28 29 30 31 32 33 34 35 + OPERATIONS ON BLOCKS + +Press Ctrl_K and then a key which corresponds to the desired +action. If you do not know what to choose wait 2 secs. and +a frame will appear with all options. + +Your choices are: + + K,B,T,L - marking a block <0> + Y - deleting the marked block <1> + C,V - copying and moving the block <2> + S,M - copying and moving with indentation <3> + R,W - block to and from the disk <4> + U,I - shifting the block <5> + H - hiding the block <6> + F - framing a block (e.g. a comment) <7> + O - options <8> +===============REKORD 10=======================================|=============== ++ 13 37 38 39 40 + GO TO INDICATED PLACE IN TEXT + +Press Ctrl_J and then a key which corresponds to the desired +action. If you do not know what to choose wait 2 secs. and +a frame will appear with all options. + +Your choices are: + + S - mark this place for return <0> + R - return to the marked place <1> + J - jump to the marked place <2> + L - jump to the given line + B,K - jump to the begin (resp. to the end) of block <3> +===============REKORD 11=======================================|=============== ++ 17 15 16 17 18 19 20 + Search and replace operations + +Press Ctrl_Q and then a key which corresponds to the desired +action. If you do not know what to press wait 2 secs. and +a frame with options will appear. + +Your choices: + + F - find a word <0> + A - Alter find a word and replace <1> + C - replace character <2> + K - replace key words <3> + T - find another occurrence of the current word <4> + R - find and replace word currently pointed by cursor <5> + +REMARK: Pressing Ctrl L you can repeat the lastly executed + action of searching/replacing. +===============REKORD 12=======================================|=============== ++ 13 14 + Documentation on Loglan - Loglan's database + + Each line on the screen is a title of a section. + Press ENTER to see the highlighted section. + + Press Tab (& cursor left, right) to change (choose) a document + or a chapter. + cursor up - prevoius section, + cursor down - next section, + Ctrl PgUp - to the begin of list of sections, + Ctrl PgDn - to the end of list of sections, + PgUp,PgDn - previous (next) page of list of sections, + Ctrl_Q_F - searching a word. +===============REKORD 13=======================================|=============== ++ 11 12 14 + Loglan's database - in a section + + Enter - return yo the list of sections <0> + Tab - change(choose) a document, a chapter <1> + Up,Down,Left,Right - moving the cursor + Home,End - to the begin (end) of line + Ctrl PgUp - to the begin of text + Ctrl PgDn - to the end of text + PgUp,PgDn - page up (page down) + Ctrl_K_B,K,L,T - marking a block + Ctrl_Q_F - searching a word +===============REKORD 14=======================================|=============== ++ 9 + Loglan's database - CHOOSING A DOCUMENT + + On the screen you see names of documents to consult. +Use cursor left & right to choose the type of document: + opisy=reports, funkcje=functions, tablice=tables. +Use cursor up & down, or Home & End to choose a document. +Press Enter to confirm your choice and to see the chosen doc. + + Press Esc to return to your last choice. +===============REKORD 15=======================================|=============== ++ 13 + (F) Searching a word + +Give a word you are looking for (Find :?). +Next define the options. Then search is performed according to +your choice of options. If word is found the cursor is located +after it. +You can choose the options: + G.......global search, from the beginning (or the end) of text. + B..............................................backward search. + n.................................searching of n-th occurrence. + U.........................upper & lower case lettersidentified. + W............................................whole word search. + L..............................searching inside a marked block. +===============REKORD 16=======================================|=============== ++ 16 + (A) Replace a word (alter) + +First, give a word to be replaced (Find :?) +Second, give a word to be put into (Replace with :?) +Third, define options. +Search & replace action begins: if a searched word is found then +at the top of the screen you see a demand of confirmation. + +The options are : + G.......global search, from the beginning (or the end) of text. + B..............................................backward search. + n..............................replacing up to n-th occurrence. + U.........................upper & lower case lettersidentified. + W............................................whole word search. + L..............................searching inside a marked block. + N.......... .uNconditional replace (no confirmation required). +===============REKORD 17=======================================|=============== ++ 11 + (C) Replace Characters + +This functionality enable to exchange capital letters to small +ones and viceversa: + D..........................................Put capital letters. + S............................................Put small letters. + G........Global replace from the begin or from the end of text. + B.............................................Backward replace. + L.........................Replace inside the highlighted block. + C.................................Replace inside comments only. + T..................................Replace inside program only. +===============REKORD 18=======================================|=============== ++ 10 + (K) Replace keywords of Loglan + +This function permits to put all the keywords of Loglan in the +selected case (lower or upper). +Your choices are: + D.......................................Put in capital letters. + S.........................................Put in small letters. + G........Global replace from the begin or from the end of text. + B.............................................Backward replace. + L............................Replace inside thehighlited block. +===============REKORD 19=======================================|=============== ++ 12 + (T) Searching the word indicated by cursor + +If word is found the cursor is located after it. +You can choose the options: + G.......global search, from the beginning (or the end) of text. + B..............................................backward search. + n.................................searching of n-th occurrence. + U........................upper & lower case letters identified. + W............................................whole word search. + L..............................searching inside a marked block. +===============REKORD 20=======================================|=============== ++ 15 + (R) Search andReplace the word indicated by cursor + +Give a word to be put into (Replace with :?) +Next, define options. +Search & replace action begins: if a searched word is found then +at the top of the screen you will see a demand of confirmation. + +The options are : + G.......global search, from the beginning (or the end) of text. + B..............................................backward search. + n.................................replacing up n-th occurrence. + U.........................upper & lower case lettersidentified. + W............................................whole word search. + L..............................searching inside a marked block. + N.......... .uNconditional replace (no confirmation required). +===============REKORD 21=======================================|=============== ++ 13 29 30 + Exchange block between windows and other operations + +Press Ctrl_W and then a key which corresponds to the desired +action. If you wait 2 secs. then a frame appears with choices +suggested. + +Options to choose: + C - copy the block from the second, visible on screen window, + V - move the block from the second, visible on screen window, + S - copy with indentation from the other window, + M - move with indentation from the other window. + +More on C,V <0> More on S,M <1> +===============REKORD 22=======================================|=============== ++ 19 + Defining macrocommands + +You can create, store and apply your macrocommands i.e. the +sequences of keys. A macrocommand can be associated with a let- +ter, digit or an F key. A macrocommand is executed when you +press simultaneously Alt+corresponding key. +Definition of a macrocommand may contain usual characters ASCII +and also the following combinations of keys: + ^.............denotes Ctrl + following key (A..Z and 0..9) + &..............denotes Alt + following key (A..Z and 0..9) + @........denotes a functional key. The next key may be : + 1..0 - F1..F10 ³ <>^v - cursor ³ H - Home ³ E - End ³ + U - PgUp ³ D - PgDn ³ I - Insert ³ L - Delete ³ + S - Esc ³ B - Backspace ³ ³ ³ + C - Enter ³ ³ ³ ³ + #......the next character is not interpreted e.g.## denotes # +Braces permit to iterate the string inside them. +E.g. the string {^C(* *)}12 will cause cration of 12 new lines +containing the string "(* *)" +===============REKORD 23=======================================|=============== ++ 17 + (L) Loading a file + +You can enter a file name or a mask e.g. *.log defining a group +of files. In the first case the file is loaded (or initialized) +In the second case all names that correspond to the mask are +shown. + +>>>You can press: + Esc.........Return without loading anything + +   < >......................Moving in window. + Enter.........If a file is indicated then it is loaded + If a directory is indicated then it is opened + + PgUp,PgDn......Previous or next page + (the window contains maximum 20 names). + F4............change directory +===============REKORD 24=======================================|=============== ++ 5 + (N) New file editing + +The scrren is emptied and an edition of the file NONAME.LOG +begins. At saving time Lotek will propose to change the name +of the file. +===============REKORD 25=======================================|=============== ++ 5 + (W) Save the edited file as ... + +It permits to change the name of the edited file and to save it +in the current directory.(see L option for change of directory) + +===============REKORD 26=======================================|=============== ++ 4 + (P) Pick up + +you can choose a name among lastly edited files or Load (L) + +===============REKORD 27=======================================|=============== ++ 6 + Marking a block + + B - mark begin of block, + K - mark end of block, + T - mark the word indicated by cursor as a block, + L - mark the line indicated by cursor as a block. +===============REKORD 28=======================================|=============== ++ 3 + Deleting block + + You can delete the marked block. +===============REKORD 29=======================================|=============== ++ 15 30 + (C,V) Copying or moving the highlighted block + +Function.C. copies the highlighted block (Ctrl K + B,K,T,L) +to the current position of cursor. +Begin of the block will be positioned exactly on the cursor. +Other lines are not shifted. + +REMARK: One can copy the block into itself. + +Function.V. moves the highlighted block (Ctrl K+ B,K,T,L) +to the current position of cursor. +The earlier occurrence of the block dissapears. +Begin of the block will be positioned exactly on the cursor. +Other lines are not shifted. + + ----> Ctrl K S,M <0> +===============REKORD 30=======================================|=============== ++ 18 29 + (S,M) Copy or Move the block with indentation + +Function.S. copies the highlighted block (Ctrl K + B,K,T,L) +to the current position of cursor. It differs however from +the function Ctrl K C. All lines of the block will begin in +the position of cursor. + +REMARK: One can copy the block into itself. + +Function.M. moves the highlighted block (Ctrl K+ B,K,T,L) +to the current position of cursor. It differs however from +the function Ctrl K V. All lines of the block will begin in +the position of cursor. +The earlier occurrence of the block dissapears. + +REMARK: If you move the block into itself it will result in +shifting it horizontally, it will move to the cursor position. + -----> Ctrl K C,V <0> +===============REKORD 31=======================================|=============== ++ 10 23 25 + (R,W) Reading and Writing a block + +Function R enables inclusion of a file from the disk. +The file is included in the current postion of the cursor +without indentation (as Ctrl K C does). +A window appears and you can choose the name of file + see F3 L <0> +Function W enables saving of the block on disk. +A window appears and you can choose the name of file + see F3 W <1> +===============REKORD 32=======================================|=============== ++ 8 + (I,U) Shift the block to right or to left + +Function.I.shifts all lines of the block one position to left. + It applies to the full first and last line of the block. + +Function.U.shifts all lines of the block one position to right. + It applies to the full first and last line of the block. + +===============REKORD 33=======================================|=============== ++ 5 + Hiding block + + You can unmark the marked block. +If you repeat this action then the block is marked again. + +===============REKORD 34=======================================|=============== ++ 6 35 + (F) Frame around a block + + If you selected a block then a frame can be put around it. +Options permit to define parameters of the frame. +Each line is enclosed in (* *) i.e. it is a comment. + -----> Ctrl K O <0> +===============REKORD 35=======================================|=============== ++ 19 + (O) Parameters of frames + +3 lines determine the pattern of frame + define 3 characters for top, inside and bottom lines of frame. + - top line: leftmost, inside, rightmost character; + - inside line: leftmost, inside, rightmost character; + - bottom line: leftmost, inside, rightmost character; + F............................Position of first column of frame. + - must be between 0..255, + - must be less then L, the last column of frame, + - 0 has a special meaning:frame will begin in the first + column of indicated text, + L.....................Position of the last column of the frame + - must be between 0..255 + - must be greater then F, the first column of frame + - 0 has a special meaning: frame will end in the last column + of indicated text, + T.....Put text in the frame: to the LEFT, to the RIGHT, CENTER + in frame. +===============REKORD 36=======================================|=============== ++ 14 + Compilation options + + + +D: Debug info on/off Debug on causes: firstly - execution + of the program is recorded on special file, secondly - you can + watch the sequence of executed commands. + +M: Memory ______ Divided by 4 amount of memory atributed + to our pogram. It may assume values from 16384 to 100000. + If you can select 16384 to accelerate the program. + +C: Cursor on/off For amateurs only. It enables to hide + cursor during the program execution. +===============REKORD 37=======================================|=============== ++ 4 + (S) Marking a place in the text + +This function memorises the current position of the cursor. +It is possible to reposition cursor quickly in this place. +===============REKORD 38=======================================|=============== ++ 5 + (R) Go to the marked place and ... + +The difference with respect to Ctrl J J lies in that befor we +move to an earlier marked place, we mark the current position +This enables a return with commands Ctrl J J/R. +===============REKORD 39=======================================|=============== ++ 4 + (J) Go to an earlier marked place + +Cursor is moved to the place which was earlier marked with the +use of Ctrl J S command +===============REKORD 40=======================================|=============== ++ 4 + Go to block + + B - go to the begin of the highlighted block + K - go to the end of the highlighted block +===============REKORD 41=======================================|=============== ++ 20 + File options (F3O) + +Your choices: + + S..it is the number of line dividing two windows of Lotek. + (e.g. between main file and auxiliary file or between + main file and Loglan's database), + B..backups? If your answer is yes then saving file on disk + causes that the previous version of the file is saved + with an extension .BAK + + D..Delay of idle time. + If no key is pressed during D time then the screen shows + a sky with stars blinking. + + W..delay of showing menus. + If you choose an action of editor say Ctrl+K then first + you see the headline of a menu window and the window + itself appear after W time. + +=============KONIEC============================================|============== + + + + + + + + + diff --git a/utils/lotek/englotek.txt b/utils/lotek/englotek.txt new file mode 100644 index 0000000..de73ec5 --- /dev/null +++ b/utils/lotek/englotek.txt @@ -0,0 +1,121 @@ + + Warsaw 1990, Michal Pakier + + Loglan Environment Manager + -------------------------- + +1:Program installation +---------------------- + Just run LOTEK.EXE - the system contains some additional files but you + need not know anything about that. + + The whole system comprises of the following files : + LOTEK.EXE - main program, + MPLOGED.EXE - editor, + LSTTEST.EXE - auxiliary file used during compilation, + LOTEK.HLP - help file text, + LOTEKINS.EXE - installation file. + +2:Text editor +------------- + You may treat the whole program as a Loglan-oriented editor. + It supports the following facilities : + 1.Block operations + All common block operations, such as deleting, moving, copying, + indenting, unindenting, saving, loading, are implemented as well as some + sophisticated ones : moving and copying with whole block adjusting, + making a frame in comments for blocks (you may set such frame parameters + as width, pattern, text adjusting inside the block). + You may also copy or move a block into itself (while moving,the block + will be adjusted in such a way that the block beginning will be placed + at the cursor position). + 2.Find and replace word operations + You may find or find and replace given word or the word pointed + by the cursor. You may also change small letters into capital ones + (or the other way round) in Loglan keywords globally or locally. + There is a function that changes all the characters into small + or capital letters (globally, locally or in comments). + 3.Fast moving round the text + You may mark two positions in the text and go to that places + from anywhere. You may go to the text beginning or end, too. + 4.Help + You may always press the F1 key to get short review of all available + at the moment operations. + 5.Macro instructions + They really make writing programs much easier than when you have to get + round without them. + You may bind a macro instruction to every key from among [a..z,0..9, + F1..F10]. A macro is then called just by pressing the Alt key + with desired key. + A macro may be any sequence of characters. Using macros you may define + on-line some useful operarations, eg inserting a blank line, upcasing + words, marking blocks, ... + 6.File handling + The following operations are implemented : + loading a file from disc, + editing a file (unnamed new file has name 'noname.log'), + saving a file to disc, + changing a file name. + You may also choose a file for editing from among last ten used. + +3:Windows +--------- + You may use three windows. + The first one is the main window, in which you may process everything that + is supported by the system. In the second window you cannot only compile + programs and process operations from window 'Execute'. The third window + does not let you edit but is used for viewing the database that contains + data about Loglan. + You may use up to two windows at the same time. The main window is always + visible so you cannot use both of the additional windows at the same time. + While being in the main window you may move or copy a block from another + visible window (all options are available). + +4:Compiling +----------- + You may compile a file from the main window without returning to DOS. + You may execute the first, the second pass of compilation, run compiled + program, trace run program. + You do not have to remember which passes of compilation have been executed + or whether have they been executed at all - LOTEK will take care of it. + You may view found errors after the first pass of compilation. Information + about errors will displayed in the bottom line and the cursor will indicate + the position of its occurence. + +5:Window 'Execute' +------------------ + You may define this window during the installation. It lets you call any DOS + function or any executable program. After this call you will find yourself + back in the editor as if you were doing nothing but editing. You may pass + command line parameters (name of edited file) to called programs, too. + +6:Database +---------- + It is meant to be a database on Loglan but you may set any other database + instead (created by program MPH) during installation. + Such a database consists of maximum 6 windows, every of which may comprise + of maximum 22 lines. Every line is mapped to any length contents and every + contents line is mapped to any length text. + While viewing the database you may evoke some of the editor functions : + namely finding given word and marking a block. A marked block may be later on + moved to the main program. + It is possible to have the information from the database you are interested + in in one window and to edit your program in the main window. +7:Using LOTEK +--- ---------- + Just run the program LOTEK. + There are displayed all the functions available at the moment at the bottom + of the screen. If you want to have more room for editing, just press the F10 + key and this information will disappear. + LOTEK saves all the options on file MPLED.DAT before exit, so when you run + LOTEK once more you will find yourself in exactly the same conditions + (ie the same file, the same cursor position, the same options, ...) as you + were in when using LOTEK for the last time. + The editor has a built-in mechanism protecting the monitor - there will + appear a sky on the screen after two minutes during which you have not + pressed any key. The sky will vanish when you press any key. + LOTEK always saves the last but one version of the program, which is being + edited, so you have a copy of the program. This file's name is the same as + yours file but its extension is .BAK. + +  \ No newline at end of file diff --git a/utils/lotek/iiuwgraf.pl b/utils/lotek/iiuwgraf.pl new file mode 100644 index 0000000..c8ee0f3 --- /dev/null +++ b/utils/lotek/iiuwgraf.pl @@ -0,0 +1,1546 @@ + + + + + + + + + + + + IIUWGRAF + + biblioteczka podstawowych procedur graficznych + + moze wspolpracowac z kompilatorami firmy Microsoft: + + Fortran 77 wersja 3.31 i 4.00 + Pascal wersja 3.31 + + oraz + + C (Lattice) wersja 3.10 + Aztec C wersja 3.20d + + + + dla IBM PC/XT + + obsluguje karty IBM color/graphics, Hercules II oraz EGA + + + + + + + wersja 2.2, grudzien 1987 + + + + + + + + Autorzy: + + Piotr Carlson + Miroslawa Milkowska - procedury poziomu 1 + + Janina Jankowska + Michal Jankowski - procedury poziomu 2 + + + Osrodek Obliczeniowy Instytutu Informatyki + Uniwersytet Warszawski + + + 2 + + + + Spis tresci + + + Informacje ogolne 3 + Procedury poziomu 1 4 + Procedury ustawiania trybu 5 + Procedury sterujace kolorami 8 + Procedury ustawiania pozycji 11 + Procedury obslugujace punkty 12 + Procedury rysowania linii 13 + Procedury operujace na fragmentach ekranu 15 + Procedury wejscia/wyjscia dla pojedynczych znakow 16 + Procedury wejscia/wyjscia dla linii 18 + Procedury wejscia/wyjscia dla okienek 19 + Procedury poziomu 2 20 + Informacje dodatkowe 22 + Procedury dodatkowe 22 + + + + Dodatki + + A. Uzycie IIUWGRAFu z FORTRANem 77 23 + B. Uzycie IIUWGRAFu z Pascalem 24 + C. Uzycie IIUWGRAFu z Lattice C 25 + D. Uzycie IIUWGRAFu z LOGLANem 26 + E. Wykaz specyfikacji procedur IIUWGRAFu 27 + F. Wartosci kodow klawiszy specjalnych 29 + G. FEDIT - prosty program do edycji kroju znakow 30 + H. Zmiany IIUWGRAFu w stosunku do poprzednich wersji 33 + + + + 3 + + + + Informacje ogolne + + + + Rysunek jest tworzony na ekranie monitora za pomoca + szeregu wywolan procedur bibliotecznych IIUWGRAF. Modyfikuja + one zawartosc bufora mapy bitowej, ktora jest zwykle + bezposrednio wyswietlana na ekranie. Zmiany te sa wtedy + widoczne natychmiast. Umiejscowienie bufora roboczego moze + byc jednak zmienione, tak aby byl on zwiazany z obszarem + pamieci dostarczonym przez uzytkownika. W tym przypadku + zmiany jego zawartosci oczywiscie nie sa wyswietlane, a + nawet przestawienie monitora w tryb graficzny nie jest + konieczne. Rysunek moze byc wtedy skonstruowany w pamieci, + bez wyswietlania, przechowany na dysku w postaci binarnej i + odtworzony pozniej na ekranie. Omowiony tryb pracy jest + mozliwy jednak tylko dla karty Hercules II oraz karty IBM. + W opisie procedur slowo ekran, tam gdzie mowa o jego + zawartosci, nalezy rozumiec wlasnie jako bufor roboczy. + + Karty Hercules II oraz EGA daja dodatkowa mozliwosc + blyskawicznego przelaczania pomiedzy dwiema + rownouprawnionymi stronami graficznymi. + + W wersji podstawowej karta graficzna EGA posiada + 64K bajty pamieci. Pamiec ta moze byc zwiekszona do 128K + oraz 256K bajtow. Opisane ponizej procedury graficzne + dotycza w zasadzie karty EGA z pelna pamiecia 256K bajtow. + Tylko w tej wersji karty mozna bowiem uzywac 16 kolorow + ( z 64 istniejacych ) oraz dwoch stron graficznych. W obu + wersjach z mniejsza pamiecia istnieje tylko jedna strona + graficzna, a ponadto w wersji podstawowej uzytkownik ma + mozliwosc korzystania tylko z 4 kolorow (z 16 istniejacych). + + Dostarczone sa cztery zestawy oddzielnych bibliotek + IIUWGRAF, kazda dla innego rodzaju ekranu: + + HGCMSF i HGCMSF4 dla karty Hercules + MGCMSF i MGCMSF4 dla karty IBM color/graphics + MGC64MSF i MGC64MF4 dla karty IBM w trybie mono + EGAMSF i EGAMSF4 dla karty EGA + + Biblioteki HGCMSF, MGCMSF, MGC64MSF i EGAMSF zgodne + sa z konwencjami Fortranu ( wersja 3.31 ) i Pascala firmy + Microsoft. Natomiast biblioteki HGCMSF4, MGCMSF4, MGC64MF4 i + EGAMSF4 sa zgodne z konwencjami Fortranu ( wersja 4.00 ) + firmy Microsoft. Dodatkowo, kazda biblioteka moze byc + dostarczona w konwencji Lattice C, oddzielnie dla czterech + modeli kodu S, P, D i L. + + Programy uzytkowe komunikuja sie z IIUWGRAFem na + dwoch poziomach: + + poziom 1 - zarzadzanie ekranem na poziomie pixli, + przy uzyciu prawdziwych wspolrzednych na ekranie, + + poziom 2 - rysowanie punktow i linii we + wspolrzednych abstrakcyjnych. + + + + 4 + + + + Procedury poziomu 1 + + Wszystkie parametry bez podanej explicite + specyfikacji maja typ integer. Wszystkie parametry calkowite + powinny miec wartosci 16-bitowe (integer*2 w Fortranie, + integer w Pascalu, int w C) + + + Zakresy wspolrzednych ekranu: + + 0 <= ix <= 719 + 0 <= iy <= 347 dla karty Hercules + + 0 <= ix <= 319 + 0 <= iy <= 199 dla karty IBM color/graphics + + 0 <= ix <= 639 + 0 <= iy <= 199 dla karty IBM color/graphics + w trybie mono + 0 <= ix <= 639 + 0 <= iy <= 349 dla karty EGA + + + + (0,0)-----------> (ix,0) + | + | + | + V + (0,iy) + + + + 5 + + + + Procedury ustawiania trybu + + GRON(i) + + Procedura GRON ustawia monitor w graficznym trybie + pracy, czyszczac zawartosc jego ekranu, ktory jednoczesnie + staje sie buforem roboczym. Parametr i ma znaczenie jedynie + dla karty IBM w trybie 320*200: wartosc 1 wybiera normalne + kolory, wartosc 0 - kolory zmodyfikowane do pracy na + monitorach monochromatycznych. Dla kart Hercules, EGA oraz + karty IBM w trybie 640*200 wartosc parametru i jest + ignorowana. Przy przelaczaniu karty Hercules z trybu + tekstowego na graficzny i odwrotnie stosowane jest + programowo opoznienie ok. 3 sekund. Tryb karty IBM ustawiany + jest wprost, bez pomocy przerwania 10H, tak aby mozliwa byla + jednoczesna praca na monitorze kolorowym w trybie graficznym + z praca na monitorze monochromatycznym w trybie tekstowym. + Konsekwencja tego rozwiazania jest to, ze nie mozna + korzystac z komendy GRAPHICS. Natomiast tryb karty EGA jest + ustawiany wprost, za pomoca przerwania 10H. + + + + NOCARD(ple) + + Funkcja NOCARD zwraca liczbe calkowita + identyfikujaca rodzaj monitora obslugiwanego przez biezaco + uzywana biblioteke: + + 1 dla karty Hercules + 2 dla karty IBM w trybie kolor + 3 dla karty IBM w trybie mono 640*200 + 4 dla karty IBM w trybie mono 320*200 + 5 dla karty EGA + + Funkcja NOCARD moze byc wywolana dopiero po + zainicjowaniu trybu graficznego za pomoca procedury GRON. + Parametr ple jest ignorowany. + + + + GROFF + + Procedura GROFF przelacza monitor w tryb tekstowy, + wypelniajac zawartosc jego ekranu spacjami. Przed + zakonczeniem dzialania programu monitor, z ktorego byl + wywolany, nalezy zawsze ustawic z powrotem w tryb tekstowy. + + + CLS + + Procedura CLS czysci ekran, wypelniajac go kolorem + 0. Czyszczenie odbywa sie bez wylaczania ekranu. + + + 6 + + + + HPAGE(nr, tryb, zeruj) + + Procedura HPAGE ma zastosowanie jedynie dla kart + Hercules oraz EGA. Pozwala na dostep do drugiej strony + graficznej monitora. Wywolanie HPAGE wybiera strone o + numerze nr (0 lub 1), zeruje jej zawartosc, o ile parametr + zeruj ma wartosc <> 0, oraz ustawia jej tryb: + + tryb = 0 wyswietla zawartosc strony alfanumerycznie + tryb = 1 wyswietla zawartosc strony graficznie + tryb =-1 przypisuje do tej strony bufor roboczy + + + Przypisanie bufora roboczego trybem -1 nie zmienia + numeru ani sposobu wyswietlania biezacej strony. Tryb 0 + wiaze bufor roboczy z wybrana wlasnie strona. Przelaczanie + stron odbywa sie bez opoznien, o ile nie ulega zmianie tryb + wyswietlania (alfanumeryka/grafika). Poza tym, wywolanie + HPAGE(0,1,1) jest ( tylko dla karty Hercules ) rownowazne + GRON(), a HPAGE(0,0,1) - wywolaniu GROFF. + + Typowa petla animacyjna moze byc zatem rozwiazana na + przyklad tak: + + VAR NR: INTEGER; + BEGIN + GRON(0); + NR := 1; + (* NARYSUJ PIERWOTNY OBRAZ *) + DRAW(... + ... + WHILE JESZCZE DO + HPAGE(1-NR,1,0); (* WYSWIETLANIE *) + HPAGE(NR,-1,1); (* BUFOROWANIE *) + (* NARYSUJ ZMODYFIKOWANY OBRAZ *) + DRAW(... + ... + NR := 1-NR + OD + + + VIDEO(tablica) + + Procedura VIDEO przelacza bufor roboczy tak, aby + miescil sie on w tablicy podanej jako parametr jej + wywolania. + Samo wywolanie VIDEO nie zmienia zawartosci bufora. Obraz + wyswietlany na monitorze nie bedzie ulegal teraz zmianom + mimo wywolywania procedur modyfikujacych zawartosc ekranu. + Wszelkie odwolania do ekranu beda teraz dokonywane w + tablicy. Gotowy obraz moze byc przeniesiony na rzeczywisty + ekran za pomoca procedur GETMAP/PUTMAP lub zapisany binarnie + na dysku w celu pozniejszego odtworzenia. Tablica powinna + miec 16K bajtow przy wspolpracy z karta IBM i 32K bajtow + przy wspolpracy z karta Hercules. + Procedury VIDEO nie mozna stosowac dla karty EGA. + + + 7 + + + Przyklad: + + VAR BOK: ARRAY[1..32K] OF BYTE; + FRAGM: ARRAY[1..MAX] OF BYTE; + BEGIN + GRON(1); + (* NARYSUJ STRONE TYTULOWA *) + DRAW(... + ... + (* SKONSTRUUJ RYSUNEK "NA BOKU" *) + VIDEO(BOK); + DRAW(... + ... + (* ZAPAMIETAJ FRAGMENT GOTOWEGO RYSUNKU *) + MOVE(MINX,MINY); + GETMAP(MAXX,MAXY,FRAGM); + (* PRZYPISZ Z POWROTEM EKRAN DO MONITORA *) + GRON(1); (* NIESTETY, CZYSCI EKRAN *) + MOVE(MINX,MINY); + PUTMAP(FRAGM); + ... + + Uwaga: + W przypadku wywolania VIDEO(tablica(adres)), wartosc + wyrazenia adres musi byc postaci 1+k*16, gdzie k=0,1,2,... + + + + 8 + + + + Procedury sterujace kolorami + + + COLOR(kolor) + + Procedura COLOR ustawia biezacy kolor. W tym + kolorze beda odtad dokonywane zmiany zawartosci ekranu. Na + monitorach monochromatycznych kolor 0 oznacza czarny (pixel + wygaszony), kolor <> 0 oznacza bialy (pixel zapalony). + Na monitorach kolorowych, dla karty IBM color/graphics, + kolory maja nastepujace numery: + + 0 - tlo (czarny lub ustalony wywolaniem BORDER) + 1 - zielony lub turkusowy - cyan ( zaleznie od wyboru + palety) + 2 - czerwony lub purpurowy - magenta + 3 - zolty lub bialy + + Kolorem ustawionym poczatkowo jest 1. + + + Dla karty EGA kolor moze przyjmowac wartosci od 0 + do 15. Znaczenie tego parametru jest okreslone poprzez wybor + palety ( przyporzadkowanie kazdemu z 16 identyfikatorow + koloru dowolnego koloru z 64 istniejacych ), dokonywany za + pomoca procedury PALLET. + Kolorem ustawionym poczatkowo jest 7. + + + STYLE(styl) + + Procedura STYLE ustawia biezacy styl, czyli + kombinacje kolorow uzywana do rysowania odcinkow (DRAW) i + wypelniania obszarow (HFILL,VFILL). Styl wybiera jeden z + szesciu nastepujacych sposobow mieszania tla (.) i biezacego + koloru (*): + + 0 - .... + 1 - **** + 2 - ***. + 3 - **.. + 4 - *.*. + 5 - *... + + Przy rysowaniu odcinkow kolejne pixle beda mialy + kolor wyznaczony cyklicznie wzorcem stylu. Pierwszy i + ostatni pixel odcinka bedzie zawsze mial biezacy kolor. + Przy wypelnianiu, podany wzorzec dotyczy linii poziomych + (pionowych) ekranu o parzystej wspolrzednej y (x). Wzorzec + dla linii o wspolrzednych nieparzystych dobierany jest + automatycznie. + Inne sposoby mieszania, dopuszczajace uzycie wiekszej liczby + kolorow sa dostepne za pomoca procedury PATERN. + + + 9 + + + PATERN(par,par1,par2,par3) + + Procedura PATERN pozwala rysowac odcinki i + wypelniac obszary dowolna kombinacja kolorow. Przy rysowaniu + odcinkow brany jest pod uwage tylko par. Przy wypelnianiu, + par oraz par2 dotycza linii poziomych (pionowych) o + wspolrzednych y (x) parzystych, par1 oraz par3 - linii o + wspolrzednych nieparzystych ( na zmiane kolejno par/par2 + oraz par1/par3 ). Wartosci par,...,par3 przedstawione jako + czterocyfrowe liczby szesnastkowe daja wzorce mieszania + numerow kolorow. 0 oznacza tlo, inne cyfry - zob. opis + procedury COLOR. + + Przyklad: + + PATERN(#1100,#0011,#1100,#0011); + ODPOWIADA: COLOR(1); STYLE(3); + + natomiast efekt: + + PATERN(#1212,#0303,#2121,#3030); + NIE MOzE BYC UZYSKANY INACZEJ + + + BORDER(kolor) + + Procedura BORDER ustawia biezacy kolor tla. + + kolor kolor + + 0 czarny + 1 niebieski + 2 zielony + 3 turkusowy - cyan (niebiesko-zielony) + 4 czerwony + 5 karmazynowy - magenta (czerwono-niebieski) + 6 zolty + 7 jasno szary + + Kolory 8 - 15 to jasniejsze odcienie kolorow 0 - 7, przy + czym kolor bialy ma numer 15. + + Przedstawione powyzej kolory dotycza tylko karty IBM, dla + karty EGA natomiast parametr kolor moze przyjmowac wartosci + od 0 do 63. + + + PALLET(nr) + + Dla karty IBM color/graphics : + + procedura PALLET wybiera biezaca palete z dwu + mozliwych + + + nr kolory + + 0 turkusowy,karmazynowy,bialy + 1 zielony,czerwony,zolty + + + + 10 + + + Domyslna paleta jest paleta nr 0. + + Dla karty EGA natomiast procedura PALLET sluzy do + wyboru dowolnych 16 kolorow z 64 ogolnie dostepnych. + Parametr nr powinien byc postaci + kolor16 * 256 + kolor64, + gdzie + kolor16 oznacza identyfikator koloru ( uzywany + przez procedure COLOR ), mogacy przyjmowac wartosci 0 - 15, + kolor64 oznacza wybrany kolor. + + + Standardowa paleta ( przyjmowana domyslnie ) + zawiera nastepujace kolory : + + identyfikator kolor numer koloru + + 0 czarny 0 + 1 niebieski 1 + 2 zielony 2 + 3 turkusowy 3 + 4 czerwony 4 + 5 karmazynowy 5 + 6 zolty 6 + 7 bialy 7 + 8 szary 56 + 9 jasno-niebieski 57 + 10 jasno-zielony 58 + 11 jasno-turkusowy 59 + 12 jasno-czerwony 60 + 13 jasno-karmazynowy 61 + 14 jasno-zolty 62 + 15 intensywny bialy 63 + + + Wszystkie dostepne kolory mozna obejrzec oraz + poznac ich numery za pomoca programu demonstracyjnego + EGADEMO.EXE. + + Procedura PALLET nie ma zastosowania dla karty + Hercules. + + + + INTENS(i) + + Procedura INTENS wybiera intensywnosc kolorow. + Dla i rownego 0 intensywnosc jest wieksza, dla i rownego 1 + mniejsza. + Domyslnie intensywnosc jest ustawiona na poziomie 0. + + Procedura INTENS ma zastosowanie tylko dla karty IBM. + + + 11 + + + + Procedury ustawiania pozycji + + + MOVE(x,y) + + Procedura MOVE ustawia biezaca pozycje na ekranie + na pixel o wspolrzednych (x {kolumna}, y {wiersz}). + + + INXPOS(ple), INYPOS(ple) + + Funkcje calkowite INXPOS i INYPOS zwracaja + odpowiednio wspolrzedne x i y biezacej pozycji. Parametr ple + jest ignorowany. + + + PUSHXY + + Procedura PUSHXY powoduje przechowanie biezacej + pozycji, koloru i stylu na wierzcholku wewnetrznego stosu + IIUWGRAFu. Parametry te nie ulegaja przy tym zmianie. + Maksymalna glebokosc stosu wynosi 16. + + + POPXY + + Procedura POPXY odtwarza biezacy styl, kolor i + pozycje z wierzcholka wewnetrznego stosu IIUWGRAFu. + Glebokosc stosu zmniejsza sie o 1. + + + + Przyklad: + + + PROCEDURE SKOS; + VAR IX,IY:INTEGER; + BEGIN + PUSHXY; + IX := INXPOS(0); + IY := INYPOS(0); + DRAW(IX+10,IY+10); + POPXY; + END; + + + 12 + + + + TRACK(x,y) + + Procedura TRACK wyswietla na ekranie wskaznik w + ksztalcie malej (8*8 pixli) strzalki, skierowanej na punkt o + wspolrzednych (x,y). Wskaznik ten moze byc przesuwany po + ekranie za pomoca klawiszy kierunkowych. Nacisniecie + klawisza powoduje przesuniecie wskaznika o 5 pixli. + Nacisniecie odpowiedniego klawisza w trybie numerycznym + przesuwa wskaznik o 1 pixel. Klawisz "home" powoduje powrot + wskaznika do pozycji (x,y). Klawisz "End" usuwa wskaznik z + ekranu i powoduje powrot z procedury, pozostawiajac biezaca + pozycje w tym miejscu. Moze byc ona teraz odczytana za + pomoca funkcji INXPOS i INYPOS. + + + + + + + + Procedury obslugujace punkty + + + POINT(x,y) + + Procedura POINT ustawia biezaca pozycje w punkcie + (x,y) i zmienia jego kolor na biezacy. + + + INPIX(x,y) + + Funkcja INPIX ustawia biezaca pozycje w punkcie + (x,y) i zwraca jego kolor. + + + 13 + + + + Procedury rysowania linii + + + DRAW(x,y) + + Procedura DRAW rysuje odcinek od biezacej pozycji + do pozycji o wspolrzednych (x,y). Rysowanie polega na + zmianie koloru pixli nalezacych, wedlug algorytmu + Bresenhama, do odcinka. Pixle te przyjmuja nowy stan + zaleznie od biezacego koloru i stylu. + + + + CIRB(x,y,r,alfa,beta,kolb,wwyp,p,q) + + Procedura CIRB rysuje na ekranie wycinek okregu + lub elipsy, zaleznie od podanych wartosci p i q, + okreslajacych aspekt. Aspekt wyznaczony jest stosunkiem p/q. + Dla wartosci aspektu rownej 1 zostanie narysowany idealny + okrag. Srodek bedzie umieszczony w punkcie (x,y), promien + poziomy bedzie mial wielkosc r pixli, alfa i beta okreslaja, + odpowiednio kat poczatkowy i koncowy rysowanego wycinka. Dla + alfa = beta zostanie narysowany pelny okrag (lub elipsa). + Wartosci alfa i beta sa wyrazane w radianach, w zwyklym + ukladzie. Brzeg wycinka i jego promienie zostana narysowane + kolorem kolb, niezaleznie od stylu. Jesli wwyp <> 0, wnetrze + wycinka zostanie wypelnione biezacym kolorem i stylem. + + + HFILL(x) + + Procedura HFILL rysuje, w biezacym kolorze i stylu, + odcinek poziomy od biezacej pozycji do punktu o + wspolrzednych + + (x,inypos(0)) + + OSTROZNIE: HFILL nie zmienia biezacej pozycji. + + Uzycie HFILL jest zalecane przy wypelnianiu + obszarow, gdyz dziala znacznie szybciej niz odpowiedni DRAW. + Rowniez mieszajac kolory w danym stylu, HFILL, w + przeciwienstwie do DRAW nie bierze pod uwage poczatkowego + punktu odcinka, co pozwala na uzyskanie substytutu + dodatkowych kolorow. + + + + + 14 + + + VFILL(y) + + + Procedura VFILL rysuje, w biezacym kolorze i stylu, + odcinek pionowy od biezacej pozycji do punktu o + wspolrzednych + + (inxpos(0),y) + + OSTROZNIE: VFILL nie zmienia biezacej pozycji. + + + 15 + + + + Procedury operujace na fragmentach ekranu + + + GETMAP(x,y,tablica) + + Procedura GETMAP zapamietuje prostokatny obszar + ekranu pomiedzy biezaca pozycja jako lewym gornym rogiem a + punktem (x,y) jako prawym dolnym rogiem w tablicy. GETMAP + nie zmienia przy tym biezacej pozycji. Tablica powinna miec + co najmniej 4 + w*sufit(k/8)*kol bajtow, gdzie w i k sa, + odpowiednio, liczba wierszy i kolumn zapamietywanego + obszaru, natomiast wartosc wspolczynnika kol zalezy od + rodzaju karty graficznej i wynosi 1 dla karty Hercules, + 2 dla karty IBM oraz 4 dla karty EGA. + + Przyklad: zapamietanie obszaru 101*101 polozonego w lewym + gornym rogu ekranu. + + VAR OKNO: ARRAY[1..700] OF INTEGER; + + ... + MOVE(0,0); + GETMAP(100,100,OKNO); + ... + + + + PUTMAP(tablica) + + Procedura PUTMAP ustawia prostokatny obszar ekranu + o lewym gornym rogu znajdujacym sie w biezacej pozycji + zgodnie z zawartoscia tablicy, w ktorej uprzednio + zapamietano fragment ekranu za pomoca procedury GETMAP. + Biezaca pozycja nie ulega zmianie. Odtworzeniu podlega caly + zapamietany obszar, ktory jest kopiowany w nowe miejsce. + + + ORMAP(tablica) + + Procedura ORMAP dziala podobnie jak PUTMAP, lecz o + nowej zawartosci ekranu decyduje wynik zastosowania funkcji + or do elementow tablicy i ekranu. + + + XORMAP(tablica) + + Procedura XORMAP dziala podobnie jak PUTMAP, lecz o + nowej zawartosci ekranu decyduje wynik zastosowania funkcji + xor do elementow tablicy i ekranu. + + + 16 + + + + Procedury wejscia/wyjscia dla pojedynczych znakow + + + INKEY(ple) + + Funkcja calkowita INKEY podaje i usuwa nastepny + znak z bufora klawiatury. Czytanie odbywa sie bez echa. + Jesli bufor jest pusty, wynikiem jest 0. Klawisze specjalne + kodowane sa jako liczby ujemne wedlug zalaczonej tablicy. + Metoda ALT-NUM moze byc uzyta do wprowadzenia z klawiatury + kodow powyzej 127 jako zwyklych znakow. Uniemozliwia to, + niestety, korzystanie ze znakow specjalnych o kodach od 128 + do 132. + + Przyklad: zaczekaj na klawisz End. + + PROCEDURE WAIT_FOR_END; + BEGIN + WHILE INKEY(0)<>-79 DO; + END; + + Wartosci kodow klawiszy specjalnych podane sa w Dodatku F. + + + HASCII(kod) + + Procedura HASCII rysuje na ekranie znak + alfanumeryczny. Znak wpisany jest w raster 8*8. Gorny lewy + rog rastra umieszczony bedzie w biezacej pozycji, ktora + jednoczesnie przesunie sie o 8 pixli w prawo. Uzyta funkcja + rysujaca jest xor. Kroj znakow pobierany jest z tablicy + znajdujacej sie w ROM BIOS standardowo pod adresem + F000:FA6E. W przypadku niestandardowego ROM BIOSu obraz + znaku alfanumerycznego bedzie zly. Uzycie procedur HFONT i + HFONT8 pozwala uniezaleznic sie od wersji BIOSu a takze + korzystac z innych, rowniez wlasnorecznie zaprojektowanych + krojow znakow. Kod znaku 0 powoduje tylko wyczyszczenie + miejsca przeznaczonego na znak, bez zmiany biezacej pozycji. + Wszystkie kody maja tylko interpretacje graficzna, bez + funkcji sterujacych (NL, CR etc.). + + Przyklad: napisanie slowa "oh" na gwarantowanie czystym tle. + + + HASCII(0); HASCII('o'); HASCII(0); HASCII('h'); + + Uwaga: + Parametr procedury HASCII moze byc typu integer lub + znakowego ( character w Fortranie, char w Pascalu i C ). + + + + 17 + + + + HFONT(segment,offset) + + Wywolanie procedury HFONT przelacza adres wzorca + znakow alfanumerycznych na segment:offset. Bez uzycia HFONT + uzywa sie adresu F000:FA6E. + + + HFONT8(segment,offset) + + Uzycie procedury HFONT8 dolacza do programu + uzytkowego kopie tablicy kroju znakow z ROM BIOS i zwraca + adres tej kopii jako segment:offset (parametry wyjsciowe). + + + + + 18 + + + + Procedury wejscia/wyjscia dla linii + + + OUTHLINE(dlugosc,bufor) + + Procedura OUTHLINE wywoluje HASCII dlugosc razy, + wypisujac na ekran znaki, ktorych kody zawarte sa w buforze. + Przed narysowaniem kazdego znaku wywolywane jest HASCII(0). + + + INHLINE(dlugosc,bufor) + + Procedura INHLINE wczytuje z klawiatury linie + zlozona z co najwyzej dlugosci znakow i umieszcza je w + buforze. Do wczytywania uzyta jest procedura INKEY. + Wyswietlane jest echo. Migajacy wskaznik oznacza oczekiwanie + na nacisniecie klawisza. Klawisz BACKSPACE dziala tak, jak + mozna tego oczekiwac. Linia moze byc zakonczona klawiszem CR + albo wyczerpaniem jej dlugosci. Znak CR konczacy linie nie + jest umieszczany w buforze. Przed rozpoczeciem czytania + bufor jest wypelniany spacjami. Po zakonczeniu czytania + parametr dlugosc zwraca liczbe wczytanych znakow. + Migajacy wskaznik jest zawsze rysowany kolorem numer 1, + wyswietlane znaki natomiast biezacym kolorem. + + + Przyklad: echo wczytanej linii. + + VAR LINIA: ARRAY[1:40] OF INTEGER; + N: INTEGER; + BEGIN + N:=80; + INHLINE(N,LINIA); + IF N=0 THEN MOVE(INXPOS(0),INYPOS(0)+10) + ELSE OUTHLINE(N,LINIA); + ... + + + + + 19 + + + + Procedury wejscia/wyjscia dla okienek + + + MKWNDW(x,y,kolumn,wierszy,okienko,rozmiar,ramka) + + Procedura MKWNDW urzadza na ekranie prostokatne + okienko do konwersacji. Lewy gorny rog okienka znajdzie sie + w punkcie (x,y). Zmiesci ono zadana liczbe kolumn i wierszy + tekstu alfanumerycznego. Opis okienka bedzie przechowany w + dostarczonej przez uzytkownika tablicy okienko. Parametr + rozmiar jest na razie ignorowany, a tablica powinna miec co + najmniej 20 bajtow, lub duzo wiecej, jesli okienko ma byc + zaslaniane i odslaniane ( patrz opis procedury BURY ). Jesli + parametr ramka ma wartosc rozna od 0, obszar okienka bedzie + obwiedziony ramka, co uczyni je nieco wiekszym. + + + BURY(okienko) + + Wywolanie BURY usuwa okienko z ekranu, przechowujac + jego obraz w dalszej czesci tablicy okienko tak, aby moc + odtworzyc je pozniej za pomoca EXPOSE. Tablica okienko musi + miec odpowiednia wielkosc, aby GETMAP obszaru okienka + pozostawilo w niej jeszcze co najmniej 20 bajtow. + + + EXPOSE(okienko,x,y) + + Wywolanie EXPOSE odtwarza okienko przechowane za + pomoca BURY umieszczajac jego gorny lewy rog w punkcie + (x,y). + + + OUTWLINE(okienko,dlugosc,bufor) + + Procedura OUTWLINE dziala podobnie jak OUTHLINE, + wyswietlajac linie w ramach podanego okienka. Bufor o + dlugosci wiekszej niz rozmiar okienka wyswietli sie w kilku + liniach. + + + INWLINE(okienko,dlugosc,bufor) + + Procedura INWLINE, podobnie jak INHLINE, wczytuje z + klawiatury linie tekstu. W przypadku INWLINE okienko + wskazuje na obszar ekranu, w ktorym ma pojawiac sie echo. + Jesli dlugosc bufora jest wieksza niz rozmiar okienka echo + moze zajac w nim kilka linii. Poprawianie wprowadzanego + tekstu przy uzyciu BACKSPACE jest mozliwe tylko w ostatniej + czesci linii. Dlugosc jako parametr wyjsciowy zwraca liczbe + wczytanych znakow, bez konczacego CR. + + + 20 + + + + Procedury poziomu 2 + + + Procedury te operuja wspolrzednymi wyrazonymi + liczbami rzeczywistymi odnoszacymi sie do abstrakcyjnego + okna o dowolnych rozmiarach. + + + + Definiowanie okna + + + SWINDOW(rxy,ixy,skalowanie) + + Procedura SWINDOW urzadza na ekranie prostokatne + okno umieszczone pomiedzy punktami naroznikowymi podanymi w + tablicy ixy jako calkowite wspolrzedne prawdziwych pixli. + Program uzytkowy tworzacy rysunek w tym obszarze bedzie + okreslal polozenie punktow w sposob abstrakcyjny we + wspolrzednych rzeczywistych. Tablica rxy podaje zakresy tych + wspolrzednych. Jesli parametr skalowanie ma wartosc 0, + abstrakcyjny prostokat bedzie po prostu odwzorowany na + wskazana czesc ekranu bez zachowania proporcji miedzy + skalowaniem w pionie i w poziomie. Jesli natomiast parametr + skalowanie bedzie rozny od zera, wykorzystana zostanie + jedynie srodkowa czesc obszaru ekranu tak, aby zachowac + rzeczywiste proporcje rysunku, niezaleznie od aspektu danego + monitora. + Odwzorowanie stosowane przez IIUWGRAF odwraca tez kierunek + wzrastania wspolrzednej y do naturalnego ukladu: + + + (ixy(1),ixy(3)) + / + (rxy(1),rxy(4)) + ^ + | + | + | + | (ixy(1),ixy(4)) (ixy(2),ixy(4)) + | / / + (rxy(1),rxy(3))--------------------->(rxy(2),rxy(3)) + + + Przyklad: przygotowanie rysunku sinusoidy w gornej polowie + ekranu Herculesa. + + + VAR RW:ARRAY [1:4] OF REAL INIT (0.,6.29,-1.,1.); + IW:ARRAY [1:4] OF INTEGER INIT (0,719,0,173); + BEGIN + SWINDOW(RW,IW,0); + + + + 21 + + + RWINDOW(rxy,skalowanie) + + Procedura RWINDOW jest skrotem wywolania SWINDOW + dla odwzorowania obejmujacego caly ekran. + + + + RINXPOS(ple),RINYPOS(ple) + + Funkcje rzeczywiste RINXPOS i RINYPOS zwracaja, + odpowiednio wspolrzedne x i y biezacej pozycji w + abstrakcyjnym oknie urzadzonym przez ostatnie wywolanie + RWINDOW lub SWINDOW. Biezaca pozycja jest zawsze zaokraglana + do najblizszego pixla. + + + + RMOVE(rx,ry) + + Wywolanie procedury RMOVE ustawia biezaca pozycje w + punkcie (rx,ry) w ostatnio urzadzonym oknie. Pozycja ta jest + zaokraglona do najblizszego pixla. + + + + RDRAW(rx,ry) + + Wywolanie procedury RDRAW powoduje narysowanie w + biezacym kolorze i stylu odcinka od biezacej pozycji do + pixla najblizszego punktowi (rx,ry) w ostatnio urzadzonym + oknie. + + + + RCIRB(rx,ry,rr,alfa,beta,kolb,wwyp,p,q) + + Procedura RCIRB odpowiada procedurze CIRB z poziomu + 1, z tym, ze wspolrzedne srodka (rx,ry) i promien rr + wyrazane sa, jako liczby rzeczywiste, w oknie urzadzonym + przez ostatnie wywolanie RWINDOW lub SWINDOW. Pozostale + parametry maja znaczenie takie, jak w CIRB. + + + 22 + + + + Informacje dodatkowe + + + Pakiet IIUWGRAF zawiera dodatkowo dwa programy + HGCPRINT.EXE oraz MGCPRINT.EXE. Umozliwiaja one drukowanie + tworzonych obrazow graficznych na powszechnie dostepnych + drukarkach ( np. typu STAR GEMINI, EPSON ). W przypadku + uzywania karty Hercules nalezy stosowac program HGCPRINT, a + dla karty IBM color/graphics program MGCPRINT. + + Programow tych powinno uzywac sie w nastepujacy + sposob : + przed zaladowaniem wlasnego programu nalezy wykonac + program HGCPRINT lub MGCPRINT, w zaleznosci od rodzaju + uzywanej karty graficznej. Kazdy z tych programow ustawia + znaczenie klawisza PrtSc. Kazdorazowe pozniejsze nacisniecie + klawisza PrtSc powoduje wydrukowanie graficznej zawartosci + ekranu. + + Uwaga. W przypadku karty Hercules drukowana jest + zawartosc pierwszej strony graficznej, niezaleznie od tego, + ktora strona jest aktualnie wyswietlana. + W przypadku karty IBM color/graphics klawisz PrtSc + zaklada, ze jest ustawiony tryb kolor 320*200. Wydruk obrazu + graficznego utworzonego w trybie mono 640*200 jest mozliwe + poprzez uzycie procedury PRTSCR. + + Mozliwosc drukowania obrazu graficznego nie + istnieje dla karty EGA. + + Autorem programow HGCPRINT oraz MGCPRINT jest + Krzysztof Studzinski. + + + + + Procedury dodatkowe + + + PRTSCR(nr) + + Procedura PRTSCR umozliwia drukowanie obrazow + graficznych tworzonych na ekranie monitora pod kontrola + programu. Parametr nr okresla numer strony graficznej + (0 lub 1), ktorej zawartosc ma byc wydrukowana. + + Wywolanie procedury PRTSCR z parametrem nr rownym + zeru jest rownowazne nacisnieciu klawisza PrtSc. + + W celu poprawnego dzialania tej procedury nalezy, + analogicznie jak w przypadku klawisza PrtSc, uprzednio + wykonac dolaczony program : + - HGCPRINT.EXE w przypadku uzywania karty + Hercules lub + - MGCPRINT.EXE dla karty IBM. + + Procedura PRTSCR nie dziala dla karty EGA. + + + + + 23 + + + + + DODATEK A + + Uzycie IIUWGRAFu z FORTRANem 77. + + + 1) Procedury IN?LINE i OUT?LINE dokonuja jedynie + transmisji tekstu, bez zadnej konwersji pomiedzy postacia + binarna i tekstowa. Aby takiej konwersji dokonac, mozna + posluzyc sie instrukcjami formatowanego wejscia/wyjscia + w polaczeniu z tzw. plikami wewnetrznymi (internal file). + + Przyklad: + + + INTEGER*2 I,J,SUM,W(10) + CHARACTER*20 LINE + CHARACTER LINEL(20) + EQUIVALENCE (LINE,LINEL(1)) + + ... + CALL MKWNDW(10,10,21,4,W,20,1) + CALL OUTWLINE(W,20,'PODAJ 2 LICZBY (2I3)') + CALL INWLINE(W,20,LINEL) + READ (LINE,'(2I3)') I,J + SUM=I+J + WRITE (LINE,'(8H SUMA = I4)') SUM + CALL OUTWLINE(W,12,LINEL) + + + 24 + + + + + + DODATEK B + + Uzycie IIUWGRAFu z PASCALem. + + + 1) Microsoft Pascal dopuszcza jedynie 6 znakow w nazwie + podprogramu, zatem nazwy: INHLIN(E), INWLIN(E), OUTHLI(NE), + OUTWLI(NE), RWINDO(W), SWINDO(W), RINXPO(S), RINYPO(S) musza + byc uzywane w skroconej postaci. + + 2) Niektore procedury IIUWGRAFu sa napisane w FORTRANie. + Przy linkowaniu LINK moze domagac sie dostarczenia + biblioteki FORTRAN.LIB. Zadanie to nalezy zignorowac. + + 3) Do linkowania nalezy uzywac LINK w wersji co najmniej + 3.04, do kompilacji Pascal w wersji co najmniej 3.31. + + + 25 + + + + + DODATEK C + + Uzycie IIUWGRAFu z Lattice C. + + + 1) Nalezy unikac konfliktow z nazwami globalnych zmiennych + roboczych IIUWGRAFu. Zmienne te maja nazwy rozpoczynajace + sie od liter WIR... i PQASP... + + 2) W przypadku procedur majacych parametry wyjsciowe ( w + dodatku E sa one zaznaczone jako vars ) nalezy przy ich + wywolaniu przekazywac adres odpowiedniego parametru + aktualnego. + + Przyklad: + + + CHAR LENGTH; + CHAR *TEXT; + ... + INHLINE(&LENGTH,TEXT) + + + + 3) Adresy parametrow aktualnych nalezy przekazywac rowniez + w przypadku parametrow bedacych tablicami znakowymi. + + + Przyklad: + + + INT LENGTH; + CHAR *TEXT; /* LUB NP. CHAR TEXT[40]; */ + ... + OUTHLINE(LENGTH, &TEXT[3]); + /* WYPISZ ZNAKI Z TABLICY 'TEXT', ROZPOCZYNAJAC OD + CZWARTEGO */ + + + + 26 + + + + + DODATEK D + + Uzycie IIUWGRAFu z LOGLANem. + + + 1) W biezacej wersji LOGLANu dostepnych jest jedynie 7 + podstawowych procedur: GRON, GROFF, MOVE, DRAW, HASCII, + HPAGE, INKEY obslugujacych wylacznie karte Hercules. + + 2) System okienek do konwersacji nie bedzie w LOGLANie + dostepny w postaci procedur standardowych. Podobnie okienka + o wspolrzednych rzeczywistych. + + 3) Niektore podprogramy dostepne jako funkcje standardowe + LOGLANu musza miec zmienione specyfikacje parametrow w + stosunku do oryginalnego IIUWGRAFu: + + IIUWGRAF LOGLAN + + GETMAP GETMAP:function:array of ? + INKEY INKEY:integer function; (* bez parametrow *) + INXPOS INXPOS:integer function;(* bez parametrow *) + INYPOS INYPOS:integer function;(* bez parametrow *) + + + + 27 + + + + + DODATEK E + + Wykaz specyfikacji procedur IIUWGRAFu. + + + proc BORDER(consts b: integer); + L proc BURY(window: buffer); + proc CIRB(consts ix,iy,ir: integer; + consts alfa, beta: real; + consts cbord, bcint, p, q: integer); + proc CLS; + proc COLOR(consts c: integer); + proc DRAW(consts ix,iy: integer); + L proc EXPOSE(window: buffer; consts x,y: integer); + L proc GETMAP(consts x,y: integer; ekran: buffer); + L proc GROFF; + proc GRON(consts imode: integer); + proc HASCII(consts ic: integer); + proc HFILL(consts maxx: integer); + proc HFONT(consts seg, offs: integer); + proc HFONT8(vars seg, offs: integer); + proc HPAGE(consts page, mode, clear: integer); + P proc INHLINE(vars n:integer; line: tekst); + L func INKEY(consts idummy: integer): integer; + func INPIX(consts x,y: integer): integer; + proc INTENS(consts i: integer); + PL proc INWLINE(window: buffer; vars n: integer; + line: tekst); + L func INXPOS(consts idummy: integer): integer; + L func INYPOS(consts idummy: integer): integer; + L proc MKWNDW(consts x,y,icols,ilines: integer; + window: buffer; + consts iwndwsize,iborder: integer); + proc MOVE(consts ix,iy: integer); + L func NOCARD(consts idummy: integer): integer; + proc ORMAP(ekran: buffer); + PL proc OUTHLINE(consts n:integer; line: tekst); + PL proc OUTWLINE(window: buffer; consts n: integer; + line: tekst); + proc PALLET(consts p: integer); + proc PATERN(consts p1, p2, p3, p4: integer); + proc POINT(consts ix,iy: integer); + proc POPXY; + proc PRTSCR(consts nr: integer); + proc PUSHXY; + proc PUTMAP(ekran: buffer); + L proc RCIRB(consts ix,iy,ir: real; + consts alfa, beta: real; + consts cbord, bcint, p, q: integer); + L proc RDRAW(consts rx,ry: real); + PL func RINXPOS(consts dummy: real): real; + PL func RINYPOS(consts dummy: real): real; + L proc RMOVE(consts rx,ry: real); + PL proc RWINDOW(rw: array [1:4] of real; + consts s: integer); + proc STYLE(consts s: integer); + + + 28 + + + PL proc SWINDOW(rw: array [1:4] of real; + iw: array [1:4] of integer; + consts s: integer); + proc TRACK(consts x,y: integer); + proc VFILL(consts maxy: integer); + proc VIDEO(ekran: buffer); + proc XORMAP(ekran: buffer); + + Uzyto notacji semi-pascalowej. + Specyfikacja consts oznacza parametr przekazywany przez + wartosc (tylko wejsciowy), vars - przez zmienna (wejsciowo- + wyjsciowy). + Typ buffer oznacza tablice bajtowa sluzaca do przechowania + zawartosci okreslonego obszaru ekranu ( rozmiar jej zalezy + od wielkosci tego obszaru ), typ tekst natomiast oznacza + tablice znakowa. + Litery w pierwszej kolumnie sugeruja dodatkowe wazne + informacje (roznice) w kontekscie konkretnych jezykow + (Fortran, Pascal, C, Loglan). + + + 29 + + + + DODATEK F + + Wartosci kodow klawiszy specjalnych: + + + 3 - ctrl-2 + 15 - back tab (shift-tab) + 16-25 - ALT-Q az do ALT-P + 30-38 - ALT-A az do ALT-L + 44-50 - ALT-Z az do ALT-M + 59-68 - F1 az do F10 + 71 - Home + 72 - Cursor-Up + 73 - PgUp + 75 - Cursor-Left + 77 - Cursor-Right + 79 - End + 80 - Cursor-Down + 81 - PgDn + 82 - Ins + 83 - Del + 84-93 - Shift-F1 az do Shift-F10 + 94-103 - Ctrl-F1 az do Ctrl-F10 + 104-113 - Alt-F1 az do Alt-F10 + 114 - Ctrl-PrtSc + 115 - Ctrl-Cursor-Left + 116 - Ctrl-Cursor-Right + 117 - Ctrl-End + 118 - Ctrl-PgDn + 119 - Ctrl-Home + 120-131 - Alt-1 az do Alt-= + 132 - Ctrl-PgUp + + + 30 + + + + + DODATEK G + + FEDIT + + Prosty program do edycji kroju znakow. + Dodatek do biblioteki graficznej IIUWGRAF. + + FEDIT pozwala komponowac i modyfikowac uklady pixli o + wymiarze 8*8. Takie uklady moga byc wyswietlane razem z + grafika za pomoca procedury HASCII. + + FEDIT produkuje opisy tablic kroju znakow w dwoch + postaciach: + + - jako podprogram dostarczajacy adres tablicy kroju + w postaci odpowiedniej do przekazania procedurze HFONT, + + - jako niezalezny program umieszczajacy wskaznik do + tablicy kroju w wektorze przerwania 14H. + + Pierwszy format moze byc uzyty do zastapienia standardowego + zestawu znakow zwykle znajdujacego sie w ROM BIOS pod + adresem F000:FA6E. Jest on uzywany przez procedure HASCII do + rysowania znakow o kodach od 0 do 127. Stad jego nazwa : + "format 0". + + Podprogram wygenerowany przez FEDIT ma nazwe HFONT8. Po + przetlumaczeniu przez MACROASSEMBLER musi byc on linkowany + razem z programem uzytkowym. Jesli zajdzie potrzeba zmiany + nazwy (np. w celu dynamicznego przelaczania pomiedzy kilkoma + krojami znakow), nazwa moze byc zmieniona recznie w tekscie + zrodlowym. + + Drugi format jest uzywany do rysowania znakow z + rozszerzonego zakresu znakow o kodach od 128 do 255. Stad + nazwa: + "format 128". + + Opis zestawu znakow w tym formacie musi byc zaladowany do + pamieci przed rozpoczeciem wykonania programu, ktory z niego + korzysta. Wskaznik do tablicy kroju musi byc wpisany w + wektor przerwania 14H. Robi to program wygenerowany przez + FEDIT, ktory nastepnie zawiesza sie za pomoca przerwania 27H + (terminate but stay resident). W tym przypadku tekst + zrodlowy po przetlumaczeniu przez MACROASSEMBLER musi byc + zlinkowany (bez zadnych bibliotek) do postaci .EXE. + IIUWGRAF i FEDIT nie daja mozliwosci dynamicznego + przelaczania tablic znakow rozszerzonego zakresu. + + + + 31 + + + Przyklad: + + VAR ISEG, IOFFS: INTEGER; + BEGIN + HFONT8(ISEG,IOFFS); (* ADRES TABLICY FORMATU 0 *) + ... + HASCII(45); (* UZYWA ROM BIOS *) + HASCII(145); (* UZYWA ROZSZERZONEGO ZESTAWU *) + ... + HFONT(ISEG,IOFFS); + HASCII(45); (* UZYWA TABLICY FORMATU 0 *) + HASCII(145); (* TEN SAM ROZSZERZONY ZESTAW *) + ... + HFONT(16#F000,16#FA6E); + HASCII(45); (* ZNOWU ROM BIOS *) + HASCII(145); (* TEN SAM ROZSZERZONY ZESTAW *) + + + FEDIT jest prostym programem konwersacyjnym o kilku + zaledwie rozkazach. Tablica kroju znakow zawiera wzorce + ukladow pixli rozmiaru 8*8. Wzorzec pojedynczego znaku moze + byc wyjety z tej tablicy w celu jego edycji i zapamietany z + powrotem, byc moze w innym miejscu tablicy. Sa dwie tablice + znakow: jedna dla kodow od 0 do 127, druga dla kodow od 128 + do 255. Pierwsza z nich nie moze byc modyfikowana. Druga z + nich moze poczatkowo zawierac zaladowany wczesniej + rozszerzony zestaw lub zostac wyczyszczona. Mozna tez + wczytac do niej zestaw zawarty w pliku wygenerowanym + wczesniej przez FEDIT. Po dokonaniu modyfikacji, zawartosc + tej drugiej tablicy moze byc uzyta do generacji badz + "formatu 0" badz "128". + + + Rozkazy FEDITu. + + + Rozkazy FEDITu sa wprowadzane jako pojedyncze litery + wybierajace czynnosci wymienione w jadlospisie wyswietlonym + u gory ekranu. Dodatkowe parametry podaje sie po + przynagleniu przez FEDIT. + + Komendy FEDITu: + + < low odswieza tablice "0 do 127" + + > high odswieza tablice "128 do 255" + + i init inicjalizuje zerami tablice "128 do 255" + + l load laduje tablice "128 do 255" z pliku + dodatkowy parametr: + - nazwa pliku (musi istniec) + + + 32 + + + + d dump wypisuje zawartosc tablicy "128 do 255" + na plik; dodatkowe parametry: + - nazwa pliku (bedzie zapisany) + - baza ( 0 albo 128), + zaleznie od formatu + - jezyk: + f - MS Fortran, MS Pascal + s - Lattice C, model S + p - Lattice C, model P + d - Lattice C, model D + l - Lattice C, model L + + e edit wyjmuje z tablicy pojedynczy znak + i umieszcza go w obszarze roboczym. + dodatkowy parametr: + - kod znaku (dziesietnie) + Po obszarze roboczym mozna poruszac sie + za pomoca klawiszy kierunkowych. Pixel + zapala klawisz Ins, gasi klawisz Del. + Klawisz End powoduje wyjscie z tego trybu. + + t text wyswietla tekst pomocny przy ocenie + jakosci ksztaltu znakow. Tekst, nie dluzszy + niz 40 znakow jest wprowadzany przez uzytkow- + nika. Dodatkowe parametry: + - vspace, + - hspace - odpowiednio, pionowy i poziomy + odstep w pixlach pomiedzy znakami. Normalnie, + vspace wynosi 2, hspace - 0. + + p put przechowuje wzorzec z obszaru roboczego pod + wskazanym kodem. Dodatkowy parametr: + - kod pozycji (dziesietnie), + powinien byc miedzy 128 a 255 + + q quit konczy dzialanie FEDIT + + + Z FEDITem nalezy obchodzic sie ostroznie. Posiada on jedynie + minimalne wbudowane zabezpieczenia i np. bez ostrzezenia + zapisze nowa, nie wykonczona jeszcze wersje kroju znakow na + pliku zawierajacym jedyny egzemplarz poprzedniej, bardzo + potrzebnej wersji. + + + 33 + + + + DODATEK H + + Zmiany IIUWGRAFu w stosunku do poprzednich wersji + + + + Zmiany IIUWGRAFu w stosunku do wersji 1.1 + + + 1) Rozszerzenie zestawu obslugiwanych kart graficznych o + karte EGA ( IBM Enhanced Graphics Adapter ). + + 2) Niewielkie modyfikacje procedur IIUWGRAFu : + + - dodanie procedury PRTSCR, + - modyfikacja procedury PATERN polegajaca na : + zwiekszeniu liczby parametrow ( wzorcow ) z + dwoch do czterech oraz + zmianie postaci tych parametrow ( zamiast + liczb dziesietnych liczby szesnastkowe ), + ( rozszerzenie wzorcow oczywiscie oznacza rownoczesnie + modyfikacje procedur HFILL oraz VFILL ), + - zmiany nazw procedur GRAPH, TEXT, SCREEN + odpowiednio na GRON, GROFF, NOCARD. + + + + + Zmiany IIUWGRAFu w stosunku do wersji 2.1 + + + 1) Udostepnienie procedur CIRB oraz RCIRB dla C. + \ No newline at end of file diff --git a/utils/lotek/logdeb.exe b/utils/lotek/logdeb.exe new file mode 100644 index 0000000000000000000000000000000000000000..c1c887eb81e13520110d7c6f6792fa1dd6c865bc GIT binary patch literal 26192 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 literal 0 HcmV?d00001 diff --git a/utils/lotek/loghelp.hlp b/utils/lotek/loghelp.hlp new file mode 100644 index 0000000000000000000000000000000000000000..2ff08ac224367e608565d7d3a514632fd9468ac1 GIT binary patch literal 1791 zcmchXPfrs;6u{s14~5cFFE&6-d_kl5hm}$TO7~#1v_M#3(?8KeJxsS_S=#Q@*}N z_my*bFEF}_rs=k-oHVy+C;pwjovrQ1=W3lmr{FuD-l*g`?H@k<6o=s)=4g{~$9ebdZ|D!>ztI(DlyVt;GgpvTG`(*yVh?S= zu!fpS8nZn4s^eW|Nh~)x>(XSm$meUck7d-TzFFG zAKgnk6oZi>7H!HK#DeFkNHL$ut*1AzmvRJ}DL>e$NJ*AO`iVc$r#t_Ny(4mJH(;d6 znL#TqZ%e~)EfM#Jh5S?ZasMQs4{jzRa6KVOl3016AWSD>(35|z4F4tnwn(3Z&^oR& z*QSCBa8C)tT}6^&AS)|D5%R;V5``HN@(r*IV{l(ti9k4yd52gP!YdenMP&>Y1jsK| z9y61?In+55FF~VWT2<7DRdq>~$^$F|Bt>WY&KvNi@WRlO5ORnpuyJM} z5MIMI+AcHE4V(a^JqtRq4N}Jz<@Pqgq?}9y2RZ{PPHPfGGnnC=aa37_+5oEPxiB0Q zdTlraS;YrSA~FgG12ixxx=#BFm&DuaT8`PENP9=HFG~JZh^eS<5l#$;ah($ literal 0 HcmV?d00001 diff --git a/utils/lotek/loghelp.mph b/utils/lotek/loghelp.mph new file mode 100644 index 0000000000000000000000000000000000000000..7c268d2ca3ccf5a4be35a00e2ea20745069257c3 GIT binary patch literal 1819 zcmchXPfrs;7{;I7wiHUSUMz-~I6>ooR!R*h-GfbS0a;*E+UNlf!*(d8?QWgjwU&b( z&_lyF;AZ>)nt1U@qBj#y#t&cuM^BzGiqo|rBuz}PguTq{o5}lo=Y5`c`~j<0vK#y3 zPlmVL=gyf8fBy_AmE3xf)7mO)M!&LGqvg%$Sh?wM=H&hHr^DXaiI>j(mC2=wRjg1` zEDkF#&CKK@_oc{oBt5^!IO}Z|%M~cXi{Vf9sQ2H+NcaZDC4F&bM#=_eaS+ z%pDmn()O$)g1$V-+l*JKiN}d>eleY$OU{#4%0AQ*KG=!ylA?(89q{(q|DlVVS`(Mh zSL2q!3NCL*y|@sI`a;44Z4X3!Lm)CP$HKT6lO##(yifpFVi9yy(}fAHiS%y}M{thJ zS+30l7r3d0a6^@(2o!ZXAVNNjssk7iA-MzIMJsSio&JU}LW^Y4p=N>d0`X%~J%tH@ z@`;^C4((?a;ba zZx|ibbfJSm*2xb94|HJdu^72MMs#k8m!VoMnMI;ev*^+yQ##;X=nxkk{|Wi94&F?j z82lH85Ok<$vvHtBshQ>LA>wos~Z0w0MzS(&4To`JGv~xi5RfJO0d-lZwEzGB literal 0 HcmV?d00001 diff --git a/utils/lotek/loghelp.spt b/utils/lotek/loghelp.spt new file mode 100644 index 0000000000000000000000000000000000000000..c3e4ac42e22f42d0e6b409ea9dcaf7bcc7dac403 GIT binary patch literal 24240 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 AzW@LL literal 0 HcmV?d00001 diff --git a/utils/lotek/loghelp.str b/utils/lotek/loghelp.str new file mode 100644 index 0000000..3e4125b --- /dev/null +++ b/utils/lotek/loghelp.str @@ -0,0 +1,517 @@ + 103 156 ³ Informacje ogolne + 166 193 ³ Procedury poziomu 1 + 203 345 ³ Procedury ustawiania trybu + 356 527 ³ Procedury sterujace kolorami + 537 596 ³ Procedury ustawiania pozycji + 607 616 ³ Procedury obslugujace punkty + 626 684 ³ Procedury rysowania linii + 694 739 ³ Procedury operujace na fragmentach ekranu + 749 813 ³ Procedury wejscia/wyjscia dla pojedynczych znakow + 825 857 ³ Procedury wejscia/wyjscia dla linii + 869 916 ³ Procedury wejscia/wyjscia dla okienek + 926 928 ³ Procedury poziomu 2 + 935 1021 ³ Definiowanie okna + 1031 1059 ³ Informacje dodatkowe + 1067 1084 ³ Procedury dodatkowe + 1099 1120 ³ Uzycie IIUWGRAFu z FORTRANem 77. + 1134 1144 ³ Uzycie IIUWGRAFu z PASCALem. + 1157 1188 ³ Uzycie IIUWGRAFu z Lattice C. + 1202 1219 ³ Uzycie IIUWGRAFu z LOGLANem. + 1233 1307 ³ Wykaz specyfikacji procedur IIUWGRAFu. + 1357 1507 ³ FEDIT + 1520 1545 ³ Zmiany IIUWGRAFu w stosunku do poprzednich wersj + 197 222 ³ List of symbols + 226 444 ³ 1. Preface + 3 89 ³ 2. The basic characteristics of LOGLAN-82 + 451 597 ³ 2.1. Control structure + 601 690 ³ 2.2. Block structure + 694 734 ³ 2.3. Procedures and functions + 738 789 ³ 2.4. Classes + 793 885 ³ 2.5. Prefixing + 889 932 ³ 2.6. Object deallocator + 936 975 ³ 2.7. Arrays + 980 1032 ³ 2.8. Parameters + 1036 1076 ³ 2.9. Coroutines + 1081 1132 ³ 2.10. Processes + 1136 1168 ³ 2.11. Other important features + 1172 1297 ³ 3. Lexical and textual structure + 1301 1341 ³ 4. Types + 1345 1391 ³ 4.1. Primitive types + 1395 1441 ³ 4.2. System types + 1445 1456 ³ 4.3. Compound types and objects + 1457 1498 ³ 4.3.1. Array type + 1502 1528 ³ 4.3.2. Class type + 1532 1556 ³ 4.4. Formal types + 1560 1591 ³ 5.Declarations + 1594 1619 ³ 5.1. Constant declaration + 1623 1672 ³ 5.2. Variable declaration + 1677 1690 ³ 5.3. Unit declaration + 1691 1731 ³ 5.3.1. Class declaration (introduction) + 1735 1806 ³ 5.3.2. Subprogram declaration (introduction) + 1810 1843 ³ 5.3.3. Block + 1847 1879 ³ 5.3.4. Prefixing + 1883 2015 ³ 5.3.5. Formal parameters + 2019 2112 ³ 5.3.6. Unit body + 2116 2133 ³ 6. Static and dynamic locations + 2135 2164 ³ 6.1. Unit attributes + 2168 2177 ³ 6.2. Protected attributes + 2179 2206 ³ 6.2.1. Hidden attributes + 2210 2223 ³ 6.2.2. Taken attributes + 2226 2249 ³ 6.2.3. Legal and illegal identifiers + 2253 2304 ³ 6.2.4. Close attributes + 2308 2390 ³ 6.3. Static location + 2394 2427 ³ 6.4. Objects + 2431 2564 ³ 6.4.1. Virtual attributes + 2568 2663 ³ 6.4.2. Valuation of virtuals + 2667 2720 ³ 6.5. Dynamic location + 2724 2783 ³ 7. Consistency of types + 2787 2835 ³ 8. Expressions + 2839 2864 ³ 8.1. Constant + 2868 2889 ³ 8.2. Variable + 2893 2927 ³ 8.2.1. Simple variable + 2931 2971 ³ 8.2.2. Subscripted variable + 2975 3018 ³ 8.2.3. Dotted variable + 3022 3059 ³ 8.2.4. System variable + 3063 3176 ³ 8.3. Arithmetic expression + 3180 3359 ³ 8.4. Boolean expression + 3363 3406 ³ 8.5. Character expression + 3410 3453 ³ 8.6. String expression + 3457 3525 ³ 8.7. Object expression + 3529 3551 ³ 9. Sequential statements. + 3558 3585 ³ 9.1. Sequential primitive statements + 3590 3737 ³ 9.1.1. Evaluation statement + 3741 3758 ³ 9.1.2. Configuration statement + 3761 4133 ³ 9.1.2.1. Allocation statement + 4137 4201 ³ 9.1.2.2. Deallocation statement + 4205 4291 ³ 9.1.3. Simple control statement + 4295 4348 ³ 9.1.4. Coroutine statement + 4352 4368 ³ 9.2. Compound statements + 4373 4439 ³ 9.2.1. Conditional statement + 4443 4499 ³ 9.2.2. Case statement + 4506 4799 ³ 9.2.3. Iteration statement + 4803 4819 ³ 10. Exception handling + 4822 4844 ³ 10.1. Signal specification + 4848 4898 ³ 10.2. Signal handlers + 4902 5046 ³ 10.3. Signal raising + 5050 5145 ³ 10.4. Handler execution + 5149 5183 ³ 10.5. System signals + 5187 5269 ³ 11. Processes + 5274 5403 ³ 11.1. Transition state statement + 5407 5588 ³ 11.2. Primitive synchronizing statement + 5592 5760 ³ 11.3. Monitors (compound synchronization facilities) + 5765 5862 ³ 12. Separate compilation of units + 5866 5920 ³ 12.1. Library items + 5924 6084 ³ 12.1.1. Interface + 6088 6140 ³ 12.1.2. Using languages + 6144 6151 ³ 12.1.3. Using externals + 6155 6198 ³ 12.1.4. Using sl-virtuals + 6202 6224 ³ 12.2. Linking library items + 6227 6373 ³ 12.2.1. Connecting the interface + 6377 6419 ³ 12.3. Binary items + 6423 6425 ³ 12.4. Processing libraries + 6427 6452 ³ 12.4.1. Recompilation + 6456 6482 ³ 12.4.2. Insertions and deletions + 3 89 ³ 13. File processing + 6490 6524 ³ 13.1. External and internal files + 6528 6608 ³ 13.2. File generation and deallocation + 6612 6663 ³ 13.3. Binary input-output + 6667 6723 ³ 13.4. Other predefined operations + 6727 6817 ³ 13.5. Text input-output + 6821 6880 ³ 13.6. Example of high-level file processing + 6884 6973 ³ Bibliography + 19 100 ³Wstep + 105 349 ³1. Compound statements + 354 443 ³2. Modularity + 449 637 ³3. Procedures and functions + 642 829 ³4. Classes + 834 975 ³5. Adjustable arrays + 981 1158 ³6. Coroutines and semicoroutines + 1164 1490 ³7. Prefixing + 1496 1548 ³8. Formal types + 1554 1591 ³9. Protection techniques + 1597 1691 ³10. Programmed deallocation + 1697 1781 ³11. Exception handling + 1785 1788 ³12. Separate compilation (this section does not apply to PC vers + 1793 1999 ³13. Processes + 2005 2009 ³References. + 20 29 ³Wstep + 110 118 ³0. Preface + 123 141 ³1. Using Loglan-82 system + 146 184 ³ 1.1. Compilation + 187 216 ³ 1.2. Compiler switches + 220 245 ³ 1.3. Code generation + 249 294 ³ 1.4. Program interpretation + 296 327 ³ 1.5. Compile time error + 332 341 ³ 1.6. Run-time errors + 346 359 ³2. Compiler options + 362 371 ³ 2.1. Option format + 378 403 ³ 2.2. Options list + 408 410 ³3. Loglan implementation specification + 411 419 ³ 3.1. Implemented subset of Loglan + 422 432 ³ 3.2. Non-standard language elements + 437 442 ³ 3.3. File system + 445 461 ³ 3.3.1. File variables + 465 501 ³ 3.3.2. File generation + 504 508 ³ 3.3.3. File deallocation + 512 530 ³ 3.3.4. General file operations + 535 556 ³ 3.3.5. Text files + 560 577 ³ 3.3.6. Binary sequential files + 581 630 ³ 3.3.7. Direct access binary files + 635 644 ³ 3.4. Concurrency + 647 676 ³ 3.4.1. Invoking the LOGLAN interpreter for concurrent pro + 679 753 ³ 3.4.2. Restrictions and differences from the report + 756 841 ³ 3.4.3. Communication mechanism + 846 865 ³ 3.5. System signals + 870 910 ³ 3.6. Implementation restrictions + 913 922 ³A. Standard constants + 928 1077 ³B. Standard classes + 931 972 ³ IIUWGRAPH + 976 1077 ³ MOUSE + 1082 1196 ³C. Standard procedures and functions + 1202 1755 ³D. Error codes + 1758 1833 ³E. Loglan runtime errors + 1835 1914 ³F. Character set + 1919 1923 ³Bibliography + 435 455 ³ proc BORDER(consts b: integer); + 883 889 ³ L proc BURY(window: buffer); + 636 649 ³ proc CIRB(consts ix,iy,ir: integer; + 636 649 ³ consts alfa, beta: real; + 636 649 ³ consts cbord, bcint, p, q: integer); + 250 253 ³ proc CLS; + 356 379 ³ proc COLOR(consts c: integer); + 626 632 ³ proc DRAW(consts ix,iy: integer); + 892 896 ³ L proc EXPOSE(window: buffer; consts x,y: integer) + 694 714 ³ L proc GETMAP(consts x,y: integer; ekran: buffer); + 242 247 ³ L proc GROFF; + 203 220 ³ proc GRON(consts imode: integer); + 770 794 ³ proc HASCII(consts ic: integer); + 652 667 ³ proc HFILL(consts maxx: integer); + 802 806 ³ proc HFONT(consts seg, offs: integer); + 809 813 ³ proc HFONT8(vars seg, offs: integer); + 260 298 ³ proc HPAGE(consts page, mode, clear: integer); + 832 857 ³ P proc INHLINE(vars n:integer; line: tekst); + 520 527 ³ proc INTENS(consts i: integer); + 907 916 ³ PL proc INWLINE(window: buffer; vars n: integer; + 907 916 ³ line: tekst); + 869 880 ³ L proc MKWNDW(consts x,y,icols,ilines: integer; + 869 880 ³ window: buffer; + 869 880 ³ consts iwndwsize,iborder: integer); + 537 547 ³ proc MOVE(consts ix,iy: integer); + 728 732 ³ proc ORMAP(ekran: buffer); + 825 829 ³ PL proc OUTHLINE(consts n:integer; line: tekst); + 899 904 ³ PL proc OUTWLINE(window: buffer; consts n: integer; + 899 904 ³ line: tekst); + 458 516 ³ proc PALLET(consts p: integer); + 411 432 ³ proc PATERN(consts p1, p2, p3, p4: integer); + 607 610 ³ proc POINT(consts ix,iy: integer); + 558 577 ³ proc POPXY; + 1067 1084 ³ proc PRTSCR(consts nr: integer); + 550 555 ³ proc PUSHXY; + 718 725 ³ proc PUTMAP(ekran: buffer); + 1015 1021 ³ L proc RCIRB(consts ix,iy,ir: real; + 1015 1021 ³ consts alfa, beta: real; + 1015 1021 ³ consts cbord, bcint, p, q: integer); + 1006 1011 ³ L proc RDRAW(consts rx,ry: real); + 998 1002 ³ L proc RMOVE(consts rx,ry: real); + 981 984 ³ PL proc RWINDOW(rw: array [1:4] of real; + 981 984 ³ consts s: integer); + 382 405 ³ proc STYLE(consts s: integer); + 935 974 ³ PL proc SWINDOW(rw: array [1:4] of real; + 935 974 ³ iw: array [1:4] of integer; + 935 974 ³ consts s: integer); + 584 596 ³ proc TRACK(consts x,y: integer); + 675 684 ³ proc VFILL(consts maxy: integer); + 301 345 ³ proc VIDEO(ekran: buffer); + 735 739 ³ proc XORMAP(ekran: buffer); + 979 982 ³MOUSE + 989 993 ³showcursor:procedure + 995 999 ³hidecursor:procedure + 1001 1007 ³status:procedure(output h, v:integer, l, r, c:boolean) + 1009 1014 ³setposition:procedure(h, v:integer) + 1016 1022 ³getpress:procedure(b:integer; output h, v, p:integer, l, r, c:boo + 1024 1030 ³getrelease:procedure(b:integer; output h, v, p:integer, l, r, c:b + 1032 1036 ³setwindow:procedure(l, r, t, b:integer) + 1039 1054 ³defcursor:procedure(s, x, y:integer) + 1056 1058 ³getmovement:procedure(output h, v:integer) + 1060 1069 ³setspeed:procedure(h, v:integer) + 1071 1077 ³setthreshold:procedure(s:integer) + 1085 1086 ³ ENDRUN:procedure; + 1088 1089 ³ RANSET:procedure(x:real); + 1180 1182 ³ RESET:procedure(f:file); + 1184 1187 ³ REWRITE:procedure(f:file); + 1189 1190 ³ UNLINK:procedure(f:file); + 1192 1193 ³ SEEK:procedure(f:file; offset, base:integer); + 749 765 ³ L func INKEY(consts idummy: integer): integer; + 613 616 ³ func INPIX(consts x,y: integer): integer; + 543 547 ³ L func INXPOS(consts idummy: integer): integer; + 543 547 ³ L func INYPOS(consts idummy: integer): integer; + 224 238 ³ L func NOCARD(consts idummy: integer): integer; + 988 994 ³ PL func RINXPOS(consts dummy: real): real; + 988 994 ³ PL func RINYPOS(consts dummy: real): real; + 976 982 ³MOUSE + 984 987 ³init:function(output b:integer):boolean + 1091 1093 ³ RANDOM:function:real; + 1095 1096 ³ SQRT:function(x:real):real; + 1098 1099 ³ SIN:function(x:real):real; + 1101 1102 ³ COS:function(x:real):real; + 1104 1105 ³ TAN:function(x:real):real; + 1107 1108 ³ EXP:function(x:real):real; + 1110 1111 ³ LN:function(x:real):real; + 1113 1114 ³ ATAN:function(x:real):real; + 1116 1117 ³ ENTIER:function(x:real):integer; + 1119 1121 ³ ROUND:function(x:real):integer; + 1123 1124 ³ IMIN:function(x, y:integer):integer; + 1126 1127 ³ IMAX:function(x, y:integer):integer; + 1129 1130 ³ IMIN3:function(x, y, z:integer):integer; + 1132 1133 ³ IMAX3:function(x, y, z:integer):integer; + 1135 1137 ³ ISHFT:function(x, k:integer):integer; + 1139 1140 ³ IAND:function(n, k:integer):integer; + 1142 1143 ³ IOR:function(n, k:integer):integer; + 1145 1146 ³ XOR:function(n, k:integer):integer; + 1148 1150 ³ INOT:function(n:integer):integer; + 1152 1156 ³ ORD:function(c:char):integer; + 1158 1160 ³ CHR:function(n:integer):char; + 1162 1164 ³ UNPACK:function(s:string):arrayof char; + 1166 1168 ³ MEMAVAIL:function:integer; + 1170 1173 ³ EXEC:function(cmd:arrayof char):integer; + 1175 1178 ³ TIME:function: integer; + 1195 1196 ³ POSITION:function(f:file):real; + 1319 1345 ³ Wartosci kodow klawiszy specjalnych: + 1206 1213 ³ 0 - ***declaration part overloaded + 1214 1217 ³ 10 - ***too many errors + 1218 1219 ³ 41 - ***declaration part overloaded + 1220 1220 ³ 101 - ':=' expected + 1221 1221 ³ 102 - ';' expected + 1222 1222 ³ 103 - 'then' expected + 1223 1223 ³ 104 - 'fi'/'else' expected + 1224 1224 ³ 105 - 'od' expected + 1225 1225 ³ 106 - '(' expected + 1226 1226 ³ 107 - ')' expected + 1227 1227 ³ 108 - 'do' expected + 1228 1228 ³ 109 - identifier expected + 1229 1231 ³ 110 - too many exits found + 1232 1232 ³ 111 - illegal character + 1233 1233 ³ 112 - wrong structure of 'if'-statement + 1234 1234 ³ 113 - 'end' missing + 1235 1235 ³ 114 - '.' expected + 1236 1238 ³ 115 - illegal constant in expression + 1239 1239 ³ 116 - '=' expected + 1240 1240 ³ 117 - constant expected + 1241 1241 ³ 118 - ':' expected + 1242 1244 ³ 119 - unit kind specification expected + 1245 1245 ³ 120 - 'hidden' or 'close' occurred twice + 1246 1246 ³ 121 - 'hidden' or 'close' out of a class + 1247 1247 ³ 122 - 'block' expected + 1248 1250 ³ 123 - object expression is not a generator + 1251 1251 ³ 124 - 'dim' expected + 1252 1252 ³ 125 - 'to'/'downto' expected + 1253 1253 ³ 126 - illegal arithmetic operator + 1254 1254 ³ 127 - declaration part expected + 1255 1257 ³ 128 - incorrect identifier at 'end' + 1258 1258 ³ 129 - wrong structure of 'case'-statement + 1259 1259 ³ 130 - wrong structure of 'do'-statement + 1260 1262 ³ 131 - illegal use of 'main' + 1263 1263 ³ 132 - 'when' expected + 1264 1266 ³ 133 - too many branches in 'case'-statement + 1267 1267 ³ 134 - 'begin' missed + 1268 1268 ³ 135 - bad option + 1269 1271 ³ 136 - is it really a loglan program??? + 1272 1276 ³ 137 - 'block' missed - parsing began + 1277 1279 ³ 138 - 'repeat' out of a loop + 1280 1280 ³ 139 - there is no path to this statement + 1281 1281 ³ 140 - 'andif'/'orif' mixed + 1282 1282 ³ 141 - array of 'semaphore' is illegal + 1283 1285 ³ 142 - wrong handler end + 1286 1286 ³ 143 - lastwill inside a structured statement + 1287 1289 ³ 144 - repeated lastwill + 1290 1290 ³ 145 - no parameter specification + 1291 1291 ³ 146 - wrong register specification + 1292 1292 ³ 147 - "," expected + 1293 1296 ³ 191 - ***null program + 1297 1300 ³ 196 - ***too many identifiers + 1301 1304 ³ 197 - ***too many formal parameters + 1305 1307 ³ 198 - ***parsing stack overloaded + 1308 1311 ³ 199 - ***too many prototypes + 1312 1312 ³ 201 - wrong real constant + 1313 1313 ³ 202 - wrong comment + 1314 1314 ³ 203 - wrong character constant + 1315 1315 ³ 204 - wrong integer constant + 1316 1317 ³ 205 - integer overflow + 1318 1319 ³ 206 - real overflow + 1320 1322 ³ 211 - identifier too long + 1323 1325 ³ 212 - string too long + 1326 1329 ³ 301 - prefix is not a class id + 1330 1332 ³ 303 - coroutine/process illegal here as prefix id + 1333 1335 ³ 304 - hidden identifier cannot be taken id + 1336 1336 ³ 305 - undeclared identifier id + 1337 1337 ³ 306 - undeclared type identifier id + 1338 1342 ³ 307 - type identifier expected id + 1343 1343 ³ 308 - undeclared prefix identifier id + 1344 1344 ³ 309 - declared more than once id + 1345 1345 ³ 310 - taken list in unprefixed unit + 1346 1349 ³ 316 - formal type specification after use id + 1350 1353 ³ 317 - hidden type identifier id + 1354 1356 ³ 318 - type identifier not taken id + 1357 1359 ³ 319 - hidden identifier in the list id + 1360 1363 ³ 320 - identifier in the list not taken id + 1364 1366 ³ 321 - identifier cannot be taken id + 1367 1368 ³ 322 - hidden prefix identifier id + 1369 1370 ³ 323 - prefix identifier not taken id + 1371 1373 ³ 329 - only procedure and function may be virtual + 1374 1374 ³ 330 - virtual in unprefixed block/procedure/function + 1375 1378 ³ 331 - incompatible kinds of virtuals id + 1379 1381 ³ 332 - incompatible types of virtuals id + 1382 1384 ³ 333 - different lengths of form.param.lists in virtuals + 1385 1390 ³ 334 - conflict kinds of the 1st level parameters + 1391 1395 ³ 335 - incompatible types of the 1st level parameters + 1396 1400 ³ 336 - different lengths of the 2nd level params lists + 1401 1405 ³ 337 - incompatible kinds of the 2nd level parameters i + 1406 1410 ³ 338 - incompatible types of the 2nd level parameters i + 1411 1412 ³ 341 - ***declaration part overloaded + 1413 1413 ³ 342 - ***too many classes declared + 1414 1415 ³ 343 - ***too many prototypes + 1416 1416 ³ 350 - undeclared signal identifier id + 1417 1418 ³ 351 - hidden signal identifier id + 1419 1420 ³ 352 - signal identifier not taken id + 1421 1423 ³ 353 - signal identifier expected id + 1424 1428 ³ 354 - different types of parameters id + 1429 1432 ³ 355 - incompatible kinds of parameters id + 1433 1436 ³ 356 - different identifiers of parameters id + 1437 1438 ³ 357 - incompatible kinds of the 2nd level parameters i + 1439 1440 ³ 358 - different types of the 2nd level parameters + 1441 1446 ³ 359 - different lengths of the 2nd level params lists + 1447 1450 ³ 360 - different lengths of form. param. lists in signal + 1451 1453 ³ 361 - non-local formal type cannot be used id + 1454 1456 ³ 362 - repeated handler for signal id + 1457 1459 ³ 370 - only 'input' is legal here + 1460 1473 ³ 398 - class prefixed by itself id + 1474 1476 ³ 404 - repeated label in 'case'-statement id + 1477 1479 ³ 405 - illegal type of 'case' expression id + 1480 1480 ³ 406 - different types of labels and 'case' expression + 1481 1481 ³ 407 - non-logical expression after 'if'/'while' i + 1482 1484 ³ 408 - real constant out of integer range + 1485 1487 ³ 410 - simple variable expected id + 1488 1490 ³ 411 - non-integer control variable id + 1491 1495 ³ 412 - non-integer expression id + 1496 1496 ³ 413 - file expression expected id + 1497 1497 ³ 414 - string expression expected id + 1498 1501 ³ 415 - reference expression expected id + 1502 1502 ³ 416 - array expression expected id + 1503 1503 ³ 417 - boolean expression expected id + 1504 1504 ³ 418 - semaphore variable expected + 1505 1507 ³ 419 - illegal type in 'open' + 1508 1511 ³ 420 - variable expected id + 1512 1514 ³ 421 - class identifier after 'new' expected id + 1515 1515 ³ 422 - procedure identifier after 'call' expected + 1516 1518 ³ 423 - 'new' missing id + 1519 1521 ³ 424 - 'call' missing id + 1522 1522 ³ 425 - 'inner' out of a class + 1523 1523 ³ 426 - 'inner' occurred more than once + 1524 1524 ³ 427 - 'wind'/'terminate' out of a handler + 1525 1525 ³ 428 - 'inner' inside lastwill + 1526 1528 ³ 429 - definition cannot be reduced to constant id + 1529 1529 ³ 430 - undefined constant in the definition id + 1530 1532 ³ 431 - wrong number of indices id + 1533 1533 ³ 432 - index out of range id + 1534 1534 ³ 433 - upper bound less than lower bound id + 1535 1536 ³ 434 - too many subscripts id + 1537 1537 ³ 435 - variable is not array id + 1538 1541 ³ 440 - type identifier expected after 'arrayof' id + 1542 1545 ³ 441 - incorrect format in 'write' + 1546 1548 ³ 442 - illegal expression in 'write' + 1549 1551 ³ 443 - illegal type of variable in 'read' id + 1552 1553 ³ 444 - no data for i/o transfer + 1554 1554 ³ 445 - illegal expression in 'put' + 1555 1555 ³ 446 - illegal expression in 'get' + 1556 1558 ³ 448 - 'raise' missing id + 1559 1561 ³ 449 - signal identifier expected id + 1562 1563 ³ 450 - illegal procedure occurrence id + 1564 1565 ³ 451 - illegal class occurrence id + 1566 1567 ³ 452 - illegal type occurrence id + 1568 1569 ³ 453 - illegal signal occurrence id + 1570 1570 ³ 454 - illegal operator occurence + 1571 1571 ³ 455 - wrong number of operands + 1572 1572 ³ 460 - divided by zero + 1573 1576 ³ 470 - illegal input parameter id + 1577 1579 ³ 471 - illegal output parameter id + 1580 1582 ³ 472 - illegal type parameter id + 1583 1585 ³ 473 - illegal procedure parameter id + 1586 1588 ³ 474 - illegal function parameter id + 1589 1591 ³ 475 - illegal left side of 'is'/'in' id + 1592 1594 ³ 476 - illegal right side od 'is'/'in' id + 1595 1597 ³ 477 - illegal parameter of 'attach' id + 1598 1598 ³ 478 - illegal type of expression + 1599 1599 ³ 479 - negative step value + 1600 1606 ³ 550 - ***stack overloaded + 1607 1610 ³ 551 - ***too many auxiliary variables needed + 1611 1612 ³ 552 - ***too many auxiliary reference variable needed + 1613 1617 ³ 553 - ***statement sequence too long or too complicated + 1618 1621 ³ 554 - ***real constants dictionary overflow + 1622 1622 ³ 600 - undeclared identifier id + 1623 1625 ³ 601 - illegal type before '.' id + 1626 1629 ³ 602 - close identifier after '.' id + 1630 1634 ³ 603 - undeclared identifier after '.' id + 1635 1637 ³ 604 - illegal operand type id + 1638 1640 ³ 605 - illegal type in 'div/'mod' term id + 1641 1642 ³ 606 - incompatible types in comparison id + 1643 1646 ³ 607 - unrelated class types in comparison id + 1647 1648 ³ 608 - string cannot be compared id + 1649 1654 ³ 609 - incompatible types in assignment/transmission id + 1655 1656 ³ 610 - unrelated class types in assignment/transmission + 1657 1658 ³ 611 - constant after '.' id + 1659 1662 ³ 612 - this class does not occur in sl-chain id + 1663 1667 ³ 613,614 - class identifier expected id + 1668 1671 ³ 615 - illegal type before 'qua' id + 1672 1676 ³ 616,617 - illegal type after 'qua' id + 1677 1680 ³ 618 - unrelated types in 'qua'-expression id + 1681 1684 ³ 619 - hidden identifier id + 1685 1688 ³ 620 - not taken identifier id + 1689 1691 ³ 621 - invisible identifier after '.' id + 1692 1696 ³ 622 - formal parameter list is shorter id + 1697 1698 ³ 623 - formal parameter list is longer id + 1699 1702 ³ 624 - actual parameter is not a reference type id + 1703 1705 ³ 625 - actual parameter is not a type id + 1706 1710 ³ 626 - procedure-function conflict between parameters i + 1711 1716 ³ 627 - unmatched heads-wrong kinds of parameters i + 1717 1721 ³ 628 - unmatched heads-incompatible types in lists + 1722 1726 ³ 629 - unmatched heads-unrelated class types in lists i + 1727 1729 ³ 630 - unmatched heads-different numbers of parameters + 1730 1733 ³ 631 - incompatible types of function parameters + 1734 1737 ³ 632 - function/procedure expected id + 1738 1744 ³ 633 - actual function type defined weaker than formal + 1745 1750 ³ 634 - unmatched heads-too weak type in actual list + 1751 1753 ³ 635 - standard function/procedure cannot be actual par. + 1754 1754 ³ 636 - illegal use of semaphore id + 1755 1755 ³ 637 - 'semaphore' cannot be used id + 1760 1761 ³LOGLAN RUNTIME ERRORS + 1763 1764 ³ARRAY INDEX ERROR (CONERROR) + 1765 1765 ³NEGATIVE STEP VALUE (CONERROR) + 1766 1768 ³SL CHAIN CUT OFF (LOGERROR) + 1769 1771 ³ILLEGAL ATTACH (LOGERROR) + 1772 1774 ³ILLEGAL DETACH (LOGERROR) + 1775 1777 ³ILLEGAL RESUME (LOGERROR) + 1778 1779 ³TOO MANY PROCESSES ON ONE MACHINE (SYSERROR) + 1780 1782 ³INVALID NODE NUMBER (SYSERROR) + 1783 1786 ³IMPROPER QUA (LOGERROR) + 1787 1789 ³ILLEGAL ASSIGNMENT (TYPERROR) + 1790 1791 ³FORMAL TYPE MISSING (LOGERROR) + 1792 1793 ³ILLEGAL KILL (LOGERROR) + 1794 1797 ³ILLEGAL COPY (LOGERROR) + 1798 1800 ³REFERENCE TO NONE (ACCERROR) + 1801 1801 ³MEMORY OVERFLOW (MEMERROR) + 1802 1806 ³INCOMPATIBLE HEADERS (TYPERROR) + 1807 1809 ³INCORRECT ARRAY BOUNDS (CONERROR) + 1810 1810 ³DIVISION BY ZERO (NUMERROR) + 1811 1812 ³COROUTINE TERMINATED (LOGERROR) + 1813 1814 ³COROUTINE ACTIVE (LOGERROR) + 1815 1816 ³HANDLER NOT FOUND (LOGERROR) + 1817 1819 ³ILLEGAL RETURN (LOGERROR) + 1820 1821 ³UNIMPLEMENTED STANDARD PRC. (LOGERROR) + 1822 1823 ³FORMAL LIST TOO LONG (MEMERROR) + 1824 1826 ³ILLEGAL I/O OPERATION (SYSERROR) + 1827 1828 ³I/O ERROR (SYSERROR) + 1829 1829 ³CANNOT OPEN FILE (SYSERROR) + 1830 1830 ³INPUT DATA FORMAT BAD (SYSERROR) + 1831 1832 ³SYSTEM ERROR (SYSERROR) + 1833 1833 ³UNRECOGNIZED ERROR + 1838 1914 ³CHARACTER SET diff --git a/utils/lotek/loglan.txt b/utils/lotek/loglan.txt new file mode 100644 index 0000000..93179c6 --- /dev/null +++ b/utils/lotek/loglan.txt @@ -0,0 +1,2010 @@ + + + + + + + + + + + + + + + + + + + + A micro-manual + + of + + the programming language + + + L O G L A N - 82 + ================ + + + + Basic constructs and facilities + + + Author: Antoni Kreczmar + Institute of Informatics, Warsaw University + September 1982 + + + LOGLAN-82 is a universal programming language designed at the +Institute of Informatics, University of Warsaw. Its syntax is +patterned upon Pascal's. Its rich semantics includes the classical +constructs and facilities offered by the Algol-family programming +languages as well as more modern facilities, such as concurrency and +exception handling. + The basic constructs and facilities of the LOGLAN-82 programming +language include: + +1) A convenient set of structured statements, + +2) Modularity (with the possibility of module nesting and extending), + +3) Procedures and functions (fully recursive; procedures and functions + can be used also as formal parameters), + +4) Classes (as a generalization of records) which enable to define + complex structured types, data structures, packages, etc., + +5) Adjustable arrays whose bounds are determined at run-time in such a + way that multidimensional arrays may be of various shapes, e.g. + triangular, k-diagonal, streaked, etc., + +6) Coroutines and semi-coroutines, + +7) Prefixing - the facility borrowed from Simula-67, substantially + generalized in LOGLAN-82 - which enables to build up hierarchies of + types and data structures, problem-oriented languages, etc., + +8) Formal types treated as a method of module parametrization, + +9) Module protection and encapsulation techniques, + +10) Programmed deallocator - a tool for efficient and secure garbage + collection, which allows the user to implement the optimal + strategy of storage management, + +11) Exception handling which provides facilities for dealing with + run-time errors and other exceptional situations raised by the + user, + +12) Separate compilation techniques, + +13) Concurrency easily adaptable to any operating system kernel and + allowing parallel programming in a natural and efficient way. + + The language covers system programming, data processing, and +numerical computations. Its constructs represent the state-of-art and +are efficiently implementable. Large systems consisting of many +cooperating modules are easily decomposed and assembled, due to the +class concept and prefixing. + LOGLAN-82 constructs and facilities have appeared and evolved +simultaneously with the experiments on the first pilot compiler +(implemented on Mera-400 Polish minicomputer). The research on +LOGLAN-82 implementation engendered with new algorithms for static +semantics, context analysis, code generation, data structures for +storage management etc. + The LOGLAN-82 compiler provides a keen analysis of syntactic and +semantic errors at compilation as well as at run time. The object code +is very efficient with respect to time and space. The completeness of +error checking guarantees full security and ease of program debugging. + +1. Compound statements +###################### + + Compound statements in LOGLAN-82 are built up from simple statements +(like assignment statement e.g. x:=y+0.5, call statement e.g. callP(7,x+5) e + The syntax of conditional statement is as follows: + + if boolean expression + then + sequence of statements + else + sequence of statements + fi + +where "else part" may be omitted: + + if boolean expression + then + sequence of statements + fi + + The semantics of conditional statement is standard. The keyword fi +allows to nest conditional statements without appearence of "dangling +else" ambiguity. + +Example: +-------- + + if delta>0 if + then + x2:=sqrt(delta)/a/2; + if b=0 + then + x1:=x2 + else + x1:=-b/a/2+x2; x2:=x1-2*x2 + fi + else + if delta=0 + then + x1:=-b/a/2; x2:=x1 + else + write(" no real roots") + fi + fi + + The statements in a sequence of statements are separated with +semicolons (semicolon may end a sequence , and then, the last +statement in the sequence is the empty statement). + + The short circuit control forms are realized in LOGLAN-82 by the +conditional statements with orif (or andif) list. A conditional +statement with orif list has the form: orif + + if wb1 orif wb2 ... orif wbk + then + sequence of statements + else + sequence of statements + fi + +and corresponds somehow to a conditional statement: + + if wb1 or wb2 ... or wbk + then + sequence of statements + else + sequence of statements + fi + + The above conditional statement (without orif list) selects for +execution one of two sequences of statements, depending on the truth +value of the boolean expression: + + wb1 or wb2 or ... wbk + +which is always evaluated till the end. For the execution of the +conditional statement with orif list the specified conditons +wb1,...,wbk are evaluated in succession, until the first one evaluates +to true. Then the rest of the sequence wb1,...,wbk is abandoned and +"then part" is executed. If none of the conditions wb1,...,wbk +evaluates to true "else part" is executed (if any). + Conditional statements with orif list facilitate to program those +conditions, which evaluation to the end may raise a run-time error. + +Example: +-------- + The execution of the statement: + + if i>n or A(i)=0 then i:=i-1 else A(i):=1 fi + +where the value of i is greater than n, and A is an array with upper +bound n, will raise the run-time error. Then the user can write: + + if i>n orif A(i)=0 then i:=i-1 else A(i):=1 fi + +what allows to avoid this run-time error and probably agrees with his +intension. + + Conditional statement with andif list has the form: + + if wb1 andif wb2 ... andif wbk + then + sequence of statements + else + sequence of statements + fi + + For the execution of this kind of statements, the conditions +wb1,...,wbk are evaluated in succession, until the first one evaluates +to false; then "else part" (if any) is executed. Otherwise "then part" +is executed. + + Iteration statement in LOGLAN-82 has the form: + + do sequence of statements od + An iteration statement specifies repeated execution of the sequence +of statements and terminates with the execution of the simple +statement exit + +Example: +-------- + + s:=1; t:=1; i:=1; + do + i:=i+1; t:=t*x/i; + if abs(t) < 1.0E-10 then exit fi; + s:=s+t + od; + + If two iteration statements are nested, then double exit in the +inner one terminates both of them. + +Example: +-------- + + r,x:=0; + do + s,t:=1; i:=1; x:=x+0.2; + do + i:=i+1; t:=t*x/i; + if i > n then exit exit fi; (* termination of both loops *) + if t < 1 then exit fi; (* termination of the inner loop *) + s:=s+t + od + od + + In the example above simultaneous assignment statements are +illustrated (e.g. r,x:=0) and comments, which begin with a left +parenthesis immediately followed by an asterisk and end with an +asterisk immediately followed by a right parenthesis. + + Triple exit terminates three nested iteration statements, four exit +terminates four nested iteration statements etc. + + The iteration statement with while condition: w + + while boolean expression + do + sequence of statements + od + +is equivalent to: + + do + if not boolean expression then exit fi; + sequence of statements + od + + The iteration statements with controlled variables (for statements) +have the forms: + + for j:=wa1 step wa2 to wa3 + do + sequence of statements + od + +or + + for j:=wa1 step wa2 downto wa3 + do + sequence of statements + od + + The type of the controlled variable j must be discrete. The value of +this variable in the case of the for statement with to is increased, +and in the case of the for statement with downto is decreased. The +discrete range begins with the value of wa1 and changes with the step +equal to the value of wa2. The execution of the for statement with to +terminates when the value of j for the first time becomes greater than +the value of wa3 (with downto when the value of j for the first time +becomes less than the value of wa3). After the for statement +termination the value of its controlled variable is determined and +equal to the first value exceeding the specified discrete range. The +values of expressions wa1, wa2 and wa3 are evaluated once, upon entry +to the iteration statement. Default value of wa2 is equal 1 (when the +keyword step and expression wa2 are omitted). + for or while statements may be combined with exit statement. + +Example: +-------- + + for j:=1 to n + do + if x=A(j) then exit fi; + od + + The above iteration statement terminates either for the least j, +1<=j<=n, such that x=A(j) or for j=n+1 when x=/=A(j), j=1,...,n. + + To enhance the user's comfort, the simple statement repeat is +provided. It may appear in an iteration statement and causes the +current iteration to be finished and the next one to be continued +(something like jump to CONTINUE in Fortran's DO statements). + +Example: +-------- + + i:=0; s:=0; + do + i:=i+1; + if A(i) < 0 then repeat fi; (* jump to od, iterations are continued *) + if i > m then exit fi; (* iteration statement is terminated *) + s:=s+sqrt(A(i)); + od; + + Just as exit, repeat may appear in for statement or while statement. +Then the next iteration begins with either the evaluation of a new +value of the controlled variable (for statement) or with the +evaluation of the condition (while statement). + + Case statement in LOGLAN-82 has the form: + + case WA + when L1 : I1 + when L2 : I2 + ... + when Lk : Ik + otherwise I + esac + +where WA is an expression , L1,...,Lk are constants and I1,..., Ik,I +are sequences of statements. + A case statement selects for execution a sequence of statements Ij, +1<=j<=k, where the value of WA equals Lj. The choice otherwise covers +all values (possibly none) not given in the previous choices. The +execution of a case statement chooses one and only one alternative +(since the choices are to be exhaustive and mutually exclusive). + +2. Modularity +############# + + Modular structure of the language is gained due to the large set of +means for module nesting and extending. Program modules (units) are +blocks, procedures, functions, classes, coroutines and processes. +Block is the simplest kind of unit. Its syntax is the following: + + block + lists of declarations + begin + sequence of statements + end + + The sequence of statements commences with the keyword begin (it may +be omitted when this sequence is empty). The lists of declarations +define the syntactic entities (variables, constants, other units), +whose scope is that block. The syntactic entities are identified in +the sequence of statements by means of names (identifiers). + +Example: +-------- + + block + const n=250; + var x,y:real, i,j,k: integer, b: boolean; + const m=n+1; + begin + read(i,j); (* read two integers *) + x,y:=n/(i+j); (* simultaneous assignment *) + read(c) ; (* read a character *) + b:= c = 'a'; (* 'a' a character *) + for k:= 1 to m + do + write(x+y/k:10:4); (* print the value of x+y/k + in the field of 10 characters, 4 digits after the point *) + od + end + + In the lists of declarations semicolons terminate the whole lists, +not the lists elements. Any declaration list must begin with the +pertinent keyword (var for variables, const for constants etc.). The +value of an expression defining a constant must be determinable +statically (at compilation time). + Program in LOGLAN-82 may be a block or alternatively may be of the +following form: + + program name; + lists of declarations + begin + sequence of statements + end + +Then the whole program can be identified by that name (the source as +well as the object code). + + A block can appear in the sequence of statements (of any unit), thus +it is a statement. (Main block is assumed to appear as a statement of +the given job control language.) + For the execution of a block statement the object of block is +created in a computer memory, and then, the sequence of statements is +performed. The syntactic entities declared in the block are allocated +in its object. After a block's termination its object is automatically +deallocated (and the corresponding space may be immediately reused). + The modular structure of the language works "in full steam" when not +only blocks, but the other kinds of units are also used. They will be +described closer in the following points. + Unit nesting allows to build up hierarchies of units and supports +security of programming. It follows from the general visibility rules; +namely, a syntactic entity declared in an outer unit is visible in an +inner one (unless hidden by an inner declaration). On the other hand, +a syntactic entity declared in an inner unit is not visible from an +outer one. + +Example: +-------- + + program test; + var a,b,c:real, i,j,k:integer; + begin + read(a,b,c,i); + block + var j,k:real; + begin + j:=a; k:=j+b; write(" this is the inner block ",j,k) + end; + write(" this is the outer block ",i,a:20) + end; + + In this program, first the main block statement is executed (with +variables a,b,c,i,j,k). Next, after the read statement, the inner +block statement is executed (with variables j,k). In the inner block +the global variables j,k are hidden by the local ones. + + +3. Procedures and functions +########################### + + Procedures and functions are well-known kinds of units. Their syntax +is modelled on Pascal's, though with some slight modifications. +Procedure (function) declaration consists of a specification part and +a body. + + Example: + -------- + unit Euclid: function(i,j:integer):integer; + var k:integer; + begin + do + if j=0 then exit fi; + k:=i mod j; i:=j; j:=k + od; + result:=i + end; + + Procedure or function specification begins with its identifier +preceded by the keyword unit. (The same syntax concerns any other module +named unit.) Then follows its kind declaration, its formal parameters +(if any), and the type of the returned value (only for functions). A +body consists of declaration lists for local entities and a sequence +of statements. The keyword begin commences the sequence of statements +, and is omitted , if this sequence is empty. The value returned by a +function equals to the most recent value of the standard variable +"result", implicitly declared in any function. This variable can be +used as a local auxiliary variable as well. + + Example: + -------- + unit Newton: function(n,m:integer):integer; + var i:integer; + begin + if m > n then return fi; + result:=n; + for i:=2 to m do result:=result*(n-i+1) div i od + end Newton; + The optional identifier at the end of a unit must repeat the +identifier of a unit. It is suggested that the compilers check the +order of unit nesting, so these optional occurrences of identifiers +would facilitate program debugging. + All the local variables of a unit are initialized (real with 0.0, +integer with 0, boolean with false etc.). Thus , for instance, the +value of function Newton is 0 for m>n, since "result" is also +initialized, as any other local variable. + + The return statement (return) completes the execution of a procedure +(function) body,i.e. return is made to the caller. If return does not +appear explicitly, return is made with the execution of the final end +of a unit. Upon return to the caller the procedure (function) object +is deallocated. + Functions are invoked in expressions with the corresponding list of +actual parameters. Procedures are invoked by call statement (also with +the corresponding list of actual parameters). + + Example: + -------- + i:=i*Euclid(k,105)-Newton(n,m+1); + call P(x,y+3); + + Formal parameters are of four categories: variable parameters, +procedure parameters, function parameters and type parameters (cf +p.8). Variable parameters are considered local variables to the unit. +A variable parameter has one of three transmission modes: input, +output or inout. If no mode is explicitly given the input mode is +assumed. For instance in the unit declaration: + + unit P: procedure(x,y:real,b:boolean;output c:char,i:integer;inout j:integer); + +x,y,b are input parameters , c,i are output parameters , and j is +inout parameter. + + Input parameter acts as a local variable whose value is initialized +by the value of the corresponding actual parameter. Output parameter +acts as a local variable initialized in the standard manner (real with +0.0, integer with 0, boolean with false etc.). Upon return its value +is assigned to the corresponding actual parameter, in which case it +must be a variable. However the address of such an actual parameter is +determined upon entry to the body. Inout parameter acts as an input +parameter and output parameter together. + + Example: + -------- + unit squareeq: procedure(a,b,c:real;output xr,xi,yr,yi:real); + (* given a,b,c the procedure solves square equation : ax*x+bx+c=0. + xr,xi- real and imaginary part of the first root + yr,yi- real and imaginary part of the second root *) + var delta: real; + begin (*a=/=0*) + a:=2*a; c:=2*c; delta:=b*b-a*c; + if delta <= 0 + then + xr,yr:=-b/a; + if delta=0 then return fi; (*xi=yi=0 by default*) + delta:=sqrt(-delta); + xi:=delta/a; yi:=-xi; + return + fi; + delta:=sqrt(delta); + if b=0 + then + xr:=delta/a; yr:=-xr; + return + fi; + if b>0 then b:=b+delta else b:=b-delta fi; + xr:=-b/a; yr:=-c/b; + end squareeq; + + A procedure call to the above unit may be the following: + + call squareeq(3.75*H,b+7,3.14,g,gi,h,hi); +where g,h,gi,hi are real variables. + + + No restriction is imposed on the order of declarations. In +particular, recursive procedures and functions can be declared without +additional announcements (in contrast to Pascal). + + Example: + -------- + + For two recursive sequences defined as: + + a(n)=b(n-1)+n+2 n>0 + b(n)=a(n-1)+(n-1)*n n>0 + a(0)=b(0)=0 + +one can declare two functions: + + unit a: function(n:integer):integer; + begin + if n>0 then result:=b(n-1)+n+2 fi + end a; + unit b: function(n:integer):integer; + begin + if n>0 then result:=a(n-1)+(n-1)*n fi + end b; + +and invoke them: + + k:=a(100)*b(50)+a(15); + + Functions and procedures can be formal parameters as well. + + Example: + -------- + +unit Bisec: procedure(a,b,eps:real;output x:real;function f(x:real):real); +(*this procedures searches for zero of continous function f in segment (a,b) *) +var h:real,s:integer; +begin + s:=sign(f(a)); + if sign(f(b))=s then return fi; (* wrong segment *) + h:=b-a; + do + h:=h/2; x:=a+h; + if h < eps then return fi; + if sign(f(x))=s then a:=x else b:=x fi + od +end Bisec; + + In the above declaration, after the input variable parameters +a,b,eps and the output variable parameter x, a function parameter f +appears. Note that its specification part is complete. Thus the check +of actual-formal parameter compatibility is possible at compilation +time. Making use of this syntactic facility is not possible in +general, if a formal procedure (function) is again a formal parameter +of a formal procedure (function). The second degree of formal +procedures (functions) nesting is rather scarce, but LOGLAN-82 admits +such a construct. Then formal procedure (function) has no +specification part and the full check of actual-formal parameter +compatibility is left to be done at run time. + + Example: + -------- + + unit P: procedure(j:integer;procedure G(i:integer;procedure H)); + ... + begin + ... + call G(j,P); + end P; + + Procedure G is a first degree parameter, therefore it occurs with +complete specification part. Procedure H is a second degree parameter +and has no specification part. In this case a procedure call can be +strongly recursive: + + call P(i+10,P); + +4. Classes +########## + + Class is a facility which covers such programming constructs as +structured type, package, access type, data structure etc. To begin +with the presentation of this construct, let us consider a structured +type assembled from primitive ones: + + unit bill: class; + var dollars :real, + not_paid :boolean, + year,month,day :integer; + end bill; + + The above class declaration has the attributes : dollars (real), +not_paid (boolean), and year,month,day (integer). Wherever class bill +is visibile one can declare variables of type bill: + + var x,y,z:bill; + + The values of variables x, y, z can be the addresses of objects of +class bill. These variables are called reference variables. With +reference variable one can create and operate the objects of reference +variable type. + + An object of a class is created by the class generation statement +(new), and thereafter, its attributes are accessed through dot +notation. + + x:=new bill; (* a new object of class bill is created *) + x.dollars:=500.5; (* define amount *) + x.year:=1982; (* define year *) + x.month:=3; (* define month *) + x.day:=8; (* define day *) + y:=new bill; (* create a new object *) + y.not_paid:=true; (* bill not_paid *) + z:=y; (* variable z points the same object as variable y *) + + If an object of class bill has been created (new bill) and its +address has been assigned to variable x (x:=new bill), then the +attributes of that object are accessible through dot notation (remote +access). The expression x.dollars gives , for instance, the remote +access to attribute dollars of the object referenced by x. + All attributes of class objects are initialized as usual. For the +above example the object referenced by x, after the execution of the +specified sequence of statements, has the following structure: + + --------------- + | 500.5 | dollars + --------------- + | false | not_paid + --------------- + | 1982 | year + --------------- + | 3 | month + --------------- + | 8 | day + --------------- + + The object referenced by y and z has the following structure: + + --------------- + | 0 | dollars + --------------- + | true | not_paid + --------------- + | 0 | year + --------------- + | 0 | month + --------------- + | 0 | day + --------------- + + The value none is the default initial value of any reference +variable and denotes no object. A remote access to an attribute of +none raises a run time error. + Class may have also formal parameters (as procedures and functions). +Kinds and transmission modes of formal parameters are the same as in +the case of procedures. + + Example: + -------- + + unit node: class (a:integer); + var left,right:node; + end node; + + Let , for instance, variables z1, z2, z3 be of type node. Then the +sequence of statements: + + z1:=new node(5); + z2:=new node(3); + z3:=new node(7); + z1.left:=z2; z1.right:=z3; + + creates the structure: + + ----------- + z1----> | 5 | + ----------- + <---- | left | + | ----------- + | | right | -------> + | ----------- | + | | + ------------ ------------ +z2---->| 3 | | 7 | <----z3 + ------------ ------------ + | none | | none | + ------------ ------------ + | none | | none | + ------------ ------------ + + +where arrows denote the values of the reference variables. + + Class may also have a sequence of statements (as any other unit). +That sequence can initialize the attributes of the class objects. + + Example: + -------- + + unit complex:class(re,im:real); + var module:real; + begin + module:=sqrt(re*re+im*im) + end complex; + + Attribute module is evaluated for any object generation of class +complex: + + z1:=new complex(0,1); (* z1.module equals 1 *) + z2:=new complex(2,0); (* z2.module equals 2 *) + + For the execution of a class generator, first a class object is +created, then the input parameters are transmitted , and finally, the +sequence of statements (if any) is performed. Return is made with the +execution of return statement or the final end of a unit. Upon return +the output parameters are transmitted. + Procedure object is automatically deallocated when return is made to +the caller. Class object is not deallocated , its address can be +assigned to a reference variable, and its attributes can be thereafter +accessed via this variable. + + The classes presented so far had only variable attributes. In +general, class attributes may be also other syntactic entities, such +as constants, procedures, functions, classes etc. Classes with +procedure and function attributes provide a good facility to define +data structures. + + Example: + -------- + + A push_down memory of integers may be implemented in the following +way: + + unit push_down :class; + unit elem:class(value:integer,next:elem); + (* elem - stack element *) + end elem; + var top:elem; + unit pop: function :integer; + begin + if top=/= none + then + result:=top.value; top:=top.next + fi; + end pop; + unit push:procedure(x:integer); (* x - pushed integer *) + + begin + top:=new elem(x,top); + end push; + end push_down; + + Assume that somewhere in a program reference variables of type +push_down are declared (of course, in place where push_down is +visibile): + + var s,t,z:push_down; + + Three different push_down memories may be now generated: + + s:=new push_down(100); t:=new push_down(911); z:=new push_down(5); + + One can use these push_down memories as follows: + + call s.push(7); (* push 7 to s *) + call t.push(1); (* push 1 to t *) + i:=z.pop; (* pop an element from z *) + etc. + +5. Adjustable arrays +#################### + + In LOGLAN-82 arrays are adjustable at run time. They may be treated +as objects of specified standard type with index instead of identifier +selecting an attribute. An adjustable array should be declare +somewhere among the lists of declarations and then may be generated in +the sequence of statements. + + Example: + -------- + + block + var n,j:integer; + var A:arrayof integer; (* here is the declaration of A *) + begin + read(n); + new_array A dim (1:n); (* here is the generation of A *) + for i:=1 to n + do + read(A(i)); + od; + (* etc.*) + end + + A variable A is an array variable. Its value should be the reference +to an integer array, i.e. a composite object consisting of integer +components each one defined by an integer index. Array generation +statement: + + new_array A dim (1:n); + +allocates a one-dimensional integer array with the index bounds 1,n , +and assigns its address to variable A. The figure below illustrates +this situation: + + ---------- ----------- + | | | A(1) | + | | ----------- + | ... | | A(2) | + ---------- ----------- + | n | | | + ---------- ... + | j | | | + ---------- ----------- + | A | ---------> | A(n) | + ---------- ----------- + Block object Array object + + A general case of array generation statement has the form: + + new_array A dim (lower:upper) + +where lower and upper are arithmetic expressions which define the +range of the array index. + + Example: + -------- + + Two-dimensional array declaration : + + var A: arrayof arrayof integer; + +and generation: + + new_array A dim (1:n) + for i:=1 to n do new_array A(i) dim (1:m) od; + +create the structure: + + ---------- + | A(1,1) | + ---------- + | | + ... + | | + ------------ ---------- + | A(1) | ---------> | A(1,m) | + ------------ ---------- + | | + ... + | | + ------------ ---------- + | A(n) | ---------> | A(n,1) | + ------------ ---------- + | | + ... + | | + ---------- + | A(n,m) | + ---------- + + Example: + -------- + + block + var i,j:integer, A,B: arrayof arrayof real, n:integer; + begin + read(n); + new_array A dim (1:n); + for i:=1 to n do new_array A(i) dim (1:n) od; + (* A is square array *) + new_array B dim (1:n); + for i:=1 to n do new_array B(i) dim(1:i) od; + (* B is lower triangular array *) + A(n,n):=B(n,n); + B(1):=A(1); + B(1):=copy(A(1)); + end + + Array A is the square array n by n. Each element A(i) , 1<=i<=n +contains the address of row A(i,j), 1<=j<=n. Array B is the +lower-triangular array. Each element B(i), 1<=i<=n, contains the +address of row B(i,j), 1<=j<=i. Thus an assignment statement +A(n,n):=B(n,n) transmits real value B(n,n) to real variable A(n,n). +Assignment B(1):=A(1) transmits the address of the first row of A to +variable B(1). Finally assignment B(1):=copy (A(1)) creates a copy of +the first row of A and assigns its address to B(1). + + Upper and lower bounds of an adjustable array A are determined by +standard operators lower(A) and upper(A). + + Example: + -------- + + unit sort: procedure(A:arrayof integer); (* insertion sort *) + var n,i,j:integer; var x:integer; + begin + n:=upper(A); (* assume lower bound is 1 *) + for i:=2 to n + do + x:=A(i); j:=i-1; + do + if x >= A(j) then exit fi; + A(j+1):=A(j); j:=j-1; + if j=0 then exit fi; + od; + A(j+1):=x + od; + end sort; + + If an array variable A refers to no array its value is equal none +(the standard default value of any array variable). An attempt to +access an array element (e.g. A(i)) or a bound (e.g. lower(A)), where +A is none, raises a run time error. - 24 - + + +6. Coroutines and semicoroutines +################################ + + Coroutine is a generalization of class. A coroutine object is an +object such that the execution of its sequence of statements can be +suspended and reactivated in a programmed manner. Consider first a +simple class with a sequence of statements such that after return some +non-executed statements remain. The generation of its object +terminates with the execution of return statement, although the object +can be later reactivated. If such a class is declared as a coroutine, +then its objects may be reactivated. This can be realized by attach +statement: + + attach(X) + +where X is a reference variable designating the activating coroutine +object. + In general, since the moment of generation a coroutine object is +either active or suspended. Any reactivation of a suspended coroutine +object X (by attach(X)) causes the active coroutine object to be +suspended and continues the execution of X from the statement +following the last executed one. + Main program is also a coroutine. It is accessed through the +standard variable main and may be reactivated (if suspended) by the +statement attach(main). + + Example: + -------- + + In the example below the cooperation of two coroutines is presented. +One reads the real values from an input device, another prints these +values in columns on a line-printer, n numbers in a line. The input +stream ends with 0. + +program prodcons; + var prod:producer,cons:consumer,n:integer,mag:real,last:bool; + unit producer: coroutine; + begin + return; + do + read(mag); (* mag- nonlocal variable, common store *) + if mag=0 + then (* end of data *) + last:=true; + exit + fi; + attach(cons); + od; + attach(cons) + end producer; + + unit consumer: coroutine(n:integer); + var Buf:arrayof real; + var i,j:integer; + begin + new_array Buf dim(1:n); + return; + do + for i:=1 to n + do + Buf(i):=mag; + attach(prod); + if last then exit exit fi; + od; + for i:=1 to n + do (* print Buf *) + write(' ',Buf(i):10:2) + od; + writeln; + od; + (* print the rest of Buf *) + for j:=1 to i do write(' ',Buf(j):10:2) od; + writeln; + attach(main); + end consumer; + + begin + prod:=new producer; + read(n); + cons:=new consumer(n); + attach(prod); + writeln; + end prodcons; + + The above task could be programmed without coroutines at all. The +presented solution is, however, strictly modular, i.e. one unit +realizes the input process, another realizes the output process, and +both are ready to cooperate with each other. + + LOGLAN-82 provides also a facility for the semi-coroutine +operations. This is gained by the simple statement detach. If X is the +active coroutine object, then detach reactivates that coroutine object +at where the last attach(X) was executed. This statement meets the +need for the asymetric coroutine cooperations. (by so it is called +semi-coroutine operation). Operation attach requires a reactivated +coroutine to be defined explicitly by the user as an actual parameter. +Operation detach corresponds in some manner to return in procedures. +It gives the control back to a coroutine object where the last +attach(X) was executed, and that coroutine object need not be known +explicitly in X. This mechanism is, however, not so secure as the +normal control transfers during procedure calls and returns. + + In fact, the user is able to loop two coroutines traces by : + + attach(Y) in X + attach(X) in Y + + +Then detach in X reactivates Y, detach in Y reactivates X. + + In the example below the application of detach statement is +illustrated. + + Example: + -------- + + program reader_writers; + (* In this example a single input stream consisting of blocks of + numbers, each ending with 0, is printed on two printers of + different width. The choice of the printer is determined by the + block header which indicates the desired number of print + columns. The input stream ends with a double 0. m1 - the width + of printer_1, m2 - the width of printer_2 *) + const m1=10,m2=20; + var reader:reading,printer_1,printer_2:writing; + var n:integer,new_sequence:boolean,mag:real; + + unit writing:coroutine(n:integer); + var Buf: arrayof real, i,j:integer; + begin + new_array Buf dim (1:n); (* array generation *) + return; (* return terminates coroutine initialization *) + do + attach(reader); (* reactivates coroutine reader *) + if new_sequence + then (* a new sequence causes buffer Buf to be cleared up *) + for j:=1 to i do write(' ',Buf(j):10:2) od; writeln; + i:=0; new_sequence:=false; attach(main) + else + i:=i+1; Buf(i):=mag; + if i=n + then + for j:=1 to n do write(' ',Buf(j):10:2) od; writeln; + i:=0; + fi + fi + od + end writing; + + unit reading: coroutine; + begin + return; + do + read(mag); + if mag=0 then new_sequence:=true; fi; + detach; (* detach returns control to printer_1 or + od + end reading; + + + begin + reader:=new reading; + printer_1:=new writing(m1); printer_2:=new writing(m2); + do + read(n); + case n + when 0: exit + when m1: attach(printer_1) + when m2: attach(printer_2) + otherwise write(" wrong data"); exit + esac + od + end; + + Coroutines play the substantial role in process simulation. Class +Simulation provided in Simula-67 makes use of coroutines at most +degree. LOGLAN-82 provides for easy simulation as well. The LOGLAN-82 +class Simulation is implemented on a heap what gives lg(n) time cost +(in contrast with O(n) cost of the original implementation). It covers +also various simulation problems of large size and degree of +complexity. + + +7. Prefixing +############ + + Classes and prefixing are ingenius inventions of Simula-67 (cf [1]). +Unfortunately they are hardly ever known and, perhaps, by this have +not been introduced into any other programming language. Moreover, +implementation constraints of Simula-67 bind prefixing and classes +workableness to such a degree that both facilities cannot be used in +all respects. We hope that LOGLAN-82, adopting merits and rooting up +deficiencies of these constructs, will smooth their variations and +vivify theirs usefulness. + What is prefixing ? First of all it is a method for unit extending. +Consider the simplest example: + + unit bill: class; + var dollars :real, + not_paid :boolean, + year,month,day :integer; + end bill; + +Assume the user desires to extend this class with new attributes. +Instead of writing a completely new class, he may enlarge the existing +one: + + unit gas_bill:bill class; + var cube_meters: real; + end gas_bill; + + Class gas_bill is prefixed by class bill. This new declaration may +appear anywhere within the scope of declaration of class bill. (In +Simula-67 such a prefixing is forbidden in nested units.) Class +gas_bill has all the attributes of class bill and additionally its own +attributes (in this case the only one: cube_meters). The generation +statement of this class has the form: + + z:=new gas_bill; +where z is a reference variable of type gas_bill. Remote access to the +attributes of prefixed class is standard: + + z.dollars:=500.5; z.year:=1982; z.month:=3; z.day:=8; + z.cube_meters:=100000; + + Consider now the example of a class with parameters. + + Assume that in a program a class: + + unit id_card: class(name:string,age:integer); + end id_card; + +and its extension: + + unit idf_card:id card class(first name:string); + end idf_card; + + + +are declared. + + + Then for variable z of type id_card and variable t of type idf_card +the corresponding generation statement may be the following: + + z:=new id_card("kreczmar",37); + t:=new idf_card("Kreczmar",37,"Qntoni"); + +Thus the formal parameters of a class are concatenated with the formal +parameters of its prefix. + One can still extend class idf_card. For instance: + + unit idr_card:idf_card class; + var children_number:integer; + var birth_place:string; + end idr_card; + + Prefixing allows to build up hierarchies of classes. Each one +hierarchy has a tree structure. A root of such a tree is a class +without prefix. One class is a successor of another class iff the +first is prefixed by the latter one. + + Consider the prefix structure: + + A + . . . + . . . + . . . + B. .C .D + . + . + .E + . + . + .F + . . + . . + G. .H + + Class H has a prefix sequence A, B, E, F, H. Let a, b, ... , h +denote the corresponding unique attributes of classes A, B, ... , H, +respectively. The objects of these classes have the following forms: + + ------------ ------------ ------------ ------------ + | a | | a | | a | | a | + ------------ ------------ ------------ ------------ + object A | b | | c | | d | + ------------ ------------ ------------ + object B object C object D + + + + ------------ ------------ ------------ ------------ + | a | | a | | a | | a | + ------------ ------------ ------------ ------------ + | b | | b | | b | | b | + ------------ ------------ ------------ ------------ + | e | | e | | e | | e | + ------------ ------------ ------------ ------------ + object E | f | | f | | f | + ------------ ------------ ------------ + object F | g | | h | + ------------ ------------ + object G object H + + Let Ra, Rb,..., Rh denote reference variables of types A, B,..., H, +respectively. Then the following expressions are correct: + + Ra.a, Rb.b, Rb.a, Rg.g, Rg.f, Rh.h, Rh.f, Rh.e, Rh.b, Rh.a etc. + + Variable Ra may designate the object of class B (or C,..., H), i.e. +the statement: + + Ra:=new B + +is legal. But then attribute b is not accessible through dot via Ra, +i.e. Ra.b is incorrect. This follows from insecurity of such a remote +access. In fact, variable Ra may point any object of a class prefixed +by A, in particular, Ra may point the object of A itself, which has no +attribute b. If Ra.b had been correct, a compiler should have +distiguish the cases Ra points to the object of A or not. But this, of +course, is undistinguishable at compilation time. + To allow, however, the user's access to attribute b (after instruc tion Ra:= n + + Ra qua B + + The correctness of this expression is checked at run time. If Ra +designates an object of B or prefixed ba B, the type of the expression +is B. Otherwise the expression is erroneous. Thus, for instance, the +expressions: + + Ra qua G.b, Ra qua G.e etc. +enable remote access to the attributes b, c, ... via Ra. + + So far the question of attribute concatenation was merely discussed. +However the sequences of statements can be also concatenated. + Consider class B prefixed with class A. In the sequence of +statements of class A the keyword inner may occur anywhere, but only +once. The sequence of statements of class B consists of the sequence +of statements of class A with inner replaced by the sequence of +statements of class B. + + unit A :class unit B:A class + ... ... + begin begin + ... |---... + | + | + ... |---... + end A; end B; + + + In this case inner in class B is equivalent to the empty statement. +If class B prefixes another class, say C, then inner in B is replaced +by the sequence of statements of class C, and so on. + If inner does not occur explicitly, an implicit occurrence of inner +before the final end of a class is assumed. + + Example + ------- + + Let class complex be declared as usual: + + unit complex: class(re,im:real); + end complex; + +and assume one desires to declare a class mcomplex with the additional +attribute module. In order the generation of class mcomplex define the +value of attribute module, one can declare a class: + + unit mcomplex:complex class; + var module:real; + begin + module:=sqrt(re*re+im*im) + end mcomplex; + + Class mcomplex may be still extended: + + unit pcomplex:mcomplex class; + var alfa:real; + begin + alfa:=arccos(re/module) + end pcomplex; + + For these declarations each generation of class mcomplex defines the +value of attribute module, each generation of class pcomplex defines +the values of attributes module and alfa. + For reference variables z1, z2 z3 of type complex, the following +sequence of statements illustrates the presented constructs: + + z1:=new complex(0,1); + z2:=new mcomplex(4,7); + z3:=new pcomplex(-10,12); + if z2 qua mcomplex.module > 1 + then + z1:=z2; + fi; + if z3 qua pcomplex.alfa < 3.14 + then + z3.re:=-z3.re; z3.alfa:=z3.alfa+3.14; + fi; + z1 qua mcomplex.module:= 0; + z1.re,z1.im:=0; + + + Example: + -------- + Binary search tree (Bst) is a binary tree where for each node x the +nodes in the left subtree are less than x, the nodes in the right +subtree are greater than x. It is the well-known exercise to program +the algorithms for the following operations on Bst: + member(x) = true iff x belongs to Bst + insert(x), enlarge Bst with x, if x does not yet belong to Bst + + We define both these operations in a class: + + unit Bst: class; + unit node: class(value:integer); (* tree node *) + var left,right:node; + end node; + var root:node; + unit help: class(x:integer); (* auxiliary class *) + var p,q:node; + begin + q:=root; + while q=/= none + do + if x < q.value + then + p:=q; q:=q.left; + repeat (* jump to the beginning of a loop *) + fi; + if q.value < x + then + p:=q; q:=q.right; repeat + fi; + exit + od; + inner (* virtual instruction to be + end help; + unit member:help function:boolean; + (* x is a formal parameter derived from the prefix help *) + begin + result:=q=/=none + end member; + unit insert:help procedure; + (* x is a formal parameter derived from the prefix help *) + begin + if q=/=none then return fi; + q:=new node(x); + if p=none then root:=q; return fi; + if p.value < x then p.right:=q else p.left:=q fi; + end insert; + begin + inner; + end Bst; + + In the example the common actions of member and insert are +programmed in class help. Then it suffices to use class help as a +prefix of function member and procedure insert, instead of redundant +occurrences of the corresponding sequence of statements in both units. + + + Class Bst may be applied as follows: + + var X,Y:Bst; + begin + X:=new Bst; Y:=new Bst; + call X.insert(5); + if Y.member(-17) then .... + end + + As shown in the declaration of Bst, class may prefix not only other +classes but also procedures and functions. Class may prefix blocks as +well. + + Example: + -------- + Let class push_down (p. 5) prefix a block: + + pref push_down(1000) block + var ... + begin + ... + call push(50); ... + i:=pop; + ... + end + + In the above block prefixed with class push_down one can use pop and +push as local attributes. (They are local since the block is embedded +in the prefix push down.) + + Example: + -------- + pref push down(1000) block + begin + ... + pref Bst block + begin + (* in this block both structures push down and Bst are visible *) + call push(50); + call insert(13); + if member(10) then ... + i:=pop; + ... + end + end + + In place where classes push_down and Bst are visible together a +block prefixed with Bst may be nested in a block prefixed with +push_down (or vice versa). In the inner block both data structures are +directly accessible. Note that this construct is illegal in Simula 67. + + +8. Formal types +############### + + Formal types serve for unit parametrization with respect to any +non-primitive type. + + Example: + -------- + + unit Gsort:procedure(type T; A:arrayof T; function less(x,y:T):boolean); + var n,i,j:integer; var x:T; + begin + n:=upper(A); + for i:=2 to n + do + x:=A(i); j:=i-1; + do + if less(A(j),x) then exit fi; exit fi + A(j+1):=A(j); j:=j-1; + if j=0 then exit fi; + od; + A(j+1):=x; + od + end Gsort; + + Procedure Gsort (the generalization of procedure sort from p.4) has +type parameter T. A corresponding actual parameter may be an arbitrary +non-primitive type. An actual parameter corresponding to A should be +an array of elements of the actual type T. Function less should define +the linear ordering on the domain T. + For instance, the array A of type bill (cf p.7) may be sorted with +respect to attribute dollars , if the function: + + unit less: function(t,u:bill):boolean; + begin + result:=t.dollars <= u.dollars + end less; + +is used as an actual parameter: + + call Gsort(bill,A,less); + + If the user desires to sort A with respect to date, it is sufficient +to declare : + + unit earlier:function(t,u:bill):boolean; + begin + if t.year < u.year then result:= true; return fi; + if t.year=u.year + then + if t.month < u.month then result:=true; return fi; + if t.month=u.month then result:=t.day<=u.day fi + fi; + end earlier; + +and to call: call Gsort(bill,A,earlier); + + +9. Protection techniques +######################## + + Protection techniques ease secure programming. If a program is +large, uses some system classes, is designed by a team etc., this is +important (and non-trivial) to impose some restrictions on access to +non-local attributes. + Let us consider a data structure declared as a class. Some of its +attributes should be accessible for the class users , the others +should not. For instance, in class Bst (p.7) the attributes member and +insert are to be accessible. On the other hand the attributes root, +node and help should not be accessible, even for a meddlesome user. An +improper use of them may jeopardize the data structure invariants. + To forbid the access to some class attributes the three following +protection mechanisms are provided: + + close, hidden, and taken. + + The protection close defined in a class forbids remote access to the +specified attributes. For example, consider the class declaration: + + unit A: class; + close x,y,z; + var x: integer, y,z:real; + .... + end + + Remote access to the attributes x,y,z from outside of A is +forbidden. + + The protection hidden (with akin syntax) does not allow to use the +specified attributes form outside of A neither by the remote access +nor in the units prefixed by A. The only way to use a hidden attribute +is to use it within the body of class A. + Protection taken defines these attributes derived from prefix, which +the user wishes to use in the prefixed unit. Consider a unit B +prefixed by a class A. In unit B one may specify the attributes of A +which are used in B. This protects the user against an unconscious use +of an attribute of class A in unit B (because of identifier conflict). +When taken list does not occur , then by default, all non-hidden +attributes of class A are accessible in unit B. + + +10. Programmed deallocation +########################### + + The classical methods implemented to deallocate class objects are +based on reference counters or garbage collection. Sometimes the both +methods may be combined. A reference counter is a system attribute +holding the number of references pointing to the given object. Hence +any change of the value of a reference variable X is followed by a +corresponding increase or decrease of the value of its reference +counter. When the reference counter becomes equals 0, the object can +be deallocated. + The deallocation of class objects may also occur during the process +of garbage collection. During this process all unreferenced objects +are found and removed (while memory may be compactified). In order to +keep the garbage collector able to collect all the garbage, the user +should clear all reference variables , i.e. set to None, whenever +possible. This system has many disadvantages. First of all, the +programmer is forced to clear all reference variables, even those +which are of auxiliary character. Moreover, garbage collector is a +very expensive mechanism and thus it can be used only in emergency +cases. + In LOGLAN a dual operation to the object generator, the so-called +object deallocator is provided. Its syntactic form is as follows: + + kill(X) + +where X is a reference expression. If the value of X points to no +object (none) then kill(X) is equivalent to an empty statement. If the +value of X points to an object O, then after the execution of kill(X), +the object O is deallocated. Moreover all reference variables which +pointed to O are set to none. This deallocator provides full security, +i.e. the attempt to access the deallocated object O is checked and +results in a run-time error. + For example: + + Y:=X; kill(X); Y.W:=Z; + +causes the same run-time error as: + + X:=none; X.W:=Z; + + The system of storage management is arranged in such a way that the +frames of killed objects may be immediately reused without the +necessity of calling the garbage collector, i.e. the relocation is +performed automatically. There is nothing for it but to remember not +to use remote access to a killed object. (Note that the same problem +appears when remote access X.W is used and X=none). + + Example: + -------- + + Below a practical example of the programmed deallocation is +presented. Consider class Bst (p.7). Let us define a procedure that +deallocates the whole tree and is called with the termination of the +class Bst. + + unit Bst:class; + (* standard declarations list of Bst *) + unit kill_all:procedure(p:node); + (* procedure kill_all deallocates a tree with root p *) + begin + if p= none then return fi; + call kill_all(p.left); + call kill_all(p.right); + kill(p) + end kill_all; + begin + inner; + call kill_all(root) + end Bst; + + Bst may be applied as a prefix: + + pref Bst block + ... + end + +and automatically will cause the deallocation of the whole tree after +return to call kill_all(root) from the prefixed block. + + To use properly this structure by remote accessing one must call +kill_all by himself: + + unit var X,Y:Bst; + ... + begin + X:=new Bst; Y:=new Bst; + ... + (* after the structures' application *) + call X.kill_all(X.root); + kill(X); + call Y.kill_all(Y.root); + kill(Y); + ... + end + + Finally note that deallocator kill enables deallocation of array +objects, and suspended coroutines and processes as well (cf p.13). + + +11. Exception handling +####################### + + Exceptions are events that cause interruption of normal program +execution. One kind of exceptions are those which are raised as a +result of some run time errors. For instance, when an attempt is made +to access a killed object, when the result of numeric operation does +not lie within the range, when the dynamic storage allocated to a +program is exceeded etc. + Another kind of exceptions are those which are raised explicitly by +a user (with the execution of the raise statement). + The response to exceptions (one or more) is defined by an exception +handler. A handler may appear at the end of declarations of any unit. +The corresponding actions are defined as sequences of statements +preceded by keyword when and an exception identifier. + + Example: + -------- + + In procedure squareeq (p.3) we wish to include the case when a=0. It +may be treated as an exception (division by zero). + + unit squareeq(a,b,c:real;output xr,xi,yr,yi:real); + var delta:real; + handlers + when division_by_zero: + if b =/= 0 + then + xi,yr,yi:=0; xr:=-c/b; terminate + else + raise Wrong_data(" no roots") + fi; + end + begin + ... + end squareeq; + + The handler declared in that procedure handles the only one +exception (division_by_zero). + When an exception is raised, the corresponding handler is searched +for, starting from the active object and going through return traces. +If there is no object containing the declaration of the handler, then +the program (or the corresponding process) is terminated. Otherwise +the control is transferred to the first found handler. + + + + In our example the handler is declared within the unit itself, so +control is passed to a sequence: + + if b=/=0 + ... + + Therefore, when b=/=0, the unique root of square equation will be +determined and the procedure will be normally terminated (terminate). + In general, terminate causes that all the objects are terminated, +starting from that one where the exception was raised and ending on +that one where the handler was found. Then the computation is +continued in a normal way. + In our example, when b=0, a new exception is raised by the user. For +this kind of exceptions , the exception itself should be declared +(because it is not predefined as a run time error). Its declaration +may have parameters which are transmitted to a handler. The exception +declaration need not be visible by the exception handler. However the +way the handler is searched for does not differ from the standard one. + Consider an example: + + block + signal Wrong_data(t:string); + unit squareeq: + ... + end squareeq; + ... + begin + ... + end + + Exception Wrong_data may be raised wherever its declaration (signal +Wrong_data) is visible. When its handler is found the specified +sequence of actions is performed. In the example above different +handlers may be defined in inner units to the main block where +squereeq is called. + The case a=0 could be included , of course, in a normal way, i.e. by +a corresponding conditional statement occurring in the procedure body. +But the case a=0 was assumed to be exceptional (happens scarcely). +Thus the evaluation of condition a=0 would be mostly unnecessary. As +can be noticed thanks to exceptions the above problem can be solved +with the minimal waste of run time. + + + +12. Separate compilation (this section does not apply to PC version) +######################## + + + +13. Processes +############# + + The implementation of processes is different (May 1988) c.f. user's manual. + + Process in LOGLAN-82 is a natural generalization of coroutine (cf +p.6). Coroutines are units which once generated may operate +independently, each one treated as a separate process. For coroutines, +however, an essential assumption is established; namely, when one +coroutine object is reactivated, the active one must be suspended +(i.e. there which is onle one control is switched between coroutine +objects). When processes are used, the activation of a new process +does not require the active one to be suspended. So many objects may +be simultaneously active. + The statement that reactivates a suspended process X (without +suspention of the active one) has the form: + + resume(X) + + The main problem of parallel programming is, of course, +synchronization. Elementary synchronization in LOGLAN-82 is achieved +by two-valued semaphores and some number of simple statements +operating on them. + A semaphore variable controls the entry to a critical region, i.e. a +sequence of statements that may be executed by the one process only. +When a semaphore is open, the corresponding critical region is free. +When a semaphore is closed, it means the corresponding critical region +is just executed by a certain process. + + These are the simple indivisible statements that operate on +semaphores: + + lock(S) - If semaphore S is open, the given process enters + the critical region guarded by S , and + simultaneously, semaphore S becomes closed. If + semaphore S is already closed, the given process + waits until the critical region is open (by another + process). + unlock(S)- If semaphore S is closed, then it becomes open. + Otherwise the statement is empty. + stop(S) - The statement causes semaphore S to be open, and + simultaneously, it stops the given process + execution. The statement may be used without a + parameter, and then, it stops the given process + execution. + Moreover, only those three above statements may change the values of +semaphore variables. + In general, several processes may wait for an entry to the same +critical region. When the process executing this critical region opens +the semaphore (by unlock or stop), one of the waiting processes is +reactivated and enters the region. The way such a process is selected +is not defined by the language. The user must assume that this +selection is performed arbitrarily. + + + + Example: + -------- + + In the example an input stream of real numbers is copied. The +copying process is parallelized in such a way that when process get +reads the next number, the process put writes simultaneously the +number read in the preceding step. The input stream ends with 0. + + block + var in_buf,out_buf:real, completed:boolean, sem:semaphore; + var counter:integer,get:get_type,put:put_type; + unit cobegin:procedure; (* called by the main program *) + begin + lock(sem); (* critical region *) + resume(get); (* activate reading *) + resume(put); (* activate writing *) + stop(sem); (* exit from critical region *) + end cobegin; + unit coend: procedure; + begin (* called by get and put *) + lock(sem); (* entry to critical region *) + if counter=0 + then (* one process entered *) + counter:=1 + else (* two processes entered *) + counter:=0; + resume(main) (* reactivate main program *) + fi; + stop(sem) (* exit from critical region *) + end coend; + + unit get_type:process; + begin + return; + do + read(in_buf); + if in_buf=0 + then (* end of data *) + completed:=true + fi; + call coend + od + end get_type; + + unit put_type:process; + begin + return; + do + write(out_buf); + call coend; + od + end put_type; + + begin (* main process *) + read(in_buf); + get:=new get_type; + put:=new put_type; + do + out_buf:=in_buf; + call cobegin; + if completed then exit fi; + od; + kill(get); + kill(put); + end; + + Two procedures cobegin and coend synchronize the execution of the +main loop. Procedure cobegin implements fork operator, procedure coend +called from processes put and get implements the end of fork operator. +Variable count defines the number of processes that called procedure +coend. By an easy modification one can generalize these procedures in +order to implement the general k-fork and end of k-fork operators (if +count can assume the values 0,1,...,k-1). + + Finally, let us present an example of a class that realizes Hoare's +monitors (cf. [2]). Monitor is a structure that synchronizes the +access to a common pool of data. The number and kinds of these data +are defined by the user. Monitor task is only to give non-conflict +access to it. The access to a monitor is realized by the so-called +entry procedures. Entry procedure has a prefix entry which guarantees +that only one such a procedure may enter the monitor. + In order to allow scheduling of processes that entered the monitor, +two specialized procedures operating on the inner monitor queues are +provided. + + delay(Q) - stops the execution of the process and puts it + into a queue Q, the entry to the monitor is free, + continue(Q) - resumes the execution of the first process from a + queue Q (if Q is non-empty, otherwise the entry to + the monitor is free). + + As can be easily seen, the correct use of these constructs is +achieved when continue is called as the last statement of an entry +procedure. + + The declaration of the class Monitor is as follows: + + +unit Monitor : queue class; + hidden sem,queue; (* hidden protects attributes sem and queue *) + var sem:semaphore; (* sem is the semaphore guarding the monitor entry *) + + unit entry: class; (* all entry procedures must have prefix entry + which realized non-conflict access to Monitor *) + var busy:boolean; (* busy is true iff continue(Q) was executed + hidden busy; + unit delay: procedure(Q:queue); + begin + call Q.into(this process); + (* put the active process into queue Q *) + stop(sem) + (* free the monitor access, halt the active process *) + end delay; + unit continue:procedure(Q:queue); + (* continue can be called as the last statement of an entry procedure *) + begin + if not Q.empty + then + busy:=true + resume(Q.out); (* resume the next process from queue Q *) + fi; + end continue; + begin (* beginning of the prefix entry *) + lock(sem); (* entry to the critical region *) + inner; (* the virtual body of an entry procedure *) + if not busy + then + unlock(sem) (* free the monitor access, unless continue + fi; + end entry; +end Monitor; + + + The mail-box structure which receives and sends the items of type T +may be implemented as the following class prefixed by Monitor: + + unit Buffering:Monitor class(type T;size:integer); + var Pool:arrayof T,count,in_index,out_index:integer; + var readers_queue,writers_queue:queue; + unit writer:entry procedure(r:T); + begin + if count=size then call delay(writers_queue) fi; in_index + Pool(in_index):=r; call continue(readers_queue); + end writer; + unit reader:entry procedure(output r:T); + begin + if count=0 then call delay(readers_queue) fi; + out_index:=out_index mod size +1; count:=count-1; + r:=Pool(out_index); call continue(writers_queue); + end reader; + begin + new_array Pool dim (1:size); + readers_queue:=new queue; writers_queue:=new queue; + end Buffering; + + +References. +########### + + [1] Dahl O-J.,Myhrhaug B,Nygaard K.: Common Base Language . NCC +S-22, October 1970 + [2] Hoare C.A.R.: Monitors, an operating system structuring concept. +CACM,vol.17,N.10,October 1974,pp.549-57 + [3] LOGLAN-82 Report , Warsaw, 1982 + \ No newline at end of file diff --git a/utils/lotek/lotek.exe b/utils/lotek/lotek.exe new file mode 100644 index 0000000000000000000000000000000000000000..74c2c27223c85db6095450e03efa90d73b484c47 GIT binary patch literal 4048 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 T?9=Lm(i55X@5KN4D+&JwnC|DJ literal 0 HcmV?d00001 diff --git a/utils/lotek/lotek.hlp b/utils/lotek/lotek.hlp new file mode 100644 index 0000000..c192d95 --- /dev/null +++ b/utils/lotek/lotek.hlp @@ -0,0 +1,561 @@ +(* Loglanizator Tekstowy wersja 1.0 1990 Warszawa Michal Pakier *) +===============REKORD 1=======================================|=============== ++ 22 2 + Using the editor LOTEK version 1.0 + + ³F2..............Save File +Scrolling text ³ cursor moves ³F3........File operations + by line: ³ one word ³F4..Errors of compilation +^U.............up ³ relatively to ³F8.....Auxiliary programs +^D...........down ³ the line above ³F9......Compilation & run + by page: ³^N........to right³F10...........Menu on/off +PgDn.........down ³^P.........to left³F5................Windows +PgUp...........up ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ- + Jump to ³^K.......block operations³^Y.....delete line +^PgDn.....begin of³^Q.......replace & search³ + text ³^J..........Jumps in text³ delete character +^PgUp.......end of³^W....Windows operations ³BackSpace..to left + text ³^V.........Macrocommands ³Del.......to right +^Home.....begin ofÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ- + window ³^A...............delete to the begin of line +^End.......end of ³^S.................delete to the end of line + window ³F1........On line HELP;press when in trouble +ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ- + + Help on HELP press <0> +===============REKORD 2=======================================|=============== ++ 11 + HELP on HELP. + + In any moment you can press the key F1 and obtain an infor- +mation on currently available actions. It may suggest further +request of more detailed informations. In such a case press one +of keys {0,1,2,3,4,5,6,7,8,9}, which is shown on screen in the +angles e.g.<2>. + + + Esc leaving Help + F1 principal information of Help +===============REKORD 3=======================================|=============== ++ 8 4 + Saving file on disk (F2,F3S) + +It may happen that for some reason we cannot write file back to +the directory from which it is read. In such a case press (F3L) +and choose the directory in which we have all rights next you +can write file using F3 W. + + More on file operations, press <0> +===============REKORD 4=======================================|=============== ++ 15 23 3 24 25 26 41 + File operations (F3) + +permit to load, write file or to begin a new file to edit + +Your choices: + + L Loading a file from disk <0> + S Saving file on disk <1> + N New file edition <2> + W Write a file on disk <3> + P Pick one of the lastly used files <4> + O different Options <5> + G Information on the edited files and on + free memory + Q Quit the LOTEK environment +===============REKORD 5=======================================|=============== ++ 16 + Correction of ERRORS + +This option facilitates correction of errors in Loglan program. +In the lowest line you see number of line with error and short +description of the error. The cursor is placed on the error's +occurrence. In certain cases it locates precisely the line and +the column of error, if it is not the case then only line is +shown and its first column. If you have menu bar (F10) then a +submenu concerning errors' scrolling appears. +You have the following choices: + Ctrl F5 - Move to the first error + Ctrl F6 - Move to the last error + Ctrl F8 - Show Next error + Ctrl F7 _ Show previous error + Ctrl F10 - Exit from the mode errors' corrrection +Press F4 for exit from errors' correction. +===============REKORD 6=======================================|=============== ++ 8 + CHANGING WINDOW + + You can open a new window or change the active one. + F Full screen all other windows are closed + H Help on Loglan here you can consult doc on Loglan + use Tab to move between documents + A Auxiliary window + M Main window +===============REKORD 7=======================================|=============== ++ 17 22 + AUXILIARY PROGRAMS + +You can execute programs which appear in this window without +exiting LOTEK. This window may be defined by you (see lotek.pth +and LOTEKINS.EXE). It enables, among others, certain operations +on the file being edited, the name of the file is transmitted +as parameter to the called program. As one of options you can +put the LOTEKINS program which can facilitate modifications of +the window. You can put a call of a program in this window in- +to a macrocommand <0>. +(Example: If we have a computer with two monitors and if you +put instructions C COLOR (mode co80) and M MONO (mode mono) +then macrocommand @8M@5H@5F will allow to consult do- +cumentation on the monitor controlled by Hercules card and +macro @8C@5M@5F will permit editing on a colour monitor, +still having database on Loglan on white & black monitor.) + +===============REKORD 8=======================================|=============== ++ 11 36 + COMPILING YOUR PROGRAM + +Your choices are: + L: Pass 1 Compilation-first phase(program Loglan). During + this pass all syntax errors are detected.(Use F4) + G: Pass 2 Second or First and second phase of compilation + (program Gen). + R: Run Program execution (with compilation if needed). + D: Debuger First the program is executed and then you can + watch command after command its execution. + O: Options Different options of compilation <0> +===============REKORD 9=======================================|=============== ++ 17 27 28 29 30 31 32 33 34 35 + OPERATIONS ON BLOCKS + +Press Ctrl_K and then a key which corresponds to the desired +action. If you do not know what to choose wait 2 secs. and +a frame will appear with all options. + +Your choices are: + + K,B,T,L - marking a block <0> + Y - deleting the marked block <1> + C,V - copying and moving the block <2> + S,M - copying and moving with indentation <3> + R,W - block to and from the disk <4> + U,I - shifting the block <5> + H - hiding the block <6> + F - framing a block (e.g. a comment) <7> + O - options <8> +===============REKORD 10=======================================|=============== ++ 13 37 38 39 40 + GO TO INDICATED PLACE IN TEXT + +Press Ctrl_J and then a key which corresponds to the desired +action. If you do not know what to choose wait 2 secs. and +a frame will appear with all options. + +Your choices are: + + S - mark this place for return <0> + R - return to the marked place <1> + J - jump to the marked place <2> + L - jump to the given line + B,K - jump to the begin (resp. to the end) of block <3> +===============REKORD 11=======================================|=============== ++ 17 15 16 17 18 19 20 + Search and replace operations + +Press Ctrl_Q and then a key which corresponds to the desired +action. If you do not know what to press wait 2 secs. and +a frame with options will appear. + +Your choices: + + F - find a word <0> + A - Alter find a word and replace <1> + C - replace character <2> + K - replace key words <3> + T - find another occurrence of the current word <4> + R - find and replace word currently pointed by cursor <5> + +REMARK: Pressing Ctrl L you can repeat the lastly executed + action of searching/replacing. +===============REKORD 12=======================================|=============== ++ 13 14 + Documentation on Loglan - Loglan's database + + Each line on the screen is a title of a section. + Press ENTER to see the highlighted section. + + Press Tab (& cursor left, right) to change (choose) a document + or a chapter. + cursor up - prevoius section, + cursor down - next section, + Ctrl PgUp - to the begin of list of sections, + Ctrl PgDn - to the end of list of sections, + PgUp,PgDn - previous (next) page of list of sections, + Ctrl_Q_F - searching a word. +===============REKORD 13=======================================|=============== ++ 11 12 14 + Loglan's database - in a section + + Enter - return yo the list of sections <0> + Tab - change(choose) a document, a chapter <1> + Up,Down,Left,Right - moving the cursor + Home,End - to the begin (end) of line + Ctrl PgUp - to the begin of text + Ctrl PgDn - to the end of text + PgUp,PgDn - page up (page down) + Ctrl_K_B,K,L,T - marking a block + Ctrl_Q_F - searching a word +===============REKORD 14=======================================|=============== ++ 9 + Loglan's database - CHOOSING A DOCUMENT + + On the screen you see names of documents to consult. +Use cursor left & right to choose the type of document: + opisy=reports, funkcje=functions, tablice=tables. +Use cursor up & down, or Home & End to choose a document. +Press Enter to confirm your choice and to see the chosen doc. + + Press Esc to return to your last choice. +===============REKORD 15=======================================|=============== ++ 13 + (F) Searching a word + +Give a word you are looking for (Find :?). +Next define the options. Then search is performed according to +your choice of options. If word is found the cursor is located +after it. +You can choose the options: + G.......global search, from the beginning (or the end) of text. + B..............................................backward search. + n.................................searching of n-th occurrence. + U.........................upper & lower case lettersidentified. + W............................................whole word search. + L..............................searching inside a marked block. +===============REKORD 16=======================================|=============== ++ 16 + (A) Replace a word (alter) + +First, give a word to be replaced (Find :?) +Second, give a word to be put into (Replace with :?) +Third, define options. +Search & replace action begins: if a searched word is found then +at the top of the screen you see a demand of confirmation. + +The options are : + G.......global search, from the beginning (or the end) of text. + B..............................................backward search. + n..............................replacing up to n-th occurrence. + U.........................upper & lower case lettersidentified. + W............................................whole word search. + L..............................searching inside a marked block. + N.......... .uNconditional replace (no confirmation required). +===============REKORD 17=======================================|=============== ++ 11 + (C) Replace Characters + +This functionality enable to exchange capital letters to small +ones and viceversa: + D..........................................Put capital letters. + S............................................Put small letters. + G........Global replace from the begin or from the end of text. + B.............................................Backward replace. + L.........................Replace inside the highlighted block. + C.................................Replace inside comments only. + T..................................Replace inside program only. +===============REKORD 18=======================================|=============== ++ 10 + (K) Replace keywords of Loglan + +This function permits to put all the keywords of Loglan in the +selected case (lower or upper). +Your choices are: + D.......................................Put in capital letters. + S.........................................Put in small letters. + G........Global replace from the begin or from the end of text. + B.............................................Backward replace. + L............................Replace inside thehighlited block. +===============REKORD 19=======================================|=============== ++ 12 + (T) Searching the word indicated by cursor + +If word is found the cursor is located after it. +You can choose the options: + G.......global search, from the beginning (or the end) of text. + B..............................................backward search. + n.................................searching of n-th occurrence. + U........................upper & lower case letters identified. + W............................................whole word search. + L..............................searching inside a marked block. +===============REKORD 20=======================================|=============== ++ 15 + (R) Search andReplace the word indicated by cursor + +Give a word to be put into (Replace with :?) +Next, define options. +Search & replace action begins: if a searched word is found then +at the top of the screen you will see a demand of confirmation. + +The options are : + G.......global search, from the beginning (or the end) of text. + B..............................................backward search. + n.................................replacing up n-th occurrence. + U.........................upper & lower case lettersidentified. + W............................................whole word search. + L..............................searching inside a marked block. + N.......... .uNconditional replace (no confirmation required). +===============REKORD 21=======================================|=============== ++ 13 29 30 + Exchange block between windows and other operations + +Press Ctrl_W and then a key which corresponds to the desired +action. If you wait 2 secs. then a frame appears with choices +suggested. + +Options to choose: + C - copy the block from the second, visible on screen window, + V - move the block from the second, visible on screen window, + S - copy with indentation from the other window, + M - move with indentation from the other window. + +More on C,V <0> More on S,M <1> +===============REKORD 22=======================================|=============== ++ 19 + Defining macrocommands + +You can create, store and apply your macrocommands i.e. the +sequences of keys. A macrocommand can be associated with a let- +ter, digit or an F key. A macrocommand is executed when you +press simultaneously Alt+corresponding key. +Definition of a macrocommand may contain usual characters ASCII +and also the following combinations of keys: + ^.............denotes Ctrl + following key (A..Z and 0..9) + &..............denotes Alt + following key (A..Z and 0..9) + @........denotes a functional key. The next key may be : + 1..0 - F1..F10 ³ <>^v - cursor ³ H - Home ³ E - End ³ + U - PgUp ³ D - PgDn ³ I - Insert ³ L - Delete ³ + S - Esc ³ B - Backspace ³ ³ ³ + C - Enter ³ ³ ³ ³ + #......the next character is not interpreted e.g.## denotes # +Braces permit to iterate the string inside them. +E.g. the string {^C(* *)}12 will cause cration of 12 new lines +containing the string "(* *)" +===============REKORD 23=======================================|=============== ++ 17 + (L) Loading a file + +You can enter a file name or a mask e.g. *.log defining a group +of files. In the first case the file is loaded (or initialized) +In the second case all names that correspond to the mask are +shown. + +>>>You can press: + Esc.........Return without loading anything + +   < >......................Moving in window. + Enter.........If a file is indicated then it is loaded + If a directory is indicated then it is opened + + PgUp,PgDn......Previous or next page + (the window contains maximum 20 names). + F4............change directory +===============REKORD 24=======================================|=============== ++ 5 + (N) New file editing + +The scrren is emptied and an edition of the file NONAME.LOG +begins. At saving time Lotek will propose to change the name +of the file. +===============REKORD 25=======================================|=============== ++ 5 + (W) Save the edited file as ... + +It permits to change the name of the edited file and to save it +in the current directory.(see L option for change of directory) + +===============REKORD 26=======================================|=============== ++ 4 + (P) Pick up + +you can choose a name among lastly edited files or Load (L) + +===============REKORD 27=======================================|=============== ++ 6 + Marking a block + + B - mark begin of block, + K - mark end of block, + T - mark the word indicated by cursor as a block, + L - mark the line indicated by cursor as a block. +===============REKORD 28=======================================|=============== ++ 3 + Deleting block + + You can delete the marked block. +===============REKORD 29=======================================|=============== ++ 15 30 + (C,V) Copying or moving the highlighted block + +Function.C. copies the highlighted block (Ctrl K + B,K,T,L) +to the current position of cursor. +Begin of the block will be positioned exactly on the cursor. +Other lines are not shifted. + +REMARK: One can copy the block into itself. + +Function.V. moves the highlighted block (Ctrl K+ B,K,T,L) +to the current position of cursor. +The earlier occurrence of the block dissapears. +Begin of the block will be positioned exactly on the cursor. +Other lines are not shifted. + + ----> Ctrl K S,M <0> +===============REKORD 30=======================================|=============== ++ 18 29 + (S,M) Copy or Move the block with indentation + +Function.S. copies the highlighted block (Ctrl K + B,K,T,L) +to the current position of cursor. It differs however from +the function Ctrl K C. All lines of the block will begin in +the position of cursor. + +REMARK: One can copy the block into itself. + +Function.M. moves the highlighted block (Ctrl K+ B,K,T,L) +to the current position of cursor. It differs however from +the function Ctrl K V. All lines of the block will begin in +the position of cursor. +The earlier occurrence of the block dissapears. + +REMARK: If you move the block into itself it will result in +shifting it horizontally, it will move to the cursor position. + -----> Ctrl K C,V <0> +===============REKORD 31=======================================|=============== ++ 10 23 25 + (R,W) Reading and Writing a block + +Function R enables inclusion of a file from the disk. +The file is included in the current postion of the cursor +without indentation (as Ctrl K C does). +A window appears and you can choose the name of file + see F3 L <0> +Function W enables saving of the block on disk. +A window appears and you can choose the name of file + see F3 W <1> +===============REKORD 32=======================================|=============== ++ 8 + (I,U) Shift the block to right or to left + +Function.I.shifts all lines of the block one position to left. + It applies to the full first and last line of the block. + +Function.U.shifts all lines of the block one position to right. + It applies to the full first and last line of the block. + +===============REKORD 33=======================================|=============== ++ 5 + Hiding block + + You can unmark the marked block. +If you repeat this action then the block is marked again. + +===============REKORD 34=======================================|=============== ++ 6 35 + (F) Frame around a block + + If you selected a block then a frame can be put around it. +Options permit to define parameters of the frame. +Each line is enclosed in (* *) i.e. it is a comment. + -----> Ctrl K O <0> +===============REKORD 35=======================================|=============== ++ 19 + (O) Parameters of frames + +3 lines determine the pattern of frame + define 3 characters for top, inside and bottom lines of frame. + - top line: leftmost, inside, rightmost character; + - inside line: leftmost, inside, rightmost character; + - bottom line: leftmost, inside, rightmost character; + F............................Position of first column of frame. + - must be between 0..255, + - must be less then L, the last column of frame, + - 0 has a special meaning:frame will begin in the first + column of indicated text, + L.....................Position of the last column of the frame + - must be between 0..255 + - must be greater then F, the first column of frame + - 0 has a special meaning: frame will end in the last column + of indicated text, + T.....Put text in the frame: to the LEFT, to the RIGHT, CENTER + in frame. +===============REKORD 36=======================================|=============== ++ 14 + Compilation options + + + +D: Debug info on/off Debug on causes: firstly - execution + of the program is recorded on special file, secondly - you can + watch the sequence of executed commands. + +M: Memory ______ Divided by 4 amount of memory atributed + to our pogram. It may assume values from 16384 to 100000. + If you can select 16384 to accelerate the program. + +C: Cursor on/off For amateurs only. It enables to hide + cursor during the program execution. +===============REKORD 37=======================================|=============== ++ 4 + (S) Marking a place in the text + +This function memorises the current position of the cursor. +It is possible to reposition cursor quickly in this place. +===============REKORD 38=======================================|=============== ++ 5 + (R) Go to the marked place and ... + +The difference with respect to Ctrl J J lies in that befor we +move to an earlier marked place, we mark the current position +This enables a return with commands Ctrl J J/R. +===============REKORD 39=======================================|=============== ++ 4 + (J) Go to an earlier marked place + +Cursor is moved to the place which was earlier marked with the +use of Ctrl J S command +===============REKORD 40=======================================|=============== ++ 4 + Go to block + + B - go to the begin of the highlighted block + K - go to the end of the highlighted block +===============REKORD 41=======================================|=============== ++ 20 + File options (F3O) + +Your choices: + + S..it is the number of line dividing two windows of Lotek. + (e.g. between main file and auxiliary file or between + main file and Loglan's database), + B..backups? If your answer is yes then saving file on disk + causes that the previous version of the file is saved + with an extension .BAK + + D..Delay of idle time. + If no key is pressed during D time then the screen shows + a sky with stars blinking. + + W..delay of showing menus. + If you choose an action of editor say Ctrl+K then first + you see the headline of a menu window and the window + itself appear after W time. + +=============KONIEC============================================|============== + + + + + + + + + diff --git a/utils/lotek/lotek.pth b/utils/lotek/lotek.pth new file mode 100644 index 0000000..e662fc4 --- /dev/null +++ b/utils/lotek/lotek.pth @@ -0,0 +1,26 @@ +f:\loglan\lotek\ +f:\loglan\lotek\ +F:\LOGLAN\LOTEK\LOGHELP.MPH ++ N Norton Commander ++ W Word to make doc ++ D to Draw ++ R Run +c:\nc\nc +C:\word ! +c:\draw ! +f:\loglan\exe\386\int ! + +Plik instalacyjny edytora LOTEK +Pierwsza linia jest nazwa katalogu,w ktorym znajduja sie programy: +Lotek.hlp,MPLOGED.exe,lsttest.exe +Druga linia jest nazwa katalogu,w ktorym znajduja sie programy: +prep.exe,logdeb.exe +Trzecia linia jest dokladna nazwa pliku z baza danych (*.hlp) +UWAGA:Trzecia linia musi byc duzymi literami +Nastepne linie sa kolejnymi liniami okienka EXEC +Zaczynaja sie one znakiem + +Trzeci znak w kazdej z tych linii to znak,ktorego nacisniecie bedzie +wywolywac dana funkcje +Po liniach z plusem wystepuja kolejno instrucje jakie maja byc +wykonane po wybraniu tych funkcji.W kazdej z tych linii wykrzyknik +bedzie zastapiony nazwa aktualnie edytowanego pliku diff --git a/utils/lotek/lotek.txt b/utils/lotek/lotek.txt new file mode 100644 index 0000000..06b8a01 --- /dev/null +++ b/utils/lotek/lotek.txt @@ -0,0 +1,118 @@ + + Warszawa 1990 Michal Pakier + + Program zarzadzajacy srodowiskiem jezyka LOGLAN + ----------------------------------------------- + +1:Instalacja programu +--------------------- + W sklad systemu wchodza nastepujace pliki: + LOTEK.EXE zarzadzajacy wszystkim pozostalym + MPLOGED.EXE wlasciwy program + LSTTEST.EXE popmocniczy przy kompilacji + LOTEK.HLP tekst helpa + LOTEKINS.EXE program instalacyjny +2:Edytor tekstow. +----------------- + Caly program jest jakby edytorem tekstow ukierunkowanym na pisanie + programow w LOGLAN'ie.Oprocz podstawowych funkcji zwiera on takze + inne ciekawe mozliwosci ulatwiajace prace. + 1\Operacje blokowe + Oprocz zwyklych operacji na blokach,takich jak:kasowanie,przenosze- + nie,kopiowanie, przesuwanie w lewo i prawo oraz wgrywanie na dysk + i z dysku sa takze inne , uwzgledniajace specyficzna strukture pro- + gramow komputerowych. Sa to: przenoszenie i kopiowanie z wyrownywa- + niem (przesuwa w poziomie caly blok , a nie tylko pierwsza linie), + wstawianie bloku w ramke z komentarzy (mozna dowolnie ustawic para- + metry ramki:szerokosc,wzor,wyrownawanie tekstu wewnatrz).Edytor ten + pozwala kopiowac i przenosic blok do wnetrza jego samego (przeno- + szenie powoduje przesuniecie w bok, tak by poczatek byl w kolumnie + wskazywanej przez kursor). + 2\Operacje wyszukiwania i zamiany slow + Mozna znalezc lub znalezc i zamienic podane slowo lub wskazywane + przez kursor. Mozliwa jest tez zamiana wszystkich loglanowych slow + kluczowych na duze lub male litery(w calym tekscie lub jego wskaza- + nym fragmencie) .Jest tez funkcja zamieniajaca wszystkie znaki na + duze badz male litery (w wybranym fragmencie tekstu lub tylko w ko- + mentarzach lub tylko w tekscie). + 3\Operacje szybkiego poruszania sie po tekscie + Mozna zaznaczyc punkt w tekscie i nastepnie z dowolnego miejsca + skoczyc do niego. Sa dwa rodzaje skokow:skok normalny i z zaznacze- + niem aktualnego punktu. Wykonujac ten drugi mozemy skakac miedzy + dwoma miejscami w tekscie. Oczywiscie mozna tez skoczyc do poczatku + i konca zaznaczonego bloku. + 4\Help + W kazdym momencie po nacisnieciu klawisza F1 pojawia sie na ekranie + krotki opis wszystkich aktualnie dostepnych funkcji. + 5\Makroinstrukcje + Jest to cos co bardzo ulatwia pisanie programow. Dla kazdego klawi- + sza (a..z,0..9,F1..F10) mozna zdefiniowac makrorozkaz. Jest on poz- + niej wywolywany przez nacisniecie Alt+ .Makro- + instrukcja jest to ciag znakow wstawianych naraz do bufora klawia- + tury (mozna tez kazac aby jakas sekwencja byla wstawiona kilka ra- + zy). Z pomoca makrorozkazow mozna sobie na bierzaco definiowac roz- + ne pozyteczne funkcje np : linia oddzielajaca, zamienienie slowa na + duze litery,zaznaczenie trzech nastepnych linii jako blok,... + 6\Operacje plikowe + Sa dostepne nastepujace operacje : wgranie pliku z dysku (jesli nie + ma pliku o podanej nazwie to rozpoczynamy jego edycje) ,rozpoczecie + edycji nowego pliku (przyjmuje nazwe noname.log) , zgranie pliku na + dysk,zmiana nazwy edytowanego pliku (dokladnie nagranie w aktualnym + katalogu edytowanego pliku z nowa nazwa i rozpoczecie jego edycji). + Mozna takze wybrac do edycji plik z posrod dziesieciu ostatnio uzy- + wanych. +3:Okna +------ + W programie mozemy kozystac jakby z trzech okien edycyjnych.Pierwsze to + okienko glowne ,w ktory mozemy wykonywac wszystkie mozliwe operacje. Dru- + gie to okienko dodatkowe, dla ktorego nie mozna jedynie wykonywac kompi- + lacji i operacji z okienka Execute. Trzecie okienko nie zezwala nam na + edycje czegokolwiek umozliwia ono podladanie bazy danych zawierajacej + wszelkie mozliwe informacje o loglanie. Na ekranie moga byc maksymalnie + dwa okienka :okienko Glowne i ktores z pozostalych. Bedac w okienku glow- + nym lub dodatkowym mozna przeniesc z drugiego widocznego okienka blok + (sa tu wszelkie odmiany przenoszenia blokow). +4:Kompilacja +------------ + Program umozliwia skompilowanie (bez wychodzenia z edytora) pliku znajdu- + jacego sie w okienku glownym. Mozna wykonac pierwszy lub drugi przebieg + kompilacji, uruchomic skompilowany program a po powrocie przesledzic jego + wykonanie. Program automatycznie zapamietuje jakie operacje dla danego + pliku byly wykonywane i na przyklad jezeli wywolamy opcje RUN a byl tylko + pierwszy przebieg to zostanie wykonany tez drugi. Po wykonaniu pierwszego + przebiegu kompilacji mozna ogladac znalezione bledy. W dolnej linii wy- + swietla sie opis bledu a kursor wskazuje jego wystapienie w tekscie. +5:Okienko Execute +----------------- + To okienko kazdy uzytkownik moze sobie zdefiniowac sam podczas instalowa- + nia programu Pozwala ono na wywolanie dowolnych funkcji dosu,programow + lub plikow *.BAT a nastepnie na powrot do edytcji. Do wywolanego programu + mozna oczywiscie kazac automatycznie wstawiac nazwe edytowanego pliku + (w parametrze). +6:Baza danych +------------- + Jest to zasadniczo zbior informacji o Loglanie ale moze tu byc podczas + instalacji podlaczona dowolna inna baza danych (stworzona za pomoca pro- + gramu MPH ). Baza taka sklada sie z 6-ciu okienek po max. 22 linie.Kazdej + linii przyporzadkowany jest dowolnej dlugosci spis tresci a kazdej linii + spisu tresci dowolnej wielkosci tekst. Bedac w spisie tresci lub w te- + kscie mozna wywolac niektore funkcje edytora: Wyszukanie podanego slowa + i zaznaczenie bloku. Zaznaczony blok moze byc potem przeniesiony do pliku + glownego. Mozliwe jest wejscie do bazy danych wyszukanie interesujacego + nas tekstu, a nastepnie powrot do edycji bez utraty podgladu na wybrany + tekst. +7:Praca w srodowisku LOTEK +-------------------------- + Prace rozpoczyna sie uruchamiajac program LOTEK.EXE.Na dole ekranu wypi- + sane sa wszsystkie funkcje, ktore sa aktualnie dostepne. Jesli ktos chce + miec o jedna linie wiecej dla edycji to moze spowodowac,ze linia informa- + cyjna bedzie niewidoczna. Po kazdym wyjsciu z programu na dysk nagrywane + sa wszelkie parametry (na pliku MPLED.DAT) i przy ponownym uruchomieniu + jestesmy w takim stanie jak wtedy, gdy skonczylismy. Edytor ma wbudowany + mechanizm zapobiegajacy wypaluniu sie monitora. Jesli przez 2 minuty nie + nacisniemy zadnego klawisza,to obraz znika i pojawia sie "niebo".Po naci- + snieciu dowolnego klawisza niebo znika. Zawsze przy nagrywaniu pliku na + dysk jest tworzona wersja bezpieczenstwa (.BAK) + + + diff --git a/utils/lotek/lotekins.exe b/utils/lotek/lotekins.exe new file mode 100644 index 0000000000000000000000000000000000000000..c426c3cba4a3578404785abb19f7acb3ae5890e3 GIT binary patch literal 47664 zcmeHw3w%_?_5a;x-XS~$K@69Q;gPTcQPd>6^2!1N$p*qh3))SxV#s6D&EBj@HHK1= z>=N5w`>VC-3w*XpZBVN5QC^7wr6^!kL~9k%Zd}AD$SWcH|DKt9ckgb(qb>i}=l>6U zcki7$bLPybdt z7eEi7(Fnp&AOn~I6aY2A{XjGDJD>&F0lWu%4kT*@VK9&elmeA>trLWFAP2|;76Eqv zRe%I|fepY5z-z!4z;Pg14_d$&;09nGa69lr;6b1n_&abI*k}-hR^ScbE#MR2bKn$^ zVibf4Ko&3y$OBdYcLO!Rg@Eq_W zup4+A_!u|=#3u{F6kr;#7$^fI;C|qjz;A&UfLDP1zz4u*KoHOmfV=^tfyuxvfCQ`u z9tIu<4yT~q0mDG#1&jnn1DU{0z^y<&Pzu}wJTO=gehoYeJP+&#Mhy{!@jxz64%7o{ zfS&`+z$Rcb&<5-V4gvoFz6MSLBdz z2Y^?A*MLs|<1onoa6z~cSPs|$38(`e0e%B)23`O@06qpz0B3-d5s(#NERX@1fdxPz zP!7}sYk>a-9s_=bKD_~W0(ctu6R-t%33wAY2y_DaQQ#dI4Wt1UU?#8%Z~{LAHUp=D z!J;5s3Csaj0F^*BP!BW%zXMu`T^2_bYLbh2lyV~0PX{R2s8t~ z16~AP1^x!S4}1-r1d_i4K7e#!5-eE*i~}YDw*a$% zCBS!q3cv;Y2xtU;20Q{h3QQErw5x$(LXFl0WC1o{1yBU61bzv;1Z)M~1-=3jH8t8H zz;NJJU?H#+xC>|oo&k0Oe*@kJjsRZ+N!l9icYw*jY`_LA237&T1-1hp0!IOZu0}f& z7z<1WrUJP@Ay5X?01dzcz)ygufaic$fgQj;;2j_cT&b_o<^d~#2H=;#-+`0BRfZa^ z8CU{1fz`kk;3Z%$@Hy}`5N8DMz(n8y;3vS(fla_Gz!9Ju5MpYyqk#!P4lo_~KF|RC z3}^xN0$%{5Vo?XccY(Wr?*q>P`+#?VPT&|YN-*lOfVn^&@D%V@;42_qW7L^}8Nf3{FJ8Kst~G%m)g9HNa1SUjTmrb^`l=9^l#} zqizCl6L0|d7#Ngn)Qtot05=2k02@#W>;{ek=K$>hqiz5o0@nfsKoPJKa03qjUf?&t zv%vGfHees{4)6)^4R8w3rx4 z2mB1!2>bzf5!eRo1>OOSR~U84z))ZekO5=?GXNW~47dxZ1nvcX1ek;({g*(Twn!h; z73pjAMf!P$B7HINKG0(<(s#ud>E|RMjxfRS9pHPw-9VCdf}v73!4M}D8^!^XfvLbU z;CsM1z^o}Y%mMxcya*fyx`1o7#fF=JVxR)}0WeHhZOQbAAN3M)7HYSp-Y=F zD(jjL;A4Yid9HjFq+CvUekKcA#EHpkQ2Gn#KiXzX@(3cPfJaJ7mtS zy_n3s79FFH%oX-4bH09M?tA}+%*m8CHp>_Pfy_lRrO4cQnfgCN=57^5(dI0%uM#Wm zbsmRURbE;qi5cPq)13J>ah%Iu=co|t9Ab5GsiUsUK3=S|drBQH`zm{}W2I9p!gI02 zURhgww>TH1#FBEm=qRamJ6(2hetu!@JkccDKvQ%(D#Z$^x>PKxEfzhsD;<>%m(zok zVwJ1TQHM|GN|(JtTwt4H(o^Po)7|A&dQ-LAr8gmvsk`3}ZrbXAPGRbf%SwyZ)-u@E zl4ont+nOK2D9ZJnUmqoVJUG)36->#8vE(|QykqT(ps?*xAr-wmDG2qIFRL$p+f@Gw z`hWd%^zlb9@{VxK(6qJaOS;FC<{BtE_PAMR)Ec+lhy2)86fx3X8m@i$la_h5=E<;4 z)>(tzwMoHAM;h0D?^vrw$i|mvLgU)vV*z~-pT4cd$GmHjg0|*SDOw}lt;3xUPbjAJ z;rY4jSX*=qO1tQo;LZWZM@fyHm+v2j_-3UlM=9@&Noz0*lDc$b2L`X!6S(*-E}D}(Ji6VR)hdR5^UDA{_28P>+C z);(`sgxawAS1@Kfj3)$*Dl1alw~*wA|J41d%9!wLZe5V_JuxYt8zGUse~BS$kK3zQ7-T8vXD*xeScE zNG>B0A=0K)$Zl;v z*MXUU*V>z9-Q*dEZ@IlhX(($c7GlGQWosTAgA8@O*51IrKF#p9!a5UzkoxT~ej{l9 z9pQW@x-fkPbhU6UyqIu4r`bkvE~jut7$@gx(75=Eh|OR`IIq~;9R2V-xs+Timnt=( zXt8-D`r##s&4k{|EH>0UDzP~(XlMkU1D(i+UAN0oT`ZPX!fuqxidU72CC=)xl2|Sk zDHbj_G^GqS9*Y%r*&;1-R>B&c9a66HMU@lQYLUxcSt^O1>N0y>EsR#jD%om|#Z!V^wuA8(v{rj~zW$EOM08A(f}v4P)9~X=j|tb~90jVa@FD z`4cbW9~%sw9?-OPnKBqqS1~fx8KX9x|1=;<*0>5h-GA`3lzwABpbjQc@>-3Pj=XFW zP9650UcGCJMm0*TUD_pcMfwKKxl=Dp;;mU;T3lD;5X(y|OVN^;TR6)~9hGHv5hL@= z#f7=zxXC8d=E~+)9%2zq6-7H?Iqk{8~ zhcdek5Sp%LtWGQ|C*gKWu3E9W%IR^!=0&rx`eO}*YNT%}rqX?wh(4R55>a_bNMe(; zn`|xeB#ldC!$6hjk&JB^W0-Vg@_~i6$=m6(HC~`EN;Cj2&PT@>5P=*vEt)KRdMejJ z@&fu^e0l+h=T%HR8~*ZvFudB@v~>~8kccO%cYOf$!wrhf$ekG!{lsV;Ax|0uPtsG$ zO?srkGR7cybe+G_Qpdx8%vodA9q;+*^6+8`gQAMbgBSE4{LB7>Kkq*{b8r;xjCt9_u!!> zY%q5rV@iz;ry6U%1OE1PYnOC2Y+cf&sn&J=TJYj7%Q(h>>iRMHH0hpK5?zIakBeB# z2-zL5b}?jA^*AJ(g-kY8PtGHoePTq&CRkYPKXQh+6i_rnZ-?<)n%=T8Le|D@lhhr% z&-Eggv&88stuAwl5(cz#XQg9GpGe^VRdnk9N|FoaF~bh^CVQFW1ojK$p^mP~!+wG3 zUp^aF!rGp4@nG8QxFO7W%;P5|GnwjD8@e{T8dyF-+k~a`u0V zj;WA{y)ud~MuM|uiGId|*QtX^QE^=W4Hue1q2D%OWhPTfWbXaR+nWz!g^Beu$sE@I z5#!n3OCl>*K6Osg4CFAh2FV7FD|fmbWu_|k-B)o@wJpq_y>R*hQC=~adE2ddw}pgw z*8J%rU%r|y!m+fdFn=k3HYgN@F1Qc(VrHmT%uQ92&8@u4>8h|7W3+e577~2KT5&Fm z5%H9F3OoE_EXEv8V{W*sz(Rt-t#o~@IA6{sB1*NQfb1fBT<9TsB*}{9l6#M%SaLhW zQR33+3m4r!ed%;@^369hm9t>(%sJENi?-?W=H@OO#XQwASH-of(A^?@*)wc#eWO>{ znPFy!5eSQj{N{ETP8as`$>w0z==rRX;M&emTvLvF92w=+Za0XTaD59IWdA`9gR5MQ zDk78tzhjA`h%U{AsF7l*7cwYizDt}?B_*NB2Ui(&RN*0AJ8lB`;KyeyUOIjD^sGo4 zAzyxpR99P33d(LQ3sjU&%ClFy9aT^tlo!(`WzKR3>XJo5_V^Ap46OL8Zin?+3#Tae zh(hNoMy8lPi|5G##E^AbC%S39fg8uLwVCZovpKR>VGEa%VTqZUY}5~BMkl6i#Uw~} z+1hkiY?u&Gb$}F>AIha_C{9l;F;CuE&a_ju+)0`-O#sabViao_Ghmd{j1k%~WCcr{ zF~yu+s+iLe42O;ROnDwyhZ?h2VYI20h3Nt|JXStn$zYF-p?LrtElkiYONv}Do-R8~1vhVXFV5I&o4z4`9Z5|M>HLkI|YZ2Uoc);BVVC#{c%QZX& z`R~~L`Uhk(?SvPQ`DXaT(Bxb75HoQ8kk(A1Q^Hpc@*i0`jE#9hhtZoa@VMUm=(r6Q zUw*n|Zm=Lu&D5arBg-}xiHt+Vsl-Ayeq@pDbZ+s4?HL2*g0Tl#Ny%$0A6eqvF}$?i z4If!x{&yHZwt!jWz2Rd^)NC~5QwS!1Wa&l3^D#<<1%>c)WG@Lklb8-zcR~QUz=UF{ zn?u#h=P}zpv7ixXsh&HfXia-~)S9-uDzpm~pb@a`D zK3l$HYe|xAb7nNNHF7>${RJ`*GONRG-S^eO%-Uu<2Y8yZ>W7p@E&$t0kaU%bV021T zpNC;1e%s_e4^?^E`aD#nT-4{GDy6H>Lsd$t&qGzp|L*fpmGT#T9;#Aau$(VMr{uNT zr{Z|aSwX{?VL!(D2YmZzV_smAStCdW|3e=J(#%@AI{i^#q*+H-rJn=_ne}w_ zv(E#uW&<4M{+qwz8c5f?iBiWypndrR(z=m-l&NphxBUc@ri}<@bI(R= zFEk~#(s(Q=gseJUX+!wT}PTExS_ zSBz9?l5p^{{)6lK4}Q7-;5YjZPQ1F`EN|{Vcvb(wYx@u0(|_>c{)0!S_RC30zrk!M zQFaQ+vk7Id8hvBX?=Y5I$Qix|*Bi=dd@GQ>t#hwPUD{r6G=}$L^&+ku6}CcyrQEXG zqpa*J6AGf!VXO$#tWeW@N8gubMFh^1c!D^s8n8y7!qwpCM1kBEHzKZo`FXzEe-WwrPU;W!lWY;#|xm&2Q#nrE9Qoq zfE7mlq$45c7CE4eRH3VnPSD64z6TD+$s9H>0NHiccN^;UT4_LU-n(GdYkimdauBGI zVmH*#*13R@bK3kN^fXiTObC#fFu&Zmb^bu^Y9i9`T#D{sZ@D81}iJp79+) zbh*ui?QP9Jz&;?j)_!Q{um<5-yN=dcDQWYK$>ccr6A8pt-5G@z-$BF(@-0LjB0`&q z3S;US|dUjjMZ_izX+`S=kG%Y~>NWkU=VC`aQSBKJa-YG#S@8%e-))+?{L9Icd z^B4MEYsYtM1i8Rl_n|&0DmtjG*)||t@`wjZ@xZ%wU-!DT+Oy=O*Pey9bcBB0+Bdt& zPyc4OLhc7dE~OuG5f6x*lH#rNF%a>9rywHUwQqIX{7bv(d)-dH?9qy!INx!p=f)B#-mYWFY!k0H_6FiCye(aCd60+8~_S)_>xD}+N;0xDw2VWS{-TW79^^Qmzd%m>S z$Y}@r)?U+{4pP(Fx5jj*HRcWt#M9N}?R4z}=TsPUxSNB!)=ucr2)ov1;D>*^){et9 zgrSGnr21sjVjjTczxf^Tl8tE6yr!*bEZP`+HXlQ9@P#pG3)c15Y9<&O*Cuo~KAhC; z!*{~kq;B`1c4W1FXZzL!;%HD>xoqvD@K1B&N`*be(rXqY?Am5Lf`>?Q3=2>vu-;0_FE8%Bg`uA$C^piWQ7Yo3~*b zys9l}pp|cF7)nNC(WVXLfF8}04MMV3eWYZC9uB34QDVoH2il((Y+6_*S+%qq!n}4C zV8`OvZVfbqBH8CK8R{q*W-m6AkBcAqtu0vZ}aCN-N&kj6O}_r zU$V=9o-`A8mSTlDfw{NcShjGMCC+qKb8lWq?(`${ET4ujbG78Ww@Luc^qi;UE``1l1=o^9BAXO}^GxKDHkP~x}NO7GF zLQb3{UNE}>f#o>^q-7V3^B=TJ>)?ykjNBNkX8L7Sj)0m0t7rOWH5BJUtX`x+v138r z?tB(=3=9Ce&N1hBpP<@d+9JAh_|TQmeSPRk=+NkiJGG=|)*Kz$VGRhd*qiFVkh^I^ z{TG6i=(PqW9XWLn?t;Ko4fO#G$6o6f7>Tfx3PG{#23J07uZozBX`Xe~=j7SX<__x? zxON+@uLrHKhuH40zMy3}{#nkkSuRJ+>iX9|Hc4;uFa2Ww@$SX`Wx+=4p7#29bUT5R z4!(TWJ?49Z(!d7GIty0t_`|84r8;wCbZAcJBAwYA9eQJ@S!eb|hnhRb>dfn-LuYgj z)R~*2L#KCkYt4U*4xQ5Znb!Plbm-*Hx3uOzMTbu6d`W9=2}&baDco_q6xM)ToQ%$9 zt$A~FB2(v&wC3ld6U|Z*P3UxJ&3}%5JX3i*zSF8TzZgyPy3R>jb8B>>TqRL@=RmFb zrRYQxJG(XJ9|!Nf*8E8Dek|cqLkvZ`7``uHKS&&QHyB2tx#H8-89MiC$RifnT6vwX zXvjMj89Kl72@UzjB17{#f2=XbMu%SCS*tO}2~s?-xEnfGY0Qbykrs3oYRpN|q4PQ| z8uRezP+R9Xjrpn&!OYI#8nY z8Yna0C`b?^%IU_y3iD0Tapx*=ZwlOEzBv^4=D=igmT+&1IVjwp5Gp5}mxAWr!Dc~w ze=^#2qCid#l%MRQEvzHrcODo|Mazq(bBe~?9v!Of9H}w4 zMThD-jT-aL=umxUmtfuz9ct)2B$&5HhZ;NE1@pG((3s9=1@qSE&{(SGzeI<|b^cH= zzZ#TMB6LiApu+r{=)e(yW#(T;2VNDJY5rAo;K+c<+#DTvbzr#pm(hW#yqd`rWd^CH zp?(W_ES^0p>q>WgbE1wMOwR|t=Jf6~QUD&f3kdv#iGIOK%j^lBzK0;fAupk5I|`a-Fur`jkL* zC6%dKo_qjaYxkrh%C9N5K7rX&s1EthBep()S*F}*h{_XC17ZJe`p#*5TF;_J)_JeB z8yQ|N6*bg%YigGFm+eGlmmeO|T#}@b@uOtI>*gZ)%$x~i z#dK4xqGh`SQ*tIsMo57sFfPX=jbY7?WGD}^kR_9+N0;die8!p2#LtqgPeIiM(JN7z z%3YB21?n#RI3?7Pcy*#$OK@=qob_p6D7zp;nPeNt@=I@vGgi0&~ttpqGB+9B1-h5s2HfO=t8gU z69v^xY6aCyU+OlXF2pJ$)C{asQA4mLe{uoDa{GT7DOeC$XZ=HqkY)V?HBB%3T@IUR zk;26!^k92^GDZ~Mu4rD}P7q{%2+9Fj&)NU6Zs#;z8_kcs7;uoxcY58Tr*Q?M)HLB7 zY)TGT0I~hMxh#V%A`|~}Q$4wr>YGz#K5umSN z?k2;)({%n&fX;%wmdN7=s_{mF5p>;~M4$94+_>=5#dyI0e`=toUPG2Ou?A)-qZPOj ziZTugE!g=}Aus`Il5ToC9}ogp=ggA^@DwsTfq1;d09q54$z2%BNjq#i_dm6HWwn#Y z1@;b~HKoydR`zjCYqXx0{acOJlfjxn!I~7PkEZ%ZWtZGF@F{z(r_miwas|L1kwQuK z?>mWKP+L#zvVNmM7kCslkoB8;NBio(Y52jTqBNMr4Ay)@8eIOlTG0AU;GH$~C$P0= zb^Qq}A`N4an(9wrD$Cs0U~b8vK$6dTcJcwd1fy|DZ(s&XpzHJm+pQ_aoxc2^NZ_Jtgiv;kc^MS_|W> zm2uW#th0z6#vjnfy%y{xyU!8>>#Y^*m(3MWS|P?Rg}#?N%d~0D1I{#~^|TMyR}IHUc!&!>gX` zw?IL#&>tZbU4qtatS3Dg=qCZZVdOOL3#XN||A=3R&cae|jQ3ejBd+wmOkoD2iw+g6 zNtWZ>r%=Boo`tZOtwuD<3asmarC?2Bu!eLLF_urU(|lkadL}#9Sd&Z_>>fVrTq6mz z+^bc^*%L>$lANKFCbUHB&lGy`@(c)Mf%+L2i{6He)SdM(^yRhi{gFn4Mv&ufh+T*#?+w=UwAc4g z;-YitQ}V+#(GPRa$xjl%B+EbHZ!xB} z#VB>Pt|uJ&2gH$EtF1Rct~+95G`T{#U9~M@E^5#zI>SIA<7 zv7D}AL!CXItB@h#tW7bfB@@MKH&doBpmULoYSV%@v?ih>HlZUTD5OO?C*nmMN^!cN zc~}cl2y3tvY-Z9_kBt?{ehu4}5qh@MNXmgd`H^v#^@J9FAC_nw5;a^`EUF2GR&A=O5RanN;e;aai5-O10JlxYcRl|zSZqFD{Y19t9?pgn14?Z?1&HI=k z9Qp=qBt<}Eg89gm#5|O1=eq(DgtK@!L}|Stdr7a9mTm2kM$@L-P<2*^qLdoAAO}W8 z&{!CXFh`Cc%W|teM=xcup2Y-yydkRF1*A1Mv(?1NCPG0b-PE)2W~zTO{Q|9b5WD=(kk)B@Z>ZSJ$wojP$@Ke{|%!N zC#DRs^01?7O?N4aL5uB7p~^B-Ks=)UPg4C;S7yTYsy1Bzr0XM$3OREQ1wI);C{U7iDm_pml@Y^*er8Tb5QWAOmWR2y`Wf`CpeG;fNks_wd%nsJX z25XGlKEiK7;8|d*Q4wD`a0)lRXyoU68}#x6Uk`71ytgm`?=2h&6-R{#lv4eE*joZ1zczZwk)_{PN@0hb%TZ^bg0CBq_2bGPS*a z2u9Q2TF|eJ@`j&V@IK6TYogj9VpCMc81FnGQ)CdCA}|NTsq3&^XdB48FmoZ6<(UcA zhT}0hl(p9v`gj}OEFxosD914KAqq4|m3k4~P zx*|s_L8JAX-A|S5zUk!+5|tfo$YRaFtU+Wa2dJ}C;>b0E=)v59oX%kS%FZ1q4WWy6 zMa95|1HE{v6V zOj3$P#mJ>z&u*x&?1B}(BR7TV)sEZ|7%o`(*X0iNT2r#DLu#;K3b7`&F)RQTB0nAG zwGQQ>SK=zmI;a})Xn!~24X1eWQ5&5v-o=n%Oo=kV< z@L0e^rzHsaWoFUja{*E#tT-1hewwNaDj ziDNa%{+|cgwve~*J^=yi5>&set-QG!a?CcoA_U>!q6ZE4X*4x7$xiECpb2~+2jO=u zbk&io;Z1DdsmTE>Cmu%6z06R~%GFe}=)Hyj9K{qI*5t^Ktp|k$hg>as23N?8ToZVq zRUWj~eOj(C`b$r{-2x`&itC3I9HMG|K?y!mF(fUl4^jjla!<(ByT{TEbP|m}blG2y zH0)5dDh5Gz)-96#iTpj8&GZu_O1x!&|7}A~j5|I@S7U^O!oNiDZxpt~P6_&7F?id@ z-2dp=0{o;QbNi!#f=9ax9_=ZZ_UIP{tbUUlu>(WBa4Mv|Rr4QUSwy~xg(qjzaxvTqUmg@$GEN8A%z z2Mv5)@Xt21P8#?kPV(@Z4Gm`}NJG;ak{=W_t%Bwy!RQ}v*fQvO(f=Jo8`vIcuqkl| z8kTJq;txo%&s~|L^Jq6~yx(~L*89d5p`rImycS*a*s+4fp{EPhC4X7aVLV!($=psm zriPv(dIv+T}J7=NasC9DYK4A+9})pCvJtvQ2WJK!+6AfcrJgMC?eQChTcy(=1!0o3htIT8ygT)+f4~0aK|=Q1)gw+F z_Z>W9|GiF%P1JpEZ+YSKnclX~XLxsgJ_Cu4*vIsIZr{^j=|-c)QggKkZg@!cZ0JUF zBQSouG-%3^y+iRGzb>u2ApVF1+4Eo73w~0kzIMNUSFX0@yDDh8)R8+$7=?O~qqhE+?iHurw`cWz+Rg8|7zrNcBtqDq-f~uLA$oUb?DbeVT7UY})t*v7ZhnW*aO=QLhPTEdNMh_Tf_jo&VQ@|AU^) z?MT2rT9W))p(TD%!9s|kOIU{fJpqN92;MVu;@vlFiSwp*6-=SBF7!JzxA*QO@v9NN z5XHc-Ey?}@O<-^qZrn+|Zv^64u+ASV_$LZ6x8L^Nw%!gB(3&fI-z-=NQIF^yLp8VG z*0x1ACD@s$*`mdlL6b__>7Z|@O&H}nyYD8Y%j+1G( z3R6yE>2J4hXtB_ed@LY%Uz>r?TU!Ru^^O_GMzv+1au*jYT$*b1y_No^cj%V|-l<(o zogVb=Vg!P^HrgT#&Ov0&PGhUk+F+S0#7NpLEyhs~ZSRTyz&&)6_u$drYozY8_;h#s z+Mek?d^BM6{&UkahkIg1-H9q$vUIU=Z%WLHJMUv<+>wWO1tR=&xVN z6_OWae(=x--a8Waf4cwE*G8o-daWk5=a05O`VRilxBHL2eSh@%>FzW>9@;+Yj%8=} z{MxvbiFHcPGsxSw;~C%1XO=zV>%hnQgZNnX%qTW@@EuLZl?rwA7Q0n_L9`s zYT`F}cTf59_~TQyKb_wy%zSN0@(c_RcesqFc3dgAucc_&$K6*?+3x*#Q%<(q@O1WZ z=|n?MmV0MI&vN%)T9!W@X!Y$vwDetbo<>G6&v-_IHhK3=Iq5rujxnI&p5StK96qz$ zx_Q#qtutXIC;P_=nI8m<4L6zGhMC!iq?4_&2#)us2);wuM~&{_Hwd7ZBBZ~a-R9Ez z+Mf39)_rvRao=&J7GK72acI5qfF<)wU%O$juv!1MfBga7&c~j%JhsWAGd^y4>{-iW zt(M1LwWMv-;;538$F}2#{EN2!UGvf);U_(&Oajp18emE=!VfV!C>0Z-r zT(;()qgL;FSZL_Exmvd^7+kugaPMf}(T2RCnq}X;?e;tFTrn!%-1tNU}fum?5`Hzj)XS%sEsX_gzfHu4{cA&PEElN@X|I85dvSXZ%a=-U|ADL zX-t08(wMr>(w@58vVJ=f492j!+w#~O7QE)Zb&w|6W?Zy~v7YRo#Q8-7#6{M{wW+UN zff7HvZM(pCY`{tMR7_8~0iK(}b2R|6&2L{5J@%=(PSA zin3+?-q9v+O#F7Y(SMULGjP0Za|xboj)zJL=%*Yx`L%wM4HTAn+uLm3cE3hgX2U?` z_v?gZV+QCaF)J?xc<=8*F5o1!p5n-e0|UH z#~(U`=_U<_urmUJE5^6O_cq47);&V!EX1eqsqOj3^=1&eD)HW=|FyNubWW{;5-GyhCmTJ{R9E7fC2%T96)!;R5%qYJKx1$xhQ zG6#Vqk}j7>aSX2El({E`;y}7$(V`f-7aP$@cs2crvXKT*CQ@7@>ZB2M(&ir|KrXpM z4RV2*@?v9~4>i5!t62AN->Ln__&?p$?UwARuUcvhjd+M+`KE5Q^rSt({~>ZC?pZ># z|G;$1PKz`+^Q6zR-LiU@kkUp0)!NLU@6?*l2kiff|I^`VwgqJe)7eweaIrpo`Vi9Q z+js2%VgDEWUmMiwPTw1AKIvL>ctFCAwjS0q+V77=@6d00nvWmo8hU|0QT3TkSvzX9 z-W}mMtox8v<26h<5=zm2e-vtqWe01himXO>U#;V->1!dJ$pxu z(YGU@&D@TWfc3^$IZK(DG;h+BFE^zLhU!?%PlMhaC->>j%=YrQj6GPGmsM2J5{C~{$qUU z7oJrtKll1RV>6U^t@+gK$0+ zFDbn{^%&#zKRtE)rzo0#s_?Vc2H_=9IN8x4#lwm@(7XHa@hRIIKEHpDf4HzW=Xb_8 zV)ou>JZRZ_!zX)hIJfua_xGCjd=lJv5L)7p#kbpZDoq=^{}cMB?bPkpy-k*o?rrVy z&4#x>)gH$|L2C{Oj~#^mIAm!v{Af!CM(|{QyJu;S?_k1#`;tz*ed@rPHVq=SOniE4 zaqQ+eQ+6Q~yeH9=J+eAxO^3esb?IpDj+X0sx0}*OnyxC;R)1^KjWi7|)Z*dOczVS5 z)}85ZwFz%DXA7TvYiM}*5n@qh-%+@5(L^W>+uVPjaj zn+|E1C>gA?=YBc|mt)+s(!5tU1hN|1;;YA<+9`BNlNZ6Gjum$LBz#xb_T9m6e;1Zn z8<@Ul(Cou|^Q8Dw`%WF;{2#B1XE1@AUtf9?Vy${4+)Dtb&-+JGY zPR6&*KD)VS%26jHgaQ`Vrr>fS8DHa-AkCGp5{ljLa`@elHOF@^kM6bT2>u9v^gRU^QcI zILQ3md+sE2%X{vWU9c7I5&~lu((29_;dUZ{@l^K3zLFyNZzcPRO+%rf_(>ZwH9pb2 zG7aCL7fYm83V|zauM83VLxg28d=g(7Dfr_sr=wXck{g#Am!<`WV-(WC61y`7vuQTV z&3wHvsZ}s@f=MmfpaGZ9zvtF&$!WN6lHiVOT0Cj*Xjgutq4g&TnXmia=P}3ou5J}( z?H%3vS%Po(`aLIiHb?_mLJW9mLhE)GmCb|YDe!_T8&{0jl{?aq7@7n_P+tcbEe!pM z4Z@m3LbaaS&G&|HA5lke)6da^8wB6gTW;Aq8souj$s;7`IqZYj}cOxIGw4jkWnbiHru&UmQ=<=r(G( zyM;giGkF81=cn6zJyYRF^qcYXD$GTWwv0H_rb_=@IK4iUz7*+c5)T?0Ieo#BRA#qh zeGI$mspVG;2{k=rFF9~5;>QlX(&(kyI$#9r1a$(dp1oulD@k>5&1mZ zd-#lZRuIGR?oVTSHu-;xdsXVqxr$#5%_zgVR%AP9!FBn9*6Xd%!rYzq_!=$yj+5};BA@qvV(IR@Bc6; zU6s1$a2tF(kr8>Ep1(}p0cn_Tk3$7z+Thg$`WGXEvV?f}~NYfhF z9$Rw5#rtm!N~2+GaH>=pAg_ZK0&S*-SPA(+5;YaeK2;q+xX!V=j5&24ZH5T*#8(r)rdQ({*nWqRO_SqxS)qy28Yl1Z>6a|^4?TY89j-xa z#(k_Y&)9fJ>_ct7_XGdH07#R(JG<7@#|v&so#vbDgXa-bz26*n#bsiH1$LRl?xBd7 z^G)qS|DX}}4x{cLX}%a=moIVsq1S2>*(5TpF^1MHeMz4hbqlnZv9=x%I(1zkx6uE= z7YR7mW=`&W8yyCAS=iKQG(*HZ9DU?;xt*2bOlL)fy|TpNx-7*1ZzQ6vEdIZd?f=j7 z|F41nB{iTCH0hT)qnnhsW~;v!d+a!ogTH!MerLR-94I2m=fIthkA4YW?DgIB{CouG zs$SU7-;9lOJSyaqQ1GH;yhdI=xskmp9Pb*>z$tQ~hmKjnYnWHjp^tc@G~Spj=a5=m z<-qwQ^q%KR_Nr(if&_LK4$&#iIv*eB4<9{l0n4Ja+D-3$j-X0!xGNoh{~ec$#@#rjGNYJ2N-NzNcjE)iG!d_cuBa+4r`MLt5hWAnfE{gFTH-9OL*e9;Wr}JA z;bwK~_H$iSTaF4>RK0UOBhZhQ1_jic-%ik)ul6c+iD6gXGr??1x3=T8=1hD`9bt|+b6L>|&wH=5 zWJnS(f9d+Am@lGDV2_0aPQ~FwytJ|mFWh(8DF%-8Vx^RDv=ajH5_+7iLA?ksurF24 zq%{c(R0R57qT8~gk5=IX6KFCzk+TwSzsIQ;(l|P>*0B=D-&U2|U3L7lF!0>>{3SKn z5}Xc&x7nBDgrq7bv=Ovg9XnJ5$BeX4lfLdU_;5!hAE3TJU8PPD5POXcHupl#3%>DUVJQ0D;?P(u>g zf4u3SzMy|FESJaxq4)SXY&bBYniQUVRs;@NbKB8g^5KT2JkVpu`PQml^^4l1^S&eg z%Iwvo`!Ybayi_c{8>SekK@Ujb^q;zNCr(6x5nHdjPY!wuD> zBck2@wHqAeIKfozE<^3HTB~Enzu?f2P~+5Q&`E&os5;bKpJVP!xAP;)m2BC$n|~=xTrdvf5MHtQ)ALM)%L*?T_mUnm4i_)VUAW*f zQM~MeJp;xbQ&UdZFqk6qgM@Hy8%}tlV>f9arO7GuDNb51aomLiewh3himdnL36yb~e_6QjEprqKytc`d{r5&8DuW z{Mlspf?@>0TY$k%QD-=d6ayj-N43K-LOr41T8|)jDc%rOoPG&j_C~p4a@JgS?itJ} z7#Q*}-f!NQ7I=lK2;s|1OWSX(>sW&<6|3pkFtM5r%BsMT$i;V~E7GX~^1)fKAI@tY zMbb4ZEzD0l#7Lq9;5(wVLuM~bs5&Pdq!=2D)g&{N^vcOEE(cQ&C-q zW>OgK3Ue0~n$!fVoK+!nj-A{awi;9cq%2@fFp8r(K4h&1Pe5GRl-?^O4+F&Mx zO6hmp#9n1DgB8UO0ECv2*%u{Jh;UV6Sb<4M{sLx+mxgU#D~VVNAUpZIIN1N7%=`rK9oB{E3B2pk{9lB%*dJ&PpjCP>f9oH%ihj$?IXpxNQ9#;glBXe=Ci z4c|MP$lwCg0vxZp(naniJf=L!KNLw2vjpxn66y4BYCPtx5i>BCt6Pcr8;%)d?E~L; zaqV500)h-Xp&sXB)8x|`#UXqn6_6ZKDLA;&#pJ{!E&_397Gswcix{HGnNkvV5G*2B zg4rm7h*}|zQwmDcJ7-;~6GzjF#U%Jtjo_BeMsbK?Io^s7u~r>+=@<{+jJgh$!|OqT zO@crYJYy<>`Mk5jQR#-y0&Wa`>MY!AIJ_27`MJ7SGr)=ZW*LprEHs%5(o+R2`d${!4zF%ifnK%6)lCxG&>a%sS{jY5+T%62nOY-$OMH zG`@shtrnXF>=a^%f4QR$jZiKX(ea)9hUVIkNO(v{Khn{fEC=|r5i49*QLU`1Hb>jr*2dzBT1)zDmDbUUYX;V>t0?2HHT&85@!2MF(VmHH^oV&$iISCwb&u2wc|Xj z)9@jInx39B@nK9x3pR}sce(5<(J2slyvQBa#2i=rn2PgalZt@2Dx9MDsG2fTbCE@6 zJQcwqsAft8SDxA;7aNqq*(u$HSmgbhgb`gYU2bLilDjLNgsP55J&icN_;^A>aM|Th zSwhMT%OMV=F2eAO9*QLZTJ$4%BzG0gV3oPOfIO;Onad$+9#ss793&1yI(&8>g^mb0 z=SD5{c?c5MVU#yybX9e6RHNYhb4CXm1qoI9| zrh!A|p`SsjLh3Brc_cXW7atd1%EF92d;oiL@$mw22N zc7=KP(?UfxiTPk1N4S$LbA?UPsVWiIW@QrgE2+eW`2``dArBd`$p(WGRnU+`#e<-PPY8zNuN=NYTA#K~#-mlZ;qru@?o$7ryD&IBW`u5pQ6`<59}?$^aQ6LtIWE-b#d8y%9S#QH!NRZ2Z!YLb4g_|!Y;MW zqT{LS5FQsdxmJpCL{2f<*X}B*bBeOjso1_4zMR}fz6B_x+Oyv4+7EQ(;L0+oRTr7yLwQ&9Bja6N%L-h->1MG$vTz!%ILw4BNthB}QZG6q{zY^~eD_Ac;&3CXL( zEPhC~=q!Q9%~8(As0?MqV)hUXq2vG%1i0=)e|+GiL&0k^6b(n3l)TTZ+Cu$=pW}^+ z;L0PzWD0ee%idFzdCJuAm_pu)%QH`bc`kQ8Es{fJD@Z?du#nCL4Q4$CPE{dQ#b;}t>N?~DJ)e^?`v|ANvqd9X-Ju#lD^xkj zpGeE%4j2=~rIJWaChR7Ho~x@xPZ<;vYgh=Z--kprT6JF9{bd(yV`f%<8MV&k`ZIFp z%H<-bwDMAAq<}O)QIXA32EBvo#%zFlT{WAJ_D@W(dLe@S&e)#NpL8B1P6vJmlV>6D|z=)=$4@4;gC2F+yrdZ zQC_R2PRtc8gs-HQZo^qIPhf~3c7(8n#E{zp6340A*}4TL_$INC)FOx|*%Cn!GeSOt zMTbQ9Qi{y`xhP_b-AdS$tCg20zQ#*w22UIeA&&JsSQl^p~`k~^22o{P_N0W;T(c6cWn9onPpaFppXF zv5rh*1Gr+`E0c3&^u6p|Z{Q6WMv)n8QCd=lYW@$q%Vl4!;9ajUy!4IADybzqg+{4L z*fVGvcpI4cubxc7wMm15YUdWZX;{HR-N|z}2@)ZXJ2aB8K8Lv#8%ofqhZM3xgZyuyt_P?5N> ztAfv>#HbD^PtIr`cpV1$zJ{bA3}NOR9A@N(Cckstr8>FJBMp~b4wI&4&A=Q{9<%S75q#gp$>i_W{mqW!l0JEanj(Igar(#`EDOUSJCInVeoU}2A3lMoxxrAc$CF?;J zNu`zfmL+B}F$;z^UeUCQqz;2U*1(|i!Zjm~t9E;^i;E(my5#vVL}#Kxkh~HScDK(F zF=J+Rin#!k4{27egX+Yo6Pe9V9Uqny#(@g^JtlF=6sEfzrg`XLVPlEwGg8j*L1J4b zB%FNVn8J}X6Q59eCFRmewm65~xo{P^VeeoYoxEvH)`<#-6hl&?gh@b4Vi|^#F|Fqg zTS$y1dXY?(dK&riLPcg?TSY_j9);e(w;rSRmB~HSGz>9&795J?-RJXCHqE3lmBPW1XC&3uKFv*Pn+Rt0)=b zM;NVq{ef|aA7MC9o9ss;;Xw+jh1ZhA7O_H#M%FS!kXg;BOfpI&Z2NT6B25X6UlP}G z%y%vb2~0V#RVHPa`OiAbWmgU(Zp^aLPEoXaXdjIHyP$uM(-9HMA>!uWBdFMi^uwO8 zpMs6}p-sLp_Q-f=!v+?}3v=hu-UU-0^>!!;=6;2NURzZf5^QXEWgBzJY^MzCJfmlA&qfe2G@N-Hu4*`hNngSI#atg=eN3yzku^1M zya~n<$rD*hXfro8NuOy2^(3rr(eT9eE9DEZLze_ss4wtZAE2v1x-TY ub?wWa7oT6=ejQ>Z3MYc`!pYzu;aKoW!5>T&4hLg}(?J!1fALa_`2PdIDNxD) literal 0 HcmV?d00001 diff --git a/utils/lotek/lsttest.exe b/utils/lotek/lsttest.exe new file mode 100644 index 0000000000000000000000000000000000000000..48fe66ba1ca57e1847dce96de457207adfb49a32 GIT binary patch literal 7536 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 IBVFwGKMX?(c>n+a literal 0 HcmV?d00001 diff --git a/utils/lotek/mpled.dat b/utils/lotek/mpled.dat new file mode 100644 index 0000000000000000000000000000000000000000..8d1b93b6ac31e6298c25a7b2f8bfb9b7d2588205 GIT binary patch literal 2703 zcmeHIKX21O6hAw4TBR9}3Ry_C4sfFgMU9Y)9@~Pk(FuKd&R=66z@fTH)Mkp?F@dh zy)5HDultY>y54TYr?ZkD5%+?qpGgT0LeBhNIw~9<4yWnjT^#v2`FzQE7}0*p9*;N+ zy?!dkm%SZpoA=y?{h(o3uKC1hwi>46w%Ycl={T-qw>!dt8YrN1E_M5auVHu0hpuH? zM$?>yB6X5dy|8JDXI{aTY(0$2+N zUcl04^u3mpfAPG7>FZO1Drgxg@)6nA6C_LMh**D6yti^X=wQCpMc0a!?e(e8#xxvo zt>Zlp!oldZHu89IKuNu}4oda=ch|MYlm}xvqC{)5?mmp=7XAC6tDqt@@-g|Pi$G%} z9}{^^pgZwfd`*_vRS*XMI%c!wPG2ZH9-QPGu&l}zR02+w{D8PtffJB??S??&gc2&i z-oe6TZyDuZ{K+6*ER@Kn6VH~w?u$4f;Z(^`u)ujD29>xA!cXDfj$^i6BXLkrhh5ef7zh2HDxX+5$(3i9*j$DNhLa*N3N2kTah6nTr3 PA>ITb`MRFexQKoOt)wPQ literal 0 HcmV?d00001 diff --git a/utils/lotek/mpled.old b/utils/lotek/mpled.old new file mode 100644 index 0000000000000000000000000000000000000000..b7015c27109ea21b863a3a6f2ebc4049dbb81555 GIT binary patch literal 2943 zcmWepzyd_Dh$)CT7zbd8V^@ix3@9+F5-n6n2$000qQpvc?MbQWnR)1f$%)0OXkrQ? zDVe$GVhSRu6`3XIq9SRfdC4W2`6$Mc;Lgl6bQ1?W-V2KIlT%Yli;zPFyN`-ei%WCR zf<&aaq$o2l9o1JNC6xup#(`x;O7pOUXIW-ZNoisZihhyuqRf)i9F#DoGVaDNvwJ)oGodr+j20*D2|48#Fxbn}cH14CUyT}d1grKJT-=0K9skCBmqfsrFMEiFDbHLnyU@q;+18j0nxlqX_lFtFLg znt-Z~5jj_*N|DQR0D2n;0|ElbHDNgDW1PU4@QP8JL61S6oeNLG{d)Mt>bJ!#Q7>n| z?KTr&ur?E7C}n<8`Kb9APbZMybEEG-`}Y@#?+<@Jc!04);6)usu?%`f^>PgbCjwB? z{oHLQz@WDj0S~|U2)5zj+wSi`W37S4)^ohr_P+Tz&+GTi?|C}y#L&$P0cTr~X`Ob{ z7+z?+iPKvbs+;Z0oRqnF+H;=+Po{Cy1+=6AG; z2?+A{at(o$xiQYJej!1Q;DRrl>trQ|9Gg6Q`}g)!4Nn;xo-tZ|E!E(9TYjqBhokY} ze|xp=P>#k!|Lv_$l?pZ=V{1OnCXaBRYlNe3fRAf%jE|#JB*@PoN5-;s`m!8%Wny4B z&dR{h{XHJ+>XUEwc`>}W{N}$eNB8%`;rqMbp@JwlOYep4_hLBi$_3Qs!r{>!!`AJ? z(jCIIg0Y0%;o|FyH!t40_@mR6qxtv0BIcj3ErWKHZutIq?~QQgSH;YG|Nrm4Y<%GR zR|$msAO%T?i;)S)VNmxmNyo5AyRf+)21W4;9frdf?i4FrxKJdtfSX~3K&kX=&TmJU zN?%>LQzX#+Z{NH97!?mv_`POsIK$YX#>-&*_GRX$1-uL^m`Yh2p6mySJAk+jAnw1{ zcYw-XU;lQbp_Hc?BmD)q2Kk19w6x*L?-h)t80LWsQfR>mOnso>H-3AZZ4odh1Jm3)o^DqT hZ5NKk3mCdZyM39uV_CXg*=pIkOF3RUO|W)h0{|+w8F>Hz literal 0 HcmV?d00001 diff --git a/utils/lotek/mploged.exe b/utils/lotek/mploged.exe new file mode 100644 index 0000000000000000000000000000000000000000..f7c5e2d10b375c9edc1f212de74e7f1fcb349cde GIT binary patch literal 98944 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 z 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 SKS3}Hm)Qx}--nAH#r`*6K=IZ9 literal 0 HcmV?d00001 diff --git a/utils/lotek/ne2lotek.doc b/utils/lotek/ne2lotek.doc new file mode 100644 index 0000000..ed157e3 --- /dev/null +++ b/utils/lotek/ne2lotek.doc @@ -0,0 +1,22 @@ + Ne2Lotek Warszawa 1990 Michal Pakier + + Program sluzy do zamiany plikow z formatu tworzonego +przez Norton Edytor na format zrozumialy przez edytor srodowiska +loglanowego LOTEK. Norton Edytor zamienia kazde 8 spawcji wystepujacych +po sobie na znak ascii o kodzie 9 . Program Ne2Lotek wykonuje czynnosc +odwrotna. + + Program wywoluje sie w nastepujacy sposob: + +NE2LOTEK par1 + + par1 - nazwa pliku , ktory ma byc poddany konwersji. + + Pracujac w srodowisku LOTEK mozna wstawic program Ne2Lotek +do okienka EXECUTE. Wtedy bedziemy mogli uszlachetniac pliki nie wychodzac +z edytora. Robi sie to wpisujac w programie LOTEKINS w opcji tworzenia +okienka w wybranej linii : + + C Convert NE to LOTEK ³ ne2lotek ! + + diff --git a/utils/lotek/ne2lotek.exe b/utils/lotek/ne2lotek.exe new file mode 100644 index 0000000000000000000000000000000000000000..d05428521ce598f90f202f089872060a0e0fea93 GIT binary patch literal 10160 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 literal 0 HcmV?d00001 diff --git a/utils/lotek/noname.ltk b/utils/lotek/noname.ltk new file mode 100644 index 0000000000000000000000000000000000000000..b111b1211c6ba5927dc7ea27590b39d77d7e6096 GIT binary patch literal 13 QcmZQ%U}R!sU}OLj003D43jhEB literal 0 HcmV?d00001 diff --git a/utils/lotek/pllotek.hlp b/utils/lotek/pllotek.hlp new file mode 100644 index 0000000..2728c61 --- /dev/null +++ b/utils/lotek/pllotek.hlp @@ -0,0 +1,566 @@ +(* Loglanizator Tekstowy wersja 1.0 1990 Warszawa Michal Pakier *) +===============REKORD 1=======================================|=============== ++ 22 + Obsluga edytora LOglanizator TEKstowy wersja 1.0 + +^v<>.RUCHY KURSORA|O JEDNO SLOWO |F2.NAGRANIE PLIKU NA DYSK +PRZESUWANIE TEKSTU|^>.........W PRAWO|F3.ROZNE OPERACJE PLIKOWE + O LINIE : |^<..........W LEWO|F4....WYSZUKIWANIE BLEDOW +^U..........W GORE| WZGLEDEM WYZSZEJ|F8....PROGRAMY POMOCNICZE +^D...........W DOL| LINII|F9....KOMPILACJA PROGRAMU + O STRONE : |^N.........W PRAWO|F10..WLACZANIE/WYLACZANIE +PgDn........W GORE|^P..........W LEWO| WYSWIETLANIA MENU +PgUp.........W DOL|------------------+------+------------------ +ZMIANA LINII |^K.......OPERACJE BLOKOWE|Enter...NOWA LINIA +^PgDn.....POCZATEK|^Q.WYSZUKIWANIE I ZAMIANA|^Y.KASOWANIE LINII + TEKSTU|^J....SKAKANIE PO TEKSCIE|KASOWANIE ZNAKU +^PgUp.......KONIEC|^W.....OPERACJE NA OKNACH|BackSpace...W LEWO + TEKSTU|^V...........MAKROROZKAZY|Del........W PRAWO +^Home.....POCZATEK|-------------------------+------------------ + OKIENKA|^A....................KASOWANIE LINII W LEWO +^End........KONIEC|^S...................KASOWANIE LINII W PRAWO + OKIENKA|F1..........ZAWSZE WYJASNIA CO MOZEMY ZROBIC +------------------+-------------------------------------------- +Tab......PRZESTAWIA KURSOR POD NASTEPNE SLOWO,PRZESUWA TO CO ZA +^T.........................KASUJE SLOWO WSKAZYWANE PRZEZ KURSOR +===============REKORD 2=======================================|=============== ++ 11 + INFORMACJA O POSLUGIWANIU SIE HELPEM. + + W kazdej sytuacji po nacisnieciu klawisza F1 mozemy otrzymac +informacje o aktualnie dostepnych opcjach. Na wyswietlonym +czesto moze byc wspomniane o mozliwosci uzyskania dokladniej- +szych informacji na podany temat. Uzyskuje sie ja przez nacis- +niecie jednego z klawiszy {0,1,2,3,4,5,6,7,8,9},co jest przed- +stawione na ekranie przez wypisanie nazwy danego klawisza w na- +wiasach trujkatnych. + Esc opuszczenie helpa + F1 przejscie do glownego okienka helpa +===============REKORD 3=======================================|=============== ++ 8 4 + Nagrywanie pliku na dysk (F2,F3S) + +Moze sie zdarzyc, ze z jakiegos powodu nie mozna nagrac pliku +w katalogu, z ktorego go wgralismy. Wtedy nalezy przejsc (F3 L) +do katalogu,w ktorym mamy wszystkie prawa i tam zgrac nasz plik +opcja F3 W. + +Aby dowiedziec sie wiecej o operacjach plikowych nacisnij <0> +===============REKORD 4=======================================|=============== ++ 15 23 3 24 25 26 41 + Operacje plikowe (F3) + +Przy pomocy znajdujacych sie tu funkcji mozemy wybrac dowolny +plik do edycji. +Mamy do dyspozycji nastepujace funkcje: + + L Ladowanie pliku z dysku <0> + S Nagrywanie pliku na dysk <1> + N Rozpoczynanie edycji nowego pliku <2> + W Zmiana nazwy pliku <3> + P Ostatnio uzywane pliki <4> + O Rozne opcje <5> + G Informacje o edytowanych plikach i ilosci + wolnej pamieci. + Q Wyjscie z programu +===============REKORD 5=======================================|=============== ++ 16 + POPRAWIANIE BLEDOW + +Ta opcja ulatwia poprawianie bledow w programie. W najnizszej +linii pojawia sie numer linii, w ktorej wystapil blad, numer +bledu i krotki opis. Kursor automatycznie ustawia sie w miejscu +wystapinia. Dla niektorych bledow wskazuje dokladnie wiersz +i kolumne,dla innych tylko wiersz i wtedy ustawia sie w pierw- +szej kolumnie. Jesli ustawilismy opcje wyswietlania menu (F10) +to nad linia z opisem bledu pojawia sie sciagawka o sposobie +przegladania bledow.Dostepne sa nastepujace funkcje: + Ctrl F5 - Przejscie do pierwszego bledu + Ctrl F6 - Przejscie do ostatniego bledu + Ctrl F8 - Przejscie do nastepnego bledu + Ctrl F7 _ Przejscie do poprzedniego bledu + Ctrl F10 - Koniec poprawiania bledow +Ponowne wcisniecie F4 powoduje wyjscie z opcji. +===============REKORD 6=======================================|=============== ++ 8 + ZMIANA AKTUALNEGO OKNA + + Dzieki tej funkcji mozemy zmienic okienko robocze. +Mamy do wyboru nastepujace funkcje: + F Kasuje wszystkie inne okienka widoczne na ekranie. + H Przechodzimy do okienka z baza danych o Loglanie. + A Przechodzimy do okienka dodatkowego + M przechodzimy do okienka glownego. +===============REKORD 7=======================================|=============== ++ 17 + PRZECHODZENIE DO PROGRAMOW POMOCNICZYCH + +Ta opcja umozliwia wykonywanie pewnych programow, bez wycho- +dzenia z tego prograwu do systemu.To okienko mozemy zdefiniowac +sobie sami w czasie instalacji edytora.Umozliwia ono miedzy +innymi wykonywanie pewnych operacjii na edytowanym pliku(nazwa +pliku jest umieszczana w parametrach wywolanego programu). +Jako jedna z opcji mozna umiescic program LOTEKINS co pozwala +na zmiane tego okienka w trakcie pracy.Wywolanie opcji tego +okienka moze byc umieszczone w makroinstrukcji +(Przyklad: Jesli mamy komputer z dwoma monitorami i zdefiniuje- +my instrukcje:C COLOR (mode co80) i M MONO (mode mono) +to makroinstrukcja @8M@5H@5F spowoduje,ze bedziemy mogli +ogladac baze danych na moanitorze z karta Hercules. + @8C@5M@5F spowoduje,ze bedziemy mogli +edytowac plik glowny na ekranie kolorowy(ale baza danych nie +zniknie z ekranu monochromatycznego) +===============REKORD 8=======================================|=============== ++ 11 36 + KOMPILOWANIE PROGRAMU + +Tutaj mamy nastepujace opcje: + L: Pass 1 Pierwszy przebieg kompilacji (program Loglan) tu + sa miedzy innymi wykrywane popelnione przez nas bledy (F4) + G: Pass 2 Drugi lub pierwszy i drugi przebieg kompilacji + (program Gen) tu jest generowany gotowy do wykonania program + R: Run Wykonywanie programu (lub takze kompilacja). + D: Debuger Najpierw wykonujemy program,a potem mozemy prze- + sledzic instrukcja po instrukcji jak przebiegalo to wykonanie + O: Options<0> Tu ustawia sie rozne opcje zwiazane z kompilacja +===============REKORD 9=======================================|=============== ++ 17 27 28 29 30 31 32 33 34 35 + OPERACJE BLOKOWE + +Po nacisnieciu Ctrl_K wybieramy klawisz odpowiadajacy intere- +sujacej nas funkcji.Jesli przez 2 sek. tego nie zrobimy to +pojawi sie ramka z wypisanymi wszystkimi opcjami. + +Mamy do dyspozycji nastepujaca funkcje: + + K,B,T,L -zaznaczanie bloku <0> + Y -kasowanie bloku <1> + C,V -zwyczajne przenoszenie bloku <2> + S,M -przenoszenie z wyrownywaniem <3> + R,W -blok z dysku i na dysk <4> + U,I -przesuwanie bloku <5> + H -chowanie bloku <6> + F -blok w ramke <7> + O -opcje <8> +===============REKORD 10=======================================|=============== ++ 13 37 38 39 40 + OPERACJE KONTROLOWANEGO PRZEMIESZCZANIA SIE PO TEKSCIE + +Po nacisnieciu Ctrl_J wybieramy klawisz odpowiadajacy intere- +sujacej nas funkcji.Jesli przez 2 sek. tego nie z +pojawi sie ramka z wypisanymi wszystkimi opcjami. + +Mamy do dyspozycji nastepujace funkcje: + + S -ustawienie miejsca dla skoku <0> + R -powrot do ostatnio ustawionego miejsca <1> + J -skok do ostatnio ustawionego miejsca <2> + L -skok do podanej linii + B,K -skoki do poczatku i konca bloku <3> +===============REKORD 11=======================================|=============== ++ 17 15 16 17 18 19 20 + OPERACJE WYSZUKIWANIA I ZAMIANY SLOW + +Po nacisnieciu Ctrl_Q wybieramy klawisz odpowiadajacy intere- +sujacej nas funkcji.Jesli przez 2 sek. tego nie zrobimy to +pojawi sie ramka z wypisanymi wszystkimi opcjami. + +Mamy do dyspozycji nastepujace opcje: + + F -znajdz podane slowo <0> + A -znajdz slowo i zamien je na inne <1> + C -zamien znaki <2> + K -zamien slowa kluczowe <3> + T -znajdz slowo wskazywane przez kursor <4> + R -znajdz i zamien slowo wskazywane przez kursor <5> + +UWAGA:Naciskajac Ctrl L mozesz powtorzyc ostatnio wykonywana + funkcje wyszukiwania i zamiany. +===============REKORD 12=======================================|=============== ++ 13 14 + SPIS TRESCI WIADOMOSCI O LOGLANIE + + Kazda linia jaka widzisz na ekranie oznacza jakis tekst. +Podkreslenie oznacza linie,ktora mozna aktualnie wybrac. + + Enter -wybranie aktualnie wskazywanej linii + kursor w gore -poprzenia linia + kursor w dol -nastepna linia + Ctrl PgUp -do poczatku spisu + Ctrl PgDn -do konca spisu + PgUp,PgDn -o strone w gore lub w dol + Tab -wybieranie roznych innych rozdzialow <0> + Ctrl_Q_F -wyszukiwanie podanego slowa +===============REKORD 13=======================================|=============== ++ 11 12 14 + TRESC PODROZDZIALU + + Enter -powrot do spisu tresci <0> + Tab -wybieranie roznych innych rozdzialow <1> + Up,Down,Left,Right -przemieszczanie kursora + Home,End -do poczatku i konca linii + Ctrl PgUp -do poczatku tekstu + Ctrl PgDn -do konca tekstu + PgUp,PgDn -o strone w gore lub w dol + Ctrl_K_B,K,L,T -zaznaczanie bloku + Ctrl_Q_F -wyszukiwanie slowa +===============REKORD 14=======================================|=============== ++ 9 + WYBOR ROZDZIALU INFORMACJI O LOGLANIE + + Na ekranie widzimy okienko z wypisanymi nazwami rozdzialow +jakie z niego mozemy otrzymac.Kursorami w gore i w dol wedru- +jemy po okienku Home i End przenosi nas na poczatek lub koniec. +Enter pozwala wybrac wskazywany rozdzial i odrazu przechodzimy +do niego.Kursorami w lewo i w prawo przechodzimy do sasiednich +okienek z innymi rozdzialami.Esc powoduje powrot do ostatnio +ogladanego rozdzialu. +===============REKORD 15=======================================|=============== ++ 13 + (F) SZUKANIE SLOWA W TEKSCIE + +Najpierw podajemy tresc slowa, ktore chcemy znalezc (Find :?). +W nastepnej kolejnosci czytane sa opcje , a potem nastepuje +szukanie.Jesli znaleziono podane slowo to kursor ustawia sie na +nastepnej pozycji za nim. +Dzialaja nastepujace opcje : + G.........Szukanie rozpocznie sie na poczatku lub koncu tekstu. + B.........................................Przeszukiwanie w tyl. + n............................Szukanie az do n-tego wystapienie. + U...........................Utozsamianie duzych i malych liter. + W.........................................Szukanie calych slow. + L.........................Szukanie wewnatrz zaznaczonego bloku. +===============REKORD 16=======================================|=============== ++ 16 + (A) ZAMIANA WYSTAPIEN PODANEGO SLOWA W TEKSCIE + +Najpierw podajemy tresc slowa, ktore chcemy znalezc. (Find :?) +Potem podajemy na co chcemy zamienic to slowo. (Replace with :?) +W nastepnej kolejnosci czytane sa opcje , a potem nastepuje +szukanie.Jesli znaleziono podane slowo to kursor ustawia sie na +tym slowia a w najwyzszej linii ekranu pojawia sie pytanie, czy +zamienic to slowo,czy tez nie. +Dzialaja nastepujace opcje : + G.........Szukanie rozpocznie sie na poczatku lub koncu tekstu. + B.........................................Przeszukiwanie w tyl. + n...............................Zamiana pierwszych n wystapien. + U...........................Utozsamianie duzych i malych liter. + W.........................................Szukanie calych slow. + L.........................Szukanie wewnatrz zaznaczonego bloku. + N...........Zamiana bezwarunkowa (bez pytania za kazdym razem). +===============REKORD 17=======================================|=============== ++ 11 + (C) ZAMIANA ZNAKOW + +Ta funkcja umozliwia zamiane duzych liter na male lub odwrotnie +Dzialaja nastepujace opcje : + D.......................................Zamiana na duze litery. + S.......................................Zamiana na male litery. + G.........Szukanie rozpocznie sie na poczatku lub koncu tekstu. + B.........................................Przeszukiwanie w tyl. + L.........................Szukanie wewnatrz zaznaczonego bloku. + C............................Zamiana tylko wewnatrz komentarzy. + T......................................Zamiana tylko w tekscie. +===============REKORD 18=======================================|=============== ++ 10 + (K) ZAMIANA SLOW KLUCZOWYCH + +Ta funkcja umozliwia nam zamiane wszystkich slow kluczowych +jezyka Loglan. +Dzialaja nastepujace opcje : + D.......................................Zamiana na duze litery. + S.......................................Zamiana na male litery. + G.........Szukanie rozpocznie sie na poczatku lub koncu tekstu. + B.........................................Przeszukiwanie w tyl. + L.........................Szukanie wewnatrz zaznaczonego bloku. +===============REKORD 19=======================================|=============== ++ 12 + (T) SZUKANIE SLOWA WSKAZYWANEGO PRZEZ KURSOR + +Najpierw podajemy opcje , a potem nastepuje szukanie. +Jesli znaleziono podane slowo to kursor ustawia sie na +nastepnej pozycji za nim. +Dzialaja nastepujace opcje : + G.........Szukanie rozpocznie sie na poczatku lub koncu tekstu. + B.........................................Przeszukiwanie w tyl. + n............................Szukanie az do n-tego wystapienie. + U...........................Utozsamianie duzych i malych liter. + W.........................................Szukanie calych slow. + L.........................Szukanie wewnatrz zaznaczonego bloku. +===============REKORD 20=======================================|=============== ++ 15 + (R) SZUKANIE I ZAMIANA SLOWA WSKAZYWANEGO PRZEZ KURSOR + +Najpierw podajemy na co chcemy zamienic to slowo. +W nastepnej kolejnosci czytane sa opcje , a potem nastepuje +szukanie.Jesli znaleziono podane slowo to kursor ustawia sie na +tym slowia a w najwyzszej linii ekranu pojawia sie pytanie, czy +zamienic to slowo,czy tez nie. +Dzialaja nastepujace opcje : + G.........Szukanie rozpocznie sie na poczatku lub koncu tekstu. + B.........................................Przeszukiwanie w tyl. + n...............................Zamiana pierwszych n wystapien. + U...........................Utozsamianie duzych i malych liter. + W.........................................Szukanie calych slow. + L.........................Szukanie wewnatrz zaznaczonego bloku. + N...........Zamiana bezwarunkowa (bez pytania za kazdym razem). +===============REKORD 21=======================================|=============== ++ 13 29 30 + OPERACJE WYMIANY BLOKOW MIEDZY OKNAMI TEKSTOWYMI I INNE + +Po nacisnieciu Ctrl_W wybieramy klawisz odpowiadajacy intere- +sujacej nas funkcji.Jesli przez 2 sek. tego nie z +pojawi sie ramka z wypisanymi wszystkimi opcjami. + +Mamy do dyspozycji nastepujace funkcje: + C -przekopiowanie bloku z drugiego widocznego na ekranie okna + V -przeniesienie bloku z drugiego widocznego na ekranie okna + S -przekopiowanie z przesunieciem z drugiego okna + M -przeniesienie z przesunieciem z drugiego okna + +Patrz C,V <0> S,M <1> +===============REKORD 22=======================================|=============== ++ 19 + DEFINIOWANIE MAKROROZKAZOW + +Kazdemu klawiszowi odpowiadajacemu literze,cyfrze lub klawiszo- +wi funkcyjnemu mozemy przyporzadkowac makroinstrukcje. +Makroinstrukcje sa uruchamiane przez jednoczesne nacisniecie Alt +i odpowiedniego klawisza. +W definicji makrorozkazu moga wystapic oprucz zwyczajnych znakow +ASCII zastepujace symbole: + ^.............Oznacza Ctrl + nastepny klawisz (A..Z oraz 0..9) + &..............Oznacza Alt + nastepny klawisz (A..Z oraz 0..9) + @........Oznacza klawisz funkcyjny.Nastepnym znakiem moze byc: + 1..0 - F1..F10 ³ <>^v - kursor ³ H - Home ³ E - End ³ + U - PgUp ³ D - PgDn ³ I - Insert ³ L - Delete ³ + S - Esc ³ B - Backspace ³ ³ ³ + C - Enter ³ ³ ³ ³ + #..Nastepny znak po ty nie jest interpretowany np.## oznacza # +Nawiasy klamrowe oznaczaja powtorzenie ich zawartosci pewna +liczbe razy . Np. {^C(* *)}12 spowoduje utworzenie 12 nowych +linii zawierajacych napis "(* *)" +===============REKORD 23=======================================|=============== ++ 17 + (L) WGRYWANIE PLIKU Z DYSKU + +Pojawia sie okienko,w ktorym mozemy podac nazwe pliku,lub maske +opisujaca grupe plikow. Jezeli podamy nazwe to dany plik jest +wgrywany ( jesli nie istnieje to rozpoczynamy jego edycje ). +Jezeli podamy maske to pojawiaja sie wszystkie odpowiadajace +jej nazwy plikow oraz podkatalogow. +>>>Mamy dostepne nastepujace klawisze: + Esc.........Powrot,bez wczytania pliku.Zostajemy w aktualnie + ustawionym podkatalogu. +   < >......................Przemieszczanie sie po okienku. + Enter.........Jesli wskazywana jest nazwa pliku to dany plik + jest wczytywany i mozemy rozpoczac jego edycje. + Jezeli wskazywany jest podkatalog to jest on + dodawany do aktualnej sciezki. + PgUp,PgDn......Przejscie do poprzedniej lub nastepnej strony + (w okienku miesci sie tylko 20 nazw). +===============REKORD 24=======================================|=============== ++ 5 + (N) ROZPOCZECIE EDYCJI NOWEGO PLIKU + +Czysci bufor tekstu i rozpoczyna edycje pliku o domyslnej +nazwie NONAME.LOG .Przy nagrywaniu na dysk program bedzie pro- +ponowal zmiane tej nazwy na inna. +===============REKORD 25=======================================|=============== ++ 8 + (W) ZMIANA NAZWY AKTUALNEGO PLIKU + +Zmienia nazwe aktualnie edytowanego pliku i nagrywa go na dysk +w aktualnym katalogu (ustawianie aktualnego katalogu funkcja L) +Jesli byl juz plik o takiej nazwie to pyta, czy go skasowac +UWAGA: Mozemy podac od razu nazwe nowego pliku lub maske +i wtedy zastepujemy aktualnie edytowanym plikiem jakis juz +istiejacy na dysku (Wybieranie tak jak w opcji L). +===============REKORD 26=======================================|=============== ++ 4 + (P) OSTATNIO UZYWANE PLIKI + +Pojawia sie okienko z ostatnio wgrywanymi plikami ponumerowanymi +od 0 do 9 mozemy wybrac jakis plik lub przejsc do opcji Load (L) +===============REKORD 27=======================================|=============== ++ 6 + ZAZNACZANIE BLOKU + + B -zaznaczenie poczatku bloku + K -zaznaczenie konca bloku + T -zaznaczenie slowa,na ktorym stoi kursor jako bloku + L -zaznaczenie linii,na ktorej stoi kursor jako bloku +===============REKORD 28=======================================|=============== ++ 3 + KASOWANIE ZAZNACZONEGO BLOKU + + Jezeli zaznaczyles blok to mozesz go skasowac. +===============REKORD 29=======================================|=============== ++ 15 30 + (C,V) KOPIOWANIE LUB PRZENOSZENIE ZAZNACZONEGO BLOKU + + Funkcja.C.kopiuje zaznaczony przez nas blok (Ctrl K + B,K,T,L) +do miejsca w tekscie rozpoczynajacego sie pozycja kursora. +Pierwsza linia bloku bedzie przesunieta tak , aby jej poczatek +znajdowal sie w pozycji kursora natomiast pozostale linie nie +zostana przesuniete. +UWAGA:Mozna przenosic blok do wnetrza jego samego. + Funkcja.V.przenosi zaznaczony przez nas blok (Ctrl K+ B,K,T,L) +do miejsca w tekscie rozpoczynajacego sie pozycja kursora. +W poprzednim miejscu blok bedzie skasowany. +Pierwsza linia bloku bedzie przesunieta tak , aby jej poczatek +znajdowal sie w pozycji kursora natomiast pozostale linie nie +zostana przesuniete. + ----> Ctrl K S,M <0> +===============REKORD 30=======================================|=============== ++ 18 29 + (S) KOPIOWANIE LUB PRZENOSZENIE BLOKU Z WYROWNYWANIEM + + Funkcja.S. kopiuje zaznaczony przez nas blok (Ctrl K+ B,K,T,L) +do miejsca w tekscie rozpoczynajacego sie pozycja kursora. +Jest jednak inna niz funkcja Ctrl K C. +Wszystkie linie bloku zostana przesuniete tak,aby poczatek +pierwszej linii znajdowal sie w pozycji kursora. +UWAGA:Mozna przenosic blok do wnetrza jego samego. + Funkcja.M.przenosi zaznaczony przez nas blok (Ctrl K+ B,K,T,L) +do miejsca w tekscie rozpoczynajacego sie pozycja kursora. +W poprzednim miejscu blok bedzie skasowany. +Jest jednak inna niz funkcja Ctrl K M. +Wszystkie linie bloku zostana przesuniete tak,aby poczatek +pierwszej linii znajdowal sie w pozycji kursora. +UWAGA:Mozna przenosic blok do wnetrza jego samego. +W tym przypadku spowoduje to, ze blok nie przesunie sie w pionie +tylko w poziomie.Jego poczatek ustawi sie w kolumnie kursora. + -----> Ctrl K C,V <0> +===============REKORD 31=======================================|=============== ++ 10 23 + (R,W) WCZYTANIE I ZGRYWANIE BLOKU Z DYSKU + + Funkcja.R. umozliwia dolaczenie do naszego tekstu dowolnego +pliku z dysku.Plik jest dolaczany w miejscu wskazywanym przez +kursor,bez wyrownywania (tak jak Ctrl K C). +Pojawia sie okienko,w ktorym mozemy podac nazwe zbioru lub maske +i wtedy wybieramy odpowiedni plik tak jak w funkcji F3 L <0> + Funkcja.W. umozliwia zgranie zaznaczonego bloku na dysk. +Pojawia sie okienko,w ktorym mozemy podac nazwe zbioru lub maske +i wtedy wybieramy odpowiedni plik tak jak w funkcji F3 L <0> +===============REKORD 32=======================================|=============== ++ 8 + (I,U) PRZESUNIECIE BLOKU O JEDEN ZNAK W PRAWO LUB W LEWO + + Funkcja.I. przesuwa wszystkie linie zawierajace blok o jeden +znak w prawo.Przesuwane jest takze to co jest przed blokiem +w pierwszej linii bloku oraz za blokiem w ostatniej linii bloku + Funkcja.U. przesuwa wszystkie linie zawierajace blok o jeden +znak w lewo.Przesuwane jest takze to co jest przed blokiem +w pierwszej linii bloku oraz za blokiem w ostatniej linii bloku +===============REKORD 33=======================================|=============== ++ 5 + CHOWANIE ZAZNACZONEGO BLOKU + + Wybranie tej funkcji powoduje,ze blok staje sie niewidoczny. +Ponowne jej wybranie ustawia blok taki,jaki byl przed zaslo- +nieciem. +===============REKORD 34=======================================|=============== ++ 6 35 + (F) TWORZENIE RAMKI + + Dookola linii zawierajacych blok tworzona jest ramka. +W opcjach mozemy sobie ustawic wszelkie mozliwe parametry +ramki. + -----> Ctrl K O <0> +===============REKORD 35=======================================|=============== ++ 19 + (O) ROZNE CIEKAWE PARAMETRY + +Te opcje dotycza przede wszystkim ksztaltu ramki ale nie tylko + 3 nastepne linie to wzor ramki. + - lewy gorny , srodkowy gorny , prawy gorny + - lewy , srodkowy , prawy + - lewy dolny , srodkowy dolny , prawy dolny + F.......................................Pierwsza kolumna ramki. + - musi byc z przedzialu 0..255 + - musi byc mniejsza niz ostatnia kolumna ramki + - 0 ma specjalne znaczenie : ramka zacznie sie tam,gdzie + zaczyna sie zaznaczony tekst. + L.......................................Ostatnia kolumna ramki. + - musi byc z przedzialu 0..255 + - musi byc wieksza niz pierwsza kolumna ramki + - 0 ma specjalne znaczenie : ramka zkonczy sie tam,gdzie + zaczyna sie zaznaczony tekst. + T.....Wyrownywanie tekstu w ramce.Moze o n byc z lewej,z prawej + lub w srodku ramki. +===============REKORD 36=======================================|=============== ++ 14 + OPCJE DLA KOMPILACJI + +Tu mozna wplynac na pewne parametry kompilacji i wykonywania +programu. +D: Debug info on/off Wlaczenie powoduje,ze przy wykonywaniu + programu na specjalny plik sa wyprowadzane numery kolejno + wykonywanych instrukcji.Zwalnia to wykonywanie programu ale + umozliwia jego puzniejsze przesledzenie (patrz opcja DEBUGER) +M: Memory ______ Jest to podzielona przez 4 ilosc + pamieci zarezerwowana dla naszego programu.Moze ona przyjac + wartosc od 16384 do 100000. Korzystnie jest ustawiac 16384 + bo wtedy program szybciej sie wykonuje. +C: Cursor on/off Jest to opcja dla koneserow.Wlaczenie + jej powoduje,ze na czas wykonywania programu znika kursor +===============REKORD 37=======================================|=============== ++ 4 + (S) ZAZNACZANIE POZYCJI DLA SKOKOW + +Ta funkcja zapamietuje aktualna pozycje kursora i umozliwia +wykonanie w przyszlosci skoku do tego miejsca. +===============REKORD 38=======================================|=============== ++ 5 + (R) POWROT DO ZAZNACZONEGO WCZESNIEJ MIEJSCA + +Podobnie jak Ctrl J J skacze do zaznaczonego wczesniej miejsca +z ta roznica,ze zanim skoczy zaznacza aktualna pozycje tak , aby +potem mozna bylo do niej wrocic opcjami Ctrl J J/R. +===============REKORD 39=======================================|=============== ++ 4 + (J) SKOK DO ZAZNACZONEGO PRZEDTEM MIEJSCA W TEKSCIE + +Kursor jest przenoszony do miejsca,ktore wczesniej zaznaczylismy +opcja Ctrl J S +===============REKORD 40=======================================|=============== ++ 4 + SKOKI DO BLOKU + + B -skok do poczatku zaznaczonego bloku + K -skok do konca zaznaczonego bloku +===============REKORD 41=======================================|=============== ++ 20 + OPCJE PLIKOWE (F3O) + +Tutaj mozemy ustawiac rozne opcje wplywajace na dzialanie prog- +ramu. + S..Jest to numer linii bedacej granica miedzy okienkami + (np. miedzy plikiem glownym i dodatkowym lub plikiem glownym + i baza danych) + B..Czy maja byc robione kopie bezpiczenstwa plikow. + Jesli jest wlaczone,to przy kazdym nagraniu pliku na dysk + poprzednia wersja tego pliku nie jest kasowana tylko dosta- + je rozszerzenie BAK + D..Opuznienie odswierzania ekranu. + Jesli przez jakis czas (ustawiony w tym miejscu) nie zosta- + nie wcisniety zaden klawisz to na ekranie pojawia sie mru- + gajace niebo. + W..Opuznienie pojawiania sie okienek. + Po wybraniu funkcji edytora pojawia sie najpierw sam naglo- + a dopiero po pewnym czasie jesli nie wybierzemy zadnej + opcji okienko menu.Tutaj mamy mozliwosc ustawic czas,jaki + minie od pojawienia sie naglowka do wyswietlenia okienka. +=============KONIEC============================================|============== + + + + + + + + + + \ No newline at end of file diff --git a/utils/lotek/pllotek.pth b/utils/lotek/pllotek.pth new file mode 100644 index 0000000..ec013b6 --- /dev/null +++ b/utils/lotek/pllotek.pth @@ -0,0 +1,26 @@ +c:\loglan\lotek\ +c:\loglan\lotek\ +LOGHELP.MPH ++ N Norton Commander ++ C Compile ++ S Second Pass ++ R Run (execute) +nc +C:\loglan\exe\loglan ! + c:\loglan\exe\cgen ! +c:\loglan\exe\int ! + +Plik instalacyjny edytora LOTEK +Pierwsza linia jest nazwa katalogu,w ktorym znajduja sie programy: +Lotek.hlp,MPLOGED.exe,lsttest.exe +Druga linia jest nazwa katalogu,w ktorym znajduja sie programy: +prep.exe,logdeb.exe +Trzecia linia jest dokladna nazwa pliku z baza danych (*.hlp) +UWAGA:Trzecia linia musi byc duzymi literami +Nastepne linie sa kolejnymi liniami okienka EXEC +Zaczynaja sie one znakiem + +Trzeci znak w kazdej z tych linii to znak,ktorego nacisniecie bedzie +wywolywac dana funkcje +Po liniach z plusem wystepuja kolejno instrucje jakie maja byc +wykonane po wybraniu tych funkcji.W kazdej z tych linii wykrzyknik +bedzie zastapiony nazwa aktualnie edytowanego pliku diff --git a/utils/lotek/pomoc.txt b/utils/lotek/pomoc.txt new file mode 100644 index 0000000..f51e4d5 --- /dev/null +++ b/utils/lotek/pomoc.txt @@ -0,0 +1,56 @@ + + Uwagi o uzytkowaniu programu LOTEK. + ---------------------------------- + Program wywolujemy uruchamiajac program lotek.exe.(wczesniej musimy w danym +podkatalogu dokonac instalacji lotekins.exe). + +Do dzialania calego srodowiska loglanu potrzebne sa: + + loglan,hgen,cgen,int,hint - kompilator loglanu.Musza byc widoczne tak,jakby + byly w aktualnym katalogu. + + MPloged.exe,lsttest.exe,lotek.hlp - pliki srodowiska ,musza byc w jednym + podkatalogu. + + prep.exe,logdeb.exe - debuger,musza byc w jednym podkatalogu + + logrprt.hlp,loghlp.str - baza danych o loglanie,musza byc + w jednym katalogu + report.hlp - tekst raportu loglanu.Jest uzywany w bazie danych. + Musi znajdowac sie na dysku(ten egzemplarz,ktory + dolaczylem,poniewarz nie ma on niektorych linii + i uzywanie innego pliku z raportem spowoduje ble- + dne dzialanie bazy danych) + + lotek.exe - musi byc widoczny (ten program zarzadza wszystkimi + innymi). + lotek.pth - ten plik jest generowany podczas instalacji(lotekins).Musi on + byc w kazdym katalogu,z ktorego uruchamiamy program + +W trakcie pracy generowane sa w aktualnym katalogu dwa pliki: + praca.bat - jest to plik pomocniczy i mozna na niego nie zwracac uwagi. + mpled.dat - tu jest zapisany aktualny stan programu.Nie nalezy tego pliku + kasowac,jesli chce sie w przyszlosci kontynuowac przerwana + prace + +Dolaczona baza danych jest tylko przykladowa.Maksymalna wersja moze miec 6 +okienek po 22 linii (ta ma 1 okienko z 1 linia) i moze zarzadzac danymi +ze 132 plikow tekstowych dowolnej wielkosci.(Jednoczesnie w pamieci siedzi +tylko to co widac na ekranie). + +Przyklady makroinstrukcji + +begin@C@^@E{@<}5@vend; -wpisanie begin'a i w linii nizej end'a + +(**)@<@< -narysowanie komentarza i ustawienie w srodku + kursora. + +@H(*{*}74*} -wstawienie linii oddzielajacej z gwiazdek + +^KT^QCdl@C^KK^KB -zamienienie slowa wskazywanego przez kursor + na duze litery. + + + + + diff --git a/utils/lotek/praca.bak b/utils/lotek/praca.bak new file mode 100644 index 0000000..be4cfca --- /dev/null +++ b/utils/lotek/praca.bak @@ -0,0 +1,15 @@ + @echo off +cd C:\LOGLAN\LOTEK +c:\loglan\lotek\lsttest LISTFI3.LOG p +loglan LISTFI3.LOG >LISTFI3.err +c:\loglan\lotek\lsttest LISTFI3.LOG l +if errorlevel 1 goto koniec +c:\loglan\lotek\lsttest LISTFI3.LOG p +c:\loglan\lotek\lsttest LISTFI3.LOG c +cgen LISTFI3 >nul +c:\loglan\lotek\lsttest LISTFI3.LOG s +c:\loglan\lotek\lsttest wycurs r +int LISTFI3.LOG +pause +:koniec +cd C:\LOGLAN\LOTEK diff --git a/utils/lotek/praca.bat b/utils/lotek/praca.bat new file mode 100644 index 0000000..8666b63 --- /dev/null +++ b/utils/lotek/praca.bat @@ -0,0 +1,2 @@ +@echo off +cd C:\LOGLAN\LOTEK diff --git a/utils/lotek/prep.exe b/utils/lotek/prep.exe new file mode 100644 index 0000000000000000000000000000000000000000..b2d4d990c7160dc553ce32675af69e9e6f3c4ba2 GIT binary patch literal 18420 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 literal 0 HcmV?d00001 diff --git a/utils/lotek/report.hlp b/utils/lotek/report.hlp new file mode 100644 index 0000000..b64523c --- /dev/null +++ b/utils/lotek/report.hlp @@ -0,0 +1,7110 @@ +1 + + + INSTITUTE OF INFORMATICS, UNIVERSITY OF WARSAW + + + + + REPORT ON THE + + + + + + + + # ###### ###### # ###### # # #### #### + # # # # # # # ## # # # # # + # # # # # # # # # # #### # + # # # # ## # ###### # # # # # # + # # # # # # # # # ## # # # + ###### ###### ###### ###### # # # # #### ###### + + + + + PROGRAMMING LANGUAGE (*) + + + + + + + + + + W.M.BARTOL, P.GBURZYNSKI, P.FINDEISEN, A.KRECZMAR, M.LAO, A.LITWINIUK + + T.MULDNER, W.NYKOWSKI, H.OKTABA, A.SALWICKI, D.SZCZEPANSKA-WASERSZTRUM + + + + + + + + + + + + + + + --------------------------------------------------------- + (*) Supported in part by Zjednoczenie "MERA", POLAND + + + +1 + + + FOREWORD + -------- + + + + We submit to the reader the report of a language whose design is still in + progress. Therefore any remarks and comments are very desirable. They can + be sent to: + + + UNIVERSITY OF WARSAW + INSTITUTE OF INFORMATICS + PKIN 8TH FLOOR + 00-901 WARSAW + POLAND +  + + + + + + The edition has been produced by using the editor program (prepared by + P.Gburzynski, University of Warsaw) on minicomputer MERA 400. This original + Polish minicomputer was used for the first implementation of LOGLAN-82. + + + + Warszawa, June, 1982 +1 - 1 - + + + CONTENTS. + ######### + + List of symbols...................................................3 + + 1. Preface........................................................4 + + 2. The basic characteristics of LOGLAN-82.........................8 + 2.1. Control structure.........................................8 + 2.2. Block structure...........................................11 + 2.3. Procedures and functions..................................13 + 2.4. Classes...................................................14 + 2.5. Prefixing.................................................15 + 2.6. Object deallocator........................................17 + 2.7. Arrays....................................................18 + 2.8. Parameters................................................19 + 2.9. Coroutines................................................20 + 2.10. Processes.................................................21 + 2.11. Other important features..................................22 + + 3. Lexical and textual structure..................................23 + + 4. Types..........................................................26 + 4.1. Primitive types............................................27 + 4.2. System types...............................................28 + 4.3. Compound types and objects.................................29 + 4.3.1. Array type.............................................29 + 4.3.2. Class type.............................................30 + 4.4. Formal types...............................................30 + + 5.Declarations....................................................31 + 5.1. Constant declaration.......................................31 + 5.2. Variable declaration.......................................32 + 5.3. Unit declaration...........................................33 + 5.3.1. Class declaration (introduction).......................33 + 5.3.2. Subprogram declaration (introduction)..................34 + 5.3.3. Block..................................................35 + 5.3.4. Prefixing..............................................36 + 5.3.5. Formal parameters......................................37 + 5.3.6. Unit body..............................................40 + + 6. Static and dynamic locations . Visibility rules................42 + 6.1. Unit attributes............................................42 + 6.2. Protected attributes.......................................43 + 6.2.1. Hidden attributes......................................43 + 6.2.2. Taken attributes.......................................44 + 6.2.3. Legal and illegal identifiers .........................44 + 6.2.4. Close attributes.......................................45 + 6.3. Static location............................................46 + 6.4. Objects....................................................48 + 6.4.1.ements..........................................71 + 9.1. Sequential primitive statements............................71 + 9.1.1. Evaluation statement...................................72 + 9.1.2. Configuration statement................................75 + 9.1.2.1. Allocation statement...............................75 + 9.1.2.2. Deallocation statement.............................83 + 9.1.3. Simple control statement...............................84 + 9.1.4. Coroutine statement....................................86 + 9.2. Compound statements.......................................87 + 9.2.1. Conditional statement..................................87 + 9.2.2. Case statement.........................................89 +1 - 2 - + + + 9.2.3. Iteration statement....................................90 + + 10. Exception handling............................................96 + 10.1. Signal specification.......................................96 + 10.2. Signal handlers............................................97 + 10.3. Signal raising.............................................98 + 10.4. Handler execution.........................................101 + 10.5. System signals............................................103 + + 11. Processes....................................................104 + 11.1. Transition state statement...............................106 + 11.2. Primitive synchronizing statement........................109 + 11.3. Monitors (compound synchronization facilities)...........112 + + 12. Separate compilation of units................................115 + 12.1. Library items............................................117 + 12.1.1. Interface............................................118 + 12.1.2. Using languages......................................121 + 12.1.3. Using externals......................................122 + 12.1.4. Using sl-virtuals....................................122 + 12.2. Linking library items....................................123 + 12.2.1. Connecting the interface.............................123 + 12.3. Binary items.............................................126 + 12.4. Processing libraries.....................................127 + 12.4.1. Recompilation........................................127 + 12.4.2. Insertions and deletions.............................128 + + 13. File processing..............................................129 + 13.1. External and internal files..............................129 + 13.2. File generation and deallocation.........................130 + 13.3. Binary input-output......................................132 + 13.4. Other predefined operations..............................133 + 13.5. Text input-output........................................134 + 13.6. Example of high-level file processing....................136 + + Bibliography.....................................................137 + Index............................................................139 +1 - 3 - + + + List of symbols + *************** + + + + We shall use the following symbols (with indices if necessary): + + A - arithmetic expression, + B - boolean expression, + C - character expression, + D - string expression, + E - arbitrary expression, + F - function/procedure, + G, H - statement (or sequence of statements), + i, j, k, l, u - integer variable or index, + M, N, P, R, S, T - type or unit identifier, + O - object, + Q - constant, + V - valuation, + W - arbitrary identifier, + X - object expression, + Y - arbitrary variable, + Z - simple variable, + Pf - formal parameter, + Pa - actual parameter, + VE - the value of an expression E. +1 - 4 - + + + 1. PREFACE + ########### + + LOGLAN-82 #) is a universal programming language designed at the + Institute of Informatics, University of Warsaw. The shortest, informal + characterization of the language would read as follows. LOGLAN-82 belongs + to the Algol family of programming languages. Its syntax, however, is + patterned upon Pascal's. Many ideas are borrowed from SIMULA-67 [3]. The + language includes also some modern facilities such as concurrency and + exception handling. + + The characteristic programming constructs and facilities of the language + are as follows: + + - a convenient set of structured statements, + - block structure, + - procedures an functions, + - classes, + - prefixing, + - programmed deallocation, + - adjustable arrays, + - formal types and formal procedures, + - coroutines, + - processes, + - encapsulation techniques, + - exception handling, + - separate compilation techniques, + - file processing. + + + LOGLAN-82 history + ----------------- + + In the early seventies the Institute of Mathematical Machines "MERA" + (with two members of the present team of authors) and the Institute of + Informatics of Warsaw University initiated the design of a new high level + programming language. There were two main inspirations for taking up this + research. First the awareness that the SIMULA 67 programming language was a + substantial contribution to the software methodology and second that the + fast development of multiprocessor hardware will change the software + practice. + We began our work with analytical studies, seminars and lectures dealing + with the basic constructs and features of the known programming languages. + This helped us to establish the goals a new programming language should + reach. By then, however, we decided that the design of the programming + language would be a component of a broader software project, called LOGLAN. + + + + + + + + + ------------------------------------------------------------------------- + #) Recently we received information about another LOGLAN - an + esperanto-like language developed in US. +1 - 5 - + + + There is no doubt that the environment in which our investigations have + been carried out has shed a new light on these goals. In particular, the + experience accumulated by a big part of our team in the field of + Algorithmic Logic [15] influenced the form of the solutions accepted. + The first step of our work was finished in 1977 with the report on the + LOGLAN programming language [12]. The report provides a general outline of + a universal programming language. Among its most important features let us + mention a new approach to arrays, assignments, parameter transmission and + parallel computations. This version was not implemented. It constituted the + base for the agreement between the University of Warsaw and the State + Industrial Trust MERA, signed a year later. + A careful analysis of the constructs suggested in the primary project + preceded an actual implementation. With the intention of attaining this, + the interpreter of the language was designed. At that stage a number of + important modifications were introduced to the proposed outline. They + resulted from experiments with the interpreter which proved the usefulness + of some constructs and the uselessness of some others. + At the next stage of research the language was implemented on the + original Polish two-processor minicomputer MERA 400. The design was + restricted in several points because of the implementation constraints. + Some constructs were rejected, the decision concerning some others was put + off until a more elaborate analysis was carried out. + The experience of the team in the field of abstract data types and + computational complexity helped us to solve one of the most fundamental + implementation problems - a proper structure for secure and fast storage + management. In consequence, the language is furnished with a programmed + deallocator which allows the user to design the best strategy of storage + management at run time. + The implementation of unrestricted prefixing needed a completely new + approach. The well-known mechanisms like Dijkstra's display do not allow us + to release the SIMULA restrictions (the most important forbids the use + prefixing at different levels of unit nesting). Such a solution was found + and the LOGLAN-82 users may apply prefixing at an arbitrary level of unit + nesting. + Of the results we have obtained so far let us mention paper [1], which + deals with the principles of an efficient implementation of programming + languages with prefixing at many levels. The paper introduces the + generalized display mechanism and proves the correctness of an + update-display algorithm. A new data structure for efficient and secure + storage management is also provided. + Paper [2] deals with the design and implementation of class Simulation + (improving that provided in SIMULA 67). + The concurency problems are described in the special mathematical model + [19]. The correctness of the monitor implementation is proved in [20]. The + semantics of an assignment statement for subscripted variables is defined + and carefully examined in [21]. Paper [16] describes the semantics of + allocation, deallocation and control statements. + A comprehensive survey about LOGLAN-82 and its applications is supplied + in [8]. Let us mention the close connections between the development of the + language itself and of Algorithmic Logic, see [15, 22, 23, 24, 25, 26]. +1 - 6 - + + + LOGLAN-82 high points + --------------------- + + + - An orderly and intellectually manageable fashion of program design. + + - Clean, modular extensibility (by means of the above mentioned + facilities, in particular by prefixing). An algorithm employing an + abstract data structure can be prefixed by a class realizing that + structure. The class may be programmed by the user himself or by + another user, taken from the system library etc. In this way, + programs may be developed by teams of programmers. + + - An environment for distributed and safe development of large + programs and systems with easy inter-communication between members + of software teams, i.e., different parts of the design are easy to + read, check and modify. The modifications do not entail unexpected + interactions. + + - Possibility of systematic debugging in a way which contributes to + confidence in the overall program correctness. + + - The separate compilation facility. + + - Type checking, especially of references to objects, which + substantially reduces the need for run-time checks and increases the + safety of handling pointers. + + - Efficient storage management by means of well-tailored allocation/ + deallocation operations. + + - Clear visibility rules with the capability of unit encapsulation + techniques. + + - Concurrent computations in which several processes are + simultaneously and independently executed by any number of + processors. The concurrent multiprocessor computations were treated + with due care. We reached the necessary foundations for the + description of atomic operations for the concurrent statements. The + atomic operations may be efficiently implemented in any operating + system kernel. It is well known that concurrent computations have to + be synchronized and scheduled. We do not prejudge which facilities + are to be used for those purposes. In LOGLAN-82 all known + synchronization methods may be declared as predefined classes. For + example, let us mention that it is possible to define: + + - monitoring dialect similar to CONCURRENT PASCAL, + cf.[5], with the main notions: process, monitor, entry + procedure, delay, continue, + - tasking dialect similar to ADA's tasks, cf.[11], with + the main notions: task, accept, select, rendez-vous. + +1 - 7 - + + + First implementation of LOGLAN-82 + --------------------------------- + + + The first implementation of the language was finished in December 1981 on + the two processors Polish minicomputer MERA-400 (uni-bus architecture). The + whole compiler was programmed in FORTRAN IV Standard. The run-time system + and file processing were coded in the Mera Assembly Language GASS. + The implementation team was headed by Antoni Kreczmar (who is the author + of Running System) and included Pawel Gburzynski (File Processing), Marek + Lao (Semantic Analysis), Andrzej Litwiniuk (Code Generation), Wojtek + Nykowski (Parsing) and Danuta Szczepanska-Wasersztrum (Static Semantics). + + + + + Further work on LOGLAN-82 + ------------------------- + + Although we are convinced that LOGLAN-82 will prove to be useful for an + average user, we would like to stress that we were interested mainly in + finding answers to research questions. Our approach is more scientific than + commercial. + Among the studies that are planned for the nearest future, let us mention + further research on LOGLAN-82 itself and on its first compiler. The + portability of the compiler seems to be the main target of our team. + Moreover, LOGLAN-82 will be used in several applications. In this way the + language will be verified and its usefulness will be analyzed. We are + convinced that the new computer architecture and multiprocessor environment + should be taken into account. Therefore, we plan studies which could + support an efficient implementation of the language with richer semantics + are planned. It seems that the crucial point of the future hardware would + be the efficient implementation of the storage management. + + + + + + + Acknowledgments + --------------- + + + We wish to express our gratitude to all institutions and persons who + supported us materially or morally. Thanks are due to the State Industrial + Trust "MERA" and to its deputy director A.Janicki for the arrangements that + enabled us to realize the LOGLAN-82 project. + The LOGLAN-82 team wishes to thank all colleagues in Warsaw for criticism + and helpful remarks. This report has been carefully read by a number of + people, including J.Deminet, F.Kluzniak, A.Janicki, J.Rudzinski, + W.M.Turski. Their critical comments helped us to avoid numerous mistakes. +1 - 8 - + + + 2. The basic characteristics of LOGLAN-82 + ######################################### + + 2.1. Control structure + ********************** + + + Compound statements in LOGLAN-82 are built up from simple statements + (like assignment or call statement) by means of conditional, iteration and + case statements. + + + The syntax of a conditional statement is as follows: + + if boolean expression + then + sequence of statements + else + sequence of statements + fi + + The semantics of a conditional statement is standard. The keyword fi + allows us to nest conditional statements without the appearence of the + "dangling else" ambiguity. The "else" part in a conditional statement may + be omitted: + + if boolean expression + then + sequence of statements + fi + + Another version of a conditonal statement has the form: + + if B1 orif ... orif Bk + then + sequence of statements + else + sequence of statements + fi + + For the execution of a conditional statement with the orif list the + specified conditions B1, ..., Bk are evaluated in succession, until the + first one evaluates to true. Then the rest of the sequence is abandoned and + the "then" part is executed. If none of the conditions evaluates to true, + the "else" part is executed (if any). The orif construction provides a good + method for a short circuit technique, since the boolean expression + controling the conditional statement execution need not be evaluated till + the end. +1 - 9 - + + + Similarly, a conditional statement with the andif list has the form: + + if B1 andif ...andif Bk + then + sequence of statements + else + sequence of statements + fi + + For the execution of this kind of statement the conditions B1, ..., Bk + are evaluated in succession until the first one evaluates to false. Then + the "else" part is executed (if any). Otherwise the "then" part is + executed. + + + The basic form of an iteration statement in LOGLAN-82 is the following: + + do + sequence of statements + od; + + To terminate the iteration statement one can use the simple control + statement exit, which has the following syntactic form: + + exit ..... exit + + repeated an arbitrary number of times. It may occur in a nested loop + statement. The execution of exit.....exit (i - times) statement consists in + the control transfer to the statement immediately following the i-th od + after the exit statement, (where in counting the od's, the pairs do-od are + disregarded). In particular, when exit occurs in a simple loop the control + is transferred to the statement immediately following the od symbol, which + allows us to terminate the loop. Similarly, a double exit terminates two + nested loops, a triple exit terminates three nested loops etc. Moreover, a + LOGLAN-82 iteration statement allows us to place many loop exit points in + arbitrary configurations, e.g., exit may appear in nested conditional + statements, case statements, etc. + + Iteration statements with controlled variables (for statements) have the + forms: + + for j := A1 step A2 to (or downto) A3 + do + sequence of statements + od; +1 - 10 - + + + The type of the controlled variable j must be discrete. The value of this + variable in the case of the for statement with to is increased, and in the + case of the for statement with downto is decreased. The discrete range + begins with the value of A1 and changes with the step equal to the value of + A2. The execution of the for statement with to terminates when the value of + j becomes for the first time greater than A3 (with downto when the value of + j becomes for the first time less than A3). The values of the expressions + A1, A2, A3 are evaluated once, upon entry to the iteration statement. The + default value of A2 is equal to 1 (when the keyword step and A2 are + omitted). + + + An iteration statement with the while condition has the form: + + while boolean expression + do + sequence of statements + od; + + and is equivalent to + + do + if not boolean expression then exit fi; + sequence of statements + od; + + To enhance the users's comfort, the simple statement repeat is provided. + It may appear in an iteration statement and causes the current iteration to + be finished and the next one to be continued (something like jump to + CONTINUE in Fortran's DO statement). In general, this statement has the + form: + + exit ... exit repeat + + and causes the current iteration of the corresponding enclosing iteration + statement to be finished and the next one to be continued. + + A case statement in LOGLAN-82 has the form: + + case A + when Q1 : G1 + when Q2 : G2 + ... + when Qk : Gk + others G + esac + + where A is an arithmetic expression, Q1, ..., Qk are constants and G1, ..., + Gk are sequences of statements. A case statement selects for execution a + sequence Gj where the value of A equals Qj. The choice others covers all + values (possibly none) not given in the previous choices. +1 - 11 - + + + 2.2. Block structure + ******************** + + + + LOGLAN-82 adopts and extends the main semantic features of the ALGOL + family programming languages (ALGOL-60, ALGOL-68, SIMULA-67) i.e., the + block structure. The block concept of ALGOL-60 is a fundamental example of + this mechanism. The syntactic structure of a block is as follows: + + block + list of declarations + begin + sequence of statements + end + + The list of declarations defines some syntactic entities, e.g. constants, + variables, procedures, functions etc., whose scope is that block. The + syntactic entities occurring in the sequence of statements are identified + by means of identifiers which are introduced in the declaration lists. For + every identifier occurrence it must be possible to identify the + corresponding syntactic entity. This kind of correspondence between + occurrences of identifiers and syntactic entities is necessary to define + the semantics of a block statement. The block statement semantics may be + described as follows. + + When a block is entered, a dynamic instance of the block is generated. In + a computer, a block instance takes the form of a memory frame containing + syntactic entities declared in that block. All local syntactic entities of + an instance will be called its attributes . + + The frame of a block instance may be viewed as a box (with displayed + attributes when necessary). + + ------------------------ + ! attribute k ! + ------------------------ + ! ... ! + ------------------------ + ! ... ! + ------------------------ + ! attribute 1 ! + ------------------------ + block instance +1 - 12 - + + + A block is a statement, and so other blocks may occur in its sequence of + statement (i.e., blocks may be nested). Observe, that the occurrences of + identifiers in an inner block need not be local. They can refer to entities + declared in the outer block. For a non-local occurrence of identifier, the + corresponding attribute of a non-local instance should be identified. That + identification is possible thanks to an auxiliary notion of a syntactic + father. + + Consider the following block structure: + + -------------- + ! block[1] ! + ! ! + ! -----------! + ! ! block[2]!! + ! -----------! + -------------- + + + + + When the statements of block[2] are executed, the following two dynamic + block instances are created: + + + -------- -------- + ! O[2] !=============>! O[1] ! + -------- SL -------- + + Here O[1] is an instance of the block[1], and O[2] is an instance of the + block[2]. + + The instance O[1] is called the syntactic father of O[2] (or + alternatively the instance O[2] is syntactically linked by the SL-link with + the instance O[1]). During a program's execution the sequence of syntactic + fathers determined by an active instance forms a chain, called an SL-chain. + The instances forming the SL-chain correspond to the consequtive enclosing + units of the program, starting from the active one and ending on the main + block. Thus, this chain allows us to identify all non-local occurrences of + identifiers. + + A block statement terminates when the control reaches its final end, and + then its instance is automatically deallocated. +1 - 13 - + + + 2.3. Procedures and functions + ***************************** + + + A block is the simplest example of a unit. Blocks are syntactic units + generated by means of a block statement and deallocated automatically when + the end symbol is reached. Procedures and functions constitute the next + step of know-how in high level programming languages. + + The syntactic form of a procedure declaration is as follows: + + unit name: procedure(formal parameters); + list of declarations + begin + sequence of statements + end; + + A procedure is a named syntactic unit which may be invoked only via its + identifier by means of a call statement: + + call name (actual parameters); + + (Procedures differ from blocks also in that they can have parameters, but + this question will be discussed later.) + + When a procedure is called, its instance is created, as in the case of a + block. All local attributes are allocated in the new frame. A syntactic + father of such a newly generated instance is defined as usual, and allows + us to identify all non-local attributes. + + A procedure call is terminated when the control reaches return statement + or the final end. Then the control returns to the instance where the + procedure was called. That instance is referred to by another system + pointer (DL-link). + + After the termination of a procedure call there is no syntactic means to + access its local attributes, hence its instance is automatically + deallocated. + + Functions differ from procedures only in that they return a value and are + invoked in the expressions. +1 - 14 - + + + 2.4. Classes + ************ + + To meet the need for permanent data structures LOGLAN-82 introduces the + notion of class (cf [3]). Class is declared in a similar way to procedure. + It is named and may have parameters: + + unit M :class(formal parameters); + list of declarations + begin + sequence of statements + end; + + The main difference between classes and procedures consists in the way + the instances of these syntactic units are treated. (To distiguish class + instances from those of blocks, functions and procedures they will be + called class objects or simply objects). The class generation yields a + class object which is a permanent data unlike the vanishing procedure + (function, block) instance. The object O of class M is generated by the + object generator statement: + + new M + + This statement invokes the same sequence of actions as a procedure call, + i.e., it opens a new object, transmits parameters and executes the sequence + of statements of M. Return to the caller is made by the execution of a + return statement or when the final end is reached. + The access to such an object is then possible if its address is set to a + variable. The variables whose values point to class objects are called + reference variables. + A reference variable of type M is declared as follows: + + var X:M; + + and may point to any object of class M, for instance, the statement: + + X:=new M + + generates an object O of class M and assigns its address (reference) to X. + The default value of any reference variable is none, which denotes + fictitious non-existing object. + What is left behind is a structure of attributes which can be accessed by + means of dot-notation. These accessible attributes are either formal + parameters or local entities. If X is a reference variable of type M and W + is an attribute of class M, then the remote access to the attribute W has + the form: + + X.W + + The above remote access is correct if X points to an object O of class M. + Otherwise a run time error is raised (for instance when the value of X is + none). +1 - 15 - + + + 2.5. Prefixing + *************** + + Prefixing is another important programming facility borrowed from + SIMULA-67. Its most important feature consists in the possibility of unit + extension. Consider the following example. Let M be a class: + + unit M: class; + list of declarations of M + begin + sequence of statements of M + end ; + + Now let N be a class: + + unit N: M class + list of declarations of N + begin + sequence of statements of N + end ; + + Class N is prefixed by class M. The name of the prefix is located + immediately before the symbol class. Class N is treated as an extension of + M, i.e., the object of class N has a compact frame consisting of the + attributes of N as well as the attributes of M: + + --------------- + ! ! + ! ... ! M-attributes + ! ! + --------------- - - - - - - + ! ! + ! ! + ! ... ! N-attributes + ! ! + --------------- + + object of N + + The structure of such an object is determined by the class M as well as + by N (thus containing both M-attributes and N-attributes). + The statement + + X:=new N , + + where X is a variable of type N, creates an object of class N. +1 - 16 - + + + The sequences of statements of classes M and N are also concatenated. In + the sequence of statements of a class the keyword inner may occur anywhere, + but once only. The sequence of statements of N consists of the sequence of + statements of M with inner replaced by the sequence of statements of N + (inner in N is equivalent to an empty statement). If class N prefixes + another class P, then inner in N is replaced by the sequence of statements + of P, and so on. If inner does not occur explicitly, an implicit occurrence + of inner just before the final end of class is assumed. + + Prefixing allows the programmer to extend units. Assume, for instance, + that STACK is the data structure which defines a push-down memory: + + unit STACK :class; + ... + unit pop: function... + end; + ... + unit push: procedure... + end; + ... + begin + ... + end STACK; + + Any class prefixed by STACK inherits the operations on stack. For + instance, in a class declaration + + unit N: STACK class; + ... + begin + ... + call push; + ... + end ; + + the function pop and the procedure push may be used as any other local + attribute. + + A class may also be used to prefix blocks, procedures and functions. An + instance of a prefixed block is a compound object and is created upon entry + to the block and deallocated after its termination, as in the case of a + simple block. Similarly, an instance of a prefixed procedure (function) is + a compound object which is created when a procedure (function) is called + and deallocated after its termination. +1 - 17 - + + + 2.6. Object deallocator + *********************** + + The classical methods used to deallocate class objects are based on + reference counters or garbage collection. Sometimes both methods may be + combined. The reference counter is a system attribute holding the number of + references pointing to the given object. Hence any change of the value of a + reference variable X is followed by a corresponding increase or decrease of + the value of its reference counter. When the reference counter becomes + equal to 0, the object can be deallocated. + + The deallocation of class objects may also occur during the process of + garbage collection. During this process all unreferenced objects are found + and removed (while memory may be compactified). In order to keep the + garbage collector able to collect all the garbage, the user should clear + all reference variables, i.e., set to none, whenever possible. This system + has many disadvantages. First of all, the programmer is forced to clear all + reference variables, even those which are of auxiliary character. Moreover, + the garbage collector is a very expensive mechanism and thus can be used + only in emergency cases. + + In LOGLAN-82 a dual operation to the object generator, the so-called + object deallocator is provided. Its syntactic form is as follows: + + kill(X) + + where X is a reference expression. If the value of X points to no object + (none) then kill(X) is equivalent to an empty statement. If the value of X + points to an object O, then after the execution of kill(X) the object O is + deallocated. Moreover, all reference variables which pointed to O are set + to none., This deallocator provides full security, i.e., the attempt to + access the deallocated object O is checked and results in a run-time error. + For example, + + Y:=X; kill(X); Y.W:=Z; + + causes the same run-time error as + + X:=none; X.W:=Z; + + The system of storage management is arranged in such a way that the + frames of killed objects may be immediately reused without the necessity of + calling the garbage collector, i.e., the relocation is performed + automatically. +1 - 18 - + + + 2.7. Arrays + *********** + + LOGLAN-82's array is a kind of a class with indices instead of + identifiers selecting the attributes. A variable of an array type is a + reference variable pointing to an object which contains components of a + one-dimensional array. The components of such an array may also point to + one-dimensional arrays and so forth, hence multi-dimensional arrays may be + generated as well. + + The declaration of a variable Y of array type has the following form: + + var Y : array_of ... array_of T + + where the number of array_of defines the dimension of Y. The declaration of + a variable Y fixes its dimension, while the bound pairs are still + undetermined. The array generation statement has the form + + new_array Y dim (l : u) + + where l, u are arithmetic expressions determining the lower and upper + bounds of the first index. The object O of an array is generated and the + reference to O is assigned to Y. + + If Y is declared as a two-dimensional array, then one can generate a + two-dimensional array by means of the statements + + new_array Y dim (l:u); + + for i:=l to u + do + new_array Y(i) dim (li:ui) + od; + + where the shape of each row is determined by the bounds li, ui. Hence + triangular, tridiagonal, streaked arrays, etc. may be generated. Moreover, + the assignment statements allow us to interchange array references that are + of the same dimension and the same type, e.g. Y(i):=Y(j). In consequence, + the user may operate on array slices. The default value of any array + variable is none, as in the case of a reference variable. + +1 - 19 - + + + 2.8. Parameters + **************** + + In LOGLAN-82 there are four categories of parameters: variable + parameters, procedure parameters, function parameters and type parameters. + + Variable parameters + ------------------- + + Variable parameter transmission is simplified in comparison with ALGOL-60 + and SIMULA-67. There are three transmission modes of variable parameters: + input mode, output mode and inout mode. In the syntactic unit which is a + procedure, a function or a class, the formal input parameters are preceded + by the symbol input, the formal output parameters are preceded by the + symbol output and the formal inout parameters are preceded by the symbol + inout. The default transmission mode is input. Input parameters are treated + as local variables initialized by the values of the corresponding actual + ones. Output parameters are treated as local variables initialized in the + standard manner (real with 0.0, integer with 0, reference with none, etc.). + Upon return their values are assigned to the corresponding actual + parameters, which in this case must be the variables. Inout parameters act + as input and output parameters together. + + Procedure and function parameters + --------------------------------- + + In LOGLAN-82 procedures and functions may also be formal parameters. This + category of parameters allows us to parametrize a unit with respect to some + operations. A formal procedure (function) has the full specification part, + i.e., the parameter list (and the function type), for instance : + + unit Bisec: procedure(function f(x: real): real; a, b, eps:real); + begin + ... + end; + + Type parameters + --------------- + + Types are also allowed to be transmitted as parameters. This kind of + parameters enables us to parametrize a unit with respect to some types. For + instance consider the following declaration: + + unit sort:procedure(type T;A:arrayof T; function less(x, y:T):boolean); + begin + ... + end + + The actual parameter corresponding to the formal T must be a + non-primitive type. The array A must be the array of elements of the actual + type. + If function less defines the ordering relation on the elements of the + actual type, then this procedure may be invoked to sort the array A. +1 - 20 - + + + 2.9. Coroutines + *************** + + Coroutine is a generalization of class. A coroutine object is an object + whose sequence of statements can be suspended and reactivated in the + programmed manner. The generation of a coroutine object terminates with the + execution of the return statement (then the control is passed to the caller + as in the case of classes). A coroutine object after the execution of the + return statement is suspended. A suspended coroutine object may be + reactivated with the help of the attach statement: + + attach(X) + + where X is a reference variable designating the activating object. + + In general, from the moment of generation a coroutine object is either + active or suspended. Any reactivation of a suspended coroutine object O + causes the active coroutine object to be suspended and continues the + execution of O from the statement following the last executed one. + + During a coroutine execution some other unit instances may be generated. + They are dynamically dependent on that coroutine object. Thus, an active + coroutine (in particular the main program) can be illustrated by the + following chain: + + -------- -------- -------- + ! O[k] ! ---> !O[k-1]! --->...---> ! O[1] !---> + -------- -------- -------- + coroutine head + + where the arrows denote the DL-links. + + This DL-chain is transformed into the DL-cycle when the control is + transferred to another coroutine as the result of the attach statement. + + -------- -------- -------- + ! O[k] ! ---> !O[k-1]! --->...---> ! O[1] !---> + -------- -------- -------- ! + ! ! + <----------------------------------------------! + + +1 - 21 - + + + 2.10. Processes + *************** + + The concept of process in LOGLAN-82 is a natural extension of coroutine. + Coroutines are units which once generated may operate independently, each + one treated as a separate process. For coroutines, however, an essential + assumption is established; namely, when one coroutine object is activated, + the active one must be suspended. When processes are used, the activation + of a new process does not require the active one to be suspended. Thus + during a program's execution many processes may be active simultaneously. + Their statements are computed in parallel. + There are two operations, stop and resume, which concern the control of + processes. + + stop Operation which causes the active process to be + stopped. + resume(X) Operation which reactivates the process referenced by X. + + Synchronization and scheduling. + + Elementary synchronization in LOGLAN-82 is achieved by two-valued + semaphores and a number of simple indivisible statements operating on them. + These statements are the following (where Z denotes a variable of semaphore + type): + + + ts(Z) Test-and-set boolean function which closes semaphore Z + and returns the value true if Z was open and false if Z + was closed. + lock(Z) Operation which tests the value of the semaphore Z and + either enables the given process to enter the critical + region guarded by Z (if Z is open) or suspends the + process (in the opposite case) until another one opens + that critical region. + unlock(Z) Operation the execution of which opens the critical + region guarded by Z. + stop(Z) Operation that opens the critical region guarded by Z + and stops the execution of the given process. + + The above operations are implemented in the kernel of the operating + system. One can use them to define any complex synchronization facility, + e.g., monitors (cf. 11.3.). Once defined and stored in the library, the + facility can be used by any user. Moreover, using the high level + synchronizing tools, the user can cover the low level, primitive ones + (therefore the properties of high level tools cannot be disturbed). + + There is also a parameterless function wait. If wait is called in the + given process X, then process X waits for the termination of any of its son + (a son of X is a process which was generated in X). The returned value of + wait points to the first terminated son, and then, the computation of + process X is continued. If there is no such son, the returned value of wait + is none. +1 - 22 - + + + 2.11. Other important features + ****************************** + + In LOGLAN-82 the access control mechanism is enlarged so that it supports + the data encapsulation technique and the protection of attributes in + different environments. The mode of accessibility to attributes of a class + can be controlled by means of the specification hidden and close. On the + other hand, the mode of accessibility to attributes of a unit that are + inherited from its prefix can be controlled by means of the specifification + taken. This permits more flexible communication across the unit boundary as + well as defining of abstract behaviour with a hidden auxiliary structure. + (For details see 6). + + The language provides facilities for dealing with run time errors and + other exceptional situations raised by the user. These events are called + exceptions. So, the exceptions cause interruption of a normal program + execution. The response to an exception is defined by an exception handler. + The user is allowed to define the actions that should be raised when an + exception is encountered. + (For details see 10). + + Program units can be compiled separately. Two kinds of separately + compiled units are provided: binary items ready to be executed, and library + items. The purposes of separate compilation are the following: creating + user libraries, handling system and user libraries, compiling program + components during program testing, and program overlaying. + (For details see 12). + + Input-output facilities and file processing are defined by means of some + simple primitives. The user is able, however, to declare in the language + any class that provides high-level and secure file operations. Examples of + system classes that deal with high-level file operations are also given. + (For details see 13). +1 - 23 - + + + 3. Lexical and textual structure + ################################ + + + The basic character set consists of + + (a) 26 upper case letters: + + a b c d e f g h i j k l m n o p q r s t u v w x y z + + (b) 10 digits: + + 0 1 2 3 4 5 6 7 8 9 + + (c) 16 auxiliary characters: + + . : , ; _ = / + - * < > ' " ( ) + + (d) the space character + + This set can be extended with the following characters: + + (e) lower case letters + + (f) other special ASCII characters, e.g.: + + # $ ? % ^ + + (lower case letters are equivalent to the corresponding upper case ones.) + + A finite sequence of characters is called a word. The words called + identifiers have a special meaning. They are composed of letters, digits, + and underscores and start with a letter: + + + + : + + ----------> --------------------------> + ^ ^ ! + ! ! ! + !---> ----> ! ! + ! ! + ! ! + !--- _ -----> ! + ! ! ! + <------------------------------- + + + +1 - 24 - + + + Identifiers serve to identify program entities, i.e., constants, variables, + types, functions, procedures, classes, coroutines and processes. There are + a certain number of predefined system identifiers which have special + significance in the language. The following system identifiers are reserved + words (these identifiers cannot be declared by the programmer). + + + + + + + and_if detach if od taken + and dim in open terminate + array_of div inner or then + attach do input or_if this + downto inout others to + is output type + begin else + block end kill pref unit + esac procedure unlock + exit last_will process + lock put var + call fi virtual + case for main qua + class function mod wait + close raise wind + const get new read when + copy new_array repeat while + coroutine hidden none repeat write + handlers not return writeln + + signal + step + stop + + + +1 - 25 - + + + The lexical entities are identifiers, numbers, strings and delimiters. + The delimiters from the basic character set are: + + , ; = / + - * > < . ( ) : + + and the compound symbols are : + + =/= >= <= := + + Spaces play the role of separators, i.e., at least one space must + separate adjacent identifiers or numbers. The end of each line is + equivalent to a space. + + A comment starts with a left parenthesis and an asterisk and is + terminated by an asterisk and a right parenthesis. It may only appear + following a lexical unit or at the beginning or end of a program entity. + Comments have no effect on the meaning of a program and are used solely for + program documentation. + + By an identifier definition we mean a declaration or description in the + list of formal parameters. + + The notion of a unit is explained by the following diagram: + + + ---------------------- unit ---------------------- + ! ! ! + ! ! ! + ! ! ! + -----subprogram---- generalized class ! + ! ! ! ! ! ! + ! ! ! ! ! ! + function procedure class coroutine process block +1 - 26 - + + + 4. Types + ######## + + + A type T determines a set !T! of values and a family of operations + applicable to the elements of the set. Three kinds of types are + distinguished: primitive types, system types and compound types. Variables + may be declared to be of type T. Depending on the kind of type T we have to + distinguish two cases. + + + a) T is a primitive type. The value assigned to a variable Y of type + T must belong to the set !T!. + + + b) T is a compound or system type. The value assigned to a variable + Y of type T must be a reference pointing to an object in the set + !T! (for the notion of reference cf 4.3. and 6.3.) + + + + SYNTAX. + ------- + + + : + + -----> ------> + ! ^ + !-> ----->! + ! ! + !-> --->! + ! ! + !-> ----->! + ! ! + !-> ------->! + + + + Primitive and system types are pre-defined, compound types are defined by + the user. For file type see section 13. +1 - 27 - + + + 4.1. Primitive types + ******************** + + + SYNTAX. + ------- + + : + + -----> integer --------> + ! ^ + !---> real ---->! + ! ! + !--> boolean -->! + ! ! + !-> character -->! + ! ! + !---> string -->! + ! ! + !-> semaphore -->! + + + + SEMANTICS. + ---------- + + A primitive type determines a finite set of values which can be effectively + represented in a computer memory: + + !integer! - a subset of integers; + !real! - a subset of reals; + !boolean! - the set consisting of logical values T (true) and F (false); + !semaphore! - the set consisting of two values (closed and open); + !character! - a set of characters; + !string! - a subset of strings; + + These sets will be precisely defined in a concrete implementation. The + way in which the primitive type values are represented in a computer memory + is not essential for the description of semantics; however, the values of + integer and real types are differently represented. Namely, integers are + represented in the fixed-point form with a point after the last significant + digit, reals are represented in the floating-point form. So they will be + denoted differently, e.g., 2 and 2.0. Those values can be mutually + converted: the value of type integer is converted to type real by means of + conversion into the floating point form; the conversion into the opposite + direction truncates and transforms the real value into the fixed-point + form. +1 - 28 - + + + 4.2. System types + ################# + + + SYNTAX. + ------- + + : + + --------> coroutine --------> + ! ^ + !----> process --->! + + + + SEMANTICS. + ---------- + + The set !coroutine! is equal to the union of sets !T! for every type T + declared as: + + - unit T : coroutine + - unit T : process + - unit T : S class + where !S! is already a subset of the set !coroutine!. + + The set !process! is equal to the union of sets !T! for every type T + declared as: + + - unit T : process + - unit T : S class + where !S! is already a subset of the set !process!. + + The user may declare a variable of coroutine (process) type, e.g. of the + form + + var X : coroutine; + (var X : process;) + + and then to assign: + X:=new T + + where T belongs to the set !coroutine! (!process!). + + The main block belongs to both sets - !coroutine! and !process!. The + system variable main gives the reference to the main block. The variable + main may occur in the statements attach(main) and resume(main) only. +1 - 29 - + + + 4.3. Compound types and objects + ******************************* + + SYNTAX. + ------- + + : + + --------> ----------> + ! ^ + !----> --->! + + 4.3.1. Array type + ***************** + + + Objects of array type will be called array objects or shortly arrays. An + array can be considered as a vector; the access to its components is + provided by means of indexing. + + + SYNTAX. + ------- + + : + + ------> array_of -----> ----> + + + SEMANTICS + --------- + + LOGLAN-82 types can be uniformly denoted in the following way + + + !! array_of ... array_of T for i>0 + !! i - times + (array_of)T= !! + !! + !! T for i=0 + + where T is a type identifier. + + For i>0, the set !(array_of)T! consists of the array objects. Every + array object has the attributes accessed via indices l, l+1, ..., u where + l, u are the values of the lower and upper bounds, respectively, and l<=u. + The attributes with the indices l, ..., u are of type (array_of)T. + + Let O be an arbitrary fixed array object and let Y be a variable whose + value points to O. The operations related to the object O are: + + - Y(j), where l<=j<=u, gives the j-th attribute of the object O, + - lower(Y) and upper(Y), which give the value l and u, + respectively. +1 - 30 - + + + 4.3.2. Class type + ***************** + + + SYNTAX. + ------- + + : + + -----> -----> + + + : + + ------> ----------> + + + SEMANTICS + --------- + + A class T is a description of a data structure consisting of attributes + i.e., types, functions, procedures, variables, and a sequence of + statements. The family of admissible operations on the objects from the set + !T! contains the operations defined in the sequence of statements and those + defined in the declarations of functions and procedures. The other + operations are related to the notion of remote access. They allow us to + operate on the objects of type !T! from outside of them. + + + + 4.4. Formal types + ***************** + + + SYNTAX. + ------- + + : + + -----> -----> + + + : + + -----> ------------------> + + + SEMANTICS + --------- + + A formal type is a formal parameter of a unit and can be treated as the + name of an abstract data structure without any attribute. The corresponding + actual type must be a system type or a compound type. The set of objects of + the formal type T from a dynamic object O is equal to the set of objects of + the actual type which occurs in the actual parameter list of O. +1 - 31 - + + + 5. Declarations + ############### + + + Every identifier which is to be used in a program must be defined. System + identifiers are pre-defined, other identifiers are pre-compiled, (see 12.) + or they are defined by means of a declaration or description in the formal + parameter list. LOGLAN-82 is not strongly typed in the sense that sometimes + the type of variable and function value cannot be determined at compilation + time. The user may balance the generality and convenience given by the + formal types mechanism and the risk of reduced efficiency of his program + execution. The compiler option, however, allows us to supress the run time + checking with respect to the type compatibility. + + SYNTAX. + ------- + + : + + ------> --------> + ! ^ + !--> -->! + ! ! + !--> ------>! + ! ! + !--> ---->! + ! ! + !--> -->! + + + (For the definition of a signal declaration see 10. + For the definition of linked item specification see 12.) + + + 5.1. Constant declaration + ************************* + + + SYNTAX. + ------- + + : + + --> const ---> ---> = ---> -------------------> + ! ! + <------------------------ , --------------------- + + + SEMANTICS. + ---------- + + The expression defining the constant must be determinable at compilation + time. The type and the value of the constant is given by its declaration. + They are always primitive. + + Example. + -------- + + const pi=3.1415926, pihalf=pi/2; + +1 - 32 - + + + 5.2. Variable declaration + ************************* + + + SYNTAX. + ------- + + : + + ---> var --->---> + + + : + + ----> ---> : ---> ------> + ^ ! + !<------------------ , <--------------------------------! + + + : + + -----> -------> + ^ ! + !<---- , <---------! + + + SEMANTICS. + ---------- + + A variable is of a type given in a variable declaration. A declaration is + elaborated at the instant of generation of a unit object which contains + that declaration. An elaboration determines an initial value for every + variable. This value depends on the type identifier : + + integer - 0 + real - 0.0 + boolean - F + semaphore - open + character and string - defined in concrete implementation + any compound and system type- none + + The value of the variable may be modified by means of an assignment + statement (see 9.1.1.), but the variables of type T may only point to the + object from the set !T!. + + Example. + -------- + + var left, right: node, counter: integer, cycle: array_of boolean; + + +1 - 33 - + + + 5.3. Unit declaration + ********************* + + + SYNTAX. + ------- + + : + + ----> unit -------> ----------------------> + ! ! + !----> --->! + + + 5.3.1. Class declaration (introduction) + *************************************** + + + A class declaration is understood as a declaration of a class itself, as + well as a declaration of a coroutine or a process. The prefixing will be + described in 5.3.4.. + + + SYNTAX. + ------- + + : + + ----------> : ---> -----> class ----->! + ! ^ ! + ------------->!->->! + ! + !<------------------------------------------------------------! + ! ! + !-> ------------------------------->! + ! + !<------------------------------ ; ----------! + ! + !--> -----------------------------> + ! ^ + !-> ->! + + + : + + ----------------> ------> + + Example. + -------- + + unit complex: class(re, im:real); + var module:real; + begin + module:=sqrt(re*re+im*im) + end ; +1 - 34 - + + + 5.3.2. Subprogram declaration (introduction) + ******************************************** + + SYNTAX. + ------- + + + : + + --> virtual --> --> : --> ---> procedure + ! ^ ! ^ ! + !----------! !------------! ! + ! + <-------------------------------------------------------! + ! ! + !--> -------------------------->! + ! + <------------------------- ; ---------------------! + ! + !--> ------------------------------> + ! ^ + !-> ->! + + + + : + + ---- -------> + + + : + + --> virtual --> --> : --> --> function + ! ^ ! ^ ! + !----------! !-----------! ! + ! + !<------------------------------------------------------------! + ! ! + !-> ---------> : ----> -> + ! + !<-------------------- ; ----------------------------! + ! + !-> -------------------------------> + ! ^ + !-> ->! + + + + : + + -----> ----------> + + + + + Class (function, procedure) identifier may optionally follow the end + symbol (and if present must match the unit name). +1 - 35 - + + + Example. + -------- + + unit Euclid: function(n, m:integer):integer; + var k:integer; + begin + do + k:=n mod m; + if k=0 then result:=m; return fi; + n:=m; m:=k; + od; + end Euclid; + + + + 5.3.3. Block + ************ + + + In order to complete the description of LOGLAN-82 units the block syntax + is given here, however the occurrence of a block results in the execution + of its statements - see 9.1.2.. + + + SYNTAX. + ------- + + + : + + --> pref --> ---> ---> block ----> + ! ^ ^ ! + !-------------------->!--------------------------->! ! + ! + !<------------------------------------------! + ! + !--> ------> + + Example. + -------- + + block + var a, b, c, p, S:real; + begin + read(a, b, c); + p:=(a+b+c)/2; + S:=sqrt(p*(p-a)*(p-b)*(p-c)); + write(S) + end +1 - 36 - + + + 5.3.4. Prefixing + **************** + + + A unit which is a specialized form of a certain class (i.e., which has + all the properties of that class and some additional properties defined in + the unit) can be defined by means of prefixing. An identifier of the + prefixed unit may serve as a prefix for another unit, and so tree + structured hierarchies of units can be created. By a prefix sequence of a + unit M we mean a sequence M1, ..., Mk of units such that Mk = M, the unit + M1 has no prefix; for i = 1, ..., k-1, the unit Mi+1 is prefixed by Mi. Any + unit may be prefixed by a class without changing its character (e.g., a + prefixed procedure still remains a procedure). Procedures, functions, and + blocks cannot be used as prefixes. Process and coroutine, as special cases + of class, may also serve as prefixes, but not for procedures, functions or + blocks. + + If a coroutine (a process) occurs in a prefix sequence of a unit then + this unit is treated as a coroutine (a process), and so it has all the + properties of a coroutine (a process). Therefore, if a prefix sequence of a + unit M contains both a coroutine and a process then M has the properties of + a coroutine as well as those of a process. + + No unit is allowed to occur more than once in its prefix sequence. + + Put T pref* S if a unit T belongs to the prefix sequence of the unit S. + Unit S is called a subunit of unit T. As one can see from the definition of + object, any object of S has the attributes of the units S and T. Moreover, + the statements of that object come from the body of the unit T as well as + from that of the unit S. + + From the way of implementation it follows that prefixing is not a + macro-definition and so it does not require any pre-processing. +1 - 37 - + + + 5.3.5. Formal parameters + ************************ + + + SYNTAX. + ------- + + + : + + ---> ( -----> ---------------> ) ----> + ^ ! ^ ! + ! !--> -->! ! + ! ! ! ! + ! !--> --->! ! + ! ! ! ! + ! !--> ---->! ! + ! ! ! ! + ! !--> ->! ! + ! ! ! ! + ! !--> ->! ! + ! ! + !<----------- ; <------------------! + + + : + + ----> input -----> -------> + ! ^ + !----------->! + + + : + + ----> output ----> -------> + + + : + + ----> inout ----> -------> + + + : + + ----> type ------> -----------> + + +1 - 38 - + + + : + + ----> procedure ---> ---->! + ! + !<-----------------------------------------! + ! + !---> ------> + ! ^ + !----------------------------------->! + + : + + ---> function --> ------>! + ! + !<----------------------------------------------! + ! + !--> --> : --> --> + ! ^ + !-------------------------------->! + + + : + + -------> ( --------> -----------------> ) -----> + ^ ! ^ ! + ! !--> ->! ! + ! ! ! ! + ! !--> -->! ! + ! ! ! ! + ! !--> --->! ! + ! ! ! ! + ! !-> -->! ! + ! ! ! ! + ! !--> ->! ! + ! ! + <----------------- ; <-------------------! + + + : + + ----> procedure -----> ------> + + + : + + ----> function -------> -------> +1 - 39 - + + + SEMANTICS. + ---------- + + + By a formal parameter list of a unit M we shall mean a concatenated list + of formal parameters of the bodies of all units M1, ...., Mk = M from the + prefix sequence of unit M (successively from 1 to k). The parameters + occurring in a unit declaration are called formal parameters to stress that + they constitute a pattern for parameters occurring in the unit body. At the + instant of object generation the actual parameters for this generation are + fixed. The relations between formal and actual parameters depend on the + transmission mode which is specified in the formal parameter list. + + Those relations make possible the communication between a unit and its + environment. The first mode of transmission rectricts the communication to + the input (as the beginning of the body) of the actual parameter value for + the corresponding formal parameter. The second mode restricts the + communication to the output (as the end of the body) of the formal + parameter value for the corresponding actual parameter. The third mode + possesses both possibilities of the input and output transmission modes. In + all three cases, the formal parameters are considered to be declared in the + unit body. + + The next two modes of transmission are designed for subprograms and + types. The occurrence of a formal subprogram/type in the unit body is + matched with the corresponding actual subprogram/type (which is assigned at + the beginning of the body execution). In the case of a formal subprogram, a + simplified description of its parameters is required. + + Hence a LOGLAN-82 unit may be parametrized and designates the union of + all units definable by assigning specific actual types to the formal ones. + The actual type cannot be a primitive one. Parametrized units make possible + the design of universal algorithms, which will be defined in detail at + lower levels of program nesting. +1 - 40 - + + + 5.3.6. Unit body + **************** + + + SYNTAX. + ------- + + + : + + ---> ---> ---> -----> + ! ^ ! ^ + !--------------------->! !------------------->! + + + : + + ----> ------> ------> + ! ^ + !---------------------->! + + + : + + ----> taken -----> -----> ; ----> + ! ^ + !-----------------------! + + + : + + ------------> hidden -------------------> --> ; ---> + ! ! ! + !---------> close ------------>! ! + ! ! + !<--------------------------------------------------------------! + + + + : + + ----> ---->! + ! ! + ---> begin --> --> end --> + ! ^ + !---------------------------! +1 - 41 - + + + : + + !------------------------------------>! + ! ! + --------> -------> ; ----------------> + ^ ! + !<------------------------------! + + + : + + ------> -------> + ^ ! + !<----- ; ------------! + + + SEMANTICS. + ---------- + + In a unit body, a sequence of statements (if any) starts from the begin + symbol. Declarations/statements are separated by semicolons. An execution + of the unit body begins at the time of the generation of an object (of that + unit), see 9.1.2.. A declaration of a unit M is restricted at several + points : + + Restrictions + ------------ + + (i) The least (textual) unit containing an occurrence of a + control statement inner (see 9.1.3.) must be a generalized + class. An inner statement may occur in the class body at + the most once. If it does not occur explicitly then the + body of unit M is assumed to contain the inner statement as + the last one (preceding the end symbol). + + (ii) All identifiers defined in the body of unit M are + different. + + (iii) The input/output formal parameters of unit M cannot be of a + type declared in unit M. + + (iv) If a type T is a formal parameter of unit M then its + occurrence in the list of parameters must precede the + occurrences of other parameters whose description makes use + of T; +1 - 42 - + + + 6. Static and dynamic locations of identifiers. Visibility rules. + ################################################################# + + + As noted before, a non-system identifier used in a program must be + defined in the program by a declaration or by a description in a formal + parameter list. An identifier need not correspond, however, to only one + syntactic entity. A program is composed of units, and so the user designing + a unit must pay attention to the relationship between a given unit and the + other ones. He should feel free to define his own attributes with the same + identifiers as those used in the other units as long as he is not + interested in the entities they describe. Therefore some strict rules of + correspondence between the identifier and the attribute as well as its + valuation are necessary. The first correspondence is called the static + location of an identifier, and the second is called the dynamic location. + The static location is determined by the syntactic structure of a program. + The dynamic location depends on the dynamic configuration of objects. + + + 6.1. Unit attributes + ********************* + + + A set of attributes is assigned to each unit M. This set consists of all + syntactic entities defined in M and in the prefix sequence of M. Most of + them form the set of attributes which belong to each object of the unit, + i.e., they are dynamic. Virtual functions and procedures are attributes of + a very special kind. They are presented separately in 6.4.1. Some other + attributes, like constants, are static, i.e., they are not attrributes of + the objects of the unit but of the unit itself. Therefore static attributes + cannot be accessed by means of dot notation (cf 8.2.3.). + The user may protect attributes. The protection mechanisms are introduced + in the following sections and discussed in 8.2.3. + LOGLAN-82 identifiers cannot be overloaded, i.e., an identifier used in + the given unit corresponds to "exactly one" attribute determined by the + context. However, identifiers may be redefined. Therefore strict + correspondence between the occurrences of the identifiers and the + attributes must de defined. + Let W be a syntactic entity and M a syntactic unit. We say that W is + defined in M iff W is a formal parameter of M (but not of the prefix of M) + or W is declared in M. If W is defined in M, the entity it denotes is the + meaning of W. From now on we shall use interchangeably the notions of an + identifier and of an attribute. + Let W be an identifier and M a unit. If W is defined in M or in a unit + from M's prefix sequence, then W corresponds to an attribute of M. More + precisely, the corresponding attribute is the one defined in M, if it + exists, or the one defined in the prefix sequence. That means that the + redefinition of an identifier in a prefixed unit covers the attribute + corresponding to that identifier. +1 - 43 - + + + 6.2. Protected attributes + ************************* + + Let us consider a declaration of a prefixed unit. Let M be such a unit + and N its prefix. The attributes of N are visible in M (unless covered by + the local redefinition). The user, however, can restrict the use of N's + attributes in M. The protection may be specified already in unit N as well + as in M. The first way corresponds to the hidden specification while the + second to the taken specification. + + + 6.2.1. Hidden attributes + ************************ + + + A list of hidden attributes is a filter from the prefixing unit. The user + may specify within prefix N the attributes whose occurrence is illegal in + any unit prefixed by N (unless the identifiers of these attributes are + covered by the redeclarations). Remote access to such attributes is + forbidden as well (cf 6.2). The absence of hidden specification denotes the + empty list. + Consider an example: + + unit N : class; + hidden x, y, z; + var x, y, z:integer; + ... + end N; + + unit M:N class; + hidden x, t; + var x, y, t:integer; + ... + end M; + + Variables x, y declared in N are redeclared in M, and so the identifiers + x, y in M refer to the local entities. Variable t is declared in M and is + hidden in the units prefixed by M. Variable z is hidden in N, hence it + cannot be used in M. +1 - 44 - + + + 6.2.2. Taken attributes + *********************** + + + The list of taken attributes is a filter on the prefixed unit. In unit M + the user may specify explicitly the attributes from prefix N which are used + in M. Then in M the only attributes accessible from N are those from the + taken list. The occurrence of another attribute from N in M's body is + illegal. The absence of taken specification denotes the list of all (legal + and not hidden) identifiers from N. This means that the user is not + interested in the specification of this kind of filtering. + The identifiers in the taken list must be defined in the prefix sequence, + not in unit M. An exception is an identifier of a virtual attribute (cf + 6.4.). + + + 6.2.3. Legal and illegal identifiers + ************************************ + + In this section we consider only identifiers corresponding to the + attributes of a given unit. + + All identifiers defined in a unit are legal in that unit. In particular, + all identifiers declared in a non-prefixed unit are legal. + + Now let M be a unit, N its prefix and W an identifier not defined in M. + Then W is a legal identifier corresponding to an attribute of M iff + + + - W is legal in N + - W does not occur in the hidden list in N + - W occurs in the taken list in M or this list is absent + + + All identifiers specified in every context in a unit must be legal in + that unit. All identifiers specified in the taken list must be legal in the + prefix. + + An identifier is illegal in a unit iff it denotes an attribute of the + unit (according to 6.1) and that attribute is not legal. +1 - 45 - + + + 6.2.4. Close attributes + *********************** + + + Close attributes are not accessible by means of remote access (cf. + 8.2.3.) outside the unit. + + Let M be a unit with the prefix sequence M1, ..., Mk=M. An attribute W of + unit M is called a close attribute if W occurs in the close list of Mj for + some j, 1<=j<=k, and W is not redefined in any unit following that Mj in + the prefix sequence. However, remote access to a close attribute W is + allowed within the text of the unit M specifying it to be close, i.e., if + the static qualification of the object expression is equal to M, remote + access to W is allowed in all the units declared (directly or indirectly) + in M. + + The list of close attributes must consist of legal identifiers. All + hidden attributes are simultaneously close attributes. + + + Example + ------- + + block + var v:A; + unit A: class; + hidden z; + close x; + var x, z:real, y:A; + + unit B:A class; + var t:B; + begin + + ... z ... (* is illegal since hidden in A *) + ... x ... (* is legal *) + .. y.x+y.z .. (* is legal since y is qualified by A + and the expression is within A *) + ... t.x .. (* is illegal since t is qualified by B *) + + end B; + begin + + ... v.x+y.x .... (* is legal *) + + end A; + + begin (* outside A *) + + ... v.z .. (* is illegal since hidden, and so close as well *) + ... v.y.x ... (* is illegal since x is close *) + end +1 - 46 - + + + 6.3. Static location + ********************* + + + We say that the occurrence of an identifier W is in a unit M if M is the + syntactic unit most tightly enclosing that occurrence. On the basis of the + program structure every occurrence of an identifier W in a unit M can be + unequivocally related to a unit N, where the corresponding attribute W is + defined. The unit N is called the static container for that occurrence of W + in M and is denoted by SC(W, M). + More precisely, by a static container of an occurrence of an identifier W + in a unit M we mean a syntactic unit N such that: + + - W is defined in N + + - there exists a unit P satisfying the following conditons: + + + (1) N belongs to the prefix sequence of P (or is P), + (2) M is declared in P directly or indirectly, + (3) there is no other unit closer to M than P satisfying (2) in + which W is an attribute, + (4) N is P's nearest prefix defining W + (5) if W is illegal (hidden or not taken) in P, then the static + container is undefined. + + The following figure illustrates this definition + + the prefix sequence of P + P <-------- R <------------ SC(W,M)=N ... declaration of W ... + ^ + ! + . + . + . + ^ + ! + M ... the occurrence of W ... + + + The static location of an identifier W is defined for the occurrence of W + in a unit M iff there exists a static container SC(W, M). Every program + must be an expression in which the static location is defined for all + occurring identifiers. + The static container is sufficient to determine the static attribute of a + unit (constant). +1 - 47 - + + + Example. + -------- + + Consider the following program + + block + unit M: class; var X ... end M; + unit N: M class; var X ... end N; + begin + pref N block (* P *) + var Y : ...; + unit R: class; + ... X ... Y ... + end R; + begin + new R; + ... + pref N block (* S *) + var Y : ..., + unit T: R class; + ... X ... Y ... + end T; + begin + new T; + ... + end S; + end P; + end + + + Here we have + + SC(X, R)=SC(X, T)=N + and SC(Y, R)=P, SC(Y, T)=S. +1 - 48 - + + + 6.4. Objects + ************* + + + + + An object O of type M with the prefix sequence M1, ..., Mk=M (k=>1) is: + + - a k-tuple of the form O = (, ... ) where Vi + is the valuation of non-static attributes defined in the + unit Mi, + + + - and a unique reference pointing to this k-tuple. + + + Since the references are unique, two objects are different even if their + tuples are identical. + + Now let us define the valuation of an attribute of object O, depending on + the kind of that attribute: + + - the valuation of variables and variable parameters gives + their values, + + - the valuation of an attribute which is a subprogram is the + text of its declaration and an environment. (The environment + is the object containing the declaration of the subprogram. + In the case of a formal subprogram the value is determined + by the actual one (see 9.1.2.). The case of virtuals is + discussed below.) + + - an attribute which is a type has the value of the form: + (array_of) text of declaration. +1 - 49 - + + + 6.4.1. Virtual attributes + ************************* + + + The main feature of virtual atributes is that a redeclaration of an + identifier denoting a virtual subprogram in a prefixed unit does not cover + the declaration in the prefix but replaces it in all occurrences. The + replacement takes place in the so-called virtual chains of identifiers. We + define this notion below. + Let F be a subprogram and M a unit. By a virtual chain of F in M we mean + a sequence of virtuals corresponding to the maximal subsequence N1, ..., Nk + of the prefix sequence of M such that: + + (1) F is a legal identifier in every Ni and denotes an attribute + specified as virtual (unit virtual F: ...) + (2) In all the units Ni except Nk, F must not occur in the + hidden list + (3) In all the units except N1, F must occur in the taken list + unless the list is not specified. F must not occur in the + taken list in N1 if the list is specified. + (4) After removing the declaration of F from N1, F should be an + illegal attribute in N1 (hidden in the prefix, not taken) or + should denote a non-virtual attribute + (5) If Nk is not M, then one of the following conditions must be + satisfied: + - F occurs in the hidden list in Nk, + - F does not occur in the taken list in the unit + prefixed directly by Nk if the list is + specified, + - F is redefined in the unit prefixed directly + by Nk as a non-virtual attribute (then it must + not occur in the taken list either). + The class Nk from the definition is called the end of the virtual chain. + For a given unit and an identifier there may exist more than one virtual + chain. +1 - 50 - + + + Example 1. + ---------- + + + M unit virtual F: + + N unit virtual F: + + P .... F .... + + R unit F: + + S unit virtual F: + hidden F; + + T unit F: + + We have three virtual chains of F with respect to T. One is for F from the + classes M and N: + (F: ), (F: ), + The second is for F from the class S: + (F: ) + And the third one is for F in T: + (F: ) + + + Restrictions + ------------ + + (i) All virtual attributes belonging to the same virtual chain must be of + the same kind (either function or procedure), + + (ii) All the declarations of the virtuals belonging to the same virtual + chain must have formal parameter lists of the same pattern, in particular: + + - the lists may use different names of formal parameters, + but the correspondence between formal types must remain + valid, + + - the class types of corresponding formal variables or + functions must belong to the same prefix sequence, + + - the types of variable parameters or formal functions in + the ending of the virtual chain must not be less strongly + defined than the types of the corresponding parameters in + the beginning, i.e., a formal or system type against a + statically defined type, + + - the types of virtual functions must be identical or the + type of the function from the beginning of the virtual + chain must be a prefix of the type of the function from + the ending, + + (iii) The compatibility of virtuals must be defined statically. +1 - 51 - + + + Example 2. + ---------- + + (1) + The following lists are not compatible + .... (type T; type P; X: T; Y: P) .... + .... (type R; type S; X: S; Y: R) .... + + + (2) + The following lists are compatible iff M and N belong to the same prefix + sequence (and both are classes) + .... (type T; Z: T; Z1: M) .... + .... (type P; X: P; Y: N) .... + + + (3) + The following lists are compatible iff M denotes a system type (coroutine + or process) or is a formal type + + at the beginning: (X: M; Y: real) + at the ending: (X:coroutine; Y:real) + + (4) + The following lists are not compatible: + + ... (Y:integer) + ... (Y:real) + + (5) + The lists of the function from the beginning of the chain + + ... function (Z:integer; Z1:P) : M + + and from the ending + + ... function (Z:integer; Z1:P) :N + + are compatible iff M is a prefix of N. +1 - 52 - + + + 6.4.2. Valuation of virtuals + **************************** + + + Let O be an object of type M with the prefix sequence M1, ..., Mk=M. The + value of virtual attribute F declared in Mi is: + + - the text of the declaration taken from the end of the virtual chain, + - the environment of the object O. + + Example + ------- + An object of the class T given in the example 1 from 6.4.1 is of the + following form: + + --------------------------------------------- + ! ! ! + ! F : body F from N ! M ! + --------------------------------------------- + ! ! ! + ! F : body F from N ! N ! + --------------------------------------------- + ! ! ! + ! ! P ! + --------------------------------------------- + ! ! ! + ! F : body F from R ! R ! + --------------------------------------------- + ! ! ! + ! F : body F from S ! S ! + --------------------------------------------- + ! ! ! + ! F : body F from T ! T ! + --------------------------------------------- + + + The name "virtual subprogram" is derived from the features of virtual + entities, i.e., in any class a virtual subprogram F with an empty statement + list can be declared and then used as a virtual entity within the body of + the class. The user can assume the results of its execution without + knowledge of its internal structure. He can declare in a subclass a virtual + subprogram F again. This declaration replaces the previous one. So, during + the calls of the subprogram F in the body of the class as well as in the + body of the subclass, the subprogram with the text defined in the subclass + will be executed. This replacement is done only if F is a virtual attribute + of the subclass. Otherwise the new declaration of F covers the virtual + attribute of the class. +1 - 53 - + + + + + Abstention from those rules permits us: + + (i) to define the types of the parameters of a virtual subprogram and to + check them already at compilation time, + + (ii) to execute the virtual subprogram declared at the beginning of the + prefix sequence; its body may be empty, but it is always defined, + + (iii) to end the virtual chain and to cover a virtual identifier by a + redeclaration. + + The possibilities (ii) and (iii) can be used in the following case. Let M + and N be system classes of the form : + + unit M: class; + unit virtual error: procedure; + (* virtual procedure to be defined in M's subclasses*) + end error; + begin + ... + if B1 then call error fi; + end M; + + unit N: M class; + unit virtual error: procedure; + (* the definition of the body of error. It + will be executed during the calls within N + as well as in M *) + end error; + begin + ... + if B2 then call error fi; + end N + + If the programmer prefixes his own units by class M, he can declare his + own virtual procedure error. If he does not intend to signalize any errors, + he is able to use M without a redeclaration. Then if the condition B1 is + satisfied, the procedure with an empty body will be called, i.e., no + statement will be executed. On the other hand, if the programmer uses N as + a prefix of his own units, he can redeclare his own non-virtual procedure + error. In consequence, during the execution of statements of the classes M + and N the procedure defined by this system in the class N will be executed. + However during the execution of the user's units the procedures defined by + himself will be executed. +1 - 54 - + + + 6.5. Dynamic location + ********************** + + An executable program must always be a well-formed expression. During its + execution we can deal with many objects of the same syntactic unit even at + the same time. Hence an execution of a statement (in an object) requires + identification and access to all the syntactic entities used. In order to + define the syntactic environment of object O (of unit M) a static link (SL) + is introduced. This link always points to an object O1 of a unit N such + that M is declared in N. + Let us consider the occurrence of identifier W within a body of class N + from the prefix sequence of M. Let SL(M) denote the SL-chain of objects + starting from an object of unit M. This means that SL(M) is a sequence of + objects O1, ..., Ok such that O1 is an object of unit M, Ok is an object of + the main program, the SL-link of object Oi points to object Oi+1, for every + i=1, ..., k-1. + + The dynamic container of the occurrence of W in a body of class N with + respect to an object O1 (denoted by DC(W, N, O1)) is an object Oi from + SL(M) such that: + + (*) Oi is an object of the unit prefixed by the static container SC(W, + N); + (**) Oi is the nearest object in the SL-chain such that Oi satisfies (*). + + Hence the dynamic container is the unique object which contains the + valuation of the entity W related to the occurrence of this entity. Let us + return to the example from 6.3.; after the creation (new T) of an object O + of the class T the SL-chain of O is as follows: + + -------------- ------------ --------------- + ! X ! M ! ! X ! M ! ! ! R ! + <----- !------!-----! <------- !-----!----! <------ !-------!-----! + ! X ! N ! SL ! X ! N ! SL ! ! ! + !------!-----! !-----!----! ! ! T ! + OP ! Y,R ! P ! OS ! Y,T ! S ! O ! ! ! + -------------- ------------ --------------- + + Because SC(X, R)=SC(X, T)=N , we have DC(X, R, O)=DC(X, T, O)=OS. Since + SC(Y, T)=S , we have DC(Y, T, O)=OS. On the other hand SC(Y, R)=P and DC(Y, + R, O)=OP. + The syntactic environment of an object is determined by the SL chain. Its + main property is that for each identifier occurrence in the statements of + the given object exists its dynamic container in the chain. In order to + define the dynamic location of identifier W occurring in object O of unit M + in a body of unit R (which belongs to the prefix sequence of M), the + following steps are performed: + + - a static container N=SC(W, R) is defined; + - a dynamic container O1=DC(W, R, O) is defined (in the SL chain of object + O, the nearest object O1 is found such that this object has a "layer" ); + - a valuation V1(W) is found in the layers of the object O1 such + that N1 is the nearest N's prefix. +1 - 55 - + + + 7. Consistency of types + ####################### + + In order to determine the context-sensitive correctness of an assignment + statement and parameter transmission it is necessary to introduce the + notion of the static consistency of types. Nevertheless this notion is not + sufficient to determine the correctness of the executions of those + constructs. Therefore, the notion of the dynamic consistency of types will + be introduced to define the semantic correctness of program. The introduced + distinction follows from the implementation constraints; namely, static + consistency is verified at compilation time, dynamic consistency is + verified at run time. + + + Static consistency of types + --------------------------- + + The type (array_of)T is statically consistent with the type + (array_of)S, where T and S are not array types, iff one of the following + conditions holds: + - i=j and T=S, + - i=j=0 and T, S are integer or real types, + - both T and S are formal types, + - T is a formal type, S is not a formal type and i<=j, + - S is a formal type, T is not a formal type and j<=i, + - i=j=0 and T, S are generalized class types and T pref* S or + S pref* T, + - i=j=0 and T and S are one of them a system type and the other a + generalized class or system type. + + + Dynamic consistency of types. + ----------------------------- + + The type (array_of)T is dynamically consistent with the type + (array_of)S, where T and S are not array types, iff one of the following + conditions holds: + - i=j and T=S, + - i=j=0 and T, S are integer or real types, + - i=j=0 and T, S are generalized class types and T pref* S, + - i=j=0, T = coroutine, and S is declared as: + unit S: ... coroutine ...; or + unit S: ... process .....; or + unit S: R class..., where T is dynamically consistent with R, + - i=j=0, T = process, and S is declared as: + unit S: ... process .......; or + unit S: R class..., where T is dynamically consistent with R. + + At run time all formal types are replaced by actual non-formal ones. + Therefore, there is no reason to define dynamic consistency for formal + types. + Dynamic consistency is a subrelation of static consistency. Thus the + dynamic consistency is checked at compilation time, if possible. In other + cases the check is made at run-time. + From now on we shall use the following notation: + - for the desription of context properties, an occurrence of an + expression E is considered to be contained in the body of unit M, + - for the desription of semantic properties, an occurrence of an + expression E is considered to be contained in the body of unit M, with + respect to an object O of type M0 such that M pref* M0. +1 - 56 - + + + 8. Expressions + ############## + + + Expressions are composed of primitive expressions - constants and + variables by means of system operators and functions. They serve as + patterns for computing a certain value. Two kinds of expression properties + have to be considered: context (static) and semantic (dynamic) ones. + + + + + Context properties. + ------------------- + + We consider two context properties of each expression: + - to be a well-formed formula, + - to have a static type. + + The context correctness of an expression is examined at compilation time. + From now on, an expression is said to be a well-formed formula (shortly : + WFF) if it is statically correct. The static type of an expression is + determined by the program text. + + + + + Semantic properties. + -------------------- + + We consider three semantic properties of each expression: + - to be defined, + - to have a dynamic type, + - to have the type of its value. + + In some cases (for expressions of formal types) type must be determined + at run-time. Replacing formal types by the corresponding actual ones in the + static types of expressions, we obtain the dynamic types of those + expressions. Notice, that the actual type may not be accessible, if the + dynamic container for the formal type of the expression was killed. The + dynamic type will be defined only for the expressions which may occur on + the left side of an assignment, i.e., for variables. When the value and the + type of the value are computed, the semantic correctness of the expression + is established. + From now on an expression is said to be defined if it is dynamically + correct at run-time. The correctness of an expression will be examined + under the assumption that it is a WFF. Five kinds of expressions are + distinguished: arithmetic, boolean, character, string, and object + expressions. +1 - 57 - + + + 8.1. Constant + ************* + + + SYNTAX. + ------- + + : + + -----> -----> + + CONTEXT. + -------- + + Let E be a constant Q. The expression Q is a WFF if the static container + SC(Q, M) exists. The static type of Q is determined by its declaration (see + 5.1.). A constant cannot occur on the left side of an assignment statement, + as an actual output parameter, or in an expression X.Q, where X is an + object expression. + + SEMANTICS. + ---------- + + The constant Q is always defined. The value of the constant is fixed from + the declaration of that constant and cannot be modified. The type of the + value is equal to the static type. + + + + 8.2. Variable + ************* + + + SYNTAX. + ------- + + + : + + --------> ------------> + ! ^ + !---> ->! + ! ! + !----> ---->! + ! ! + !----> ---->! + + + For each kind of variables its context and semantic correctness will be + defined. Additionally the dynamic address of a variable will be defined as + a pair: (reference to an object, attribute of that object). +1 - 58 - + + + 8.2.1. Simple variable + ********************** + + + SYNTAX. + ------- + + + (simple variable>: + + ----> -----> + + + Let E be a variable Z. + + + CONTEXT. + -------- + + The variable Z is a WFF if the static container SC(Z, M) = R exists. The + static type of Z is determined by the declaration of Z and may be a formal + one. + + SEMANTICS. + ---------- + + The variable Z is defined if the dynamic container O1 = DC(Z, M, O) + exists. Let the static type of Z be: (array_of)S. The dynamic type of Z + is equal to (array_of)S in the case where S is not formal, otherwise it + is (array_of)T, where the actual type corresponding to the formal one + is (array_of)T. + The actual type is taken from the dynamic container DC(S, R, O1), i.e., + from an object belonging to the SL chain of the object O1. The value of Z + is given by the corresponding valuation of Z in the object O1. The address + of Z is a pair: (the reference to O1, attribute Z of O1). +1 - 59 - + + + 8.2.2. Subscripted variable + *************************** + + + SYNTAX. + ------- + + + : + + --> --> ( -> -----> ) --> + ^ ! + !<----------- , --------------! + + + Let E be an expression of the form Z(A1, ..., Ak), where Z is a simple + variable and A1, ..., Ak are arithmetic expressions. + + CONTEXT. + -------- + + Let (array_of)S denote a static type of Z. The expression Z(A1, ..., + Ak) is a WFF if: + - Z and A1, ..., Ak are WFFs, + - static types of A1, ..., Ak are integer or real, + - 1<=k<=i. + The static type of E is (array_of)S. + + SEMANTICS. + ---------- + + The expression E is defined if: + - the expression Z(A1, ..., Ak-1) is defined and its value equals the + reference to a non-empty array object O1 with the bounds l and u, l<=u. + - the value of Ak is defined and its truncation l1 satisfies: l<=l1<=u. + The dynamic type of E is equal to the static one if S is not formal, + otherwise it is (array_of)T where the actual type corresponding to + the formal one is (array_of)T. The actual type is determined as for a + simple variable (see 8.2.1.). The value of E is that of the attribute (l1) + of the object O1. The address of E is the pair: (the reference to O1, + attribute (l1)). +1 - 60 - + + + 8.2.3. Dotted variable + ********************** + + + SYNTAX. + ------- + + + : + + -> -->. --> ----> + + + It is sufficient to consider the expression E of the form X.Y, where Y is + a simple or subscripted variable. + + CONTEXT. + -------- + + The expression E is a WFF if: + + + - X, Y are WFFs, X is the qualified object expression, + - the static type of X is a generalized class type, + - Y is a non-closed attribute of the static type of X. + + + The static type of E is the same as the static type of Y. Notice that the + static type of X cannot be a formal type. + + SEMANTICS. + ---------- + + The expression E is defined if: + + + - the expression X is defined, + - the value of X is a reference to a non-empty object O1. + + + The dynamic type of E is the same as the dynamic type of Y would be if Y + occurred in the object O1. The value of X.Y is that of the attribute Y of + the object O1. The address of X.Y is the address of Y would be if Y + occurred in O1. +1 - 61 - + + + 8.2.4. System variable + ********************** + + + SYNTAX. + ------- + + : + + ------> result ----------------------------------------> + + + CONTEXT and SEMANTICS. + ---------------------- + + For every function F there is an implicitly declared variable result of + type T of the value of function F. The initial value of that variable + depends on type T (is equal to the default value of type T), the final + value (after completion of a function call) is also the value of function F + for the given call (see 9.1.2.). An occurrence of the variable result is + matched with the smallest unit F which contains that occurrence and which + is a function. + + + Example. + -------- + + unit Newton_symbol: function (i, k:integer): integer; + var j: integer; + begin + if i>= k and k>=0 + then result:=1; + for j:=0 to k-1 + do + result:=result*(i-j)div(j+1) + od + fi + end Newton_symbol; +1 - 62 - + + + 8.3. Arithmetic expression + ************************** + + + SYNTAX. + ------- + + : + + !------------------->! + ! ! + -----------> --------> -------> + ^ ! + !<--------------------------------! + + + + : + + -----> + -----> + ! ^ + !-> - -->! + + + + : + + ---------> -----------------> + ^ ! + ! !<-------------------! + ! ! ! ! ! + ! ! ! ! ! + ! * / div mod + ! ! ! ! ! + ! ! ! ! ! + !<-----------------! + + + + : + + ------------------ --------------------------------> + ! ^ ! ^ + !--! !---> ---------------------------->! + ! ! + !--> ------------------------->! + ! ! + !--> ------------------------->! + ! ! + !------> ---------------->! + ! ! + !-> ( ->-> ) ----->! +1 - 63 - + + + : + + -----> ------> + ^ ! + !<------------! + + + : + + !-------->! + ! ! + ---> --> . ---> ----->E --> --> --> + ! ^ ! ^ + !------------------>! !---------------------------->! + + + (function call will be defined in 9.1.2.). + + CONTEXT and SEMANTICS. + ---------------------- + + The type of the value of an arithmetic expression is always equal to its + static type. The dynamic type is not to be defined. The context and + semantic properties of arithmetic expressions will be defined inductively. + + Factors. + The type of an integer is integer, the type of a real is real, their + values are given directly. Constant, variable, and function call must be + WFFs (in the meaning of 8.1., 8.2 and 9.1.2.), and of type integer or real + (in order to create a well-formed factor). The factor is defined iff the + variable and the function call are defined. The context and semantic + properties of the factors of the form " abs A1 ", and " (A2) " are the same + as those of arithmetic expressions A1 and A2, respectively. The value of " + abs A1 " is the absolute value of A1. + + + Terms. + The operators *, /, div, mod are interpreted as multiplication, division, + integer division and remaindering, respectively. The last two operators are + defined for integer arguments only, " A1 div A2 " is equal to the + truncation of A1/A2; " A1 mod A2 " is equal to the remainder of A1/A2. The + type of a term of the form is real if the + operator is /, or at least one of the arguments is of type real. The term " + A1/A2 " is defined if the value of A2 is different from 0. The value is + defined inductively if Av1 and Av2 are the values of factor A1 and term A2 + respectively, and is an interpretation of operator W, then the value of + a term of the form " A1 W A2 " is Av1 Av2. If one of the arguments is + of type integer and the other is of type real then for the operators *, / + the integer type value is converted into a real type one. + + + Arithmetic expression. + An arithmetic expression of the form is of type + integer if both terms are of that type and it is of type real in the + opposite case. A value is defined inductively: if Av1 and Av2 are the + values of term A1 and arithmetic expression A2, respectively, then the + value of an expression A1+(-)A2 is Av1+(-)Av2, the value of +(-)A1 is + +(-)Av1. If one of the arguments is of type integer and the other is of + type real, then the integer type value is converted into a real type one. +1 - 64 - + + + 8.4. Boolean expression + *********************** + + + SYNTAX. + ------- + + : + + -------> ----------------> + ^ ! + !<---- or <---------------! + + + : + + ------> ----------> + ^ ! + !<---- and <------------! + + + : + + ----> not ----> ------------> + ! ^ + !-------->! + + + : + + --------> --------------------> + ! ^ + !----> -------------------->! + ! ! + !----> -------------------->! + ! ! + !----> --------------->! + ! ! + !----> -------------------->! + ! ! + !--> ( --> ->)--->! + + + : + + -----> ---------------> + ! ^ + !-> ----------->! + ! ! + !-> --------->! + ! ! + !-> --------->! + ! ! + !-> ------------>! + + + : + + -----> false --------> + ! ^ + !--> true --->! +1 - 65 - + + + : + + ---> --> + ! + !<-----------------------! + ! + !---> ----> + + + : + + ----> ---------> + ! ^ + !-> -->! + + + : + + ----------> = ----------------> + ! ^ + !------> =/= ------->! + + + : + + --------------------------------->! + ! ! ! ! + < > <= >= + ! ! ! ! + !-------------------------------> + + + : + + ---> --> --> + ! + !<-----------------------------------------! + ! + !---> -----> + + + : + + ---> --> --> + ! + !<----------------------------------------------! + ! + !---> ------> + + + : + + ---> ----> is ------> -------> + ! ^ ! ^ + !--> in -->! !--> ---->! +1 - 66 - + + + CONTEXT and SEMANTICS. + ---------------------- + + The context and semantic properties of boolean expressions can be defined + in the same way as those of arithmetic ones. A boolean expression is of + type boolean. + + Boolean primary. + The value of a boolean constant true and false is T and F, respectively. + The equality and inequality operators have the usual interpretation. Let + A1, A2 be two defined arithmetic expressions and let Av1, Av2 be their + values. Let be an interpretation of the arithmetic relational operator + W. Then the value of arithmetic relation " A1 W A2 " is Av1 Av2. If one + of the expressions is of type integer and the other is of type real then + the integer type value is converted into real type one. + + Let C1, C2 be two defined character expressions and let Cv1, Cv2 be their + values. Then the value of the character relation " C1=C2 " (" C1=/=C2 ") is + true iff the characters Cv1, Cv2 are identical (different). For string type + there are no relations, even no equality. + + A reference relation " X1=X2 " (" X1=/=X2 ") is a WFF if X1 and X2 are + well-formed object expression. The static types of the expressions have to + be statically consistent. The relation is defined if X1 and X2 are defined. + The value of that relation is true iff the values of both expressions are + equal to (different from) the same reference; in particular, if they are + both equal to none, then the value of " X1=X2 " is T. + An object relation "X is S" is a WFF if S is a generalized class + identifier, X is a WFF, and the static type of X is statically consistent + with S. An object relation "X in S" is a WFF if S is a generalized class or + system type identifier, X is a WFF, and the static type of X is statically + consistent with S. The value of the relation "X is S" is T iff the value of + the expression X is the reference to an object of class S. The value of the + relation "X in S" is T iff the value of X belongs to the set !S! . + + Boolean factor. + The value of a boolean factor "not B", where B is a boolean primary, is T + iff the value of B is F. + + Boolean term. + Let Bv2 and Bv1 be the values of boolean factor B2 and boolean term B1, + respectively. Then the value of a term of the form "B1 and B2" is T iff + Bv2=Bv1=T. + + Boolean expression + Let Bv1 and Bv2 be the values of boolean term B1 and boolean expression + B2, respectively. Then the value of an expression of the form "B1 or B2" is + F iff Bv1=Bv2=F. + + The value of the arithmetic and boolean expression is computed from left + to right with the following operator priorities: + (1) parentheses (, ), abs + (2) *, /, div, mod + (3) +, - + (4) <, <=, >, >=, =, =/= + (5) not + (6) and + (7) or. +1 - 67 - + + + 8.5. Character expression + ************************* + + + SYNTAX. + ------- + + : + + ----> ---------------------> + ! ^ + !---> --------------->! + ! ! + !---> --------------->! + ! ! + !---> ---------->! + + + : + + ----> ' -----> -----> ' ------> + + + : + + -------> ----------------------------> + ! ^ + !---> --------------->! + ! ! + !---> ------>! + ! ! + !--> ----->! + ! ! + !-> (: --> --> :) ->! + + + + + CONTEXT and SEMANTICS. + ---------------------- + + Constant, variable and function call are WFFs if they are of type + character. The standard function ord is defined for a character expression + and gives an integer value (dependent on implementation). +1 - 68 - + + + 8.6. String expression + ********************** + + + SYNTAX. + ------- + + + : + + -----> --------> + ! ^ + !---> ------->! + ! ! + !---> ------->! + ! ! + !---> -->! + + + + : + + ---> " -------> ---------------------> " -----> + ! ! + !<-------------------------------------! + + + + SEMANTICS. + ---------- + + Constant, variable and function call are WFFs if they are of string type. + The quotation mark " in the string constant is written twice "". + + Remark + ------ + The string type is a constant type in the sense that the universe is + defined at compilation time and there are no string operations predefined + in the language. However, a standard function may transform a string into + an array of characters. Then the user can treat the array of character as a + text type and can define any set of suitable text operations. + + End of remark + ------------- +1 - 69 - + + + 8.7. Object expression + ********************** + + SYNTAX. + ------- + + : + + --------> ---------------------------------------> + ! ^ + !--> --------> qua -> -->! + ! ^ + !--> -! + + : + + ----------> ---------------------> + ! ^ + !-----> ------------>! + ! ! + !---> --------->! + ! ! + !---> ------>! + ! ! + !----> --------->! + ! ! + !-----> ----->! + + : + + -----> none -------- > + + : + + ----> this ----> ---------> + + + (Function call and object generator will be defined in 9.1.2, process + waiting will be defined in 11.1. Variable is described in 8.2.). +1 - 70 - + + + CONTEXT. + -------- + The constant none is of a fictitious type statically consistent with any + non-primitive type. + To define the context of a local expression let us recall that the + occurrence of the expression E is considered in the unit M. Let E be the + local object "this T", then E is a WFF if there exists a unit N such that M + decl* N and T pref* N, (i.e., there exists a unit N statically enclosing M + and containing T in its prefix sequence). The static type of the expression + E is T. + The qualified object expression of the form "X qua T" is a WFF if X is a + WFF and the static type of X is statically consistent with T. The static + type of this expression is T. + + SEMANTICS. + ---------- + The constant none is always defined as an empty object. Every compound + and system type is dynamically consistent with the fictitious type of none. + The value of the local object "this T" is the nearest object of the type T1 + belonging to the SL chain of the object O such that T1 is prefixed by T, + (recall that O contains the given occurrence of the local object). The + expression "this T" is defined if its value exists. The dynamic type is not + to be defined. The type of the value is S. The qualified object expression + of the form "X qua T" is defined if X is defined, its value is different + from none, and the dynamic type of X as well as the type of its value are + dynamically consistent with T. The value of this expression is equal to the + value of X. The dynamic type is not to be defined. +1 - 71 - + + + 9. Sequential statements. + ########################## + + + Sequential statements are patterns for the sequencing of primitive actions. + + + SYNTAX. + ------- + + + : + + --------> ------------> + ! ^ + !-------> ---->! + + + + In a similar way to that followed in the description of expressions we + shall consider context and semantic properties of statements. A statement + will be called a WFF if it is correct at compilation time, and said to be + defined if it is correct at run time. + + + + + + + 9.1. Sequential primitive statements + ************************************* + + + The result of an execution of a primitive statement consists in the + modification of: + - the valuation (assignment statement); + - the configuration (allocation and deallocation statement); + - the control (control statement). + + By a configuration we mean the set of all objects existing at a given state + of computation. + + + SYNTAX. + ------- + + + : + + --------> -------------> + ! ^ + !----> ---->! + ! ! + !----> --->! + ! ! + !----> -------->! + + +1 - 72 - + + + 9.1.1. Evaluation statement + **************************** + + + SYNTAX. + ------- + + : + + --------> ----------------------> + ! ^ + !----> ------>! + ! ! + !----> --------->! + + + + : + + ---------------------------> + + + SEMANTICS. + ---------- + + An execution of an empty statement has no effect. + + + + + + SYNTAX. + ------- + + + : + + ------> ---> := --> ----> + + + : + + ----------> ------> , ---------------> + ! ! + ! ! + <--------------------------------- + + + CONTEXT. + -------- + + An assignment statement of the form y1, ..., yk:=e is a WFF if: + - variables y1, ..., yk and expression E are WFFs; + - the static types T1, ..., Tk of variables y1, ..., yk are statically + consistent with the static type S of the expression E. +1 - 73 - + + + SEMANTICS. + ---------- + + The execution of a statement consists of three steps : prologue, body and + epilogue. + + In the prologue the computation of the addresses of variables y1, ..., yk + is performed, i.e.: + + - For a dotted variable of the form X.z, the value of the expression X is + computed; + - For a subscripted variable of the form Z(i1, ..., ij) the value of the + expression Z(i1, ..., ij-1) is computed. If Z is of a formal type, then the + dynamic type T of the variable Z is determined. Finally the value of the + expression ij is computed. + + The above actions are performed from left to right. + + + During the body the computation of the type and the value of expression E + is performed. + + + The epilogue checks if the statement is well-defined and assigns the + values to the attributes determined by the addresses evaluated during the + prologue. + + An assignment is defined, if: + - the expressions y1, .., yk, E are defined; + - the dynamic types of y1, .., yk are defined and are dynamically + consistent with the type of the value of E. + + The values are assigned from right to left, i.e., at first the value of E + is assigned to yk (with possible conversion to the type of yk), next the + value of yk is assigned to yk-1 (with appropriate conversion), and so on. + For example, when r is real, n is integer, then: + + after r, n:=2.5 we have n=2, r=2.0, + after n, r:=2.5 we have r=2.5, n=2. + + Remark. + ------- + + The value of the expression Z computed at prologue may point to a non-empty + object O, but it could be changed to none as a result of the deallocation + of the object O (during the execution of the statement). It will be + detected at epilogue and will result in a run-time error. + + End of remark. + -------------- +1 - 74 - + + + An object of a compound type can be simultanously referenced by a number + of variables. If X and Y are the variables of such a type, then after + assignment X:=Y, both variables reference the same object. Hence some + side-effects may occur: the value of an attribute of the object referenced + by variable X can be changed as a result of an access to that object by + means of variable Y. In order to avoid such effects, one can use a copying + statement: + + X:=copy(Y) + + after which both variables reference identical objects but not the very + same one. + + SYNTAX. + ------- + + + : + + -> -> := -> copy -> ( -> -> ) -> + + + CONTEXT and SEMANTICS. + ---------------------- + + The semantics of the copying statement differs from that of the assignment + statement in the following points: + + + - The copying statement is defined if the value of the right side object + expression E is a reference to a terminated class object (i.e., an object + whose all statements were completed, see 9.1.3). Coroutine or process + objects must not be copied. + + + - During the epilogue, the copy of the value of the expression E is + assigned (a copy of none is none). +1 - 75 - + + + 9.1.2. Configuration statement + ******************************* + + + Configuration statements correspond to the generation and deallocation of + units and arrays. Allocation of an array object is a result of array + generation, allocation of a unit object is a result of a subprogram call, + generation of a generalized class object or block statement. + + SYNTAX. + ------- + + + : + + -----> -------> + ! ^ + !--> -->! + + + 9.1.2.1. Allocation statement + ***************************** + + + SYNTAX. + ------- + + + : + + ------> -----------------> + ! ^ + !--> -------->! + ! ! + !--> ----->! + ! ! + !---> ------->! + ! ! + !--> ------>! + + + : + + ---> ---> ----> + ! ^ + !--------------------------->! + + + : + + --> call --> -->! + ! + !<-----------------------! + ! + !---> < actual parameter list> ------------> + ! ^ + !----------------------------------->! +1 - 76 - + + + : + + --> --> . --> new -----! + ! ^ + !--------------------------------------! ! + ! + !--------------------------------------------------! + ! + !--> ---> --------> + ! ^ + !---------------------------! + + + : + + ----> --> . -->! + ! ^ ! + !----------------------------------------! ! + ! + !--------------------------------------------! + ! + !---> ---> + + + : + + ----> --> . -->! + ! ^ ! + !----------------------------------------! ! + ! + !--------------------------------------------! + ! + !---> ---> + + + : + + ---->(----------------> ----------------> ) ----> + ^ ! ^ ! + ! !->-------->! ! + ! ! ! ! + ! !->------->! ! + ! ! ! ! + ! !->------------------->! ! + ! ! + !--------------- , <---------------------------! +1 - 77 - + + + CONTEXT. + -------- + + We shall start with an allocation of a unit object O, i.e., subprogram + call, object generation and block statement. The execution of those + statements causes the generation of the new object O. Let Pa1, ..., Pak + denote actual parameters, k>=0, and let X be an object expression. The + allocation of an object of unit M is of one of the following forms: + + - for function M: M(Pa1, ..., Pak) or X.M(Pa1, ..., Pak) + (a function call must occur in an expression; it is not allowed as an + independent statement); + + - for procedure M: call M(Pa1, ..., Pak) or call X.M(Pa1, ..., Pak); + + - for class M: new M(Pa1, ..., Pak) or X.new M(Pa1, ..., Pak); + (an object generator may occur in an expression and it is also allowed as + an independent statement). + + - for block statement: pref M(Pa1, ..., Pak) block...end or block... end + (a block can be considered as an unnamed unit and a generation of its + object is the result of an occurrence of that block statement). + + + The allocation of a unit object is a WFF if: + + - a unit identifier M is visible (in the sense of the rules + used for the variables, see 8.2.), + - the actual parameters are WFFs, + - the formal parameter list and the actual parameter list + are statically compatible in the sense given below. + + Let us recall (5.3.5.) that a formal parameter list of a unit M is + defined as a concatenation of the lists of units belonging to the prefix + sequence of M. + + Static compatibility of parameters. + + The list of formal parameters (Pf1, ..., Pfj) is statically compatible + with the list of actual parameters (Pa1, ..., Pak) if j=k and for i=1, ..., + k the following conditions hold: + + - if Pfi is an input/output formal parameter then Pai is a + WFF of a static type which is statically compatible with + the static type of parameter Pfi, + - if Pfi is an output/inout parameter then Pai is a + variable, + - if Pfi is a formal function (procedure) then Pai is a + function (procedure) identifier, + - if Pfi is a formal type then Pai is a non-primitive type + identifier. +1 - 78 - + + + SEMANTICS. + ---------- + + The allocation of a unit object O is defined if: + - the unit and its environment are determined, + - the list of formal parameters is dynamically compatible + with that of actual parameters (in the sense provided + below), + - three steps of actions, called prologue, body, and + epilogue, are determined. + + Note the difference between the unit identifier and the unit itself. The + environment is the object which becomes the syntactic father of O. In the + case of a formal subprogram, the unit identifier may be replaced by one of + many existing units. Denote by O1 the object containing the given unit + object allocation statement. The prologue computes the values for input + formal parameters, determines the addresses of output actual parameters, + and determines actual subprograms/types. The prologue is executed in the + environment of the object O1. The body transfers the control to the + statements from the prefix sequence of the given unit. Those statements are + executed in the environment of the object O. + The epilogue transmits the values of output formal parameters (in the + environment of the object O1). + + Unit environment + + Consider the allocation of a unit which is not a block. A unit identifier + has one of the following forms: + + (a) M, + (b) X.M or X.new M . + + Ad (a). Let the static location of the given occurrence of M be + determined by the attribute M of the unit T. Consider three cases: + + (a1) M is an attribute of T and it is neither a virtual attribute nor a + formal parameter. Then the declaration of M is determined as (at + compilation time) as the declaration of the attribute M of unit T. The + environment of the unit M is the dynamic container of identifier M with + respect to the object O1. + + (a2) M is a virtual attribute of T. Then the declaration of M is + determined at run-time by the dynamic location of identifier M with respect + to the given occurrence (see 6.1.5.). The environment is determined as in + (a1). + + (a3) M is a formal subprogram of T. Then the declaration of M and its + environment are taken from the dynamic container of the identifier M. The + dynamic container is determined with respect to the object O1. + + Ad (b). Let X be a well-formed object expression of type R, let M be a + not close attribute of R, and let the expression X be defined. Denote by O2 + the non-empty object of unit R0 (R pref* R0) which is pointed to by X. The + cases (a1)-(a3) have to be considered in the same way as the above ones. + The descriptions differ in that the environments are determined with + respect to the object O2. Note that the environment of the object becomes + the syntactic father of the object O. +1 - 79 - + + + Dynamic compatibility of parameters. + + First let us note the difference between the determination of dynamic type + for the actual parameter Pa and the formal parameter Pf. The dynamic type + of Pa is determined in the environment of the object O1 (containing the + given allocation). It means that for the formal type S the actual type is + taken from the dynamic container with respect to O1. Recall that it + corresponds to the determination of the valuation of identifier S in the + SL-chain of O1 (according to the visibility rules) and taking the text of + declaration assigned to S (cf. 6.1.5.). + The dynamic type of Pf is determined in the corresponding environment. It + means that for the formal type S the actual type is taken from the + corresponding dynamic container. In other words, the valuation of + identifier S is searched for in the SL-chain of the environment (according + to the visibility rules). + + The list of formal parameters is dynamically compatible with the list of + actual parameters if the following conditions hold: + + - if Pfi is an input formal parameter, then Pai is defined and + the dynamic type of Pfi is dynamically consistent with the + type of the value of Pai, + - if Pfi is an output/inout formal parameter, then Pai is + defined and the dynamic type of Pai is statically consistent + (!) with the dynamic type of Pfi, + - if Pfi is a formal function (procedure), then the lists of + formal parameters of Pfi and that of Pai must be of the same + pattern (disregarding the descriptions of subprogram + parameters). They may differ in the parameter identifiers, and + they may differ in the class types of corresponding parameters + (however, the class types must belong to the same prefix + sequence), + - if Pfi is a formal function, then the dynamic type of Pfi + prefixes the dynamic type of Pai, or the two types are + identical. + + The above conditions are checked from left to right (i.e., for i=1, ..., + k). + + Recall that in the following description of prologue and epilogue the + computations of the values and addresses for formal parameters and actual + ones are performed in the syntactic environment of the object O1. +1 - 80 - + + + Prologue. + + The prologue consists of the following steps: + + (i) The frame for a new object O is allocated, the object O1 is called + the dynamic father of the object O. The sequence of dynamic fathers creates + a chain called the DL chain (DL for dynamic links); + + (ii) For the input and inout formal parameter Pf, the value of the + corresponding actual parameter is computed and assigned to Pf; + + (iii) For the output and inout formal parameter Pf, the address of the + corresponding actual parameter Pa is computed (in other words, the prologue + of the assignment of Pf to Pa is performed); + + (iv) For the formal type parameter Pf, the corresponding actual type Pa + is determined. According to 6.1.5. the valuation of the object O assigns + the text of the determined type Pa to the identifier Pf. Therefore as long + as that object exists the access to Pf is well-defined and connected with + Pa; + + (v) For the formal subprogram parameter, the actual subprogram is fixed + (in the same way as the determination of the allocated unit and its + environment). + + + After the execution of the epilogue the control is transferred to the + object O. Let M1, ..., Mk=M be the prefix sequence of M. The execution of + the statements from the object O begins from the first statement of the + unit M1 (for the description of the further progress of computation, see + inner statement, 9.1.3.). Note that those statements are executed in the + syntactic environment of the object O. When the control returns to the + calling object O1, the actions of the epilogue are performed. +1 - 81 - + + + Epilogue. + + The epilogue consists of the following steps: + + (i) For the output and inout formal parameter Pf the actions of the + epilogue for the assignment Pa:=Pf are performed, where Pa is the actual + parameter corresponding to Pf. It means that the value of Pf (computed + during the execution of the body) is assigned to Pa (this address was + computed during the prologue); + + (ii) If the unit is a function, then the result of the given call is + determined by the current value of the corresponding variable result, + + (iii) If the unit is a generalized class, then the result of a new M is a + reference to the object O; + + (iv) A terminated object (cf. 9.1.3.) of a block or a subprogram is + deallocated. However, the terminated object of a generalized class is + accessible as long as there is a reference pointing to it (unless it is + directly deallocated by means of the kill statement). + + + Remark. + ------- + + Note that for the input formal parameter Pf of non-primitive type, the + value of the corresponding actual variable parameter Pa may be updated + (both the formal parameter and the actual one point to the same object). In + order to access the value of Pa without the possibility of its modification + one can use the copying statement Pf:=copy(Pf) at the end of the unit body. + + End of remark. + -------------- +1 - 82 - + + + Array generation. + ----------------- + + + SYNTAX. + ------- + + + : + + ----> new_array -----> -----> ( -->! + ! + !<----------------------------------------------! + ! + !--> --> : --> --> ) --> + + + A declaration of a variable of an array type fixes the type of the array + elements; bound pairs are fixed at the time of generation. + + CONTEXT. + -------- + + A statement new_array Y dim (l:u) is a WFF if: + + - Y is a variable of the type (array_of)T, where i>0, T is a type + identifier; + + - l, u are WFFs and arithmetic expressions. + + The above statement is considered to be an assignment of a reference (to a + newly created object) on the variable Y. + + SEMANTICS. + ---------- + + The following actions are performed: + + - determine the address of variable Y; + - compute the values l1, u1 of expressions l, u; + - put l0, u0 truncations of l1, u1 respectively; + - check the condition l0<=u0; + - generate an array object and assign its address to Y. + + The initial values of attributes (l0), ..., (u0) depend on their type of + the form (array_of)T. + The value of an array type variable may be changed by means of + assignment, copying, and generation statements. The generation of an + n-dimensional array consists of n steps. The first dimension is generated: + e.g. new_array Y dim (l1:u1), + next the second dimension: + e.g. for i:=l1 to u1 do new_array Y(i) dim (li2:ui2) od + and so on. Unregular arrays can be generated in this way. +1 - 83 - + + + 9.1.2.2. Deallocation statement + ******************************* + SYNTAX. + ------- + : + + ----> kill ----> ( ----> ----> ) ---> + + CONTEXT and SEMANTICS. + ---------------------- + + A statement kill(X) is a WFF if X is a well formed object expression of + compound type. The statement kill(none) is always WFF and it is equivalent + to the empty statement. + The statement is defined if X points to an object O not belonging to the + SL chain or DL chain of an active object. By an active object we mean the + object containing the statement currently being executed (notice that in + the case of parallelism there may co-exist several active objects). + The execution of the statement results in the deallocation of object O, + all variables pointing to O are set to none. The deallocation of an object + which belongs to the SL chain or DL chain of an active object results in a + run-time error. + The statement kill(X) where X points to a coroutine head is described in + 9.1.4. The statement kill(X) where X points to a process is described in + 11.1. + + Remark. + ------- + + After a block or subprogram termination, the corresponding object is + automatically deallocated. On the other hand, the array, class, coroutine, + or process objects are not automatically deallocated. The computer memory + may be overloaded with such objects even if they are no longer referenced. + Those objects are recovered with the help of the system program called the + garbage collector. The user can help in the execution of that system + program and increase the efficiency of his program execution if he + deallocates unnecessary objects. One should realize, however, what are the + effects of deallocation (in particular, a side effect consisting in the + modification of the values of all variables which point to the same + deallocated object). + + End of remark. + -------------- + + Example. + -------- + + The deallocation of a binary tree can be performed by means of the + following recursive procedure: + + unit tree_kill: procedure (n:node); + begin + if n.l=/=none then call tree_kill(n.l) fi; + if n.r=/=none then call tree_kill(n.r) fi ; + kill(n) + end tree_kill + + where the class node has the form + + unit node: class; + var l, r: node ; +1 - 84 - + + + end node; +1 - 85 - + + + 9.1.3. Simple control statement + ******************************** + + + There are two kinds of simple control statements: a textual control + statement and a dynamic control statement. In this section we shall + consider the occurrence of a control statement in the object O of the unit + M, in the body of the unit Mj, where M has the prefix sequence M1, ..., + Mk=M, and 1<=j<=k. + + SYNTAX. + ------- + + : + + -----> --------> + ! ^ + !--> --->! + + : + + -------> inner -----> + ! ! + ! ! + !-----> exit ----->! + ! ! ! ! + ! !<------! ! + ! ! ! + !---> repeat ----->! + + + SEMANTICS. + ---------- + + For j=1, ..., k-1 the execution of the inner statement results in the + commencement of the execution of the unit Mj+1. The inner statement in the + body of the unit Mk=M is empty. + + ------- ------- ------- ------- + ! ! ! ! ! ! ! ! + inner < inner < ........ < inner < ..... + ! ! ! ! ! ! ! ! + ------- ------- ------- ------- + + body of M1 body of M2 body of Mk-1 body of Mk + + The semantics of repeat and exit statements will be defined jointly with + the semantics of a loop statement, see 9.2.3.. +1 - 86 - + + + SYNTAX. + ------- + + + : + + ---------> return -----------> + + SEMANTICS. + ---------- + + In this section we shall describe the semantics of a return statement and + a pseudo-statement end (which bound a unit declaration). + An object may be in one of the following three states: non-generated, + generated, terminated. An object is non-generated until the control reaches + the first return statement. From that moment an object becomes generated. + An object is terminated after the execution of its end statement. The main + program is considered to be always generated. A generated object is + considered to have no dynamic father (its DL is none). Note that the + execution of a terminated object cannot be resumed. However, the execution + of the generated object of a coroutine or a process can be resumed and + suspended. The return statement is empty if M is a coroutine and O is + generated. If M is a block, subprogram, or generalized class and O is + non-generated then O becomes generated. The control returns to the dynamic + father of O. For a coroutine or process the statement following the return + statement is a reactivation point. + + Now we shall consider the execution of the final end. For j=2, ..., k the + execution of the final end results in the control transfer to the statement + following the inner statement from the unit Mj-1. Suppose that j=1. If O is + a non-generated object of a coroutine, then O becomes generated and the + control returns to the dynamic father of O. Otherwise (O is a + coroutine/process object) the object O becomes terminated. The control + transfer is the same as in the case of detach statement. Moreover, if M is + a process, then the control becomes idle (and the corresponding processor + may be released, see 11). +1 - 87 - + + + 9.1.4. Coroutine statement + *************************** + + SYNTAX. + ------- + + : + + ------> detach ----------------------------------------------> + ! ^ + !-----> attach ----> ( ---> --> ) -->! + + CONTEXT and SEMANTICS. + ---------------------- + + By a chain of coroutine N with the head Ol we shall mean the DL chain of + objects O1, ..., Ol such that: + - for i=1, ..., l-1 the object Oi+1 is the dynamic father of Oi; + - Ol is the generated object of the coroutine N; + - Ol is non-terminated. + Thus the chain contains non-generated objects with the exception of the + head, which is generated but non-terminated. + The execution of a kill(X) statement where X points to the head Ol of the + coroutine chain results in a deallocation of the entire chain. + + The chain may be in one of the following two states: + - detached - the execution of the statements contained in this + chain is suspended, the object O1 contains a distinguished + point, called the reactivation point of the chain; + - attached - a statement from the object O1 is currently + executed. + + In the case of a sequential program exactly one chain is operational, + i.e., in the attached state. Note that a coroutine head may be the main + program. Coroutine control statements change the states of coroutine + chains. A reference to the coroutine chain W1 which has recently + transferred the control to the chain W is associated with chain W. Let us + denote this reference by CL (coroutine link). This link is then used by the + detach statement. Suppose that the object O (containing the occurrence of + the coroutine control statement) belongs to the chain W of the coroutine N + with the head Ol. + The statement attach(X) is a WFF if X is a well formed object expression + or the system variable main. The statement is defined if X points to the + head O1 of a coroutine chain W1. The execution of the statement results in + changing the state of W to a detached one and that of W1 to an attached + one. The statement determined by the reactivation point of the chain W1 + starts its execution. The CL link to the chain W is associated with the + chain W1. If O=O1 then the statement is empty. + The statement detach is defined except the case where the CL link of + chain W is none. The execution of the statement results in detaching the + chain W and attaching the chain W1 determined by the corresponding CL link + associated with W. The statement following the detach statement is the + reactivation point of the chain W. The execution of the chain W1 is resumed + at its reactivation point. +1 - 88 - + + + 9.2. Compound statements + ************************* + + Compound statements define case analysis (conditional and case statement) + and iteration (loop statements). + + + SYNTAX. + ------- + + --------> + ! ^ + !-----> ------->! + ! ! + !-----> ------->! + + + + + 9.2.1. Conditional statement + ***************************** + + + SYNTAX. + ------- + + + : + + ---> if --> --> then --> + ! ! ! + !---> ------->! ! + ! ! ! + !---> ------>! ! + ! + ! + ! + <-----------------------------------------------! + ! ! + !------> else --> --------> fi ----------> + + + + +1 - 89 - + + + : + + ---- -----------------> + ! ! + !<------- or_if <----------! + + + : + + ---- -----------------> + ! ! + !<------ and_if <----------! + + + CONTEXT and SEMANTICS. + ---------------------- + + + For the execution of an if statement of the form: + + if B1 or_if B2 ... or_if Bj + then + G + else + H + fi + + + the boolean expressions B1, .., Bj are evaluated in succession until the + first one evaluates to true, then the sequence G of statements is executed. + If none of the boolean expressions evaluates to true, then the sequence H + is executed. The conditional statement with the "else" part omitted is + equivalent to the conditional statement with the empty statement following + the else symbol. If the "andif" list occurs instead of the "orif" list, + then the expressions B1, ..., Bj are evaluated in succession until the + first one evaluates to false; then the sequence H is executed. Otherwise + the sequence G is executed. When a boolean expression occurs instead of an + "orif" or "andif" list, then its value controls the execution of the + conditional statement in the standard manner. +1 - 90 - + + + 9.2.2. Case statement + ********************** + + SYNTAX. + ------- + + : + + ----> case --! + ! + !-----------! + ! !-------------------->! + ! ! ! + ! <---- <--- : -----! ! + ! ! ! ! + !-> ---> when ---> ----------->! ! + ! ^ ! ^ ! ! + ! ! -> ->! ! ! + ! ! ! ! + ! <----- , -------------! ! + ! ! + !-> ---> when --->->:-! ! + ^ ^ ! ^ ! ! ! + ! ! !-> ->! ! ! ! + ! ! ! ! ! + ! !<--------- , --------! ! ! + ! ! ! + !<------ <----------! ! + ! ! + ! ! + <------------------------------------------------------------! + ! ! + ! ! + !-> others ----> ---------> esac ----> + + + + CONTEXT and SEMANTICS. + ---------------------- + + A statement: + + case E + when l1:G1 + ... + when lk:Gk + others H + esac + + is a WFF if E is an arithmetic or character expression and l1, ..., lk are + sequences of different constants. If the list H is empty, then the "others" + part can be omitted. + The case statement selects for execution a sequence Gi where the value of + E belongs to the sequence li. The choice others covers all values (possibly + none) not given in the previous choices. The choices in a case statement + must be mutually disjoint and if the "others" part is not present they must + exhaust all the possibile values of the expression E. + + + +1 - 91 - + + + 9.2.3. Iteration statement + *************************** + + + SYNTAX. + ------- + + + : + + + -------> ----------------------------------------> + ! ^ + !---> --------------------->! + ! ! + !---> -------------->! + + + : + + + ---> do -----> ----> od ---> + + + : + + + --> while --> --> do --> --> od --> + + + : + + ---> for ---> -->:= --> -->! + ! + <------------------------------------------------------------------! + ! ! + !--> step --> ----> to ----->! + ! ! + !-->downto-->! + ! + <---------------------------------------------------! + ! + !-> -->do--> --->od --> +1 - 92 - + + + CONTEXT and SEMANTICS. + ---------------------- + + Let us start from the semantics of loop and exit statements. The loop + statement: + + do + G + od + + causes the iteration of the sequence G until an exit statement is + encoutered. + Consider the occurrence of the exit statement exit ... exit(k-times) + where k >=1 . Let us denote this statement by H. Suppose that statement H + occurs in l (l>=0) nested iteration statements G1, ..., Gl, i.e., the + statement G2 is nested in G1, G3 in G2, etc. Let M be the smallest unit + enclosing that occurrence of H. + If k>l then the execution of H causes the termination of the unit body M + (jump to the final end). Otherwise the iteration statement Gk terminates, + and either the execution of the iteration statement Gk-1 is continued if + k=i + do + G; + i:=i+Av2 + od + + The statement (**) is equivalent to the above sequence of statements with + the condition Av3>=i replaced by Av3<=i and the assignment i:=i+Av2 + replaced by i:=i-Av2. The variables Av1, Av2, Av3 are fictitious variables + introduced only in order to define the semantics. The expression step A2 + may be omitted if the value of A2 equals 1. The value of the controlled + variable i should not be modified inside the loop (however, the result of + such a modification would be well-defined). Moreover, its value is + determined when loop is terminated according to the introduced semantics. +1 - 94 - + + + Examples. + --------- + + + (1) A palindrome is a word which is identical when written from left to + right and conversely. The given algorithm looks for the first occurrence of + a palindrome in a text and writes its length, (if found). + + unit palindrome: procedure; + var i, j, k: integer, + text: array_of character; + begin + read(j); + new_array text dim (1:j); + for k:=1 to j + do + read (text(k)) + od; + for i:=2 to j + do + k:=1; + while text(k)=text(i-k+1) + do + k:=k+1; + if k>i-k+1 + then + write ("found at i-th item"); + return + fi + od + od; + write ("not found") + end palindrome; +1 - 95 - + + + (2) A dictionary is a data structure S with the following operations: + + member(x, S) - determines whether x is a member of S + insert(x, S) - replaces S by the union of S and (x) + delete(x, S) - replaces S by the difference of S and (x) + + The elements of the set S are assumed to be of the same type T and to be + ordered by the relation less. A dictionary will be implemented by means of + binary search trees. The user has the access to the operations member, + insert, and delete and does not have to bother about the way of their + implementation. Below we propose how to accomplish these operations as + coroutines. + + unit bst: class (type t; function less(x, y:t):boolean); + hidden root, e, i, d; + var root: node, member: e, insert: i, delete: d; + unit node: class (value: t); + var l, r: node; + end node; + + unit e: coroutine; (*elem- output attribute*) + close trick, q, v; + var trick, elem: boolean, q, v: node, x:t; + begin + return; + do trick, elem:=false; (* loop for member *) + q:=root; + v:=none; + while q=/=none + do + if less(x, q.value) + then v:=q; q:=q.l + else + if less(q.value, x) + then v:=q; q:=q.r + else elem:=true; exit + fi + fi + od; + inner; (* elem=true iff x belongs to S *) + detach; + od + end e; + + unit help: E coroutine; + taken trick, elem, q, v, x; + begin + inner; (* trick=true iff x does not belong to S *) + if not trick then exit fi; + if v=none + then root:=q + else + if less(x, v.value) + then v.l:=q + else v.r:=q + fi (* after insert or delete *) + fi (* attach new node q to its father v *) + end help; +1 - 96 - + + + unit i: help coroutine; + taken trick, elem, q, x; + begin + trick:=true; + if elem then exit fi; + q:=new node(x) (* insert is a dummy if x belongs to S *) + end i; + + unit d: help coroutine; + taken elem, q; + hidden close w, u, s; + var w, u, s: node; + begin (* delete is a dummy if x does belong to S *) + if not elem then exit fi; + w:=q; + if q.r=none + then q:=q.l + else + if q.l=none + then q:=q.r + else u:=q.r; + if u.l=none + then u.l:=q.l; q:=u + else + do s:=u.l; + if s.l=none then exit fi; + u:=s + od; + s.l.:=w.l; u.l:=s.r; + s.r:=w.r; q:=s + fi + fi + fi; + kill(w) + end d; + + begin + member:=new e; insert:=new i; delete:=new d; + inner; + kill(member); kill(insert); kill(delete) + end bst; + + pref bst(t, less) block + taken member, insert, delete; + var y:t; + ... + begin + ... + member.x:=y; + attach(member); + if member.elem then ... fi; + ... + insert.x:=y; + attach(insert); + ... + delete.x:=y; + attach(delete); + ... + end; +1 - 97 - + + + 10. Exception handling + ####################### + + + This section defines the facilities for dealing with errors or other + exceptional situations that may arise during program execution. An + exception is an event that causes a suspention of normal program execution. + The occurrence of an exception is expressed by raising a signal. Executing + some actions in response to the arising of an exceptional situation, is + called signal handling. + + Signal names are introduced by signal specifications. Signals can be + raised by raise statements, or alternatively, their raising is caused by an + occurrence of a run-time error. When an exception arises, the control can + be passed to a user-pointed handler associated with the raised signal. The + principles of determining a handler that responds to the raised signals are + presented in 10.3. + + + 10.1 Signal specification + ************************* + + + SYNTAX + ------ + + : + + ----> signal ---> ---> ( --> --> ) -->; --> + ! ! !! + ! !-------------------------------->!! + !<---------------------- , ---------------------------! + + CONTEXT + ------- + + The signal specification defines signals which can appear in raise + statements and in signal handlers within the scope of the specification. + The identifiers of system signals, i.e., signals associated with run-time + errors, are not specified in the signal specification. + Signal identifiers are not accessible by remote access. They can occur, + however, in a hidden, close or taken list of a unit. +1 - 98 - + + + 10.2 Signal handlers + ******************** + + The response to one or more signals is specified by a signal handler. + + + SYNTAX + ------ + + : + + ---> handlers + ! + !-----------> when ---> --> : --> --! + ! ! ! ! + ! !<------ , -------! ! + ! ! + !--------<------------------------------------------------------! + ! + !-----------> others ----> --! + ! ! + !----------------------------------------> end handlers + ! ! + !--------------> + CONTEXT + ------- + + Handlers' declaration may appear at the end of the declaration part of a + unit. All identifiers visible in the unit and the signal formal parameters + may be used in the handler statements. A handler can handle the named + signals. A handler corresponding to the choice others handles all signals + not listed in the previously specified handlers, including those whose + identifiers are not visible within the unit. + + Any statement (except inner) whose occurrence in a unit is legal may + occur in the handler. + + Restrictions + ------------ + + The formal parameter lists of signals associated with the same handler + must be identical. + + Example + ------- + + + handlers + when emptytree: T:=new treelem; return; + others write(" signal not handled"); raise Error; + end handlers +1 - 99 - + + + 10.3. Signal raising + ******************** + + SYNTAX + ------ + + + ----> raise ---> --> ( --> --> ) -----> + ! ! + !----------------------------------->! + + + CONTEXT + ------- + + The signal name in the raise statement ought to be visible in the unit in + which the raise statement appears. The formal and actual parameter lists of + the signal must be compatible. + + Example + ------- + + raise empty(exprstack); + raise end_of_file (input); + + SEMANTICS + --------- + + When a signal is raised, the normal process execution is suspended and + the control is passed to a signal handler. The actual parameters are + transmitted to the handler, as in the case of a procedure. However, the + crucial point of exception handling is the way in which such a handler is + searched for and activated. Below we present the principles of handler + determination. + + Let us assume that signal f is raised in object Ok. This object and its + corresponding DL-chain may be illustrated as follows: + + + ------------ ------------ ------------ + ! ! ! ! ! ! + ! ! !handlers ! ! ! + ! !<---...........<---!when f !<---........<---!raise f ! + ! ! ! ! ! ! + ! ! ! ! ! ! + ------------ ------------ ------------ + O1 Oi Ok + + where O1 is the object of a coroutine or a process. +1 - 100 - + + + The objects in the DL-chain of Ok are successively checked whether they + contain a handler for signal f or a handler corresponding to the choice + others. The object Ok is checked first, next the object Ok-1 is checked and + so on. This search stops when the first object Oi containing the handler + for f or the handler for others is found. If such a handler is not found in + this DL-chain, then the system trap handler is executed and the process + terminates. + For the situation presented in the figure, the handler from object Oi is + executed, provided that none of the objetcs Oi+1, ..., Ok contains a + handler for signal f or the handler for others. + + In a concatenated object, i.e., in an object corresponding to a unit with + a non-empty prefix, the handlers declared in the prefixing unit are covered + by the handlers declared in the prefixed unit if they have the same + identifiers. Thus the signal raised during the execution of the prefix + statements may be handled by a handler declared in the prefixed unit. The + handler corresponding to the choice others responds to all the signals not + listed in the handlers declared in the units from the prefix sequence. The + handler for the choice others is taken from the innermost unit (with + respect to prefixing). + + Example + ------- + + block + unit A: procedure; + begin + ... + raise f + ... + end A; + unit B: procedure; + handlers + when f: .....; (* <----------- handler H1 *) + end handlers + begin + ... + call A; + ... + raise f; + ... + end B; + signal f; + handlers + when f: .....; (* <----------- handler H2 *) + end handlers; + begin + ... + raise f; + ... + call B; + ... + end + + If signal f is raised in the block satement, hanlder H2 will be executed. + If signal f is raised in procedure B or in procedure A, handler H1 will be + executed. +1 - 101 - + + + block + signal f; + unit A:class; + signal g; + handers + when g: .....; (* <---------- handler G1 *) + end handlers; + begin + ... + raise f; + ... + raise g; + ... + end A; + unit B:A class; + handlers + when f: .....; (* <---------- handler F1 *) + when g: .....; (* <---------- hadller G2 *) + end handlers; + begin + ... + raise f; + ... + raise g; + ... + end B; + begin + ... + end; + + If signal f is raised in an object of class B, handler F1 will be + executed. If signal g is raised in an object of class B, handler G2 will be + executed even if the signal is raised in the statements of class A. +1 - 102 - + + + 10.4. Handler execution + *********************** + + A handler execution terminates if one of the special control statements + is executed. + + SYNTAX + ------ + + : + + ------> return ----->! + ! ! + --->!---> wind ---------------> + ! ! + !---> terminate ---->! + + CONTEXT + ------- + + The statements wind and terminate may appear only within a handler + declaration. If none of them occurs in a handler statement list, the + statement terminate is assumed to be the last statement in such a list. + The execution of the statements wind and terminate causes an abnormal + termination of the corresponding objects from the DL-chain (see below). In + that case, the "last-will" statements are executed before the termination + of the objects. + + + SYNTAX + ------ + + : + + -----> last_will ----> : ---> -----------> + + CONTEXT + ------- + + Any unit body may be terminated with a sequence of statements labelled by + last_will. They are not executed during normal program execution. The + statement inner must not occur within the "last-will" statements. +1 - 103 - + + + + + SEMANTICS + --------- + + Let us assume that a signal f raised in an object Ok is handled by a + handler H from an object Oi: + + + O1 Oi-1 Oi Oi+1 Ok + ----- ----- ----- ----- ----- + ! ! <---...<---! !<---! !<----! !<---........<---! ! + ----- DL ----- DL ----- DL ----- DL ----- + ! ! + ! SL ! + ----- ! + ! ! H-------------------------------->! + ----- + + The statement return in a handler has a similar effect to that of the + statement return in a procedure. The handler object is deallocated and the + control is passed to the statement just following the corresponding raise + f. + The execution of the statement wind causes the termination and the + deallocation of the objects H, Ok, ..., Oi+1. Before the termination of + each of them, the "last-will" statements, if any, are executed. They + complete the object execution. In the prefixed object the "last-will" + statements of each prefix are successively executed, starting from the + innermost and ending on the outermost prefix. When the termination and + deallocation of these objects is completed, the control is passed to object + Oi, where the computation is continued in a normal way. Note that the wind + statement in the case of k=i is equivalent to return. + + The statement terminate causes the termination and the deallocation of + the objects H, Ok, ..., Oi+1, Oi. They are completed as in the case of + wind, i.e., the "last-will" statements are executed as well. The control is + passed to Oi-1, if such an object exists. If Oi-1 does not exists, i.e., Oi + is the head of the DL-chain, then this head is terminated (cf. the + semantics of the end statement of coroutine and process). + + + Remark + ------ + + If any control statement (raise, detach, attach, etc.) is executed within + the "last-will" statements and the control returns to the interrupted + object, the execution of the "last-will" statements as well as the + termination of the remaining objects in the DL-chain will be continued. + + End of remark + ------------- +1 - 104 - + + + 10.5. System signals + ******************** + + Some of the signals, called system signals, are predefined in the + language. They are raised automatically when a run-time error or another + exceptional system situation appears. + System signals have no parameters. They are not declared in the signal + specification, but the user may declare handlers for them. The execution of + the statement return is not allowed in the handler responding to such a + signal (note that sometimes the statement wind is equivallent to return). + + The following signals are predefined in the language: + + acc_error + A remote access to a non-existing object or an error in the + expression ...x qua A (x does not exist or the type of the object + pointed to by x is not prefixed by the type A). + mem_error + There is no free space for the allocation of a new object. + num_error + A numerical error, such as for instance integer overflow, + floating-point overflow, division by zero etc. + log_error + Any kind of the LOGLAN Running System error (except access error) + like e.g., an attempt to pass the control in a way inconsistent + with the LOGLAN-82 rules, an attempt to kill an active object, etc. + con_error + The value of an index expression exceeds the range of array indices + or the array bounds are incorrect. + sys_error + Any kind of system error like e.g., input-output error, parity + error, etc. + + Some other errors may also be introduced as system errors but are not + predefined in the language. +1 - 105 - + + + 11. Processes + ############## + + + Let us consider a snap-shot of a program's computation. This snap-shot is + called a configuration. Up till now a configuration has consisted of a + finite number of objects creating a number of coroutine chains. The main + program is the only chain with the head of process type. + Moreover, exactly one object has been considered "active" - i.e., its + statements have been executed by a physical processor. By a physical + processor we mean here an actual processor as well as the portion of time + of a central unit. + A configuration with many active objects illustrates the computation of a + program with parallel statements. Concurrent computation to some extent + generalizes coroutines, i.e., a configuration may contain many coroutine + chains with heads of coroutine type and many process chains with heads of + process type. + The fundamental notion is that of a process. A process may be treated as + a sequential program - only one statement of a process is being executed at + a time. A parallel program consists of a number of processes. In LOGLAN-82 + a process is a system type. A process object may be generated by means of + the new statement. The generated process object is suspended with the + execution of the return statement. This process may be resumed by means of + the resume statement. After resumption, process statements are executed by + a new processor, concurrently with the other active processes. During its + computations, the process may suspend its actions (but not the actions of + other processes) by means of the stop statement, then it may be resumed + again, and so on. + Observe that the attach and detach statements switch the processors from + one object to another, while the resume and stop statements acquire and + release a processor respectively. Resumption of a coroutine chain is + connected with the control transfer from the active coroutine chain. + Resumption of a process chain acquires new processor for that chain. + Similarly, suspension of a coroutine chain gives the control back to + another chain, while suspension of a process chain releases the processor. + Note that a process object is more complex than a coroutine object. So + coroutine operations are more efficient with respect to time and space. + Therefore the user should use processes only when they are indispensable. +1 - 106 - + + + In order to deal with communication among processes (e.g., by messages) + as well as their competition in acquiring a resource (such as a shared + variable) one should have the ability to define some synchronizing + operations. Those operations arise from the following constrains: + + - timing, i.e., mutual exclusion of actions; + - scheduling i.e., stating which of the waiting processes is to be resumed + as the first one. + + + For this purpose some synchronizing facilities are provided. One may think + of many such facilities, from low level ones, such as Dijkstra's semaphores + to high level ones, such as Hoare's monitors. The decision which one of the + synchronization methods should be chosen and incorporated into the language + is weighty. The primitive tools are difficult to use, but they are + efficient. The high-level constructs are safer, but they often limit + parallelism (because of the strong synchronizing constraints). + The synchronizing facilities introduced in LOGLAN-82 are elementary (low + level). Therefore they are implemented efficiently in the kernel of the + operating system. However, the high-level facilities e.g., monitors (see + [5], [6]), can be defined with their help. The user can, for a concrete + synchronization problem, make a choice between the pre-defined facilities + or program other ones. The low-level facilities are hidden when the high + level facilities are used. Thus, the properties of the latter cannot be + disturbed. + In any case, speaking about a parallel execution of processes, we mean + that they are executed really in parallel, independently of the relations + between a number of "ready" processes and a number of available processors + (the details of processor management are hidden in an operating system). + + + + SYNTAX. + ------- + + + : + + ------> -----------------> + ! ^ + !--> ----->! + + +1 - 107 - + + + 11.1. Transition state statement + ********************************* + + + Each process can be in one of five states: active, suspended, locked, + awaiting, terminated. The transitions among these states are described by + the following graph (where X denotes the reference to the given process and + Z a semaphore): + + + + **************** + * awaiting * + **************** X:=new + ! ! ! + ! ! ! + end of son! ! wait ! + ! ! ! + lock(Z) v ! v + ************* <------ ************* ------------> *************** + * locked * * active * stop * suspended * + ************* -------> ************* <----------- *************** + unlock(Z) ! resume(X) + ! + ! end of X + ! + v + ****************** + * terminated * + ****************** + + + + We shall now present the syntax and semantics of object expressions and + statements connected with the transitions of the process states: + + SYNTAX. + ------- + + + : + + !---> ------------> + ! ! + !---> ------->! + ! ! + !------> ------->! +1 - 108 - + + + + + : + + -----> stop --------> ( ---> ----> ) -------> + ! ^ + !--------------------------------->! + + + : + + ----> resume -----> ( ---> ---> ) ------> + + + : + + -----> wait --------------------------------------------> + + + SEMANTICS. + ---------- + + + From now on we shall consider the occurrence of the transition state + statement in the object O which belongs to the process R (i.e., there + exists a DL chain connecting the object O with the object O(R) of the + process R). If the process O(P) is generated in the process O(R), then the + process object O(R) is called the father of the process object O(P), and + O(P) is called a son of O(R). + The execution of the statement resume(X), where X points to the process + object, causes resumption of that process, providing that it was previously + suspended. Otherwise a run-time error occurs. +1 - 109 - + + + The statement stop suspends the process R. The statement stop(Z) is a + WFF if Z is a variable of type semaphore. The execution of this statement + suspends the given process and simultaneously opens semaphore Z. The + indivisibility of those actions means that no other process can refer to + the variable Z in the meantime (the statement stop(Z) is useful in the + synchronization of processes, see 11.2.). + + A process may wait for the termination of its son with the help of the + wait expression. The execution of the expression wait in an object + belonging to the process R causes waiting for the termination of any son of + the process R. When the first such son terminates its actions, the + reference to that son is returned as the value of wait and process R + continues its computation. If the process S does not embrace a + non-terminated son, the value of the expression wait is none. Thus the + execution of the statement + + while wait =/= none do od + + causes waiting for the termination of all the sons of the given process. + + The execution of the deallocation statement kill(X) where X points to a + process depends on its state. When that process is suspended or terminated, + then the execution of this statement is the same as in the case of a + coroutine. Otherwise it results in a run-time error. + + + Relations between parallel and coroutine computations. + + LOGLAN-82's coroutine computations can easily be simulated by means of + parallel computations. Coroutine computations are provided in LOGLAN-82, + nevertheless, in order to deal with the case of interleaving processes. + With coroutines instead of processes, one can avoid unnecessary memory + overloading by data structures inherited for processes and, moreover, + unnecessary scheduler activations. + Each process is also a coroutine, and so a process may also be subject to + the coroutine operations detach and attach. Therefore, the description of + possible state transitions provided above should be extended to transitions + caused by coroutine operations. + The execution of attach(Y) in the active process X results in the control + transfer from process X to process Y, i.e., if Y is not suspended then the + statement is illegal, otherwise process X becomes suspended and process Y + becomes active. + The execution of the detach statement in the active process X has the + effect as the execution of attach(Y), where Y is the coroutine (process) + recently resumed (by means of attach statement) by process X. +1 - 110 - + + + 11.2. Primitive synchronizing statement + **************************************** + + + SYNTAX. + ------- + + : + + ----> lock ----> ( ---> ---> ) ----> + ! ^ + !-> unlock -! + + + The expression test-and-set (ts) is a boolean expression (see 8.4.). + + + : + + -----> ts ---> (--> ---> ) ---> + + SEMANTICS. + ---------- + + The variable Z occurring in the expression ts(Z) has to be of type + semaphore. Evaluation of the expression consists in indivisible actions: Z + is closed and the returned value is true iff Z was open. + The statement lock(Z) is a WFF provided Z is a variable of type + semaphore. If Z is closed then the process which executes this statement is + suspended until Z becomes open. If Z is open then exactly one process of + those waiting for this event (having executed the lock instruction) will be + able to perform its actions. The others remain suspended as long as Z + becomes open again. Then exactly one process is allowed to proceed and Z + becomes closed. + The statement lock(Z) guards the entry into a critical region, i.e., a + sequence of statements, which are to be executed by only one process . The + entrance into a critical region may be of the form + + while ts(Z) do od + + as well, but it would cause busy waiting of processes awaiting for the + entrance. The statement lock is implemented in the operating system kernel + and its execution does not engage the processors by delayed processes. + + The exit from a critical region is offered by one of the following two + statements: stop(Z) or unlock(Z). The former statement is described in + 11.1. The unlock statement is a WFF provided Z is a variable of type + semaphore. The execution of this statement brings about the following + indivisible actions: Z becomes open, and if there are processes waiting for + entrance, then exactly one of the waiting processes enters the region. The + scheduling of the waiting processes is assumed to be fair. + + Thus a critical region may be written as follows: + + + lock (Z) lock (Z) + ............ or ............ + unlock(Z) stop (Z) + +1 - 111 - + + + Example 1. + ---------- + + Suppose that the following statements occur in two processes executed in + parallel: + + process P: process Q: + lock (sem); lock (sem); + x:=(x+4)*x; x:=-3; + unlock(sem) unlock(sem) + + and the initial value of the variable x is equal to 0. The execution of the + statement x:=(x+4)*x will not be interleaved by the execution of the + statement x:=-3, irrespectively of the succession of the arrival of + processes P and Q at their regions. Thus, these statements will be executed + in sequence and, independently of the succession, the final value of the + variable x after executing both those statements is equal to -3. + If the given statements did not occur in the critical regions, their + concurrent execution might be the following: compute x+4 - (yielding 4), + assign x:=-3, compute x*(x+4) - (yielding -12) and assign this value to x. + The presented critical regions make timing possible. For the description + of scheduling one should use more complex tools, presented in the next + section. + + Example 2. + ---------- + + Consider an algorithm which performs the copying of records from the + input queue to the output queue (comp. [5]). The algorithm gets the first + record from the input queue and stores it in the input buffer, next copies + the input buffer into the output buffer, and finally puts the output buffer + to the output queue and at the same time gets the next record from the + input queue, as in the following diagram: + + get 1 + , + , + copy 1 + , + , , + , , + get 2 put 1 + , , + , , + , + . + . + copy k + , + , + put k + + In order to program a parallel execution of get and put operations one + can use the cobegin-coend program connectives. A particular case of these + connectives is implemented in the copying procedure given below. We assume + that in the environment of this procedure the type T and the attributes of + class queue are visible. +1 - 112 - + + + unit copying: procedure (input_queue, output_queue: head); + var input_buffer, output_buffer:T, completed:boolean, sem:semaphore, + counter:integer, getr:get_type, putr:put_type; + unit cobegin: procedure; + (*resumes the processes putr and getr, suspends the calling process*) + begin + lock(sem); + resume(putr); + resume(getr); + stop(sem) + end cobegin; + unit coend: procedure; + (*suspends the calling process, if both processes + are suspended then the main program is resumed*) + begin + lock(sem); + if counter=0 + then + counter:=1 + else + counter:=0; resume(main) + fi; + stop(sem) + end coend; + + unit get_type: process; + begin + return; + do + if empty(input_queue) + then completed:=true + else (*get next record*) + input_buffer := out(input_queue) + fi; + call coend; + od + end get_type; + + unit put_type: process; + begin + return; + do + call output_buffer.into(output_queue); + call coend; + od + end put_type; + + begin + if not empty(input_queue) + then + input_buffer:=out(input_queue); + getr:=new get_type; putr:=new put_type; + do (*copying*) + output_buffer:=copy(input_buffer); + call cobegin; + if completed then exit fi + od; + kill(getr); kill(putr) + fi + end copying; +1 - 113 - + + + 11.3. Monitors (compound synchronization facilities) + ***************************************************** + + + In this section we shall describe Hoare's monitors ([6]). A monitor is a + data structure shared by many processes and a set of procedures operating + on this structure. Access to the shared monitor data is possible only via + these procedures, and so their bodies constitute critical regions. + Let us present an example of a class that realizes Hoare's monitors. + Non-conflict access to the monitor data is realized by the so-called entry + procedures. An entry procedure has a prefix entry which guarantees that + only one such procedure may enter the monitor. + In order to permit scheduling of processes that have entered the monitor, + two specialized procedures operating on the inner monitor queues are + provided. + + delay(Q) -stops the execution of the process and puts it + into a queue Q, the entry to the monitor is free, + continue(Q) -resumes the execution of the first process from a + queue Q (if Q is non-empty, otherwise the entry to + the monitor is free). + + As can easily be seen, correct use of these constructs is achieved when + continue is called as the last statement of an entry procedure. + + The declaration of the class Monitor is as follows: + + unit Monitor : queue class; + hidden sem, queue; + var sem:semaphore; + + unit entry: class; (* all entry procedures must have prefix entry *) + hidden busy; + var busy:boolean; + unit delay: procedure(Q:queue); + begin + call Q.into(this process); + stop(sem) + end delay; + unit continue:procedure(Q:queue); + (* continue can be called as the last statement of an entry procedure *) + begin + if not Q.empty + then + busy:=true + resume(Q.out); + fi; + end continue; + begin (* beginning of the prefix entry *) + lock(sem); (* entry to the critical region *) + inner; + if not busy + then + unlock(sem) + fi; + end entry; + end Monitor; +1 - 114 - + + + Example 1 + --------- + + A simple mail-box system with a circular buffer may be defined as the + following class prefixed by a Monitor: + + unit Mailbox:Monitor class(type T; size: integer); + var pool: arrayof T, count, in_index, out_index: integer; + var readers_queue, writers_queue:queue; + unit writer:entry procedure (r:T); + begin + if count=size then call delay(writers_queue) fi; + in_index:=in_index mod size +1; count:=count+1; + pool(in_index):=r; call continue(readers_queue) + end writer; + unit reader:entry procedure (output r: T); + begin + if count=0 then call delay(readers_queue) fi; + out_index:=out_index mod size +1; count:=count-1; + r:=pool(out_index); call continue(writers_queue) + end reader; + begin + new_array pool dim (1:size); + redears_queue:=new queue; writers_queue:=new queue; + end mailbox; + + Example 2 + --------- + Let W be a non-singular k to k matrix such that the norm of W is less than + 1. In order to solve the system of linear equations + + W*x = B + + one can use the Jacobi iteration method, i.e., for a given approximation Y + of a solution, the next approximation will be of the form: + + x(i)= -(W(i, 1)*y(1)+...+W(i, i-1)*y(i-1)+W(i, i+1)*y(i+1)+...+W(i, k)*y(k))+B(i) + + (without loss of generality one can assume that W(i, i)=1.) + + We shall use k parallel processes to compute the corresponding components + of the vector x. When the computation of all the components is completed, + the next approximation starts. Suppose that vector B is included in the + array W, i.e., it is the last column of W. In general, array W has many + zeros, and so instead of this array the user delivers the functions + computing the values + + -(W(i, 1)*y(1)+...+W(i, i-1)*y(i-1)+W(i, i+1)*y(i+1)+...+W(i, k)*y(k))+W(i, k+1) + + for the given vector y. +1 - 115 - + + + unit Jacobi : procedure(k:integer;eps:real;inout x:array_of real; + function W(i:integer; y:array_of real):real); + (* eps-accuracy, the starting point of the iteration should be + the actual parameter corresponding to x, the final value of x + will be equal to the solution found *) + + unit jac_unit :Monitor class; + taken entry; + var dist:real, q:queue; + + unit puti: entry procedure(i:integer); + taken delay, continue; + begin + dist:=dist+abs(x(i)-y(i)); + (*y-new iteration, x-old one*) + if q.cardinal O ! . + ! ! . + ----- . + O + . . + . . + O O <- linking point of N + . . + . . + O .---- + ! . ! + ! O <- N + ! ! + ----- + + Indeed, in n's SL-chain-to-come the module N will also be linked. + + + The SL-chain-to-come of an item being compiled will be called the + environment of the linking point of the item. +1 - 118 - + + + 12.1. Library items + ******************* + + + A library item consists of the interface specification and the body. The + interface is a connector between separate units: it allows us to code in + the item the access parts of other units and to use other units as prefixes + or data types. + The interface defines three kinds of units needed in order to execute the + item: + -externals - these are already compiled units stored in libraries. They + are expected to be visible in the environment of the linking point, + -languages- these are also already compiled units stored in libraries. + They must prefix some module in the SL-chain-to-come, + -sl_virtuals - functions and procedures which will use the item being + compiled and its environment whatever links the item. They are not known + during the compilation of the item. + + SYNTAX. + ------- + + + : + + --------->library item -->into -->;--->! + ! ! ! + !--------------------------->-! ! + ! + <-----------------------------------------------! + ! + ! + !------> --->! + ! ! + ! <------------------------------------! + ! + !--> compile ---> ----------------> + + + SEMANTICS + --------- + + The item is compiled and then stored in a given library. If in the library + there is already a module of the same name, it is replaced by the one being + compiled . + The default library identifier is the userlib. + + Example. + -------- + + library item into mathlib; + compile + unit sin : function (input x: real) : real; + . + . + end sin +1 - 119 - + + + 12.1.1. Interface + ***************** + + + SYNTAX. + ------- + + : + + ---------->languages--> --> ; ----->! + ! ^ ! ! + ! !<----------- , ------------! ! + ! ! + ! <---------------------------------------------------! + ! + !----> externals --> --> ; ->! + ! ^ ! ! + ! !<----------- , ------------! ! + ! ! + ! <---------------------------------------------------! + ! + !----> sl_virtuals --> --> ; -->! + ! ^ ! ! + ! !<---------- , -----------! ! + ! ! + ! <---------------------------------------------------! + ! + !-------------------> + + + : + + -----> -----> from ------> + ^ ! ^ ! + !<-------------- , -----------! !------------------------> ! + + + : + + ------> unit : ----> class ------------>! + ! ^ ! + !-> coroutine -->! ! + ! ! ! + !-> process ---->! ! + ! ! ! + !-> function --->! ! + ! ! ! + !-> procedure -->! ! + ! + ! <--------------------------------------------------------! + ! ! + !---> from -------------------------> ! + !-> + + + The default library identifier is the userlib. +1 - 120 - + + + : + + -> unit : -> function -> ->! + ! ! + ! !<-------------------------------! + ! ! + ! !--> : -------->! + ! ! + !--> ------------>! + ! + !-> + + SEMANTICS + --------- + + + The interface defines a minimum environment of the point at which the item + being compiled is to be linked. It is used to code the item and also to + check its static properties. Therefore, changing externals or languages in + the library, the user has to recompile also units depending on them. + Identifiers of externals may be used in sl_virtual specification to + define types of parameters and by the compiled unit as prefixes, types of + data and so on. Interface specification is not redundant, i.e., if an + external or language uses some other library items in its own interface, + they do not have to be specified again. However, only identifiers of the + specified units are accessible in the item being compiled. + + Example 1. + ---------- + + library item into datalib; + compile + unit heap : class.... + ... + end heap; + + library item into datalib; + externals + unit heap: class from datalib; + compile + unit priority_queue: heap class ... + var z: heap... + end priority_queue; + + library item into proglib; + externals + unit priority_queue: class from datalib; + compile + unit prog1: class; + var x: priority_queue; + ... + end prog1; + + Within the body of prog1 we can use the identifier of the priority_queue. + Class heap will be automatically connected, we are not allowed, however, to + use the identifier of heap. To make it possible we should define another + interface: +1 - 121 - + + + library item into proglib; + externals + unit priority_queue: class from datalib; + unit heap: class from datalib; + compile + unit prog2: class... + var x: priority_queue; + var y: heap; + ... + y:=x; + ... + X qua heap + end prog2; + + + Example 2. + ---------- + + library item into datalib; + externals + unit heap: class from datalib; + compile + unit test: class; + var z: heap + ... + end test; + + library item into proglib; + externals + unit priority_queue: class from datalib; + unit test: class from datalib; + compile + unit prog3: class; + var p: priority_queue, e: test; + ... + p.z:=e.z + ... + end prog3; + + + In this interface heap means the same class for both the priority_queue + and the test. +1 - 122 - + + + 12.1.2. Using languages + *********************** + + Languages are classes (coroutines, processes) already compiled. They are + expected to prefix modules in the SL-chain of the point of linking the item + being compiled. Their attributes may be used within the body of the + compiled item by means of the construction: + this . + If it does not lead to any confusion, the phrase + this . + may be omitted. The rules of accessing attributes in the case of regular + units are also valid in the case of languages. A language may also be used + like any of the specified externals. + + Example. + -------- + + library item into syslib; + compile + unit math: class; + ... + unit sin ... + end math; + library item into syslib; + compile + unit basicio: class; + ... + unit writereal... + end basicio; + library item; + languages math, basicio from syslib; + compile + unit prog: class... + ... + this math.sin (* or simply sin *) + this basicio.writereal (*or simply writereal *) + end prog; + + A correct use of the unit prog may be of the following form: + + library item; + externals + unit math: class from syslib, + unit basicio: class from syslib; + compile + unit user: class;... + basicio block... + math block... + class + external unit prog from userlib + (* this is linking prog- see 12.2 *) + ... + end user; +1 - 123 - + + + 12.1.3. Using externals + *********************** + + + External items are expected to be linked by the environment of the linking + point of the item being compiled. They may be used like units which are + declared and visible in the environment of a regular object. Some simple + examples have been given in 12.1.1. Some others are given in 12.2. + + + + 12.1.4. Using sl_virtuals + ************************* + + + The main purpose of sl_virtuals is to permit communication between the + compiled item and the modules which will use it. Communication may depend + upon the modules and there may be many fairly distinct of them. Sl_virtuals + and the modules are not previously compiled, i.e., they are not other + library items. Sl_virtuals are very similar to formal parameters or + external subroutines in FORTRAN. + + Example. + -------- + + This is an example of a procedure which sorts real numbers stored in any + structure with operations put_real and get_real. + + library item into sortlib; + sl_virtuals + unit empty : function : boolean, + unit get_real : function : real, + unit put_real : procedure (input X : real), + unit clear : procedure; + compile + unit sqsetort : procedure; + ... + begin + (*reading numbers*) + while not empty + do + ... + get_real; + ... ... + od; + ... + (*writing numbers*) + clear; + do + ... + call put_real(Z); + ... + od; + ... + end sqsetsort; +1 - 124 - + + + 12.2. Linking library items + *************************** + + + Declarations within a module may include specification of a library item to + be linked at that point. + + SYNTAX. + ------- + + + : + + ----------> external ----------> + + + SEMANTICS + --------- + + The object code of the linked item is added to the object code of the item + being compiled. Adding the same item a few times we create some unrelated + copies of the item as if the same source code occurred many times in + different places. + + + 12.2.1.Connecting the interface + ******************************* + + + Languages and sl_virtuals. + -------------------------- + + Languages and sl_virtuals specified by the linked item are looked for in + the environment of the linking point. If they are not found there, they + must be explicitly specified in the interface of the item being compiled. + + Example. + -------- + + library item into lib; + compile + unit M : class; + ... + end M; + + library item into lib; + compile + unit N : class; + ... + end N ; + + library item into lib; + languages M, N from lib; + compile + unit P : class; + ... + end P; +1 - 125 - + + + library item into lib; + languages M from lib; + compile + unit R : class; + ... + block + external unit N : class from lib; + ... + N block + ... + block + external unit P : class from lib; + ... + end r; + + Sl_virtual specification must be compatible in terms of the usual LOGLAN-82 + rules with the actual version or with the specification in the interface of + the item being compiled. + + EXTERNALS + --------- + + The externals specified in the added item are taken from the SL-chain of + the linking point or from the interface of the item being compiled. If they + do not occur there, they are linked together with the specified linked item + at the same point. + + Example. + -------- + + library item into lib; + compile + unit M : class; + ... + end M; + + library item into lib; + externals + unit M : class from lib; + compile + unit N : class; + var X : M + ... + end N; + (a) + library item into lib; + externals + unit M : class from lib; + compile + unit P : class; + external unit N : class from lib; + ... + end P; + + The actual version of the module M used by the module N is taken from the + interface of the module p. The SL-link of M is not known. +1 - 126 - + + + (b) + library item into lib; + compile + unit P : class; + ... + external unit M : class from lib; + ... + block + ... + external unit N : class from lib; + ... + end P; + The module M used by the module N comes from P where it is linked. The + SL-link of M is P. + Notice that if the program tree is the following: + + + O <- P + . . . + . . . + ----. O O + ! . ! . . + M -> O ! . . + ! ! . . + ----- .---- .---- + !. ! ! . ! + N1 - copy of N-> O ! ! O <- N2 - copy of N + ! ! ! ! + ----- ----- + + Then the attributes X in both copies are compatible, i.e., they are of the + same type. + + + (c) + library item into lib; + compile + unit P : class; + unit R : class; + external unit N : class from lib; + ... + end R; + unit S : class; + external unit N : class from lib; + ... + end S; + ... + end P; + + In this case two copies of N are formed. Because there occurs no copy of M + in the SL-chain or in the interface of P, two copies of M are also added. + The attributes X in the copies of N are of different types and are not + compatible. The copies of M are "own" copies for each N. +1 - 127 - + + + 12.3. Binary items + ****************** + + + A binary item consists of a very simple interface specification and the + body. The interface defines languages in which the program is written. A + binary compiled program is embedded in a number of blocks prefixed by these + languages. There is also a block containing definitions of linked library + items. + Compilation of a binary item results in an object code ready for + execution. + + + SYNTAX. + ------- + + + : + + -----> binary item ---> into ---> ; ------>! + ! ^ ! + !---------------------------->! ! + ! + !<------------------------------------------------------------! + ! + !-----> languages ---> --> ; --->! + ! ^ ! ! + ! !<------------ , ------------! ! + ! ! + ! <-------------------------------------------------------! + ! + !------> externals ---> --> ; -->! + ! ^ ! ! + ! !<------------- , ------------! ! + ! ! + ! <-------------------------------------------------------! + ! + !---> compile -----------------> + + + The rules of using languages and externals are the same as for library + items. + The default library identifier is bin. +1 - 128 - + + + 12.4. Processing libraries + ************************** + + + 12.4.1. Recompilation + ********************* + + + LOGLAN-82 guarantees uniqueness for types and units. The compiler + associates a "time stamp" (time of definition and compilation) with each + compiled unit. Compiling a module twice (even if no changes are made in its + source code) makes all units defined in the module different + (non-equivalent). Therefore after some changes in the library we should + recompile all modules connecting the changed items. + For example, consider the case where defs1 is used by defs2, and defs2 is + linked with the user. Suppose that defs1 is recompiled for some reason, + then defs2 is recompiled, too. Then the user should also be recompiled, + because recompiling defs2 invalidated the version of the user. + + Compilations and recompilations must occur in a specific order. + To recompile a module storedin the library, LOGLAN-82 commands the + following syntax: + + + --> recompile --> --> from --> + ^ ! + !<------------ , ----------! + + It is suggested that the LOGLAN-82 compiler makes the necessary + recompilations automatically. +1 - 129 - + + + 12.4.2. Insertions and deletions + ******************************** + + + To insert an item into a library the programmer writes only the source code + of the item. It is a code between + + + + library binary item into ; + ... + end + + + This code results in the insertion of the module into a given library. If + in the given library there already exists a module of the same name, the + new one replaces the old one. + + Deletions are made by using the following syntax: + + + --> delete ---> ---> from ----> + ^ ! + !<------------ , -----------! + + A linked item may be deleted from the library. However, the linking module + cannot be recompiled after that. +1 - 130 - + + + 13. File processing + #################### + + + 13.1. External and internal files + ********************************* + + External files are named after character strings and denote peripheral + devices or data sets. The logical and the physical structure of an external + file depend on the given computer and its file system, and so, for the + users of LOGLAN-82, external files are accessible via internal files only. + + + An internal file is an object of the predefined class type file. When an + internal file is generated, it may be associated with an appropriate + external file. Sometimes the user wish to generate an internal file not + associated with any specified external one. Such a file is called a local + file and its life-time is not longer than the life-time of the program + where it has been generated. + + + A file is always treated as an unbounded sequence of bytes. A file can be + read or written, and can be set to a required position. Each transmission + from or on a file starts at the byte pointed out by the so-called current + file position advanced by the number of transmitted bytes. File size is + defined as the greatest number of a byte transmitted on the file. + + There are some primitive facilities in the language which enable the user + to read or write a specified number of bytes, to change the current file + position, to obtain the file size, etc. All these facilities are in some + sense low-level, since they operate on bytes. The user is able, however, to + declare a class for file processing with high-level operations. + + An example of a system class which defines a set of input-output + operations applicable to files containing elements of a single type is + shown in 13.6. Moreover this is not the only way to define high-level file + processing. The user can declare, for instance, a class which defines + operations applicable to files containing elements of mixed types, a class + which defines operations on a file of arrays of various lengths, etc. +1 - 131 - + + + 13.2. File generation and deallocation + ************************************** + + + Before any operation on a file can be carried out, an internal file must + be generated. If the user wishes to communicate with an external file, then + the generated internal file must be associated with that external one. When + the generation of an internal file is in effect, the file is said to be + open. + + + SYNTAX + ------ + : + + -----> ----> : file --------------> + + : + + --> open + ! + ! + ( + ! + ---> , ---> ----> ) -------> + ! ! + !-------------------->! + + SEMANTICS + --------- + + Variables of file type are declared as any other variables of class type. + An object of file type (internal file) has no attributes visible to the + programmer. + File generation differs from class generation. It is performed by an open + statement. If the second argument appears, then a new internal file + associated with an external one (identified by the string) is generated. + The reference to such an internal file is set to the variable of type file + occurring as the first argument. If there is only one argument, then a new + local file is generated and the reference to the corresponding internal + file is set to the variable of type file occurring as the argument of the + operation. For instance: + + open(X, "teletype") + + generates a new internal file associated with the external file "teletype". + Similarly + + open(Y) + + generates a new local file referenced by Y. +1 - 132 - + + + Thus the operation new is not applicable to files. Moreover, remote + access to internal files is not permissible (no attributes visible to the + user). + Except file generation, remote access and prefixing, file type can be + applied as any other class type. In particular, expressions of file type + may be compared, assignments on variables of type file are allowed, the + user can declare a function of type file, etc. + + + Remark + ------ + + External file processing is not predefined in the language. The + operations on external files, such as file creation, file deletion, file + protection and so on, depend on the given file system. They may be + introduced into the language as standard functions or procedures in the + individual implementation. + + End of remark + ------------- + + + + After processing has been completed on a file, it can be closed and the + corresponding internal file may be deallocated. These actions are performed + by the kill statement, where the argument points to the corresponding + internal file. +1 - 133 - + + + 13.3. Binary input-output + ************************* + + + SYNTAX + ------ + + + < binary input-output operations>: + + ---> put ---> (---> -> , ---> --> ) ----> + + ---> get ---> (---> -> , ---> --> ) ----> + + + SEMANTICS + --------- + + + Operation put transmits a sequence of bytes from memory to an open file + (defined by the first parameter) at the current file position. This + sequence of bytes is defined by the list of expressions. For any list + element, going from left to right, the value of the expression is computed. + If this value is primitive, then the transmitted bytes correspond exactly + to the internal representation of the value. If the value is a reference to + an object, then the transmitted bytes cover all non-system attributes of + the referenced object. If this value is none, then no transmission is + performed. + Operation get transmits a sequence of bytes from an open file (defined by + the first parameter) to the memory. If a list element is an object + expression, then the transmitted bytes cover all non-system attributes of + the referenced object (hence, if the value of this expression is none, then + no transmission is performed). Otherwise, list element must be a variable + of primitive type, and then the transmitted bytes cover exactly its + internal representation. The sequence of transmitted bytes starts at the + current file position. + + For instance, let x be a real, i an integer and Y a reference variable to + an object of type A: + + unit A:class(j:integer); + var u, v, w:real; + end A; + + Then the statement + + put(F, x, i, x+i, "nothing", Y) + + transmits to file F the internal representation of the values of x, i, x+i, + the internal representation of the text "nothing" (i.e., the sequence of + characters) and the internal representation of the attributes j, u, v, w + from the object referenced by Y. +1 - 134 - + + + 13.4. Other predefined operations + ********************************* + + + SYNTAX + ------ + : + + !-----> ----------->! + ! ! + ------> size ---> ( -! !---> ) --------> + ! ! + !----> < expression> ----->! + + : + + ------> eof -----> ( ---> ----> ) ------------------> + + : + + ----> position ---> ( ---> -----> ) ---------------> + + : + + --> seek --> ( --> --> , --> --> ) --> + + SEMANTICS + --------- + + + The size operator of integer type gives the number of bytes of the + internal representation of an argument. If the argument is an expression of + primitive type, then the returned value may be computed at compilation time + and equals the number of bytes of the internal representation of that + primitive type. If the argument is an expression of class or array type, + then the returned value gives the number of bytes of the object referenced + by the argument (except system-attributes). If the object none is + referenced, then the returned value is 0. + Another kind of argument of size operator is type. It may be either an + explicitly written type or a formal type. If the argument is a primitive + type or a class type, then its length in bytes computed at compilation time + is returned. If the argument is an array type, then its size cannot be + established and so the expression is incorrect. If the argument is a formal + type, the returned value is defined similarly but computed at run time. + Thus when the actual type is array the run time error is raised. + In all these cases size operator informs the user about the length in + bytes of the internal representation of the argument (if possible). In + particular, the argument may be a file and then the length in bytes of the + corresponding external or local file is returned. + + The argument of the boolean operator eof must be a file. It returns the + value true iff the current position of the file exceeds or equals its size. + The argument of the integer operator position must also be a file. It + returns the current position of the file. + The first argument of the seek operation must be a file. Then the current + position of this file is set to the value defined by the second argument of + the operation. +1 - 135 - + + + 13.5. Text input-output + *********************** + + + Besides binary input-output LOGLAN-82 provides text input-output + operations also. The operations read and write are available for input and + output in human readable form. Namely, operation read decodes a sequence of + bytes into the internal representation of the corresponding value before + the transmission is performed. Similarly operation write encodes the + internal representation of a value into the corresponding sequence of bytes + before transmission is performed. + + + SYNTAX. + ------- + + + : + + !--------------------------->! + ! ! + --> read --> ( --> ---> , --> --> ) ----> + + + !------------------------------------>! + ! ! + ->writeln --> ( --> --> ) -------------------------> + ! + ! + ->write --> ( -------------->! + ! ! + -> , -> ----> ---> ) --------> + ^ ! + !<--------- , ------------! + + + : + + -------------------------------------------------------------------> + ! ^ ^ + !-> : -> -!- : -> -! +1 - 136 - + + + SEMANTICS. + ---------- + + An input statement read(F, y1, ..., yk) is correct if F is a file and y1, + ..., yk are variables of integer, real, or character type. File F is + treated as a sequence of symbols. The execution of that statement causes + the input data represented as the corresponding sequence of symbols from + file F to be read, decoded and assigned to y1, ..., yk respectively. The + input statement is defined if the assignments are defined (going from left + to right). + An output statement write(F, E:A1) is correct if F is a file, E is an + expression of a primitive type, and A1 is an arithmetic expression of + integer type. + Consider first the case where expression E is of integer type. The value + of expression A1 determines the number of symbols to be outputed on file F. + If the specified number of symbols is greater (less) than the number of + symbols required for the representation of the value of expression E, then + the value of E is preceded by the appropriate number of blanks (then the + least significant digits are omitted). The absence of format indicates a + standard one (dependent on an individual implementation). + If expression E is of real type, then the output statement may be of the + form write(F, E:A1:A2), where A1 and A2 are arithmetic expressions of + integer type. The meaning of the expression A1 is that described above, the + value of the expression A2 determines the number of digits following the + decimal point. In case of an output statement of the form write(F, E:A1), + where E is of real type, the exponent part is always present. The absence + of format indicates a standard one (dependent on an individual + implementation). + An output statement of the form write(F, E) where E is an expression of + character type causes the external representation of E to be outputed on + file F. + If E is an expression of string type, then its external representation is + outputed on file F. In this case format A1 may appear and defines the + maximal number of symbols which may be outputed, i.e., if the length of a + string exceeds the defined format, then the last symbols are dropped. + In the statement write(F, E:A1:A2) format A2 is computed first (if + present), format A1 is computed next (if present), and finally the value of + E is computed and outputed according to the defined formats. + The execution of an output statement with a list results in the + successive evaluations of the expressions A2, A1, E, and in the output of + the computed value. + Statement writeln outputs the end of line symbol after output is + completed. If writeln has only the file parameter, then the end of the line + symbol is outputed on file F. + If no file is specified, a default standard input or standard output file + is used. At the beginning of program execution, these files are open and + associated with two implementation defined external files. +1 - 137 - + + + 13.6. Example of high-level file processing + ******************************************* + + A class defining high-level file processing is presented below. The user + can prefix the main block of his program by such a class, and then, the + high-level file operations are provided automatically. + + unit input_output class; + hidden uni_file; + unit uni_file :class(type T); + hidden element_size; + var F:file, element_size:integer; + unit set_position:procedure(i:integer); + begin + call seek(F, i*element_size) + end set_position; + unit file_position:function:integer; + begin + result:=position(F) div element_size + end file_position; + unit end_of_file:function:boolean; + begin + result:=eof(F) + end end_of_file; + unit file_size:function:integer; + begin + result:=size(F) div element_size + end file_size; + unit read_element:procedure(output x:T); + begin + get(F, x) + end read_element; + unit write_element:procedure(x:T); + begin + put(F, x) + end write_element; + begin + element_size:=size(T) + end uni_file; + unit inout_file:uni_file class(S:string); + hidden F; + begin + open(F, S) + end inout_file; + unit in_file:inout_file class; + hidden write_element; + end in_file; + unit out_file:inout_file class; + hidden read_element; + end out_file; + unit local_file:uni_file class; + hiddden F; + begin + open(F) + end local_file; + unit close_file:procedure(E:uni_file); + begin + kill(E.F); kill(E) + end close_file; + end input_output; +1 - 138 - + + + Bibliography. + ############# + + Part A: the papers related to the language itself. + + [1] Bartol W.M, Kreczmar A., Litwiniuk A., Oktaba H.: Semantics and + implementation of prefixing at many levels, Ins.Inf.U.W. reports, nr 94., + 1980. + + [2] Bartol-Ratajczak W.M., Szczepanska-Wasersztrum D.: Data structure for + simulation purposes in LOGLAN. ICS PAS report 373, 1979. + + [3] Dahl O-J., Myhrhaug B., Nygaard K.: Common base language. NCC s-22, + October 1970. + + [4] Dahl O-J., Wang A.: Coroutine sequencing in a block structured + environment. BIT 11, 1971, pp.425-49. + + [5] Hansen P.B.: CONCURRENT PASCAL, a programming language for operating + system design. IST report no.10 April 1974. + + [6] Hoare C.A.R.: Monitors, an operating system structuring concept. CACM, + vol.17, n.10, October 1974, pp.549-57. + + [7] Muldner T.: On the properties of ADA's rendez-vous and an + implementation of its counterpart in LOGLAN. To appear. + + [8] Muldner T.: LOGLAN-82 programmer's manual (in Polish), pp.1-417. + + [9] Myhre O.: Protecting attributes of a local class. SIMULA Newsletters, + vol.5, n.4. November 1977. + + [10] Naur P.(ed): Revised report on the algorithmic language ALGOL 60. ACM + 6, 1963, pp.1-7. + + [11] Preliminary ADA reference manual. Sigplan Notices, vol.14 n.6, June + 1979. + + [12] Salwicki A., Muldner T., Oktaba H., Bartol-Ratajczak W.M.: Base + machine language. General outline. (in Polish). Archiwum opracowan nr 20, + 1977, IMM MERA. + + [13] Wirth N.: The programming language PASCAL, Acta Informatica, 1971, 1, + pp. 35-63. +1 - 139 - + + + Part B: The papers related to the general project LOGLAN-82 + + [14] Aho A.V., Hopcroft J.E., Ullman J.D.: The design and analysis of + computer algorithms. Addison-Wesley. 1974. + + [15] Banachowski L., Kreczmar A., Mirkowska G., Rasiowa H., Salwicki A.: An + introduction to algorithmic logic. Mathematiccal investigations in the + theory of programs. In Banach Center publications, Warsaw 1977. + + [16] Bartol W.M.: The definition of the semantics of some statements of a + block structured language with type prefixing. To appear in: Lect.Notes in + Comp. Sc. Proc. Poznan 1980, Symp. on algorithmic logic and LOGLAN. + + [17] Burkhard H.D.: On priorities of parallelism: Petri nets under the + maximum firing strategy. To appear in Lect. Notes in Comp.Sc. Proc. Poznan + 1980, Symp. on algorithmic logic and LOGLAN. + + [18] Dahl O-J., Dijkstra E.W., Hoare C.A.R.: Structured programming. + London. Academic Press 1972. + + [19] Muldner T.: On the semantics of parallel programs. ICS PAS report 348, + 1979, extended version to appear in Fund. Informaticae. + + [20] Muldner T.: Implementation and properties of certain tools for + parallel programs. ICS PAS report 356, 1979. see also FCT' 77, + Lect.Not.Comp.Sc.56. + + [21] Oktaba H.: On the algorithmic theory of references. To appear in: + Lect.Not. in Comp.Sc. Proc. Poznan 1980, Algorithmic logic and LOGLAN. + + [22] Salwicki A.: Programmability and recursiveness, to appear. + + [23] Salwicki A.: Formalized algorithmic languages. Bull.Acad. Polon.Sci. + 18, 1970, pp.227-232. + + [24] Salwicki A.: Applied algorithmic logic. Proc. MFCS' 77. Lect.Not. of + Comp.Sc. 53, 1977, pp.122-134. + + [25] Salwicki A.: An algorithmic approach to set theory. Proc.FCT'77. Lect. + Not. in Comp. Sc. 56, 1977. + + [26] Salwicki A.: On the algorithmic theory of stacks. Proc. MFCS' 78 + Lect.Not. in Comp.Sc. 64, 1978. +1 - 140 - + + + + Index + ##### + + + A D + actual paratemetr list, 76 deallocation, 17, 83 + allocation statement, 75-81 - statement, 83 + andif, 9 declaration list, 41 + arithmetic expression, 64-66 detach, 86,104,108 + array, 18,29,75,82 dotted variable, 60 + - generation statement 18,75,82 dynamic compatibility + - object, 29 of parameters, 79 + - type, 29 dynamic consistency + assignment statement, 72 of types, 55 + attach, 20,86,104,108 dynamic control statements, 85 + attribute, 11,30,42 dynamic instance, 11,13 + dynamic location, 42,54 + + B E + binary item, 126 evaluation statement, 71-73 + block statement, 11-12,35,75 exception, 22,96 + block structure,11 - handler, 22,97 + - handling, 96 + exit, 9,84,91 + C expressions, 56 + call statement, 13 external, 122-123 + case statement, 10,87,89 external file, 129 + character, 23 + character expression, 67 F + class, 14,33 file, 129,136 + - declaration, 33 - declaration, 130 + - object, 14,17 - generation, 130 + close, 22,40,45 formal + comment, 25 - function parameter, 38-39 + compound statement, 8,71,87-88 - input parameter, 37-39 + conditional statement, 8,87 - output parameter, 37-39 + configuration statement, 71 - parameter, 37-39 + consistency of types, 55 - procedure parameter, 38-39,41 + constant ,31,57 - type, 30 + - declaration, 31 - type parameter, 37-39 + context properties, 56 function, 13 + copy, 74 - call, 75-81 + copying statement, 72,74 + coroutine, 20,28,36,86 + - object, 20 + - statement, 86 +1 - 141 - + + + G O + garbage collection, 17 object, 14,48 + get, 132 - deallocation, 75,83 + - deallocator, 17 + H - expression, 69-70 + handler - generation, 75 + - declaration, 40 - generator statement, 14 + - execution, 101-102 orif, 8 + - termination, 101-102 + hidden, 22,40,43 + + I P + identifier definition, 25 parallel statement, 105 + illegal identifier, 44 prefix 15-16,36 + inheritance list, 40 - sequence, 36 + inner, 16,41,84 prefixing, 15,36 + interface, 118 primitive statement, 71 + internal file, 129 primitive synchronizing + iteration statement, 9,10,90-92 statement, 105,109 + procedure, 13 + K - call, 75-81 + kill, 17,83 process, 21,28,36,104 + - state transition, 105 + L protection list, 40 + languages, 118,121-123 protection of attributes, 22,43 + last_will, 101-102 put, 132 + - statement, 101-102 + legal identifier, 44 Q + lexical entity, 25 qua, 70 + library items, 115,117 qualified object expression, 69-70,76 + linked item specification, 31 + lock, 21,109 R + loop statement, 87,91 raise, 98 + read, 134-135 + M recompilation, 127 + main, 28 reference variable, 14 + monitor, 112 remote + - access, 14 + N - function identifier, 76 + none, 69 - procedure identifier, 76 + repeat, 10,84,91 + resume, 21,104,107-108 + return, 84 + run-time error, 22 +1 - 142 - + + + S T + scheduling, 21,105 taken, 40,44 + semantic properties, 56 terminate, 101-102 + semaphore, 27 textual control statement, 84 + separate compilation, 22,115-128 this, 70 + sequential statements, 71 ts, 21,109 + signal, 96 type, 26 + - declaration, 31 - class, 30 + - handler, 97 - compound, 26,29 + - raising, 98 - primitive, 26-27 + - specification, 96 + simple control statement, 84 U + simple variable, 58 unit, 13,25,31 + sl-virtual, 118,122-123 - attributes, 42 + statement list, 41 - body, 40-41 + static attribute, 46 - declaration, 31 + static compatibility unlock, 21,109 + of parameters, 77 + static consistency V + of types, 55 variable, 32,57 + static container, 46 - declaration, 31 + static location, 42,46 virtual + storage management, 17 - attribute, 49-53 + stop, 21,104,107-108 - chain, 49-53 + string, 27 - subprogram, 49-53 + - constant, 68 visibility rules, 42,44 + - expression, 68 + subprogram declaration, 34 W + - body, 40 wait, 21,107-108 + subscripted variable, 59 wind, 101-102 + synchronization, 21,105 write, 134-135 + syntactic writeln, 134-135 + - entity, 42 + - father, 12 + - unit, 13,42 + system signals, 103 + system variable, 61 diff --git a/utils/lotek/spis_tre.sci b/utils/lotek/spis_tre.sci new file mode 100644 index 0000000..5a68bbe --- /dev/null +++ b/utils/lotek/spis_tre.sci @@ -0,0 +1,21 @@ +SPIS TRESCI DYSKU ZAWIERAJACEGO PROGRAMY DLA SRODOWISKA JEZYKA LOGLAN + +ENVIRON.LZH LOGDEB.EXE Debuger dla LOGLAN'u + LOGHELP.HLP Tresc loglanowej bazy danych + LOGHELP.STR Spisy tresci dla loglanowej bazy danych + LOTEK.EXE Program zarzadzajacy srodowiskiem loglanowym + LOTEK.HLP Tresc Help'a o poslugiwaniu sie srodowiskiem + LOTEKINS.EXE Program instalacyjny (generuje plik LOTEK.PTH) + LSTTEST.EXE Program pomocniczy podczas kompilacji + MPLOGED.EXE Wlasciwy program srodowiska loglanowego + NE2LOTEK.EXE Konwerter plikow + NE2LOTEK.DOC Opis do powyzszego programu + PREP.EXE Program pomocniczy dla debuggera + +LOGDOC.LZH IIUWGRAF.PL Te pliki zawieraja opisy jezyka loglan i jego realizacji + LOGLAN.TXT sa one potrzebne dla dzialania loglanowej bazy danych. + REPORT.HLP Plik REPORT.HLP jest zmieniony i nie nalezy go wymieniac + USERMAN.TXT na inna wersje (plik REPORT.TXT z pracowni na Szturmowej) + +WARSZAWA 1990-06-26 MICHAL PAKIER + diff --git a/utils/lotek/structr.doc b/utils/lotek/structr.doc new file mode 100644 index 0000000000000000000000000000000000000000..fc38df18c3d9771af58e65dd8fb7132d292bd832 GIT binary patch literal 11692 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 + + Loglan compiler compiles program from PROGRAM.LOG file and creates +PROGRAM.LCD. + + + 2. LOGLAN A:PROGRAM.DAT + + + In this case the source file is PROGRAM.DAT from drive A. The +file PROGRAM.LCD will be created on drive A. + + + + If any error occurs, the code file is not produced. +At the end of compiltation the following message is printed: + error(s) detected + + +1.2. COMPILER SWITCHES + + + + There are two possibilities to specify compiler's options: by +compiler switches (i.e. external options) or by comments in the source +program (see chapter 2.). + You may enter the compiler switches in command line after file +name in the followng format: + sw1 sw2... swk +where swi consists of character that designates the name of the option +and either '+' or '-'. + + + +Example: + + 1. LOGLAN PROGRAM L- T+ + + 2. LOGLAN PROGRAM + + In this case the default switches values are assumed. + + + Scope of the switch is the entire program. All switches ,except H, +correspond to options. A switch has greater priority then options: +when you specify switch, all corresponding options inside source +program will be ignored. Full description of each option is given +in chapter 2.2. Switch L has additional significance. When this +switch is set off no listing file is produced. + + + +1.3. CODE GENERATION + + + In this step information from the intermediate code file is read +and two destination files containing the code are produced. No +switch is permitted for this step. To generate code files, type: + GEN + or + HGEN , if the switch H+ was specified for the +compiler. +You type file name without extension (extension is ignored). + + +Example: + + + 1. GEN + FILE_NAME: PROGRAM +Information is read from file PROGRAM.LCD from default drive and +directory. Two destination files are produced: PROGRAM.CCD and +PROGRAM.PCD and stored in the same directory as the input file. + + + 2. HGEN A:PROGRAM + + Files PROGRAM.CCD and PROGRAM.PCD are stored on drive A. + + + +1.4. PROGRAM INTERPRETATION + + + To interprete (execute) the Loglan program you must invoke the +interpreter INT or HINT (if the switch H+ was specified). File name +must be specified in command line. The file extension is ignored. The +interpreter reads input files with the given name and extensions CCD +and PCD and executes the Loglan program. +The syntax for calling the onterpreter is + + INT + or + HINT + +The following options are supported: + + /m < n > - set memory size for Loglan program (in 16 bit words + for small and 32 bit words for huge memory). For + concurrent programs it means memory size for every + process. + /i - information about compactification is printed. + /r < n > - used to invoke interpreter on nodes different from + console (see 3.4.). Option parameter is console node + number (as defined by D-Link Network). + + + At the end of interpretation the following message is printed: + + + End of LOGLAN-82 program execution + + + +Example: + + LOGLAN \DAT\EXAMP.SRC, L+ + + + The file \DAT\EXAMP.LCD and \DAT\EXAMP.LST are generated. + + GEN \DAT\EXAMP + + The files \DAT\EXAMP.CCD and \DAT\EXAMP.PCD are created. Then the +program can be interpreted by: + + INT \DAT\EXAMP + +1.5. COMPILE TIME ERRORS + + + + The errors detected during the compilation are printed on the +listing file, if this file is created. In the scope of option L- or +if the switch L is set off only the incorrect lines and errors +messages are printed . When the switch ( not option !) L is set off +then listing file is not produced and incorrect lines and error +messages are printed on the user's terminal. + Error message has the following format: + *** ln ERROR en txt id +where: + + ln - index of incorrect line, + en - error code (see Appendix B), + txt- text that explain type of the error, + id - identifier helpful to situate the error. + + Error messages are printed in the source listing after incorrect +lines. For syntax errors (numbered 101-147, 201-212), sign '?' +indicates the error position in the line. + Error may be detected beyond the line containing it. +Identifier helpful to find an error is printed as soon as possible. + + For codes 331-338 error message is printed after first line of +virtual module declaration. + Errors like "undeclared identifier" are printed in each module +once, after first reference to this identifier. Further references are +ignored. + The errors related to case instruction may appear before the +incorrect line. + + + + +1.6. RUN-TIME ERRORS + + + + Loglan run-time errors are detected by Loglan run-time system. When +any of these errors occurs, the appropriate system signal is raised +and error message is printed if handler is not found. All of +these error messages are described in Appendix C. Moreover +the line number of the last executed statement is printed on the +user's terminal. + + + + +2. COMPILER OPTIONS + + + + Options, like switches are used to pass some information to +the compiler. Options are placed in source program in comments. + Scope of options in source program is textual. Option may appear in +any place of source program, but it is active from the beginning of +the nearest instruction. Listing option L is active from the next line +after line containing setting this option on up to the line containing +setting this option off. + Options overwrite defaults, but are overwritten by switches +(external options). + Option definition is not allowed before the keyword program. + + +2.1. OPTION FORMAT + + + + Options may be placed in source program in comments in the +following format: + (*$opt1,opt2,...*) +where opti consists of character that designates the option and +either '+' or '-' e.g.: (*$L-,T+*). Options in one comment should +be separated by commas. Spaces in such comment are not allowed. + + + + + + +2.2. OPTIONS LIST + + + + D - trace + D+ - causes the line numbers of the executed instruction to + be printed, + D- - default, + L - listing + L- - default, only incorrect lines are printed on the + terminal + L+ - all lines are printed on the listing file + O - optimization + O+ - optimization of some arithmetical and logical + expressions are included to generated code (default), + O- - generate code without optimization, + T - type conflict checking + T+ - default, dynamic checking of type conflict in + assignment instructions and in parameter transmissions, + T- - no dynamic checking + H - memory model (switch only) + H- - default, small memory + H+ - huge memory + When H- is specified all code and data must fit into 64K + bytes. When H+ is specified all memory available on IBM PC + may be utilized, with the cost of increased execution time. + + + + +3. IBM PC LOGLAN-82 IMPLEMENTATION SPECIFICATION + + +3.1. IMPLEMENTED SUBSET OF LOGLAN + + + + The following constructions described in the report of Loglan-82 +have not been implemented: + - local attributes, + - separate compilation, +File system is described in 3.3. + + +3.2. NON-STANDARD LANGUAGE ELEMENTS + + + + Standard constants, procedures and functions are added to the +language (see Appendix A). Moreover keywords char (short form of +character) and bool (short form of boolean) are added. + The character set, defined in the report of Loglan-82, is +extended by lower - case letters and the tabulation character (decimal +code 9). It is possible to use operator '<>' which stands for 'not +equal'. + + + + +3.3. FILE SYSTEM + + + Loglan contains the predefined reference type file and a set of +statements and standard procedures to manipulate files. Both +sequential and direct access files are implemented. + + +3.3.1. FILE VARIABLES + + + Variables of the type file can be declared in the Loglan program +and can be used as any variables of a reference type. + + +Example: + + var f:file, + A:arrayof file; + unit p:procedure(f:file); ... end; + begin + ...... + f := A(i); + ...... + end; + + + +3.3.2. FILE GENERATION + + + A file object is generated by open statement of the form: + + open(f,T) for internal files or + open(f,T,A) for external files +where + f is a file variable + + T = text for text files + char --- for binary sequential files of character, + integer or real values + integer ! + real --- + direct for direct access binary files + + A is an expression of the type arrayof char designating +external file name. + After execution of open statement the new file object is created +and it becomes a value of the file variable f. If the file is opened +as an external one, then it references to the file A. + + +Example: + + open(data,text) - new internal text file data is + opened + open(num ,integer) - new internal binary file num is + opened (the file components are + integer numbers ) + open(f,text,unpack("my.dat")) - external text file f is opened; it + references to the file my.dat + stored on the default drive and + directory. + open(f,direct,A) - external direct access file with + name contained in array A is opened. + + +3.3.3. FILE DEALLOCATION + + + The file can be closed and deallocated by execution of the +statement kill. + + + +3.3.4. GENERAL FILE OPERATIONS + + + There are three standard procedures associated with files: RESET, +REWRITE and UNLINK. + +call RESET(f) rewinds the file f. After execution of RESET on + sequential files only read/get operations are + available. + +call REWRITE(f) creates a new empty file. After execution of + REWRITE on sequential files only write/put operations + are available. + +call UNLINK(f) closes and deletes file f. File object is deallocated + and f is set to none. + + RESET or REWRITE must be performed on the file opening + before the first I/O operation on it. + + + + +3.3.5. TEXT FILES + + + The following operations are available to text files: read, readln, +eoln, write, writeln, eof. + The first parameter of the operation is a file variable. If it is +omitted, then a standard input/output file assigned to user's +terminal is used. + + + + + +Example: + + read(f,a,b); + read(c); + writeln(g," .... "); + if eof(f) then .... + + +For more information see (1). + + + +3.3.6. BINARY SEQUENTIAL FILES + + + Any file created with the parameter T = integer, real or char is a +binary one.It is a sequence of components of the type T. Only objects +of type T can be read from or written to this file. + The following operations are avaliable to binary files: + + put( w1, ..., wn) + get(f, x1, ..., xn) + eof(f) + +where f is a file opened with the type T, wi is an expression of the +type T and xi is a variable of the type T. + The statement put(f, w1, ..., wn) writes the components w1, ..., +wn to the file f. The statement get(f, x1, ..., xn) reads the next n +components from the file f and assigns them to the variables x1, +..., xn. The statement eof is the same as for text files. + + + +3.3.7 DIRECT ACCESS BINARY FILES + + + Direct access files are treated as a sequence of bytes without any +interpretation. Operations RESET and REWRITE prepare a file for both +reading and writing. RESET is used for existing files, REWRITE for the +new ones. The following additional operations are available: + +call SEEK(f, offset, base) - moves the file pointer to the position + designated by offset relative to base. + Offset is a signed integer specifying the + number of bytes. Possible values for base + are: + 0 - begining of file + 1 - current position of file pointer + 2 - end of the file + +Examples: + +call SEEK(f, 0, 0) - rewinds file f +call SEEK(f, -3, 1) - backspaces file f by 3 bytes +call SEEK(f, 0, 2) - moves the file pointer to the first byte + after end of file + +POSITION(f) - returns current position of the file + pointer associated with f. + + + +PUTREC(f, A, n) - where A is an array of any primitive + type and n is an integer variable. Let k + be the number of bytes occupied by + elements of array A. This operation + writes min(k, n) bytes from A to the file + f and advances file pointer by the number + of written bytes. The number of bytes + written to the file is returned in the + variable n. + + +GETREC(f, A, n) - where A is an existing array of any + primitive type and n is an integer + variable. Let k be the number of bytes + occupied by elements of array A This + operation reads min(k,n) bytes (or less, + if end of file is encountered) from the + file and advances the file pointer by the + number of read bytes. The number of bytes + read from the file is returned in the + variable n. + + + + +3.4. CONCURRENCY + + + + Implemented concurrency mechanisms differ much from those described +in the LOGLAN-82 report. In particular, only distributed processes are +implemented, so they cannot communicate through shared variables. For +this reason semaphores had to be replaced by an entirely new +communication mechanism. Such a mechanism has been designed and it is +based on the rendez-vous schema. + + +3.4.1. INVOKING THE LOGLAN INTERPRETER FOR CONCURRENT PROGRAMS + + + A concurrent LOGLAN program may run on a single computer with +concurrency simulated by time slicing. In this case LOGLAN interpreter +is invoked as usual. One must only remember that /m optional parameter +(see 1.4.) denotes memory size for each process rather than for the +whole program. + + To achieve true parallel (multiprocessor) execution, a network of +IBM PC computers may be used. For the time being, only D-Link Network +Version 3.21 is supported. In order to run a LOGLAN program in the +network environment take the following steps: + + 1) make sure that every node is logged on, + 2) select arbitrarily one node as a console, + 3) invoke the LOGLAN interpreter on every node except the console, + giving it /r option with the console node number (see 1.4.). You + must give the same program file to all interpreters. Most + conveniently it may be achieved by accessing a file on a disk + connected through the network to each node. + 4) invoke the interpreter on the console without the /r option (in + the usual way). Give it the same program file as above. + + After the last step the main program process begins its execution +on the console node. Other processes may be created dynamically on any +node on which an interpreter is running. + + Regardless of the fact whether the network is used or not, more +than one process may be executed on the same computer. + + +3.4.2. RESTRICTIONS AND DIFFERENCES FROM THE REPORT + + + All processes (even those executed on the same computer) are +implemented as distributed, i.e. without any shared memory. This fact +implies some restrictions on how processes may be used. Not all +restrictions are enforced by the present compiler, so it is the +programmer's responsibility to respect them. This is the list of +restrictions: + + 1) all process units must be declared as global, i.e. directly + inside the main program block + 2) a process cannot access global variables (except for the main + program process) + 3) any remote access to a process object other than a procedure (or + function) call is inhibited + 4) each parameter of + - a process + - a procedure called by remote access to a process object + - a procedure parameter of a process + must be one of the following: + - a value of the primitive type (INTEGER, REAL, CHAR, BOOLEAN, + STRING) + - a procedure declared directly inside a process + - a procedure which is a formal parameter of a process + - any reference to a process object. + This restriction implies that references to objects other than + processes have only local meaning (in a single process) and + cannot be passed among the processes. + 5) comparisons, IS, IN and QUA operations are not allowed for the + references to processes. + 6) operations which require dynamic type checking on the references + to processes are not allowed + 7) a process may be attached only by a proper coroutine (not by a + process) generated by it + 8) the variable MAIN is accesible only in the main program process. + + The following concurrent constructs described in the report are not +implemented at all: + + - semaphores and all operations on them + - the WAIT expression. + + Semantics of the NEW generator is slightly modified when applied to +the processes. The first parameter of the first process unit in the +prefix sequence must be of type INTEGER. This parameter denotes the +node number of the computer on which this process will be created. For +a single computer operation this parameter must be equal to 0. + +Example: + +unit A:class(msg:string); +... +end A; +unit P:A process(node:integer, pi:real); +... +end P; +... +var x:P; +... +begin +... + (* Create process on node 4. The first parameter is the *) + (* string required by the prefix A, the second is the node number *) + x := new P("Hello", 4, 3.141592653); +... +end + + + The following parallel constructs are implemented as defined in the +report: + + - KILL operation for a process + - RESUME statement + - STOP statement without parameter. + + +3.4.3. COMMUNICATION MECHANISM + + + Processes may communicate and synchronize by a mechanism based on +rendez-vous. It will be referred to as "alien call" in the following +description. + + An alien call is either: + - a procedure (or function) call performed by a remote access to a + process object, or + - a call of a procedure which is a formal parameter of a process, + or + - a call of a procedure which is a formal parameter of an + alien-called procedure (this is a recursive definition). + + Every process object has an enable mask. It is defined as a subset +of all procedures declared directly inside a process unit or any unit +from its prefix sequence (i.e. subset of all procedures that may be +alien-called). + A procedure is enabled in a process if it belongs to that process' +enable mask. A procedure is disabled if it does not belong to the +enable mask. + Immediately after generation of a process object its enable mask is +empty (all procedures are disabled). + + Semantics of the alien call is different from the remote call +described in the report. Both the calling process and the process in +which the procedure is declared (i.e. the called process) are involved +in the alien call. This way the alien call may be used as a +synchronization mechanism. + The calling process passes the input parameters and waits for the +call to be completed. + The alien-called procedure is executed by the called process. +Execution of the procedure will not begin before certain conditions +are satisfied. First, the called process must not be suspended in any +way. The only exception is that it may be waiting during the ACCEPT +statement (see below). Second, the procedure must be enabled in the +called process. + When the above two conditions are met the called process is +interrupted and forced to execute the alien-called procedure (with +parameters passed by the calling process). + Upon entry to the alien-called procedure all procedures become +disabled in the called process. + Upon exit the enable mask of the called process is restored to that +from before the call (regardless of how it has been changed during the +execution of the procedure). The called process is resumed at the +point of the interruption. The execution of the ACCEPT statement is +ended if the called process was waiting during the ACCEPT (see below). +At last the calling process reads back the output parameters and +resumes its execution after the call statement. + + The process executing an alien-called procedure can easily be +interrupted by another alien call if the enable mask is changed. + + There are some new language constructs associated with the alien +call mechanism. The following statements change the enable mask of a +process: + ENABLE p1, ..., pn +enables the procedures with identifiers p1, ..., pn. If there are any +processes waiting for an alien call of one of these procedures, one of +them is chosen and its request is processed. The scheduling is done on +a FIFO basis, so it is strongly fair. The statement: + DISABLE p1, ..., pn +disables the procedures with identifiers p1, ..., pn. + In addition a special form of the RETURN statement: + RETURN ENABLE p1, ..., pn DISABLE q1, ..., qn +allows to enable the procedures p1, ..., pn and disable the procedures +q1,...,qn after the enable mask is restored on exit from the +alien-called procedure. It is legal only in the alien-called +procedures (the legality is not enforced by the compiler). + A called process may avoid busy waiting for an alien call by means +of the ACCEPT statement: + ACCEPT p1, ..., pn +adds the procedures p1, ..., pn to the current mask, and waits for an +alien call of one of the currently enabled procedures. After the +procedure return the enable mask is restored to that from before the +ACCEPT statement. + + Note that the ACCEPT statement alone (i.e. without any +ENABLE/DISABLE statements or options) provides a sufficient +communication mechanism. In this case the called process may execute +the alien-called procedure only during the ACCEPT statement (because +otherwise all procedures are disabled). It means that the enable mask +may be forgotten altogether and the alien call may be used as a pure +totally synchronous rendez-vous. Other constructs are introduced to +make partially asynchronous communication patterns possible. + + + + +3.5. SYSTEM SIGNALS + + + + System signals are connected to runtime errors (see APPENDIX C). +These signals are the following: + + ACCERROR - reference to non existing object, + CONERROR - array index outside the range or lower bound is + greater than upper bound during array object + generation, + LOGERROR - errors related to control transfer, + MEMERROR - memory overflow, + NUMERROR - errors related to arithmentic operations like division + by zero, floating point overflow, + TYPERROR - type conflict in assignment statement, during + parameter transmission or headline conflict for actual + parameter function and procedure. + SYSERROR - errors related to file system, like reading after + writing, too many files etc. + + + + +3.6. IMPLEMENTATION RESTRICTIONS + + + + - Text line in source program can't be longer than 80 + characters. + - Maximal length of identifier is 20 characters, but entire + length of all identifiers and keywords should be less + than 3000 characters. + - String constant can't be longer than 260 characters. + - For case instructions: + - up to 6 levels of nested case instructions are + allowed, + - range of labels can't be greater than 160. + - Number of formal parameters can't be greater than 40, + whereas up to 35 output or input parameters are allowed. + Total number of formal parameters and variables declared + in one module can't be greater than 130. + - Number of array indices (i.e. arrayof) can't be greater + than 63, + - Standard type integer has the range (-32767,+32767) for + small memory (16 - bit word ). For huge memory (32-bit + word) the range is (-2147483647,+2147483647), but values + of constant expressions in a program must lie within the + range (-32767,32767). + - Real numbers have the range (-8.43E-37, 3.37E+38) + with 24-bit mantissa and 8-bit exponenet for small + memory , giving about 7 digits of precision. For huge + memory the range is (4.19E-307, 1.67E+308) with 53-bit + mantissa and 11-bit exponent, giving about 15 digits of + precision.Values of constant expression in a program must + lie in the range (-8.43E-37, 3.37E+38). + + + Remark + + + Compiler computes values of expressions built from + constants without range checking. It means, that integer + overflow, floating point overflow or underflow cause + incorrect result without any message. + + +APPENDIX A : STANDARD CONSTANTS + + + INTSIZE + The size in bytes of integer variables (2 for small + memory, 4 for huge memory) + + REALSIZE + The size in bytes of real variables (4 for small + memory, 8 for huge memory) + + + + + +APPENDIX B : STANDARD CLASSES + + +IIUWGRAPH + + Class IIUWGRAPH defines the set of graphics procedures. The full +description of these procedures is contained in the description +of the library IIUWGRAF (Institue of Informatics, University of +Warsaw). The following procedures are available in Loglan (heads +are specified if they are different from these in IIUWGRAF +description): + + gron + groff + cls + point + move + draw + hfill + vfill + color + style + patern + intens + pallet + border + video + hpage + nocard : function: integer; + pushxy + popxy + inxpos : function: integer; + inypos : function: integer; + inpix + getmap : function(input x,y:integer): arrayof integer; + putmap + ormap + xormap + track + inkey : function : integer; + hascii + hfont + hfont8 + outstring + cirb + + + +MOUSE + + + Standard class MOUSE provides basic support for mouse. An external +resident Microsoft compatible mouse driver (such as MOUSE.SYS) must be +installed to use this class. MOUSE contains following procedures and +functions: + +init:function(output b:integer):boolean + Initializes mouse driver. Number of mouse buttons is returned + in b. Returns true iff mouse hardware and software are + installed. + +showcursor:procedure + This procedure increments the internal cursor counter. If the + counter is 0 it displays the cursor on the screen. The cursor + tracks the motion of the mouse, changing position as the mouse + changes position. + +hidecursor:procedure + This procedure removes the cursor from the screen and + decrements the internal cursor counter. Although the cursor is + hidden it still tracks the motion of the mouse, changing + position as the mouse changes position. + +status:procedure(output h, v:integer, l, r, c:boolean) + This procedure reports the status of the buttons and cursor. + l, r, c are true iff respectively left, right and center (if + it exists) buttons are down when the procedure is called. Also + position of cursor is returned in h and v. Position is + expressed in Color Graphics Adapter pixels (with resolution + 640x200). + +setposition:procedure(h, v:integer) + This procedure sets the cursor to the specified horizontal and + vertical positions on the screen. The new values must be + within the specified ranges of the virtual screen. The values + are rounded to the nearest values permitted by the screen for + horizontal and vertical positions. + +getpress:procedure(b:integer; output h, v, p:integer, l, r, c:boolean) + This procedure gives a count of selected button presses (on p) + since the last call to it and the position of the cursor (on h + and v) the last time the button was pressed. Parameter b + selects button to be checked: 0 - left, 1 - right, 2 - center. + In addition current button status is returned in l, r and c + (see procedure status). + +getrelease:procedure(b:integer; output h, v, p:integer, l, r, c:boolean) + This procedure gives a count of selected button releases (on + p) since the last call to it and the position of the cursor + (on h and v) the last time the button was released. Parameter + b selects button to be checked: 0 - left, 1 - right, 2 - + center. In addition current button status is returned in l, r + and c (see procedure status). + +setwindow:procedure(l, r, t, b:integer) + Restricts the cursor movement to window described by l, r, t, + b. L and r are minimum and maximum horizontal cursor position, + t and b are minimum and maximum vertical cursor position (in + CGA pixels) + + +defcursor:procedure(s, x, y:integer) + Selects text mode cursor characteristics. When s is 0, + software cursor is selected and x, y define masks to be used + when modifying character-attribute word in screen memory + associated with position under cursor. This word is logicaly + ANDed with x and the result is XORed with y. When s is 1, a + hardware cursor is selected and x, y define first and last + scan lines of the cursor box within character box. X must be + not greater than y and both must be in range 0-7 for Color + Graphics Adapter or 0-13 for Monochrome Display Adapter, + Hercules Graphics Card and Enhanced Graphics Adapter. + Examples: + call defcursor(0, -1, 30464) + - selects standard (reverse video) software cursor + call defcursor(1, 11, 12) + - selects standard hardware cursor for HGC + +getmovement:procedure(output h, v:integer) + Returns relative mouse movement since last call (in 1/200 + inches). + +setspeed:procedure(h, v:integer) + H and v specify horizontal and vertical cursor speed relative + to mouse speed. It is expressed in mouse steps (1/200 inch) + corresponding to 8 CGA pixels on screen. Default is 8 + horizontaly and 16 verticaly. + Examples: + call setspeed(1, 1) + - set maximum cursor speed + call setspeed(16, 32) + - set cursor speed two times slower than default + +setthreshold:procedure(s:integer) + sets threshold speed for double speed feature. If the mouse + moves faster than the threshold, the cursor speed on the + screen is doubled. Default threshold is 64 mouse steps/second. + Example: + call setthreshold(10000) + - efectively disable double speed feature. + + + + +APPENDIX C : STANDARD PROCEDURES AND FUNCTIONS + + + ENDRUN:procedure; + Terminates program execution (ABORT). + + RANSET:procedure(x:real); + Initializes random generator (for RANDOM function) + + RANDOM:function:real; + Generates uniformly distributed pseudo-random numbers + in the interval (0,1). + + SQRT:function(x:real):real; + Computes square root of parameter x. + + SIN:function(x:real):real; + Computes sinus of parameter x. + + COS:function(x:real):real; + Computes cosinus of parameter x. + + TAN:function(x:real):real; + Computes tangens of parameter x. + + EXP:function(x:real):real; + Computes e**x. + + LN:function(x:real):real; + Computes natural logarithmus of parameter x. + + ATAN:function(x:real):real; + Computes arcus tangens of parameter x. + + ENTIER:function(x:real):integer; + Computes entier part of parameter x. + + ROUND:function(x:real):integer; + Computes rounded value of parameter x: + ROUND(x)=ENTIER(x+0.5). + + IMIN:function(x, y:integer):integer; + Computes minimum of two parameters. + + IMAX:function(x, y:integer):integer; + Computes maximum of two parameters. + + IMIN3:function(x, y, z:integer):integer; + Returns the minimum of three parameters. + + IMAX3:function(x, y, z:integer):integer; + Returns maximum of three parameters. + + ISHFT:function(x, k:integer):integer; + Logically shifts x by k bits: left, when k is + positive, right otherwise. + + IAND:function(n, k:integer):integer; + Returns logical product of parameters (on all bits). + + IOR:function(n, k:integer):integer; + Returns logical sum of parameters (on all bits). + + XOR:function(n, k:integer):integer; + Returns exlusive sum of parameters (on all bits). + + INOT:function(n:integer):integer; + Returns logical complement of parameters (on all + bits). + + ORD:function(c:char):integer; + Returns number that represents character c (see + APPENDIX D). The following equations are satisfied: + CHR(ORD(c)) = c + ORD(CHR(n)) = n + + CHR:function(n:integer):char; + Returns character represented by parameter n (see + APPENDIX D). + + UNPACK:function(s:string):arrayof char; + Returns address of new array object containing + characters of the string s. + + MEMAVAIL:function:integer; + Returns the size of available memory in the current + process (in words). + + EXEC:function(cmd:arrayof char):integer; + Calls secondary command processor with cmd as a + command string. Exit code is returned as a value of + EXEC. + + TIME:function: integer; + Returns an integer value indicating the amount of + central processor time in seconds used by current + process. + + RESET:procedure(f:file); + Positionnes file f at the first component and readies + it to reading. + + REWRITE:procedure(f:file); + Positionnes file f at the first component and readies + it for output. The file f becomes empty (eof(f) = + true). + + UNLINK:procedure(f:file); + Closes and deletes file f (see 3.3.4) + + SEEK:procedure(f:file; offset, base:integer); + Positiones file pointer (see 3.3.7) + + POSITION:function(f:file):real; + Reads position of file pointer (see 3.3.7) + + + + + +APPENDIX D : ERROPOR CODES + + + + 0 - ***declaration part overloaded + Overflow of compiler data structure of declaration + part. Possible reasons: too complicated program + structure (too many classes, protection lists, + parameter lists,...), too complicated function + expressions e.g. f(g(h(...))). It is possible that + removing some errors e.g. "unvisible identifier" + causes shortening of the program. + 10 - ***too many errors + Overflow of error diagnostic table. 1024 first + detected errors are printed, but global number of + error is equal to number of all detected errors. + 41 - ***declaration part overloaded + Comments as for 0. + 101 - ':=' expected + 102 - ';' expected + 103 - 'then' expected + 104 - 'fi'/'else' expected + 105 - 'od' expected + 106 - '(' expected + 107 - ')' expected + 108 - 'do' expected + 109 - identifier expected + 110 - too many exits found + Length of sequence exit exit ...exit exceeds level + of loop nesting +1. + 111 - illegal character + 112 - wrong structure of 'if'-statement + 113 - 'end' missing + 114 - '.' expected + 115 - illegal constant in expression + Character constant or text appears in logical or + arithmetical expression. + 116 - '=' expected + 117 - constant expected + 118 - ':' expected + 119 - unit kind specification expected + Keywords: class, procedure, function, coroutine or + process missing in module headline. + 120 - 'hidden' or 'close' occurred twice + 121 - 'hidden' or 'close' out of a class + 122 - 'block' expected + 123 - object expression is not a generator + Object expression appearing as instruction is not + a generator e.g. new (a).b + 124 - 'dim' expected + 125 - 'to'/'downto' expected + 126 - illegal arithmetic operator + 127 - declaration part expected + 128 - incorrect identifier at 'end' + Module name after end does not correspond to name + in module headline. + 129 - wrong structure of 'case'-statement + 130 - wrong structure of 'do'-statement + 131 - illegal use of 'main' + Name main may be used only as an argument of + attach operator: in other cases it is illegal. + 132 - 'when' expected + 133 - too many branches in 'case'-statement + Number of branches in case instruction is greater + than 160. + 134 - 'begin' missed + 135 - bad option + 136 - is it really a loglan program??? + There is no Loglan keyword found in source program + like: begin, block, unit, class,... + 137 - 'block' missed - parsing began + There is no keyword block or program at the + beginning of the Loglan program. This message + indicates the source line, that is the first + compiled line. + 138 - 'repeat' out of a loop + The length of sequence: (exit)*repeat exceeds + nested depth of the loop. + 139 - there is no path to this statement + 140 - 'andif'/'orif' mixed + 141 - array of 'semaphore' is illegal + 142 - wrong handler end + Handler declaration is not ended by instruction + end or end handlers. + 143 - lastwill inside a structured statement + 144 - repeated lastwill + Label LASTWILL appears more than once in the same + module. + 145 - no parameter specification + 146 - wrong register specification + 147 - "," expected + 191 - ***null program + There is no source program on the input file or + there is no module declaration. Causes termination + of program compilation. + 196 - ***too many identifiers + Entire length of all identifiers and keywords is + greater than 3000 characters. This overflow + terminates program compilation. + 197 - ***too many formal parameters + The length of formal parameter list and declared + local variables (in actual module) is greater than + 130. This error terminates program compilation. + 198 - ***parsing stack overloaded + Too complicated (nested) program structure. This + error terminates program compilation. + 199 - ***too many prototypes + Too many declarations in program caused overflow + of the compiler data structure. This error + terminates program compilation. + 201 - wrong real constant + 202 - wrong comment + 203 - wrong character constant + 204 - wrong integer constant + 205 - integer overflow + Integer constant out of range. + 206 - real overflow + Real constant out of range. + 211 - identifier too long + Length of identifier is greater than 20 + characters. + 212 - string too long + Length of string constant is greater than 260 + characters. + 301 - prefix is not a class id + Prefix name ID is not a class name. It may appear + when identifier ID is used earlier (declarated + more than once). + 303 - coroutine/process illegal here as prefix id + Procedure, function or block can't be prefixed by + coroutine or process. + 304 - hidden identifier cannot be taken id + Identifier ID placed on taken list is on hidden + list in the prefixing module. + 305 - undeclared identifier id + 306 - undeclared type identifier id + 307 - type identifier expected id + Identifier ID used in variable or function + declaration as a type name, is not declared + earlier as a type (but name has been used + earlier). + 308 - undeclared prefix identifier id + 309 - declared more than once id + 310 - taken list in unprefixed unit + 316 - formal type specification after use id + Formal type ID appears in the parameter list after + using this identifier as a parameter type e.g. + (... x: ID; type ID, ...). + 317 - hidden type identifier id + Type name ID is on hidden list in a prefix of one + of the modules from SL chain of actual module and + it is a nearest declaration of this identifier. + 318 - type identifier not taken id + Type name ID is not on taken list in a prefix of + one of the modules from SL chain of actual module. + 319 - hidden identifier in the list id + Identifier ID from hidden or close list is on + hidden list in one of the prefixing modules. + 320 - identifier in the list not taken id + Identifer ID from hidden or close list is not + placed on taken list in none of the prefixing + modules. + 321 - identifier cannot be taken id + Identifer ID from taken list is placed on taken + list in none of the prefixes. + 322 - hidden prefix identifier id + Analogical to 317 error. + 323 - prefix identifier not taken id + Analogical to 318 error. + 329 - only procedure and function may be virtual + virtual specification appears with class + specification. + 330 - virtual in unprefixed block/procedure/function + 331 - incompatible kinds of virtuals id + Kind of virtual module ID is different from kind + of replaced module (e.g. one of them is a + function, the other one is a procedure). + 332 - incompatible types of virtuals id + Type of virtual function ID is different from type + of replaced function. + 333 - different lengths of form.param.lists in virtuals id + Virtual module ID and replaced module have + different number of formal parameters. + 334 - conflict kinds of the 1st level parameters id + In the headline of virtual module ID kind of + formal parameter differs from corresponding formal + parameter in the headline of replaced module (e.g. + type and variable, input and output + parameters,...). + 335 - incompatible types of the 1st level parameters id + There are formal parameters of different types + (function, procedure) in the headline of virtual + module ID and in the headline of replaced module + on the same position. + 336 - different lengths of the 2nd level params lists id + There are formal procedures/functions with + different numbers of parameters in the headline of + virtual module ID and in the headline of replaced + module on the same position. + 337 - incompatible kinds of the 2nd level parameters id + There are parameters of different kinds on the + same position in the corresponding procedure or + function parameters in the headline of virtual + module ID and in the headline of replaced module. + 338 - incompatible types of the 2nd level parameters id + There are parameters of different types on the + same position in the corresponding procedure or + function in the headline of virtual module ID and + in the headline of replaced module. + 341 - ***declaration part overloaded + Analogical to error 0. + 342 - ***too many classes declared + 343 - ***too many prototypes + Too many modules declared on the same level. + 350 - undeclared signal identifier id + 351 - hidden signal identifier id + Analogical to error 317. + 352 - signal identifier not taken id + Analogical to error 318. + 353 - signal identifier expected id + Identifier ID placed in handler declaration as a + signal name has not been declared as a signal. + 354 - different types of parameters id + In the headlines of signals, that have common + handler, parameters of the different types appear + on the same position. ID is one of these + parameters. + 355 - incompatible kinds of parameters id + In the headlines of signals that have common + handler, parameters of different kinds appear on + the same position. ID is one of these parameters. + 356 - different identifiers of parameters id + In the headlines of signals that have common + handler parameters of different names appear on + the same position. ID is one of these parameters. + 357 - incompatible kinds of the 2nd level parameters id + Analogous to error 355 for 2-nd level parameters. + 358 - different types of the 2nd level parameters id + Analogous to error 354 for the 2-nd level parameters. + 359 - different lengths of the 2nd level params lists id + There are formal procedures or formal functions + with different number of parameters on the same + position in the headlines of signals this have + common handler. ID is one of these formal + parameters/functions. + 360 - different lengths of form. param. lists in signals id + There are different number of formal parameters in + the signals that have common handler. ID is one of + these signals. + 361 - non-local formal type cannot be used id + Formal parameter ID of signal is of non local + formal type. + 362 - repeated handler for signal id + There are more than one handler for signal ID in + the same module. + 370 - only 'input' is legal here + Formal parameter output or inout is illegal in + process. + 398 - class prefixed by itself id + Construction unit ID: ID class is not allowed. + 399 - cycle in prefix sequence id + ID is a class identifier used in cyclic prefixing + i.e. ID prefixes a, a prefixes b, ... , z prefixes + ID. This construction is not allowed. + 401 - wrong label in 'case' id + Label in case instruction is not a constant. + 402 - 'case' statement nested too deeply + Nesting level in case instruction is greater than + 6. + 403 - too long span of 'case' labels + Range of branches in case instruction is greater + than 160. + 404 - repeated label in 'case'-statement id + Label ID appears more than once in case + instruction. + 405 - illegal type of 'case' expression id + Control expression in case statement is not of + integer or char type. + 406 - different types of labels and 'case' expression + 407 - non-logical expression after 'if'/'while' id + 408 - real constant out of integer range + Error during conversion of real constant to + integer constant. + 410 - simple variable expected id + Control variable in for loop is not a simple + variable. + 411 - non-integer control variable id + Control variable ID in for loop is not of integer + type. + 412 - non-integer expression id + Expression placed as array index or bound limit in + array generation or as step in for loop or as + format in write statement should be reducable to + integer type. + 413 - file expression expected id + 414 - string expression expected id + 415 - reference expression expected id + Expression placed before dot (remote access), + before qua or as a argument of kill or copy + statement is not of class type. + 416 - array expression expected id + 417 - boolean expression expected id + 418 - semaphore variable expected + 419 - illegal type in 'open' + The type name placed in open is different than + TEXT, REAL, INTEGER, CHAR and DIRECT. + 420 - variable expected id + Expression placed on the left side of assignment + statement or as an argument of read instruction or + in array instruction is not a variable. + 421 - class identifier after 'new' expected id + Identifier ID placed after new is not a class + identifier. + 422 - procedure identifier after 'call' expected id + 423 - 'new' missing id + Keyword new doesn't appear before class identifier + for object generation. + 424 - 'call' missing id + Keyword call doesn't appear before procedure + identifier for procedure call. + 425 - 'inner' out of a class + 426 - 'inner' occurred more than once + 427 - 'wind'/'terminate' out of a handler + 428 - 'inner' inside lastwill + 429 - definition cannot be reduced to constant id + Identifier ID placed in constant definition is not + a constant. + 430 - undefined constant in the definition id + 431 - wrong number of indices id + Number of indices in referencing to array element + is different from declared number of indices. + 432 - index out of range id + 433 - upper bound less than lower bound id + 434 - too many subscripts id + Dimension of static array ID is greater than 7. + 435 - variable is not array id + 440 - type identifier expected after 'arrayof' id + Identifier ID placed after arrayof in actual + parameter list, corresponding to type parameter is + not a type name. + 441 - incorrect format in 'write' + There is format for expression of char type or + there is double format for expression of type + integer or string. + 442 - illegal expression in 'write' + Argument of write statement is not of type char, + string, integer or real. + 443 - illegal type of variable in 'read' id + Argument of read statement is not of type char, + integer or real. + 444 - no data for i/o transfer + There is only file identifier in I/O instruction. + 445 - illegal expression in 'put' + 446 - illegal expression in 'get' + 448 - 'raise' missing id + There is signal identifier without keyword raise + in the context of signal raising. + 449 - signal identifier expected id + Identifer ID after keyword raise is not a signal + identifier. + 450 - illegal procedure occurrence id + Procedure name ID appears in illegal context. + 451 - illegal class occurrence id + Class name ID appears in illegal context. + 452 - illegal type occurrence id + Type name ID appears in illegal context. + 453 - illegal signal occurrence id + Signal name ID appears in illegal context. + 454 - illegal operator occurence + 455 - wrong number of operands + 460 - divided by zero + 470 - illegal input parameter id + Actual parameter associated with input parameter + is not expression that may have any value: it is + e.g. procedure name + 471 - illegal output parameter id + Actual parameter corredponded to output parameter + is not a variable. + 472 - illegal type parameter id + Actual parameter ID associated with type parameter + is not a type name. + 473 - illegal procedure parameter id + Actual parameter ID associated with procedure + parameter is not a procedure name. + 474 - illegal function parameter id + Actual parameter ID associated with function + parameter is not a function name. + 475 - illegal left side of 'is'/'in' id + Left side argument ID of is/in is not a reference + expression. + 476 - illegal right side od 'is'/'in' id + Right side argument ID of is / in is not a class + name. + 477 - illegal parameter of 'attach' id + Parameter ID of attach statement is not a + reference variable of class object. + 478 - illegal type of expression + 479 - negative step value + 550 - ***stack overloaded + This error may be removed by dividing expressions + into subexpressions, making simpler nested + callings of arrays, functions, classes and for + loops. This error terminates compilation of + current module, but other modules will be + compiled. + 551 - ***too many auxiliary variables needed + Too complicated expressions. This error may be + removed by declaration of additional variables and + using them as auxiliary variables in expressions. + 552 - ***too many auxiliary reference variable needed + Analogical to error 551. + 553 - ***statement sequence too long or too complicated + This error may be removed by adding 'goto' + statement into sequence of instructions e.g. if + false then exit fi, inner, ... or by dividing + complicated expression into subexpressions. + 554 - ***real constants dictionary overflow + Too many real constant, maybe because of + evaluation of expressions built from real + constants. + 600 - undeclared identifier id + 601 - illegal type before '.' id + Expression placed before dot (remote access) is + not of class type. + 602 - close identifier after '.' id + Identifier ID placed after dot is on close list in + the class or its prefix that construct expression + before dot. + 603 - undeclared identifier after '.' id + Identifier ID placed after dot is not attribute of + expression placed before dot. It may be caused by + missing declaration or using bad prefix for class + constructing expression before dot. + 604 - illegal operand type id + One of the arguments in arithmetical expression or + in relation is not of arithmetical type. + 605 - illegal type in 'div/'mod' term id + Expression identified by ID used as argument of + div or mode operation is not of integer type. + 606 - incompatible types in comparison id + ID is an identifier of left argument of relation. + 607 - unrelated class types in comparison id + ID is an identifier of left argument of relation. + Both arguments are of class type and none of these + classes prefixes the other one. + 608 - string cannot be compared id + ID identifies a string. + 609 - incompatible types in assignment/transmission id + ID is an identifier of left side of assignment + statement or an identifier of actual parameter in + object generation. Types of both sides of + instruction or type of formal parameter and type + of actual parameter are incompatible. + 610 - unrelated class types in assignment/transmission id + Analogical to errors 609 and 607. + 611 - constant after '.' id + An attempt to remote access to constant. + 612 - this class does not occur in sl-chain id + Class ID appeared in expression this ID, but ID + dosn't prefix any module in SL chain of actual + module. It may be a cycle. + 613,614 - class identifier expected id + For error 613: identifier ID used in expression + this ID is not of class type. + For error 614: identifier ID used in expression + this ID is not name of any type. + 615 - illegal type before 'qua' id + Object expression before qua should be of one of + the types: class, coroutine, process or simple + (not array) formal type. + 616,617 - illegal type after 'qua' id + For error 616: identifier ID used after qua is not + of any type. + For error 617: identifier ID used after qua is not + of class type. + 618 - unrelated types in 'qua'-expression id + Identifier ID is a name of class type used after + qua. This class type and class type used before + qua doesn't prefix each other. + 619 - hidden identifier id + Identifier ID used in construction qua ID or this + ID is on hidden list in the prefix of one of the + module from SL chain of actual module. + 620 - not taken identifier id + Identifier ID used in construction qua ID or this + ID is not on taken list in any prefix of any + module of actual module. + 621 - invisible identifier after '.' id + Identifier ID placed after dot is on hidden list + or is not on taken list in prefix. + 622 - formal parameter list is shorter id + Identifier ID identifies generated object: class, + procedure or function. Formal parameters list of + this object is shorter than actual parameters + list. + 623 - formal parameter list is longer id + Analogical to error 622. + 624 - actual parameter is not a reference type id + Actual parameter identified by ID in generated + object can't be of primitive type: integer, real, + boolean or string. + 625 - actual parameter is not a type id + Actual parameter identified by ID is not a type, + so it can't replace formal type parameter. + 626 - procedure-function conflict between parameters id + Actual parameter, identified by ID, that replaced + formal parameter in generated object is function + whereas formal parameter is a procedure or vice + versa. + 627 - unmatched heads-wrong kinds of parameters id + ID identifies actual module that replaced formal + module. There are parameters of different kinds on + the same position in the headlines of these + modules. For input - output conflict the agreement + of parameter types is checked also. + 628 - unmatched heads-incompatible types in lists id + ID identifies actual module that replaced formal + module. There are input /output parameters of + different types on the same position in the + headlines of actual and formal module. + 629 - unmatched heads-unrelated class types in lists id + ID identifies actual module that replaced formal + module. There are input/output parameters + specifying classes of disjointed prefix sequences + in the headlines of actual and formal module. + 630 - unmatched heads-different numbers of parameters id + There are different lengths of headlines in actual + module identified by ID and formal module. + 631 - incompatible types of function parameters id + There are different types of actual function + specified by identifier ID and formal function in + generated object. + 632 - function/procedure expected id + Actual parameter identified by identifier ID is + not function/procedure, whereas corresponding + formal parameter is function/procedure. + 633 - actual function type defined weaker than formal id + Type of actual function identified by ID is weaker + defined than formal function type e.g. formal + function type is statically defined, whereas + actual function type is formal (external) or + formal function is class, whereas actual function + type is coroutine or process. + 634 - unmatched heads-too weak type in actual list id + There are input/output parameters on the same + position in the headlines of actual module + identified by identifier ID and formal module, but + ID is weaker defined than corresponding formal + module parameter (see error 633). + 635 - standard function/procedure cannot be actual par. id + ID identifies standard procedure/function used as + actual parameter. + 636 - illegal use of semaphore id + 637 - 'semaphore' cannot be used id + + +APPENDIX E : LOGLAN RUNTIME ERRORS + + In the following list system signal name, raised after detection of +runtime error, is placed in brackets. + +ARRAY INDEX ERROR (CONERROR) + Index outside range during reference to array variable. +NEGATIVE STEP VALUE (CONERROR) +SL CHAIN CUT OFF (LOGERROR) + Control transfer to object that has SL link cut off earlier in + the consequence of kill operation. +ILLEGAL ATTACH (LOGERROR) + The value of parameter of attach instruction is none or object + differs from coroutine. +ILLEGAL DETACH (LOGERROR) + An attempt to return by detach to coroutine that has been + dealocated (by kill). +ILLEGAL RESUME (LOGERROR) + An attempt to resume an object which is not a process or a + process which is running. +TOO MANY PROCESSES ON ONE MACHINE (SYSERROR) + Number of processes existing on one computer is greater than 64. +INVALID NODE NUMBER (SYSERROR) + An attempt to create a process on a computer which is not + connected to network. +IMPROPER QUA (LOGERROR) + Error during computing expression of the form: ...x qua a, when + 'x' references to none or 'a' doesn't prefix dynamic type object, + which is value of 'x'. +ILLEGAL ASSIGNMENT (TYPERROR) + Type conflict between left and right side of assignment + instruction. +FORMAL TYPE MISSING (LOGERROR) + Formal type is not accessible because of SL cut off. +ILLEGAL KILL (LOGERROR) + An attempt to deallocate object in SL chain of active object. +ILLEGAL COPY (LOGERROR) + An attempt to copy non terminated object (i.e. class before + execution of return statement, coroutine before execution of end + statement...). +REFERENCE TO NONE (ACCERROR) + An attempt to remote access (by dot) to attributes of non + existing object: dealocated or not generated. +MEMORY OVERFLOW (MEMERROR) +INCOMPATIBLE HEADERS (TYPERROR) + Actual parameter list of generated object (procedure, function + or class) is incompatible with formal parameter list from module + declaration or formal function type is incompatible with actual + function type. +INCORRECT ARRAY BOUNDS (CONERROR) + An attempt to generate dynamic array object, when lower bound of + index range is greater than upper bound. +DIVISION BY ZERO (NUMERROR) +COROUTINE TERMINATED (LOGERROR) + An attempt to transfer control to a terminated coroutine. +COROUTINE ACTIVE (LOGERROR) + An attempt to transfer control to an active coroutine. +HANDLER NOT FOUND (LOGERROR) + There is no handler for signal declared by user. +ILLEGAL RETURN (LOGERROR) + An attempt to execute return instruction in handler serving + system signal. +UNIMPLEMENTED STANDARD PRC. (LOGERROR) + Standard procedure or function is not implemented. +FORMAL LIST TOO LONG (MEMERROR) + Formal parameter list is greater than 40. +ILLEGAL I/O OPERATION (SYSERROR) + Reading after writing, the type of the read/write parameter does + not match the type of the file etc. +I/O ERROR (SYSERROR) + System error during I/O. +CANNOT OPEN FILE (SYSERROR) +INPUT DATA FORMAT BAD (SYSERROR) +SYSTEM ERROR (SYSERROR) + Should not occur. +UNRECOGNIZED ERROR + +APPENDIX F : CHARACTER SET + + + At the top of the table are hexadecimal digits (0 to 7), and to the +left of the table are hexadecimal digits (0 to F). Hexadecimal code of +ASCII character is constructed by contatenation of column label and +row label. For example, the value of character representing the plus +sign is 2B. + + + 0 1 2 3 4 5 6 7 + _________________________________________________ + ! ! ! ! ! ! ! ! ! + 0 ! NUL ! DLE ! SP ! 0 ! @ ! P ! ! p ! + _________________________________________________ + ! ! ! ! ! ! ! ! ! + 1 ! SOH ! DC1 ! ! ! 1 ! A ! Q ! a ! q ! + _________________________________________________ + ! ! ! ! ! ! ! ! ! + 2 ! STX ! DC2 ! " ! 2 ! B ! R ! b ! r ! + _________________________________________________ + ! ! ! ! ! ! ! ! ! + 3 ! ETX ! DC3 ! # ! 3 ! C ! S ! c ! s ! + _________________________________________________ + ! ! ! ! ! ! ! ! ! + 4 ! EOT ! DC4 ! $ ! 4 ! D ! T ! d ! t ! + _________________________________________________ + ! ! ! ! ! ! ! ! ! + 5 ! ENQ ! NAK ! % ! 5 ! E ! U ! e ! u ! + _________________________________________________ + ! ! ! ! ! ! ! ! ! + 6 ! ACK ! SYN ! & ! 6 ! F ! V ! f ! v ! + _________________________________________________ + ! ! ! ! ! ! ! ! ! + 7 ! BEL ! ETB ! ' ! 7 ! G ! W ! g ! w ! + _________________________________________________ + ! ! ! ! ! ! ! ! ! + 8 ! BS ! CAN ! ( ! 8 ! H ! X ! h ! x ! + _________________________________________________ + ! ! ! ! ! ! ! ! ! + 9 ! HT ! EM ! ) ! 9 ! I ! Y ! i ! y ! + _________________________________________________ + ! ! ! ! ! ! ! ! ! + A ! LF ! SUB ! * ! : ! J ! Z ! j ! z ! + _________________________________________________ + ! ! ! ! ! ! ! ! ! + B ! VT ! ESC ! + ! ; ! K ! [ ! k ! { ! + _________________________________________________ + ! ! ! ! ! ! ! ! ! + C ! FF ! FS ! , ! < ! L ! \ ! l ! | ! + _________________________________________________ + ! ! ! ! ! ! ! ! ! + D ! CR ! GS ! - ! = ! M ! ] ! m ! } ! + _________________________________________________ + ! ! ! ! ! ! ! ! ! + E ! SO ! RS ! . ! > ! N ! ^ ! n ! ~ ! + _________________________________________________ + ! ! ! ! ! ! ! ! ! + F ! SI ! US ! / ! ? ! O ! _ ! o ! DEL ! + _________________________________________________ + + +where: + NUL Null DLE Data Link Escape + SOH Start of Heading DC1 Device Control 1 + STX Start of Text DC2 Device Control 2 + ETX End of Text DC3 Device Control 3 + EOT End of Transmission DC4 Device Control 4 + ENQ Enquiry NAK Negative Acknowledge + ACK Acknowledge SYN Synchronous Idle + BEL Bell ETB End of Transmission Block + BS Backspace CAN Cancel + HT Horizontal Tabulation EM End of Medium + LF Line Feed SUB Substitute + VF Vertical Tab ESC Escape + FF Form Feed FS File Separator + CR Carriage Return GS Group Separator + SO Shift Out RS Record Separator + SI Shift In US Unit Separator + SP Space DEL Delete + + + + + BIBLIOGRAPHY + + 1. Report on the Loglan-82 Programming Language. + 2. IIUWGRAF biblioteka podstawowych procedur graficznych. + 3. Microsoft (R) Mouse User's Guide. + + \ No newline at end of file -- 2.30.2

    u_I^j(MDRg>AB5{Nz;ol?KXnmY z`|%+kA`*7jdY>WMF3@oUrBk6z^!o2O1CIIH3ioSd|7Y3hCHphDeV_BPzm9jKj;n!? ztPb~+Q$+5P0MXU&I_4_|Fb?pR13X)1f58ylTSmWJM88@_zg9%QUPNCJAUFcARY-i# zn{+>^;ceCN-qrC`wOspQcA>oemg&0j;C`Zsp%A_fo7Z+HV_Cvk&}&*at%4BhIce8j zkmH3bofxq#uzKTDdnV-Dv+DJmg#cWstdZ6K^;i5YCyF(VU);!I21b?}46YFaT`IaC z>D-oV`!imrwM865f}ooN|CI6;?d<{c?Op|2v`e)V4TdT67eE8~Iu@gcx#${Q2HYW%haKx0Eg8~xFsm6d zz|HsZn^^dT=DX9CzOD(Z(-)A1I}6ES7>w`}h>Oshelv2(Cs88l9{c-l$6Fk6hfBm; z)Ds8*6tjm1xy}qS{(kJ=Pk8ezZ-yS?nj26Ya*9Kx5NBH{E${Yfc6=Ns?Fu0or;jH@ zjlpr71z;feJjgxE#f2GgH$m85%MkEsWefURN!l6j)=k>`J^B-*aX{2ZqH*)F!h=Y; zJ6AKw=H>6p7z?9&qDL%ks`scpa5lBz|$} zt`NHg@RNI&DY^6KnZ&u9$t;Wcs6k%i(tYV_Ywl+iNA2**aF^1%`{Ev?Fu<>zXMs6p zZWCVvbA1rs?-ggy%WxCl-ziK_ae)4t6~hxFb{j_6QDO@QsjqzBvEDJ|*lxj%?RQ0; zi(g<$IZHivS>xk$SyRu@Sku7KSQBI7nNyd&pPwF+;Zb+HN1k4k;R$nlI|kmll8l0@ zjqQ!H#f7`=aV7cp-0RQA_6vA`hoHxmBJM_kWM>}-!av3q7hYb;%}nVCsRG{O(=a(oaMH(R+(v49_G|kO?)R^ zO@1d`#ea~g?Y0Z2ZW6%kPH}unmQ9}XLa{hb&O>m7E4Fxsh*5DL5+P8QWW!I}twh@u zx?ib9G_2k@H+)8XU14HSL6+u}gR8ehT^m*YQyAU?oHchgEA2J+a9>(`hc&!4_b?Q) zr`^arEwPqQb#IWTGO#N$i!0VdZ{{#1L=14)sU4 zf%Df164c$V9w20Z7wbH4O6;OkK21L_vZ+$=^hUNw*tX?0qVlZoZF?>DcRDA_E?&4_(9~L+HdP(YtlNT+Cbj#o+DdCD_pV&n zL$sdT)lVIKmv^*XaXdP^A1H6z-Zy?HUG-bMGb3!oY|7e8i^MlD+g4TaYx`u?s@b-J zhcCEKxx!~=#F_ffHzR*UF8|p8Td(mti#Eb$@Uj94_uOwGa_QdhBT+u!` zYlLQ$aeBWAPTQZqzlr0lBI)&DB}kTCv3r)AwpcDZwCZoJ=2+Gp@H=kL3Hy`R)Vj;9 zP=8D^G$fbemp#duZba`~4~?2G*c02mAk5}7LNwcDNrN<-n*%CVFPQ!)Py!JE19!tC`jGO13B=pV`Gnp_?B+IReibn>H6Yorctes3^g8}o4XI%}VW|OX;bdPm zE6@^W;7MX&7UJWt64}%~E)I^`qf|Q(*_2-_OR~0Cz&fF4V^o+(1jXz-m-Jm>!&R$S zg9g4)Zd93LN#t4ERkH`>#(um~tF&HYeX%0U`&oEu)vo>>mJ~ZUY!M!`X_Y{@CYmPh zs|_{iuiQ&fm4aqe{IhP`aR9S=qr%iiPcsqIT}{mBccO;wPxlpWK+kTRVf~te*cAI` zUVxgQ89y(|B^9ru&)Rolp8f3a5%Tf?!L zRUmP_w4TS67W<#Y4DVwuDz?`3AXhufl0|0v){u`i{^>e=Ww=pr@ie4ASiT0H|H z7nus)HHVhk334D!PvBR`R`bn3Y7;}}DY+W12>uKMEzzXKNxTM2`uM@x+8RDELCqwp zg-j+J=RSV`^W!rs;=|QX$g%vJXMBprdOaHY;z8lz=G}C5=eK8e<$gBru~GY^{x44+ z&+)>ArmiVKy0Fqi)3~kK*z=lneVnHV)))y&_lG@(c;&+ z8Q0O!syPwSWzm{`nvlS-isMLF@Ese^ZRaxauu1ek+(rw(#zo97nghjZ<2`0(L_qVR_L7WK*&?;r)poUhGhqF_ zT&b0>rxWs%3s!aGj}`gsK0>)0EYvPC$Y8;*7)q%eD7eo9x`5J%VJz-w27+4J5R&nA zOk4S7uA?6sqQJCoV1bL5zs6rK?}!>GVnVCf4%3kkXb=`zeYXbljmBa1K(4l%Kg;nD zMV{F!P3e!+8Z^~n`1EaXmJ~B?8AguY7)gsqM!VQ4zjL>uxh0rJBF!Z<=cyT8_Z_H8 zfc^n1YuR><&r3-ffz~qUVGG699`)64^{D~vC<9wLO`J*e5jC%?RcfeEsaJN}PeNgo z#Q2vyCY@D=C0)iZIa!vkmcO4#)ZJnm7@-g?3(n0KF6X=Hp*M=@b=Jst4gLOolt|i^q5o;iAi==+cqm;4{!-led zPm(?nAAi3|i?nYITqRx># zE4U@5Szv*U*mg%KcSwmlilLZAg$_!Fb z&>0Z1K%t<4z5g+vu~&GamM3b%-x7IoQkP{kM^y=NS8>-voh)!soy5c-MhQ1@CmvEm z1N%oB#u?9S?@-h zH3!SUPCwGTgC#Hp^3e4=qbO~QS^|g0#x2cnb?fAr=kCb{KF^^D!0uTP>Bwq%eTl@rG~a$% z7w|s>g?tY)lMNM*7ZBP;?I1mgsWvpOg$@E>LnOJD7DykE2LdnArnT-v1Dd9hMymWY zoF_JD*m=1?fRcim0^_~$-p{gE@@&A51A&>t?NM%TQtgf0B*aXBSeei%JQQoab{S$! z>&Elnt}>EWji4X@NCA5sNqQ`BT3n#UC(gdYkF8Res83L;G=M*iBX<`$< z4J0l;t$CJmpM*BrE{^f9fi1I*b=zwNG)8JRfVd~*3fg=^td5p-EPpeB#FLPzJG8@Yy;NTcbY%*+cEdd4O+6vG%JZyhA!}|5Hnb<+8Yvlb z6eU$1g_ePHqUzQ9u+c%QpTf;y@GrGI5JNc;44veF(E??Jot?)mK?P%jLqvOH zC;AHJKNdm~rhDHzlM2L5HX@)~p~a6CCG8653;~eFGH%ECjzF(3FKp~QO4c88q4v>W z`y@E8VWSA1F;aesaIO-c9U)sx_0@>od9ilA<-v&dF7dVpm_{;)1Qo4aXehpu;!iMX z@h&D7mfnW2PvR4t70ozV!0A$*M4cuG$3Cgq8(>84OIyz!r;|@AFQg{1lWi^N;sGwI ztli6&6_IIfK^+A&9EB7%ahn!uhvXOb38mp{qH}rPHAsU(oaIG^$VlXPp_5u1@T8VZm zV6gdmIwFO`4wmd@$9i#rBjJgz7(`np0Nq)Kp?*x=ko9luGpx&98>ri*UCg5V4=zR= z5FwY3^5lib*X?VJTVT+qhud~lu=o2H>+pCM#=$#IQ>U1#OIId%yo8rx%FD1x5J}Vo z{qn(qd#&s{zx?rPvajO}L6=l>dn>4T(yCG3B#Qm40LTx8@o_v4KKUf~DQ-hCLCD2* zN*~^OjVK)Us6&cIn(w-SaZzUX^nRt%F!d>n;iyNsr0rvThyA{#D$R~2Varsf0=wwk zzwI6Jv>homIKcE(6qWY{WjCyYhdmEDo`WJA853n09%PU(c4IFHL^j9|-mZoAgYi(2 z5>cYv(B61(C5kHscW3{FN`2NKcvinKfjhKm4DEW~(|#B_WA+V}afh zc&IVNw6_xAATQ+^*L2B6G5PtEmD-)aVP~l4uQ05U`ZNLuQWaG`dy=V3>Lc>=E*TJD zIk`kp_k1oov+s30W<2+XSZR`-S|k@_J7Qafv83frJGQGF^g?NOJEtHX4~2Qx4LO1V zlkLLrqU5?hw2mi5Ea~vsep%g|kX~-r<^qrWqx52qU=Ni*)7gBZy5Bfhi`P83SNlR; z`wZw9C!RHLSHG*|R|4-zzU&TE2@P$!v@JC$Q$A`rMo+ERP~m7mDD+ z(;bnheu7O0>up1K7&dp+sU8vRC#JIqFw(g0$d%m0$;k5>KUQMIJ-bw zx4%kw()M|T1UDJ9p^Rgm`;+zA9ON`nf)*BQ}W; z+c=2zZ6;GJ2_Y2tJ)W9vPtuvDorAYgbsp!d7)+?mv2ue-EarJ8LWz*!R1KmRvmKd` zPqCIAqMt1Odkha0Tw;Uyk)*Q@#e&s05<=l&HI^U(MR{p{cHoOJNR8KHZ5WwpR7Np+p{0-FKaY{4$8`# zm7+E@qaC0z2xAdQlA=LrL-ich29!$}%+ZrdkZ4Ol$x)Ip&5S`=)+_xdF`5p1X9E%5 zmXA>IuQ_S1D;cP$K1RZhZwXbelh4=v`|0zM$RFD(^`oV5#cCju*a6!Nj{q0=+NOO6 zN1o2_72A4$OK)4F^!wWPqlfgzL7U0ZWC9mAj8r7MgI%|w_INx}F_QEhy444jQiEkdlHKciO^44l5Ht%P01$7;c_QT8-&2qO6pY!%%ikP_W737N@lmT zxi*)Cqy!uC3w_3?a9#wH=W*_p=}!snIfn(A!`>vbg6wp=KmTBI#GPY`bBlx=l+Cwk zOf3;O$T;yGjT|TL-N@G`8@&6qTiK0@{)gXsVo{5!;UfT?{nBtm`=evJ9#it z_z)wegsd-T%REjS%;#-IA1cn?NeyH)FuGr)UROGC+n|IU({K&UccyufsWZkmSPyPh7Pdhgz>?T{>QMIN!`17`~sW8!o^9%@ewi+nsUxumgRWygGmHA4}y= z+(z6f)^m?Vx{0@6Q+;*adBSC-k$(3Jv~x62=~p7nmzae;XF>4_L5}%f^81Azqxifa z8fL$h5V5D<^k;MD=siC|jj~)qHijkLuky2-)bV(Y*(Le+6F5wZaa?%6Q0&lb`CO*2 zvkf*Gdq@|XM0YJ8R&rmnnsis&(SE;cN`$YpB>RS7cb7}Ng};PI<%=Kg;F6AM-XiRF zN=WnXT@hRewi3Rp67;{BX)IT>3$v4s(cCR{T#{nG&xlm&Q%qw#SOT)brKZa+JC$Rv z@G^a93Dl||ak4ej+va6vtLvVRXYN$itwz||*g5a^vJMVGUFKV$)>!Vhv)QS42_Vqz z!w!@WMZEf0SRgNCEz9T{^*tt2eKvVlb2omcm4BiTd}M~n#j*?PWJ`b8-;kky<# zFmibve@ctb24loE1z?;BB-HEiT+n za~OJK+g$K>CEt2B-w&QC$YOJ12eeCBAIX2Qu$_;suW&4UHVJ$kVCb zTyGbukzP7m3ol?T6E&2IycIcmGjbbh0%91mc06t1M$W8wb9|jo^SNEKyF{>F_J}`p z!Zr?>9wuIOC%uZfGqb$C&4IT`)+LeSeLQwu=6zTpBJZZA=9_oZ*-Yzk>)1#Nb@=Kl zvLsK#8ZNj{ZL!(8V-BXR6l`|N!`2PYsY19>2sV~xpS4zrK4E=4rav@&AH`(K?_{gl zBJP_`lke;exPgulUI*?sS{3c;h$7CsuKS8fKRyv>SEsom?k^ZVt#=-eoSNO1^V8Ox zt1H{`k+pRXk5^_KZt}Bre7{^=WY<+r^2K%&FE`^w>;t_+&D-7`_aB#2S%1zogx&Oj zX2sTiuEh3dW%`EXbGk~!+<;7h;IYhE)|{cp8$Zq*=S+s6dw{T}?>C2ukCm}H>CK-D z=d&kic0MUPP9UhwB4Nj;BzUpEt7mn@*1UmTS9z%kyd0=i}CW&+FFR z`u7mxb+8`eaXo4#?`B1b1ec0U^OLD+KhijGuUY;&VG%QA<1Ov2~T2r+H>*x?AO|Nd|cwE8(??E>BOY^Ev-3gL2Vuz7 zCvi%h@iXqRLi-(Z`Y5@Wjkx;N#ChsCp9d=9+gl1xtmDoL6K6t(=Q_m< zHsNhnw{XJfJH0N?ZZ z=t2NCW4t$7WnHL&K4kHtKzD#XYVb-bsT{6BxOPOU@>o?VeOcuafvgKb=;Ixcto@`G ze<8LvW84bUf3^eGJ7sZQ0jshOKM|o`FYq$}&qDPV{3v>&X@#vWzpN(=Ik&Mn?O`y8 zU7%Y&Par&Uhza0FUoR&JSDfa5<8I!dgTVJdo-=qG3RU-I#ac%(bZL3dRZ4|60z(g6 zHu@B#Pp@LET{(0oC7n0hE-Rq8gyGxzeqSMgIp7EWZ6no-TSXlc0--1So}afY$ZwZ8 zL|oG;iJJS9#VN_mWi#;HjlA`P9N6)_LkadFCKv?X4g>8*iuw@ed_A)q+tmPbu2K}S zum`>2v%Oslj#{Dz1c5&IdgkD5z~Z_R&44*9Jg?0tY@3r##*=qual}~$yfX?jXuE_A2PGV=f}yZ{&bV!0ysxI+WL%r_9rZ3Xq#VbcF|iGt}xH^F)}*@x^x&?4CH+B!qt z)NwUctB2y<3=a;)_%tV0DZ0@xJ9r=`9x#uEKXx5nv2uv8qVezuXi9XUZo^ff&kqHOnjF|8ud@;)%f4pLB=Cey`(pe(6inM?i z_h;f5e~60ie%YPpuakUt{oMq6@2~tg8~4fbXNpg1u3msJLGzN?NjJH+pr~ikD)^to zjsI3p=RYPz{h#E$*tw+tPb61T6qEdqlY&z4;>WfKKIGUwM?#e67QX|ywNPOI0zy$j zH%C0Yq9kk}Vrk--S2ouEHPv@bau~)r-@b42y?F#wR5e+;d&-66LFVUra3_3osbSR& z)UC7*@1!3wx?O`4HcCju@nl^XtQpSsF=IwYSa7G#V4%xA@}jb{T`k=W@hhe+RW-;+ zuU8IGAg(RIfFL2ti4+Z5rN}rE=n2~@wf`jakKh!2YR6%-*FMGxn=0)0y+0NS6k3G@ z3m+bNl0!gQXcnp3WpG?w0JtdiO`b9hhFF9E&}dLu5+*7%;hjD4-$O|~a$1a8Acs8AB87i}u6#yAt^%+lag0Z#cvZ$Y>&nHW4Q1Fb0wL^3-rM2K;sGZeM1XogLO><}JF z-()+a$-GXpNjiuQ{b^V5QQBQKN2gurpk;?2=x&_sS32-jL3u=W*eGiMuvV9>m z$OcK!zqlJ;O-ZWP>{rEeCU0{8Tan8j*q^k3Q7O`iEC&Dan|@D5y~6*7{atYdX#iqQ zbp;x;&V8~J-Z75b=VIDuMJ7#|Bogxt)@C#=q%7=KErl0m0kI(8%^H$c9SJggq8C6;6LD)OT7SC z0h+0RNYc@lgC9iDB1i=biI?ReB_cR8c%I2&cf8OiqK=}r8inG@k@^ilrA5Hx@vpp? zJ_qblQjeoCYvSOBF;m#Y22f(nvl%xF+*!Jr-O_tQpshN=}NNYVyC(qMX&Y}g~cfCq;#v*Dmrh!}l~bvW|x zX?P zBa~Pjdpd+#ay|z#OjM0{M|($kog;dzzuV^@ISKAK%D?ZBQ(tMMCAG>L(6eUr`|gvpHU#F%2U z7wFt@0!uR`Be>JUQY1#jUu6;bG!>N@GTypG$#GGrx2m1_tB(^pnXsBBXL!uy$IsYj zx~~XYZW7QIGC7nfjo`SCBES;Pu@)1VFVA-yEMmgTx#JXt$Ur>X=>tJ?rLoD|QyLS6 zOKDbVSq2l5`u8?p=vL<`gm$mg-gDc*M|ctul1z{-(;k2ARe8JUPs;~X~Pr`q3AzrVCCeyLhA7tb0bN`IHK_= zs4$P{(a9|$+H#`E`4Q}sf=P=^r7K`tg-SjUJY-qL(~vp@?nlH_LjidY^YyH*LVcE5 zp-AKl4I2E)i67B9X2h~Eo2*L4rY;(A$wmX{8ry76yW~GN{zCCbQ$wDsac!YZ>efTP zX)5D1%Wv@}po{Qjrd3YS4yW-QD;b{2ri*hriXP?U+*c+MLhggmy$vgeAXD0^ekq$t zdE|Iylz`dFC^Y7;-70B6jBx!kzBTCbk_vl`75|kAM?NRxra5z>@Im6lzLmcb0u}pf zn7o;>4@%tJ?0fezR>I`07*M@iUxj!;LB%=d=Q9S5JYZQ{1DQhV(;~15nKE~F+Wl|# z$qMGXbubUq5{{H$BVHyI*2A_mo;y+xvDz>hS`a#mq9Y8wZ2*QbGl7 zUZwwEDS}i@YX|p)tt5zf=f>2}is(kKb>;H)G>8y0>EYsk&GJF`vk`I&g${RHYM{M& zmZ0bmWKAMRX8XCG`28Db7OIWCN0dXc$`&?mVf9CpgPHXFlQ20E8^i~W01v@_MRpOQ zP-?ub9Dw7n-e)0RFbyZ4mtRP7H=gR9 zw()tsxlhG$iDs=mA-+U!rB8U-@XyW|Y5snri}+dA|35rnvi}Gx(m$oa%nyvqIHl3> ze+w)BEe(ETl~W1}!JqhoCHu^)%BIV0I^y^{rPPv#x>l#Q@3|IM?N}3%bR0&!no>sL+V z4h;_;sjh6m8Z;l|uz&ijuK7AlK<8q##((*D$?RV4t6p2~s9uYd;Tfh!^OCnd4SuEP zETuEbqa$2(9a)eR`q!=kjz{lFYL6nVoge85T)r_*t3x5S?$m9 z38UHF&xcgk3zT zDPMqWFU#G}__1MTDQ`wS=H)IWVzrFCvBOs$KypfGfS8ywZBVH}4ZqevSJyGPKCyK7 z<$C;rSsH0icAihN+b+DBmnet$Y&6QKt-nHpSd9R_I*=Mzh`S=#)kdCtrv6}T+tw`gWY1B(E)O~(#{0I><_bA=W|M&#R7ygAfmu^d7-;*V)}i4} zik$mj0htqK?CGWOLX^LVdF)OGsE4vLJ;mLPpmujOH%HK1nWtuBs{by&ANJ!GtL*PK z>h#6?7wC8eLynQwue_@DFT8q}`U%0jPPQzl+W-2O&iUzo-FojWz3L4XTSw^RA`x@y z zgT>|V+D3CU+h&UsDf4M&u+lu)jOWa5jO`X1nBy})Jn9Zi&tLAx2c1dS;ur%s%Oe#zz3Wv2wvKkv-6i73!zwRI2xT!q~|yX&w_mX^6~Jb4d_tMa5JY-qRr7Qu;4MJ zLBJhV7m!fwJam>Hj5(#V5TwqF8KNum0}V9Y4_ch+AU;JD1Qh1;s8IF*e3NskdgJ8B zLqr^*Nr2C&(CwQ%CQP8tXjB;-_Gtv{)+x`sVc?Bb75iCi7m|U@0Q%SlpEv^u!N961 zq#sxUGC}r$FwHfWe0f9CJ#J!w_eZEoQ@8=UA?OtLMLZKvwKq8l6~>kQJaGa z^Ke&u+!WgRBARV-PjaJvQjMWT@l4%8PaMsXd*vJ9DBlf6_@-}2QNlXHbWGUdyc&jVlhRSY);Zji`f7u^s6SZXJN_NL{=brFKG1p6RKM?c>2fkp(E#Y9k4i@CWlYB!4IiCw1K=Mo(H#@m+_t-%J!|`5I+0bwi*kHj9XvQdF`_K{L{6|yPgk*ALbk^;p>jy;A=oRD>joT*hhQW8tYM+ACq(OO1D#Y&P%h zjZ+=>bJ87|G{X31H5H^+&Y4cYood*#Oav5*5e6zo?lQ*!QmO(YBo;B9jal`&3_C!{ zj@p(JDl^GVY?3QNV-IvQ}E?%hG|6pGA%%|^5yAnZIsmIxT1jv~oMFxS13 zl(i`}%521Y^PY%4AdvWN{9evrt5X}yKIWcPNhd5@{ zpEq`lc7QYsp`opX{#O|)w#8KA7MSQ~%7OX&#ILgoE<|A|wuxWpgt5XfFhp3t|6PtO z;~`1eRRJYyD=q*$fR#1y+_RP|wO`fx;>fcB-z^V{)8TvR>I|l10v)A(u^Me_JbMT% zu!YWuF5fLH(G91bDB&$MO=r{r3S(dBKb5TpM&rfsKiffSchNbhwIbelsRzf~(*w;j zj3VvZEmtnRqdAt*m{QP>mxk8zP&|Ic&VdGDC%i4+uH_4q*r zzXTs$seaGotqnRHTlX&Sg$Gv@vZm71jK;g?ack>BDNcz06srx)A0pH*%MHiNs(*tr zM5JMX{ch`tmNt|Q7%*^e`%cNwYD1i{_jr61JIF{K}Iqz zLjV9|ZM|jy00?|@+u5fZ&iKLT2kSD@w+2WAkg`*qS@9VoQ~*p1BwcxOVE-WWV`goT z3wL^M`~TZ)2tWx5B;9Shy4!nQvRQ1h%Xph)vfdu@ccSe6`|V?Gw(8|ql zObPAXyu&1OWk#MOmz*H{$1oK3?_zO|i;n@*&k1}y66DL_;oSuqb><$v@d3MI>20?z ztn(I~KrA%JQ5eU58$AizP!Ccou1W#@q|7uEo4hl1CQ%OOe2O;Q&>uu9X@u zryV;1#zu(Z%!OO_Sz^#pV$m9OfUutng6+aC7GNZlPJvK*&>-PKu`LSp+f#sy4ts!Q z`L=>&CRhqc18_A{mUyZAfZgJZo++jvWoNODZTlEbHNkLUqZqC?cvY){R~54Z46+tT z7u_Yh?4bD&LxYt{{FN+M1gZ0fDoU!AI{fp5IqQv%X*!7cF^jjEU`t}KII~8150L35 zto}h1OU|IXE^$-Bf|co~TCh;4s3a9qR=ShyQAtp%VOq5-C$<4tg+_?^3-&h~W_H5V z*CWd?%e`z4AKc>oofNs1!s6XT7yW314hw?8XkmZa_A?WfWwyEuz(iXcWtR zz~ci7?>D9WW+Y>PbOuB1ZJ-l=E%2nXu7X`c{->>W%ZxA3K2(wkQzh>3jFr|)Zai^L z8hL9^JMn-d((Zi({X2D*X9E_xSp65qQ>5Nn{@u4D#}+}C^Z|hgW@JROz%s5sTtvLH zj}qw`co+C$n%~uYngn8-(zsl6Bb4YcOMKa^{5ZpO15MtQDp5!UV`B{y(~lZ3%i|*g z5+rW!hW`%?&DneV(XFkAZX7NR>2r8y$BvKt{U2*`Jb%o&EwIqg=#4Mx77%d%=auJD zBd)E`O|f>%ZM*2S)6yh*Q8;0B$B!r~*L?%?>D$ABw--KkVoSFicB&;It2ibwfANpo?NBlaXg$Iri9wr^U%Gi(}E>;>{ya-ov`4FbrfJRcf zP}#;W4_o_6`Bs(%cX}qqp*a@k$F>K&E(9BZ)rkg}))6#M0qKu%{{ViNr zbRm<`E^nu~=sNrg9dw9nes%T`G+aXNydVsgnY?zu>DjfggdajaXnE~{n9+wq4eNud z0JQI}t%US~+P>x#N8=JQwB{O?nlWOW2&z0M*wL(vHT0LlJZNP?g#ncq(TdKpAt;3e zsMbseTg*am*W*e*3vrb@u}?7*DdGdX`ZbJoh^3GQ04laCa&vR)p4>Q{9UuKZgM8k2 zwH^~mSsd?hUMIrweZh9^Hpqt;>+TM+_;sJeIoGi=L_ptDqv#NXB1DaG&klKAT)Cp^ zA;6O)NwGBensrLAwC@u^MgF5lm^>vT8Ws|}q*??sJ~ysEbajavQ{?WEd|knMp6m}V zTjbImXTUpK-GSxzzD-YdEB)ule@BSrYDxaHWl%PLfUSvCHJZ#_kLlk6+m|3!M$ z`RJ#ZtYz;pUsOvePQE$?7f0ly^7_l`AU-Kdr_7$J3>u`*={1!GlRa=}03^79G}L2> zRJn3egsO2%$LGPsf4w^Y$!e7Ohk5R%C78bzNwiiyN__v30~c8WB&ei*N(xbKzDMjJoy z!fC?)rU+qrs+`}H^6HRZ?Il^kAJSPGG&@=*ACi(!rDMh8TDq!JNLF`!Unxl@73`a{4B-qe=)-WaowVuy{Vwg( zdjdcxEQEMFv%P)W3NuAN8g=Oc_wyV^=@v3<$}=I55dXetmuc*CGzMjGKedgC!fC;n?7E z7+1%Gt`u@|3Fr~I*MqJWp{6)w+tM#~0hWkfc)UkHB%v(;9+Rj25*;nW#g7FTCKikx zOgKE(J1bp22`m~#Ep|redPS(346dq`twEY7`!-l zNp{H`J7+CFv7^2F9-`$T$eaC*&m{mo)BB7IBLn;bcgz!+=8GgFBE63jDQJ|lCo5ew zQ=wj;X8Ik?s9F+20Zh!6@p^q)IJ^-9XJFaSVuS-eRJgLDrJjH}oOtub>?#8dQQ*9U|z8&EECOgQF3_&>rJUc8aD1PSe57&z}H`joklSP+dGs!U4zFJ~~ z4=oPaxGY~2l2}ao!zD_WuSQu-5)s{+AbUkddwHmF=jNi z;2vBBd38Sz@hxdouss-9=4DE1SJ6T{Et`XOW_l69j>&$_*Q=w9(zSG}*zD-X&ZFnx za5Ub-=`8&G5m5SW<@DY^N$ht1)l|R3N%-;LDxDP4te@F(U*48~1b!b){JxWQCpEb$ za?h}>V{w+jThY^T*@akD`jwQfp}Tw{!{t(+6;4>Nc$1-|UbR%y;>&?aC3w`QTP_uT lL1&zmD8HgdPW6H2V5FI?S*|8Oj)RW<6Wwi=6bNAI003P_ZFT?v literal 0 HcmV?d00001 diff --git a/sources/new-s5r4/tcpip.c b/sources/new-s5r4/tcpip.c new file mode 100644 index 0000000..0078e45 --- /dev/null +++ b/sources/new-s5r4/tcpip.c @@ -0,0 +1,290 @@ + /* Loglan82 Compiler&Interpreter + Copyright (C) 1981-1993 Institute of Informatics, University of Warsaw + Copyright (C) 1993, 1994 LITA, Pau + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + contacts: Andrzej.Salwicki@univ-pau.fr + +or Andrzej Salwicki + LITA Departement d'Informatique + Universite de Pau + Avenue de l'Universite + 64000 Pau FRANCE + tel. ++33 59923154 fax. ++33 59841696 + +======================================================================= +*/ + +#include "depend.h" +#include "genint.h" +#include "int.h" +#include "process.h" + +#include "sock.h" +#include "tcpip.h" + +#include + + +static int sock; + +static int slaves=0; +static struct addr { + int console; + struct sockaddr_in addr; +} *phone_book; + + +#define MAX_NODES 256 +static int node2book[ MAX_NODES ]; /* only 256 nodes - can be changed */ + + +static void sock_recv_from( void *, int, struct sockaddr_in * ); +static void sock_recv_from( buf, buflen, from_addr ) + int buflen; + void *buf; + struct sockaddr_in *from_addr; +{ + struct sockaddr_in addr; + int retval; + for(;;){ + if( ( retval = sock_recv( sock, buf, buflen, &addr ) ) < 0 ) + perror("receive"),abend("no answer from master"); + if( + from_addr->sin_port != addr.sin_port + || + from_addr->sin_addr.s_addr != addr.sin_addr.s_addr + || + buflen != retval + ) + fprintf( stderr, "unexpected message from %s:%d length %d\n", + inet_ntoa( from_addr->sin_addr ), + (int)ntohs( from_addr->sin_port ), + retval + ); + else + break; + } +} + + /* nn.nn.nn.nn:port address */ +void tcpip_connect_to_master( addr ) char *addr; { + + char *host = addr; + int namelen; + int aux; + struct sockaddr_in m_address; + + for( aux = 0; aux < MAX_NODES; aux++ ) + node2book[ aux ] = -1; + + if( host_addr( host, &m_address ) < 0 ){ + perror("invalid host name:"); + usage(); + } + + sock = sock_open( SOCK_DGRAM, "udp", NULL, 0 ); /* any port */ + if( sock < 0 ) perror("can't open any socket"),exit(10); + + { + struct sockaddr_in addr; + int namelen = sizeof(struct sockaddr_in); + getsockname( sock, &addr, &namelen ); + fprintf( stderr, "socket opened on %s:%d\n", + inet_ntoa(addr.sin_addr), + (int)ntohs(addr.sin_port) + ); + } + + aux = htonl( console ); + sock_send( sock, &aux, sizeof(aux), &m_address ); + fprintf( + stderr, "waiting for acknowledge from %s:%d\n", + host, (int)ntohs( m_address.sin_port ) + ); + + sock_recv_from( &aux, sizeof(aux), &m_address ); + slaves = ntohl( aux ); + fprintf( stderr, "answer from master: %d interpreters\n", slaves ); + + phone_book = (struct addr *)calloc( slaves, sizeof( struct addr ) ); + if( phone_book==NULL ) abend("can't allocate table of addresses"); + + sock_recv_from( &aux, sizeof(aux), &m_address ); + phone_book[0].console = ntohl( aux ); + phone_book[0].addr = m_address; + + fprintf( stderr, "master console %d at %s:%d\n", + phone_book[0].console, + inet_ntoa(phone_book[0].addr.sin_addr), + (int)ntohs(phone_book[0].addr.sin_port) + ); + + node2book[ phone_book[ 0 ].console ] = 0; + + { + int i; + for( i=1; i 0 ){ + + if( sock_recv( sock , &slave_console, sizeof(slave_console), &slave_address ) < 0 ) + perror("server receive"),abend("can't connect slave"); + + fprintf( stderr, "slave %d connected at %s:%d\n", + ntohl(slave_console), + inet_ntoa(slave_address.sin_addr), + (int)ntohs(slave_address.sin_port) + ); + + slave_console = ntohl( slave_console ); + + phone_book[_slaves].console = slave_console; + phone_book[_slaves].addr = slave_address; + + if( node2book[ slave_console ] != -1 ){ + fprintf( stderr, "node %d already bound\n", slave_console ); + abend("exiting"); + } + node2book[ slave_console ] = _slaves; + + _slaves--; + + } + + fprintf( stderr, "all slaves notified - sending acknowledges\n" ); + + { + int i,j; + for( i=1; icontrol.receiver.node; + int ix = node2book[ node ]; + if( ix == -1 ){ + fprintf( stderr, "tcpip send message to not existing node %d\n", node ); + abend("exiting"); + } +#ifdef RPCDBG + fprintf( stderr, "tcpip send message to node %d indx %d\n", node, ix ); +#endif + sock_send( + sock, + msg, + sizeof( message ), + &( phone_book[ ix ].addr ) + ); +} + +bool tcpip_poll( ms ) int ms; { + return sock_poll( sock, ms ); +} + +bool tcpip_recv( msg ) message *msg; { + int retval; + struct sockaddr_in addr; + if( ( retval = sock_recv( sock, msg, sizeof( message ), &addr ) ) < 0 ){ + perror("receive"); + return FALSE; + } + + if( retval == sizeof( message ) ) +#ifdef RPCDBG + fprintf(stderr,"tcpip recv message from node %d\n",msg->control.sender.node); + else + fprintf(stderr,"tcpip recv incorrect message from node %d\n",msg->control.sender.node); +#endif + return ( retval == sizeof( message ) ); +} + + + diff --git a/sources/new-s5r4/tcpip.h b/sources/new-s5r4/tcpip.h new file mode 100644 index 0000000..2e4be6e --- /dev/null +++ b/sources/new-s5r4/tcpip.h @@ -0,0 +1,52 @@ + /* Loglan82 Compiler&Interpreter + Copyright (C) 1981-1993 Institute of Informatics, University of Warsaw + Copyright (C) 1993, 1994 LITA, Pau + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + contacts: Andrzej.Salwicki@univ-pau.fr + +or Andrzej Salwicki + LITA Departement d'Informatique + Universite de Pau + Avenue de l'Universite + 64000 Pau FRANCE + tel. ++33 59923154 fax. ++33 59841696 + +======================================================================= +*/ + +#ifndef __TCPIP_H__ +#define __TCPIP_H__ + +#ifndef NO_PROTOTYPES +void tcpip_connect_to_master( char * ); /* nn.nn.nn.nn:port address */ +void tcpip_wait_for_slaves( int ); /* slaves number */ +void tcpip_send( message * ); +bool tcpip_poll( int miliseconds ); /* < 0 -> blocks indefinitely */ +bool tcpip_recv( message * ); +#else +void tcpip_connect_to_master(); +void tcpip_wait_for_slaves(); +void tcpip_send(); +bool tcpip_poll(); +void tcpip_recv(); +#endif + +#define PORT 3600 + +#endif + + diff --git a/sources/new-s5r4/typchk.c b/sources/new-s5r4/typchk.c new file mode 100644 index 0000000..fac9ff8 --- /dev/null +++ b/sources/new-s5r4/typchk.c @@ -0,0 +1,383 @@ + /* Loglan82 Compiler&Interpreter + Copyright (C) 1981-1993 Institute of Informatics, University of Warsaw + Copyright (C) 1993, 1994 LITA, Pau + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + contacts: Andrzej.Salwicki@univ-pau.fr + +or Andrzej Salwicki + LITA Departement d'Informatique + Universite de Pau + Avenue de l'Universite + 64000 Pau FRANCE + tel. ++33 59923154 fax. ++33 59841696 + +======================================================================= +*/ + +#include "depend.h" +#include "genint.h" +#include "int.h" +#include "process.h" +#include "intproto.h" + +/* Type checking routines */ + + +/* Determine if prot occurs in the prefix sequence of object am + */ + +#ifndef NO_PROTOTYPES +static bool pref(word,word); +static bool typep0(word,word,bool,word *,word *); +static bool prefh(word,word); +static bool typef(word,word,word,word); +#else +static bool pref(); +static bool typep0(); +static bool prefh(); +static bool typef(); +#endif + + +static bool pref(am, prot) +word am, prot; +{ + word t1, t2; + protdescr *ptr; + + t1 = M[ am+PROTNUM ]; + if (t1 != AINT && t1 != AVIRT && t1 != AREAL && t1 != FILEOBJECT) + { /* neither array nor file */ + ptr = prototype[ t1 ]; + t1 = ptr->preflist; + t2 = t1+ptr->lthpreflist; + while (t1 < t2) + { + if (prot == M[ t1 ]) return (TRUE); + t1++; + } + } + return (FALSE); +} /* end pref */ + + +void qua(virt, tp) /* Validate qualification of object */ +virtaddr *virt; +word tp; +{ + if (virt->mark != M[ virt->addr+1 ]) errsignal(RTEREFTN); + if (M[ tp ] != CLASSTYPE) errsignal(RTEINCQA); + if (!pref(M[ virt->addr ], M[ tp+1 ])) errsignal(RTEINCQA); +} /* end qua */ + + +bool inl(virt, tp) /* Determine if A in B */ +virtaddr *virt; +word tp; +{ + if (virt->mark != M[ virt->addr+1 ]) + return (TRUE); /* none is in everything */ + else + if (M[ tp ] != CLASSTYPE) return (FALSE); + else return (pref(M[ virt->addr ], M[ tp+1 ])); +} /* end inl */ + + +bool is(virt, tp) /* Determine if A is B */ +virtaddr *virt; +word tp; +{ + if (virt->mark != M[ virt->addr+1 ] || M[ tp ] != CLASSTYPE) + return (FALSE); + else return (M[ M[ virt->addr ]+PROTNUM ] == M[ tp+1 ]); +} /* end is */ + + +/* Check correctness of an especially clumsy assignment statement + */ + +void typref(virt, tp) +virtaddr *virt; +word tp; +{ + word t1, t2, t3; + int knd; + + if (virt->mark == M[ virt->addr+1 ]) /* none always allowed */ + { + t3 = M[ virt->addr ]; /* am of right hand side */ + t1 = M[ t3+PROTNUM ]; + if (t1 == AINT || t1 == AREAL || t1 == AVIRT) errsignal(RTEINCAS); + t2 = M[ tp ]; /* right hand side type */ + if (t2 == FILETYPE) + { + if (t1 != FILEOBJECT) errsignal(RTEINCAS); + } + else + if (t2 == PURECOROUTINE || t2 == PUREPROCESS) + { + if (t2 == PURECOROUTINE) knd = COROUTINE; + else knd = PROCESS; + if (prototype[ t1 ]->kind != knd) errsignal(RTEINCAS); + } + else + { + if (t2 != CLASSTYPE) errsignal(RTEINCAS); + if (!pref(t3, M[ tp+1 ])) errsignal(RTEINCAS); + } + } +} /* end typref */ + + +/* Check correctness of a dynamic assignment + */ + +void typed(ldim, lt, rdim, rt, virt) +word ldim, lt, rdim, rt; +virtaddr *virt; +{ + if (ldim != rdim) errsignal(RTEINCAS); + if (ldim == 0) typref(virt, lt); + else + if (lt != rt) errsignal(RTEINCAS); +} /* end typed */ + + +/* Search the SL chain of object am to find the nearest Y such that Y in A. + * prot = prototype number of A + */ + +word loadt(am, prot) +word am, prot; +{ + word t1, t2, t3, t4; + + while( !pref(am, prot) ) + { + t1 = am+M[ am ]+SL; + t2 = M[ t1 ]; /* try next object in chain */ + t3 = M[ t1+1 ]; + t4 = M[ t2+1 ]; + if( t3 != t4 ) errsignal( RTEFTPMS ); + am = M[ t2 ]; + } + return (am); +} + + +/* Compute type of a formal parameter - see also typep (below). */ + +static bool typep0(am, pdaddr, protp, dim, tp) +word am, pdaddr; +bool protp; +word *dim, *tp; +{ + word t1; + protdescr *ptr; + + if (protp) /* prototype number on input */ + { + ptr = prototype[ pdaddr ]; + *dim = ptr->nrarray; + *tp = ptr->finaltype; + } + else /* type address on input */ + { + *dim = M[ pdaddr+1 ]; + *tp = M[ pdaddr+2 ]; + } + if (M[ *tp ] != FORMTYPE) return (TRUE); + else + { + t1 = M[ *tp+1 ]; /* SL prototype number */ + if (t1 == DUMMY) return (FALSE); + else /* undefined */ + { + *tp = loadt(am, t1)+M[ *tp+2 ]; + *dim += M[ *tp ]; /* accumulate dim */ + *tp = M[ *tp+1 ]; + return (TRUE); /* AIL 1989.02.02 */ + } + } +} /* end typep0 */ + + +void typep(am, nr, dim, tp) /* Compute type of formal parameter */ +word am, nr; +word *dim, *tp; +{ + if (!typep0(am, M[ prototype[ M[ am+PROTNUM ] ]->pfdescr+nr ], + FALSE, dim, tp)) errsignal(RTESYSER); +} /* end typep */ + + +/* Auxiliary function for heads, almost the same as pref. + */ + +static bool prefh(tp, prot) +word tp, prot; +{ + word t1, t2; + protdescr *ptr; + + ptr = prototype[ M[ tp+1 ] ]; + t2 = ptr->preflist; + t1 = t2+ptr->lthpreflist-1; + do + { + if (M[ t1 ] == prot) return (TRUE); + else t1--; + } while (t1 >= t2); + return (FALSE); +} /* end prefh */ + + +/* Check compatibility of generalized types, used by heads only. + */ + +static bool typef(dima, ta, dimb, tb) +word dima, ta, dimb, tb; +{ + word t1, t2; + int knd; + + if (dima != dimb) errsignal(RTEINCHS); /* incompatible headers */ + if (ta != tb) /* types different somehow */ + { + if (dima != 0) errsignal(RTEINCHS); /* dim must be 0 now */ + t1 = M[ ta ]; + t2 = M[ tb ]; + if (t1 == PRIMITIVETYPE || t1 == FILETYPE) errsignal(RTEINCHS); + if (t2 == PRIMITIVETYPE || t2 == FILETYPE) errsignal(RTEINCHS); + if (t1 != PURECOROUTINE && t1 != PUREPROCESS) + { + if (t2 == PURECOROUTINE || t2 == PUREPROCESS) return (TRUE); + else + { + if (!prefh(ta, M[ tb+1 ])) + { + if (!prefh(tb, M[ ta+1 ])) errsignal(RTEINCHS); + else return (TRUE); + } + } + } + else /* something pure */ + { + if (t1 != t2) + { + /* AIL : t1 below replaced with t2, 1989.02.02 */ + /* if (t1 == PURECOROUTINE || t1 == PUREPROCESS) */ + if (t2 == PURECOROUTINE || t2 == PUREPROCESS) + knd = RECORD; /* used as junk */ + else knd = prototype[ M[ tb+1 ] ]->kind; + + if ((t1 == PURECOROUTINE && knd != COROUTINE) || + (t1 == PUREPROCESS && knd != PROCESS)) + { + if ((t1 != PURECOROUTINE) || + (knd != PROCESS && t2 != PUREPROCESS)) + return (TRUE); + } + } + } + } + return (FALSE); +} /* end typef */ + + +/* Verify the compatibility of formal/actual procedure (function) heads. + */ + +void heads(virt, nr) +virtaddr *virt; +word nr; +{ + word i, j, fp, gp, oba, g, slen, dim, t1, t2, tp, ftv; + protdescr *ptr; + bool junk; + word x[ MAXHDLEN+1 ], y[ MAXHDLEN+1 ]; + /* The two arrays declared above may be dynamically generated as objects */ + /* upon entry to heads. In fact heads was implemented this way in the */ + /* original LOGLAN running system on MERA-400 */ + + oba = M[ virt->addr ]; + ptr = prototype[ M[ oba+PROTNUM ] ]; + fp = M[ ptr->pfdescr+nr ]; /* parameter description pointer */ + slen = M[ fp+2 ]; /* length of its desclist */ + if (slen > MAXHDLEN) errsignal(RTEFHTLG); + ftv = oba+M[ ptr->parlist+nr ]; /* type value pointer */ + g = M[ ftv ]; + if (M[ ftv+1 ] == M[ g+1 ]) /* not none */ + g = M[ g ]; /* am of SL */ + else errsignal(RTESLCOF); /* SL chain cut off */ + gp = M[ ftv+2 ]; /* prototype number of g */ + ptr = prototype[ gp ]; + t2 = M[ fp ]; /* t2 = F-kind */ + if (ptr->kind == FUNCTION) + { + if (t2 != FORMFUNC) errsignal(RTEINCHS); + junk = typep0(g, gp, TRUE, &dim, &tp); + junk = typep0(oba, fp+2, FALSE, &t1, &t2); + if (typef(dim, tp, t1, t2)) errsignal(RTEINCHS); + } + else + if (t2 != FORMPROC) errsignal(RTEINCHS); + if (slen != ptr->lthparlist) /* incompatible lengths */ + errsignal(RTEINCHS); + t1 = M[ fp+1 ]-1; /* oba descriptlist */ + t2 = ptr->pfdescr-1; /* g descriptlist */ + for (i = 1; i <= slen; i++ ) /* verify second order lists */ + { + x[ i ] = DUMMY; /* mark entry as empty */ + y[ i ] = DUMMY; + fp = M[ t1+i ]; /* first type pointer */ + gp = M[ t2+i ]; /* second type pointer */ + tp = M[ fp ]; /* first type ordinal */ + if (tp != M[ gp ]) errsignal(RTEINCHS); + if (tp == FORMTYPE) + { + x[ i ] = fp; /* save pointers to formal types */ + y[ i ] = gp; + } + else + { + if (tp == PARIN || tp == PAROUT || tp == PARINOUT) + { + /* AIL 1989.02.02 */ + /* if (typep0(oba, fp, FALSE, &dim, &tp)) */ + if (! typep0(oba, fp, FALSE, &dim, &tp)) + { /* undefined yet */ + /* search preceding formals */ + for (j = 1; j <= i; j++ ) + if (x[ j ] == M[ fp+2 ]) + break; + if (j > i) errsignal(RTEINCHS); + if (y[ j ] != M[ gp+2 ]) errsignal(RTEINCHS); + } + else /* already defined */ + { + for (j = 1; j <= i; j++ ) + if (y [ j ] == M[ gp+2 ]) + errsignal(RTEINCHS); + junk = typep0(g, gp, FALSE, &j, &ftv); + junk = typef(dim, tp, j, ftv); + } + } + } + } +} + diff --git a/sources/new-s5r4/typchk.o b/sources/new-s5r4/typchk.o new file mode 100644 index 0000000000000000000000000000000000000000..d6775ad6dff096deb94887a0d4dba4ca616855b7 GIT binary patch literal 5196 zcma)AZ){sv6@Q7{)^Y9lC3V}hWRz(^6qS{=ln)*i%CbH&x}`OZj8;l!q9kh?N)p=l zM5irTCnuAh?kr`jpdnOX+JuBaXh>+9gfwLtBBk_$D@7<(|BMesde+MaZ*`erZq4u9 zd;Ie3#9A!HzkAL-_uO;NJ?Gr(Y--Z98!^rMT;WlvSq)P5zcb5`K4FCH`E2lK#I)xF zTM4s0L3>^_+eSGvS+2yUUjh%K`{wibzGqtazH5#Pqb%YxByXpR!YGR57wlA-2L0v0 z(_MCd2@(mT^x_8h@!8o~5Z*>YZXVi^LV=EcGPJ4ID=;VI|^`5J8 zkQcSA2HtcaZbP)deWrH3Uw*y5UAjkMLBiNMH&&}|w%)<@`Dg9++oAG;PQlXMy|o*_ zj~DzLcg#;weyw#L-T~RUzy>;_Y%*x)L@Hum&Bn9Du&)N9a^gEd`>N0qO|c7ev3GLt zFj}+08vbRL^>w6NZ05^I@CN3|%JH(W?i{!P&A2SPR#}1}S660@wm6CMsx0No3Zi&R znaNVS)gg;D4C&2EI{!;}3l*4cHN*IhnnAZm(N=iDC{TZJL$eqKFj}c{(bJtU3Mh{j zXYNzEvD@d15HwNkv^a07N&mUl`GwjkCY|S{T(wYIoFA%n)i|sCNf^3RdPGfTCPSLF z6{?}4Bk7z|wdQVx9bhJmxDnRtaA929ddiCOC?I7MrG4x z>vH8<^C6TK&)40eo2Th2Nz9^`q&+PQBo|C(C2x<8iH z!QbH~HYZXYqPIiru&-r1RV%p0t>Adbz9#lH{mn+45Sn<=8+VLu|>?r3=D zgzb>J-n8s+;lwk(Ly`F%he>*Jl)6KswBTbBJ%<9T?kf>&RzB^Lg%IaUC+_Sj$pZCl zNB0fx`_JCUcbOwGipYjQvMYPI(kSHYxu+l}} z6g%rt@B>!R-7o1@YbViW7wv4dx}7W198Y(L$67}|y|jEDCestx*IC|xfAo^GQ_I3w zZWL6nd0r956_Gp?z>A{(EvPDK4GpMudR^bnOy1r-6&}@{i6W;mRCTOY)xR9*)b0M9 zFmj$YUphN}z87jdc`u2S)A*fZJs=EcO?~p^Gpae)?yy-a+j{DI*olHL3jSae*V4Fz zAZ5;VZ;Z{nEVE~6ldRI`l>V%-n9LggN{%)`7joN4I!FIYJENc3#-*&Wgy|cyOBOS8 z)bW;+&ci+l0SN&K0Yw6eoSb|B=+qA7M!MR_{hXH_lut_`IeF(}FZik3iDai_-l{TJ z{8@3GejV+6((b=OXaDpejFuLRGG)IklG~G8@?+>mzRfVi)WY;k7p`skDC#^)SW!0u zYdnpHAq>A6XU;EZh9h2^ajoB0F6vtX1|lu8MsJQ;PL^zDF` z4%xE$Sx)Z<6}Uu`)#7gFH5H@ezEiuNlv4M9@FPA^Xe>0;NNy&YWKaqPxgbxyt*Wxt z);9NOb%Iga`&ruY3oz>ZRB0!JeRp2g$RVvuGOao5kIVZ*Wj$&dK`h~qbGj_AbmTNj z0>6#(ucD#*O%fMhfJ5rm+zvnRc#nJw7z9o+?J#}{+^A_$9j8HZ4*-ci!1PhZ5$34#xF*?$mUG=H3N0tk`F zt4#lq@jByP{M4iQBa9=AFEjocNc#TFbPxoVMji*!xlq&d68{9#7UL^G(*Ikg-)FqeSY&LAD18qBN&Zo$j{r&UAk!J1UuJB-}Ldn&3t+)9O3Z~kk`j}+zkW1$K&5%^8p?gFdo5}>?uI;1oO`$Cw@}p zV@$P4GH>JTXIMr<++V@? z^s)_|5CK6B>msgq*^r?vE{G5R{Ir7 + +/* Utility routines */ + + +word entier(x) /* Compute entier (floor) */ +double x; +{ + word i; + + if (x >= 0.0) + { + i = (word)x; + return(i); + } + else + { + i = (word)(-x); + i = -i; + if ((double)i <= x) return(i); else return(i-1); + } +} /* end entier */ + + +word shift(x, n) /* shift x by n bits */ +word x, n; +{ + if (n == 0) return (x); + if (n > 0) return (x << n); + else return ( (x >> -n) & ~(~(word)0 << (8*sizeof(word)+n)) ); +} /* end shift */ + + +char *asciiz(virt) /* Get ASCIIZ string from arrayof char */ +virtaddr *virt; +{ + word am; + int len, i; + char *cp; + + if (member(virt, &am)) + { + len = M[ am ]-3; /* length of the string */ + cp = ballocate(len+1); /* allocate buffer for the string */ + if (cp == NULL) errsignal(RTEMEMOV); + for (i = 0; i < len; i++) cp[ i ] = (char) M[ am+3+i ]; + cp[ len ] = '\0'; /* terminate string with 0 byte */ + return (cp); + } + else errsignal(RTEREFTN); /* reference to none */ +} /* end asciiz */ + + +void addext(fname, ext) /* Add extension to a file name */ +char *fname, *ext; +{ + char *cp; + + cp = fname; + while (*cp != '\0' && *cp != '.') cp++; + strcpy(cp, ext); +} /* end addext */ + + +void usage() +{ +#if DLINK + fprintf(stderr,"Usage: int [-i] [-d] [-m memsize] [-r console] file\n"); + net_logoff(); +#elif TCPIP + fprintf(stderr,"Usage: int [-i] [-d] [-m memsize]\n"); + fprintf(stderr,"\t[-r console_number #_of_slaves_to_wait_for|master_address]\n"); + fprintf(stderr,"\tfile\n"); + fprintf(stderr,"master address in form: nnn.nnn.nnn.nnn:[port]\n"); + fprintf(stderr," or : host_name:[port]\n"); + fprintf(stderr,"default port number : %d\n",PORT); +#else + fprintf(stderr,"Usage: int [-i] [-d] [-m memsize] file\n"); +#endif + exit(4); +} + + +void abend(msg) /* Print error message and abort */ +char *msg; +{ + fprintf(stderr, "Error: %s\n", msg); +#if DLINK + net_logoff(); +#endif + exit(8); +} /* end abend */ + + +/* Pseudo random number generator */ + +static int ranpat1 = 7, ranpat2 = 503, ranpat3 = 15661; + +void ranset() /* Initialize generator */ +{ + long tim; + + time(&tim); + ranpat1 = tim % 30269; + ranpat2 = tim % 30307; + ranpat3 = tim % 30323; +} /* end ranset */ + + +double prandom() /* Produce next pseudo random number */ +{ + int i; + double r; + + ranpat1 = 171*(ranpat1 % 177)- 2*(ranpat1 / 177); + if (ranpat1 < 0) ranpat1 += 30269; + ranpat2 = 172*(ranpat2 % 176)-35*(ranpat2 / 176); + if (ranpat2 < 0) ranpat2 += 30307; + ranpat3 = 170*(ranpat3 % 178)-63*(ranpat3 / 178); + if (ranpat3 < 0) ranpat3 += 30323; + r = ranpat1/30269.0 + ranpat2/30307.0 + ranpat3/30323.0; + i = (int)r; + return (r-i); +} + + +void moveblock(from, to, len) /* Copy a block of memory */ +char *from, *to; +word len; +{ + while (len-- > 0) *to++ = *from++; +} /* end moveblock */ + + +/************************************************************** + +#define LINE 10 +void dump(pix, from, len) +word pix, from; +int len; +{ + int i; + memory M; + + M = process[ pix ].M; + while (len > 0) + { + printf("%6ld: ", (long) from); + for (i = 0; i < LINE; i++) printf("%7ld", (long)M[from++]); + putchar('\n'); + len -= LINE; + } +} + + **************************************************************/ + diff --git a/sources/new-s5r4/util.o b/sources/new-s5r4/util.o new file mode 100644 index 0000000000000000000000000000000000000000..4d7dcbd334678167a2434d709deb0eed023d064a GIT binary patch literal 2887 zcmb7GZ)jUp6n|-wHI&z_&XwsLE>jA|(lO^i9aakN;U;8ONA_jJ*rsWlu4zk>&N-=8 zvcm2j(ZCQz6#ss3F#NQ^>JXZ4XwCMaq2QWz>ALO-ZzM=2(WW+A{hj-6+GG^LN67D- z^Uj~&IrqMIU$se+Zd6N>EE$&_I$bRSUF`QrR!%Fn)E~2{n{&gOa{uaZu_g2znT86g zQaC3wC7%l9XWYe90ES}b-Pr1t>06aaqOiHO0vFuH8Kro`Z7VDC1Z8WgNRWBFLXD}e z;;U>jV=Gx%)_tiY6B7R+SsJWX6(IOj< zT0W+stM&YUYgOdZJ?1X-m@wX!R^7Hvk|;*WMTTbjewtUYQ3+S5t;@H^?(YlR4>$SU`0Jp*fIZ*~g#5>SZhNP{*Hgy$0zRN~P)&CLFU_b5572F|7Sg< z_~JH4LNHpbznj;0{1%n}A|j5vD^w}@v|ywmdDNFX{3hQG5h6g&V!xAFb11s%(&O`H%BN^1sDg)f(cqyiWLOfVOjnS5u^JLB z*90|7>{!CYxhQ(0qVcteG*cteP|XKc5}Il9^)zql?anvqjGV2cBRD7GgK z*2J!>m@6f_&UlJQGd08eBY}3-*R>T+AWeayEtQ| zuG7}1xHcP~v65ffx>M+BcRr2NZYYPBB^`X(R3OU_z8nrO+?l=gzr}7+{oX9)(dn{x3cMx znUbvUD;Q_YI8LVxmFZ$pUqL*%u^5eF0pU%}$N;oTQf)sF$Bq06&<6dA(9L*XlI{oA z0KWrbCYCcmd^^ZL0CB?9UI4BKPK*0#aerRi&x-p`nk8uy{Dy(3XE`r$Ba)K7Utm(8 z402@ODDW|X4Fb;y%nJNd;F3TKf+_w(feC?=0#gES3%moQ{_YBWLFgt7jl^mo-9HE1 zj6NWf&aa2d7%2j563o_-jW0rL8m0|~k z{VUktF0-E~lj;3Y@;@#7C*l7YWc0l<=K<06aVT1K`tt)YlFIM +#include + +#include +#include + +static int child_no=0; +static int curx=0,cury=0; +static int fcol=1,bcol=0; +static int style=1; + +static Display *theDisplay; +static Window myWindow,theWindow; +static XClientMessageEvent theMessage; +static XEvent retEv; + +static word w; + +static struct { int x,y,fcol,bcol,style; } xystack[16]; +static stackptr=0; + diff --git a/sources/new-s5r4/x11graf2.c b/sources/new-s5r4/x11graf2.c new file mode 100644 index 0000000..9ef68d8 --- /dev/null +++ b/sources/new-s5r4/x11graf2.c @@ -0,0 +1,414 @@ +/* Loglan82 Compiler&Interpreter + Copyright (C) 1981-1993 Institute of Informatics, University of Warsaw + Copyright (C) 1993, 1994 LITA, Pau + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + contacts: Andrzej.Salwicki@univ-pau.fr + +or Andrzej Salwicki + LITA Departement d'Informatique + Universite de Pau + Avenue de l'Universite + 64000 Pau FRANCE + tel. ++33 59923154 fax. ++33 59841696 + +======================================================================= +*/ + +#define send_par(par) theMessage.data.s[cnt++]=(short)(param[par].xword); +#define send_shrt(wd) theMessage.data.s[cnt++]=(short)(wd); +#define send_word(wd) theMessage.data.s[cnt++]=(short)((wd)&0xffff); \ + theMessage.data.s[cnt++]=(short)(((wd)>>16)&0xffff); + + +#define send_sig \ + theMessage.type=ClientMessage; \ + theMessage.format = 16; \ + theMessage.message_type = nrproc; \ + XSendEvent(theDisplay,theWindow,True,NoEventMask,&theMessage); \ + XFlush(theDisplay); + +#define nxtev do XNextEvent( theDisplay, &retEv ); \ + while( retEv.type!=ClientMessage ); \ + cnt = 0; + +#define rec_par(par) param[par].xword=(int)(retEv.xclient.data.s[cnt++]); +#define rec_shrt(sh) sh = (int)(retEv.xclient.data.s[cnt++]); +#define rec_word(wd) wd = (int)(retEv.xclient.data.s[cnt++]) & 0xffff; \ + wd |= (int)(retEv.xclient.data.s[cnt++]) << 16; + + + + case GRON : + if ((theDisplay = XOpenDisplay(NULL)) == NULL){ + fprintf (stderr,"\nint: Can't open display\n"); + exit(1); + } + myWindow = XCreateWindow( + theDisplay, + RootWindow(theDisplay,DefaultScreen(theDisplay)), + 0,0,1,1,0, + CopyFromParent,InputOnly,CopyFromParent, + 0,NULL + ); + if( (child_no=fork())==0 ){ + char me[16]; + sprintf(me,"%d",(int)myWindow); + execlp("herc","herc",me,NULL); + } + graphmode = TRUE; + curx=cury=0; + nxtev + rec_word(theWindow); + break; + + case GROFF : + if( graphmode == FALSE ) break; + send_sig + child_no=0; + graphmode = FALSE; + break; + + case CLS : + send_sig + break; + + + case PUSHXY : + xystack[stackptr].x = curx; + xystack[stackptr].y = cury; + xystack[stackptr].fcol = fcol; + xystack[stackptr].bcol = bcol; + xystack[stackptr].style= style; + + stackptr++; + if( stackptr == 16 ) stackptr--; + + break; + + + case POPHXY : + + stackptr--; + if( stackptr < 0 ){ + stackptr = 0; + break; + } + + curx = xystack[stackptr].x; + cury = xystack[stackptr].y; + fcol = xystack[stackptr].fcol; + bcol = xystack[stackptr].bcol; + style= xystack[stackptr].style; + + cnt = 0; + nrproc = COLOR; + send_shrt(fcol) + send_sig + + cnt = 0; + nrproc = BORDER; + send_shrt(bcol) + send_sig + + cnt = 0; + nrproc = STYLE; + send_shrt(style) + send_sig + + break; + + + case POINT : + send_par(0) + send_par(1) + send_sig + case MOVE : + curx=param[0].xword; + cury=param[1].xword; + break; + + case DRAW : + send_shrt(curx) + send_shrt(cury) + send_par(0) + send_par(1) + send_sig + curx=param[0].xword; + cury=param[1].xword; + break; + + case INXPOS : + param[0].xword = curx; + break; + + case INYPOS : + param[0].xword = cury; + break; + + case HFILL : + case VFILL : + send_shrt(curx) + send_shrt(cury) + send_par(0) + send_sig + break; + + case HASCII : + send_shrt(curx) + send_shrt(cury) + send_par(0) + send_sig + if( param[0].xword != 0 ) curx += 8; + break; + + case COLOR : + fcol = param[0].xword; + send_par(0) + send_sig + break; + + case BORDER : + bcol = param[0].xword; + send_par(0) + send_sig + break; + + case STYLE : + bcol = param[0].xword; + send_par(0) + send_sig + break; + + case INPIX : + send_par(0) + send_par(1) + send_sig + curx=param[0].xword; + cury=param[1].xword; + nxtev + rec_par(2) + break; + + case OUTSTRING : + { + char *s= (char *)(M + strings + param[ 0 ].xword + 1); + int signs=M[ strings + param[ 0 ].xword ]; + nrproc=HASCII; + while( signs-- ){ + word sign=0; + cnt = 0; + send_shrt(curx) + send_shrt(cury) + send_shrt(sign) + send_sig + sign = (word)(*s); + cnt = 0; + send_shrt(curx) + send_shrt(cury) + send_shrt(sign) + send_sig + s++; + curx+=8; + } + } + break; + + case GETMAP : + { + word map; + word x=param[0].xword; + word y=param[1].xword; + word w = x - curx + 1; + word h = y - cury + 1; + x = curx; + y = cury; + if( w <= 0 ){ w=-w; x-=w; } + if( h <= 0 ){ h=-h; y-=h; } + send_shrt(x) + send_shrt(y) + send_shrt(w) + send_shrt(h) + send_sig + nxtev + rec_word(map) + newarry((word) 1, 3, (word)AINT, ¶m[ 2 ].xvirt, &am); + M[ am+3 ] = map; + M[ am+4 ] = w; + M[ am+5 ] = h; + } + break; + + case PUTMAP : + case ORMAP : + case XORMAP : + if (member(¶m[ 0 ].xvirt, &am)){ + send_word( M[ am+3 ] ) + send_shrt(curx) + send_shrt(cury) + send_shrt( M[ am+4 ] ) + send_shrt( M[ am+5 ] ) + send_sig + }else errsignal(RTEREFTN); + break; + +/* + case PATERN : + patern((int *) ¶m[ 0 ].xword, (int *) ¶m[ 1 ].xword, + (int *) ¶m[ 2 ].xword, (int *) ¶m[ 3 ].xword); + break; + + case INTENS : + intens((int *) ¶m[ 0 ].xword); + break; + + case PALETT : + pallet((int *) ¶m[ 0 ].xword); + break; + + case VIDEO : + if (member(¶m[ 0 ].xvirt, &am)) + if (M[ am ] >= 0x8000L/sizeof(word)) + video(normalize((char *) &M[ am+3 ])); + else errsignal(RTEILLAB); + else errsignal(RTEREFTN); + break; + + case HPAGE : + i = (int) param[ 1 ].xword; + if (i == 0) graphmode = FALSE; + else + if (i == 1) graphmode = TRUE; + hpage((int *) ¶m[ 0 ].xword, &i, + (int *) ¶m[ 2 ].xword); + break; + + case NOCARD : + param[ 0 ].xword = nocard(NULL); + break; +*/ + + case TRACK : + send_par(0) + send_par(1) + send_sig + nxtev + rec_shrt( curx ) + rec_shrt( cury ) + break; + + case INKEY : + if( child_no == 0 ) param[ 0 ].xword = inkey(); + else + { + int keycode; + send_sig + nxtev + rec_word(keycode) + param[ 0 ].xword = keycode; + } + break; + +/* + case HFONT : + hfont((int *) ¶m[ 0 ].xword, (int *) ¶m[ 1 ].xword); + break; + + case HFONT8 : + param[ 0 ].xword = 0; + param[ 1 ].xword = 0; + hfont8((int *) ¶m[ 0 ].xword, (int *) ¶m[ 1 ].xword); + break; +*/ + + case CIRB : + { + double alfa,beta,aspect,abs; word kolb,wwyp; + + send_par(0) + send_par(1) + param[2].xword *= 2; + send_par(2) + alfa = (double)(param[3].xreal); + beta = (double)(param[4].xreal); + kolb = param[5].xword; + wwyp = param[6].xword; + + aspect = (double)(param[7].xword) / (double)(param[8].xword); + aspect *= (double)(param[2].xword); + + alfa = alfa / M_PI * 180.0 * 64.0 ; + beta = beta / M_PI * 180.0 * 64.0 ; + + abs = alfa - beta; + if( abs < 0.0 ) abs = -abs; + if( abs < 0.0001 ) + beta+=360.0*64.0; + + send_shrt( (unsigned)aspect ) + send_shrt( (unsigned)alfa ) + send_shrt( (unsigned)beta ) + send_sig + } + break; + +/* MOUSE */ + + case INIT : + param[ 0 ].xbool = 2; + param[ 1 ].xbool = lbool(1); + break; + + case STATUS : + send_sig + nxtev + rec_par(0) + rec_par(1) + rec_par(2) + rec_par(3) + rec_par(4) + break; + + case GETPRESS : + case GETRELEASE : + send_par(0) + send_sig + nxtev + rec_par(1) + rec_par(2) + rec_par(3) + rec_par(4) + rec_par(5) + rec_par(6) + break; + + case SHOWCURSOR : + case HIDECURSOR : + case SETPOSITION : + case SETWINDOW : + case DEFCURSOR : + case SETSPEED : + case SETMARGINS : + case SETTHRESHOLD : + break; + + case GETMOVEMENT : + send_sig + nxtev + rec_par(0) + rec_par(1) + break; + diff --git a/sources/pass1/al11.ff b/sources/pass1/al11.ff new file mode 100644 index 0000000..66a861a --- /dev/null +++ b/sources/pass1/al11.ff @@ -0,0 +1,4208 @@ +C Loglan82 Compiler&Interpreter +C Copyright (C) 1981-1993 Institute of Informatics, University of Warsaw +C Copyright (C) 1993, 1994 LITA, Pau +C +C This program is free software; you can redistribute it and/or modify +C it under the terms of the GNU General Public License as published by +C the Free Software Foundation; either version 2 of the License, or +C (at your option) any later version. +C +C This program is distributed in the hope that it will be useful, +C but WITHOUT ANY WARRANTY; without even the implied warranty of +C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +C GNU General Public License for more details. File: LICENSE.GNU +C =============================================================== + + SUBROUTINE AL1 +C----------------------------------------------------------------------- +C +C 1983.01.06 +C +C * * * * * * * * * * * * * * * * * * * * +C +C THE FOLLOWING FILE UNITS ARE USED : +C +C 1 - INTERACTIVE INPUT FROM THE TERMINAL ( FOR TESTING ONLY ) +C 2 - INTERACTIVE OUTPUT TO THE TERMINAL ( FOR TESTING ONLY ) +C 13 - LISTING OUTPUT ( TEST MESSAGES ) +C 14 - WORKING FILE SCRATCH - CODE FROM PARSER AND L-CODE +C ( USED ONLY VIA SEEK,PUT,GET WITH IBUF3 ) +C 15 - L-CODE OUTPUT ( TEXTUAL (HEXADECIMAL) REPRESENTATION +C OF SYMBOL TABLE AND L-CODE ) +C +C * * * * * * * * * * * * * * * * * * * * +C +C STRUMIENIE : +C 3 - BINARNY - KOD Z PARSERA +C LO - WYDRUKI KONTROLNE /ZNAKOWY/ +C 3 - PRODUKOWANE CZWORKI /BINARNY/ - SEKWENCYJNIE, +C OD REKORDU NUMER IOP(2)+1 . +C /REKORD O NUMERZE IOP(2) BUFORUJE STOS "CASE"/ +C +C * * * * * * * * * * * * * * * * * * * * +C +C +C +C +C ##### OUTPUT CODE : 200 . +C +C +C +#include "stos.h" +#include "blank.h" +C + COMMON/STREAM/ERRFLG,LINE,IBUF2(265),IBUF3(7),JUNK(260) + LOGICAL ERRFLG +C IBUF3 - OPIS STRUMIENIA Z WCZYTYWANYM I PRODUKOWANYM KODEM POSREDNIM +C + COMMON/SUMMARY/FREE + COMMON/CASE/DEEP,OVER +C +C +cdeb --------------- added ------------ + common /brid/breaklid +c breaklid - numer w displayu (dla interpretera) procedury breakl + + common /debug/deb,breakt(500),brnr,maxbr + logical deb +cdeb ----------------------------------- + + common/MJLMSG/IERC,MSG +cdsw ---------------------------- + integer*4 msg +cdsw ---------------------------- +cdsw&bc + common /stacks/ btsins, btstem +C +C + IERC=0 + msg = 'al1 ' +C + CALL STEST +C WCZYTANA OPCJA WYDRUKOW KONTROLNYCH + CALL SABORT +C WYLAPANIE ABORTU +C +C + LSTWRD=LMEM-260 +C OSTATNIE ZAJETE SLOWO W BUFORZE WYJSCIOWYM / LMEM-259 .. LMEM-1 / + BOTTOM=LMEM-916 + STACK(BOTTOM)=-1 +C DNO STOSU / LMEM-916 .. LMEM-516 / Z WARTOWNIKIEM = -1 + FREE=LMEM-516-BOTTOM +C ROZMIAR STOSU = 400 + DEEP=LMEM-600 +C PUSTY STOS INSTRUKCJI "CASE" / LMEM-515 .. LMEM-260 / + QRECNR=IOP(2) +C NAJWIEKSZY UZYTY NUMER REKORDU STRUMIENIA 3 +C +cdsw&bc + btsins = lpml + btstem = lpmf +cdsw ----------------- added ---------------------------------- +c inicjalizacje zmiennych z common przeniesione z podprogramow +c przeniesione z sinit + stckag = 0 + stcka0 = 8 + do 1 i=1,14 + stckap(i) = 8 +1 continue + stckap(5) = 10 + stckap(6) = 4 + apetyt(1) = 1 +#if WSIZE == 4 + apetyt(2) = 1 +#else + apetyt(2) = 2 +#endif + apetyt(3) = 3 + apetyt(4) = 2 +c przeniesione z scase + over = 0 +cdsw ----------------------------------------------------------------- +c + CALL SPASS2 +C +cdeb ----------------- added ------------------- +c instrukcja L-kodu przekazujaca breaklid + if (.not.deb) go to 2001 + call quadr1(211) + if(breaklid.eq.0) go to 2001 + call quadr2(210,breaklid) +2001 continue +cdeb ------------------------------------------- +C +C WYPISZ ZNACZNIK KONCA PRODUKOWANEGO KODU POSREDNIEGO + CALL QUADR1(200) +C JESLI TRZEBA - WYPISZ BUFOR Z CZWORKAMI + IF(ERRFLG) GO TO 2000 + IF(LSTWRD.EQ.LMEM-260)GO TO 1000 +cdsw **************************** +cdsw QRECNR=QRECNR+1 +cdsw CALL SEEK(IBUF3,QRECNR) +cdsw CALL PUT(IBUF3,IPMEM(LMEM-259)) +cbc write(18) (ipmem(i),i=lmem-259,lmem-4) + call ffwrite_ints(18, ipmem(lmem-259), 256) +cbc +cdsw ***************************** +C +C +C WRITE HEXADECIMAL REPRESENTATION OF SYMBOL TABLE AND L-CODE + 1000 CALL SLCSTOUT + + 2000 CONTINUE + + call ffclose(18) +C CLOSED TEMPORARY 18 should BE AUTOMATICALLY DELETED but ... + call ffunlink(18) + +C +C +C WYLACZ 'RECOVERY' + CALL SRCVOFF +C +C +C.....PRZYGOTUJ DANE STATYSTYCZNE +C +C + IPMEM(ISFIN-3)=QRECNR-IOP(2) +C = LICZBA WYPRODUKOWANYCH REKORDOW Z KODEM POSREDNIM + IPMEM(ISFIN-4)=(400-FREE)/4 +C = % UZYTEGO STOSU /WZOR POPRAWNY DLA ROZMIARU = 400 / +C +C +cdsw MSG=HAL1 + CALL MESS +C PRINT LISTING + CALL ML2 +C STOP +C PO ABORCIE /BLAD W KOMPILATORZE/ +C7777 ERRFLG=.TRUE. CHANGED TO COMMENT 04.01.84 +CBC GO TO 1000 + END + + + SUBROUTINE SPASS2 +C----------------------------------------------------------------------------- +C +C PROCEDURA STERUJACA PRZEBIEGIEM 2. +C DWUKROTNIE PRZECHODZI PRZEZ WSZYSTKIE MODULY. +C FAZA 1 : WYLICZANIE WARTOSCI STALYCH /INIT=TRUE/ +C - WYBIERA TYLKO MODULY ZAWIERAJACE STALE WYLICZANE +C FAZA 2 : WLASCIWA GENERACJA KODU /INIT=FALSE/ +C - PRZECHODZI PRZEZ WSZYSTKIE MODULY ZAWIERAJACE INSTRUKCJE +C W OBU FAZACH PRZECHODZI KOLEJNO PRZEZ MODULY I DLA KAZDEGO MODULU +C WSTAWIA JEGO ADRES DO P ,WCZYTUJE PIERWSZY REKORD Z KODEM POSREDNIM, +C USTAWIA WB I INDEKS SYMBOLU DLA SNEXT,INICJALIZUJE STRUKTURY DANYCH, +C WOLA SDPDA. +C +C STARTUJE OD BLOKU WSKAZANEGO PRZEZ NBLUS. +C DLA KAZDEGO MODULU REKORDY Z KODEM POSREDNIM Z PARSERA POWIAZANE +C SA W LISTE : SLOWO +8 ZAWIERA NUMER PIERWSZEGO REKORDU /JESLI SLOWO +C +9 =0 TO LISTA JEST PUSTA/ A SLOWO +9 INDEKS PIERWSZEGO SYMBOLU +C W REKORDZIE. SLOWO 256 REKORDU ZAWIERA NUMER NASTEPNEGO REKORDU +C LISTY. KOD DLA KAZDEGO MODULU JEST ZAKONCZONY PARA . +C +C SLOWO +2 W OPISIE MODULU ZAWIERA ADRES /W IPMEM/ NASTEPNEGO MODULU. +C +#include "stos.h" +#include "blank.h" + COMMON/STREAM/ERRFLG,LINE,IBUF2(265),IBUF3(7),JUNK(260) + LOGICAL ERRFLG +C + COMMON/TEST/TESTC,TESTS,TESTH + LOGICAL TESTC,TESTS,TESTH +C + LOGICAL INIT +C = TRUE DLA FAZY WYLICZANIA STALYCH +C +C INTERNAL 2000 CHANGED TO COMMENT 04.01.84 +C PUNKT POWROTU PO PRZEPELNIENIU STOSU W SPUSH +C +C +C................. FAZA WYLICZANIA STALYCH +C /PIERWSZE PRZEJSCIE PRZEZ KOD DLA MODULOW/ +C + INIT=.TRUE. +C +C.....USTAW P NA BLOK GLOWNY + 100 P=NBLUS +C +C +C.....INICJALIZACJA DLA PROTOTYPU P + 1000 CONTINUE + + IF(.NOT.TESTC) GOTO 5000 + call ffputcs(13,' ------------ PASS2 ---------- P =') + call ffputi (13,P,6) + call ffputnl(13) +5000 CONTINUE + +C POMIN,JESLI TO PROTOTYP FORMALNY/PROC.,FUN.,SYGNAL/ + IF(IAND(ISHFT(IPMEM(P),-4),15).NE.0)GO TO 2000 +C +C ... PODCZAS WYLICZANIA STALYCH POMIN,JESLI MODUL ICH NIE MA + IF(INIT.AND.IPMEM(P-1).EQ.0)GO TO 2000 +C +C POMIN , JESLI NIE MA INSTRUKCJI + IF(IPMEM(P+9).EQ.0)GO TO 2500 +C +C ... ODSZUKAJ PIERWSZY REKORD Z KODEM POSREDNIM + N=IPMEM(P+8) +C WSTAW NUMER I WCZYTAJ PIERWSZY REKORD + IX(258)=N + CALL SEEK(IBUF3,N) + + IF(.NOT.TESTC) GOTO 6000 + call ffputcs(13,' REKORD') + call ffputi (13,N,5) + call ffputcs(13,' SYMBOL') + call ffputi (13,IPMEM(P+9),4) + call ffputnl(13) +6000 CONTINUE + + CALL GET(IBUF3,IX) + WB=IPMEM(P+9) +C WSTAW INDEKS BIEZACEGO SYMBOLU,USTAW WB + IX(257)=WB + WB=IX(WB) + +C INICJALIZACJA + + CALL MPROTO + CALL SDPDA(INIT) + CALL MPROTC + + +C...........WEZ NASTEPNY MODUL + 2000 P=IPMEM(P+2) + IF(P.NE.0)GO TO 1000 +C WSZYSTKIE MODULY JUZ SKOMPILOWANE. +C +C................. FAZA GENERACJI KODU +C /DRUGIE PRZEJSCIE PRZEZ KOD DLA MODULOW/ +C + IF(.NOT.INIT)RETURN + INIT=.FALSE. + GO TO 100 +C +C +C.....MODUL BEZ INSTRUKCJI. PREFIKS? + 2500 IDL=IPMEM(P+21) + IF(IDL.EQ.0)GO TO 2600 +C TAK. PRZEPISZ INFORMACJE O INSTRUKCJACH PO INNER + IPMEM(P-7)=IPMEM(IDL-7) + GO TO 2000 +C ... BEZ PREFIKSU. DLA KLASY,REKORDU WSTAW: BRAK INSTR. PO INNER + 2600 IF(IAND(IPMEM(P),15).NE.1)IPMEM(P-7)=0 +cdsw&bc + if (.not. init) call stclass + GO TO 2000 + END + + + subroutine stclass + implicit integer(a-z) +#include "blank.h" +c +c not yet used as prefix + ipmem(p+1) = 0 +c begin of module + call quadr2(184, p) +c begin of instructions + call quadr1(179) +c inner + call quadr2(178, ipmem(p+23)) +c after inner label + call quadr2(181, 1) +c fin + call quadr1(194) +c lastwill + call quadr1(174) + ipmem(p+8) = 0 +c back + call quadr1(193) +c end module + call quadr1(185) + return + end + + SUBROUTINE SDPDA(INICJA) +C----------------------------------------------------------------------------- +C +C WERSJA 1983.03.09 +C +C GLOBAL JUMPS ARE CHANGED TO LOCAL JUMPS IF POSSIBLE OTHERWISE THEY ARE +C CHANGED TO COMPUTED JUMPS 8.5.84 +C +C MAIN ROUTINE OF SEMANTIC ANALYSIS AND CODE GENERATION +C GLOWNA PROCEDURA ANALIZY SEMANTYCZNEJ I GENERACJI KODU POSREDNIEGO +C /CZWOREK/ DLA MODULU. +C PRACUJE JAK DETERMINISTYCZNY AUTOMAT ZE STOSEM STEROWANY SYMBOLEM +C WEJSCIOWYM. +C W ZALEZNOSCI OD WB /SYMBOL WEJSCIOWY/ WYBIERANA JEST AKCJA DO WYKONANIA +C O ETYKIECIE 100*WB : OD 100 DO 7200. +C WB MUSI MIEC NADANA WARTOSC PRZED WYWOLANIEM SDPDA. +C +C DLA KAZDEGO MODULU WOLANA DWUKROTNIE: +C PIERWSZY RAZ W FAZIE WYLICZANIA STALYCH /O ILE MODUL ZAWIERAL +C STALE WYLICZANE/ I DRUGI RAZ W FAZIE GENERACJI KODU /O ILE +C BYLY INSTRUKCJE/. +C W FAZIE WYLICZANIA STALYCH PO WYSTAPIENIU ZNACZNIKA PIERWSZEJ +C INSTRUKCJI ZASTEPUJE W PROTOTYPIE ADRES POCZATKU KODU DLA MODULU +C PRZEZ NUMER REKORDU I MIEJSCE W REKORDZIE ZAWIERAJACE TEN ZNACZNIK. +C +C +C +C ##### OUTPUT CODE : 15 , 23 , 31 , 33 , 34 , 35 , 36 , 41 , +C 85 , 132 , 145 , 149 , 151 , 152 , +C 172 , 173 , 176 , 177 , 178 , 179 , +C 181 , 182 , 186 , 187 . +C +C +C ##### DETECTED ERROR(S) : 407 , 410 , 411 , 414 , 415 , 416 , +C 418 , 420 , 421 , 422 , 423 , 424 , 426 , 427 , +C 428 , 429 , 430 , 440 , 444 , 449 , 454 , 604 . +C +C +#include "stos.h" +#include "option.h" +#include "blank.h" +C +C STACK - STOS DLA ANALIZY SEMANTYCZNEJ. OD LEWEJ WKLADANE SA +C ELEMENTY,OD PRAWEJ OPISY PARAMETROW OUTPUT. +C KAZDY ELEMENT STOSU ZAJMUJE KILKA KOLEJNYCH SLOW +C OZNACZANYCH -9,...,-1,0. ZEROWE SLOWO OKRESLA RODZAJ +C ELEMENTU. +C OPISY PAR. OUTPUT ZAJMUJA ZAWSZE 12 SLOW: -9,..,+2 +C STOS /400 SLOW + WARTOWNIK/ ZAJMUJE W TABLICY IPMEM +C SLOWA OD BOTTOM = LMEM-916 DO LMEM-516 +C ELEMENTY STOSU : +C 0 - UNIWERSALNY +C 1 - STALA +C 2 - WARTOSC +C 3 - ZMIENNA +C 4 - ELEMENT TABLICY DYN. +C 5 - TABLICA STATYCZNA +C 6 - OPIS PETLI "FOR" +C 7 - NAZWA TYPU +C 8 - REKORD +C 9 - KLASA +C 10 - BLOK PREFIKSOWANY +C 11 - PROCEDURA +C 12 - FUNKCJA +C 13 - SYGNAL +C 14 - OPERATOR +C BOTTOM - WSKAZUJE DNO STOSU / WARTOWNIKA = -1 / +C VALTOP - CZUBEK STOSU /INDEKS ZEROWEGO SLOWA/ +C VLPREV - INDEKS ZEROWEGO SLOWA POPRZEDNIEGO ELEMENTU +C STCKAG,STCKA0,STCKAP - TABLICA -1..14 APETYTOW ELEMENTOW STOSU +C /TZN. STCKAP(I)=APETYT ELEMENTU TYPU I/ +C STCKAP(-1)= 0 =APETYT WARTOWNIKA DLA POP +C APETYT - TABLICA OKRESLAJACA DLA KAZDEGO RODZAJU TYPU JEGO +C APETYT. 1,2,3,4 --> 1,2,3,2 +C LSTFOR - INDEKS OSTATNIEGO SLOWA ZAJETEGO PRZEZ PETLE FOR +C LSTLSE - " " LSE NA STOSIE /LSE ,TZN. LEWE STRONY +C PODSTAWIENIA SA UMIESZCZONE POWYZEJ LSTFOR DO LSTLSE/ +C KIND - RODZAJ WOLANEGO MODULU: 0-ZWYKLY,1-VIRTUALNY,2-FORMALNY +C PHADR - ATS ADRESU FIZYCZNEGO POLA DANYCH GENEROWANEGO OBIEKTU +C LUB 0 ,GDY ADR.FIZYCZNY TRZEBA ODTWORZYC Z ADR.VIRT. +C LASTPR - JESLI NA STOSIE JEST FUNKCJA,PROCEDURA,KLASA,REKORD, +C SYGNAL,BLOK PREF. , DLA KTOREGO PAMIETANY JEST TYLKO +C ADRES POSREDNI ZAMIAST PELNEGO ADR.VIRTUALNEGO, TO +C LASTPR= INDEKS TEGO ELEMENTU; INACZEJ ZERO +C FSTOUT - INDEKS PIERWSZEGO SLOWA ZAJETEGO PRZEZ OPISY PAR. +C OUTPUT +C WB - BIEZACY SYMBOL /WEJSCIOWY/ KODU POSREDNIEGO +C RESULT - ATS WYNIKU OPERACJI +C CONSNR - TABLICA ZAWIERAJACA ADRESY /INDEKSY W IPMEM/ TYPOW: +C BOOLEAN,CHAR,INTEGER,NONE,REAL,STRING I UNIWERSALNEGO . +C LSTSAF - OSTATNI ELEMENT STOSU NIE WYMAGAJACY ZABEZPIECZENIA +C PRZEZ SAFEST ,USTAWIA SAFEST,OBNIZA SPOP. +C TEMPNR - POCZATEK ADRESOW W /BUDOWANEJ/ TABLICY SYMBOLI +C UZYWANYCH DLA ATRYBUTOW ROBOCZYCH, +C ADRESY WIEKSZE ZAREZERWOWANE DLA PETLI FOR, +C ZMNIEJSZANE O 6 NA POCZATKU, A ZWIEKSZANE NA KONCU +C PETLI. +C LSTEMP - NAJMNIEJSZY UZYTY ADRES ATRYBUTU ROBOCZEGO +C +C QRECNR - OSTATNI UZYTY NUMER REKORDU W STRUMIENIU 3 +C BUFOR NA GENEROWANY KOD POSREDNI WYSYLANY NA STRUMIEN 3 +C ZAJMUJE 259 SLOW W TABLICY IPMEM : OD LMEM-259 DO LMEM-1 . +C LSTWRD - INDEKS OSTATNIEGO ZAJETEGO SLOWA W BUFORZE. +C +C ZASADA WYPELNIANIA BUFORA : SA CO NAJMNIEJ 4 WOLNE SLOWA +C / LSTWRD < LMEM-4 / . PROCEDURY QUADR1 .. QUADR4 +C DOPISUJA ZA LSTWRD SWOJE ARGUMENTY I ZWIEKSZAJA LSTWRD. +C JESLI POZOSTANA MNIEJ NIZ 4 SLOWA - WOLAJA QDROUT. +C QDROUT WYPISUJE PIERWSZE 256 SLOW I OSTATNIE 3 SLOWA +C PRZEPISUJE NA POCZATEK, ZMNIEJSZAJAC LSTWRD O 256. +C FRSTTS - PIERWSZE SLOWO W IPMEM NA NOWE OPISY ATRYBUTOW +C W TABLICY SYMBOLI +C ZAPELNIANIE TABLICY SYMBOLI: TSINSE --> <-- TSTEMP +C OBSZAR WOLNY - FRSTTS .. LSTEMP-1 +C UNIT - RODZAJ BIEZACEGO MODULU: +C 1 - BLOK +C 2 - HANDLER +C 3 - BLOK PREFIKSOWANY +C 4 - PROCEDURA +C 5 - FUNKCJA +C 6 - KLASA +C INNER = 0 - NIE BYLO "INNER",ALE JEST LEGALNY +C 1 - WYSTAPIENIE "INNER" BEDZIE NIELEGALNE +C 2 - JUZ WYSTAPIL +C 4 - LAST-WILL WYSTAPIENIE INNER NIELEGALNE +C LSTWILL - TRUE,JESLI WYSTAPILO LAST WILL +C +C TEST - OPCJA / U3 / WYDRUKOW KONTROLNYCH , +C = 0 --> BEZ WYDRUKOW , <> 0 --> WYDRUKI +C +C ARG - INFORMACJA O STALYCH ARGUMENTACH /USTAWIANA PRZEZ +C SARGMT/ : +C 1 - OBA STALE +C 2 - LEWY STALY,PRAWY NIE +C 3 - LEWY NIE,PRAWY STALY +C 4 - OBA ROZNE OD STALYCH +C ATLINE - NUMER LINII, W KTOREJ PRZEBIEG MA SIE ZAWIESIC +C +C FILE - ADRES PLIKU NA STOSIE LUB 0 DLA OPERACJI NA PLIKU +C STANDARDOWYM +C +C FLARGS - INFORMACJA O PRZETWORZONYCH ARGUMENTACH OPERACJI +C WE/WY : +C 0 - NIE WYSTAPIL ZADEN ARGUMENT +C 1 - WYSTAPIL TYLKO ADRES PLIKU +C 2 - WYSTAPIL CO NAJMNIEJ 1 ARGUMENT +C ( LUB READLN/WRITELN ) +C +C FLREADY - TRUE, JESLI (R6-12) ZAWIERA ADRES PLIKU, ZAPALANE PRZEZ +C SFLADR, GASZONE PRZEZ SCALLB I DLA 'I-O-END' +C +C FLMODF - PRZELACZNIK NUMERU PROCEDURY STANDARDOWEJ UZYWANY +C DLA WE/WY : 1 DLA PLIKU STANDARDOWEGO +C 0 DLA WSKAZYWANEGO +C NUMERY PROCEDUR WE/WY (ROZNE PUNKTY WEJSCIA) SA +C POWIAZANE : +C INPUT : N-1 +C WSKAZYWANY : N +C OUTPUT : N+1 +C +C............. +C COMDECK OPT? 04.01.84 +C COMMON/OPTION/OPTMEM,OPTOPT,OPTIND,OPTTYP,OPTTRC,OPTCSC,OPTCSF +C LOGICAL OPTOPT,OPTTYP,OPTTRC +C FROM LOGLAN.08 +C +C ***** OPCJE KOMPILATORA ***** +C +C OPTMEM - 0 - TRZEBA ROBIC MEMBER +C 1 - NIE TRZEBA ROBIC MEMBER +C OPTOPT - .TRUE. - WOLNO OPTYMALIZOWAC +C .FALSE. - NIE WOLNO +C OPTIND - 0 - KONTROLA INDEKSOW DLA TABLIC +C 2 - BEZ KONTROLI INDEKSOW +C OPTTYP - .TRUE. - BEZ DYNAMICZNEJ KONTROLI TYPOW +C +C OPTTRC - .TRUE. - KOMPILAT POWINIEN ZAWIERAC SLEDZENIE +C +C OPTCSC - 1 - BEZ KONTROLI ZAKRESU DLA "CASE" +C 0 WYMAGANA KONTROLA +C OPTCSF - 0 - SZYBKI "CASE" +C 1 - PAMIECIOOSZCZEDNY +C +C +C................ +C +C*COMDECK BLANKSEM +C LOGICAL INSYS, OWN +C COMMON /BLANK/ IOP(4), +C X P, +C X TLDIM, TLBAS, IDL, OBJL, +C X TRDIM, TRBAS, IDR, OBJR, +C X TRESLT, +C X TRESLT, +C X CONVL, CONVR, +C X NRPAR, +C X IX (261), +C X LMEM , LPMEM , IRECN , ISFIN , LPMSYS, LPML , LPMF , +C X NRINT , NRRE , NRBOOL, NRCHR , NRCOR , NRPROC, NRTEXT, +C X NRUNIV, NATTR , NRNONE, NBLSYS, NBLUS , NEMPTY, INSYS , +C X LOCAL, OWN, OBJECT, +C X IPMEM(5000) +C REAL STALER(100) +C INTEGER STACK(5000) +C EQUIVALENCE(STALER(1),IPMEM(1)) +C EQUIVALENCE(STACK(1),IPMEM(1)) +C......COMDECK BLANKSEM +C FROM LOGLAN.08 17.01.84 +C LMEM - (=5000) ROZMIAR CALEJ PAMIECI GLOWNEJ +C LPMEM - PODZIAL PAMIECI NA CZESCI IPMEM I IPMEM +C +C CZESC SEMANT +C P - PROTOTYP AKTUALNY +C TLDIM - LICZBA ARRAY OF W TYPIE LEWEGO ARGUMENTU +C TLBAS - TYP BAZOWY LEWEGO ARGUMENTU +C DISPL - .TRUE. JESLI LEWY ARGUMENT JEST DOSTEPNY PRZEZ +C DISPLAY +C OBJL - PROTOTYP OBIEKTU, Z KTOEGO POCHODZI TEN ATRYBUT +C IDL - IDENTYFIKATOR LEWEGO ARGUMENTU (DO SYGNALIZACJI BLE- +C DOW) +C TRDIM, TRBAS, DISPR, IDR, OBJR - ANALOGICZNIE DLA PRAWEGO ARGU- +C MENTU +C TRESLT - TYP BAZOWY WYNIKU OPERACJI ARYTMETYCZNEJ +C CONVL, CONVR - FLAGA KONWERSJI LEWEGO I PRAWEGO ARGUMENTU +C OPERACJI ARYTMETYCZNYCH LUB RELACJI +C WARTOSCI : +C 0 - BRAK KONWERSJI +C 1 - KONWERSJA DO REAL +C 2 - KONWERSJA DO INTEGER (?) +C NRPAR - NUMER PARAMETRU (PROCEDURA MPKIND) +C +C IRECN - INDEKS SZCZYTU STOSU STALYCH REAL +C ISFIN - INDEKS SZCZYTU SLOWNIKA PROTOTYPOW +C +C LPMSYS - INDEKS PIERWSZEGO SLOWA W IPMEM OBSZARU NIEPRZEZ- +C NACZONEGO NA PROTOTYPY SYSTEMOWE +C LPML - INDEKS PIERWSZEGO SLOWA OBSZARU WOLNEGO W IPMEM +C LPMF - INDEKS OSTATNIEGO SLOWA WOLNEGO OBSZARU W IPMEM +C +C IDENTYFIKATORY PROTOTYPOW SYSTEMOWYCH +C NRINT - IDENTYFIKATOR PROTOTYPU INTEGER +C NRRE - REAL +C NRBOOL - BOOLEAN +C NRCHR - CHARACTER +C NRCOR - COROUTINE +C NRPROC - PROCESS +C NRTEXT - STRING (TEXT) +C NRUNIV - IDENTYFIKATOR PROTOTYPU UNIWERSALNEGO +C NATTR - IDENTYFIKATOR PSEUDO-ATRYBUTU (Z NUMEREM -1) +C NRNONE - IDENTYFIKATOR PROTOTYPU TYPU NONE (UNIWERSALNY +C REFERENCYJNY) +C NBLSYS - IDENTYFIKATOR BLOKU SYSTEMOWEGO +C NBLUS - BLOKU GLOWNEGO UZYTKOWNIKA +C +C INSYS - FLAGA SPOSOBU REZERWACJI (PRZEZ MGETM) PAMIECI +C W IPMEM - .TRUE. JESLI REZERWACJA W CZESCI SYSTE- +C MOWEJ +C LOCAL - FLAGA DOSTEPU DO OBIEKTOW - .TRUE. JESLI OBIEKT +C BYL LOKALNY +C OWN - FLAGA DOSTEPU DO OBIEKTOW - .TRUE. JESLI OBIEKT NIE +C POCHODZI Z PREFIKSOW (TYLKO Z WLASCIWEGO OBIEKTU) +C OBJECT - PROTOTYP OBIEKTU, Z KTOREGO POCHODZIL OSTATNIO +C SZUKANY IDENTYFIKATOR (OBIEKT POCHODZACY Z CIAGU SL) +C +C + COMMON/STREAM/ ERRFLG,LINE,IBUF23(272),JUNK(260) + LOGICAL ERRFLG + LOGICAL MLOCTP,MDISTP +C +C + COMMON/TEST/TESTC,TESTS,TESTH + LOGICAL TESTC,TESTS,TESTH +cdsw&bc + real y + integer*2 m(2) + equivalence (y, m(1)) +cdsw&bc + common /stacks/ btsins, btstem +C +C + LOGICAL INICJA +C INICJA=.TRUE. W FAZIE WYLICZANIA WARTOSCI STALYCH SYMBOLICZNYCH I GRANIC +C TABLIC STATYCZNYCH. +C +C +C + INTEGER ERROR +C ERROR=NUMER BLEDU DLA WSPOLNEJ SYGNALIZACJI /9900/ +C + LOGICAL FORSTP +C DLA PETLI "FOR" : TRUE --> WYSTAPILO "STEP", FALSE --> NIE WYSTAPILO +C +C +C +C AUXILIARY VARIABLES + INTEGER ATS,ELEM,I,IND +C +C.....INICJALIZACJA +cdsw&bc FRSTTS=LPMEM+1 + frstts = btsins +c +C =INDEKS POCZATKU TABLICY SYMBOLI - CZESC DLA ATRYBUTOW DEKLAROWANYCH + IPMEM(LMEM)=BOTTOM-1 +C OSTATNIE SLOWO IPMEM ZAWIERA INDEKS PIERWSZEGO OD PRAWEJ WOLNEGO +C SLOWA NA POMOCNICZY SLOWNIK DLA WYZNACZANIA ADRESOW ATRYBUTOW +C DEKLAROWANYCH W TABLICY SYMBOLI. +C +C +C + CONSNR(1)=NRBOOL + CONSNR(2)=NRCHR + CONSNR(3)=NRINT + CONSNR(4)=NRNONE + CONSNR(5)=NRRE + CONSNR(6)=NRTEXT + CONSNR(7)=NRUNIV +cdsw&bc + consnr(8)=-17 + IF(INICJA)GO TO 10 + CALL SINIT + 10 VALTOP=BOTTOM + VLPREV=BOTTOM + LSTLSE=BOTTOM + LSTFOR=BOTTOM + LASTPR=0 + LSTSAF=BOTTOM + FSTOUT=BOTTOM+401 +cdsw&bc TEMPNR=LMEM-6 + tempnr = btstem-6 +c + LSTEMP=TEMPNR + FILE=0 + FLARGS=0 + FLREADY=.FALSE. + FLMODF=1 + ICOUNT=0 + OCOUNT=0 + GO TO 50 +C +C +C + 30 CALL SPOP + 40 CALL SNEXT +C.....GLOWNA PETLA. W ZALEZNOSCI OD SYMBOLU Z WEJSCIA WYBIERZ AKCJE + 50 CONTINUE + GO TO(100,200,300,400,500,600,700,800,900,1000,1100,1200,1300, + X 1400,1500,1600,1700,1800,1900,2000,2100,2200,2300,2400,2500, + X 2600,2700,2800,2900,3000,3100,3200,3300,3400,3500,3600,3700, + X 3800,3900,4000,4100,4200,4300,4400,4500,4600,4700,4800,4900, + X 5000,5100,5200,5300,5400,5500,5600,5700,5800,5900,6000,6100, + X 6200,6300,6400,6500,6600,6700,6800,6900,7000,7100,7200,7300, + X 7400,7500,7600,7700,7800,7900,8000,8100,8200,8300,8400,8500, + X 8600,8700,8800,8900,9000,9100,9200,9300,9400),WB +cbc X 8600,8700,8800,8900,9000),WB +cbc X 8600,8700,8800),WB +C +C---------------- AND -------------------------- +C + 100 CALL SBOOLEX(1) + GO TO 40 +C +C--------------- ARRAY OF ------------------------ +C +C ZWRACA : SLOWO -2 =0 - TYP STATYCZNY (-3),(-4) +C SLOWO -2 >0 - ATS ZMODYFIKOWANEGO TYPU FORMALNEGO +C + 200 CALL SNEXT +C WB=LICZBA ARRAY OF +C CZY NA CZUBKU JEST KLASA,REKORD LUB NAZWA TYPU? + ELEM=STACK(VALTOP) + IF(ELEM.EQ.0)GO TO 40 + IF(ELEM.LT.7 .OR. ELEM.GT.9)GO TO 250 +C OK. WPISZ LICZBE ARRAY OF + STACK(VALTOP-3)=WB +C CZY TYP FORMALNY? + IF(STACK(VALTOP-2).NE.0) CALL SMODIFY(STACK(VALTOP-2),WB) + GO TO 40 +C.....NIEPOPRAWNY CZUBEK STOSU + 250 ERROR=440 + GO TO 9900 +C +C--------------- ASSIGN -------------------------- +C +C CZUBEK STOSU POWINIEN ZAWIERAC WARTOSC,PONIZEJ SA LSE /POWYZEJ LSTFOR DO +C + 300 CALL SASSIGN + GO TO 40 +C +C--------------- ASSIGN CONST -------------------- +C CZUBEK STOSU POWINIEN ZAWIERAC STALA /WARTOSC WYRAZENIA DEFINIUJACEGO/, +C PONIZEJ CZUBKA JEST STALA DEFINIOWANA,MAJACA W SLOWIE -2 INDEKS +C SWOJEGO OPISU W IPMEM. +C +C STALA? + 400 IF(STACK(VLPREV).EQ.0 .OR. STACK(VALTOP).EQ.0)GO TO 420 + IF(STACK(VALTOP).EQ.1)GO TO 410 + CALL SERRO2(429,VLPREV) + GO TO 420 +C POBIERZ ADRES OPISU STALEJ DEFINIOWANEJ + 410 ELEM=STACK(VLPREV-2) +C WPISZ WARTOSC I TYP + IPMEM(ELEM-1)=STACK(VALTOP-2) + IPMEM(ELEM-4)=0 + IPMEM(ELEM-3)=STACK(VALTOP-4) + 420 CALL SPOP + GO TO 30 +C +C--------------- ATTACH -------------------------- +C CZUBEK STOSU POWINIEN ZAWIERAC REFERENCJE +C + 500 CALL SATTACH + LSTEMP=TEMPNR + GO TO 30 +C +C--------------- BLOCK --------------------------- +C WYSTAPIENIE BLOKU O NUMERZE WN + 600 CALL SNEXT + CALL QUADR2(186,IPMEM(WB)) + LSTEMP=TEMPNR + GO TO 40 +C +C--------------- CALL ---------------------------- +C NA PEWNO BLAD: PROCEDURA SAMA "ZJADA" CALL. +C + 700 CALL SERROR(422) + GO TO 30 +C +C--------------- CASE ---------------------------- + 800 CALL SCASE + GO TO 30 +C WRACA DO ETYKIETY 30 +C--------------- CASE LABEL ---------------------- + 900 CALL SCSLAB + GO TO 30 +C WRACA DO ETYKIETY 30 +C--------------- COMA ---------------------------- +C +C PONIZEJ CZUBKA JEST : +C UNIWERSALNY LUB ELEMENT TABLICY/DYN./ LUB TABLICA STATYCZNA +C LUB REKORD,KLASA,BLOK PREF.,PROCEDURA,FUNKCJA. +C NA CZUBKU JEST INDEKS LUB PARAMETR AKTUALNY. +C PO OBSLUZENIU WOLA SNEXT +C + 1000 ELEM=STACK(VLPREV) +C JESLI UNIWERSALNY-OMIN + IF(ELEM.EQ.0)GO TO 30 +C CZY TO PARAMETR? + IF(ELEM.GT.7)GO TO 1050 +C NIE,MOZE TABLICA STATYCZNA? + IF(ELEM.EQ.5)GO TO 1060 +C ZATEM TABLICA DYNAMICZNA /ELEMENT TABLICY/ + CALL SINDEX + GO TO 30 + 1050 CALL SPARAM + GO TO 40 + 1060 CALL SINDXS + GO TO 40 +C +C--------------- CONST:BOOL,CHAR,INT,NONE,REAL,STRING ----- +C + 1100 CONTINUE + 1200 CONTINUE + 1300 CONTINUE + 1500 CONTINUE + 1600 ELEM=WB-10 + CALL SNEXT +C.....WSPOLNA AKCJA DLA WSZYSTKICH STALYCH,ROWNIEZ NONE + 1650 CALL SPUSH(1) + STACK(VALTOP-1)=0 + STACK(VALTOP-2)=WB + STACK(VALTOP-3)=0 + STACK(VALTOP-4)=CONSNR(ELEM) + STACK(VALTOP-5)=0 + GO TO 40 +C.....WYROZNIONY POCZATEK DLA NONE + 1400 ELEM=4 + WB=0 + GO TO 1650 +C +C +C--------------- COPY ---------------------------- +C NA CZUBKU STOSU JEST WARTOSC DO SKOPIOWANIA. +C + 1700 CALL SVALUE +C JESLI UNIWERSALNY-POMIN + IF(STACK(VALTOP).EQ.0)GO TO 40 +C ZBADAJ TYP. POMIN NONE. + ELEM=STACK(VALTOP-4) + IF( ELEM.EQ.NRNONE) GO TO 40 +C MOZE TO TABLICA? + IF(STACK(VALTOP-3).GT.0)GO TO 1750 +C NIE. CZY TYP PIERWOTNY? + DO 1730 I=1,6 + IF(CONSNR(I).EQ.ELEM)GO TO 1790 + 1730 CONTINUE +C.....ZATEM O.K. + 1750 ATS=TSTEMP(4) + CALL QUADR3(41,ATS,STACK(VALTOP-2)) + STACK(VALTOP)=2 + STACK(VALTOP-2)=ATS + GO TO 40 +C.....NIE REFERENCJA + 1790 ERROR=415 + GO TO 9900 +C +C--------------- DETACH -------------------------- +C + 1800 CALL QUADR1(187) + LSTEMP=TEMPNR + GO TO 40 +C +C--------------- DOT ------------------------------ +C + 1900 CALL SNEXT +C WB=IDENT + CALL SNEXT +C WB = NAZWA PO KROPCE + CALL SVALUE + IF(STACK(VALTOP).NE.0)GO TO 1910 +C UNIWERSALNY.IDENT ZASTAP PRZEZ UNIWERSALNY Z NAZWA PO KROPCE + STACK(VALTOP-1)=WB + GO TO 40 +C O.K. + 1910 I=STACK(VALTOP-4) +C I=KWALIFIKACJA WARTOSCI PRZED KROPKA + IND=MDOT(STACK(VALTOP-3),I,STACK(VALTOP-1),WB) + ATS=STACK(VALTOP-2) +C ATS=WARTOSC PRZED KROPKA + CALL SPOP +C DALEJ JAK DLA WIDOCZNEGO IDENTYFIKATORA + GO TO 2805 +C--------------- DOWNTO -------------------------- + 2000 CALL SFORTO(.FALSE.,FORSTP) + GO TO 40 +C POWROT DO ETYKIETY 40 +C--------------- SIGN ---------------------------- + 2100 CALL SVALUE + ELEM=STACK(VALTOP) + IDL=STACK(VALTOP-2) + IF(ELEM.EQ.0)GO TO 40 + IF(STACK(VALTOP-3).GT.0)GO TO 2110 + ATS= +1 + IF(STACK(VALTOP-4).EQ.NRINT)GO TO 2130 + IF(STACK(VALTOP-4).EQ.NRRE)GO TO 2150 +C ... NIEPOPRAWNY TYP ARGUMENTU SIGN + 2110 ERROR=604 + GO TO 9900 +C ... INTEGER. STALA ? + 2130 IF(ELEM.NE.1)GO TO 2160 + IF(IDL.LT.0) ATS= -1 + IF(IDL.EQ.0) ATS= 0 + GO TO 2170 +C ... REAL. STALA ? + 2150 IF(ELEM.NE.1)GO TO 2160 +cdsw&bc IF(STALER(IDL).LT. 0.0) ATS= -1 +cdsw&bc IF(STALER(IDL).EQ. 0.0) ATS= 0 +#if WSIZE == 4 + if(staler(idl) .lt. 0.0) ats= -1 + if(staler(idl) .eq. 0.0) ats= 0 +#else + n1 = idl*2-1 + m(1) = ipmem(n1) + m(2) = ipmem(n1+1) + if(y .lt. 0.0) ats= -1 + if(y .eq. 0.0) ats= 0 +#endif +c + GO TO 2170 +C ... GENERUJ KOD + 2160 ATS=TSTEMP(1) + CALL QUADR3(31,ATS,IDL) +C ZASTAP PRZEZ WARTOSC + STACK(VALTOP)=2 + 2170 STACK(VALTOP-1)=0 + STACK(VALTOP-2)=ATS + STACK(VALTOP-4)=NRINT + GO TO 40 +C--------------- ESAC ---------------------------- + 2200 CALL SESAC + GO TO 40 +C--------------- FIN ----------------------------- +C + 2300 CALL SEND + RETURN +C +C +C--------------- FIRSTINSTR ---------------------- +C +C JESLI TO FAZA WYLICZANIA STALYCH - ZAPAMIETAJ TO MIEJSCE I KONCZ. +C + 2400 IF(INICJA)GO TO 2450 + CALL SNEXT +C PIERWSZA INSTRUKCJA MODULU, WB=NUMER INSTRUKCJI + CALL QUADR1(179) + LINE=WB + GO TO 40 +C +C ... KONIEC WYLICZANIA STALYCH DLA TEGO MODULU + 2450 IPMEM(P+8)=IX(258) + IPMEM(P+9)=IX(257) + RETURN +C--------------- FOR END ------------------------- +C + 2500 CALL SFOREND + GO TO 30 +C POWROT DO ETYKIETY 30 +C--------------- FOR VARIABLE -------------------- +C +C PISZ : KONIEC BLOKU BAZOWEGO /BY UNIKNAC PONOWNEGO PRZYDZIALU +C TYCH SAMYCH ATRYBUTOW ROBOCZYCH W JEDNYM BLOKU/ + 2600 CALL QUADR1(176) +C ZAREZERWUJ 2 NUMERY DLA ATRYBUTOW ROBOCZYCH DLA PETLI FOR + TEMPNR=TEMPNR-6 + IF(FRSTTS.GE.LSTEMP)CALL SSTOVF +C +C + LSTEMP=TEMPNR +C +C +C ... ZMIENNA PROSTA? + IND=STACK(VALTOP) + IF(IND.EQ.0)GO TO 40 + ERROR=410 +C ="OCZEKIWANA ZMIENNA PROSTA" + IF(IND.NE.3 .OR. STACK(VALTOP-7).NE.0)GO TO 9900 +C TAK. INTEGER? + CALL SCHECK(411,NRINT) + LSTLSE=VALTOP + GO TO 40 +C--------------- FROM ---------------------------- +C + 2700 CALL SINDTYP + FORSTP=.FALSE. + GO TO 40 +C--------------- IDENTYFIKATOR ------------------- +C WB=IDENT , WN=NAZWA ZE SCANNERA + 2800 CALL SNEXT + IND=MIDENT(WB) + ATS=0 +C..........WSPOLNE ROZPOZNANIE I OBSLUGA DLA IDENTYFIKATORA PRZEZ KROPKE +C LUB WIDOCZNEGO. +C IND = ADRES ZEROWEGO SLOWA OPISU ROZPOZNANEGO IDENTYFIKATORA +C ATS= ATS WARTOSCI PRZED KROPKA /I=KWALIFIKACJA/ LUB ZERO +C + 2805 ELEM=SWHAT(IND) +C WLOZ NA STOS , WPISZ NAZWE , WEZ KOLEJNY SYMBOL + CALL SPUSH(ELEM) + STACK(VALTOP-1)=WB + CALL SNEXT +C FAZA WYLICZANIA STALYCH ? + IF(INICJA)GO TO 2850 +C NIE. +C JESLI TO "UNIWERSALNY"-NIC NIE ROB + IF(ELEM.EQ.0)GO TO 50 + 2807 STACK(VALTOP-6)=0 + STACK(VALTOP-7)=ATS + STACK(VALTOP-5)=0 +C NAZWA TYPU? + IF(ELEM.EQ.7)GO TO 2880 + IF(ELEM.GT.5)GO TO 2870 +C.....STALA,ZMIENNA,TABLICA STATYCZNA. WSTAW TYP. + STACK(VALTOP-4)=IPMEM(IND-3) +C STALA? + IF(ELEM.NE.1)GO TO 2815 +C....."STALA" + STACK(VALTOP-3)=0 + IF(.NOT.INICJA)STACK(VALTOP-2)=IPMEM(IND-1) +C WSTAWIONY TYP,WARTOSC STALEJ + GO TO 50 +C....."ZMIENNA","TABLICA STATYCZNA" + 2815 STACK(VALTOP-3)=IPMEM(IND-4) + STACK(VALTOP-2)=IND + IF(ATS.EQ.0)STACK(VALTOP-2)=TSINSE(IND,LOCAL) +C WSTAWIONY ATS +C.....TYPU FORMALNEGO? + ELEM=STACK(VALTOP-4) + 2820 ELEM=IAND(IPMEM(ELEM),15) +C ELEM=POLE T TYPU ZMIENNEJ + IF(ELEM.NE.6)GO TO 2830 +C A WIEC TYP FORMALNY. PRZEZ KROPKE? + IF(ATS.NE.0)GO TO 2825 +C.....PRZEZ DISPLAY + STACK(VALTOP-6)=OBJECT +C CZY TYP DOSTEPNY PRZEZ DISPLAY? + IF(MDISTP(IPMEM(IND-1),STACK(VALTOP-4),ELEM))GO TO 2823 +C TYP NIEDOSTEPNY PRZEZ DISPLAY,WSTAW SL ZMIENNEJ + STACK(VALTOP-5)= - IPMEM(IND-1) + GO TO 2830 +C TYP DOSTEPNY PRZEZ DISPLAY,WSTAW WARSTWE + 2823 STACK(VALTOP-5)=ELEM + GO TO 2830 +C.....PRZEZ KROPKE. TYP JEST LOKALNYM ATRYBUTEM? + 2825 STACK(VALTOP-5)= -1 + IF(MLOCTP(STACK(VALTOP-4),I))STACK(VALTOP-5)= +1 +C.....TYP JUZ WSTAWIONY + 2830 IF(STACK(VALTOP).EQ.3)GO TO 50 + IF(STACK(VALTOP).EQ.12)GO TO 2875 +C....."TABLICA STATYCZNA" + CONTINUE +C NA RAZIE B R A K + GO TO 50 +C +C ... W FAZIE WYLICZANIA STALYCH + 2850 IF(ELEM.LT.2)GO TO 2860 +C NIELEGALNY OBIEKT W WYRAZENIU DEFINIUJACYM STALA. + ERROR=429 + GO TO 9901 + 2860 IF(ELEM.EQ.0)GO TO 50 +C STALA DEFINIOWANA ? /TAK,JESLI WB = "LSE" / + IF(WB.NE.39)GO TO 2865 +C TAK. WSTAW DO SLOWA -2 ADRES OPISU STALEJ + STACK(VALTOP-2)=IND + GO TO 50 +C STALA W WYRAZENIU DEFINIUJACYM. WSTAW DO SLOWA -2 WARTOSC +C / DLA REAL - NUMER STALEJ / + 2865 STACK(VALTOP-2)=IPMEM(IND-1) +C CZY STALA MA JUZ OKRESLONA WARTOSC ? + IF(IPMEM(IND-3).NE.0)GO TO 2807 +C TYP = 0 /SLOWO -3/ OZNACZA,ZE STALA JESZCZE NIE MIALA OKRESLONEJ +C WARTOSCI + ERROR=430 + GO TO 9901 +C +C.....REKORD,KLASA,PROCEDURA,FUNKCJA,SYGNAL,OPERATOR. + 2870 ELEM=IPMEM(IND-3) + STACK(VALTOP-4)=IND + STACK(VALTOP-3)=0 + IDR=STACK(VALTOP)-7 +C DLA FUNKCJI ZBADAJ CZY TYP FORMALNY + GO TO (2872,2872,2872,2875,2820,2875,2890),IDR +C +C ... KLASA,REKORD . NEW ? + 2872 STACK(VALTOP-2)=0 +C - TYP STATYCZNY + IF(WB.EQ.40)GO TO 2873 +C LEWY NAWIAS? + IF(WB.NE.36)GO TO 50 +C BRAK NEW PRZED LEWYM NAWIASEM + CALL SERROR(423) + GO TO 2874 +C NEW + 2873 CALL SNEXT + 2874 CALL SCALLB + GO TO 50 +C ... PROCEDURA,SYGNAL, C.D. DLA FUNKCJI +C JESLI WB ROZNE OD "," LUB ")" - WYWOLAJ /INACZEJ-PODEJRZEWAJ PARAMETR/ + 2875 IF(WB.NE.10 .AND. WB.NE.54)GO TO 2874 + GO TO 50 +C....."NAZWA TYPU" /PARAMETR FORMALNY "TYPE"/ + 2880 STACK(VALTOP-3)=0 + STACK(VALTOP-4)=IND +C PRZEZ KROPKE? + IF(ATS.NE.0)GO TO 2885 +C PRZEZ DISPLAY + STACK(VALTOP-2)=TSINSE(IND,LOCAL) +C ZERO ARRAY OF,TYP FORMALNY,ATS TEGO TYPU + STACK(VALTOP-6)=OBJECT + GO TO 50 +C.....PARAMETR "TYPE" PRZEZ KROPKE +C ODCZYTAJ TYP + 2885 STACK(VALTOP-2)=TSTEMP(2) + CALL QUADR4(85,STACK(VALTOP-2),SMEMBER(VALTOP),IND) + GO TO 50 +C.....OPERATOR, JESLI WB ROZNE OD "(" - BLAD + 2890 ERROR=454 +C = NIELEGALNE WYSTAPIENIE NAZWY OPERATORA + IF(WB.NE.36)GO TO 9901 + GO TO 50 +C--------------- IF-FALSE , IF-TRUE ---------------- + 2900 CONTINUE + 3000 CALL SVALUE + IND=WB-29 +C IND= 1 DLA IF-TRUE , = 0 DLA IF-FALSE + CALL SNEXT +C NA CZUBKU WARTOSC TYPU BOOLEAN? + CALL SCHECK(407,NRBOOL) +C STALA? + IF(STACK(VALTOP).EQ.1)GO TO 3050 + CALL QUADR3(151+IND,STACK(VALTOP-2),WB) + GO TO 30 +C SKOK PRZY STALEJ WARTOSCI WYRAZENIA + 3050 IF(IND+STACK(VALTOP-2).NE.0) GOTO 30 +C ZATEM TRUE, IF TRUE FALSE, IF FALSE + CALL SPOP + GOTO 3350 +C +C------ INNER -------- +C LOKALNE WYSTAPIENIE +3100 IF (INNER.NE.0) CALL MERR(424+INNER,0) + INNER = 2 + CALL QUADR2(178,IPMEM(P+23)) +C ZAZNACZ: INSTRUKCJE PO INNER + IPMEM(P-7) = P + LSTEMP = TEMPNR + GOTO 40 +C +C------- INSTREND-------- +C +3200 CALL SNEXT + LINE= WB +CJF IF (LINE.EQ.ATLINE) CALL STOPAT(ATLINE) + CALL SNEXT +C JESLI BYLY BLEDY CZYSC STOS + IF (ERRFLG) GOTO 10 + IF (INICJA) GOTO 50 +C +C +C PRZY ZGASZONEJ OPCJI "OPTIMALIZATION" LUB "SYSPP" ZAKONCZ BLOK BAZOWY + IF(OPTOPT.AND.IPMEM(NBLSYS+4).EQ.0)GO TO 3250 + LSTEMP=TEMPNR + CALL QUADR1(176) +C +C PRZY WYLACZONEJ OPCJI "TRACE" WYPISZ UJEMNY NUMER + 3250 ELEM=LINE + IF(.NOT.OPTTRC)ELEM=-LINE + CALL QUADR2(177,ELEM) + GO TO 50 +C--------------- JUMP ----------------------------------- + 3300 CALL SNEXT + 3350 CALL QUADR2(182,WB) + LSTEMP=TEMPNR + GO TO 40 +C--------------- KILL ---------------------------- +C CZUBEK POWINIEN ZAWIERAC WARTOSC REFERENCYJNA +C + 3400 CALL SKILL + GO TO 30 +C +C--------------- LABEL ---------------------------- + 3500 CALL SNEXT +C WYPISZ ETYKIETE + CALL QUADR2(181,WB) + LSTEMP=TEMPNR + GO TO 40 +C--------------- LEFT PARANTHESIS ---------------- +C + 3600 IF(STACK(VALTOP).LT.8)CALL SVALUE + + GO TO 40 +C +C--------------- ---------------------------- + 3700 CONTINUE + GO TO 40 +C--------------- LOWINDEX ------------------------ +C NA CZUBKU POWINIEN BYC ELEMENT SPROWADZALNY DO WARTOSCI INTEGER + 3800 CALL SINDTYP + GO TO 40 +C--------------- LSE ----------------------------- +C NA CZUBKU POWINNA BYC LEWA STRONA PODSTAWIENIA: UNIWERSALNY, +C ZMIENNA,ELEM. TABLICY,TABLICA STATYCZNA LUB - DLA INICJALIZACJI- +C STALA DEFINIOWANA +C + 3900 LSTLSE=VALTOP + ELEM=STACK(VALTOP)+1 + IF(ELEM.GT.6)GO TO 3980 + GO TO(40,3910,3980,40,40,40),ELEM +C.....STALA. LEGALNE TYLKO PODCZAS INICJALIZACJI. + 3910 IF(INICJA)GO TO 40 +C.....BLAD. + 3980 ERROR=420 +C ZASTAP PRZEZ UNIWERSALNY I OBSLUZ OD NOWA + GO TO 9901 +C +C--------------- NEW ----------------------------- +C NA PEWNO BLAD: KLASA /REKORD/ SAMA "ZJADA" NEW +C + 4000 ERROR=421 + GO TO 9900 +C +C--------------- NEWARRAY ------------------------ +C + 4100 CALL SNEWARR + GO TO 30 +C +C--------------- NOT ----------------------------- +C + 4200 CALL SNOT + GO TO 50 +C +C--------------- OPERATION ----------------------- +C + 4300 CALL SNEXT +C WB=NUMER OPERACJI + CALL SARITH + GO TO 40 +C +C--------------- OPTION -------------------------- +C + 4400 CALL SOPTION + GO TO 40 +C +C--------------- OR ------------------------------ +C + 4500 CALL SBOOLEX(0) + GO TO 40 +C +C--------------- OTHERWISE ------------------------- +C + 4600 CALL SOTHER + GO TO 40 +C +C--------------- PREFBLOCK ------------------------- +C + 4700 CALL SNEXT + CALL SPUSH(10) + STACK(VALTOP-1)=0 + STACK(VALTOP-7)=0 + STACK(VALTOP-4)=IPMEM(WB) + CALL SNEXT + CALL SCALLB + GO TO 50 +C--------------- PRIMITIVE TYPE ------------------ +C + 4800 CALL SNEXT + CALL SPUSH(7) + STACK(VALTOP-1)=0 + STACK(VALTOP-2)=0 + STACK(VALTOP-3)=0 + STACK(VALTOP-4)=CONSNR(WB) + GO TO 40 +C +C--------------- QUA ----------------------------- +C + 4900 CALL SVALUE + CALL SNEXT + IF(STACK(VALTOP).EQ.0)GO TO 40 + TLDIM=STACK(VALTOP-3) + TLBAS=STACK(VALTOP-4) + IDL=STACK(VALTOP-1) + STACK(VALTOP-4)=MAQUAB(WB) + CALL QUADR3(149,STACK(VALTOP-2),STACK(VALTOP-4)) + GO TO 40 +C +C--------------- I-O-END ------------------------- +C +C WYSTAPILY ARGUMENTY ? + 5000 IF(FLARGS.LT.2)CALL MERR(444,0) + IF(FILE.NE.0)CALL SPOP + FILE=0 + FLARGS=0 + FLREADY=.FALSE. + FLMODF=1 + GO TO 40 +C +C--------------- RELATION ------------------------ +C + 5100 CALL SNEXT +C WB=NUMER RELACJI + CALL SRELAT + GO TO 40 +CBC added +C--------------- RESUME -------------------------- +C + 5200 call sresum + LSTEMP=TEMPNR + GO TO 30 +C +C--------------- RETURN -------------------------- +C + 5300 LSTEMP=TEMPNR + CALL SRETURN +cbc GO TO 40 + goto 50 +C +C--------------- RIGHT PARENTHESIS ------------- +C + 5400 IF(STACK(VLPREV).LT.8)GO TO 1000 +C KONIEC WYWOLANIA + CALL SPARAM + CALL SNEXT + CALL SCALLE + GO TO 50 +C +C--------------- START ------------------------- +C + 5500 CONTINUE + GO TO 40 +C +C--------------- STEP --------------------------- + 5600 CALL SINDTYP + FORSTP=.TRUE. +cdsw&bc +c check if constant step + if (stack(valtop) .ne. 1) goto 5601 +c yes, error if step < 0 + if (stack(valtop-2) .lt. 0) call serror(479) + goto 40 + + 5601 continue +c not constant +c generate code to check if step >= 0 + call quadr2(240, stack(valtop-2)) +c + GO TO 40 +C +C--------------- STOP -------------------------- +C + 5700 CONTINUE +cbc... + call quadr1(221) +c...bc + GO TO 40 +C +C--------------- THIS -------------------------- +C + 5800 CALL SNEXT +C WB=NAZWA PO 'THIS' +C WEZ Z DISPLAYA ADR.VIRTUALNY,WSTAW NA STOS WARTOSC + CALL SPUSH(2) + STACK(VALTOP-1)=WB + STACK(VALTOP-2)=TSTEMP(4) + STACK(VALTOP-4)=MTHIS(WB) + CALL QUADR3(15,STACK(VALTOP-2),STACK(VALTOP-4)) + STACK(VALTOP-3)=0 + STACK(VALTOP-5)=0 + GO TO 40 +C +C--------------- TO ---------------------------- + 5900 CALL SFORTO(.TRUE.,FORSTP) + GO TO 40 +C +C--------------- WAIT --------------------------- +C + 6000 CONTINUE + GO TO 40 +C +C--------------- WRITE --------------------------- +C6100 CALL SWRITE +cdsw 6100 CALL SWRITE(*30,*40) +C POWROT DO ETYKIETY 30 LUB 40 +cdsw ----------------------------- + 6100 call swrite(whdsw) + go to(30,40),whdsw +cdsw ----------------------------- +C +C--------------- WRITELN ------------------------- + 6200 CALL SFLADR + FLARGS=2 + CALL QUADR2(132,58+FLMODF) + GO TO 40 +C +C--------------- BOUNDS ---------------------------- +C + 6300 CONTINUE + GO TO 40 +C +C--------------- LOWER , UPPER ---------------------- +C +C CZUBEK STOSU ZAWIERA ADRES TABLICY + 6400 CONTINUE + 6500 CALL SVALUE +C WARTOSC TABLICOWA? + ERROR=416 + IF(STACK(VALTOP-3).EQ.0)GO TO 9900 +C O.K. + RESULT=TSTEMP(1) + CALL QUADR3(2*WB-95+OPTMEM,RESULT,STACK(VALTOP-2)) +C ZASTAP PRZEZ WARTOSC INTEGER + CALL SRESLT1(NRINT) + GO TO 40 +C +C--------------- LOCK , UNLOCK --------------------- +C + 6600 CONTINUE + 6700 IDL=WB-33 +C = NUMER PROCEDURY STANDARDOWEJ LOCK,UNLOCK + 6710 CALL SVARADR +C PRZEKAZ ADRES ZMIENNEJ + CALL QUADR4(145,RESULT,IDL,0) +C WYWOLAJ PROCEDURE + CALL QUADR2(132,IDL) +C ZBADAJ TYP : SEMAPHORE ? + IDR=STACK(VALTOP-4) + IF(STACK(VALTOP-3).GT.0.OR.IAND(IPMEM(IDR),15).NE.9) + X CALL SERROR(418) +C DLA LOCK,UNLOCK TO JUZ WSZYSTKO + IF(WB.NE.68)GO TO 30 +C ... TEST&SET . ODCZYTAJ WARTOSC + REsULT=TSTEMP(1) + CALL QUADR4(23,RESULT,IDL,1) +C ZASTAP PRZEZ WARTOSC + CALL SRESLT1(NRBOOL) + GO TO 40 +C--------------- TEST&SET -------------------------- + 6800 IDL=38 + GO TO 6710 +C +C--------------- WIND , TERMINATE ------------------ +C +C NIELEGALNE POZA HANDLEREM + 6900 CONTINUE + 7000 IF(UNIT.EQ.2)GO TO 7050 + CALL MERR(427,0) + GO TO 40 +C O.K. + 7050 CALL QUADR1(103+WB) + GO TO 40 +C +C--------------- RAISE ----------------------------- +C +C NA PEWNO BLAD: SYGNAL SAM "ZJADA" RAISE. + 7100 CALL SERROR(449) + GO TO 30 +C +C--------------- LAST-WILL ------------------------- +C +C ZAKONCZ INSTRUKCJE MODULU + 7200 CALL SFIN + LSTWILL=.TRUE. +C INNER BEDZIE NIELEGALNY + INNER=4 +C WYPISZ ETYKIETE LAST-WILL + CALL SLWILL + GO TO 40 +C +C--------------- READ ---------------------------- +cdsw 7300 CALL SREAD(*30,*40) +cdsw ------------------------------- + 7300 call sread(whdsw) + go to(30,40),whdsw +cdsw -------------------------------- +C POWROT DO ETYKIETY 30 LUB 40 +C--------------- READLN -------------------------- + 7400 CALL SFLADR + FLARGS=2 + CALL QUADR2(132,42-FLMODF) + GO TO 40 +C +C--------------- PUT ----------------------------- +C7500 CALL SPUT +cdsw 7500 CALL SPUT(*30,*40) +C POWROT DO ETYKIETY 30 LUB 40 +cdsw --------------------------- + 7500 call sput(whdsw) + go to (30,40),whdsw +cdsw --------------------------- +C +C--------------- GET ----------------------------- +C7600 CALL SGET +cdsw 7600 CALL SGET(*30,*40) +cdsw -------------------------- + 7600 call sget(whdsw) + go to (30,40),whdsw +cdsw --------------------------- +C POWROT DO ETYKIETY 30 LUB 40 +C +C--------------- OPEN2 --------------------------- + 7800 CALL SVALUE + ATS=SVATS(VALTOP) +C CZUBEK POWINIEN ZAWIERAC NAZWE PLIKU (arrayof char) +cbc CALL SCHECK(414,NRTEXT) + if (stack(valtop-3) .ne. 1) goto 7801 + n = stack(valtop-4) + if (n .ne. nrchr) goto 7801 + +cfile CALL QUADR4(145,ATS,73,1) +cfile ------------------------- + call quadr4(145,ats,73,2) +cfile -------------------------- + CALL SPOP +C DALEJ JAK DLA OPEN1 +C +C--------------- OPEN1 --------------------------- +cfile 7700 N=STACK(VALTOP) +cfile ----------- added ------------------------ +c wspolna obsluga +c nowa postac OPEN: OPEN(f,T,nazwa) - proc.stand. 73 +c OPEN(f,T) - proc.stand. 72 +c T okresla rodzaj operacji. Dozwolone: integer, real ,boolean, char, text +c zmiana w interpreterze dla procedur standardowych 72 i 73: +c parametr 0: output, adres nowego obiektu typu file +c parametr 1: rodzaj operdcji () zalezy do T): +c 1-text, 2-char, 3-int, 4-real, 5-direct +c parametr 2: nazwa ( tylko dla 73) +c +c stos zawiera na czubku T, ponizej F +c +7700 continue +c nazwa typu pierwotnego? + if(stack(valtop).ne.7) go to 7702 +c legalne nazwy typu: text, char ,integer, real + n = stack(valtop-4) +c n - ident. typu + if(n.eq.nrtext) go to 7701 + if(n.eq.nrint) go to 7705 + if(n.eq.nrre) go to 7706 + if(n.eq.nrchr) go to 7708 +cbc + if (n .eq. -17) goto 7709 +c error - nie nazwa typu lub nielegalny typ +7702 call serror(419) + go to 7715 +c nrtext + 7701 n = 1 + go to 7710 +c nrint +7705 n = 3 + go to 7710 +c nrreal +7706 n = 4 + go to 7710 +c nrchr +7708 n = 2 + goto 7710 +cbc +7709 n = 5 +7710 n = sconst(n) + call quadr4(145,n,wb-5,1) +7715 call spop +c + n = stack(valtop) +cfile ------------------------------------- +C ZMIENNA ? + IF(N.GT.2 .AND. N.LT.6)GO TO 7720 + CALL SERROR(420) + GO TO 30 +C TYPU 'FILE' + 7720 CALL SFTEST + CALL QUADR2(132,WB-5) + ATS=TSTEMP(4) + CALL QUADR4(23,ATS,WB-5,0) + CALL SSTORE(VALTOP,ATS) + GO TO 30 +7801 call serror(416) + goto 30 +C +C--------------- EOF0 ---------------------------- +C +C = EOF(INPUT) + 7900 CALL SEOF0(39) + GOTO 40 +C +C--------------- EOF1 ---------------------------- + 8000 CALL SEOF(40) + GO TO 40 +C WRACA BEZPOSREDNIO DO ETYKIETY 40 +C +C--------------- PAR. INPUT ---------------------- +C UNIMPLEMENTED + 8100 CONTINUE +C PARAMETR INPUT WSTAWKI W ASSEMBLERZE +C8100 CALL SNEXT +C WB = NUMER REJESTRU. C.D. DLA IN-OUT +C8150 CALL SVALUE +C WPISZ NUMER REJESTRU DO SLOWA -1 +C STACK(VALTOP-1)=SREGSTR(WB) +C ICOUNT=ICOUNT+1 +C GO TO 40 +C +C--------------- PAR. OUTPUT --------------------- +C UNIMPLEMENTED + 8200 CONTINUE +C PARAMETR OUTPUT WSTAWKI W ASSEMBLERZE +C8200 CALL SOUTPAR +C ZDEJMIJ ZE STOSU +C GO TO 30 +C +C--------------- PAR. INOUT ---------------------- +C UNIMPLEMENTED + 8300 CONTINUE +C PARAMETR IN-OUT WSTAWKI W ASSEMBLERZE +C NAJPIERW OBSLUZ JAK PAR.OUTPUT, POTEM JAK PAR.INPUT +C8300 CALL SOUTPAR +C GO TO 8150 +C +C--------------- ASSEMBLER ----------------------- +C UNIMPLEMENTED + 8400 CONTINUE +C WSTAWIANY TEKST W ASSEMBLERZE +C8400 CALL SBODY +C GO TO 40 +C +C--------------- EOLN0 --------------------------- +C + 8500 CALL SEOF0(74) + GO TO 40 +C +C--------------- EOLN1 --------------------------- +C + 8600 CALL SEOF(75) + GO TO 40 +C +C-------- THIS-COROUTINE ---------------------------- +C + 8700 N=NRCOR +C WLOZ NA STOS 'WARTOSC' + 8720 CALL SPUSH(2) + ATS=TSTEMP(4) + STACK(VALTOP-1)=0 + STACK(VALTOP-2)=ATS + STACK(VALTOP-3)=0 + STACK(VALTOP-4)=N + STACK(VALTOP-5)=0 +C ODCZYTAJ WARTOSC : FUNKCJA STANDARDOWA 76,77 + CALL QUADR2(132,WB-11) + CALL QUADR4(23,ATS,WB-11,0) + GO TO 40 +C +C--------- THIS-PROCESS ---------------------------- +C + 8800 N=NRPROC + GO TO 8720 +C +c--------- putrec ----------------------------------- +c + 8900 call spgrec(83) + goto 30 +c +c--------- getrec ----------------------------------- + 9000 call spgrec(82) + goto 30 +c +cbc added concurrent statements +c--------- enable ----------------------------------- + 9100 call sconc(223) + goto 40 +c +c--------- disable ---------------------------------- + 9200 call sconc(224) + goto 40 +c +c--------- accept ----------------------------------- + 9300 call sconc(225) + goto 40 +c--------- procedure list end ----------------------- +c error - skip and read next symbol + 9400 goto 40 +c +C------------------------------------------------------ +C +C..........WSPOLNA OBSLUGA BLEDOW. ERROR=NUMER BLEDU. +C ZASTAPIENIE CZUBKA STOSU PRZEZ UNIWERSALNY Z ZACHOWANIEM NAZWY. +C WRACA NA POCZATEK PETLI. + 9900 CALL SNEXT + 9901 CALL SERROR(ERROR) + ELEM=STACK(VALTOP-1) + CALL SPOP + CALL SPUSH(0) + STACK(VALTOP-1)=ELEM + GO TO 50 + END + SUBROUTINE SINIT +C------------------------------------------------------ +C +C POMOCNICZA. INICJALIZACJA SLOWNIKA ATRYBUTOW, +C ZMIENNYCH UNIT,INNER,LSTWILL +C NIE JEST WOLANA W FAZIE WYLICZANIA STALYCH. +C +C DLA KLAS WSTAWIA DO SLOWA +1 ZERO. +C JESLI MODUL MA PREFIKS,WSTAWIA DO SLOWA +1 PREFIKSU 1. +C +C ##### OUTPUT CODE : 184 . +C +C +#include "stos.h" +#include "blank.h" +C + INTEGER AUX0(8),AUX(7) + EQUIVALENCE (AUX0(2),AUX(1)) + DATA AUX0/1,3,5,5,4,4,3,2/ +C = RODZAJ MODULU W ZALEZNOSCI OD POLA "S" ZEROWEGO SLOWA +C +cdsw DATA STCKAG,STCKA0,STCKAP /0,8,8,8,8,8,10,4,8,8,8,8,8,8,8,8/ +cdsw X ,APETYT /1,2,3,2/ +C +C +C.....JAKI TO MODUL ? + LSTWILL=.FALSE. + INNER=1 + N=IPMEM(P) +C SPRAWDZ POLE "S" : BITY 5..7 + UNIT=IAND(ISHFT(N,-8),7) + UNIT=AUX(UNIT) +C MOZE KLASA ? /JESLI POLE "T",BITY 12..15, <> 1 / + IF(IAND(N,15).EQ.1)GO TO 100 +C KLASA + UNIT=6 + INNER=0 + 100 CONTINUE +C.....ZAZNACZ : JESZCZE NIE UZYWANY JAKO PREFIKS + IPMEM(P+1)=0 + IF(UNIT.LT.3)GO TO 200 +C JESLI MA PREFIKS - ZAZNACZ DLA PREFIKSU,ZE UZYWANY + IDL=IPMEM(P+21) + IF(IDL.NE.0)IPMEM(IDL+1)=1 +C.....WYPISZ : POCZATEK MODULU + 200 CALL QUADR2(184,P) + RETURN + END + + + SUBROUTINE SNEXT +C----------------------------------------------------------------------------- +C +C DOSTARCZA KOLEJNEGO SYMBOLU KODU POSREDNIEGO WYGENEROWANEGO +C PRZEZ PARSER. SYMBOL TEN WPISUJE NA WB. +C +C CZYTA ZE STRUMIENIA "INP" , OPISANEGO W BUFORZE IBUF3 ,DO TABLICY IX . +C +#include "stos.h" +#include "blank.h" +C + COMMON/TEST/TESTC,TESTS,TESTH + LOGICAL TESTC,TESTS,TESTH +C +C + INTEGER CURRENT +C = INDEKS W BUFORZE IX OSTATNIO WCZYTANEGO SYMBOLU + EQUIVALENCE (IX(257),CURRENT) + INTEGER RECORD +C = NUMER OSTATNIO WCZYTANEGO REKORDU + EQUIVALENCE (IX(258),RECORD) + COMMON/STREAM/ ERRFLG,LINE,IBUF2(265),IBUF3(7),JUNK(260) + LOGICAL ERRFLG +C.....OSTATNI W REKORDZIE? + IF(CURRENT.EQ.255)GO TO 200 +C NIE. + CURRENT=CURRENT+1 + 100 WB=IX(CURRENT) +C +C +C1000 FORMAT(' NEXT, WB =',I6) +C +C + RETURN +C.....OSTATNI. WCZYTAJ KOLEJNY REKORD + 200 RECORD=IX(256) +C SLOWO 256 ZAWIERA NUMER KOLEJNEGO REKORDU + CALL SEEK(IBUF3,RECORD) + CALL GET(IBUF3,IX) + CURRENT=1 + GO TO 100 + END + + + SUBROUTINE SATTACH +C------------------------------------------------------ +C +C NA CZUBKU JEST ARGUMENT ATTACH. BADA TYP,GENERUJE KOD, +C ZDEJMUJE ZE STOSU. +C +C ##### OUTPUT CODE : 188 . +C +C ##### DETECTED ERROR(S) : 477 +C +#include "stos.h" +#include "option.h" +#include "blank.h" +C +cdsw&ail + common /stacks/ btsins, btstem +C + INTEGER ELEM +C......... + CALL SVALUE + IF(STACK(VALTOP).EQ.0)RETURN + IF(STACK(VALTOP-3).GT.0)GO TO 500 + ELEM=STACK(VALTOP-4) + ELEM=IAND(IPMEM(ELEM),15) + IF(ELEM.GT.7 .AND. ELEM.LT.13 .OR. ELEM.EQ.2)GO TO 500 + ELEM=STACK(VALTOP-2) +C ATTACH( NONE ) ? +cdsw&ail IF(STACK(VALTOP).EQ.1)ELEM=LMEM-3 + if (stack(valtop).eq.1) elem = btstem-3 +C = ATS NONE + CALL QUADR2(188,ELEM) + RETURN +C NIEPOPRAWNY TYP ARGUMENTU ATTACH + 500 CALL SERROR(477) + RETURN + END + + SUBROUTINE SCASE +C-------------------------------------------------------------------------- +C +C OBSLUGUJE POCZATEK INSTRUKCJI "CASE". +C CZUBEK STOSU ZAWIERA WARTOSC WYRAZENIA CASE,NASTEPNY SYMBOL +C WEJSCIOWY JEST NUMEREM ETYKIETY BAZOWEJ. +C WKLADA NA STOS W TABLICY LAB OPIS NOWEJ INSTRUKCJI CASE, +C PRZY CZYM : JESLI ZAGNIEZDZENIE = 4 , WYSYLA OPIS POPRZEDNICH +C 3 CASE-OW NA DYSK JAKO REKORD O NUMERZE IOP(2),USTAWIAJAC OVER=6, +C JESLI JEDNAK ZAGNIEZDZENIE > 6 , ZWIEKSZA JEDYNIE LICZNIK NADMIAROWYCH +C ZAGNIEZDZEN. +C +C OGRANICZENIA : ZAGNIEZDZENIE MUSI BYC < 7 , +C ROZNICA MIEDZY NAJWIEKSZA A NAJMNIEJSZA ETYKIETA < 160 . +C +C GENERUJE : +C < CASE , ATS WYRAZENIA , ETYKIETA BAZOWA -1 , OPTCSC+OPTCSF > +C +C +C ##### OUTPUT CODE : 189 . +C +C ##### DETECTED ERROR(S) : 402 , 405 . +C +C +#include "stos.h" +#include "option.h" +#include "blank.h" +C + COMMON/STREAM/ERRFLG,LINE,IBUF2(265),IBUF3(7),JUNK(260) + LOGICAL ERRFLG +C IBUF3 - OPIS STRUMIENIA Z WCZYTYWANYM I PRODUKOWANYM KODEM POSREDNIM +C +C + COMMON/CASE/DEEP,OVER + INTEGER LAB(5000) + EQUIVALENCE(LAB(1),IPMEM(1)) +C +cdsw DATA OVER/0/ +#if WSIZE == 4 + DATA MAXINTEGER,MININTEGER / x'7FFFFFFF' , x'80000000' / +#else + DATA MAXINTEGER,MININTEGER / x'7fff', -x'7fff' / +#endif +C +C LAB ZAWIERA OPISY ZAGNIEZDZONYCH INSTRUKCJI CASE. +C WYKORZYSTYWANYCH JEST 256 SLOW W TABLICY IPMEM : +C OD LMEM-515 DO LMEM-260 . +C POSTAC OPISU : +C SLOWO 0 : TYP WYRAZENIA CASE +C +1 : NUMER ETYKIETY BAZOWEJ +C +2 : MINIMALNA WARTOSC ETYKIETY +C +3 : MAKSYMALNA WARTOSC ETYKIETY +C +4 : LICZBA ETYKIET +C +5..+84 : 160 BAJTOW NA WZGLEDNY NUMER ETYKIETY +C OPIS BIEZACEJ INSTRUKCJI CASE WSKAZANY JEST PRZEZ ZMIENNA DEEP +C PRZYJMUJACA WARTOSCI : LMEM-600 PRZY BRAKU "CASE", +C LMEM-515 PRZY ZAGNIEZDZENIU = 1 +C LMEM-430 PRZY ZAGNIEZDZENIU = 2 +C LMEM-345 PRZY ZAGNIEZDZENIU = 3 +C LMEM-260 PRZY PRZEPELNIENIU +C PRZY ZAGNIEZDZENIU 4..6 OPIS PIERWSZYCH 3 CASE-OW JEST WYSYLANY +C NA DYSK JAKO REKORD O NUMERZE IOP(2), OVER PRZYJMUJE WTEDY WARTOSC 6. +C PRZY ZAGNIEZDZENIACH > 6 UTRZYMYWANA JEST WARTOSC DEEP=LMEM-260 , +C OPISY NOWYCH CASE-OW SA JEDYNIE ZLICZANE NA ZMIENNEJ OVER / 7,8,.../. +C LAB(LMEM-260) = NRUNIV I JEST WYKORZYSTYWANE DLA UNIKNIECIA SYGNALIZACJI +C NIEZGODNOSCI TYPOW ETYKIET PRZY ZBYT ZAGNIEZDZONYCH CASE-ACH. +C DLA ETYKIETY O WARTOSCI N DO BAJTU O NUMERZE /NUMERACJA 0..159/ +C ( N MODE 160 ) WSTAWIANA JEST ROZNICA MIEDZY ODPOWIADAJACYM +C JEJ NUMEREM ETYKIETY Z PARSERA A ETYKIETA BAZOWA. +C +C +C + CALL SVALUE + CALL SNEXT +C TERAZ WB = NUMER ETYKIETY BAZOWEJ + IF(STACK(VALTOP).EQ.0)GO TO 150 +C ... ZBADAJ TYP + IF(STACK(VALTOP-3).GT.0)GO TO 100 + IF(STACK(VALTOP-4).EQ.NRRE)CALL SVINT(VALTOP) + ELEM=STACK(VALTOP-4) +C = TYP WYRAZENIA CASE /PO EWENT. KONWERSJI REAL->INTEGER / + IF(ELEM.EQ.NRINT .OR. ELEM.EQ.NRCHR)GO TO 200 +C NIELEGALNY TYP WYRAZENIA CASE + 100 CALL SERROR(405) + 150 ELEM=NRUNIV +C.....DODAJ NOWY OPIS DO STOSU INSTRUKCJI CASE + 200 DEEP=DEEP+85 + IF(DEEP.LT.LMEM-260)GO TO 500 +C PELNY STOS. BUFOR NA DYSKU JUZ UZYTY ? + IF(OVER.GT.0)GO TO 1000 +C JESZCZE NIE. + OVER=6 + DEEP=LMEM-515 + CALL SEEK(IBUF3,IOP(2)) + CALL PUT(IBUF3,LAB(DEEP)) +C +C.....WSTAW OPIS + 500 LAB(DEEP)=ELEM + LAB(DEEP+1)=WB + LAB(DEEP+2)=MAXINTEGER + LAB(DEEP+3)=MININTEGER + LAB(DEEP+4)=0 +C JAKO MINIMALNA I MAKSYMALNA ETYKIETA POCZATKOWO NAJWIEKSZA I NAJMNIEJSZA +C LICZBA ---> POTEM KONIECZNE JEST POROWNANIE KAZDEJ ETYKIETY ZAROWNO +C Z MINIMALNA JAK I MAKSYMALNA. + DO 600 I=5,84 + N=DEEP+I + 600 LAB(N)=0 +C BAJT ROWNY ZERO OZNACZA, ZE NIE WYSTAPILA ETYKIETA O WARTOSCI +C WYZNACZAJACEJ TEN BAJT. +C +C ... JESLI STALA - WSTAW + ELEM=STACK(VALTOP-2) + IF(STACK(VALTOP).EQ.1)ELEM=SCONST(ELEM) +C ... GENERUJ SKOK DO MIEJSCA WYBRANIA WLASCIWEJ INSTRUKCJI + CALL QUADR4(189,ELEM,WB-1,OPTCSC+OPTCSF) + RETURN +C.....PRZEPELNIENIE : ZAGNIEZDZENIE PRZEKRACZA 6 . +C NIE SYGNALIZUJ BLEDU DLA DALSZYCH ZAGNIEZDZEN + 1000 IF(OVER.EQ.6)CALL MERR(402,0) + OVER=OVER+1 + DEEP=LMEM-260 + LAB(DEEP)=NRUNIV + RETURN + END + SUBROUTINE SCSLAB +C------------------------------------------------------------------------- +C +C OBSLUGUJE ETYKIETE DLA INSTRUKCJI CASE. +C CZUBEK STOSU POWINIEN ZAWIERAC WARTOSC ETYKIETY,NASTEPNY SYMBOL +C TO NUMER ETYKIETY WYGENEROWANEJ PRZEZ PARSER. +C PROCEDURA SPRAWDZA,CZY CZUBEK STOSU ZAWIERA STALA TYPU ZGODNEGO +C Z TYPEM WYRAZENIA CASE I CZY WARTOSC TA JUZ NIE WYSTAPILA +C LUB CZY ROZNICA MIEDZY MAKS. I MIN. ETYKIETA < 160. +C WYZNACZA NOWA WARTOSC ETYKIETY MAKS. I MIN. ORAZ DO BAJTU +C WYZNACZONEGO PRZEZ WARTOSC ETYKIETY WSTAWIA ROZNICE MIEDZY +C NUMEREM ODPOWIADAJACEJ ETYKIETY A ETYKIETA BAZOWA. +C ZWIEKSZA LICZNIK ETYKIET. +C W PRZYPADKU, GDY ROZPIETOSC ETYKIET PRZEKRACZA 160,ZMIENIA +C ETYKIETE BAZOWA NA -1 /DLA UNIKNIECIA DALSZEJ SYGNALIZACJI +C TEGO BLEDU/. +C +C +C ##### DETECTED ERROR(S) : 401 , 403 , 404 , 406 . +C +C +#include "stos.h" +#include "blank.h" +C + COMMON/CASE/DEEP,OVER + INTEGER LAB(5000) + EQUIVALENCE(LAB(1),IPMEM(1)) +C +C +C TRICK FOR HAVING 2 RIGHTMOST BYTES ADDRESSABLE +cdsw INTEGER BYTES +cdsw BYTE BYTE(4) +cdsw EQUIVALENCE ( BYTES , BYTE(1) ) +C +C +C + CALL SNEXT +C WB = NUMER ETYKIETY Z PARSERA. SPRAWDZ, CZY NA STOSIE JEST STALA + N=STACK(VALTOP) + IF(N.EQ.0)RETURN + IF(N.EQ.1)GO TO 100 +C ... JAKO ETYKIETA W "CASE" WYSTAPIL OBIEKT ROZNY OD STALEJ + CALL SERROR(401) + RETURN +C +C.....ZBADAJ ZGODNOSC TYPOW /JESLI NIE BYLO PRZEPELNIENIA/ + 100 IF(STACK(VALTOP-4).EQ.LAB(DEEP))GO TO 200 +C NIEZGODNOSC TYPOW ETYKIETY I WYRAZENIA "CASE" + IF(LAB(DEEP).NE.NRUNIV)CALL SERROR(406) + RETURN +C +C.....USTAL NOWE WARTOSCI ETYKIET : MINIMALNA I MAKSYMALNA. +C /UWAGA: ZE WZGLEDU NA INICJALIZACJE KONIECZNE OBA POROWNANIA/ + 200 N=STACK(VALTOP-2) + IF(N.LT.LAB(DEEP+2))LAB(DEEP+2)=N + IF(N.GT.LAB(DEEP+3))LAB(DEEP+3)=N + IF(LAB(DEEP+3)-LAB(DEEP+2).LT.160)GO TO 300 +C ROZPIETOSC WARTOSCI ETYKIET PRZEKRACZA 160 + IF(LAB(DEEP+1).EQ.-1)RETURN + CALL SERROR(403) + LAB(DEEP+1)=-1 + RETURN +C.....WYZNACZ NUMER BAJTU + 300 N=MOD(N,160) + IF(N.LT.0)N=N+160 + L=N/2+DEEP+5 +C = NUMER SLOWA W LAB + m = lab(l) +C = WARTOSC TEGO SLOWA + WB=WB-LAB(DEEP+1) +C ZWIEKSZ LICZNIK ETYKIET + LAB(DEEP+4)=LAB(DEEP+4)+1 +C PARZYSTY BAJT ? + IF(IAND(N,1).EQ.0)GO TO 500 +C ... NIEPARZYSTY, PRAWY BAJT. ETYKIETA JUZ WYSTAPILA ? + if(iand(m,x'00ff').eq.0) go to 400 +C ... POWTORNE WYSTAPIENIE TEJ SAMEJ ETYKIETY + 350 CALL SERROR(404) + RETURN +C WSTAW ROZNICE : NUMER ETYKIETY - ETYKIETA BAZOWA + 400 lab(l) = ior(m,wb) + RETURN +C ... PARZYSTY, LEWY BAJT + 500 if(iand(ishft(m,-8),x'00ff').ne.0) go to 350 + lab(l) = ior(ishft(wb,8),m) + return + END + SUBROUTINE SOTHER +C-------------------------------------------------------------------------- +C +C WOLANA PO WYSTAPIENIU "OTHERWISE" W INSTRUKCJI "CASE" . +C WYPISUJE ETYKIETY /POPRZEZ SCSOUT/ I ZAZNACZA TO POPRZEZ ZMIANE +C SLOWA 0 OPISU CASE NA NRUNIV. +C +#include "stos.h" +#include "blank.h" +C + COMMON/CASE/DEEP,OVER + INTEGER LAB(5000) + EQUIVALENCE(LAB(1),IPMEM(1)) +C +C + IF(LAB(DEEP).EQ.NRUNIV)RETURN +C WYPISZ ETYKIETY I ZAZNACZ TO + CALL SCSOUT + LAB(DEEP)=NRUNIV + RETURN + END + SUBROUTINE SCSOUT +C---------------------------------------------------------------------------- +C +C +C WOLANA : PRZED "OTHERWISE" /JESLI WYSTAPILO/ LUB PRZY "ESAC" . +C +C WYPISUJE ETYKIETY DLA "CASE". +C POSTAC : "ESAC" / =190 / +C LICZBA ETYKIET +C NUMER ETYKIETY BAZOWEJ +C WARTOSC ETYKIETY MINIMALNEJ +C DLA KAZDEJ ETYKIETY SLOWO ZAWIERAJACE : +C LEWY BAJT = ETYKIETA - ET.MINIMALNA +C PRAWY BAJT = ODLEGLOSC OD ETYKIETY BAZOWEJ +C - W KOLEJNOSCI OD ETYKIETY MINIMALNEJ DO MAKSYMALNEJ. +C +C NA KONCU DOPISUJE ETYKIETE DLA "OTHERWISE" /BAZOWA/ ,NIEZALEZNIE +C OD TEGO,CZY "OTHERWISE" WYSTAPILO. +C +C +C ##### OUTPUT CODE : 181 , 190 . +C +#include "stos.h" +#include "blank.h" +C + COMMON/STREAM/ ERRFLG,LINE,IBUF2(265),IBUF3(7),JUNK(260) + LOGICAL ERRFLG +C + COMMON/CASE/DEEP,OVER + INTEGER LAB(5000) + EQUIVALENCE(LAB(1),IPMEM(1)) +C +C TRICK FOR HAVING 2 RIGHTMOST BYTES ADDRESSABLE +cdsw INTEGER BYTES,OBYTES +cdsw BYTE BYTE(4),OBYTE(4) +cdsw EQUIVALENCE ( BYTES , BYTE(1) ) , ( OBYTES , OBYTE(1) ) +C + INTEGER N,NR,DIFF,L,BOUND +C +C + IF(ERRFLG)RETURN + N=LAB(DEEP+2) +C = ETYKIETA MINIMALNA + NR=LAB(DEEP+4) +C = LICZBA ETYKIET +C WYPISZ "ESAC",LICZBA ETYKIET,ETYKIETA BAZOWA I MINIMALNA + CALL QUADR4(190,NR,LAB(DEEP+1),N) +C +C.....WYPISZ DLA KAZDEJ ETYKIETY 2 BAJTY : +C LEWY = ET. - ET.MIN. , PRAWY = NUMER - ETYKIETA BAZOWA +C +C DALEJ : +C DALEJ : +C DIFF = BIEZACA ETYKIETA - ET.MINIMALNA +C L = NUMER SLOWA DLA KOLEJNEJ ETYKIETY +C K = WARTOSC SLOWA +C NR = LICZBA ETYKIET DO WYPISANIA +C BOUND = NUMER PIERWSZEGO SLOWA ZA OPISEM "CASE" +C + BOUND=DEEP+85 + N=MOD(N,160) + IF(N.LT.0)N=N+160 +C = NUMER BAJTU DLA ETYKIETY MINIMALNEJ , 0..159 + DIFF=-1 + L=DEEP+5+N/2 +C = NUMER SLOWA +cdsw OBYTES=0 + BYTES=LAB(L) +C PARZYSTA ? + IF(IAND(N,1).NE.0)GO TO 300 +C ... PARZYSTY,LEWY BAJT + 200 DIFF=DIFF+1 +C WEZ LEWY BAJT + byte = iand(ishft(bytes,-8),X'00ff') + if(byte.eq.0) go to 300 +C WYPISZ PARE DLA TEJ ETYKIETY + call quadr1(ior(byte,ishft(diff,8))) + NR=NR-1 + IF(NR.EQ.0)GO TO 1000 +C ... NIEPARZYSTY,PRAWY BAJT + 300 DIFF=DIFF+1 +C WEZ PRAWY BAJT + byte = iand(bytes,X'00ff') + if(byte.eq.0) go to 400 +C WYPISZ PARE DLA TEJ ETYKIETY + call quadr1(ior(ishft(diff,8),byte)) + NR=NR-1 + IF(NR.EQ.0)GO TO 1000 +C ... ZWIEKSZ NUMER SLOWA/ ZWAZAJAC NA GRANICE / I WCZYTAJ TO SLOWO + 400 L=L+1 + IF(L.EQ.BOUND)L=L-80 + BYTES=LAB(L) + GO TO 200 +C.....WYPISZ ETYKIETE DLA "OTHERWISE" + 1000 CALL QUADR2(181,LAB(DEEP+1)) + RETURN + END + SUBROUTINE SESAC +C---------------------------------------------------------------------------- +C +C OBSLUGUJE ZAKONCZENIE INSTRUKCJI "CASE". +C OBNIZA STOS INSTRUKCJI CASE. +C JESLI NIE WYSTAPILO "OTHERWISE" I NIE BYLO PRZEPELNIENIA +C WYPISUJE ETYKIETY /PRZEZ SCSOUT/ +C +#include "stos.h" +#include "blank.h" +C + COMMON/STREAM/ERRFLG,LINE,IBUF2(265),IBUF3(7),JUNK(260) + LOGICAL ERRFLG +C IBUF3 - OPIS STRUMIENIA Z WCZYTYWANYM I PRODUKOWANYM KODEM POSREDNIM +C +C + COMMON/CASE/DEEP,OVER + INTEGER LAB(5000) + EQUIVALENCE(LAB(1),IPMEM(1)) +C +C +C.....WYPISZ ETYKIETY / O ILE NIE WYSTAPILO "OTHERWISE" LUB PRZEPELNIENIE/ + IF(LAB(DEEP).NE.NRUNIV)CALL SCSOUT + IF(OVER.GT.6)GO TO 500 + DEEP=DEEP-85 + IF(DEEP.GT.LMEM-600)RETURN +C POBRAC OPIS Z DYSKU ? + IF(OVER.EQ.0)RETURN + CALL SEEK(IBUF3,IOP(2)) + CALL GET(IBUF3,LAB(LMEM-515)) + OVER=0 + DEEP=LMEM-345 + RETURN +C.....PRZEPELNIENIE. + 500 OVER=OVER-1 + RETURN + END + SUBROUTINE SEND +C------------------------------------------------------------------------- +C +C WOLANA PRZY END MODULU. +C JESLI TRZEBA, DOPISUJE LAST-WILL. +C WYPISUJE ZAKONCZENIE LAST-WILL. +C +C ##### OUTPUT CODE : 175 , 185 , 193 . +C +C +#include "stos.h" +#include "blank.h" +C +C.....BYLO LAST-WILL ? + IF(LSTWILL)GO TO 1000 +C NIE. ZAKONCZ INSTRUKCJE MODULU + CALL SFIN +C I DOPISZ LAST-WILL + CALL SLWILL +C +C.....WYPISZ ZAKONCZENIE LAST-WILL: SKOK ZA LAST-WILL PREFIKSU +C LUB BACK + 1000 IF(UNIT.LE.2)GO TO 2000 + IDL=IPMEM(P+21) +C JESLI NIE MA PREFIKSU - BACK + IF(IDL.EQ.0)GO TO 2000 +C PREFIKSOWANY. CZY W CIAGU PREFIKSOWYM BYLO LAST-WILL ? +C /TAK, GDY SLOWO +8 PREFIKSU <> 0 / + IDL=IPMEM(IDL+8) + IF(IDL.EQ.0)GO TO 2000 +C SKOK ZA LAST-WILL W SEKWENCJI PREFIKSOWEJ + CALL QUADR2(175,IDL) + GO TO 3000 +C.....BACK +cdsw 2000 CALL QUADR1(193) +cdsw --------------------------------------- +c jesli coroutina/process to FIN (194) +2000 n = iand(ipmem(p),15) +c pole = t + if(n.eq.5.or.n.eq.7) go to 2100 + call quadr1(193) + go to 3000 +c coroutina/ process +2100 call quadr1(194) +cdsw ---------------------------------------- +C +C.....WYPISZ ZNACZNIK KONCA MODULU + 3000 CALL QUADR1(185) + RETURN + END + SUBROUTINE SFIN +C------------------------------------------------------------------- +C +C OBSLUGUJE KONIEC INSTRUKCJI MODULU / LAST-WILL LUB END, +C JESLI LAST-WILL NIE WYSTAPILO/ +C KOLEJNE DWA SYMBOLE TO : NUMER ETYKIETY, NUMER LINII. +C +C JESLI TRZEBA,DOPISUJE INNER. +C DOPISUJE ETYKIETE ORAZ NUMER LINII PRZED END. +C DLA MODULOW PREFIKSOWANYCH GENERUJE SKOK ZA INNER,DLA POZOSTALYCH +C END BLOKU /BACKBL/ LUB END PROCEDURY,FUNKCJI /BACKPR/ LUB +C END KLASY,COROUTINY /FIN/ LUB END HANDLERA /TERMINATE/. +C +C ##### OUTPUT CODE : 172 , 177 , 178 , 181 , 183 , +C 191 , 192 , 194 . +C +#include "stos.h" +#include "option.h" +#include "blank.h" +C + INTEGER AUX(6) + DATA AUX/191,172,194,192,192,194/ +C POWROTY Z MODULU: BACKBL,TERMINATE,FIN,BACKPR,BACKPR,FIN . +C +C.....DOPISAC INNER? + IF(INNER.NE.0)GO TO 10 + CALL QUADR2(178,IPMEM(P+23)) +C ZAZNACZ BRAK INSTRUKCJI PO INNER /CHYBA,ZE Z PREFIKSU/ + IPMEM(P-7)=0 + IDL=IPMEM(P+21) +C IDL=PREFIKS LUB 0 + IF(IDL.NE.0)IPMEM(P-7)=IPMEM(IDL-7) +C.....DOPISZ ETYKIETE O NUMERZE WB + 10 CALL SNEXT + CALL QUADR2(181,WB) +C ... DOPISZ NUMER LINII + CALL SNEXT + IF(.NOT.OPTTRC)WB=-WB + CALL QUADR2(177,WB) + IF(UNIT.GT.2)GO TO 200 +C ... BLOK LUB HANDLER + 100 CALL QUADR1(AUX(UNIT)) + RETURN +C ... PREFIKSOWANY ? + 200 IDL=IPMEM(P+21) + IF(IDL.EQ.0)GO TO 100 +C TAK. CZY SA INSTRUKCJE PO INNER ? + IDL=IPMEM(IDL-7) + IF(IDL.EQ.0)GO TO 100 +C ... SKOK ZA INNER PREFIKSU + CALL QUADR2(183,IDL) + RETURN + END + SUBROUTINE SLWILL +C---------------------------------------------------------------------- +C +C WYPISUJE ETYKKIETE LAST-WILL. +C DLA KLASY WPISUJE DO SLOWA +8 INFORMACJE O LAST-WILL: +C NUMER NAJBLIZSZEGO MODULU W CIAGU PREFIKSOWYM /Z BIEZACYM +C MODULEM WLACZNIE/ MAJACEGO LAST-WILL LUB ZERO,JESLI +C W CALYM CIAGU PREFIKSOWYM LAST-WILL NIE WYSTAPILO. +C +C ##### OUTPUT CODE : 174 . +C +#include "stos.h" +#include "blank.h" +C +C.....WYPISZ ETYKIETE LAST-WILL + CALL QUADR1(174) + IF(UNIT.NE.6)RETURN +C ... KLASA + IDR=0 +C JESLI JEST PREFIKS - SKOPIUJ Z PREFIKSU + IDL=IPMEM(P+21) + IF(IDL.NE.0)IDR=IPMEM(IDL+8) +C JESLI W TYM MODULE WYSTAPILO LAST-WILL, TO WPISZ NUMER BIEZACEGO +C MODULU + IF(LSTWILL)IDR=P + IPMEM(P+8)=IDR + RETURN + END + SUBROUTINE SRETURN +C----------------------------------------------------------------- +C +C DLA WYSTAPIENIA "RETURN" GENERUJE : +C DLA PROCEDUR,FUNKCJI BEZ PREFIKSU BACKPR, DLA PREFIKSOWANYCH +C LUB KLAS,COROUTIN BACK, DLA BLOKOW BACKBL, DLA HANDLERA BACKHD. +C +C +C ##### OUTPUT CODE : 180 , 191 , 192 , 193 . +C +#include "stos.h" +#include "blank.h" +C + INTEGER AUX(6) + DATA AUX/191,180,193,192,192,193/ +C POWROTY Z MODULU : BACKBL,BACKHD,BACK,BACKPR,BACKPR,BACK +C +C + IDL=AUX(UNIT) +cbc added concurrent statements + call snext +c check if procedure or function + if (unit .ne. 4 .and. unit .ne. 5) goto 100 +c generate BACKRPC + call quadr1(227) +10 op = wb + if (op .ne. 91 .and. op .ne. 92) goto 40 +c process next ENABLE/DISABLE list +20 call snext + if (wb .ne. 28) goto 10 +c process next identifier + call snext + ind = mident(wb) + elem = swhat(ind) +c check if procedure or function + if (elem .ne. 11 .and. elem .ne. 12) goto 30 + if (op .eq. 92) ind = -ind + call quadr1(ind) + goto 20 +30 call serror(478) + goto 20 +40 call quadr1(0) + call snext + return +c +Cbc JESLI MODUL PREFIKSOWANY TO BACK +cbc IF(UNIT.GT.2 .AND. IPMEM(P+21).NE.0)IDL=193 +100 CALL QUADR1(IDL) + RETURN + END + SUBROUTINE SFORTO(UP,STEP) +C----------------------------------------------------------------------------- +C +C OBSLUGUJE POCZATEK PETLI FOR. +C WOLANA PO WYSTAPIENIU SYMBOLU "TO" LUB "DOWNTO". +C UP = TRUE ,JESLI BYLO "TO" +C STEP = TRUE ,JESLI WYSTAPILO "STEP" +C STOS ZAWIERA: ZMIENNA STERUJACA,WARTOSC POCZATKOWA,KROK/JESLI BYL/, +C WARTOSC KONCOWA. +C NASTEPNE 2 SYMBOLE WEJSCIOWE TO NUMERY ETYKIET POCZATKU PETLI I ZA PETLA +C WCZYTUJE OBA NUMERY,ZASTEPUJE 4 LUB 3 GORNE ELEMENTY STOSU PRZEZ +C OPIS PETLI FOR. +C JESLI KROK LUB WARTOSC KONCOWA NIE SA STALE, PRZYDZIELA IM ATRYBUTY +C ROBOCZE ZYWE PO WYJSCIU Z BLOKU BAZOWEGO ORAZ GENERUJE MOVE&SAFE +C DLA NICH. +C +C GENERUJE KOD : +C WSTAWIENIE WARTOSCI POCZATKOWEJ DO R5 , +C ETYKIETA POCZATKU PETLI , +C PODSTAWIENIE WARTOSCI Z R5 NA ZMIENNA STERUJACA , +C RELACJA I SKOK WARUNKOWY /WYJSCIE Z PETLI/ +C +C +C +C ##### OUTPUT CODE : 13 , 60 , 90 , 92 , 108 , 110 , +C 139 , 152 , 181 , 208 . +C +C +#include "stos.h" +#include "blank.h" +cdsw DATA SFTHEX1,SFTHEX2,SFTHEX3 /Z8000,Z4000,Z2000 / +C + LOGICAL UP,STEP,END1 +C TRUE,JESLI: BYLO "TO", BYLO "STEP" , WARTOSC KONCOWA ROZNA OD STALEJ + INTEGER END2,STEP1,STEP2 +C ATS LUB WARTOSC STALEJ DLA WARTOSCI KONCOWEJ,RODZAJ KROKU +C /1 JESLI STALY/, ATS LUB WARTOSC KROKU. +C +cdsw ------------------------------------------------ + data sfthx2, sfthx3 / x'4000', x'2000' / + sfthx1 = ishft(1,15) +cdsw ------------------------------------------------ +C +C.....WARTOSC KONCOWA + CALL SINDTYP + END1=STACK(VALTOP).NE.1 + END2=STACK(VALTOP-2) + CALL SPOP +C JESLI TRZEBA - ZABEZPIECZ WARTOSC KONCOWA + IF(.NOT.END1)GO TO 100 +C ZABEZPIECZ + CALL QUADR3(208,TEMPNR+6,END2) + END2=TEMPNR+6 +C +C.....BYLO "STEP" ? + 100 IF(STEP)GO TO 200 +C NIE. WSTAW KROK=1 + STEP1=1 + STEP2=1 + GO TO 300 +C TAK. + 200 STEP1=STACK(VALTOP) + STEP2=STACK(VALTOP-2) + CALL SPOP +C STALY KROK? JESLI NIE - ZABEZPIECZ + IF(STEP1.EQ.1)GO TO 300 + CALL QUADR3(208,TEMPNR+3,STEP2) + STEP2=TEMPNR+3 +C +C.....WARTOSC POCZATKOWA. WPISZ DO "R5" + 300 N=SVATS(VALTOP) + K=STACK(VLPREV-2) +C K = ATS ZMIENNEJ STERUJACEJ + CALL SPOP +C ZDEJMIJ TEZ ZMIENNA STERUJACA + CALL SPOP + LSTLSE=0 +C WPISZ WARTOSC POCZATKOWA DO R5 ( REJESTR = 4 ) + CALL QUADR3(139,N,4) +C +C +C.....WSTAW OPIS PETLI NA STOS +C +C POSTAC OPISU : SLOWO -1 = ATS ZMIENNEJ STERUJACEJ +C SLOWO -2 = WARTOSC LUB ATS KROKU +C SLOWO -3 : BIT 0 = 0 --> "TO",= 1 --> "DOWNTO" +C BIT 1 = 0 --> STALY KROK,= 1 --> WYLICZONY +C BIT 2 = 0 --> STALA WARTOSC KONCOWA, +C = 1 --> WYLICZONA +C + CALL SPUSH(6) + LSTFOR=VALTOP + STACK(VALTOP-1)=K + STACK(VALTOP-2)=STEP2 + N=0 +C = "TO" , STALY KROK , STALA WARTOSC KONCOWA + IF(.NOT.UP)N=IOR(N,SFTHX1) + IF(STEP1.NE.1)N=IOR(N,SFTHX2) + IF(END1)N=IOR(N,SFTHX3) + STACK(VALTOP-3)=N +C +C +C.....POCZATEK PETLI. + CALL SNEXT +C WB=NUMER ETYKIETY POCZATKU. GENERUJ ETYKIETE. + CALL QUADR2(181,WB) + CALL SNEXT +C WB=NUMER ETYKIETY ZA PETLA +C +C ... PODSTAW WARTOSC Z R5 NA ZMIENNA STERUJACA + L=TSTEMP(1) +C 4 --> R5 + CALL QUADR3(13,L,4) + CALL QUADR3(60,K,L) +C +C ... GENERUJ POROWNANIE + STEP1=TSTEMP(1) + N=110 +C ="GT INTEGER" +C STALA WARTOSC KONCOWA? + IF(END1)GO TO 500 +C TAK + N=92 +C = "GT CONST" +C +C.....POROWNANIE I WYSKOK ZA PETLE + 500 IF(.NOT.UP)N=N-2 +C OPKOD "LT" = OPKOD "GT" -2 . + CALL QUADR4(N,STEP1,K,END2) + CALL QUADR3(152,STEP1,WB) + RETURN + END + SUBROUTINE SFOREND +C---------------------------------------------------------------------------- +C +C OBSLUGUJE ZAKONCZENIE PETLI FOR +C ZWIEKSZA ZMIENNA STERUJACA O KROK /ZMNIEJSZA DLA "DOWNTO"/ +C I WKLADA DO "R5". +C ZMNIEJSZA LSTFOR,TEMPNR. +C JESLI KROK LUB WARTOSC KONCOWA NIE BYLY STALE, ZWALNIA +C ZAJMOWANE PRZEZ NIE ZMIENNE ROBOCZE /GENERUJE "RELEASE"/ +C +C GENERUJE KOD : +C WSTAWIENIE DO R5 WARTOSCI ZMIENNEJ STERUJACEJ POWIEKSZONEJ +C O KROK / POMNIEJSZONEJ DLA DOWNTO / , +C SKOK NA POCZATEK PETLI +C +C +C ##### OUTPUT CODE : 37 , 113 , 114 , 139 , 141 . +C +C +#include "stos.h" +#include "blank.h" +C +C + INTEGER N,STEP,ATS,OPKOD,K +C +cdsw DATA SFEHEX1,SFEHEX2,SFEHEX3 /Z8000,Z4000, Z2000 / +C +cdsw --------------------------------------------------- + data sfehx2, sfehx3 /x'4000', x'2000'/ + sfehx1 = ishft(1,15) +cdsw ----------------------------------------------- +C.............. + N=STACK(VALTOP-3) + STEP=STACK(VALTOP-2) + ATS=STACK(VALTOP-1) + K=TSTEMP(1) +C "DOWNTO" ? + IF(IAND(N,SFEHX1).NE.0)GO TO 600 +C....."TO" + OPKOD=113 +C =" + INTEGER" +C STALY KROK? TAK,JESLI BIT 1 = 0 + IF(IAND(N,SFEHX2).NE.0)GO TO 400 +C TAK. + 200 OPKOD=37 +C =" + CONST" +C + 400 CALL QUADR4(OPKOD,K,ATS,STEP) +C WSTAW DO "R5" ( REJESTR = 4 ) + CALL QUADR3(139,K,4) + LSTFOR=VLPREV +C.....ZWOLNIJ ZMIENNE ROBOCZE,JESLI: +C WARTOSC KONCOWA ROZNA OD STALEJ /BIT 2 = 1/ + IF(IAND(N,SFEHX3).NE.0)CALL QUADR2(141,TEMPNR+6) +C KROK ROZNY OD STALEJ /BIT 1 = 1/ + IF(IAND(N,SFEHX2).NE.0)CALL QUADR2(141,TEMPNR+3) +C +C ZWOLNIJ NUMERY ATRYBUTOW ROBOCZYCH REZERWOWANE DLA PETLI FOR + TEMPNR=TEMPNR+6 + RETURN +C +C....."DOWNTO". STALY KROK? + 600 OPKOD=114 +C =" - INTEGER" + IF(IAND(N,SFEHX2).NE.0)GO TO 400 +C TAK + STEP=-STEP + GO TO 200 + END + SUBROUTINE SKILL +C--------------------------------------------------------------- +C +C NA CZUBKU JEST ARGUMENT KILL. BADA TYP,GENERUJE KOD. +C +C +C ##### OUTPUT CODE : 143 , 146 . +C +C ##### DETECTED ERROR(S) : 415 . +C +#include "stos.h" +#include "blank.h" +C + CALL SVALUE +C JESLI UNIWERSALNY-POMIN + IF(STACK(VALTOP).EQ.0)RETURN +C POMIN TAKZE NONE LUB TYP UNIWERSALNY + IDL=STACK(VALTOP-4) + IF(IDL.EQ.NRNONE .OR. IDL.EQ.NRUNIV)RETURN + IDR=143 +C OPKOD KILL DLA TABLICY,REKORDU +C TABLICA? + IF(STACK(VALTOP-3).GT.0)GO TO 50 +C NIE. CZY TYP PIERWOTNY? + DO 20 I=1,6 + IF(IDL.EQ.CONSNR(I))GO TO 90 + 20 CONTINUE +C..... O.K. REKORD? /POLE T=2/ + IF(IAND(IPMEM(IDL),15) .NE.2)IDR=146 +C OPKOD UNIWERSALNEGO KILL + 50 CALL QUADR2(IDR,STACK(VALTOP-2)) + RETURN + 90 CALL SERROR(415) + END + SUBROUTINE SOPTION +C------------------------------------------------------ +C +C OBSLUGUJE ZMIANE OPCJI +C +C NASTEPNY SYMBOL TO + , - NUMER OPCJI. +C +C NUMER I NAZWA OPCJI * ZMIENNA * WARTOSC DLA + * DLA - * ZNACZENIE DLA + +C +C M 2 MEMBER CONTROL * OPTMEM * 0 * 1 * WYMAGANA KONTROLA +C O 3 OPTIMIZATION * OPTOPT * TRUE * FALSE * WOLNO OPTYMALIZOWAC +C I 4 INDEX CONTROL * OPTIND * 0 * 2 * WYMAGANA KONTROLA +C T 5 TYPE CONTROL * OPTTYP * FALSE * TRUE * WYMAGANA KONTROLA +C D 6 TRACE * OPTTRC * TRUE * FALSE * WYMAGANY SLAD +C C 7 CASE CONTROL * OPTCSC * 0 * 1 * WYMAGANA KONTROLA +C F 8 FAST CASE * OPTCSF * 0 * 2 * SZYBKI CASE +C +C +C OPCJA 1 - LISTING - JEST UZYWANA TYLKO PRZEZ PARSER +C +C +C +#include "stos.h" +#include "option.h" +#include "blank.h" +C + INTEGER OPTION(7),PLUS(7),MINUS(7) + LOGICAL LPLUS(7),LMINUS(7) + EQUIVALENCE (OPTION(1),OPTMEM) + EQUIVALENCE (PLUS,LPLUS) + EQUIVALENCE (MINUS,LMINUS) +C PLUS,LPLUS - WARTOSCI ODPOWIEDNICH ZMIENNYCH DLA ZAPALONEJ OPCJI +C MINUS,LMINUS - " " " " ZGASZONEJ OPCJI +C + DATA PLUS(1),PLUS(3),PLUS(6),PLUS(7)/4*0/ + DATA LPLUS(2),LPLUS(4),LPLUS(5)/.TRUE.,.FALSE.,.TRUE./ + DATA MINUS(1),MINUS(3),MINUS(6),MINUS(7)/1,2,1,2/ + DATA LMINUS(2),LMINUS(4),LMINUS(5)/.FALSE.,.TRUE.,.FALSE./ +C +C +C.....WCZYTAJ NUMER OPCJI + CALL SNEXT +C ZGASZONA ? + IF(WB.GT.0)GO TO 100 +C ... TAK + WB=-WB-1 + N=MINUS(WB) + GO TO 200 +C ... ZAPALONA + 100 WB=WB-1 + N=PLUS(WB) + 200 OPTION(WB)=N + RETURN + END +cdsw subroutine sread(*,*) + SUBROUTINE SREAD(where) +C----------------------------------------------------------------------- +cdsw where=1 - return1, where=2 - return2 +C +C OBSLUGUJE OPERACJE CZYTANIA. +C NA CZUBKU STOSU ZNAJDUJE SIE ARGUMENT LUB ADRES PLIKU +C +C WRACA DO ETYKIETY 30 LUB 40 W SDPDA +C +C KORZYSTA Z /BEZPARAMETROWYCH/ STANDARDOWYCH FUNKCJI +C O NUMERACH : +C 43,44 - READCHAR +C 45,46 - READINT +C 47,48 - READREAL +C +C +C ##### OUTPUT CODE : 23 , 132 . +C +C ##### DETECTED ERROR(S) : 420 , 443 . +C +C +#include "stos.h" +#include "blank.h" +C +C +C + ELEM=STACK(VALTOP) + IF(ELEM.EQ.0)GO TO 500 + K=STACK(VALTOP-4) +C PIERWSZY ARGUMENT ? + IF(FLARGS.GT.0)GO TO 100 +C TAK. FUNKCJA ? + IF(ELEM.EQ.12)GO TO 50 +C NIE. ADRES PLIKU ? + IF(STACK(VALTOP-3).GT.0)GO TO 200 + IF(IAND(IPMEM(K),15).NE.11)GO TO 100 +C TAK. PRZEKAZ ADRES PLIKU + 50 CALL SVALUE + K=STACK(VALTOP-4) + IF(STACK(VALTOP-3).GT.0)GO TO 200 + IF(IAND(IPMEM(K),15).NE.11)GO TO 100 + FLMODF=0 + FILE=VALTOP + CALL SFLADR + FLARGS=1 +C GO TO 40 +cdsw RETURN2 +cdsw ------------------ + where=2 + return +cdsw ------------------ +C POWROT DO PETLI W SDPDA +C +C +C.....ARGUMENT. ZMIENNA ? + 100 IF(ELEM.LT.3 .OR. ELEM.GT.5)CALL SERROR(420) +C WPISZ ADRES PLIKU + CALL SFLADR +C ZBADAJ TYP, TABLICOWY ? + IF(STACK(VALTOP-3).GT.0)GO TO 200 +C N=NUMER FUNKCJI STANDARDOWEJ ,L=APETYT, K=TYP + N=46 + L=1 +C INTEGER? + IF(K.EQ.NRINT)GO TO 300 +C CHAR? + N=44 + IF(K.EQ.NRCHR)GO TO 300 +C REAL? + N=48 +#if WSIZE == 4 + L = 1 +#else + L = 2 +#endif + IF(K.EQ.NRRE)GO TO 300 +C.....ZATEM NIEPOPRAWNY TYP ZMIENNEJ W INSTRUKCJI READ + 200 CALL SERROR(443) + GO TO 500 +C +C.....OK PRZEKAZ STEROWANIE DO FUNKCJI STANDARDOWEJ + 300 N=N-FLMODF + CALL QUADR2(132,N) +C ODCZYTAJ WARTOSC + K=TSTEMP(L) + CALL QUADR4(23,K,N,0) +C WPISZ WARTOSC + CALL SSTORE(VALTOP,K) + 500 FLARGS=2 +C POWROT DO ETYKIETY 30 W SDPDA +C GO TO 30 +cdsw RETURN1 +cdsw ---------------- + where=1 + return +cdsw ----------------- + END +cdsw SUBROUTINE SWRITE(*,*) + subroutine swrite(where) +C------------------------------------------------------------------------ +cdsw where = 1 - return1, where = 2 - return2 +C +C OBSLUGUJE OPERACJE PISANIA. +C NA STOSIE JEST ADRES PLIKU LUB WARTOSC DO WYPISANIA, A NAD NIA 0,1 LUB 2 +C WARTOSCI OKRESLAJACE FORMAT. +C NASTEPNY SYMBOL = LICZBA WARTOSCI OKRESLAJACYCH FORMAT /0..2/ +C ZDEJMUJE TE WARTOSCI ZE STOSU. +C +C WRACA DO ETYKIETY 30 LUB 40 W SDPDA +C +C UZYWA PROCEDUR STANDARDOWYCH : +C 60,61 - WRITECHAR ( ZNAK ) +C 62,63 - WRITEINT ( LICZBA , SZEROKOSC POLA ) +C 64,65 - WRITEREAL ( LICZBA , LICZBA ZNAKOW PRZED KROPKA , PO KROPCE ) +C = WRFLT. = +C 66,67 - WRITEREAL = WRFLE. = +C 68,69 - WRITEREAL = WRFLF. = +C 70,71 - WRITESTRING ( ADRES TEKSTU , SZEROKOSC POLA LUB -1 ) +C +C DOZWOLONE FORMATY : +C INTEGER - 0 LUB 1 , DEFAULT = 6 +C CHAR - 0 +C TEXT - 0 LUB 1 , DEFAULT = -1 /=CALY TEKST/ +C REAL - 0 , 1 LUB 2 , DEFAULT = 12 . 4 /=17/ +C +C UWAGA : PARAMETRY / W TYM WARTOSC FUNKCJI / SA NUMEROWANE OD ZERA . +C +C ##### OUTPUT CODE : 132 , 145 . +C +C ##### DETECTED ERROR(S) : 441 , 442 . +C +#include "stos.h" +#include "blank.h" +C +C + INTEGER FORMAT(2),I,K,N +C +C + CALL SNEXT +C WB=LICZBA WYRAZEN OKRESLAJACYCH FORMAT +C.....WSTAW DO TABLICY FORMAT ATS-Y FORMATOW +C + I=WB + 100 IF(I.EQ.0)GO TO 200 + CALL SINDTYP + FORMAT(I)=SVATS(VALTOP) + CALL SPOP + I=I-1 + GO TO 100 +C +C.....TERAZ CZUBEK ZAWIERA WARTOSC DO WYPISANIA LUB ADRES PLIKU + 200 CALL SVALUE + IF(STACK(VALTOP).EQ.0)GO TO 1000 + K=SVATS(VALTOP) +C ZBADAJ TYP + IF(STACK(VALTOP-3).NE.0)GO TO 400 + I=STACK(VALTOP-4) +C PIERWSZY ARGUMENT ? + IF(FLARGS.GT.0)GO TO 300 +C TAK. ADRES PLIKU ? + IF(IAND(IPMEM(I),15).NE.11)GO TO 300 +C TAK. WYSTAPIL FORMAT ? + IF(WB.NE.0)CALL SERROR(441) + FLMODF=0 + FILE=VALTOP + FLARGS=1 + CALL SFLADR +C GO TO 40 +cdsw RETURN2 +cdsw ------------------- + where = 2 + return +cdsw -------------------- +C POWROT DO PETLI W SDPDA +C +C.....ARGUMENT + 300 CALL SFLADR + IF(I.EQ.NRRE)GO TO 800 +C ZATEM CHAR,INTEGER,TEXT + IF(I.EQ.NRINT)GO TO 500 + IF(I.EQ.NRTEXT)GO TO 600 + IF(I.EQ.NRCHR)GO TO 700 +C +C.....ZATEM NIELEGALNY TYP ARGUMENTU INSTRUKCJI WRITE + 400 I=442 + 410 CALL SERROR(I) + GO TO 1000 +C +C....NIELEGALNY FORMAT + 420 I=441 + GO TO 410 +C +C +C.....INTEGER. DEFAULT : 6 ZNAKOW + 500 IF(WB.EQ.2)GO TO 420 + IF(WB.EQ.0)FORMAT(1)=SCONST(6) + N=62+FLMODF + GO TO 920 +C +C....TEXT. -1 JESLI BRAK FORMATU + 600 IF(WB.EQ.2)GO TO 420 + IF(WB.EQ.0)FORMAT(1)=SCONST(-1) + N=70+FLMODF + GO TO 920 +C +C.....CHAR + 700 IF(WB.NE.0)GO TO 420 + N=60+FLMODF + GO TO 930 +C +C.....REAL. DEFAULT : 12 ZNAKOW PRZED KROPKA , 4 PO KROPCE. + 800 N=64+2*WB+FLMODF + WB=WB+1 + GO TO (810,820,830),WB +C ... BEZ FORMATU , DEFAULT 12.4 , "WRFLT." = 8 + 810 FORMAT(1)=SCONST(12) + FORMAT(2)=SCONST(4) + GO TO 900 +C ... FORMAT = SZEROKOSC POLA , 5 ZNAKOW PO KROPCE, "WRFLE." = 10 + 820 FORMAT(2)=SCONST(5) +C +C ... FORMAT = SZEROKOSC POLA,LICZBA ZNAKOW PO KROPCE, "WRFLF." = 11 + 830 CONTINUE +C.....WSTAWIANIE PARAMETROW : N = NUMER PROCEDURY STANDARDOWEJ +C K = ATS WARTOSCI +C WSTAW PRAWY FORMAT DLA REAL + 900 CALL QUADR4(145,FORMAT(2),N,2) +C WSTAW /LEWY/ FORMAT + 920 CALL QUADR4(145,FORMAT(1),N,1) +C WSTAW WARTOSC + 930 CALL QUADR4(145,K,N,0) +C PRZEKAZ STEROWANIE + CALL QUADR2(132,N) + 1000 FLARGS=2 +C POWROT DO ETYKIETY 30 W SDPDA +cdsw RETURN1 +cdsw ----------------- + where=1 + return +cdsw ----------------- + END + SUBROUTINE SFTEST +C--------------------------------------------------------- +C +C SPRAWDZA, CZY ELEMENT Z CZUBKA STOSU (UNIW.,STALA, +C WARTOSC,ZMIENNA,TABL.STAT.,ELEM.TABL.) JEST TYPU FILE . +C 'NONE' NIE JEST AKCEPTOWANE +C +C ##### DETECTED ERROR(S) : 413 . +C +#include "stos.h" +#include "blank.h" +C + N=STACK(VALTOP-4) + IF(STACK(VALTOP-3).GT.0 .OR. (N.NE.NRUNIV.AND. + X IAND(IPMEM(N),15).NE.11))CALL SERROR(413) + RETURN + END + SUBROUTINE SFLADR +C--------------------------------------------------------- +C +C ZAPEWNIA, ZE (R6-12) ZAWIERA ADRES PLIKU +C - DLA OPERACJI NA PLIKU WSKAZYWANYM +C +C ##### OUTPUT CODE : 139 . +C +#include "stos.h" +#include "blank.h" +C + IF(FILE.EQ.0 .OR. FLREADY)RETURN + CALL QUADR3(139,STACK(FILE-2),-45) +C -45 --> (R6-12) + FLREADY=.TRUE. + RETURN + END +cdsw SUBROUTINE SPUT(*,*) + subroutine sput(where) +C--------------------------------------------------------- +cdsw where = 1 - return1, where = 2 - return2 +C +C OBSLUGUJE 'PUT' . +C CZUBEK STOSU ZAWIERA ADRES PLIKU LUB ARGUMENT. +C +C WRACA BEZPOSREDNIO DO ETYKIETY 30 LUB 40 W SDPDA. +C +C ##### OUTPUT CODE : 132 , 145 . +C +C ##### DETECTED ERROR(S) : 445 . +C +#include "stos.h" +#include "blank.h" +C + CALL SVALUE +C ADRES PLIKU JUZ WYSTAPIL ? + IF(FLARGS.GT.0)GO TO 100 +C JESZCZE NIE + CALL SFTEST + FILE=VALTOP + FLARGS=1 + FLMODF=0 + CALL SFLADR +C GO TO 40 +cdsw RETURN2 +cdsw ------------------ + where = 2 + return +cdsw ------------------ +C POWROT DO SDPDA +C +C.....ARGUMENT + 100 FLARGS=2 + CALL SFLADR + N=STACK(VALTOP-4) +C SEMAPHORE ? + if(iand(ipmem(n),15).eq.9) go to 799 + if(stack(valtop-3).gt.0) go to 799 + IF(N.EQ.NRINT)GO TO 400 + IF(N.EQ.NRCHR)GO TO 300 + IF(N.EQ.NRRE )GO TO 500 + if(n.eq.nrtext) go to 799 +C ZATEM REFERENCJA lub nielegealny typ + go to 799 +CPS 600 N=56 dziwne, ta etykieta nie jest uzywana ! +CPS GO TO 1000 + 300 N=53 + GO TO 1000 + 400 N=54 + GO TO 1000 + 500 N=55 + GO TO 1000 +C + 1000 CALL QUADR4(145,SVATS(VALTOP),N,0) + CALL QUADR2(132,N) +C GO TO 30 +cdsw RETURN1 +cdsw ------------------ + where = 1 + return +cdsw ------------------ +C POWROT DO SDPDA + 799 call serror(445) + where = 1 + return + END +cdsw SUBROUTINE SGET(*,*) + subroutine sget(where) +C--------------------------------------------------------- +cdsw where = 1 - return1 , where = 2 - return2 +C +C OBSLUGUJE 'GET' +C CZUBEK STOSU ZAWIERA ARGUMENT LUB ADRES PLIKU. +C +C WRACA DO ETYKIETY 30 LUB 40 W SDPDA. +C +C ##### OUTPUT CODE : 23 , 132 , 145 . +C +C ##### DETECTED ERROR(S) : 420 , 446 . +C +#include "stos.h" +#include "blank.h" +C + INTEGER ELEM,N,ATS +C +C ADRES PLIKU JUZ WYSTAPIL ? + IF(FLARGS.GT.0)GO TO 100 +C JESZCZE NIE + CALL SVALUE + CALL SFTEST + FILE=VALTOP + FLARGS=1 + FLMODF=0 + CALL SFLADR +C GO TO 40 +cdsw RETURN2 +cdsw ------------------------ + where = 2 + return +cdsw ------------------------ +C POWROT DO SDPDA +C +C.....ARGUMENT. ZMIENNA ? + 100 FLARGS=2 + CALL SFLADR + ELEM=STACK(VALTOP) + N=STACK(VALTOP-4) +C SEMAPHORE ? + IF(IAND(IPMEM(N),15).EQ.9)GO TO 9000 + if(stack(valtop-3).gt.0) go to 9000 + IF(N.EQ.NRINT)GO TO 1000 + IF(N.EQ.NRCHR)GO TO 1200 + IF(N.EQ.NRRE )GO TO 1100 + IF(N.EQ.NRTEXT)GO TO 9000 +C ZATEM REFERENCJA.lub nielegalny typ + go to 9000 +C POWROT DO PETLI W SDPDA +C +C ... INTEGER + 1000 N=50 + GO TO 1500 +C ... REAL + 1100 N=51 +#if WSIZE == 4 + ats = tstemp(1) +#else + ats = tstemp(2) +#endif + GO TO 2000 +C ... CHAR + 1200 N=49 +C +C + 1500 ATS=TSTEMP(1) +C ZMIENNA ? + 2000 IF(ELEM.LT.3 .OR. ELEM.GT.5)CALL SERROR(420) + CALL QUADR2(132,N) + CALL QUADR4(23,ATS,N,0) + CALL SSTORE(VALTOP,ATS) +C GO TO 30 +cdsw RETURN1 +cdsw ---------------- + where = 1 + return +cdsw ---------------- +C POWROT DO SDPDA +C.....NIELEGALNY TYP ARGUMENTU + 9000 CALL SERROR(446) +C GO TO 30 +cdsw RETURN1 +cdsw ---------------- + where = 1 + return +cdsw ----------------- + end + SUBROUTINE SEOF(N) +C-------------------------------------------------------------- +cdsw procedura zostala podzielona na dwie - seof i seof0 +C +C OBSLUGUJE OPERATORY 'EOF' I 'EOLN'. +C WSTAWIA NA STOS ODCZYTANA WARTOSC FUNKCJI. +C +C WEJSCIE SEOF0 ODPOWIADA BEZPARAMETROWYM EOF, EOLN. +C WEJSCIE SEOF ODPOWIADA EOF, EOLN Z PODANYM (NA CZUBKU STOSU) +C ADRESEM PLIKU (JEST USUWANY). +C N = NUMER ODPOWIEDNIEJ FUNKCJI STANDARDOWEJ +C (39, 40 DLA EOF, 74, 75 DLA EOLN) +C +C +C ###### GENEROWANY KOD : 23 , 132 , 139 . +C +C +#include "stos.h" +#include "blank.h" +C +C +C......CZUBEK STOSU ZAWIERA ADRES PLIKU + CALL SVALUE + CALL SFTEST +C PRZEKAZ ADRES PLIKU DO (R6-12) + CALL QUADR3(139,STACK(VALTOP-2),-45) + CALL SPOP +C DALEJ JAK DLA BEZPARAMETROWYCH EOF, EOLN +C + call seof0(n) + return + end + SUBROUTINE SEOF0(N) +C-------------------------------------------------------------- +cdsw procedura zostala podzielona na dwie - seof i seof0 +C +C OBSLUGUJE OPERATORY 'EOF' I 'EOLN'. +C WSTAWIA NA STOS ODCZYTANA WARTOSC FUNKCJI. +C +C WEJSCIE SEOF0 ODPOWIADA BEZPARAMETROWYM EOF, EOLN. +C WEJSCIE SEOF ODPOWIADA EOF, EOLN Z PODANYM (NA CZUBKU STOSU) +C ADRESEM PLIKU (JEST USUWANY). +C N = NUMER ODPOWIEDNIEJ FUNKCJI STANDARDOWEJ +C (39, 40 DLA EOF, 74, 75 DLA EOLN) +C +C +C ###### GENEROWANY KOD : 23 , 132 , 139 . +C +C +#include "stos.h" +#include "blank.h" +C +C + INTEGER ATS +C...................BEZPARAMETROWE EOF , EOLN +C +C WYWOLAJ FUNKCJE + CALL QUADR2(132,N) + ATS=TSTEMP(1) +C PODCZYTAJ WARTOSC ( PARAMETR 0 ) + CALL QUADR4(23,ATS,N,0) +C WSTAW NA STOS ODCZYTANA WARTOSC + CALL SPUSH(2) + STACK(VALTOP-1)=0 + STACK(VALTOP-2)=ATS + STACK(VALTOP-3)=0 + STACK(VALTOP-4)=NRBOOL + STACK(VALTOP-5)=0 + RETURN + END + INTEGER FUNCTION SVATS(ELEM) +C-------------------------------------------------------------- +C +C ZWRACA ATS WARTOSCI Z MIEJSCA ELEM STOSU . +C (UNIWERSALNY,STALA,WARTOSC) +C DLA STALEJ GENERUJE NOWY ATS. +C +#include "stos.h" +#include "blank.h" + +cdsw&ail + common /stacks/ btsins, btstem +C + SVATS=STACK(ELEM-2) + IF(STACK(ELEM).NE.1)RETURN +C STALA + N=STACK(ELEM-4) + IF(N.EQ.NRRE)GO TO 100 + IF(N.EQ.NRNONE)GO TO 200 +C ZATEM : INTEGER,CHAR,BOOLEAN,TEXT + SVATS=SCONST(SVATS) + RETURN +C ... STALA REAL + 100 SVATS=SCREAL(SVATS) + RETURN +C ... STALA NONE +cdsw&ail 200 SVATS=LMEM-3 + 200 svats = btstem - 3 + RETURN + END +C + SUBROUTINE SAVEVAR(ELEM) +C------------------------------------------------------- +C +C ZABEZPIECZA ADRES ZMIENNEJ (UOGOLNIONEJ) Z MIEJSCA +C ELEM STOSU. +C +#include "stos.h" +#include "blank.h" +C +C + N=STACK(ELEM)-2 + GO TO (300,400,500),N +C.....ZMIENNA +C ADRES PRZED KROPKA : + 300 CALL SAFE(STACK(ELEM-7)) + RETURN +C.....ELEMENT TABLICY +C ADRES TABLICY : + 400 CALL SAFE(STACK(ELEM-2)) +C I INDEKS, JESLI ROZNY OD STALEJ : + IF(STACK(ELEM-2).GT.0)GO TO 300 +cdsw added - bug! + return +C.....TABLICA STATYCZNA + 500 GO TO 300 + END + SUBROUTINE SCHECK(ERROR,TYP) +C-------------------------------------------------------- +C +C POMOCNICZA. JESLI CZUBEK STOSU NIE JEST TYPU PROSTEGO +C TYP LUB UNIWERSALNEGO - SYGNALIZUJE BLAD ERROR. +C +#include "stos.h" +#include "blank.h" +C +C + INTEGER ERROR,TYP + I=STACK(VALTOP-4) + IF(STACK(VALTOP-3).NE.0 .OR. (I.NE.NRUNIV .AND. I.NE.TYP)) + X CALL SERROR(ERROR) + RETURN + END + SUBROUTINE SNOT +C----------------------------------------------------------------- +C +C OBSLUGUJE OPERATOR NOT. ARGUMENT JEST NA CZUBKU . +C +C +C ##### OUTPUT CODE : 42 . +C +C ##### DETECTED ERROR(S) : 417 . +C +#include "stos.h" +#include "blank.h" +C +C + CALL SNEXT + CALL SVALUE +C JESLI UNIWERSALNY-POMIN + IF(STACK(VALTOP).EQ.0)RETURN +C SPRAWDZ TYP + CALL SCHECK(417,NRBOOL) +C..... CZY STALA? + IF(STACK(VALTOP).EQ.1)GO TO 51 +C NIE. CZY WB= IF.FALSE LUB IF.TRUE ? + IF(WB.EQ.29 .OR. WB.EQ.30)GO TO 60 +C.....NIE, WYKONAJ NOT. + IDL=TSTEMP(1) + CALL QUADR3(42,IDL,STACK(VALTOP-2)) + STACK(VALTOP)=2 + STACK(VALTOP-2)=IDL + RETURN +C.....STALA, ZMIEN WARTOSC. + 51 STACK(VALTOP-2)=-1-STACK(VALTOP-2) + RETURN +C.....NOT PRZED SKOKIEM WARUNKOWYM,ZMIEN RODZAJ SKOKU + 60 WB=59-WB + RETURN + END + SUBROUTINE SARITH +C-------------------------------------------------------------------------- +C +C 1982.09.15 +C +C OBSLUGUJE 1 LUB 2 - ARGUMENTOWE OPERACJE ARYTMETYCZNE. +C WB=NUMER OPERACJI, 1..8 OZNACZaJA: +C ABS,MINUS UNARNY,+,-,*,/,DIV,MODE +C ARGUMENT LUB 2 ARGUMENTY SA NA CZUBKU STOSU. +C ARGUMENTY ZASTEPUJE PRZEZ WYNIK OPERACJI /UNIWERSALNY,STALA,WARTOSC/ +C +C WYROZNIA PRZYPADKI: +C OBA ARGUMENTY STALE, +C DODAWANIE,ODEJMOWANIE STALEJ +C MNOZENIE PRZEZ STALE 0..10, +C DZIELENIE PRZEZ 0,1,2,4,8. +C +C +C ##### OUTPUT CODE : 37 , 48 , 49 , 50 , 51 , 64 , 65 , 66 , +C 67 , 68 , 69 , 70 , 71 , 72 , 73 , 74 , +C 75 , 113 , 114 , 115 , 117 , 118 , 119 , +C 120 , 121 , 122 , 140 . +C +C ##### DETECTED ERROR(S) : 460 . +C +#include "stos.h" +#include "option.h" +#include "blank.h" +cdsw&bc + real y + integer*2 m(2) + equivalence (y, m(1)) +CCCCCCCCCCCCCCC +C ROBOCZE + INTEGER ELEM,OPKOD +C + REAL XREAL,YREAL +C +C + INTEGER CREAL +C +C +C........................ +C +C TERAZ WB=NUMER OPERACJI +C WYLICZ WARTOSC + CALL SVALUE +C I WSTAW TYP PRAWEGO ARGUMENTU + TRDIM=STACK(VALTOP-3) + TRBAS=STACK(VALTOP-4) + IDR=STACK(VALTOP-1) +C.....PRZESKOCZ,JESLI OPERACJA 2-ARGUMENTOWA + IF(WB.GT.2)GO TO 1000 +C.....ABS LUB MINUS UNARNY + IF(STACK(VALTOP).EQ.0)RETURN +C ZBADAJ TYP + TLDIM=TRDIM + TLBAS=TRBAS + IDL=IDR + CALL MARITH(1) +C CZY STALA? + IF(STACK(VALTOP).EQ.1)GO TO 200 +C NIE. INTEGER? + IF(STACK(VALTOP-4).EQ.NRINT)GO TO 150 +C ZATEM ZMIENNA,WARTOSC TYPU REAL +#if WSIZE == 4 + result = tstemp(1) +#else + result = tstemp(2) +#endif + 100 CALL QUADR3(49+WB,RESULT,STACK(VALTOP-2)) +C ZASTAP PRZEZ "WARTOSC" Z NOWYM RESULT + STACK(VALTOP)=2 + STACK(VALTOP-2)=RESULT + RETURN +C ZMIENNA,WARTOSC TYPU INTEGER + 150 RESULT=TSTEMP(1) + WB=WB-2 + GO TO 100 +C STALA JAKO ARGUMENT ABS LUB MINUSA UNARNEGO + 200 IF(STACK(VALTOP-4).EQ.NRRE)GO TO 250 + IF((WB.EQ.1 .AND. STACK(VALTOP-2).LT.0).OR.(WB.EQ.2)) + X STACK(VALTOP-2)= -STACK(VALTOP-2) + RETURN +C STALA REAL + 250 RESULT=STACK(VALTOP-2) +cdsw&bc XREAL=STALER(RESULT) +#if WSIZE == 4 + xreal=staler(result) +#else + n1 = result*2-1 + m(1) = ipmem(n1) + m(2) = ipmem(n1+1) + xreal = y +#endif +c + IF((WB.EQ.1 .AND. XREAL.LT.0.0).OR.(WB.EQ.2)) + X STACK(VALTOP-2)=CREAL(-XREAL) + RETURN +C +C................ OPERACJE 2-ARGUMENTOWE....................... +C +C ROZROZNIA PRZYPADKI : OBA ARGUMENTY STALE , JEDEN ARGUMENT STALY, +C MNOZENIE LUB DZIELENIE PRZEZ WYROZNIONE STALE +C /0,1,2,3,4,5,6,7,8,9,10 LUB 0,1,2,4,8/ +C + 1000 CALL SVALU2 + ELEM=0 +C JESLI JEDEN Z ARGUMENTOW UNIWERSALNY-ZASTAP OBA PRZEZ UNIWERSALNY + IF(STACK(VALTOP)*STACK(VLPREV).EQ.0)GO TO 1400 +C WSTAW TYP I NAZWE LEWEGO ,SPRAWDZ TYPY + TLDIM=STACK(VLPREV-3) + TLBAS=STACK(VLPREV-4) + IDL=STACK(VLPREV-1) + ELEM=2 +C ELEM="WARTOSC",UZYWANE PO SKOKU DO 1400. + OPKOD=1 + IF(WB.GT.6)OPKOD=2 + IF(WB.EQ.6)OPKOD=3 + CALL MARITH(OPKOD) +C WYKONAJ EWENTUALNA KONWERSJE + IF(CONVR.EQ.1)CALL SVREAL(VALTOP) + IF(CONVL.EQ.1)CALL SVREAL(VLPREV) + IDL=STACK(VLPREV-2) + IDR=STACK(VALTOP-2) +C IDL,IDR = WARTOSC LUB NUMER STALEJ LUB ATS LEWEGO,PRAWEGO ARGUMENTU. +C DLA JEDNEGO ARG.STALEGO - IDR=STALA +C +C +C..........STALE ARGUMENTY? + CALL SARGMT + GO TO (2000,4000,1600,1050),ARG +C +C..........OBA ROZNE OD STALYCH +C +1050 IF(TRESLT.EQ.NRRE)GO TO 1500 +C +C +C INTEGER + 1100 RESULT=TSTEMP(1) + 1200 OPKOD=113-3 +C GENERUJ OPERACJE + 1300 CALL QUADR4(OPKOD+WB,RESULT,IDL,IDR) +C +C +C.....ZASTAP OBA PRZEZ "WARTOSC" TYPU TRESLT +C + 1400 CALL SRESULT(ELEM) + RETURN +C +C +C REAL + 1500 OPKOD=119-3 +#if WSIZE == 4 + result = tstemp(1) +#else + result = tstemp(2) +#endif + GO TO 1300 +C +C.....PRAWY ARGUMENT STALY,LEWY NIE /DLA + , * ROWNIEZ ODWROTNIE/ +C JESLI REAL - WSTAW STALA I DALEJ JAK DLA OBU ROZNYCH OD STALYCH + 1600 IF(TRESLT.NE.NRRE)GO TO 4100 +C +C TUTAJ ROZSZERZENIE O ARGUMENT 0.0 LUB 1.0 +C + IDR=SCREAL(IDR) + GO TO 1500 +C +C +C.............OBA ARGUMENTY STALE. OBLICZ WYNIK. +C + 2000 ELEM=1 + WB=WB-2 + IF(TRESLT.NE.NRINT)GO TO 3000 +C +C.....OPERACJA NA 2 STALYCH INTEGER + GO TO(2100,2200,2300,2400,2400,2500),WB +C + + 2100 RESULT=IDL+IDR + GO TO 1400 +C - + 2200 RESULT=IDL-IDR + GO TO 1400 +C * + 2300 RESULT=IDL*IDR + GO TO 1400 +C / , DIV + 2400 IF(IDR.EQ.0)GO TO 4800 + RESULT=IDL/IDR + GO TO 1400 +C MODE + 2500 RESULT=MOD(IDL,IDR) + GO TO 1400 +C +C.....OPERACJA NA 2 STALYCH TYPU REAL + 3000 continue +cdsw&bc XREAL=STALER(IDR) +cdsw&bc YREAL=STALER(IDL) +#if WSIZE == 4 + xreal=staler(idr) + yreal=staler(idl) +#else + n1 = idr*2-1 + m(1) = ipmem(n1) + m(2) = ipmem(n1+1) + xreal = y + n1 = idl*2-1 + m(1) = ipmem(n1) + m(2) = ipmem(n1+1) + yreal = y +#endif +C XREAL,YREAL = WARTOSC PRAWEGO,LEWEGO ARGUMENTU + GO TO (3100,3200,3300,3400),WB +C + + 3100 XREAL=YREAL+XREAL + GO TO 3500 +C - + 3200 XREAL=YREAL-XREAL + GO TO 3500 +C * + 3300 XREAL=YREAL*XREAL + GO TO 3500 +C / +cailvax and all other computers: 3400 IF(YREAL.EQ. 0.0)GO TO 4800 + 3400 if(xreal .eq. 0.0)go to 4800 + XREAL=YREAL/XREAL +C WSTAW XREAL DO SLOWNIKA STALYCH REAL + 3500 RESULT=CREAL(XREAL) + GO TO 1400 +C +C.....LEWY ARGUMENT STALY,PRAWY NIE. +C +C OPERACJA SYMETRYCZNA? + 4000 IF(WB.EQ.3 .OR. WB.EQ.5)GO TO 4050 +C OPERACJA NIESYMETRYCZNA + IF(TRESLT.EQ.NRRE)GO TO 4030 + IDL=SCONST(IDL) + GO TO 1100 + 4030 IDL=SCREAL(IDL) +C +C TUTAJ ROZSZERZENIE O LEWY ARGUMENT 0.0 DLA - , / . +C + GO TO 1500 +C +C OPERACJA SYMETRYCZNA: + , * .ZAMIEN IDL,IDR + 4050 TRDIM=IDL + IDL=IDR + IDR=TRDIM + GO TO 1600 +C +C.....WSPOLNA AKCJA. PRAWY ARG.STALY LUB OP.SYM. I LEWY STALY +C IDL = ATS ROZNEGO OD STALEJ ARG.,IDR=STALA +C OBA ARGUMENTY TYPU INTEGER. +C + 4100 RESULT=TSTEMP(1) + GO TO (4150,4150,4300,4200,4400,4700,4700,4720),WB + 4150 CONTINUE +C +C........... +C - . ZMIEN ZNAK STALEJ + 4200 IDR= -IDR +C +C........... +C + , - . +0 ? + 4300 IF(IDR.EQ.0)GO TO 4810 + CALL QUADR4(37,RESULT,IDL,IDR) + GO TO 1400 +C +C.......... +C * . JAKA TO STALA? + 4400 IF(IDR.LT.0 .OR. IDR.GT.10)GO TO 4720 +C ZATEM STALA 0..10 + IF(IDR-1) 4805 , 4810 , 4500 +C ... MNOZENIE PRZEZ STALA 2..10 /REALIZOWANE PRZEZ SHIFT/ + 4500 OPKOD=62+IDR + 4600 CALL QUADR3(OPKOD,RESULT,IDL) + GO TO 1400 +C +C........... +C DIVE + 4700 IF(IDR.GE.0 .AND. IDR.LE.8)GO TO 4750 +C WSTAW STALA + 4720 IDR=SCONST(IDR) + GO TO 1200 +C ... DZIELENIE PRZEZ STALE 0..8 . WYROZNIJ 0,1,2,4,8 + 4750 N=IDR+1 + GO TO (4800,4810,4820,4720,4840,4720,4720,4720,4880),N +C +C.....DZIELENIE PRZEZ ZERO + 4800 CALL SERROR(460) +C ZASTAP PRZEZ STALA ZERO / DLA MNOZENIA LUB DZIELENIA PRZEZ ZERO / + 4805 ELEM=1 + IF(.NOT.OPTOPT)CALL QUADR2(140,IDL) + RESULT=IDR + GO TO 1400 +C ... ZASTAP PRZEZ ARGUMENT ROZNY OD STALEJ / MNOZENIE,DZIELENIE +C PRZEZ 1 LUB DODAWANIE,ODEJMOWANIE 0 / + 4810 RESULT=IDL + GO TO 1400 +C +C ... DIVE 2 + 4820 OPKOD=75 + GO TO 4600 +C ... DIVE 4 + 4840 OPKOD=74 + GO TO 4600 +C ... DIVE 8 + 4880 OPKOD=73 + GO TO 4600 +C + END + SUBROUTINE SRELAT +C----------------------------------------------------------------------------- +C +C DWA GORNE ELEMENTY STOSU ZAWIERAJA ARGUMENTY RELACJI : +C IS , IN DLA WB= 1,2 LUB +C = , <> , < , <= , > , >= . WB=NUMER RELACJI /3..8/ +C GENERUJE KOD WYZNACZAJACY WARTOSC RELACJI. +C WYROZNIA PRZYPADKI : OBA ARGUMENTY STALE, +C POROWNANIE ZE STALA INTEGER +C POROWNANIE Z ZEREM / 0 LUB 0.0 / +C POROWNANIE Z NONE . +C +C +C ##### OUTPUT CODE : 55 , 56 , 76 , 77 , 78 , 79 , 80 , 81 , +C 82 , 83 , 88 , 89 , 90 , 91 , 92 , 93 , +C 106 , 107 , 108 , 109 , 110 , 111 , +C 123 , 124 , +C 125 , 126 , 127 , 128 , 129 , 130 . +C +C ##### DETECTED ERROR(S) : 475 , 476 . +C +C +#include "stos.h" +#include "blank.h" +C +CCCCCCCCCCCCCCCCCCCCCCCC + INTEGER REL(6),RELCONV(6),RLCASE,ELEM +C REL - TABLICA WYZNACZAJACA WYNIKI POROWNANIA DLA 6 RELACJI, +C BITY 15,14,13 =0 JESLI DLA L

    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 N4f`JG>;I4P|357$RI>m8 literal 0 HcmV?d00001 diff --git a/examples/chin/li1004.log b/examples/chin/li1004.log new file mode 100644 index 0000000..528c80a --- /dev/null +++ b/examples/chin/li1004.log @@ -0,0 +1,631 @@ +program bank22; + + UNIT PRIORITYQUEUE: CLASS; + (* HEAP AS BINARY LINKED TREE WITH FATHER LINK*) + + + + UNIT QUEUEHEAD: CLASS; + (* HEAP ACCESING MODULE *) + VAR LAST,ROOT:NODE; + + UNIT MIN: FUNCTION: ELEM; + BEGIN + IF ROOT=/= NONE THEN RESULT:=ROOT.EL FI; + END MIN; + + UNIT INSERT: PROCEDURE(R:ELEM); + (* INSERTION INTO HEAP *) + VAR X,Z:NODE; + BEGIN + X:= R.LAB; + IF LAST=NONE THEN + ROOT:=X; + ROOT.LEFT,ROOT.RIGHT,LAST:=ROOT + ELSE + IF LAST.NS=0 THEN + LAST.NS:=1; + Z:=LAST.LEFT; + LAST.LEFT:=X; + X.UP:=LAST; + X.LEFT:=Z; + Z.RIGHT:=X; + ELSE + LAST.NS:=2; + Z:=LAST.RIGHT; + LAST.RIGHT:=X; + X.RIGHT:=Z; + X.UP:=LAST; + Z.LEFT:=X; + LAST.LEFT.RIGHT:=X; + X.LEFT:=LAST.LEFT; + LAST:=Z; + FI + FI; + CALL CORRECT(R,FALSE) + END INSERT; + + UNIT DELETE: PROCEDURE(R: ELEM); + VAR X,Y,Z:NODE; + BEGIN + X:=R.LAB; + Z:=LAST.LEFT; + IF LAST.NS =0 THEN + Y:= Z.UP; + Y.RIGHT:= LAST; + LAST.LEFT:=Y; + LAST:=Y; + ELSE + Y:= Z.LEFT; + Y.RIGHT:= LAST; + LAST.LEFT:= Y; + FI; + Z.EL.LAB:=X; + X.EL:= Z.EL; + LAST.NS:= LAST.NS-1; + R.LAB:=Z; + Z.EL:=R; + IF X.LESS(X.UP) THEN CALL CORRECT(X.EL,FALSE) + ELSE CALL CORRECT(X.EL,TRUE) FI; + END DELETE; + + UNIT CORRECT: PROCEDURE(R:ELEM,DOWN:BOOLEAN); + (* CORRECTION OF THE HEAP WITH STRUCTURE BROKEN BY R *) + VAR X,Z:NODE,T:ELEM,FIN,LOG:BOOLEAN; + BEGIN + Z:=R.LAB; + IF DOWN THEN + WHILE NOT FIN DO + IF Z.NS =0 THEN FIN:=TRUE ELSE + IF Z.NS=1 THEN X:=Z.LEFT ELSE + IF Z.LEFT.LESS(Z.RIGHT) THEN X:=Z.LEFT ELSE X:=Z.RIGHT + FI; FI; + IF Z.LESS(X) THEN FIN:=TRUE ELSE + T:=X.EL; + X.EL:=Z.EL; + Z.EL:=T; + Z.EL.LAB:=Z; + X.EL.LAB:=X + FI; FI; + Z:=X; + OD + ELSE + X:=Z.UP; + IF X=NONE THEN LOG:=TRUE ELSE LOG:=X.LESS(Z); FI; + WHILE NOT LOG DO + T:=Z.EL; + Z.EL:=X.EL; + X.EL:=T; + X.EL.LAB:=X; + Z.EL.LAB:=Z; + Z:=X; + X:=Z.UP; + IF X=NONE THEN LOG:=TRUE ELSE LOG:=X.LESS(Z); + FI; + OD + FI; + END CORRECT; + + END QUEUEHEAD; + + + UNIT NODE: CLASS (EL:ELEM); + (* ELEMENT OF THE HEAP *) + VAR LEFT,RIGHT,UP: NODE, NS:INTEGER; + UNIT LESS: FUNCTION(X:NODE): BOOLEAN; + BEGIN + IF X= NONE THEN RESULT:=FALSE + ELSE RESULT:=EL.LESS(X.EL) FI; + END LESS; + END NODE; + + + UNIT ELEM: CLASS(PRIOR:REAL); + (* PREFIX OF INFORMATION TO BE STORED IN NODE *) + VAR LAB: NODE; + UNIT VIRTUAL LESS: FUNCTION(X:ELEM):BOOLEAN; + BEGIN + IF X=NONE THEN RESULT:= FALSE ELSE + RESULT:= PRIOR< X.PRIOR FI; + END LESS; + BEGIN + LAB:= NEW NODE(THIS ELEM); + END ELEM; + + + END PRIORITYQUEUE; + + + + UNIT SIMULATION: PRIORITYQUEUE CLASS; + (* THE LANGUAGE FOR SIMULATION PURPOSES *) + + VAR CURR: SIMPROCESS, (*ACTIVE PROCESS *) + PQ:QUEUEHEAD, (* THE TIME AXIS *) + MAINPR: MAINPROGRAM; + + + UNIT SIMPROCESS: COROUTINE; + (* USER PROCESS PREFIX *) + VAR EVENT, (* ACTIVATION MOMENT NOTICE *) + EVENTAUX: EVENTNOTICE, + (* THIS IS FOR AVOIDING MANY NEW CALLS AS AN RESULT OF *) + (* SUBSEQUENT PASSIVATIONS AND ACTIVATIONS *) + FINISH: BOOLEAN; + + UNIT IDLE: FUNCTION: BOOLEAN; + BEGIN + RESULT:= EVENT= NONE; + END IDLE; + + UNIT TERMINATED: FUNCTION :BOOLEAN; + BEGIN + RESULT:= FINISH; + END TERMINATED; + + UNIT EVTIME: FUNCTION: REAL; + (* TIME OF ACTIVATION *) + BEGIN + IF IDLE THEN CALL ERROR1; + FI; + RESULT:= EVENT.EVENTTIME; + END EVTIME; + + UNIT ERROR1:PROCEDURE; + BEGIN + ATTACH(MAIN); + WRITELN(" AN ATTEMPT TO ACCESS AN IDLE PROCESS TIME"); + END ERROR1; + + UNIT ERROR2:PROCEDURE; + BEGIN + ATTACH(MAIN); + WRITELN(" AN ATTEMPT TO ACCESS A TERMINATED PROCESS TIME"); + END ERROR2; + BEGIN + + RETURN; + INNER; + FINISH:=TRUE; + CALL PASSIVATE; + CALL ERROR2; + END SIMPROCESS; + + + UNIT EVENTNOTICE: ELEM CLASS; + (* A PROCESS ACTIVATION NOTICE TO BE PLACED ONTO THE TIME AXIS PQ *) + VAR EVENTTIME: REAL, PROC: SIMPROCESS; + + UNIT VIRTUAL LESS: FUNCTION(X: EVENTNOTICE):BOOLEAN; + (* OVERWRITE THE FORMER VERSION CONSIDERING EVENTTIME *) + BEGIN + IF X=NONE THEN RESULT:= FALSE ELSE + RESULT:= EVENTTIME< X.EVENTTIME OR + (EVENTTIME=X.EVENTTIME AND PRIOR< X.PRIOR); FI; + + END LESS; + END EVENTNOTICE; + + + UNIT MAINPROGRAM: SIMPROCESS CLASS; + (* IMPLEMENTING MASTER PROGRAM AS A PROCESS *) + BEGIN + DO ATTACH(MAIN) OD; + END MAINPROGRAM; + + UNIT TIME:FUNCTION:REAL; + (* CURRENT VALUE OF SIMULATION TIME *) + BEGIN + RESULT:=CURRENT.EVTIME + END TIME; + + UNIT CURRENT: FUNCTION: SIMPROCESS; + (* THE FIRST PROCESS ON THE TIME AXIS *) + BEGIN + RESULT:=CURR; + END CURRENT; + + UNIT SCHEDULE: PROCEDURE(P:SIMPROCESS,T:REAL); + (* ACTIVATION OF PROCESS P AT TIME T AND DEFINITION OF "PRIOR"- PRIORITY *) + (* WITHIN TIME MOMENT T *) + BEGIN + IF Tv~vckG{o^MVYVwieDf`e5k4Z%+Sf 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 P *) + (* openfile : S x N -> P *) + (* closefile : P -> P *) + (* isopen? : P -> B0 *) + (* frewind : P -> P *) + (* feof : P -> B0 *) + (* fput : P x R -> P *) + (* fget : P -> R *) + (* fseek : P x N -> P *) + (* position : P -> N *) + (* filelen : P -> N *) + (* *) + (* which satisfy the following properties *) + (* *) + (* isopen?(makefile(s,n)) *) + (* position(makefile(s,n)) = 1 *) + (* feof(p) <=> (position(p) = filelen(p)) *) + (* ªisopen?(closefile(p)) *) + (* position(frewind(p)) = 1 *) + (* k position(fseek(p,k)) = k *) + (* *) + (* isopen?(p) => (p':=fput(p,r))(k:=position(p')) *) + (* (p":=fseek(p',k-1)) (r':=fget(p")) (r =r') *) + (* *) + (* isopen?(p) => (p':=frewind(p)) *) + (* (while ªfeof(p') do r:= fget(p') od) true *) + (* *) + (* position(p) ó filelen(p) *) + (* *) + (*** * * * * * * * * * * * * * * * * * * * * * * ***) + +unit FileSystem: class; + (* system plikow bezposredniego dostepu *) + + + (************************************************************) + (* T Y P Y D A N Y C H *) + (************************************************************) + + unit Rfile: class; + (* plik jest ciagiem ponumerowanych rekordow + jednakowej dlugosci *) + + var name: arrayof char (* nazwa zewnetrzna *), + opened: boolean (* czy otwarty *), + reclen (* dlugosc rekordu - w slowach *), + (* rozmiar slowa odpowiada rozmiarowi + liczby typu integer *) + position (* numer biezacego rekordu *), + length: integer (* dlugosc pliku - + numer pozycji nastepnej po + ostatniej zajetej *), + plik: file (* plik bezposredniego dostepu *), + next, prev: Rfile (* wszystkie pliki w systemie + sa powiazane w liste + dwukierunkowa *) + end Rfile; + + + var system: Rfile; (* dowiazanie do straznika listy plikow *) + + + + + +(******************************************************************) +(******************************************************************) + + + + (*****************************************************************) + (* P R O C E D U R Y I F U N K C J E *) + (* S Y S T E M U P L I K O W *) + (*****************************************************************) + + + + (******************************) + (* A U X I L I A R Y *) + (******************************) + + + + unit FindInSystem: function + ( name:arrayof char): Rfile ; + + unit equalstring: function + (s1, s2: arrayof char): boolean; + var i1, i2, len, i: integer; + begin + if s1 = none then + writeln(" 1st parameter in equalstring=none"); + call endrun fi; + if s2 = none then + writeln(" 2nd parameter in equalstring=none"); + call endrun fi; + i1 := lower(s1); i2 := lower(s2); + len := upper(s1) - i1 + 1; + if len =/= upper(s2) - i2 + 1 + then return fi; + for i := 1 to len + do if s1(i1) =/= s2(i2) + then return fi; + i1 := i1 + 1; + i2 := i2 + 1; + od; + result := true + end equalstring; + + var p: Rfile; + begin system.name := name; + p := system.next; + while not equalstring( name, p.name ) + do p := p.next od; + if (p = system) then result := none + else result := p fi; + end FindInSystem; + + (*********************************) + + unit AddToSystem: function + (name: arrayof char): Rfile; + begin + result := new Rfile; + result.name := name; + result.next := system.next; + result.prev := system; + system.next.prev := result; + system.next := result; + end AddToSystem; + + (*********************************) + + unit DeleteFromSystem: procedure + (p:Rfile); + begin + if p = system then return fi; + p.next.prev := p.prev; + p.prev.next := p.next + end DeleteFromSystem; + + (********************************) + + unit FindFileLength: function + (p: file, recl:integer): integer; + + (* odtwarza dlugosc istniejacego pliku, + recl - dlugosc rekord w slowach *) + + var record: arrayof integer, i:integer; + begin + if p = none then + write(" FS - FindFileLength - "); + writeln("file object does not exist"); + return; + fi; + result := 1; + call reset(p); + array record dim (1:recl); + i := recl*intsize; + do + getrec(p,record,i); + if i =/= recl*intsize then exit fi; + result := result + 1; + od; + end FindFileLength; + + + + + + +(*****************************************************************) + +(* M A K E F I L E *) + + (* utworzenie i dolaczenie do systemu nowego pliku + o zadanej nazwie i dlugosci rekordu *) + + + + unit makefile: function + ( name: arrayof char (* nazwa zewnetrzna pliku *), + reclen: integer (* dlugosc rekordu pliku *) ): Rfile; + + begin + if FindInSystem(name) =/= none + (* istnieje w systemie plik o tej nazwie *) + then + writeln(" FS - makefile - file name duplicated"); + fi; + if reclen <= 0 + then + writeln(" FS - makefile - record length should be possitive"); + fi; + result := AddToSystem(name); + result.opened := true; + result .reclen := reclen; + result.position := 1; + result.length := 1; + open (result.plik, direct, name); + call rewrite(result.plik); + end makefile; + + +(***************************************************************) + +(* O P E N F I L E *) + + (* otwarcie i ewentualne dolaczenie do systemu + pliku o zadanej nazwie zewnetrznej i rozmiarze + rekordu *) + + + + unit openfile: function + (name: arrayof char (* nazwa zewnetrzna pliku *), + reclen: integer (* dlugosc rekordu pliku *) ): Rfile; + + begin + if reclen <= 0 + then + writeln(" FS - openfile - record length should be possitive"); + fi; + result := FindInSystem(name); + if result = none then result := AddToSystem(name) fi; + result.opened := true; + result.reclen := reclen; + result.position := 1; + open(result.plik, direct, name); + result.length := FindFileLength(result.plik,reclen); + if result.length = 1 then call rewrite(result.plik) + else call reset(result.plik) fi; + end openfile; + + +(***************************************************************) + +(* C L O S E F I L E *) + + (* zamkniecie pliku z usunieciem obiektu pliku ; + obiekt typu Rfile pozostaje w systemie z odpowiednia + adnotacja *) + + + unit closefile: procedure (p:Rfile); + begin + if p = none + then + writeln(" FS - closefile - closing nonexisting file"); + fi; + if not p.opened + then + writeln(" FS - closefile - closing not opened file"); + fi; + p. opened := false; + kill(p.plik) + end closefile; + + + +(****************************************************************) + +(* I S O P E N *) + + (* sprawdzenie, czy plik jest otwarty *) + + + unit isopen: function( p:Rfile): boolean; + begin + if p = none + then + writeln(" FS - isopen - testing nonexisting file"); + fi; + result := p.opened + end isopen; + + +(****************************************************************) + +(* F R E W I N D *) + + (* przewiniecie pliku do poczatku *) + + + unit frewind: procedure( p:Rfile); + begin + if p = none + then + writeln(" FS - frewind - rewinding nonexisting file"); + fi; + if not p.opened + then + writeln(" FS - frewind - rewinding net opened file"); + fi; + p.position := 1; + call reset(p.plik) + end frewind; + + +(**************************************************************) + +(* F E O F *) + + (* test, czy koniec pliku *) + + + unit feof: function(p: Rfile): boolean; + begin + if p = none + then + writeln(" FS - feof - testing nonexisting file"); + fi; + if not p.opened + then + writeln(" FS - feof - testing not opened file"); + fi; + result := ( p.position >= p.length ) + end feof; + + +(**************************************************************) + +(* F P U T *) + + (* wlozenie rekordu na plik w miejsce wskazane przez + atrybut position *) + + + + unit fput: procedure( p: Rfile, Record: arrayof integer); + + var ile, i : integer; + begin + if p = none + then + writeln(" FS - fput - file does not exist"); i:= inchar; + fi; + if not p.opened + then + writeln(" FS - fput - file not opened"); + fi; + if p.position > p.length + then + writeln(" FS - fput - try to access after file length"); + fi; + if Record = none + then + writeln(" FS - fput - record does not exist"); + fi; + ile := upper(Record) - lower(Record) + 1; + if ile =/= p.reclen + then + writeln(" FS - fput - wrong record length"); + fi; + i := ile * intsize; + putrec(p.plik, Record, i); + if i =/= ile * intsize + then + writeln(" FS - fput - error during writing "); + fi; + p.position := p.position + 1; + if p.position > p.length then p.length := p.position fi; + end fput; + + +(**************************************************************) + +(* F G E T *) + + (* odczytanie rekordu z pliku z miejsca wskazywanego + przez atrybut position *) + + + unit fget: function( p: Rfile): arrayof integer; + var Record: arrayof integer, + ile, i : integer; + begin + if p = none + then + writeln(" FS - fget - file does not exist "); + fi; + if not p.opened + then + writeln(" FS - fget - file not opened"); + fi; + if p.position >= p.length + then + writeln(" FS - fget - try to read past eof"); + fi; + ile := p.reclen; + array Record dim (1:ile); + i := ile * intsize; + getrec(p.plik, Record, i); + if i =/= ile * intsize + then + writeln(" FS - fget - error during reading"); + fi; + p.position := p.position + 1; + result := Record; + end fget; + + + +(*************************************************************) + +(* F S E E K *) + + (* wyszukanie w pliku rekordu o zadanym numerze - + ustawienie atrybutu position *) + + + + unit fseek: procedure( p: Rfile, nrrec: integer); + + var offset: integer; + begin + if p = none + then + writeln(" FS - fseek - file does not exist"); + fi; + if not p.opened + then + writeln(" FS - fseek - file not opened"); + fi; + if nrrec <= 0 + then + writeln(" FS - fseek - record number should be positive"); + fi; + if nrrec > p.length + then + writeln(" FS - fseek - try to access after file length"); + fi; + p.position := nrrec; + offset := (nrrec - 1) * p.reclen * intsize; + call seek(p.plik, offset, 0) + end fseek; + + + +(************************************************************) + +(* P O S I T I O N *) + + (* answeres the current position of file pointer *) + + + unit position: function( p: Rfile): integer; + begin + if p = none + then + writeln(" FS - position - checking nonexisting file"); + fi; + if not p.opened + then + writeln(" FS - position - checking not opened file"); + fi; + result := p.position + end position; + + +(************************************************************) + +(* F I L E L E N *) + + (* gives the file length - the number of position + immediately after the last one *) + + + unit filelen: function( p: Rfile): integer; + begin + if p = none + then + writeln(" FS - filelen - checking nonexisting file"); + fi; + if not p.opened + then + writeln(" FS - filelen - checking not opened file"); + fi; + result := p.length + end filelen; + + +(**************************************************************) +(**************************************************************) + + + + + + + + + begin (* of FileSystem *) + system := new Rfile; + system.next, system.prev := system; + end FileSystem; + +(***************************************************************) +(* Pakiet Grafiki Blokowej *) +(* *) +(* *) +(* *) +(* *) +(***************************************************************) + unit Bold : procedure; + begin + write( chr(27), "[1m") + end Bold; + + unit Blink : procedure; + begin + write( chr(27), "[5m") + end Blink; + + unit Reverse : procedure; + begin + write( chr(27), "[7m") + end Reverse; + + unit Normal : procedure; + begin + write( chr(27), "[0m") + end Normal; + + unit Underscore : procedure; + begin + write( chr(27), "[4m") + end Underscore; + + + + unit inchar : IIuwgraph function : integer; + (*podaj nr znaku przeslanego z klawiatury *) + var i : integer; + begin + do + i := inkey; + if i <> 0 then exit fi; + od; + result := i; + end inchar; + + unit NewPage : procedure; + begin + write( chr(27), "[2J") + end NewPage; + + unit SetCursor : procedure(row, column : integer); + var c,d,e,f : char, + i,j : integer; + begin + i := row div 10; + j := row mod 10; + c := chr(48+i); + d := chr(48+j); + i := column div 10; + j := column mod 10; + e := chr(48+i); + f := chr(48+j); + write( chr(27), "[", c, d, ";", e, f, "H") + end SetCursor; +h(***************************************************************) +(* koniec Grafiki *) +(***************************************************************) + +unit HandlerOfRelations : FileSystem class(PageSize: integer, + TreeHeight: integer, + HalfPageSize : integer) ; + signal signal8, (*przekroczono wysokosc TreeHeight *) + signal14, (*dwa identyczne klucze o jednakowych ref*) + Signal13; (*sygnal usuwania nieobecnego rekordu*) + signal Signal11, (*nie ma poprzednika w PrevKey*) + Signal12; (*nie ma nastepnika w NextKey*) + + + unit Node : class; + (*klasa prefiksujaca wszystkie klasy wykorzystywane w + interpreterze*) + var Gender:integer + begin + end Node; + +(* unit ObjectToRec : function (n : Node) : arrayof integer; + end ObjectToRec; + + unit RecToObject : function(a: arrayof integer) : Node; + end RecToObject;*) + +(*struktura logiczna + + DataFile + / | \ + Atrybut \ . + | Relation \ | + | \ | + | | + | |IndexFile | | + | | | | + | _______________________ | *) + + + + (******************************************** + * * + * DataFile * + * * + * Reset * + * AddRec * + * DelRec * + * FindRec * + * FreePlace * + * * + * * + ********************************************) + + unit DataFile : Node class; + (*typ DataFile jest wspolnym prefiksem dla Atrybut i +Relation i IndexFile. Ten typ umo*liwia operacje + Wstaw Rekord, UsunRekord etc. *) + var plik : Rfile; + var FreePlace : integer; (* pozycja wolnego miejsca + w pliku*) + + + unit Reset : procedure ; + begin + call fseek(plik,1); + end Reset; + + unit AddRec : procedure (input Record:arrayof integer; + output RefRec:integer); + (*Procedura wstawia rekord Record do DataFile i zwraca +jego pozycje w pliku wykorzystujac przy tym informacje o +wolnych miejscach zapamietana na stosie FreePlace*) + + var AuxRec: arrayof integer; + begin + array AuxRec dim(lower(Record):upper(Record)); + if FreePlace=0 + then + RefRec:=FileLen(plik); + (*jesli nie bylo usunietych rekordow, to Record + zapiszemy na koncu pliku*) + else + RefRec:=FreePlace; + call fseek(plik,RefRec); + AuxRec:=fget(plik);(*odczytanie pozycji poprzed + niego wolnego miejsca, ktore + bedzie teraz aktualnym wolnym miejscem*) + FreePlace:=AuxRec(1); + fi; + call fseek(plik,RefRec); + call fput(plik,Record) + end AddRec; + + unit DelRec: procedure(input DataRef: integer); + (*Procedura usuwa rekord wskazany przez DataRef i wpisuje +na jego miejsce referencje do ostatniego wolnego miejsca. +Pozycja usunietego rekordu jest zapamietana na stosie +FreePlace *) + + var AuxRec: arrayof integer; + begin + call fseek(plik,DataRef); + array AuxRec dim (1 : plik.reclen); + AuxRec(1):=FreePlace; + call fput(plik,AuxRec); + FreePlace:=DataRef; + end DelRec; + + unit FindRec:procedure(input Record:arrayof integer; + output RefRec : integer); +(*Procedura FindRec odszukuje rekord wskazany przez Record +i zwraca jego pozycje w pliku*) + var equal :boolean, + i, Place: integer, + AuxRec: arrayof integer; + begin + array AuxRec dim(lower(Record): upper(Record)); + call Reset; + equal:=false; + while (not feof(plik) and not equal) + do + RefRec := position(plik); + AuxRec:= fget(plik); + for i:=lower(AuxRec) to upper(AuxRec) + do + equal:= AuxRec(i)=Record(i); + if not equal then exit fi + od (*koniec porownywania rekordow*); + (* czy znaleziony jest usunietym wczesniej rekordem? *) + if (equal and FreePlace <> 0) + then + Place:=FreePlace; + while not Place=0 + do + if RefRec = Place + then + equal:=false; + exit (*if equal*) + else + call fseek(plik,Place); + AuxRec:=fget(plik); + Place:=AuxRec(1) + fi; + od; + call fseek(plik,RefRec+plik.reclen); + fi (*if equal*); + od (*eof plik*); + if not equal + then + RefRec:=-1(*nie znalezlismy rekordu*) + fi; + end FindRec; + + begin (*DataFile*) + + FreePlace:=0 + end DataFile; + +(* + ******************************************** + * Relation * + * * + * insert * + * delete * + * retrieve * + * member * + * close * + * open * + * allocate * + * deallocate * + * * + ******************************************** +*) +unit Relation : DataFile class ; + var Index :arrayof IndexFile; + + unit Tuple : Node class; + (*element relacji*) + end Tuple; + + unit virtual TupleToRec : function (t : Tuple): arrayof + integer; + end TupleToRec ; + + unit virtual RecToTuple : function(a : arrayof integer): + Tuple; + end RecToTuple; + + + + unit Insert: procedure (t: Tuple); + var i,PageRef,DataRef:integer; + var AuxRec : arrayof integer; + begin + AuxRec:=TupleToRec(t); + call AddRec(AuxRec, DataRef); + if Index <> none + then + for i:=1 to upper(Index) + do + if Index(i)<>none + then + call Index(i).AddKey(Index(i).KeyOf(t),DataRef) + fi + od; + fi; + end Insert; + + unit Delete : procedure (t: Tuple); + var i,DataRef :integer, + AuxRec : arrayof integer; + begin + if Index =/= none + then (*najpierw szukamy w indeksach i usuwamy tam*) + for i:=1 to upper(Index) + do + if none <> Index(i) + then + DataRef := Index(i).FindKey(Index(i).KeyOf(t)); + call Index(i).DelKey(Index(i).KeyOf(t),DataRef); + (* +DelKey dziala? *) + fi; + od + else (*brak indeksu*) + AuxRec := TupleToRec(t); + call FindRec(AuxRec, DataRef); + fi; + if DataRef = -1 + then + raise Signal13 (*proba usuniecia rekordu ktorego nie ma*) + else + call DelRec(DataRef) ; (*wstawic na liste usuniec*) + fi + end Delete; + + + (* ******************************************** + * IndexFile * + * * + * Key * + * Order * + * Item * + * Page * + * Addkey * + * DelKey * + * NextKey * + * FindKey * + * SearchKey * + * PrevKey * + * MinKey * + * MaxKey * + * Path * + * CloseIndex * + ******************************************** +*) + +unit IndexFile : DataFile coroutine; + + + unit SearchStep: class; + var PageRef,RefOnPage : integer, + updated : boolean; + end SearchStep; + + unit Item : class ; + var ky: key, PageRef: integer, DataRef: integer; + (* item jest jednostka ( rekordem) przechowywana w + indeksie na stronie tzn.Page + zawiera: + ky - klucz, + PageRef - informacje o stronie na ktorej znajduje sie + korzen poddrzewa z kluczami wiekszymi od klucza kl, + a mniejszymi od kluczy podporzadkowanych sasiadowi z + lewej, + DataRef - informacja w ktorym rekordzie zapisano + krotke odpowiadajaca naszemu kluczowi ky*) + end Item; + + unit Page: class; + var ItemsOnPage, (*ilu synow ma ta strona +1*) + LessPageRef: integer; (*wskaznik do poddrzewa elementow +mniejszych od pierwszego klucza na tej stronie*) + var ItemsArray: arrayof Item; + begin + array ItemsArray dim (1:PageSize) + end Page; + + var KeySize: integer; + + unit key : Node class ; + (*definicja klucza zgodnie z zyczeniem uzytkownika*) + end key; + + + var StackOfPages: arrayof Page; + var Finger: integer; (*zmienne StackOfPages i Finger + implementuja stos stron*) + var Path: arrayof SearchStep; (*zmienne Path i Finger + implementuja sciezke*) + +(* axiom: nr strony wskazanej przez Finger w StackOfPages jest + identyczny z numerem strony wskazanym przez Finger w Path*) + + unit virtual KeyOf : function (t : Tuple) : key; + (*KeyOf tworzy z dowolnej krotki klucz zaleznie od + rozwazanego indeksu*) + end KeyOf; + + unit virtual Leq: function (k1,k2 : key):Boolean; + (* Leq sprawdza czy krotki k1,k2 sa w relacji + obowiazujacej w rozwazanym indeksie + zakladamy, ze jest to relacja antysymetryczna*) + end Leq; + + + unit AddKey : procedure (input ky:key,DataRef:integer); + (*wstawienie klucza ky i referencji DataRef do indexu w odpowiednie + miejsce w B-drzewie + DataRef jest adresem rekordu ktory odpowiada kluczowi + w pliku relacji*) + var depth, (*aktualna glebokosc stosu stron*) + PageRef, + i : integer, + AddItem, AuxItem, itm2 : Item, + IncreaseHeight : boolean, + NewRoot : Page, + AuxRec : arrayof integer; + + unit Search : procedure (input itm1 : Item, PageRef : + integer; + output include : boolean, itm2 : + Item); + (*szukaj poczawszy od strony PageRef, miejsca dla itm1; + jezeli nie znajdzie miejsca na tej stronie to +rekurencyjnie szuka na nastepnej odpowiedniej az do +liscia; + jezeli include to WSTAWIA obiekt itm2*) + + var NextPageRef, + ItemRef : integer, + inclde : boolean, + item2 : Item, + AuxPage : Page; + + unit Insert : procedure; + (*wstawia obiekt itm2 na strone PageRef w miejscu ItemRef*) + var OldPage, RightPage : Page, + AuxRec : arrayof integer, + AuxItmArr , + AuxItmArr2 : arrayof Item, + RightPageRef, + i : integer; + begin (*Insert*) + OldPage := StackOfPages(Finger); + if OldPage.ItemsOnPage < PageSize + then (*jest miejsce na tej stronie *) + call UpdatePage (item2, ItemRef, OldPage); + Path(Finger).RefOnPage := ItemRef + 1; + include := false; + else (*strona jest pelna dokonujemy podzialu *) + include := true; + OldPage.ItemsOnPage := HalfPageSize; + Path(Finger).updated := true; + RightPage := new Page; + RightPage.ItemsOnPage := HalfPageSize; + array RightPage.ItemsArray dim (1:PageSize); + AuxItmArr := OldPage.ItemsArray; + AuxItmArr2 := RightPage.ItemsArray; + if ItemRef = HalfPageSize + then (*obiekt itm2=item2 idzie do gory*) + for i := 1 to HalfPageSize + do + AuxItmArr2(i):=AuxItmArr(i+HalfPageSize) + od; + itm2:= item2; + else (*to nie item2 idzie do gory *) + if ItemRef < HalfPageSize + then (*wstawiamy do lewej strony*) + for i := 1 to HalfPageSize + do + AuxItmArr2(i) := + AuxItmArr(i+HalfPageSize) + od; + itm2 := AuxItmArr(HalfPageSize); + for i := HalfPageSize-1 downto ItemRef+1 + do + AuxItmArr(i+1) := + AuxItmArr(i) + od; + AuxItmArr(ItemRef+1) := item2; + else (*ItemRef>HalfPageSize *) + itm2 := AuxItmArr(HalfPageSize+1); + for i := HalfPageSize+2 to ItemRef + do + AuxItmArr2(i-HalfPageSize-1) := + AuxItmArr(i) + od; + AuxItmArr2(ItemRef-HalfPageSize) + := item2; + + for i := ItemRef+1 to PageSize + do + AuxItmArr2(i-HalfPageSize) := + AuxItmArr(i) + od; + fi (*ItemRef < HalfPageSize *) + fi (*ItemRef = HalfPagSize *); +(*****) (* StackOfPages(finger) := OldPage; *) + call fseek(plik,Path(Finger).PageRef); + call fput(plik,PageToRec(StackOfPages(Finger))); + RightPage.LessPageRef := itm2.PageRef; + AuxRec :=PageToRec(RightPage); + call AddRec(AuxRec,RightPageRef); + itm2.PageRef :=RightPageRef; + fi (* *) + end Insert; + + + begin (*Search*) + + if PageRef = -1 + then (*poprzednia strona jest lisciem, nalezy do niej + wstawic itm1 ale z PageRef = -1*) + include := true; + itm2 := itm1; + itm2.PageRef := -1; + else (*przeszukaj te strone*) + Finger, depth := Finger+1; + call GetPage (PageRef); + AuxPage := StackOfPages (Finger); + call SearchPage (AuxPage, itm1, NextPageRef, ItemRef); + call Search(itm1, NextPageRef, include, item2); + if include + then (*wstawic obiekt item2 na strone PageRef w miejsce + ItemRef; jezeli na tej stronie wystarczy miejsca + na nowy obiekt to wstawic go i zgasic include; + jezeli brakuje miejsca to strone dzielimy i + include pozostawiamy zapalone, nowy item itm2 ma + byc wstawiony na wyzszej stronie *) + call Insert; + fi (*include*); + Finger := Finger -1; + fi (*PageRef=-1*); + end Search; + + + begin (*AddKey*) + (*szukaj w korzeniu i powtarzaj rekurencyjnie w odp. + poddrzewach, gdy znajdziesz to sygnal blad + w przeciwnym przypadku*) + Path(1).updated := true; + AuxItem := new Item; + AuxItem.ky := ky; + AuxItem.DataRef := DataRef; + AuxItem.PageRef := -1; + Finger := 0; + call Search(AuxItem, Path(1).PageRef, + IncreaseHeight, AddItem); + if IncreaseHeight + then (*korzen podzielony, dodajemy nowy korzen*) + NewRoot := new Page; + NewRoot.ItemsOnPage := 1; + NewRoot.LessPageRef := Path(1).PageRef; + (*adres prawej czesci starego korzenia*) + array NewRoot.ItemsArray dim (1:PageSize); + NewRoot.ItemsArray(1) := AddItem; + if depth+1 > TreeHeight + then (*przekroczono dopuszczalna wysokosc drzewa*) + raise Signal8 + fi; + for i := 1 to depth + do + StackOfPages(i+1) := StackOfPages(i); + Path(i+1) := Path(i); + od; + StackOfPages(1) := NewRoot; + Path(1) := new SearchStep; + Path(1).RefOnPage := 1; + Path(1).updated := true; + AuxRec :=PageToRec(NewRoot); + call AddRec(AuxRec, PageRef); + Path(1).PageRef := PageRef (*adres nowego korzenia*) ; + Finger := depth+1; + else + Finger := depth; + fi (*IncreaseHeight*); + + end AddKey; + + + + +(*AXIOM po wykonaniu dowolnej operacji zmieniajacej Finger + Finger i Path pokazuja na sciezce jakis item w ktorym jest + klucz tzn. item dla ktorego RefOnPage =/= 0*) + + unit PrevKey : procedure (output ky:key, DataRef:integer); + (*ky jest bezposrednim poprzednikiem klucza biezacego +wskazanego przez Path. DataRef wskazuje referencje do +krotki odpowiadajacej ky w pliku danych*) + var AuxPage : Page, + AuxRec : arrayof integer, + PageRef, nextPageRef, + RefOnPage : integer; + begin (*Zakladamy, ze biezacy klucz jest wskazany przez + Path(Finger)*) + RefOnPage := Path(Finger).RefOnPage; + PageRef:=Path(Finger).PageRef; + AuxPage:=StackOfPages(Finger); + if AuxPage.LessPageRef = -1 + then (*jestesmy w lisciu*) + if RefOnPage <> 1 + then (*poprzednikiem jest sasiad z lewej*) + RefOnPage := RefOnPage -1; + Path(Finger).RefOnPage := RefOnPage + else (*RefOnPage = 1*) + if Finger =1 + then (*to jest korzen*) + ky:=AuxPage.ItemsArray(RefOnPage).ky; + DataRef:=AuxPage.ItemsArray(RefOnPage).DataRef; + raise signal11; (*nie ma poprzednika*) + return; + else + RefOnPage := 0; + while Finger <> 1 and RefOnPage = 0 + do + Finger := Finger-1; + Auxpage := StackOfPages(Finger); + RefOnPage := Path(Finger).RefOnPage + od; + if Finger = 1 and RefOnPage = 0 + then + ky:=AuxPage.ItemsArray(1).ky; + DataRef:=AuxPage.ItemsArray(1).DataRef; + raise signal11; (*nie ma poprzednika*) + return; + fi; + fi (* Finger = 1 *); + fi (* RefOnPage <> 1 *); + else (*to nie jest lisc*) + if RefOnPage = 1 + then + nextPageRef := AuxPage.LessPageRef; + Path(Finger).RefOnPage := 0 + else + RefOnPage := RefOnPage -1; + nextPageRef := AuxPage.ItemsArray(RefOnPage).PageRef; + Path(Finger).RefOnPage := RefOnPage + fi; + while nextPageRef <> -1 (*szukamy najwiekszego syna*) + do + Finger := Finger +1; + PageRef := nextPageRef; + call GetPage(PageRef); + AuxPage := StackOfPages(Finger); + RefOnPage, Path(Finger).RefOnPage := + Auxpage.ItemsOnPage; + nextPageRef := AuxPage.ItemsArray(RefOnPage).PageRef + od; + fi; + ky:=AuxPage.ItemsArray(RefOnPage).ky; + DataRef:=AuxPage.ItemsArray(RefOnPage).DataRef + end PrevKey; + + + unit MinKey : procedure (output k:Key, DataRef : integer); + (*ustawia Pointer do indexu i Path tak by pokazywaly +najmniejszy klucz. k - jest najmniejszym kluczem w +rozwazanym indeksie, DataRef jest odpowiadajaca mu +referencja do rekordu w pliku glownym relacji*) + + var PageRef : integer, + AuxPage : Page, + AuxItem : Item; + + begin + Finger :=1; + do + AuxPage := StackOfPages(Finger); + PageRef := AuxPage.LessPageRef; + Path(Finger).RefOnPage := 0; + if PageRef = -1 then exit fi; + Finger := Finger +1; + call GetPage(PageRef); + od; + AuxItem := AuxPage.ItemsArray(1); + k := AuxItem.ky; + DataRef := AuxItem.DataRef; + Path(Finger).RefOnPage := 1; + + end MinKey; + + unit MaxKey : procedure( output k:Key, DataRef: integer); +(*ustawia Pointer do indexu i Path tak by pokazywaly +najwiekszy klucz*) + var PageRef, n : integer, + AuxPage : Page; + + begin + Finger :=1; + do + AuxPage := StackOfPages(Finger); + Path(Finger).RefOnPage, n := + AuxPage.ItemsOnPage ; + PageRef := AuxPage.ItemsArray(n).PageRef; + if PageRef = -1 then exit fi; + Finger := Finger+1; + call GetPage(PageRef); + od; + k := AuxPage.ItemsArray(n).Ky; + DataRef := AuxPage.ItemsArray(n).DataRef; + + end MaxKey; + + + +(*************************************************************************) + + + unit NextKey: procedure (output ky:key,DataRef:integer); +(*referencja DataRef do bezposredniego nastepnika biezacej + pozycji + ky jest bezposrednim nastepnikiem klucza biezacego + wskazanego przez Path. DataRef wskazuje referencje do + krotki odpowiadajacej ky w pliku danych*) + var AuxPage : Page, + AuxItem : Item, + PageRef,nextPageRef, + RefOnPage : integer; + begin (*Zakladamy, ze biezacy klucz jest wskazany przez + Path(Finger) *) + RefOnPage := Path(Finger).RefOnPage; + PageRef := Path(Finger).PageRef; + AuxPage:=StackOfPages(Finger); + + if AuxPage.LessPageRef = -1 + then (*jestesmy w lisciu*) + while Finger <> 1 and RefOnPage = AuxPage.ItemsOnPage + do + Finger := Finger - 1; + AuxPage := StackOfPages(Finger); + RefOnPage := Path(Finger).refOnPage + od; + if RefOnPage = AuxPage.ItemsOnPage + then + AuxItem := AuxPage.ItemsArray(RefOnPage); + DataRef := AuxItem.DataRef; + ky := AuxItem.ky; + raise signal12; (*nie ma nastepnika*) + return; + else + RefOnPage := RefOnPage+1; + Path(Finger).RefOnPage := RefOnPage + fi; + else (*to nie jest lisc*) + nextPageRef := AuxPage.ItemsArray(RefOnPage).PageRef; + while nextPageRef <> -1 + do + Finger := Finger+1; + PageRef := NextPageRef; + call GetPage(PageRef); + AuxPage := StackOfPages(Finger); + Path(Finger).refOnPage := 0; + NextPageRef := AuxPage.LesspageRef + od; + RefOnPage := 1; + Path(Finger).RefOnPage := 1 + fi; + AuxItem := AuxPage.ItemsArray(RefOnPage); + DataRef := AuxItem.DataRef; + ky := AuxItem.ky + end NextKey; + + + unit DelKey : procedure (input ky:key,DataRef:integer); + (*usuwanie klucza ky, o referencji do pliku glownego + dataref, z indeksu, jezeli takiego klucza nie ma to + sygnal*) + var DataRef1: integer, + k: key, + underflw:boolean; (*true if underflow occurred*) + + unit remove : procedure(output underflw:boolean); + var AuxPage,AuxPage1 :Page, + i,ItemsOnPage,RefOnPage,nextPageRef :integer; + begin + AuxPage:=StackOfPages(Finger); + i:=Finger; + Path(Finger).updated:=true; + RefOnPage := Path(Finger).RefOnPage; + + if AuxPage.LessPageRef <> -1 + then (*to nie jest lisc*) + NextPageRef := + AuxPage.ItemsArray(RefOnPage).PageRef; + while NextPageRef <> -1 + do + Finger := Finger+1; + call GetPage(NextPageRef); + AuxPage1 := StackOfPages(Finger); + Path(Finger).RefOnPage := 0; + NextPageRef := AuxPage1.LessPageRef + od; + Path(Finger).updated:=true; + Path(Finger).RefOnPage := 1; + AuxPage.ItemsArray(RefOnPage).ky:= + AuxPage1.ItemsArray(1).ky; + AuxPage.ItemsArray(RefOnPage).DataRef:= + AuxPage1.ItemsArray(1).DataRef; + StackOfPages(i):=AuxPage;(*wymienilam usuniety element*) + AuxPage:= AuxPage1; + RefOnPage:=1; + fi;(*jestesmy w lisciu*) + + ItemsOnPage:= AuxPage.ItemsOnPage -1; + + for i:=RefOnPage to ItemsOnPage + do + AuxPage.ItemsArray(i):=AuxPage.ItemsArray(i+1) + od; + AuxPage.ItemsOnPage:= ItemsOnPage; + StackOfPages(Finger):=AuxPage; + if ItemsOnPage1 then + AuxPage:=StackOfPages(Finger);(*strona z niedomiarem*) + + Path(Finger).updated:=true ; + Path(Finger-1).updated:=true ; + AuxPage1:=StackOfPages(Finger-1); (*strona ojca*) + RefOnPage:=Path(Finger-1).RefOnPage; + if RefOnPage< AuxPage1.ItemsOnPage + then (*istnieje prawy stryj*) + k:=RefOnPage+1; + Itm:=AuxPage1.ItemsArray(k); + PageRef:=Itm.PageRef; + (*wczytanie strony-brata prawego na AuxPage2*) + call fseek(plik,PageRef); + AuxRec:=fget(plik); + AuxPage2:=RecToPage(AuxRec); + + Itm.PageRef:=AuxPage2.LessPageRef; + AuxPage.ItemsArray(AuxPage.ItemsOnPage+1):=Itm; + (*stryj schodzi do AuxPage*) + n:=AuxPage2.ItemsOnPage-HalfPageSize; + + if n>0 + then + n:=entier((n-1)/2);(* przelewamy n elementow *) + Itm:=AuxPage2.ItemsArray(n+1); + Itm.PageRef:=PageRef; + AuxPage1.ItemsArray(k):=Itm; + for i:=1 to n + do + AuxPage.ItemsArray(HalfPageSize+i):= + AuxPage2.ItemsArray(i) + od; + AuxPage.ItemsOnPage:=HalfPageSize+n; + StackOfPages(Finger):=AuxPage; + StackOfPages(Finger-1):=AuxPage1; + k:=AuxPage2.ItemsOnPage-(n+1); + + for i:=1 to k + do + AuxPage2.ItemsArray(i):= + AuxPage2.ItemsArray(n+1+i) + od; + AuxPage2.ItemsOnPage:=k; + AuxRec:=PageToRec(AuxPage2);(*zapamiet. AuxPage2*) + call fseek(plik,PageRef); + call fput(plik,AuxRec); + else + (*AuxPage2.ItemsOnPage=HalfPageSize tzn. n=0*) + for i:=1 to HalfPageSize + do + AuxPage.ItemsArray(HalfPageSize+i):= + AuxPage2.ItemsArray(i) + od; + AuxPage.ItemsOnPage:=PageSize; + for i:=RefOnPage+2 to AuxPage1.ItemsOnPage + do + AuxPage1.ItemsArray(i-1):= + AuxPage1.ItemsArray(i) + od; + + AuxPage1.ItemsOnPage:=AuxPage1.ItemsOnPage-1; + StackOfPages(Finger-1):=AuxPage1; + StackOfPages(Finger):=AuxPage; + call DelRec(PageRef); + if AuxPage1.ItemsOnPage0*) + + else (*nie ma prawego stryja, wez z lewej*) + if RefOnPage>1 + then + Itm:=AuxPage1.ItemsArray(RefOnPage-1); + PageRef:=Itm.PageRef; + else + PageRef:=AuxPage1.LessPageRef; + fi; + (*wczytanie strony-brata lewego na AuxPage2*) + call fseek(plik,PageRef); + AuxRec:=fget(plik); + AuxPage2:=RecToPage(AuxRec); (*str-brat lewy*) + + Itm:=AuxPage1.ItemsArray(RefOnPage); + Itm.PageRef:=AuxPage.LessPageRef; + n:=AuxPage2.ItemsOnPage-HalfPageSize; + if n>0 + then + n:=entier((n-1)/2); + (*przesun o n+1 w prawo elem na str.AuxPage*) + k:=AuxPage.ItemsOnPage; + for i:=1 to n+1 + do + AuxPage.ItemsArray(k+n+2-i):= + AuxPage.ItemsArray(k+1-i) + od; + + AuxPage.ItemsArray(n+1):=Itm; + (*ojciec do AuxPage*) + AuxPage.ItemsOnPage:=k+n+1; + Itm:=AuxPage2.ItemsArray(HalfPageSize+n+1); + Itm.PageRef:=PageRef; (*referencja do AuxPage*) + AuxPage1.ItemsArray(RefOnPage):=Itm; + for i:=1 to n + do + AuxPage.ItemsArray(i):= + AuxPage2.ItemsArray(HalfPageSize+1+i+n) + od; + AuxPage.ItemsOnPage:=HalfPageSize+n; + AuxPage2.ItemsOnPage:= HalfPageSize+n; + + (*wyslac strony i zapisac sciezke i stos*) + StackOfPages(Finger-1):=AuxPage1; + StackOfPages(Finger):=AuxPage; + (*zapamietanie strony AuxPage2*) + AuxRec:=PageToRec(AuxPage2); + call fseek(plik,PageRef); + call fput(plik,AuxRec); + + else + (*n=o tzn.AuxPage2.ItemsOnPage=HalfPageSize*) + + AuxPage2.ItemsArray(HalfPageSize+1):=Itm; + for i:=1 to HalfPageSize-1 + do + AuxPage2.ItemsArray(HalfPageSize+1+i):= + AuxPage.ItemsArray(i) + od; + AuxPage1.ItemsOnPage:=AuxPage1.ItemsOnPage-1; + AuxPage2.ItemsOnPage:=PageSize; + StackOfPages(Finger-1):=AuxPage1; + StackOfPages(Finger):=AuxPage2; + Path(Finger-1).RefOnPage:=RefOnPage-1; + call DelRec(Path(Finger).PageRef); + (*wyrzucono str AuxPage*) + Path(Finger).PageRef:=PageRef; + + if AuxPage1.ItemsOnPage0*) + + fi(*lewy istnieje*) + + + else (*niedomiar jest w korzeniu*) + AuxPage:=StackOfPages(1); + if AuxPage.ItemsOnPage=0 + then + call DelRec(Path(1).PageRef); + if AuxPage.LessPageRef<>-1 + then + i:=2; + while Path(i)<>none + do + Path(i-1):=Path(i); + StackOfPages(i-1):=StackOfPages(i); + i:=i+1 + od + else + writeln("drzewo znika "); + fi; + fi + fi (*Finger<>1*); + end underflow; + + begin (*DelKey*) + k:=ky; + DataRef1:=FindKey(k); + do + if k=ky and DataRef=DataRef1 + then + (*znalezlismy wlasciwy klucz *) + call remove(underflw); + while underflw + do + call underflow(underflw) + od; + return + else + if k<>ky or DataRef1= -1 + then + writeln("* nie ma takiego klucza *") + else + call NextKey(k,DataRef1) + fi + fi + od + end DelKey; + + + unit FindKey:function (k : key): integer; + (*wynikiem poszukiwania klucza k jest referencja do + datafile wskazujaca na krotke o danym kluczu. Gdy + nie znaleziono, wartoscia funkcji jest -1 *) + var PageRef, + i : integer, + AuxPage : Page, + Itms : arrayof Item, + k1 : Key; + begin + Finger := 1; + PageRef := Path(Finger).PageRef; + do + call GetPage( PageRef ); + (*przeszukujemy strone o adresie Pageref*) + AuxPage := StackOfPages(Finger); + Itms := AuxPage.ItemsArray; + for i := AuxPage.ItemsOnPage downto 1 + do + k1 := Itms(i).ky; + if leq(k1, k) + then + Path(Finger).RefOnPage := i; + if leq(k, k1) + then (*znaleziony*) + result := Itms(i).DataRef; + return + fi; + PageRef := Itms(i).PageRef; + exit; + else + if i =1 + then (*klucz k jest mniejszy od wszystkich kluczy + na rozwazanej stronie*) + PageRef := AuxPage.LessPageRef; + Path(Finger).RefOnPage := 0; + fi; + fi; + od; + + if PageRef = -1 + then (*jestesmy w lisciu, nie ma poszukiwanego klucza*) + if Path(Finger).RefOnPage = 0 + then + Path(Finger).RefOnPage :=1 + fi; + result := -1; + exit (*FindKey*) + else + Finger := Finger+1 + fi; + od; + end FindKey; + +unit SearchKey: procedure(input k:key; + output DataRef : integer); +(*referencja do klucza, ktory jest >=k *) +begin + DataRef:=FindKey(k); + if DataRef=-1 + then + call NextKey(k,DataRef) + fi +end SearchKey; + + + + unit GetPage : procedure(PageRef : integer); + (* wczytanie do stosu stron strony o adresie PageRef, + chyba, ze strona o tej referencji jest juz w stosie. + Poprawienie sciezki i ew. przeslanie do pliku strony + wskazanej przez Path(Finger).PageRef o ile byla zmieniana jej tresc *) + + var AuxRec : arrayof integer; + begin + + if Path(Finger) = none + then + Path(Finger) := new SearchStep; + Path(Finger).Updated := false; + Path(Finger).PageRef := PageRef-1; (*chce by byla roznica ponizej *) + fi; +(*! if Path(Finger).PageRef <> PageRef + then *) (*zmiana strony *) + if Path(Finger).Updated + then (*wyslanie strony na plik, poniewaz byla zmieniana *) + AuxRec := PageToRec(StackOfPages(Finger)); + call fseek(plik, Path(Finger).PageRef); + call fput(plik,AuxRec); + fi (*updated*); + (*wczytanie potrzebnej strony*) + call fseek(plik, PageRef); + AuxRec := fget(plik); + StackOfPages(Finger) := RecToPage(AuxRec); + Path(Finger) := new SearchStep; + Path(Finger).PageRef := PageRef; + Path(Finger).updated := false; +(*! fi *) + + end GetPage ; + + unit UpdatePage : procedure (input AuxItem : Item, + ItemRef : integer, + AuxPage : Page); + (* wstaw AuxItem na wskazanej stronie, w miejscu ItemRef +1 *) + var AuxItmArr : arrayof Item, + n,i: integer; + begin + AuxPage.ItemsOnPage, n := AuxPage.ItemsOnPage +1; + for i := n downto ItemRef +2 + do + AuxItmArr := AuxPage.ItemsArray; + AuxItmArr(i) := AuxItmArr(i-1) + od; + AuxPage.ItemsArray(ItemRef+1) := AuxItem; + Path(Finger).Updated := true; + end UpdatePage ; + + unit order : function (i1, i2 : Item) : boolean; + (*ropzszerzenie porzadku LessOrEqual Leq o badanie DataRef w +przypadku gdy klucze sa rowne *) + + var k1,k2 :key, + n : integer; + + begin + k1 := i1.ky; + k2 := i2.ky; + if Leq(k2,k1) + then (* k2ók1 *) + if Leq(k1, k2) + then (* k1=k2 *) + + (* DORADZAMY zbadaj czy k1 = k2? *************************) + (* potrzebna inna funkcja EQ? booleowska *****************) + (* o odp. wlasnosciach: zwrotnsc,przechodniosc, symetria *) + + n := i1.DataRef - i2.DataRef; + if n=0 + then (*dwa identyczne klucze o jednakowych referencjach*) + raise Signal14 + fi; + result := n<0; + else (* k1>k2 *) + result := false + fi + else (*k1 k2.poz) + end Leq ; + + unit virtual KeyToRec : procedure(ky:klucz, A: arrayof integer, + j: integer); + (*procedura virtualna, ktora przepisuje klucz ky do tablicy + A poczynajac od danego miejsca A(j) do kolejnych KeySize + komorek tej tablicy. *) + + (* *) + var i : integer; + begin + A(j) := ky.poz; + end KeyToRec ; + + unit virtual RecToKey : function(A: arrayof integer, + j:integer): klucz; + (*Funkcja odczytuje KeySize kolejnych komorek z tablicy A + poczynajac od A(j) i tworzy z nich klucz *) + (* *) + var k : klucz; + begin + k := new klucz; + k.poz := A(j); + result := k + end RecToKey ; + + unit DrukujStrone : procedure (PageRef: integer); + var P : Page, + i : integer, + AuxRec : arrayof integer; + begin + if PageRef = -1 then return fi; + for i := 1 to TreeHeight + do + if Path(i) = none then exit fi; + if Path(i).updated + then + call fseek(plik,Path(i).PageRef); + call fput(plik,PageToRec(StackOfPages(i))); + Path(i).updated := false; + fi; + od; + (*wczytaj strone*) + call fseek(plik, PageRef); + AuxRec := fget(plik); + P := RecToPage(AuxRec); + (*drukuj*) + + writeln("stronaRefNr=",PageRef:4," itemow =", P.ItemsOnPage:3); + write(" klucze "); + for i := 1 to P.ItemsOnPage + do + write(P.ItemsArray(i).ky qua klucz.poz:12); + od; +(* 16.08.87 *******************************************************) + writeln; + write(" PgRfs",P.LessPageRef:5); + for i := 1 to P.ItemsOnPage + do + write(P.ItemsArray(i).PageRef:12); + od; + writeln; + call DrukujStrone(P.LessPageRef); + for i := 1 to P.ItemsOnPage + do + call DrukujStrone(P.ItemsArray(i).PageRef); + od; + kill(AuxRec); + end DrukujStrone; + + + var akl : klucz; + + begin (*indeksPozycji*) + KeySize := 1; + akl, akey := new klucz; + (* plik.reclength := 2+(PageSize * (KeySize + 2)); *) + if otworz + then + plik := openfile(unpack("nrpzycji.idx"),2+(PageSize * (KeySize + 2))); + (* odczytac strone-korzen do StackOfPages *) + + Path(1).PageRef := INFO(2); + Path(1).RefOnPage := 1; + call fseek(plik,Path(1).PageRef); + AuxRec := fget(plik); + StackOfPages(1) := RecToPage(AuxRec); + kill(AuxRec); + else + plik := makefile(unpack("nrpzycji.idx"),2+(PageSize * (KeySize + 2)) ); + fi; + return; + (* ZAMYKANIE indexu *) + for i := 1 to TreeHeight + do + if Path(i) = none then exit fi; + if Path(i).updated + then + call fseek(plik,Path(i).PageRef); + call fput(plik,PageToRec(StackOfPages(i))); + Path(i).updated := false; + fi; + od; + (* ZAPISAC nr rekordu - korzenia *) + INFO(2) := Path(1).PageRef; + call closefile(plik); +end IndeksPoz ; + +var IB :IndeksPoz ; + +begin (*bibliografia*) + +if otworz +then + plik:= openfile(unpack("bibliog.dta"), 95); +else + plik:= makefile(unpack("bibliog.dta"), 95); +fi; + ak := new Krotka; + (* call IncreaseIndex( new IndeksAutorow); *) + array Index dim(1 : 2); + Index(1), IA := new IndeksAutorow; + Index(2), IB := new IndeksPoz; +end Bibliografia ; + + + (*deklaracje pomocnicze programu glownego*) + var cha : char, + otworz, (* otwieramy *) + otwarta : boolean, (*czy baza bibliograficzna juz jest otwarta?*) + R : Bibliografia, + i,j : integer, + Rec : arrayof integer; + + unit Czytaj : procedure(a: arrayof char); + (*czytaj tablice znakow *) + var i,j : integer, + cha1: char; + begin + for i := 1 to upper(a) + do + j := inchar; + a(i) := chr(j); + write(a(i)); + if j = 13 + then (*wczytano Enter *) + writeln; + exit + fi; + od; + if i < upper(a) + then + a(i+1) := chr(13) + else + a(upper(a)) := chr(13) + fi + end Czytaj ; + + unit Drukuj : procedure (a : arrayof char); + (*drukuj tablice znakow jako linijke tekstu *) + var i : integer; + begin + for i := 1 to upper(a) + do + write(a(i)); + if ord(a(i)) =13 + then (*wydrukowano Enter *) + exit + fi + od; + end Drukuj ; + +var INFO : arrayof integer, + j1,j2: integer, + extrem : boolean, + infoplik : Rfile; + + handlers + + when Signal13 : + call SetCursor(5,1); + writeln("Trying to delete an already absent record"); + return; + + when Signal11 : + call SetCursor(5,1); + writeln("osiagnieto element minimalny"); + extrem := true; + return; + + when Signal12 : + call SetCursor(5,1); + writeln("osiagnieto element maksymalny"); + extrem := true; + return; + end handlers; + + +begin (*program glowny prefiksowany przez HandlerOfRelations*) + (*dane bibliograficzne*) + (*wyswietl powitanie*) + + array INFO dim (1:3); + call Reverse; + call NewPage; + call SetCursor(13,10); + (*call Normal;*) + (*call Bold;*) + write("TOOLBOX dla baz danych"); + call SetCursor(15,10); + write("test 19v.4"); + call SetCursor(21,10); + (*call Normal;*) + write("G.Mirkowska, A.Salwicki - Lipiec 1988"); + call SetCursor(22,10); + write("klase FileSystem napisala J.Warpechowska"); + call SetCursor(23,68); + write("press a key"); + i := inchar; + call Normal; + call NewPage; + writeln; writeln; writeln; + write( + "Do you wish to use the previously prepared bibliography files?(y/n)?"); + i := inchar; + call Bold; + write(chr(i)); + if i =121 + then + otworz := true; + infoplik := openfile(unpack("bibliog.bas"),3); + INFO := fget(infoplik); + else + otworz := false; + infoplik := makefile(unpack("bibliog.bas"),3); + fi; + + R :=new Bibliografia; + R.FreePlace := Info(3); + call NewPage; + call Reverse; + writeln( + "i-INSERT d-DELETE s-SEARCH m-MINMAX t-TYPE n-NEXT p-PREVIOUS q-QUIT"); + + writeln( + "ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ"); + writeln; + call SetCursor(23,1); + call Normal; + writeln( + "ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ"); + writeln( + " "); + call Blink; + write( + " make a choice "); + call Normal; + call Bold; + call SetCursor(1,76); + cha := chr(inchar); + writeln(cha); + call SetCursor(25,1); + write( + " "); + call SetCursor(5,1); + do + case cha + + when 'q' : (* quit*) + call Blink; + call SetCursor(24,7); + writeln("end of program test19-4, CLOSING FILES"); + call Normal; + call SetCursor(5,1); + call closefile(R.plik); + attach(R.IA); + attach(R.IB); + INFO(3) := R.FreePlace; + call frewind(infoplik); + call fput(infoplik,INFO); + call closefile(infoplik); + call NewPage; + call endrun; + (* end quit *) + + when 'i': (*read a tuple and INSERT*) + call R.WczytajKrotke; + call SetCursor(24,7); + call Blink; + call Reverse; + write("inserting the tuple"); + call R.Insert(R.ak); + j1,j2 := 1; + call Normal; + call SetCursor(24,7); + write(" "); + + when 't' : (*type*) + call Normal; + call Reverse; + call SetCursor(3,38); + write("print: r-RELATION or b-BTREE "); + cha := chr(inchar); + call Normal; + writeln(cha); + if cha = 'r' + then (*printing relation*) + call SetCursor(24,4); + write(" press SPACEBAR for next record"); + call SetCursor(5,1); + call fseek(R.plik,1); + while not feof(R.plik) + do + Rec := fget(R.plik); + R.ak := R.RecToTuple(Rec); + call R.DrukujKrotke; + call SetCursor(24,19); + i:=inchar; + od; + else (*printing Btree*) + call SetCursor(4,30); + call Reverse; + write("select index: a-AUTHORS or p-POSITIONS "); + call Normal; + cha := chr(inchar); + writeln(cha); + call SetCursor(5,1); + if cha = 'p' + then + call R.IB.DrukujStrone(R.IB.Path(1).PageRef); + else + call R.IA.DrukujStrone(R.IA.Path(1).PageRef); + fi; + + fi (*koniec drukuj*); + + when 's': (*search for a tuple*) + call SetCursor(3,19); + call Reverse; + write(" searching tuple (t)? or key (k)? "); + cha := chr(inchar); + writeln(cha); + call Normal; + if cha = 't' + then (*give a tuple *) + call SetCursor(5,1); + call R.WczytajKrotke; + Rec := R.TupleToRec(R.ak); + call SetCursor(24,7); + call Blink; + call Reverse; + write("searching the tuple"); + + call R.FindRec(Rec, i); + + call Normal; + call SetCursor(24,7); + write(" "); + if i = -1 + then (* *) + writeln(" the tuple not found"); + else (* *) + writeln(" position of the tuple in the datafile = ",i); + (* call fseek(R.plik, i); + Rec := fget(R.plik); + R.ak := R.RecToTuple(rec); + call R.DrukujKrotke; *) + fi; + else (*'k' *) + if cha ='k' + then (*searching in the authors or position index*) + call SetCursor(4,19); + call Reverse; + write("which index: authors(a)? or positions(p)? "); + cha := chr(inchar); + writeln(cha); + call Normal; + if cha = 'a' + then + i := 1; + call SetCursor(5,1); + write(" autor: "); + call Czytaj(R.IA.akl.autor); + + j1 := R.IA.Findkey(R.IA.akl); + if j1<> -1 + then (*znaleziono *) + call SetCursor(24,7); + writeln("tuple found on position = ",j1); + call fseek(R.plik, j1); + Rec := fget(R.plik); + R.ak := R.RecToTuple(Rec); + call R.DrukujKrotke; + else (*nie znaleziono *) + call SetCursor(24,7); + writeln(" tuple not found"); + fi + else (*zakladamy cha ='p'*) + i := 2; + call SetCursor(5,1); + write(" position nr: "); + read(R.IB.akl.poz); + j2 := R.Index(i).Findkey(R.IB.akl); + if j2<> -1 + then (*znaleziono *) + call SetCursor(24,7); + write("tuple found on position = ",j2); + call fseek(R.plik, j2); + Rec := fget(R.plik); + R.ak := R.RecToTuple(rec); + call SetCursor(6,1); + call R.DrukujKrotke; + else (*nie znaleziono *) + call SetCursor(24,7); + writeln(" tuple not found"); + fi ; + fi (*wyboru klucza*); + fi (*cha ='c'*) + fi (*when 's'*); + + + + when 'p': (*show the previous tuple*) + + call SetCursor(4,19); + call Reverse; + write("which index: authors(a)? or positions(p)? "); + cha := chr(inchar); + writeln(cha); + call Normal; + if cha = 'a' + then + if j1>0 + then (*aktualna krotka jest okreslona *) + call R.Index(1).PrevKey(R.IA.akl,j1); + if extrem + then + extrem := false; + j1 :=0; + R.IA.akl := R.IA.new klucz; + else + call SetCursor(24,7); + write("tuple found on position = ",j1); + call fseek(R.plik, j1); + Rec := fget(R.plik); + R.ak := R.RecToTuple(Rec); + call SetCursor(6,1); + call R.DrukujKrotke; + fi; + else (* *) + call SetCursor(24,7); + write("no key has been located yet"); + fi; + else + if j2>0 + then (*aktualna krotka jest okreslona *) + call R.Index(2).PrevKey(R.IB.akl,j2); + if extrem + then + extrem := false; + else + call SetCursor(24,7); + write("tuple found on position = ",j2); + call fseek(R.plik, j2); + Rec := fget(R.plik); + R.ak := R.RecToTuple(Rec); + call SetCursor(6,1); + call R.DrukujKrotke; + fi; + else (* *) + call SetCursor(24,7); + writeln("no key has been located yet"); + fi; + fi (* prev *); + + + when 'm': (*min or max*) + call Reverse; + call SetCursor(3,25); + write("searching index of: authors(a)? or positions(p)?"); + cha := chr(inchar); + call Normal; + writeln(cha); + if cha ='a' + then + call Reverse; + call SetCursor(4,25); + write("searching index of authors: min(i)? or max(x)?"); + cha := chr(inchar); + call Normal; + writeln(cha); + call SetCursor(5,1); + if cha = 'i' + then + call R.IA.MinKey(R.IA.akl, j1); + call SetCursor(24,7); + writeln(" min key found on position = ",j1); + call fseek(R.plik, j1); + Rec := fget(R.plik); + R.ak := R.RecToTuple(Rec); + call SetCursor(6,1); + call R.DrukujKrotke; + else + call R.IA.MaxKey(R.IA.akl, j1); + call SetCursor(24,7); + writeln("max key found on position = ",j1); + call fseek(R.plik, j1); + Rec := fget(R.plik); + R.ak := R.RecToTuple(Rec); + call SetCursor(6,1); + call R.DrukujKrotke; + fi; + else (*wg pozycji*) + call Reverse; + call SetCursor(4,25); + write("searching index of positions: min(i)? or max(x)?"); + cha := chr(inchar); + call Normal; + writeln(cha); + call SetCursor(24,7); + if cha = 'i' + then + call R.IB.MinKey(R.IB.akl, j2); + writeln("tuple found on position = ",j2); + call fseek(R.plik, j2); + Rec := fget(R.plik); + R.ak := R.RecToTuple(Rec); + call SetCursor(6,1); + call R.DrukujKrotke; + else + call R.IB.MaxKey(R.IB.akl, j2); + writeln("tuple found on position = ",j2); + call fseek(R.plik, j2); + Rec := fget(R.plik); + R.ak := R.RecToTuple(Rec); + call SetCursor(6,1); + call R.DrukujKrotke; + fi; + fi; (* end of minmax utility *) + + + when 'n': (*show the next tuple*) + call SetCursor(4,19); + call Reverse; + write("which index: authors(a)? or positions(p)? "); + cha := chr(inchar); + writeln(cha); + call Normal; + call SetCursor(24,7); + if cha = 'a' + then + if j1>0 + then (*aktualna krotka jest okreslona *) + call R.Index(1).NextKey(R.IA.akl,j1); + if extrem + then + extrem := false; + else + writeln("tuple found on position = ",j1); + call fseek(R.plik, j1); + Rec := fget(R.plik); + R.ak := R.RecToTuple(Rec); + call SetCursor(6,1); + call R.DrukujKrotke; + fi; + else (* *) + writeln("no key has been located yet"); + fi; + else + if j2>0 + then (*aktualna krotka jest okreslona *) + call R.Index(2).NextKey(R.IB.akl,j2); + if extrem + then + extrem := false; + else + writeln("tuple found on position = ",j2); + call fseek(R.plik, j2); + Rec := fget(R.plik); + R.ak := R.RecToTuple(Rec); + call SetCursor(6,1); + call R.DrukujKrotke; + fi; + else (* *) + writeln("no key has been located yet"); + fi; + fi (*Next*); + + when 'd': (*delete the actual tuple*) + call Reverse; + call SetCursor(3,25); + write("from index of: authors(a)? or positions(p)?"); + cha := chr(inchar); + call Normal; + writeln(cha); + + if cha ='a' + then (* ustawic aktualna krotke*) + + else + + fi; + + call SetCursor(25,4); + call Blink; + call Reverse; + write("DELETING the actual tuple"); + call R.Delete(R.ak); + + + otherwise + call SetCursor(25,4); + write("REPEAT") + esac; + + call Normal; + call SetCursor(25,1); + write(" "); + call Blink; + call Reverse; + call SetCursor(25,60); + write("press a key"); + call Normal; + call Bold; + call SetCursor(1,76); + write(chr(32)); + i:=inchar; + call Normal; + call SetCursor(3,1); + writeln( + " "); + writeln( + " "); + writeln( + " "); + writeln( + " "); + writeln( + " "); + writeln( + " "); + writeln( + " "); + writeln( + " "); + writeln( + " "); + writeln( + " "); + writeln( + " "); + writeln( + " "); + call SetCursor(24,1); + writeln( + " "); + write( + " "); + + call Normal; + call Blink; + call Reverse; + call SetCursor(25,60); + write("make your choice"); + call Normal; + call Bold; + call SetCursor(1,76); + write(chr(32)); + i := inchar; + cha := chr(i); + call SetCursor(1,76); + writeln(chr(i)); + call SetCursor(25,60); + write(" "); + call SetCursor(5,1); + od + end +end Test19; + diff --git a/examples/database/test19.pcd b/examples/database/test19.pcd new file mode 100644 index 0000000000000000000000000000000000000000..f2d057e524c970f00fb748e56c780328ad69d154 GIT binary patch literal 5890 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 literal 0 HcmV?d00001 diff --git a/examples/demos.pau/sort95/600 b/examples/demos.pau/sort95/600 new file mode 100644 index 0000000..e69de29 diff --git a/examples/demos.pau/sort95/egahint.exe b/examples/demos.pau/sort95/egahint.exe new file mode 100644 index 0000000000000000000000000000000000000000..78049c8809589b86e35253360f25adf7b57bc5a4 GIT binary patch literal 152057 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 literal 0 HcmV?d00001 diff --git a/examples/demos.pau/sort95/sort.ccd b/examples/demos.pau/sort95/sort.ccd new file mode 100644 index 0000000000000000000000000000000000000000..3cf62b81616ab11caa1ff2e1c31bed5c06aa4c92 GIT binary patch literal 368808 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 s+249-78k~dXU=6)then + TAB(i).couleur:= TAB(i).couleur +3; + fi; + od; + end randomize; + + unit virtual trace : procedure (e,y : integer); + var + larg : integer; + begin + larg := 600 div nb_elements; + call RECTANGLE_HISTO (15+e*larg,y-TAB(e).valeur,15+(e+1)*larg-2,y, + TAB(e).couleur); + end trace; + + unit virtual echange : procedure (e1,e2,y : integer); + var + tmp1,tmp2,coul1,h2,larg : integer; + begin + larg := 600 div nb_elements; + call RECTANGLE_HISTO (15+e1*larg,y-100,15+(e1+1)*larg-2,y,7); + call RECTANGLE_HISTO (15+e2*larg,y-100,15+(e2+1)*larg-2,y,7); + h2 := TAB(e2).valeur; + tmp1 := TAB(e1).valeur; + tmp2 := TAB(e1).couleur; + TAB(e1).valeur := TAB(e2).valeur; + TAB(e1).couleur := TAB(e2).couleur; + TAB(e2).valeur := tmp1; + TAB(e2).couleur := tmp2; + coul1 := TAB(e1).couleur; + call RECTANGLE_HISTO (15+e1*larg,y-h2,15+(e1+1)*larg-2,y, + coul1); + call RECTANGLE_HISTO (15+e2*larg,y-tmp1,15+(e2+1)*larg-2,y, + tmp2); + end echange; + + unit virtual compare : function (e1,e2 : integer) : integer; + begin + if TAB(e1).valeur < TAB(e2).valeur then result := -1; + else if TAB(e1).valeur = TAB(e2).valeur then result := 0; + else result := 1; + fi; + fi; + end compare; + + unit virtual copie : procedure ( T : HISTOGRAMMES); + var + i : integer; + begin + for i := 0 to nb_elements-1 do + TAB(i).valeur := T.tab(i).valeur; + TAB(i).couleur := T.tab(i).couleur; + + od; + end copie; + + unit virtual killtab : procedure; + var + i : integer; + begin + for i:=0 to nb_elements-1 do + kill (TAB(i)); + od; + end killtab; + begin + array TAB dim (0:nb_elements-1); + for i:=0 to nb_elements-1 do + TAB(i) := new ENR_ELEMENTS; + od; + end HISTOGRAMMES; + +(********************************************************) +(* CLASSE SURFACES *) +(********************************************************) + unit SURFACES : STR_ELEMENTS class (nb_elements : integer); + unit ENR_ELEMENTS : class; + var + couleur : integer, + longueur: integer, + largeur : integer; + + end ENR_ELEMENTS; + + var + TAB : arrayof ENR_ELEMENTS, + i : integer ; + + + unit virtual randomize : procedure; + var i,largeur_max,surf_interne : integer; + begin + for i := 0 to nb_elements-1 + do + largeur_max := 25; + TAB(i).longueur := (random*largeur_max)+1; + TAB(i).largeur := (random * largeur_max)+1; + surf_interne := TAB(i).longueur * TAB(i).largeur; + TAB(i).couleur := (surf_interne * 12) + div (largeur_max*largeur_max)+1; + if(TAB(i).couleur>=6)then + TAB(i).couleur:= TAB(i).couleur +3; + fi; + od; + end randomize; + + unit virtual trace : procedure (e,y : integer); + var + larg,xx,yy : integer; + begin + larg := 25; + xx := (e mod 20)*30+30; + yy := y - 90 + (e div 20 )*30; + call RECTANGLE_HISTO (xx-(tab(e).largeur div 2), + yy-(tab(e).longueur div 2), + xx+((TAB(e).largeur+1) div 2), + yy+((TAB(e).longueur+1) div 2),TAB(e).couleur); + end trace; + + + unit virtual echange : procedure (e1,e2,y : integer); + var + xx1,yy1,xx2,yy2,tmp1,tmp2,tmp3,coul1,h2long, + h2larg,larg : integer; + begin + + larg := 25; + xx1 := (e1 mod 20)*30+30; + yy1 := y - 90 + (e1 div 20 )*30; + xx2 := (e2 mod 20)*30+30; + yy2 := y - 90 + (e2 div 20 )*30; + + call RECTANGLE_HISTO (xx1-(tab(e1).largeur div 2), + yy1-(tab(e1).longueur div 2), + xx1+((TAB(e1).largeur+1) div 2), + yy1+((TAB(e1).longueur+1) div 2),7); + call RECTANGLE_HISTO (xx2-(tab(e2).largeur div 2), + yy2-(tab(e2).longueur div 2), + xx2+((TAB(e2).largeur+1) div 2), + yy2+((TAB(e2).longueur+1) div 2),7); + h2larg := TAB(e2).largeur; + h2long := TAB(e2).longueur; + tmp1 := TAB(e1).largeur; + tmp2 := TAB(e1).longueur; + tmp3 := TAB(e1).couleur; + TAB(e1).largeur := TAB(e2).largeur; + TAB(e1).longueur := TAB(e2).longueur; + TAB(e1).couleur := TAB(e2).couleur; + TAB(e2).largeur := tmp1; + TAB(e2).longueur := tmp2; + TAB(e2).couleur := tmp3; + coul1 := TAB(e1).couleur; + call RECTANGLE_HISTO (xx1-(h2larg div 2), + yy1-(h2long div 2), + xx1+((h2larg+1) div 2), + yy1+((h2long+1) div 2),coul1); + call RECTANGLE_HISTO (xx2-(tmp1 div 2), + yy2-(tmp2 div 2), + xx2+((tmp1+1) div 2), + yy2+((tmp2+1) div 2),tmp3); + end echange; + + unit virtual compare : function (e1,e2 : integer) : integer; + var + surf1,surf2 : integer; + begin + + surf1 := TAB(e1).largeur * TAB(e1).longueur; + surf2 := TAB(e2).largeur * TAB(e2).longueur; + if surf1 < surf2 then result := -1; + else if surf1 = surf2 then result := 0; + else result := 1; + fi; + fi; + end compare; + + unit virtual copie : procedure ( T : SURFACES); + var + i : integer; + begin + for i := 0 to nb_elements-1 do + TAB(i).largeur := T.tab(i).largeur; + TAB(i).longueur := T.tab(i).longueur; + TAB(i).couleur := T.tab(i).couleur; + od; + end copie; + + unit virtual killtab : procedure; + var + i : integer; + begin + for i:=0 to nb_elements-1 do + kill (TAB(i)); + od; + end killtab; + begin + array TAB dim (0:nb_elements-1); + for i:=0 to nb_elements-1 do + TAB(i) := new ENR_ELEMENTS; + od; + end SURFACES; + +(********************************************************) +(* CLASSE POLYNOME *) +(********************************************************) + unit POLY : STR_ELEMENTS class (nb_elements : integer); + unit ENR_ELEMENTS : class; + var + coeff : arrayof integer, + degre : integer; + end ENR_ELEMENTS; + var + TAB : arrayof ENR_ELEMENTS, + i : integer , + x : integer ; + +unit CAL_POLYNOME : function (indice : integer): integer; + var + somme,i : integer; + begin + somme := TAB(indice).coeff(TAB(indice).degre); + i := TAB(indice).degre - 1; + while (i>=0) + do + somme := somme * x +TAB(indice).coeff(i); + i := i -1; + od; + result := somme; + end CAL_POLYNOME; + + unit virtual randomize : procedure; + var + i,j,deg,valeur,test : integer; + begin + for i := 0 to nb_elements-1 + do + deg := (random * 5) + 1; + x := (random * 7) + 1; + TAB(i).degre := deg; + test := 0; + while (test = 0) + do + for j := 0 to deg + do + TAB(i).coeff(j) := random*9 - 4; + test := TAB(i).coeff(j) + test; + od; + od; + od; + call AFFICHE_INFO; + end randomize; + + unit affchar : procedure (n : integer); + begin + case n + when 0 : call outstring ("0"); + when 1 : call outstring ("1"); + when 2 : call outstring ("2"); + when 3 : call outstring ("3"); + when 4 : call outstring ("4"); + when 5 : call outstring ("5"); + when 6 : call outstring ("6"); + when 7 : call outstring ("7"); + when 8 : call outstring ("8"); + when 9 : call outstring ("9"); + esac; + end; + + unit AFFICHE_INFO : procedure ; + begin + + call color (15); + call move (520,160); + call outstring ("VALEUR X : "); + call affchar(x); + call move (520,335); + call outstring ("VALEUR X : "); + call affchar(x); + call color (8); + call move (521,161); + call outstring ("VALEUR X : "); + call affchar(x); + call move (521,336); + call outstring ("VALEUR X : "); + call affchar(x); + + call color (4); + call RECTANGLE (8,5,12,85); + call move (8,85); + call draw (4,85); + call draw (10,90); + call draw (16,85); + call draw (12,85); + call RECTANGLE (8,180,12,259); + call move (8,259); + call draw (4,259); + call draw (10,264); + call draw (16,259); + call draw (12,259); + end ; + + unit virtual trace : procedure (e,y : integer); + var + xx,yy,i,nbchar : integer, + debut : boolean; + begin + xx := (e div 10)*320+20; + yy := y-100+(e mod 10)*8; + call move (xx,yy); + nbchar := 0; + debut := true; + for i:=TAB(e).degre downto 0 do + if tab(e).coeff(i)<>0 then + + if TAB(e).coeff(i)<0 then + call outstring ("-"); + nbchar := nbchar + 1; + else + if not debut then + call outstring ("+"); + nbchar := nbchar + 1; + fi; + fi; + debut := false; + if ((tab(e).coeff(i)<>1) and + (tab(e).coeff(i)<>-1)) or (i=0) then + if tab(e).coeff(i)>=0 then + call affchar (TAB(e).coeff(i)); + else + call affchar (-TAB(e).coeff(i)); + fi; + nbchar := nbchar + 1; + fi; + if i<>0 then + call outstring ("X"); + if i<>1 then + call outstring ("^"); + call affchar (i); + nbchar := nbchar + 2; + fi; + nbchar := nbchar + 1; + fi; + fi; + od; + for i:=nbchar to 25 do + call outstring (" "); + od; + end trace; + + unit virtual echange : procedure (e1,e2,y : integer); + var + i ,sauve_degre,sauve_coef : integer; + + begin + + sauve_degre := TAB(e2).degre; + TAB(e2).degre := TAB(e1).degre; + TAB(e1).degre := sauve_degre; + + for i := 5 downto 0 + do + sauve_coef := TAB(e2).coeff(i); + TAB(e2).coeff(i) := TAB(e1).coeff(i); + TAB(e1).coeff(i) := sauve_coef; + od; + + call trace (e1,y); + call trace (e2,y); + + end echange; + + unit virtual compare : function (e1,e2 : integer) : integer; + var + val1,val2 : integer; + begin + val1 := CAL_POLYNOME(e1); + val2 := CAL_POLYNOME(e2); + if val1=0) do + call RECTANGLE (x1+k,y1+k,x2-k,y2-k); + i := i+1; + j := j+1; + k := k-1; + od; + call color (c3); + call RECTANGLE (x1,y1,x2,y2); +end EFFACE; + + +UNIT BOX_MESSAGE : function (chaine:string;x1,y1,x2,y2:integer): boolean ; + + VAR + succes,gauche,droit,centre : boolean, + x,y,p,i:integer; + BEGIN + succes := false; + call BOUTON (x1,y1,x2,y2,7,9,1); + call move (x1+20,y1+30); + call outstring (chaine); + call BOUTON (x1+80,y2-50,x1+150,y2-15,7,15,8); + call BOUTON (x1+200,y2-50,x1+270,y2-15,7,15,8); + call move (x1+94,y2-35); + call color (4); + call outstring ("O U I"); + call move (x1+214,y2-35); + call outstring ("N O N "); + do + call showcursor; + call getpress (0,x,y,p,gauche,droit,centre); + if (gauche) then + call hidecursor; + if (x > (x1+80) and x < (x1 + 150) and y>(y2-50) and y<(y2-15)) then + call BOUTON (x1+80,y2-50,x1+150,y2-15,7,8,15); + call move (x1+90,y2-35); + call color (8); + call outstring ("O U I"); + call delai (2000); + call move (x1+90,y2-35); + call color (8); + call outstring ("O U I"); + call BOUTON (x1+80,y2-50,x1+150,y2-15,7,15,8); + call move (x1+90,y2-35); + call color (8); + call outstring ("O U I"); + succes := true; + exit ; + fi; + if (x>(x1+200) and x<(x1+270) and y>(y2-50) and y<(y2-15)) then + call BOUTON (x1+200,y2-50,x1+270,y2-15,7,8,15); + call color (8); + call move (x1+210,y2-35); + call outstring ("N O N "); + call delai (2000); + call move (x1+210,y2-35); + call outstring ("N O N "); + call BOUTON (x1+200,y2-50,x1+270,y2-15,7,15,8); + call color (8); + call move (x1+210,y2-35); + call outstring ("N O N "); + exit; + fi; + call showcursor; + fi; + od; + result := succes; +END BOX_MESSAGE; + +unit carre : procedure (x,y : integer); + begin + call RECTANGLE_PLEIN (x,y,x+39,y+31,7,15); + call color (15); + call move (x,y+29); + call draw (x,y); + call draw (x+37,y); + call color (8); + call draw (x+37,y+29); + call draw (x+1,y+29); + call color (8); + call move (x+38,y+3); + call draw (x+38,y+30); + call draw (x+3,y+30); + end; + + unit eff_titre : procedure; + var + f : file, + i,j : integer, + n : integer, + col : integer, + A : arrayof char, + map : arrayof integer, + c : char; + begin + for i:=5 to 10 do + for j:=0 to 1 do + call carre (i*40,j*32); + od; + od; + + end eff_titre; + + unit tracev : procedure (x,y2,y1 : integer); + begin + call move (x,y1); + call vfill (y2); + end tracev; + + unit dessinstat : procedure (x,y,c : integer); + begin + call color (c); + call tracev (3+x,16+y,13+y); call tracev (3+x,33+y,32+y); + call tracev (4+x,18+y,8+y); call tracev (4+x,34+y,32+y); + call tracev (5+x,20+y,7+y); call tracev (5+x,35+y,32+y); + call tracev (6+x,21+y,6+y); call tracev (6+x,36+y,33+y); + call tracev (7+x,22+y,5+y); call tracev (7+x,36+y,34+y); + call tracev (8+x,23+y,4+y); call tracev (8+x,37+y,34+y); + call tracev (9+x,24+y,3+y); call tracev (9+x,37+y,35+y); + call tracev (10+x,24+y,3+y); call tracev (10+x,38+y,35+y); + call tracev (11+x,25+y,2+y); call tracev (11+x,38+y,36+y); + call tracev (12+x,26+y,2+y); call tracev (12+x,38+y,36+y); + call tracev (13+x,26+y,2+y); call tracev (13+x,38+y,36+y); + call tracev (14+x,27+y,2+y); call tracev (14+x,39+y,36+y); + call tracev (15+x,28+y,2+y); call tracev (15+x,39+y,36+y); + call tracev (16+x,29+y,2+y); call tracev (16+x,39+y,35+y); + call tracev (17+x,29+y,2+y); call tracev (17+x,39+y,35+y); + call tracev (18+x,39+y,2+y); call tracev (19+x,8+y,2+y); + call tracev (19+x,39+y,10+y); call tracev (20+x,6+y,2+y); + call tracev (20+x,38+y,11+y); call tracev (21+x,5+y,2+y); + call tracev (21+x,38+y,12+y); call tracev (22+x,4+y,2+y); + call tracev (22+x,38+y,13+y); call tracev (23+x,4+y,2+y); + call tracev (23+x,38+y,14+y); call tracev (24+x,4+y,2+y); + call tracev (24+x,38+y,14+y); call tracev (25+x,4+y,2+y); + call tracev (25+x,38+y,15+y); call tracev (26+x,4+y,2+y); + call tracev (26+x,37+y,15+y); call tracev (27+x,5+y,2+y); + call tracev (27+x,37+y,16+y); call tracev (28+x,5+y,3+y); + call tracev (28+x,36+y,17+y); call tracev (29+x,6+y,3+y); + call tracev (29+x,36+y,18+y); call tracev (30+x,8+y,4+y); + call tracev (30+x,35+y,19+y); call tracev (31+x,4+y,2+y); + call tracev (31+x,9+y,5+y); call tracev (31+x,34+y,20+y); + call tracev (32+x,4+y,2+y); call tracev (32+x,9+y,6+y); + call tracev (32+x,33+y,22+y); call tracev (33+x,4+y,2+y); + call tracev (33+x,9+y,8+y); call tracev (33+x,30+y,25+y); + call tracev (34+x,4+y,2+y); call tracev (35+x,4+y,2+y); + call tracev (36+x,4+y,2+y); call tracev (37+x,4+y,2+y); + call tracev (38+x,4+y,2+y); call tracev (39+x,4+y,2+y); + call tracev (40+x,4+y,2+y); call tracev (41+x,4+y,2+y); + call tracev (42+x,38+y,2+y); call tracev (43+x,38+y,2+y); + call tracev (44+x,38+y,2+y); call tracev (45+x,38+y,2+y); + call tracev (46+x,38+y,2+y); call tracev (47+x,38+y,2+y); + call tracev (48+x,38+y,2+y); call tracev (49+x,38+y,2+y); + call tracev (50+x,38+y,2+y); call tracev (51+x,38+y,2+y); + call tracev (52+x,38+y,2+y); call tracev (53+x,38+y,2+y); + call tracev (54+x,38+y,2+y); call tracev (55+x,38+y,2+y); + call tracev (56+x,38+y,2+y); call tracev (57+x,38+y,2+y); + call tracev (58+x,38+y,2+y); call tracev (59+x,38+y,2+y); + call tracev (60+x,38+y,2+y); call tracev (61+x,4+y,2+y); + call tracev (61+x,38+y,37+y); call tracev (62+x,4+y,2+y); + call tracev (62+x,38+y,35+y); call tracev (63+x,4+y,2+y); + call tracev (63+x,38+y,33+y); call tracev (64+x,4+y,2+y); + call tracev (64+x,37+y,31+y); call tracev (65+x,4+y,2+y); + call tracev (65+x,35+y,29+y); call tracev (66+x,4+y,2+y); + call tracev (66+x,34+y,27+y); call tracev (67+x,4+y,2+y); + call tracev (67+x,34+y,25+y); call tracev (68+x,4+y,2+y); + call tracev (68+x,29+y,23+y); call tracev (68+x,34+y,31+y); + call tracev (69+x,4+y,2+y); call tracev (69+x,27+y,21+y); + call tracev (69+x,34+y,31+y); call tracev (70+x,4+y,2+y); + call tracev (70+x,25+y,19+y); call tracev (70+x,34+y,31+y); + call tracev (71+x,23+y,17+y); call tracev (71+x,34+y,31+y); + call tracev (72+x,25+y,15+y); call tracev (72+x,34+y,31+y); + call tracev (73+x,27+y,13+y); call tracev (73+x,34+y,31+y); + call tracev (74+x,29+y,11+y); call tracev (74+x,34+y,31+y); + call tracev (75+x,34+y,9+y); call tracev (76+x,34+y,7+y); + call tracev (77+x,35+y,5+y); call tracev (78+x,37+y,3+y); + call tracev (79+x,38+y,2+y); call tracev (80+x,38+y,3+y); + call tracev (81+x,38+y,5+y); call tracev (82+x,38+y,7+y); + call tracev (83+x,38+y,9+y); call tracev (84+x,38+y,11+y); + call tracev (85+x,38+y,13+y); call tracev (86+x,38+y,15+y); + call tracev (87+x,38+y,17+y); call tracev (88+x,38+y,19+y); + call tracev (89+x,4+y,2+y); call tracev (89+x,38+y,21+y); + call tracev (90+x,4+y,2+y); call tracev (90+x,38+y,23+y); + call tracev (91+x,4+y,2+y); call tracev (91+x,38+y,25+y); + call tracev (92+x,4+y,2+y); call tracev (92+x,38+y,27+y); + call tracev (93+x,4+y,2+y); call tracev (93+x,38+y,29+y); + call tracev (94+x,4+y,2+y); call tracev (94+x,38+y,31+y); + call tracev (95+x,4+y,2+y); call tracev (95+x,38+y,33+y); + call tracev (96+x,4+y,2+y); call tracev (96+x,38+y,35+y); + call tracev (97+x,4+y,2+y); call tracev (97+x,38+y,37+y); + call tracev (98+x,4+y,2+y); call tracev (99+x,38+y,2+y); + call tracev (100+x,38+y,2+y); call tracev (101+x,38+y,2+y); + call tracev (102+x,38+y,2+y); call tracev (103+x,38+y,2+y); + call tracev (104+x,38+y,2+y); call tracev (105+x,38+y,2+y); + call tracev (106+x,38+y,2+y); call tracev (107+x,38+y,2+y); + call tracev (108+x,38+y,2+y); call tracev (109+x,38+y,2+y); + call tracev (110+x,38+y,2+y); call tracev (111+x,38+y,2+y); + call tracev (112+x,38+y,2+y); call tracev (113+x,38+y,2+y); + call tracev (114+x,38+y,2+y); call tracev (115+x,38+y,2+y); + call tracev (116+x,38+y,2+y); call tracev (117+x,38+y,2+y); + call tracev (118+x,4+y,2+y); call tracev (119+x,4+y,2+y); + call tracev (120+x,4+y,2+y); call tracev (121+x,4+y,2+y); + call tracev (122+x,4+y,2+y); call tracev (123+x,4+y,2+y); + call tracev (124+x,4+y,2+y); call tracev (124+x,16+y,10+y); + call tracev (124+x,34+y,32+y); call tracev (125+x,4+y,2+y); + call tracev (125+x,19+y,8+y); call tracev (125+x,35+y,32+y); + call tracev (126+x,4+y,2+y); call tracev (126+x,21+y,6+y); + call tracev (126+x,35+y,32+y); call tracev (127+x,4+y,2+y); + call tracev (127+x,22+y,5+y); call tracev (127+x,36+y,33+y); + call tracev (128+x,22+y,5+y); call tracev (128+x,36+y,34+y); + call tracev (129+x,23+y,4+y); call tracev (129+x,37+y,34+y); + call tracev (130+x,24+y,3+y); call tracev (130+x,38+y,35+y); + call tracev (131+x,25+y,2+y); call tracev (131+x,38+y,36+y); + call tracev (132+x,26+y,2+y); call tracev (132+x,38+y,36+y); + call tracev (133+x,26+y,2+y); call tracev (133+x,38+y,36+y); + call tracev (134+x,27+y,2+y); call tracev (134+x,39+y,36+y); + call tracev (135+x,28+y,2+y); call tracev (135+x,39+y,36+y); + call tracev (136+x,29+y,2+y); call tracev (136+x,39+y,36+y); + call tracev (137+x,29+y,2+y); call tracev (137+x,39+y,35+y); + call tracev (138+x,31+y,2+y); call tracev (138+x,39+y,33+y); + call tracev (139+x,39+y,2+y); call tracev (140+x,6+y,2+y); + call tracev (140+x,39+y,11+y); call tracev (141+x,5+y,2+y); + call tracev (141+x,38+y,12+y); call tracev (142+x,5+y,2+y); + call tracev (142+x,38+y,13+y); call tracev (143+x,4+y,2+y); + call tracev (143+x,38+y,14+y); call tracev (144+x,4+y,2+y); + call tracev (144+x,38+y,14+y); call tracev (145+x,4+y,2+y); + call tracev (145+x,38+y,15+y); call tracev (146+x,4+y,2+y); + call tracev (146+x,38+y,15+y); call tracev (147+x,4+y,2+y); + call tracev (147+x,37+y,16+y); call tracev (148+x,5+y,2+y); + call tracev (148+x,37+y,16+y); call tracev (149+x,5+y,3+y); + call tracev (149+x,36+y,17+y); call tracev (150+x,6+y,3+y); + call tracev (150+x,36+y,18+y); call tracev (151+x,8+y,4+y); + call tracev (151+x,35+y,20+y); call tracev (152+x,9+y,6+y); + call tracev (152+x,33+y,21+y); call tracev (153+x,9+y,7+y); + call tracev (153+x,32+y,22+y); + call tracev (154+x,9+y,8+y); + call tracev (154+x,28+y,25+y); +end dessinstat; + + unit dessinmenu : procedure (x,y,c : integer); + begin + call color (c); + call tracev (8+x,47+y,45+y); call tracev (9+x,47+y,43+y); + call tracev (10+x,45+y,40+y); call tracev (11+x,43+y,38+y); + call tracev (12+x,41+y,35+y); call tracev (13+x,38+y,32+y); + call tracev (14+x,36+y,30+y); call tracev (15+x,37+y,27+y); + call tracev (16+x,38+y,25+y); call tracev (17+x,40+y,22+y); + call tracev (18+x,41+y,20+y); call tracev (19+x,43+y,17+y); + call tracev (20+x,44+y,14+y); call tracev (21+x,46+y,12+y); + call tracev (22+x,47+y,10+y); call tracev (23+x,46+y,11+y); + call tracev (24+x,44+y,13+y); call tracev (25+x,43+y,14+y); + call tracev (26+x,41+y,16+y); call tracev (27+x,40+y,17+y); + call tracev (28+x,38+y,19+y); call tracev (29+x,37+y,20+y); + call tracev (30+x,36+y,22+y); call tracev (31+x,38+y,20+y); + call tracev (32+x,41+y,19+y); call tracev (33+x,43+y,17+y); + call tracev (34+x,45+y,16+y); call tracev (35+x,47+y,14+y); + call tracev (36+x,47+y,13+y); call tracev (37+x,47+y,11+y); + call tracev (38+x,47+y,10+y); call tracev (39+x,47+y,12+y); + call tracev (40+x,47+y,14+y); call tracev (41+x,47+y,17+y); + call tracev (42+x,47+y,19+y); call tracev (43+x,47+y,21+y); + call tracev (44+x,47+y,24+y); call tracev (45+x,47+y,26+y); + call tracev (46+x,47+y,29+y); call tracev (47+x,47+y,31+y); + call tracev (48+x,47+y,33+y); call tracev (49+x,47+y,36+y); + call tracev (50+x,47+y,38+y); call tracev (51+x,47+y,41+y); + call tracev (52+x,47+y,43+y); call tracev (53+x,47+y,45+y); + call tracev (55+x,47+y,10+y); call tracev (56+x,47+y,10+y); + call tracev (57+x,47+y,10+y); call tracev (58+x,47+y,10+y); + call tracev (59+x,47+y,10+y); call tracev (60+x,47+y,10+y); + call tracev (61+x,47+y,10+y); call tracev (62+x,47+y,10+y); + call tracev (63+x,47+y,10+y); call tracev (64+x,47+y,10+y); + call tracev (65+x,47+y,10+y); call tracev (66+x,47+y,10+y); + call tracev (67+x,47+y,10+y); call tracev (68+x,47+y,10+y); + call tracev (69+x,47+y,10+y); call tracev (70+x,47+y,10+y); + call tracev (71+x,47+y,10+y); call tracev (72+x,47+y,10+y); + call tracev (73+x,13+y,10+y); call tracev (73+x,23+y,21+y); + call tracev (73+x,47+y,44+y); call tracev (74+x,13+y,10+y); + call tracev (74+x,23+y,21+y); call tracev (74+x,47+y,44+y); + call tracev (75+x,13+y,10+y); call tracev (75+x,23+y,21+y); + call tracev (75+x,47+y,44+y); call tracev (76+x,13+y,10+y); + call tracev (76+x,23+y,21+y); call tracev (76+x,47+y,44+y); + call tracev (77+x,13+y,10+y); call tracev (77+x,23+y,21+y); + call tracev (77+x,47+y,44+y); call tracev (78+x,13+y,10+y); + call tracev (78+x,23+y,21+y); call tracev (78+x,47+y,44+y); + call tracev (79+x,13+y,10+y); call tracev (79+x,23+y,21+y); + call tracev (79+x,47+y,44+y); call tracev (80+x,13+y,10+y); + call tracev (80+x,23+y,21+y); call tracev (80+x,47+y,44+y); + call tracev (81+x,13+y,10+y); call tracev (81+x,23+y,21+y); + call tracev (81+x,47+y,44+y); call tracev (82+x,13+y,10+y); + call tracev (82+x,23+y,21+y); call tracev (82+x,47+y,44+y); + call tracev (83+x,13+y,10+y); call tracev (83+x,23+y,21+y); + call tracev (83+x,47+y,44+y); call tracev (84+x,13+y,10+y); + call tracev (84+x,23+y,21+y); call tracev (84+x,47+y,44+y); + call tracev (85+x,13+y,10+y); call tracev (85+x,23+y,21+y); + call tracev (85+x,47+y,44+y); call tracev (86+x,13+y,10+y); + call tracev (86+x,23+y,21+y); call tracev (86+x,47+y,44+y); + call tracev (87+x,13+y,10+y); call tracev (87+x,23+y,21+y); + call tracev (87+x,47+y,44+y); call tracev (88+x,23+y,21+y); + call tracev (88+x,47+y,44+y); call tracev (89+x,23+y,21+y); + call tracev (89+x,47+y,44+y); call tracev (90+x,47+y,44+y); + call tracev (92+x,47+y,10+y); call tracev (93+x,47+y,11+y); + call tracev (94+x,30+y,11+y); call tracev (95+x,30+y,12+y); + call tracev (96+x,31+y,12+y); call tracev (97+x,31+y,13+y); + call tracev (98+x,32+y,14+y); call tracev (99+x,32+y,14+y); + call tracev (100+x,33+y,15+y); call tracev (101+x,33+y,16+y); + call tracev (102+x,34+y,16+y); call tracev (103+x,35+y,17+y); + call tracev (104+x,35+y,17+y); call tracev (105+x,36+y,18+y); + call tracev (106+x,36+y,19+y); call tracev (107+x,37+y,19+y); + call tracev (108+x,37+y,20+y); call tracev (109+x,38+y,20+y); + call tracev (110+x,39+y,21+y); call tracev (111+x,39+y,22+y); + call tracev (112+x,40+y,22+y); call tracev (113+x,40+y,23+y); + call tracev (114+x,41+y,23+y); call tracev (115+x,41+y,24+y); + call tracev (116+x,42+y,25+y); call tracev (117+x,42+y,25+y); + call tracev (118+x,43+y,26+y); call tracev (119+x,44+y,27+y); + call tracev (120+x,44+y,27+y); call tracev (121+x,45+y,28+y); + call tracev (122+x,45+y,28+y); call tracev (123+x,46+y,10+y); + call tracev (124+x,46+y,10+y); call tracev (125+x,47+y,10+y); + call tracev (127+x,37+y,10+y); call tracev (128+x,39+y,10+y); + call tracev (129+x,41+y,10+y); call tracev (130+x,42+y,10+y); + call tracev (131+x,43+y,10+y); call tracev (132+x,44+y,10+y); + call tracev (133+x,45+y,10+y); call tracev (134+x,46+y,10+y); + call tracev (135+x,46+y,10+y); call tracev (136+x,47+y,10+y); + call tracev (137+x,47+y,10+y); call tracev (138+x,47+y,10+y); + call tracev (139+x,47+y,10+y); call tracev (140+x,48+y,10+y); + call tracev (141+x,48+y,10+y); call tracev (142+x,48+y,10+y); + call tracev (143+x,48+y,10+y); call tracev (144+x,48+y,10+y); + call tracev (145+x,48+y,45+y); call tracev (146+x,48+y,45+y); + call tracev (147+x,48+y,45+y); call tracev (148+x,47+y,45+y); + call tracev (149+x,47+y,45+y); call tracev (150+x,47+y,45+y); + call tracev (151+x,47+y,44+y); call tracev (152+x,47+y,44+y); + call tracev (153+x,47+y,43+y); call tracev (154+x,46+y,43+y); + call tracev (155+x,46+y,42+y); call tracev (156+x,45+y,42+y); + call tracev (157+x,44+y,41+y); call tracev (158+x,43+y,41+y); + call tracev (159+x,43+y,39+y); call tracev (160+x,42+y,37+y); + call tracev (161+x,41+y,10+y); call tracev (162+x,39+y,10+y); + end dessinmenu; + + unit dessinelem : procedure (x,y,c : integer); + begin + call color (c); + call tracev (41+x,3+y,1+y); call tracev (42+x,3+y,1+y); + call tracev (43+x,3+y,1+y); call tracev (44+x,3+y,1+y); + call tracev (45+x,3+y,1+y); call tracev (46+x,3+y,1+y); + call tracev (47+x,3+y,1+y); call tracev (48+x,3+y,1+y); + call tracev (49+x,3+y,1+y); call tracev (50+x,3+y,1+y); + call tracev (51+x,3+y,1+y); call tracev (52+x,37+y,1+y); + call tracev (53+x,37+y,1+y); call tracev (54+x,37+y,1+y); + call tracev (55+x,37+y,1+y); call tracev (56+x,37+y,1+y); + call tracev (57+x,37+y,1+y); call tracev (58+x,37+y,1+y); + call tracev (59+x,37+y,1+y); call tracev (60+x,37+y,1+y); + call tracev (61+x,37+y,1+y); call tracev (62+x,37+y,1+y); + call tracev (63+x,37+y,1+y); call tracev (64+x,37+y,1+y); + call tracev (65+x,37+y,1+y); call tracev (66+x,37+y,1+y); + call tracev (67+x,37+y,1+y); call tracev (68+x,37+y,1+y); + call tracev (69+x,37+y,1+y); call tracev (70+x,37+y,1+y); + call tracev (71+x,3+y,1+y); call tracev (72+x,3+y,1+y); + call tracev (73+x,3+y,1+y); call tracev (74+x,3+y,1+y); + call tracev (75+x,3+y,1+y); call tracev (76+x,3+y,1+y); + call tracev (77+x,3+y,1+y); call tracev (78+x,3+y,1+y); + call tracev (79+x,3+y,1+y); call tracev (80+x,3+y,1+y); + call tracev (82+x,2+y,1+y); call tracev (83+x,4+y,1+y); + call tracev (84+x,6+y,1+y); call tracev (85+x,8+y,1+y); + call tracev (86+x,10+y,1+y); call tracev (87+x,12+y,1+y); + call tracev (88+x,14+y,1+y); call tracev (89+x,16+y,1+y); + call tracev (90+x,18+y,1+y); call tracev (91+x,20+y,1+y); + call tracev (92+x,22+y,1+y); call tracev (93+x,24+y,1+y); + call tracev (94+x,26+y,1+y); call tracev (94+x,37+y,36+y); + call tracev (95+x,28+y,1+y); call tracev (95+x,37+y,34+y); + call tracev (96+x,30+y,1+y); call tracev (96+x,36+y,32+y); + call tracev (97+x,34+y,1+y); call tracev (98+x,32+y,1+y); + call tracev (99+x,30+y,1+y); call tracev (100+x,28+y,2+y); + call tracev (101+x,26+y,4+y); call tracev (102+x,24+y,6+y); + call tracev (103+x,22+y,8+y); call tracev (104+x,20+y,10+y); + call tracev (105+x,18+y,12+y); call tracev (106+x,16+y,10+y); + call tracev (107+x,14+y,8+y); call tracev (108+x,12+y,6+y); + call tracev (109+x,10+y,4+y); call tracev (110+x,8+y,2+y); + call tracev (111+x,6+y,1+y); call tracev (112+x,4+y,1+y); + call tracev (113+x,2+y,1+y); call tracev (115+x,37+y,1+y); + call tracev (116+x,37+y,1+y); call tracev (117+x,37+y,1+y); + call tracev (118+x,37+y,1+y); call tracev (119+x,37+y,1+y); + call tracev (120+x,37+y,1+y); call tracev (121+x,37+y,1+y); + call tracev (122+x,37+y,1+y); call tracev (123+x,37+y,1+y); + call tracev (124+x,37+y,1+y); call tracev (125+x,37+y,1+y); + call tracev (126+x,37+y,1+y); call tracev (127+x,37+y,1+y); + call tracev (128+x,37+y,1+y); call tracev (129+x,37+y,1+y); + call tracev (130+x,37+y,1+y); call tracev (131+x,37+y,1+y); + call tracev (132+x,37+y,1+y); call tracev (133+x,3+y,1+y); + call tracev (133+x,27+y,25+y); call tracev (134+x,3+y,1+y); + call tracev (134+x,27+y,25+y); call tracev (135+x,3+y,1+y); + call tracev (135+x,28+y,26+y); call tracev (136+x,3+y,1+y); + call tracev (136+x,28+y,26+y); call tracev (137+x,3+y,1+y); + call tracev (137+x,28+y,26+y); call tracev (138+x,4+y,1+y); + call tracev (138+x,28+y,25+y); call tracev (139+x,4+y,1+y); + call tracev (139+x,28+y,25+y); call tracev (140+x,4+y,1+y); + call tracev (140+x,28+y,25+y); call tracev (141+x,4+y,1+y); + call tracev (141+x,28+y,25+y); call tracev (142+x,4+y,2+y); + call tracev (142+x,27+y,25+y); call tracev (143+x,5+y,2+y); + call tracev (143+x,27+y,24+y); call tracev (144+x,6+y,3+y); + call tracev (144+x,26+y,23+y); call tracev (145+x,6+y,4+y); + call tracev (145+x,25+y,22+y); call tracev (146+x,8+y,5+y); + call tracev (146+x,24+y,22+y); call tracev (147+x,10+y,5+y); + call tracev (147+x,23+y,19+y); call tracev (148+x,14+y,6+y); + call tracev (148+x,22+y,17+y); call tracev (149+x,21+y,8+y); + call tracev (150+x,20+y,10+y); call tracev (152+x,37+y,1+y); + call tracev (153+x,37+y,1+y); call tracev (154+x,37+y,1+y); + call tracev (155+x,37+y,1+y); call tracev (156+x,37+y,1+y); + call tracev (157+x,37+y,1+y); call tracev (158+x,37+y,1+y); + call tracev (159+x,37+y,1+y); call tracev (160+x,37+y,1+y); + call tracev (161+x,37+y,1+y); call tracev (162+x,37+y,1+y); + call tracev (163+x,37+y,1+y); call tracev (164+x,37+y,1+y); + call tracev (165+x,37+y,1+y); call tracev (166+x,37+y,1+y); + call tracev (167+x,37+y,1+y); call tracev (168+x,37+y,1+y); + call tracev (169+x,37+y,1+y); call tracev (170+x,37+y,1+y); + call tracev (171+x,3+y,1+y); call tracev (171+x,13+y,11+y); + call tracev (171+x,37+y,35+y); call tracev (172+x,3+y,1+y); + call tracev (172+x,13+y,11+y); call tracev (172+x,37+y,35+y); + call tracev (173+x,3+y,1+y); call tracev (173+x,13+y,11+y); + call tracev (173+x,37+y,35+y); call tracev (174+x,3+y,1+y); + call tracev (174+x,13+y,11+y); call tracev (174+x,37+y,35+y); + call tracev (175+x,3+y,1+y); call tracev (175+x,13+y,11+y); + call tracev (175+x,37+y,35+y); call tracev (176+x,3+y,1+y); + call tracev (176+x,13+y,11+y); call tracev (176+x,37+y,35+y); + call tracev (177+x,3+y,1+y); call tracev (177+x,13+y,11+y); + call tracev (177+x,37+y,35+y); call tracev (178+x,3+y,1+y); + call tracev (178+x,13+y,11+y); call tracev (178+x,37+y,35+y); + call tracev (179+x,3+y,1+y); call tracev (179+x,13+y,11+y); + call tracev (179+x,37+y,35+y); call tracev (180+x,3+y,1+y); + call tracev (180+x,13+y,11+y); call tracev (180+x,37+y,35+y); + call tracev (181+x,3+y,1+y); call tracev (181+x,13+y,11+y); + call tracev (181+x,37+y,35+y); call tracev (182+x,3+y,1+y); + call tracev (182+x,13+y,11+y); call tracev (182+x,37+y,35+y); + call tracev (183+x,3+y,1+y); call tracev (183+x,13+y,11+y); + call tracev (183+x,37+y,35+y); call tracev (184+x,3+y,1+y); + call tracev (184+x,13+y,11+y); call tracev (184+x,37+y,35+y); + call tracev (185+x,3+y,1+y); call tracev (185+x,13+y,11+y); + call tracev (185+x,37+y,35+y); call tracev (186+x,13+y,11+y); + call tracev (186+x,37+y,35+y); call tracev (187+x,37+y,35+y); + call tracev (188+x,37+y,35+y); + end dessinelem; + + unit dessinrand : procedure (x,y,c : integer); + begin + call color (c); + call tracev (0+x,39+y,2+y); call tracev (1+x,39+y,2+y); + call tracev (2+x,39+y,2+y); call tracev (3+x,39+y,2+y); + call tracev (4+x,39+y,2+y); call tracev (5+x,39+y,2+y); + call tracev (6+x,39+y,2+y); call tracev (7+x,39+y,2+y); + call tracev (8+x,39+y,2+y); call tracev (9+x,39+y,2+y); + call tracev (10+x,39+y,2+y); call tracev (11+x,39+y,2+y); + call tracev (12+x,39+y,2+y); call tracev (13+x,39+y,2+y); + call tracev (14+x,39+y,2+y); call tracev (15+x,39+y,2+y); + call tracev (16+x,39+y,2+y); call tracev (17+x,39+y,2+y); + call tracev (18+x,39+y,2+y); call tracev (19+x,5+y,2+y); + call tracev (19+x,31+y,27+y); call tracev (20+x,5+y,2+y); + call tracev (20+x,32+y,27+y); call tracev (21+x,5+y,2+y); + call tracev (21+x,29+y,27+y); call tracev (21+x,33+y,30+y); + call tracev (22+x,5+y,2+y); call tracev (22+x,29+y,27+y); + call tracev (22+x,34+y,31+y); call tracev (23+x,5+y,2+y); + call tracev (23+x,29+y,27+y); call tracev (23+x,34+y,32+y); + call tracev (24+x,5+y,3+y); call tracev (24+x,29+y,27+y); + call tracev (24+x,35+y,32+y); call tracev (25+x,5+y,3+y); + call tracev (25+x,29+y,27+y); call tracev (25+x,35+y,33+y); + call tracev (26+x,5+y,3+y); call tracev (26+x,29+y,27+y); + call tracev (26+x,36+y,33+y); call tracev (27+x,6+y,3+y); + call tracev (27+x,29+y,26+y); call tracev (27+x,36+y,34+y); + call tracev (28+x,6+y,4+y); call tracev (28+x,28+y,26+y); + call tracev (28+x,36+y,34+y); call tracev (29+x,7+y,4+y); + call tracev (29+x,28+y,25+y); call tracev (29+x,37+y,35+y); + call tracev (30+x,7+y,4+y); call tracev (30+x,27+y,25+y); + call tracev (30+x,37+y,35+y); call tracev (31+x,8+y,5+y); + call tracev (31+x,27+y,24+y); call tracev (31+x,38+y,36+y); + call tracev (32+x,10+y,6+y); call tracev (32+x,26+y,23+y); + call tracev (32+x,38+y,36+y); call tracev (33+x,12+y,7+y); + call tracev (33+x,25+y,21+y); call tracev (33+x,39+y,36+y); + call tracev (34+x,24+y,8+y); call tracev (34+x,39+y,36+y); + call tracev (35+x,23+y,10+y); call tracev (35+x,39+y,36+y); + call tracev (36+x,21+y,12+y); call tracev (36+x,39+y,36+y); + call tracev (38+x,39+y,37+y); call tracev (39+x,39+y,35+y); + call tracev (40+x,38+y,33+y); call tracev (41+x,36+y,31+y); + call tracev (42+x,35+y,29+y); call tracev (43+x,35+y,27+y); + call tracev (44+x,30+y,25+y); call tracev (44+x,35+y,32+y); + call tracev (45+x,28+y,23+y); call tracev (45+x,35+y,32+y); + call tracev (46+x,26+y,21+y); call tracev (46+x,35+y,32+y); + call tracev (47+x,24+y,18+y); call tracev (47+x,35+y,32+y); + call tracev (48+x,25+y,16+y); call tracev (48+x,35+y,32+y); + call tracev (49+x,27+y,14+y); call tracev (49+x,35+y,32+y); + call tracev (50+x,28+y,12+y); call tracev (50+x,35+y,32+y); + call tracev (51+x,30+y,10+y); call tracev (51+x,35+y,32+y); + call tracev (52+x,35+y,8+y); call tracev (53+x,36+y,6+y); + call tracev (54+x,38+y,4+y); call tracev (55+x,39+y,2+y); + call tracev (56+x,39+y,4+y); call tracev (57+x,39+y,6+y); + call tracev (58+x,39+y,8+y); call tracev (59+x,39+y,10+y); + call tracev (60+x,39+y,12+y); call tracev (61+x,39+y,14+y); + call tracev (62+x,39+y,16+y); call tracev (63+x,39+y,18+y); + call tracev (64+x,39+y,20+y); call tracev (65+x,39+y,22+y); + call tracev (66+x,39+y,24+y); call tracev (67+x,39+y,26+y); + call tracev (68+x,39+y,28+y); call tracev (69+x,39+y,30+y); + call tracev (70+x,39+y,32+y); call tracev (71+x,39+y,34+y); + call tracev (72+x,39+y,36+y); call tracev (73+x,39+y,38+y); + call tracev (75+x,39+y,2+y); call tracev (76+x,39+y,3+y); + call tracev (77+x,22+y,3+y); call tracev (78+x,22+y,4+y); + call tracev (79+x,23+y,4+y); call tracev (80+x,23+y,5+y); + call tracev (81+x,24+y,6+y); call tracev (82+x,24+y,6+y); + call tracev (83+x,25+y,7+y); call tracev (84+x,25+y,8+y); + call tracev (85+x,26+y,8+y); call tracev (86+x,27+y,9+y); + call tracev (87+x,27+y,9+y); call tracev (88+x,28+y,10+y); + call tracev (89+x,28+y,11+y); call tracev (90+x,29+y,11+y); + call tracev (91+x,29+y,12+y); call tracev (92+x,30+y,12+y); + call tracev (93+x,31+y,13+y); call tracev (94+x,31+y,14+y); + call tracev (95+x,32+y,14+y); call tracev (96+x,32+y,15+y); + call tracev (97+x,33+y,15+y); call tracev (98+x,33+y,16+y); + call tracev (99+x,34+y,17+y); call tracev (100+x,34+y,17+y); + call tracev (101+x,35+y,18+y); call tracev (102+x,36+y,19+y); + call tracev (103+x,36+y,19+y); call tracev (104+x,37+y,20+y); + call tracev (105+x,37+y,20+y); call tracev (106+x,38+y,2+y); + call tracev (107+x,38+y,2+y); call tracev (108+x,39+y,2+y); + call tracev (111+x,39+y,2+y); call tracev (112+x,39+y,2+y); + call tracev (113+x,39+y,2+y); call tracev (114+x,39+y,2+y); + call tracev (115+x,39+y,2+y); call tracev (116+x,39+y,2+y); + call tracev (117+x,39+y,2+y); call tracev (118+x,39+y,2+y); + call tracev (119+x,39+y,2+y); call tracev (120+x,39+y,2+y); + call tracev (121+x,39+y,2+y); call tracev (122+x,39+y,2+y); + call tracev (123+x,39+y,2+y); call tracev (124+x,39+y,2+y); + call tracev (125+x,39+y,2+y); call tracev (126+x,39+y,2+y); + call tracev (127+x,39+y,2+y); call tracev (128+x,39+y,2+y); + call tracev (129+x,39+y,2+y); call tracev (130+x,5+y,2+y); + call tracev (130+x,39+y,36+y); call tracev (131+x,5+y,2+y); + call tracev (131+x,39+y,36+y); call tracev (132+x,5+y,2+y); + call tracev (132+x,38+y,36+y); call tracev (133+x,5+y,2+y); + call tracev (133+x,38+y,36+y); call tracev (134+x,5+y,2+y); + call tracev (134+x,38+y,36+y); call tracev (135+x,5+y,2+y); + call tracev (135+x,38+y,36+y); call tracev (136+x,6+y,2+y); + call tracev (136+x,37+y,35+y); call tracev (137+x,6+y,3+y); + call tracev (137+x,37+y,35+y); call tracev (138+x,6+y,3+y); + call tracev (138+x,37+y,35+y); call tracev (139+x,7+y,4+y); + call tracev (139+x,36+y,34+y); call tracev (140+x,7+y,4+y); + call tracev (140+x,36+y,34+y); call tracev (141+x,8+y,5+y); + call tracev (141+x,35+y,33+y); call tracev (142+x,9+y,6+y); + call tracev (142+x,35+y,32+y); call tracev (143+x,11+y,7+y); + call tracev (143+x,34+y,30+y); call tracev (144+x,13+y,8+y); + call tracev (144+x,33+y,28+y); call tracev (145+x,16+y,10+y); + call tracev (145+x,31+y,25+y); call tracev (146+x,19+y,11+y); + call tracev (146+x,30+y,22+y); call tracev (147+x,28+y,13+y); + call tracev (148+x,26+y,15+y); call tracev (150+x,27+y,15+y); + call tracev (151+x,29+y,13+y); call tracev (152+x,31+y,11+y); + call tracev (153+x,32+y,10+y); call tracev (154+x,34+y,8+y); + call tracev (155+x,35+y,7+y); call tracev (156+x,36+y,6+y); + call tracev (157+x,36+y,6+y); call tracev (158+x,37+y,5+y); + call tracev (159+x,37+y,4+y); call tracev (160+x,38+y,4+y); + call tracev (161+x,38+y,3+y); call tracev (162+x,38+y,3+y); + call tracev (163+x,39+y,2+y); call tracev (164+x,39+y,2+y); + call tracev (165+x,39+y,2+y); call tracev (166+x,39+y,2+y); + call tracev (167+x,40+y,2+y); call tracev (168+x,40+y,2+y); + call tracev (169+x,5+y,2+y); call tracev (169+x,40+y,37+y); + call tracev (170+x,5+y,2+y); call tracev (170+x,40+y,37+y); + call tracev (171+x,5+y,2+y); call tracev (171+x,39+y,37+y); + call tracev (172+x,5+y,2+y); call tracev (172+x,39+y,37+y); + call tracev (173+x,5+y,2+y); call tracev (173+x,39+y,37+y); + call tracev (174+x,5+y,2+y); call tracev (174+x,39+y,37+y); + call tracev (175+x,6+y,2+y); call tracev (175+x,38+y,36+y); + call tracev (176+x,6+y,3+y); call tracev (176+x,38+y,36+y); + call tracev (177+x,6+y,3+y); call tracev (177+x,38+y,35+y); + call tracev (178+x,7+y,4+y); call tracev (178+x,37+y,35+y); + call tracev (179+x,7+y,4+y); call tracev (179+x,37+y,34+y); + call tracev (180+x,8+y,5+y); call tracev (180+x,36+y,33+y); + call tracev (181+x,9+y,6+y); call tracev (181+x,36+y,32+y); + call tracev (182+x,11+y,7+y); call tracev (182+x,35+y,31+y); + call tracev (183+x,13+y,8+y); call tracev (183+x,34+y,29+y); + call tracev (184+x,16+y,10+y); call tracev (184+x,32+y,26+y); + call tracev (184+x,39+y,37+y); call tracev (185+x,19+y,11+y); + call tracev (185+x,31+y,23+y); call tracev (185+x,39+y,35+y); + call tracev (186+x,29+y,13+y); call tracev (186+x,37+y,32+y); + call tracev (187+x,27+y,15+y); call tracev (187+x,35+y,30+y); + call tracev (188+x,33+y,27+y); call tracev (189+x,30+y,24+y); + call tracev (190+x,28+y,22+y); call tracev (191+x,29+y,19+y); + call tracev (192+x,30+y,17+y); call tracev (193+x,32+y,14+y); + call tracev (194+x,33+y,12+y); call tracev (195+x,35+y,9+y); + call tracev (196+x,36+y,6+y); call tracev (197+x,38+y,4+y); + call tracev (198+x,39+y,2+y); call tracev (199+x,38+y,3+y); + call tracev (200+x,36+y,5+y); call tracev (201+x,35+y,6+y); + call tracev (202+x,33+y,8+y); call tracev (203+x,32+y,9+y); + call tracev (204+x,30+y,11+y); call tracev (205+x,29+y,12+y); + call tracev (206+x,28+y,14+y); call tracev (207+x,30+y,12+y); + call tracev (208+x,33+y,11+y); call tracev (209+x,35+y,9+y); + call tracev (210+x,37+y,8+y); call tracev (211+x,39+y,6+y); + call tracev (212+x,39+y,5+y); call tracev (213+x,39+y,3+y); + call tracev (214+x,39+y,2+y); call tracev (215+x,39+y,4+y); + call tracev (216+x,39+y,6+y); call tracev (217+x,39+y,9+y); + call tracev (218+x,39+y,11+y); call tracev (219+x,39+y,13+y); + call tracev (220+x,39+y,16+y); call tracev (221+x,39+y,18+y); + call tracev (222+x,39+y,21+y); call tracev (223+x,39+y,23+y); + call tracev (224+x,39+y,25+y); call tracev (225+x,39+y,28+y); + call tracev (226+x,39+y,30+y); call tracev (227+x,39+y,33+y); + call tracev (228+x,39+y,35+y); call tracev (229+x,39+y,37+y); + end dessinrand; + + + unit dessinquick : procedure (x,y,c : integer); + begin + call color (c); + call tracev (30+x,26+y,14+y); call tracev (31+x,28+y,12+y); + call tracev (32+x,30+y,10+y); call tracev (33+x,31+y,9+y); + call tracev (34+x,33+y,7+y); call tracev (35+x,34+y,6+y); + call tracev (36+x,35+y,5+y); call tracev (37+x,36+y,4+y); + call tracev (38+x,36+y,3+y); call tracev (39+x,37+y,3+y); + call tracev (40+x,37+y,2+y); call tracev (41+x,37+y,2+y); + call tracev (42+x,37+y,1+y); call tracev (43+x,38+y,1+y); + call tracev (44+x,38+y,1+y); call tracev (45+x,38+y,1+y); + call tracev (46+x,39+y,1+y); call tracev (47+x,39+y,1+y); + call tracev (48+x,4+y,1+y); call tracev (48+x,39+y,36+y); + call tracev (49+x,4+y,1+y); call tracev (49+x,39+y,36+y); + call tracev (50+x,4+y,1+y); call tracev (50+x,38+y,36+y); + call tracev (51+x,4+y,1+y); call tracev (51+x,38+y,36+y); + call tracev (52+x,4+y,1+y); call tracev (52+x,38+y,36+y); + call tracev (53+x,4+y,1+y); call tracev (53+x,38+y,35+y); + call tracev (54+x,4+y,1+y); call tracev (54+x,31+y,30+y); + call tracev (54+x,38+y,35+y); call tracev (55+x,5+y,2+y); + call tracev (55+x,31+y,28+y); call tracev (55+x,37+y,34+y); + call tracev (56+x,5+y,2+y); call tracev (56+x,32+y,29+y); + call tracev (56+x,37+y,34+y); call tracev (57+x,5+y,3+y); + call tracev (57+x,36+y,30+y); call tracev (58+x,6+y,3+y); + call tracev (58+x,36+y,31+y); call tracev (59+x,7+y,4+y); + call tracev (59+x,36+y,32+y); call tracev (60+x,7+y,5+y); + call tracev (60+x,36+y,33+y); call tracev (61+x,8+y,5+y); + call tracev (61+x,36+y,31+y); call tracev (62+x,10+y,6+y); + call tracev (62+x,33+y,29+y); call tracev (62+x,37+y,34+y); + call tracev (63+x,12+y,7+y); call tracev (63+x,32+y,28+y); + call tracev (63+x,38+y,35+y); call tracev (64+x,15+y,9+y); + call tracev (64+x,31+y,27+y); call tracev (64+x,38+y,35+y); + call tracev (65+x,29+y,11+y); call tracev (65+x,38+y,36+y); + call tracev (66+x,27+y,14+y); call tracev (66+x,38+y,36+y); + call tracev (67+x,21+y,18+y); call tracev (67+x,39+y,36+y); + call tracev (69+x,28+y,1+y); call tracev (70+x,30+y,1+y); + call tracev (71+x,32+y,1+y); call tracev (72+x,33+y,1+y); + call tracev (73+x,34+y,1+y); call tracev (74+x,35+y,1+y); + call tracev (75+x,36+y,1+y); call tracev (76+x,37+y,1+y); + call tracev (77+x,37+y,1+y); call tracev (78+x,38+y,1+y); + call tracev (79+x,38+y,1+y); call tracev (80+x,38+y,1+y); + call tracev (81+x,38+y,1+y); call tracev (82+x,39+y,1+y); + call tracev (83+x,39+y,1+y); call tracev (84+x,39+y,1+y); + call tracev (85+x,39+y,1+y); call tracev (86+x,39+y,1+y); + call tracev (87+x,39+y,36+y); call tracev (88+x,39+y,36+y); + call tracev (89+x,39+y,36+y); call tracev (90+x,38+y,36+y); + call tracev (91+x,38+y,36+y); call tracev (92+x,38+y,36+y); + call tracev (93+x,38+y,35+y); call tracev (94+x,38+y,35+y); + call tracev (95+x,38+y,34+y); call tracev (96+x,37+y,34+y); + call tracev (97+x,37+y,33+y); call tracev (98+x,36+y,33+y); + call tracev (99+x,35+y,32+y); call tracev (100+x,34+y,32+y); + call tracev (101+x,34+y,30+y); call tracev (102+x,33+y,28+y); + call tracev (103+x,32+y,1+y); call tracev (104+x,30+y,1+y); + call tracev (107+x,38+y,1+y); call tracev (108+x,38+y,1+y); + call tracev (109+x,38+y,1+y); call tracev (110+x,38+y,1+y); + call tracev (111+x,38+y,1+y); call tracev (112+x,38+y,1+y); + call tracev (113+x,38+y,1+y); call tracev (114+x,38+y,1+y); + call tracev (115+x,38+y,1+y); call tracev (116+x,38+y,1+y); + call tracev (117+x,38+y,1+y); call tracev (118+x,38+y,1+y); + call tracev (119+x,38+y,1+y); call tracev (120+x,38+y,1+y); + call tracev (121+x,38+y,1+y); call tracev (122+x,38+y,1+y); + call tracev (123+x,38+y,1+y); call tracev (124+x,38+y,1+y); + call tracev (126+x,22+y,18+y); call tracev (127+x,26+y,14+y); + call tracev (128+x,29+y,11+y); call tracev (129+x,31+y,9+y); + call tracev (130+x,33+y,7+y); call tracev (131+x,34+y,6+y); + call tracev (132+x,35+y,5+y); call tracev (133+x,35+y,5+y); + call tracev (134+x,36+y,4+y); call tracev (135+x,36+y,3+y); + call tracev (136+x,37+y,3+y); call tracev (137+x,37+y,2+y); + call tracev (138+x,37+y,2+y); call tracev (139+x,38+y,1+y); + call tracev (140+x,38+y,1+y); call tracev (141+x,38+y,1+y); + call tracev (142+x,38+y,1+y); call tracev (143+x,39+y,1+y); + call tracev (144+x,39+y,1+y); call tracev (145+x,4+y,1+y); + call tracev (145+x,39+y,36+y); call tracev (146+x,4+y,1+y); + call tracev (146+x,39+y,36+y); call tracev (147+x,4+y,1+y); + call tracev (147+x,39+y,36+y); call tracev (148+x,4+y,1+y); + call tracev (148+x,38+y,36+y); call tracev (149+x,4+y,1+y); + call tracev (149+x,38+y,36+y); call tracev (150+x,4+y,1+y); + call tracev (150+x,38+y,36+y); call tracev (151+x,4+y,2+y); + call tracev (151+x,38+y,36+y); call tracev (152+x,4+y,2+y); + call tracev (152+x,38+y,35+y); call tracev (153+x,5+y,2+y); + call tracev (153+x,37+y,35+y); call tracev (154+x,5+y,2+y); + call tracev (154+x,37+y,34+y); call tracev (155+x,6+y,3+y); + call tracev (155+x,36+y,34+y); call tracev (156+x,6+y,4+y); + call tracev (156+x,36+y,33+y); call tracev (157+x,7+y,4+y); + call tracev (157+x,35+y,33+y); call tracev (158+x,8+y,5+y); + call tracev (158+x,35+y,32+y); call tracev (159+x,10+y,5+y); + call tracev (159+x,34+y,30+y); call tracev (160+x,11+y,6+y); + call tracev (160+x,33+y,29+y); call tracev (161+x,11+y,8+y); + call tracev (161+x,32+y,29+y); call tracev (162+x,11+y,10+y); + call tracev (162+x,31+y,29+y); call tracev (164+x,38+y,1+y); + call tracev (165+x,38+y,1+y); call tracev (166+x,38+y,1+y); + call tracev (167+x,38+y,1+y); call tracev (168+x,38+y,1+y); + call tracev (169+x,38+y,1+y); call tracev (170+x,38+y,1+y); + call tracev (171+x,38+y,1+y); call tracev (172+x,38+y,1+y); + call tracev (173+x,38+y,1+y); call tracev (174+x,38+y,1+y); + call tracev (175+x,38+y,1+y); call tracev (176+x,38+y,1+y); + call tracev (177+x,38+y,1+y); call tracev (178+x,38+y,1+y); + call tracev (179+x,38+y,1+y); call tracev (180+x,38+y,1+y); + call tracev (181+x,38+y,1+y); call tracev (182+x,38+y,1+y); + call tracev (183+x,13+y,11+y); call tracev (184+x,13+y,11+y); + call tracev (185+x,13+y,10+y); call tracev (186+x,15+y,9+y); + call tracev (187+x,11+y,9+y); call tracev (187+x,17+y,12+y); + call tracev (188+x,11+y,8+y); call tracev (188+x,19+y,14+y); + call tracev (189+x,10+y,7+y); call tracev (189+x,21+y,16+y); + call tracev (190+x,9+y,6+y); call tracev (190+x,23+y,18+y); + call tracev (191+x,9+y,6+y); call tracev (191+x,25+y,20+y); + call tracev (192+x,8+y,5+y); call tracev (192+x,27+y,22+y); + call tracev (193+x,7+y,4+y); call tracev (193+x,29+y,24+y); + call tracev (194+x,7+y,4+y); call tracev (194+x,31+y,25+y); + call tracev (195+x,6+y,3+y); call tracev (195+x,33+y,27+y); + call tracev (196+x,5+y,2+y); call tracev (196+x,35+y,29+y); + call tracev (197+x,5+y,2+y); call tracev (197+x,37+y,31+y); + call tracev (198+x,4+y,1+y); call tracev (198+x,38+y,33+y); + call tracev (199+x,38+y,35+y); call tracev (200+x,38+y,37+y); + end dessinquick; + + unit dessinbubble : procedure (x,y,c : integer); + begin + call color (c); + call tracev (4+x,39+y,3+y); call tracev (5+x,39+y,3+y); + call tracev (6+x,39+y,3+y); call tracev (7+x,39+y,3+y); + call tracev (8+x,39+y,3+y); call tracev (9+x,39+y,3+y); + call tracev (10+x,39+y,3+y); call tracev (11+x,39+y,3+y); + call tracev (12+x,39+y,3+y); call tracev (13+x,39+y,3+y); + call tracev (14+x,39+y,3+y); call tracev (15+x,39+y,3+y); + call tracev (16+x,39+y,3+y); call tracev (17+x,39+y,3+y); + call tracev (18+x,39+y,3+y); call tracev (19+x,39+y,3+y); + call tracev (20+x,39+y,3+y); call tracev (21+x,39+y,3+y); + call tracev (22+x,5+y,3+y); call tracev (22+x,39+y,37+y); + call tracev (23+x,5+y,3+y); call tracev (23+x,22+y,21+y); + call tracev (23+x,39+y,37+y); call tracev (24+x,5+y,3+y); + call tracev (24+x,23+y,19+y); call tracev (24+x,39+y,37+y); + call tracev (25+x,5+y,3+y); call tracev (25+x,23+y,19+y); + call tracev (25+x,39+y,37+y); call tracev (26+x,5+y,3+y); + call tracev (26+x,23+y,19+y); call tracev (26+x,39+y,37+y); + call tracev (27+x,6+y,3+y); call tracev (27+x,23+y,19+y); + call tracev (27+x,39+y,37+y); call tracev (28+x,6+y,3+y); + call tracev (28+x,23+y,20+y); call tracev (28+x,39+y,37+y); + call tracev (29+x,6+y,3+y); call tracev (29+x,23+y,20+y); + call tracev (29+x,39+y,37+y); call tracev (30+x,6+y,3+y); + call tracev (30+x,23+y,20+y); call tracev (30+x,39+y,36+y); + call tracev (31+x,6+y,4+y); call tracev (31+x,23+y,20+y); + call tracev (31+x,39+y,36+y); call tracev (32+x,6+y,4+y); + call tracev (32+x,23+y,20+y); call tracev (32+x,39+y,36+y); + call tracev (33+x,7+y,4+y); call tracev (33+x,23+y,19+y); + call tracev (33+x,38+y,36+y); call tracev (34+x,7+y,5+y); + call tracev (34+x,24+y,19+y); call tracev (34+x,38+y,35+y); + call tracev (35+x,8+y,5+y); call tracev (35+x,21+y,18+y); + call tracev (35+x,26+y,22+y); call tracev (35+x,38+y,35+y); + call tracev (36+x,10+y,6+y); call tracev (36+x,21+y,18+y); + call tracev (36+x,28+y,23+y); call tracev (36+x,37+y,34+y); + call tracev (37+x,12+y,6+y); call tracev (37+x,20+y,14+y); + call tracev (37+x,30+y,24+y); call tracev (37+x,37+y,32+y); + call tracev (38+x,20+y,7+y); call tracev (38+x,36+y,26+y); + call tracev (39+x,19+y,9+y); call tracev (39+x,34+y,28+y); + call tracev (42+x,29+y,3+y); call tracev (43+x,32+y,3+y); + call tracev (44+x,34+y,3+y); call tracev (45+x,35+y,3+y); + call tracev (46+x,36+y,3+y); call tracev (47+x,37+y,3+y); + call tracev (48+x,38+y,3+y); call tracev (49+x,39+y,3+y); + call tracev (50+x,39+y,3+y); call tracev (51+x,40+y,3+y); + call tracev (52+x,40+y,3+y); call tracev (53+x,40+y,3+y); + call tracev (54+x,40+y,3+y); call tracev (55+x,40+y,3+y); + call tracev (56+x,40+y,3+y); call tracev (57+x,40+y,3+y); + call tracev (58+x,40+y,3+y); call tracev (59+x,40+y,3+y); + call tracev (60+x,40+y,38+y); call tracev (61+x,40+y,38+y); + call tracev (62+x,40+y,38+y); call tracev (63+x,40+y,37+y); + call tracev (64+x,40+y,37+y); call tracev (65+x,40+y,37+y); + call tracev (66+x,39+y,37+y); call tracev (67+x,39+y,37+y); + call tracev (68+x,39+y,36+y); call tracev (69+x,38+y,36+y); + call tracev (70+x,38+y,35+y); call tracev (71+x,37+y,35+y); + call tracev (72+x,37+y,34+y); call tracev (73+x,36+y,33+y); + call tracev (74+x,35+y,32+y); call tracev (75+x,34+y,29+y); + call tracev (76+x,33+y,3+y); call tracev (77+x,32+y,3+y); + call tracev (79+x,39+y,3+y); call tracev (80+x,39+y,3+y); + call tracev (81+x,39+y,3+y); call tracev (82+x,39+y,3+y); + call tracev (83+x,39+y,3+y); call tracev (84+x,39+y,3+y); + call tracev (85+x,39+y,3+y); call tracev (86+x,39+y,3+y); + call tracev (87+x,39+y,3+y); call tracev (88+x,39+y,3+y); + call tracev (89+x,39+y,3+y); call tracev (90+x,39+y,3+y); + call tracev (91+x,39+y,3+y); call tracev (92+x,39+y,3+y); + call tracev (93+x,39+y,3+y); call tracev (94+x,39+y,3+y); + call tracev (95+x,39+y,3+y); call tracev (96+x,39+y,3+y); + call tracev (97+x,39+y,3+y); call tracev (98+x,5+y,3+y); + call tracev (98+x,39+y,37+y); call tracev (99+x,5+y,3+y); + call tracev (99+x,22+y,20+y); call tracev (99+x,39+y,37+y); + call tracev (100+x,5+y,3+y); call tracev (100+x,23+y,19+y); + call tracev (100+x,39+y,37+y); call tracev (101+x,5+y,3+y); + call tracev (101+x,23+y,19+y); call tracev (101+x,39+y,37+y); + call tracev (102+x,5+y,3+y); call tracev (102+x,23+y,19+y); + call tracev (102+x,39+y,37+y); call tracev (103+x,6+y,3+y); + call tracev (103+x,23+y,19+y); call tracev (103+x,39+y,37+y); + call tracev (104+x,6+y,3+y); call tracev (104+x,23+y,20+y); + call tracev (104+x,39+y,37+y); call tracev (105+x,6+y,3+y); + call tracev (105+x,23+y,20+y); call tracev (105+x,39+y,37+y); + call tracev (106+x,6+y,4+y); call tracev (106+x,23+y,20+y); + call tracev (106+x,39+y,36+y); call tracev (107+x,6+y,4+y); + call tracev (107+x,23+y,20+y); call tracev (107+x,39+y,36+y); + call tracev (108+x,7+y,4+y); call tracev (108+x,23+y,19+y); + call tracev (108+x,39+y,36+y); call tracev (109+x,7+y,5+y); + call tracev (109+x,24+y,19+y); call tracev (109+x,38+y,36+y); + call tracev (110+x,7+y,5+y); call tracev (110+x,24+y,18+y); + call tracev (110+x,38+y,35+y); call tracev (111+x,8+y,5+y); + call tracev (111+x,21+y,18+y); call tracev (111+x,26+y,23+y); + call tracev (111+x,37+y,35+y); call tracev (112+x,10+y,6+y); + call tracev (112+x,21+y,17+y); call tracev (112+x,28+y,23+y); + call tracev (112+x,37+y,33+y); call tracev (113+x,20+y,6+y); + call tracev (113+x,36+y,24+y); call tracev (114+x,19+y,7+y); + call tracev (114+x,35+y,26+y); call tracev (115+x,17+y,9+y); + call tracev (115+x,34+y,28+y); call tracev (117+x,39+y,3+y); + call tracev (118+x,39+y,3+y); call tracev (119+x,39+y,3+y); + call tracev (120+x,39+y,3+y); call tracev (121+x,39+y,3+y); + call tracev (122+x,39+y,3+y); call tracev (123+x,39+y,3+y); + call tracev (124+x,39+y,3+y); call tracev (125+x,39+y,3+y); + call tracev (126+x,39+y,3+y); call tracev (127+x,39+y,3+y); + call tracev (128+x,39+y,3+y); call tracev (129+x,39+y,3+y); + call tracev (130+x,39+y,3+y); call tracev (131+x,39+y,3+y); + call tracev (132+x,39+y,3+y); call tracev (133+x,39+y,3+y); + call tracev (134+x,39+y,3+y); call tracev (135+x,39+y,3+y); + call tracev (136+x,5+y,3+y); call tracev (136+x,39+y,37+y); + call tracev (137+x,5+y,3+y); call tracev (137+x,22+y,20+y); + call tracev (137+x,39+y,37+y); call tracev (138+x,5+y,3+y); + call tracev (138+x,23+y,19+y); call tracev (138+x,39+y,37+y); + call tracev (139+x,5+y,3+y); call tracev (139+x,23+y,19+y); + call tracev (139+x,39+y,37+y); call tracev (140+x,5+y,3+y); + call tracev (140+x,23+y,19+y); call tracev (140+x,39+y,37+y); + call tracev (141+x,6+y,3+y); call tracev (141+x,23+y,19+y); + call tracev (141+x,39+y,37+y); call tracev (142+x,6+y,3+y); + call tracev (142+x,23+y,20+y); call tracev (142+x,39+y,37+y); + call tracev (143+x,6+y,3+y); call tracev (143+x,23+y,20+y); + call tracev (143+x,39+y,37+y); call tracev (144+x,6+y,4+y); + call tracev (144+x,23+y,20+y); call tracev (144+x,39+y,36+y); + call tracev (145+x,6+y,4+y); call tracev (145+x,23+y,20+y); + call tracev (145+x,39+y,36+y); call tracev (146+x,7+y,4+y); + call tracev (146+x,23+y,19+y); call tracev (146+x,39+y,36+y); + call tracev (147+x,7+y,5+y); call tracev (147+x,24+y,19+y); + call tracev (147+x,38+y,36+y); call tracev (148+x,7+y,5+y); + call tracev (148+x,24+y,18+y); call tracev (148+x,38+y,35+y); + call tracev (149+x,8+y,5+y); call tracev (149+x,21+y,18+y); + call tracev (149+x,26+y,23+y); call tracev (149+x,37+y,35+y); + call tracev (150+x,10+y,6+y); call tracev (150+x,21+y,17+y); + call tracev (150+x,28+y,23+y); call tracev (150+x,37+y,33+y); + call tracev (151+x,20+y,6+y); call tracev (151+x,36+y,24+y); + call tracev (152+x,19+y,7+y); call tracev (152+x,35+y,26+y); + call tracev (153+x,17+y,9+y); call tracev (153+x,34+y,28+y); + call tracev (155+x,39+y,3+y); call tracev (156+x,39+y,3+y); + call tracev (157+x,39+y,3+y); call tracev (158+x,39+y,3+y); + call tracev (159+x,39+y,3+y); call tracev (160+x,39+y,3+y); + call tracev (161+x,39+y,3+y); call tracev (162+x,39+y,3+y); + call tracev (163+x,39+y,3+y); call tracev (164+x,39+y,3+y); + call tracev (165+x,39+y,3+y); call tracev (166+x,39+y,3+y); + call tracev (167+x,39+y,3+y); call tracev (168+x,39+y,3+y); + call tracev (169+x,39+y,3+y); call tracev (170+x,39+y,3+y); + call tracev (171+x,39+y,3+y); call tracev (172+x,39+y,3+y); + call tracev (173+x,39+y,3+y); call tracev (174+x,39+y,37+y); + call tracev (175+x,39+y,37+y); call tracev (176+x,39+y,37+y); + call tracev (177+x,39+y,37+y); call tracev (178+x,39+y,37+y); + call tracev (179+x,39+y,37+y); call tracev (180+x,39+y,37+y); + call tracev (181+x,39+y,37+y); call tracev (182+x,39+y,37+y); + call tracev (183+x,39+y,37+y); call tracev (184+x,39+y,37+y); + call tracev (185+x,39+y,37+y); call tracev (186+x,39+y,37+y); + call tracev (187+x,39+y,37+y); call tracev (188+x,39+y,37+y); + call tracev (190+x,39+y,3+y); call tracev (191+x,39+y,3+y); + call tracev (192+x,39+y,3+y); call tracev (193+x,39+y,3+y); + call tracev (194+x,39+y,3+y); call tracev (195+x,39+y,3+y); + call tracev (196+x,39+y,3+y); call tracev (197+x,39+y,3+y); + call tracev (198+x,39+y,3+y); call tracev (199+x,39+y,3+y); + call tracev (200+x,39+y,3+y); call tracev (201+x,39+y,3+y); + call tracev (202+x,39+y,3+y); call tracev (203+x,39+y,3+y); + call tracev (204+x,39+y,3+y); call tracev (205+x,39+y,3+y); + call tracev (206+x,39+y,3+y); call tracev (207+x,39+y,3+y); + call tracev (208+x,39+y,3+y); call tracev (209+x,5+y,3+y); + call tracev (209+x,16+y,13+y); call tracev (209+x,39+y,37+y); + call tracev (210+x,5+y,3+y); call tracev (210+x,16+y,13+y); + call tracev (210+x,39+y,37+y); call tracev (211+x,5+y,3+y); + call tracev (211+x,16+y,13+y); call tracev (211+x,39+y,37+y); + call tracev (212+x,5+y,3+y); call tracev (212+x,16+y,13+y); + call tracev (212+x,39+y,37+y); call tracev (213+x,5+y,3+y); + call tracev (213+x,16+y,13+y); call tracev (213+x,39+y,37+y); + call tracev (214+x,5+y,3+y); call tracev (214+x,16+y,13+y); + call tracev (214+x,39+y,37+y); call tracev (215+x,5+y,3+y); + call tracev (215+x,16+y,13+y); call tracev (215+x,39+y,37+y); + call tracev (216+x,5+y,3+y); call tracev (216+x,16+y,13+y); + call tracev (216+x,39+y,37+y); call tracev (217+x,5+y,3+y); + call tracev (217+x,16+y,13+y); call tracev (217+x,39+y,37+y); + call tracev (218+x,5+y,3+y); call tracev (218+x,16+y,13+y); + call tracev (218+x,39+y,37+y); call tracev (219+x,5+y,3+y); + call tracev (219+x,16+y,13+y); call tracev (219+x,39+y,37+y); + call tracev (220+x,5+y,3+y); call tracev (220+x,16+y,13+y); + call tracev (220+x,39+y,37+y); call tracev (221+x,5+y,3+y); + call tracev (221+x,16+y,13+y); call tracev (221+x,39+y,37+y); + call tracev (222+x,5+y,3+y); call tracev (222+x,16+y,13+y); + call tracev (222+x,39+y,37+y); call tracev (223+x,16+y,13+y); + call tracev (223+x,39+y,37+y); call tracev (224+x,16+y,13+y); + call tracev (224+x,39+y,37+y); call tracev (225+x,39+y,37+y); + end dessinbubble; + + unit dessinsort : procedure (x,y,c : integer); + begin + call color (c); + call tracev (45+x,19+y,11+y); call tracev (45+x,35+y,33+y); + call tracev (46+x,21+y,9+y); call tracev (46+x,36+y,33+y); + call tracev (47+x,22+y,7+y); call tracev (47+x,37+y,33+y); + call tracev (48+x,23+y,6+y); call tracev (48+x,37+y,34+y); + call tracev (49+x,24+y,6+y); call tracev (49+x,38+y,35+y); + call tracev (50+x,25+y,5+y); call tracev (50+x,38+y,36+y); + call tracev (51+x,25+y,4+y); call tracev (51+x,39+y,36+y); + call tracev (52+x,26+y,3+y); call tracev (52+x,39+y,37+y); + call tracev (53+x,27+y,3+y); call tracev (53+x,39+y,37+y); + call tracev (54+x,27+y,3+y); call tracev (54+x,39+y,37+y); + call tracev (55+x,28+y,3+y); call tracev (55+x,40+y,37+y); + call tracev (56+x,29+y,3+y); call tracev (56+x,40+y,37+y); + call tracev (57+x,30+y,3+y); call tracev (57+x,40+y,37+y); + call tracev (58+x,30+y,2+y); call tracev (58+x,40+y,36+y); + call tracev (59+x,32+y,2+y); call tracev (59+x,40+y,34+y); + call tracev (60+x,40+y,2+y); call tracev (61+x,6+y,2+y); + call tracev (61+x,40+y,12+y); call tracev (62+x,6+y,2+y); + call tracev (62+x,39+y,13+y); call tracev (63+x,5+y,2+y); + call tracev (63+x,39+y,13+y); call tracev (64+x,5+y,2+y); + call tracev (64+x,39+y,14+y); call tracev (65+x,5+y,2+y); + call tracev (65+x,39+y,15+y); call tracev (66+x,5+y,3+y); + call tracev (66+x,39+y,15+y); call tracev (67+x,5+y,3+y); + call tracev (67+x,38+y,16+y); call tracev (68+x,5+y,3+y); + call tracev (68+x,38+y,17+y); call tracev (69+x,6+y,3+y); + call tracev (69+x,38+y,17+y); call tracev (70+x,7+y,4+y); + call tracev (70+x,37+y,18+y); call tracev (71+x,8+y,4+y); + call tracev (71+x,37+y,19+y); call tracev (72+x,9+y,5+y); + call tracev (72+x,36+y,21+y); call tracev (73+x,9+y,6+y); + call tracev (73+x,34+y,22+y); call tracev (74+x,9+y,8+y); + call tracev (74+x,31+y,23+y); call tracev (75+x,24+y,20+y); + call tracev (76+x,27+y,16+y); call tracev (77+x,30+y,12+y); + call tracev (78+x,32+y,10+y); call tracev (79+x,34+y,8+y); + call tracev (80+x,35+y,7+y); call tracev (81+x,36+y,6+y); + call tracev (82+x,36+y,6+y); call tracev (83+x,37+y,5+y); + call tracev (84+x,37+y,5+y); call tracev (85+x,38+y,4+y); + call tracev (86+x,38+y,4+y); call tracev (87+x,38+y,4+y); + call tracev (88+x,39+y,3+y); call tracev (89+x,39+y,3+y); + call tracev (90+x,39+y,3+y); call tracev (91+x,39+y,2+y); + call tracev (92+x,40+y,2+y); call tracev (93+x,40+y,2+y); + call tracev (94+x,5+y,2+y); call tracev (94+x,40+y,37+y); + call tracev (95+x,5+y,2+y); call tracev (95+x,40+y,37+y); + call tracev (96+x,5+y,2+y); call tracev (96+x,40+y,37+y); + call tracev (97+x,5+y,3+y); call tracev (97+x,39+y,37+y); + call tracev (98+x,5+y,3+y); call tracev (98+x,39+y,37+y); + call tracev (99+x,5+y,3+y); call tracev (99+x,39+y,37+y); + call tracev (100+x,6+y,3+y); call tracev (100+x,38+y,36+y); + call tracev (101+x,6+y,4+y); call tracev (101+x,38+y,36+y); + call tracev (102+x,7+y,4+y); call tracev (102+x,38+y,36+y); + call tracev (103+x,7+y,4+y); call tracev (103+x,38+y,35+y); + call tracev (104+x,8+y,5+y); call tracev (104+x,37+y,35+y); + call tracev (105+x,9+y,5+y); call tracev (105+x,37+y,34+y); + call tracev (106+x,10+y,6+y); call tracev (106+x,36+y,33+y); + call tracev (107+x,11+y,6+y); call tracev (107+x,35+y,31+y); + call tracev (108+x,12+y,7+y); call tracev (108+x,34+y,30+y); + call tracev (109+x,14+y,8+y); call tracev (109+x,32+y,28+y); + call tracev (110+x,16+y,10+y); call tracev (110+x,31+y,26+y); + call tracev (111+x,29+y,12+y); call tracev (112+x,27+y,16+y); + call tracev (114+x,39+y,2+y); call tracev (115+x,39+y,2+y); + call tracev (116+x,39+y,2+y); call tracev (117+x,39+y,2+y); + call tracev (118+x,39+y,2+y); call tracev (119+x,39+y,2+y); + call tracev (120+x,39+y,2+y); call tracev (121+x,39+y,2+y); + call tracev (122+x,39+y,2+y); call tracev (123+x,39+y,2+y); + call tracev (124+x,39+y,2+y); call tracev (125+x,39+y,2+y); + call tracev (126+x,39+y,2+y); call tracev (127+x,39+y,2+y); + call tracev (128+x,39+y,2+y); call tracev (129+x,39+y,2+y); + call tracev (130+x,39+y,2+y); call tracev (131+x,39+y,2+y); + call tracev (132+x,39+y,2+y); call tracev (133+x,5+y,2+y); + call tracev (133+x,31+y,27+y); call tracev (134+x,5+y,2+y); + call tracev (134+x,32+y,27+y); call tracev (135+x,5+y,3+y); + call tracev (135+x,29+y,27+y); call tracev (135+x,33+y,30+y); + call tracev (136+x,5+y,3+y); call tracev (136+x,30+y,27+y); + call tracev (136+x,34+y,31+y); call tracev (137+x,5+y,3+y); + call tracev (137+x,30+y,27+y); call tracev (137+x,34+y,32+y); + call tracev (138+x,6+y,3+y); call tracev (138+x,30+y,27+y); + call tracev (138+x,35+y,32+y); call tracev (139+x,6+y,3+y); + call tracev (139+x,29+y,27+y); call tracev (139+x,36+y,33+y); + call tracev (140+x,6+y,3+y); call tracev (140+x,29+y,27+y); + call tracev (140+x,36+y,34+y); call tracev (141+x,6+y,3+y); + call tracev (141+x,29+y,27+y); call tracev (141+x,37+y,35+y); + call tracev (142+x,6+y,4+y); call tracev (142+x,29+y,27+y); + call tracev (142+x,37+y,35+y); call tracev (143+x,7+y,4+y); + call tracev (143+x,29+y,26+y); call tracev (143+x,38+y,35+y); + call tracev (144+x,7+y,4+y); call tracev (144+x,28+y,25+y); + call tracev (144+x,38+y,35+y); call tracev (145+x,8+y,5+y); + call tracev (145+x,27+y,24+y); call tracev (145+x,38+y,36+y); + call tracev (146+x,5+y,2+y); call tracev (146+x,10+y,6+y); + call tracev (146+x,26+y,24+y); call tracev (146+x,38+y,36+y); + call tracev (147+x,5+y,2+y); call tracev (147+x,12+y,7+y); + call tracev (147+x,25+y,21+y); call tracev (147+x,39+y,37+y); + call tracev (148+x,5+y,2+y); call tracev (148+x,24+y,8+y); + call tracev (148+x,39+y,37+y); call tracev (149+x,5+y,2+y); + call tracev (149+x,23+y,10+y); call tracev (149+x,39+y,37+y); + call tracev (150+x,5+y,2+y); call tracev (150+x,21+y,12+y); + call tracev (150+x,39+y,37+y); call tracev (151+x,5+y,2+y); + call tracev (152+x,5+y,2+y); call tracev (153+x,5+y,2+y); + call tracev (154+x,5+y,2+y); call tracev (155+x,5+y,2+y); + call tracev (156+x,39+y,2+y); call tracev (157+x,39+y,2+y); + call tracev (158+x,39+y,2+y); call tracev (159+x,39+y,2+y); + call tracev (160+x,39+y,2+y); call tracev (161+x,39+y,2+y); + call tracev (162+x,39+y,2+y); call tracev (163+x,39+y,2+y); + call tracev (164+x,39+y,2+y); call tracev (165+x,39+y,2+y); + call tracev (166+x,39+y,2+y); call tracev (167+x,39+y,2+y); + call tracev (168+x,39+y,2+y); call tracev (169+x,39+y,2+y); + call tracev (170+x,39+y,2+y); call tracev (171+x,39+y,2+y); + call tracev (172+x,39+y,2+y); call tracev (173+x,39+y,2+y); + call tracev (174+x,39+y,2+y); call tracev (175+x,5+y,2+y); + call tracev (176+x,5+y,2+y); call tracev (177+x,5+y,2+y); + call tracev (178+x,5+y,2+y); call tracev (179+x,5+y,2+y); + call tracev (180+x,5+y,2+y); call tracev (181+x,5+y,2+y); + call tracev (182+x,5+y,2+y); call tracev (183+x,5+y,2+y); + call tracev (184+x,5+y,2+y); + end dessinsort; + +unit BOUTON : procedure(x,y,x2,y2,col_font,col1,col2:integer); +var + i : integer; +begin + call RECTANGLE_PLEIN (x+2,y+2,x2-2,y2-2,col_font,col_font); + for i:= 0 to 2 + do + call color (col1); + call move (x+i,y); + call draw (x+i,y2-i); + call move (x,y+i); + call draw (x2-i,y+i); + call color (col2); + call move (x2,y2-i); + call draw (x+i,y2-i); + call move (x2-i,y2); + call draw (x2-i,y+i); + od; + call color (7); + call RECTANGLE (x-1,y-1,x2+1,y2+1); + call color (7); + call move (x2,y2); + call draw (x2-2,y2-2); + call color (col2); + call move (x+3,y+3); + call draw (x2-3,y+3); + call move (x+3,y+3); + call draw (x+3,y2-3); + call color (col1); + call move (x2-3,y2-3); + call draw (x+4,y2-3); + call move (x2-3,y2-3); + call draw (x2-3,y+4); +end BOUTON; + +UNIT RECTANGLE_PLEINV : procedure(x_h,y_h,x_b,y_b, + coul,contour:integer); +var + i : integer ; + +BEGIN + call color (coul); + for i:= y_h to y_b + do + call move (x_h,i); + call hfill (x_b); + od; + call color (contour); + call move(x_h,y_h); + call draw(x_b,y_h); + call draw(x_b,y_b); + call draw(x_h,y_b); + call draw(x_h,y_h); + END RECTANGLE_PLEINV; + + + unit aff_nb : procedure (x,y,nb,dec,c : integer); + var + i,k : integer + begin + k := 1; + call rectangle_plein (x-2,y-2,x+dec*8+9,y+8,0,15); + call color (c); + for i := 0 to dec do + call move (x+(dec-i)*8,y); + call hascii (48+ (nb div k) mod 10); + k := k*10; + od; + end aff_nb; + + unit CHARGE_FOND : procedure; + var + i,j,n : integer, + col : integer, + c : char; + begin + call color (15); + for i:=0 to 10 do + call move (0,i*32); + call hfill (639); + od; + for i:=0 to 15 do + call move (i*40,0); + call vfill (349); + od; + + call color (8); + for i:=0 to 10 do + call move (0,i*32+29); + call hfill (639); + call move (0,i*32+30); + call hfill (639); + od; + for i:=0 to 15 do + call move (i*40+37,0); + call vfill (349); + call move (i*40+38,0); + call vfill (349); + od; + call color (7); + for i:=0 to 10 do + call move (0,i*32+31); + call hfill (639); + od; + for i:=0 to 15 do + call move (i*40+39,0); + call vfill (349); + od; + call color (15); + for i:=0 to 10 do + call move (0,i*32); + call hfill (639); + od; + for i:=0 to 15 do + call move (i*40,0); + call vfill (349); + od; + call RECTANGLE_PLEIN (70,80,570,300,1,1); + call RECTANGLE_PLEIN (105,301,581,309,8,8); + call RECTANGLE_PLEIN (570,105,581,301,8,8); + end CHARGE_FOND; + +unit AFF_OPTIONS : procedure; +begin + + (* definition des boutons *) + call BOUTON (150,100,190,125,7,15,8); + call BOUTON (150,155,190,180,7,15,8); + call BOUTON (150,210,190,235,7,15,8); + call BOUTON (150,265,190,290,7,15,8); + (* definition des barres de textes*) + call RECTANGLE_PLEIN (230,100,500,125,7,15); + call RECTANGLE_PLEIN (230,155,500,180,7,15); + call RECTANGLE_PLEIN (230,210,500,235,7,15); + call RECTANGLE_PLEIN (230,265,500,290,7,15); + (* texte *) + call pallet (7); + call color (15); + call move (249,110); + call outstring ("CHOIX DES ELEMENTS A TRIER"); + call move (249,165); + call outstring ("GENERER DES NOUVELLES VALEURS"); + call move (249,220); + call outstring ("TRI DES ELEMENTS "); + call move (249,275); + call outstring ("QUITTER LE PROGRAMME"); + call color (8); + call move (251,111); + call outstring ("CHOIX DES ELEMENTS A TRIER"); + call move (251,166); + call outstring ("GENERER DES NOUVELLES VALEURS"); + call move (251,221); + call outstring ("TRI DES ELEMENTS "); + call move (251,276); + call outstring ("QUITTER LE PROGRAMME"); +end AFF_OPTIONS; + +unit DELAI : procedure ( n : integer); +var + i : integer; +begin + for i := 1 to n do od; +end DELAI; + +unit CHOIX_UTIL : procedure ; +begin + + pref STR_ELEMENTS block +var + x,y,p,choix_courant,nbelems : integer, + gauche,droit,centre : boolean; + BEGIN + call dessinmenu (250,10,8); + call dessinmenu (247,7,4); + + call AFF_OPTIONS; + choix_courant := 1; + nbelems := 100; + do + + call showcursor; + call setwindow (70,570,80,300); + + call getpress (0,x,y,p,gauche,droit,centre); + if (gauche) then + call hidecursor; + if (x>150 and x<190) then + if (y>100 and y<125) then + call BOUTON (150,100,190,125,7,8,15); + call DELAI (2000); + call BOUTON (150,100,190,125,7,15,8); + call CHOIX_ELEM(choix_courant,nbelems); + call AFF_OPTIONS; + call eff_titre; + call dessinmenu (250,10,8); + call dessinmenu (247,7,4); + fi; + if (y>155 and y<180) then + call BOUTON (150,155,190,180,7,8,15); + call DELAI (2000); + call BOUTON (150,155,190,180,7,15,8); + call CHOIX_NB_ELEM(nbelems,choix_courant); + call AFF_OPTIONS; + call eff_titre; + call dessinmenu (250,10,8); + call dessinmenu (247,7,4); + fi; + if (y>210 and y<235) then + call BOUTON (150,210,190,235,7,8,15); + call DELAI (2000); + call BOUTON (150,210,190,235,7,15,8); + call AFF_TRI(choix_courant,nbelems); + call CHARGE_FOND; + call AFF_OPTIONS; + call eff_titre; + call dessinmenu (250,10,8); + call dessinmenu (247,7,4); + fi; + if (y>265 and y<290) then + call BOUTON (150,265,190,290,7,8,15); + call DELAI (2000); + call BOUTON (150,265,190,290,7,15,8); + exit ; + fi; + fi; + fi; + od; + end; +end CHOIX_UTIL; + +unit AFF_CONTOUR_CHOIX : procedure (choix_courant,coul : integer); +begin + call color (coul); + case choix_courant + when 1: call RECTANGLE (229,89,501,146); + call RECTANGLE (228,88,502,147); + call RECTANGLE (227,87,503,148); + when 2: call RECTANGLE (229,159,501,216); + call RECTANGLE (228,158,502,217); + call RECTANGLE (227,157,503,218); + when 3: call RECTANGLE (229,229,501,286); + call RECTANGLE (228,228,502,287); + call RECTANGLE (227,227,503,288); + esac; +end AFF_CONTOUR_CHOIX; + +unit GRAPH_ELEM : procedure ; +begin + (* histogrammes *) + call BOUTON (150,105,190,130,7,15,8); + call RECTANGLE_PLEIN (230,90,500,132,7,8); + call RECTANGLE_PLEIN (250,100,270,130,4,4); + call RECTANGLE_PLEIN (280,120,300,130,2,2); + call RECTANGLE_PLEIN (310,110,330,130,13,13); + call RECTANGLE_PLEIN (340,95,360,130,9,9); + call RECTANGLE_PLEIN (370,105,390,130,1,1); + call RECTANGLE_PLEIN (400,108,420,130,12,12); + call RECTANGLE_PLEIN (430,115,450,130,10,10); + call RECTANGLE_PLEIN (460,100,480,130,11,11); + call RECTANGLE_PLEIN (230,132,500,145,7,8); + call color (15); + call move (270,136); + call outstring ("H I S T O G R A M M E S"); + call color (8); + call move (271,137); + call outstring ("H I S T O G R A M M E S"); + (* polynomes *) + call BOUTON (150,175,190,200,7,15,8); + call RECTANGLE_PLEIN (230,160,500,202,7,8); + call RECTANGLE_PLEIN (230,202,500,215,7,8); + call color (1); + call move (240,170); + call outstring ("X^2+3"); + call color (4); + call move (270,185); + call outstring ("-4X^5+5X^4-2X^3+6"); + call color (2); + call move (300,165); + call outstring ("6X+5"); + call color (11); + call move (405,175); + call outstring ("-X^2+2X-3"); + call color (15); + call move (295,206); + call outstring ("P O L Y N O M E S"); + call color (8); + call move (296,207); + call outstring ("P O L Y N O M E S"); + (* rectangles *) + call RECTANGLE_PLEIN (230,230,500,272,7,8); + call BOUTON (150,245,190,270,7,15,8); + call RECTANGLE_PLEIN (250,235,290,267,13,13); + call RECTANGLE_PLEIN (300,255,330,270,12,12); + call RECTANGLE_PLEIN (340,240,400,272,10,10); + call RECTANGLE_PLEIN (410,232,430,265,9,9); + call RECTANGLE_PLEIN (440,243,480,260,4,4); + call RECTANGLE_PLEIN (230,272,500,285,7,8); + call color (15); + call move (305,276); + call outstring ("S U R F A C E S"); + call color (8); + call move (306,277); + call outstring ("S U R F A C E S"); +end GRAPH_ELEM; + +unit CHOIX_ELEM : procedure(inout choix_courant,nbelems : integer); +var +x,y,p : integer, +choix : char, +gauche,droit,centre : boolean; +begin + call EFFACE (70,80,570,300,9,1,15); + call eff_titre; + call dessinelem (206,20,8); + call dessinelem (203,17,4); + call GRAPH_ELEM; + call AFF_CONTOUR_CHOIX(choix_courant,15); + call BOUTON (80,175,130,200,7,15,8); + call move (92,185); + call color (4); + call outstring ("O K"); + call showcursor; + do + call getpress (0,x,y,p,gauche,droit,centre); + if (gauche) then + call hidecursor; + if ( x >150 and x <190 and y>105 and y<130) then + call BOUTON (150,105,190,130,7,8,15); + call DELAI (2000); + call BOUTON (150,105,190,130,7,15,8); + call AFF_CONTOUR_CHOIX(1,15); + call AFF_CONTOUR_CHOIX(2,1); + call AFF_CONTOUR_CHOIX(3,1); + choix_courant := 1; + nbelems := 100; + + fi; + if ( x >150 and x <190 and y>175 and y<200) then + call BOUTON (150,175,190,200,7,8,15); + call DELAI (2000); + call BOUTON (150,175,190,200,7,15,8); + call AFF_CONTOUR_CHOIX(2,15); + call AFF_CONTOUR_CHOIX(1,1); + call AFF_CONTOUR_CHOIX(3,1); + choix_courant := 2; + nbelems := 10; + fi; + if ( x >150 and x <190 and y>245 and y<270) then + call BOUTON (150,245,190,270,7,8,15); + call DELAI (2000); + call BOUTON (150,245,190,270,7,15,8); + call AFF_CONTOUR_CHOIX(1,1); + call AFF_CONTOUR_CHOIX(2,1); + call AFF_CONTOUR_CHOIX(3,15); + choix_courant := 3; + nbelems := 25; + fi; + if (x>80 and x<130 and y>130 and y<200) then + call BOUTON (80,175,130,200,7,8,15); + call move (92,185); + call color (8); + call outstring ("O K"); + call DELAI (2000); + call BOUTON (80,175,130,200,7,15,8); + call EFFACE(70,80,570,300,9,1,15); + exit; + fi; + call showcursor ; + fi; + od; +end CHOIX_ELEM; + +unit AFF_C : procedure (coul,nb_bouton : integer); + +begin +call color (coul); + case nb_bouton + when 1 : + call RECTANGLE (199,159,241,186); + call RECTANGLE (198,158,242,187); + call RECTANGLE (197,157,243,188); + when 2 : + call RECTANGLE (299,159,341,186); + call RECTANGLE (298,158,342,187); + call RECTANGLE (297,157,343,188); + when 3 : + call RECTANGLE (399,159,441,186); + call RECTANGLE (398,158,442,187); + call RECTANGLE (397,157,443,188); + esac; +end AFF_C; + +unit GERE_CHOIX_NB : procedure (choix_courant :integer + ;inout nbelems : integer); +var + x,y,p : integer, + gauche,droit,centre : boolean; +begin + call showcursor; + call setwindow (70,570,80,300); + do + call getpress (0,x,y,p,gauche,droit,centre); + if (gauche) then + call hidecursor; + if ( x >200 and x <240 and y>200 and y<225) then + call BOUTON (200,200,240,225,7,8,15); + call DELAI (2000); + call BOUTON (200,200,240,225,7,15,8); + case choix_courant + when 1 : nbelems := 30; + when 2 : nbelems := 5; + when 3 : nbelems := 15; + esac; + call AFF_C(15,1); + call AFF_C(1,2); + call AFF_C(1,3); + fi; + if ( x >300 and x <340 and y>200 and y<225) then + call BOUTON (300,200,340,225,7,8,15); + call DELAI (2000); + call BOUTON (300,200,340,225,7,15,8); + case choix_courant + when 1 : nbelems := 100; + when 2 : nbelems := 10; + when 3 : nbelems := 25; + esac; + call AFF_C(1,1); + call AFF_C(15,2); + call AFF_C(1,3); + fi; + if ( x >400 and x <440 and y>200 and y<225) then + call BOUTON (400,200,440,225,7,8,15); + call DELAI (2000); + call BOUTON (400,200,440,225,7,15,8); + case choix_courant + when 1 : nbelems := 150 ; + when 2 : nbelems := 20; + when 3 : nbelems := 50; + esac; + call AFF_C(1,1); + call AFF_C(1,2); + call AFF_C(15,3); + fi; + if ( x >265 and x <365 and y>250 and y<280) then + call BOUTON (265,250,365,280,7,8,15); + call DELAI (2000); + call BOUTON (265,250,365,280,7,15,8); + exit ; + fi; + call showcursor; + call setwindow (70,570,80,300); + fi; + od; +end GERE_CHOIX_NB; + +unit CHOIX_NB_ELEM : procedure (inout nbelems :integer; + choix_courant : integer); +var +coul,nbbouton : integer, +choix : char ; +begin + call EFFACE (70,80,570,300,9,1,15); + call eff_titre; + call dessinrand (206,20,8); + call dessinrand (203,17,4); + call RECTANGLE_PLEIN(150,100,490,150,7,15); + call RECTANGLE_PLEIN (200,160,240,185,7,15); + call BOUTON (200,200,240,225,7,15,8); + call RECTANGLE_PLEIN (300,160,340,185,7,15); + call BOUTON (300,200,340,225,7,15,8); + call RECTANGLE_PLEIN (400,160,440,185,7,15); + call BOUTON (400,200,440,225,7,15,8); + call BOUTON (265,250,365,280,7,15,8); + call color (4); + case choix_courant + when 1 : + call move (250,120); + call outstring ("H I S T O G R A M M E S"); + call move (209,167); + call outstring ("30"); + call move (309,167); + call outstring ("100"); + call move (405,167); + call outstring ("150"); + when 2 : + call move (250,120); + call outstring (" P O L Y N O M E S"); + call move (209,167); + call outstring ("5"); + call move (309,167); + call outstring ("10"); + call move (405,167); + call outstring ("20"); + when 3 : + call move (255,120); + call outstring ("S U R F A C E S"); + call move (209,167); + call outstring ("15"); + call move (309,167); + call outstring ("25"); + call move (405,167); + call outstring ("50"); + esac; + coul := 15; + if (nbelems=30 or nbelems =5 or nbelems =15) then + call AFF_C(15,1); + else + if (nbelems = 100 or nbelems = 10 or nbelems = 25) then + call AFF_C(15,2); + else + call AFF_C(15,3); + fi; + fi; + call GERE_CHOIX_NB (choix_courant,nbelems); + call EFFACE (70,80,570,300,9,1,15); +end CHOIX_NB_ELEM; + +unit AFF_RENS : procedure ; +begin + call color (15); + call move (0,174); + call draw (639,174); + call move (0,110); + call draw (639,110); + call move (0,285); + call draw (639,285); + call move (0,284); + call draw (639,284); + call dessinquick (-23+3,123+3,8); + call dessinsort (220+3,123+3,8); + call dessinquick (-23,123,9); + call dessinsort (220,123,9); + call dessinbubble (0+3,300+3,8); + call dessinsort (220+3,300+3,8); + call dessinbubble (0,300,14); + call dessinsort (220,300,14); + call RECTANGLE_PLEIN (415,115,520,130,7,15); + call RECTANGLE_PLEIN (415,135,520,150,7,15); + call color (4); + call move (420,120); + call outstring ("PERMUTATIONS"); + call move (420,140); + call outstring ("COMPARAISONS"); + call move (420,160); + call color (4); + call outstring ("en cours ..."); + call RECTANGLE_PLEIN (415,290,520,305,7,15); + call RECTANGLE_PLEIN (415,310,520,325,7,15); + call color (4); + call move (420,295); + call outstring ("PERMUTATIONS"); + call move (420,315); + call outstring ("COMPARAISONS"); + call move (420,335); + call color (4); + call outstring ("en attente "); +end AFF_RENS; + +unit AFF_RENS_FIN : procedure; +begin + call RECTANGLE_PLEIN (415,155,520,170,7,7); + call RECTANGLE_PLEIN (415,330,520,345,7,7); + call color (4); + call move (420,160); + call outstring ("tri fini."); + call move (420,335); + call outstring ("en cours ..."); +end AFF_RENS_FIN; + +unit AFF_RENS_FIN2 : procedure; +begin + call RECTANGLE_PLEIN (415,330,520,345,7,7); + call color (4); + call move (420,335); + call outstring ("tri fini."); +end AFF_RENS_FIN2; + +unit STATS: procedure(nb_iterationsq,nb_iterationsb,nbelems:integer); +var + trouve : boolean, + chaine1,chaine2 : string, + choix : char, + i,x1,x2,x3,x4,itermax,ind_perfb, + calcule_cmq,calcule_cmb,cout_maxb,cout_maxq, + ind_perfq,marque : integer, + sauve_valq,sauve_valb , + pas_q,pas_b,facteur : real; +begin + trouve := true; + call pallet(0); + call RECTANGLE_PLEIN(0,0,639,349,0,15); + call dessinstat(235+3,10+3,8); + call dessinstat(235,10,9); + call move (115,90); + call color (8); + call outstring ("INDICE DE RAPIDITE (calcul‚ sur la base des comparaisons)"); + call move (114,89); + call color (15); + call outstring ("INDICE DE RAPIDITE (calcul‚ sur la base des comparaisons)"); + call move (5,107); + call color (9); + call outstring ("QUICK SORT"); + call move (5,157); + call outstring ("BUBBLE SORT"); + call RECTANGLE_PLEIN(99,100,551,130,8,15); + call RECTANGLE_PLEIN(99,150,551,180,8,15); + call aff_nb (570,115,nb_iterationsq,4,15); + call aff_nb (570,165,nb_iterationsb,4,15); + facteur := nb_iterationsq / 100; + pas_q := facteur * 450 / nb_iterationsq ; + pas_b := facteur * 450 / nb_iterationsb ; + call color (4); + if nb_iterationsq>nb_iterationsb then itermax := nb_iterationsq; + else itermax := nb_iterationsb; + fi; + itermax := entier (itermax / facteur); + for i := 0 to itermax + do + x1 := entier(i*pas_q); + x2 := entier(i*pas_b); + x3 := entier ((i+1)*pas_q); + x4 := entier ((i+1)*pas_b); + sauve_valq := 100 + x1 ; + sauve_valb := 100 + x2 ; + if (x3 <= 450) then + call RECTANGLE_PLEIN(sauve_valq,101,100+x3,129,4,4); + else + if trouve then + call color (15); + trouve := false; + call move (sauve_valb,140); + call outstring ("³"); + fi; + fi; + if (x4 <= 450) then + call RECTANGLE_PLEIN(sauve_valb,151,100+x4,179,4,4); + fi; + od; + cout_maxb := entier((nbelems*(nbelems-1)) / 2); + cout_maxq := entier((((nbelems+1)*(nbelems+2)/2)-3)); + ind_perfb := 100 - ((nb_iterationsb*100)/cout_maxb); + ind_perfq := 100 -((nb_iterationsq*100)/cout_maxq); + chaine1 := "QUICK SORT"; + chaine2 := "BUBBLE SORT"; + call move (180,190); + call color (8); + call outstring ("W I N N E R :"); + call move (178,188); + call color (14); + call outstring ("W I N N E R :"); + + call color (9); + if (nb_iterationsq < nb_iterationsb) then + call move (290,190); + call outstring(chaine1); + else + call move (290,190); + call outstring (chaine2); + fi; + call RECTANGLE_PLEIN (20,210,620,330,0,15); + call color (15); + call move (20,250); + call draw (620,250); + call move (20,290); + call draw (620,290); + call move (140,210); + call draw (140,330); + call move (260,210); + call draw (260,330); + call move (380,210); + call draw (380,330); + call move (500,210); + call draw (500,330); + call move (40,220); + call color (2); + call outstring ("METHODES"); + call move (152,220); + call outstring ("NB ELEMENTS"); + call move (280,220); + call outstring ("COUT MOYEN"); + call move (390,220); + call outstring ("COUT MAXIMUM"); + call move (510,220); + call outstring ("PERFORMANCE"); + call move (522,230); + call outstring ("en %"); + call aff_nb(160,260,nbelems,3,15); + call aff_nb(160,300,nbelems,3,15); + calcule_cmb := entier((nbelems*(nbelems-1)) / 2); + calcule_cmq := entier(2*(ln (nbelems) / ln (10))*nbelems); + call aff_nb(550,300,ind_perfb,2,15); + call aff_nb(550,260,ind_perfq,2,15); + call aff_nb(290,300,calcule_cmb,4,15); + call aff_nb(290,260,calcule_cmq,3,15); + call aff_nb(410,260,cout_maxq,3,15); + call aff_nb(410,300,calcule_cmb,4,15); + call color (2); + call move (35,260); + call outstring ("QUICK SORT"); + call move (35,300); + call outstring ("BUBBLE SORT"); + read (choix); + call EFFACE (0,0,639,349,9,7,15); +end; + +unit AFF_TRI : procedure(choix_courant,nbelems: integer); +begin +pref STR_ELEMENTS block +var + CONTINUE : boolean, + choix : char, + TAB1,TAB2 : STR_ELEMENTS, + i,rand,det_coul,essai, + nb_perm,nb_iterationsq,nb_iterationsb : integer; +begin + nb_perm := 0; + nb_iterationsq := 0; + nb_iterationsb := 0; + CONTINUE := false; + call EFFACE (0,0,639,349,9,7,15); + case choix_courant + when 1: + TAB1 := new HISTOGRAMMES (nbelems); + TAB2 := new HISTOGRAMMES (nbelems); + when 2: + TAB1 := new POLY (nbelems); + TAB2 := new POLY (nbelems); + when 3 : + TAB1 := new SURFACES (nbelems); + TAB2 := new SURFACES (nbelems); + esac; + call AFF_RENS; + call TAB1.randomize; + call TAB2.copie(TAB1); + for i := 0 to nbelems-1 + do + call TAB1.trace (i,105); + call TAB2.trace (i,280); + od; + + call QUICK_SORT (0,nbelems-1,TAB1,nb_perm,nb_iterationsq); + call AFF_RENS_FIN; + nb_perm := 0; + call TAB1.killtab; + kill (TAB1); + call bubble_sort(nbelems-1,TAB2,nb_perm,nb_iterationsb); + call AFF_RENS_FIN2; + call TAB2.killtab; + kill (TAB2); + read (choix); + CONTINUE:=BOX_MESSAGE("Voulez-vous les statistiques des tris ?", + 150,75,500,200); + if ( CONTINUE) then + call EFFACE (0,0,639,349,9,7,15); + call STATS(nb_iterationsq,nb_iterationsb,nbelems); + else + call EFFACE (0,0,639,349,9,7,15); + exit; + fi; + end; +end AFF_TRI; +unit SWAP : procedure (indice1 , indice2 : integer ; + inout T2 : STR_ELEMENTS;inout nb_perm : integer); +begin + +pref STR_ELEMENTS block +var +temp1,temp2,coul1,coul2,hauteur1,hauteur2 : integer; + + begin + nb_perm := nb_perm + 1; + call aff_nb (560,120,nb_perm,4,1); + call T2.echange (indice1,indice2,105); +end; +end SWAP; + + +unit QUICK_SORT : procedure (gauche,droite : integer ; inout T : STR_ELEMENTS; + inout nb_perm,nb_iterations :integer); + +begin +pref STR_ELEMENTS block +var + moy,ibas,ihaut : integer ; +begin + (* initialisation des indices bas et haut *) + ibas := gauche; + ihaut := droite; + (* choix d'une valeur mediane *) + moy := (gauche + droite) div 2; + (* echange pour que valeurs gauches <= pivot <= valeurs droites *) + do + (* recherche de la premiere valeur de gauche mal placee *) + while (T.compare (ibas,moy)=-1) + do + ibas := ibas + 1; + nb_iterations := nb_iterations + 1; + od; + (* recherche de la premiere valeur de droite mal placee *) + while (T.compare (moy,ihaut)=-1) + do + ihaut := ihaut - 1; + nb_iterations := nb_iterations + 1; + od; + call aff_nb(560,140,nb_iterations,4,1); + (* echange eventuel de 2 valeurs mal classees *) + if ibas <= ihaut then + call SWAP (ibas,ihaut,T,nb_perm); + if ibas = moy then + moy := ihaut; + else if ihaut = moy then + moy := ibas; + fi; + fi; + ibas := ibas + 1; + ihaut := ihaut - 1; + fi; + if ibas > ihaut then exit; + fi; + od; + (* recursion si les sous-intervalles ne sont pas d‚j… tri‚s *) + if ihaut > gauche then + call QUICK_SORT (gauche,ihaut,T,nb_perm,nb_iterations); + fi; + if ibas < droite then + call QUICK_SORT (ibas,droite,T,nb_perm,nb_iterations); + fi; + +end; +end QUICK_SORT; + +unit bubble_sort : procedure (n : integer;inout T : STR_ELEMENTS; + inout nb_perm,nb_iterations : integer); +var + i,j : integer, + triok : boolean; + begin + i:=n; + (* tant que le tableau n'est pas entiŠrement tri‚ *) + while (i>=0) and not triok + do + triok := true; + (* tri du sous-tableau *) + for j := 0 to i-1 + do + nb_iterations := nb_iterations + 1; + call aff_nb (560,315,nb_iterations,4,1); + (* ordonner 2 ‚l‚ments *) + if T.compare(j,j+1) = 1 then + nb_perm := nb_perm + 1; + call aff_nb (560,295,nb_perm,4,1); + call T.echange(j,j+1,280); + triok := false; + fi; + od; + i := i-1; + od; + end bubble_sort; + +begin + pref STR_ELEMENTS block +(********************************************************************) +(* PROGRAMME PRINCIPAL *) +(********************************************************************) + +begin + call gron(NOCARD); (* installation du pilote graphique *) + call rectangle_plein (0,0,639,349,7,7); + call pallet (7); + call CHARGE_FOND; + call CHOIX_UTIL ; + call EFFACE (0,0,639,349,9,7,15); + call groff; +end; +end; +end; +end; +end TRI; diff --git a/examples/demos.pau/sort95/sort.pcd b/examples/demos.pau/sort95/sort.pcd new file mode 100644 index 0000000000000000000000000000000000000000..8b41cf5de8114912ec6fc4d59c223d536e279d6c GIT binary patch literal 5022 zcmai&dx#ZP9LIlm?rX_D6+b8i5&_q+wQSEmmgSzQ6CebLX77v-*QQbME<^&zv*o{ATXl z&E=}nBKt%H2l+E4lE6`;k@eZyT!?0p%Owk+wDL4~a~$1Pk&Coz99v*JvdnM7K2LkW zHS9%A*gCc+>x*o=At{@huyt%t_S&5>>0HikNJ)JYb|n@fAs^>ESLK(*z3!AWfVaU} zOYnDw*Ls@e&m4PT#;np=eA0;8L&002J&V8N^uA~L1MRhW`$QA=8`=TEPF)k1lDH5h6gSWBvT_3S^$6leWJC>1y;O(G=-4@VZMEj>Ofq81( zv4yntV@7@fck}!OP)}Z@U8>t*h3?pV%Ps?t+p*_quh9jyLhq6=uxjA$n%B^Kj%8a- zBrDW@)*8DbxO;z_&hu!O>MdYJG+WBRgB>&7=EC#j8QOIbJD1DIQyg2@JS%&^H6_A( z%$(y%+8-9#cCKaR0JwYI#-2mFF=D&9mX*uknk_o^EE-R+oXv8FJ}|A&T$>4EA}hPW zb-%-eo(h_j$7%P`6I-FVHl4P)?*8C6fro=kqCJK7TbhPeXs%V$*2b)C2Y2(l64aB4 zv=_FwR8%$Bsw{g6cyQfz&k3}*++erqv&hc164?f>E%rBz8WptbBDVW=6(XB~k+(*rx3v(4>r}eJ*0_j*X4?cubKcMMw1QFm+@ZT(y#r@%EG!#p1d>d9c*6`hO~l)7X0TlPe7wF^!8 zjss}la%13`qq}3ibOVojcjyP(lbv}x{@uZs_rNtB^$hoMymFK&>C1Y9Cb1RzY`GW2 zgfCx$2hWyXG`gZpOK;Xs#MpOQ_G$1S&%4m*gfb1#CD6MWfgd^=B7Oh&y(h~2i+C+)tcHqhzVaF1P`*sw0X2MvB z0Uozwf6-3%E4ITHUwm+P=6`VPOSDJ!5Bq9O$8NO79t$2f_C?y$W9;yJzRUu5$Nrt( z1(r)=?DN*xtD6}6H`;Fx3`YuP9=7;W2kvHzp}*4ZF(~XCXP1M!?@T|!OUpUhhhywB zASQhIuE;(Lnvs*VD+dQX%~996*c7#Q(|(`!`cI4PJ(j%*+#P#6Xj0xqnUHj2vAxT( zn}fUd7TVirk10(!x~}R}_gr2$3S7~pJvBQP%Whc0MhrR^Qlb2~PezbVzi$F}^xdyH; z2;sY84QNId(jGD?YG-6V?G*sN3SuT?sJH4S4w#`>WtR~x&p90k`m SkMMoX*!rI$Pdd-In*Bd<=2}?* literal 0 HcmV?d00001 diff --git a/examples/demos.pau/sort95/zrob!to.bat b/examples/demos.pau/sort95/zrob!to.bat new file mode 100644 index 0000000..c30ff27 --- /dev/null +++ b/examples/demos.pau/sort95/zrob!to.bat @@ -0,0 +1,4 @@ +egahint /m 95000 sort +rem dopilnuj by mem /c pokazal > 600 kB wolnych + +rem TRZEBA ten program przerobic na 486 Loglan!! \ No newline at end of file diff --git a/examples/examples.old/avl.log b/examples/examples.old/avl.log new file mode 100644 index 0000000..978bef7 --- /dev/null +++ b/examples/examples.old/avl.log @@ -0,0 +1,1226 @@ +Program AVL; +(*******************************************************************) +(*******************************************************************) +(** **) +(** IMPLEMENTATION DE QUEUE DE PRIORITE **) +(** REALISATION AVEC ARBRES A.V.L. **) +(** **) +(*******************************************************************) +(************** PROJET 1 DE LI1 **********************) +(*******************************************************************) +(** Annee 1993-1994 REALISE PAR UPPA **) +(** GOUGEON Jean-Yves et RICHARD Jerome **) +(*******************************************************************) +(*******************************************************************) + + +(*************** DEBUT DU PROGRAMME **********************) + +(****************** UNIT ************************) + +(****************************************************************************************************) +(********** LISTE DES UNITs ***********) +(****************************************************************************************************) +(********** presentation : page d'acuei ***********) +(********** init_graph : contient menu et gestion souris ***********) +(********** aide : page d'aide du programme ***********) +(********** mousepos : recherche position de souris ***********) +(********** message : regroupement des messages ***********) +(********** erreur : regroupement des messages d'erreurs ***********) +(********** efface : efface une partie de l'‚cran concernant les messages ***********) +(********** ecrit : ecrit le nombre lu au clavier ***********) +(********** AVL : d‚claration de la classe AVL pour initialisation des arbres ***********) +(********** PAUSE : pour cr‚er une pause ‚cran ***********) +(********** RG : rotation gauche ***********) +(********** RGD : rotation gauche droite ***********) +(********** INSERT : insertion dans un arbre ***********) +(********** EQUILIBRE : pour ‚quilibrer l'arbre ***********) +(********** MEMBER : pour d‚tecter si l'element est membre de l'arbre ***********) +(********** VIDE : teste si l'arbre est vide ou non ***********) +(********** AFFICHE : affiche l'arbre (racine gauche droit) ***********) +(********** MAX : determine l'element maximum de l'arbre ***********) +(********** MIN : determine l'element minimum de l'arbre ***********) +(********** DELETE : supprime l'element de l'arbre ***********) +(****************************************************************************************************) + +unit presentation:iiuwgraph procedure; +begin + + (* creation d'une bordure*) + + call border(13); + + (*creation d'un cadre pour la fenetre*) + + call move(10,10); + call draw(10,340); + call draw( 628,340); + call draw(628,10); + call draw(10,10); + call color(2); + + (*contenu du titre*) + call move(160,80); + call outstring("IMPLEMENTATION D'UNE QUEUE DE PRIORITE"); + call move(210,100); + call outstring("METHODE DES ARBRES A.V.L."); + call color(12); + call move(250,180); + call outstring("PROJET NUMERO 1"); + call color(14); + call move(130,300); + call outstring("PAR : Mr GOUGEON Jean-Yves et Mr RICHARD Jerome"); + + (*appel de la procedure pause pour passer a la suite*) + call PAUSE; + + (*appel de l'effacage de l'ecran*) + call cls; +end presentation; + +unit init_graph : iiuwgraph procedure(output chx : integer); +var i,b,h,v:integer; + +begin +pref mouse block +begin + (*teste si le driver de la souris est charge*) + if(driver) then + + call color(10); + + call move(0,0); + (*creation d'un cadre pour le menu*) + call draw(0,26); + call draw(639,26); + call draw(639,0); + call draw(0,0); + call move(5,10); + + (*contenu du menu*) + call outstring(" INSERT SUPPRE RECHRCH VIDE MIN MAX QUIT ? "); + + call move(400,330); + call showcursor; + (*montre le curseur de la souris*) + + do + call getpress(0,h,v,b,gauche,droit,centre); + (*attend un click et detecte le bouton*) + + if gauche then call mousepos(h,v,chx); + (*demande la position de la souris*) + + call hidecursor; + (*enleve le curseur et sauve garde l'envirronnement*) + + gauche:=false; + (*remet le bouton gauche a false*) + + exit; + fi; + od; + else + call move(150,200); + call outstring("VOUS AVEZ BESOIN DE LA SOURIS"); + + call PAUSE; + (*appel de la procedure pause pour passer a la suite*) + + chx:=7; + (*met chx a 7 pour sortir directement*) + exit; + fi; + call color(9); + end; +end init_graph; + +unit aide:iiuwgraph procedure; +begin +call cls; +call color(1); +call move(180,65); +(*creation d'un cadre pour le titre*) +call draw(500,65); +call draw(500,100); +call draw(180,100); +call draw(180,65); +call color(3); +call move(200,80); +(*contenu du titre*) +call outstring("AIDE SUR L'UTILISATION DU PROGRAMME"); +call color(4); +call move(80,120); +(*contenu de l'aide*) +call outstring(" INSERT : Pour construire et inserer des valeurs dans l'arbre."); +call move(80,140); +call outstring(" SUPPRE : Pour supprimer un element de l'arbre. "); +call move(80,160); +call outstring(" RECHRCH : Pour rechercher un element dans l'arbre. "); +call move(80,180); +call outstring(" VIDE : Pour indiquer si l'arbre est vide ou non vide."); +call move(80,200); +call outstring(" MIN : Pour indiquer le minimum present dans l'arbre."); +call move(80,220); +call outstring(" MAX : Pour indiquer le maximum present dans l'arbre."); +call move(80,240); +call outstring(" QUIT : Pour sortir de ce programme."); +call move(80,260); +call outstring(" ? : Cette page d'aide !"); +call color(14); +call move(80,280); +call outstring("Pour selectionner une de ces option il faut placer le cuseur de la"); +call move(80,300); +call outstring("souris sur le choix et cliquer sur le bouton gauche."); + + + +end aide; + +unit mousepos : iiuwgraph procedure (x,y:integer;output chx : integer); +var touche:integer; +begin +(*declaration des emplacements du titre pour retourner le choix correspondant*) +if((y>0)and(y<25))then + if((x<80)and(x>0)) then chx:=1; + else + if((x<160)and(x>88)) then chx:=2; + else + if((x<220)and(x>168)) then chx:=3; + else + if((x<300)and(x>228)) then chx:=4; + else + if((x<350)and(x>308)) then chx:=5; + else + if((x<400)and(x>358)) then chx:=6; + else + if((x<500)and(x>432)) then chx:=7; + else + if((x<639)and(x>580)) then chx:=8; + fi; fi; fi; fi; fi; fi; fi; fi; +fi; + +end mousepos; + +(****** UNIT DE MESSAGE ***********) +unit message:iiuwgraph procedure(x:integer); +begin +case x + when 0 : + + call move(120,330); + call outstring("Valider votre choix en cliquant sur le menu "); + + + + when 1 : + + call efface; + (*efface les messages*) + + call move(90,330); + call outstring("Entrez la valeur … ins‚rer (taper 100 pour stopper la saisie):"); + + + when 2 : + + call efface; + (*efface les messages*) + + call move(150,330); + call outstring("Entrer la valeur … supprimer:"); + + + when 3 : + + call efface; + (*efface les messages*) + + call move(150,330); + call outstring("Entrer la valeur … rechercher : "); + + + when 4 : + + call efface; + (*efface les messages*) + + call move(250,290); + call outstring("L'arbre est vide"); + + call PAUSE; + (*appel de la procedure pause pour passer a la suite*) + + + when 5 : + + call efface; + + call move(150,290); + call outstring("L'arbre n'est pas vide"); + + call PAUSE; + (*appel de la procedure pause pour passer a la suite*) + + + when 6 : + + call cls; + + call move(80,150); + call outstring("Au revoir … bient“t pour une future utilisation !!!"); + + call PAUSE; + (*appel de la procedure pause pour passer a la suite*) + + + when 7 : + call move(200,40); + call outstring("Voi‡i l'arbre avant r‚‚quilibrage"); + + when 8 : + call move(200,40); + call outstring("Voi‡i l'arbre APRES r‚‚quilibrage"); + + when 9 : + + call efface; + (*efface les messages*) + + call move(150,290); + call outstring("Voi‡i l'‚l‚ment maximun de l'arbre :"); + call ecrit(tampon,550,290); + + call PAUSE; + (*appel de la procedure pause pour passer a la suite*) + + + when 10 : + + call efface; + (*efface les messages*) + + call move(150,290); + call outstring("Voi‡i l'‚l‚ment minimun de l'arbre :"); + call ecrit(tampon,500,290); + + call PAUSE; + (*appel de la procedure pause pour passer a la suite*) + + + when 11 : + + call efface; + (*efface les messages*) + + call move(250,290); + call outstring(" n'est pas membre de l'arbre"); + call ecrit(val,200,290); + + call PAUSE; + (*appel de la procedure pause pour passer a la suite*) + + + when 12 : + + call efface; + (*efface les messages*) + + call move(150,290); + call outstring(" est membre de l'arbre"); + call ecrit(val,100,290); + + call PAUSE; + (*appel de la procedure pause pour passer a la suite*) + + + when 13 : + call efface; + (*efface les messages*) + + call move(250,290); + call outstring("L'arbre est vide."); + + call PAUSE; + (*appel de la procedure pause pour passer a la suite*) + + when 14 : + call move(230,40); + call outstring(" L'ARBRE A.V.L. ACTUEL"); + call move(358,60); + call outstring("NOEUD"); + call move(358,80); + call outstring("BALANCE"); + +esac; +call move(400,330); +end message; + +(********* UNIT ERREUR ********) +unit erreur:iiuwgraph procedure(x:integer); +begin +case x + + when 1 : + call color(10); + call efface; + (*efface les messages*) + + call move(100,290); + call outstring("L'arbre est vide : IMPOSSIBLE D'EFFECTUER UNE SUPPRESSION"); + call move(400,330); + + when 2 : + call color(10); + call efface; + (*efface les messages*) + + call move(100,290); + call outstring("L'arbre est vide : IMPOSSIBLE D'EFFECTUER UNE RECHERCHE"); + call move(400,330); + +esac; +end erreur; + +unit efface:iiuwgraph procedure; +var i : integer; +begin + +(*efface l'ecran de y=280 a y=330*) +for i:=280 step 5 to 330 do + call move(80,i); + call outstring(" "); +od; +end efface; + +unit ecrit :iiuwgraph procedure(element : integer, x, y : integer); + var length, i : integer; + begin + call color(5); + + (*convertion du code ascii en chiffre <1000*) + if(element<0) then + call move(x-10,y); + call outstring("-"); + element:=(element*(-1)); + fi; + call move(x,y); + call Hascii(48 + element div 100); + element := element mod 100; + call Hascii(48 + element div 10); + call Hascii(48 + element mod 10); + call move(x-5,y-4); + (*creation d'un cadre pour l'element*) + call draw(x+28,y-4); + call draw(x+28,y+10); + call draw(x-5,y+10); + call draw(x-5,y-4); +end ecrit; + +unit AVL:class; + var balance,info:real, + fd,fg:AVL; +end AVL; + +unit PAUSE:iiuwgraph procedure; +var touche:char; + +begin +pref mouse block +var h,b,v,p:integer, +touche:char; +begin +droit:=false; + +driver:=init(b); +(*teste le driver de souris*) + +if(driver) then + call color(13); + call move(150,330); + call outstring("Appuyez sur une le bouton droit de la souris..."); + call move(400,330); + + (*tantque le bouton droit n'est pas selectionner*) + while ( NOT droit) do + call getpress(1,h,v,p,gauche,droit,centre); + od; + + (*efface les messages*) + call efface; + + (*restitue la couleur*) + call color(9); +else + call efface; + (*efface les messages*) + + call move(150,330); + call outstring("APPUYER SUR UNE TOUCHE...."); + + read(touche); +fi; +end; +end PAUSE; + +unit RG:procedure(inout sous_arbre:AVL); + var aux:AVL; +begin + aux:=sous_arbre.fd; + sous_arbre.fd:=aux.fg; + aux.fg:=sous_arbre; + sous_arbre:=aux; +end RG; + +unit RD:procedure(inout sous_arbre:AVL); + var aux:AVL; +begin + aux:=sous_arbre.fg; + sous_arbre.fg:=aux.fd; + aux.fd:=sous_arbre; + sous_arbre:=aux; +end RD; + +unit RGD:procedure(inout sous_arbre:AVL); +begin + call RG(sous_arbre.fg); + call RD(sous_arbre); +end RGD; + +unit RDG:procedure(inout sous_arbre:AVL); +begin + call RD(sous_arbre.fd); + call RG(sous_arbre); +end RDG; + +unit INSERT:iiuwgraph procedure(x:integer;inout arbre:AVL); + var sous_arbre, + ps_arbre, + noeud_courant, + pn_courant, + noeud_cree:AVL; +begin + (* cr‚ation de l'objet … ins‚rer *) + + noeud_cree:=new AVL; + noeud_cree.info:=x; + noeud_cree.balance:=0; + noeud_cree.fd:=none; + noeud_cree.fg:=none; + + (* si l'arbre est vide *) + + if arbre=none + then + arbre:=noeud_cree; + else + + (* recherche de l'emplacement o— doit s'effectuer l'insertion *) + + + sous_arbre:=new AVL; + ps_arbre:=new AVL; + noeud_courant:=new AVL; + pn_courant:=new AVL; + sous_arbre:=arbre; + ps_arbre:=none; + noeud_courant:=arbre; + pn_courant:=none; + while noeud_courant=/=none + do + + (* recherche de l'emplacement et m‚morisation du + dernier sous arbre pour lequel il y aura + eventuellement desequilibre aprŠs insertion + (valeur actuelle de la balance:+1 ou -1) *) + + if noeud_courant.balance=/=0 + then + sous_arbre:=noeud_courant; + ps_arbre:=pn_courant; + fi; + pn_courant:=noeud_courant; + if x<=noeud_courant.info + then + noeud_courant:=noeud_courant.fg; + else + noeud_courant:=noeud_courant.fd; + fi; + od; + + (* ajout du noeud cr‚‚ *) + + if x<=pn_courant.info + then + pn_courant.fg:=noeud_cree; + else + pn_courant.fd:=noeud_cree; + fi; + + (* mise … jour des d‚s‚quilibres du sous_arbre au + noeud cr‚‚ *); + + noeud_courant:=sous_arbre; + while noeud_courant=/=noeud_cree + do + if x<=noeud_courant.info + then + noeud_courant.balance:=noeud_courant.balance+1; + noeud_courant:=noeud_courant.fg; + else + noeud_courant.balance:=noeud_courant.balance-1; + noeud_courant:=noeud_courant.fd; + fi; + od; + + (* r‚‚quilibrage *) + + call cls; + + call message(7); + (*Voi‡i l'arbre avant r‚‚quilibrage*) + + call AFFICHE(arbre,0,649,60); + (*appel procedure affichage arbre*) + + call EQUILIBRE(sous_arbre); + + if ps_arbre=none + then + arbre:=sous_arbre; + else + if sous_arbre.info<=ps_arbre.info + then + ps_arbre.fg:=sous_arbre; + else + ps_arbre.fd:=sous_arbre; + fi; + fi; + + call PAUSE; + (*appel de la procedure pause pour passer a la suite*) + + call cls; + (*appel de l'effacage de l'ecran*) + + call color(9); + + call message(8); + (*Voi‡i l'arbre APRES r‚‚quilibrage*) + + call AFFICHE(arbre,0,649,60); + (*appel procedure affichage arbre*) + + call PAUSE; + (*appel de la procedure pause pour passer a la suite*) + + call color(9); + fi; +end INSERT; + +unit EQUILIBRE:procedure(inout sous_arbre:AVL); + var + aux1,aux2:AVL, + balance, + balance_fd, + balance_fg:real; +begin +if (NOT VIDE(sous_arbre)) then + if sous_arbre.balance=-1 + then + + balance:=3; + else + if sous_arbre.balance=-2 + then + balance:=4; + else + balance:=sous_arbre.balance; + fi; + fi; + case balance + when 0: + exit; + when 1: + exit; + when 3: + exit; + when 2: + if sous_arbre.fg.balance=-1 + then + balance_fg:=2; + else + balance_fg:=sous_arbre.fg.balance; + fi; + case balance_fg + when 0: + aux1:=sous_arbre.fg; + aux2:=aux1.fd; + sous_arbre.balance:=1; + aux1.balance:=-1; + sous_arbre.fg:=aux2; + aux1.fd:=sous_arbre; + sous_arbre:=aux1; + when 1: + call RD(sous_arbre); + sous_arbre.balance:=0; + sous_arbre.fd.balance:=0; + when 2: + call RGD(sous_arbre); + if sous_arbre.balance=-1 + then + balance:=2; + else + if sous_arbre.balance=1 + then + balance:=1; + else + balance:=0; + fi; + fi; + case balance + when 1: + sous_arbre.fg.balance:=0; + sous_arbre.fd.balance:=-1; + when 2: + sous_arbre.fg.balance:=1; + sous_arbre.fd.balance:=0; + when 0: + sous_arbre.fg.balance:=0; + sous_arbre.fd.balance:=0; + esac; + sous_arbre.balance:=0; + esac; + when 4: + if sous_arbre.fd.balance=-1 + then + balance_fd:=2; + else + balance_fd:=sous_arbre.fd.balance; + fi; + case balance_fd + when 1: + call RDG(sous_arbre); + if sous_arbre.balance=-1 + then + balance:=2; + else + if sous_arbre.balance = 1 + then + balance := 1; + else + balance := 0; + fi; + fi; + case balance + when 1: + sous_arbre.fd.balance:=-1; + sous_arbre.fg.balance:=0; + when 2: + sous_arbre.fd.balance:=0; + sous_arbre.fg.balance:=1; + when 0: + sous_arbre.fd.balance:=0; + sous_arbre.fg.balance:=0; + esac; + sous_arbre.balance:=0; + when 0: + aux1:=sous_arbre.fd; + aux1.balance:=1; + sous_arbre.balance:=-1; + aux2:=aux1.fg; + aux1.fg:=sous_arbre; + sous_arbre.fd:=aux2; + sous_arbre:=aux1; + when 2: + call RG(sous_arbre); + sous_arbre.balance:=0; + sous_arbre.fg.balance:=0; + esac; + esac; +fi; + +end EQUILIBRE; + +unit MEMBER:function(val:real; + arbre:AVL; + output pos_element:AVL):boolean; +begin + do + if arbre=/=none + then + pos_element:=arbre; + if val>arbre.info + then + arbre:=arbre.fd; + else + if arbre.info=val + then + result:=TRUE; + exit; + else + arbre:=arbre.fg; + fi; + fi; + else + result:=FALSE; + exit; + fi; + od; +end MEMBER; + +unit VIDE:function(arbre:AVL):boolean; +begin + if arbre=none + then + result:=TRUE; + else + result:=FALSE; + fi; +end VIDE; + +unit AFFICHE:iiuwgraph procedure(t:AVL;xmin,xmax,y:integer); +var w:integer; +begin + if t=/=none + then + w:=((xmin-xmax)/2)+xmax; + (*divise la longeur de l'ecran par 2 pour la position*) + + call color(10); + call ecrit(t.info,w,y); + + call ecrit(t.balance,w,y+20); + + call AFFICHE(t.fg,xmin,w,y+60); + (*appel procedure affichage arbre avec fils gauche*) + + call AFFICHE(t.fd,w,xmax,y+60); + (*appel procedure affichage arbre avec fils droit*) + fi; + call color(9); +end AFFICHE; + +unit MAX:procedure(input sous_arbre:AVL;output element:AVL); +begin + element:=sous_arbre; + while element.fd=/=none + do + element:=element.fd; + od; +end MAX; + +unit MIN:procedure(input sous_arbre:AVL;output element:AVL); +begin + element:=sous_arbre; + while element.fg=/=none + do + element:=element.fg; + od; +end MIN; + +unit DELETE:procedure(x:real;input arbre:AVL;input pere:AVL); +var + balance_pere:integer, + pere_element,pos_element,element:AVL; +begin + if x>arbre.info + then + (*si x>info de l'arbre aller fils droit*) + call DELETE(x,arbre.fd,arbre); + else + if xx + then + pere.fg:=none; + pere.balance:=pere.balance-1; + else + pere.fd:=none; + pere.balance:=pere.balance+1; + fi; + else + if (arbre.fg=none AND arbre.fd=/=none) OR + (arbre.fg=/=none AND arbre.fd=none) + then + balance_pere:=pere.balance; + if arbre.fd=none + then + if x v + then + (* v se trouve a gauche, si il existe *) + courant := courant.FG; + else + if courant.IG = v + then + if courant.nb =/= 0 + then + courant := courant.FG; + fi; + else + (* v ne se trouve pas a gauche, si il existe *) + if courant.IM > v + then + (* v se trouve au milieu, si il existe *) + courant := courant.FM; + else + if courant.IM = v + then + if courant.nb =/= 0 + then + courant := courant.FM; + fi; + else + courant := courant.FM; + fi; + fi; + fi; + fi; + when 3 : (* 3 fils *) + if courant.IG > v + then + (* v se trouve a gauche, si il existe *) + courant := courant.FG; + else + if courant.IG = v + then + if courant.nb =/= 0 + then + courant := courant.FG; + fi; + else + (* v ne se trouve pas a gauche, si il existe *) + if courant.IM > v + then + (* v se trouve au milieu, si il existe *) + courant := courant.FM; + else + if courant.IM = v + then + if courant.nb =/= 0 + then + courant := courant.FM; + fi; + else + (* v ne se trouve pas a gauche, si il existe *) + if courant.IM < v + then + (* v se trouve a droite, si il existe *) + courant := courant.FD; + fi; + fi; + fi; + fi; + fi; + esac; + od; + end present; + + + + + + unit supprimer : function(v: integer) : barbre; + var courant, p : noeud, + b : barbre; + begin + b := new barbre; + courant := racine; + if present(v, courant) + then + (* l'element est present dans l'arbre donc on peut le supprimer *) + p := courant.pere; + if p.pere = none + then + (* p pointe sur la racine *) + case p.nb + when 1 : (* p a 1 fils *) + courant := p; + courant.FG := none; + courant.nb := 0; + courant.IG := -1; + + when 2 : (* p a 2 fils *) + if p.FG.IG = courant.IG + then + p.FG := p.FM; + p.IG := p.FG.IG; + fi; + p.FM := none; + p.nb := p.nb - 1; + p.IM := -1; + when 3 : (* p a 3 fils *) + if p.IG = courant.IG + then + p.FG := p.FM; + p.FM := p.FD; + p.IG := p.FG.IG; + p.IM := p.FM.IG; + else + if p.FM.IG = courant.IG + then + p.FM := p.FD; + p.IM := p.FM.IG; + fi; + fi; + p.FD := none; + p.nb := p.nb - 1; + esac; + else + (* p ne pointe pas sur le racine *) + case p.nb + when 2 : (* p a 2 fils *) + writeln("Le cas ou l'on veut supprimer une feuille"); + writeln("dont le pere a 2 fils n'a pas ete gere."); + + when 3 : (* p a 3 fils *) + if p.FG.IG = courant.IG + then + p.FG := p.FM; + p.FM := p.FD; + p.IG := p.FG.IG; + p.IM := p.FM.IG; + else + if p.FM.IG = courant.IG + then + p.FM := p.FD; + p.IM := p.FM.IG; + fi; + fi; + + p.FD := none; + p.nb := p.nb - 1 ; + esac; + fi; + else + writeln("On ne peut pas supprimer cet element"); + writeln("car il n'est pas dans l'arbre"); + fi; + b.racine := racine; + result := b; + end supprimer; + + unit inserer : function(v : integer) : barbre; + + unit refaire : procedure(inout p, f1, f2, j, r : noeud); + begin + (* suivant le nombre de fils de p *) + case p.nb + when 3 : (* p a 3 fils *) + if p.FG = f1 + then + p.FD := p.FM; + p.FM := j; + else + p.FD := j; + fi; + + when 4 : (* p a 4 fils *) + (* et creer un nouveau noeud *) + j := new noeud; + if p.FG = f1 + then + j.FG := p.FM; + j.FM := p.FD; + p.FM := f2; + else + if p.FM = f1 + then + j.FG := f2; + j.FM := p.FD; + else + j.FG := f1; + j.FM := f2; + fi; + fi; + + j.FG.pere := j; + j.FM.pere := j; + j.nb := 2; + p.FD := none; + p.nb := 2; + + if p.pere =/= none + then + (* le pere de p n'est pas la racine *) + (* il faut repeter la procedure refaire *) + j.pere := p.pere; + p.pere.nb := p.pere.nb + 1; + call refaire(p.pere, p, j, j, r); + else + (* le pere de p est la racine *) + (* donc il faut creer une nouvelle racine *) + r := new noeud; + r.nb := 2; + r.FG := p; + r.FM := j; + p.pere := r; + j.pere := r; + racine := r; + fi; + esac; + end refaire; + + + var bidon, courant, i, f1, f2, j, p, r : noeud, + b : barbre, + pos : integer; + begin + b := new barbre; + + bidon := new noeud; + courant := new noeud; + r := new noeud; + i:= new noeud; + f1 := new noeud; + f2 := new noeud; + j := new noeud; + p:= new noeud; + + if vide + then + (* l'arbre est vide *) + (* creer la feuille qui contiendra l'element a inserer *) + courant := new noeud; + courant.pere := racine; + courant.IG := v; + racine.IG := v; + racine.nb := 1; + racine.FG := courant; + + b.racine := racine; + result := b; + + else + (* l'arbre n'est pas vide *) + courant := racine; + if present(v,courant) + then + writeln("L'element ne peut etre inserer puisqu'il appartient deja a l'arbre."); + else + (* l'element n'existe pas dans l'arbre *) + + pos := 0; + + i := new noeud; + p := new noeud; + i := courant; + i.pere := courant.pere; + p := courant.pere; + + (* creer le noeud qui contiendra l'element a inserer *) + courant := new noeud; + courant.IG := v; + courant.pere := p; + p.nb := p.nb + 1; + + (* determination de la position ou inserer l'element *) + if i.IG = p.FG.IG + then + pos := 1; + else + if p.FM =/= none + then + if i.IG = p.FM.IG + then + pos := 2; + else + if p.FD =/= none + then + if i.IG = p.FD.IG + then + pos := 3; + fi; + fi; + fi; + fi; + fi; + + (* suivant le nombre de fils de p *) + case p.nb + when 2 : (* p a 2 fils *) + if courant.IG > i.IG + then pos := pos + 1; + fi; + + (* suivant la position de l'element *) + case pos + when 1 : p.FM := p.FG; + p.FG := courant; + when 2 : p.FM := courant; + esac; + when 3 : (* p a 3 fils *) + if courant.IG > i.IG + then pos := pos + 1; + fi; + + (* suivant la position de l'element *) + case pos + when 1 : p.FD := p.FM; + p.FM := p.FG; + p.FG := courant; + when 2 : p.FD := p.FM; + p.FM := courant; + when 3 : p.FD := courant; + esac; + when 4 : (* p a 4 fils *) + if courant.IG > i.IG + then pos := pos + 1; + fi; + + f1 := new noeud; + f2 := new noeud; + + (* suivant la position de l'element *) + case pos + when 1 : f1 := p.FM; + f2 := P.FD; + p.FD := none; + p.FM := p.FG; + p.FG := courant; + (**) + when 2 : f1 := p.FM; + f2 := p.FD; + p.FD := none; + p.FM := courant; + (**) + when 3 : f1 := courant; + f2 := p.FD; + p.FD := none; + (**) + when 4 : f1 := p.FD; + f2 := courant; + p.FD := none; + (**) + esac; + + j := new noeud; + + j.FG := f1; + j.FM := f2; + j.FG.pere := j; + j.FM.pere := j; + j.nb := 2; + p.nb := 2; + + if p.pere =/= none + then + (* p a un pere *) + (* il faut repeter la procedure refaire *) + j.pere := p.pere; + p.pere.nb := p.pere.nb + 1; + call refaire(p.pere, p, j, j, r); + else + (* p est la racine *) + (* donc il faut creer une nouvelle racine *) + r := new noeud; + r.nb := 2; + r.FG := p; + r.FM := j; + p.pere := r; + j.pere := r; + racine := r; + fi; + esac; + fi; + + courant := racine; + b.racine := courant; + result := b; + fi; + end inserer; + + begin + racine := new noeud; + end barbre; + + +var ba : barbre, + e : integer, + bidon, courant, a, b : noeud, + choix : integer; + +begin + ba := new barbre; + courant := new noeud; + courant := ba.racine; + + do + (* affichage du menu *) + writeln; + writeln; + writeln; + writeln; + writeln("1 -> ajouter un element :"); + writeln("2 -> supprimer un element :"); + writeln("3 -> existence d'un element ? :"); + writeln("4 -> minimum de l'arbre :"); + writeln("5 -> maximum de l'arbre :"); + writeln("6 -> arbre vide ? :"); + writeln("7 -> afficher l'arbre :"); + writeln("8 -> fin."); + + write("choix ="); + read(choix); + writeln; + writeln("-------------------------------------------"); + writeln; + + (* selon le choix *) + case choix + when 1 : (* inserer un element *) + write(" element = "); + read(e); + + courant := ba.racine; + ba := ba.inserer(e); + courant := ba.racine; + call ba.reorganiser(courant, bidon); + writeln; + + when 2 : (* supprimer un element *) + if ba.vide + then + writeln("L'arbre est vide. Impossible de faire supprimer."); + else + write(" element = "); + read(e); + + courant := ba.racine; + ba := ba.supprimer(e); + courant := ba.racine; + call ba.reorganiser(courant, bidon); + writeln; + fi; + + when 3 : (* determiner si l'element est present dans l'arbre *) + if ba.vide + then + writeln("L'arbre est vide. Impossible de faire present."); + else + write(" element = "); + read(e); + writeln; + courant := ba.racine; + if ba.present(e,courant) + then + writeln(" -> present"); + else + writeln(" -> absent"); + fi; + fi; + + when 4 : (* determiner l'element minimum *) + if ba.vide + then + writeln("L'arbre est vide. Impossible de faire minimum."); + else + writeln(" minimum = ", ba.minimum); + fi; + + when 5 : (* determiner l'element maximum *) + if ba.vide + then + writeln("L'arbre est vide. Impossible de faire maximum."); + else + writeln(" maximum = ", ba.maximum); + fi; + + when 6 : (* determiner si l'arbre est vide *) + if ba.vide then writeln(" -> vide"); + else writeln(" -> pas vide"); + fi; + + when 7 : (* affichage de l'arbre *) + if ba.vide + then + writeln("L'arbre est vide."); + else + courant := ba.racine; + call ba.afficher(courant); + fi; + + when 8 : (* fin du programme *) + exit; + esac; + od; +end mybarbre. + + diff --git a/examples/examples.old/bbarbre2.log b/examples/examples.old/bbarbre2.log new file mode 100644 index 0000000..e85e5d9 --- /dev/null +++ b/examples/examples.old/bbarbre2.log @@ -0,0 +1,885 @@ +program myBarbres; + + unit presentation : procedure; + begin + pref IIUWgraph block + begin + call gron(1); + call hpage(1,1,1); + call border(5); + call move(270,50); + call color(5); + call outstring("LES ARBRES 2-3"); + call move(80,100); + call color(3); + call outstring("MENU :"); + call move(100,125); + call color(3); + call outstring("1 -> inserer un element"); + call move(100,150); + call outstring("2 -> supprimer un element"); + call move(100,175); + call outstring("3 -> existence d'un element"); + call move(100,200); + call outstring("4 -> minimum de l'arbre"); + call move(100,225); + call outstring("5 -> maximum de l'arbre"); + call move(100,250); + call outstring("6 -> vide"); + call move(100,275); + call outstring("7 -> afficher l'arbre"); + call move(100,300); + call outstring("8 -> fin"); + call move(100,325); + call outstring("choix ="); + end; + end presentation; + + unit inchar: iiuwgraph function:integer; + var i:integer; + begin + do + i:=inkey; + if i=/=0 then exit fi; + od; + result:=i; + end inchar; + + unit reponse : IIUWgraph procedure(output r : char); + begin + call move(250,325); + call outstring("Tapez o/n pour continuer"); + r := chr(inchar); + call hascii(0); + call hascii(ord(r)); + end reponse; + + + unit WriteInteger : IIUWgraph procedure( Number : integer ); + var i, j : integer; + begin + if Number < 10 then + call HASCII( 0 ); + call HASCII( Number + 48 ); + call Hascii( 0 ); + else + i := Number div 10; + j := Number - i * 10; + call HASCII( 0 ); + call Hascii( i + 48 ); + call Hascii( 0 ); + call Hascii( j + 48 ); + fi; + end WriteInteger; + + + (* representation d'un noeud *) + unit noeud : class; + var pere : noeud, + nb : integer, + IG, IM : integer, + FG, FM, FD : noeud; + (* + pere est le pere + nb est le nombre de fils + IG est l'information de gauche + IM est l'information de droite + FG est le fils de gauche + FM est le fils du milieu + FD est le fils de droite + *) + begin + (* initialisation des variables *) + pere := none; + nb := 0; + IG := -1; + IM := -1; + FG := none; + FM := none; + FD := none; + end noeud; + + + + unit barbre : class; + var racine : noeud; + + unit afficher : procedure(inout courant : noeud); + begin + if courant.IM = -1 + then + (* courant pointe sur une feuille *) + writeln(courant.IG:1); + else + (* courant pointe sur un noeud *) + writeln(courant.IG:1, ":", courant.IM:1); + fi; + + if courant.FG =/= none + then + (* courant a 1, 2 ou 3 fils *) + if courant.FG.FG =/= none + then + (* courant a 2 ou 3 petits fils *) + (* appel de la procedure afficher avec le fils gauche de courant *) + call afficher(courant.FG); + if courant.FM =/= none + then + (* courant a 2 ou 3 fils *) + (* appel de la procedure afficher avec le fils milieu de courant *) + call afficher(courant.FM); + if courant.FD =/= none + then + (* courant a 3 fils *) + (* appel de la procedure afficher avec le fils droit de courant *) + call afficher(courant.FD); + fi; + fi; + else + (* courant n'a pas de petits fils + i.e. les fils de courant sont des feuilles *) + (* affichage de la feuille de gauche *) + write(courant.FG.IG:1); + if courant.FM =/= none + then + (* courant a 2 ou 3 fils *) + (* affichage de la feuille du milieu *) + write(" ", courant.FM.IG:1); + if courant.FD =/= none + then + (* courant a 3 fils *) + (* affichage de la feuille de droite *) + writeln(" ", courant.FD.IG:1); + else + writeln; + fi; + else + writeln; + fi; + fi; + fi; + end; + + unit reorganiser : procedure(inout courant,bidon : noeud); + begin + if courant.FG =/= none + then + (* courant a 1, 2 ou 3 fils *) + if courant.FG.FG =/= none + then + (* courant a 2 ou 3 petits fils *) + (* appel de la procedure reorganiser avec le fils gauche *) + call reorganiser(courant.FG, bidon); + (* appel de la procedure reorganiser avec le fils milieu *) + call reorganiser(courant.FM, bidon); + if courant.FD =/= none + then + (* courant a 3 fils *) + (* appel de la procedure reorganiser avec le fils droit *) + call reorganiser(courant.FD, bidon); + fi; + + (* recherche du plus grand element dans le sous arbre + gauche de courant pour recuperer le IG de courant *) + bidon := courant.FG; + do + case bidon.nb + when 0 : courant.IG := bidon.IG; + exit; + when 1 : bidon := bidon.FG; + + when 2 : bidon := bidon.FM; + + when 3 : bidon := bidon.FD; + esac; + od; + + (* recherche du plus grand element dans le sous arbre + du milieu de courant pour recuperer le IM de courant *) + bidon := courant.FM; + do + case bidon.nb + when 0 : courant.IM := bidon.IG; + exit; + when 1 : bidon := bidon.FG; + + when 2 : bidon := bidon.FM; + + when 3 : bidon := bidon.FD; + esac; + od; + else + (* courant n'a pas de petis fils *) + (* recuperation de IG pour courant *) + courant.IG := courant.FG.IG; + if courant.nb =/= 1 + then + (* recuperation de IM pour courant *) + (* courant a 2 ou 3 fils *) + courant.IM := courant.FM.IG; + fi; + fi; + fi; + end reorganiser; + + unit vide : function : boolean; + begin + result := (racine.nb = 0); + end vide; + + unit minimum : function : integer; + var courant : noeud; + begin + courant := racine; + do + if courant.FG = none + then + (* result contient le plus petit element de l'arbre *) + result := courant.IG; + exit; + else + (* descendre a gauche *) + courant := courant.FG; + fi; + od; + end minimum; + + unit maximum : function : integer; + var courant : noeud; + begin + courant := racine; + do + (* suivant le nombre de fils de courant *) + case courant.nb + when 0 : (* result contient le plus grand element de l'arbre *) + result := courant.IG; + exit; + when 1 : (* le plus grand element se trouve + dans le sous arbre de gauche *) + courant := courant.FG; + + when 2 : (* le plus grand element se trouve + dans le sous arbre du milieu *) + courant := courant.FM; + + when 3 : (* le plus grand element se trouve + dans le sous arbre de droite *) + courant := courant.FD; + esac; + od; + end maximum; + + unit present : function(v : integer; inout courant : noeud) : boolean; + begin + do + (* suivant le nombre de fils de courant *) + case courant.nb + when 0 : (* 0 fils donc c'est une feuille *) + if courant.IG = v + then result := true; + else result := false; + fi; + exit; + when 1 : (* 1 fils donc le pere est la racine *) + courant := courant.FG; + if courant.IG = v + then result := true; + else result := false; + fi; + exit; + when 2 : (* 2 fils *) + if courant.IG > v + then + (* v se trouve a gauche, si il existe *) + courant := courant.FG; + else + if courant.IG = v + then + if courant.nb =/= 0 + then + courant := courant.FG; + fi; + else + (* v ne se trouve pas a gauche, si il existe *) + if courant.IM > v + then + (* v se trouve au milieu, si il existe *) + courant := courant.FM; + else + if courant.IM = v + then + if courant.nb =/= 0 + then + courant := courant.FM; + fi; + else + courant := courant.FM; + fi; + fi; + fi; + fi; + when 3 : (* 3 fils *) + if courant.IG > v + then + (* v se trouve a gauche, si il existe *) + courant := courant.FG; + else + if courant.IG = v + then + if courant.nb =/= 0 + then + courant := courant.FG; + fi; + else + (* v ne se trouve pas a gauche, si il existe *) + if courant.IM > v + then + (* v se trouve au milieu, si il existe *) + courant := courant.FM; + else + if courant.IM = v + then + if courant.nb =/= 0 + then + courant := courant.FM; + fi; + else + (* v ne se trouve pas a gauche, si il existe *) + if courant.IM < v + then + (* v se trouve a droite, si il existe *) + courant := courant.FD; + fi; + fi; + fi; + fi; + fi; + esac; + od; + end present; + + + + + + unit supprimer : IIUWgraph function(v: integer) : barbre; + var courant, p : noeud, + b : barbre; + begin + b := new barbre; + courant := racine; + if present(v, courant) + then + (* l'element est present dans l'arbre donc on peut le supprimer *) + p := courant.pere; + if p.pere = none + then + (* p pointe sur la racine *) + case p.nb + when 1 : (* p a 1 fils *) + courant := p; + courant.FG := none; + courant.nb := 0; + courant.IG := -1; + + when 2 : (* p a 2 fils *) + if p.FG.IG = courant.IG + then + p.FG := p.FM; + p.IG := p.FG.IG; + fi; + p.FM := none; + p.nb := p.nb - 1; + p.IM := -1; + when 3 : (* p a 3 fils *) + if p.IG = courant.IG + then + p.FG := p.FM; + p.FM := p.FD; + p.IG := p.FG.IG; + p.IM := p.FM.IG; + else + if p.FM.IG = courant.IG + then + p.FM := p.FD; + p.IM := p.FM.IG; + fi; + fi; + p.FD := none; + p.nb := p.nb - 1; + esac; + else + (* p ne pointe pas sur le racine *) + case p.nb + when 2 : (* p a 2 fils *) + pref IIUWgraph block + begin + call cls; + call move(10,10); + call outstring("-> Le cas ou l'on veut supprimer une feuille"); + call move(10,20); + call outstring("dont le pere a 2 fils n'a pas ete gere."); + end; + + when 3 : (* p a 3 fils *) + if p.FG.IG = courant.IG + then + p.FG := p.FM; + p.FM := p.FD; + p.IG := p.FG.IG; + p.IM := p.FM.IG; + else + if p.FM.IG = courant.IG + then + p.FM := p.FD; + p.IM := p.FM.IG; + fi; + fi; + + p.FD := none; + p.nb := p.nb - 1 ; + esac; + fi; + else + pref IIUWgraph block + begin + call move(10,20); + call outstring("-> On ne peut pas supprimer cet element"); + call move(10,30); + call outstring("car il n'est pas dans l'arbre"); + end; + fi; + b.racine := racine; + result := b; + end supprimer; + + unit inserer : function(v : integer) : barbre; + + unit refaire : procedure(inout p, f1, f2, j, r : noeud); + begin + (* suivant le nombre de fils de p *) + case p.nb + when 3 : (* p a 3 fils *) + if p.FG = f1 + then + p.FD := p.FM; + p.FM := j; + else + p.FD := j; + fi; + + when 4 : (* p a 4 fils *) + (* et creer un nouveau noeud *) + j := new noeud; + if p.FG = f1 + then + j.FG := p.FM; + j.FM := p.FD; + p.FM := f2; + else + if p.FM = f1 + then + j.FG := f2; + j.FM := p.FD; + else + j.FG := f1; + j.FM := f2; + fi; + fi; + + j.FG.pere := j; + j.FM.pere := j; + j.nb := 2; + p.FD := none; + p.nb := 2; + + if p.pere =/= none + then + (* le pere de p n'est pas la racine *) + (* il faut repeter la procedure refaire *) + j.pere := p.pere; + p.pere.nb := p.pere.nb + 1; + call refaire(p.pere, p, j, j, r); + else + (* le pere de p est la racine *) + (* donc il faut creer une nouvelle racine *) + r := new noeud; + r.nb := 2; + r.FG := p; + r.FM := j; + p.pere := r; + j.pere := r; + racine := r; + fi; + esac; + end refaire; + + + var bidon, courant, i, f1, f2, j, p, r : noeud, + b : barbre, + pos : integer; + begin + b := new barbre; + + bidon := new noeud; + courant := new noeud; + r := new noeud; + i:= new noeud; + f1 := new noeud; + f2 := new noeud; + j := new noeud; + p:= new noeud; + + if vide + then + (* l'arbre est vide *) + (* creer la feuille qui contiendra l'element a inserer *) + courant := new noeud; + courant.pere := racine; + courant.IG := v; + racine.IG := v; + racine.nb := 1; + racine.FG := courant; + + b.racine := racine; + result := b; + + else + (* l'arbre n'est pas vide *) + courant := racine; + if present(v,courant) + then + pref IIUWgraph block + begin + call move(10,20); + call outstring("-> L'element ne peut etre inserer"); + call move(10,30); + call outstring("puisqu'il appartient deja a l'arbre."); + end; + else + (* l'element n'existe pas dans l'arbre *) + + pos := 0; + + i := new noeud; + p := new noeud; + i := courant; + i.pere := courant.pere; + p := courant.pere; + + (* creer le noeud qui contiendra l'element a inserer *) + courant := new noeud; + courant.IG := v; + courant.pere := p; + p.nb := p.nb + 1; + + (* determination de la position ou inserer l'element *) + if i.IG = p.FG.IG + then + pos := 1; + else + if p.FM =/= none + then + if i.IG = p.FM.IG + then + pos := 2; + else + if p.FD =/= none + then + if i.IG = p.FD.IG + then + pos := 3; + fi; + fi; + fi; + fi; + fi; + + (* suivant le nombre de fils de p *) + case p.nb + when 2 : (* p a 2 fils *) + if courant.IG > i.IG + then pos := pos + 1; + fi; + + (* suivant la position de l'element *) + case pos + when 1 : p.FM := p.FG; + p.FG := courant; + when 2 : p.FM := courant; + esac; + when 3 : (* p a 3 fils *) + if courant.IG > i.IG + then pos := pos + 1; + fi; + + (* suivant la position de l'element *) + case pos + when 1 : p.FD := p.FM; + p.FM := p.FG; + p.FG := courant; + when 2 : p.FD := p.FM; + p.FM := courant; + when 3 : p.FD := courant; + esac; + when 4 : (* p a 4 fils *) + if courant.IG > i.IG + then pos := pos + 1; + fi; + + f1 := new noeud; + f2 := new noeud; + + (* suivant la position de l'element *) + case pos + when 1 : f1 := p.FM; + f2 := P.FD; + p.FD := none; + p.FM := p.FG; + p.FG := courant; + (**) + when 2 : f1 := p.FM; + f2 := p.FD; + p.FD := none; + p.FM := courant; + (**) + when 3 : f1 := courant; + f2 := p.FD; + p.FD := none; + (**) + when 4 : f1 := p.FD; + f2 := courant; + p.FD := none; + (**) + esac; + + j := new noeud; + + j.FG := f1; + j.FM := f2; + j.FG.pere := j; + j.FM.pere := j; + j.nb := 2; + p.nb := 2; + + if p.pere =/= none + then + (* p a un pere *) + (* il faut repeter la procedure refaire *) + j.pere := p.pere; + p.pere.nb := p.pere.nb + 1; + call refaire(p.pere, p, j, j, r); + else + (* p est la racine *) + (* donc il faut creer une nouvelle racine *) + r := new noeud; + r.nb := 2; + r.FG := p; + r.FM := j; + p.pere := r; + j.pere := r; + racine := r; + fi; + esac; + fi; + + courant := racine; + b.racine := courant; + result := b; + fi; + end inserer; + + begin + racine := new noeud; + end barbre; + + +var ba : barbre, + touche, e : integer, + bidon, courant, a, b : noeud, + rep : char, + choix : integer; + +begin + ba := new barbre; + courant := new noeud; + courant := ba.racine; + + pref IIUWgraph block + begin + do + call presentation; + read(choix); + call WriteInteger(choix); + (* selon le choix *) + case choix + when 1 : (* inserer un element *) + rep := 'o'; + do + if rep = 'o' + then + call cls; + call hpage(0,1,1); + call move(10,10); + call outstring("-> Entrez l'element a inserer = "); + read(e); + call WriteInteger(e); + courant := ba.racine; + ba := ba.inserer(e); + courant := ba.racine; + call ba.reorganiser(courant, bidon); + call reponse(rep); + else if rep ='n' + then + exit; + else + call reponse(rep); + fi; + fi; + od; + + + when 2 : (* supprimer un element *) + rep := 'o'; + do + if rep = 'o' + then + call cls; + call hpage(0,1,1); + if ba.vide + then + call move(10,10); + call outstring("-> Il est impossible de supprimer un element"); + call move(10,20); + call outstring("dans un arbre vide"); + else + call move(10,10); + call outstring("-> Entrez l'element a supprimer = "); + read(e); + call WriteInteger(e); + courant := ba.racine; + ba := ba.supprimer(e); + courant := ba.racine; + call ba.reorganiser(courant,bidon); + call reponse(rep); + fi; + else if rep ='n' + then + exit; + else + call reponse(rep); + fi; + fi; + od; + + when 3 : (* determiner si l'element est present dans l'arbre *) + rep := 'o'; + do + if rep = 'o' + then + call cls; + call hpage(0,1,1); + if ba.vide + then + call move(10,10); + call outstring("-> Il est impossible de rechercher un element"); + call move(10,20); + call outstring("dans un arbre vide"); + else + call move(10,10); + call outstring("Entrez l'element = "); + read(e); + call WriteInteger(e); + courant := ba.racine; + if ba.present(e,courant) + then + call move(10,20); + call outstring("-> L'element est present"); + else + call move(10,20); + call outstring("-> L'element est absent"); + fi; + fi; + call reponse(rep); + else if rep ='n' + then + exit; + else + call reponse(rep); + fi; + fi; + od; + + + when 4 : (* determiner l'element minimum *) + call cls; + call hpage(0,1,1); + if ba.vide + then + call move(10,10); + call outstring("-> Il est impossible de rechercher le minimum"); + call move(10,20); + call outstring("dans un arbre vide"); + else + e := ba.minimum; + call move(10,10); + call outstring("-> Le minimum est "); + call WriteInteger(e); + fi; + call move(250,325); + call outstring("Tapez une touche pour continuer"); + touche := inchar; + + when 5 : (* determiner l'element maximum *) + call cls; + call hpage(0,1,1); + if ba.vide + then + call move(10,10); + call outstring("-> Il est impossible de rechercher le maximum"); + call move(10,20); + call outstring("dans un arbre vide"); + else + e := ba.maximum; + call move(10,10); + call outstring("-> Le maximum est "); + call WriteInteger(e); + fi; + call move(250,325); + call outstring("Tapez une touche pour continuer"); + touche := inchar; + + when 6 : (* determiner si l'arbre est vide *) + call cls; + call hpage(0,1,1); + call move(10,10); + if ba.vide then call outstring("-> L'arbre est vide"); + else call outstring("-> L'arbre n'est pas vide"); + fi; + call move(250,325); + call outstring("Tapez une touche pour continuer"); + touche := inchar; + + when 7 : (* affichage de l'arbre *) + call cls; + if ba.vide + then + call hpage(0,1,1); + call move(10,10); + call outstring("L'arbre est vide."); + else + courant := ba.racine; + call ba.afficher(courant); + fi; + call move(250,325); + call outstring("Tapez une touche pour continuer"); + touche := inchar; + + when 8 : (* fin du programme *) + call groff; + exit; + esac; + od; + end; +end mybarbre. + diff --git a/examples/examples.old/bicolore.log b/examples/examples.old/bicolore.log new file mode 100644 index 0000000..c76759b --- /dev/null +++ b/examples/examples.old/bicolore.log @@ -0,0 +1,1246 @@ +PROGRAM BICOLORE; + +(* Projet LI1 : Operations sur les arbres bicolores . *) +(* Realise par CHICHER Corinne et DOME Nadege - UPPA 1993/1994 - *) + + + (* NewPage vide l'ecran en mode texte *) + UNIT NewPage : PROCEDURE; + BEGIN + write( chr(27), "[2J") + END NewPage; + + (* SetCursor positionne le curseur aux ligne et colonne indiquees *) + UNIT SetCursor : PROCEDURE(ligne,colonne:integer); + VAR c,d,e,f :char, + i,j :integer; + BEGIN + i:=ligne div 10; + j:=ligne mod 10; + c:=chr(48+i); + d:=chr(48+j); + i:=colonne div 10; + j:=colonne mod 10; + e:=chr(48+i); + f:=chr(48+j); + write( chr(27), "[", c, d, ";", e, f, "H"); + END SetCursor; + + + (* la classe bic definit la structure d'un noeud d'arbre bicolore *) + UNIT bic : CLASS; + VAR val:integer, (* val:Valeur de l'element d'un noeud *) + rouge : boolean, (* rouge:couleur d'un noeud:si vrai alors rouge sinon blanc *) + fg,fd : bic; (* fg,fd:fils gauche et droit d'un noeud *) + END bic; + + + (* inchar saisit un caractere en mode graphique *) + UNIT inchar : iiuwgraph FUNCTION : integer; + VAR i:integer; + BEGIN + DO + i:=INKEY; + if i <> 0 then + exit + fi; + OD; + result:=i; + END inchar; + + (* ReadInteger lit un entier positif a 3 chiffres avec echo a l'ecran *) + UNIT ReadInteger : iiuwgraph FUNCTION : integer; + VAR X,Y,i,OrdN : integer, + Number : arrayof integer; + BEGIN + array Number dim( 1 : 4 ); + i:=0; + X:=InXPos; + Y:=InYPos; + DO + OrdN:=inchar; + if i=8 or (OrdN < 48 and OrdN > 57) then + exit + fi; + CASE OrdN + when 48 : i:=i+1; + Number(i):=0; + when 49 : i:=i+1; + Number(i):=1; + when 50 : i:=i+1; + Number(i):=2; + when 51 : i:=i+1; + Number(i):=3; + when 52 : i:=i+1; + Number(i):=4; + when 53 : i:=i+1; + Number(i):=5; + when 54 : i:=i+1; + Number(i):=6; + when 55 : i:=i+1; + Number(i):=7; + when 56 : i:=i+1; + Number(i):=8; + when 57 : i:=i+1; + Number(i):=9; + when 8 : if i > 0 then + Number(i):=0; + i:=i-1; + call hascii(0); + fi; + when 13 : if i > 0 then + exit + fi; + ESAC; + if i=1 then + call Move(X,Y); + call hascii(0); + call hascii(48+Number(1)); + fi; + if i=2 then + call Move(X+8,Y); + call hascii(0); + call hascii(48+Number(2)); + fi; + if i=3 then + call Move(X+16,Y); + call hascii(0); + call hascii(48+Number(3)); + fi; + OD; + if (Number(1) = 0) or (Number(1) = 0 and Number(2) = 0) + or (Number(1) = 0 and Number(2) = 0 and Number(3) = 0) then + call Move(X,Y); + call hascii(0); + call hascii(48); + call hascii(0); + fi; + if i=1 then + result:=Number(1); + else + if i=2 then + result:=10 * Number(1) + Number(2); + else + result:=100 * Number(1) + 10 * Number(2) + Number(3); + fi; + fi; + kill(Number); + END ReadInteger; + + (* WriteInteger permet d'afficher un entier positif a 3 chiffres a l'ecran *) + UNIT WriteInteger : iiuwgraph PROCEDURE(Number:integer); + VAR i,j,k:integer; + BEGIN + if Number < 10 then + call HASCII(0); + call HASCII(Number+48); + call HASCII(0); + else + if Number < 100 then + i:=Number div 10; + j:=Number - i * 10; + call HASCII(0); + call HASCII(i+48); + call HASCII(0); + call HASCII(j+48); + else + i:=Number div 100; + j:=(Number - i * 100) div 10; + k:=Number - i * 100 - j * 10; + call HASCII(0); + call HASCII(i+48); + call HASCII(0); + call HASCII(j+48); + call HASCII(0); + call HASCII(k+48); + fi; + fi; + END WriteInteger; + + (* Mousepos gere la position de la souris a l'endroit ou le bouton gauche *) + (* a ete presse *) + UNIT MOUSEPOS : iiuwgraph PROCEDURE(x,y:integer;inout bonclic:boolean;output choix:integer); + BEGIN + if (x >= 24) and (x <= 544) then + if (y >= 80) and (y <= 88) then + choix:=1; + bonclic:=true; + fi; + if (y >= 96) and (y <= 104) then + choix:=2; + bonclic:=true; + fi; + if (y >= 112) and (y <= 120) then + choix:=3; + bonclic:=true; + fi; + if (y >= 128) and (y <= 136) then + choix:=4; + bonclic:=true; + fi; + if (y >= 144) and (y <=152) then + choix:=5; + bonclic:=true; + fi; + if (y >= 160) and (y <= 168) then + choix:=6; + bonclic:=true; + fi; + if (y >= 176) and (y <= 184) then + choix:=7; + bonclic:=true; + fi; + if (y >= 192) and (y <= 200) then + choix:=8; + bonclic:=true; + fi; + if (y >= 208) and (y <= 216) then + choix:=9; + bonclic:=true; + fi; + if (y >= 224) and (y <= 232) then + call CLS; + (*call GROFF;*) + choix:=0; + bonclic:=true; + fi; + fi; + END MOUSEPOS; + + (* cadre trace un rectangle autour des operations *) + UNIT cadre : iiuwgraph PROCEDURE(xg,yg,xd,yd:integer); + BEGIN + call COLOR(7); + call MOVE(xg,yg); + call DRAW(xd,yg); + call MOVE(xd,yg); + call DRAW(xd,yd); + call MOVE(xd,yd); + call DRAW(xg,yd); + call MOVE(xg,yd); + call DRAW(xg,yg); + END cadre; + + (* menu propose les traitements pouvant etre realises sur les arbres bicolores *) + UNIT menu : iiuwgraph FUNCTION : integer; + VAR i,b,h,v,numop:integer, + g,d,c,driver,selection:boolean; + BEGIN + + pref mouse block + BEGIN + call CLS; + selection:=false; + g:=false; + d:=false; + c:=false; + call COLOR(7); + call MOVE(184,24); + call OUTSTRING("OPERATIONS SUR LES ARBRES BICOLORES"); + call COLOR(15); + call cadre(24,56,544,240); + call MOVE(64,80); + call OUTSTRING("Creation d'un arbre bicolore"); + call MOVE(64,96); + call OUTSTRING("Ajout d'un element"); + call MOVE(64,112); + call OUTSTRING("Recherche d'un element dans un arbre"); + call MOVE(64,128); + call OUTSTRING("Recherche du minimum dans un arbre"); + call MOVE(64,144); + call OUTSTRING("Recherche du maximum dans un arbre"); + call MOVE(64,160); + call OUTSTRING("Recherche de(s) successeur(s) d'un element de l'arbre"); + call MOVE(64,176); + call OUTSTRING("Recherche du predecesseur d'un element de l'arbre"); + call MOVE(64,192); + call OUTSTRING("Suppression de certains noeuds de l'arbre"); + call MOVE(64,208); + call OUTSTRING("Affichage d'un arbre"); + call MOVE(64,224); + call OUTSTRING("Quitter l'application"); + call MOVE(24,256); + call OUTSTRING("Selectionnez l'operation avec le bouton gauche de la souris..."); + + (* Gestion de la souris *) + driver:=INIT(b); + call SETPOSITION(0,0); + call SHOWCURSOR; + DO + call GETPRESS(0,h,v,b,g,d,c); + if g then + call MOUSEPOS(h,v,selection,numop); + if not selection then + g:=false; + repeat; + else + call HIDECURSOR; + exit + fi; + fi; + OD; + result:=numop; + END; + END menu; + + (* ajout sert : *) + (* a creer un bicolore : inserer un element dans un arbre vide *) + (* a ajouter un element dans un arbre deja cree *) + + (* ses parametres sont : *) + (* en entree, l'element a inserer *) + (* en entree/sortie, la racine de l'arbre et 2 sentinelles *) + (* un booleen indiquant si au moins un ajout a ete realise *) + + UNIT ajout : PROCEDURE(x:integer;inout A,T,Z,Q:bic,adj:boolean); + VAR P,GP,AGP : bic, + touche:integer; + (* Pere,grand-pere et arriere grand-pere du pteur courant A *) + (* Ces pointeurs servent au reequilibrage de l'arbre *) + + BEGIN + pref IIUWGRAPH block + BEGIN + adj:=false; + A:=new bic; + A:=T; (* T:Tete de l'arbre ayant pour valeur 0, pour couleur blanc, *) + (* pour fils gauche Z et pour fils droit initial Z *) + Z.val:=x; (* On affecte l'element a inserer au champ val de Z *) + P:=new bic; + P:=T; + GP:=new bic; + GP:=T; + AGP:=new bic; + + DO + AGP:=GP; + GP:=P; + P:=A; + + if x < A.val then (* Descente dans l'arbre *) + A:=A.fg; + else + A:=A.fd; + fi; + + if (A.fg.rouge and A.fd.rouge) then + + if A = Z then (* Ajout de l'element dand une feuille *) + adj:=true; + A:=new bic; + A.val:=x; + A.fg:=Z; + A.fd:=Z; + A.rouge:=true; (* L'ajout d'un element s'effectue dans une feuille *) + (* qui devient un noeud rouge *) + if x < P.val then + P.fg:=A; + else + P.fd:=A; + fi; + else + A.rouge:=true; (* Inversion des couleurs *) + A.fg.rouge:=false; + A.fd.rouge:=false; + fi; + + call CLS; + + if P.rouge then (* Reequilibrage car 2 noeuds rouges consecutifs*) + call CLS; + call BORDER(1); + call MOVE(88,16); + call OUTSTRING("RESULTAT INTERMEDIAIRE : "); + Taff:=TT.fd; + call affpreordre(Taff,ZZ,0.5,1,0,0); + call MOVE(40,300); + call OUTSTRING("Tapez sur une touche pour continuer ..."); + touche:=INCHAR; + + (* 8 types de rotation-raccrochage *) + if P.val > GP.val then (* Rotation gauche ou droite-gauche *) + if A.val > P.val then + call rg(GP); + else + call rdg(GP); + fi; + if GP.val < AGP.val then + AGP.fg:=GP; + else + AGP.fd:=GP; + fi; + else + if A.val < P.val then (* Rotation droite ou gauche-droite *) + call rd(GP); + else + call rgd(GP); + fi; + if GP.val < AGP.val then + AGP.fg:=GP; + else + AGP.fd:=GP; + fi; + fi; + (* Retablissement des couleurs apres rotation *) + GP.rouge:=false; + GP.fg.rouge:=true; + GP.fd.rouge:=true; + (* Retablissement de la hierarchie des ascendants *) + P:=GP; + GP:=AGP; + if x = P.val then + A:=P; (* A renvoie l'adresse de l'element a inserer dans l'arbre *) + else + if x < P.val then + A:=P.fg; + else + A:=P.fd; + fi; + fi; + fi; + fi; + + if x <> A.val then (* Poursuite de la descente car place *) + (* nouvel element non trouvee *) + repeat; + else + exit; (* L'ajout de l'element est termine *) + fi; + + OD; + T.fd.rouge:=false; (* La racine de l'arbre est toujours blanche *) + END; + END ajout; + + (* recherche parcourt l'arbre et indique si l'element a rechercher *) + (* est present ou absent de l'arbre *) + (* ses parametres d'entree sont l'element a rechercher , la sentinelle Z1 *) + (* Tr: noeud contenant l'element recherche et Pr:pere de Tr *) + + UNIT recherche : FUNCTION (x:integer,Z1:bic;inout Tr,Pr:bic):boolean; + BEGIN + (* Parcours de l'arbre *) + Tr:=Tr.fd; + while Tr <> Z1 and not result + do + if x = Tr.val then (* On a trouve l'element :recherche terminee positivement *) + result:=true + else (* On continue la recherche *) + if x < Tr.val then (* a gauche *) + Pr:=Tr; + Tr:=Tr.fg; + else + if x > Tr.val then (* a droite *) + Pr:=Tr; + Tr:=Tr.fd; + fi; + fi; + fi; + od; + END recherche; + + (* Suppression supprime un certain type de noeud de l'arbre *) + (* Ses parametres d'entree sont l'element a supprimer, la sentinelle Z1 *) + (* Tr: noeud contenant l'element a supprimer et Pr:pere de Tr *) + + UNIT suppression :PROCEDURE(x:integer,Z1:bic;inout T,Tr,Pr:bic,adj:boolean); + BEGIN + pref IIUWGRAPH block + BEGIN + if Tr.fg = Z1 and Tr.fd = Z1 then (*Si c'est un noeud sans fils *) + if Tr = T.fd then (* Si le noeud a supprimer est la racine *) + kill(Tr); + kill(T); + adj:=false; (* L'arbre devient donc vide *) + else + if Tr.val < Pr.val then + Pr.fg:=Z1; + else + Pr.fd:=Z1; + fi; + fi; + else + if Tr.fg <> Z1 and Tr.fd=Z1 then (* Si c'est un noeud qui a un fils gauche *) + (* Alors on remplace ce noeud par son fils*) + if Tr=Pr.fd then + Pr.fd:=Tr.fg; + Pr.fd.rouge:=false; + kill(Tr); + else + if Tr.val < Pr.val then + Pr.fg:=Tr.fg; + Pr.fg.rouge:=false; + kill(Tr); + else + Pr.fd:=Tr.fg; + Pr.fd.rouge:=false; + kill(Tr); + fi; + fi; + else (* Si c'est un noeud qui a un fils droit *) + (* Alors on remplace ce noeud par son fils*) + if Tr.fg = Z1 and Tr.fd <> Z1 then + if Tr=Pr.fd then + Pr.fd:=Tr.fd; + Pr.fd.rouge:=false; + kill(Tr); + else + if Tr.val < Pr.val then + Pr.fg:=Tr.fd; + Pr.fg.rouge:=false; + kill(Tr); + else + Pr.fd:=Tr.fd; + Pr.fd.rouge:=false; + kill(Tr); + fi; + fi; + else (* Si c'est un noeud qui a deux fils *) + (* Alors on remplace ce noeud par celui*) + (* qui lui est inferieur *) + if (Tr.fg.fg=Z1 and Tr.fg.fd=Z1) and (Tr.fd.fg=Z1 and Tr.fd.fd=Z1) then + if Tr.val > Pr.val then + Pr.fd:=Tr.fg; + else + Pr.fg:=Tr.fg; + fi; + Pr.fd.rouge:=false; + Pr.fd.fd:=Tr.fd; + kill(Tr); + else (*Cas non traite: Le noeud a supprimer a des petits fils *) + call MOVE (40,160); + call OUTSTRING("Il est impossible de supprimer ce genre de noeuds..."); + call MOVE(40,300); + call OUTSTRING("Tapez sur une touche pour verification ..."); + touche:=INCHAR; + + fi; + fi; + fi; + fi; + END; + END suppression; + + (* rd effectue une rotation a droite de l'arbre *) + UNIT rd : PROCEDURE(inout GP:bic); + VAR aux:bic; + BEGIN + aux:=new bic; + aux:=GP.fg; + GP.fg:=aux.fd; + aux.fd:=GP; + GP:=aux; + END rd; + + (* rg effectue une rotation a gauche de l'arbre *) + UNIT rg : PROCEDURE(inout GP:bic); + VAR aux:bic; + BEGIN + aux:=new bic; + aux:=GP.fd; + GP.fd:=aux.fg; + aux.fg:=GP; + GP:=aux; + END rg; + + (* rdg effectue une rotation droite-gauche de l'arbre *) + UNIT rdg : PROCEDURE(inout GP:bic); + BEGIN + call rd(GP.fd); + call rg(GP); + END rdg; + + (* rgd effectue une rotation gauche-droite de l'arbre *) + UNIT rgd : PROCEDURE(inout GP:bic); + BEGIN + call rg(GP.fg); + call rd(GP); + END rgd; + + (* minmax renvoie le minimum ou le maximum de l'arbre *) + (* ses parametres d'entree sont l'arbre, la sentinelle, et le type de recherche *) + UNIT minmax : FUNCTION(N,Z1:bic,choix:integer) : integer; + VAR S:bic; (* Noeud contenant la valeur a renvoyer *) + BEGIN + (* Si on recherche le minimum (choix=0) on descend le plus a gauche possible *) + (* Si on recherche le maximum (choix=1) on descend le plus a droite possible *) + S:=new bic; + N:=N.fd; + if choix=0 then + while N <> Z1 + do + S:=N; + N:=N.fg; + od; + fi; + if choix=1 then + while N <> Z1 + do + S:=N; + N:=N.fd; + od; + fi; + result:=S.val; + END minmax; + + (* affpreordre affiche l'arbre dans un ordre prefixe *) + UNIT affpreordre : PROCEDURE(N,Z1:bic,coefm,sup,inf:real,niveau:integer); + VAR posx:real,posy,i,j:integer; + BEGIN + pref iiuwgraph BLOCK + BEGIN + if N <> Z1 then + niveau:=niveau+1; + posx:=(coefm * (sup - inf)) + inf; + posy:= niveau * 35; + if niveau <> 1 then + call DRAW(posx*640 , posy); + fi; + if N.rouge then + call COLOR(12); + else + call COLOR(15); + fi; + call MOVE(round(posx * 640),posy); + call HASCII(0); + call WriteInteger(N.val); + call MOVE(INXPOS + 4,INYPOS); + call COLOR(3); + call MOVE(INXPOS-20,INYPOS); + call affpreordre(N.fg,Z1,0.5,posx,inf,niveau); + call MOVE(ROUND(posx * 640) + 8 , posy + 8); + call affpreordre(N.fd,Z1,0.5,sup,posx,niveau); + call MOVE(ROUND(posx * 640) + 8,posy + 8); + fi; + END; + END affpreordre; + + (* menage:permet la destruction de l'objet passe en parametre *) + UNIT menage : PROCEDURE(inout Z,N:bic); + BEGIN + if N.fg <> Z then + call menage(Z,N.fg); + kill(N.fg); + fi; + if N.fd <> Z then + call menage(Z,N.fd); + kill(N.fd); + fi; + END menage; + + (* PROGRAMME PRINCIPAL *) + + VAR rep,elt,interm:integer, (* rep:choix de l'operation a realiser *) + (* elt:Element entre par l'utilisateur *) + (* interm:reponse aux questions posees *) + AA,ZZ,QQ,TT,Taff,Trech,Prech:bic, + (* AA:pointeur sur le noeud courant *) + (* ZZ:sentinelle sur laquelle on fait pointer tous *) + (* les liens qui sont a NONE *) + (* QQ:sentinelle pointee par ZZ et dont les liens *) + (* sont a NONE *) + (* TT:Tete de l'arbre dont le fils droit va pointer*) + (* sur le premier noeud de l'arbre *) + touche:integer, + adjonc:boolean; + + BEGIN + pref IIUWGRAPH block + BEGIN + + call GRON(5); + adjonc:=false; + + DO + call COLOR(3); + call BORDER(1); + call CLS; + rep:=menu; (* Recuperation du choix de l'utilisateur *) + call BORDER(3); + CASE rep + + when 0: (* Pour quitter l'application *) + if adjonc then + call menage(ZZ,TT); (*Destruction de l'arbre*) + kill(TT); + kill(ZZ); + kill(QQ); + fi; + call GROFF; + call NewPage; + call Setcursor(5,20); + writeln("**********TERMINE**********"); + call ENDRUN; (*Sortie de l'application*) + + when 1: call CLS; (* pour creer un arbre *) + if adjonc then + call COLOR(3); + call MOVE(40,40); + call OUTSTRING("ATTENTION ! : L'arbre precedemment cree va etre efface"); + call COLOR(3); + call MOVE(40,56); + call OUTSTRING("Voulez-vous toujours creer un arbre ? Si oui, tapez 1 : "); + interm:=ReadInteger; + if interm <> 1 then + repeat; + else + call menage(ZZ,TT); (*Destruction de l'arbre*) + kill(TT); + kill(ZZ); + kill(QQ); + fi; + fi; + (* creation et initialisation du pointeur courant et des 2 sentinnelles *) + + AA:=new bic; + ZZ:=new bic; + ZZ.rouge:=false; + ZZ.fg:=new bic; + ZZ.fd:=new bic; + + QQ:=new bic; + QQ.rouge:=true; + QQ.fg:=new bic; + QQ.fd:=new bic; + QQ.fg:=NONE; + QQ.fd:=NONE; + + ZZ.fg:=QQ; + ZZ.fd:=QQ; + + (* creation et initialisation de la tete de l'arbre *) + TT:=new bic; + TT.rouge:=false; + TT.fg:=new bic; + TT.fd:=new bic; + TT.fg:=ZZ; + TT.fd:=ZZ; + + Trech:=new bic; + Prech:=new bic; + Taff:=new bic; + adjonc:=false; + + call COLOR(3); + call MOVE(192,16); + call OUTSTRING("CREATION D'UN ARBRE BICOLORE"); + call MOVE(40,88); + call OUTSTRING("Entrez le premier element de l'arbre :"); + call MOVE(360,88); + elt:=ReadInteger; + + (* On va inserer elt dans l'arbre *) + call ajout(elt,AA,TT,ZZ,QQ,adjonc); + repeat; + + when 2 : call CLS; (* pour ajouter un element dans l'arbre *) + if adjonc then + call COLOR(3); + call MOVE(152,16); + call OUTSTRING("AJOUT D'UN ELEMENT DANS UN ARBRE BICOLORE"); + call MOVE(40,88); + call OUTSTRING("Entrez l'element a inserer dans l'arbre :"); + call MOVE(376,88); + elt:=ReadInteger; + + (* Test de presence de l'element dans l'arbre *) + Trech:=TT; + if recherche(elt,ZZ,Trech,Prech) then + call COLOR(3); + call MOVE(160,120); + call OUTSTRING("ATTENTION ! AJOUT IMPOSSIBLE !!!"); + call MOVE(40,136); + call WriteInteger(elt); + call OUTSTRING(" est deja present dans l'arbre ! "); + call MOVE(40,152); + call OUTSTRING("Tapez sur une touche pour verification..."); + touche:=INCHAR; + call CLS; + call BORDER(1); + call MOVE(88,16); + call OUTSTRING("VERIFICATION"); + + (* Affichage de l'arbre *) + Taff:=TT.fd; + call affpreordre(Taff,ZZ,0.5,1,0,0); + call MOVE(40,300); + call OUTSTRING("Tapez sur une touche pour retourner au menu ..."); + touche:=INCHAR; + else + call ajout(elt,AA,TT,ZZ,QQ,adjonc); + call CLS; + call BORDER(1); + call MOVE(88,16); + call OUTSTRING("RESULTAT : "); + Taff:=TT.fd; + call affpreordre(Taff,ZZ,0.5,1,0,0); + call MOVE(40,300); + call OUTSTRING("Tapez sur une touche pour retourner au menu ..."); + touche:=INCHAR; + fi; + repeat; + else + call MOVE(350,40); + call OUTSTRING("ATTENTION !"); + call MOVE(40,64); + call OUTSTRING("Ajout impossible car arbre inexistant !"); + call MOVE(40,80); + call OUTSTRING("Retour au menu pour creer un arbre ? Si oui, tapez 1 : "); + call MOVE(488,80); + interm:=ReadInteger; + if interm=1 then + repeat; + else + if adjonc then + call menage(ZZ,TT); (*Destruction de l'arbre*) + kill(TT); + kill(ZZ); + kill(QQ); + fi; + call MOVE(160,160); + call OUTSTRING("**********TERMINE**********"); + CALL GROFF; + call ENDRUN; + fi; + fi; + + when 3 : call CLS; (* pour chercher un element dans l'arbre *) + if adjonc then + call COLOR(3); + call MOVE(128,16); + call OUTSTRING("RECHERCHE D'UN ELEMENT DANS UN ARBRE BICOLORE"); + call MOVE(40,88); + call OUTSTRING("Entrez l'element a rechercher dans l'arbre :"); + call MOVE(400,88); + elt:=ReadInteger; + Trech:=TT; + if not recherche(elt,ZZ,Trech,Prech) then + call CLS; + call MOVE(40,136); + call WriteInteger(elt); + call OUTSTRING(" est absent de l'arbre !!"); + call MOVE(40,152); + call OUTSTRING("Tapez sur une touche pour verification..."); + touche:=INCHAR; + call CLS; + call BORDER(1); + call MOVE(88,16); + call OUTSTRING("VERIFICATION"); + Taff:=TT.fd; + call affpreordre(Taff,ZZ,0.5,1,0,0); + call MOVE(40,300); + call OUTSTRING("Tapez sur une touche pour retourner au menu ..."); + touche:=INCHAR; + else + call MOVE(40,136); + call WriteInteger(elt); + call OUTSTRING(" est present dans l'arbre"); + call MOVE(40,152); + call OUTSTRING("Tapez sur une touche pour verification..."); + touche:=INCHAR; + call CLS; + call BORDER(1); + call MOVE(88,16); + call OUTSTRING("VERIFICATION : "); + Taff:=TT.fd; + call affpreordre(Taff,ZZ,0.5,1,0,0); + call MOVE(40,300); + call OUTSTRING("Tapez sur une touche pour retourner au menu ..."); + touche:=INCHAR; + fi; + repeat; + else + call MOVE(160,120); + call OUTSTRING("ATTENTION !"); + call MOVE(40,136); + call OUTSTRING("Recherche impossible car arbre inexistant !"); + call MOVE(40,152); + call OUTSTRING("Retour au menu pour creer un arbre ? Si oui, tapez 1 : "); + call MOVE(496,152); + interm:=ReadInteger; + if interm=1 then + repeat; + else + if adjonc then + call menage(ZZ,TT); (*Destruction de l'arbre*) + kill(TT); + kill(ZZ); + kill(QQ); + fi; + call MOVE(160,160); + call OUTSTRING("**********TERMINE**********"); + call GROFF; + call ENDRUN; + fi; + fi; + + when 4 : call CLS; (* pour trouver le minimum de l'arbre *) + if adjonc then + call MOVE(128,16); + call OUTSTRING("RECHERCHE DU MINIMUM DANS UN ARBRE BICOLORE"); + call MOVE(40,136); + call OUTSTRING("Voici le minimum de l'arbre bicolore :"); + call MOVE(360,136); + call WriteInteger(minmax(TT,ZZ,0)); + call MOVE(40,300); + call OUTSTRING("Tapez sur une touche pour retourner au menu ..."); + touche:=INCHAR; + repeat; + else + call MOVE(160,120); + call OUTSTRING("ATTENTION !"); + call MOVE(40,144); + call OUTSTRING("Recherche du minimum impossible car arbre inexistant !"); + call MOVE(40,160); + call OUTSTRING("Retour au menu pour creer un arbre ? Si oui, tapez 1 : "); + call MOVE(488,160); + interm:=ReadInteger; + if interm=1 then + repeat; + else + if adjonc then + call menage(ZZ,TT); (*Destruction de l'arbre*) + kill(TT); + kill(ZZ); + kill(QQ); + fi; + call MOVE(160,160); + call OUTSTRING("**********TERMINE**********"); + call GROFF; + call ENDRUN; + fi; + fi; + + when 5 : call CLS; (* pour trouver le maximum de l'arbre *) + if adjonc then + call MOVE(128,16); + call OUTSTRING("RECHERCHE DU MAXIMUM DANS UN ARBRE BICOLORE"); + call MOVE(40,136); + call OUTSTRING("Voici le maximum de l'arbre bicolore :"); + call MOVE(360,136); + call WriteInteger(minmax(TT,ZZ,1)); + call MOVE(40,300); + call OUTSTRING("Tapez sur une touche pour retourner au menu ..."); + touche:=INCHAR; + repeat; + else + call MOVE(24,40); + call OUTSTRING("ATTENTION !"); + call MOVE(40,40); + call OUTSTRING("Recherche du maximum impossible car arbre inexistant !"); + call MOVE(56,40); + call OUTSTRING("Retour au menu pour creer un arbre ? Si oui, tapez 1 : "); + call MOVE(56,488); + interm:=ReadInteger; + if interm=1 then + repeat; + else + if adjonc then + call menage(ZZ,TT); (*Destruction de l'arbre*) + kill(TT); + kill(ZZ); + kill(QQ); + fi; + call MOVE(160,160); + call OUTSTRING("**********TERMINE**********"); + call GROFF; + call ENDRUN; + fi; + fi; + + when 6 : call CLS; (* pour chercher le(s) successeur(s) d'un element*) + if adjonc then + call COLOR(3); + call MOVE(136,16); + call OUTSTRING("RECHERCHE DE(S) SUCCESSEUR(S) D'UN ELEMENT"); + call MOVE(40,88); + call OUTSTRING("Entrez l'element dont vous voulez le(s) successeur(s) :"); + call MOVE(496,88); + elt:=ReadInteger; + Trech:=TT; + if not recherche(elt,ZZ,Trech,Prech) then + call CLS; + call MOVE(40,136); + call WriteInteger(elt); + call OUTSTRING(" est absent de l'arbre !!"); + call MOVE(40,152); + call OUTSTRING("Tapez sur une touche pour verification..."); + touche:=INCHAR; + call CLS; + call BORDER(1); + call MOVE(88,16); + call OUTSTRING("VERIFICATION : "); + Taff:=TT.fd; + call affpreordre(Taff,ZZ,0.5,1,0,0); + call MOVE(40,300); + call OUTSTRING("Tapez sur une touche pour retourner au menu ..."); + touche:=INCHAR; + else + call CLS; + call MOVE(40,40); + if Trech.fg <> ZZ and Trech.fd <> ZZ then + call OUTSTRING("Le(s) successeurs de "); + call WriteInteger(elt); + call OUTSTRING(" sont : "); + call WriteInteger(Trech.fg.val); + call OUTSTRING(" et "); + call WriteInteger(Trech.fd.val); + else + if Trech.fg <> ZZ then + call OUTSTRING("Le successeur gauche de "); + call WriteInteger(elt); + call OUTSTRING(" est : "); + call WriteInteger(Trech.fg.val); + else + if Trech.fd <> ZZ then + call OUTSTRING("Le successeur droit de "); + call WriteInteger(elt); + call OUTSTRING("est : "); + call WriteInteger(Trech.fd.val); + else + call OUTSTRING("L'element "); + call WriteInteger(elt); + call OUTSTRING(" n'a aucun successeur !"); + fi; + fi; + fi; + call BORDER(1); + call MOVE(40,152); + call OUTSTRING("Tapez sur une touche pour verification..."); + touche:=INCHAR; + call CLS; + call BORDER(1); + call MOVE(112,16); + call OUTSTRING("VERIFICATION : "); + Taff:=TT.fd; + call affpreordre(Taff,ZZ,0.5,1,0,0); + call MOVE(40,300); + call OUTSTRING("Tapez sur une touche pour retourner au menu ..."); + touche:=INCHAR; + fi; + repeat; + else + call COLOR(3); + call MOVE(350,40); + call OUTSTRING("ATTENTION !"); + call MOVE(40,64); + call OUTSTRING("Recherche impossible car arbre inexistant !"); + call MOVE(40,80); + call OUTSTRING("Retour au menu pour creer un arbre ? Si oui, tapez 1 : "); + call MOVE(488,80); + interm:=ReadInteger; + if interm=1 then + repeat; + else + if adjonc then + call menage(ZZ,TT); (*Destruction de l'arbre*) + kill(TT); + kill(ZZ); + kill(QQ); + fi; + call MOVE(160,160); + call OUTSTRING("**********TERMINE**********"); + call GROFF; + call ENDRUN; + fi; + fi; + + + when 7 : call CLS; (* pour chercher le predecesseur d'un element*) + if adjonc then + call COLOR(3); + call MOVE(136,16); + call OUTSTRING("RECHERCHE DU PREDECESSEUR D'UN ELEMENT"); + call MOVE(40,88); + call OUTSTRING("Entrez l'element dont vous voulez le predecesseur :"); + call MOVE(456,88); + elt:=ReadInteger; + Trech:=TT; + if not recherche(elt,ZZ,Trech,Prech) then + call CLS; + call MOVE(40,136); + call WriteInteger(elt); + call OUTSTRING(" est absent de l'arbre !!"); + call MOVE(40,152); + call OUTSTRING("Tapez sur une touche pour verification..."); + touche:=INCHAR; + call CLS; + call BORDER(1); + call MOVE(88,16); + call OUTSTRING("VERIFICATION : "); + Taff:=TT.fd; + call affpreordre(Taff,ZZ,0.5,1,0,0); + call MOVE(40,300); + call OUTSTRING("Tapez sur une touche pour retourner au menu ..."); + touche:=INCHAR; + repeat; + else + call CLS; + call MOVE(40,40); + if Trech = TT.fd then + call OUTSTRING("L'element "); + call WriteInteger(elt); + call OUTSTRING(" n'a pas de predecesseur ! "); + else + call OUTSTRING("Le predecesseur de "); + call WriteInteger(elt); + call OUTSTRING(" est : "); + call WriteInteger(Prech.val); + fi; + fi; + call BORDER(1); + call MOVE(40,152); + call OUTSTRING("Tapez sur une touche pour verification..."); + touche:=INCHAR; + call CLS; + call MOVE(88,16); + call OUTSTRING("VERIFICATION : "); + Taff:=TT.fd; + call affpreordre(Taff,ZZ,0.5,1,0,0); + call MOVE(40,300); + call OUTSTRING("Tapez sur une touche pour retourner au menu ..."); + touche:=INCHAR; + repeat; + + else + call COLOR(3); + call MOVE(350,40); + call OUTSTRING("ATTENTION !"); + call MOVE(40,64); + call OUTSTRING("Recherche impossible car arbre inexistant !"); + call MOVE(40,80); + call OUTSTRING("Retour au menu pour creer un arbre ? Si oui, tapez 1 : "); + call MOVE(488,80); + interm:=ReadInteger; + if interm=1 then + repeat; + else + if adjonc then + call menage(ZZ,TT); (*Destruction de l'arbre*) + kill(TT); + kill(ZZ); + kill(QQ); + fi; + call MOVE(160,160); + call OUTSTRING("**********TERMINE**********"); + call GROFF; + call ENDRUN; + fi; + fi; + + when 8 : call CLS; (* pour supprimer un element*) + if adjonc then + call MOVE(152,16); + call OUTSTRING("SUPPRESSION D'UN ELEMENT"); + call MOVE(40,88); + call OUTSTRING("Entrez l'element a supprimer :"); + call MOVE(280,88); + elt:=ReadInteger; + Trech:=TT; + Prech:=TT; + if not recherche(elt,ZZ,Trech,Prech) then + call CLS; + call MOVE(40,136); + call WriteInteger(elt); + call OUTSTRING(" est absent de l'arbre donc suppression impossible !!"); + call MOVE(40,152); + call OUTSTRING("Tapez sur une touche pour verification..."); + touche:=INCHAR; + else + call suppression(elt,ZZ,TT,Trech,Prech,adjonc); + if not adjonc then + kill(ZZ); + kill(QQ); + call CLS; + call MOVE(350,40); + call OUTSTRING("Arbre detruit !!!"); + call MOVE(40,200); + call OUTSTRING("Tapez sur une touche pour retourner au menu ..."); + touche:=INCHAR; + repeat; + fi; + fi; + call CLS; + call BORDER(1); + call MOVE(88,16); + call OUTSTRING("VERIFICATION "); + Taff:=TT.fd; + call affpreordre(Taff,ZZ,0.5,1,0,0); + call MOVE(40,300); + call OUTSTRING("Tapez sur une touche pour retourner au menu ..."); + touche:=INCHAR; + repeat; + else + call MOVE(350,40); + call OUTSTRING("ATTENTION !"); + call MOVE(40,64); + call OUTSTRING("Suppression impossible car arbre inexistant !"); + call MOVE(40,80); + call OUTSTRING("Retour au menu pour creer un arbre ? Si oui, tapez 1 : "); + call MOVE(488,80); + interm:=ReadInteger; + if interm=1 then + repeat; + else + if adjonc then + call menage(ZZ,TT); (*Destruction de l'arbre*) + kill(TT); + kill(ZZ); + kill(QQ); + fi; + call MOVE(160,160); + call OUTSTRING("**********TERMINE**********"); + call GROFF; + call ENDRUN; + fi; + fi; + + when 9 : call CLS; (* pour afficher le contenu de l'arbre *) + call BORDER(1); + call COLOR(3); + call MOVE(192,16); + if adjonc then + call OUTSTRING("AFFICHAGE DE L'ARBRE BICOLORE"); + call MOVE(180,32); + Taff:=TT.fd; + call affpreordre(Taff,ZZ,0.5,1,0,0); + else + call OUTSTRING("ARBRE VIDE !!!!"); + fi; + call MOVE(40,300); + (*call COLOR(7);*) + call OUTSTRING("Tapez sur une touche pour retourner au menu ..."); + touche:=INCHAR; + repeat; + + otherwise + call CLS; (* gestion des operations inexistantes *) + call MOVE(350,40); + call OUTSTRING("Option inexistante !!"); + call MOVE(40,152); + call OUTSTRING("Voulez-vous retourner au menu ? Si oui, tapez 1 : "); + call MOVE(440,152); + interm:=ReadInteger; + if interm=1 then + repeat; + else + if adjonc then + call menage(ZZ,TT); (*Destruction de l'arbre*) + kill(TT); + kill(ZZ); + kill(QQ); + fi; + call MOVE(160,1600); + call OUTSTRING("**********TERMINE**********"); + call GROFF; + call ENDRUN; + fi; + ESAC; + OD; + END; +END BICOLORE. + + + + + diff --git a/examples/examples.old/bidim.log b/examples/examples.old/bidim.log new file mode 100644 index 0000000..06d96f9 --- /dev/null +++ b/examples/examples.old/bidim.log @@ -0,0 +1,637 @@ +program projet1; + +begin +pref iiuwgraph block + +unit bst2 : class; + var racine : noeud; + + unit noeud : class(x,y : integer); + var gauche,droite : noeud; + end noeud; + + unit liste : class(x,y: integer); + var suiv,pred : liste; + end liste; + + unit insert : procedure(x,y : integer); + var d,td : boolean; + var t,tt : noeud; + begin + d:=false; + tt,t:=racine; + while (t<>none) + do + if d then td:=xnone then + t:=new noeud(x,y); + if td then tt.gauche:=t; else tt.droite:=t; fi; + else racine:=new noeud(x,y); + fi; + end insert; + + unit mb : function (x,y : integer) : boolean; + var d,td : boolean; + var t : noeud; + begin + d:=false; + t:=racine; + while (t<>none) + do + if ((t.x=x) and (t.y=y)) then exit; fi; + if d then td:=xnone) then result:=true; else result:=false; fi; + end mb; + + unit twodrange : procedure (t : noeud; x1,y1,x2,y2 : integer; + d : boolean; inout l:liste); + var t1,t2,tx1,tx2,ty1,ty2 : boolean; + begin + if t<>none then + tx1:=x1none then + l.suiv:=new liste(t.x,t.y); + l.suiv.pred:=l; + l:=l.suiv; + else + l:=new liste(t.x,t.y); + fi; + else ; + fi; + if t2 then call twodrange (t.droite,x1,y1,x2,y2,(not d),l);fi; + fi; + end twodrange; + + unit delete : procedure (x,y : integer); + var d,td : boolean; + var t,tt,pb : noeud; + var test : boolean; + + unit sousmaxi : procedure(t : noeud;surx,click : boolean; + inout dsort : boolean; inout n : noeud); + begin + if t<>none then + if surx then + if t.x>=n.x then n:=t; + dsort:=click; + fi; + else + if t.y>=n.y then n:=t; + dsort:=click; + fi; + fi; + call sousmaxi(t.gauche,surx,not(click),dsort,n); + call sousmaxi(t.droite,surx,not(click),dsort,n); + fi; + end sousmaxi; + + unit sousmini : procedure(t : noeud;surx,click : boolean; + inout dsort : boolean;inout n : noeud); + begin + if t<>none then + if surx then + if t.x<=n.x then n:=t; + dsort:=click; + fi; + else + if t.y<=n.y then n:=t; + dsort:=click; + fi; + fi; + call sousmini(t.gauche,surx,not(click),dsort,n); + call sousmini(t.droite,surx,not(click),dsort,n); + fi; + end sousmini; + + unit delpartiel : procedure(t : noeud;surx : boolean); + var n : noeud; + var dn : boolean; + begin + if (t.gauche=none) and (t.droite=none) then + kill(t); + else + if t.gauche<>none then + n:=t.gauche; + call sousmaxi(t.gauche,surx,not(surx),dn,n); + t.x:=n.x; t.y:=n.y; + call delpartiel(n,dn); + else + n:=t.droite; + call sousmini(t.droite,surx,not(surx),dn,n); + t.x:=n.x; t.y:=n.y; + call delpartiel(n,dn); + fi; + fi; + end delpartiel; + + + begin + d:=false; + t:=racine; + while (t<>none) + do + if ((t.x=x) and (t.y=y)) then exit; fi; + if d then td:=xnone then + call killall(t.gauche); + call killall(t.droite); + kill(t); + fi; + end killall; + + + unit cadre : procedure( t : noeud; + inout minx,maxx,miny,maxy : integer); + begin + if t<>none then + if t<>racine then + if t.xmaxx then maxx:=t.x; fi; + if t.y>maxy then maxy:=t.y; fi; + if t.y0 or c<=1 then exit; fi; + od; + if negatif then compt:=compt+1; fi; + call move(x+(4-compt)*8,y); + if negatif then call hascii(45); fi; + do + aux:=entier(val/c); + call hascii(48+aux); + val:=val-aux*c; + c:=c/10; + if c<1 then exit; fi; + od; +end outtextxy; + +unit imprimegraphe : procedure (t : noeud); + unit chaine : class(x,y: integer); + var last,next : chaine; + end chaine; +var r : noeud; +var et,c : integer; +var d,td,dd : boolean; +var suite : boolean; +var tt : noeud; +var p : chaine; +const cleft =-75; +const cright =-77; +const cup =-72; + + unit boite : procedure(cx,cy:integer); + begin + call move(cx-34,cy-10); + call draw(cx+42,cy-10); + call draw(cx+42,cy+10); + call draw(cx-34,cy+10); + call draw(cx-34,cy-10); + call move(cx+4,cy); + call draw(cx+4,cy+10); + end boite; + + unit imprimepartiel : procedure (t : noeud; cx,cy,px,py,c: integer; + inout suite : boolean;d : boolean); + var a : integer; + begin + if t<>none then + if (c=3 and (t.gauche<>none or t.droite<>none)) + then suite:=true; + fi; + call boite(cx,cy); + if c<>0 then call move(px+4,py+10);call draw(cx+4,cy-10);fi; + call outtextxy(t.x,cx-32,cy); + if d then call move(cx,cy-8);call hascii(72); + else call move(cx,cy-8);call hascii(86); fi; + call outtextxy(t.y,cx+8,cy); + if c<3 then + a:=entier(40*8/exp(ln(2)*(c+1))); + call imprimepartiel(t.gauche,cx-a,cy+80,cx,cy,c+1,suite,not d); + call imprimepartiel(t.droite,cx+a,cy+80,cx,cy,c+1,suite,not d); + if suite then call move(200,300); + call outstring("Appuyer sur une fleche pour la suite"); + fi; + fi; + + fi; + end imprimepartiel; + + Begin + if t<>none then + r:=t; + p:=new chaine(t.x,t.y); + kill(p.last); + call gron(nocard); + dd:=false; + do + et:=0; + suite:=false; + call imprimepartiel(r,314,10,-1,-1,et,suite,dd); + call move(60,320); + call outstring + ("<- ou 4:Branche gauche; -> ou 6:Branche droite;"); + call outstring("³ ou 8:Pere; <Ù:Menu;"); + call move(435,318); + call hascii(94); + c:=readkey; + call cls; + case c + when 52 : c:=cleft; + when 54 : c:=cright; + when 56 : c:=cup; + esac; + case c + when cleft : if r.gauche<>none then + r:=r.gauche; + p.next:=new chaine(r.x,r.y); + p.next.last:=p; + p:=p.next; + dd:=not dd; + fi; + when cright : if r.droite<>none then + r:=r.droite; + p.next:=new chaine(r.x,r.y); + p.next.last:=p; + p:=p.next; + dd:=not dd; + fi; + when cup : if p.last<>none then + dd:=not dd; + x:=p.last.x; + y:=p.last.y; + p:=p.last; + d:=false; + tt:=t; + while (tt<>none) + do + if ((tt.x=x) and (tt.y=y)) then exit; fi; + if d then td:=xnone then + if not(d) then + call line(lx,t.y,hx,t.y); + call croix(t); + call dessine(t.gauche,lx,hx,ly,t.y,not(d)); + call dessine(t.droite,lx,hx,t.y,hy,not(d)); + else + call line(t.x,ly,t.x,hy); + call croix(t); + call dessine(t.gauche,lx,t.x,ly,hy,not(d)); + call dessine(t.droite,t.x,hx,ly,hy,not(d)); + fi; + fi; +end dessine; + +unit croix: procedure (t:noeud); +begin + call move((t.x*ax+b)-2,(t.y*cx+d)-2); + call draw((t.x*ax+b)+2,(t.y*cx+d)+2); + call move((t.x*ax+b)-2,(t.y*cx+d)+2); + call draw((t.x*ax+b)+2,(t.y*cx+d)-2); +end croix; + +unit line : procedure (x1,y1,x2,y2 : integer); +begin + call move(entier(x1*ax+b),entier(y1*cx+d)); + call draw(entier(x2*ax+b),entier(y2*cx+d)); +end line; + + +unit readkey : function : integer; + var c : integer; +begin + do + c:=inkey; + if c<>0 then exit; fi; + od; + result:=c; +end readkey; + +unit clrscr : procedure; +begin + write( chr(27), "[2J") +end clrscr; + +unit normal:procedure; +begin + write(chr(27),"[0m"); +end normal; + +unit inverse:procedure; +begin + write(chr(27),"[7m"); +end inverse; + +unit writeliste : procedure(l :liste); +var i,c : integer; +begin + i:=0; + while lespoints<>none + do + writeln(lespoints.x,",",lespoints.y); + if lespoints.pred<>none then lespoints:=lespoints.pred; + else exit; + fi; + i:=i+1; + if (i mod 22)=0 then + call writexy(30,24,"Appuyez sur une touche"); + c:=readkey; + fi; + od; +end writeliste; + +unit lecture : procedure (inout x : integer); +begin + do + readln(x); + if x<=9999 and x>=-999 then exit; fi; + writeln(" Mauvaise coordonn‚e"); + od; +end lecture; + +unit afficheMenu:procedure(n : integer,inv : boolean); +begin + if inv then call inverse;fi; + case n + when 1 : call writexy(20,5,"Inserer un element "); + when 2 : call writexy(20,6,"Inserer plusieurs elements"); + when 3 : call writexy(20,7,"Recherche d' un element "); + when 4 : call writexy(20,8,"Range searching "); + when 5 : call writexy(20,9,"Affiche tous les elements "); + when 6 : call writexy(20,10,"Delete "); + when 7 : call writexy(20,11,"Efface arbre "); + when 8 : call writexy(20,12,"Affiche arbre "); + when 9 : call writexy(20,13,"Dessine Plan "); + when 10: call writexy(20,14,"Bye Bye "); + esac; + if inv then call normal;fi; +end afficheMenu; + +begin + arbre:= new bst2; + call arbre.insert(2,9); + call arbre.insert(11,1); + call arbre.insert(6,8); + call arbre.insert(3,3); + call arbre.insert(5,15); + call arbre.insert(8,11); + call arbre.insert(0,6); + call arbre.insert(7,4); + call arbre.insert(9,7); + call arbre.insert(14,5); + call arbre.insert(10,13); + call arbre.insert(16,14); + call arbre.insert(15,2); + call arbre.insert(13,16); + call arbre.insert(1,12); + call arbre.insert(12,10); + + + do + call clrscr; + call writexy(19,1,"ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»"); + for n:=2 to 14 do call writexy(19,n,"º º"); + od; + call writexy(19,15,"ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ"); + call writexy(31,2,"MENU"); + for n:=2 to 10 do call afficheMenu(n,false); + od; + n:=1; + call afficheMenu(n,true); + do + z:=readkey; + if z=-80 or z=50 then p:=n; + if n=10 then n:=1 else n:=n+1; fi; + call afficheMenu(n,true); + call afficheMenu(p,false); + fi; + if z=-72 or z=56 then p:=n; + if n=1 then n:=10 else n:=n-1; fi; + call afficheMenu(n,true); + call afficheMenu(p,false); + fi; + if z=13 then exit; + fi; + od; + case n + when 1 : call clrscr; + call writexy(10,2,"Inserer un element"); + write("x : "); call lecture(x); + write("y : "); call lecture(y); + call arbre.insert(x,y); + when 2 : call clrscr; + call writexy(10,2,"Inserer plusieurs elements"); + do + writeln("x : "); call lecture(x); + writeln("y : "); call lecture(y); + call arbre.insert(x,y); + write("Encore ? (ENTER/n)"); + writeln; + z:=readkey; + if z<>13 then exit;fi; + od; + when 3 : call clrscr; + call writexy(10,2,"Recherche d'un element"); + write("x : "); call lecture(x); + write("y : "); call lecture(y); + if (arbre.mb(x,y)) then + writeln("Cet element fait partie de l'arbre."); + else + writeln("Cet element ne fait pas partie de l'arbre."); + fi; + z:=readkey; + when 4 : call clrscr; + call writexy(10,2,"Range searching"); + writeln("x1,y1"); + writeln(" ÚÄÄÄÄÄÄÄÄÄÄ¿ "); + writeln(" ³ ³ "); + writeln(" ³ ³ "); + writeln(" ³ ³ "); + writeln(" ³ ³ "); + writeln(" ³ ³ "); + writeln(" ÀÄÄÄÄÄÄÄÄÄÄÙ "); + writeln(" x2,y2"); + write("x1 : "); call lecture(x1); + write("y1 : "); call lecture(y1); + write("x2 : "); call lecture(x2); + write("y2 : "); call lecture(y2); + if (x2none then + call writeliste(lespoints); + else + writeln(" Aucun points dans ce rectangle."); + fi; + z:=readkey; + when 5 : call clrscr; + call writexy(10,2,"Affiche tous les elements"); + call arbre.cadre(arbre.racine,x1,x2,y1,y2); + x1:=x1-1; x2:=x2+1; y1:=y1-1; y2:=y2+1; + kill(lespoints); + call arbre.twodrange(arbre.racine,x1,y1,x2,y2,false, + lespoints); + call writeliste(lespoints); + z:=readkey; + when 6 : call clrscr; + call writexy(10,2,"Suppression d'un element"); + write("x : "); call lecture(x); + write("y : "); call lecture(y); + if arbre.mb(x,y) then + call arbre.delete(x,y); + else + writeln("Element non trouve..."); + z:=readkey; + fi; + when 7 : call clrscr; + call writexy(10,2,"Destruction de l'arbre"); + writeln("Etes vous sur de vouloir detruire l'arbre ? (o/n)"); + readln(choix); + if choix='o' or choix='O' then + call arbre.killall(arbre.racine); + arbre:=new bst2; + fi; + when 8 : call clrscr; + call imprimegraphe(arbre.racine); + when 9 : call gron(nocard); + call cls; + call arbre.cadre(arbre.racine,x1,x2,y1,y2); + x1:=x1-1; x2:=x2+1; y1:=y1-1; y2:=y2+1; + ax:=maxx/(x2-x1); b:=-x1*ax; + cx:=maxy/(y2-y1); d:=-y1*cx; + call dessine(arbre.racine,x1,x2,y1,y2,false); + z:=readkey; + call groff; + when 10 : call clrscr; + exit;exit; + + esac; + od; +end; +end; (* end bst2 *) +end; (* end iiuwgraph *) + diff --git a/examples/examples.old/data.bas b/examples/examples.old/data.bas new file mode 100644 index 0000000..01f1575 --- /dev/null +++ b/examples/examples.old/data.bas @@ -0,0 +1,275 @@ +s'elever +to arise +etre +to be +battre +to beat +devenir +to become +commencer +to begin +plier +to bend +parier +to bet +lier +to bind +mordre +to bite +saigner +to bleed +souffler +to blow +casser +to break +apporter +to bring +construire +to build +bruler +to burn +eclater +to burst +acheter +to buy +jeter +to cast +attraper +to catch +choisir +to choose +s'accrocher +to cling +venir +to come +couter +to cost +ramper +to creep +couper +to cut +s'occuper de +to deal +creuser +to dig +faire +to do +dessiner +to draw +rever +to dream +boire +to drink +conduire +to drive +manger +to eat +tomber +to fall +se nourrir +to feed +ressentir +to feel +se battre +to fight +trouver +to find +lancer violemment +to fling +voler +to fly +interdire +to forbid +oublier +to forget +pardonner +to forgive +geler +to freeze +obtenir +to get +donner +to give +aller +to go +moudre +to grind +grandir +to grow +suspendre +to hang +avoir +to have +entendre +to hear +se cacher +to hide +frapper +to hit +tenir +to hold +faire mal +to hurt +garder +to keep +s'agenouiller +to kneel +savoir +to know +mettre +to lay +mener +to lead +apprendre +to learn +quitter +to leave +preter +to lend +permettre +to let +etre etendu +to lie +allumer +to light +perdre +to loose +fabriquer +to make +vouloir dire +to mean +rencontrer +to meet +payer +to pay +poser +to put +lire +to read +faire du velo +to ride +sonner +to ring +s'elever +to rise +courrir +to run +dire +to say +voir +to see +chercher +to seek +vendre +to sell +envoyer +to send +fixer +to set +coudre +to sew +secouer +to shake +briller +to shine +tirer +to shoot +montrer +to show +se retrecir +to shrink +fermer +to shut +chanter +to sing +sombrer +to sink +etre assis +to sit +tuer +to slay +dormir +to sleep +glisser +to slide +sentir +to smell +parler +to speak +epeler +to spell +depenser +to spend +repandre +to spill +touner +to spin +cracher +to spit +se fendre +to split +etaler +to spread +bondir +to spring +etre debout +to stand +derober +to steal +coller +to stick +piquer +to sting +puer +to stink +frapper +to strike +jurer +to swear +balayer +to sweep +nager +to swim +se balancer +to swing +prendre +to take +enseigner +to teach +dechirer +to tear +raconter +to tell +croire +to think +jeter +to throw +fouler +to tread +subir +to undergo +comprendre +to understand +se reveiller +to wake +porter +to wear +tisser +to weave +pleurer +to weep +gagner +to win +serpenter +to wind +se retirer +to withdraw +tordre +to wring +ecrire +to write + + + + + \ No newline at end of file diff --git a/examples/examples.old/data.dem b/examples/examples.old/data.dem new file mode 100644 index 0000000..3501e38 --- /dev/null +++ b/examples/examples.old/data.dem @@ -0,0 +1,91 @@ +etre +to be +devenir +to become +commencer +to begin +casser +to break +apporter +to bring +construire +to build +acheter +to buy +choisir +to choose +venir +to come +couter +to cost +faire +to do +boire +to drink +conduire +to drive +manger +to eat +trouver +to find +voler +to fly +interdire +to forbid +oublier +to forget +obtenir +to get +donner +to give +aller +to go +avoir +to have +apprendre +to learn +quitter +to leave +perdre +to loose +fabriquer +to make +rencontrer +to meet +payer +to pay +poser +to put +lire +to read +courrir +to run +dire +to say +voir +to see +dormir +to sleep +parler +to speak +depenser +to spend +etre debout +to stand +derober +to steal +prendre +to take +enseigner +to teach +raconter +to tell +jeter +to throw +comprendre +to understand +gagner +to win +ecrire +to write + \ No newline at end of file diff --git a/examples/examples.old/explan b/examples/examples.old/explan new file mode 100644 index 0000000..73ce88d --- /dev/null +++ b/examples/examples.old/explan @@ -0,0 +1,24 @@ +Les fichiers + +bbarbre1 et bbarbre2 sont a Mlles Beau et Delburg + +projli1 data.bas data.dem sont a MM Fernandez et Paul +projet.log est a M. Vautor + +go.bat et texte.log sont a M. Bianconi + +bidim.log est a MM. Debiard et Berthou + egaint bidim + +bicolore.log est a Mlles Chicher et Dome + egaint bicolore +avl.log est a MM Gougeon et J.Richard + egaint avl + +hull.log est a M. Jouanny +proj_li1.log est MM. Bourgeat et Mandonnaud + + +envoyees par mail +barb.log de la part de MM Ait Abdelhalim et Baradat ou? +li07 par F.A'ch \ No newline at end of file diff --git a/examples/examples.old/geometri.log b/examples/examples.old/geometri.log new file mode 100644 index 0000000..d4d2f1a --- /dev/null +++ b/examples/examples.old/geometri.log @@ -0,0 +1,1009 @@ + +program geometrie; + + +(***************************************************************************) +(* DULON Benjamin *) +(* CORITON Willy *) +(* Licence Informatique *) +(* Groupe 1 *) +(* *) +(* P R O J E T L I 1 *) +(* *) +(* **** **** **** * * **** ***** **** * **** *) +(* * * * * * * * * * * * * * *) +(* * ** ** * * * * ** * **** * ** *) +(* * * * * * * * * * * * * * *) +(* **** **** **** * * **** * * * * **** *) +(* *) +(***************************************************************************) + +BEGIN + +(************************************************************) +(* CLASSE DEFINISSANT LES PROCEDURES DE GRAPHISME UTILISEES *) +(************************************************************) +pref IIUWGRAPH block + + (*---------------------------------------------------*) + (* PROCEDURE permettant d'utiliser le mode GRAPHIQUE *) + (*---------------------------------------------------*) + unit initgraph : procedure; + begin + CALL GRON(1); + end initgraph; + + (*---------------------------------------------------*) + (* PROCEDURE permettant de fermer le mode GRAPHIQUE *) + (*---------------------------------------------------*) + unit closegraph : procedure; + begin + CALL GROFF; + end closegraph; + + (*-----------------------------------------------------------------*) + (* AFFICHAGE en (x,y) d'un RECTANGLE de longueur l et de hauteur h *) + (*-----------------------------------------------------------------*) + unit rectangle : procedure(x,y,l,h : integer); + begin + call move(x,y); + call draw (x+l,y); + call draw(x+l,y+h); + call draw(x,y+h); + CALL DRAW(x,y); + end rectangle; + + (*--------------------------------------------------------------------*) + (* Definition du repere orthonorme *) + (*--------------------------------------------------------------------*) + Unit reportho:procedure; + begin + call move(425,10); + call draw(425,294); + call move(225,154); + call draw(625,154); + end reportho; + + (*--------------------------------------------------------------------*) + (* ECRITURE d'une CHAINE de caracteres sur l'ecran graphique en (x,y) *) + (*--------------------------------------------------------------------*) + unit ecrit_text : procedure(x,y : integer;str : string); + var ch : arrayof character, + lg,i : integer; + begin + call move (x,y); + ch := unpack(str); + lg := upper(ch) - lower(ch) + 1; + for i := 1 to lg do + call hascii(0); + call hascii(ord(ch(i))); + od; + end ecrit_text; + + (*---------------------------------*) + (* LECTURE d'une touche au clavier *) + (*---------------------------------*) + unit inchar : function : integer; + var i : integer; + begin + do + i := inkey; + if i =/= 0 then exit; + fi; + od; + result := i; + end inchar; + + (*-------------------------------------------------------------------*) + (* LECTURE d'un ENTIER au clavier et AFFICHAGE sur l'ecran graphique *) + (*-------------------------------------------------------------------*) + unit lire_entier: function(x,y:real):real; + var nbchiffre,key,i : integer, valeur : real, negatif : boolean; + begin + negatif := false; + valeur:=0; + call move(x,y); + for i:=1 to 4 + do + call hascii(0); + od; + call move(x,y); + DO + (* Lecture de la touche *) + key := inchar; + if key = 45 then negatif := true ; + call hascii(key); + fi; + if (key >= 48 and key <= 57) + then + call hascii(key); + (* Saisie de chiffres *) + if (nbchiffre < 3 ) + then + valeur := valeur*10 + key - 48; + fi; + fi; + + if (key = 27) or (key = 13) (* touche ESC ou RETOUR chariot *) + then exit; + fi; + od; + if negatif then result := -valeur + else + result:=valeur; + fi; + end lire_entier; + + (*---------------------------------------------------------------------*) + (* ECRITURE d'un ENTIER sur l'‚cran graphique au coordonn‚es courantes *) + (*---------------------------------------------------------------------*) + unit ecrit_entier : procedure (posx,posy:integer, x : real); + var val,i,j,val2 : integer, + ch,ch2 : arrayof character, + dec:boolean; + begin + array ch dim(1:4); + array ch2 dim(1:4); + for i:=1 to 4 + do + ch(i):=chr(48); + ch2(i):=chr(48); + od; + i := 4; + j:=4; + + val:=entier(x); + val2:=x-val; + + do + ch(i) := chr(48+(val mod 10)); + val := val div 10; + if (val = 0) then exit; fi; + i := i - 1; + od; + if val2 = 0 then + dec:=true; + else + do + ch2(i):= chr(48+(val2 mod 10)); + val2:= val2 div 10; + if (val2 = 0) then exit; fi; + j := j - 1; + od; + fi; + if x < 0 + then + call hascii(0); + call hascii(45); + posx:=posx+4; + fi; + + while i <= 4 + do + posx:=posx+i; + call move(posx,posy); + call hascii(0); + call hascii(ord(ch(i))); + i := i + 1; + od; + if not dec then + call move(posx+8,posy); + call hascii(0); + call hascii(46); + while j <= 4 + do + call move(posx+8*(j+1),posy); + call hascii(0); + call hascii(ord(ch2(j))); + j := j + 1; + od; + fi; + end ecrit_entier; + + (* + unit ecrit_entier : procedure (x:real); + + var i,j,n,tail : integer, + ch : arrayof character, + ok:boolean; + begin + tail:=0; + array ch dim(1:7); + for i:=1 to 7 do ch(i):=chr(48); od; + i := 7; + j:=1; + n:=x*100; + do; + ch(i):=chr(48+(n mod 10)); + n:=n div 10; + tail:=tail+1; + i:=i-1; + if (n=0) then exit; fi; + od; + if tail<3 then + ch(j):=chr(48); + i:=1; + else + for i:=1 to tail-2 + do + ch(i+j-1):=ch(i+8-j-tail); + od; + fi; + ch(i+j):='.'; + ch(i+j+1):=ch(6); + ch(i+j+2):=ch(7); + if ok then tail:=tail+1; fi; + for i:=1 to tail+j + do + call hascii(0); + call hascii(ord(ch(i))); + od; + end ecrit_entier;*) + + (*----------------------------------------------------------------*) + (* PROCEDURE EQUATION QUI RENVOIE LES COORDONNEES DE DEUX DROITES *) + (*----------------------------------------------------------------*) + unit equation:procedure(output x1,y1,x2,y2:real); + begin + call ecrit_text(430,320,"abscisse premier point: "); + x1:=lire_entier(622,320); + call ecrit_text(430,330,"ordonnee premier point: "); + y1:=lire_entier(622,330); + call ecrit_text(430,320," "); + call ecrit_text(430,330," "); + call ecrit_text(430,320,"abscisse deuxieme point: "); + x1:=lire_entier(622,320); + call ecrit_text(430,330,"ordonnee deuxieme point: "); + y1:=lire_entier(622,330); + call ecrit_text(430,320," "); + call ecrit_text(430,330," "); + end equation; + + (*---------------------------------------------------------------*) + (* PROCEDURE EQUAT QUI SAISIE LES COORDONNEES A B C DE LA DROITE *) + (*---------------------------------------------------------------*) + unit equat:procedure(output a,b,c:real); + begin + call ecrit_text(470,317,"valeur de a: "); + a:=lire_entier(574,317); + call ecrit_text(470,327,"valeur de b: "); + b:=lire_entier(574,327); + call ecrit_text(470,337,"valeur de c: "); + c:=lire_entier(574,337); + call ecrit_text(470,317," "); + call ecrit_text(470,327," "); + call ecrit_text(470,337," "); + end equat; + + (*--------------------------------*) + (* PROCEDURE DE SAISIE D'UN POINT *) + (*--------------------------------*) + unit def_point:procedure(output x1,y1:real); + + begin + call ecrit_text(500,320,"Abscisse: "); + x1:=lire_entier(580,320); + call ecrit_text(500,330,"Ordonnee: "); + y1:=lire_entier(580,330); + call ecrit_text(500,320," "); + call ecrit_text(500,330," "); + end def_point; + + (*--------------------------------------------------------*) + (* PROCEDURE SOMMAIRE DES DIFFERENTES FONCTIONS PROPOSEES *) + (*--------------------------------------------------------*) + unit sommaire:procedure; + begin + call rectangle(1,0,210,306); + call ecrit_text (2,10," SOMMAIRE"); + call ecrit_text (2,40," 1: Forme geometrique"); + call ecrit_text (2,60," 2: Dessiner cercle"); + call ecrit_text (2,80," 3: Intersection droites"); + call ecrit_text (2,100," 4: Parallelisme "); + call ecrit_text (2,120," 5: Perpendicularite"); + call ecrit_text (2,140," 6: Point appart. droite"); + call ecrit_text (2,160," 7: Point appart. cercle"); + call ecrit_text (2,180," 8: Intersection cercles"); + call ecrit_text (2,200," 9: Points/droite"); + call ecrit_text (2,220," 10: Quitter"); + call ecrit_text (2,250," Votre choix : "); + end sommaire; + + unit ecran:procedure; + begin + call cls; + call sommaire; + call texte; + call graphique; + end ecran; + + unit graphique:procedure; + begin + call reportho; + call rectangle(215,0,420,306); + end graphique; + + unit texte:procedure; + begin + call rectangle(1,307,635,42); + end texte; + + (*---------------------------------------------------*) + (* PROCEDURE POUR SAISIR LES COORDONNEES D'UN CERCLE *) + (*---------------------------------------------------*) + unit def_cercle:procedure(output x1,y1,r:real); + begin + call ecrit_text(350,325,"Rayon: "); + r:=lire_entier(406,325); + call ecrit_text(450,320,"Abscisse du centre: "); + x1:=lire_entier(610,320); + call ecrit_text(450,330,"Ordonnee du centre: "); + y1:=lire_entier(610,330); + call ecrit_text(350,325," "); + call ecrit_text(450,320," "); + call ecrit_text(450,330," "); + end def_cercle; + + (*----------------------------------*) + (* PROCEDURE DE DESSIN D'UNE DROITE *) + (*----------------------------------*) + unit des_droite:procedure(a,b,c:real;output pb:boolean); + begin + pb:=false; + if b=0 then + if a=0 then + pb:=true; + else + call move(425-10*c/a,5); + call draw(425-10*c/a,295); + fi; + else + call move(625,154+10*((c+20*a)/b)); + call draw(225,154+10*((c-20*a)/b)); + fi; + end des_droite; + + (*------------------------------------------*) + (* PROCEDURE MISE EN ATTENTE MODE GRAPHIQUE *) + (*------------------------------------------*) + unit attente:procedure; + var reponse,rep:integer; + begin + call ecrit_text (20,295,"< TAPER SUR ENTREE >"); + reponse := inkey; (*:=lire_entier(180,295);*) + (*reponse := rep + 48 -rep*10;*) + while reponse<>13 + do + (*rep:=lire_entier(180,295);*) + reponse := inkey ; (*rep + 48 -rep*10;*) + od; + end attente; + + +(********************************************************) +(* CLASSE DEFINISSANT LES FORMES GEOMETRIQUES UTILISEES *) +(********************************************************) + +unit geoplan :CLASS; + +(*---------------------*) +(* DEFINITION DU POINT *) +(*---------------------*) +unit pt:class(x,y:real); + + unit equal:function(q:pt):boolean; + (* renvoie une valeur booleenne sur l'egalite de deux points *) + + begin + result:=((q.x=x) and (q.y=y)); + end equal; + + unit dist:function(p:pt):real; + (* renvoie la distance entre deux points *) + begin + if p=none + then + call erreur; + else + result:=sqrt((x-p.x)*(x-p.x)+(y-p.y)*(y-p.y)); + fi; + end dist; + + unit memecote:function(l:line,p1:pt):boolean; + (* vrai si les deux points sont du meme cote de la droite *) + + var dx1,dx2:real; + begin + dx1:=l.a*p1.x+l.b*p1.y+l.c; + dx2:=l.a*x+l.b*y+l.c; + if (dx1>0 and dx2>0) or (dx1<0 and dx2<0) + then + result:= true; + else + result:=false; + fi; + end memecote; + + unit calculeq:procedure(p1:pt;output a,b,c:real); + (* calcul l'equation de la droite en fonction des deux points *) + + begin + a:=y-p1.y; + b:=p1.x-x; + c:=x*p1.y - p1.x*y; + end calculeq; + + unit virtual erreur:procedure; + begin + call ecrit_text(200,325,"Il n'y a pas de point"); + end erreur; + +end pt; + +(*----------------------*) +(* DEFINITION DU CERCLE *) +(*----------------------*) +unit cercle :class(q:pt,r:real); + + unit intersec:function(c:cercle):line; + (* renvoie la ligne d'intersection entre deux cercles *) + + var r1,r2:real; + begin + if c<> none + then + r1:=-r*r-q.x*q.x-q.y*q.y; + r2:=c.r*c.r-c.q.x*c.q.x-c.q.y*c.q.y; + result:=new line(q.x-c.q.x,q.y-c.q.y,(r1-r2)/2); + else + call erreur; + fi; + end intersec; + + unit ptappartcercle:function(p:pt,epsilon:real):boolean; + (* renvoie une valeur booleenne sur l'appartenance de p au cercle *) + + begin + if (p.x-q.x)*(p.x-q.x) + (p.y-q.y)*(p.y-q.y) >= (r-epsilon)*(r-epsilon) + and (p.x-q.x)*(p.x-q.x) + (p.y-q.y)*(p.y-q.y) <= (r+epsilon)*(r+epsilon) + then + result:=true; + else + result:=false; + fi; + end ptappartcercle; + + unit virtual erreur:procedure; + begin + call ecrit_text(200,325,"Il n'y a pas de cercles"); + writeln("Il n'y a pas de cercle"); + end erreur; + +end cercle; + +(*-------------------------*) +(* DEFINITION DE LA DROITE *) +(*-------------------------*) +unit line:class(a,b,c:real); + + unit meet:function(l:line):pt; + (* renvoie le point d'intersection de deux droites *) + + var t:real; + begin + if parallele(l) then + call ecrit_text(200,325,"Les deux droites sont paralleles"); + else + if l<> none + then + t:=1/(l.a*b-l.b*a); + result:=new pt((c*l.b-b*l.c)/t,(a*l.c-c*l.a)/t); + else call erreur; + fi; + fi; + end meet; + + unit parallele:function(l:line):boolean; + (* renvoie une valeur booleenne sur le parallelisme de deux droites *) + + begin + if l <> none + then + if a*l.b -b*l.a=0 + then + result:=true; + else + result:=false; + fi; + else call erreur; + fi; + end parallele; + + unit perpendiculaire:function(l:line):boolean; + (* renvoie une valeur booleenne sur la perpendicularite de deux droites *) + + begin + if l <> none + then + if a*l.a + b*l.b=0 + then + result:=true; + else + result:=false; + fi; + else call erreur; + fi; + end perpendiculaire; + + unit ptappartligne:function(p:pt):boolean; + (* renvoie une valeur booleenne sur l'appartenance de p a la droite *) + + begin + if a*p.x + b*p.y +c=0 + then + result:=true; + else + result:=false; + fi; + end ptappartligne; + + unit virtual erreur:procedure; + begin + call ecrit_text(200,325,"Pas de droite"); + end erreur; + +var d:real; +begin + d:=sqrt(a*a+b*b); + if d<>0 + then + a:=a/d; + b:=b/d; + c:=c/d; + fi; +end line; + +END geoplan; + + +(*---------------------------------------------------------*) +(* PROCEDURE GOTOXY POUR DEPLACER LE CURSEUR EN MODE TEXTE *) +(*---------------------------------------------------------*) +unit gotoxy:procedure(ligne,colonne:integer); +var i,j:integer, + c,d,e,f:char; + +begin + + i:=ligne div 10; + j:=ligne mod 10; + c:=chr(48+i); + d:=chr(48+j); + i:=colonne div 10; + j:=colonne mod 10; + e:=chr(48+i); + f:=chr(48+j); + + write(chr(27), "[",c,d,";",e,f,"H"); +end gotoxy; + +(*----------------------------------------------*) +(* PROCEDURE POUR EFFACER L'ECRAN EN MODE TEXTE *) +(*----------------------------------------------*) +unit effacecran:procedure; +begin + write(chr(27),"[2J"); +end effacecran; + +(*--------------------------------------------------------*) +(* PROCEDURE POUR METTRE L'ECRAN EN ATTENTE EN MODE TEXTE *) +(*--------------------------------------------------------*) +unit attent:procedure; +var reponse:char; +begin + call gotoxy(25,45); + writeln("taper sur entree"); + reponse:='r'; + while reponse='r' + do + read(reponse); + od; +end attent; + + +(*****************************************************************************) +(* PROGRAMME PRINCIPAL *) +(*****************************************************************************) + +begin +pref geoplan block + +const epsilon=0.1; +var p,q,centre,p1,p2:pt, + l2,l1:line, + c2,c3:cercle, + x1,y1,x2,y2,r,a,b,c,a1,b1,c1:real, + ch,n,rep,rep2,i:integer, + fin,pb,pb1:boolean, + t:arrayof arrayof real, + tab1,tab2: arrayof integer; + +begin + call effacecran; + call gotoxy(3,10); + writeln("CORITON willy"); + call gotoxy(5,10); + writeln("DULON Benjamin"); + call gotoxy(7,10); + writeln("Licence informatique"); + call gotoxy(9,10); + writeln("Groupe 1"); + call gotoxy(12,10); + writeln("PROJET LI1"); + call gotoxy(13,10); + writeln("----------"); + call gotoxy(16,10); + writeln("***** ***** ***** ** ** ***** ***** ***** * *****"); + call gotoxy(17,10); + writeln("* * * * * ** * * * * * * * "); + call gotoxy(18,10); + writeln("* *** ** * * * * ** * ***** * ** "); + call gotoxy(19,10); + writeln("* * * * * * * * * * * * * "); + call gotoxy(20,10); + writeln("***** ***** ***** * * ***** * * * * *****"); + call attent; + + (* OUVERTURE DU MODE GRAPHIQUE *) + call initgraph; + rep:=0; + fin:=false; + while not fin + do + rep:=0; + while rep<=0 or rep>10 + do + call ecran; + rep:=lire_entier(160,250); + case rep + (* dessiner une forme *) + when 1: call ecrit_text(10,325,"Combien de sommets : "); + n := lire_entier(178,325); + array t dim(1:n); + for i:=1 to n + do + array t(i) dim (1:2); + od; + for i:=1 to n + do + call ecrit_text(250,315,"Pour le point numero "); + call hascii(0); + call hascii(i); + call ecrit_text(250,325,"Abscisse: "); + t(i,1):= lire_entier(338,325); + call ecrit_text(250,335,"Ordonn‚e: "); + call ecrit_text(250,325," "); + call ecrit_text(250,335," "); + t(i,2):= lire_entier(338,335); + od; + call move(10*t(1,1)+425,154-10*t(1,2)); + for i:=2 to n + do + call draw(10*t(i,1)+425,154-10*t(i,2)); + od; + call draw(10*t(1,1)+425,154-10*t(1,2)); + rep:=0; + CALL ecrit_text (20,295,"< TAPER SUR ENTREE >"); + call attente; + + (* dessiner un cercle *) + when 2: call def_cercle(x1,y1,r); + call point(x1*10+425,154-y1*10); + call cirb(x1*10+425,154-y1*10,r*10,0,0,15,0,1,1); + p1:=new pt(x1,y1); + c2:= new cercle(p1,r); + call ecrit_text (20,295,"< TAPER SUR ENTREE >"); + call attente; + rep:=0; + + (* intersection de deux droites *) + when 3: call ecrit_text(10,325,"Equation/P (1/2): "); + rep2:=lire_entier(154,325); + if rep2 = 2 + then + call ecrit_text(280,325,"Premiere droite"); + call equation(x1,y1,x2,y2); + p1:= new pt(x1,y1); + p2:= new pt(x2,y2); + call p1.calculeq(p2,a,b,c); + call ecrit_text(280,325,"Deuxieme droite"); + call equation(x1,y1,x2,y2); + p1:= new pt(x1,y1); + p2:= new pt(x2,y2); + call p1.calculeq(p2,a1,b1,c1); + else + call ecrit_text(200,325,"Coordonnes premiere droite"); + call equat(a,b,c); + call ecrit_text(200,325,"Coordonnes deuxieme droite"); + call equat(a1,b1,c1); + fi; + + l1:= new line(a,b,c); + l2:= new line(a1,b1,c1); + centre:=l1.meet(l2); + + array tab1 dim(1:5000); + call move(1,307); + tab1:=getmap(636,349); + call des_droite(a,b,c,pb); + call des_droite(a1,b1,c1,pb1); + call move(1,307); + call putmap(tab1); + + if pb or pb1 then + call ecrit_text(250,325,"Probleme de saisie de droite "); + else + if centre=/=none + then + call ecrit_text(200,325,"Le point d'intersection a pour coordonnee : "); + call ecrit_entier(560,325,centre.x); + (* call ecrit_entier(560,335,centre.y); *) + else + call ecrit_text(200,325,"Il n'y a pas de point d'intersection"); + fi; + fi; + rep:=0; + CALL ecrit_text (20,295,"< TAPER SUR ENTREE >"); + call attente; + + (* parallelisme de deux droites *) + when 4: call ecrit_text(10,325,"Equation/P (1/2): "); + rep2:=lire_entier(154,325); + if rep2 = 2 + then + call ecrit_text(280,325,"Premiere droite"); + call equation(x1,y1,x2,y2); + p1:= new pt(x1,y1); + p2:= new pt(x2,y2); + call p1.calculeq(p2,a,b,c); + call ecrit_text(280,325,"Deuxieme droite"); + call equation(x1,y1,x2,y2); + p1:= new pt(x1,y1); + p2:= new pt(x2,y2); + call p1.calculeq(p2,a1,b1,c1); + else + call ecrit_text(280,325,"Premiere droite"); + call equat(a,b,c); + call ecrit_text(280,325,"Deuxieme droite"); + call equat(a1,b1,c1); + fi; + + l1:= new line(a,b,c); + l2:= new line(a1,b1,c1); + + array tab1 dim(1:5000); + call move(1,307); + tab1:=getmap(636,349); + call des_droite(a,b,c,pb); + call des_droite(a,b,c,pb1); + call move(1,307); + call putmap(tab1); + + if pb or pb1 then + call ecrit_text(250,325,"Probleme de saisie de droite "); + else + if l1.parallele(l2) + then + call ecrit_text(280,325,"Les droites sont paralleles"); + else + call ecrit_text(280,325,"Les droites ne sont pas paralleles"); + fi; + fi; + rep:=0; + call ecrit_text (20,295,"< TAPER SUR ENTREE >"); + call attente; + + (* perpendicularite de deux droites *) + when 5: call ecrit_text(10,325,"Equation/P (1/2): "); + rep2:=lire_entier(154,325); + if rep2 = 2 + then + call ecrit_text(280,325,"Premiere droite"); + call equation(x1,y1,x2,y2); + p1:= new pt(x1,y1); + p2:= new pt(x2,y2); + call p1.calculeq(p2,a,b,c); + call ecrit_text(280,325,"Deuxieme droite"); + call equation(x1,y1,x2,y2); + p1:= new pt(x1,y1); + p2:= new pt(x2,y2); + call p1.calculeq(p2,a1,b1,c1); + else + call ecrit_text(280,325,"Premiere droite"); + call equat(a,b,c); + call ecrit_text(280,325,"Deuxieme droite"); + call equat(a1,b1,c1); + fi; + + array tab1 dim(1:5000); + call move(1,307); + tab1:=getmap(636,349); + call des_droite(a,b,c,pb); + call des_droite(a,b,c,pb); + call move(1,307); + call putmap(tab1); + l1:= new line(a,b,c); + l2:= new line(a1,b1,c1); + + if pb or pb1 then + call ecrit_text(250,325,"Probleme de saisie de droite "); + else + if l1.perpendiculaire(l2) + then + call ecrit_text(280,325,"Les droites sont perpendiculaires"); + else + call ecrit_text(280,325,"Les droites ne sont pas perpendiculaires"); + fi; + fi; + rep:=0; + call ecrit_text (20,295,"< TAPER SUR ENTREE >"); + call attente; + + (* appartenance d'un point a une droite *) + when 6: call ecrit_text(10,320,"Determination de la droite"); + call ecrit_text(10,330,"Equation/P (1/2): "); + rep2:=lire_entier(154,330); + if rep2 = 2 + then + call equation(x1,y1,x2,y2); + p1:= new pt(x1,y1); + p2:= new pt(x2,y2); + call p1.calculeq(p2,a,b,c); + else + call ecrit_text(300,325,"Coordonnees droite"); + call equat(a,b,c); + fi; + call ecrit_text(300,325,"Coordonnees point "); + call def_point(x1,y1); + p1:= new pt(x1,y1); + l1:= new line(a,b,c); + call point(x1,y1); + + array tab1 dim(1:5000); + call move(1,307); + tab1:=getmap(636,349); + call des_droite(a,b,c,pb); + call move(1,307); + call putmap(tab1); + + if pb + then + call ecrit_text(250,325,"Probleme de saisie de la droite "); + else + if l1.ptappartligne(p1) + then + call ecrit_text(250,325,"Le point appartient a la droite"); + else + call ecrit_text(250,325,"Le point n'appartient pas a la droite"); + fi; + fi; + rep:=0; + call ecrit_text (20,295,"< TAPER SUR ENTREE >"); + call attente; + + (* appartenance d'un point a un cercle *) + when 7: call ecrit_text(200,325,"Determination du point"); + call def_point(x1,y1); + p1:=new pt(x1,y1); + call point(454+10*x1,154-10*y1); + call ecrit_text(200,325," "); + call ecrit_text(100,325,"Determination du cercle"); + call def_cercle(x1,y1,r); + call point(x1*10+425,154-y1*10); + call cirb(x1*10+425,154-y1*10,r*10,0,0,15,0,1,1); + p2:=new pt(x1,y1); + c2:= new cercle(p2,r); + call ecrit_text(100,325," "); + + if c2.ptappartcercle(p1,epsilon) + then + call ecrit_text(250,325,"Le point appartient au cercle"); + else + call ecrit_text(250,325,"Le point n'appartient pas au cercle"); + fi; + rep:=0; + call ecrit_text (20,295,"< TAPER SUR ENTREE >"); + call attente; + + (* intersection entre deux cercles *) + when 8: call ecrit_text(10,325,"Pour le premier cercle"); + call def_cercle(x1,y1,r); + call point(x1*10+425,154-y1*10); + call cirb(x1*10+425,154-y1*10,r*10,0,0,15,0,1,1); + p1:=new pt(x1,y1); + c2:= new cercle(p1,r); + call ecrit_text(10,325,"Pour le second cercle "); + call def_cercle(x1,y1,r); + call point(x1*10+425,154-y1*10); + call cirb(x1*10+425,154-y1*10,r*10,0,0,15,0,1,1); + p2:=new pt(x1,y1); + c3:= new cercle(p2,r); + + l1:=c2.intersec(c3); + call ecrit_text(10,325," "); + call ecrit_text(200,325,"La droite a pour equation"); + rep:=0; + call ecrit_text (20,295,"< TAPER SUR ENTREE >"); + call attente; + + (* deux points d'un meme cote d'une droite *) + when 9: call ecrit_text(10,320,"Determination de la droite"); + call ecrit_text(10,330,"Equation/P (1/2): "); + rep2:=lire_entier(154,330); + if rep2 = 2 + then + call equation(x1,y1,x2,y2); + p1:= new pt(x1,y1); + p2:= new pt(x2,y2); + call p1.calculeq(p2,a,b,c); + else + call ecrit_text(280,325,"Coordonnees droite"); + call equat(a,b,c); + fi; + call ecrit_text(280,325,"Coordonnees premier point "); + call def_point(x1,y1); + call point(425+10*x1,154-10*y1); + p1:= new pt(x1,y1); + call ecrit_text(280,325,"Coordonnees second point "); + call def_point(x1,y1); + call point(425+10*x1,154-10*y1); + p2:= new pt(x1,y1); + + array tab1 dim(1:5000); + call move(1,307); + tab1:=getmap(636,349); + call des_droite(a,b,c,pb); + call move(1,307); + call putmap(tab1); + + l1:= new line(a,b,c); + if pb + then + call ecrit_text(250,325,"Probleme de saisie de la droite "); + else + if p1.memecote(l1,p2) + then + call ecrit_text(280,325,"Les deux points sont du meme cote"); + else + call ecrit_text(280,325,"Les deux points ne sont pas du meme cote"); + fi; + fi; + rep:=0; + call ecrit_text (20,295,"< TAPER SUR ENTREE >"); + call attente; + + (* quitter *) + when 10: ch:=0; + while ch<1 or ch>2 + do + call ecrit_text(10,325,"Voulez-vous vraiment : "); + call ecrit_text(220,320,"1: Quitter le programme "); + call ecrit_text(220,335,"2: Continuer "); + call ecrit_text(450,325,"Votre choix : "); + ch:=lire_entier(562,325); + call ecrit_text (20,295,"< TAPER SUR ENTREE >"); + case ch + when 1: fin:=true; + when 2: exit;exit;rep:=0; + esac; + od; + esac; + od; + od; + + (* FERMETURE DU MODE GRAPHIQUE *) + call closegraph; +end; +end; +end; +end geometrie; diff --git a/examples/examples.old/hull.log b/examples/examples.old/hull.log new file mode 100644 index 0000000..f96cf99 --- /dev/null +++ b/examples/examples.old/hull.log @@ -0,0 +1,593 @@ + program hull; + (*******************************************************************) + (* OUTILS CONCERNANT L'AFFICHAGE DU TEXTE A L'ECRAN *) + (*******************************************************************) + + (* Efface l'ecran et positionne le curseur en haut a gauche *) + UNIT CLS : PROCEDURE; + BEGIN + WRITE( chr(27), "[2J"); + END CLS; + + + (* Affiche du texte en video inverse *) + UNIT Reverse : PROCEDURE; + BEGIN + WRITE( chr(27), "[7m"); END Reverse; + + + (* Affiche du texte en clignotant *) + UNIT Blink : PROCEDURE; + BEGIN + WRITE( chr(27), "[5m"); + END Blink; + + + (* Affiche le texte de maniere normale *) + UNIT Normal : PROCEDURE; + BEGIN + WRITE( chr(27), "[0m") + END Normal; + + + (* Positionne le curseur sur un emplacement de l'ecran *) + + UNIT Setcursor : PROCEDURE (row,column : INTEGER); + VAR c,d,e,f : CHAR, + i,j : INTEGER; + BEGIN + i:=row div 10; + j:=row mod 10; + c:=chr(48+i); + d:=chr(48+j); + i:=column div 10; + j:=column mod 10; + e:=chr(48+i); + f:=chr(48+j); + + Write(chr(27), "[",c,d, ";",e,f, "H"); + END Setcursor; + + (* Unite qui sert a tracer un cadre *) + + unit cadre: procedure (x1,y1,x2,y2 : integer); + var i , j : integer; + Begin + for i := x1 to x2 do + call setcursor(i,y1); + write("*"); + od; + for i := x1 to x2 do + call setcursor(i,y2); + write ("*"); + od; + for i := y1 to y2 do + call setcursor(x1,i); + write ("*"); + od; + for i := y1 to y2 do + call setcursor(x2,i); + write ("*"); + od; + End cadre; + + (**************************** CADRE_T **********************************************) + unit cadre_t : procedure; + begin + call cls; + call cadre (1,1,30,85); + call cadre (2,20,4,70); + call setcursor (3,40); + CALL reverse; + write ("ENVELOPPE CONVEXE "); + CALL normal; + end cadre_t; + + (************************** FIN CADRE_T *********************************************) + + (*************************** PRESENTS_1*********************************************) + unit presents_1 : procedure; + begin + call cadre_t; + call setcursor (10,40); + write (" projet realise par : "); + call setcursor (10,60); + Write (" JOUANNY jean-pierre "); + call setcursor(14,40); + Write (" LICENCE INFORMATIQUE "); + + end presents_1; + (************************** FIN PRESENTS_1 *****************************************) + + + + (***************************** MENU *************************************************) + unit menu : procedure; + begin + call cls; + call setcursor(10,30); + write("1 : PACKED WRAPPING"); + CALL SETCURSOR(12,30); + WRITE("2 : GRAHAM_SCAN"); + CALL SETCURSOR(14,30); + WRITE("3 : SORTIR"); + CALL CADRE(30,1,32,80); + CALL SETCURSOR(34,30); + WRITE("ACTION : ") + END MENU; + +(************************** FIN MENU **********************************************) + +(* unit exprimant un point en coordonnees cartesiennes*) +unit pixl:class(ab,ordo:real);end pixl; + +(* unit exprimant un point en coordonnees polaires *) +unit point:class(p:pixl,teta:real); end point; + +(***********************************************************) +(* unit qui permettra a l utilisateur de saisir des points *) +(***********************************************************) +unit lecture:function(i:integer):pixl; + begin + result:=new pixl(0,0); + call cls; + call setcursor(10,30); + write("entrez l'abcisse n:",i,":" ); + read (result.ab); + call setcursor(15,30); + write("entrez l'ordonnee n:",i,":" ); + read(result.ordo); + end lecture; +(***********************************************************) +(*unit graphe est une classe qui contiendra les procedures *) +(* et les fonctions destinees dans le cadre de la methode *) +(* de "package wrapping" ou enveloppe a calculer les points*) +(* de l'enveloppe convexe *) +(***********************************************************) +unit graphe:class(function readelem(i:integer):pixl); +(***********************************************************) +(* unit lire est destinee a initialiser le tableau qui *) +(* contiendra les points du nuage. *) +(***********************************************************) + unit lire:procedure(output g:arrayof pixl;input n:integer); + var + i:integer; + begin + array g dim(1:100); (* initialisation du tableau de sortie *) + for i:=1 to n do + g(i):=readelem(i); (* utilisation de la fonction readelem passee + comme parametre d'entree dans la classe + graphe. *) + od; + end lire; + +(******************************************************************) +(* cette fonction est destinee a convertir les gradients en degre *) +(******************************************************************) +unit degre:function(x:real):real; + begin + result:=(x/3.14)*180; + end degre; +(******************************************************************) +(* cette fonction appelee "angle_montant" calcule a partir des *) +(* coordonnees d'un point l'angle que ce dernier formera avec *) +(* l'horizontale. *) +(******************************************************************) +unit angle_montant:function(variable:pixl):real; + var + distance:integer,pi,teta:real; + begin + pi:=3.14; + if variable.ab=0 then + result:=degre(pi/2); + else + teta:=atan((variable.ordo)/(variable.ab)); + (*la fonction arc tangente permet a partir du rapport cote oppose + sur cote adjacent de donner l'angle en radient. *) + if variable.ordo>0 then + if (variable.ab <0) then + result:=degre(pi+teta); (*transformation de l'angle negatif + en sa valeur positive d'angle + obtus. *) + else + result:=degre(teta); + fi; + else + if variable.ab<0 then + result:=degre(pi+teta); + else + result:=degre(2*pi+teta); + fi; + fi + fi; + end angle_montant; + +(********************************************************************) +(* cette fonction determine de bas en haut les points appartenant a *) +(* l'enveloppe convexe. *) +(********************************************************************) +unit calcul_montant:procedure(output gt:arrayof pixl;inout cpt:integer, + fini:boolean,h:integer;input n:integer;inout g:arrayof pixl); + var + max,lowest,pi:real,min,i,value,p,maxi:integer,variable,pas:pixl; + begin +array gt dim(1:100); (* initialisation des tableaux de sortie *) + h:=1; + min:=1; + max:=1; + fini:=false; + for i:=2 to n do (*recherche du point d'ordonnee minimal + a partir duquel s'effectuera la recherche + des autres points de la partie montante de + l'enveloppe convexe. *) + if g(i).ordog(max).ordo then + max:=i; + fi; + od; + pas:=g(max); + gt(h):=g(min); + while not fini do + maxi:=360; + if n<=1 then exit; fi; + for i:=1 to n do + variable:=new pixl (g(i).ab-gt(h).ab,g(i).ordo-gt(h).ordo); + lowest:=angle_montant(variable); + if maxi>lowest then + maxi:=lowest; + value:=i; + fi; + od; + h:=h+1; + (* on enregistre dans gt les points qui formeront + l'enveloppe convexe.*) + min:=value; + gt(h):=g(min); + g(min):=g(n); + n:=n-1; + if gt(h)=pas then + cpt:=n; + fini:=true; + exit; + fi; + od; + end calcul_montant; + (***********************************************************************) + (*cette fonction permet de calculer a partir des coordonnees d'un point*) + (* l'angle que ce dernier formera avec l'horizontale. *) + (***********************************************************************) + unit angle_descendant:function(variable:pixl):real; + var + pi,teta:real; + begin + pi:=3.14; + if variable.ab=0 then + if variable.ordo>0 then + result:=400; + else + result:=degre(3*pi/2); + fi; + else + teta:=atan((variable.ordo)/(variable.ab)); + if variable.ordo>0 then + result:=400; (* afin de ne pas selectionner un point qui serait + responsable d'une concavite. *) + else + if variable.ab<0 then + result:=degre(teta+pi); + else + result:=degre(2*pi+teta); + fi; + fi; + fi; + end angle_descendant; + +(*********************************************************************) +(* cette fonction determine de haut en bas les points appartenant a *) +(* l'enveloppe convexe. *) +(*********************************************************************) + + unit calcul_descendant:procedure(inout gt:arrayof pixl;input g:arrayof pixl, + n:integer;inout h:integer); + var + p,i,max,value:integer,lowest:real,termine:boolean,variable:pixl; + begin + termine:=false; + if n<1 then exit fi; + while not termine do + max:=720; + for i:=1 to n do (*les points qui seront sur l'enveloppe convexe de + la partie descendante devront avoir l'angle + compris entre le segment joignant la base a eux memes + et l'horizontale passant par la base ,le plus petit qui + soit dans l'intervalle [180,360]. *) + + variable:=new pixl(g(i).ab-gt(h).ab,g(i).ordo-gt(h).ordo); + lowest:=angle_descendant(variable); + if max>lowest then + max:=lowest; + value:=i; + fi; + od; + h:=h+1; (* on enregistre dans gt les nouveaux points de l'enveloppe *) + gt(h):=g(value); + g(value):=g(n); + n:=n-1; + if n<1 then (* si nous n'avons plus qu'un point dans le tableau d'entree + nous avons termine*) + termine:=true; + else + if gt(h)=gt(1) then (* si nous retombons sur le premier point cela est + fini. *) + exit; + fi; + fi; + od; + end calcul_descendant; + + + unit dessin:procedure(input gt:arrayof pixl,h:integer, + gu:arrayof pixl,nb:integer,vrai:boolean); + var + i:integer; + begin + pref iiuwgraph block + begin + call hpage(0,0,0); + call hpage(0,1000,500); + call gron(0); + call move(0,250); + call draw(1000,250); + call move(500,0); + call draw(500,500); + for i:=1 to nb do + call point(gu(i).ab,gu(i).ordo); + od; + call move(10*gt(1).ab+500,10*(-gt(1).ordo)+250); + for i:=2 to h do + call draw(10*(gt(i).ab)+500,10*(-gt(i).ordo)+250); + od; + if vrai then + call draw(10*(gt(1).ab)+500,10*(-gt(1).ordo)+250); + fi; + readln; +end; + end dessin; +end graphe; + +(******************************************************************************) +(* unit graphe2 est une classe qui herite de la classe graphe ,elle contiendra*) +(* les procedures et les fonctions destinees dans le cadre de la methode dite *) +(* de Graham_scan a calculer les points constituant l'enveloppe convexe d'un *) +(* nuage de points donnes en entree. *) +(******************************************************************************) + unit graphe2: graphe class; +(* classe qui permet de definir une droite c'est a dire deux points *) + unit line:class(p1:pixl,p2:pixl); + end line; + +(*******************************************************************************) +(* procedure qui en entree recoit des points en coordonnees cartesiennes et qui*) +(* leur associe un angle en plus en sortie,nous avons donc des coordonnees *) +(* polaires. *) +(*******************************************************************************) + unit recuperer:procedure(input ge:arrayof pixl;inout gtr:arrayof point;n:integer); + var + variable,t:pixl,min,i:integer,elem:real; + begin + min:=1; + for i:=2 to n do (* recherche du point d'ordonnee minimal,qui desormais sera + la base du nouveau repere. *) + if ge(i).ordo1 then + call tri_insert_dicho(gtr,i-1); + if gtr(i-1).teta>gtr(i).teta then + k:=rang(gtr,1,i-1,gtr(i)); + x:=gtr(i); + for j:=i-1 downto k do + gtr(j+1):=gtr(j); + od; + gtr(k):=x; + fi; + fi; + end tri_insert_dicho; + (**********************************************************************) + (* fonction qui calcule un double determinant cela afin de savoir si *) + (* deux droites se trouvent ou non de part et d'autre d'une premiere *) + (* droite. *) + (**********************************************************************) + unit same:function (l:line;p1,p2:pixl):real; + var + dx,dy,dx1,dx2,dy1,dy2:integer; + begin + dx:=l.p2.ab-l.p1.ab; + dy:=l.p2.ordo-l.p1.ordo; + dx1:=p1.ab-l.p1.ab; + dy1:=p1.ordo-l.p1.ordo; + dx2:=p2.ab-l.p2.ab; + dy2:=p2.ordo-l.p2.ordo; + result:=(dx*dy1-dy*dx1)*(dx*dy2-dy*dx2); + end same; + (***********************************************************************) + (* Graham scan determine ou non si un point appartient a l'enveloppe *) + (* convexe cela a l'aide du resultat de same.Si same est positif p[k] *) + (* appartient a l'enveloppe car la droite (p[k],p[k-1]) ne coupe pas *) + (* la droite (p[1],p[i]) ou p[i] est le point nouveau de l'enveloppe *) + (* et p[1] la base du repere ici,le point d'ordonnee le plus bas. *) + (***********************************************************************) + unit graham_scan:procedure(ge:arrayof pixl,n:integer;output gtr:arrayof point; + output m:integer); + var + cpt,i,j:integer,l:line,t:point; + begin + array gtr dim(1:n); + call recuperer(ge,gtr,n); + call tri_insert_dicho(gtr,n); + m:=2; + for i:=4 to n do + m:=m+2; + do + m:=m-1; + l:=new line(gtr(m).p,gtr(m-1).p); + cpt:=same(l,gtr(1).p,gtr(i).p); + if cpt>=0 then exit; fi; + od; + t:=gtr(m+1); + gtr(m+1):=gtr(i); + gtr(i):=t; + od; + end graham_scan; + end graphe2; + (* fin de la classe graphe2 et de la partie programmation *) + + (**** PROGRAMME PRINCIPAL ****) + var + gt,g,genv,ge,gen,gu:arrayof pixl,nuage:graphe,nuage1:graphe2,n,cpt,h, + m:integer, + fini,vrai:boolean,toucher,ch:char, + gtr:arrayof point,rep,rep_1,rep_3,i,j,nb:integer,rep_2:char; + begin + array gu dim(1:100); + array genv dim(1:100); + call presents_1; + read(toucher); + call cls; + h:=0; + nb:=0; + cpt:=0; + do + call menu; + read(rep); + case rep + when 1: + call cls; + vrai:=false; + call setcursor(6,40); + write(" PACKAGE WRAPPED "); + call setcursor(34,20); + write ("indiquez le nombre de points a saisir:"); + read(n); + nb:=n; + nuage:=new graphe(lecture); + call nuage.lire(g,n); + for i:=1 to nb do + gu(i):=g(i); + gu(i):=new pixl(10*(gu(i).ab)+500,10*(-gu(i).ordo)+250); + od; + call nuage.calcul_montant(gt,cpt,fini,h,n,g); + if fini then + call nuage.calcul_descendant(gt,g,cpt,h); + fi; + writeln("POINTS QUI COMPOSENT L'ENVELOPPE"); + for i:=1 to h do + writeln(gt(i).ab,gt(i).ordo); + od; + writeln("tapez entree pour en voir la representation graphique"); + readln; + call nuage.dessin(gt,h,gu,nb,vrai); + readln; + call setcursor(34,20); + write("tapez entree pour la suite"); + read(rep_1); + exit; + + when 2: + call cls; + vrai:=true; + call setcursor(6,40); + write (" GRAHAM_SCAN "); + call cadre (33,1,35,99); + call setcursor (34,20); + write ("Nombre de points du nuage "); + read(n); + nb:=n; + nuage1:=new graphe2(lecture); + call nuage1.lire(ge,n); + for i:=1 to nb do + gu(i):=ge(i); + gu(i):=new pixl(10*(gu(i).ab)+500,10*(-gu(i).ordo)+250); + od; + call nuage1.graham_scan(ge,n,gtr,m); + writeln("POINTS QUI COMPOSENT L'ENVELOPPE"); + for i:=1 to m do + writeln(gtr(i).p.ab,gtr(i).p.ordo); + genv(i):=new pixl(gtr(i).p.ab,gtr(i).p.ordo); + od; + writeln("tapez entree pour en voir la representation graphique"); + call nuage1.dessin(genv,m,gu,nb,vrai); + call setcursor(34,20); + write ("tapez entree pour revenir au sommaire"); + read(rep_3); + while rep_3 =/=13 + do + read(rep_3); + od; + exit; + + when 3: + call cadre_t; + call setcursor(6,40); + write("Adieu a l'enveloppe convexe"); + call cadre (33,1,35,99); + call setcursor(13,25); + write ("Etes vous decides"); + read (rep_2); + while (rep_2=/='o') and (rep_2=/='O') do + call setcursor(13,50); + read(rep_2); + od; + call cls; + exit; + esac; + od; +end. + + + + + diff --git a/examples/examples.old/proj_li1.log b/examples/examples.old/proj_li1.log new file mode 100644 index 0000000..ab21a7a --- /dev/null +++ b/examples/examples.old/proj_li1.log @@ -0,0 +1,1048 @@ +PROGRAM BD; + (*******************************************************************) + (* OUTILS CONCERNANT L'AFFICHAGE DU TEXTE A L'ECRAN *) + (*******************************************************************) + UNIT gest_ecran:CLASS; + + (* Efface l'ecran et positionne le curseur en haut a gauche *) + UNIT cls : PROCEDURE; + BEGIN + WRITE( chr(27), "[2J"); + END CLS; + + + (* Affiche du texte en video inverse *) + UNIT Reverse : PROCEDURE; + BEGIN + WRITE( chr(27), "[7m"); + END Reverse; + + + (* Affiche le texte de maniere normale *) + UNIT Normal : PROCEDURE; + BEGIN + WRITE( chr(27), "[0m") + END Normal; + + + UNIT Setcursor : PROCEDURE (row,column : INTEGER); + VAR c,d,e,f : CHAR, + i,j : INTEGER; + BEGIN + i:=row div 10; + j:=row mod 10; + c:=chr(48+i); + d:=chr(48+j); + i:=column div 10; + j:=column mod 10; + e:=chr(48+i); + f:=chr(48+j); + + Write(chr(27), "[",c,d, ";",e,f, "H"); + END Setcursor; + + (* unite qui sert a tracer un cadre *) + + UNIT cadre: PROCEDURE (x1,y1,x2,y2 : integer); + var i , j : integer; + BEGIN + for i := x1 to x2 do + CALL setcursor(i,y1); + write("*"); + od; + for i := x1 to x2 do + CALL setcursor(i,y2); + write ("*"); + od; + for i := y1 to y2 do + CALL setcursor(x1,i); + write ("*"); + od; + for i := y1 to y2 do + CALL setcursor(x2,i); + write ("*"); + od; + END cadre; + + END gest_ecran; + + (**************************** CADRE_T **********************************************) + UNIT cadre_t:gest_ecran PROCEDURE; + BEGIN + CALL cls; + CALL cadre (1,1,22,80); + CALL cadre (1,1,3,80); + CALL setcursor (2,32); + CALL reverse; + write (" GESTION DE BIBLIOTHEQUE "); + CALL normal; + END cadre_t; + + + (*************************** PRESENTS_1*********************************************) + UNIT presents_1:gest_ecran PROCEDURE; + BEGIN + CALL cadre_t; + CALL setcursor (10,32); + CALL reverse; + write (" PROJET REALISE PAR : "); + CALL setcursor (12,32); + Write (" BOURGEAT - MANDONNAUD "); + CALL setcursor(14,32); + Write (" LICENCE INFORMATIQUE "); + CALL normal; + END presents_1; + + (****************************** chaine *****************) + + UNIT chaine:CLASS; + VAR long:integer; + VAR ch : arrayof char; + + UNIT lit : PROCEDURE; + VAR i:integer, + car:char; + BEGIN + i:=1; + read(car); + WHILE i<=long AND car=/=chr(10) + DO + ch(i):=car; + read(car); + i:=i+1; + OD; + END lit; + + UNIT afi:PROCEDURE; + VAR i:integer; + BEGIN + i:=1; + FOR i:=1 TO long + DO + write(ch(i)); + OD; + writeln; + END afi; + + UNIT inff:FUNCTION(c2:chaine):boolean; + VAR i:integer; + BEGIN + i:=1; + IF long<=c2.long + THEN + WHILE ch(i)=c2.ch(i) + DO + i:=i+1; + IF i=long THEN exit; FI; + OD; + result:=ord(ch(i))none THEN ndaux:=nd.suivant FI; + FI; + END suppr; + + UNIT affi:PROCEDURE; + VAR i:integer, + nd:noeud; + BEGIN + nd:=debut; + i:=1; + WHILE nd =/= none + DO + write("reference :");write(i); write(" "); + CALL nd.clen.afi; + i := i + 1; + nd:=nd.suivant; + OD; + END affi; + END liste; + + (********************************** index_elem **********************************) + UNIT index_elem : element CLASS; + VAR lis : liste; + UNIT sup:FUNCTION(e2:element):boolean; + BEGIN + result:=NOT (e.inff(e2.e)) AND NOT (e.eqq(e2.e)); + END sup; + + UNIT inf:FUNCTION(e2:element):boolean; + BEGIN + result:=e.inff(e2.e); + END inf; + + UNIT eq:FUNCTION(e2:element):boolean; + BEGIN + result:=e.eqq(e2.e); + END eq; + + UNIT VIRTUAL affich : PROCEDURE ; + BEGIN + CALL e.afi; + END affich; + + BEGIN + lis := new liste; + END index_elem; + + (*********************** item ***************************************) + + UNIT item : CLASS; + VAR key:element, + ptr:page; + BEGIN + key:=new element; + END item; + + +(************************************** PAGE *****************************************) + + UNIT page : CLASS(n:integer); + VAR m : integer, + p0: page, + e : arrayof item; + + BEGIN (* creation de la page *) + array e dim(1:n*2); + for m:=1 to n*2 do e(m):=new item; od; + END page; + + + +(************************************** B_ARB ******************************************) +UNIT Barb :gest_ecran CLASS(n : integer); + +VAR ROOT:page; + + UNIT Search : PROCEDURE(input x:element,a:page; inout h:boolean,v:item); + VAR k,l,r:integer, + q:page, + u:item; + + UNIT insert : PROCEDURE; + VAR i:integer, b:page; + BEGIN + IF a.m<(n*2) THEN + a.m:=a.m+1; h:=FALSE; + for i:=a.m downto (r+2) + do + a.e(i):=a.e(i-1); + od; + a.e(r+1):=u; + ELSE + b:=new page(n); + IF r<=n THEN + IF r=n THEN v:=u; + ELSE + v:=a.e(n); + for i:=n downto (r+2) + do + a.e(i):=a.e(i-1); + od; + a.e(r+1):=u; + FI; + for i:=1 to n + do + b.e(i):=a.e(i+n); + od; + ELSE + r:=r-n; + v:=a.e(n+1); + for i:=1 to (r-1) + do + b.e(i):=a.e(i+n+1); + od; + b.e(r):=u; + for i:=r+1 to n + do + b.e(i):=a.e(i+n); + od; + FI; + a.m:=n; + b.m:=n; + b.p0:=v.ptr; + v.ptr:=b; + FI; + END insert; + + BEGIN (* Search *) + u:=new item; + IF a=none THEN + h:=TRUE; + v.key:=x; + v.ptr:=none; + ELSE + l:=1; r:=a.m; + DO + k:=(l+r) div 2; + (* writeln(" "); *) + IF NOT x.sup(a.e(k).key) THEN r:=k-1; FI; + IF NOT x.inf(a.e(k).key) THEN l:=k+1; FI; + IF r1 THEN h:=FALSE; + CALL setcursor(33,20); + WRITE ("Element deja dans l'arbre!"); + ELSE + IF r=0 THEN q:=a.p0 ELSE q:=a.e(r).ptr; FI; + CALL Search(x,q,h,u); + IF h THEN CALL insert; FI; + FI; + FI; + END Search; + + + UNIT Inserer : PROCEDURE (newe : element); + VAR h:boolean, + pgaux:page, + u:item; + BEGIN + u:=new item; + CALL Search(newe,ROOT,h,u); + IF h THEN + pgaux:=ROOT; + ROOT:=new page(n); + ROOT.m:=1; ROOT.p0:=pgaux; ROOT.e(1):=u; + FI; + END Inserer; + + + + + + UNIT delete :PROCEDURE(INPUT x:element, a:page; INOUT h:boolean); + VAR i,k,l,r : INTEGER, + q:page; + + UNIT underflow : PROCEDURE(INPUT c,a: page, s:integer; INOUT h:boolean); + VAR b: page, + i,k,mb,mc: integer; + BEGIN + mc:=c.m; + IF s0 THEN (* Deplacer k elements de b vers a *) + FOR i:=1 TO k-1 DO a.e(i+n):=b.e(i) OD; i:=i-1; + c.e(s):=b.e(k); + b.p0:=b.e(k).ptr; + c.e(s).ptr:=b; + mb:=mb-k; + FOR i:=1 TO mb DO b.e(i):=b.e(i+k) OD; i:=i-1; + b.m:=mb; + a.m:=n-1+k; + h:=FALSE; + ELSE (* Il faut fusionner a et b *) + FOR i:=1 TO n DO a.e(i+n):=b.e(i) OD; i:=i-1; + FOR i:=s TO mc-1 DO c.e(i):=c.e(i+1) OD; i:=i-1; + a.m:=2*n; c.m:=mc-1; + h:=c.m0 THEN (* Deplacer k elements de b vers a *) + FOR i:=n-1 DOWNTO 1 DO a.e(i+k):=a.e(i) OD; i:=i+1; + a.e(k):=c.e(s); + a.e(k).ptr:=a.p0; + mb:=mb-k; + FOR i:=k-1 DOWNTO 1 DO a.e(i):=b.e(i+mb) OD; i:=i+1; + a.p0:=b.e(mb).ptr; + c.e(s):=b.e(mb); + c.e(s).ptr:=a; + b.m:=mb-1; a.m:=n-1+k; h:=FALSE; + ELSE (* Il faut fusionner a et b *) + b.e(mb):=c.e(s); + b.e(mb).ptr:=a.p0; + FOR i:=1 TO n-1 DO b.e(i+mb):=a.e(i) OD; i:=i-1; + b.m:=2*n; c.m:=mc-1; h:=(c.mnone THEN + CALL del(q,h); + + IF h THEN CALL underflow(p,q,p.m,h);FI; + ELSE + p.e(p.m).ptr:=a.e(k).ptr; + a.e(k):=p.e(p.m); + p.m:=p.m-1; + h:=(p.mr) THEN exit; FI; + OD; + IF r=0 THEN q:=a.p0 ELSE q:=a.e(r).ptr FI; + IF l-r >1 THEN + IF q=none THEN (* a est une feuille *) + a.m:=a.m-1; + h:=(a.mp.m then i:=i-1; fi; + result:=i; + END Rech_page; + + BEGIN + existe:=FALSE; + paux:=root; + DO + IF (paux=none OR existe) THEN exit; FI; + k:= Rech_page(paux); + IF k=0 THEN paux:=paux.p0; + ELSE + IF paux.e(k).key.eq(ele) THEN + existe:=TRUE; + ele:= paux.e(k).key; + ELSE + paux:=paux.e(k).ptr; + FI; + FI; + OD; + result:=existe; + END Member; + + +(********************************************* MIN ****************************************************) + + UNIT Min : FUNCTION(p:page): element; + BEGIN + IF p<>none THEN + DO + IF p.p0=none THEN + result:=p.e(1).key; exit; + ELSE + p:=p.p0; + FI; + OD; + FI; + END Min; + +(********************************************* MAX ****************************************************) + UNIT Max : FUNCTION(p:page): element; + BEGIN + IF p<>none THEN + DO + IF p.e(p.m).ptr=none THEN + result:=p.e(p.m).key; exit; + ELSE + p:=p.e(p.m).ptr; + FI; + OD; + FI; + END Max; + +(********************************************* LIST ****************************************************) + UNIT List : PROCEDURE(p:page;inout ligne,colonne : integer); + var + i : integer; + + BEGIN + + IF ligne = 24 THEN + ligne := 8; + colonne := colonne + 10; + FI; + + IF P<>none THEN + IF (p.p0=none) THEN + IF (p.m>0) THEN + CALL setcursor(ligne,colonne); + CALL p.e(1).key.Affich; + ligne := ligne + 1; + fi; + ELSE + ligne := ligne + 1; + CALL list(p.p0,ligne,colonne); + CALL setcursor(ligne,colonne); + CALL p.e(1).key.Affich; + + FI; + FOR i:=1 TO p.m + DO + IF p.e(i).ptr=none THEN + IF inone THEN + IF (p.p0=none) THEN + IF (p.m>0) THEN Kill(p.e(1).key); fi; + ELSE + CALL Erase(p.p0); + Kill(p.p0); + Kill(p.e(1).key); + FI; + FOR i:=1 TO p.m + DO + IF p.e(i).ptr=none THEN + IF i 9 + + THEN + (* On fait en quelque sorte un modulo 10. On enlŠve 10 pour em- + piler le chiffre qui en est d‚duit et la retenue vaut + alors 1. *) + retenu := 1; + so := so - 10 + + ELSE + (* Ici le calcul donne un chiffre alors la retenu est nulle. *) + retenu := 0; + + FI; + + CALL RESULT.empiler (so); + + OD; + (* Gestion de la retenu. *) + IF retenu =/= 0 + + THEN + + CALL RESULT.empiler (retenu) + + FI; + + END addition; + +(* ------------------------------------------------------------------------ *) + + UNIT soustraction : FUNCTION (p2 : Entier_long) : Entier_long; + (* Cette fonction permet d'effectuer la soustraction, elle retourne une + entier long. + On effectue la soustraction au fur et … mesure que l'on d‚pile. + A la fin de la fonction on va tester la valeur de la retenu, si elle + est ‚gale … 1 cela signifie que le r‚sultat est n‚gatif. *) + + VAR retenu, di : INTEGER; + + BEGIN + + retenu := 0; + RESULT := NEW Entier_long; + + WHILE (not pile_vide) OR (not p2.pile_vide) + + DO + + IF pile_vide THEN + (* Si p1 est vide alors le calcul se fait avec la d‚pile + de p2 et la gestion de la retenu. *) + + di := - p2.depiler - retenu + + ELSE + + IF p2.pile_vide THEN + (* Si p2 est vide alors le calcul se fait avec la d‚pile + de p1 et la gestion de la retenu. *) + + di := depiler - retenu + + ELSE + (* Dans les autres cas, on d‚pile les deux piles et on g‚re + la retenu. *) + + di := depiler - p2.depiler - retenu + + FI; + + FI; + + IF di < 0 THEN + (* Pour ‚viter d'avoir une valeur n‚gative on ajoute 10 + … di pour empiler un chiffre positif et la retenu prend + la valeur vaut alors 1. *) + + retenu := 1; + di := di + 10 + ELSE + (* Ici le calcul donne un chiffre positif alors la retenu est nulle. *) + + retenu := 0; + + FI; + + CALL RESULT.empiler(di); + + OD; + + + IF retenu =/= 0 (* Cette deuxiŠme partie ne concerne que la + division. Quand les piles sont vides + si la retenu est diff‚rente de 0 c'est que + la valeur de p1 est < … celle de p2. *) + THEN + + b1 := FALSE; + + FI; + + END soustraction; + +(* ------------------------------------------------------------------------ *) + + UNIT multiplication : FUNCTION (p2 : Entier_long ; n : INTEGER) : Entier_long; + (* Cette fonction permet d'effectuer la multiplication elle retourne un + entier long. n repr‚sente le nombre d'‚lŠments qu'il y a dans la plus + grande pile. On d‚coupe les piles jusqu'… obtenir un type ‚lŠment. *) + + VAR val : INTEGER , x1, x2, x3, x4 : INTEGER , pp1, p11, pp2, pt, + p22, pp3, p33, pp4, p44, mul1, mul2, mul3, mul4, + som1, som2 : Entier_long; + + + BEGIN + + pp1 := NEW Entier_long; p11 := NEW Entier_long; + pp2 := NEW Entier_long; pp3 := NEW Entier_long; + p33 := NEW Entier_long; pp4 := NEW Entier_long; + p44 := NEW Entier_long; pt := NEW Entier_long; + + mul1 := NEW Entier_long; mul2 := NEW Entier_long; + mul3 := NEW Entier_long; mul4 := NEW Entier_long; + som1 := NEW Entier_long; som2 := NEW Entier_long; + + RESULT := NEW Entier_long; + + n := n DIV 2; + + CALL position (17,60); + WRITE ("Calcul en cours..."); + + WHILE NOT pile_vide + DO (* Transfert de la pile p1 vers la pile pt.*) + CALL pt.empiler (depiler); + OD; + + (* Le transfert vers 2 piles permet de sauvegarder les informations + vers dans une autre pile parce qu'une fois les ‚lŠments utilis‚s + la pile qui les contenaient est vide. Et pour les utiliser une + autre fois il faut les avoir sauvegarder dans une autre. *) + + CALL transferer_2_piles (pt,p11,pp1); + + CALL transferer_2_piles (transferer_pile (p2),p22,pp2); + + IF n <= 2 + + THEN + + x3 := pp1.depiler ; x4 := pp2.depiler ; x1 := pp1.depiler ; + x2 := pp2.depiler ; + + val := x1 * x2 * 100 + (x1 * x4 + x3 * x2) * 10 + (x3 * x4); + + RESULT := conversion (val,n1); (* Ici n1 ne sert … rien puisse que + son but dans la fuction est de compter + aussi le nombre d'‚lŠments qui se trou- + ve dans la pile. dans laquelle est mise + les chiffres qui sont convertis.*) + + ELSE + + pp3 := transferer_pile (apparition(pp1,n)); + + p33 := transferer_pile (apparition(p11,n)); + + pp4 := transferer_pile (apparition(pp2,n)); + + p44 := transferer_pile (apparition(p22,n)); + + (* mul1, mul2, mul3, mul4 : sont 4 traitements r‚cursives au il + ajouter pour certain cas un certain nombre de 0. *) + + mul1 := transferer_pile (pp1.multiplication (pp2,n)); + CALL mul1.ajouter_zero (n); + + mul2 := transferer_pile (p11.multiplication (pp4,n)); + CALL mul2.ajouter_zero (n DIV 2); + + mul3 := transferer_pile (p22.multiplication (pp3,n)); + CALL mul3.ajouter_zero (n DIV 2); + + mul4 := transferer_pile (p33.multiplication (p44,n)); + + (* Addition des 4 mul trouv‚s qui forment le r‚sultat. *) + + som1 := transferer_pile (mul1.addition (mul2)); + + som2 := transferer_pile (mul3.addition (mul4)); + + RESULT := som1.addition (som2); + + FI; + + END multiplication; + +(* ------------------------------------------------------------------------ *) + + UNIT carre : FUNCTION (n : INTEGER) : Entier_long; + (* Cette fonction permet d'effectuer le carre d'une multiplication. *) + + VAR p3, p4, pt : Entier_long; + + BEGIN + RESULT := NEW Entier_long; + p3 := NEW Entier_long; + p4 := NEW Entier_long; + pt := NEW Entier_long; + + WHILE NOT pile_vide + DO (* Transfert de la pile p1 vers la pile pt.*) + CALL pt.empiler (depiler); + OD; + + CALL transferer_2_piles (pt,p3,p4); + RESULT := p4.multiplication (p3,n*2); + + CALL effacer_partie (1,19,16,58); + + END carre; + +(* ------------------------------------------------------------------------ *) + + UNIT division : FUNCTION (p2 : Entier_Long) : Entier_long; + (* Cette fonction permet d'effectuer la division (entiŠre) avec un + Entier_long. Elle retourne Entier_long. + Un division est une soustraction du dividande avec le diviseur. *) + + VAR p3, p5, p6, pt : Entier_long; + + BEGIN + + b1 := TRUE; + + RESULT := NEW Entier_long; + p3 := NEW Entier_long; + p5 := NEW Entier_long; + p6 := NEW Entier_long; + pt := NEW Entier_long; + + WHILE NOT pile_vide + DO (* Transfert de la pile p1 vers la pile pt.*) + CALL pt.empiler (depiler); + OD; + + CALL RESULT.empiler(0); (* R‚sult est initialis‚ … 0. *) + + pt := transferer_pile (pt); + + WHILE b1 (* Correspond au bool‚en donn‚e par la soustraction. *) + + DO + + CALL position (17,60); + WRITE ("Calcul en cours..."); + + CALL transferer_2_piles (p2,p5,p6); + pt := transferer_pile (pt.soustraction(transferer_pile (p5))); + p2 := transferer_pile (p6); (* pour ne pas perdre l'information + de base de p2 alors p6 redevient p2 + qui … son tour redevient p6.*) + + IF b1 (* Quand on sort de la fonction traiter_soustrac- + tion retenu n'est pas forc‚ment ‚gale … 0. *) + THEN + + CALL p3.empiler (1); (* A chaque soustraction on incr‚mente RESULT + de 1. Ce 1 est alors empiler dans p3. *) + + RESULT := transferer_pile (RESULT.addition (p3)); + + FI; + + OD; + + RESULT := transferer_pile (RESULT); + + CALL effacer_partie (1,19,16,58); + + END division; + +(* ------------------------------------------------------------------------ *) + + UNIT modulo : FUNCTION (p2 : Entier_long) : Entier_long; + (* Cette fonction permet de calculer le reste d'une division avec un + entier long. Elle retourne un Entier_long. Quand le r‚sultat de la sous- + traction est vide est < … 0 il faut avoir garder quelque part la valeur + du pr‚c‚dent dividande. En fait tant que le reste est positif, on r‚ini + tialise la RESULT. *) + + VAR p5, p6, pt : Entier_long; + + BEGIN + + b1 := TRUE; + p5 := NEW Entier_long; + p6 := NEW Entier_long; + pt := NEW Entier_long; + + WHILE NOT pile_vide + DO (* Transfert de la pile p1 vers la pile pt.*) + CALL pt.empiler (depiler); + OD; + + WHILE b1 + + DO + + CALL position (17,60); + WRITE ("Calcul en cours..."); + + CALL transferer_2_piles (p2,p5,p6); (* p2 et p6 font faire former un + cycle pourque l'information ne + soit pas perdu. *) + + RESULT := NEW Entier_long; + + (* pt et RESULT contient le dernier reste de la division. Si b1 est faux + ce qui signifie que la valeur que contient la pile pt est inf‚rieur + … celle qui est incluse dans p5. + Tant que la soustraction est positive (b1 est vrai) alors RESULT est + reinitialis‚e. *) + + CALL transferer_2_piles (pt,pt,RESULT); + + RESULT := transferer_pile (RESULT); + + pt := transferer_pile(transferer_pile (pt.soustraction(transferer_pile (p5)))); + + p2 := transferer_pile (p6); + + OD; + + CALL effacer_partie (1,19,16,58); + + END modulo; + +(* ------------------------------------------------------------------------ *) + + UNIT pgcd : FUNCTION (p2 : Entier_Long) : Entier_long; + (* Cette fonction permet de calculer le pgcd entre deux entiers longs. + Elle retourne un Entier_long. + Tq r =/=0 fr + r <-- a MOD b ; a <-- b ; b <-- r + Ftq + Ici r repr‚sente p2 et b2 qui lui va prendre FAUX lors du transfert + de p2 vers p2 si dans cette derniŠre pile il y la valeur 0. *) + + VAR p5, pt : Entier_long; + + BEGIN + + b2 := TRUE; + p5 := NEW Entier_long; + pt := NEW Entier_long; + + WHILE NOT pile_vide + DO (* Transfert de la pile p1 vers la pile pt.*) + CALL pt.empiler (depiler); + OD; + + pt := transferer_pile (pt); + + WHILE b2 + + DO + + CALL transferer_2_piles (p2,p2,p5); + + p2 := (pt.modulo (transferer_pile (p2))); + + RESULT := NEW Entier_long; + + RESULT := transferer_pile (transferer_pile (p5)); + + p2 := transferer_pile (p2); + + IF b2 + + THEN + + pt := transferer_pile (RESULT); + FI; + + OD; + + END pgcd; + +(* ------------------------------------------------------------------------ *) + + UNIT ppcm : FUNCTION (p2 : Entier_Long) : Entier_long; + (* Cette fonction permet de calculer le ppcm entre deux entiers longs. + Elle retourne un Entier_long. ppcm (a,b) = (a * b) / pgcd (a,b). *) + + VAR p3, p4, pt, pp : Entier_long; + + BEGIN + + p3 := NEW Entier_long; + p4 := NEW Entier_long; + pp := NEW Entier_long; + pt := NEW Entier_long; + + WHILE NOT pile_vide + DO (* Transfert de la pile p1 vers la pile pt.*) + CALL pt.empiler (depiler); + OD; + + + CALL transferer_2_piles (transferer_pile (p2),p2,p4); + + CALL transferer_2_piles (pt,pt,p3); + + (* pp prend la valeur de la multiplication de p2 et de pt. *) + pp := transferer_pile (pt.multiplication (p2,partition (grand(n1,n2,n3)))); + + RESULT := pp.division (transferer_pile (p3.pgcd (p4))); + + END ppcm; + +(* ------------------------------------------------------------------------ *) + + UNIT conversion : FUNCTION (nbre : INTEGER ; + OUTPUT n : INTEGER) : Entier_long ; + (* Cette fonction d‚compose un entier en tout chiffre qui la compose. + Elle retourne un type Entier_long et comme paramˆtre le nombre de + chiffres qui compose cette description ainsi ce dernier paramˆtre + donne une id‚e de la taille de la premiŠre pile. Pareil que la + fonction saisie, on va ‚viter d'empiler des 0 en d‚but de nombre + inutile. *) + + VAR x : INTEGER, trouve : BOOLEAN; + + BEGIN + + RESULT := NEW Entier_long; + trouve := FALSE; + + n := 0; + + DO + + x := nbre MOD 10; + IF (x =/= 0) + + THEN + + CALL RESULT.empiler (x); + trouve := TRUE; + nbre := nbre DIV 10; + n := n + 1 + ELSE + + IF trouve + + THEN + + CALL RESULT.empiler (x); + nbre := nbre DIV 10; + n := n + 1; + FI; + + FI; + + IF (nbre = 0) + + THEN + + EXIT; + + FI; + + OD; + + END conversion; + +(* ------------------------------------------------------------------------ *) + + UNIT transferer_pile : FUNCTION (p2 : Entier_long) : Entier_long; + (* Cette fonction permet de d‚piler une pile pour empiler dans une + autre.*) + + VAR i : INTEGER; + + BEGIN + + b2 := FALSE; (* b2 va tester si la valeur duŠ reste est ‚gale … + z‚ro (ce qui est valable seulement pour + le PGCD) *) + + RESULT := NEW Entier_long; + + WHILE NOT p2.pile_vide + DO + i := p2.depiler; + + IF i =/= 0 + + THEN + + b2 := TRUE; + FI; + + CALL RESULT.empiler (i); + + OD; + + END transferer_pile; + +(* ------------------------------------------------------------------------ *) + + UNIT transferer_2_piles : PROCEDURE (p2 : Entier_long ; + OUTPUT p3,p4 : Entier_long); + (* Cette proc‚dure permet de d‚piler une pile pour empiler dans deux + autres. *) + + VAR x : INTEGER; + + BEGIN + + p3 := NEW Entier_long; + p4 := NEW Entier_long; + + WHILE NOT p2.pile_vide + DO + x := p2.depiler; + CALL p3.empiler (x); + CALL p4.empiler (x); + OD; + + END transferer_2_piles; + +(* ------------------------------------------------------------------------ *) + + UNIT apparition : FUNCTION (p2 : Entier_long ; n : INTEGER) : Entier_long; + (* Cette fonction permet de faire apparaŒtre une nouvelle pile en + divisant celle qui existe en deux. n : repr‚sente le nombre de + chiffres contenu dans la pile. Cette fonction n'est valable pour la + multiplication. *) + + BEGIN + + RESULT := NEW Entier_long; + + n := n DIV 2; + + WHILE n =/= 0 DO + CALL RESULT.empiler (p2.depiler); + n := n - 1; + OD; + + END apparition; + +(* ------------------------------------------------------------------------ *) + + UNIT max_de_2_piles : PROCEDURE (v1,v2 : INTEGER ; + INOUT p2 : Entier_long ; OUTPUT max : INTEGER); + (* Cette proc‚dure d‚termine quel nombre des piles est plus grand. + Puisse qu'au d‚part il y a s‚lection dans la saisie (les z‚ros qui pr‚cŠ- + dent un chiffre autre qu'un z‚ro) ; on fait la comparaison avec v1, v2 (le + nombre de chiffres compris dans la pile). + Si v1 et v2 sont ‚gaux (exemple 121 et 331) les valeurs sont ici 3 ; alors + on compare deux … deux les chiffres pour d‚terminer la pile qui contient + le nombre le plus grande. + max resort 1 pour la pile1 et 2 pour la pile2.*) + + VAR x1, x2 : INTEGER, b : BOOLEAN, p3,p4,p5,p6 : Entier_long; + + BEGIN + + p3 := NEW Entier_long; p4 := NEW Entier_long; + p5 := NEW Entier_long; p6 := NEW Entier_long; + + max := 0; b := TRUE; + (* 1ø partie : Comparaison des valeurs v1 et v2. *) + IF v1 > v2 + THEN + max := 1 + ELSE + + IF v1 < v2 + THEN + max := 2 + ELSE (* Si dans les deux piles le nombre + de chiffres est ‚gale, on compare + les chiffres entre eux pour con- + naŒtre enfin la plus grande. *) + + CALL transferer_2_piles (p1,p3,p5); + CALL transferer_2_piles (p2,p4,p6); + (* Au cours de la comparaison dŠs que + l'on a trouv‚ une diff‚rence entre + les deux piles, on arrˆte la recher- + che. *) + + WHILE NOT (p3.pile_vide) AND b + DO + + x1 := p3.depiler; + x2 := p4.depiler; + + IF (x1 > x2) + THEN + + max := 1; + b := FALSE + ELSE + + IF (x1 < x2) + THEN + + max := 2; + b := FALSE; + FI; + + FI; + + OD; + + p1 := transferer_pile (p5); + p2 := transferer_pile (p6); + + FI; + + FI; + + END max_de_2_piles; + +(* ------------------------------------------------------------------------ *) + + UNIT ajouter_zero : PROCEDURE (n : INTEGER); + (* Cette fonction permet d'ajouter des z‚ros … la suite d'une pile + n : repr‚sente le nombre de 0 qui vont ˆtre empiler. Cette proc‚dure + est valable seulement pour la multiplication. *) + + VAR emp : INTEGER; + + BEGIN + + FOR emp := 1 to n + + DO + + CALL empiler (0); + OD; + + END ajouter_zero; + +(* ------------------------------------------------------------------------ *) + + UNIT saisir : FUNCTION (i, j : INTEGER ; OUTPUT n : INTEGER) : Entier_long; + (* Cette fonction permet de saisir les chiffres pour les empiler. + Par cette m‚thode de saisie, les z‚ros qui sont en d‚but de nom- + bre ne sont pas saisies (ce qui permet d'avoir une id‚e rapide + de la plus grande pile. + i et j : deux variables qui repr‚sentent la position du curseur … l'‚cran. + n : resort le nbre de chiffre empil‚s.*) + + VAR nnbre : CHAR, nbre : INTEGER, trouve : BOOLEAN; + + BEGIN + + RESULT := NEW Entier_long; + + trouve := FALSE; + n := 0; + + DO + + CALL position (i,j); + IF j = 80 + + THEN (* Passage … la ligne pour des entiers trŠs longs.*) + + i := i + 1; + j := 1; + FI; + + nnbre := chr (inchar); + + IF (ord (nnbre) < 48) OR (ord (nnbre) > 57) + THEN + EXIT; + FI; + + nbre := entier (nnbre); + + CALL position (i,j); + + WRITELN (nnbre); + + IF (nbre =/= 0) + + THEN + + CALL RESULT.empiler (nbre); + trouve := TRUE; (* On fait un barage aux premiers + z‚ros saisie. *) + n := n + 1 + ELSE + + IF trouve + (* Une fois un nbre diff‚rent de 0 est + saisie 0 peut ˆtre bien-s–r saisie + autant de fois que possible. *) + THEN + + CALL RESULT.empiler (nbre); + n := n + 1; + + FI; + + FI; + + j := j + 1; (* Mise … jour de la colonne de l'‚cran. *) + + OD; + + END saisir; + +(* ------------------------------------------------------------------------ *) + + UNIT afficher_resultat : PROCEDURE ; + (* Cette proc‚dure permet d'afficher le r‚sultat du calcul effectu‚. + Tant que la pile n'est pas vide, on d‚pile. On ‚vite d'afficher les + premiers 0 (Ce qui trŠs important pour une soustraction). *) + + VAR b : BOOLEAN , i : INTEGER ; + + BEGIN + b := FALSE; + i := depiler; + + WHILE NOT pile_vide DO + + IF (i =/= 0) or (b) THEN + b := TRUE; (* Une fois que le premier + nombre est affich‚ et qu'il + est diff‚rent de 0, on peut afficher + autant de fois de 0. *) + WRITE (i); + FI; + + i := depiler; + OD; + + WRITE (i); + + + END afficher_resultat; + + + + END Entier_long; + +(* ------------------------------------------------------------------------ *) + + UNIT Inchar : IIUWgraph FUNCTION : INTEGER; + (* Cette function permet de saisir une suite de caractŠres sans avoir + … valider chaque fois. *) + + VAR i:integer; + + BEGIN + + DO + + i := INKEY; + IF (i<>0) + + THEN + EXIT; + FI; + + OD; + + RESULT := i; + + END Inchar; + +(* ------------------------------------------------------------------------ *) + + UNIT entier : FUNCTION (c : CHAR) : INTEGER; + (* Cette proc‚dure convertie un caractŠre en entier parce que la + fonction inchar lit un entier qu'elle traduit en caractŠre. *) + + BEGIN + CASE c + + WHEN '0' : RESULT := 0; + + WHEN '1' : RESULT := 1; + + WHEN '2' : RESULT := 2; + + WHEN '3' : RESULT := 3; + + WHEN '4' : RESULT := 4; + + WHEN '5' : RESULT := 5; + + WHEN '6' : RESULT := 6; + + WHEN '7' : RESULT := 7; + + WHEN '8' : RESULT := 8; + + WHEN '9' : RESULT := 9; + + ESAC; + + END entier; + +(* ------------------------------------------------------------------------ *) + + UNIT partition : FUNCTION (n : INTEGER):INTEGER; + (* Cette fonction renvoit la valeur pour laquelle il faut partitionner + les deux piles. La plus grande de leur deux valeurs (multilplier par 2 + par la fonction grand) doit ˆtre un multiple de deux. (ce qui est + seulement utile pour la multiplication).*) + + VAR n1 : INTEGER; + + BEGIN + + n1 := 2; + + WHILE n1 < n + (* La partition de la multiplication se fait + pour des valeurs qui correspondent … une + suite g‚om‚trique de premier terme 2 et de + raison 2. *) + DO + n1 := n1 * 2; + + OD; + + RESULT := n1; + + END partition; + +(* ------------------------------------------------------------------------ *) + + UNIT grand : FUNCTION (d1, d2, d3 : INTEGER) : INTEGER; + (* Cette fonction renvoit le nbre d'‚lŠment qui a dans la plus grande + pile. Le paramˆtre d3 accepte le max des deux piles. + on rappelle que s'il vaut 2 alors il s'agit de la deuxiŠme pile qui a + la grande valeur sinon la premiŠre et cette valeur est multiplier par 2 + pour mieux partionner la pile. *) + + BEGIN + + IF (d3 = 2) + THEN + + d2 := d2 * 2; + RESULT := d2 + ELSE + + d1 := d1 * 2; + + RESULT := d1; + + FI; + + END grand; + +(* ------------------------------------------------------------------------ *) + + UNIT position : PROCEDURE (lig, col : INTEGER); + (* Cette proc‚dure permet de positionner sur l'‚cran qui devient une + matrice. Les paramˆtres lig et col correspondent respectivement … l' + abcisse x (ligne) et … l'abcisse y (colonne). *) + + VAR c, d, e, f : CHAR, i, j : INTEGER; + + BEGIN + + i := lig DIV 10; j := lig mod 10; c := chr (48+i); + d := chr (48+j); i := col div 10; j := col mod 10; + e := chr (48+i); f := chr (48+j); + WRITE (chr (27), "[", c, d, ";", e, f, "H"); + + END position; + +(* ------------------------------------------------------------------------ *) + + UNIT tracer_ligne : PROCEDURE (lig1,col1,col : INTEGER); + (* Cette proc‚dure permet de tracer les lignes du cadre. x, y repr‚- + tentent les paramˆtres de POSITION c'est … dire position ligne, colon + ne, et col est la limite de la ligne. *) + + VAR i : INTEGER; + + BEGIN + + CALL POSITION (col1,lig1); + + FOR i := 1 to col + DO + WRITE ('Ä'); + OD; + + END tracer_ligne; + +(*------------------------------------------------------------------------- *) + + UNIT tracer_colonne : PROCEDURE (lig,lig1, col : INTEGER); + (* Cette proc‚dure permet de tracer les colonnes du cadre. + lig repr‚sente : lig2 - lig1, et col : la colonne courante ou l'or- + donn‚e de POSITON. *) + + VAR i : INTEGER; + + BEGIN + + FOR i := 1 to lig + + DO + + CALL POSITION (lig1+i,col); + + WRITE ("³"); + + OD; + + END tracer_colonne; + +(* ------------------------------------------------------------------------ *) + + UNIT cadrer : PROCEDURE (lig1, lig2, col1,col2 : INTEGER); + (* Cette proc‚dure dessine un cadre valable pour un ‚cran. D'abord + dessins : des lignes, ensuite des colonnes enfin des coins. Les para- + mˆtres sont respectivement ligne du haut et du bas et colonne de droi- + te et de gauche. *) + + BEGIN + + CALL tracer_ligne (col1,lig1,col2-col1); + CALL tracer_ligne (col1,lig2,col2-col1); + + CALL tracer_colonne (lig2-lig1,lig1,col1); + CALL tracer_colonne (lig2-lig1,lig1,col2); + + CALL POSITION (lig1,col1); + WRITE ("Ú"); + + CALL POSITION (lig2,col1); + WRITE ("À"); + + CALL POSITION (lig1,col2); + WRITE ("¿"); + + CALL POSITION (lig2,col2); + WRITE ("Ù"); + + END cadrer; + +(* ------------------------------------------------------------------------ *) + + UNIT effacer_partie : PROCEDURE (lig, col, lig1, col1 : INTEGER); + (* Cette proc‚dure permet d'effacer une partie de l'‚cran (o— on + ‚crit un caractŠre blanc) les paramˆtres lig, col, lig1, col1 + l'intervale de ligne, colonne et la position de la ligne1 et + de la colonne1. *) + + VAR k,w : INTEGER; + + BEGIN + FOR k := 1 to col + DO + FOR w := 1 to lig + DO + + CALL POSITION (lig1+w,col1+k); + WRITE (" "); + OD; + + OD; + + END effacer_partie; + +(* ------------------------------------------------------------------------ *) + + UNIT prompt : PROCEDURE (i,j : INTEGER); + (* Cette proc‚dure affiche le programme principal. *) + VAR choix : CHAR ; + + BEGIN + + DO + + WRITELN; (* Cette commande permet de vider le buffer *) + + IF ecr (* Cette condition va permettre … cette fenˆtre de pas + ser du plein ‚cran au petit menu du haut de l'‚cran. *) + + THEN + + CALL cadrer (8,16,2,80); + ecr := FALSE + ELSE + i := 3 ; j := 6; + CALL cadrer (2,4,2,80); + FI; + + CALL position (i,j); + + WRITE ("1 : Aide - 2 : Calcul - 3 : Quitter -> Le choix : "); + + WRITELN; (* Cette commande permet de vider le buffer *) + + choix := chr(inchar); + + CALL position (3,77); + WRITELN (choix); + + WRITE (chr(27), "[2J"); + + CASE choix + + WHEN '1' : CALL aide; + + WHEN '2' : CALL effacer_partie (3,80,1,1); + CALL presentation; + + CALL cadrer (3,7,8,74); + CALL fenetre_operation (4,14); + + WHEN '3' : EXIT; + + ESAC + + OD; + + END prompt; + +(* ------------------------------------------------------------------------ *) + + UNIT fenetre_operation : PROCEDURE (i,j : INTEGER); + (* Cette proc‚dure affiche la liste des op‚rations possibles … + r‚aliser et g‚re les signes des op‚rations saisies. + Cf la documentation pour comprendre la gestion des signes. *) + + VAR choix : CHAR; + + BEGIN + + WRITELN; (* Cette commande permet de vider le buffer *) + + CALL position (i,j); + + WRITE ("1 : + ; 2 : - ; 3 : * ; 4 : ^2 ; 5 : DIV"); + + CALL position (i+2,j); + + WRITE ("6 : MOD ; 7 : PGCD ; 8 : PPCM -> Le choix : "); + + WRITELN; (* Cette commande permet de vider le buffer *) + + choix := chr(inchar); + + CALL position (i+2,j+54); + WRITELN (choix); + + CALL effacer_partie (5,78,2,1); + + CALL position (i+4,50); +(* Dans tous les cas signe1 et signe2 sont les valeurs des signes des piles +1 et 2. *) + CASE choix + + WHEN '1' : WRITE ("La s‚lection est : "); + WRITE ("+"); + + CALL cadrer (10,14,22,50); + CALL fenetre_saisie (11,25); + + CALL cadrer (15,19,22,50); + CALL fenetre_saisie (16,25); + + CALL p1.max_de_2_piles (n1,n2,p2,n3); + + CASE signe1 + + WHEN '-' : IF signe2 = '-' + + THEN + + p3 := p1.addition (p2); + CALL position (19,15); + WRITE ("-") + ELSE + + IF (n3 = 1) (* cas o— la 1ø pile est + > … la 2ø pile.*) + THEN + + p3 := p1.soustraction (p2); + CALL position (19,15); + WRITE ("-") + + ELSE (* cas o— la 1ø pile est <= + … la 2ø pile.*) + p3 := p2.soustraction (p1); + FI; + + FI; + + OTHERWISE IF signe2 =/= '-' + + THEN + p3 := p1.addition (p2); + + ELSE + + IF (n3 = 1) (* cas o— la 1ø pile est + > … la 2ø pile.*) + THEN + + p3 := p1.soustraction (p2); + + ELSE (* cas o— la 1ø pile est <= + … la 2ø pile.*) + p3 := p2.soustraction (p1); + + IF (n3 =/= 0) + + THEN + + CALL position (19,15); + WRITE ("-") + FI; + + FI; + + FI; + ESAC; + + WHEN '2': WRITE ("La s‚lection est : "); + WRITE ("-"); + + CALL cadrer (10,14,22,50); + CALL fenetre_saisie (11,25); + + CALL cadrer (15,19,22,50); + CALL fenetre_saisie (16,25); + + CALL p1.max_de_2_piles (n1,n2,p2,n3); + + CASE signe1 + + WHEN '-' : IF signe2 =/= '-' + + THEN + + p3 := p1.addition (p2); + CALL position (19,15); + WRITE ("-") + ELSE + + IF (n3 = 1) (* cas o— la 1ø pile est + > … la 2ø pile. *) + THEN + + p3 := p1.soustraction (p2); + CALL position (19,15); + WRITE ("-") + + ELSE (* cas o— la 1ø pile est <= + … la 2ø pile. *) + p3 := p2.soustraction (p1); + + FI; + + FI; + + OTHERWISE IF signe2 = '-' + + THEN + p3 := p1.addition (p2); + + ELSE + + IF (n3 = 2) (* cas o— la 1ø pile est + > … la 2ø pile.*) + THEN + + p3 := p2.soustraction (p1); + CALL position (19,15); + WRITE ("-") + + ELSE (* cas o— la 1ø pile est <= + … la 2ø pile. *) + p3 := p1.soustraction (p2); + FI; + + FI; + ESAC; + + WHEN '3': WRITE ("La s‚lection est : "); + WRITE ("*"); + + CALL cadrer (10,14,22,50); + CALL fenetre_saisie (11,25); + + CALL cadrer (15,19,22,50); + CALL fenetre_saisie (16,25); + + CALL p1.max_de_2_piles (n1,n2,p2,n3); + + CASE signe1 + + WHEN '-' : IF signe2 =/= '-' + + THEN + CALL position (19,15); + WRITE ("-"); + FI; + + OTHERWISE IF signe2 = '-' + + THEN + CALL position (19,15); + WRITE ("-"); + FI; + + ESAC ; + + p3 := p1.multiplication (p2,partition (grand(n1,n2,n3))); + + CALL effacer_partie (1,19,16,58); + (* Permet d'effacer le message "Calcul en cours"*) + + WHEN '4': WRITE ("La s‚lection est : "); + WRITE ("^2"); + + CALL effacer_partie (1,14,13,1); + + CALL cadrer (10,14,22,50); + CALL fenetre_saisie (11,25); + + p3 := p1.carre (partition (n1)); + + WHEN '5': WRITE ("La s‚lection est : "); + WRITE ("DIV"); + + CALL cadrer (10,14,22,50); + CALL fenetre_saisie (11,25); + + CALL cadrer (15,19,22,50); + CALL fenetre_saisie (16,25); + + IF p2.pile_vide + (* Traitement de la division par + z‚ro.*) + THEN + + CALL position (17,45); + WRITELN ("IMPOSSIBLE... Division par Z‚ro"); + EXIT; + FI; + + IF ( (signe2 = '-') AND (signe1 =/= '-') ) + OR ( (signe2 =/= '-') AND (signe1 = '-') ) + + THEN + CALL position (19,15); + WRITE ("-"); + FI; + + p3 := p1.division (p2); + + WHEN '6': WRITE ("La s‚lection est : "); + WRITE ("MOD"); + + CALL cadrer (10,14,22,50); + CALL fenetre_saisie (11,25); + + CALL cadrer (15,19,22,50); + CALL fenetre_saisie (16,25); + + IF p2.pile_vide + (* Traitement de la division par + z‚ro.*) + THEN + + CALL position (17,45); + WRITELN ("IMPOSSIBLE... Division par Z‚ro"); + EXIT; + FI; + + IF ( (signe2 = '-') AND (signe1 =/= '-') ) + OR ( (signe2 =/= '-') AND (signe1 = '-') ) + + THEN + CALL position (19,15); + WRITE ("-"); + FI; + + p3 := p1.modulo (p2); + + + WHEN '7': WRITE ("La s‚lection est : "); + WRITE ("PGCD"); + + CALL cadrer (10,14,22,50); + CALL fenetre_saisie (11,25); + + CALL cadrer (15,19,22,50); + CALL fenetre_saisie (16,25); + + IF p2.pile_vide + (* Traitement de la division par + z‚ro.*) + THEN + + CALL position (17,45); + WRITELN ("IMPOSSIBLE... Division par Z‚ro"); + EXIT; + FI; + + IF ( (signe2 = '-') AND (signe1 =/= '-') ) + OR ( (signe2 =/= '-') AND (signe1 = '-') ) + + THEN + CALL position (19,15); + WRITE ("-"); + FI; + + + p3 := p1.pgcd (p2) + + + WHEN '8': WRITE ("La s‚lection est : "); + WRITE ("PPCM"); + CALL cadrer (10,14,22,50); + CALL fenetre_saisie (11,25); + + CALL cadrer (15,19,22,50); + CALL fenetre_saisie (16,25); + + IF p2.pile_vide + (* Traitement de la division par + z‚ro.*) + THEN + + CALL position (17,45); + WRITELN ("IMPOSSIBLE... Division par Z‚ro"); + EXIT; + FI; + + IF ( (signe2 = '-') AND (signe1 =/= '-') ) + OR ( (signe2 =/= '-') AND (signe1 = '-') ) + + THEN + CALL position (19,15); + WRITE ("-"); + FI; + + p3 := p1.ppcm (p2); + + OTHERWISE CALL effacer_partie (5,78,2,1); + CALL cadrer (3,7,2,79); + CALL fenetre_operation (i,j); + ESAC; + + CALL position (19,17); + + CALL p3.afficher_resultat; + + + END fenetre_operation; + +(* ------------------------------------------------------------------------ *) + + UNIT fenetre_saisie : PROCEDURE (i,j : INTEGER); + (* Cette proc‚dure permet de r‚aliser le choix entre la saisie d'un + entier court et long. Et permet d'effectuer la saisie du signe qui + sera g‚rer dans la proc‚dure ci dessus. *) + + VAR choix : CHAR, nbre : INTEGER; + + BEGIN + + WRITELN; (* Cette commande permet de vider le buffer *) + + CALL position (i,j); + + WRITELN ("1 : Entier court"); + CALL position (i+1,j); + WRITELN ("2 : Entier long"); + CALL position (i+2,j+2); + WRITELN ("Entrer votre choix : "); + + WRITELN; (* Cette commande permet de vider le buffer *) + + choix := chr (inchar); + + CALL position (i+2,j+23); + WRITELN (choix); + + WRITELN; (* Cette commande permet de vider le buffer *) + + (* La saisie d'un entier court n‚cessite une conversion et un empilement. + Alors que la saisie d'un entier long se fait par empilement. *) + + CASE choix + (* On gŠre le choix et le position de l'‚cran qui permet de savoir + si on manipule p1 (pour i = 11) ou p2 (pour i = 22). *) + + WHEN '1' : IF i = 11 + THEN + + CALL effacer_partie (5,29,9,21); + WRITELN; (* Cette commande permet de vider le buffer *) + CALL position (9,16); + WRITE ("' '"); + CALL position (9,17); + WRITELN; (* Cette commande permet de vider le buffer *) + signe1 := chr (inchar); + CALL position (9,17); + WRITE (signe1); + CALL position (9,20); + READ (nbre); + p1 := p1.transferer_pile (p1.conversion (nbre,n1) ) + ELSE + + CALL effacer_partie (5,29,14,21); + WRITELN; (* Cette commande permet de vider le buffer *) + CALL position (14,16); + WRITE ("' '"); + CALL position (14,17); + WRITELN; (* Cette commande permet de vider le buffer *) + signe2 := chr (inchar); + CALL position (14,17); + WRITE (signe2); + CALL position (14,20); + READ (nbre); + p2 := p2.transferer_pile (p2.conversion (nbre,n2) ) + + FI; + + WHEN '2' : IF i = 11 + THEN + + CALL effacer_partie (5,29,9,21); + WRITELN; (* Cette commande permet de vider le buffer *) + CALL position (9,16); + WRITE ("' '"); + CALL position (9,17); + WRITELN; (* Cette commande permet de vider le buffer *) + signe1 := chr (inchar); + CALL position (9,17); + WRITE (signe1); + CALL position (9,20); + WRITELN; (* Cette commande permet de vider le buffer *) + p1 := p1.saisir (9,20,n1) + ELSE + + CALL effacer_partie (5,29,14,21); + WRITELN; (* Cette commande permet de vider le buffer *) + CALL position (14,16); + WRITE ("' '"); + CALL position (14,17); + WRITELN; (* Cette commande permet de vider le buffer *) + signe2 := chr (inchar); + CALL position (14,17); + WRITE (signe2); + CALL position (14,20); + WRITELN; (* Cette commande permet de vider le buffer *) + p2 := p2.saisir (14,20,n2); + + FI; + + OTHERWISE CALL fenetre_saisie (i,j); + + ESAC; + + END fenetre_saisie; + +(* ------------------------------------------------------------------------ *) + + UNIT presentation : PROCEDURE; + (* Cette proc‚dure permet aprŠs le prompt d'afficher la maquette de + saisie et de r‚sultat. *) + + BEGIN + + CALL position (10,3); + WRITE ("Valeur nø1 : "); + CALL position (15,3); + WRITE ("Valeur nø2 : "); + CALL position (20,3); + WRITE ("R‚sultat : "); + CALL position (25,76); + WRITE ("D. V."); + + END presentation; + +(* ------------------------------------------------------------------------ *) + + UNIT aide : PROCEDURE; + (* Cette proc‚dure permet d'afficher le texte de l'aide. *) + + BEGIN + + CALL position (5,3); + WRITELN ("Le calcul consiste … :"); + WRITELN (" - S‚lectionner l'op‚ration d‚sir‚e."); + WRITELN (" - Choisir entre un entier court ou long."); + WRITELN (" - Mettre le signe de l'op‚ration dans le ' '."); + WRITELN (" - pour les valeur n‚gatives."); + WRITELN (" + pour ou rien pour les valeurs positives."); + WRITELN (" - Valider la saisie des valeurs "); + WRITELN ; + WRITELN (" Pour le carre, il n'a pas de deuxiŠme saisie."); + WRITELN ; + WRITELN (" Si le r‚sultat obtenu n'est pas visible … l'‚cran … cause d'un"); + WRITELN ("trop grand nombre de chiffres, il faut quitter ce logiciel et"); + WRITELN ("taper 'int projet > exemple' et reprendre l'application pr‚c‚dente."); + WRITELN ; + WRITELN (" Ceci est tap‚ n'est pas visible … l'‚cran. Pour visualiser la saisie"); + WRITELN ("et le r‚sultat il faut taper 'type exemple | more' … partir du DOS."); + WRITELN ; + WRITELN ("Quitter : permet de revenir au SytŠme d'Exploitation"); + + END aide; + + +VAR p1,p2,p3 : Entier_long, (* p1, p2 sont deux piles de saisie et p3 : une + pile r‚sultat. *) + +n1, n2, n3 : INTEGER, (* n1, n2 correspondent au nombres de chiffres + qui sont dans les piles n3 resort leur maximum ou + leur ‚galit‚. *) + +b1, b2, ecr : BOOLEAN, (* Les deux premeirs repr‚sentent respectivement + la l'obtention d'un r‚sultat n‚gatif pour la + soustraction et le test comme quoi la valeur + du reste est nulle pour le pgcd. + ecr va permetre au sommaire de passer de la + position de plein ‚cran … celle de petit ‚cran + sur les trois premiŠres lignes.*) + +signe1, signe2 : CHAR; (* Ils repr‚sentent respectivement les valeurs + des signe de la pile 1 et 2. *) + + +BEGIN + +(* Intialisation des trois piles. *) +p1 := new Entier_long; +p2 := new Entier_long; +p3 := new Entier_long; + +WRITE (chr(27), "[2J"); + +CALL position (4,19); +WRITELN ("LA CALCULATRICE DES ENTIERS COURTS ET LONGS"); +CALL position (19,76); +WRITELN ("D. V."); +ecr := TRUE; + +CALL prompt (12,6) ; + +END projet; diff --git a/examples/examples.old/projli11.log b/examples/examples.old/projli11.log new file mode 100644 index 0000000..c167626 --- /dev/null +++ b/examples/examples.old/projli11.log @@ -0,0 +1,1006 @@ +Program Htable; + + + + + + +(***************************************************************************) +(* *) +(* Projet 1 li1 par PAUL olivier et FERNANDEZ raphael *) +(* GESTION D'UNE TABLE DE HACHAGE *) +(* le 13-1-1994 *) +(* *) +(***************************************************************************) + + +const enter=10, + extrnb=8, + theta=0.6180339885; + + +(***************************************************************************) +(* *) +(* Definition d'une classe contenant les principaux *) +(* Outils utilises par la suite ... *) +(***************************************************************************) + +unit tools: class; (* les outils *) + +unit inchar:IIUWGraph function:integer; + var i:integer; +begin + do + i:=inkey; + if i<>0 then exit fi; (* attend q'un caractere soit saisi et *) + od; (* renvoie son code *) + result:=i; +end inchar; + +unit gotoxy:procedure(col,lig:integer); +var c,d,e,f:char, + i,j :integer; +begin + i:=lig div 10; + j:=lig mod 10; + c:= chr(48+i); (* positionne le curseur *) + d:= chr(48+j); (* en utilisant le driver ANSI *) + i:=col div 10; + j:=col mod 10; + e:= chr(48+i); + f:= chr(48+j); + write( chr(27), "[", c, d, ";", e, f, "H") +end gotoxy; + +unit cls : procedure; +begin + write(chr(27),"[2J"); (* efface l'ecran *) +end cls; + +unit reverse:procedure; +begin + write( chr(27),"[5m"); (* passe en mode blink *) +end reverse; + +unit normal:procedure; +begin + write( chr(27),"[0m"); (* passe en mode normal *) +end normal; + +unit box : procedure(x,y,z,w:integer); +var i:integer; +begin + call gotoxy(x,y); + write("É"); + for i:=2 to (z-1) do write("Í") od; + write("»"); + for i:=1 to (w-1) do + call gotoxy(x,y+i); (* affiche une boite au coord x,y *) + write("º"); (* de largeur z et de hauteur w *) + call gotoxy(x+z-1,y+i); + write("º"); + od; + call gotoxy(x,y+w); + write("È"); + for i:=2 to (z-1) do write("Í") od; + write("¼"); +end box; + +unit line:procedure; +var t:integer; +begin + call gotoxy(1,23); + for t:=1 to 79 do write("_") od; + call gotoxy(1,24); (* trace une ligne et positionne le curseur *) + for t:=1 to 79 do write(" ") od; + call gotoxy(1,24); +end line; + +unit decbin:function(input e:integer):arrayof integer; +var f,g:integer; +begin + array result dim(0:7); + for f:=0 to 7 do result(f):=0 od; + f:=e; + g:=0; (* convertisseur decimal-binaire *) + while (f<>0) do + result(g):=f mod 2; + f:=f div 2; (* on utilise les restes de la division par 2 *) + g:=g+1; + od; +end decbin; + +unit exp:function(x:integer):integer; +var t:integer; +begin + result:=1; (* calcule 2^x *) + for t:=1 to x do result:=result*2 od; +end exp; + +unit bindec:function(input e:arrayof integer;l:integer):integer; +var i,res:integer; +begin + i:=0; + result:=0; + while (i pour valider"); + call box(1,15,79,2); (* si l' element provient du clavier *) + call gotoxy(2,16); (* on agremente la presentation *) + write("mot : "); + fi; + t:=1; + if (f<>NONE) then read(f,c) else read(c) fi; + if (ord(c)=enter) then read(c) fi; + tamp:=newdicob; + if (f<>NONE) then (* saisie du nom *) + while ((t<24) and not(eoln(f))) + do + tamp.mot(t):=c; (* si l' element provient d'un fichier *) + read(f,c); + t:=t+1; + od; + else + while ((t<24) and (ord(c)<>enter)) + do + tamp.mot(t):=c; + read(c); (* si l' element provient du clavier *) + t:=t+1; + od; + if (t=24) then readln fi; + fi; + tamp.mot(t):=c; + tamp.mot(t+1):=chr(enter); (* on en marque la fin par enter *) + if (f<>NONE) then readln(f) fi; + if (f=NONE) then + call cls; + call line; + write("saisissez votre mot puis pour valider"); + call box(1,15,79,3); (* si l' element provient du clavier *) + call gotoxy(2,16); + write("traduction : "); + fi; + t:=1; + if (f<>NONE) then read(f,c) else read(c) fi; + if (f<>NONE) then (* saisie de la traduction *) + while ((t<100) and not(eoln(f))) + do + tamp.trad(t):=c; + read(f,c); (* si l' element provient d'un fichier *) + t:=t+1; + od; + else + while ((t<100) and (ord(c)<>enter)) + do + tamp.trad(t):=c; + read(c); (* si l' element provient du clavier *) + t:=t+1; + od; + fi; + tamp.trad(t):=c; + tamp.trad(t+1):=chr(enter); (* on en marque la fin par enter *) + if (f<>NONE) then readln(f) fi; + result:=tamp; +end readel; + +unit writel : tools procedure(e:dicob);(* ecriture de l 'element *) +var t:integer; +begin + t:=1; + call box(1,15,79,3); + call gotoxy(2,16); + while ((ord(e.mot(t))<>enter) and (t<=25)) + do + write(e.mot(t)); (* ecriture du mot *) + t:=t+1; + od; + write(" se traduit par "); + t:=1; + while ((ord(e.trad(t))<>enter) and (t<=25)) + do + write(e.trad(t)); (* et de la traduction *) + t:=t+1; + od; +end writel; + +unit supel :function(e1:dicob,e2:dicob):boolean; +var t:integer, + res:integer; +begin (* cherche si e1>e2 *) + res:=0; (* res=0 si e1=e2 ,res=-1 si e2>e1,res=1 si e1>e2 *) + t:=1; + while ((t<25) and (res=0) and (ord(e1.mot(t))<>enter) + and (ord(e2.mot(t))<>enter)) + do + if (ord(e1.mot(t))ord(e2.mot(t))) then res:=1 fi; + t:=t+1; + od; + if (ord(e1.mot(t))=enter) and (ord(e2.mot(t))<>enter) and (res=0) + then res:=-1 fi; (* le plus long est le plus grand *) + if (ord(e2.mot(t))=enter) and (ord(e1.mot(t))<>enter) and (res=0) + then res:=1 fi; (* idem *) + result:=(res=1); +end supel; + +unit egalel :function(input e1,e2:dicob):boolean; +var t:integer, (* cherche si deux elements sont egaux *) + res:integer; +begin + res:=0; + t:=1; + while ((t<25) and (res=0) and (ord(e1.mot(t))<>enter) + and (ord(e2.mot(t))<>enter)) + do + if (e1.mot(t)<>e2.mot(t)) then res:=1 fi; + t:=t+1; + od; + if (ord(e1.mot(t))<>ord(e2.mot(t))) then res:=1 fi; + result:=(res=0); +end egalel; + +unit extraction : tools function(e1:dicob;long:integer):integer; +var t:integer, (* function de hachage par extraction *) + tamp:arrayof integer, + rep:arrayof arrayof integer; +begin + array tamp dim(0:31); + for t:=0 to 31 do tamp(t):=0 od; + array rep dim(1:extrnb); + for t:=1 to extrnb do rep(t):=decbin(ord(e1.mot(t))) od;(* conversion *) + for t:=1 to extrnb do tamp(t-1):=rep(t)(t-1) od;(*on prend les extrnb*) + result:=((bindec(tamp,32) mod long)+1);(* premiers bits *) + (* voir remarque fonction suivante pour mod *) + kill(tamp); + for t:=1 to extrnb do kill(rep(t)) od; +end extraction; + +unit compression : tools function(e1:dicob;long:integer):integer; +var t,l,nb0,nb1,u:integer, (* function de hachage par compression *) + tamp:arrayof integer, + rep:arrayof arrayof integer; +begin + array tamp dim(0:7); + for t:=0 to 7 do tamp(t):=0 od; + l:=1; + while ((ord(e1.mot(l))<>enter) and (l<25)) do l:=l+1 od; + l:=l-1; (* longueur du mot *) + array rep dim(1:l+1); + for t:=1 to l do rep(t):=decbin(ord(e1.mot(t))) od; + for u:=0 to 7 do + nb0:=0;nb1:=0; + for t:=1 to l do + if (rep(t)(u)=0) then nb0:=nb0+1 fi; (* on calcule le nombre de 1 et *) + if (rep(t)(u)=1) then nb1:=nb1+1 fi; (* de 0 pour chaque bit *) + od; + if ((nb1 mod 2)=1) then tamp(u):=1 (* Xor *) + else tamp(u):=0 fi; + od; + result:=((bindec(tamp,8) mod long)+1);(* reconversion*) + kill(tamp); + for t:=1 to l do kill(rep(t)) od; +end compression;(*le mod permet de prendre une longueur de tableau variable*) + (* au detriment de la "precision" de la fonction *) + +unit division : tools function(e1:dicob;long:integer):integer; +var t,l,u,v:integer, (* function de hachage par division *) + tamp:arrayof integer, + rep:arrayof arrayof integer; +begin + l:=1; + while ((ord(e1.mot(l))<>enter) and (l<25)) do l:=l+1 od; + l:=l-1; + array rep dim(1:l+1); + array tamp dim(0:8*(l)); + for t:=0 to 8*l-1 do tamp(t):=0 od; + for t:=1 to l do rep(t):=decbin(ord(e1.mot(t))) od; (* conversion *) + u:=1; + v:=0; + for t:=0 to 8*l-1 do + tamp(t):=rep(u)(v); + v:=v+1; + if (v=8) then (* on recopie les conversions dans un seul tableau *) + v:=0; + u:=u+1; + fi; + od; + result:=(bindec(tamp,8*l) mod long)+1; (* que l 'on convertit *) + kill(tamp); + for t:=1 to l+1 do kill(rep(t)) od; +end division; + +unit multiplication : tools function(e1:dicob;long:integer):integer; +var pos:real, (* function de hachage par multiplication *) + t,l,u,v:integer, + tamp:arrayof integer, + rep:arrayof arrayof integer; +begin + l:=1; + while ((ord(e1.mot(l))<>enter) and (l<25)) do l:=l+1 od; + l:=l-1; + array rep dim(1:l+1); + array tamp dim(0:8*(l)); + for t:=0 to 8*l-1 do tamp(t):=0 od; + for t:=1 to l do rep(t):=decbin(ord(e1.mot(t))) od; + u:=1; + v:=0; (* idem division *) + for t:=0 to 8*l-1 do + tamp(t):=rep(u)(v); + v:=v+1; + if (v=8) then + v:=0; + u:=u+1; + fi; + od; + pos:=bindec(tamp,8*l)*theta; (* conversion *) + result:=(entier((pos-entier(pos))*long)+1); + kill(tamp); + for t:=1 to l+1 do kill(rep(t)) od; +end multiplication; + +(***************************************************************************) +(* *) +(* Definition de la classe table ainsi que des operations *) +(* utilisees par celle-ci ... *) +(***************************************************************************) + +unit table : tools class (type elem;function newelem:elem; +function egalelem(e1,e2:elem):boolean;function readelem(f:file):elem; +function supelem(e1,e2:elem):boolean; +function hachelem(e1:elem;l:integer):integer;procedure writelem(e:elem)); + +unit tree: class (el: elem); (* definition d 'un arbre binaire de recherche *) + var left,right: tree; +end tree; + +unit max:function (input t:tree):tree; +var tamp:tree, + continue:boolean; +begin + continue:=TRUE; + if (t=NONE) then + continue:=FALSE; + tamp:=NONE; (* calcule le plus grand element d 'un arbre *) + else + tamp:=t; + while continue + do + if (tamp.right<>NONE) then + tamp:=tamp.right; (* celui-ci se trouve en bas a droite *) + else continue:=FALSE; + fi; + od; + fi; + result:=tamp; + call line; + writeln("maximum trouve ... fait."); +end max; + +unit find:function(input t:tree;e:elem):tree; +var tamp: tree, + continue,ok :boolean; (* recherche d 'un elemnt *) +begin + continue:=TRUE; + if (t=NONE) then + tamp:=NONE; + ok:=FALSE; + else + tamp:=t; + ok:=FALSE; + while continue + do + if supelem(e,tamp.el) then + if (tamp.right<>NONE) then + tamp:=tamp.right; (* si l'arbre courant est plus petit on va a droite *) + else continue:=FALSE; + fi; + else + if egalelem(e,tamp.el) then + continue:=FALSE; (* si l'arbre courant est celui recherche on arrete *) + ok:=TRUE; + else + if (tamp.left<>NONE) then + tamp:=tamp.left; (* sinon on va a gauche *) + else continue:=FALSE; + fi; + fi; + fi; + od; + fi; + call line; + writeln("element trouve ... fait."); + if ok then result:=tamp; + else result:=NONE fi; +end find; + +unit add: function (input t: tree; e: elem):tree; + var tamp1,tamp2: tree, + continue :boolean; (* ajout d 'un element a un arbre *) +begin + continue:=TRUE; + if (t=NONE) then + t:=new tree(e); + continue:=FALSE; + else + tamp1:=t; + while continue + do + if supelem(e,tamp1.el) then + if (tamp1.right<>NONE) then + tamp1:=tamp1.right; (* idem recherche *) + else continue:=FALSE fi; + else + if (tamp1.left<>NONE) then + tamp1:=tamp1.left; + else continue:=FALSE fi; + fi; + od; + tamp2:=new tree(e);(* on cree un nouvel arbre *) + tamp2.left:=NONE; + tamp2.right:=NONE; + if supelem(e,tamp1.el) then tamp1.right:=tamp2; + else tamp1.left:=tamp2 fi;(*on le place*) + call line; + writeln("ajout classique ... fait."); + fi; + result:=t; +end add; + +unit last:function(input t:tree;input e:tree;output r:boolean):tree; +var tamp: tree, (* recherche l'element precedent un autre *) + continue,ok :boolean; +begin + continue:=TRUE; + ok:=FALSE; + if (t=NONE) then + ok:=FALSE; + else + tamp:=t; + while continue + do + if (tamp.right<>NONE) then + if egalelem(e.el,tamp.right.el) then + continue:=FALSE; + ok:=TRUE; (* idem recherche mais avec 2 possibilites *) + r:=TRUE; + fi; + fi; + if (tamp.left<>NONE) then + if egalelem(e.el,tamp.left.el) then + continue:=FALSE; + ok:=TRUE; + r:=FALSE; + fi; + fi; + if not(ok) then + if supelem(e.el,tamp.el) then + if (tamp.right<>NONE) then + tamp:=tamp.right; + else continue:=FALSE; (* deplacement *) + fi; + else + if (tamp.left<>NONE) then + tamp:=tamp.left; + else continue:=FALSE; + fi; + fi; + fi; + od; + fi; + call line; + writeln("element precedent trouve ... fait."); + if ok then result:=tamp; + else result:=NONE fi; +end last; + +unit sub: function (input t: tree;e:elem):tree; +var tamp2,tamp3,pred1,pred2: tree, + r1,r2:boolean; (* on enleve une element a un arbre *) +begin + tamp2:=find(t,e); (* on recherche la place de l' element *) + pred1:=last(t,tamp2,r1);(* son pere *) + if (tamp2<>NONE) then + if (tamp2=t) and (tamp2.left=NONE) then + t:=tamp2.right; + else + if (tamp2.left=NONE) then + if r1 then + pred1.right:=tamp2.right; + else + pred1.left:=tamp2.right; (* on raccorde *) + fi; + kill(tamp2); + else + tamp3:=max(tamp2.left);(* on cherche le max du sous arbre gauche *) + pred2:=last(t,tamp3,r2);(* et son pere *) + if (tamp3<>NONE) then + if r1 then + if (pred1<>NONE) then pred1.right:=tamp3; + else t:=tamp3; + fi; + if (pred2<>tamp2) then pred2.right:=tamp3.left fi; + tamp3.right:=tamp2.right; + tamp3.left:=pred2; (* on connecte *) + else + if (pred1<>NONE) then pred1.left:=tamp3; + else t:=tamp3; + fi; + if (pred2<>tamp2) then pred2.right:=tamp3.left fi; + tamp3.right:=tamp2.right; + tamp3.left:=pred2; + fi; + fi; + kill(tamp2); + fi; + fi; + else + call line; + writeln("element non touve ..."); + fi; + call line; + writeln("deletion terminee ... fait."); + result:=t; +end sub; + +unit proof:function(input t:tree):integer; +begin (* calcule la profondeur d 'un arbre recursivement*) + if t<>NONE then + result:=imax(proof(t.left),proof(t.right))+1; + else(* proof=max(proof(arbredroit),proof(arbregauche)) *) + result:=0; + fi; +end; + +unit total:procedure(input t:tree;input x,y,z:integer;input current:tree); +var i:integer;(* affiche un arbre recursivement *) +begin + if (t<>NONE) then + if (t.right<>NONE) and (t.left=NONE) then + call gotoxy(x,y); + write("e"); + y:=y+1; (* si le sous arbre droit existe on l' affiche *) + call gotoxy(x,y); + write("Ê"); + for i:=2 to (exp(z-2)) do write("Í") od; + x:=x+exp(z-2); + call total(t.right,x,y,z-1,current); + fi; + if (t.left<>NONE) and (t.right=NONE) then + call gotoxy(x,y); + write("e"); + y:=y+1; (* si le sous arbre gauche existe on l' affiche *) + call gotoxy(x-exp(z-2),y); + for i:=1 to (exp(z-2)) do write("Í") od; + write("Ê"); + x:=x-exp(z-2); + call total(t.left,x,y,z-1,current); + fi; + if (t.left<>NONE) and (t.right<>NONE) then + call gotoxy(x,y); + write("e"); + y:=y+1; + call gotoxy(x,y);(* si les deux existent on les affiche les deux *) + write("Ê"); + for i:=2 to (exp(z-2)) do write("Í") od; + x:=x+exp(z-2); + call total(t.right,x,y,z-1,current); + y:=y-1; + x:=x-exp(z-2); + call gotoxy(x,y); + write("e"); + y:=y+1; + call gotoxy(x-exp(z-2),y); + for i:=1 to (exp(z-2)) do write("Í") od; + write("Ê"); + x:=x-exp(z-2); + call total(t.left,x,y,z-1,current); + fi; + call gotoxy(x,y);(* sinon on affiche l'element *) + write("e"); + fi; +end total; + +unit tableau : procedure (input e,f:integer); +begin (* on affiche le tableau correspondant au code de hachage *) + if ((e1) or (e=1)) then + call box(30,10,10,10); + call gotoxy(31,15); (* tableau recherche *) + call reverse; + write(e); + call normal; + fi; + if (e+11) or (e-1=1) then + call box(10,10,10,10); (* le precedent *) + call gotoxy(11,15); + write(e-1); + fi; +end tableau; + +unit newtable : function (input long : integer) :arrayof tree; +var t : integer;(* cree une nouvelle table *) +begin + array result dim (1:long); + for t:=1 to long do result(t):=NONE od; + call line; + writeln("table initialisee ... fait."); +end newtable; + +unit ajoute :function(input T:arrayof tree;long:integer):arrayof tree; +var lg,pos:integer, (* ajoute un element a la table *) + e:elem, + current:tree; +begin + e:=readelem(none); (* lit l'element *) + call cls; + pos:=hachelem(e,long);(* calcule son hach code *) + call line; + writeln("hach code calcule ... fait. ",pos); + call tableau(pos,long);(* marque sa position *) + call line; + writeln("tableau designe ... fait."); + current:=find(T(pos),e);(* le cherche *) + if (current=NONE) then + T(pos):=add(T(pos),e);(* s'il n'existe pas l'ajoute *) + call line; + writeln("element ajoute ... fait."); + call cls; + lg:=proof(T(pos)); (* calcule la profondeur de l'arbre *) + if lg<6 then call total(T(pos),40,1,lg,current) else (* affiche l'arbre *) + call line; + write("l'arbre est trop grand pour etre imprime ..."); + fi; + else + call cls; + writeln("element deja stocke ..."); + fi; + result:=T; + call delay;(* attend que l'utilisateur ai vu l'arbre *) +end ajoute; + +unit supp :function(input T:arrayof tree;long:integer):arrayof tree; +var lg,pos:integer,(* supprime un element *) + e:elem, + current:tree; +begin + e:=readelem(none); (* idem ajoute *) + call cls; + pos:=hachelem(e,long); + call line; + writeln("hach code calcule ... fait. ",pos); + call tableau(pos,long); + call line; + writeln("tableau designe ... fait."); + current:=find(T(pos),e); + if (current<>NONE) then + T(pos):=sub(T(pos),e); + call line; + writeln("element detruit ... fait."); + call cls; + lg:=proof(T(pos)); + if lg<6 then call total(T(pos),40,1,lg,current) else + call line; + write("l'arbre est trop grand pour etre imprime ..."); + fi; + else + call cls; + writeln("non trouve ..."); + fi; + call delay; + result:=T; +end supp; + +unit recherche :procedure(input T:arrayof tree;long:integer); +var pos:integer,(* recherche un element dans la table *) + current:tree, + e:elem; +begin + e:=readelem(none);(* idem ajoute *) + call cls; + pos:=hachelem(e,long); + call line; + writeln("hach code calcule ... fait. ",pos); + call tableau(pos,long); + call line; + writeln("tableau designe ... fait."); + current:=find(T(pos),e); + call cls; + if (current<>NONE) then call writelem(current.el);(* ecrit le resultat *) + else writeln("non trouve ...") fi;(* de la recherche *) + call line; + writeln("recherche terminee ... fait."); + call delay; +end recherche; + +unit demo :function(input T:arrayof tree;long:integer):arrayof tree; +var fich:file,(*stocke automatiquement des elements contenus dans un fichier*) + c:char, + pos,lg:integer, + e:elem, + current:tree; +begin + open(fich,text,unpack("data.dem"));(* on ouvre le fichier *) + call line; + writeln("ouverture du fichier ... fait."); + call reset(fich); (* en lecture *) + while not(eof(fich)) + do + e:=readelem(fich);(* idem ajoute *) + pos:=hachelem(e,long); + call line; + writeln("hach code calcule ... fait. "); + call tableau(pos,long); + call line; + writeln("tableau designe ... fait."); + current:=find(T(pos),e); + if (current=NONE) then + T(pos):=add(T(pos),e); + call line; + writeln("element ajoute ... fait."); + lg:=proof(T(pos)); + call cls; + if lg<6 then call total(T(pos),40,1,lg,current) else + call line; + write("l'arbre est trop grand pour etre imprime ..."); + fi; + call line; + writeln("arbre imprime ... fait."); + else + call cls; + writeln("element deja stocke ..."); + fi; + od; + result:=T; +end demo; + +unit numb:function(input T:tree):integer; +begin (* calcule le nombre de sommets par arbre recursivement *) + if (T<>NONE) then + result:=numb(T.left)+numb(T.right); + else (* nbsom=nbsom(arbregauche)+nbsom(arbredroit) *) + result:=1; + fi; +end numb; + +unit stats:procedure(input T:arrayof tree;long:integer); +var u,s1,s2,s3,max1,max2:integer, + s,v:arrayof integer;(* calcule quelques satistiques sur les donnees *) + (* stockees dans la table *) +begin + s1:=0;s2:=0;s3:=0; + array s dim(1:long); + array v dim(1:long); + for u:=1 to long do + if (T(u)<>NONE) then + s1:=s1+1;(* nombre d'arbre utilises *) + s(u):=numb(T(u))-1; + v(u):=proof(T(u)); + s2:=s2+s(u);(* nombre total de sommets *) + s3:=s3+v(u);(* profondeur totale de la table *) + fi; + od; + max1:=1;max2:=1; + for u:=1 to long do + if (s(u)>s(max1)) then max1:=u fi; + if (v(u)>s(max2)) then max2:=u fi; + od; + call cls; + call gotoxy(10,5); + write("Nombre Total de sommets :",s2); + call gotoxy(10,7); + write("Nombre Total d 'arbres non vides :",s1); + if s1<>0 then + call gotoxy(10,9); + write("Nombre moyen de sommet par arbre :",s2/s1); + call gotoxy(10,15); + write("Profondeur moyenne :",s3/s1); + else + call gotoxy(10,9); + write("Tableau non rempli ..."); + fi; + call gotoxy(10,11); + write("Nombre de sommets de l'Arbre le plus important :",s(max1)); + call gotoxy(10,13); + write("Profondeur de l'Arbre le plus grand :",v(max2)); + call box(7,3,70,15); + call line; + write("stats calculees ... fait."); + call delay; +end stats; + + +unit op:procedure(size:integer); +var T:arrayof tree, (* menu *) + c,i:integer; +begin + T:=newtable(size); + while (i<>6) do + call cls; + call line; + write("utilisez les fleches haut/bas pour vous deplacer, droite pour + valider"); + call gotoxy(1,7); + i:=1; + c:=0; + writeln(" Inserer un element");writeln; + writeln(" Rechercher un element");writeln; + writeln(" Supprimer un element");writeln; + writeln(" Demo");writeln; + writeln(" Statistiques");writeln; + writeln(" Quitter");writeln; + call box(5,4,50,17); + call box(10,4+2*i,35,2); + while (c<>-77) do + c:=inchar; + if (c=-80) or (c=-72) then + call gotoxy(10,4+2*i); + write(" "); + call gotoxy(10,4+2*(i+1)); + write(" "); + call gotoxy(10,4+2*i+1); + write(" "); + call gotoxy(44,4+2*i+1); + write(" "); + if (c=-80) then i:=i+1 fi; + if (c=-72) then i:=i-1 fi; + if (i=7) then i:=1 fi; + if (i=0) then i:=6 fi; + call box(10,4+2*i,35,2); + fi; + od; + call cls; + case i + when 1 :T:=ajoute(T,size); + when 2 :call recherche(T,size); + when 3 :T:=supp(T,size); + when 4 :T:=demo(T,size); + when 5 :call stats(T,size); + esac; + od; + writeln("operations terminees ... fait."); +end op; + +end table; + + +(***************************************************************************) +(* *) +(* PROGRAMME PRINCIPAL *) +(* *) +(***************************************************************************) + +var stTable:table, + size,algo,i:integer, + c:integer; +begin (* prog principal *) + i:=1; + while (i<>5) do + pref tools block + begin + call cls; + call line; + write("utilisez les fleches haut/bas pour vous deplacer, droite pour + valider"); + call gotoxy(1,7); + writeln(" EXTRACTION");writeln; + writeln(" COMPRESSION");writeln; + writeln(" DIVISION");writeln; + writeln(" MULTIPLICATION");writeln; + writeln(" QUITTER");writeln; + call box(5,4,50,15); + call box(10,4+2*i,35,2); + while (c<>-77) do + c:=inchar; + if (c=-80) or (c=-72) then + call gotoxy(10,4+2*i); + write(" "); + call gotoxy(10,4+2*(i+1)); + write(" "); + call gotoxy(10,4+2*i+1); + write(" "); + call gotoxy(44,4+2*i+1); + write(" "); + if (c=-80) then i:=i+1 fi; + if (c=-72) then i:=i-1 fi; + if (i=6) then i:=1 fi; + if (i=0) then i:=5 fi; + call box(10,4+2*i,35,2); + fi; + od; + call cls; + if (i<>5) then + call cls; + call line; + write("!! (petites tailles)+(beaucoup d'elts)=(pbs de memoire)"); + call box(20,15,35,2); + call gotoxy(21,16); + write("taille du tableau desire : "); + read(size); + fi; + call cls; + c:=0; + end; + if (i=1) then + pref table(dicob,newdicob,egalel,readel,supel,extraction,writel) block + begin + stTable:= new table(dicob,newdicob,egalel,readel,supel, + extraction,writel);(* on definit les operations … utiliser *) + call op(size); (* dans la table sur elem *) + end; + fi; + if (i=2) then + pref table(dicob,newdicob,egalel,readel,supel,compression,writel) block + begin + stTable:= new table(dicob,newdicob,egalel,readel,supel, + compression,writel);(* idem *) + call op(size); + end; + fi; + if (i=3) then + pref table(dicob,newdicob,egalel,readel,supel,division,writel) block + begin + stTable:= new table(dicob,newdicob,egalel,readel,supel, + division,writel);(* idem *) + call op(size); + end; + fi; + if (i=4) then + pref table(dicob,newdicob,egalel,readel,supel,multiplication,writel) block + begin + stTable:= new table(dicob,newdicob,egalel,readel,supel, + multiplication,writel);(* idem *) + call op(size); + end; + fi; + od; +end Htable; + + + (* 1006 *) \ No newline at end of file diff --git a/examples/examples.old/search.log b/examples/examples.old/search.log new file mode 100644 index 0000000..4c86fa1 --- /dev/null +++ b/examples/examples.old/search.log @@ -0,0 +1,402 @@ +PROGRAM BACKTRACKING; + UNIT BACKTRACK: CLASS; + HIDDEN SE,ELEM,TOP; + VAR ROOT:NODE,SEARCH:SE,FOUND,OPT:NODE, + NUMBER_OF_NODES,NUMBER_OF_LEAVES,NUMBER_OF_ANSWERS:INTEGER; + + UNIT NODE: COROUTINE(FATHER:NODE); + VAR NSONS,LEVEL: INTEGER , DEADEND:BOOLEAN; + UNIT VIRTUAL LEAF: FUNCTION :BOOLEAN; + END LEAF; + UNIT VIRTUAL ANSWER :FUNCTION :BOOLEAN; + END ANSWER; + UNIT VIRTUAL LASTSON: FUNCTION : BOOLEAN; + END LASTSON; + UNIT VIRTUAL NEXTSON: FUNCTION : NODE; + END NEXTSON; + UNIT VIRTUAL EQUAL : FUNCTION (W:NODE):BOOLEAN; + END EQUAL; + UNIT VIRTUAL COST: FUNCTION :REAL; + END COST; + BEGIN + IF FATHER =/= NONE + THEN + LEVEL:=FATHER.LEVEL+1 + ELSE + LEVEL:=0 + FI; + END NODE; + + UNIT OK: FUNCTION (V:NODE):BOOLEAN; + VAR W:NODE; + BEGIN + IF V=NONE THEN RESULT:=FALSE; RETURN FI; + RESULT:=TRUE; W:=V.FATHER; + WHILE W =/= NONE + DO + IF V.EQUAL(W) THEN RESULT:=FALSE; RETURN FI; + W:=W.FATHER + OD + END OK; + + UNIT PURGE: PROCEDURE (V:NODE); + VAR W: NODE; + BEGIN + IF V=NONE THEN RETURN FI; + DO + W:=V.FATHER; KILL(V); + IF W=NONE THEN RETURN FI; + W.NSONS:=W.NSONS-1; + IF W.NSONS =/= 0 THEN RETURN FI; + V:=W + OD; + END PURGE; + + VAR TOP:ELEM; + + UNIT ELEM: CLASS (NEXT:ELEM, V:NODE); + END ELEM; + + UNIT VIRTUAL INSERT: PROCEDURE(V:NODE); + BEGIN + TOP:=NEW ELEM(TOP,V); + END INSERT; + + UNIT VIRTUAL DELETE: FUNCTION :NODE; + VAR E:ELEM; + BEGIN + IF TOP =/= NONE + THEN + RESULT:=TOP.V; + E:=TOP; TOP:=TOP.NEXT; KILL(E); + FI; + END DELETE; + + UNIT SE: COROUTINE ; + VAR I:INTEGER,V,W:NODE; + BEGIN + RETURN; CALL INSERT(ROOT); + DO + V:=DELETE; + IF V=NONE THEN EXIT FI; + ATTACH(V); + IF V.ANSWER + THEN + NUMBER_OF_ANSWERS:=NUMBER_OF_ANSWERS+1; + FOUND:=V; + IF OPT=NONE ORIF V.COST < OPT.COST + THEN + OPT:=V + FI; + DETACH; + (* HERE THE USER OF BACKTRACK MAY UNDERTAKE SOME ACTIONS + ON THE ANSWER NODES. IF NOT NECESSARY DO ATTACH *) + ELSE + IF V.DEADEND + THEN + NUMBER_OF_LEAVES:=NUMBER_OF_LEAVES+1; + CALL PURGE(V); + ELSE + DO + W:=V.NEXTSON; V.NSONS:=V.NSONS+1; + NUMBER_OF_NODES:=NUMBER_OF_NODES+1; + IF OK(W) + THEN + W.DEADEND:=W.LEAF; CALL INSERT(W); + FI; + IF V.LASTSON THEN EXIT FI; + OD; + FI; + FI; + OD; + FOUND:=NONE; + END SE; + + + UNIT KILLALL :PROCEDURE; + VAR V:NODE; + BEGIN + DO + V:=DELETE; + IF V=NONE THEN RETURN FI; + CALL PURGE(V); + OD; + END KILLALL; + + BEGIN + SEARCH:=NEW SE; + INNER; + KILL(SEARCH); CALL KILLALL; + END BACKTRACK; + + +UNIT BESTSEARCH: BACKTRACK CLASS; + (* BESTSEARCH USES A PRIORITY QUEUE FOR NODES. + QUEUE IS ORGANIZED AS A HEAP IN THE ARRAY A. + THE FIRST ELEMENT A(1) IS THE LEAST ONE. *) + HIDDEN A,B,X,K,M,I,J; + VAR A,B:ARRAYOF EX_NODE, X : EX_NODE, K,M,I,J:INTEGER; + (*M- CURRENT ARRAY A LENTGTH + K- CURRENT HEAP LENGTH + B- SRATCH ARRAY *) + + UNIT EX_NODE : NODE CLASS; + UNIT VIRTUAL LESS : FUNCTION (X: EX_NODE) : BOOLEAN; + END LESS; + END EX_NODE; + + UNIT VIRTUAL DELETE: FUNCTION :EX_NODE; + + BEGIN + IF K=0 THEN RETURN FI; + RESULT:=A(1); X:=A(K); K:=K-1; + IF K=0 + THEN + KILL(A); RETURN + FI; + IF K*2=1 + DO + IF A(I).LESS( X ) THEN EXIT FI; + A(J):=A(I); J:=I; I:= J DIV 2 + OD; + A(J):=X + END INSERT; + + BEGIN + INNER; + CALL KILLALL; + END BESTSEARCH; + + + + VAR N,Q:INTEGER,H1,H2,H3:CHAR; + (* Q - BOAT CAPACITY, N- NUMBER OF CANNIBALS, N- NUMBER OF MISSIONARIES *) + +BEGIN + DO + WRITE(" NUMBER OF PERSONS "); + WRITE(" (IF END OF SESSION WRITE 0) ="); + READLN(N); + IF N=0 THEN EXIT FI; + WRITE(" BOAT CAPACITY="); + READLN(Q); + + PREF BESTSEARCH BLOCK + VAR M,C:INTEGER; + (* M- NUMBER OF MISSIONARIES, C- NUMBER OF CANNIBALS ON THE BOAT *) + + UNIT STATE: EX_NODE CLASS(ML,CL:INTEGER); + VAR MR,CR:INTEGER, LEFT:BOOLEAN; + + (* ML- NUMBER OF MISSIONARIES ON THE LEFT BANK OF THE RIVER + MR- NUMBER OF MISSIONARIES ON THE RIGHT BANK OF THE RIVER + CL- NUMBER OF CANNIBALS ON THE LEFT BANK OF THE RIVER + CR- NUMBER OF CANNIBALS ON THE RIGHT BANK OF THE RIVER + LEFT- TRUE IFF THE BOAT IS ON THE LEFT BANK OF THE RIVER *) + + UNIT VIRTUAL ANSWER: FUNCTION: BOOLEAN; + BEGIN + RESULT:=ML=0 AND CL=0 + END ANSWER; + + UNIT VIRTUAL LEAF: FUNCTION : BOOLEAN; + BEGIN + IF ML<0 ORIF MR<0 ORIF CL<0 ORIF CR<0 ORIF + ML>N ORIF MR>N ORIF CL>N ORIF CR>N ORIF + ML0 ORIF MR0 + THEN + RESULT:=TRUE + FI + END LEAF; + + + UNIT VIRTUAL LASTSON: FUNCTION :BOOLEAN; + BEGIN + IF C=0 AND M=Q + THEN + RESULT:=TRUE; M:=0; C:=0; + FI; + END; + + UNIT VIRTUAL NEXTSON : FUNCTION :STATE; + BEGIN + C:=C+1; + IF M=0 + THEN + IF C>Q + THEN + C:=0; M:=1 + FI + ELSE + IF MQ + THEN + C:=0; M:=M+1; + FI + FI; + IF LEFT + THEN + IF C+M"); + ELSE + WRITE("<-"); + FI; + WRITELN(" ",W.MR,W.CR); + OD; + KILL(AT); + END DISPLAY; + + VAR BOOL1:BOOLEAN; + + BEGIN + ROOT:=NEW STATE(NONE,N,N); + WRITE("DO YOU WANT TO OPTIMIZE "); + WRITELN("OR TO PRINT ALL THE SOLUTIONS ?"); + WRITELN(" (ANSWER OPT OR ALL)"); + READLN(H1,H2,H3); + IF H1='O' AND H2='P' AND H3='T' + THEN + DO + ATTACH(SEARCH); + IF FOUND=NONE THEN EXIT FI; + IF OPT =/= NONE ANDIF OPT.COST upper(contenu)) + then number := upper(contenu) - position + 1 + fi; + array result.contenu dim(1:number); + for i:=1 to number do + result.contenu(i) := contenu(position+i-1); + od; + + END Copie; + + + (**********************************************************************) + (**********************************************************************) + (******************** D‚claration de l'UNIT Insert ********************) + (**********************************************************************) + (********** On insere des caractŠres dans le tableau contenu **********) + (**********************************************************************) + + + UNIT Insert : procedure(t:typetext); + +(* A partir de la position courante du type courant, on insŠre la chaŒne de + caractŠres repr‚sent‚e par t. + Si la chaŒne … ins‚rer est vide, on quitte la proc‚dure. + Si la chaŒne courante, c'est-…-dire qui va recevoir la chaŒne t, est vide + alors le r‚sultat est cette chaŒne t. + Sinon + -On cr‚e une tableau temporaire de longueur ‚gale … la taille de la chaŒne + de caractŠres … ins‚rer plus la taille de la chaŒne de caractŠres dans la- + quelle va se faire l'insertion. + -On recopie dans le tableau temporaire la chaŒne, qui ˆtre modifi‚e, de son + d‚but jusqu'… sa position courante moins un. + -On y recopie ensuite la chaŒne t. + -On y copie enfin le reste de la premiŠre chaŒne, c'est-…-dire de la posi- + tion courante plus un jusqu'… sa fin. *) + + VAR temp:arrayof char, + l,i,j : integer; + + BEGIN + + if (t=none) then exit fi; + + if (contenu=none) + then + contenu := t.contenu; + exit; + fi; + + l := upper(contenu)+upper(t.contenu); + + array temp dim (1:l); + + for i:=1 to (position-1) do temp(i) := contenu(i) od; + + for j:=1 to upper(t.contenu) do + temp(i) := t.contenu(j); + i := i + 1 ; + od; + + for j:= position to upper(contenu) do + temp(i) := contenu(j); + i := i + 1 ; + od; + + kill(contenu); + contenu := copy(temp); + kill(temp); + + END Insert; + + + (**********************************************************************) + (******************** D‚claration de l'UNIT Delete ********************) + (**********************************************************************) + (************* On efface des caractŠres du tableau contenu ************) + (**********************************************************************) + + + UNIT Delete : procedure(number:integer); + + VAR i,j,l : integer; + VAR temp : arrayof char; + + BEGIN + + if ( (contenu=none) or (number<=0) ) + (* ChaŒne vide ou longueur incorrect *) + then exit; + fi; + + if ( position + number - 1 > upper(contenu) ) + then l := position - 1 + else l := upper(contenu) - number; + fi; + + array temp dim (1:l); + + for i:=1 to (position-1) do + temp(i) := contenu(i); + od; + + for j:=(position + number) to upper(contenu) do + temp(i) := contenu(j); + i := i + 1; + od; + + kill(contenu); + contenu := copy(temp); + kill(temp); + + + END Delete; + + + (**********************************************************************) + (************** D‚claration de l'UNIT Rechercher_Position *************) + (**********************************************************************) + (**** On recherche une suite de caractŠres dans le tableau contenu ****) + (**********************************************************************) + + + UNIT Rechercher_Position : function (s:typetext) : integer; + +(* la recherche de la chaŒne de caractŠres s revient … comparer tous les + ‚l‚ments du tableau s.contenu avec ceux du tableau contenu de la variable + courante mais … partir d'une position pr‚cise. + On recherche le caractŠre correspondant … l'indice 1 de s.contenu dans le + tableau contenu courant, c'est-…-dire de 1 … un certain indice. + A partir de cet indice, on compare les caractŠres des indices suivants avec + ceux du s.contenu variant donc de 2 jusqu'… trouver un caractŠre different + ou la fin du tableau ce qui signifierait que la chaŒne a ‚t‚ trouv‚e, au- + quel cas on retourne la valeur de l'entier correspondant … l'indice de + commencement de recherche dans contenu. Si la chaŒne n'est pas trouv‚e, + on retourne 0. *) + + VAR i,j,temp : integer, + fin,occurence : boolean; + + BEGIN + + if (contenu = none) + then + result := 0; + exit; + fi; + + i := 1; + j := 1; + temp := 0; + fin := false; + occurence := false; + + while( ( i <= upper(contenu) ) and not(fin) ) do + if (contenu(i) = s.contenu(j)) + then j := j+1 + else j := 1 + fi; + + if (contenu(i) = s.contenu(1)) + then + if not(occurence) + then + temp := i; + occurence := true; + else + if (j=1) + then + i := temp; + occurence := false; + fi; + fi; + fi; + + if (j>upper(s.contenu)) + then fin := true; + else i := i + 1; + fi; + + od; + + if fin + then result := i - upper(s.contenu) + 1 + else result := 0 + fi; + + END Rechercher_Position; + + + (**********************************************************************) + (******************** D‚claration de l'UNIT Suivant *******************) + (**********************************************************************) + (* On incr‚mente la variable position rep‚rant la position courante *) + (********************* du tableau contenu *********************) + (**********************************************************************) + + + UNIT Suivant : procedure ; + +(* On incr‚mente simplement la variable position, sauf si : + - on est … la fin de la chaŒne de caractŠres + - si cette chaŒne est vide *) + + BEGIN + if (contenu=none) then exit fi; + + if ( position < upper(contenu) ) then position := position +1 fi; + END Suivant; + + + (**********************************************************************) + (******************* D‚claration de l'UNIT Precedent ******************) + (**********************************************************************) + (** On d‚cr‚mente la variable position rep‚rant la position courante **) + (************************ du tableau contenu *************************) + (**********************************************************************) + + + UNIT Precedent : procedure ; + +(* On d‚cr‚mente simplement la variable position, sauf si : + - on est au d‚but de la chaŒne de caractŠres + - si cette chaŒne est vide *) + + BEGIN + if (contenu=none) + then exit + fi; + if ( position <> 1 ) + then position := position -1 + fi; + + END Precedent; + + + (**********************************************************************) + (******************* D‚claration de l'UNIT Majuscule ******************) + (**********************************************************************) + (* On transforme les lettres minuscules du tableau contenu en lettres *) + (******** majuscules sur une longueur d‚finie par l'utilisateur *******) + (**********************************************************************) + +(***************************************************************************** + + Si la chaŒne de caractŠres est vide, le traitement est inutile. + Sur une longueur l, on va transformer les lettres minuscules en majuscules + pour la proc‚dure Majuscule, et les lettres majuscules en minuscules pour + la proc‚dure Minuscules. + Pour ces deux traitements l'algorithme est le mˆme sauf pour la conversion. + Il repose sur la constatation suivante : + + - la conversion ne marche que pour les lettres alphab‚tiques … savoir : + * de 'a'..'z' pour la proc‚dure Majuscule + * de 'A'..'Z' pour la proc‚dure Minuscule + + - les caractŠres ascii ont une valeur d‚cimale + * de 65 --> 90 pour 'A' --> 'Z' + * de 97 --> 122 pour 'a' --> 'z' + + - le passage, pour la valeur d‚cimale du code ascii, : + * d'une lettre Majuscule … une lettre Minuscule est de +32 + * d'une lettre Minuscule … une lettre Majuscule est de -32 + + - Deux fonctions sont disponibles en loglan, avec int un entier (INTEGER) + et chr un caractŠre (CHAR) + * chr(int) = car : retourne le caractŠre car du code ascii int. + * ord(car) = int : retourne le code ascii int du caractŠte car. + + Il suffit donc, suivant la proc‚dure appel‚, de v‚rifier si le caractŠre + correspond bien … l'intervalle … traiter, puis de faire la conversion, … + savoir r‚cup‚rer le code ascii du caractŠre et de lui ajouter ou retancher + 32 et de reconvertir dans le caractŠre correspondant … cette nouvelle va- + leur calcul‚e. + +*****************************************************************************) + + + UNIT Majuscule : procedure(l:integer); + + VAR i,pos,value : integer; + + BEGIN + + if (contenu=none) then exit fi; + + pos := position; + + for i:=1 to l do + if (pos>upper(contenu)) then exit fi; + + value := ord(contenu(pos)); + if ((value>=97) and (value<=122)) then contenu(pos) := chr(value-32) fi; + pos := pos + 1; + + od; + + END Majuscule; + + + (**********************************************************************) + (******************* D‚claration de l'UNIT Minuscule ******************) + (**********************************************************************) + (* On transforme les lettres majuscules du tableau contenu en lettres *) + (******* minuscules sur une longueur d‚finie par l'utilisateur ******) + (**********************************************************************) + + + UNIT Minuscule : procedure(l:integer); + + (* voir explication dans la unit Majuscule *) + + VAR i,pos,value : integer; + + BEGIN + if (contenu=none) then exit fi; + + pos := position; + for i:=1 to l do + if (pos>upper(contenu)) then exit fi; + + value := ord(contenu(pos)); + if ((value>= 65) and (value<=90)) then contenu(pos) := chr(value+32) fi; + + pos := pos + 1; + od; + END Minuscule; + + + (**********************************************************************) + (*************** D‚claration de l'UNIT Position_courante **************) + (**********************************************************************) + (****** On transmet la position courante dans le tableau contenu ******) + (**********************************************************************) + + + UNIT Position_courante : function : integer; + +(* On retourne la valeur de la position courante du type concern‚. Il suffit + de donner la valeur de la variable position. Si la chaŒne concern‚e est + vide, on retourne 0 *) + + BEGIN + if (contenu<>none) + then result := position + else result := 0 + fi; + END Position_Courante; + + + (**********************************************************************) + (*************** D‚claration de l'UNIT Nouvelle_Position **************) + (**********************************************************************) + (******* On change la position courante dans le tableau contenu *******) + (**********************************************************************) + + + UNIT Nouvelle_Position : procedure(pos:integer); + +(* A partir d'une position, repr‚sent‚e par la variable pos donn‚e par l-utili + sateur, on repositionne la position courante dans le tableau contenu sur + un autre ‚l‚ment de celui-‡i. Cela revient donc … affecter … la variable + position cette valeur pos. + Cependant, + - Si la chaŒne est vide ou si la nouvelle position d‚sir‚e est inf‚rieure + ou ‚gale … 0, on ne fait rien. + - Si la nouvelle position est sup‚rieure … la taille de la chaŒne de ca- + ractŠres, on se positionne sur le dernier ‚l‚ment de cette chaŒne. *) + + BEGIN + if ( (pos <= 0) or (contenu=none) ) then exit fi; + + if (upper(contenu) < pos) + then position := upper(contenu) + else position := pos + fi; + END Nouvelle_Position; + + + (**********************************************************************) + (******************** D‚claration de l'UNIT Length ********************) + (**********************************************************************) + (********** On transmet la longueur dans le tableau contenu ***********) + (**********************************************************************) + + + UNIT Length : function : integer; + +(* On retourne la longueur de la chaŒne de caractŠres caract‚risant le type + courant. Il suffit de donner la taille de la variable contenu le caract‚- + risant, sauf si la chaŒne est vide, dans quel cas on retourne 0. +*) + + BEGIN + if (contenu=none) + then result := 0 + else result := upper(contenu); + fi; + END Length; + + + END typetext; + + +(****************************************************************************) +(***************** Fin de la D‚claration de l'UNIT TYPETEXT ****************) +(****************************************************************************) + + + +(****************************************************************************) +(************************ Proc‚dures et fonctions *************************) +(****************************************************************************) + + + +(***************************************************************************** + Cette fonction retourne la valeur d‚cimale correspondant … la touche + s‚lectionn‚e +*****************************************************************************) + + + UNIT Inchar : IIUWgraph function : integer; + + VAR i:integer; + + BEGIN + do + i:=inkey; + if (i<>0) then exit fi; + od; + result := i; + + END Inchar; + + +(***************************************************************************** + Cette proc‚dure efface l'‚cran +*****************************************************************************) + + + UNIT clear : procedure ; + BEGIN + write(chr(27),"[2J"); + END clear; + + +(***************************************************************************** + Cette proc‚dure positionne le curseur l'‚cran em mode texte (80 x 25) +*****************************************************************************) + + + UNIT SetCursor : procedure(row,column : integer); + VAR c,d,e,f : char, + i,j : integer; + BEGIN + i := row div 10; + j := row mod 10; + c := chr(48+i); + d := chr(48+j); + i := column div 10; + j := column mod 10; + e := chr(48+i); + f := chr(48+j); + write(chr(27),"[",c,d,";",e,f,"H"); + END SetCursor; + + +(***************************************************************************** + + Cette proc‚dure initialise l'‚cran. Elle : + - affiche le menu + - pr‚pare l'‚cran pour y ‚crire les diff‚rents r‚sultats + +*****************************************************************************) + + + UNIT initialisation : procedure ; + + VAR i,j : integer; + + BEGIN + + call clear; + + write("É"); + for i:=1 to 78 do write("Í") od; + write("»"); + writeln(" 1. Saisie du TEXTE1 2. Saisie du TEXTE2"); + writeln(" 3. Longueur du TEXTE1 4. ConcatŠne le TEXTE1 avec le TEXTE2"); + writeln(" a. Position courante dans TEXTE1 n. Nouvelle position dans TEXTE1"); + writeln(" s. Position suivante dans TEXTE1 p. Position pr‚c‚dente dans TEXTE1"); + writeln(" c. Copie une chaŒne du TEXTE1 d. Supression d'une chaŒne dans TEXTE1"); + writeln(" i. Insertion d'une chaŒne dans TEXTE1"); + writeln(" u. Conversion de majuscules en minuscules"); + writeln(" m. Conversion de minuscules en majuscules ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍ"); + writeln(" r. Recherche la position d'une chaŒne dans TEXTE1 º ESC. Quitter "); + write("È"); + for i:=1 to 78 do write("Í") od; + write("¼"); + for j:=0 to 1 do + for i:=0 to 8 do + call setcursor(2+i,1+79*j); + write("º"); + od; + od; + + call setcursor(12,1); + write("Question : "); + + call setcursor(15,1); + write("R‚sultat : "); + + call setcursor(17,1); + writeln("TEXTE1"); + for i := 1 to 80 do write("Ä") od; + call setcursor(23,1); + for i := 1 to 80 do write("Ä") od; + + call setcursor(24,32); + writeln("Votre choix : "); (* attente d'un choix du menu *) + call SetCursor(24,46); + + END initialisation; + + +(***************************************************************************** + + Cette proc‚dure affiche certains messages et r‚initialise l'‚cran + pour pouvoir y afficher les prochains r‚sultats + +*****************************************************************************) + + + UNIT reinitialisation : procedure(inout choix:integer); + + VAR i : integer; + + BEGIN + + if ( (choix=49) or (choix=52) or (choix=100) or (choix=105) + or (choix=109) or (choix=117) ) + then + call setcursor(19,1); + for i:=1 to 150 do write(" ") od; + call setcursor(19,1); + if (t1<>none) then call t1.ecrire fi; + call SetCursor(15,12); + write("Voir TEXTE1"); + fi; + + call SetCursor(24,46); + writeln(" "); + call SetCursor(24,46); + choix := inchar; + writeln(chr(choix)); + + call setcursor(12,11); + for i := 1 to 180 do write(" ") od; + call setcursor(15,12); + for i := 1 to 80 do write(" ") od; + + END reinitialisation; + + +(**************************************************************************** + + Cette proc‚dure traite la demande de l'utilsateur et appelle donc + les proc‚dures ou fonctions correspondantes. + On travaille sur le code ascii des touches s‚lectionn‚es. + + 27 ---> touche ESC + 49 ---> touche 1 + 50 ---> touche 2 + 51 ---> touche 3 + 52 ---> touche 4 + 97 ---> touche a + 99 ---> touche c + 100 ---> touche d + 105 ---> touche i + 109 ---> touche m + 110 ---> touche n + 112 ---> touche p + 114 ---> touche r + 115 ---> touche s + 117 ---> touche u + +*****************************************************************************) + + + UNIT traiter_choix : procedure ; + + VAR posit,num,choix : integer, + s:string; + + BEGIN + + choix := inchar; + write(chr(choix)); + + do + + call setcursor(12,12); + + case choix + + when 27 : call clear; + return; + + when 49 : writeln("Saisie de TEXTE1"); + call setcursor(19,1); + t1 := new typetext; + call t1.Lecture(0); + + when 50 : writeln("Saisie de TEXTE2"); + call SetCursor(15,12); + t2 := new typetext; + call t2.Lecture(0); + + when 51 : writeln("Longueur de TEXTE1"); + call SetCursor(15,12); + if (t1=none) + then writeln('0') + else writeln(t1.length) + fi; + + when 52 : writeln("ConcatŠne TEXTE1 avec TEXTE2"); + call setcursor(19,1); + if (t1=none) then t1:=t2 + else call t1.concat(t2) fi; + + when 97 : writeln("Position courante dans TEXTE1"); + call SetCursor(15,12); + if (t1=none) + then writeln("0") + else writeln(t1.Position_Courante) + fi; + + when 99 : Writeln("Copie une chaŒne de TEXTE1"); + Writeln("Donnez la longueur de la chaŒne … retourner : "); + call Setcursor(13,47); + readln(num); + call SetCursor(15,12); + if (t1<>none) + then + t3 := t1.Copie(num); + if (t3<>none) + then call t3.ecrire + else writeln("ChaŒne vide") + fi; + else writeln("ChaŒne vide"); + fi; + + when 100 : Writeln("Suppression d'une chaŒne de TEXTE1"); + Writeln("Donnez la longueur de la chaŒne … supprimer : "); + call SetCursor(13,47); + readln(posit); + if (t1<>none) + then call t1.delete(posit); + fi; + + when 105 : Writeln("Ins‚rer une chaŒne dans TEXTE1"); + Writeln("Entrez la chaŒne … ins‚rer : "); + call SetCursor(13,30); + t3 := new typetext; + call t3.Lecture(0); + call SetCursor(15,12); + if (t1<>none) + then call t1.Insert(t3) + else t1 := t3 + fi; + + when 109 : Writeln("Conversion de lettres minuscules en majuscules"); + Writeln("Donnez la longueur de la chaŒne … modifier : "); + call SetCursor(13,46); + readln(num); + if (t1<>none) + then call t1.majuscule(num); + fi; + + when 110 : writeln("Saisie de la nouvelle position dans TEXTE1"); + writeln("Donnez la nouvelle position : "); + call SetCursor(13,31); + if (t1<>none) + then + readln(posit); + call t1.Nouvelle_Position(posit); + call SetCursor(15,12); + writeln(t1.position); + else writeln("Texte1 non d‚fini"); + fi; + + when 112 : writeln("Position pr‚c‚dente … la position courante dans TEXTE1"); + call SetCursor(15,12); + if (t1<>none) + then + call t1.Precedent; + writeln(t1.position); + else + writeln("0"); + fi; + + when 115 : writeln("Position suivante … la position courante dans TEXTE1"); + call SetCursor(15,12); + if (t1<>none) + then + call t1.Suivant; + writeln(t1.position); + else + writeln("0"); + fi; + + when 114 : writeln("Recherche de la position d'une sous-chaŒne dans TEXTE1"); + writeln("Donnez la valeur de la sous-chaŒne : "); + call SetCursor(13,38); + if (t1<>none) + then + t3 := new typetext; + call t3.Lecture(0); + num := t1.Rechercher_Position(t3); + call SetCursor(15,12); + writeln(num); + else writeln("TEXTE1 non d‚fini"); + fi; + + when 117 : writeln("Conversion de lettres majuscules en minuscules"); + writeln("Donnez la longueur de la chaŒne … modifier : "); + call SetCursor(13,46); + readln(num); + if (t1<>none) + then call t1.minuscule(num); + fi; + + otherwise writeln("Mauvaise touche");; + + esac; + + call reinitialisation(choix); + + od; + + END traiter_choix; + + +(****************************************************************************) + + + +(****************************************************************************) +(* PROGRAMME PRINCIPAL *) +(****************************************************************************) + + + VAR t1,t2,t3 : typetext; + + BEGIN + + call initialisation; (* affichage du menu *) + call traiter_choix; (* traitement de la demande de l'utilisateur *) + + END TYPETEXT; + + +(****************************************************************************) + + + + + diff --git a/examples/examples/helpcor.log b/examples/examples/helpcor.log new file mode 100644 index 0000000..5a714e2 --- /dev/null +++ b/examples/examples/helpcor.log @@ -0,0 +1,2033 @@ +PROGRAM COROUTINE; + signal fin; +(* Projet LI1 : Didacticiel sur les coroutines. *) +(* Realise par CHICHER Corinne et DOME Nadege - UPPA 1993/1994 - *) + +BEGIN + pref iiuwgraph block + BEGIN + pref mouse block + + VAR nooper,typexec,touche:integer, + i,b,h,v,num,xpa,ypa:integer, + g,d,c,driver,selection,demarrage,ptarok,stopexec:boolean; + + (* nooper:correspond soit a l'execution du programmes soit a l'affichage*) + (* d'informations sur les coroutines.*) + (* typexec:type de l'execution du programme ou types de renseignements sur*) + (* les coroutines.*) + (* demarrage a vrai si choix de l'icone Execution*) + (* ptarok a vrai l'utilisateur a choisi un point d'arret*) + (* stopexec a vrai si l'utilisateur a clique sur l'icone Quitter*) + + +(******************************************************************************) +(* Procedures permettant la gestion de l'ecran en mode texte et graphique *) +(******************************************************************************) + + (* NewPage vide l'ecran en mode texte *) + UNIT NewPage : PROCEDURE; + BEGIN + write( chr(27), "[2J"); + END NewPage; + + (* SetCursor positionne le curseur aux lignes et colonnes indiquees *) + UNIT SetCursor : PROCEDURE(ligne,colonne:integer); + VAR c,d,e,f :char, + i,j :integer; + BEGIN + i:=ligne div 10; + j:=ligne mod 10; + c:=chr(48+i); + d:=chr(48+j); + i:=colonne div 10; + j:=colonne mod 10; + e:=chr(48+i); + f:=chr(48+j); + write( chr(27), "[", c, d, ";", e, f, "H"); + END SetCursor; + + + (* inchar saisit un caractere en mode graphique *) + UNIT inchar : FUNCTION : integer; + VAR i:integer; + BEGIN + DO + i:=INKEY; + if i <> 0 then + exit + fi; + OD; + result:=i; + END inchar; + + + (* ReadInteger lit un entier positif a 3 chiffres avec echo a l'ecran *) + UNIT ReadInteger : FUNCTION : integer; + VAR X,Y,i,OrdN : integer, + Number : arrayof integer; + BEGIN + array Number dim( 1 : 4 ); + i:=0; + X:=InXPos; + Y:=InYPos; + DO + OrdN:=inchar; + if i=8 or (OrdN < 48 and OrdN > 57) then + exit + fi; + CASE OrdN + when 48 : i:=i+1; + Number(i):=0; + when 49 : i:=i+1; + Number(i):=1; + when 50 : i:=i+1; + Number(i):=2; + when 51 : i:=i+1; + Number(i):=3; + when 52 : i:=i+1; + Number(i):=4; + when 53 : i:=i+1; + Number(i):=5; + when 54 : i:=i+1; + Number(i):=6; + when 55 : i:=i+1; + Number(i):=7; + when 56 : i:=i+1; + Number(i):=8; + when 57 : i:=i+1; + Number(i):=9; + when 8 : if i > 0 then + Number(i):=0; + i:=i-1; + call hascii(0); + fi; + when 13 : if i > 0 then + exit + fi; + ESAC; + if i=1 then + call Move(X,Y); + call hascii(0); + call hascii(48+Number(1)); + fi; + if i=2 then + call Move(X+8,Y); + call hascii(0); + call hascii(48+Number(2)); + fi; + if i=3 then + call Move(X+16,Y); + call hascii(0); + call hascii(48+Number(3)); + fi; + OD; + if (Number(1) = 0) or (Number(1) = 0 and Number(2) = 0) + or (Number(1) = 0 and Number(2) = 0 and Number(3) = 0) then + call Move(X,Y); + call hascii(0); + call hascii(48); + call hascii(0); + fi; + if i=1 then + result:=Number(1); + else + if i=2 then + result:=10 * Number(1) + Number(2); + else + result:=100 * Number(1) + 10 * Number(2) + Number(3); + fi; + fi; + kill(Number); + END ReadInteger; + + (* WriteInteger permet d'afficher un entier positif a 3 chiffres a l'ecran *) + UNIT WriteInteger : PROCEDURE(Number:integer); + VAR i,j,k:integer; + BEGIN + if Number < 10 then + call HASCII(0); + call HASCII(Number+48); + call HASCII(0); + else + if Number < 100 then + i:=Number div 10; + j:=Number - i * 10; + call HASCII(0); + call HASCII(i+48); + call HASCII(0); + call HASCII(j+48); + else + i:=Number div 100; + j:=(Number - i * 100) div 10; + k:=Number - i * 100 - j * 10; + call HASCII(0); + call HASCII(i+48); + call HASCII(0); + call HASCII(j+48); + call HASCII(0); + call HASCII(k+48); + fi; + fi; + END WriteInteger; + + +(*******************************************************************************) +(* Procedures gerant un click de la souris sur l'ecran *) +(*******************************************************************************) + + (* Si choix=0 l'utilisateur a clique sur l'icone Quitter*) + (* presentbout gere le click lors de la page de presentation*) + UNIT presentbout : PROCEDURE(x,y:integer;inout bonclic:boolean,choix:integer); + BEGIN + if (x >= 12) and (x <= 92) then + if (y >= 296) and (y <= 312) then + bonclic:=true; + choix:=0; + fi; + fi; + if (x >= 116) and (x<=284) then + if (y >= 296) and (y <= 312) then + bonclic:=true; + choix:=1; (* Click sur l'icone execution*) + fi; + fi; + END presentbout; + + + (* Mousepos gere la position de la souris a l'endroit ou le bouton gauche *) + (* a ete presse dans le premier ecran *) + UNIT MOUSEPOS : PROCEDURE(x,y:integer;inout bonclic:boolean;output choix:integer); + BEGIN + if (x >= 24) and (x <= 544) then + if (y >= 96) and (y <= 104) then + choix:=1; (* Click sur execution du programme*) + bonclic:=true; + fi; + + if (y >= 112) and (y <= 120) then + choix:=2; (* Click sur A propos des coroutines*) + bonclic:=true; + fi; + + if (y >= 160) and (y <= 168) then + choix:=3; (* Click sur execution normale du programme *) + (* ou sur definition et interet des coroutines*) + bonclic:=true; + fi; + + if (y >= 176) and (y <= 184) then + choix:=4; (* Click sur execution pas a pas du programme*) + (* ou sur le schema de la semantique *) + bonclic:=true; + fi; + + if (y >= 192) and (y <= 200) then + choix:=5; (* click sur l'execution avec point d'arret*) + bonclic:=true; + fi; + + if (y >= 224) and (y <= 232) then + call CLS; + choix:=0; + bonclic:=true; + fi; + fi; + END MOUSEPOS; + + + (* POSmouse gere la position de la souris a l'endroit ou le bouton gauche *) + (* a ete presse dans le deuxieme ecran*) + UNIT POSmouse : PROCEDURE(x,y:integer;inout bonclic:boolean;output choix:integer); + BEGIN + if (x >= 12) and (x <= 92) then + if (y >= 236) and (y <= 252) then + choix:=1; + bonclic:=true; + fi; + if (y >= 256) and (y <= 272) then + choix:=0; + bonclic:=true; + fi; + fi; + END POSmouse; + + + (* ptarret gere la position de la souris a l'endroit ou le bouton gauche *) + (* a ete presse pour la selection du point d'arret*) + UNIT ptarret : PROCEDURE(x,y:integer;inout bonclic:boolean;output choix:integer); + BEGIN + choix:=0; + (* Click sur une ligne du main*) + if (x >= 12) and (x <= 200) then + if ((y > 24) and (y < 32))or((y > 48) and (y < 80)) + or ((y > 88) and (y < 144)) then + choix:=1; + bonclic:=true; + fi; + fi; + + (* Click sur une ligne de producer*) + if (x >= 216) and (x <= 412) then + if ((y > 24) and (y < 32)) or ((y >40) and (y < 136)) then + choix:=2; + bonclic:=true; + fi; + fi; + + (* Click sur une ligne de consumer*) + if (x >= 428) and (x <= 628) then + if ((y > 24) and (y < 32)) or ((y > 48) and (y < 248)) then + choix:=3; + bonclic:=true; + fi; + fi; + + (* Click sur l'icone "Quitter"*) + if (x>=12) and (x<=92) then + if(y>=256) and (y<=272) then + choix:=0; + bonclic:=true; + fi; + fi; + END ptarret; + + (* GoStop gere la position de la souris a l'endroit ou le bouton gauche *) + (* a ete presse dans le deuxieme ecran avec l'execution pas a pas*) + UNIT GoStop : PROCEDURE(x,y:integer;inout bonclic:boolean,choix:integer); + BEGIN + if (x >= 120) and (x <= 200) then + if (y >= 236) and (y <= 252) then + choix:=1; + bonclic:=true; + fi; + fi; + if (x >= 12) and (x <= 92) then + if (y >= 256) and (y <= 272) then + choix:=0; + bonclic:=true; + fi; + fi; + END GoStop; + + + (* clicquit gere le click sur quitter quand le point d'arret a ete atteint*) + UNIT clicquit : PROCEDURE(x,y:integer;inout bonclic:boolean); + BEGIN + if (x >= 12) and (x <= 92) then + if (y >= 256) and (y <= 272) then + bonclic:=true; + fi; + fi; + END clicquit; + + (*textquit gere le click sur quitter quand l'utilisateur a lu les informations*) + UNIT textquit : PROCEDURE(x,y:integer;inout bonclic:boolean,choix:integer); + BEGIN + if (x >= 8) and (x <= 88) then + if (y >= 320) and (y <= 336) then + bonclic:=true; + choix:=0; + fi; + fi; + if (x >= 428) and (x<=558) then + if (y >= 320) and (y <= 336) then + bonclic:=true; + choix:=1; + fi; + fi; + END textquit; + + +(********************************************************************************) +(* Procedures gerant les dessins geometriques a l'ecran *) +(********************************************************************************) + + (* cadre trace un rectangle *) + UNIT cadre : PROCEDURE(xg,yg,xd,yd,couleur:integer); + BEGIN + call COLOR(couleur); + call MOVE(xg,yg); + call DRAW(xd,yg); + call MOVE(xd,yg); + call DRAW(xd,yd); + call MOVE(xd,yd); + call DRAW(xg,yd); + call MOVE(xg,yd); + call DRAW(xg,yg); + END cadre; + + (* encadrpt determine et encadre la ligne correspondant au point d'arret*) + UNIT encadrpt : PROCEDURE(input numcode:integer;inout y:integer); + VAR ycadre,bornesup,xdeb,xfin,couleur:integer, + trouve:boolean; + BEGIN + if numcode=1 then + bornesup:=140; + xdeb:=14; + xfin:=198; + fi; + if numcode=2 then + bornesup:=132; + xdeb:=218; + xfin:=410; + fi; + if numcode=3 then + bornesup:=244; + xdeb:=430; + xfin:=626; + fi; + ycadre:=24; + while not trouve and ycadre<=bornesup + do + if y >=ycadre and y<=ycadre+8 then + trouve:=true; + else + ycadre:=ycadre+8; + fi; + od; + couleur:=12; + call cadre(xdeb,ycadre,xfin,ycadre+8,couleur); + y:=ycadre+4; + END encadrpt; + + +(********************************************************************************) +(* Procedures mettant en place les differents ecrans *) +(********************************************************************************) + + (* Presentation de l'application*) + UNIT presentation : PROCEDURE; + VAR couleur,choix:integer; + BEGIN + call CLS; + call BORDER(7); + (* Mise en place des boutons*) + call cadre(12,296,92,312,12); + call MOVE(26,300); + call OUTSTRING("Quitter"); + + call cadre(116,296,284,312,12); + call MOVE(120,300); + call OUTSTRING("Lancer l'application"); + + call COLOR(12); + call MOVE(370,304); + call OUTSTRING("Licence informatique - UPPA 1994"); + + call COLOR(12); + call MOVE(184,64); + call OUTSTRING("Corinne CHICHER & Nadege DOME"); + call MOVE(241,88); + call OUTSTRING("Vous presentent"); + call MOVE(169,128); + call OUTSTRING("UN DIDACTICIEL SUR LES COROUTINES"); + call MOVE(157,152); + call OUTSTRING("DANS LE LANGAGE ORIENTE OBJET LOGLAN"); + + + call STYLE(5); + call cadre(137,48,465,176,7); + + (* Gestion de la souris *) + driver:=INIT(b); + call SETPOSITION(0,0); + call SHOWCURSOR; + DO + call GETPRESS(0,h,v,b,g,d,c); + if g then + call presentbout(h,v,selection,choix); + if not selection then + g:=false; + repeat; + else + if choix=0 then (* L'utilisateur a selectionne Quitter*) + call HIDECURSOR; + call quitter; + else + call HIDECURSOR; + exit; + fi; + fi; + fi; + OD; + END presentation; + + (* menu propose les programmes a executer et le type d'execution *) + UNIT menu : PROCEDURE(inout numop1,numop2:integer); + VAR i,touche,couleur:integer, + selection:boolean; + BEGIN + call CLS; + call BORDER(20); + selection:=false; + g:=false; + d:=false; + c:=false; + call COLOR(15); + call MOVE(184,24); + call OUTSTRING("DIDACTICIEL SUR LES COROUTINES"); + couleur:=6; + call cadre(24,56,544,240,couleur); + call COLOR(7); + call MOVE(64,96); + call OUTSTRING("Execution du programme 'Producteur-Consommateur'"); + call MOVE(64,112); + call OUTSTRING("A propos des 'Coroutines'..."); + + call MOVE(64,224); + call OUTSTRING("Quitter l'application"); + call MOVE(24,256); + call COLOR(15); + call OUTSTRING("Selectionnez l'operation avec le bouton gauche de la souris..."); + call COLOR(7); + + (* Gestion de la souris *) + driver:=INIT(b); + call SETPOSITION(0,0); + call SHOWCURSOR; + DO + call GETPRESS(0,h,v,b,g,d,c); + if g then + call MOUSEPOS(h,v,selection,numop1); + if not selection then + g:=false; + repeat; + else + if numop1=0 then (* L'utilisateur a selectionne Quitter*) + call HIDECURSOR; + exit + else + selection:=false; + call HIDECURSOR; + g:=false; + d:=false; + c:=false; + call MOVE(64,160); + + if numop1=1 then (* L'utilisateur a selectionne l'exemple*) + call OUTSTRING("Execution normale du programme "); + call MOVE(64,176); + call OUTSTRING("Execution pas a pas du programme "); + call MOVE(64,192); + call OUTSTRING("Execution avec point d'arret du programme "); + driver:=INIT(b); + call SHOWCURSOR; + DO + call GETPRESS(0,h,v,b,g,d,c); + if g then + call MOUSEPOS(h,v,selection,numop2); + if not selection then + g:=false; + repeat; + else + call HIDECURSOR; + exit exit + fi; + fi; + OD; + else + (* L'utilisateur a selectionne le "dictionnaire" sur les coroutines*) + call OUTSTRING("Definition et interet des coroutines "); + call MOVE(64,176); + call OUTSTRING("Instructions associees aux coroutines "); + driver:=INIT(b); + call SHOWCURSOR; + DO + call GETPRESS(0,h,v,b,g,d,c); + if g then + call MOUSEPOS(h,v,selection,numop2); + if not selection then + g:=false; + repeat; + else + call HIDECURSOR; + exit exit + fi; + fi; + OD; + fi; + fi; + fi; + fi; + OD; + END menu; + + + (* Contexte met en place les differentes parties servant a l'execution *) + UNIT contexte : PROCEDURE(input typexec:integer,ptarok:boolean); + VAR touche,couleur:integer; + + BEGIN + call CLS; + call COLOR(12); + call MOVE(216,4); + call OUTSTRING("EXECUTION DU PROGRAMME"); + (* Cadre entourant le code du main et coroutines *) + couleur:=7; + call cadre(8,16,632,280,couleur); + + (* Cadre simulant l'ecran *) + call cadre(8,288,632,336,couleur); + (* Boutons pour lancer l'execution et quitter *) + call cadre(12,236,92,252,couleur); + call MOVE(16,240); + if typexec=5 and not ptarok then + call COLOR(8); + else + call COLOR(12); + fi; + call OUTSTRING("Execution"); + call cadre(12,256,92,272,couleur); + call MOVE(16,260); + call COLOR(12); + call OUTSTRING("Quitter"); + driver:=INIT(b); + call SETPOSITION(0,0); + call SHOWCURSOR; + END contexte; + + (* mainvisu affiche dans le cadre le code du main *) + UNIT mainvisu : PROCEDURE; + VAR couleur:integer; + BEGIN + call COLOR(7); + (* cadre entourant le code du main *) + couleur:=7; + call cadre(12,20,200,228,couleur); + call MOVE(12,192); + call HFILL(200); + call MOVE(16,24); + call OUTSTRING("PROGRAM prodcons;"); + call MOVE(16,40); + call OUTSTRING("VAR"); + call MOVE(16,48); + call OUTSTRING(" prod:producer,"); + call MOVE(16,56); + call OUTSTRING(" cons:consumer,"); + call MOVE(16,64); + call OUTSTRING(" n,mag:integer,"); + call MOVE(16,72); + call OUTSTRING(" last:boolean;"); + call MOVE(16,88); + call OUTSTRING("BEGIN"); + call MOVE(16,96); + call OUTSTRING(" prod:=new producer;"); + call MOVE(16,104); + call OUTSTRING(" read(n);"); + call MOVE(16,112); + call OUTSTRING(" cons:=new consumer(n);"); + call MOVE(16,120); + call OUTSTRING(" attach(prod);"); + call MOVE(16,128); + call OUTSTRING(" writeln;"); + call MOVE(16,136); + call OUTSTRING("END prodcons;"); + END mainvisu; + + (* prodvisu (coroutine 1) affiche dans le cadre le code de producer *) + UNIT prodvisu : PROCEDURE; + VAR couleur:integer; + BEGIN + (* Cadre de la 1ere coroutine *) + couleur:=7; + call cadre(216,20,412,272,couleur); + (* Ecriture du code de la 1ere coroutine *) + call MOVE(220,24); + call OUTSTRING("UNIT producer:COROUTINE;"); + call MOVE(220,40); + call OUTSTRING("BEGIN"); + call MOVE(220,48); + call OUTSTRING(" return;"); + call MOVE(220,56); + call OUTSTRING(" DO"); + call MOVE(220,64); + call OUTSTRING(" read(mag);"); + call MOVE(220,72); + call OUTSTRING(" if mag=0 then"); + call MOVE(220,80); + call OUTSTRING(" last:=true;"); + call MOVE(220,88); + call OUTSTRING(" exit;"); + call MOVE(220,96); + call OUTSTRING(" fi;"); + call MOVE(220,104); + call OUTSTRING(" attach(cons);"); + call MOVE(220,112); + call OUTSTRING(" OD;"); + call MOVE(220,120); + call OUTSTRING(" attach(cons);"); + call MOVE(220,128); + call OUTSTRING("END producer;"); + END prodvisu; + + (* consvisu (coroutine 2) affiche dans le cadre le code de consumer *) + UNIT consvisu : PROCEDURE; + VAR couleur:integer; + BEGIN + couleur:=7; + call cadre(428,20,628,272,couleur); (* Cadre de la coroutine 2 cad consumer*) + call MOVE(428,252); + call HFILL(628); + (* Ecriture du code de la 2eme coroutine *) + call MOVE(432,24); + call OUTSTRING("UNIT consumer:coroutine"); + call MOVE(432,32); + call OUTSTRING(" (n:integer);"); + call MOVE(432,48); + call OUTSTRING("VAR buf:arrayof integer,"); + call MOVE(432,56); + call OUTSTRING(" i,j:integer;"); + call MOVE(432,64); + call OUTSTRING("BEGIN"); + call MOVE(432,72); + call OUTSTRING(" array buf dim(1:n);"); + call MOVE(432,80); + call OUTSTRING(" return;"); + call MOVE(432,88); + call OUTSTRING(" DO"); + call MOVE(432,96); + call OUTSTRING(" for i:=1 to n"); + call MOVE(432,104); + call OUTSTRING(" DO"); + call MOVE(432,112); + call OUTSTRING(" buf(i):=mag;"); + call MOVE(432,120); + call OUTSTRING(" attach(prod);"); + call MOVE(432,128); + call OUTSTRING(" if last then"); + call MOVE(432,136); + call OUTSTRING(" exit exit fi;"); + call MOVE(432,144); + call OUTSTRING(" OD"); + call MOVE(432,152); + call OUTSTRING(" for i:=1 to n"); + call MOVE(432,160); + call OUTSTRING(" DO"); + call MOVE(432,168); + call OUTSTRING(" write(' ',buf(i));"); + call MOVE(432,176); + call OUTSTRING(" OD;"); + call MOVE(432,184); + call OUTSTRING(" writeln;"); + call MOVE(432,192); + call OUTSTRING(" OD"); + call MOVE(432,200); + call OUTSTRING(" for j:=1 to i DO"); + call MOVE(432,208); + call OUTSTRING(" write(' ',buf(i));"); + call MOVE(432,216); + call OUTSTRING(" OD;"); + call MOVE(432,224); + call OUTSTRING(" writeln;"); + call MOVE(432,232); + call OUTSTRING(" attach(main);"); + call MOVE(432,240); + call OUTSTRING("END consumer;"); + END consvisu; + + + (* instalnorm affiche le code du main et attend click sur execution/quitter *) + UNIT instalnorm : PROCEDURE(typexec,xpa,ypa:integer;inout execok:boolean); + VAR i,touche,rep,couleur:integer, + selection:boolean; + HANDLERS + when fin:stopexec:=true; + terminate; + END HANDLERS; + BEGIN + selection:=false; + g:=false; + d:=false; + c:=false; + (* Affichage du code du main*) + call mainvisu; + if typexec=5 and xpa=14 then + couleur:=12; + call cadre(xpa,ypa-4,198,ypa+4,couleur); + fi; + call COLOR(12); + call MOVE(12,296); + call OUTSTRING("Selectionnez 'execution' ou 'quitter' en cliquant sur l'icone correspondante"); + (* Gestion de la souris *) + DO + call GETPRESS(0,h,v,b,g,d,c); + if g then + call POSmouse(h,v,selection,rep); + call HIDECURSOR; + if not selection then + g:=false; + call SHOWCURSOR; + repeat; + else + if rep=0 then (* l'utilisateur a clique sur quitter *) + raise fin; + else (* l'utilisateur a clicke sur execution *) + call COLOR(0); + call MOVE(12,296); + call OUTSTRING("Selectionnez 'execution' ou 'quitter' en cliquant sur l'icone correspondante"); + call COLOR(8); + call MOVE(16,240); + call OUTSTRING("Execution"); + + if typexec=3 or typexec=5 then + call COLOR(8); + call MOVE(16,260); + call OUTSTRING("Quitter"); + call SHOWCURSOR; + + else (*typexec=4*) + call COLOR(7); + (* Bouton "continuer" pour avancer pas a pas dans l'execution*) + couleur:=7; + call cadre(120,236,200,252,couleur); + call MOVE(124,240); + call COLOR(12); + call OUTSTRING("Continuer"); + call SHOWCURSOR; + fi; + execok:=true; + + fi; + exit; + fi; + fi; + OD; + END instalnorm; + + +(********************************************************************************) +(* Procedure permettant la prise en compte d'une execution avec point d'arret *) +(********************************************************************************) + + (* selectpoint permet de prendre en compte le point d'arret choisi*) + (* par l'utilisateur*) + UNIT selectpoint : PROCEDURE(inout x,y:integer); + VAR i,touche,rep,numcode:integer, + selection:boolean; + HANDLERS + when fin:stopexec:=true; + terminate; + END HANDLERS; + BEGIN + selection:=false; + g:=false; + d:=false; + c:=false; + + (* Affichage du message demandant la selection du point d'arret*) + call COLOR(12); + call MOVE(16,296); + call OUTSTRING("Cliquez sur la ligne qui sera le point d'arret de l'execution"); + + (* Gestion de la souris *) + DO + call GETPRESS(0,h,v,b,g,d,c); + if g then + call ptarret(h,v,selection,numcode); + call HIDECURSOR; + if not selection then + g:=false; + call SHOWCURSOR; + repeat; + else + if numcode=0 then + raise fin; + fi; + call encadrpt(numcode,v); + call COLOR(0); + call MOVE(16,296); + call OUTSTRING("Cliquez sur la ligne qui sera le point d'arret de l'execution"); + call COLOR(8); + call MOVE(16,260); + call OUTSTRING("Quitter"); + call COLOR(12); + call MOVE(16,296); + call OUTSTRING("Tapez pour valider votre selection"); + touche:=inchar; + call COLOR(0); + call MOVE(16,296); + call OUTSTRING("Tapez pour valider votre selection"); + y:=v; + if numcode=1 then + x:=14; + else + if numcode=2 then + x:=218; + else + x:=430; + fi; + fi; + exit; + fi; + fi; + OD; + END selectpoint; + + +(********************************************************************************) +(* Procedures utilisees pour l'execution du programme *) +(********************************************************************************) + + (* fleche permet d'afficher une fleche devant l'instruction courante *) + UNIT fleche : PROCEDURE(input x,y,xpa,ypa,numcode,choixexe:integer); + VAR rempli,atteint:boolean; + BEGIN + call MOVE(x,y); + call COLOR(12); + call OUTSTRING("->"); + + (*Execution avec point d'arret*) + if numcode=1 then + if (xpa=x+14) and (ypa-4=y) then + atteint:=true; + call finexecut(choixexe,rempli,atteint); + fi; + fi; + if numcode=2 or numcode=3 then + if (xpa=x+18) and (ypa-4=y) then + atteint:=true; + call finexecut(choixexe,rempli,atteint); + fi; + fi; + END fleche; + + (* Changecoul permet de modifier la couleur du cadre des record selon*) + (* qu'ils sont actifs ou non*) + UNIT changecoul : PROCEDURE(couleur,numcode:integer); + BEGIN + if numcode=1 then + call cadre(12,20,200,228,couleur); + fi; + if numcode=2 then + call cadre(216,20,412,272,couleur); + fi; + if numcode=3 then + call cadre(428,20,628,272,couleur); + fi; + call COLOR(12); + END changecoul; + + (* restaure permet de supprimer la fleche courante et provoque un temps d'arret*) + (* apres chaque instruction. *) + UNIT restaure : PROCEDURE(debx,deby,choixexe,numcode:integer); + VAR i,touche,rep:integer, + selection:boolean; + BEGIN + selection:=false; + g:=false; + d:=false; + c:=false; + CASE choixexe + when 3: (* Execution normale du programme choisi*) + for i:=1 to 10000 do od; + + when 4: (* Execution pas a pas du programme choisi*) + (* Gestion de la souris *) + driver:=init(b); + call SETPOSITION(160,244); + + call SHOWCURSOR; + DO + call GETPRESS(0,h,v,b,g,d,c); + if g then + call GoStop(h,v,selection,rep); + call HIDECURSOR; + if not selection then + g:=false; + call SHOWCURSOR; + repeat; + else + if rep=0 then (* l'utilisateur a clique sur quitter *) + raise fin; + fi; + (* l'utilisateur a clique sur continuer *) + exit; + fi; + fi; + OD; + + when 5: (* Execution avec point d'arret du programme choisi*) + for i:=1 to 10000 do od; + + ESAC; + (* Effacement de la fleche se trouvant devant la ligne courante*) + call MOVE(debx,deby); + call COLOR(0); + call OUTSTRING("->"); + call COLOR(7); + if numcode=1 then + call MOVE(8,deby); + call VFILL(deby+8); + call COLOR(10); + call MOVE(12,deby); + call VFILL(deby+8); + fi; + if numcode=2 then + call MOVE(200,deby); + call VFILL(deby+8); + fi; + if numcode=3 then + call MOVE(412,deby); + call VFILL(deby+8); + fi; + END restaure; + + (* execut permet l'execution du programme *) + UNIT execut : PROCEDURE(input choixexe,xpa,ypa:integer); + VAR touche,k,x,y,i,j,n,mag,numcode,nbaffic,nbcases,rep,couleur:integer, + passe,last,encore,magzero,rempli,atteint:boolean, + buf:arrayof integer; + HANDLERS + when fin:stopexec:=true; + terminate; + END HANDLERS; + + BEGIN + array buf dim(1:10); + rempli:=false; + (* 1ere ligne du main*) + numcode:=1; + call changecoul(10,numcode); + x:=0; + y:=24; + call fleche(x,y,xpa,ypa,numcode,choixexe); + call restaure(x,y,choixexe,numcode); + (* 3eme ligne du main*) + y:=48; + call fleche(x,y,xpa,ypa,numcode,choixexe); + call restaure(x,y,choixexe,numcode); + (* 4eme ligne du main*) + y:=56; + call fleche(x,y,xpa,ypa,numcode,choixexe); + call restaure(x,y,choixexe,numcode); + (* 5eme ligne du main*) + y:=64; + call fleche(x,y,xpa,ypa,numcode,choixexe); + (* Affichage de la valeur de n et mag *) + call MOVE(16,196); + call OUTSTRING("n = 0 et mag = 0"); + call restaure(x,y,choixexe,numcode); + (* 6eme ligne du main*) + y:=72; + call fleche(x,y,xpa,ypa,numcode,choixexe); + (* Affichage de la valeur de last*) + call MOVE(16,212); + call OUTSTRING("last = false"); + call restaure(x,y,choixexe,numcode); + (* 7eme ligne du main*) + y:=88; + call fleche(x,y,xpa,ypa,numcode,choixexe); + call restaure(x,y,choixexe,numcode); + (* 8eme ligne du main*) + y:=96; + call fleche(x,y,xpa,ypa,numcode,choixexe); + call changecoul(7,numcode); + + (* Affichage du code de la coroutine 1 cad producer*) + call prodvisu; + if typexec=5 and xpa=218 then + couleur:=12; + call cadre(xpa,ypa-4,410,ypa+4,couleur); + fi; + (* Debut de l'execution de la 1ere coroutine*) + (* 1ere ligne de la coroutine 1*) + x:=200; + numcode:=2; + call changecoul(10,numcode); + y:=24; + call fleche(x,y,xpa,ypa,numcode,choixexe); + call restaure(x,y,choixexe,numcode); + (* 2eme ligne de la coroutine 1*) + y:=40; + call fleche(x,y,xpa,ypa,numcode,choixexe); + call restaure(x,y,choixexe,numcode); + (* 3eme ligne de la coroutine 1*) + y:=48; + call fleche(x,y,xpa,ypa,numcode,choixexe); + call changecoul(7,numcode); + + (* On revient au programme appelant cad le main*) + x:=0; + numcode:=1; + call changecoul(10,numcode); + y:=96; + call restaure(x,y,choixexe,numcode); + (* 9eme ligne du main*) + y:=104; + call fleche(x,y,xpa,ypa,numcode,choixexe); + + DO + call COLOR(12); + call MOVE(12,296); + call OUTSTRING("Entrez la taille du tableau buf (<=10) et tapez : "); + n:=ReadInteger; + call WriteInteger(n); + call HIDECURSOR; + call COLOR(0); + call MOVE(12,296); + call OUTSTRING("Entrez la taille du tableau buf (<=10) et tapez : "); + call WriteInteger(n); + call SHOWCURSOR; + (* Test sur la valeur de la taille du tableau*) + if n=0 or n>10 then + call COLOR(12); + call MOVE(12,296); + call OUTSTRING("Vous devez entrer une valeur comprise entre 1 et 10 (tapez ) !"); + touche:=inchar; + call COLOR(0); + call MOVE(12,296); + call OUTSTRING("Vous devez entrer une valeur comprise entre 1 et 10 (tapez ) !"); + else + exit + fi; + od; + + (* Mise a jour de la valeur de n*) + call COLOR(12); + call MOVE(48,196); + call WriteInteger(n); + call restaure(x,y,choixexe,numcode); + (* 10eme ligne du main*) + y:=112; + call fleche(x,y,xpa,ypa,numcode,choixexe); + call changecoul(7,numcode); + + (* Affichage du code de la coroutine 2 cad consumer*) + call consvisu; + if typexec=5 and xpa=430 then + couleur:=12; + call cadre(xpa,ypa-4,626,ypa+4,couleur); + fi; + (* Debut de l'execution de la coroutine 2*) + (* ligne 1 de la coroutine 2*) + x:=412; + numcode:=3; + call changecoul(10,numcode); + y:=24; + call fleche(x,y,xpa,ypa,numcode,choixexe); + call restaure(x,y,choixexe,numcode); + (* ligne 3 de la coroutine 2*) + y:=48; + call fleche(x,y,xpa,ypa,numcode,choixexe); + call restaure(x,y,choixexe,numcode); + (* ligne 4 de la coroutine 2*) + y:=56; + call fleche(x,y,xpa,ypa,numcode,choixexe); + call MOVE(432,264); + call OUTSTRING("i = 0 et j = 0"); + call restaure(x,y,choixexe,numcode); + (* ligne 5 de la coroutine 2*) + y:=64; + call fleche(x,y,xpa,ypa,numcode,choixexe); + call restaure(x,y,choixexe,numcode); + (* ligne 6 de la coroutine 2*) + y:=72; + call fleche(x,y,xpa,ypa,numcode,choixexe); + call MOVE(432,256); + call OUTSTRING("buf :"); + for i:=0 to n-1 + DO + call MOVE(472+i*16,256); + if i=n-1 then + call OUTSTRING("0"); + else + call OUTSTRING("0,"); + fi; + OD; + call restaure(x,y,choixexe,numcode); + (* ligne 7 de la coroutine 2*) + y:=80; + call fleche(x,y,xpa,ypa,numcode,choixexe); + call changecoul(7,numcode); + + (* Retour a la procedure appelante cad le main*) + x:=0; + numcode:=1; + call changecoul(10,numcode); + y:=112; + call restaure(x,y,choixexe,numcode); + (* 11eme ligne du main*) + y:=120; + call fleche(x,y,xpa,ypa,numcode,choixexe); + call changecoul(7,numcode); + + (* Retour a la coroutine 1 cad producer*) + x:=200; + numcode:=2; + call changecoul(10,numcode); + y:=48; + call restaure(x,y,choixexe,numcode); + + DO (* Gros DO*) + x:=200; + numcode:=2; + call changecoul(10,numcode); + (* 4eme ligne de la coroutine 1*) + y:=56; + call fleche(x,y,xpa,ypa,numcode,choixexe); + call restaure(x,y,choixexe,numcode); + (* 5eme ligne de la coroutine 1*) + y:=64; + call fleche(x,y,xpa,ypa,numcode,choixexe); + + if nbaffic=4 then + rempli:=true; + call finexecut(choixexe,rempli,atteint); + exit + fi; + DO + call COLOR(12); + call MOVE(12,296); + if nbaffic=3 then + call OUTSTRING("Vous devez a present taper zero comme valeur du tableau et : "); + else + call OUTSTRING("Entrez la valeur (<10) a stocker dans le tableau et tapez : "); + fi; + mag:=ReadInteger; + (* Mise a jour de la valeur de mag*) + call MOVE(144,196); + call WriteInteger(mag); + call COLOR(0); + call MOVE(12,296); + call OUTSTRING("Entrez la valeur (<10) a stocker dans le tableau et tapez : "); + call WriteInteger(mag); + (* Test sur la valeur de mag qui doit etre < 10*) + if mag > 9 then + call COLOR(12); + call MOVE(12,296); + call OUTSTRING("Vous devez entrer une valeur comprise entre 0 et 9 (tapez ) !"); + touche:=inchar; + call COLOR(0); + call MOVE(12,296); + call OUTSTRING("Vous devez entrer une valeur comprise entre 0 et 9 (tapez ) !"); + else + exit; + fi; + OD; + call restaure(x,y,choixexe,numcode); + (* 6eme ligne de la coroutine 1*) + y:=72; + call fleche(x,y,xpa,ypa,numcode,choixexe); + if mag=0 then + if not passe then + magzero:=true; + fi; + call restaure(x,y,choixexe,numcode); + (* 7eme ligne de la coroutine 1*) + y:=80; + call fleche(x,y,xpa,ypa,numcode,choixexe); + (* MAJ de la variable last*) + last:=true; + call MOVE(72,212); + call COLOR(0); + call OUTSTRING("false"); + call MOVE(72,212); + call COLOR(12); + call OUTSTRING("true"); + call restaure(x,y,choixexe,numcode); + (* 8eme ligne de la coroutine 1 *) + y:=88; + call fleche(x,y,xpa,ypa,numcode,choixexe); + call restaure(x,y,choixexe,numcode); + (* 12eme ligne de la coroutine 1*) + y:=120; + call fleche(x,y,xpa,ypa,numcode,choixexe); (* on va au moyen DO*) + else + call restaure(x,y,choixexe,numcode); + (* 9eme ligne de la coroutine1*) + y:=96; + call fleche(x,y,xpa,ypa,numcode,choixexe); + call restaure(x,y,choixexe,numcode); + (* 10eme ligne de la coroutine1 *) + y:=104; + call fleche(x,y,xpa,ypa,numcode,choixexe); + fi; + call changecoul(7,numcode); + + (* retour a la coroutine 2 cad consumer*) + DO (* Moyen DO*) + x:=412; + numcode:=3; + call changecoul(10,numcode); + if not passe or encore then + if not passe then + y:=80; + call restaure(x,y,choixexe,numcode); + fi; + (* 8eme ligne de la coroutine 2 *) + y:=88; + call fleche(x,y,xpa,ypa,numcode,choixexe); + call restaure(x,y,choixexe,numcode); + passe:=true; + encore:=false; + else + y:=120; + call restaure(x,y,choixexe,numcode); + (* 13eme ligne de la coroutine 2 *) + y:=128; + call fleche(x,y,xpa,ypa,numcode,choixexe); + if last then + call restaure(x,y,choixexe,numcode); + (* 14eme ligne de la coroutine 2*) + y:=136; + call fleche(x,y,xpa,ypa,numcode,choixexe); + call restaure(x,y,choixexe,numcode); + exit exit + else + nbcases:=nbcases+1; + call restaure(x,y,choixexe,numcode); + (* 15eme ligne de la coroutine 2*) + y:=144; + call fleche(x,y,xpa,ypa,numcode,choixexe); + call restaure(x,y,choixexe,numcode); + fi; + fi; + + DO (* Petit DO*) + (* 9eme ligne de la coroutine 2 *) + y:=96; + call fleche(x,y,xpa,ypa,numcode,choixexe); + (* Affichage de l'indice de buf*) + call MOVE(464,264); + call WriteInteger(nbcases+1); + call restaure(x,y,choixexe,numcode); + if nbcases=n then + exit + fi; + (* 10eme ligne de la coroutine 2 *) + y:=104; + call fleche(x,y,xpa,ypa,numcode,choixexe); + call restaure(x,y,choixexe,numcode); + (* 11eme ligne de la coroutine 2 *) + y:=112; + call fleche(x,y,xpa,ypa,numcode,choixexe); + (* MAJ du tableau buf avec la valeur de mag*) + buf(nbcases+1):=mag; + call MOVE(472+nbcases*16,256); + call WriteInteger(buf(nbcases+1)); + if nbcases+1<>n then + call MOVE(480+nbcases*16,256); + call OUTSTRING(","); + fi; + call restaure(x,y,choixexe,numcode); + (* 12eme ligne de la coroutine 2 *) + y:=120; + call fleche(x,y,xpa,ypa,numcode,choixexe); + call changecoul(7,numcode); + + (* Retour a la coroutine 1 cad producer*) + x:=200; + numcode:=2; + call changecoul(10,numcode); + if magzero then + y:=120; + call restaure(x,y,choixexe,numcode); + (* 13eme ligne de la coroutine 1*) + y:=128; + call fleche(x,y,xpa,ypa,numcode,choixexe); + call restaure(x,y,choixexe,numcode); + (* Destruction du record d'activation de la coroutine 1 cad producer*) + call COLOR(10); + call MOVE(216,20); + call DRAW(412,272); + call MOVE(412,20); + call DRAW(216,272); + call COLOR(12); + call changecoul(7,numcode); + call MOVE(12,296); + call COLOR(10); + call OUTSTRING("ATTENTION : Le record d'activation de Producer vient d'etre detruit !"); + for i:=1 to 20000 do od; + call MOVE(12,296); + call COLOR(0); + call OUTSTRING("ATTENTION : Le record d'activation de Producer vient d'etre detruit !"); + exit + else + y:=104; + call restaure(x,y,choixexe,numcode); + (* ligne 11 de la coroutine 1*) + y:=112; + call fleche(x,y,xpa,ypa,numcode,choixexe); + call restaure(x,y,choixexe,numcode); + exit exit + fi; + od; + + if not magzero then + call COLOR(8); + (* Retour a la coroutine 2 cad consumer*) + (* Impression du tampon buf*) + nbcases:=0; + i:=0; + do + (* 16eme ligne de la coroutine 2*) + y:=152; + call fleche(x,y,xpa,ypa,numcode,choixexe); + call restaure(x,y,choixexe,numcode); + (* Affichage de l'indice de buf*) + call COLOR(12); + call MOVE(464,264); + call WriteInteger(i+1); + if i<>n then + (* 17eme ligne de la coroutine 2*) + y:=160; + call fleche(x,y,xpa,ypa,numcode,choixexe); + call restaure(x,y,choixexe,numcode); + (* 18eme ligne de la coroutine 2*) + y:=168; + call fleche(x,y,xpa,ypa,numcode,choixexe); + call MOVE(12+i*16,304+nbaffic*8); + call OUTSTRING(" "); + call WriteInteger(buf(i+1)); + call restaure(x,y,choixexe,numcode); + fi; + (* 19eme ligne de la coroutine 2*) + y:=176; + call fleche(x,y,xpa,ypa,numcode,choixexe); + call restaure(x,y,choixexe,numcode); + if i=n then + exit + fi; + i:=i+1; + od; + (* ligne 20 de la coroutine 2*) + y:=184; + call fleche(x,y,xpa,ypa,numcode,choixexe); + call restaure(x,y,choixexe,numcode); + nbaffic:=nbaffic+1; + encore:=true; + fi; + od; + od; + + (* Imprime le reste du tampon buf*) + (* 22eme ligne de la coroutine 2*) + k:=0; + for j:=1 to nbcases+1 + do + y:=200; + call fleche(x,y,xpa,ypa,numcode,choixexe); + (* Affichage de l'indice de buf*) + call MOVE(544,264); + call WriteInteger(j); + call restaure(x,y,choixexe,numcode); + (* 23eme ligne de la coroutine 2*) + y:=208; + call fleche(x,y,xpa,ypa,numcode,choixexe); + call MOVE(12+k*16,304+nbaffic*8); + call OUTSTRING(" "); + call WriteInteger(buf(j)); + call restaure(x,y,choixexe,numcode); + (* 24eme ligne de la coroutine 2*) + y:=216; + call fleche(x,y,xpa,ypa,numcode,choixexe); + call restaure(x,y,choixexe,numcode); + k:=k+1; + od; + (* 25eme ligne de la coroutine 2*) + y:=224; + call fleche(x,y,xpa,ypa,numcode,choixexe); + call restaure(x,y,choixexe,numcode); + (* 26eme ligne de la coroutine 2*) + y:=232; + call fleche(x,y,xpa,ypa,numcode,choixexe); + call changecoul(7,numcode); + + (* Retour a la ligne 11 du main*) + x:=0; + numcode:=1; + call changecoul(10,numcode); + y:=120; + call restaure(x,y,choixexe,numcode); + (* 12eme ligne du main*) + y:=128; + call fleche(x,y,xpa,ypa,numcode,choixexe); + call restaure(x,y,choixexe,numcode); + (* 13eme et derniere ligne du main*) + y:=136; + call fleche(x,y,xpa,ypa,numcode,choixexe); + call restaure(x,y,choixexe,numcode); + (* Destruction du record d'activation du main*) + call COLOR(10); + call MOVE(12,20); + call DRAW(200,228); + call MOVE(200,20); + call DRAW(12,228); + call changecoul(7,numcode); + call MOVE(12,296); + call COLOR(10); + call OUTSTRING("ATTENTION : Le record d'activation du Main vient d'etre detruit !"); + for i:=1 to 20000 do od; + call MOVE(12,296); + call COLOR(0); + call OUTSTRING("ATTENTION : Le record d'activation du Main vient d'etre detruit !"); + + call COLOR(12); + (* Retour a la ligne 26 de la coroutine2*) + x:=412; + numcode:=3; + call changecoul(10,numcode); + y:=232; + call restaure(x,y,choixexe,numcode); + (* 27eme ligne de la coroutine2*) + y:=240; + call fleche(x,y,xpa,ypa,numcode,choixexe); + call restaure(x,y,choixexe,numcode); + (* Destruction du record d'activation de la coroutine 2 cad consumer*) + call COLOR(10); + call MOVE(428,20); + call DRAW(628,272); + call MOVE(628,20); + call DRAW(428,272); + call changecoul(7,numcode); + call MOVE(12,296); + call COLOR(10); + call OUTSTRING("ATTENTION : Le record d'activation de Consumer vient d'etre detruit !"); + for i:=1 to 20000 do od; + call MOVE(12,296); + call COLOR(0); + call OUTSTRING("ATTENTION : Le record d'activation de Consumer vient d'etre detruit !"); + call COLOR(12); + if not magzero then + (* Retour a la ligne 12 de la coroutine1*) + x:=200; + numcode:=2; + call changecoul(10,numcode); + y:=120; + call restaure(x,y,choixexe,numcode); + (* 13eme ligne de la coroutine 1*) + y:=128; + call fleche(x,y,xpa,ypa,numcode,choixexe); + call restaure(x,y,choixexe,numcode); + (* Destruction du record d'activation de la coroutine 1 cad producer*) + call COLOR(10); + call MOVE(216,20); + call DRAW(412,272); + call MOVE(412,20); + call DRAW(216,272); + call changecoul(7,numcode); + call MOVE(12,296); + call COLOR(10); + call OUTSTRING("ATTENTION : Le record d'activation du Producer vient d'etre detruit !"); + for i:=1 to 20000 do od; + call MOVE(12,296); + call COLOR(0); + call OUTSTRING("ATTENTION : Le record d'activation de Producer vient d'etre detruit !"); + fi; + if choixexe=4 then + call COLOR(8); (* L'execution est terminee on ne peut donc plus cliquer*) + (* sur Continuer*) + call MOVE(124,240); + call OUTSTRING("Continuer"); + call SHOWCURSOR; + fi; + call COLOR(12); + call finexecut(choixexe,rempli,atteint); + END execut; + + +(********************************************************************************) +(* Procedures gerant l'option A propos des coroutines *) +(********************************************************************************) + + (* boutontxt met en place et gere les boutons concernat l'option *) + (* A propos des coroutines*) + UNIT boutontxt : FUNCTION :integer; + VAR choix:integer; + BEGIN + (* Mise en place du bouton Page suivante*) + call cadre(428,320,558,336,12); + + (* Mise en place du bouton Quitter*) + call cadre(8,320,88,336,12); + call MOVE(20,324); + call COLOR(12); + call OUTSTRING("Quitter"); + + (* Mise en place de la souris*) + driver:=init(b); + call SHOWCURSOR; + selection:=false; + g:=false; + d:=false; + c:=false; + DO + call GETPRESS(0,h,v,b,g,d,c); + if g then + call textquit(h,v,selection,choix); + call HIDECURSOR; + if not selection then + g:=false; + call SHOWCURSOR; + repeat; + else + if choix=0 then + result:=0; + else + result:=1; + fi; + exit; + fi; + fi; + OD; + END boutontxt; + + + (* afficdef affiche a l'ecran la definition et l'utilite des coroutines*) + UNIT afficdef : PROCEDURE; + VAR touche,choix:integer; + BEGIN + call CLS; + (* Mise en place du texte*) + call MOVE(170,16); + call COLOR(12); + call OUTSTRING("DEFINITION ET INTERET DES COROUTINES"); + call MOVE(16,40); + call OUTSTRING("I> Definition d'une coroutine"); + call COLOR(7); + call MOVE(56,56); + call OUTSTRING("Une coroutine est un objet tel que l'execution de sa sequence"); + call MOVE(56,64); + call OUTSTRING("d'instructions peut etre suspendue et relancee de maniere pro-"); + call MOVE(56,72); + call OUTSTRING("grammee."); + call MOVE(56,80); + call OUTSTRING("Il est important de preciser, qu'a un instant donne, une seule"); + call MOVE(56,88); + call OUTSTRING("coroutine est active (en execution)."); + call MOVE(56,100); + call OUTSTRING("Par ailleurs, c'est une extension de la notion de classe, une"); + call MOVE(56,108); + call OUTSTRING("classe etant une construction dans laquelle peuvent etre regrou-"); + call MOVE(56,116); + call OUTSTRING("pes toutes sortes d'objets."); + call COLOR(12); + call MOVE(56,132); + call OUTSTRING("Syntaxe"); + call COLOR(7); + call MOVE(80,144); + call OUTSTRING("UNIT : COROUTINE();"); + call MOVE(120,152); + call OUTSTRING(""); + call MOVE(80,160); + call OUTSTRING("BEGIN"); + call MOVE(120,168); + call OUTSTRING(""); + call MOVE(120,176); + call OUTSTRING("return;"); + call MOVE(120,184); + call OUTSTRING(""); + call MOVE(80,192); + call OUTSTRING("END nom_coroutine;"); + call COLOR(12); + call MOVE(16,216); + call OUTSTRING("II> Interet des coroutines"); + call COLOR(7); + call MOVE(56,232); + call OUTSTRING("Les coroutines jouent un role essentiel dans les taches de simu-"); + call MOVE(56,240); + call OUTSTRING("lation."); + call MOVE(56,248); + call OUTSTRING("Ainsi, divers problemes de simulation de grande complexite et de"); + call MOVE(56,256); + call OUTSTRING("taille importante sont traitees avec succes par les coroutines."); + + (* Mise en place du bouton Quitter*) + call cadre(8,320,88,336,10); + call MOVE(20,324); + call COLOR(10); + call OUTSTRING("Quitter"); + + (* Mise en place de la souris*) + call SHOWCURSOR; + selection:=false; + g:=false; + d:=false; + c:=false; + DO + call GETPRESS(0,h,v,b,g,d,c); + if g then + call textquit(h,v,selection,choix); + call HIDECURSOR; + if not selection then + g:=false; + call SHOWCURSOR; + repeat; + else + if choix=0 then + (* l'utilisateur a clique sur quitter *) + exit exit + else + repeat; + fi; + fi; + fi; + OD; + END afficdef; + + +(* afficinstr affiche a l'ecran le schema de la semantique des coroutines*) + UNIT afficinstr : PROCEDURE; + VAR touche,choix:integer; + HANDLERS + when fin:stopexec:=true; + terminate; + END HANDLERS; + BEGIN + call CLS; + (* Mise en place du texte*) + call MOVE(154,16); + call COLOR(12); + call OUTSTRING("INSTRUCTIONS ASSOCIEES AUX COROUTINES"); + call MOVE(258,32); + call OUTSTRING("SEMANTIQUE"); + + call MOVE(76,60); + call COLOR(7); + call OUTSTRING("Declaration : VAR C:nom_coroutine;"); + + call COLOR(12); + call MOVE(206,76); + call VFILL(90); + call MOVE(202,90); + call OUTSTRING("V"); + call cadre(146,100,266,116,10); + call COLOR(7); + call MOVE(174,104); + call OUTSTRING("CREATION"); + call MOVE(222,83); + call OUTSTRING("C:=new nom_coroutine();"); + + call COLOR(12); + call MOVE(206,118); + call VFILL(130); + call MOVE(202,130); + call OUTSTRING("V"); + call cadre(146,140,266,156,10); + call COLOR(7); + call MOVE(150,144); + call OUTSTRING("INITIALISATION"); + + call COLOR(12); + call MOVE(206,158); + call VFILL(170); + call MOVE(202,170); + call OUTSTRING("V"); + call cadre(146,180,266,196,10); + call COLOR(7); + call MOVE(154,184); + call OUTSTRING("DESACTIVATION"); + call MOVE(222,164); + call OUTSTRING("return;"); + + call COLOR(12); + call MOVE(176,198); + call VFILL(210); + call MOVE(172,210); + call OUTSTRING("V"); + call MOVE(236,198); + call VFILL(216); + call MOVE(232,198); + call OUTSTRING("^"); + call cadre(146,220,266,236,10); + call COLOR(7); + call MOVE(168,224); + call OUTSTRING("ACTIVATION"); + call MOVE(80,204); + call OUTSTRING("attach(C);"); + call MOVE(252,204); + call OUTSTRING("detach;"); + + call COLOR(12); + call MOVE(206,238); + call VFILL(250); + call MOVE(202,250); + call OUTSTRING("V"); + call cadre(146,260,266,276,10); + call COLOR(7); + call MOVE(178,264); + call OUTSTRING("TERMINE"); + + call COLOR(12); + call MOVE(206,278); + call VFILL(290); + call MOVE(202,290); + call OUTSTRING("V"); + + call MOVE(116,298); + call COLOR(7); + call OUTSTRING("Destruction : kill(C);"); + + call MOVE(444,324); + call COLOR(12); + call OUTSTRING("Page suivante"); + choix:=boutontxt; + if choix=0 then + (* l'utilisateur a clique sur quitter *) + raise fin; + else + (* L'utilisateur a clique sur page suivante*) + call pagesuiv; + fi; + END afficinstr; + + +(* pagesuiv affiche a l'ecran les informations sur les instructions *) +(* associees aux coroutines*) + UNIT pagesuiv : PROCEDURE; + VAR touche,choix:integer; + BEGIN + call CLS; + (* Mise en place du texte*) + call MOVE(154,16); + call COLOR(12); + call OUTSTRING("INSTRUCTIONS ASSOCIEES AUX COROUTINES"); + call MOVE(258,32); + call OUTSTRING("Suite..."); + call COLOR(12); + call MOVE(16,48); + call OUTSTRING("I> New"); + call COLOR(7); + call MOVE(56,64); + call OUTSTRING("Instruction generatrice (allocateur) de creation d'un objet"); + call MOVE(56,72); + call OUTSTRING("d'une classe donnee (dans le cas present coroutine)."); + call MOVE(88,84); + call OUTSTRING("Exemple : C:=NEW nom_coroutine;"); + + call COLOR(12); + call MOVE(16,100); + call OUTSTRING("II> Return"); + call COLOR(7); + call MOVE(56,116); + call OUTSTRING("Apres que le record d'activation de la coroutine ait ete cree,"); + call MOVE(56,124); + call OUTSTRING("(instruction NEW), et que les initialisations aient ete effec-"); + call MOVE(56,132); + call OUTSTRING("tuees, l'instruction de retour RETURN (obligatoire) a pour effet"); + call MOVE(56,140); + call OUTSTRING("de rendre le controle au programme appelant."); + + call COLOR(12); + call MOVE(16,156); + call OUTSTRING("III> Attach"); + call COLOR(7); + call MOVE(56,172); + call OUTSTRING("Des qu'un objet de type coroutine a ete cree, il peut etre soit"); + call MOVE(56,180); + call OUTSTRING("actif, soit suspendu. Toute reactivation d'une coroutine X "); + call MOVE(56,188); + call OUTSTRING("(ATTACH(X);) se traduit par la suspension de la coroutine active"); + call MOVE(56,196); + call OUTSTRING("et par la poursuite de l'execution a l'instruction de x suivant"); + call MOVE(56,204); + call OUTSTRING("celle ayant ete executee lors de la precedente reactivation."); + + call COLOR(12); + call MOVE(16,220); + call OUTSTRING("IV> Detach"); + call COLOR(7); + call MOVE(56,236); + call OUTSTRING("L'instruction DETACH a pour effet de desactiver la coroutine"); + call MOVE(56,244); + call OUTSTRING("active qui contient la dite instruction et de rendre la main a"); + call MOVE(56,252); + call OUTSTRING("la coroutine appelante (i.e. celle contenant le dernier ATTACH)."); + + call COLOR(12); + call MOVE(16,268); + call OUTSTRING("V> Kill"); + call COLOR(7); + call MOVE(56,284); + call OUTSTRING("L'instruction KILL(X) a pour consequence la destruction du "); + call MOVE(56,292); + call OUTSTRING("record d'activation de la coroutine designee par la variable"); + call MOVE(56,300); + call OUTSTRING("de reference X."); + + call MOVE(434,324); + call COLOR(12); + call OUTSTRING("Page precedente"); + choix:=boutontxt; + if choix=0 then + (* l'utilisateur a clique sur quitter *) + raise fin; + else + (* L'utilisateur a clique sur page suivante*) + call afficinstr; + fi; + END pagesuiv; + + +(********************************************************************************) +(* Procedures permettant de quitter l'application ou de revenir au menu *) +(********************************************************************************) + + (* Gestion du click sur l'icone 'Quitter' car execution terminee ou point *) + (* d'arret atteint*) + UNIT finexecut: PROCEDURE(typexec:integer,rempli,atteint:boolean); + VAR i,touche:integer, + selection:boolean; + BEGIN + call MOVE(16,296); + call COLOR(10); + if rempli then + call OUTSTRING("LE NOMBRE MAXIMUM DE SAISIE DES VALEURS DU TABLEAU EST ATTEINT !"); + call MOVE(150,304); + call OUTSTRING("Cliquez sur l'icone Quitter afin de retourner au menu"); + else + if typexec=5 then + if atteint then + call OUTSTRING("POINT D'ARRET ATTEINT !.Pour retourner au menu, cliquez sur l'icone Quitter"); + else + call OUTSTRING("LE PROGRAMME S'EST TERMINE SANS ETRE PASSE PAR LE POINT D'ARRET !"); + call MOVE(150,304); + call OUTSTRING("Cliquez sur l'icone Quitter afin de retourner au menu"); + fi; + fi; + + if typexec=3 or typexec=4 then + call OUTSTRING("PROGRAMME TERMINE !.Pour retourner au menu, cliquez sur l'icone Quitter"); + fi; + fi; + call SHOWCURSOR; + call COLOR(12); + call MOVE(16,260); + call OUTSTRING("Quitter"); + selection:=false; + g:=false; + d:=false; + c:=false; + (* Gestion de la souris *) + DO + call GETPRESS(0,h,v,b,g,d,c); + if g then + call clicquit(h,v,selection); + call HIDECURSOR; + if not selection then + g:=false; + call SHOWCURSOR; + repeat; + else + (* l'utilisateur a clique sur quitter *) + raise fin; + fi; + fi; + OD; + END finexecut; + + (* quitter permet de sortir de l'application convenablement *) + UNIT quitter : PROCEDURE; + BEGIN + call GROFF; + call NewPage; + call Setcursor(5,20); + writeln("**********TERMINE**********"); + call ENDRUN; + END quitter; + + +(********************************************************************************) +(* PROGRAMME PRINCIPAL : main *) +(********************************************************************************) + + BEGIN + (* Utilisation du mode graphique *) + call GRON(0); + (* Mise en place de l'ecran de presentation de l'application *) + call presentation; + DO + call COLOR(9); + call style(1); + demarrage:=false; + ptarok:=false; + xpa:=0; + ypa:=0; + call menu(nooper,typexec); (* Recuperation des choix de l'utilisateur*) + call BORDER(16); + CASE nooper + when 0: + (*l'utilisateur veut quitter l'application*) + call quitter; + + when 1: + (*l'utilisateur choisit d'executer le programme prod-cons*) + if typexec=0 then + (* L'utilisateur choisit de quitter l'application *) + call quitter; + else + call contexte(typexec,ptarok); + (* Si typexec=3 alors execution normale du programme *) + (* Si typexec=4 alors execution pas a pas du programme*) + (* Si typexec=5 alors execution avec point d'arret *) + + if typexec=3 or typexec=4 then + call instalnorm(typexec,xpa,ypa,demarrage); + if demarrage then (* Choix de l'option execution*) + call execut(typexec,xpa,ypa); + if stopexec then + (* Choix a un moment donne de l'option Quitter*) + stopexec:=false; + repeat; + fi; + fi; + if stopexec then + stopexec:=false; + fi; + fi; + + if typexec=5 then + call mainvisu; + call prodvisu; + call consvisu; + (* Selection du point d'arret par l'utilisateur*) + call selectpoint(xpa,ypa); + if stopexec then + stopexec:=false; + else + ptarok:=true; + call contexte(typexec,ptarok); + call instalnorm(typexec,xpa,ypa,demarrage); + if stopexec then + stopexec:=false; + else + call execut(typexec,xpa,ypa); + if stopexec then + stopexec:=false; + fi; + fi; + fi; + fi; + fi; + when 2: (* L'utilisateur desire des renseignements sur les coroutines*) + if typexec=0 then + call quitter; + else + (* Si typexec=3 alors affichage de la definition et de l'interet*) + (* des coroutines*) + (* Si typexec=4 alors affichage du shema de la semantique des*) + (* coroutines*) + + if typexec=3 then + call afficdef; + if stopexec then + stopexec:=false; + fi; + else + if typexec=4 then + call afficinstr; + if stopexec then + stopexec:=false; + fi; + fi; + fi; + fi; + repeat; + ESAC; + OD; + END; + END; + END COROUTINE. + +(********************************************************************************) diff --git a/examples/examples/p.log b/examples/examples/p.log new file mode 100644 index 0000000..c0d2f33 --- /dev/null +++ b/examples/examples/p.log @@ -0,0 +1,1502 @@ +(* ********************************************************** *) +(* +SOURCE : P.LOG +PROGRAMME : Visualisation de coroutines sur l'exemple du programme merge.log + +AUTEURS : BEAU Anne-Valerie + DELBURG Myriam +*) +(* ********************************************************** *) +(* + Les units utilises : + ecrit + lit + affiche_abr + affiche_prg + affiche_cor + node + efface + pause + mousepos + rectangle + inchar + menu + presentation +*) + + + + + + +BLOCK + (* COROUTINE MERGE OF BINARY TREES*) + +(*************************************************************) +unit ecrit : iiuwgraph procedure( Number : integer ); + var n1, n2, n3 : integer; +begin + if Number < 10 + then + call HASCII(0); + call HASCII(Number + 48); + call Hascii(0); + else + if Number < 100 + then + n1 := Number div 10; + n2 := Number - n1 * 10; + call HASCII(0); + call Hascii(n1 + 48); + call Hascii(0); + call Hascii(n2 + 48); + else + n1 := Number div 100; + n2 := (Number - n1 * 100) div 10; + n3 := Number - n1 * 100 - n2 * 10; + call HASCII(0); + call Hascii(n1 + 48); + call Hascii(0); + call Hascii(n2 + 48); + call HASCII(0); + call Hascii(n3 + 48); + fi; + fi; + call outstring(" "); +end ecrit; + +(*************************************************************) +unit lit : iiuwgraph function : integer; + var X,Y,i, OrdN : integer, + Number : arrayof integer; +begin + array Number dim(1:4); + i:= 0 ; + X := InXPos; + Y := InYPos; + do + OrdN:=inchar; + if i = 8 or (OrdN < 48 and OrdN > 57) then exit fi; + + case OrdN + when 48 : i:=i+1; + Number(i):=0; + when 49 : i:=i+1; + Number(i):=1; + when 50 : i:=i+1; + Number(i):=2; + when 51 : i:=i+1; + Number(i):=3; + when 52 : i:=i+1; + Number(i):=4; + when 53 : i:=i+1; + Number(i):=5; + when 54 : i:=i+1; + Number(i):=6; + when 55 : i:=i+1; + Number(i):=7; + when 56 : i:=i+1; + Number(i):=8; + when 57 : i:=i+1; + Number(i):=9; + when 8 : if i>0 + then + Number(i) := 0; + i := i - 1; + call hascii(0); + fi; + when 13 : if i > 0 then exit fi ; + esac; + + if i = 1 + then + call Move(X,Y); + call hascii(0); + call hascii(48+Number(1)); + fi; + + if i = 2 + then + call Move(X + 8,Y); + call hascii(0); + call hascii(48 + Number(2)); + fi; + od; + + if (Number(1) =0 ) or (Number(1) = 0 and Number(2) = 0) + or (Number(1) = 0 and Number(2) = 0 and Number(3) = 0) + then + call Move(X,Y); + call hascii(0); + call hascii(48); + call hascii(0); + fi; + + if i = 1 + then + result := Number(1); + else + if i = 2 + then + result := 10 * Number(1) + Number (2); + else + result := 100 * Number(1) + 10 * Number(2) + Number(3); + fi; + fi; + kill(Number); +end lit; + +(*************************************************************) +unit inchar : iiuwgraph function : integer; +var c : integer; +begin + do + c := inkey; + if c =/= 0 then exit fi; + od; + result := c; +end inchar; + +(*************************************************************) +unit mousepos : iiuwgraph procedure(A,B : integer; output chx : integer); +begin + if ((A>50) and (A<170)) + then + if ((B>325) and (B<345)) + then + chx := 1; + fi; + else + if ((A>260) and (A<380)) + then + if ((B>290) and (B<310)) + then + chx := 2; + fi; + fi; + fi; + +end mousepos; + +(*************************************************************) +unit rectangle : iiuwgraph procedure(X1,Y1,X2,Y2 : integer); +begin + call move(X1,Y1); + call draw(X2,Y1); + call move(X2,Y1); + call draw(X2,Y2); + call move(X2,Y2); + call draw(X1,Y2); + call move(X1,Y2); + call draw(X1,Y1); +end rectangle; + +(*************************************************************) +unit affiche_prg : iiuwgraph procedure; +begin + call color(13); + call move(5,5); + call draw(5,325); + call draw(400,325); + call draw(400,5); + call draw(5,5); + call move(5,15); + call draw(400,15); + call move(100,7); + call outstring("DL"); + call move(260,7); + call outstring("SL"); + call move(5,97); + call draw(400,97); + call move(370,330); + call outstring("main"); + call color(3); + call move(10,17); + call outstring("program merge;"); + call move(20,26); + call outstring("unit node:class;...;"); + call move(30,35); + call outstring("unit ins:procedure(value:integer);...;end ins;"); + call move(20,44); + call outstring("end node;"); + call move(20,53); + call outstring("unit travers:coroutine(x:node);...;"); + call move(30,62); + call outstring("unit t:procedure(y:node);...;end t;"); + call move(20,71); + call outstring("end travers;"); + call move(20,80); + call outstring("var n ,i ,j ,min ,m :integer,"); + call color(12); + call move(63,80); + call outstring(" "); + call move(63,80); + call ecrit(n); + call move(108,80); + call outstring(" "); + call move(108,80); + call ecrit(i); + call move(158,80); + call outstring(" "); + call move(158,80); + call ecrit(j); + call move(228,80); + call outstring(" "); + call move(228,80); + call ecrit(min); + call move(285,80); + call outstring(" "); + call move(285,80); + call ecrit(m); + call color(3); + call move(30,89); + call outstring("d:arrayof node, tr:array of travers;"); + call move(10,98); + call outstring("begin"); + call move(20,107); + call outstring("writeln('Donnez le nombre d'arbres :');read(n);"); + call move(20,116); + call outstring("array d dim(1:n);"); + call move(20,125); + call outstring("for i:=1 to n do"); + call move(30,134); + call outstring("writeln('Donnez la sequence de l'arbre no :');"); + call move(30,143); + call outstring("read(j); if j>m then m:=j fi;"); + call move(30,152); + call outstring("d(i):=new node; d(i).val:=j;"); + call move(30,161); + call outstring("do"); + call move(40,170); + call outstring("read(j); if j=0 then exit fi;"); + call move(40,179); + call outstring("if j>m then m:=j fi; call d(i).ins(j);"); + call move(30,188); + call outstring("od;"); + call move(20,197); + call outstring("od;"); + call move(20,206); + call outstring("m:=m+1; array tr dim(1:n); min:=0;"); + call move(20,215); + call outstring("for i:=1 to n do"); + call move(30,224); + call outstring("tr(i):=new travers(d(i)); attach(tr(i));"); + call move(20,233); + call outstring("od;"); + call move(20,242); + call outstring("writeln('La fusion de la sequence est :');"); + call move(20,251); + call outstring("do"); + call move(30,260); + call outstring("if min=m then exit fi; min:=tr(1).val; j:=1;"); + call move(30,269); + call outstring("for i:=2 to n do"); + call move(40,278); + call outstring("if min>tr(i).val then min:=tr(i).val;j:=i;fi;"); + call move(30,287); + call outstring("od;"); + call move(30,296); + call outstring("if min2 + then + call color(3); + call move(x1+5,y1+5); + call outstring("..."); + call color(9); + call rectangle(x1,y1,x2,y2); + call move(x1,y1+5); + call draw(400,y1+5); + y1:=y1+20; + y2:=y2+20; + call color(3); + call move(x1+5,y1+5); + call ecrit(n); + call color(9); + call rectangle(x1,y1,x2,y2); + call move(x1,y1+5); + call draw(400,y1+5); + y1:=y1+20; + y2:=y2+20; + fi; + fi; +end affiche_abr; + +(*************************************************************) +unit affiche_cor : iiuwgraph procedure(x1,y1,x2,y2:integer); +begin + call color(13); + call rectangle(x1,y1,x2,y2); + call move(x1,y1+10); + call draw(x2,y1+10); + call move(x1+50,y1+2); + call outstring("DL"); + call move(x1+150,y1+2); + call outstring("SL"); + + call move(x1,y1+145); + call draw(x2,y1+145); + call move(x2-55,y2+5); + call outstring("travers"); + call color(3); + call move(x1+5,y1+15); + call outstring("unit travers:coroutine"); + call move(x1+30,y1+25); + call outstring("(x:node);"); + call move(x1+10,y1+35); + call outstring("var val : interger;"); + call move(x1+170,y1+35); + call color(12); + call outstring(" "); + call move(x1+170,y1+35); + call ecrit(valeur); + call color(3); + call move(x1+10,y1+45); + call outstring("unit t:procedure(y:node);"); + call move(x1+10,y1+55); + call outstring("begin"); + call move(x1+15,y1+65); + call outstring("if y=/=none"); + call move(x1+15,y1+75); + call outstring("then"); + call move(x1+20,y1+85); + call outstring("call t(y.left);"); + call move(x1+20,y1+95); + call outstring("val:=y.val;"); + call move(x1+20,y1+105); + call outstring("detach;"); + call move(x1+20,y1+115); + call outstring("call t(y.right);"); + call move(x1+15,y1+125); + call outstring("fi;"); + call move(x1+10,y1+135); + call outstring("end t;"); + call color(5); + call color(3); + call move(x1+5,y1+150); + call outstring("begin"); + call move(x1+10,y1+160); + call outstring("return;"); + call move(x1+10,y1+170); + call outstring("call t(x);"); + call move(x1+10,y1+180); + call outstring("val:=m;"); + call move(x1+5,y1+190); + call outstring("end travers;"); +end affiche_cor; + +(*************************************************************) +unit presentation : iiuwgraph procedure; +begin + call border(5); + call color(13); + call rectangle(115,90,515,120); + call color(3); + call move(125,100); + call outstring("VISUALISATION DES COROUTINES DU PROGRAMME MERGE"); + call move(65,160); + call outstring("Ce programme utilise les coroutines et fusionne un nombre donn‚"); + call move(65,185); + call outstring("d'arbres de recherche."); + call pause; + call cls; +end presentation; + +(*************************************************************) +unit menu : iiuwgraph procedure(output chx:integer); + var b,h,v : integer; +begin + pref mouse block + begin + if (driver) + then + call color(1); + call rectangle(20,328,140,348); + call move(50,335); + call color(15); + call outstring("Quitter"); + call move(170,340); + call outstring("Ou cliquer ailleurs pour continuer"); + call move(400,330); + call showcursor; + + do + call getpress(0,h,v,b,gauche,droit,centre); + if gauche + then + call mousepos(h,v,chx); + call hidecursor; + gauche := false; + exit; + fi; + od; + else + call move(150,340); + call outstring("SERVEZ-VOUS DE LA SOURIS"); + call pause; + chx := 5; + exit; + fi; + end; +end menu; + +(*************************************************************) +unit menu1 : iiuwgraph procedure(output chx:integer); + var b,h,v : integer; +begin + pref mouse block + begin + if (driver) + then + call color(13); + call style(2); + call rectangle(200,160,430,180); + call color(3); + call move(210,165); + call outstring("L'application est termin‚e"); + call color(1); + call rectangle(260,290,380,310); + call move(295,297); + call color(15); + call style(3); + call outstring("Quitter"); + call move(400,330); + call showcursor; + + do + call getpress(0,h,v,b,gauche,droit,centre); + if gauche + then + call mousepos(h,v,chx); + call hidecursor; + gauche := false; + exit; + fi; + od; + else + call move(150,340); + call outstring("SERVEZ-VOUS DE LA SOURIS"); + call pause; + chx := 5; + exit; + fi; + end; +end menu1; + +(*************************************************************) +unit efface : iiuwgraph procedure; +begin + call move(150,340); + call outstring(" "); +end efface; + +(*************************************************************) +unit efface_zone : iiuwgraph procedure; + var cpt : integer; +begin + for cpt:=1 to 9 + do + call move(231,cpt); + call outstring(" "); + od; + for cpt:=5 to 25 + do + call move(317,cpt); + call outstring(" "); + od; + for cpt:=30 to 160 + do + call move(231,cpt); + call outstring(" "); + od; +end efface_zone; + +(*************************************************************) +unit pause : iiuwgraph procedure; + var touche : char; +begin + pref mouse block; + var h,b,v,p : integer, + touche : char; + begin + droit := false; + driver := init(b); + if (driver) + then + call color(15); + call move(150,340); + call outstring("Appuyez sur le bouton droit de la souris"); + call move(400,340); + while (not droit) + do + call getpress(1,h,v,p,gauche,droit,centre); + od; + call move(150,340); + call outstring(" "); + call color(5); + else + call move(150,340); + call outstring(" "); + call move(150,340); + call outstring("Appuyez sur une touche"); + read (touche); + fi; + end; +end pause; + + +unit aff : iiuwgraph procedure(num : integer); +begin + call color(13); + call move(260,18); + call outstring("tr("); + call ecrit(num); + call move(310,18); + call outstring(")"); + call move(255,20); + call draw(235,20); + call move(230,17); + call outstring("<"); +end aff; + + +(*************************************************************) +UNIT NODE : CLASS; + (* NODE OF BINARY TREE *) + VAR LEFT,RIGHT : NODE, VAL,tuer : INTEGER; (*SEARCHING KEY *) + + UNIT INS : PROCEDURE (VALUE : INTEGER); + BEGIN + IF VAL> VALUE + THEN + IF LEFT = NONE + THEN + LEFT := NEW NODE; + LEFT.VAL := VALUE; + ELSE + CALL LEFT.INS(VALUE); + FI; + ELSE + (* ELEMENTS NOT LESS THAN VAL ARE LOCATED IN THE RIGHT SUBTREE *) + IF RIGHT = NONE + THEN + RIGHT := NEW NODE; + RIGHT.VAL := VALUE; + ELSE + CALL RIGHT.INS(VALUE); + FI; + FI; + END INS; +END NODE; + +unit reaffiche_boi : iiuwgraph procedure(courant,boite : node, + hmin, hmax, vmax, hauteur : integer); + var w : integer; +begin + if sortir =/= 1 + then + IF boite =/= NONE + THEN + if hauteur > 2 + then + call efface_zone; + hauteur := 0; + hmin := 240; + hmax := 630; + vmax := 10; + fi; + w := ((hmin - hmax) / 2) + hmax; + call move(w-5,vmax+10); + call color(12); + call ecrit(boite.val); + call color(13); + call rectangle(w-10,vmax-4,w+38,vmax+20); + call move(w-10,vmax+6); + call draw(w+38,vmax+6); + call move(w-3,vmax-2); + call outstring("DL"); + call move(w+20,vmax-2); + call outstring("SL"); + call move(w+30,vmax+25); + call outstring("t"); + if hauteur < 2 + then + call trait(w,vmax); + fi; + + if boite = courant + then + sortir := 1; + else + if boite.tuer = 0 + then + CALL reaffiche_boi(courant,boite.left,hmin,w,vmax+60,hauteur+1); + fi; + CALL reaffiche_boi(courant,boite.RIGHT,w,hmax,vmax+60,hauteur+1); + fi; + fi; + fi; +end reaffiche_boi; + +unit trait : iiuwgraph procedure(mil,bas : integer); +begin + call color(9); + call move(mil-10,bas+14); + call draw(mil-60,bas+14); + call draw(mil-60,bas+50); + call move(mil-67,bas+45); + call outstring("\/"); + + call move(mil+38,bas+14); + call draw(mil+88,bas+14); + call draw(mil+88,bas+50); + call move(mil+81,bas+45); + call outstring("\/"); +end trait; + +unit aff_cor : iiuwgraph procedure(x1,y1,x2,y2 : integer); +begin + call color(9); + call move(x1+220,y1+48); + call draw(x1+400,y1+5); + call move(x1+405,y1); + call outstring(">"); + call color(2); + call move(x1+400,y1-3); + call draw(x1+220,y1+3); + call move(x1+220,y1); + call outstring("<"); + call color(11); + call move(x1+450,y1-6); + call draw(x1+220,y1-6); + call move(x1+220,y1-9); + call outstring("<"); + x1 := 10; + x2 := 230; + y1 := 10; + y2 := 210; + call affiche_cor(x1,y1,x2,y2); +end aff_cor; + + +(*************************************************************) +UNIT TRAVERS : iiuwgraph COROUTINE (X :NODE); + (* CONSECUTIVE ELEMENTS OF TREE NODE ARE LOCATED IN THE GROWING ORDER TO *) + (* THE "MAIL BOX" VAL AND SENT TO THE ATTACHING UNIT *) + VAR VAL : INTEGER; + (* ----------------------------------------------------------- *) + UNIT T : PROCEDURE (Y : NODE, xmin, xmax, ymax, haut : integer); + (* RECURSIVE PROCEDURE FOR INFIX TRAVERSION RESULTING TREE ELEMENTS *) + (* IN NOT DECREASING ORDER *) + var w : integer; + BEGIN + x1 := 10; + x2 := 230; + y1 := 10; + y2 := 210; + call color(10); + call move(x1+10,y1+55); + call outstring("begin"); + call pause; + call affiche_cor(x1,y1,x2,y2); + call color(10); + call move(x1+15,y1+65); + call outstring("if y=/=none"); + call pause; + call affiche_cor(x1,y1,x2,y2); + + IF Y =/= NONE + THEN + call color(10); + call move(x1+15,y1+75); + call outstring("then"); + call pause; + if haut > 2 + then + call efface_zone; + haut := 0; + xmin := 240; + xmax := 630; + ymax := 10; + fi; + w := ((xmin - xmax) / 2) + xmax; + call move(w-5,ymax+10); + call color(12); + call ecrit(y.val); + call color(13); + call rectangle(w-10,ymax-4,w+38,ymax+20); + call move(w-10,ymax+6); + call draw(w+38,ymax+6); + call move(w-3,ymax-2); + call outstring("DL"); + call move(w+20,ymax-2); + call outstring("SL"); + call move(w+30,ymax+25); + call outstring("t"); + if haut < 2 + then + call trait(w,ymax); + fi; + + call aff_cor(x1,y1,x2,y2); + call color(10); + call move(x1+20,y1+85); + call outstring("call t(y.left);"); + call pause; + call aff_cor(x1,y1,x2,y2); + CALL T(Y.LEFT,xmin,w,ymax+60,haut+1); + sortir := 0; + call efface_zone; + call reaffiche_boi(y,x,240,630,10,0); + call color(10); + call move(x1+20,y1+95); + call outstring("val:=y.val;"); + call pause; + call aff_cor(x1,y1,x2,y2); + VAL := Y.VAL; + valeur := y.val; + call color(10); + call move(x1+20,y1+105); + call outstring("detach;"); + call pause; + call cls; + DETACH; + call aff(j); + y.tuer := 1; + sortir := 0; + call reaffiche_boi(y,x,240,630,10,0); + call aff_cor(x1,y1,x2,y2); + call color(10); + call move(x1+20,y1+115); + call outstring("call t(y.right);"); + call pause; + call aff_cor(x1,y1,x2,y2); + (* CONSECUTIVE ELEMENTS OF TREE Y ARE SENT FOR FURTHER *) + (* PROCESSING TO THE MASTER PROGRAM *) + CALL T(Y.RIGHT,w,xmax,ymax+60,haut+1); + FI; + call color(10); + call move(x1+15,y1+125); + call outstring("fi;"); + call pause; + call affiche_cor(x1,y1,x2,y2); + call color(10); + call move(x1+10,y1+135); + call outstring("end t;"); + call pause; + call affiche_cor(x1,y1,x2,y2); + call efface_zone; + END T; + +BEGIN + x1 := 410; + x2 := 630; + y1 := 30; + y2 := 230; + call affiche_cor(x1,y1,x2,y2); + call color(10); + call move(x1+5,y1+150); + call outstring("begin"); + call pause; + call affiche_cor(x1,y1,x2,y2); + call color(10); + call move(x1+10,y1+160); + call outstring("return;"); + call pause; + call affiche_cor(x1,y1,x2,y2); + RETURN; + xmin := 240; + xmax := 630; + ymax := 10; + hmin := 240; + hmax := 630; + vmax := 10; + call aff(i); + x1 := 10; + x2 := 230; + y1 := 10; + y2 := 210; + + call affiche_cor(x1,y1,x2,y2); + call color(10); + call move(x1+10,y1+170); + call outstring("call t(x);"); + call pause; + call affiche_cor(x1,y1,x2,y2); + CALL T(X,240,630,10,0); + call color(10); + call move(x1+10,y1+180); + call outstring("val:=m;"); + call pause; + call affiche_cor(x1,y1,x2,y2); + VAL := M; + valeur := m; + call affiche_cor(x1,y1,x2,y2); + call pause; + call color(10); + call move(x1+5,y1+190); + call outstring("end travers;"); + call pause; + call cls; + call affiche_prg; + (* VAL IS MAXIMAL VALUE TREATED AS A SENTINEL WHILE ENTIRE TREE IS *) + (* TRAVESED *) +END TRAVERS; + +unit saisir : iiuwgraph procedure; + var cpt, w, z : integer; +begin + w := 120; + z := 0; + call color(3); + call move(10,30); + call outstring(" Les elements de l'arbre sont des entiers"); + call move(10,50); + call outstring(" Pour terminer l'insertion des elements de l'arbre, tapez 0"); + call move(10,70); + call outstring(" Ce nombre n'est pas insere dans l'arbre"); + call color(3); + call move(10,100); + call outstring(" Donnez la sequence des elements de l'arbre numero "); + call ecrit(i); + call move(10,w); + for cpt := 1 to borne + do + z := z + 1; + if z = 10 + then + w := w + 10; + call move(10,w); + z := 0; + fi; + call ecrit(arbre(cpt)); + od; +end saisir; + +unit sequence : iiuwgraph procedure; + var cpt, w, z : integer; +begin + w := 30; + z := 0; + call color(3); + call move(10,10); + call outstring("La fusion des sequences est : "); + call move(10,w); + for cpt := 1 to borne + do + z := z + 1; + if z = 10 + then + w := w+10; + call move(10,w); + z := 0; + fi; + call ecrit(res(cpt)); + od; +end sequence; + + + +(*************************************************************) + VAR N,I,J,MIN,M,K, choix,x1,x2,y1,y2,valeur,u : INTEGER, + h,v,p,abscisse,ordonnee,xmin,xmax,ymax : integer, + hmin,hmax,vmax,hauteur,haut,sortir,borne,longueur : integer, + driver,droit,gauche,centre : boolean, + touche : char, + rep : char, + arbre,res : arrayof integer, + + (* N - TNE NUMBER OF TREES + M - MAXIMAL KEY VALUE + 1 + MIN- MINIMAL VALUE PRODUCED AT A GIVEN MOMENT BY SYSTEM OF COROUTINES*) + D : ARRAYOF NODE, + TR : ARRAYOF TRAVERS; + +BEGIN + pref iiuwgraph block + begin + abscisse := 0; + ordonnee := 30; + driver := false; + call hpage(0,0,0); + call hpage(0,639,349); + call gron(0); + call presentation; + gauche := false; + droit := false; + centre := false; + call border(5); + call color(3); + + call cls; + + call affiche_prg; + call color(10); + call move(10,98); + call outstring("begin"); + call pause; + + DO + call affiche_prg; + call color(10); + call move(20,107); + call outstring("writeln('Donnez le nombre d'arbres :');"); + call pause; + call cls; + call color(3); + call move(10,10); + call outstring(" Donnez le nombre d'arbres : "); + call pause; + call cls; + call affiche_prg; + call color(10); + call move(332,107); + call outstring("read(n);"); + call pause; + call cls; + call color(3); + call move(10,10); + call outstring(" Donnez le nombre d'arbres : "); + read(N); + IF N>0 + THEN EXIT; + ELSE + call move(10,30); + call outstring(" Ce nombre doit etre superieur a 0"); + call pause; + call cls; + FI; + OD; + call move(250,10); + call ecrit(N); + call pause; + call cls; + + call affiche_prg; + call color(10); + call move(20,116); + call outstring("array d dim(1:n);"); + call pause; + ARRAY D DIM(1:N); + call affiche_prg; + + x1:=450; + x2:=485; + y1:=30; + y2:=45; + call affiche_abr(x1,y1,x2,y2); + call pause; + call cls; + + longueur := 0; + FOR I := 1 TO N + DO + borne := 0; + array arbre dim(1:50); + call affiche_prg; + call color(10); + call move(20,125); + call outstring("for i:=1 to n do"); + call pause; + call affiche_prg; + call color(10); + call move(30,134); + call outstring("writeln('Donnez la sequence de l'arbre no :');"); + call pause; + call cls; + call saisir; + call pause; + call cls; + + do + call affiche_prg; + call color(10); + call move(30,143); + call outstring("read(j);"); + call pause; + call cls; + call saisir; + call move(10,200); + read(J); + if j > 0 + then exit; + fi; + call cls; + od; + borne := borne + 1; + arbre(borne) := j; + longueur := longueur + 1; + call saisir; + call pause; + call cls; + + call affiche_prg; + call color(10); + call move(102,143); + call outstring("if j>m"); + call pause; + IF J>M + THEN + call affiche_prg; + call color(10); + call move(158,143); + call outstring("then"); + call pause; + call affiche_prg; + call color(10); + call move(198,143); + call outstring("m:=j"); + call pause; + M :=J; + call affiche_prg; + call color(10); + call move(238,143); + call outstring("fi;"); + call pause; + FI; + + call affiche_prg; + call color(10); + call move(30,152); + call outstring("d(i):=new node;"); + call pause; + D(I) := NEW NODE; + call affiche_prg; + call color(10); + call move(158,152); + call outstring("d(i).val:=j;"); + + call pause; + D(I).VAL := J; + + DO + call affiche_prg; + call color(10); + call move(30,161); + call outstring("do"); + call pause; + do + call affiche_prg; + call color(10); + call move(40,170); + call outstring("read(j);"); + call pause; + call cls; + + call saisir; + call move(10,200); + read(j); + if j =/= 0 + then + borne := borne + 1; + arbre(borne) := j; + longueur := longueur + 1; + call saisir; + call pause; + fi; + call cls; + call affiche_prg; + call color(10); + call move(112,170); + call outstring("if j=0"); + call pause; + IF J = 0 + THEN + call affiche_prg; + call color(10); + call move(168,170); + call outstring("then"); + call pause; + call affiche_prg; + call color(10); + call move(208,170); + call outstring("exit"); + call pause; + EXIT exit; + FI; + call affiche_prg; + call color(10); + call move(248,170); + call outstring("fi;"); + call pause; + + if j > 0 then exit fi; + od; + + call affiche_prg; + call color(10); + call move(40,179); + call outstring("if j>m"); + call pause; + IF J > M + THEN + call affiche_prg; + call color(10); + call move(96,179); + call outstring("then"); + call pause; + call affiche_prg; + call color(10); + call move(136,179); + call outstring("m:=j"); + call pause; + M := J; + call affiche_prg; + call color(10); + call move(176,179); + call outstring("fi;"); + call pause; + FI; + + call affiche_prg; + call color(10); + call move(208,179); + call outstring("call d(i).ins(j);"); + call pause; + CALL D(I).INS(J); + call affiche_prg; + call color(10); + call move(30,188); + call outstring("od;"); + call pause; + OD; + call affiche_prg; + call color(10); + call move(20,197); + call outstring("od;"); + call pause; + kill(arbre); + OD; + + + call affiche_prg; + + call menu(choix); + if choix = 1 + then + call groff; + call endrun; + else + call move(19,327); + for u:=328 to 348 + do + call move(20,u); + call outstring(" "); + od; + + call color(10); + call move(20,206); + call outstring("m:=m+1;"); + call pause; + M := M+1; + fi; + + call affiche_prg; + call color(10); + call move(84,206); + call outstring("array tr dim(1:n);"); + call pause; + ARRAY TR DIM(1:N); + + call affiche_prg; + call color(10); + call move(236,206); + call outstring("min:=0;"); + call pause; + MIN := 0; + + FOR I:=1 TO N DO + call affiche_prg; + call color(10); + call move(20,215); + call outstring("for i:=1 to n do"); + call pause; + + call affiche_prg; + call color(10); + call move(30,224); + call outstring("tr(i):=new travers(d(i));"); + call pause; + + + call color(13); + call move(580,10); + call outstring("tr("); + call ecrit(i); + call move(630,10); + call outstring(")"); + call move(595,22); + call outstring("\/"); + call move(602,18); + call draw(602,26); + + call color(9); + call move(310,55); + call draw(400,55); + call move(400,52); + call outstring(">"); + + call color(2); + call move(465,30); + call draw(465,20); + call draw(400,20); + call move(400,17); + call outstring("<"); + + call color(11); + call move(570,30); + call draw(570,10); + call draw(400,10); + call move(400,7); + call outstring("<"); + TR(I) := NEW TRAVERS (D(I)); + call affiche_prg; + + + x1 := 410; + x2 := 630; + y1 := 30; + y2 := 230; + call affiche_cor(x1,y1,x2,y2); + + call affiche_prg; + call color(10); + call move(238,224); + call outstring("attach(tr(i));"); + call pause; + call cls; + x1 := 10; + x2 := 230; + y1 := 10; + y2 := 210; + call affiche_cor(x1,y1,x2,y2); + ATTACH(TR(I)); + + call affiche_prg; + call color(10); + call move(20,233); + call outstring("od;"); + call pause; + OD; + + call affiche_prg; + + call menu(choix); + if choix = 1 + then + call groff; + call endrun; + else + call move(19,327); + for u:=328 to 348 + do + call move(20,u); + call outstring(" "); + od; + + call color(10); + call move(20,242); + call outstring("writeln('La fusion de la sequence est :');"); + call pause; + fi; + call cls; + + borne := 0; + array res dim(1:longueur); + call sequence; + call pause; + call cls; + + DO + call affiche_prg; + call color(10); + call move(20,251); + call outstring("do"); + call pause; + + call affiche_prg; + call color(10); + call move(30,260); + call outstring("if min=m"); + call pause; + IF MIN = M + THEN + call affiche_prg; + call color(10); + call move(102,260); + call outstring("then"); + call pause; + call affiche_prg; + call color(10); + call move(142,260); + call outstring("exit"); + call pause; + EXIT; + FI; + call affiche_prg; + call color(10); + call move(182,260); + call outstring("fi;"); + call pause; + + call affiche_prg; + call color(10); + call move(214,260); + call outstring("min:=tr(1).val;"); + call pause; + MIN := TR(1).VAL; + + call affiche_prg; + call color(10); + call move(342,260); + call outstring("j:=1;"); + call pause; + J :=1; + + FOR I:= 2 TO N + DO + call affiche_prg; + call color(10); + call move(30,269); + call outstring("for i:=2 to n do"); + call pause; + + call affiche_prg; + call color(10); + call move(40,278); + call outstring("if min>tr(i).val"); + call pause; + IF MIN>TR(I).VAL + THEN + call affiche_prg; + call color(10); + call move(176,278); + call outstring("then"); + call pause; + + call affiche_prg; + call color(10); + call move(216,278); + call outstring("min:=tr(i).val;"); + call pause; + MIN:= TR(I).VAL; + + call affiche_prg; + call color(10); + call move(336,278); + call outstring("j:=i;"); + call pause; + J := I; + + call affiche_prg; + call color(10); + call move(376,278); + call outstring("fi;"); + call pause; + FI; + call affiche_prg; + call color(10); + call move(30,287); + call outstring("od;"); + call pause; + OD; + + call affiche_prg; + call color(10); + call move(30,296); + call outstring("if min=XSouris) + and (Y<=YSouris) and (YY>=YSouris)) ; + if result + then + (* simulation de l'onfoncement du bouton *) + call BORDURE (C3,C2) ; + call BORDURE (C2,C3) ; + fi + end BOUTON_ENFONCE; + +(* Bouton_Aff := False ;*) + end BOUTON ; + (******** BOUTON *********) + + + (********** ASCENSEUR *********) + (* Class g‚rant les proc‚dures relatives aux Ascenseur + Hor : Bool‚en … vrai si l'ascenseur est horizontal, + Max : Valeur indiquant le maximum pour le d‚placement de l'ascenseur, + X, Y : Coordonn‚es haut gauche de l'ascenseur, + Lgr : Longueur (ou hauteur) de l'ascenseur, + C1, C2, C3 : Trois couleurs (Fond, Bordure une, Bordure deux). + + BPlus, BDep, BBar, BMoins : Boutons de l'ascenseur, + Map : Sauvegarde l'‚cran avant l'affichage du bouton, + Courant : Valeur de d‚placement de l'ascenseur. *) + unit ASCENSEUR : class (Hor:Boolean,Max,X,Y,Lgr,c1,c2,c3 : integer) ; + Var BPlus, BDep, BBar, BMoins : BOUTON, + Map : arrayof integer, + Courant : Integer ; + + + (* Bouge le bouton de d‚placement de l'ascenseur. *) + unit BOUGE_ASC : procedure (EffAvt : boolean) ; + begin + if EffAvt then + call BDep.EFF_BOUTON ; + fi ; + if Max > 0 + then + if (Hor) + then + BDep.X:=X+20+(Lgr-60)*Courant/Max ; + BDep.XX:=BDep.X+20 ; + else + BDep.Y:=Y+20+(Lgr-60)*Courant/Max ; + BDep.YY:=BDep.Y+20 ; + fi ; + fi ; + call BDep.AFF_BOUTON ; + end BOUGE_ASC; + + (* Affiche l'ascenseur *) + unit AFF_ASC : procedure ; + Var i : Integer ; + begin + call BPlus.AFF_BOUTON ; + call BMoins.AFF_BOUTON ; + call BBar.AFF_BOUTON ; + call Color(0) ; + for i:=1 to 6 + do + if (Hor) then + call move (X+5+i,y+11-i) ; + call draw (X+5+i,y+9+i) ; + call move (X+Lgr-14+i,y+4+i) ; + call draw (X+Lgr-14+i,y+16-i) ; + else + call move (X+11-i,y+5+i) ; + call draw (X+9+i,y+5+i) ; + call move (X+4+i,y+Lgr-14+i) ; + call draw (X+16-i,y+Lgr-14+i) ; + fi ; + od ; + call BOUGE_ASC (False) ; + end AFF_ASC ; + + begin + if (Lgr<70) then Lgr := 70 fi ; + BPlus := new BOUTON (X,Y,X+20,Y+20,2,c1,c3,c2) ; + if (Hor) + then + BDep := new BOUTON (X+20,Y,X+40,Y+20,2,c1,c3,c2) ; + BBar := new BOUTON (X+20,Y,X+Lgr-20,Y+20,2,c1,c1,c1) ; + BMoins := new BOUTON (X+Lgr-20,Y,X+Lgr,Y+20,2,c1,c3,c2) ; + else + BDep := new BOUTON ( X,Y+20,X+20,Y+40,2,c1,c3,c2) ; + BBar := new BOUTON ( X,Y+20,X+20,Y+Lgr-20,2,c1,c1,c1) ; + BMoins := new BOUTON ( X,Y+Lgr-20,X+20,Y+Lgr,2,c1,c3,c2) ; + fi ; + Courant := 0 ; + end ASCENSEUR ; + (********** ASCENSEUR *********) + + + (********** WINDOWS *********) + (* Class g‚rant les proc‚dures relatives aux Fenˆtres (ces fenˆtres sont + celles qui permettent d'afficher les trois matrices (A, B, Res ou Tmp) + Titre : Nom de la fenˆtre ("A", "B", "Tmp" ou "Res"), + Maxi : Valeur indiquant la taille de la matrice, + X, Y : Coordonn‚es haut gauche de la fenˆtre, + + A1, A2 : Deux ascenseur (horizontal, vertical), + Map : Sauvegarde l'‚cran avant l'affichage du bouton, + Courant : Valeur de d‚placement de l'ascenseur. + Taille, Fond_win : Deux bouton (les 1er pour afficher la taille de la + matrice, le second qui sert de fond … la fenˆtre *) + unit WINDOWS : class (Titre : string ; Maxi, X, Y : Integer); + var A1, A2 : ASCENSEUR, + i : integer, + Taille, Fond_Win : BOUTON ; + + (* Affiche la matrice : au maximum 4 x 4 *) + unit AFF_MATRICE : procedure (M : arrayof arrayof integer) ; + var max, i, j : integer ; + begin + (* max ne peut ˆtre plus grand que 4 *) + max:=imin(4,upper(M)) ; + for i:=1 to 4 + do + (* On efface les ‚ventuelles anciennes valeures *) + call outstring (X+10+(i*58),Y+7," ",4,12) ; + call outstring (X+10,Y+(i*38)," ",4,12) ; + for j:=1 to 4 + do + call outstring (X-21+(i*58),Y+(j*38)," ",4,12) ; + od ; + od ; + for i:=1 to max + do + (* On ‚crit les nouvelles valeures *) + call track (X+10+(i*58),Y+7,A1.Courant+i,12,4) ; + call track (X+10,Y+(i*38),A2.Courant+i,12,4) ; + for j:=1 to max + do + if Aff_Num_Grd or M(j+A1.Courant,i+A2.Courant)<=9999999 and + M(j+A1.Courant,i+A2.Courant)>=-100000 + then + call track (X-21+(i*58),Y+(j*38),M(j+A1.Courant,i+A2.Courant),12,4) ; + else + call outstring (X-21+(i*58),Y+(j*38)," #####",4,12) ; + fi ; + od ; + od ; + end AFF_MATRICE ; + + (* Test si un clique a eu lieu sur un des bouton (+ ou -) de l'ascenseur, + enventuellement modifie la valeur de courant de l'ascenseur et + bouge l'ascenseur *) + unit MOUVE_ASC : procedure (M : arrayof arrayof integer; + A : ASCENSEUR;NumSouris, X_S, Y_S : integer) ; + begin + if (A.BMoins.BOUTON_ENFONCE (1,NumSouris,X_S, Y_S)) + then + if (A.Courant0) + then + (* si le bouton + de l'ascenseur est cliquer et que la valeure courant + est sup‚rieure … 0, alors on bouge l'ascenseur, on d‚cr‚ment la + valeure courant et on r‚affiche la matrice *) + A.Courant:=A.Courant-1 ; + call A.BOUGE_ASC (True) ; + call AFF_MATRICE (M) ; + fi ; + fi ; + end MOUVE_ASC ; + + (* Efface une fenˆtre *) + unit EFF_WINDOWS : procedure ; + begin + call A1.BPlus.EFF_BOUTON ; + call A2.BPlus.EFF_BOUTON ; + call A1.BMoins.EFF_BOUTON ; + call A2.BMoins.EFF_BOUTON ; + call Fond_Win.EFF_BOUTON ; + call Fond_Win.EFF_BOUTON ; + call Taille.EFF_BOUTON ; + end EFF_WINDOWS; + + begin + Fond_Win:=new BOUTON (X,Y,X+270,Y+180,3,12,13,5) ; + Taille:= new BOUTON (X+270,Y+180,X+290,Y+200,0,15,15,15) ; + call Fond_Win.AFF_BOUTON ; + call Color (0) ; + (* double cadre dans la fenˆtre *) + call Move (X+34,Y+4) ; call Draw (X+34,Y+176) ; + call Move (X+36,Y+4) ; call Draw (X+36,Y+176) ; + call Move (X+4,Y+27) ; call Draw (X+266,Y+27) ; + call Move (X+4,Y+29) ; call Draw (X+266,Y+29) ; + for i:=1 to 3 + do + (* Cadre s‚parant les valeures *) + call Move (X+36+(i*58),Y+4) ; call Draw (X+36+(i*58),Y+176) ; + call Move (X+4,Y+29+(i*38)) ; call Draw (X+266,Y+29+(i*38)) ; + od ; + A1 := new ASCENSEUR(True,maxi-4,X,Y+180,270,7,8,15) ; + A2 := new ASCENSEUR(False,maxi-4,X+270,Y,180,7,8,15) ; + call A1.AFF_ASC ; + call A2.AFF_ASC ; + call Taille.AFF_BOUTON ; + call Outstring (X+7,Y+10,Titre,12,4) ; + call track (X+273,Y+184,Maxi,15,0) ; + end WINDOWS ; + (********** WINDOWS *********) + + (********** AIDE *********) + (* Class g‚rant les diff‚rents ‚cran d'aide + B1 .. B6 : Six bouton permettant l'affichage des menu d'aide, + FinAide : Bool‚en qui permet de quitter le menu d'aide, + Interrupt, x_s, y_s, Key1, Key2, Flags, Num_Mouse : Permet la + gestion des ‚vŠnement de la souris *) + unit AIDE : procedure ; + var B1, B2, B3, B4, B5, B6 : BOUTON, + FinAIDE, Interupt : Boolean, + x_s,y_s,Key1,Key2,Flags,Num_Mouse : integer ; + + (* Texte du menu g‚n‚ral *) + unit AIDE_GRL : procedure ; + begin + call outstring (170, 80,"Pour utiliser cette aide cliquez sur le bouton",0,3) ; + call outstring (170,100,"de votre choix.",0,3) ; + call outstring (170,130,"Vous trouverez une aide sur :",0,3) ; + call outstring (170,155," -->",0,3) ; + call outstring (219,155,"Menu :",4,3) ; + call outstring (170,175," Explication des choix du menu.",0,3) ; + call outstring (170,200," -->",0,3) ; + call outstring (219,200,"Principe du calcul :",4,3) ; + call outstring (170,220," STRASSEN ou diviser pour r‚gner.",0,3) ; + call outstring (170,245," -->",0,3) ; + call outstring (219,245,"Am‚lioration :",4,3) ; + call outstring (170,265," Comment utiliser des matrices de grandeurs",0,3) ; + call outstring (170,285," diff‚rentes.",0,3) ; + call outstring (170,310,"Remarques Le signe '>' dans les menus signifie",5,3) ; + call outstring (170,330," qu'une fenˆtre d‚pend de ce menu.",5,3); + call outstring (170,360," Vous pouvez activer un choix du menu",5,3); + call outstring (170,380," soit en cliquant dessus, soit en tapant",5,3); + call outstring (170,400," la lettre en noire.",5,3); + + end AIDE_GRL ; + + (* Texte du menu "Aide" *) + unit AIDE_MENU : procedure ; + begin + call outstring (170,75,"Quitter :",4,3) ; + call outstring (170,95," Retourne au systŠme d'exploitation.",0,3) ; + call outstring (170,120,"Variables :",4,3) ; + call outstring (170,140," Affichage de l'‚tat des 7 variables de travail",0,3) ; + call outstring (170,160," ainsi que le nombre de multiplications et",0,3) ; + call outstring (170,180," d'additions utilis‚es en r‚cursif normal, ou par",0,3) ; + call outstring (170,200," STRASSEN.",0,3) ; + call outstring (170,225,"Suite :",4,3) ; + call outstring (170,245," Etape suivante du calcul.",0,3) ; + call outstring (170,270,"R‚sultat :",4,3) ; + call outstring (170,290," Calcul direct (pas d'‚tapes interm‚diaires).",0,3) ; + call outstring (170,315,"Affichage :",4,3) ; + call outstring (170,335," Permet de changer le format des grands nombres.",0,3) ; + call outstring (170,360,"Aide :",4,3) ; + call outstring (170,380," Pour que la vie soit plus douce ....",0,3) ; + end ; + + (* Texte du menu "Calcul" *) + unit AIDE_CAL : procedure ; + begin + call outstring (170,100,"Soit … multiplier 2 matrices n x n.",0,3) ; + call outstring (170,130,"Principe :",0,3) ; + call outstring (170,160,"1. Si n > 2 : Calcul de 7 matrices n/2 x n/2",0,3) ; + call outstring (170,180," Remarque : A chaque fois qu'un produit de",0,3) ; + call outstring (170,200," sous_matrices sera rencontr‚ dans le calcul,",0,3) ; + call outstring (170,220," il faudra refaire de mˆme; d'o— la r‚cursivit‚.",0,3) ; + call outstring (170,250,"2. Sinon : Les diff‚rentes composantes de la",0,3) ; + call outstring (170,270," matrice_r‚sultat se d‚duisent directement en",0,3) ; + call outstring (170,290," rempla‡ant la m‚thode classique du produit ",0,3) ; + call outstring (170,310," scalaire par une m‚thode propre … Strassen.",0,3) ; + call outstring (170,330,"N.B. : On ‚conomise une multiplication pour",0,3) ; + call outstring (170,350," plusieurs additions.",0,3) ; + end AIDE_CAL ; + + (* Texte du menu "Am‚lioration" *) + unit AIDE_AMEL : procedure ; + begin + call outstring (170,100,"L'algorithme de STRASSEN n‚cessite deux matrices",0,3) ; + call outstring (170,130,"carr‚es de taille identique et dont l'ordre doit",0,3) ; + call outstring (170,160,"ˆtre sous la forme d'une puissance exacte de deux",0,3) ; + call outstring (170,190,"(ordre = 2 ).",0,3) ; + call outstring (170+80,180,"k",0,3) ; + call outstring (170,230,"Le programme accepte des matrices ne satisfaisant",0,3) ; + call outstring (170,260,"pas … ces conditions. Il ajuste ensuite celles-ci",0,3) ; + call outstring (170,290,"en compl‚tant, ‚ventuellement, avec des 0.",0,3) ; + call outstring (170,330,"Le programme laisse donc … l'utilisateur une plus",0,3) ; + call outstring (170,360,"grande souplesse d'utilisation.",0,3) ; + end AIDE_AMEL ; + + + begin + (* Bouton du fond de l'aide *) + B1:=new BOUTON (150,31,600,431,2,3,11,1) ; + (* Bouton du fond du menu de l'aide *) + B2:=new BOUTON (156,37,256,60,2,7,15,8) ; + (* Bouton du menu "Menu" *) + B3:=new BOUTON (258,37,358,60,2,7,15,8) ; + (* Bouton du menu "Calcul" *) + B4:=new BOUTON (360,37,490,60,2,7,15,8) ; + (* Bouton du menu "Am‚lioration" *) + B5:=new BOUTON (492,37,592,60,2,7,15,8) ; + (* Bouton du menu "Fermer" *) + B6:=new BOUTON (160,70,580,421,0,3,3,3) ; + call B1.AFF_BOUTON ; + call B2.AFF_BOUTON ; + call outstring (162,40,"Menu >",1,7) ; + call outstring (162,40,"M",0,7) ; + call B3.AFF_BOUTON ; + call outstring (264,40,"Calcul >",1,7) ; + call outstring (264,40,"C",0,7) ; + call B4.AFF_BOUTON ; + call outstring (366,40,"Am‚lioration >",1,7) ; + call outstring (366,40,"A",0,7) ; + call B5.AFF_BOUTON ; + call outstring (498,40,"Fermer",1,7) ; + call outstring (498,40,"F",0,7) ; + call B6.AFF_BOUTON ; + call AIDE_GRL ; + FinAIDE:=False ; + while (not FinAIDE) + do + Interupt:=getpress(x_s,y_s,Key1,Key2,Flags,Num_Mouse) ; + if Interupt and (Num_Mouse=1 or key2=102 or key2=109 or + key2=99 or key2=97) + then + if B5.BOUTON_ENFONCE(1,Num_Mouse,x_s,y_s) or Key2=102 + then + (* On ferme ... *) + FinAIDE:=True ; + call B6.EFF_BOUTON ; + call B5.EFF_BOUTON ; + call B3.EFF_BOUTON ; + call B2.EFF_BOUTON ; + call B1.EFF_BOUTON ; + fi ; + if B2.BOUTON_ENFONCE(1,Num_Mouse,x_s,y_s) or Key2=109 + then + (* Appel … l'aide sur les menus *) + call B6.EFF_BOUTON ; + call B6.AFF_BOUTON ; + call AIDE_MENU ; + fi ; + if B3.BOUTON_ENFONCE(1,Num_Mouse,x_s,y_s) or Key2=99 + then + (* Appel … l'aide sur le calcul *) + call B6.EFF_BOUTON ; + call B6.AFF_BOUTON ; + call AIDE_CAL ; + fi ; + if B4.BOUTON_ENFONCE(1,Num_Mouse,x_s,y_s) or Key2=97 + then + (* Appel … l'aide sur l'am‚lioration *) + call B6.EFF_BOUTON ; + call B6.AFF_BOUTON ; + call AIDE_AMEL ; + fi ; + fi ; + od ; + end AIDE; + (********** AIDE *********) + + + unit AFF_NUM : procedure (X, Y : integer, M : arrayof arrayof integer) ; + var B1, B2, B3 : BOUTON, + FinAFF, Interupt : Boolean, + x_s,y_s,Key1,Key2,Flags,Num_Mouse : integer ; + begin + B1:=new BOUTON (X,Y,X+380,Y+300,2,3,11,1) ; + B2:=new BOUTON (X+10,Y+270,X+160,Y+290,2,7,8,15) ; + B3:=new BOUTON (X+270,Y+270,X+370,Y+290,2,7,8,15) ; + call B1.AFF_BOUTON ; + call B2.AFF_BOUTON ; + call B3.AFF_BOUTON ; + call outstring (X+15,Y+50," AFFICHAGE DES GRANDS NOMBRES",4,3) ; + call outstring (X+15,Y+90,"Les grands nombres (> 9999999 et <-100000)",0,3) ; + call outstring (X+15,Y+120,"risquent de provoquer des affichages",0,3) ; + call outstring (X+15,Y+150,"disgracieux. Ces nombres sont donc, par",0,3) ; + call outstring (X+15,Y+180,"d‚faut remplac‚s par des #####. Si toutefois",0,3) ; + call outstring (X+15,Y+210,"vous souhaitez afficher ces valeurs, cliquez",0,3) ; + call outstring (X+15,Y+240,"sur 'Affiche num‚rique'.",0,3) ; + call outstring (X+275,Y+273,"Fermer",1,7) ; + call outstring (X+275,Y+273,"F",0,7) ; + if Aff_Num_Grd + then + call outstring (X+15,Y+273,"Affiche ##### ",1,7) ; + else + call outstring (X+15,Y+273,"Affiche num‚rique",1,7) ; + fi ; + call outstring (X+15,Y+273,"A",0,7) ; + FinAFF:=False ; + while (not FinAFF) + do + Interupt:=getpress(x_s,y_s,Key1,Key2,Flags,Num_Mouse) ; + if Interupt and (Num_Mouse=1 or key2=102 or key2=97) + then + if B3.BOUTON_ENFONCE(1,Num_Mouse,x_s,y_s) or Key2=102 + then + FinAFF:=True ; + call B3.EFF_BOUTON ; + call B2.EFF_BOUTON ; + call B1.EFF_BOUTON ; + fi ; + if B2.BOUTON_ENFONCE(1,Num_Mouse,x_s,y_s) or Key2=97 + then + FinAFF:=True ; + call B3.EFF_BOUTON ; + call B2.EFF_BOUTON ; + call B1.EFF_BOUTON ; + if Aff_Num_Grd + then + Aff_Num_Grd:=False ; + else + Aff_Num_Grd:=True ; + fi ; + call W3.AFF_MATRICE (M) ; + fi ; + fi ; + od ; + end AFF_NUM; + + + (* Procedure de saisie d'une matrice *) + unit SAISIE_MATRICE : procedure (Mat : String ; + output M : Arrayof arrayof integer) ; + var Bouton_Saisie, Bout_Pourcent : BOUTON, + i, j, n1, n2, Nb : integer ; + begin + Bouton_Saisie := new BOUTON (50,230,400,430,3,7,15,8) ; + Bout_Pourcent := new BOUTON (70,390,370,410,3,7,8,15) ; + + call Bouton_Saisie.AFF_BOUTON ; + call outstring (120,240,"SAISIE DE LA MATRICE",4,7) ; + call outstring (290,240,Mat,4,7) ; + call outstring (60,270,"Nombre de lignes (de 1 … 32) :",0,7) ; + (* Nombre de lignes et de colonnes ??? *) + n1:=hfont(330,270,4,1,32,1,8,0,15) ; + call outstring (60,290,"Nombre de colonnes (de 1 … 32) :",0,7) ; + n2:=hfont(330,290,4,1,32,1,8,0,15) ; + + M:= CREATION (n1,n2) ; + + call Bouton_Saisie.EFF_BOUTON ; + call Bouton_Saisie.AFF_BOUTON ; + call outstring (120,240,"SAISIE DE LA MATRICE",4,7) ; + call outstring (290,240,Mat,4,7) ; + call Bout_Pourcent.AFF_BOUTON ; + call outstring (70,270,"Entrez la valeur pour la ligne : ",0,7) ; + call outstring (70,290," et de la colonne : ",0,7) ; + call outstring (70,310," (valeur entre -999 et 999)",0,7) ; + call outstring (70,370,"0 % SAISIE 100 % ",1,7) ; + + nb:=0 ; + for j:=1 to upper(M) + do + call outstring(355,270," ",7,0) ; + call track (355,270,j,0,7) ; + for i:=1 to upper(M(j)) + do + call outstring(355,290," ",7,0) ; + call track (355,290,i,0,7) ; + (* saisie des matrices *) + M(j,i):=hfont(330,310,6,-999,999,0,8,0,15) ; + nb:=nb+1 ; + (* remplissage de la barre de pourcentage *) + call patern(74,394,74+(292*(nb)/(n1*n2)),406,1,1) ; + od ; + od ; + call Bouton_Saisie.EFF_BOUTON ; + end SAISIE_MATRICE ; + + unit HORLOGE : procedure ; + begin + (* on fait tourner l'aiguille de l'horloge*) + call color (7) ; + call move (395,245) ; + case Num + when 2 : call draw(395,245-8) ; + when 3 : call draw(395+8,245-8) ; + when 4 : call draw(395+8,245) ; + when 5 : call draw(395+8,245+8) ; + when 6 : call draw(395,245+10) ; + when 7 : call draw(395-8,245+8) ; + when 8 : call draw(395-8,245) ; + when 1 : call draw(395-8,245-8) ; + esac ; + call color (15) ; + call move (395,245) ; + case Num + when 1 : Num:=2 ; call draw(395,245-8) ; + when 2 : Num:=3 ; call draw(395+8,245-8) ; + when 3 : Num:=4 ; call draw(395+8,245) ; + when 4 : Num:=5 ; call draw(395+8,245+8) ; + when 5 : Num:=6 ; call draw(395,245+10) ; + when 6 : Num:=7 ; call draw(395-8,245+8) ; + when 7 : Num:=8 ; call draw(395-8,245) ; + when 8 : Num:=1 ; call draw(395-8,245-8) ; + esac ; + end ; + + + (* Procedure de d‚roulement pas … pas de l'algo. de Strassen *) + unit PASAPAS : procedure (M : arrayof arrayof integer ; + VarTmp : arrayof integer ; Nb : integer) ; + var Interupt, Reprise : boolean, + i, x_s, y_s, Key1, Key2, Flags, Num_Mouse : integer ; + begin + if (not Menu) + then + (* La premiŠre fois on fait ... + Affichage du curseur, + initialisation des boutons, + affichage du menu, + affichage des trois matrices. *) + call showcursor ; + (* Bouton1 : Bouton du fond du menu *) + Bouton1:=new BOUTON (0,0,639,30,3,9,11,1) ; + + (* B2 .. B6 : Boutons menu (Quitte, Variables, suite, R‚sultat, Aide). *) + Bouton2:=new BOUTON (4,4,100,26,0,9,1,11) ; + Bouton3:=new BOUTON (102,4,202,26,0,9,1,11) ; + Bouton4:=new BOUTON (204,4,304,26,0,9,1,11) ; + Bouton5:=new BOUTON (306,4,406,26,0,9,1,11) ; + Bouton12:=new BOUTON (408,4,508,26,0,9,1,11) ; + Bouton6:=new BOUTON (510,4,610,26,0,9,1,11) ; + + (* Boutons contextuelles (7 Variables, 8 fin variables, + 10 calcul direct). *) + Bouton7:=new BOUTON (102,31,252,371,3,3,11,1) ; + Bouton8:=new BOUTON (147,330,207,355,2,7,8,15) ; + + call Bouton1.AFF_BOUTON ; + call Bouton2.AFF_BOUTON ; + call Outstring (9,7,"Quitter",10,9) ; + call Outstring (9,7,"Q",0,9) ; + call Bouton3.AFF_BOUTON ; + call Outstring (107,7,"Variables >",10,9) ; + call Outstring (107,7,"V",0,9) ; + call Bouton4.AFF_BOUTON ; + call Outstring (209,7,"Suite",10,9) ; + call Outstring (209,7,"S",0,9) ; + call Bouton5.AFF_BOUTON ; + call Outstring (311,7,"R‚sultat",10,9) ; + call Outstring (311,7,"R",0,9) ; + call Bouton6.AFF_BOUTON ; + call Outstring (515,7,"Aide >",10,9) ; + call Outstring (523,7,"i",0,9) ; + call Bouton12.AFF_BOUTON ; + call Outstring (413,7,"Affichage >",10,9) ; + call Outstring (413,7,"A",0,9) ; + + W1:= new WINDOWS("A",upper(V),15,265) ; + W2:= new WINDOWS("B",upper(V),335,50) ; + W3:= new WINDOWS("Tmp",0,335,265) ; + + call W1.AFF_MATRICE (V) ; + call W2.AFF_MATRICE (W) ; + + Menu:=true ; + fi ; + + if (nb=1 and (Bouton4.BOUTON_Aff or Bouton5.BOUTON_Aff)) + then + (* si les calculs sont finis mais qu'il reste les boutons + suite et r‚sultat, alors on les effaces *) + call Bouton4.EFF_BOUTON ; + call Bouton5.EFF_BOUTON ; + W3.Titre:="Res" ; + call Outstring (342,275,"Res",12,4) ; + fi ; + + if (B_PasAPAS or nb=1) + then + (* Si on est toujours en Pas … Pas ou que les calculs sont fini, + on attend un clique sur quitter, suite ou r‚sultat. *) + if Bouton10.Bouton_Aff + then + call Bouton10.EFF_BOUTON ; + fi ; + W3.Maxi:=upper(M) ; + W3.A1.Max:=upper(M)-4 ; + W3.A2.Max:=upper(M)-4 ; + call W3.Taille.EFF_BOUTON ; + call W3.Taille.AFF_BOUTON ; + call track (W3.X+273,W3.Y+184,W3.Maxi,15,0) ; + call W3.AFF_MATRICE (M) ; + Reprise:=false ; + while (not reprise) + do + Interupt:= getpress(x_s, y_s, Key1, Key2, Flags, Num_Mouse) ; + if Interupt and (Num_Mouse=1 or Key2=97 or Key2=102 or Key2=105 or + (Key2>112 and Key2<116) or Key2=118) + then + (* Si le bouton gauche de la souris est enfonc‚ alors *) + if Bouton7.BOUTON_Aff + then + if Bouton8.BOUTON_ENFONCE(1,Num_Mouse,x_s,y_s) or key2=102 + then + (* Si le menu Variables est ouvert et que l'on a cliquer + sur fermer alors ... *) + call Bouton8.EFF_BOUTON ; + call Bouton7.EFF_BOUTON ; + fi ; + else + if Bouton2.BOUTON_ENFONCE(1,Num_Mouse,x_s,y_s) or key2=113 + then + (* Clique sur quitter *) + call groff ; + call endrun ; + fi ; + if Bouton3.BOUTON_ENFONCE(1,Num_Mouse,x_s,y_s) or Key2=118 + then + call Bouton7.AFF_BOUTON ; + if nb>1 + then + (* clique variables *) + for i:=1 to 7 + do + call outstring (113,30+(i*20),"x :",10,3) ; + call track(123,33+(i*20),i,3,10) ; + call track(153,30+(i*20),VarTmp(i),3,10) ; + od ; + fi ; + call outstring (108,200,"M‚thode STRASSEN",4,3) ; + call outstring (108,270,"M‚thode normale",4,3) ; + call outstring (113,220,"Xø :",1,3) ; + call track (153,220,Opp(1),3,10) ; + call outstring (113,240,"+ø :",1,3) ; + call track (153,240,Opp(2),3,10) ; + call outstring (113,290,"Xø :",1,3) ; + call track (153,290,Opp(3),3,10) ; + call outstring (113,310,"+ø :",1,3) ; + call track (153,310,Opp(4),3,10) ; + call Bouton8.AFF_BOUTON ; + call Outstring (153,335,"Fermer",1,7) ; + call Outstring (153,335,"F",0,7) ; + fi ; + if Bouton4.BOUTON_Aff and (Bouton4.BOUTON_ENFONCE(1,Num_Mouse,x_s,y_s) or Key2=115) + then + (* clique sur suite *) + Reprise:=True ; + fi ; + if Bouton5.BOUTON_Aff and (Bouton5.BOUTON_ENFONCE(1,Num_Mouse,x_s,y_s) or Key2=114) + then + (* clique sur r‚sultat *) + call Bouton4.EFF_BOUTON ; + call Bouton5.EFF_BOUTON ; + W3.Titre:="Res" ; + call Outstring (342,275,"Res",12,4) ; + Reprise:=True ; + B_PasAPAS := False ; + call Bouton10.AFF_BOUTON ; + call outstring (310,210,"Patience, je calcule.",0,7) ; + Num:=1 ; + + call patern(380,230,410,260,0,0) ; + call move (380,230) ; call draw (384,234) ; + call move (380,260) ; call draw (384,256) ; + call move (410,260) ; call draw (406,256) ; + call move (410,230) ; call draw (406,234) ; + + call move (380,245) ; call draw (384,245) ; + call move (410,245) ; call draw (406,245) ; + call move (395,230) ; call draw (395,234) ; + call move (395,260) ; call draw (395,256) ; + fi ; + if Bouton6.BOUTON_Aff and Bouton6.BOUTON_ENFONCE(1,Num_Mouse,x_s,y_s) or Key2=105 + then + (* clique sur aide *) + call AIDE ; + fi ; + if Bouton12.BOUTON_ENFONCE(1,Num_Mouse,x_s,y_s) or Key2=97 + then + (* clique sur afficahge des nombres *) + call AFF_NUM (100,100,M) ; + fi ; + call W1.MOUVE_ASC(V,W1.A1,Num_Mouse,X_S,Y_S) ; + call W1.MOUVE_ASC(V,W1.A2,Num_Mouse,X_S,Y_S) ; + call W2.MOUVE_ASC(W,W2.A1,Num_Mouse,X_S,Y_S) ; + call W2.MOUVE_ASC(W,W2.A2,Num_Mouse,X_S,Y_S) ; + call W3.MOUVE_ASC(M,W3.A1,Num_Mouse,X_S,Y_S) ; + call W3.MOUVE_ASC(M,W3.A2,Num_Mouse,X_S,Y_S) ; + fi ; + fi ; + od ; + else + call HORLOGE ; + fi ; + if (Nb=1) + then + call groff ; + fi ; + end PASAPAS ; + + + (* Gestion de l'‚cran de pr‚sentation *) + unit PRESENTATION : procedure ; + Var Bout_Pres : BOUTON, + i, j, touche_pres,x_s, y_s, special, flags, Etat_souris : integer, + Map : arrayof integer, + Interupt:boolean, + Stars : arrayof arrayof integer ; + + (* Allume des ‚toiles sur le fond *) + unit ALLUME : procedure (Num : integer) ; + begin + Stars(Num,1):=Random*638 ; + Stars(Num,2):=Random*478 ; + Stars(Num,3):=Random*200 ; + Stars(Num,4):=Random*15 ; + if ((Stars(Num,1)>174) and (Stars(Num,1)<466) and + (Stars(Num,2)>139) and (Stars(Num,2)<341)) + then + Stars(Num,3):=0 ; + fi ; + if Stars(Num,3)>0 + then + call color (Stars(Num,4)) ; + call Point (Stars(Num,1),Stars(Num,2)) ; + call Point (Stars(Num,1)+1,Stars(Num,2)) ; + call Point (Stars(Num,1),Stars(Num,2)+1) ; + call Point (Stars(Num,1)+1,Stars(Num,2)+1) ; + fi ; + end ALLUME ; + + (* Efface les ‚toiles *) + unit ETEIND : procedure (Num : integer) ; + begin + if not ((Stars(Num,1)>174) and (Stars(Num,1)<466) and + (Stars(Num,2)>139) and (Stars(Num,2)<341)) + then + call color (0) ; + call Point(Stars(Num,1),Stars(Num,2)) ; + call Point (Stars(Num,1)+1,Stars(Num,2)) ; + call Point (Stars(Num,1),Stars(Num,2)+1) ; + call Point (Stars(Num,1)+1,Stars(Num,2)+1) ; + fi ; + end ETEIND ; + + begin + call gron(0) ; + call ranset(100) ; + array Stars dim (1:50) ; + for i:=1 to 50 + do + array Stars(i) dim (1:4) ; + call ALLUME(i) ; + od ; + + Bout_Pres:=new BOUTON (175,140,465,340,4,7,15,8) ; + call Bout_Pres.AFF_BOUTON ; + call color (1) ; + call move (190,155) ; call draw (450,155) ; + call draw (450,217) ; call draw (190,217) ; + for i:=1 to 30 + do + call move (190,155+(i*2)) ; call draw (230,155+(i*2)) ; + od ; + call color (7) ; + for i:=0 to 1 + do + call move (226,159+(i*2)) ; call draw (194+i,159+(i*2)) ; + call draw (194+i,187-(i*2)) ; call draw (225+i,187-(i*2)) ; + call draw (225+i,211+(i*2)) ; call draw (194,211+(i*2)) ; + od ; + call outstring (236,200,"trassen",1,7) ; + call outstring (188,230,"Multiplication de deux matrices",4,7) ; + call outstring (188,250,"selon l'algorithme de STRASSEN.",4,7) ; + call outstring (188,275,"Auteurs : AKPAMOLI E. HANNOYER P.",0,7) ; + call outstring (188,295,"R‚alis‚ en Loglan [Janvier 1995]",0,7) ; + call color (5) ; + call patern(184,273,450,310,5,0) ; + for i:=1 to 2 + do + call move (450+(i*2),273+(7*i)) ; + call draw (450+(i*2),310+(2*i)) ; + call draw (184+(i*7),310+(2*i)) ; + od ; + Map:=GET_MAP (Bout_Pres.X,Bout_Pres.Y,Bout_Pres.XX,Bout_Pres.YY) ; + call outstring (188,315," pour continuer ...",15,7) ; + touche_pres:=0 ; + while (not touche_pres=13) + do + for i:=1 to 50 + do + if Stars(i,3)=0 then + call ETEIND (i) ; + call ALLUME (i) ; + else + Stars(i,3):=Stars(i,3)-1 ; + fi ; + od ; + Interupt:=getpress(x_s,y_s,special,touche_pres,flags,Etat_souris) ; + od ; + for i:=1 to 50 + do + call ETEIND (i) ; + od ; + call Bout_Pres.EFF_BOUTON ; + call Bout_Pres.CHG_BOUTON_XY(15,50) ; + call Bout_Pres.AFF_BOUTON ; + call PUT_MAP (Bout_Pres.X,Bout_Pres.Y,Map) ; + call init (1,0) ; + end PRESENTATION; + + + (* FIN PARTIE GRAPHIQUE *) + + + (* DEBUT PARTIE CALCUL *) + + (* Retourne deux matrice selon la norme pour le calcul avec l'algo. de + Strassen (les deux matrices sont de tailles identiques, et leur ordre + est une puissance entiŠre de deux). *) + unit AJUSTE_MATRICE : procedure (inout M1, M2 : arrayof arrayof integer) ; + var i, j : integer, + Tmp1, Tmp2 : arrayof arrayof integer, + Calcul, Max : integer ; + begin + (* Mais quel est la valeure la plus grande entre les lignes et les colonnes + des deux tableaux ???? (attention si 1 alors 2). *) + Max:=imax(2,(imax(imax(upper(M1),upper(M1(1))),imax(upper(M2),upper(M2(1)))))) ; + Calcul := LN(Max)/LN(2) ; + if (Calcul<>LN(Max)/LN(2)) + then + (* Max n'est pas une puissance entiŠre de deux alors normalisons : *) + Max:=EXPO(2,(Calcul+1)) ; + fi ; + if upper(M1)2 + then + (* si l'ordre est plus grand que deux en d‚coupe les matrices en + rappelant r‚cursivement STRASSEN*) + m:=ordre div 2; + call STRASSEN(nb,m,SOMME_PORTION(A,1,4),SOMME_PORTION(B,1,4),P1); + call STRASSEN(nb,m,SOMME_PORTION(A,3,4),PORTION(B,1),P2); + call STRASSEN(nb,m,PORTION(A,1),SOUST_PORTION(B,2,4),P3); + call STRASSEN(nb,m,PORTION(A,4),SOUST_PORTION(B,3,1),P4); + call STRASSEN(nb,m,SOMME_PORTION(A,1,2),PORTION(B,4),P5); + call STRASSEN(nb,m,SOUST_PORTION(A,3,1),SOMME_PORTION(B,1,2),P6); + call STRASSEN(nb,m,SOUST_PORTION(A,2,4),SOMME_PORTION(B,3,4),P7); + for i:=1 to m + do + for j:=1 to m + do + C(i,j):=SOUST_MATRICE(SOMME_MATRICE(P1,P4),SOUST_MATRICE(P5,P7))(i,j); + od; + od; + for i:=m+1 to ordre + do + for j:=1 to m + do + C(i,j):=SOMME_MATRICE(P2,P4)(i-m,j); + od; + od; + for i:=1 to m + do + for j:=m+1 to ordre + do + C(i,j):=SOMME_MATRICE(P3,P5)(i,j-m); + od; + od; + for i:=m+1 to ordre + do + for j:=m+1 to ordre + do + C(i,j):=SOMME_MATRICE(SOUST_MATRICE(P1,P2),SOMME_MATRICE(P3,P6))(i-m,j-m); + od; + od; + else + (* calcul des 7 variables de travail *) + x(1):=(A(1,1)+A(2,2))*(B(1,1)+B(2,2)); + x(2):=(A(2,1)+A(2,2))*B(1,1); + x(3):=A(1,1)*(B(1,2)-B(2,2)); + x(4):=A(2,2)*(B(2,1)-B(1,1)); + x(5):=(A(1,1)+A(1,2))*B(2,2); + x(6):=(A(2,1)-A(1,1))*(B(1,1)+B(1,2)); + x(7):=(A(1,2)-A(2,2))*(B(2,1)+B(2,2)); + (* Calcul du nombre d'opp‚ration : + 1, 2 : xø, +ø pour la m‚thode r‚cursive de Strassen, + 3, 4 : xø, +ø pour la m‚thode r‚cursive traditionnelle. *) + Opp(1):=Opp(1)+7 ; Opp(2):= Opp(2) + 18 ; + Opp(3):=Opp(3)+8 ; Opp(4):= Opp(4) + 4 ; + (* Calcul de la matrice r‚sultat avec les variables de travail *) + C(1,1):=x(1)+x(4)-x(5)+x(7); + C(2,1):=x(2)+x(4); + C(1,2):=x(3)+x(5); + C(2,2):=x(1)-x(2)+x(3)+x(6); + fi ; + call PASAPAS (C,x,nb) ; + end STRASSEN; + + (* Function calculant A**B *) + unit EXPO : function (A, B : integer):Integer ; + begin + if (B=0) + then + result:=1 ; + else + result:=EXPO(A,B-1)*A ; + fi ; + end EXPO ; + + var Prof,Num : integer, + W1, W2, W3, W4 : WINDOWS , + Menu, Aff_Num_Grd, B_PasAPAS : boolean, + Opp : arrayof integer, + Bouton1, + Bouton2, Bouton3, Bouton4, Bouton5, Bouton6, bouton12, + Bouton7, Bouton8, Bouton10 : Bouton, + V, W, Z : arrayof arrayof integer ; + + begin + array Opp dim (1:4) ; + call PRESENTATION ; + call SAISIE_MATRICE("A",V); + call SAISIE_MATRICE("B",W); + call AJUSTE_MATRICE(V,W) ; + call init (1,1) ; + B_PasAPAS:=True ; + Bouton10:=new BOUTON (300,200,490,270,2,7,15,8) ; + call STRASSEN (Prof,upper(V),V,W,Z) ; + end ; + end ; +end STRAS; + + diff --git a/examples/gare/gare.ccd b/examples/gare/gare.ccd new file mode 100644 index 0000000000000000000000000000000000000000..5249c64fad4640b9451d761a77728e0121bcd3af GIT binary patch literal 69960 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 Udh_o?%2WJZH~sl$`V{s1Urpg+zW@LL literal 0 HcmV?d00001 diff --git a/examples/gare/gare.log b/examples/gare/gare.log new file mode 100644 index 0000000..f493b35 --- /dev/null +++ b/examples/gare/gare.log @@ -0,0 +1,1561 @@ +program gar; + +(* DEFINITION DE LA PAGE GRAPHIQUE GENERALE *) + +BEGIN + +PREF iiuwgraph BLOCK + +(* PROCEDURE PAUSE POUR ATTENTE AU CLAVIER *) + +UNIT PAUSE:procedure; + VAR touche:char; +BEGIN + call color(12); + call move(100,320); + call outstring(" Appuyer sur ENTREE pour passer a la suite"); + read(touche); +END PAUSE; + +(* PROCEDURE D ATTENTE PAR BOUCLE ACTIVE *) + +UNIT attend:procedure(tmp:integer); + VAR i:integer; +BEGIN + for i:=0 to tmp * 10 do od; +END attend; + +(* PROCEDURE D ATTENTE AVEC COMPTEUR POUR LA SORTIE DE L APPLICATION *) + +UNIT attend_sortie:procedure; + VAR x,y,i,k,j:integer; +BEGIN + j:=9; + x:=300; + y:=200; + for k:=1 to 10 do + call color(11); + call move(300,200); + call HASCII(j+48); + for i:=0 to 4000 do od; + call color(0); + call rectangle_double(x,y-1,x+25,y+9); + call rectangle_double(x+1,y,x+24,y+8); + call rectangle_double(x+4,y+2,x+22,y+6); + call rectangle_double(x+5,y+3,x+21,y+5); + j:=j-1; + od; +END attend_sortie; + +(* PAGE DE PRESENTATION GENERALE DE DEBUT *) + +UNIT presentation:iiuwgraph procedure; +BEGIN + (* creation d'une bordure*) + call border(13); + + (*creation d'un cadre pour la fenetre*) + call move(10,10); + call draw(10,340); + call draw( 628,340); + call draw(628,10); + call draw(10,10); + call color(2); + + (*contenu du titre*) + call move(180,80); + call outstring("IMPLEMENTATION D'UNE SIMULATION"); + call move(260,100); + call outstring("DE GARE SNCF"); + call color(12); + call move(250,180); + call outstring("PROJET NUMERO 2"); + call color(14); + call move(130,280); + call outstring("PAR : Mr AC'H Fabrice et CLAVERIE Jean-Fran‡ois"); + call move(130,300); + call outstring(" Mr GOUGEON Jean-Yves et Mr RICHARD Jerome"); + + (*appel de la procedure pause pour passer a la suite*) + call PAUSE; + + (*appel de l'effacage de l'ecran*) + call cls; +END presentation; + +(* FONCTION DEFINISSANT UNE MESSAGE-BOX *) +(* ARGUMENTS : Text_message, Longueur_message, Couleur_text, Coordonnees *) + +UNIT msgbox : function(message:string,long,couleur,x,y:integer):boolean; + VAR centrage:integer,reponse:boolean, + h,v,b,i:integer; +BEGIN + PREF mouse BLOCK + BEGIN + + (* si texte petit met longueur a 6 par defaut *) + if(long<6) then long:=6; fi; + + call move(x,y); + call color(couleur); + call rectangle_double(x,y,x+(long * 9 + 20)+2,y + 52); + + (* centrage du texte dans le rectangle *) + centrage:=((long * 9+20) div 2) - ((long div 2)*8); + + for i:=(y + 3) to (y+49) do + call color(7); + call move(x+3,i); + call draw(x+(long * 9) +19 ,i); + od; + call color(couleur); + call move(x+centrage,y+5); + call outstring(message); + call color(14); + + (* definition des boutons OUI et NON *) + + call rectangle(x+centrage+1,y+29,x+centrage+26,y+41); + call move(x+centrage+2,y+32); + call outstring("OUI"); + call rectangle(x+(long * 9) -centrage +1,y+29,x+(long * 9) -centrage +26,y+41); + call move(x+(long * 9) - centrage +2,y+32); + call outstring("NON"); + call showcursor; + do + call getpress(0,h,v,b,gauche,droit,centre); + if(gauche) then + if((v> y + 29)and(v> y + 32)) then + if((h>(x+centrage+1))and(h<(x+centrage+26))) + then reponse:=true; gauche:=false; exit; + else + if((h>(x+(long * 9)-centrage +1))and(h<(x+(long * 9)-centrage +26))) + then reponse:=false;gauche:=false; exit; + fi; + fi; + fi; + fi; + od; + call hidecursor; + result:=reponse; + END; +END msgbox; + +(* PROCEDURE DE TRACAGE DE RECTANGLE SIMPLE *) + +UNIT rectangle:iiuwgraph procedure(x_h,y_h,x_b,y_b:integer); +BEGIN + call move(x_h,y_h); + call draw(x_b,y_h); + call draw(x_b,y_b); + call draw(x_h,y_b); + call draw(x_h,y_h); +END rectangle; + +(* PROCEDURE DE TRACAGE DE RECTANGLE DOUBLE AVEC RECTANGLE SIMPLE *) + +UNIT rectangle_double : iiuwgraph procedure(x_h,y_h,x_b,y_b:integer); +BEGIN + call rectangle(x_h,y_h,x_b,y_b); + call rectangle(x_h+2,y_h+2,x_b-2,y_b-2); +END rectangle_double; + +(* PROCEDURE DE CHOIX DES PARAMETRES DE LA SIMULATION *) +(* RENVOIE LA DUREE ET LE TYPE DE SIMULATION *) + +UNIT param : iiuwgraph procedure(inout duree,typ :integer); + VAR haut,bas:boolean,h,v,b:integer; +BEGIN + PREF mouse BLOCK + BEGIN + + (*initialisation *) + haut:=true; + typ:=0; + duree:=0; + h:=0;v:=0;b:=0; + bas:=true; + call color(14); + call move(100,40); + call outstring(" CHER UTILISATEUR CHOISISSEZ UNE DUREE PARMI :"); + call rectangle_double(100,60,550,100); + + (* fait les bares verticales *) + call move(150,62); + call draw(150,98); + call move(200,62); + call draw(200,98); + call move(250,62); + call draw(250,98); + call move(300,62); + call draw(300,98); + call move(350,62); + call draw(350,98); + call move(400,62); + call draw(400,98); + call move(450,62); + call draw(450,98); + call move(500,62); + call draw(500,98); + + (* fin bare verticales *) + (*texte*) + call color(15); + call move(105,78);call outstring("1 min"); + call move(155,78);call outstring("2 min"); + call move(205,78);call outstring("3 min"); + call move(255,78);call outstring("4 min"); + call move(305,78);call outstring("5 min"); + call move(355,78);call outstring("6 min"); + call move(405,78);call outstring("7 min"); + call move(455,78);call outstring("8 min"); + call move(505,78);call outstring("9 min"); + (*fin texte*) + + call color(14); + call move(100,150); + call outstring(" ET UN TYPE DE SIMULATION ( densite des VOYAGEURs ) :"); + call rectangle_double(100,170,550,210); + + (* bares verticales *) + call move(250,172); + call draw(250,208); + call move(400,172); + call draw(400,208); + (* fin bare verticales *) + + (*texte*) + call color(15); + call move(121,184);call outstring(" Nuit"); + call move(275,184);call outstring(" Jour"); + call move(425,184);call outstring(" Dense"); + (*fin texte*) + + (* definition de la souris *) + call showcursor; + while(haut or bas) do + call getpress(0,h,v,b,gauche,droit,centre); + if (gauche) then + if(h>100 and h<550) then + call HIDECURSOR; + if(haut) then + if(v>60 and v<100) then + if(h>100 and h<150) then duree:=10; + + call color(0); + call move(105,78); + call outstring("1 min"); + + call color(12); + call move(105,78); + call outstring("1 min"); + else + if(h>150 and h<200) then duree:=20; + + call color(0); + call move(155,78); + call outstring("2 min"); + + call color(12); + call move(155,78); + call outstring("2 min"); + + else + if(h>200 and h<250) then duree:=30; + + call color(0); + call move(205,78); + call outstring("3 min"); + + call color(12); + call move(205,78); + call outstring("3 min"); + + else + if(h>250 and h<300) then duree:=40; + + call color(0); + call move(255,78); + call outstring("4 min"); + + call color(12); + call move(255,78); + call outstring("4 min"); + + else + if(h>300 and h<350) then duree:=50; + + call color(0); + call move(305,78); + call outstring("5 min"); + + call color(12); + call move(305,78); + call outstring("5 min"); + + else + if(h>350 and h<400) then duree:=60; + + call color(0); + call move(355,78); + call outstring("6 min"); + + call color(12); + call move(355,78); + call outstring("6 min"); + + else + if(h>400 and h<450) then duree:=70; + + call color(0); + call move(405,78); + call outstring("7 min"); + + call color(12); + call move(405,78); + call outstring("7 min"); + + else + if(h>450 and h<500) then duree:=80; + + call color(0); + call move(455,78); + call outstring("8 min"); + + call color(12); + call move(455,78); + call outstring("8 min"); + + else + if (h>500 and h<550) then duree:=90; + + call color(0); + call move(505,78); + call outstring("9 min"); + + call color(12); + call move(505,78); + call outstring("9 min"); + + fi;fi;fi;fi;fi;fi;fi;fi;fi; + haut:=false; + fi; + fi; + if (bas) then + if(v>170 and v<210) then + if (h>100 and h<250) then typ:=1; + + call color(0); + call move(121,184); + call outstring(" Nuit"); + + call color(12); + call move(121,184); + call outstring(" Nuit"); + + else + if (h>250 and h<400) then typ:=2; + + call color(0); + call move(275,184); + call outstring(" Jour"); + + call color(12); + call move(275,184); + call outstring(" Jour"); + else + if (h>400 and h<550) then typ:=3; + + call color(0); + call move(425,184); + call outstring(" Dense"); + + call color(12); + call move(425,184); + call outstring(" Dense"); + fi;fi;fi; + bas:=false; + fi; + fi; + call SHOWCURSOR; + fi; + gauche:=false; + fi; + od; + call color(10); + call move(100,300); + call outstring(" La duree sera de : ");call color(15); + case duree + when 10:call outstring("1 min"); + when 20:call outstring("2 min"); + when 30:call outstring("3 min"); + when 40:call outstring("4 min"); + when 50:call outstring("5 min"); + when 60:call outstring("6 min"); + when 70:call outstring("7 min"); + when 80:call outstring("8 min"); + when 90:call outstring("9 min"); + esac; + call color(10); + call outstring(" et le type sera : ");call color(15); + case typ + when 1:call outstring("Nuit"); + when 2:call outstring("Jour"); + when 3:call outstring("Dense"); + esac; + call PAUSE; + call hidecursor; + call cls; + END; +END param; + +(* PROCEDURE D ECRITURE D UN ENTIER A L ECRAN *) +(* PARAMETRES TEMPS:REAL et COORDONNEES *) + +UNIT ecrit_chiffre : procedure(TIME:real,x,y:integer); + VAR wtime :integer; +BEGIN + call move(x,y); + call HASCII(0); + wtime:=entier(TIME); + (* temps <1000 *); + if(wtime>=100) then + call HASCII(wtime div 100+48); + wtime:=wtime mod 100; + else call HASCII(0); + fi; + call HASCII(wtime div 10 + 48); + call HASCII(wtime mod 10 + 48); +END ecrit_chiffre; + +(* PROCEDURE D EFFACEMENT DU CHIFFRE ECRIT *) + +UNIT EFFACE_chiffre : procedure(x,y:integer); +BEGIN + call color(0); + call rectangle_double(x,y-1,x+25,y+9); + call rectangle_double(x+1,y,x+24,y+8); + call rectangle_double(x+4,y+2,x+22,y+6); + call rectangle_double(x+5,y+3,x+21,y+5); +END EFFACE_chiffre; + +(* PROCEDURE DE TRACAGE DES VOIES *) + +UNIT voie:iiuwgraph procedure; +BEGIN + call color(9); + call rectangle_double(4,170,635,176); + call rectangle_double(5,171,634,175); + call move(5,171); + call color(14); + call outstring("QUAI 1"); + call color(9); + call rectangle(4,177,635,195); + call color(10); + call rectangle_double(4,220,635,226); + call rectangle_double(5,221,634,225); + call move(5,221); + call color(14); + call outstring("QUAI 2"); + call color(10); + call rectangle(4,227,635,245); + call color(11); + call rectangle_double(4,270,635,276); + call rectangle_double(5,271,634,275); + call move(5,271); + call color(14); + call outstring("QUAI 3"); + call color(11); + call rectangle(4,277,635,295); + call color(12); + call rectangle_double(4,320,635,326); + call rectangle_double(5,321,634,325); + call move(5,321); + call color(14); + call outstring("QUAI 4"); + call color(12); + call rectangle(4,327,635,345); +END voie; + +(* PROCEDURE DE TRACAGE DES CAISSES *) + +UNIT caisse : iiuwgraph procedure; +BEGIN + call color(15); + + (*caisse1*) + call rectangle_double(10,3,80,23); + + (*caisse2*) + call rectangle_double(10,26,80,43); + + (*caisse3*) + call rectangle_double(10,47,80,65); + + (*caisse4*) + call rectangle_double(10,68,80,86); + + (*texte caisse*) + call color(9); + call move(14,9); + call outstring("Caisse 1"); + call move(14,31); + call color(10); + call outstring("Caisse 2"); + call move(14,52); + call color(11); + call outstring("Caisse 3"); + call move(14,73); + call color(12); + call outstring("Caisse 4"); +END caisse; + +(* PROCEDURE D ECRITURE DES MESSAGES D ARRIVEE DES TRAIN DANS TABLEAU *) + +UNIT mes_train :procedure(num:integer); +BEGIN + case num + when 1: + call color(9); + call move(435,9); + call outstring("le train quai 1 arrive"); + when 2: + call color(10); + call move(435,31); + call outstring("le train quai 2 arrive"); + when 3: + call color(11); + call move(435,52); + call outstring("le train quai 3 arrive"); + when 4: + call color(12); + call move(435,73); + call outstring("le train quai 4 arrive"); + + esac; +END mes_train; + +UNIT mes_train_rep :procedure(num:integer); +BEGIN + case num + when 1: + call color(9); + call move(435,9); + call outstring("le train quai 1 REPART"); + when 2: + call color(10); + call move(435,31); + call outstring("le train quai 2 REPART"); + when 3: + call color(11); + call move(435,52); + call outstring("le train quai 3 REPART"); + when 4: + call color(12); + call move(435,73); + call outstring("le train quai 4 REPART"); + + esac; +END mes_train_rep; + +UNIT eff_mestrn:procedure(num:integer); +BEGIN + call color(0); + case num + when 1: + call move(435,9); + call outstring("le train quai 1 arrive"); + when 2: + call move(435,31); + call outstring("le train quai 2 arrive"); + when 3: + call move(435,52); + call outstring("le train quai 3 arrive"); + when 4: + call move(435,73); + call outstring("le train quai 4 arrive"); + + esac; +END eff_mestrn; + +UNIT eff_mestrn_rep:procedure(num:integer); +BEGIN + call color(0); + case num + when 1: + call move(435,9); + call outstring("le train quai 1 REPART"); + when 2: + call move(435,31); + call outstring("le train quai 2 REPART"); + when 3: + call move(435,52); + call outstring("le train quai 3 REPART"); + when 4: + call move(435,73); + call outstring("le train quai 4 REPART"); + + esac; +END eff_mestrn_rep; + +(* PROCEDURE DE TRACAGE DES TRAINS *) + + UNIT DESSINE_TRAIN : procedure(num,deplacement :integer); + VAR wdepl,wbdepl:integer; + BEGIN + wdepl:=deplacement+5; + wbdepl:=deplacement+100; + if wdepl >=632 then wdepl:=632; fi; + if wbdepl>=632 then wbdepl:=632; fi; + + case num + when 1: + call color(9); + call rectangle_double(wdepl,179,wbdepl,193); + when 2: + call color(10); + call rectangle_double(wdepl,229,wbdepl,243); + when 3: + call color(11); + call rectangle_double(wdepl,279,wbdepl,293); + when 4: + call color(12); + call rectangle_double(wdepl,329,wbdepl,343); + esac; + END DESSINE_TRAIN; + + +UNIT EFFACE_TRAIN : iiuwgraph procedure(num,deplacement :integer); + VAR wdepl,wbdepl :integer; +BEGIN + wdepl:=deplacement+5; + wbdepl:=deplacement+100; + if wdepl >=632 then wdepl:=632; fi; + if wbdepl>=632 then wbdepl:=632 fi; + call color(0); + case num + when 1: + call rectangle_double(wdepl,179,wbdepl,193); + when 2: + call rectangle_double(wdepl,229,wbdepl,243); + when 3: + call rectangle_double(wdepl,279,wbdepl,293); + when 4: + call rectangle_double(wdepl,329,wbdepl,343); + esac; +END EFFACE_TRAIN; + +UNIT arrive_TRAIN:procedure(num:integer); + VAR indice,temp:integer; +BEGIN + call mes_train(num); + for indice:=0 to 100 do + call DESSINE_TRAIN(num,indice); + call EFFACE_TRAIN(num,indice); + od; + call DESSINE_TRAIN(num,indice); +END arrive_TRAIN; + +UNIT REPART_TRAIN:procedure(num:integer); + VAR indice,temp:integer; +BEGIN + call eff_mestrn(num); + call mes_train_rep(num); + for indice:=100 to 636 do + call DESSINE_TRAIN(num,indice); + call EFFACE_TRAIN(num,indice); + od; + call eff_mestrn_rep(num); +END REPART_TRAIN; + +(* PROCEDURE DE TRACAGE DU TABLEAU DES ARRIVEES *) + +UNIT tableau : iiuwgraph procedure; +BEGIN + call color(15); + call rectangle(350,3,635,86); + call rectangle(410,5,633,19); + call rectangle(410,28,633,42); + call rectangle(410,49,633,63); + call rectangle(410,70,633,84); + + (*texte tableau*) + call color(9); + call move(354,9); + call outstring("Quai 1"); + call move(354,31); + call color(10); + call outstring("Quai 2"); + call move(354,52); + call color(11); + call outstring("Quai 3"); + call move(354,73); + call color(12); + call outstring("Quai 4"); + +END tableau; + +(* PROCEDURE DE TRACAGE DES VOYAGEURS *) + +UNIT VOYAGEUR:iiuwgraph procedure(x,y:integer); +BEGIN + call move(x,y); + call draw(x,y+6); + call draw(x-2,y+10); + call move(x,y+6); + call draw(x+2,y+10); + call move(x-2,y+2); + call draw(x+2,y+2); + call move(x-2,y+2); + call draw(x-4,y+4); + call move(x+2,y+2); + call draw(x+4,y+4) +END; + +UNIT affiche_VOYAGEUR:iiuwgraph procedure(x,y:integer); +BEGIN + call color(14); + call VOYAGEUR(x,y); +END affiche_VOYAGEUR; + +UNIT EFFACE_VOYAGEUR:iiuwgraph procedure(x,y:integer); +BEGIN + call color(0); + call VOYAGEUR(x,y); +END EFFACE_VOYAGEUR; + +(* PROCEDURE D AFFICHAGE DE LA GARE *) + +UNIT gar:iiuwgraph procedure; +BEGIN + call color(15); + call attend(400); + call rectangle_double(0,0,639,349); + call caisse; + call voie; + call tableau; + call composteuse; +END gar; + +(* PROCEDURE DE TRACAGE DU COMPOSTEUR *) + +UNIT composteuse : iiuwgraph procedure; +BEGIN + call color(7); + call move(3,125); + call draw(460,125); + call move(3,126); + call draw(460,126); + call rectangle(500,125,633,150); + call move(528,135); + call outstring("COMPOSTEUR"); +END composteuse; + +UNIT PRIORITYQUEUE: CLASS; +(* HEAP AS BINARY LINKED TREE WITH FATHER LINK*) + + UNIT QUEUEHEAD: CLASS; + (* HEAP ACCESING MODULE *) + VAR LAST,ROOT:NODE; + + UNIT MIN: FUNCTION: ELEM; + BEGIN + IF ROOT=/= NONE THEN RESULT:=ROOT.EL FI; + END MIN; + + UNIT INSERT: PROCEDURE(R:ELEM); + (* INSERTION INTO HEAP *) + VAR X,Z:NODE; + BEGIN + X:= R.LAB; + IF LAST=NONE THEN + ROOT:=X; + ROOT.LEFT,ROOT.RIGHT,LAST:=ROOT + ELSE + IF LAST.NS=0 THEN + LAST.NS:=1; + Z:=LAST.LEFT; + LAST.LEFT:=X; + X.UP:=LAST; + X.LEFT:=Z; + Z.RIGHT:=X; + ELSE + LAST.NS:=2; + Z:=LAST.RIGHT; + LAST.RIGHT:=X; + X.RIGHT:=Z; + X.UP:=LAST; + Z.LEFT:=X; + LAST.LEFT.RIGHT:=X; + X.LEFT:=LAST.LEFT; + LAST:=Z; + FI + FI; + CALL CORRECT(R,FALSE) + END INSERT; + + UNIT DELETE: PROCEDURE(R: ELEM); + VAR X,Y,Z:NODE; + BEGIN + X:=R.LAB; + Z:=LAST.LEFT; + IF LAST.NS =0 THEN + Y:= Z.UP; + Y.RIGHT:= LAST; + LAST.LEFT:=Y; + LAST:=Y; + ELSE + Y:= Z.LEFT; + Y.RIGHT:= LAST; + LAST.LEFT:= Y; + FI; + Z.EL.LAB:=X; + X.EL:= Z.EL; + LAST.NS:= LAST.NS-1; + R.LAB:=Z; + Z.EL:=R; + IF X.LESS(X.UP) THEN CALL CORRECT(X.EL,FALSE) + ELSE CALL CORRECT(X.EL,TRUE) FI; + END DELETE; + + UNIT CORRECT: PROCEDURE(R:ELEM,DOWN:BOOLEAN); + (* CORRECTION OF THE HEAP WITH STRUCTURE BROKEN BY R *) + VAR X,Z:NODE,T:ELEM,FIN,LOG:BOOLEAN; + BEGIN + Z:=R.LAB; + IF DOWN THEN + WHILE NOT FIN DO + IF Z.NS =0 THEN FIN:=TRUE ELSE + IF Z.NS=1 THEN X:=Z.LEFT ELSE + IF Z.LEFT.LESS(Z.RIGHT) THEN X:=Z.LEFT ELSE X:=Z.RIGHT + FI; FI; + IF Z.LESS(X) THEN FIN:=TRUE ELSE + T:=X.EL; + X.EL:=Z.EL; + Z.EL:=T; + Z.EL.LAB:=Z; + X.EL.LAB:=X + FI; FI; + Z:=X; + OD + ELSE + X:=Z.UP; + IF X=NONE THEN LOG:=TRUE ELSE LOG:=X.LESS(Z); FI; + WHILE NOT LOG DO + T:=Z.EL; + Z.EL:=X.EL; + X.EL:=T; + X.EL.LAB:=X; + Z.EL.LAB:=Z; + Z:=X; + X:=Z.UP; + IF X=NONE THEN LOG:=TRUE ELSE LOG:=X.LESS(Z); + FI; + OD + FI; + END CORRECT; + + END QUEUEHEAD; + + UNIT NODE: CLASS (EL:ELEM); + (* ELEMENT OF THE HEAP *) + VAR LEFT,RIGHT,UP: NODE, NS:INTEGER; + UNIT LESS: FUNCTION(X:NODE): BOOLEAN; + BEGIN + IF X= NONE THEN RESULT:=FALSE + ELSE RESULT:=EL.LESS(X.EL) FI; + END LESS; + END NODE; + + UNIT ELEM: CLASS(PRIOR:REAL); + (* PREFIX OF INFORMATION TO BE STORED IN NODE *) + VAR LAB: NODE; + UNIT VIRTUAL LESS: FUNCTION(X:ELEM):BOOLEAN; + BEGIN + IF X=NONE THEN RESULT:= FALSE ELSE + RESULT:= PRIOR< X.PRIOR FI; + END LESS; + BEGIN + LAB:= NEW NODE(THIS ELEM); + END ELEM; + +END PRIORITYQUEUE; + +UNIT SIMULATION: PRIORITYQUEUE CLASS; +(* THE LANGUAGE FOR SIMULATION PURPOSES *) + + VAR CURR: SIMPROCESS, (*ACTIVE PROCESS *) + PQ:QUEUEHEAD, (* THE TIME AXIS *) + MAINPR: MAINPROGRAM; + + + UNIT SIMPROCESS: COROUTINE; + (* USER PROCESS PREFIX *) + VAR EVENT, (* ACTIVATION MOMENT NOTICE *) + EVENTAUX: EVENTNOTICE, + (* THIS IS FOR AVOIDING MANY NEW CALLS AS AN RESULT OF *) + (* SUBSEQUENT PASSIVATIONS AND ACTIVATIONS *) + FINISH: BOOLEAN; + + UNIT IDLE: FUNCTION: BOOLEAN; + BEGIN + RESULT:= EVENT= NONE; + END IDLE; + + UNIT TERMINATED: FUNCTION :BOOLEAN; + BEGIN + RESULT:= FINISH; + END TERMINATED; + + UNIT EVTIME: FUNCTION: REAL; + (* TIME OF ACTIVATION *) + BEGIN + IF IDLE THEN CALL ERROR1; + FI; + RESULT:= EVENT.EVENTTIME; + END EVTIME; + + UNIT ERROR1:PROCEDURE; + BEGIN + ATTACH(MAIN); + call outstring(" AN ATTEMPT TO ACCESS AN IDLE PROCESS TIME"); + END ERROR1; + + UNIT ERROR2:PROCEDURE; + BEGIN + ATTACH(MAIN); + call outstring(" AN ATTEMPT TO ACCESS A TERMINATED PROCESS TIME"); + END ERROR2; + + BEGIN + RETURN; + INNER; + FINISH:=TRUE; + CALL PASSIVATE; + CALL ERROR2; + END SIMPROCESS; + + + UNIT EVENTNOTICE: ELEM CLASS; + (* A PROCESS ACTIVATION NOTICE TO BE PLACED ONTO THE TIME AXIS PQ *) + VAR EVENTTIME: REAL, PROC: SIMPROCESS; + + UNIT VIRTUAL LESS: FUNCTION(X: EVENTNOTICE):BOOLEAN; + (* OVERWRITE THE FORMER VERSION CONSIDERING EVENTTIME *) + BEGIN + IF X=NONE THEN RESULT:= FALSE ELSE + RESULT:= EVENTTIME< X.EVENTTIME OR + (EVENTTIME=X.EVENTTIME AND PRIOR< X.PRIOR); FI; + END LESS; + END EVENTNOTICE; + + UNIT MAINPROGRAM: SIMPROCESS CLASS; + (* IMPLEMENTING MASTER PROGRAM AS A PROCESS *) + BEGIN + DO ATTACH(MAIN) OD; + END MAINPROGRAM; + + UNIT TIME:FUNCTION:REAL; + (* CURRENT VALUE OF SIMULATION TIME *) + BEGIN + RESULT:=CURRENT.EVTIME + END TIME; + + UNIT CURRENT: FUNCTION: SIMPROCESS; + (* THE FIRST PROCESS ON THE TIME AXIS *) + BEGIN + RESULT:=CURR; + END CURRENT; + + UNIT SCHEDULE: PROCEDURE(P:SIMPROCESS,T:REAL); + BEGIN + IF T

    S!k(+$}xUTAy%U2A&3$1 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 Y2zW=pI|AMj@Q#3Y1iT~ge;k270kjAl;Q#;t literal 0 HcmV?d00001 diff --git a/bin/dos/486/logpp.exe b/bin/dos/486/logpp.exe new file mode 100644 index 0000000000000000000000000000000000000000..fcf7ce42d6dc5ab906cc099f38a3c94cee5b572f GIT binary patch literal 72704 zcmeFa3w#tswm;tU$YhcXnE?ij$Rj{dVgLgHB=Rs2XLx9EWXwd=;Gz(bMZhoRXyI(5#eQ&l|$_XwF%CEKuf zR;?hn$ZfmS%Ii1HoOW~I+Uw;)W7UP30Y}vre^mii)w4KYrkgXrKe06b`e_M)533GV zb$%qJ)(X1}!UreBCaZX&OB%jK*!*$UDS6h%hE1wqT$i{3W3x;f@AvE>l5WmVN?51gZx+1$I|c@LF>!H);b}pZA<-* z1w{u(KJdYp7q%Rhzr2`JKVggITf?3gjk|tg%KG!SucWGje`8c!MrFKdhj4I+H28Tz zO8u3fPOZV`8GN1=lzs+}@|9u2mf_zTl#K#P{MMLLFL&&^NvP{KnyZco?&DqKZ|+y; zPu_K{Q1|9df&#{z-f>5*+jwx~u2dw=6WX5qbdl6@@Zerx$qEqiFwlryHNY=QNvp% zA?q{K5=%{DLxtJw7JJMa|0XZ7G|x2)ONyKJ4HpDo(0$yamYJ1$b@Ae$Tk&je^C&ym z{Z~l0C@-`7vn>6e+5H92&YyviKf=RGA?Uu~3A)eX^A$b{KF2*fFBv>LU*?~cf>Jy{ z-0PG(#2z&;aiwkN-wmFXMy0_d?zIq*GCg52gGS9pSBpE|9QAy=VxNi==G;sEM}vs%FWw;ChSzzFk0AX6sT-C zSsq?uJaj_+#f!$RB}O&1#F$ba2&;pCU{nV`h|e-3ao~$fi;J7MHkj}u%Ppn}n}^RZ zb#K9l*YGaO zv~j0FFg2MP#`LIicUD*F59BX5*KcXt+`6UyuKC}-IH~@XEuTJn=Gl+rCb>0VxmH-8 zSemB{5Z0fck?yz7=;t@jND3&E>cb~f>ivmxUP-PG81kPvHmUyni9y@vj~nH;n@7#K zKaf~8V^qMneSXThruOzri%suABxabT;ZF}Aiisy zx;?r6*ad$_PQBz7CaBlnVv;e0?^5O(7Rz0zEMxfa#4XSdIp?~+eQ|``Wl^VY5tK}W zxYsDRC2p$`z&KO;#!ET%yHr)WRctbz`8}zFvr-~)TAWp4Ob;ZW_2EIX+sxT6J^P|j zwUl6}g@t0)mql`gS$0{rePNv560o*dzAy?x*dYf{;0vR)-nLG-RlXDLP@kXWQ(D23<9Q@;SoVEaVbEdNDp96PcM0xC^uvHVQ1@{z#!NH9K& z$?|JKJS@ojHZ=$a+@u^1Bu_uE&hjkMFE2yG;$Ns99m6ld#(!7k&$X0Ir)vfDkK39z z(}gsiNV@SRkhxO;;t_)YDSs^gJc zQtHblM6r#J!FEjywj^NFFeTuYIzs-OGbz%1tKYHHD0p(}J&drig8cc8Ja9)|XhlaH z99e4jFkWr?5qRaeCv5R3gD&cgH!iK9koGd{yCBIqn>q8fc5Yhp>z-~4q(2#A$ke!7g+fO!|nk9FSyrf5} zH2Rb;FD~XR^lep)(=8{BfdMLpnDY3g#X0rcP8zo<#_)7`I0oE$W2YGo!ziEfr;CfH z1169hfw0K883F85=3H7Fwy7AO%Ct+1X`C)$>WR~1R&9Fi8;zX_K;|So{!}886C`(r z6MTwMU5v-hL_j2|Wj#Ka*~J=}5t9@!hOfck>{jKD>8K}=pv+LIEX*TU2Ro+AJ~Mio zGy%GJ(s}B)9oHTlIq77WnWr78wFE$qOoGJIW?#`Bg8-&8Vm77UP{X2XK+Ik>~LpxUf`sY ztr1W!#9vAj-97eAB|ROgT*fOJizcvYi1KNiaz?EHYGdl;O<;*s_b9-$pihAhb|1>A zN4c29njIQ8(|~0!MsHYw)EX33n~pX}Uf5!bKtY+>hav-n+Oo zD@Wb(+&6;!(zkG$q4nhI9|;71y)@V;TrZ`L6DG*je}mUCp;KVK>@K^IbNJxMoyI#3 zj)ecpWy$6nUS!!R%w&TGqPWh~{+fZDunC(jCsVH9I!=(>XZKWLbXc~_AHI^azjoj3 zZ(rPL$du3QxgUf~`0Z31p7yL__cz;iEO<**4~}HM+B);5aFtP7(hZfJQos4*fZ>;N zTgt})3uXab;o(~v<*p(q(VY5j?$w;1FSeM@{C+-kYTE-+#ktMyE{NwYv+#i;xi92p zVg#0%Qxk);zDU_lPTBs4WQVM>nr?MqwS zXXS+#PF%BNp8OHoF?dUTj{0udIn#dn`}U>H4d~;4wVu?qYb5=8qJBBc;w__o* ze=!;{{j8?=2mfxN69R^X3+2yh6Q2i@-kNBiFg?+4$E!a$ufP%CKF8A-R&!Cac>s{rpHjNr8yDzR>6;ZE4xo-_sQ(u z#_nyn50?EtY*OKbEiqT!n(qGxIYqa2!R?k?W_pAQ(;kn|Y!=)_NcSl}PC%1Pok+-0 zHL??hx7r!mi9~k$+Zad>rwYQ2!URV9t)M>7@w_9!@t|WWt`9m=)PSvOBW#z&r~IP_ z?!6iq(&^p~|8wA`g}A6?Hs4M&wC%t2pq}uvWlY zeLH6Zb{)Yk49^C#?71-@W`HF7AW3Zmo~Jl&Exk@eR%LqL#hFJUkJk4|!Fn z9fNUV7kVU-j^$SE+-xIrvmXVMlv!PJ2U$U$!Ts;M#foI~ z!qyt7u4J%@wX)lzGXC`;n-J_OuE47`AeM)ub zVpyjb%E-eqV{mkDpRu&mGUJK$#&PMSj5=WU39Pu$%r)yc8bda@EVXJT{2ArRPV?-V zgs`b<%wKC0;8-`CZ*j{@lB;gL-=E2@H~B|4o9}n~Y7?GMs8>D86FrL;Q?I7@e9AL$ zcUUHxqdblW46*zD$@sp>4{sf%h#5aX1{)@c)E4C~wbN~e6Pd8{1|e+Pd9#3M!4dez zsmfn3qLq1CqZ(~duVS_-=Uj`shmW>^6{C%0a_G+SCeO~B@i}Gm?94H-K*iE-ac?p> z1@4SV5N4WD4_t~t243gjPInK+s97vA_uv*((CsB;A_kSbv(D&I-nfL>Vf&{-5n*JQ zsRqd2Xcu9hLw_1`^;XmDaK5VVvF) z7*Y%6&{Oklj>!!NChmbe6Qm0aIGl#Zsy(NS(*r3involA(*h#yDEk5?N8VH6J9yq z^{VhnV&U-Mk~3R|*9mV{Au4wJRCVeE0bkj$@PlVKCrH=d;)EIBLiaN6r~b&2E#PZ{ zFrs)J9O!TU9yaeNI5?8bi)LDUn9hL4L`*{ciQ(kkvz%ea?$>R6K0A;N&TFWRa7u!1 zD@hAnc@h_0eK7I-_cQ2!xjB#Wsmo8CA+zGfJS75Fv>E;kCR=Pi1$8gKf9CgDA7Og) z?E9Egz5neik$KhSp4Huf(g)X!&rctpp1)@80 zzjXELHU9MF8PpZPb&-)JCLxOisYJx`dBe`kR(!F7*I z5JHBKfk20aRCPos9p9ty$q0=JT_3t3G&YnOx-pa$8W$Rm)SE)tp^2eMp`6g<(3H?r zq)ZFthHk-i20r}X?9iN0e(1Ky^Zdx2s@@s$gzgG03VB0!hYCZ!P*Lcf(Bja&q5DGj zhl)c>LJx#~5Ly~~F!WGpS!j8vB=m4-Md*>x%Fqu(t3r>4R)^Mv)`lJnm4?=Z{GmXo zEVMqfA@q3Y3DmGLR355`)FfbWL+>m>s71Q|6ur|^=-PK`ECj#jaMaFd-mcJ_p|?VB zhu#V84($omhZ;hSp{CH@(7U1LP)lfEXn*Lv(EFhSp@X5Rf99nQhdu}$3H?Xt!_Z$s zZH(qmLPtZNhCU1ZHFPX=94RM4Cqtiyz6gC8QbO&aQ=xF^bm;G)uR>pkIzr!s&V;@V zoeljXbS~5x>I$6?T?kzab%!p6)KJE?f^df+en1Zu?1mJBLAd8@)b8M)mvN;Jtq4x= zFW=zDot{Q;FH=^`zjWMBShm!^l%%&8fyh=Gw@hA?|Dekpa*9ZOsHcb$M%g^4oKbM106)jBIOVx+A6y`rFm9B1YI2--y&rb@>O?QaJh0HR%ga6OBTkgOU8xn;@YK_rLA~$fFKkpi&_{T z>U@e#Z(866pYj|Yq$Z!zgsZyF${4reF;*g-l^7a6SXZRn_HMMDRGF}9&BJTgayyv5 z)StfUk=4u7h4e>Or1)<5U%h-;x)1>`fh?~| zFIlyGL;AXhptE6XnZ;d=RAynvk6*need$AFPSZ=)1XeE-7>}*!HgV=;^t0fv5NA%K zn?Q0)0^LxDh%?9PNp!Ol9;P^RoSsBC2Urpt7=EWZg`m_a^r(!tVGcXEZiSEsey|K> zatg)?WunuS{V?k-39N3^R3}f#M%mh7W@Oh4mpbKsM1*~}rMBv^OhKq|b(e@U3Q}+@ z_{T{7Yygv{IPe|5rp~^{R^Y!8 zz5w0F<=9+b0M3o#fh{saDzgd*j%t)<)>C!gW?qzr?ZsW~@ES&EvjsE|*<#nV_Ge#) zqEa)eUw5K4!yyFY@bTbNhR;*@Y{AETjUfCA*P(+2;U0XRz~^IpwrJO8?RpYdf*pm= z9r)aKg^$j!b{E9IPEFVc>ePe-_+D`oqNh%wK2ma^x{Y$r zMRKpvb5n7%LcqA=rPRr|G#0pUxc zL_7-Z7JPF+h_P0Wvh_WtkluR(l6?#adG#J;Dblf=jbeZ1{3KlT%yGSmL zS_1uA5{M|IU;zt#z$nDSv>R9$ek3V4?D%%%h@ZgLYyn%B=X4I(gU5IrfYK(^Fym(qo+%tiuKdv(42 z=|faGE5Qe^)X;thlBB{eWf`iI3%kTFgMV;kGIal}_UnievCHT$YIoqaCBca*=$|}{ zRW^(&+e&PjCp9*l8ewQX)FswC+kZpl;t2W#9U(RFIyph@M=q*rd{eeD+F!jK^ajGW z;u!SSiZKv1%ml&Ue)PPd|JIYZGz-aU0^Nii9ByT@@~;p#h~i3vvf(Y#-=~?K`W|X` zIc7p@O41(;l$1azKl;eJb<39tyc|=^m_x0LXzaBCzYe*kYkV?7Q;@c$80JR<}{JF}|zo%V+W? z3veKnQPD~qy*k*=z|g3Zch_i=BdSz(lFkB;ns4nu0h$gRG zVBJcCDz?@XUh6h8#1Sm8v@bGC>%S?^GTV1I)joeULJmbx>}C{lLSUBd&()8iIZ9{S z$bE8g_x`3hS7&Wt-HP!KE`8{S>5);xyc-)0jdELUfwiWfTW0#Dwjc8^Qe@_%NP)A6 za)|ZD+$OvDW8jxr4~dP~3t>aD$!(TgT_&G7*JoZgNG<4EP@60Vx@uBc-{pGDrD56C zmDy@&GPLmSoM)5zkp!TV8QOK4v=1H%LHs3@$aiX*86bVOZE{UA_KiUSGZVqpzY>7@ zC0*~Rv_RJn53e9SKL+bXTp>yQh%AJIRTZ)nn-Vucj=w(teWg3;jT7`YN&;Ls#sj+L1pHoD~j(jd}RwL(n-Cv6Q>J?z4= z$5$_X^pS_sA6@?Fn$pL4-#qXTbiRN21Kehyli286nWp4IexxQczMlj%zWrr58Z{fr z>pS^&@^zhWukRq+Y?Hh;sTD%%QT_(LOZkY-!>R`~&B+ie(Eb|YD{9Wo5xh%)7wq;b zIV2u!Y@9N^QEbf}Ml7b81!FbxF+EZ~MSHx;U+}HN$}X#1V3Vw}$J}g8Zpov55$ItK zI+rfk|2fY*8yx~wj4W_IcKUQn`ntzg`FCJ!R1lDtD@?t^*9$%9C{O5SWP-ja86EtBsW z?=*SPK9-d(4zT%fr0f|hF#=^z zhQvsg^U}9b8#py=%Flgl@|7ok67_+V+rLrOZ6^T=4U-CG6By`IJ_k^E0A}KD+(=E~ zMC{SDW0J$hi2s0Qz2H;%(MR(m z$xBg&b~8;+xd}Hb@<&0$rx1=6cjK1NbRZ90+D7SxOh|z|W&Dw#i4E!$n!9;cbl_Y0 z$5*P#<|9nMC<{6?29R=1MoY)gG-j_^nHbG51^O#x;04s1G>8Nkdu|L|VPB{ijd7J{*n%jdjNI?s*K8uWMEKq^xIfSE?|Ua#_FSXYTfP~<_x zDc-Z35+xnV8xgVjzat`fnol_ai{MlK4ZZGFuEBTMN>cET3#uAi{x&&u>oxslQ&#;R zq_EaPBi{tYwv7zc3Lj`d6iXRKDHKG|Qfx{JrP%sIR#D)$s0g*c|1#33CF0(6Bzu$x zk>0}M5TtDgayZCPr%*ZG(Z4yZsuSy(;@3Q0gb#~tYQW)D4xo@cP#P?I%@Wqh@3Trv ztWpOb%~chkp_6Cr-oa>co0HYeP-LUTl>Eh+h5$R5Qcq zPxGy`D#!m1^${9KnnyChYKGmiDL3C77){wtdUi8qH_9f-W0p;Dpa^hS9fABt2ie9! z^38yOk%;lMNhb?3NQ5q88queCbTR_{WQ%+c2nRbF6~4f1@mv_MaDS;Y;svP|rV;RexDXoC;q&{)X*o&On*)}b9&;pk&} z_LVuhPzU*Ma`azc`u~`td|+&a{aVqDv81?IWXg&mL;vMXBJ=zz<>f_rZ5HH`kw#>(S5FvDU1T!`hjW5c%Ft$Q!`L1 zk5!i=Mr^|YUfhK15d5XG@9Wt2P%P=h{tZX&2yCuO2j}Q+JnmBQM`Gc`-!=FfhQDz_ z7B*pBFN_f~gwf#6NKn-;j?TW?PYjy|k>Y=5h!*`NfZpNwrjG^Gj>R{967hEv6GAH} zvVyNy|4Tt1rhwuU2rT`L!>4!eP|sw6+H~PMaAPnyMg!uzDW4>;wJWA$VSB1S@ed68 z%+lbM!b+U7Qkrfe)nt<`EqO!lxeLmn15utZrq?kskzy;B$3oXL9VXRd{*;78uF-Yj z^zd-mByPagoqn=OU29g%BN+@+tJpHer#xh9NNod$5e64}P^y<2OK`~J2PM^q{YhTs zVdgTJBX*KDZ?ToOVp~nIYTxZrJ+ej3Rz4a>#bG6-dcw|vNnF$O63m=Q-_#WFGG66X zW>KtCqtuEbyj@s*<7F640S9*7d6j=+gxfU0Sjw+}+4p@h&%Pq&*!r)#BGeV?PshxV zSkY(8u2AOmz^jzu)PNOtBZ?D`Inpl?nCvUV#ME6P1$yjzTs!(9AyozNAA=f*PdO1Qd_ZQ&gs2`Ht#d0em-wa00i2$|f(iMTg zL_e}%@$W>(Y)U;(7v2_ZAD<;pQoZ^CuTmy2Ge9DMl6Unju5DVjx zb0`NK7^D4zMP}(5bt(=IJjW+ea-u#$yP}fJ*OB$X!pF8XGPb`&fKngZ^Dwqs+{`(| z5NACQXX@p7*r!&Sw49mj) zaH*z`CyM3R$vhnSGg(;2EH(R-lez}ab=fNENDtH5p6dvKnF<6lQDDgk_AJ%cG*%rq zJbl>j^eQJg49P&)UKh57levoL8Z{zEti?IXi;N^_d02`;j7WEc$b!1?g7Ca}s}W-3 zm$qOWhttFCLrmQ(u2OeI#&rH<##GJu^FC{i75teMo)Nx9t9dLc8;#WhstlZYPq#~; zSYt~rC#uhOVy?jS03?W->{Xs%)_}J-g@u5_6T;)dH-f|2%2J)}lB-)R@5Z3QGG>l4 zi4!Kfy1Aw7iq2W)nAr%|>(GZcY#|J`Tkju)4>F>*QRK_VQoYzkHJAbUBI71Emwnm3 z9OZ(}Z{Qlih+WOlpd~t*9Hm%8qv^#6&!gkV7S$SFW!}{+V{c8$#|ZStG7EJ^pZX&L zllMJf_QBWxE<7(@8Ag+%tJnet0q5j9EDD?F$JhYqZqmS4un+Gs5wS+?gZc|5n=xM4 z<@Uj<*@pn{A7&q@4jjsmU_7p7C58lj4#{VwZ|(o*& z_xyuBF&j6HSrM95k)s%IMRYNZZ#9+B5H)sbXno3GSp1S2Oy+V31HjlLYih2;9%k(B zX5_@MmKKlD?H|S0Z5ZzUF519tRpko>%$Z)gjWo%ClF1i16+c|DfPP ztCXq+oMeEfDx;b8=l(hCU5h+eUSPxP9He=+s6p?gi7__ouuP$RuGbUi3oF<011QnD}hjt&-H4Zh&tGtL%8q>zm4l|f`_<1jMfx#V@GEK|rx&wvFSYfU^leq4@A4jnHyn^)flZY{DdU{lh zde`*ykC`Kk02DOs&ArLvnsy%+$RP)srtM?a;8k`piDyLkS0I>`EtbQ)4}m82DIanF z3zHUvv8W|?)`joT+Nu`V$Z(b$!;`Q(Pp3{-^r?(H^Lh1QhnkO5^xe5GN5DkfXky58 zX^YNDyh>IKHCfybW9@s5seT)yM9wz@li$Yd>ld1{9ObjN^1)=&fM&4r+xQSic{tDI z2t$&c$WdOtQfbY;$u5U2&7&hR=Mp!Gh=@5OBoDKomq-%${ z3B}Vx(IOh}>(52l6iCI6sA?nP{Oy(W4W|V|WP&E6u9GdU?qsyC#npvxtZAN9_R<13 zIYjj84@>(^yp*Gb@&&OcizWmom0#;n;h}Y6&-lP#h(`;;avVpMp38BBk*?Kj8AR>I z5F_7iEi_Ms*pnStPbhC?idw69Bsz{)sRd%03)cP?VZzZ;e2YCB@EV$)dvM?{9j(A_ zUq=3UHYwGxB($#uXgJMB_#eK3u^g~)!-d^&aj;8=^J6VnAL#o=@%UQtLS7(ALm5uz z5DR-jqz4i;M7;^6CMUGF0lV09Q$;_qC%4iXT+%8PpABb;J$aPkM#{qdQo-5qwPMc? zD5Zp8en&7sd-h8cSJbgBE3)}NPKXhv4`d2vpkPO7o3)gv3dBkT-;%3 z=>LIammV+^=U&pB@8cH~IB*MF;)6zkof#sQpTz;M&f+eyuv_RX?go=fu*t4Oaxlr)@qti1 z^3x03X{^C8{q#SA?bk8b()yqcqV^%%Pca|`RW-(URb%zGZ*tTNvY}%aRcG0k~^`ZwBbj-v04hXL@tasU8 zu(HWlDoasM*iW)FY%btaKEVpMUb_dL-8RkfX(>`>G3$qYSbTz*iV5OWrGI~>wZa){ zpxdi_sv9YqnAu@6rYarKd}Qk2OT5iuqIlN>A8Q@au@)Oi^(o^|MQIovojg{>A~%Ky z_>_4XAcb1T)P+Z}31ua(5Qp(%a`h3Z`Bg&neAVnZ`M0^;+4saG@grB+8;Gys>3hJP zVDVA0X;h1=?fp4qjE+E|;nGSMu1i8VG|kv1HHd#(D;4Yz%Xg#)p1fUZt1Yxu9Z#$& z+)-PwqpBghhArUX07T(-so+&Puw5>H)xN#Q)bO=Q3fQD_2Mcjn;n@i|-E0iM!||`y z@z*p|{jI8|V0%^hcELZ00VgqFQ#i2>)in#*?Y|@Y!^=(8%Q4G=O2zW+dG_i(5yA&W z02)d*{Y@~INCn$V03`UWI}f0-+E0S zpk>L+T4iqd+T3TWc5v#R@27Dsu2m!ATGhW!E<7MMf?;i7JgmLYz8_z8)adn2*7SSG zOxWp8mPzkd&}cfZW>Q;P`|mZ`ig}1y`Y?E*$A$;lBB{* z1ZCz|$A^utX4SafM6owf?0^={ht(`kXy3w09TEI#YT$?(X!9w`7~zah9hq8s%}uZ^iR4I)B#CSqFwN8*h^ z649@b=m3@=bTo%gMpdgvqaALURF3HaT9APjn0mLsj$zRGnH1=XZAMpY^+(toymuS; z&U`HfLR0m^n9472!;fN+T(u3UF=&?eYJ)?-+x$p(=1_Y|Nhb(_8^UAIuB@b9J%e|{ z+0ZI@aaU~EMK;If4U5neX%{(&UZwIxl%@SKRnt}^>SK!P)+Z(^$^1dDGACNt{&Wc> z34}fc|6kJ?Sbl`j-E;x#%Xqs2$Si@Zg;xWpxDOyC1#U#%>}Vb>U>a!w)4CHr0Mq8n zafJ;JQ`F*`J|X97kPmZ6ee#u~432=i&cbcFp@MLHkQgCXJTA~$sa$YYZ1_kj0AJ5y zQX_<~$GAQ#RMPl(DGE)rIY1jtRn8)6N^PH|XWRF*E@Jauzn+4*{aKcB2crUt5h>j$ zg9T>JFFa%NXHzO!%shhzXt`~r1t342Hy)wLkqaC}iRUa&4b3py`}V8OP&&;3p&PkBnHRv%663TC_@2uAO)+V!jgQewcG( z@>GsPnq67th^$Y<>wy$G0u0Szgyy)eTCKRI2#T~5iu4aR5GqoEUC?#+Qp+jq^BFS| zOfz;PeGc&C_rl|k!^3BpI-UVu#jLfFIHLJbIm&e24zKdXvCH|TZ)(TL-gMdu$t2~X zxsRn9Jk63S;QcLQ&X`$hSwSKktQO#2Lg`&f*IFZ0cVmO1_zrywh&auzljlxTU!%w1 za|FDoNS>iL^2m+YYr-itd(MqS2U7&Su~jijg06C7VK%)4N`pM>Z=4oX^q50VzdBTnW4y) z6SB*ZEVy20OCsurw8j{%nJ~1nL!G3UbnjlLu>VQ}H^T2C zGD}m10c0pO=)0H~gE$!m70n?c_*ra>;;DaX*9NJMZx9P;V#5a^)8_nPcpTlVldvg; z()p5EEGJ2ITb0qD5w_m-kvC~o5_ujJkJ7^;^?I`-ba9LD=%*S*VB(mV$mm37S=nIK zW1@!U@n8htJwllm+9JGl-ay`02Iap3)`#We2O2ulYkn z_Vgi(5im5k&><~E$j1>G2UuzGFpr3>wA{)Dl)lnZc$9O9_TsQ5iK~tfoF3=up#%qc zO2!CPC0Iep@hP`6^k%6E1dNiscZiMIQtL{SeUBq(8*-Pt!7P<`%UFl}3%C%bKa(IG>^I4hLm9BZWkWP8t9b&^Y={@_NWWzp> z`~)gEE0>?83e1}p+Jq|1=%7Xfq1inETOLkEbOnnqV{e5~zQ-n>Fi6Fi{$knMj)Y`+ zv90QTgLID#>(tugi5@)0jWa?@K4OO|2#r(ei9dJY`2bGf>d)PH-j0n<(5sNzh)mIH zB-UDWO{R}8N?u@=aGVOR-~x)-)2y21BFnx9r(gC(QusHVZ8>0TYaZ;UQm zXY0s0I!u&SW-lW8gtg47w+sp(hM(F>I*rL%EJ{qrgvVyC$sbUgKVVe;K-w(hRgQ2) z$OagCkiiz(tll`FKg0m(JI)Xw=mjP9f&yt(PYe+3KdZODzAvU%kzPAzK!%~uR7;ax>I$>>@J=FRLA~xk#>BH__aB+lhUxH!bQr|_dyP!TH%Yy&_ZO^8sLd{e}#v`4+ zBz!}pYvp^*(qglGuT@%XxIJ+_Z*Ld*9+qm2P4lJ+Uq$z{&_)q)`FoieT=y# zje3mE8kZ_BaAFpKQCVA{)}*L&oCxUaT$L%h6*u~lwZWI%YwUs9Nm@^OS?4%94@-we zQzwirBn|L^losW?3%p@=0t{ty5u0IN2DB&Cq+uRJD$>ISk2B^;!f`5(gT0v~jmrT^ zcZqD$y9Pu2b{4FFuA&orGOEUbvO*`FCX1ZmqF%o}P8z|BWCYe=0AjerM-JSCNUYT& z=d&Kj*Lxs>lf(Wo9+vfZzTV@#V5{R{Z6qD}m=3X?i@-7o85`|QUeEmavQ}1hT%Tn# zqGcJbadFS$6Bz;y3ty&h#3!=*OlMreG%bcpgw=RRp^&PfH&2ZXN|K(T%MpZwnPy9s z)d;%9^h=Qu&C;!#tk`vrN${q06{|U{_n8OmRZ`jN4n`dmUVqH#qg+62i=4=e@F=Xc zk)M(#;jJayOId4 zZ|!4of8AxnbZ#Y^<&iWZTI+R6he*r!x4+(~<~xyid1-TQzIFXTuj10C zhioI4DcldGVWEuJgFta-bb{Jj@_6lfdAxp>yT`QNUS3@Qltw4eeO} zjOaivFTFIvj4N?LliJDJ-WMD)`dr_Qk=x8hT`TXk7>U%%?A97aGrWFY<#DZCb2!DT z)aehH=#ssQDb4A7l*Jj@v?s1tfjdCkf)SNH&CI#A#eGNH!x+uI_g}I8DL1n7}*xwe4|;%^X|HCnJWsxLpvK^P~O6)|!18*k>IuRlScz#+vsK z^TC^vs>-{`xul`QMvb<^gmeF=d^Qu;Vz2UApQ+Qe*->x#<(M|{+!#zG)@YuC6pRhp zMLJ|Eu-=99ZR!U!KP5EWXODV!x?dQbb@WQ%dJCHn19*d&vYxFp#b}-Q9l2WA^kO_z zgu)nYCf{z&x}BJgjVVG!|J*=#1=h|mBk4BWZq5pHV-*H*tyB8K28K5xWAxVy%bj^f zYe|gO(?-Tmv~4LEP4DYFRC4jt0?_`nmzXq4U!wy2@+x1k&`%$H;yfVTJ?(P4!Bh|7 zFAcBd7K+8LM}>uz2Cs4>8;vyW&cDMG%)cFqb{FIxi&^3Hl~@r@*7M zIT43rOh=s5ko0Mr28q}+tdAVwfpsy7pYp^=&vS_#sjXA?Ezc(|8w3AYd1js^jQ}g_ zra1AxT;D~YV-0d#nTVXnv_qrmo){zk{mN`=tRsa-en(sZPFODvvsyMa*02&+9L(`H zS)+`*HhokP3$2YrM?=_H^{s&-B3R?r_Gy~%77K*on2`i8nK*Sr*NewZi{ePRT&f~b zhyMirvBXIVghv^}5l6TmGs+`nBHCGk6ue z8GZGyu1>zAuOcnj@SmnkY@B!HGT$8+Xvt^35E|uGUSM%g?7W?(U>?+$-PWM7-oO_h z5oICc=ttpSVaARS9b$kHe#1wOYGdZbNA-&Gd>0E(>Z<5_*pt|E0XsOU5qlRWKeQy& zzzMu8+QD>aiTLC^!GEh)nXB!hfhnodH`GXHG8-3pm9_e_$NonCyr4&2r2LNItqA%mofA)^TEs@7S?nnSSAk>&v}&x zb#VCGL%fPtf0UsVZQ=!+KVdfohcEZI(HFe_h=eO2!zYg6V`WKiKJw61>|A-JafJgt zuk2!;ERSjNlwWe+mLFz^`@;S`zlmSVwCg?EwM)Bx_yErzQpv9$Yv~RxeX{o4^Ayh? zC2H^_dieK*c3q_9muc5uY1iG_^_X_m=}KP0%MaDA{vYt?XO{7+PS@S~vj(TrHA$my zf|l;nu0wj!by$1;O1mD@uCHrX0W7C~27VDj_p^9C`U-FAD$m-PX2hE}X41FdzostN zfw=`Depb9gQWnJe$uu1~wP{o(SkHPDhO%m!u(5xYwMrgDr6kYfZFJRh@dBVMk4?_Y zhVLm{4lSr=u@8;3VCNuF_dUywX61BWjpPlk-|Xygkq5D<4| zSgQ_8Qcx0mrHt>CnY~4O!J?A!9{rHKyX&fQ>{~Pggxm>rk3=wIe-H-MI#^4{~ z!!IzfiK3RBg!h-V7b3e(tU#3N=}EZtDW!msT5#Sc%Wcc-BKO8UF3X((J%mMk`<5RO zm98!lJOnPq`ehzv$YU7L*doDR zk6#I}WnT0uA0Y+r-eIej1dDb89iiUCa_~!68OqpF6e~C@EzFSinOt2aSGVLIM|$=C zEZn-fP}}6#+5qCt@F*|E)rPGINX_i>D9g1vu^|@Isx&xOdd<9?i`Og{beT}&!m+Z? zn&q>}ZW7JwGBu&>#JL)=B153#!$Wo6PV?ctD{5=Zz5(iY@yVe$l7G%*z(jb>O9179IWF$IU z`Y8lJFUJ-kZF0GzS`E6X-#4^d&r-Z}uQ0a0WcmqB)4|V1Qt_ zBcewa7X8uAFCqLxi4*H}_QhxbjeFB{?y-F)$}b-!r-;TMR>M~sf=|)z6Az{!R;2=U zvc-S2C8kX@Whu06dQTAk??rmM4vuMnjJ$MyVfE{8Ez0Ax<#9^$INf>AYl7Bq2rN<8+1B-+HVhl3 zzyUp}`Hr-nf>q-=C6Whzr$#pgupB{WO744Q1Etow1y#2s2P~QRiOA%--1pXZfSHEK zTL)nqOT;JU;be$LE2JuG4#E|s4*MH(=FRgczl%tg&pYv)Jd6w=hT90NT13pwUMmS} z!fuj6`M$|`@8a>ecPe=!#fHG381b%;*s{FD7mR5n!4O~;^^=yE0d4hLcr-<~XXY%g zHEcmFIty=R^udm0OM|6#*;>dX!acD*o8DP9fb6`5UdjY63uNNIj_?kwlk==ubM*H* z6i{%Y!LOLKrb?o|V?A=*A}PlNVVt;pTEo`hd$_V#ZEB;z4)<^sH6b zIDpX%`p>|y$}qzYW|ad-v2{_3)#S5AUus3P)4Qdz@tZa+Tp;oDTL9E3F0@i`lFN_@ zq9C4E{Wf`#*}mI|UrR97BuC^4m@rf4dpnrhNT4*>Ey+FBr`!wZ@O>OxsTV(mleNSav=swFK)CNNr4dD?78=&7 zCQacxyfB#v{bhb6y>Ec!{FhbOm{*2(qx}$|6*hFRsk~dNu*%rwwQ#JukX|96`W-la zOigmZ{jM#r)g+@%hGa@u3ri6~UCnJ-9k)MzK3Lv?!6ja_S7gx0bQED|TBX9%YO4XSzC+~v zwAkecTq`zp0H*S2^(Phm0Ow_31Vh8(7~j1T`8^0-TT5NyF_ZWt?DJ51Z)2(^@cGuP zd~;^AS9yfTJu!BO>^x{yUFGuMmf#wT%)3{a8G+SiUUJ?HwUrMs?vLF;NMIt0hhkJ0 zq_b`3IMH{E`cp1UZ#ZS8IacA(7T4P>$>kL5-x9k<*`NIy&v=1)UaTf#W&3SB8}Yp9BAtlyyYj=gpeZh-zBM>1sn34hP`J&t0eS>G0s_WE<&p*svQX zK)7)Rpg_rNkZ=;?(R%#e1`1*arCfY~VOX}Qyu*G2sJah7xG|6DfiqR^bO(~euI`QI z+_sH)1NcTuvukHon7+q%wy6d6?3}|dJI_lvu2Q&z9doF!=`VIARUV&j&aN@cuPxkJ z(|^8HP+wd4HqJk^XBE^-1xHY$L2IK}j_v&*zk^z+(GalX2!~YIftQH7j#9J4@?$tY zhXWAw5MF@Y!OoJvV5ztj=NxhiI?BgLIL^?K>1qvMhrA;~AQcF53p+MivWh$44`vk~ z05F|AC`VNc3p<7Y<;BV)@hH_VmP73f7Ryi5inI3GYP`1h#Q1O~@MdHM2E3KUz)oYf z_7+Y!2w~@2>3T{6OMxN6m^&gDv<7eMZ-7;BwVGTfRFK*l&aN{B4$ubO zz=232R8p?%fW7*DAVCpyjo~xz%IqTL5?h?K<+jE(F{Ao~Dwylcotw6P@X85A zN;W5-sJ#wAuz$_?3Cg)nH}6S%@D&u0-bc5CmLmB2uDvFVg(7(l=%K2C{Ww6{pTZaR z4r`cE{fFN$#t`NP8XjE!a%5j3>0(;sk=cG)L|5;~CuZIHrV2bhABo^ywhBd<$fpM+dwEGDj(0UkE7f~7 zNMK8gZq?|6HjR5|2tda&P$ELPznw`@)brEZ3ovb~v=)oJ8hzY(?Pum|2Vv_b-UXY|4rS#i$?m7w|6t_ok@(~cVI#d8<6&6Ey7r~?O#|DCMKO$W2VQL8AXmQ2gx~pf zb(_H)?U+`0j-~+o{gFXzLk8u;=h5^8%K=8pp;!jqmZm8ZBv7b>;2cmPbh6m!H{qSt zn+m#V>zqzPDm|m8Nh*Req2* zFdN0+!=T$JMPenc)S`DM@)ps0F?KoOq+4Hm$aU^?-pm<&HTqMgeK*X=tHOYfM_ENz zNuCrnMpn8{*%+CeNg=g{NcbqfkyNB5r;jtpJES)j3eVTqN3d*xR-1SQd!9=zC!@2znnJN<}zsiV}Mujqd0gqFjN}hyO$X| z(rVRb0WQ8n--3UZ`Wj);D3n>AshX@7yO0>PJ# zA|)~tiAn;o+^6*aztl@ig#BwZvjj=FNAFUID&q;gSOzq~dbikArIx2)|FJfZfTab42NNO^-543s z#-8?0%+voCC3RTPWeegL019!am>VH>V6YlU=mipVKo)o+XN*X%dzF8SLExlv4)ioD zSJ1nhwsTVV-Q@s(kF6R=(nAZ%gqzj z@BoP0F<9`968y9rJDt?^7P$jn<=VUPK1D;&Xe z#wLC9!HJ;x1t*?8%1=<0wAL)$gI}D8DNX314*1K%d5yH%QX+1^%L4FY@P7vNyau*^ z3Zs011IO4>OQd^J@xxR2DMYc+8BWFtpfvhP;Cl1?$G_F*16(D#=&j319;FDwJv_25 z*KIDp7QYOFC;Tq0SNSb&e9BYw2%8wUj-h#gP^*Owxx#@{kijKRoR6or*U2XP8~f~k zz)6-v4T{752P~Jq*Ko>VXr-TNbTk~pg3A7+eUeFRGDDB!_+)PR*^TdE4QzC7g|%`Z zg4}r?AN?q#m#W5gSR9?~mhRr|oGYO!#EtROyV~j`3*FL|ZkeL8)?G=cp8|u;6A!a4 z!|(A`BpT}Htv+D|af%Fm_v)l=HH)Y%C02(`MCI=A7t zgP!3PT0n5aaVvZ3peJ*~aWi|Wrzc~>abxx2jgCB)l!ujsbQIg)#Mi~J=-U5WW1@e| zxkdy3{f%>tMt{noQ&N9z*^qV!^=CgGy1!{+J-xs{Bj6M?6tDc0^<1N!*L=!+uF=G+ zJ!J&WfGzLPsYsnte|;s8-U0~&u?vb-y2q*i;1(S$Vso}^X42@r+j71m*X^jVKp}mL zKE&%9y?8lJw~XVv1zm>sq{6egUTe7_531FwtR!?eJKZ9-IAJq`&Rlmf>fA3^8O5unGCv)F)ucU$gEW?@}MlEjVU>>RN~>ScbL-@Bgv0 z`fvq?e4UC{Tfj%Du!>FHblBi)4k6v;fZ7T!-y0b}Omh_5#EX`SYw?ReE0SiCLZV+@ zg+Pl<7m!h@AgXJ}X6wl>(2A!=xrCUku1Bl_1K&C^}k#TL2O0TXq51M9Yq;Lu+NC;v%YZX4lWv?m?qviK`s zn!52@J+0FD4-|=hEigmH{CY$knkG-j>1eT;PWgUtTVHPgX-$Vzj|r`W*6XM`mkaN^r3= zXnqa^3PERD@V0CyTI{IlmXmX>{sHt$y+W?FEa6S`jEcQ+mfVlme@43kB5^12bQ-f` z?8t%gO9I2M^jWb2gB|nC|3VZOjM0Xd_S1FkB)HX|ltTq#d`T_`vm}`7P5eYHLks|K z1>nWV0DxGGHVly9jGyDRIkdUC5pj8FTZdff2%6s^>Y)DPa2l!3A(a2Nax_KsPr_fzPkOMpv-t^p+&qJ=?Mw@0}fD+AikPx^;(TH5eys37MHsUroOzveon zk3M*`3#(Pw#kJlEcTXTK}oYY&p9g8ypSjgW(oiG5OO(!}ufo0>wDfwj?V<-loFsrvuett=$O zXBv(tWH!oyH0-2^=S>=SnTl=HG@tSXEY_#R9sH%6AF&4oLYoC&#qG$-hkzs)TC3|T zk{XUV4VbJZ*5M}8b^23R$I*boxDMY9RMEdY_APYm;n!ogJ~!nzKU3Ae-a6&;KY()m z`Omkamo}Y#8;ynf2)YhnPXzYqO4S?Sf&{CVp=aDVg zye-wY;T!O%abD!EPP>D~-kloGuM;m?u?qSQ0R+u^f_Kbrm4fsTPNR(%1LfBUNznW{ z&!Gow42+U(-)$Gq-&Bzxp3kk=A-(W3v0RIWH4v7y!e^cGft0lh{*+?1XvpDwlK z17oE#(o6#)6ReTfp#6@@{*hKv2DNcc?sJ5v@?EWH42SS@u)J&d6&JK9%01?i>##rBF*pA5Rm<8tQ81cPNZ^c zOZ7i%Md$LN!a5<#pCXrW7Rd_)ryqT3he_jyZVO0Bvb-qBw!-Jw62q#5GJ({1X zHQ!$SAtqNk3##|y0dseWiBtPqcmh?_&6$ignGr0$LlTJjEf+=Uh3D~zE+#_gmZnhh zYt;4nYX$#04tt!fpFUSlfbS4YQbm@`ZjRb6oi^Y%XxR{mhySeM(-){j*!XE1#)t>GpqM&R_Q??TgC%I5=l;E|ZDM`!k;- z4)J0~ZU4avFaqV*DC4N@A2B%oNH}<1r#6n18H&y}t?=Y`V<4X;NU1H0al+70z2Clt zd_w6xyzSIKFupq0x~ji*0O;ux5WY?4C*!+fG(Tc93dLGjs~`su<-MRvRllxm&p;Io z=gsij0X^}sc-~NvvGX(dB9X2-^5S|!mHg8GN=@Xliwly zo4zEsO?rn$*d~mW-)yu$yBf99eci^gYok;|DQh1~q-(f6ruJ*`ScfJBY3|oz467BYQPP z-9Bpgtns7$JRhAM1^&2Q2MsLXO#(F7PRw9;?6lMW)84m$M^#<>pUF(Z00U=$@HAjh zP*TJu3d$fzAejV2AeizHjfhCJRD6Uv1e7F`PDXP$j-B?JTW>A5zNog`@{G*@ zMH|3J0*MAhd*%++ATf!MX8ymm_BoRQ(QEI$-~ayq-$(MDIs5GA+H0@9_TFo+y*4#P z_!aD_1f$j54An$zx{M*Xkz2^X^;`C^n_|VK=U^a0irAX!o9d(7FY=?+)PN-XdFZ#a3zXD z4kJqGxlssajzSIt%G+X4q9Bn>fDo;|8?p3tV(fA70-56)yvNwDty0_cgnJHHc zM~d*TkzCZ+Kt#=HZsMlImwzTn^$o-g5|w*U>7GsX4SK__$dADH8KW>=8^fmOatulA zZJ`MSL5v}38T8Jn6;q z$yz)I_&7rNb$1;=gRHvIL`wbchV3sSZ>@@cw>Z?Qm+)?Qg?_QcaWrMrqJ~!}DDS9^ z&PoYfHSGJwx)y`DFI3l91<%EEHnMgxoU;EHkQ5lu_^HUv4%L4yG|8hD3utaRGRlBv z;DspU%BIA(VkG7ET-}s-0G}T+g@GU~o)O{iqcG6JyWRe>{}T8aoSqrci+>|J=h5Jo z?7R<9=|5#B4F&q6?4+KoKf=y?$@w6hYzLyZn9)Kurrsz9OW*bi#E?9ox4_1UaK=e) zQiaS*TkRw>7;d}kL1zi1Vr5cFptUs2sBpe3$AW(z51vKq2{q$Op- zQyZ+-!N$3A0U`Th24G3D)4M0{QM9hlX_yhZzbuR%d0G&V!umN?VJ& zuv2~#Sc$JmtQPM8Fw6fK{J#*O1JJ-^AJyfO3)F&JOnngYIPAZ?%dI-|{=y&L|3lAO zY0lC)xUX0Ibxd8F^}wa+C5=~YY|>5laYkUKV2-$c`nX(X4 zq>zP_)_o;*Ng36S&2t*IE)lE7A3je3sgh?D^yotg58*R{sqNzcsmKh1>FLyvMZu@W z0pY<|K{UBBrZja=8Amta9)lqvOrnhpMXF+?+PWG);p5n03aNGq#OB7z!d!EgCS`lZU0^EawHwY=7X zp{;vv7P%L@_=siY0t1__!Su@4m0Ehq>zRNv?G*OL4<8Ry_J=pRIOLjj5y$JPA_(8j z8HaAkGgfRHsN`}#m5ITPe4m-+YTK53%=@kvUg($Qd4Do!D zvCd=fpyIJ;8jZsnQ{JZK7!NdHvr3PdD*KBx02&QS*hy;%EQGb_AlMs;+qvG;|Yw=(!KilXzC+`FA`a|6U}c zzmUJqaP8<%rMZ(S+em(hXWit+*$Al&&?FNKBy+8%v}!e_i;V4#hkaTrBR}wfw+j2C3Q`;@8Per-+Mki30)~|*J(DUR{SwN|B zkK&0nmEBi<20y}T-V|F))7tC!n7LPTj(SGnOmdTh_e2%Ceo^hSsQ(+De)P2lW?RFsmuM%ln1t1jBJ%j zO^Gid0#)T$(|mhl6-DEs<%%C-b=u@7kA`MrDk4{8!&BV!;@eI{h$g@u1UmO7WTOQL z*v9d1UxiN9xRH{If-~A^s!I@}q;KxsVgh%Y=-!B#FJ?`slD8&ZV*z00u<0s05ZuU> zGCMCWGJuq)VRz&5uLX<*%5q#xyYdq{fy>pZ-zT6$R&W;B!%NULf+EbQii4{nqA@v( zivADRMS!McVUjBV+f5)HLFw5m$P6G+o|bkKM-P+{l;hc3B~2(G7bA5odAeA_#aN|GOUBU8cL`pQ3ZV< zcjXZ}AI7z=>^Dtihk?JflkM$thdL|v_veAb0z|&W&Cj6JzvbZB}2TMDuTj7Nr0&N3zvso_AWL+PviZV+( zq8>)A#Us)qhq9Eh&2;7nEp2Ui`X@~w7M^=C z&!zZM=?L5jF-+scuCCGqwJVJ?5ZR@*`?eDVQfZM zqU%qiBrWhuIE8Fm%xy56>8=o%?}&WtwMDC`0An6Bkn^K-fRKa~Pf>2;7;bVh+*E(5 zbYPShzIpnw4+#b{lu&&g&-Sh`XM4lppy{9|Im$zPZitt3pmz!5y!e0{U4e7PjnDzg z4GIKNPq|Y+c9hWTlR3O)ayCOfm)YH?LEvfJLx@@IM*bc_J-q&R<>*uRY zG1`F63=^=( z*UJb?LW`RycbE-_`*A43lPF&Qq`_=A%)8@99J9Os5Hy=my3F`ocNNkm8nFF_(-LfG zZGv6*0a}`=?kXEZvoh?~wjUI1C%nK4o&i2Z{H!)1!(i~DmxWyjgj8iK!Z6m%1Sj{g zpn+v$M4bk-Q_rQ_mnptyrWT;8z;H#tpN@B)-e2ei=jkChR9;z#4Dxgze2AR5@-2nkaPO&l#j z0GdnX{m2M*NN6@eBnXMFu@YBs2_fzo>fZ)i2Uuc9U7iy3wZ*xSg_xf9Rqo=@+c|WB zk)(7o)ruQo7}tuN0-!woB>PY~LY~)4>DwNnB0WjDzUU;+rRrCedySztA-oYGX0GE< zI4(G4{#k2rnH+Koq6F15U3*L(9bO=OD(eg%lbIR=a>YKB7Dt!&;}lDbE(O|MjCSP` zigk-Vn@aQlHeBjZE{)H?b&4kxGZo9jAq_%1##h=P zN3@FoxHKgW*xgVrjscq!`BN~4>Q`gk%S3fKcm%0WIQ>V_dXn{^UKg!SxC_nL!d(B+n!t z@7UpBzUV2g0O8HkR}iwkfMa8afpIuPeBnN99xDY&T?tbF?Bja?^%jn08=H4O* z>tnT_#`F2W#x;l{#7LwAOuEIPtZdK#6nO8f#@ZxnGN6rVqzP?X(g(go%Sna`Vo?%X zT1sA^zk}E$;=@^=t&}9PY=Qo>?MRwKrhl%A)~PjUD*P|dqpu<39B_E7MRG6?p%-?> z=*3H)P>xu3IdNN}k&Yq{ua_@XK`_`MxtfeU0F`gXbpB( zEKo^>36)!5LSnoLziBn>M?p0!8I9^FpzLe)_J$5F%7Q+pK-$$VOMJ4WuPbLdoy-|9C=Q3YcFJ*XqPJgBp9gxck zhR`dBGu`KvZ;UM^BIbKEp~=N6c=}f z!YliKjdWJXrkU{6y7u~!Eu=x+o)&U_P@1SJ?`9BPk}m7JqI0S4dS)ag!h(JHcgP^f zHqH)3uDT!zBf9GhbX~iAXJ8mR?R~~dBwf_a`bdiU2z9bRad6tNGc!%Rk2% z$DDk96IeM)AaqkVCrIe57Q(gJ_3EtbuVd?cbh^RB_nN$n@_{-t)PW0}!Tbf$;>r5Y z`a!&hty0IcWWChaakr94Kp$6QW@!WuG!DZ(I9abm3X?O^z5u*_&R#Uafm@Qt8Z!>0 z9NmTDI*-HHnoj4Eq1URXAsUK??jg~!(*(iO%PXg1<&aimsm1)EF71e~EL&Pi<7m4(GrZ5PN5&= zQf+Z6{9FZ2XmQSVT28r6t?nJ1>2>w;>~NhbZo|4Px7&Q(K$x$iIwtE+T~5Z~0DdGD zy83qQ7O2;@1ZGA3`_{?pp^n^AnUFIbUNhHXAH{B21nYI!rm%E)?p#3!D)gs*Pkn-H zZh7WVdcNkx_f^?yhuR_T!R=r@+77@jsb|L)bO3Ki_s&-_MllH2a^cL6yf9$9md_%r z-h{<*2%VDb;B{+(m!GV_T7po83!*kWh3*f1KKxS7n0Uur!I+C!1cgF!K+)wbH2)%( zzfG=q9h$psk5)r)X!pzv5}Oqazi+<&fjE~&m6A#Gd>UACdUP7yHL-*EHP|6!S8?g5 zLWK_5MqbA{akT8e9B^Vc#3()EkjBu;TdvI#aQnK}$d7HpY#};J81%+9aF^W+8m2=2}B|1QsWt>eeY^9tj+P?{Iw;P{U?_l4q; zUn(9mY*L)t^oxJrkMK|NToL!Yj4}?ymGeu({R_nTJKSsVHuFd~+>SUuDqoP6Ynr{d z?>v2(I3Gwf2a7sHjF<+f{&gTCy5)o<8tf+W+s-a%m7(Xms_DZs03-y3BRKV?m^6ov zB1jNrINAw%^6s~X6@+^CTf!^(oe*BmZ(FzkZ!9M88?dPXPfnd$O&?)5epsR|de`m8 zh^oyV7aj<9gxumH)Eze?(5yJzil5+l!QuDd>3zo%xiz?hX1w9Q;)iAY;XlKLg%?5L z$6>8#o?7L_hkhAq0znX*P^HALcYi7`=c%jwlycjjn$Z@146gG1q?2}Di2`C;D?|!| zZF?|{`W%~FZF_8543p&Qz}G8XnN6#26Gx_ z<~aVm96kMGxe21VFvXCjqqc#_q|L{rD8GP^OMdL=8DM-=^^V<=bO=vyk0d=+gXb+t zdNTyJw4Irm0s#j(fMtMc_uNh9+U(j)9RK5+HUgBfwt=F!8cN1k-bwollt{_1z>X_7 z^7Yb}7!Rngf;-UVipu~_q`#HPO;DhSX{n~>2)hAQkn4r3UMU}=U81Wx=V_TRgi2Es zhDi2*06DM7!oqDC_0u>IPCyptL64fE{p}u)=uxPP(PZdw-Z#e(?ZHM{l)D=W2j7o! z=kR1;ATWAs^^0ajAow+VD^+WU=$sIIK~l^a5?cpu-jJ-`PD6%pkd@Nj<|9*n_G zGH6hlW}rb(qCmsA?t$|6zmB0{umBx61R6X&O(NbYsLis08`RTbwBh*}Fw4ujAOgm9 zBVclTiE)VUE^#|*tahZeSa?V_$lz={^=d)I9!EJl3P8rI4T>gr`TkuPw*%XsAwm;T z<%+TJGHaF|$a&A#F7LWNR_b5CwzU8?aVf0YkZ+g54yU_DZ z@&6hBfBlwn&3rCYHu;(1|D89L51n+N8T$ExKhuDLVWF)y!85%4_*5d-A7R&o;>bHw z3cR$r%wGtkrRN;%1#y^THiz+-?<;$0X`~75OkurBiy{ZX@iRRuyvKJ&QeaWhb7#Q+ zEP`AiWkL72;Qh2qJzZH}*&`PXjc#WU+pu{C^WOJ76M2kzdxph2E|I!J^itXX9&)ZY zR5CK)Ckk?fy51I2ehDI$wliuh-Y+I1Hp9aUaJx*mf4Q>NWMl-FmP)!eSKsLaI z#nY#IXu}B69SL#PQk?(1kDvzU^^wQWc}$duJ~ByutO%ayBhJ0Bin&jc9>GIzhvDvo z|95#P-FJP4{S$G&Yo7m1JSyLNd}<_vsm?=GcLh=1it^(-iD-ug)wg&lWL(%k(7N%2s<=U<=aHvg zx0e8qQ8NxNbQ53Gkcgw3`Wl7^J}sb53#lD~dxx`N_7OD6OFEi;kc0j-b_F&*i0^p0 zfI^2;xhKZgAtr9 zj>%dL%M4fympIqYPOcPpAkW4c*SI|}{2Jpui2Gp2F19HnZo!FGec7)>E6;C5qskR3 zqKI(U*&-O7&xh%cPME@m)sa?x8>Gmh)6Z{(BH0aCK+{3()5y(NG6c%{Il1&MwPfWZ z1+3&yqTeGCv@2_Ey`g^7sutM-wi_bpaS;L(VScM+vCUG@k@gXIia#p*7ZSFS3=9~y zRvo742ScU|{@0I%bu6v^6*wi%RI(%wZ^SXJ583t4k^A|6(ZOH$I}AlUGoD=^iFuRx z#mbv62%{cCZZd|10l+g`87Gyey-?Z2IdvSJhBWL13?I0gSJ+p;#7PUx_%-9vapwYI z7Pi4k8nu!ZwWMBiL(8u*u>62YN4}GM)))p93Wh*g%2JQRrX@*|bZ}+z!H8!iRA&v9 z(Ll-_YC&tpKAe6J^6K#rFGAUrPIA+cZ-}TTPm*5^$*&Et)LC}JVgalU_-Yb- zwFy!8Nv$N=RdTZE5G*z0=zF2+Sm+BSz>tT}-I0KXaD7npym>e{uD)!49wHu?Q|dOx zM&+ZCp^!_JK1qnsQFCX&T_3ACVL{(Zyt?FsrZfXZXUtj~wr&`o|GoV0<@_5prT%OA zLwWvav@E(Mk4PA3V&;7J94PU^Xa*p8@wzMZp&5I^yao3V^l2U2M)QzSsJosPb6 z_wvG}%6*<6=zqn|*NUkA42EEI3Q->xtCm0(IwX*9^&am`dskhKL)Qi|6O%2 zX@@eHC?{iE(j`1cS59nfS^$=;l&tiLhfeDA0W!F{a|62 zI{(1yXklsW>}JH1pWj>5GwN=JNocwBZ}}wI#&WBfP<;i`f=tM(6;QOFIr1VvdK#&)-|apCHGOm~pwW#MOaP;Tv7MCS zH;@FU1;9aJiNXP{)q)HYkd5Ww+Uew3ZiB_2b4nj;lnzVSDBU*EvfF}EVNAME9k6@l z0cMXz?niv?#x9sz>5^41nhpR~PsXl~!0gj<-qGx3on zZZs{3>jyKs0?Xg*=I+b^uyjPHf$1b=2&fP?r<4H!n?g9s!`*9zgsWYVYj7qC9UBG} z+Db1Ej4y&k4J)iVH1~8vVl*2ZyVvfOoiOW>0F1c4Sa&RrL#)ppW!rr7+an`w+)r27 z?|li}0e!ePb_;NG{Rxy{^x*{yF=7xjvz@f9Bz@es)74(o;~$oHEPtId_w);$OJK4N zd;sxEXsr9#&e1wg|CRz^Z$BR)w~umezVYpmOYXQW>_r~L8}hL^ZGp{sP_k5n9X>1M zB{iMmd(|m(A1r^HgJU`IyUL7ZD?dx$MX^}EDVqSkqznxuk^@eOt)|@j+rx0tO`L$_ zdD?v8!M~>HG{eYq0Nl8-CW$ZV=oei@qA?i%zXVK`G;;Mju;QUUe1O`QZ%1c*iS3q* zLqYYRyrX=-%_6xvJhKAxlFQG~0fkcCHzl2feIB12AR~|Y9GoDgCeG~ zbWc$>jG3V%$(l(1&r<pcwaJeIKBB%bZflby_iu8QIp)w_|fT*QPD8 zrJZ&yaX?eA#13UBwb&+1R)s$XI-u`=X_z)ygUAaq-}P>LrTZu^3%rIlt&K$amtnQj>He)$kX59>`4D*fVWR0yu9j!I=sS{BN42|MEW6RDtDpC^dQ#^ z)zKC@)WMM<=;s2cy%6xz?0i@0L1T0A6I8B3=@XUX@j`Z{#H5y}8M7}9H@?llN$j>v zrymzUj6o|E-uKb&>*Ag9~IxoaLS6 zG_P-`XjBSt0?f&==zrko+#!&EszNppH+Db=ip;p89m`LWb`?=ChR^~>MzjzbMZV)U zwW<@5JU4s;IFZXV>kQSpMuz4HBrgf_mJZrvbL7v{9}u*shG5$z2fX!t-*(DMf?BhF z807LzKm#)yTNtnpf=zpn6S%o zwAZ`#l=k=D*o&^EvfrFSD-vH7uQvO?a%HeZeH>^uu$gxWi+wzDl?FMYNM^cgFCO%aP4FX3X z+ZBZ!M@&j^3CUivX%#Qy*m@1Xrg|E4kHW1|HqSnI*e~kSzQ>CQoJlO!bpn0kI`IV1 zrn)DP6CGKHaV?G3Z|Dn2Rt|?`1eZI0L_H45H;`1U$~gK4QL)I*zS-qj5(>GYN%d2a?*-m>r?k+C%6coPUBT^*EBGAug51J0JOzZmD4_{Io) z1#Yr3?1w*g4X2vnFmFv~q<0{zQ?0SG58C%ezd%5O2Rwt?*k?VpB^+CWi@J#Uj9E^w;{usciwFbM|J^dg=bk*aoM~HqF>bJHc zMogKqyB(mhld)?XVI`QcPa6>F;X30PI!)^jm~5_7$|;;r&h&K*FFnre%S5nwKh|vL z`T_?mx509yJqQiciSTsB82J zhyL#%YfMCjX#;6?t~%94FdqozQ2X=r4NRP?+bPTcMp zk5WAmuqh#IL(epL19f)v`yu6D(MYf=OPjC=34D+=OjN(vJoW97MdP(~qmm0pnynGsU;DIZZX8t!1bvw zlB$06In#Qg>s zjnOdcEz>3@c>XSL!T2&SnnqXjQCv1=2~7WGeL|%bHxcxjJ`FAllC_zVDvk%jzz)GA z*jNr`;__eR4CR3Iro~T41k8I~qcyGV$6`;v1!8PPHl{4{4hzH{khYh!U>;+{ zguYdxFX~h-g>Skt)a$}-l-IRLk+FKB=)T41RH>bYGwaG#-X&pv<-TcAkc+w~hn zL^SxgN?J;;^S7;&T?MVhy>K&_y90LTOMCF-F*1Oe3dt{C{QwDJ8vss$gh&O3fK)&d z0~3=s(naxh8(xaw!U{~(tnIj17pKm#2t&7M^H>A7(n)OWt<#V-_WBsxt>fyD-B{14wm3 zY65$qrFLr4C~WjF$CY2LwUXg=kW}lm$j@N!v_At8k3QU82K*(o*Bj_lh^trw55W+w zL%qh_BtSnjc>u#m>ZT6)(q2zI40_bd0^mnL=lPn({V z?araQbIMQd0#D@ens|5HG+x!t#Hx0w^D|7gumpojG@~`#fEI_e5Z49JftC;(iTdCK zCc}LC4Mii=?bL?gN-S~sPTtZlvMe}jZGU)s*I-3FSZ!!;aLsVw)cKiS%GIX#Xq2oD zRUfj=tE{>YS<74YFhl9U1RC~yVK{%3FSy!2q6Xmjm-8+pf7GTp00~yq4M=Mok zKA7S3);MN(6oBqF(id;~fzD_W&>=R8DO_|~iT-NY+7%R1sHU-Ud}p8z89-CuIDF=( zI9c`y)^MNy?>(dR?y_%;bDs~>O$aM8!VB>(HQe^FBqe``=luM>>HGJ{s|^o@oA3Cz zcNt;imlx@VJwDEmlimJ#aqjpy7ji#}ysM4!scd@gH~h@_596EMUH<`+NBNJ(!SI~n zzBI1P#c+GKdx%bCzW+jyMQZp2=3+rFpNz7HKfniU9cyzt)c_qpBAatH@S`*P^ey5! z!>__mWH2`TJlyfb<(>FF+)ac`mUQASPMoXdF6MQW6;DMcGMVVL!COQk{SX#^!l+mv z`RPDP9_EOGO1%@yim|WkG?FOqM8z@K4SWvoY*Y@6LDAy)9}#+ZC_V**so_3wn`O&e zdd|~-^z~xSg_;Yqx0TayZd3lOZlDT_BEvgr5z0792>&VOwuN7exh>(R;SR7hGgN+k zZf7N1c7vW5vH@R`jD8rt4~rv_mqi@)gK0h`S(rq@VTfKxE$>{|iSxXK#D$%hviEF1 zB2teF`7@Cn4Oih;vApnw>`l2H;;iA7r4vk4-$N6NTm@H;&|y)Wu8^U&0+(+$+L3sL zK-!haCUT`n9aTmM&m?#n>2P#H_+kH7>b4`|sP#XOJjOLNV?86>sN4(ilI8~j^qyz3 z87VIiptvv~N03CT845PnqCZT6JjRaityJ%JiU!f8Z;F>@wn`7P!ioG100LE%wO1I9 zQ<4Hz8}X^WA5Ni-Cs9!gj8gz-%q@wAE#XfwC59$C72dYn<{5}!=$$@=Pc0XF3HI=x z5rNW}e(?Gur7>H`$XFTJoe8(lYjG_k8pRG6!vg@j(Qd+*rWoOW;D>#Sv8#bO2JJ)` z2SnH1B#=VK?-pTV%_k}_2#ieoLaidw(fD{PYzRNG4J0iP7TyG>Xi}&hB2xHQ@CYu@ zCw*x~K`#oghvz?E4Jp-wAE(k*?(Wwi9Q-y+GOq%0Xk!==w_u%>gv~Ox3=oua;@6l~OT; z(*Xu7(VZ(&_4Rz88TQkev6LM$%S(?X8-Qf%1H_{%p;F_FW zGCjA(l8O@3<4a7}hZylqum&Q3!6Mf8jFm7DB^Xnj9bl6u$jTY?hq$u7=5)Fid#X`U zo?N(UO0egE$&6)&YC%nB+G;IS1%j4qnyx=1@`%+`+dx=%v6bc0tG_+%-LbSp4P`jS z!JPo*^-DXlCfB>xDXp8P_RGg%^#%I1CxCvp)3OM&Do12~EN3U6TAx&D$uaN&g$7_T zDKAG)6xq*Odl;70za4u=VErAKh%&=md)Od0r^m#G+3diEiQo&i`_Du^-Poui@^P_= z;!>F1BpR|*5lf1YNKjDFpbItCpy0V}HPL`DZXOxV0S5?d9FN?1^EHSriN8^qk0k#- z_t?V~Q^(;j=JD%>k=-%hNpWupAM1kJlsl!;jlKO;NWp%KQ2^UrxN8K0?tQXS?Hm*4ZBpUa z=++ziP+$Y@Sa7$(c$K@QVP(tFg1Uy4&?czUo52Yyt;o$8b)P_1rrAj{K&w21`_P&L zGq(A@!e!+D24)={6|h0iJ6QCEBvpM0t4>&X()<7RL*)kn2$hd(gC$RLmaAaY>i+Ak znC+9Z_)DA$2Xo5762Av_z%er0YLl+cfdw>oy|BU}3~Ty=Ti0Qsf&#;X;}oE+*$$l=5S{Tf1dZTM!Iy`ZHM zSw|CB@05+9R#ql6?u89#qM4=!&&a04F(6CR&QkJRue-SmECM-5;bSx#fjQUn`@meL zh1T=&Ds)DfaG)~^nz`@1wib6S1~1ebXh-kcd&85EO8~=j$)p4{C*!i_{_xv4k8kM@ zb5Ji}SajO{gkR4{q7H%S$Uul<`kjkmk0nQK8S73pFCIb$_#2hUFUgt79M}PI1?(|F zkCGH0OH$X*P60e@4v~Smf_Z7;bKqtl?lTxbKQvZTJMP#PZ@QGM2fFM~jop1$%*R$NJgMO6=h6 zDzUfM*Cvg_o_%f7*c>&2>jO%!557)QOS-2lbc@~vL))_|t(c~&9SAM^I8ToVFIQyM z(Dl75`)1|1B1LTxFqHHh?BXL3tw>vuyUf9jEO5dcC&_+D?MZX@EgaoaRyYOriCF4n zS}h_a1<5n`-qtorx<&sCw}yv!RY9~G>3wepdw&4$tso|drt;+160d;14J7rw3ZKvy zVQ(xd*Nl*Vvk2N)Qge;`k_Lgh{vNy`0dqjc=3KB4J7gb>NE*>Ye(BQA(=YUZ$Xx!7 zi0RaE%+QQ!N6e7=ev8&K*H)Pz9QRg?5bUqD4bQboR>L`RY*M^lHPlLW1I&o{u(-88) zm?}=+sRPtmHh4EKM_Zmedc0v}=hL_Ct3l;1{$0etMGRcTz(ovP#K1)i{C|W2eGDYb z_efIz5=r_a-t_l9@%qMJn*W%8*_iLF!L32&pT#RlsrVpqaQxqWh_@HS<)iz&^G^9)HD`KXPPA-sbDq z)=bNio~idQ9KSkC+B@f-mAikJB~AJ1ohKF@%gTJbdd=`x2WIDee*FCt!)9gw?7i7Z ze{Jz*o9PDMpIBYJ^4}1e>Gq2hPI$0@6 zw?jYq9X$1qNmAb;^r>n|ngd0nzB7cp=V0~axH5d#-7@IQ!w{{yBw9UuSz literal 0 HcmV?d00001 diff --git a/bin/dos/486/logsesja.bat b/bin/dos/486/logsesja.bat new file mode 100644 index 0000000..94dcc2a --- /dev/null +++ b/bin/dos/486/logsesja.bat @@ -0,0 +1,5 @@ +@ECHO OFF +set TMPDIR=c:/tmp +set GO32TMP=c:/tmp +set GO32=driver emu387 c:/loglan/exe/stdvga.grn gw 640 gh 480 +rem path f:\loglan\exe\386;f:\loglan\lotek;%path% \ No newline at end of file diff --git a/bin/dos/486/readme b/bin/dos/486/readme new file mode 100644 index 0000000..51d830f --- /dev/null +++ b/bin/dos/486/readme @@ -0,0 +1,9 @@ +Make sure that the directory + + c:\tmp +exists. It is needed for the correct behaviour of programs. +Don't worry. You have nothing to do in it! + + + + diff --git a/bin/dos/drivers.grp/acumos.grn b/bin/dos/drivers.grp/acumos.grn new file mode 100644 index 0000000000000000000000000000000000000000..b042d770160095bb4db5eddc92af880dace7a974 GIT binary patch literal 547 zcmX|-v1?ON6vn@E?=`-pO}vREkfO1JLs4)@7mEs^v_%w3hNjJ+t&@Xe`|Q#NBFWS% zat3E{a4oc3@&YB$qQ#K@1Jde{MJ`1D0_%OxKJReP_dDl1-*66)6*W{)Ktuc>jXmVC z6tTcnOuN1YMXVuREjgCdiuzTwaM$rN;#Z~<$7z=p){LubE>mA-=P)H}LZb#KNR8(R z{h;g79JC(ILC@kid_-Gfpl80dbJ>ADY7_d!)s?rW@6I13v2}&{=TnkB^ZVk{SDa(y zvQjijcjzH4(h9w#!#qqegH8oO0d|Kk*<=zhc@Oqg+_5iW)oCFp!B+Ti>ECXdf)m(s z%qEj^yW_C;;*Px?tIm`RYQj$ZXQ%+us*q=Tv-8R?FmFsUH+B*ievaA9EA!{U(Po;t z`Ps8)V?BSHd3Hg)zTr%DXPR)B-blK?DmGKj_QkW`o4-7>kVp-~h~4AT@Nsm5_a9*I z^FVhYnsp`oY344-N$uYZCEnB($j^pahPvUq3wCjBtf*kprYhFfZ}oda6`acb=JN%b;m>e-hcL)s2gY3|Kn8OG1$h`=OHL4G za9}*akN|Ys1ja%|o|j16E6RB!P@oVBQtMbQ+o6^C)! kv+0n^{R?l4nRpc5Z92b!;hobPFO?r$N4p+uV0eET037IL+5i9m literal 0 HcmV?d00001 diff --git a/bin/dos/drivers.grp/aheadb.grd b/bin/dos/drivers.grp/aheadb.grd new file mode 100644 index 0000000000000000000000000000000000000000..04dc5478910767b0b7c60e1931b731d7e28008c2 GIT binary patch literal 267 zcmY#j_{PA%5WpbG(7^P7QIEljA&{Yxp`Bqe!#0L{46hh$IT*?qPhWh{edGUfK8794 z3}*#)1~BZBWH{Z;$Hvet#=-EKcLF1W2G9Uzurd2w87zI6ia0DoSc;fm^Gs;`=gm;U z+I)=d^^0znu(JYj-9Aj+AuOjCdIOE>=JN%b;m>e-hcL)s2gY3|Kn8OG1$h`=OHL4G za9}*akN|Ys1ja%|o|j16E6RB!P@oVBQtMbQ+o6^*)sG_oo4lyjqt4 literal 0 HcmV?d00001 diff --git a/bin/dos/drivers.grp/ati.grd b/bin/dos/drivers.grp/ati.grd new file mode 100644 index 0000000000000000000000000000000000000000..c1ac033fa2d149902657649c064e1846fdbadcbb GIT binary patch literal 375 zcmY#l2xnwu2w;$8XkdE4$iQI4V8@Wi(9bZJVI{*Q22n;cMq3VsGUf>rPG5Y`edGUf z0frsS3}*#)1~BZBWH{Z;$Hvet#=-DfasnfR2G9^@uu;kkEkL$0kknz==gDB{!&JmG zVS;4{OA+gY39tDkH2#ZbC}E#4q4^lw>qp%zVP^&6x_y|sLs(8Pj0PIs%@+$aHJ;)0 z4q=d04vf1_fUM#I3i2?#mY*QZ;J|nS=*kAB35-c#cPBF_Fh?+@Ffgz%Fz?%f&B8O- zEer_Sb&hevzIRSMKF=6p!-I{6ZQ*dK(OIC$AS0E SD*P87a6RC94zh03`_ll_7LD}) literal 0 HcmV?d00001 diff --git a/bin/dos/drivers.grp/ati_16md.grn b/bin/dos/drivers.grp/ati_16md.grn new file mode 100644 index 0000000000000000000000000000000000000000..6c1ce72cd3b06f811d3b83e3d87d4166fe03a687 GIT binary patch literal 979 zcmZ`%-%Aux6#nkLvp;p$Su<0RZAFb9B4mAtMFk6mUV=rlj9@EQB6<b)h<(6Du^e9shRyh+8*JZ=i`5yM35o-#ZD@mEFTP{q#Papik%v`kKzsWx7r`sYw^>p@f52h(l|HF{vJ7 zCFq7y?}hQuVT`*@WND)?;_71JsJ4e_t1x;TtOWhMwi?DohcQ~6Xd%M1A!^k9#t<|x zL$Gj%9_tmP&{&;3={}T#O0S?CbmmjO^orN`R;5d+Sf4OnCr??)SYXT*8>A_3`n}gE zrz>9mBlt^_II|orUA6apc>tqJjlYVJE=X)!Js2v8IneZ!K&40yga@K@CI>v85za{^~$u0cLrd+O>DO)LSWykzw PxmdGN^cOAZTxIPSV8c)q literal 0 HcmV?d00001 diff --git a/bin/dos/drivers.grp/atigupro.grn b/bin/dos/drivers.grp/atigupro.grn new file mode 100644 index 0000000000000000000000000000000000000000..5431c16b882e42525acf1482dbe702fd7f252ac8 GIT binary patch literal 513 zcmZ9Hze^)Q9L3*vXUwh9Y(_8Su!#XvScr;N!5^ehxZ;Ww<~%{7s32JCYGq(0RyW6y zLc~AduDDLDl3kF1;t4Tgah-6ah=@!PD@)_<>Nd_4-}m{xc@O3f6fGc&K3H0V1b!oq zX`eNGz@WPqAfE*o_I(~ea58l1`VlwlO~ajew?n*j^&-i>X##Tq2NTG_dk^~P`=Axy z2d(-(Xf3G45y}j8F@9U_?Wv2iGNG23|N7(l=l`ir?68LsVpaLr{#C_4H1Xti3QE!# zP0|-yq|-QL!ayYpyANu&^v2Q%LB@5cjbNje16A3FJp`34old`IGh|;vWdfE)*v)oB z4F?;Q3RDH$22-(j%sn2jrf0a>vl+8?Lv7QLGh9AToNaX$FLZU+RW;YsvwS;d6+AN? z+3ZN?v@N~(S6BDNmM&*Q;if6RpN};^`~N*Sgc>c?g#)cv;F_6qK&}wxCkNOoaF7{s nz&vG{%t5p(!673ur{$OWYgRLQbLHJs^rjJR*w=J?(yF}x2858< literal 0 HcmV?d00001 diff --git a/bin/dos/drivers.grp/atiultra.grn b/bin/dos/drivers.grp/atiultra.grn new file mode 100644 index 0000000000000000000000000000000000000000..41065537ff17fbf188fc595f34d70dd391798fe4 GIT binary patch literal 1208 zcmZWpU1%It6#nka?R2woHw4<0+0nkP+wvdwL}~XG5$Bj&1Gg9a%#6INj8{T0+405I za~rb2TC4d;ubR&_5RCDt%^t9m#?xBmSxA;DRzck zU|+GT>>9hxmSYg{D3&s?_Q5HX8(c&+h*${DM@_{!*7TOzDKAgeYx|kC3a7ux zMKnycPr*6ZRGglsx0F<^amDF;%)u?F4)=MgnjYjv`-#qCLGz5L802F2b^ByXsTOj6 zX{{Q^(?dMpS)B2M>Bxya=~3lmsI(Gtel58n8e4eF&=;=vZoL(p_p@aeD~(%3#Hf;+Oso~R+HU^jzdda?H^ZCO z4R+W=ytevz^qCwjgPsJ%|*Q#LFT=4k`4QL!&*V>OsMiw5z8Ewj?J< zWDouco<+n%x(g*GMGI+4t|Cef5s^96gJJTzYJ3TbS%RB*#W1Hj%28yUIKPZe>@QOXtH!S&IaN9~oHetfXq(tHJLJW#Ih6P& zlh^eu<3->_(buF);3(FQ%Dr{s}O2L-62jr}@;Md)4sf|Z?u zDp=4@5=Y-pR8(7ruKNegf4x--j-jgwD?4L)XP~bqj$TRBeu)R0Oy~bIL;$Wu#Fd^? z6K-xh@9n0}U0cF?7$_p!4kp5?t(lytJ&mz)OMvD%+3{iA(mneWI< zT>0XtJXw$5`}!^PO@Amuuy#u@w-kbmknVg4?6m~Q&4%ES@?0KbcG~=)%BluyZY>SG VNqTe=-IercoEZnF^zQxH;4jkmo`?Vd literal 0 HcmV?d00001 diff --git a/bin/dos/drivers.grp/chips.grd b/bin/dos/drivers.grp/chips.grd new file mode 100644 index 0000000000000000000000000000000000000000..7be40e745e3c3e03f9d6796e802ab4df1a1c9882 GIT binary patch literal 282 zcmY#j_{PA%5WpbG(7^P7QIEljA&{Yxp`Bqe!#0L{46hh$IT*?qPhWh{edGUfK8794 z3}*#)1~BZBWH{Z;$Hvet#=-EKcLF1W2G9Uzurd2w87zI6ia0DoSc;fm^Gs;`=gm;U z+I)=d^^0znu(JYj-9Aj+AuOjCdIOE>=JN%b;m>e-hcL)s2gY3|Kn8OG1$h`=OHL4G za9}*aPyuw?1jb6R3#%Cvm?N0>%|o|j16E6RRD+CFVBQtMbQ+o6ePY)Ow;gf}?{_gX b?q~o~Kpr2%`>ux}zUBM*`F-zQpqH$Q3Z`JOuf%bj zGN?(;FoqeSbC8(%U{a9dP=p_Fg<6uQ(Za0Y7sU+pG-2;ptOo{7?5+{Rq`ZS6i6Zr& zA|@wCLg+owGh~hn6uu>eX{E|Ist{p?<0?c&<+vq#p#3rjT97%=6`2Dq${gr+=vy~J z-?|yz=iLeSd)LDK-t}<5XG%Zo-IadUyBB=}Gt@3?`Qd=ieOgZ?2YmBw>dlh@Kbfr? z?ni8&)kdyH!B{8sbC)kY-C6x|Dvk%r&oiWW_V3Y)C3-}w^qgLiL+|M`eWyR9v5gGu zoPlly&J_HW&K|c74R%I{zZ5C{VuZRaIC=P$&PFZl7Rl+sFGk!p#zl7@{G*ZLAC6FW zT5+n(PygqLIZ%By;B#J~q?*a)w6&s*Ov5gz_TLkm^>}kz_rFbe=EFi+y`Q!kfmui_ z#|rbTt~cN5{*UG_-7ah6LzB0+^22lTzt4`4U+N6F3)XC?%sl3T1mNbZ3p{S9AoGw5 zB|w&Wz=b9d_soQgF@dt4skoS&$f>Xs_B^XC9PGbVKMb86Wi7sYy1li#rk~&K{{u^e By88eC literal 0 HcmV?d00001 diff --git a/bin/dos/drivers.grp/cl5426.grn b/bin/dos/drivers.grp/cl5426.grn new file mode 100644 index 0000000000000000000000000000000000000000..acab6b23c4b8dece242ca3337fc1dcf99144070e GIT binary patch literal 549 zcmX|+!Al!K7{%W=Gl?5D+fhS`mzYBjLZOy;X()wI6r=~qq1GU+dMFi2Pde?%z)Es* zO39&rLjM4d$u5Kir4>Sio(1V4rOH6;A5dy%H*V+hz2BSnzG1#&hSgBTEIjsuB>Ko> zHD-n}%v)cAVwT``mMn8>#(oY>+_(H3$*It(<*eNmP1nv%yHnooo<@<^m_!W_;1aKZ z6okY(L_N?5NQ K!z1U}u=fvq?UQc+ literal 0 HcmV?d00001 diff --git a/bin/dos/drivers.grp/et3000.grn b/bin/dos/drivers.grp/et3000.grn new file mode 100644 index 0000000000000000000000000000000000000000..91f9c9d941bc4c482aba50da17ca110a0df53d1e GIT binary patch literal 530 zcmX|+%}X0W7>9rF&NSJ?WF0l62qg^~rG@xGJ(OSzDHzDjTv9#7-UKg#+4hvcN^){a z$)SHj|Au0Aiv*Nb2$q6(=^+wi!1mT#;_T{n=J34FJMRbc4I?U}f>}7mZxT308nwU; zMDa}L1t@RV`q#fF)lQd+;Lbn2U7OK&CaA`##(hW)N1EKcraQ`ZrE85qyu3; t_JG4C2iZvv%#R$Kd6=BYaLA;r8nvCL{an-;M1KwZ8$U}F-3xZxzXRwHjTQg^ literal 0 HcmV?d00001 diff --git a/bin/dos/drivers.grp/et4000.grn b/bin/dos/drivers.grp/et4000.grn new file mode 100644 index 0000000000000000000000000000000000000000..bd79e26d4d03326a3c1304bdfc158a53fd72ae71 GIT binary patch literal 884 zcmZ{h%}Z2K7{;G-&hFWy%^DD(n}C&4=*nC9$r$P_jobGKkxAp#9d~I>&zKD>;tU(k@2jiREyeYa`qbuG&ofyg-(?s4!%TRpDKpBaL&f(Y^||;x zJEMI3(ecfJ_61|RX4mSiYvro=w)qEVa{Au@ literal 0 HcmV?d00001 diff --git a/bin/dos/drivers.grp/everex.grd b/bin/dos/drivers.grp/everex.grd new file mode 100644 index 0000000000000000000000000000000000000000..fdd585062bc79ea3e835c1f4e21f8382e81fbf0b GIT binary patch literal 311 zcmY#j5MX3r2w;$8XkdE4sK;Q%5Xex;(9STK;Sj?Y1|~*Z4u&$u(-$9f-}t|rk6{Nh z!&!ly0Svn&8BTZeu`zUuaWK5*oxsST0W^RaY|K7a21_5NA`Z(CmLlfYJQEuKc{7x- zHXmbq{i2&C?5sdsw+~Zy2+Qe(-aw%|o|v55mHRKR|ZZjU5FHNLB-R zn+<{1DKPJfU^pHRP2=fMxcmEE(`FHBVg9|S&+~|6+f#dzAGjBE>Qn`QOWf2pP H!n@M|Zd`7e literal 0 HcmV?d00001 diff --git a/bin/dos/drivers.grp/genoa.grd b/bin/dos/drivers.grp/genoa.grd new file mode 100644 index 0000000000000000000000000000000000000000..73863940a64bc5a8b0409fb7814e58b01aada690 GIT binary patch literal 285 zcmY#j;A3QD2w;$8XkdE4sK;Q%kk2rkVJX8#hI0(x7?>DsIT*?qPhWh{edGUfK8794 z3}*#)1~BZBWH{Z;$Hvet#=-Dfdjcba2G9UzurUb?EkJf6kd$Re0+I?0$v{$vAq7a< zFzj<>u=HUn;;;;1DPn%jGokTcCPN8p^D(y9FS=R6&I-hJ`!IEfu$*3)3ACu2FB@n> zF2m^^!XRrM7EYA&)=MCu0)9kM?&odt}bIgZmdATw(!~Qzc{eFvifq9DQ<{ra;3beyM z#(TPqGb_Bead?I#PU?%Afki+-H*gmSILv2E2m=q`_CZHEF9}rfdZ1;m2fE|+Kr54Z z8Xwu8^>$)B>Sq^jzubNG^J*BifRw)% zNO!D1*t(&QJ85dtH-2ltOv(t zQc9~Rtb;4P)tHpcFCq0K>P)vbke?T884lGsG$Um`Rt@vJtgS{k_BEt_HAf+9J{TFg zOKg714R3gN@cIC%CQ0(kN3PofK1$*`G%(+{<`OWM+*i+Ogiwt^E)EXpkf+$8k*3g0h#}^=v z1sMF3rhCT^I~{i#&dfPo(cIC6ILm4Ra{vbuSc3Z=)a~VZX25(j?8&RTMI2ppt>r3$;^jvNVE_ zQ5|Z-chs7%DtoZTp)%#G(Z6n*tb3@m&(a7v-FB!!-%$x)RpQLbYAW*2;1-zTE{{}G zQ{3##M~XYaAJdRiTz-#TZ?=|hb@kd-HP=(qd@E8cxM3=s52O~gO}%udtGCjJE~kT` z7gOxt48P2H|2;Z}8Y({s8(OKrH8XC593jje8`v#ykQuhYTvargjgGb$hYZU_Ew|cN TOLXivo|-q*IPbLT?4$MzT#ky+ literal 0 HcmV?d00001 diff --git a/bin/dos/drivers.grp/paradise.grd b/bin/dos/drivers.grp/paradise.grd new file mode 100644 index 0000000000000000000000000000000000000000..ca8bd92134b6300df192e567a4317d81cc6b0ef4 GIT binary patch literal 263 zcmY#j_`txx5WpbG(7^P7QIEljA&{Yxp`Bqe!v=;M3{MzrIT*?qPhWh{edGUfK8794 z3}*#)1~BZBWH{Z;$Hvet#=-EKcLF1W2G9Uzurd2w87zI6ia0DoSc;fm^Gs;`=gm;U z+I)=d^^0znu(JYj-9Aj+AuOjCdIOE>=JN%b;m>e-hcL)s2gY3|Kn8OG1$h`=3r`Sc za9}*a5C?SI1jcx<3-`@KH+~gX<9Eb^3~XT9^?>m-GQ0c4u5-*g_*vg~J-qM)0yl8J GKMerpr(TKx literal 0 HcmV?d00001 diff --git a/bin/dos/drivers.grp/realtek.grn b/bin/dos/drivers.grp/realtek.grn new file mode 100644 index 0000000000000000000000000000000000000000..d22a90c6c2f6595e6d1b199c92ab09f9f0d3a6fa GIT binary patch literal 577 zcmX|-Pis>_6vfY-nZ}payiPU5M(t~aYFkAu+D))xkQQ{8O|{+B?nD<|v`;r}AdOeH5^k zc!5Kh;<^SUUPCei_M^;m%p!A+c^uox+zF=ZpJclJ7}NCwq^Ck%_Br0==rdP%r#{$y z1SPp7G{(`9pO_^;L28@=2B0*~!sS6ndA>!U(}3Vh6G)lN@NuQGuq@^>|6> z1-EZK`S|q9)hr&$9~Vh>%&-0DSsJ7Bbd7G(GToz1dQ3a?f_4iqfsb|-Q4w~lb>NMk zfhl;f_tT19O;vjv(Hv~GwY&B&TcM~6TS>j~2RVBf_Ci{*6RB#KWV9q~{=bKcAgyx# za;H46!jbiSeJisc`et64KUZFFWE<~1`)#Nb-YqYv2l;x6{Jqp_PpcHrJ#8azmMnReTScozt{}qpbN6N z100@V3g$e`AP5)8=YXE(pb(xVt*ALjOVpOUdKi~HKO9(sOXNpL%X&Bnt?y)a6ig=X zh!N(I6EoQXVFG%T8ODL3>;pXI`GAPh2UHMLx*P-O^*eDUvC~N~e}4)eBEWY#`*g&p zX4X*e5brEDQRTxEpa(1ks(kRhm55jQ=KmVvvVrEreQmnRXYFQ_=8bDMV5y*T{h|#} zEU18buMLW1rheK6jTm?Is0~44osO>9(9zbd!oRD6Utcwg$B^Be){1pN@pENw)v@5@ zp+;}NIXq>Y={E~FY9tBRT_Z}M+%z-`!BxtGPH_t`IJ?_DJ+<;?^}}!&o+{t2pyG(5 z=8L!Z8Gm4iCD?hEW+Uu2%d;nJBL$*62J1Pfbb-5AZfOzIK%_$8KK32=fzM=b8r)oY zWA0=&iEm6A=}YEI)g0cX`Je8msIp4J-4qv3B+FR=ph$$JeeC={s8f dXx2I+TcqzueJu6BUVX1lo;3vHG<2`A`v>A`0h9m$ literal 0 HcmV?d00001 diff --git a/bin/dos/drivers.grp/s3864_2m.grn b/bin/dos/drivers.grp/s3864_2m.grn new file mode 100644 index 0000000000000000000000000000000000000000..0b55f277beab6f88f0157cdb123759cadd851416 GIT binary patch literal 904 zcmaJ;&r1|x7=GVxW@mrsj^FCGYKbX`1cjLvxWvX5E{GR5!XF4}Cj*Z<(;-~=mi6R_ z>>>IKD(EI1V%z~4SSdj^JahiDWlX?|#~B3S3h5ls;~XTaeZ(a>3uA6oHoblrH$6QZ*o14OM~J)qa1dHwbMGh! z=ANNaT|!PsuoJ4CFd!{34h&r%V3(%@BDy-Dgdo%57(fUR!eG-UqUg?p;7yvLQ6`rM9reQw9SKDWC)y~pnK^d9>H`uAMI*Mw7;!aiC?MiEuiI*d;yo2l^B3}^vU zf(jr1Y<9*fy!<~y%r(%Q@lcts@MWvfpn3hK1z5<*T)S!k-!i7Id`r%kb}3!5?oL`Ey8@=aqa7(D=1|yknctyr@1nEK+m&rD2i7j2@@L z9_Udj(p_CK5ge&FZs!l^UoIc@&(Cdt*!hwQ!xQP}b(C!5tnuO^8)0`?mMyYX_LOb2 z=j;`G%k~ps^sBI!g;Fm#8^snkR0WJg2%J@4aUS`|^^Sp)E$**0XVX|Z1SjotLygdE zJ2)f0;tcs{Pq5MnI`O}_?DBCtIVo$gwYb<&8k%ZM%Es^8<@IpkUC8;?W^0d=8Cj2u zoZC!B*8<5|wjL_H4>{ip^$-OYscL-dV5~ajz4w`l&S=EPL#qf|GOFYCKEPVd#)@pO9k7J;F&t*@fm5jh}!-{t2nA3d%e P*GMxbV48*&>qmb8;IasG literal 0 HcmV?d00001 diff --git a/bin/dos/drivers.grp/sparadis.grn b/bin/dos/drivers.grp/sparadis.grn new file mode 100644 index 0000000000000000000000000000000000000000..75561f635a8a73bb620c51c45700c2a5798aeb5d GIT binary patch literal 549 zcmX|+K}%af6ot>78RLtZ=hTLjfW+8#(S@|7u0koKRH@5sqFHF-%0f4V_}Z1BDRJc# z$- z7Z}AOu4_=_H6$~~eu{aY`4Zbvzs#Iw|C%|+oQ>u{%ZN{rdR$NOj*u?1%DeRK&MD+& zMQBt21*x%yFb}%R{WgKBQ4Um#a-h{H2U?GxXYLdFxs~P5N4vjYB=JF>Jt5gO=T~3; z;R2(Sr3W-muc%BldPg7WAOn+g(J8^t!fv&1y>SyT83*=lT(Rr1>TJWGgDtfWHg0B% zEOVNM#4q>0Rf9U|C z)lkCA2Ot*OyB7eT8Vcm40?1G`JsDtfJf~n%rYx$pnZD`yM{<91WVrM9cyM#SCWrlN DUc8dL literal 0 HcmV?d00001 diff --git a/bin/dos/drivers.grp/ss24x.grn b/bin/dos/drivers.grp/ss24x.grn new file mode 100644 index 0000000000000000000000000000000000000000..20abb0a31434e6a9260afa502fd2e98bf354d827 GIT binary patch literal 1041 zcmZvZJxo(!6o$|D(^85px0N)a2x>@dqA-+2BAQA74GcDFE2tDA#{UVfE<&t=47~=w z!8qw=;^F`?F>ssIB2)JsKGseZXb0fH6zBx7B#^g}z!kUx zvLBG0$Tdlep9q4qUMEYEMG-1>*z6Ca3uHeam&|@Zy7T$S<$ONUQ&o@7>luG4{s=OT{dcs}#_ z@p{n<%hq&U5ThC^w!7X{fj{qhKJvs1&nD9G1PP71A*F<4z*nMBn6SKU!mW-ABjG4c z*sR3~HRgn$BnI2pl0^XjvzN++s;RUe{P!{9L7M)P&6k-b<_$ze*LW8)>xoStOk zu8rJm<@wO#xsmV3is7zBh?O?N6586v%eV9s{X$piFKT5T=4C$C$j-312ee8jOawqL z2cutXYRzc{&0_=OW+7vA7ov$F(0yP8M0_}3>nHjQ82*CRoOZ0;0Y+^hgI}oN1+D`# z%C@vc2X1hw>k{=%TrC%(cefCce(Q$n##1zLZT;v}pF@bj4>sc)9_XGB_09ZF1)2uX zREE;gTa3R!+Gj`GN1L%Yn6u$s?HSo3I_=AxGH>v-mKaAwN{Im-9N<*-3W47WLq**y wLwGR2fv7GSGZ{xzykHDU<(V~y7Np^>s@XBVkXcxY{(fU0EymO5w5ivZ-*?Lh-ln^If)HZ@48pFhJfE>O}@XS2_x z{z#oweTXRFaRd1pjB1Hci?6O6Kb^cR1hKDwOp{*W&DQxNUhpZqLo`g2G*4+-p-sAp zfyXUeXHXu3I4E|QTLJKx39;i(#D?$G-2_CYc$5CiCaL@Yk@T5cA(`!knDQrL+;`Wm zR&J1p{$oS&Y{gzQoJcn69t2vB#TO0!GgsXW7Vb>()>Cn|?3A$=b#rQIhqGPwvbJj$ z?oIJt_%eAa5PEgk(QV>&sr}y5Lx`DToq5m-IYV>CJdiZZ8T5dB&Hy=K54v)$qkHJ< Qkw3`8d|6vtAFb7X0gM@sga7~l literal 0 HcmV?d00001 diff --git a/bin/dos/drivers.grp/stealth.grn b/bin/dos/drivers.grp/stealth.grn new file mode 100644 index 0000000000000000000000000000000000000000..69aa0b740b77334db2c11f6a8dc6f0c93e7d7292 GIT binary patch literal 617 zcmZ9JPiPZC6vn?dv)yhI6Q?yqiV!PE@E|J5DM%nf1D=|Q^v}gsPm0H8*HZ%L#?xz=c`PBQM3Z4?NGzXYhibttQLODF@1vKy-LvC2TiYs z#g*ml4?ACKDLmmnt`iUB@5yeB?$85jQ-_|>3wlL;dPkpVuK-!hq2Iz_4r;S^!ZK$< z7A&a8Nuus2F4|j$YW4OOk9+GhIDo1rEOTkydj{%SlBmmx>$_}lNGgAdjfg8jb-}P_ zHuCPKIk9tc!I1xMj@l{jjitV30{daLVK{lW6BVo3jj8GqYg^u1OMUl#S+ZfKk8JUD zzkGB%zVGvwP&az|;laF)!R+}VNE>0F9|GNu0kX40@W{C~AL49A|BTGaCAPMHF%16$ D_h7L< literal 0 HcmV?d00001 diff --git a/bin/dos/drivers.grp/tr8900.grn b/bin/dos/drivers.grp/tr8900.grn new file mode 100644 index 0000000000000000000000000000000000000000..17c826acfbd7fc797160d7ace40ae43a06787dca GIT binary patch literal 578 zcmX|+&ubGw6vw}BW?Z*TvmG@=dWjJ{2n7{Ag;ogCg6JjwNDXLH@lx>6L%Zswft3`5 zj7Sdt3H||lG`mm&77YZ02hUQWA~Mo=@N9g$cAY(Z-sipV>|;KoC>p3?4uRMwjZY|I zBXxn}IM00zN?k)TOYAlN=9#yci_F{DNpp9Y$^0%enb(=gd>}Tngcz`e$RYM7?$p>yd1sya&-z%<&TRb z`{vi=jl~4Bbe866fo{?&t`SNfGD<)7Fr1l!KU_so(q ze-_?tO|{><_FJy+uUD4UlS0r+hL!y0u}WQRx$O_G{oWqCX4#oO@O5YJ^1=1=y{|{G zm%1Ny4AE{W;g@3&7ur7^1J7FuVY(FnLoK&9yT_Gl)hqbPlimyfLFX a`=K+A_GFl2?|cn@i_l{ohc1T>hkpUijh)E= literal 0 HcmV?d00001 diff --git a/bin/dos/drivers.grp/vesa111.vdr b/bin/dos/drivers.grp/vesa111.vdr new file mode 100644 index 0000000000000000000000000000000000000000..91e51ed4b0887f548cf45fd115a13bc6f1b0a9f2 GIT binary patch literal 3046 zcmeHJO>7(25uRNxmp@M;SCV5>aU;94*LiO# zL`Hjb4+TnqGjC_+n|W{E%34sB|6;^~V^_88F(^G|<}OAGrKFkrOJuw>Xy&ZQ^QC?> z_t(hb5~*E^)W0Bza^;WD|jr$hW5b;lr8!)`q`#1G<+d^>65^B zS1@Mf+i>AHEh_YgI>O=;tEX5#PuEG)P+N)yr4dJ6B#b%gbwNk*sE)c1sr4S5`=~BM z+FtvO64FJ2M|f+t<)GPPXpNwxuzr}^ zaqDQ;nrCJaF>a2B+~%ttbwBv&LpKSrJp}SFKWh9ijJZJz$^IF=t#sy|0pw5W-dqMl zX!WO|@lww@brh<2sn)!o`$`V)rdt&foGku>7m>J7M|~3SX!VVIRlQB@(o^%zklQ=` zstW7Vzff7cvJkEufK%Vi{~`RJ#B09?4meDU?Z(O2IenvA^k|;f2i}7lqIxIe7=4YR zSJ6FrH$6z5EMukB3X!o|v0x#TC>hw1(KHUN7^iX9=#Ul9| zm{=q?$t_FvJIL71GrQB*TBax=vT#+SdN_Uas#a3~J4)nE-fV^sR(nR`kj3kk-TpWF z`&e0JWo5O>Dh+k*kH7<;QK$dO;&}K0m>LwmmFZ8x#Gv#mF#wD{_x0ILg$dNTs&OB` z-N@%Lk(e{%i0C|phZ#Q8mj%<5lYGE7YAPQIuA>w7TQv%Y`8e04qd}4X=K1 zkFF2Xg`z(eVuj;X{cg3`tR8Jw3*L`*RKGi70v@39`rR}5kPX18aYw(i7;^NchR%%M zEVkxDC^v@JDBy6IK;jL8duFz#BC=fzBlX;0&7$rs*Bt=&75A6uq#UkH-Hp7h)?#SU zMDIUSAgf>idgJr2Q|wO{gLd%a;GN)7@S7ll58>$XJ_L7nEh_x>2)_x`Bm<~9A-g@? zO2zdB#RXcvlVIo$sU?lGUG~Fp)Gf>U*lO8HwGzc+mjm2%NgC9409{J z`F50cx~=mr_D?BBTclYEJNgD=Yc=fXr?Kf4)Mr3hP&0fSi~*c)VaiGltXR z0?cJ$?f~ZpVJ^q{VVFC_`OjhQS#)uO0M*;|+l1;~eT867qNVM%y?~o42T)u~;nKt9 z3bAgG32O!ax5)%6cM7Xx_bQDjPEOvFTY7#?VpPH04;W)4FbsoHI_2jeV}+6peb z`j@1(M2Pw&nTk2;EgXH0y37Y)P;AKu1rg*1`1ba~resA(ym|^7V}l-T(}FjQHFyQP z>3h1Rc6|G1N%Plox=9#PmKj?jQwl|z$zfcDBF&5~laiXr-6F>JDz2-zvTorSm&wHH zZaklY-me^a?nLsb)V_4GF#i1E%@?+KpUV(}$MLpGc-WE8#Ja zFC&$tWZ;AhQb59wkN`+Q34*wiLXyCly=YgIz1&1RD{>86HAQPK*fc#x_ILPH5eX`uAdfb`>H>#2grcGrsyY)DR> zQiAv=i07WlHo+1}&_IZYcn}0Bk|MGtDS8#-?52C^!I{JF>%Do*%yW9f){w_Ivebfx zIf`S`)eL^z6ut&>wFXJxb)h9WkEDZ2+06q~cKv{_j9bDF3hm?pKQ7kr>@ZB`%!mkF zCrvPuod_Jmq_oB~FmmcZS6m-N%<(}IgDi%Vk9p@QG(o_r*iEr{PBFWrkMb`TTk2?; zCFnj&LPtw|wZ@_yt?|Ets8b;N_#>sG)dmC6ZKymUqu2&r4nl758`)ADja8+12I7DA zKJM2o3&M^&I=L$DGxLsy(6$^Jjb5$*pbPqCuGMiY1z@KdU{^gqgyd^M;Yi5J}>jX zbB*ml>78nyhU)s0bWS#6X2A*5;VoZ!nQg13_p1G))K|qv1iQMn+e~&B-21*fgng$X z9v-YzkeNPN0|}z(S8G7AAcOR94U)r5U8-R;Bz}g6`7&GIm}u{|tl5R?XQ_X1xA)*| VgnEky_XL?b55DbLvsmo6{{bH9*_i+U literal 0 HcmV?d00001 diff --git a/bin/dos/drivers.grp/video7.grd b/bin/dos/drivers.grp/video7.grd new file mode 100644 index 0000000000000000000000000000000000000000..ac2ddc9d745b1203b3deb181f5cb5ccec5c44dd3 GIT binary patch literal 331 zcmY#j;9_K82w;$8XkdE4sK;Q%5Xex;(9STKVGqMQhCd9p91LZQr!PL}zVUxKAHxo2 zhO+`Y0~mHmGMw(_V`JzR<6wBrJAsiw184v<*qD8;43<7jMI4qPEJe((c_uXe^JXYv zZ9c~K`b9TO*ja(NZXc%Z5SG&my@5t`^Z5eJ@Mk!^Ll|VR1LLj}AcMJpf;w`v=bRkp%FPWO!+toaB_ft<~mK#LTZ zcSSIrM&+sUGjzS!b%c2b+pG6oPaB>vZut4W>!=D(*MkdhF1+D-u;JS~r#D_IA3!Xi Zf{iSfo-{mB*mUO2rb8ghMdDm5Lsp^Q^!s6K`g%CfgsY@Sh^u}$2-B~Kr^I8lL!m*q zg(g*MrwI#?;Zp>tF?34xX8N>n_ASbMQYyTp8R&a?`N5uX|>9Jf*)1y--XG$>`SXoVZ*+#>eR4gCkWU*J4V27 z+q#P&c`Mhip8y88hw06YqgTi83t@P~KVL`Q7vIOv+UVgsJj0(DW+`@s-DD+JVZ9`X zv;plhbW$J>TT?C!9Yit&a&M-{2eV3fvmnc@-tJ_!h@DfA#Tgeygl6YJUYjX$WmdH_ zyi;W|@s~SVr^%(Jc&?vc)2#S@!a3B(mLb+O@%z@`Al!H!k{_de>tVj6*$Jnnn)%p% zAYWkzp~j1l{M0xLQBIMOWj;R1j_&&Z`=kf*MvEc=MlmoeLz(z_oToe{S;Qy{RXG;# Y!n{gF#6*Q{Z7&U1mgX`YkAEBf0gF1(_W%F@ literal 0 HcmV?d00001 diff --git a/bin/dos/drivers.grp/wd90c3x.grn b/bin/dos/drivers.grp/wd90c3x.grn new file mode 100644 index 0000000000000000000000000000000000000000..d1436e85bc1a7ae0f814385a1e423abc3e1957f9 GIT binary patch literal 624 zcmX|-O=}ZT6o%h3a})Dn(wkTVks7PGs39EV7Y{#H9-{o*6UF;y&+t<~{dZ&Tp(*cTqwX4Qoge zKafGq_ZE&}f$I|FdkLF)j{SA!Mdl-Bp7{{Fey+@%V}FC`{lCS$#5~LNavOx{SEK{> z37+XO$*l5hIekMK^LE9Or~m@C#62JcA#opGALs<uGX5Unx> za`8(mof^oVduX@f$+7#G`Y5jeL?5_Gbd2^C3P=QvcOb=+A zp3zHsP48$w1C>jnU4om1+0j$4l3}P!1mUvH7z1DImqRWioC z$6+o96>~mN?Rnd+SZ4OWN63XR!t;yW!jf>ZT5q1xy0H_UIBBibl2CuH_O=pQH$O$p z*Lc@?qIF?eY|nA1&Y@YhiOndVWos+OvCk3ntvQaU<#24|U9tBeKf3Af;MEb#6+Mt0 zSk1byoCU2rAePcO?MXbX3y_oYwC(AJ!yD{iCY}>e301bLYiIi1k?0P^-mmwuw^3gG ISoOyJzt8uwfdBvi literal 0 HcmV?d00001 diff --git a/bin/dos/drivers.grp/wdvanila.grn b/bin/dos/drivers.grp/wdvanila.grn new file mode 100644 index 0000000000000000000000000000000000000000..1543513ba53d17a68b166336be45fcb1d929bbd3 GIT binary patch literal 609 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 literal 0 HcmV?d00001 diff --git a/bin/dos/286/old/gen.exe b/bin/dos/286/old/gen.exe new file mode 100644 index 0000000000000000000000000000000000000000..e87fcfe445b4ed4a7ba8b85930e22205ce5604af GIT binary patch literal 31402 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 literal 0 HcmV?d00001 diff --git a/bin/dos/286/old/hgen.exe b/bin/dos/286/old/hgen.exe new file mode 100644 index 0000000000000000000000000000000000000000..12e1301689116d11b836cd13d0e4949d2595f747 GIT binary patch literal 32672 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 ZG)YbB!)*RgKcLQU%fCIaw?_3R{C^7wUhDt> literal 0 HcmV?d00001 diff --git a/bin/dos/286/old/hint.exe b/bin/dos/286/old/hint.exe new file mode 100644 index 0000000000000000000000000000000000000000..eba8cf7ae2b6152e7cfbed964f081064b2530552 GIT binary patch literal 150689 zcmeFa4SZD9nLmE#HA51HkU&JBK#@)<2&FV25dxIb8`fGHQ72uiqqWq(+rMR5%#7BJ zi8yZX=0Y}gUBy|;inv|Zx-NCC9jS|fMq;gT1+5!dmS!nsGY%g%MGO(c+~4;(=iIq3 z$z&!kTHM`IVeY->Jm;L}Jm+~k&w0+*uG=Yn)*(qVq(Ad%TJUrCNRm_}ef^SY_!qDL z?|=WpF>tMVGJ3K&7Lt+^Yo7 z6}*AU>&%q_yJc=mVAqsWx7!!JdLcwT1Pb3aKdK znR_TM6)AGJ5LW{ls~&^WdS>FT=fjU@q^fGK}|yLg~$8 z0T)Jyk?&@mE(D}D`Lra(34khhtHIL&hZk_h1J38t^K# zXmH*HDSBAS&}`FwwIiVB1=MP%!1#Q^_=2*G(29lxZ7o5o$_%Y=NYEyD0Ik%Mv2VU1 zLA!$bc4g+ixrYSJM}5op#2+xIP$$go#;g8>`KXDs=C&yEY0N(#V08JFWzyZQ#G{fL z>HdlH%@dms)Re`SW92xcs@Qfvn{`F*Q-UeBKAtl{Qsq81nBr5axC6>HPEIUTl|Zc1 zB7Hi+RXC)YvGF6O+R+20Hw`!R~N?z0)pkHF;5r4R1 z8F<7pwa%+XwkN*mXpXH0_esogs0S)mNHxE&_!Ft7sN#E4*p+xjs@NpelqCEP&Q039 zPe7g}G^tr{4}if)9z@r49=1)6l~%=Hqs}s3p)J0&ETAo(Qx@CEcwiw-jEA)ut&2&u z(>B+|H0kb(R5>OPu++O|S$INVDR2PTZ?0WWGUgxi;^!=vVUAZSsR?`&4di zKP1(b)_bFM4@x!uXx&3AYbT1QvGLQUHrdEk`9U@KP+%9>x&pQyZ$berk`Gp09m|&j z6Qiy9YWGU8uRSRxvRzd1f}Hk9wS24`f$Fq9(!t*z{B3K*7f>N0s+{U8>N`rPSqVO{ zE%InF_rB(b6h^*I#}BY6;y) zM9FB<4VoMpU*_w}T1ik}kP!O~!9Swl(2hV9ELv&}^#vO9<{THrW|cL`sX$|;V|#^9 zintPAaJgFkYQFaOv+@OP=rST;f{|5T^k>{|VnAL`;-GU>;kvvc;{0G=f8xylB^cDt&T|DM`Fk5Aqm^8-t>ZXQ zhWVSFU9~Yy)WFDR9lS54chH}AOWxkRQr`*R&O3p>nF=v8+Zz{Xty8%`}!etPxJrZ`WgN8vo`-n`KkP1L7?!i!tI5vh5Gt& ziS<(^*3Xkgqq=@3(fXO};nH?AAsZ6tuWh_*WGmj~)g{ofPoxAQgio8?e+7-^3>eZO z@%~^^W^f55WY9lf=rZWuvRvX~^bm-xGs_wn_qf@CMtK7G|eRrabupMljuWiHn}N%%$U zon#6Am1M84%VL{1fjd5^Cb#WdL%mRWPKzh?og6#B*mn7+!qCsd&YDs{fmNhbIs-}` z!REg>Vz|xcv-fWZFc1tOpj10CjP#J0>B`43v)@Ez=!;3W zamn72pl~_aM=~fHOfdM2S7=(;15>tUREEjN~@WK-zo9C5Wn9Kf0N#auch~} zr&^q>7&JX6Z{6b}<(d1Xk`tS?2)t9>S|}eD5sZ5$8TYE(s|L@N2T#MMzsFg7q+ITX zO&@V452>L(vc5PQSGUx_i}i4%jC;jeLuUeN<-&OmsUlCh<4?FX6LK|^_aa3jkWVS{ z$>gRsxz8oF$tekco$S@x4?my?HV8DO7Of~S(p@ZBjTUukCl>a{=6 zk}cLZ=d|QA%_p6G&SKY<__GjyE_ZRS2OlyVbYF&p&LM4D2KUK9I8Uy`c*!erwgY%M zd)Og&j}M*})~5Rrm)u(tJh!e&VCa-{b84-0d#8OSbEN~9e6l16JdgvDBP<_IwnCjq z$XS@2FzB4r=hgm(Cgd=$?niZa83`V+Uo85INq}>Yk2pP>;1thF^*&U--IaI}qb47s zu}T#Agc9uHrOj`TDZ%6X?OeHgO7Jv?EwH7?N0nfw1$C-?LJfB1ijXvBH=J-sLtW_A zF*SI+JlIv6SO3#;`NZwJO}?Yax}DxSZH5QKt-;_Uyrm}ZOiy5L<;K92>P@_dyN*v+ zN>5CO(^a@d1~e7Z%bb%P2fXDzxE3C600PO2W*{S%LG_iGYs|~$dmOm^d#L?;(LT-V z*3i2zM@}ZMZ057TUE+MrW$l{U-E>%WtJgR=s5bWxwYJqxO#`R``CRxPn?moJ2VPkV zjMnk8{5|0ng#+c4w}!_A%B#N%qwx*y{tGaitChE+&Uek!!}}(>{Z;N5*LzJAK9pXQ zzunYp=6I)Gb6gmZJV10VJ^?;95Egi2l?FP)ziYI#6px-14s$_aY;1bpi5L=FCCmfy z3sc)!{Sna>KMd!QxYlYW#(mPBaSqUZBn5A)zv~G&qaYxyAhT1NL+%?NOc|5MAz+3! z)%wA=uY)hPawFLGRhr>@wT|sh%-dbb4fdw93#GO^O$)SDIyH#qp>~@uDLAI@PkY~H z3g??Z`EBUd2AzQs%KMXJABGvhAiw3P1x;4gz9y!(HY(*fT4cijX9ie!v$h%|H`*Q?HGj!lyDNqiP7XEW%ors1N5_bx|4Yy@JyKMO?Tka=Vjgq<# z+ngjINWg7r!pkjN`!z5KS?GOZ>UjKJon_KKs=w>c&M=lq8?KxUI^^E*!E^nGUcCuQ z&%;tZafyx4dZ-IS=UAkH+UsSX74UqZ{S33xH2iwEkK>p37<^fHEeLOXw4CX|e%c5d zWRpoI1#Byiu}HI2n&;&D9;pkK`4x=v?+iv68-!8P;u{L1#8|XoT_!Fu${*WB7kG*r};?$2i9ostvIY zh!j`i0dUnW!5;ZqCK^%J9#%p}a^xz9)!-4qRroqK>Sdktv@*wQa#tRQZ>k;3F#d$PoG+P^TMaUF+YHSy##I5`9L+ zUJrlV1^<|W9UA+R&M&<7SqCj~xUBI|yPp!Vt8SSVtwU zDdY5K3^c2@9Z0J#TI|5Mqj}omW7D<8oq}m+2J&U)tHDBJQnId^fO?sF)Sy3;TY-!P zJGfk^EWad(co}YEcSG%7=)y{SMPQWkTQB@=Kyx#2{qO_Qka}whixD#KL4xuS6p-Cc zNr^l=x1}mxAXROXA1j5HUkJ}2$EUV<6Yb=0EQ|Fy+e@OYMf_vzX)iswxf;l7Ar9kA z?A{`J?Tfn*rLc!paB@b_kL!Vq)|L2A!TT*Jpe^}_A0H_So**bc5-8q@_#PGU zJqB9&tTA-CDhtU{;~`Gfeqs-Nj?-M1#E>r0wkyGy9n64+yx{tZ{G<|mN|m>(=6X5M zAe&W1ep(4WgL(8oQ5Z5A=P7dTbKh?gvv~?w@BnC}P41B-L0dg$I&n*hU!UicrpFF2 zwDVnUAr*4fXjKT2Yen!^dZ)#hh-}egaHKMom~&YckSB;;XRSPpjc}aSd|N}^ISHO7 z87}L}$*>crauJKCX^$xKqe^fG7fRVxk_VOGLt8@+yd3F{*6on$FRg_;^-;$ivl#x= z)lT&qHw6JQ{-{K{w}wtPg&q)cxHa^kMPk1EvzoH#hDROI&<-goKj@y)0%OY|KNOYw z5G<9FqO}VhHQUJ#x&xg|HtAmf3v90V&>7jMr^J}?+?Np9>}tn=44t!Nc<8x$;gX3{ z3t=R*iYA#HnNCcuTYM0+Ag~4HK!tL^RSBbeyzGFS!NOex6etiX6o?@~;Ua?>BzER7 zNb7P1yC(wuNRPBAR>?X+-?jd7dqqi(nG4b zUJjIGwU=BH8NG$V=;c$BcBkl%HtUz!FpYBGoa1wUc~zBe?%KDdv(APg^XdG9#ZboH zOD~!KPMH5&NFW!;DR>Eg>=LvCxj?6IID4SoaP-@@ek8 z7|S`(y$vT*v#QVBXX$2kCe;)u%|p&R1?7|5jFT| zRF1)VebnR_8jPFp;lw(|u%S+NrtJh^amR#Un6{gf{4ZD3++PW1jD>uAJx|@1@X~lg#jT~COoiq zldU#FIu?be2g+}7hA%cROn=v3{T>v-(Qf|0Pm1YL3(Z*4I!9yvjKa)wldUVzdHU-m z3*pcqj8-_Mu)E+;&75f685ae*^++|-AZ*}Sh5yvgd+6`#IvZ^*G;>(4a;1GZoa%;e zEv0>6T(>l4DXV-EI;dC@`@`QGy5}#tLJJqO@DYpTXJdl+69-mFTjjBr{;v1L1ll5_ z2PTz4B^~6Pt`3_q&IiGlk0Iyode24`gRIybsDkMj`eKC1Q398ZfqDHyWlP+2p?iU}2<;`t@Km?dGq zk>Xni%3hV6Rx! zzzn@m*j35wHFyw=Zp%_!+R)nL0TtHR%v`6M ztK)V~B2{uz#A4xAwM|%ii`SrOPI_mv^+6*PUyxXuRda9h>kddt)mmQ!pOyGlfbr zJh2*!I!zzb=Rc@q`(<)p`;s64o8U!W!XWtwbzDNV6Ma)U`|tSfJ9zG32TPrU;|%YpzsL9J zz8UPpiGy#_hqG^=ee;q7m%K^s=r-y$xrc&sScag-3s{sF^G?KJe)p)s-W)N0S@e{P zlBR51?dYF#r7%9u5bSfcWM#A3_6X;c)P!qa$(u$q9{AM;Ke*7yPSxG-s9c%~KTikj z4oH&vi>>>0Yq!{F%%rU#rv=9wpUl>}zND`?a8Jejn!HNiV|Isn)vuX)j0m z21%PSokNYUw#BmfV(rMgLP?GEBr23mgX1=Sm#uIiFYGf4>$x|!$$h0&u?_ryWV|AR zC{gZYh&eC*P3f*xQvBQYcdMoN?e=%Fq*Gb+Wd6=oIP~)q>FfswJJna{;pcexP~HFY zA4_MGbN2ygLCf9V&E8c~MP%n{l--T8>i!p=md++n0dIbeHy{4|5-R?R;$JNl{F2JA zmcAX?DWm+ey!=zVJl^~qZ$A9_3Q=Ab=lcv2Wzdj{qkFS_8|ChfBUlknD&Ar{(_^uBE5c{&_nC;w}w(LN4%KRMt9(T zk6g*E+~@{B!cdAN9CP#5{|=P>pGw5LHRNjwr4-bWg^Pr(hI~*+#2?`Q0cO`x#sRzz>%o~GY_h@H7P_Rz+o!!vm>gK+e_@kKW*kKD9J`EVc>njDBO`J5j5^k`Fe= zk4;H7HOG6WB=2vI`=%!EZH`Z!n)q`qK7VQ=ti_j2MTV#NHB%FRqQ!5Tn)tRB-!wIG zgBEX`nyA*|v8f1dkMEtD_^K9vYii;vTKwIqi4|I>)FbstPKVFocT8|hcFb@D9G5y4 zI+i$=J61cca8x;hj_VyaJ8pGsaMU>Na@^x+aBOuv;Mi^oT7(bm7U}NU;%EV6<$7$N z-y&oYR~|%o?0UqP+`?y)y`iE7mABOJ055)YO}pb3xZ&5wQ&a6hy2R5c%p$$!rd9{_ zbF3rK7MRVY>o~*mXOY=r?Ep6bsdI>t$3ac2LNy91%q*Zdzz;^T82f*Lq_k>~`iKT| z#L+1!E|1FP+gsJRZo{RQ%g@C4`yv@uu6;p)nVwT;}*_wmyjT-_2a6##O9dMy65Mep)E7BYh1JU8v{W>fWL??8MiS=b!+OHhK}!mcD-PC1#I z7PEyNQy!B(*)8TzXm6NbAUb@Wrr4GEo`^`bTJMJXlO3nL1P>ji^A06AsWgvmMsiyq zCs@J?QCRezQ6q=t!PYES-nvwr3N*PHv(?tkT>E@ytEbzN!nb1zr4%j}1P)arr2t=3 zVpIDsB`t!JZx!hrkK^xC$n1BJgaH2L^##+sis;i_fZG zt6Aa{^j58M&=_s5t?O7BwjhT50>X@jv-0s#;X?h;HCSMVY4=V@xdj7B3nE;uiPI*c z*vl8HuF0kxB>q@OW@a5gFChYJO=!z{@?q#fn_P*oQi#4ANSky<>w32`cbq%jj2c;| zc^KSQ?;CksVE=^!<-v2|Pm^gP#$Z2DgUl{c@;&=jat@^5-&ZsP(qtxQ0E8Md1IUaV zII7qQk$%X@l2%w>yopGvIRkV(N@XYI_$Zy}@jONepl|b&;bpd8jjWyhg6}dwHYqWB ziI0&Q4GJ3RG%>%NiBIc;=}*JPG|?Wa(SvN8WBN4tyF7iu&jg==bv+r-GPkd*GJ1*r z=+356P}qZ1Us~%8L{}`o!yg~dGAj5JYtKshhV;Nn0hY|p!5&lis~TdpEo4L{dL6}c{I zsaS)G5d)}!;H(6bR=g|&+=u~g;+|yU@cmjuvXJ_jz$^~O-!a)}m&(FbUt3b|f!}^p zW&|?${2V$9J`uUIbam4*HgTq1c>QKo2RGOGwEEf!5&0zON8~l4%?e~4 zlMszb+gb8yqcd#4rX)wl1~`B%62nAJCie8t0+gNV;5k)-aE@{ZL{GQ?Uf-~HFA{HG z51#;S4a}9jQ-VG?Z}aNAu!ny8Z#k|h{d@3?2{kz z!kW61Qus6QY%(9bIlPN|@%>#tgNvXzF_AL5So3D&Iy;p0E!d5l3GVC%A;&>*&E%9C z>^5sA+5ADe081_(Zo9nas(iXYJ`5=R*^{FzV`gOlWNgaD13c84?}>5|%O~Y(-Ku=8e&@z_T>by2*at zm-|Y{Or0zDObPb#WJ(UXXFUBrs_s|hBWFWL@&9P>h^9u4w$>ddq52hMwe&>W+_&d# zZSf$VQp?(Km$vrE_kU{)0L*&W8ib)+MNiJuckFVSS%C}Aw<$>Wj)Fts+l{G0auAV4 zjxQj#g=*3nvn^nK0T~eW`O}%K=(|w>63>)Bj#w<+TEVLsV;Zz!?mF#PWiVDDm@@OJ za`y+z4by42jRsjIXpGMyZxU0+4F!9?Dz8n@g{clWCm}9-;#Iw3P?ZbOv-DwA1dX&c+=(^tog_C~=bp z{!X?Z_c)s7YB0o`tSN53Ce#$)eZvtB{dA-W7Th`+H@bOn2}^0omN+MC0#jb;hDtHZ z0eypxf=qGfr|QL|84YBZU_K_6TR?#3;TdNve3y0xy_?Tz^)*W@1TBgf@=Tb|PE=`}zsPw_dJogh6+EWvvF&j^kuTd-(C+ZT@#i%*4f@OWta!3; z6%va~X%S0j=+r}2kT~yaqHO(~3CEY70n31%9Ydz2=Cbc7kp$2=hHl(*0ZMy;W(_oR zJG$s(R-F0xupLA;gzA9$&z4##_JD|<%o`!_lnt`&ldVCkTrjpXc+NUbPeZ{p#~iIz zGv;#NRwOeXaZ))_kMuzedp zNfE90N_Qi(`*UvHvg7%;0wU*vBJWm$&u){SD6MLgpSB(o=VWJ%y&uSln+;cpu5j_p)KX1VzuL%Alu=`6TAtV`6jx0a zw7}Uu(V+T%@Un)w(m}^+e$cUhZ?LnJQ*S0AohWdWwKuuK+dG!QOZ<7NSq+^r&btf{ z@Qw584)BhvQhex&{FoAaT$LYFgO3}NlAV|w@?+!s*UO%I2=0-BN(!+@_CcNX*jvvk zO$6iNeTT9;D75Tj(Q!b8SuQ^YGCh?l4?d26PXJ3J!Hj-B^FgF?8wz$6c{`E{@*4?_ zdf6C-vCtnynmOxo1k2zV2L;Pjl3<@szvRp{ki@ky zySqCxOm-CQYIb_;YgUTEQ8YW4Y(&n0!RK-VF%e{Q(V2+ZdLM0zi;l7J+av5qIDvaa z%yz?INXT%k*A5~(0yv;;@+k@rKV1qjl>6)oahNv1U;xwJz_2xQvjHr>s|HUFg~*0d zmPh*|fj;TFXCza|erB9^u$_5qQ*=;%_2>!*_9@zPT?|O-jcaALhB{x49OD>v$)`)q z+bDxI%(nrImBQ#NPi2@^N?K>Lj|w zcPaELT1i8}s7pRo671HOI1QG01DFSrcbx9I87g(dBVqO@*g@n<-NPM@fq<;KNLm<} z?L*w(L%RZSGxxqU%Y%*BfM@RlPgL$*84aEj?!Gn;PB(>4nlg10sMXkpac^#WQQ9n@ z#9s&SUur?wrq?)Q+KKz%Ros@&XMNWKN}afn-+&i?PkSUV7q?Oerr?@tQD7nEbuAN5 z>5tsGDvBWMxPt4azyP%g;+2HGt{Wl#aRzm;%}V#W(PZ7NKq+Oh*Eu? z0+v`0F@#;4aI5@Ak<`4+JHs=}gL|cCdKS+NSUp*ywZ+tdC89i!N!YR-cGAN!ar3Qy za^LWv!gY&uGU~%S^b#Vas<}kvO^9o_S+pU}ytD7>FLUVPoc8Xqlkdfz*#DxkkEKrQgDO9?gf?e}*V#wmf0*kgIA8yJ3EBBRXHQ2JQtAL&s z*3_4_O0OPxVx&)6&oYL)lK~xD8_OscymwQX9$G_0*r^j?OmcWi&1-cI{H*L~7zh

  • S!k(+$}xUTAy%U2A&3$1 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 Y2zW=pI|AMj@Q#3Y1iT~ge;k270kjAl;Q#;t literal 0 HcmV?d00001 diff --git a/at_work/exe_old/486.inc/logpp.exe b/at_work/exe_old/486.inc/logpp.exe new file mode 100644 index 0000000000000000000000000000000000000000..fcf7ce42d6dc5ab906cc099f38a3c94cee5b572f GIT binary patch literal 72704 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 literal 0 HcmV?d00001 diff --git a/at_work/exe_old/486.inc/old1.ccd b/at_work/exe_old/486.inc/old1.ccd new file mode 100644 index 0000000000000000000000000000000000000000..162cde8a0b5b47b2f4cb0ec04d931c26c2e8be75 GIT binary patch literal 5272 zcmeI0ONd-m5Qgu))6=;=lK6;95W)=+oP{7{YY%bbI8hfa#f8vG_Y5ORkFk4#BB(K0 zxDYf3G`P`4R-#b{jSC-fMk7%pN)%u5{T2l`?nK)EJ6)xR%k+@B>dqs_s{d4-zv|Sf zd;3n3Wa*J<`L^*SLEbKThGe(b?9FwH@j^Oy`)sRS6o2EX9nI-(gtyK0db6E@eUtpR z?kJ|3GreM4yE#|1nw@U3vsvtJ-`Z;z+nYOYX-;?ANiM(Mtp1zp%}Gs0HLu#;?(`(d zWk$IS#@$=iN{Qzh;nlXbN)oQ~G|$ycO~S$YnVR^5Yns?c3`->cb?(IYf2^zm&(!n$ zkAA=3NJjIkwUztg?j|+C%tv*-NY=6}Ty%lKlCBi?@_+wS|#7Z;#e*h;`}0?{iF3dXKe95jeS~2$Nsa~IoENF8txBf9e;HE zf094=4Z}a$exApUCWHNs*$=)$4-|HuEAS~9z}yv>bue`RO9TuL@vss92aCsZx>u8d zzhjRFA9j!D*yFJeJMrL0hyQ!yr#`GPmf~k0_LcH~HzfZJ#^?D{fGYgo4&mQi;`e&3 zH2-gg@K2QZ*Hp~^>mmF%miT#pSEHt&dJT`VoD7Hh2!ui8r2RIrqk(S3m!kxx-7(xIYv3RFaPJ z&Lk!|G-`wQ>mvfhkA2u1`>+R}PfI+U&v_P&C-#9S_TjmJ=TwP@dN|Jsb7uMwow|J>etuskgyCw~? zay}<4pO$QUG#T*Sqzz#9f#CsrK6_@S`(UrnT@M`$_L})qZ|t5Ae|vyEAE^P85B%IG zc6y0=p+}mc`{Q1wmTy_^7s|$Y8SF*(_cMB`Nes@|)ntIFIoR#oA(%5Bu=hLI z&qxknKcm!uIU{kgk=L7+S0Q}5dEFyl26^$W1IKxR$qPI0IWT#7o?y?5Ji%UjsR4WK zsWo=*1$3_$I(NYD8GmarIMZ=E6FI#XRtLE_Mp6T8_`fcHF!8WoXILWi2WO*a=#_IM;Ya81Nx0F^mxLF6og|#-7f8YfFC64W z&9I#<$r@*RO=o&It%tP*CC=KbRv&t3uO`EL3{1Y@OC-UZ2aE)d7?uc_dQdlP@Glxa zcOQQntvBra+#h!5ZyApHPv_fc!Qzc+|DBo)^5uNs5Kq5h)C}zLqz3HqI0tq=4?5?0 z#rW?tyTp?G+)ow$qfx!s&mjK|l3>rDUZ}$V@(_N0M`C{Zt_uH4L-;33{PcJg{uhVv z^DQ6e&+}A;{{`{iY~LHy_>d-;=aHIRtl8G&nPRf;c4E>$^lohT@0DX}CVJ?3#o$}w zaXEvJ2=mOq3x3YdDA9+ zT5Fr6a}M-|{vCt3V7|w=H{vYwZI)ptCj0!X>-3@|*1XpE-ogid{Niu3{r1lCe`+I7 m^j*<6ALoj5p?1GoEuR*De72{Am;3jN%f-c+v^~s?%JWZ{tE>?K literal 0 HcmV?d00001 diff --git a/at_work/exe_old/486.inc/old1.log b/at_work/exe_old/486.inc/old1.log new file mode 100644 index 0000000..2184cc8 --- /dev/null +++ b/at_work/exe_old/486.inc/old1.log @@ -0,0 +1,91 @@ +Program SystemedeFenetrage; +Begin +Pref iiuwgraph block + Begin + Pref mouse block + + + (*****************************************************************************) + (* P r o g r a m m e P r i n c i p a l *) + (*****************************************************************************) + var v,p,h,i : integer, + l,r,c : integer, + rep : arrayof char, + d : boolean, + xx,yy : arrayof integer, + status,code,x,y,flags,button : integer; + + Begin + + call gron(0); + call init(1,0); + + call showcursor; + call patern(5,5,635,475,2,0); + call outstring(10,10,"x=",2,0); + call outstring(100,10,"y=",2,0); + call outstring(10,30,"status = ",2,0); + call outstring(10,50,"code = ",2,0); + call outstring(10,70,"flags = ",2,0); + call outstring(10,90,"button = ",2,0); + call patern(100,210,300,320,3,1); + + array xx dim (1:6); + array yy dim (1:6); + xx(1):=410; yy(1):=10; + xx(2):=450; yy(2):=30; + xx(3):=460; yy(3):=50; + xx(4):=430; yy(4):=80; + xx(5):=420; yy(5):=40; + xx(6):=480; yy(6):=30; + call intens(6,xx,yy,8,1); + for i:=1 to 6 + do + yy(i):=yy(i)+100; + od; + call intens(6,xx,yy,15,0); + + call cirb(500,300,50,40,100,3500,10,0); + call cirb(400,400,40,40,600,4000,11,1); + + + i:=hfont(100,350,6,-9999999,9999999,500,9,0,15); + call hpage(100,400,10,unpack("Il fait beau dans ma verte campagne"),9,0); + rep:=hfont8(100,430,10,80,unpack("tototutu"),9,0,15); + + call getmovement(1,1); + + do + d:=getpress(v,p,h,l,r,c); + if (d) + then call outstring(10,400,"Event",2,0); + call patern(80,25,130,100,0,1); + call track(40,10,v,0,4); + call track(140,10,p,0,4); + call track(80,30,h,0,4); + call track(80,50,l,0,4); + call track(80,70,r,0,4); + call track(80,90,c,0,4); + if((h=164 and l=27) or (c=3)) + then exit; + fi; + fi; + od; + call groff; + writeln("i=",i); + for i:=lower(rep) to upper(rep) + do + write(rep(i)); + od; + writeln; + End + End +End. + + + + + + + + diff --git a/at_work/exe_old/486.inc/old1.pcd b/at_work/exe_old/486.inc/old1.pcd new file mode 100644 index 0000000000000000000000000000000000000000..5c830b6cd20f937455431d056d3e9ab2de698c8e GIT binary patch literal 400 zcmZ{g!3lsc5Co&*%L06eScxE_)mnrv!I$96B79lFISU5l(1Rh_z1)(-%xnrF)R4mf z3B(%NNYBxDR(XtC=6uNo3i#^v_?lh8m-4(Py+O=t-GL6RyxsYde|ZPJnCHiIzZ6d2 cKr2sw^e(;ef(A;^{oe2H(8{a)Al_Hr4bA%@_W%F@ literal 0 HcmV?d00001 diff --git a/at_work/exe_old/486.inc/readme b/at_work/exe_old/486.inc/readme new file mode 100644 index 0000000..51d830f --- /dev/null +++ b/at_work/exe_old/486.inc/readme @@ -0,0 +1,9 @@ +Make sure that the directory + + c:\tmp +exists. It is needed for the correct behaviour of programs. +Don't worry. You have nothing to do in it! + + + + diff --git a/at_work/exe_old/486.inc/simula.inc b/at_work/exe_old/486.inc/simula.inc new file mode 100644 index 0000000..082ccac --- /dev/null +++ b/at_work/exe_old/486.inc/simula.inc @@ -0,0 +1,187 @@ +UNIT SIMULATION: PRIORITYQUEUE CLASS; +(* THE LANGUAGE FOR SIMULATION PURPOSES *) + + VAR CURR: SIMPROCESS, (*ACTIVE PROCESS *) + PQ:QUEUEHEAD, (* THE TIME AXIS *) + MAINPR: MAINPROGRAM; + + + UNIT SIMPROCESS : COROUTINE; + (* USER PROCESS PREFIX *) + VAR EVENT, (* ACTIVATION MOMENT NOTICE *) + EVENTAUX: EVENTNOTICE, + (* THIS IS FOR AVOIDING MANY NEW CALLS AS AN RESULT OF *) + (* SUBSEQUENT PASSIVATIONS AND ACTIVATIONS *) + FINISH: BOOLEAN; + + UNIT IDLE: FUNCTION: BOOLEAN; + BEGIN + RESULT:= EVENT= NONE; + END IDLE; + + UNIT TERMINATED: FUNCTION :BOOLEAN; + BEGIN + RESULT:= FINISH; + END TERMINATED; + + UNIT EVTIME: FUNCTION: REAL; + (* TIME OF ACTIVATION *) + BEGIN + IF IDLE THEN CALL ERROR1; + FI; + RESULT:= EVENT.EVENTTIME; + END EVTIME; + + UNIT ERROR1:PROCEDURE; + BEGIN + ATTACH(MAIN); + WRITELN(" AN ATTEMPT TO ACCESS AN IDLE PROCESS TIME"); + END ERROR1; + + UNIT ERROR2:PROCEDURE; + BEGIN + ATTACH(MAIN); + WRITELN(" AN ATTEMPT TO ACCESS A TERMINATED PROCESS TIME"); + END ERROR2; + BEGIN + + RETURN; + INNER; + FINISH:=TRUE; + CALL PASSIVATE; + CALL ERROR2; + END SIMPROCESS; + + +UNIT EVENTNOTICE: ELEM CLASS; + (* A PROCESS ACTIVATION NOTICE TO BE PLACED ONTO THE TIME AXIS PQ *) + VAR EVENTTIME: REAL, PROC: SIMPROCESS; + + UNIT VIRTUAL LESS: FUNCTION(X: EVENTNOTICE):BOOLEAN; + (* OVERWRITE THE FORMER VERSION CONSIDERING EVENTTIME *) + BEGIN + IF X=NONE THEN RESULT:= FALSE ELSE + RESULT:= EVENTTIME< X.EVENTTIME OR + (EVENTTIME=X.EVENTTIME AND PRIOR< X.PRIOR); FI; + + END LESS; + END EVENTNOTICE; + + +UNIT MAINPROGRAM: SIMPROCESS CLASS; + (* IMPLEMENTING MASTER PROGRAM AS A PROCESS *) + BEGIN + DO ATTACH(MAIN) OD; + END MAINPROGRAM; + +UNIT TIME:FUNCTION:REAL; + (* CURRENT VALUE OF SIMULATION TIME *) + BEGIN + RESULT:=CURRENT.EVTIME + END TIME; + +UNIT CURRENT: FUNCTION: SIMPROCESS; + (* THE FIRST PROCESS ON THE TIME AXIS *) + BEGIN + RESULT:=CURR; + END CURRENT; + +UNIT SCHEDULE: PROCEDURE(P:SIMPROCESS,T:REAL); + (* ACTIVATION OF PROCESS P AT TIME T AND DEFINITION OF "PRIOR"- PRIORITY *) + (* WITHIN TIME MOMENT T *) + BEGIN + IF TEx$x7cRSQEt`Ks1>`feIjw0#aRVqP?^tr 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 z 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