erm.c 50 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713
  1. #include "globrig.h"
  2. #include "define.h"
  3. #include "defpage.h"
  4. #include "nef2.h"
  5. #include "cim.h"
  6. #include "usemod.h"
  7. Void usepas(n, pl, rez)
  8. long n;
  9. ptr_ *pl;
  10. long *rez;
  11. {
  12. /* number of option */
  13. /* pointer to argument list */
  14. /* result */
  15. a pp1, pp2;
  16. pp1 = pl->cel;
  17. next(pl);
  18. pp2 = pl->cel;
  19. next(pl);
  20. switch (n) {
  21. /* n: use_x(pp1,pp2,pl.cel,rez) */
  22. case 1:
  23. use_1(pp1, pp2, pl->cel, rez);
  24. break;
  25. case 2:
  26. use_2(pp1, pp2, pl->cel, rez);
  27. break;
  28. case 3:
  29. use_3(pp1, pp2, pl->cel, rez);
  30. break;
  31. case 4:
  32. use_4(pp1, pp2, pl->cel, rez);
  33. break;
  34. case 5:
  35. use_5(pp1, pp2, pl->cel, rez);
  36. break;
  37. case 6:
  38. use_6(pp1, pp2, pl->cel, rez);
  39. break;
  40. case 7:
  41. use_7(pp1, pp2, pl->cel, rez);
  42. break;
  43. case 8:
  44. use_8(pp1, pp2, pl->cel, rez);
  45. break;
  46. case 9:
  47. use_9(pp1, pp2, pl->cel, rez);
  48. break;
  49. case 10:
  50. use_10(pp1, pp2, pl->cel, rez);
  51. break;
  52. case 11:
  53. use_11(pp1, pp2, pl->cel, rez);
  54. break;
  55. case 12:
  56. use_12(pp1, pp2, pl->cel, rez);
  57. break;
  58. case 13:
  59. use_13(pp1, pp2, pl->cel, rez);
  60. break;
  61. case 14:
  62. use_14(pp1, pp2, pl->cel, rez);
  63. break;
  64. case 15:
  65. use_15(pp1, pp2, pl->cel, rez);
  66. break;
  67. case 16:
  68. use_16(pp1, pp2, pl->cel, rez);
  69. break;
  70. case 17:
  71. use_17(pp1, pp2, pl->cel, rez);
  72. break;
  73. case 18:
  74. use_18(pp1, pp2, pl->cel, rez);
  75. break;
  76. case 19:
  77. use_19(pp1, pp2, pl->cel, rez);
  78. break;
  79. case 20:
  80. use_20(pp1, pp2, pl->cel, rez);
  81. break;
  82. case 21:
  83. use_21(pp1, pp2, pl->cel, rez);
  84. break;
  85. case 22:
  86. use_22(pp1, pp2, pl->cel, rez);
  87. break;
  88. case 23:
  89. use_23(pp1, pp2, pl->cel, rez);
  90. break;
  91. case 24:
  92. use_24(pp1, pp2, pl->cel, rez);
  93. break;
  94. case 25:
  95. use_25(pp1, pp2, pl->cel, rez);
  96. break;
  97. case 26:
  98. use_26(pp1, pp2, pl->cel, rez);
  99. break;
  100. case 27:
  101. use_27(pp1, pp2, pl->cel, rez);
  102. break;
  103. case 28:
  104. use_28(pp1, pp2, pl->cel, rez);
  105. break;
  106. case 29:
  107. use_29(pp1, pp2, pl->cel, rez);
  108. break;
  109. case 30:
  110. use_30(pp1, pp2, pl->cel, rez);
  111. break;
  112. case 31:
  113. use_31(pp1, pp2, pl->cel, rez);
  114. break;
  115. case 32:
  116. use_32(pp1, pp2, pl->cel, rez);
  117. break;
  118. case 33:
  119. use_33(pp1, pp2, pl->cel, rez);
  120. break;
  121. case 34:
  122. use_34(pp1, pp2, pl->cel, rez);
  123. break;
  124. case 35:
  125. use_35(pp1, pp2, pl->cel, rez);
  126. break;
  127. case 36:
  128. use_36(pp1, pp2, pl->cel, rez);
  129. break;
  130. case 37:
  131. use_37(pp1, pp2, pl->cel, rez);
  132. break;
  133. case 38:
  134. use_38(pp1, pp2, pl->cel, rez);
  135. break;
  136. case 39:
  137. use_39(pp1, pp2, pl->cel, rez);
  138. break;
  139. case 40:
  140. use_40(pp1, pp2, pl->cel, rez);
  141. break;
  142. case 41:
  143. use_41(pp1, pp2, pl->cel, rez);
  144. break;
  145. case 42:
  146. use_42(pp1, pp2, pl->cel, rez);
  147. break;
  148. case 43:
  149. use_43(pp1, pp2, pl->cel, rez);
  150. break;
  151. case 44:
  152. use_44(pp1, pp2, pl->cel, rez);
  153. break;
  154. /* 45 & 46 are passed*/
  155. case 47:
  156. use_47(pp1, pp2, pl->cel, rez);
  157. break;
  158. case 48:
  159. use_48(pp1, pp2, pl->cel, rez);
  160. break;
  161. case 49:
  162. use_49(pp1, pp2, pl->cel, rez);
  163. break;
  164. case 50:
  165. use_50(pp1, pp2, pl->cel, rez);
  166. break;
  167. case 51:
  168. use_51(pp1, pp2, pl->cel, rez);
  169. break;
  170. case 52:
  171. use_52(pp1, pp2, pl->cel, rez);
  172. break;
  173. case 53:
  174. use_53(pp1, pp2, pl->cel, rez);
  175. break;
  176. case 54:
  177. use_54(pp1, pp2, pl->cel, rez);
  178. break;
  179. case 55:
  180. use_55(pp1, pp2, pl->cel, rez);
  181. break;
  182. case 56:
  183. use_56(pp1, pp2, pl->cel, rez);
  184. break;
  185. case 57:
  186. use_57(pp1, pp2, pl->cel, rez);
  187. break;
  188. case 58:
  189. use_58(pp1, pp2, pl->cel, rez);
  190. break;
  191. case 59:
  192. use_59(pp1, pp2, pl->cel, rez);
  193. break;
  194. case 60:
  195. use_60(pp1, pp2, pl->cel, rez);
  196. break;
  197. case 61:
  198. use_61(pp1, pp2, pl->cel, rez);
  199. break;
  200. case 62:
  201. use_62(pp1, pp2, pl->cel, rez);
  202. break;
  203. case 63:
  204. use_63(pp1, pp2, pl->cel, rez);
  205. break;
  206. case 64:
  207. use_64(pp1, pp2, pl->cel, rez);
  208. break;
  209. case 65:
  210. use_65(pp1, pp2, pl->cel, rez);
  211. break;
  212. case 66:
  213. use_66(pp1, pp2, pl->cel, rez);
  214. break;
  215. case 67:
  216. use_67(pp1, pp2, pl->cel, rez);
  217. break;
  218. case 68:
  219. use_68(pp1, pp2, pl->cel, rez);
  220. break;
  221. case 69:
  222. use_69(pp1, pp2, pl->cel, rez);
  223. break;
  224. case 70:
  225. use_70(pp1, pp2, pl->cel, rez);
  226. break;
  227. case 71:
  228. use_71(pp1, pp2, pl->cel, rez);
  229. break;
  230. case 72:
  231. use_72(pp1, pp2, pl->cel, rez);
  232. break;
  233. case 73:
  234. use_73(pp1, pp2, pl->cel, rez);
  235. break;
  236. case 74:
  237. use_74(pp1, pp2, pl->cel, rez);
  238. break;
  239. case 75:
  240. use_75(pp1, pp2, pl->cel, rez);
  241. break;
  242. case 76:
  243. use_76(pp1, pp2, pl->cel, rez);
  244. break;
  245. case 77:
  246. use_77(pp1, pp2, pl->cel, rez);
  247. break;
  248. case 78:
  249. use_78(pp1, pp2, pl->cel, rez);
  250. break;
  251. case 79:
  252. use_79(pp1, pp2, pl->cel, rez);
  253. break;
  254. case 80:
  255. use_80(pp1, pp2, pl->cel, rez);
  256. break;
  257. case 81:
  258. use_81(pp1, pp2, pl->cel, rez);
  259. break;
  260. case 82:
  261. use_82(pp1, pp2, pl->cel, rez);
  262. break;
  263. case 83:
  264. use_83(pp1, pp2, pl->cel, rez);
  265. break;
  266. case 84:
  267. use_84(pp1, pp2, pl->cel, rez);
  268. break;
  269. case 85:
  270. use_85(pp1, pp2, pl->cel, rez);
  271. break;
  272. case 86:
  273. use_86(pp1, pp2, pl->cel, rez);
  274. break;
  275. case 87:
  276. use_87(pp1, pp2, pl->cel, rez);
  277. break;
  278. case 88:
  279. use_88(pp1, pp2, pl->cel, rez);
  280. break;
  281. case 89:
  282. use_89(pp1, pp2, pl->cel, rez);
  283. break;
  284. case 90:
  285. use_90(pp1, pp2, pl->cel, rez);
  286. break;
  287. case 91:
  288. use_91(pp1, pp2, pl->cel, rez);
  289. break;
  290. case 92:
  291. use_92(pp1, pp2, pl->cel, rez);
  292. break;
  293. case 93:
  294. use_93(pp1, pp2, pl->cel, rez);
  295. break;
  296. case 94:
  297. use_94(pp1, pp2, pl->cel, rez);
  298. break;
  299. case 95:
  300. use_95(pp1, pp2, pl->cel, rez);
  301. break;
  302. case 96:
  303. use_96(pp1, pp2, pl->cel, rez);
  304. break;
  305. case 97:
  306. use_97(pp1, pp2, pl->cel, rez);
  307. break;
  308. case 98:
  309. use_98(pp1, pp2, pl->cel, rez);
  310. break;
  311. case 99:
  312. use_99(pp1, pp2, pl->cel, rez);
  313. break;
  314. case 100:
  315. use_100(pp1, pp2, pl->cel, rez);
  316. break;
  317. case 101:
  318. use_101(pp1, pp2, pl->cel, rez);
  319. break;
  320. case 102:
  321. use_102(pp1, pp2, pl->cel, rez);
  322. break;
  323. case 103:
  324. use_103(pp1, pp2, pl->cel, rez);
  325. break;
  326. case 104:
  327. use_104(pp1, pp2, pl->cel, rez);
  328. break;
  329. case 105:
  330. use_105(pp1, pp2, pl->cel, rez);
  331. break;
  332. case 106:
  333. use_106(pp1, pp2, pl->cel, rez);
  334. break;
  335. case 107:
  336. use_107(pp1, pp2, pl->cel, rez);
  337. break;
  338. case 108:
  339. use_108(pp1, pp2, pl->cel, rez);
  340. break;
  341. case 109:
  342. use_109(pp1, pp2, pl->cel, rez);
  343. break;
  344. case 110:
  345. use_110(pp1, pp2, pl->cel, rez);
  346. break;
  347. case 111:
  348. use_111(pp1, pp2, pl->cel, rez);
  349. break;
  350. case 112:
  351. use_112(pp1, pp2, pl->cel, rez);
  352. break;
  353. case 113:
  354. use_113(pp1, pp2, pl->cel, rez);
  355. break;
  356. case 114:
  357. use_114(pp1, pp2, pl->cel, rez);
  358. break;
  359. case 115:
  360. use_115(pp1, pp2, pl->cel, rez);
  361. break;
  362. case 116:
  363. use_116(pp1, pp2, pl->cel, rez);
  364. break;
  365. case 117:
  366. use_117(pp1, pp2, pl->cel, rez);
  367. break;
  368. case 118:
  369. use_118(pp1, pp2, pl->cel, rez);
  370. break;
  371. case 119:
  372. use_119(pp1, pp2, pl->cel, rez);
  373. break;
  374. case 120:
  375. use_120(pp1, pp2, pl->cel, rez);
  376. break;
  377. case 121:
  378. use_121(pp1, pp2, pl->cel, rez);
  379. break;
  380. case 122:
  381. use_122(pp1, pp2, pl->cel, rez);
  382. break;
  383. case 123:
  384. use_123(pp1, pp2, pl->cel, rez);
  385. break;
  386. case 124:
  387. use_124(pp1, pp2, pl->cel, rez);
  388. break;
  389. case 125:
  390. use_125(pp1, pp2, pl->cel, rez);
  391. break;
  392. case 126:
  393. use_126(pp1, pp2, pl->cel, rez);
  394. break;
  395. case 127:
  396. use_127(pp1, pp2, pl->cel, rez);
  397. break;
  398. case 128:
  399. use_128(pp1, pp2, pl->cel, rez);
  400. break;
  401. case 129:
  402. use_129(pp1, pp2, pl->cel, rez);
  403. break;
  404. case 130:
  405. use_130(pp1, pp2, pl->cel, rez);
  406. break;
  407. case 131:
  408. use_131(pp1, pp2, pl->cel, rez);
  409. break;
  410. case 132:
  411. use_132(pp1, pp2, pl->cel, rez);
  412. break;
  413. case 133:
  414. use_133(pp1, pp2, pl->cel, rez);
  415. break;
  416. case 134:
  417. use_134(pp1, pp2, pl->cel, rez);
  418. break;
  419. case 135:
  420. use_135(pp1, pp2, pl->cel, rez);
  421. break;
  422. case 136:
  423. use_136(pp1, pp2, pl->cel, rez);
  424. break;
  425. case 137:
  426. use_137(pp1, pp2, pl->cel, rez);
  427. break;
  428. case 138:
  429. use_138(pp1, pp2, pl->cel, rez);
  430. break;
  431. case 139:
  432. use_139(pp1, pp2, pl->cel, rez);
  433. break;
  434. case 140:
  435. use_140(pp1, pp2, pl->cel, rez);
  436. break;
  437. case 141:
  438. use_141(pp1, pp2, pl->cel, rez);
  439. break;
  440. case 142:
  441. use_142(pp1, pp2, pl->cel, rez);
  442. break;
  443. case 143:
  444. use_143(pp1, pp2, pl->cel, rez);
  445. break;
  446. case 144:
  447. use_144(pp1, pp2, pl->cel, rez);
  448. break;
  449. case 145:
  450. use_145(pp1, pp2, pl->cel, rez);
  451. break;
  452. case 146:
  453. use_146(pp1, pp2, pl->cel, rez);
  454. break;
  455. case 147:
  456. use_147(pp1, pp2, pl->cel, rez);
  457. break;
  458. case 148:
  459. use_148(pp1, pp2, pl->cel, rez);
  460. break;
  461. case 149:
  462. use_149(pp1, pp2, pl->cel, rez);
  463. break;
  464. case 150:
  465. use_150(pp1, pp2, pl->cel, rez);
  466. break;
  467. default:
  468. *rez = pp1;
  469. break;
  470. }
  471. }
  472. Void add(d, r)
  473. long *d, *r;
  474. {
  475. /*==============*/
  476. /* d+:= r */
  477. /*==============*/
  478. mpd x, y;
  479. numberdescriptor *WITH;
  480. /* deleted sign processing 2-oct-89 */
  481. if (*d == null_) {
  482. if (*r == null_)
  483. return;
  484. pointr(*r, &y.sa);
  485. if (y.snd->dtype == number) {
  486. /* instead of d:=r; changed 22-oct-90 */
  487. gets1(d, &x.sa);
  488. *x.snd = *y.snd;
  489. }
  490. return;
  491. }
  492. points(*d, &x.sa);
  493. if (x.snd->dtype != number) {
  494. *d = null_;
  495. err(9L);
  496. return;
  497. }
  498. if (*r == null_)
  499. return;
  500. pointr(*r, &y.sa);
  501. if (y.snd->dtype == number) {
  502. WITH = x.snd;
  503. WITH->val += y.snd->val;
  504. } else { /* not number */
  505. *d = null_;
  506. err(10L);
  507. }
  508. /* a */
  509. /* a */
  510. } /* add */
  511. Void arithm(op)
  512. long op;
  513. {
  514. /* kod operacii */
  515. /*======================================*/
  516. /* operacii + - * div mod */
  517. /* > < >= <= */
  518. /* whod: v[base -2] v[base -1] */
  519. /* a1 a2 */
  520. /* wyhod: v[base -2] oswob. */
  521. /* a1 op a2 */
  522. /*======================================*/
  523. /* wyhod */
  524. mpd x;
  525. longint n[2]; /* changed 17-nov-90 */
  526. a rez;
  527. aa a_adr[2];
  528. char dts[2];
  529. longint k;
  530. long j;
  531. rez = null_;
  532. for (k = 2; k >= 1; k--) {
  533. getval(&v[base - k - 1]);
  534. if (v[base - k - 1] == null_) {
  535. n[2 - k] = 0;
  536. dts[2 - k] = dummy;
  537. /* a_adr - not used ! */
  538. } else {
  539. pointr(v[base - k - 1], &x.sa);
  540. dts[2 - k] = x.snd->dtype;
  541. if (dts[2 - k] == number)
  542. n[2 - k] = x.snd->val;
  543. else
  544. n[2 - k] = 0;
  545. a_adr[2 - k] = x.sad->name;
  546. }
  547. }
  548. if (dts[0] == dummy && dts[1] == dummy || dts[0] == number ||
  549. dts[1] == number) {
  550. if (op == cgt && n[0] > n[1] || op == clt && n[0] < n[1] ||
  551. op == cge && n[0] >= n[1] || op == cle && n[0] <= n[1])
  552. rez = atomt;
  553. else { /* arifmetika */
  554. if (op >= cmult && op <= cminus) { /* sozdatx atom rezulxtata */
  555. gets1(&rez, &x.sa);
  556. if (op == cadd)
  557. k = n[0] + n[1];
  558. else if (op == cminus)
  559. k = n[0] - n[1];
  560. else if (op == cmult)
  561. k = n[0] * n[1];
  562. else if (op == cdiv)
  563. k = n[0] / n[1];
  564. else if (op == cmod) {
  565. k = n[0] % n[1];
  566. /* p2c: erm.z, line 1070:
  567. * Note: Using % for possibly-negative arguments [317] */
  568. }
  569. x.snd->dtype = number;
  570. x.snd->val = k;
  571. }
  572. }
  573. } else {
  574. if (op >= cmult && op <= cminus) {
  575. gets1(&rez, &x.sa);
  576. x.snd->dtype = number;
  577. x.snd->val = 0;
  578. } else { /* operations cgt,cge,clt.cle only */
  579. if (((1L << ((long)dts[0])) &
  580. ((1L << ((long)atom)) | (1L << ((long)idatom)) |
  581. (1L << ((long)keyword)) | (1L << ((long)tatom)))) != 0) {
  582. if (((1L << ((long)dts[1])) &
  583. ((1L << ((long)atom)) | (1L << ((long)idatom)) |
  584. (1L << ((long)keyword)) | (1L << ((long)tatom)))) != 0) {
  585. switch (op) {
  586. case clt:
  587. j = 1;
  588. break;
  589. case cle:
  590. j = 2;
  591. break;
  592. case cgt:
  593. j = 3;
  594. break;
  595. case cge:
  596. j = 4;
  597. break;
  598. }
  599. if (compatom(j, a_adr[0], a_adr[1]))
  600. rez = atomt;
  601. } else {
  602. if (dts[1] == dummy) {
  603. if (op == cgt || op == cge)
  604. rez = atomt;
  605. }
  606. }
  607. } else {
  608. if (dts[0] == dummy) {
  609. if (((1L << ((long)dts[1])) &
  610. ((1L << ((long)atom)) | (1L << ((long)idatom)) |
  611. (1L << ((long)keyword)) | (1L << ((long)tatom)))) != 0) {
  612. if (op == clt || op == cle)
  613. rez = atomt;
  614. }
  615. }
  616. }
  617. }
  618. }
  619. _L33:
  620. base--;
  621. v[base - 2] = rez;
  622. }
  623. Void unmins()
  624. {
  625. mpd x, y;
  626. a rez;
  627. getval(&v[base - 2]);
  628. if (v[base - 2] == null_)
  629. goto _L99;
  630. pointr(v[base - 2], &y.sa);
  631. if (y.snd->dtype != number) {
  632. v[base - 2] = null_;
  633. goto _L99;
  634. }
  635. gets1(&rez, &x.sa);
  636. *x.snd = *y.snd;
  637. x.snd->val = -y.snd->val; /* del sign change 3-oct-89 */
  638. v[base - 2] = rez;
  639. _L99: ;
  640. } /* unmins*/
  641. /* Local variables for bltin: */
  642. struct LOC_bltin {
  643. long l;
  644. } ;
  645. Local long alen(k, LINK)
  646. long k;
  647. struct LOC_bltin *LINK;
  648. {
  649. bl80 m;
  650. a t;
  651. t = k;
  652. pointa(t, m, &LINK->l); /* [1] ibm/pc */
  653. return LINK->l;
  654. } /* alen */
  655. Void bltin(rez, success, pl, n)
  656. long *rez;
  657. boolean *success;
  658. ptr_ *pl;
  659. long n;
  660. {
  661. /* 1-j argument */
  662. /* nomer wstr.prawila */
  663. /*===========================*/
  664. /* wyzow wstroennogo prawila */
  665. /*===========================*/
  666. struct LOC_bltin V;
  667. /* wyhod */
  668. char rulenum;
  669. a k, s;
  670. mpd x, y;
  671. long t;
  672. longint li_; /* 12- mar -91 */
  673. bl80 mm;
  674. numberdescriptor *WITH;
  675. atomdescriptor *WITH1;
  676. specdescriptor *WITH2;
  677. long FORLIM;
  678. rulenum = n;
  679. k = pl->cel;
  680. if ((k & 511) != 0 || k >= 65535L || k < 0)
  681. pointr(k, &x.sa);
  682. *success = true;
  683. *rez = k;
  684. switch (rulenum) {
  685. case 1: /* #implode */
  686. implode(pl, rez);
  687. break;
  688. case 2: /* #explode */
  689. if (k == null_)
  690. goto _L99;
  691. if (((1L << ((long)x.sad->dtype)) &
  692. ((1L << ((long)fatom + 1)) - (1L << ((long)atom)))) != 0)
  693. explode(k, rez);
  694. else
  695. *success = false;
  696. break;
  697. case 3: /* #atom */
  698. if (k == null_)
  699. goto _L99;
  700. *success = (((1L << ((long)x.sad->dtype)) &
  701. ((1L << ((long)fatom + 1)) - (1L << ((long)atom)))) != 0);
  702. break;
  703. case 4: /* #number */
  704. if (k == null_)
  705. *success = false;
  706. else
  707. *success = (x.sad->dtype == number);
  708. break;
  709. case 5: /* #ident */
  710. if (k == null_)
  711. *success = false;
  712. else
  713. *success = (x.sad->dtype == idatom);
  714. break;
  715. case 6: /* #list */
  716. if (k == null_)
  717. goto _L99;
  718. *success = (x.sad->dtype == listmain);
  719. break;
  720. case 7: /* #tree */
  721. if (k == null_)
  722. goto _L99;
  723. *success = (x.sad->dtype == treemain);
  724. break;
  725. case 8: /* #tatom */
  726. if (k == null_)
  727. *success = false;
  728. else
  729. *success = (x.sad->dtype == tatom);
  730. break;
  731. case 9: /* #fatom */
  732. if (k == null_)
  733. *success = false;
  734. else
  735. *success = (x.sad->dtype == fatom);
  736. break;
  737. case 10: /* #_keyword */
  738. if (k == null_)
  739. *success = false;
  740. else
  741. *success = (x.sad->dtype == keyword);
  742. break;
  743. case 11: /* #_specdesc */
  744. if (k == null_)
  745. *success = false;
  746. else
  747. *success = (x.sad->dtype == spec);
  748. break;
  749. case 12: /* #len */
  750. if (k == null_)
  751. *rez = 0;
  752. else {
  753. switch (x.sad->dtype) {
  754. case atom:
  755. case idatom:
  756. case keyword:
  757. case tatom:
  758. case fatom:
  759. *rez = alen(x.sad->name, &V);
  760. break;
  761. case number:
  762. /* pods~itatx ~islo zna~.cifr */
  763. li_ = x.snd->val;
  764. t = 0;
  765. while (li_ != 0) {
  766. li_ /= 10;
  767. t++;
  768. }
  769. if (t == 0)
  770. t = 1;
  771. if (x.snd->val < 0)
  772. t++;
  773. *rez = t;
  774. break;
  775. /* number */
  776. case listmain:
  777. *rez = x.smld->totalelnum;
  778. break;
  779. case treemain:
  780. *rez = x.smtd->totalarcnum;
  781. break;
  782. default:
  783. *rez = 0;
  784. break;
  785. }/* case */
  786. }
  787. gets1(&k, &x.sa);
  788. WITH = x.snd;
  789. WITH->dtype = number;
  790. WITH->val = *rez;
  791. *rez = k;
  792. break;
  793. /* #len */
  794. case 13: /* #_specatom */
  795. if ((k & 511) != 0 || k >= 65535L || k < 0)
  796. *success = false;
  797. break;
  798. case 14: /* #_rulename */
  799. if (k == null_)
  800. *success = false;
  801. else
  802. *success = (x.sad->dtype == rulename);
  803. break;
  804. case 15: /* #_varname */
  805. if (k == null_)
  806. *success = false;
  807. else {
  808. *success = (((1L << ((long)x.sad->dtype)) &
  809. ((1L << ((long)fvariable + 1)) - (1L << ((long)variable)))) != 0);
  810. points(k, &x.sa);
  811. x.svd->guard = true;
  812. }
  813. break;
  814. case 16:
  815. case 17: /* #_ruletoatom, #_varntoatm */
  816. if (k == null_)
  817. *success = false;
  818. else {
  819. if (x.srd->dtype == rulename && rulenum == 16 ||
  820. (((1L << ((long)x.svd->dtype)) &
  821. ((1L << ((long)fvariable + 1)) - (1L << ((long)variable)))) != 0 &&
  822. rulenum == 17)) {
  823. gets1(&s, &y.sa);
  824. WITH1 = y.sad;
  825. WITH1->dtype = idatom;
  826. if (rulenum == 16) /* !!! vax !!! */
  827. WITH1->name = x.srd->name;
  828. else
  829. WITH1->name = x.svd->name;
  830. *rez = s;
  831. } else
  832. *success = false;
  833. }
  834. break;
  835. case 18: /* #_vardesloc */
  836. if (((1L << ((long)x.svd->dtype)) &
  837. ((1L << ((long)fvariable + 1)) - (1L << ((long)variable)))) != 0) {
  838. next(pl);
  839. s = pl->cel;
  840. pointr(s, &y.sa);
  841. points(k, &x.sa);
  842. x.svd->location = y.snd->val;
  843. } else
  844. *success = false;
  845. break;
  846. case 19: /* #debug */
  847. if (eqatoms(pl->cel, atomrules)) {
  848. /*
  849. rules */
  850. debugrule = true;
  851. } else if (eqatoms(pl->cel, atomnorules)) {
  852. /* norules */
  853. debugrule = false;
  854. }
  855. break;
  856. case 20: /* #_spectodsc */
  857. gets1(&s, &y.sa);
  858. if ((k & 511) == 0 && k < 65535L && k >= 0) {
  859. WITH2 = y.sspec;
  860. WITH2->dtype = spec;
  861. WITH2->val = k;
  862. } else
  863. *y.sspec = *x.sspec;
  864. *rez = s;
  865. break;
  866. case 21: /* _content2 */
  867. if ((k & 511) == 0 && k < 65535L && k >= 0)
  868. *success = false;
  869. else {
  870. s = x.snd->val;
  871. gets1(&k, &x.sa);
  872. WITH = x.snd;
  873. WITH->dtype = number;
  874. WITH->val = s;
  875. *rez = k;
  876. }
  877. break;
  878. /* _content2 */
  879. case 22: /* #chr */
  880. if ((k & 511) == 0 && k < 65535L && k >= 0) {
  881. *rez = null_;
  882. *success = false;
  883. } else if (x.snd->dtype != number || x.snd->val > 255 || x.snd->val < 0) {
  884. *rez = null_;
  885. *success = false;
  886. } else {
  887. t = x.snd->val;
  888. mm[0] = (Char)t;
  889. V.l = 1;
  890. putatm(mm, V.l, &s);
  891. gets1(&k, &x.sa);
  892. WITH1 = x.sad;
  893. if (is_rig_letter((int)t))
  894. WITH1->dtype = idatom;
  895. else
  896. WITH1->dtype = atom;
  897. WITH1->name = s;
  898. *rez = k;
  899. }
  900. break;
  901. /* chr */
  902. case 23: /* parameter */
  903. *rez = null_;
  904. FORLIM = run_param_cnt;
  905. for (V.l = 1; V.l <= FORLIM; V.l++) { /* see glovar.pas */
  906. printf(" %s", run_param_array[V.l - 1]);
  907. lconc(rez, str_to_atom(run_param_array[V.l - 1]));
  908. }
  909. putchar('\n');
  910. break;
  911. case 24: /* #_totatom */
  912. if (k == null_)
  913. *success = false;
  914. else {
  915. gets1(&s, &y.sa);
  916. WITH1 = y.sad;
  917. WITH1->dtype = tatom;
  918. WITH1->name = x.sad->name;
  919. WITH1->flags = 0;
  920. *rez = s;
  921. }
  922. break;
  923. case 25: /* #ord */
  924. if ((k & 511) == 0 && k < 65535L && k >= 0)
  925. goto _L99;
  926. if (((1L << ((long)x.sad->dtype)) &
  927. (((1L << ((long)keyword + 1)) - (1L << ((long)atom))) |
  928. (1L << ((long)tatom)))) != 0) {
  929. s = x.sad->name;
  930. pointa(s, mm, &V.l);
  931. gets1(&k, &y.sa);
  932. WITH = y.snd;
  933. WITH->dtype = number;
  934. WITH->val = mm[0];
  935. *rez = k;
  936. } else
  937. *success = false;
  938. break;
  939. /* ord */
  940. case 26: /* call_pas */
  941. if ((k & 511) == 0 && k < 65535L && k >= 0) {
  942. *rez = null_;
  943. goto _L99;
  944. }
  945. if (x.snd->dtype != number) {
  946. *rez = null_;
  947. goto _L99;
  948. }
  949. next(pl);
  950. if (debugrule) {
  951. if (out_screen)
  952. printf("(%12ld)", x.snd->val);
  953. else
  954. fprintf(out, "(%12ld)", x.snd->val);
  955. }
  956. usepas(x.snd->val, pl, rez);
  957. break;
  958. }/* case */
  959. _L99:
  960. if (*success) {
  961. if (pl->ptrtype != ptrtree)
  962. next(pl);
  963. } else
  964. *rez = null_;
  965. }
  966. boolean compnames(p, ld)
  967. long p, ld;
  968. {
  969. /* adres w sr-prostr. (<>0) deskr.atoma */
  970. /* ili peremennoj w {ablone */
  971. /* adres w st-prostr. (<>0) glawnogo */
  972. /* fragmenta deskr.spiska */
  973. /*=======================================*/
  974. /* esli r -atom, prowerqet rawen li on */
  975. /* imeni spiska(derewa) ld, da -true */
  976. /* net -false */
  977. /* esli r-peremennaq, to priswaiwaet ej */
  978. /* imq ili null, esli imeni */
  979. /* net, wozwr. true. */
  980. /*=======================================*/
  981. boolean Result;
  982. mpd x, y;
  983. a w;
  984. pointr(p, &x.sa);
  985. /* polu~itx dostup k deskr. atoma ili peremennoj */
  986. Result = false;
  987. if (ld == null_)
  988. return Result;
  989. pointr(ld, &y.sa);
  990. /* polu~itx dostup k deskr.spiska */
  991. if (((1L << ((long)x.sad->dtype)) &
  992. ((1L << ((long)fatom + 1)) - (1L << ((long)atom)))) != 0)
  993. { /* atom */
  994. w = y.smld->name;
  995. if ((w & 511) == 0 && w < 65536L && w >= 0) {
  996. /* u spiska net imeni */
  997. return false;
  998. }
  999. /* posmotretx deskr. imeni (atom ili spisok) */
  1000. pointr(w, &y.sa);
  1001. if (((1L << ((long)y.sad->dtype)) &
  1002. ((1L << ((long)fatom + 1)) - (1L << ((long)atom)))) != 0)
  1003. return (eqatoms(p, w));
  1004. return Result;
  1005. } /* atom */
  1006. if (x.sad->dtype != spec) {
  1007. v[mybase + x.svd->location - 1] = y.smld->name;
  1008. /* peremennoj priswoitx spisok imen iz y.smld^.name */
  1009. return true;
  1010. } /* specadres */
  1011. /* specadres */
  1012. w = y.smld->name;
  1013. if ((w & 511) == 0 && w < 65536L && w >= 0)
  1014. return (w == x.sspec->val);
  1015. return Result;
  1016. /* w {ablone - peremennaq */
  1017. }
  1018. Void concop(a1, a2)
  1019. long *a1, a2;
  1020. {
  1021. /*======================================*/
  1022. /* operaciq a1 !! a2 */
  1023. /* ( a1 !! a2 ) -> a1 */
  1024. /*======================================*/
  1025. /* wyhod */
  1026. mpd x;
  1027. ptr_ p1;
  1028. a l;
  1029. l = *a1;
  1030. if (a2 == null_) {
  1031. if (l == null_)
  1032. goto _L99;
  1033. else {
  1034. pointr(l, &x.sa);
  1035. if (x.smld->dtype == listmain)
  1036. goto _L99;
  1037. else {
  1038. l = null_;
  1039. goto _L99;
  1040. }
  1041. }
  1042. }
  1043. pointr(a2, &x.sa);
  1044. if (x.smld->dtype != listmain) {
  1045. l = null_;
  1046. goto _L99;
  1047. }
  1048. if (l != null_) {
  1049. pointr(l, &x.sa);
  1050. if (x.smld->dtype != listmain) {
  1051. l = null_;
  1052. goto _L99;
  1053. }
  1054. }
  1055. first(a2, &p1);
  1056. while (p1.nel != 0) {
  1057. lconc(&l, p1.cel);
  1058. next(&p1);
  1059. }
  1060. _L99:
  1061. *a1 = l;
  1062. } /* concop */
  1063. Void copyop()
  1064. {
  1065. /*======================*/
  1066. /* v[base -1] */
  1067. /*whod: a */
  1068. /*wyhod: copy( a ) */
  1069. /*======================*/
  1070. /* wyhod */
  1071. long k;
  1072. mpd x, y, z;
  1073. a r1, r2, r3;
  1074. getval(&v[base - 2]);
  1075. if (v[base - 2] == null_)
  1076. goto _L99;
  1077. pointr(v[base - 2], &x.sa);
  1078. switch (x.sad->dtype) {
  1079. case atom:
  1080. case idatom:
  1081. case keyword:
  1082. case number:
  1083. case tatom:
  1084. case fatom:
  1085. case variable:
  1086. case idvariable:
  1087. case nvariable:
  1088. case fvariable:
  1089. case spec: /* coord removed */
  1090. gets1(&r1, &y.sa);
  1091. *y.sad = *x.sad;
  1092. v[base - 2] = r1;
  1093. break;
  1094. case rulename:
  1095. case object_d:
  1096. gets2(&r1, &y.sa);
  1097. *y.srd = *x.srd;
  1098. v[base - 2] = r1;
  1099. break;
  1100. case listmain:
  1101. case treemain:
  1102. gets5(&r1, &y.sa);
  1103. /* skopirowatx glawnyj deskriptor */
  1104. *y.smld = *x.smld;
  1105. v[base - 2] = r1;
  1106. r2 = x.smld->next;
  1107. while (r2 != null_) {
  1108. pointr(r2, &x.sa);
  1109. gets5(&r3, &z.sa);
  1110. *z.smld = *x.smld;
  1111. points(r1, &y.sa);
  1112. y.smld->next = r3;
  1113. r1 = r3;
  1114. r2 = z.smld->next;
  1115. } /* while */
  1116. break;
  1117. }/* case */
  1118. _L99: ; /* wyhod */
  1119. } /* copyop */
  1120. Void epilog()
  1121. {
  1122. long iii;
  1123. longint dr, dw, dp;
  1124. for (iii = 0; iii < filenum; iii++) {
  1125. if (filetab[iii].isopen) {
  1126. if (filetab[iii].screen)
  1127. putchar('\n');
  1128. else {
  1129. putc('\n', files[iii]);
  1130. if (files[iii] != NULL)
  1131. fclose(files[iii]);
  1132. files[iii] = NULL;
  1133. }
  1134. }
  1135. }
  1136. printf("\n========== End of execution ==========\n");
  1137. vola(&dr, &dw, &dp);
  1138. if (dr + dw + dp > 0)
  1139. printf("A-Space:%12ld/%12ld/%12ld pages \n", dr, dw, dp);
  1140. vols(&dr, &dw, &dp);
  1141. if (dr + dw + dp > 0)
  1142. printf("S-Space :%12ld reads %12ld writes %12ld pages \n", dr, dw, dp);
  1143. if (out_open) {
  1144. if (out != NULL)
  1145. fclose(out);
  1146. out = NULL;
  1147. }
  1148. closea();
  1149. closes();
  1150. } /* epilog */
  1151. Void eqop(o)
  1152. long o;
  1153. {
  1154. /* cequ(=), cnequ(<>) */
  1155. /*====================================*/
  1156. /* rawenstwo/ nerawenstwo obxektow */
  1157. /* whod: v[base -2] v[base -1] */
  1158. /* a1 a2 */
  1159. /* wyhod: t / null oswob. */
  1160. /*====================================*/
  1161. boolean rez;
  1162. getval(&v[base - 3]);
  1163. getval(&v[base - 2]);
  1164. eqop1(o, v[base - 3], v[base - 2], &rez);
  1165. if (rez && o == cequ || !rez && o == cnequ)
  1166. v[base - 3] = atomt;
  1167. else
  1168. v[base - 3] = null_;
  1169. base--;
  1170. } /* eqop */
  1171. Void eqop1(o, a1, a2, rez1)
  1172. long o, a1, a2;
  1173. boolean *rez1;
  1174. {
  1175. /* cequ(=), cnequ(<>) */
  1176. /*====================================*/
  1177. /* rawenstwo/ nerawenstwo obxektow */
  1178. /* whod: a1 a2 */
  1179. /* wyhod: true / false w rez1 */
  1180. /*====================================*/
  1181. /*wyhod */
  1182. mpd x, y;
  1183. boolean rez;
  1184. ptr_ px, py;
  1185. rez = true;
  1186. if (a2 == null_) {
  1187. if (a1 == null_)
  1188. goto _L1;
  1189. else {
  1190. pointr(a1, &x.sa);
  1191. rez = (((1L << ((long)x.smld->dtype)) &
  1192. ((1L << ((long)listmain)) | (1L << ((long)treemain)))) != 0 &&
  1193. x.smld->totalelnum == 0);
  1194. goto _L1;
  1195. }
  1196. } /* a2 =null */
  1197. /* oba ne null */
  1198. pointr(a2, &x.sa);
  1199. if (a1 == null_) {
  1200. rez = (((1L << ((long)x.smld->dtype)) &
  1201. ((1L << ((long)listmain)) | (1L << ((long)treemain)))) != 0 &&
  1202. x.smld->totalelnum == 0);
  1203. goto _L1;
  1204. }
  1205. pointr(a1, &y.sa);
  1206. switch (x.smld->dtype) {
  1207. case variable:
  1208. case idvariable:
  1209. case nvariable:
  1210. case fvariable:
  1211. case spec:
  1212. case rulename: /* coord removed */
  1213. rez = (memcmp(x.sc8, y.sc8, sizeof(atomdescriptor)) == 0);
  1214. break;
  1215. case number:
  1216. /* added 20-jul-1989 in pc/at, changed 3-oct sign */
  1217. rez = (y.snd->dtype == number && x.snd->val == y.snd->val);
  1218. break;
  1219. case atom:
  1220. case idatom:
  1221. case keyword:
  1222. case tatom:
  1223. rez = (((1L << ((long)y.sad->dtype)) & (((1L << ((long)keyword + 1)) -
  1224. (1L << ((long)atom))) | (1L << ((long)tatom)))) != 0 &&
  1225. x.sad->name == y.sad->name);
  1226. break;
  1227. case fatom:
  1228. rez = (y.sad->dtype == fatom && x.sad->name == y.sad->name);
  1229. break;
  1230. case listmain:
  1231. rez = (x.smld->totalelnum == y.smld->totalelnum &&
  1232. y.smld->dtype == listmain);
  1233. if (rez) {
  1234. first(a1, &px);
  1235. first(a2, &py);
  1236. while (rez && px.nel != 0) {
  1237. eqop1(o, px.cel, py.cel, &rez);
  1238. next(&px);
  1239. next(&py);
  1240. } /* while */
  1241. }
  1242. break;
  1243. case treemain:
  1244. rez = (x.smtd->totalarcnum == y.smtd->totalarcnum &&
  1245. y.smtd->dtype == treemain);
  1246. if (rez) {
  1247. first(a1, &px);
  1248. while (rez && px.nel != 0) {
  1249. first(a2, &py);
  1250. while (py.nel != 0 && px.UU.U1.arc != py.UU.U1.arc)
  1251. next(&py);
  1252. if (py.nel == 0)
  1253. rez = false;
  1254. else
  1255. eqop1(o, px.cel, py.cel, &rez);
  1256. next(&px);
  1257. } /* while */
  1258. }
  1259. break;
  1260. }/* case */
  1261. _L1:
  1262. *rez1 = rez;
  1263. /* a2 <>null */
  1264. } /* eqop */
  1265. Void explode(kk, rez)
  1266. long kk, *rez;
  1267. {
  1268. /*=====================================*/
  1269. /* sozdaet spisok odnobukwennyh atomow */
  1270. /*=====================================*/
  1271. a s, k;
  1272. mpd x;
  1273. longint l; /* changed fron integer 17-nov-90 */
  1274. string80 str_val;
  1275. Char STR1[256];
  1276. long FORLIM;
  1277. *rez = null_;
  1278. if (kk == null_)
  1279. goto _L99;
  1280. pointr(kk, &x.sa);
  1281. switch (x.sad->dtype) {
  1282. case fatom: /* added 17-feb-92 */
  1283. real_to_string(str_val, take_fatom(x.sad->name));
  1284. break;
  1285. case number:
  1286. long_to_str(str_val, x.snd->val);
  1287. break;
  1288. case 5:
  1289. case 6:
  1290. case 7:
  1291. case tatom:
  1292. aa_str(str_val, x.sad->name);
  1293. break;
  1294. default:
  1295. goto _L99;
  1296. break;
  1297. }/* case */
  1298. /* w m sformirowan massiw simwolow */
  1299. s = null_; /* rez.spisok */
  1300. FORLIM = strlen(str_val);
  1301. for (l = 0; l < FORLIM; l++) {
  1302. sprintf(STR1, "%c", str_val[l]);
  1303. k = str_to_textatom(STR1);
  1304. lconc(&s, k);
  1305. } /* for */
  1306. *rez = s;
  1307. _L99: ;
  1308. } /* explode */
  1309. #define max_digit 10 /* maximum for longint type */
  1310. /* Local variables for implode: */
  1311. struct LOC_implode {
  1312. bl80 m, m1;
  1313. mpd x;
  1314. a k;
  1315. long p1; /* posledn.zanqtyj |l-t w m1 */
  1316. string80 str_val;
  1317. } ;
  1318. Local Void pass(pl, LINK)
  1319. ptr_ *pl;
  1320. struct LOC_implode *LINK;
  1321. {
  1322. ptr_ pl1;
  1323. long t, l;
  1324. while (pl->nel != 0) {
  1325. LINK->k = pl->cel;
  1326. if (LINK->k != null_) {
  1327. pointr(LINK->k, &LINK->x.sa);
  1328. if (LINK->x.smld->dtype == listmain) {
  1329. first(LINK->k, &pl1); /*, st */
  1330. pass(&pl1, LINK);
  1331. } else { /* not list */
  1332. if (((1L << ((long)LINK->x.sad->dtype)) &
  1333. ((1L << ((long)fatom + 1)) - (1L << ((long)atom)))) == 0)
  1334. goto _L99;
  1335. if (LINK->x.sad->dtype == fatom) { /* added 17-feb-92 */
  1336. real_to_string(LINK->str_val, take_fatom(LINK->x.sad->name));
  1337. l = strlen(LINK->str_val);
  1338. if (LINK->p1 + l > 80) {
  1339. err(25L);
  1340. goto _L99;
  1341. }
  1342. for (t = 0; t < l; t++)
  1343. LINK->m1[LINK->p1 + t] = LINK->str_val[t];
  1344. LINK->p1 += l;
  1345. } else {
  1346. if (((1L << ((long)LINK->x.sad->dtype)) &
  1347. (((1L << ((long)keyword + 1)) - (1L << ((long)atom))) |
  1348. (1L << ((long)tatom)))) != 0) {
  1349. /* wzqtx atom iz a-prostranstwa w m */
  1350. LINK->k = LINK->x.sad->name;
  1351. pointa(LINK->k, LINK->m, &l); /* [1] ibm/pc */
  1352. if (LINK->p1 + l > 80) {
  1353. err(25L);
  1354. goto _L99;
  1355. }
  1356. for (t = 0; t < l; t++)
  1357. LINK->m1[LINK->p1 + t] = LINK->m[t];
  1358. LINK->p1 += l;
  1359. } else { /* number */
  1360. /*==============================*/
  1361. /* perewesti ~islo w simwoly i */
  1362. /* pomestitx w m [1..max_digit] */
  1363. /*==============================*/
  1364. LINK->k = LINK->x.snd->val;
  1365. if (LINK->k < 0) /* changed from abs call */
  1366. LINK->k = -LINK->k;
  1367. for (t = max_digit - 1; t >= 0; t--) {
  1368. l = LINK->k % 10;
  1369. /* p2c: erm.z, line 1925:
  1370. * Note: Using % for possibly-negative arguments [317] */
  1371. LINK->k /= 10;
  1372. LINK->m[t] = (Char)(l + '0');
  1373. }
  1374. t = 1;
  1375. while (t < max_digit && LINK->m[t - 1] == '0')
  1376. t++;
  1377. if (LINK->x.snd->val < 0) {
  1378. if (LINK->p1 == 80) {
  1379. err(25L);
  1380. goto _L99;
  1381. }
  1382. LINK->p1++;
  1383. LINK->m1[LINK->p1 - 1] = '-';
  1384. }
  1385. if (LINK->p1 + max_digit - t > 79) {
  1386. err(25L);
  1387. goto _L99;
  1388. }
  1389. for (l = t - 1; l < max_digit; l++) {
  1390. LINK->p1++;
  1391. LINK->m1[LINK->p1 - 1] = LINK->m[l];
  1392. }
  1393. } /* number */
  1394. }
  1395. } /* not list */
  1396. } /* k<> null */
  1397. next(pl);
  1398. } /* while */
  1399. _L99: ;
  1400. } /* pass */
  1401. Void implode(pl, rez)
  1402. ptr_ *pl;
  1403. long *rez;
  1404. {
  1405. /* 1-j argument */
  1406. /*======================================*/
  1407. /* skleiwanie atomow a1 a2 ... an do */
  1408. /* perwogo, otli~nogo ot atoma ili null */
  1409. /*======================================*/
  1410. struct LOC_implode V;
  1411. longint l;
  1412. /* rab. */
  1413. /* change from integer 17-nov-90*/
  1414. boolean id;
  1415. long FORLIM;
  1416. atomdescriptor *WITH;
  1417. V.p1 = 0;
  1418. pass(pl, &V);
  1419. if (V.p1 == 0) {
  1420. *rez = null_;
  1421. return;
  1422. }
  1423. putatm(V.m1, V.p1, &V.k);
  1424. id = is_rig_letter(V.m1[0]);
  1425. FORLIM = V.p1;
  1426. for (l = 0; l < FORLIM; l++)
  1427. id &= is_rig_symbol(V.m1[l]);
  1428. l = 1;
  1429. gets1(rez, &V.x.sa);
  1430. WITH = V.x.sad;
  1431. if (id)
  1432. WITH->dtype = idatom;
  1433. else
  1434. WITH->dtype = atom;
  1435. WITH->name = V.k;
  1436. /* zapisatx nowyj atom w a-prostr. */
  1437. }
  1438. #undef max_digit
  1439. Void indxop()
  1440. {
  1441. /*==============================================*/
  1442. /* whod: v[base-2] v[base-1] */
  1443. /* l x */
  1444. /* wyhod: l[ x ] oswoboditx */
  1445. /* */
  1446. /* esli l -object, to i rezulxtat - object */
  1447. /* l[ -1 ] - poslednij |l-t spiska */
  1448. /* l[ -2 ] - predposlednij |l-t spiska ... */
  1449. /*==============================================*/
  1450. /* wyhod */
  1451. mpd x, y, z;
  1452. long k, n;
  1453. a r, t;
  1454. boolean wasobject, mainlist;
  1455. objdescriptor *WITH;
  1456. getval(&v[base - 2]);
  1457. if (v[base - 2] == null_) {
  1458. err(5L);
  1459. v[base - 3] = null_;
  1460. goto _L1;
  1461. }
  1462. /* proweritx, ~to x -~islo */
  1463. pointr(v[base - 2], &x.sa);
  1464. if (x.snd->dtype != number) {
  1465. err(3L);
  1466. v[base - 3] = null_;
  1467. goto _L1;
  1468. }
  1469. n = x.snd->val;
  1470. /* delete sign proc.*/
  1471. wasobject = false;
  1472. getval(&v[base - 3]);
  1473. if (v[base - 3] == null_) /* rezulxtat= null */
  1474. goto _L1;
  1475. /* opredelitx tip l */
  1476. pointr(v[base - 3], &z.sa);
  1477. if (z.smld->dtype == listmain)
  1478. y = z;
  1479. else {
  1480. if (z.smld->dtype != object_d) {
  1481. err(4L);
  1482. v[base - 3] = null_;
  1483. goto _L1;
  1484. }
  1485. wasobject = true;
  1486. if (z.sobj->variable_)
  1487. t = v[z.sobj->fragmorvar - 1];
  1488. else {
  1489. t = z.sobj->fragmorvar;
  1490. pointr(t, &x.sa);
  1491. switch (x.smld->dtype) {
  1492. case listmain:
  1493. case listfragm:
  1494. t = x.sfld->elt[z.sobj->nel - 1];
  1495. break;
  1496. /* ****** very strange ******* */
  1497. case treemain:
  1498. t = x.smtd->arc[z.sobj->nel - 1].elt;
  1499. break;
  1500. case treefragm:
  1501. t = x.sftd->arc[z.sobj->nel - 1].elt;
  1502. break;
  1503. }/* case */
  1504. }
  1505. /* t ukazywaet na glawn. deskriptor spiska */
  1506. if (t == null_) {
  1507. v[base - 3] = null_;
  1508. goto _L1;
  1509. }
  1510. pointr(t, &y.sa);
  1511. if (y.smld->dtype != listmain) {
  1512. err(4L);
  1513. v[base - 3] = null_;
  1514. goto _L1;
  1515. }
  1516. } /* object */
  1517. /*============================================*/
  1518. /* y ukazywaet na deskriptor glawnogo spiska */
  1519. /* z - na object, esli takoj byl */
  1520. /*============================================*/
  1521. /* wy~islenie l[x] */
  1522. k = y.smld->totalelnum;
  1523. if (n < 0)
  1524. n += k + 1;
  1525. if (n < 1 || n > k) {
  1526. err(5L);
  1527. /* indeks wne spiska */
  1528. v[base - 3] = null_;
  1529. goto _L1;
  1530. }
  1531. /*================================*/
  1532. /* poisk |l-ta spiska */
  1533. /*================================*/
  1534. if (n <= y.smld->elnum) {
  1535. mainlist = true;
  1536. r = y.smld->elt[n - 1];
  1537. } else {
  1538. mainlist = false;
  1539. n -= y.smld->elnum;
  1540. t = y.smld->next;
  1541. pointr(t, &y.sa);
  1542. while (n > y.sfld->elnum) {
  1543. n -= y.sfld->elnum;
  1544. t = y.sfld->next;
  1545. pointr(t, &y.sa);
  1546. }
  1547. r = y.sfld->elt[n - 1];
  1548. }
  1549. /* w r rezulxtat = l [ x ] */
  1550. if (wasobject) {
  1551. points(v[base - 3], &z.sa);
  1552. WITH = z.sobj;
  1553. WITH->variable_ = false;
  1554. if (mainlist)
  1555. WITH->nel = n + 2;
  1556. else
  1557. WITH->nel = n;
  1558. WITH->fragmorvar = t; /* with */
  1559. } /* wasobject */
  1560. else
  1561. v[base - 3] = r;
  1562. _L1:
  1563. base--;
  1564. /* o{ibka */
  1565. } /* indxop */
  1566. Void nameop()
  1567. {
  1568. /*================================================*/
  1569. /* operaciq a :: l */
  1570. /* whod: v[base-2] v[base-1] */
  1571. /* a l ili t */
  1572. /* wyhod: a::l oswoboditx */
  1573. /* */
  1574. /*================================================*/
  1575. /* wyhod */
  1576. mpd x, y;
  1577. getval(&v[base - 2]);
  1578. if (v[base - 2] == null_) {
  1579. v[base - 3] = null_;
  1580. goto _L1;
  1581. }
  1582. getval(&v[base - 3]);
  1583. /* if v[base - 2] = null then
  1584. goto 1; */
  1585. /* deleted 23-1-1992 for null::<.a:b.> <> null */
  1586. if ((v[base - 3] & 511) != 0 || v[base - 3] >= 65536L || v[base - 3] < 0) {
  1587. pointr(v[base - 3], &y.sa);
  1588. /* dostup k atomu */
  1589. if (((1L << ((long)y.sad->dtype)) &
  1590. (((1L << ((long)fatom + 1)) - (1L << ((long)atom))) |
  1591. (1L << ((long)spec)))) == 0) {
  1592. err(7L);
  1593. v[base - 3] = null_;
  1594. goto _L1;
  1595. }
  1596. }
  1597. points(v[base - 2], &x.sa);
  1598. /* polu~itx deskriptor spiska (derewa) */
  1599. if (((1L << ((long)x.smld->dtype)) &
  1600. ((1L << ((long)listmain)) | (1L << ((long)treemain)))) == 0) {
  1601. err(6L);
  1602. v[base - 3] = null_;
  1603. goto _L1;
  1604. }
  1605. x.smld->name = v[base - 3];
  1606. v[base - 3] = v[base - 2];
  1607. _L1:
  1608. base--;
  1609. }
  1610. Void prolog(y, debug, code)
  1611. ptr_ *y;
  1612. boolean debug;
  1613. long code;
  1614. {
  1615. /*===============*/
  1616. /* inicializaciq */
  1617. /*===============*/
  1618. long k, k1;
  1619. mpd x;
  1620. long iii;
  1621. Char m[10];
  1622. a rez, s;
  1623. atomdescriptor *WITH;
  1624. k = 1;
  1625. vs[0] = code;
  1626. debugrule = debug;
  1627. base = 1;
  1628. sbase = 1;
  1629. /* w na~ale wse fajly zakryty */
  1630. for (iii = 0; iii < filenum; iii++)
  1631. filetab[iii].isopen = false;
  1632. /* sozdatx atom t */
  1633. m[0] = 'T';
  1634. k1 = 1;
  1635. putatm(m, k1, &s);
  1636. gets1(&atomt, &x.sa);
  1637. WITH = x.sad;
  1638. WITH->dtype = idatom;
  1639. WITH->name = s;
  1640. v[base - 1] = atomt;
  1641. base++;
  1642. /* ~toby ne propal pri sborke musora */
  1643. m[0] = 'R';
  1644. m[1] = 'U';
  1645. m[2] = 'L';
  1646. m[3] = 'E';
  1647. m[4] = 'S';
  1648. k1 = 5;
  1649. putatm(m, k1, &s);
  1650. gets1(&atomrules, &x.sa);
  1651. WITH = x.sad;
  1652. WITH->dtype = idatom;
  1653. WITH->name = s;
  1654. v[base - 1] = atomrules;
  1655. base++;
  1656. m[0] = 'N';
  1657. m[1] = 'O';
  1658. m[2] = 'R';
  1659. m[3] = 'U';
  1660. m[4] = 'L';
  1661. m[5] = 'E';
  1662. m[6] = 'S';
  1663. k1 = 7;
  1664. putatm(m, k1, &s);
  1665. gets1(&atomnorules, &x.sa);
  1666. WITH = x.sad;
  1667. WITH->dtype = idatom;
  1668. WITH->name = s;
  1669. v[base - 1] = atomnorules;
  1670. base++;
  1671. /* wojti w s-kod rigal */
  1672. first(vs[0], y);
  1673. next(y); /* mybase */
  1674. rez = y->cel;
  1675. points(rez, &x.sa);
  1676. mybase = base - 1;
  1677. x.snd->val = mybase;
  1678. next(y); /* ~islo lok.peremennyh */
  1679. rez = y->cel;
  1680. pointr(rez, &x.sa);
  1681. base += x.snd->val + 1;
  1682. /* inicializaciq lok.per. glawn.progr. */
  1683. for (iii = mybase; iii < varnum; iii++)
  1684. v[iii] = null_;
  1685. next(y);
  1686. fail = false;
  1687. break_ = false;
  1688. continue_ = true;
  1689. teklexem = null_;
  1690. printf("=========Start of execution ==========\n");
  1691. } /* prolog */
  1692. Void selctr()
  1693. {
  1694. /*==============================================*/
  1695. /* whod: v[ base -2 ] v[ base -1 ] */
  1696. /* t x */
  1697. /* wyhod: v[ base -2] */
  1698. /* t.x oswoboditx */
  1699. /* esli t- object, to i rezulxtat -object */
  1700. /*==============================================*/
  1701. /* wyhod */
  1702. mpd x, y, z;
  1703. a n; /* imq selektora */
  1704. a t, glavnder; /* s-adr.glawn.derewa */
  1705. long ai, i;
  1706. boolean wasobject;
  1707. maintreedescriptor *WITH;
  1708. long FORLIM;
  1709. fragmtreedescriptor *WITH1;
  1710. objdescriptor *WITH2;
  1711. getval(&v[base - 2]);
  1712. if (v[base - 2] == null_) {
  1713. err(21L);
  1714. v[base - 3] = null_;
  1715. goto _L1;
  1716. }
  1717. /* prowerim, ~to x -ne~islowoj atom */
  1718. pointr(v[base - 2], &x.sa);
  1719. if (x.sad->dtype != idatom) {
  1720. err(22L);
  1721. v[base - 3] = null_;
  1722. goto _L1;
  1723. }
  1724. n = x.sad->name;
  1725. wasobject = false;
  1726. getval(&v[base - 3]);
  1727. if (v[base - 3] == null_)
  1728. goto _L1;
  1729. /* rezulxtat =null */
  1730. /* opredelitx tip t */
  1731. pointr(v[base - 3], &z.sa);
  1732. if (z.smtd->dtype == treemain)
  1733. y = z;
  1734. else {
  1735. if (z.smtd->dtype != object_d) {
  1736. err(23L);
  1737. v[base - 3] = null_;
  1738. goto _L1;
  1739. }
  1740. wasobject = true;
  1741. if (z.sobj->variable_)
  1742. t = v[z.sobj->fragmorvar - 1];
  1743. else {
  1744. t = z.sobj->fragmorvar;
  1745. pointr(t, &x.sa);
  1746. switch (x.smld->dtype) {
  1747. case listmain:
  1748. case listfragm:
  1749. t = x.sfld->elt[z.sobj->nel - 1];
  1750. break;
  1751. case treemain:
  1752. t = x.smtd->arc[z.sobj->nel - 1].elt;
  1753. break;
  1754. case treefragm:
  1755. t = x.sftd->arc[z.sobj->nel - 1].elt;
  1756. break;
  1757. }/* case */
  1758. }
  1759. if (t == null_) {
  1760. v[base - 3] = null_;
  1761. goto _L1;
  1762. }
  1763. /* added 20-jul-1989 in pc/at from 10-jul-89 on vax */
  1764. pointr(t, &y.sa);
  1765. if (y.smtd->dtype != treemain) {
  1766. err(23L);
  1767. v[base - 3] = null_;
  1768. goto _L1;
  1769. }
  1770. }
  1771. /*=====================================*/
  1772. /* y ukazywaet na glawn.deskr. derewa */
  1773. /* z na object, esli takoj byl */
  1774. /* t na deskr.glawn. derewa */
  1775. /*=====================================*/
  1776. glavnder = t; /* sna~ala w glawnom derewe */
  1777. /* wy~islenie y.x */
  1778. /* poisk selektora n w derewe y */
  1779. WITH = y.smtd; /* with */
  1780. FORLIM = WITH->arcnum;
  1781. for (i = 1; i <= FORLIM; i++) {
  1782. if (WITH->arc[i - 1].arcname == n) { /* na{li */
  1783. ai = i;
  1784. n = WITH->arc[i - 1].elt;
  1785. goto _L2;
  1786. }
  1787. }
  1788. t = WITH->next;
  1789. /* prodolvaem poisk w fragmentah */
  1790. while (t != null_) {
  1791. pointr(t, &y.sa);
  1792. WITH1 = y.sftd;
  1793. FORLIM = WITH1->arcnum;
  1794. for (i = 1; i <= FORLIM; i++) {
  1795. if (WITH1->arc[i - 1].arcname == n) { /* na{li */
  1796. ai = i;
  1797. n = WITH1->arc[i - 1].elt;
  1798. goto _L2;
  1799. }
  1800. }
  1801. t = WITH1->next; /* with */
  1802. } /* while */
  1803. /* ne na{li ! */
  1804. v[base - 3] = null_;
  1805. goto _L1;
  1806. _L2: /* na{li */
  1807. /*==============================*/
  1808. /* w n -rezulxtat t.x */
  1809. /* w ai -nomer w arc[...] */
  1810. /* w t -s-ssylka na fragment */
  1811. /*==============================*/
  1812. if (wasobject) {
  1813. points(v[base - 3], &z.sa);
  1814. WITH2 = z.sobj;
  1815. WITH2->variable_ = false;
  1816. WITH2->nel = ai;
  1817. WITH2->fragmorvar = t;
  1818. WITH2->glavn = glavnder;
  1819. /* with */
  1820. } /* wasobject */
  1821. else
  1822. v[base - 3] = n;
  1823. _L1:
  1824. base--;
  1825. /* t ukazywaet na glawn.deskriptor derewa */
  1826. /* o{ibka */
  1827. } /* selctr */
  1828. Void int11(debug, code)
  1829. boolean debug;
  1830. long code;
  1831. {
  1832. ptr_ y;
  1833. boolean success;
  1834. a rez;
  1835. /* inicializaciq */
  1836. prolog(&y, debug, code);
  1837. /* osnownoj cikl */
  1838. success = true;
  1839. while (y.cel != null_ && continue_) {
  1840. statement(y.cel, &success, &rez);
  1841. next(&y);
  1842. }
  1843. epilog();
  1844. }
  1845. Void push()
  1846. {
  1847. /*========================================*/
  1848. /* zanqtx w steke peremennu`, nomer */
  1849. /* per. (base - 1) */
  1850. /*========================================*/
  1851. base++;
  1852. if (base > varnum)
  1853. {err(1L); epilog();exit(1); } /* VADIM CHANGED 8/6/95 */
  1854. }
  1855. Void pratom(aa_)
  1856. long aa_;
  1857. {
  1858. /* pe~atx atoma */
  1859. bl80 m;
  1860. long s, l;
  1861. a k;
  1862. k = aa_;
  1863. pointa(k, m, &l); /* ibm/pc [1] */
  1864. for (s = 0; s < l; s++) {
  1865. if (out_screen)
  1866. putchar(m[s]);
  1867. else
  1868. putc(m[s], out);
  1869. }
  1870. } /* pratom */
  1871. Void prblt(nn)
  1872. long nn;
  1873. {
  1874. /* adres nom.wstr.prawila */
  1875. mpd x;
  1876. long bn;
  1877. string80 rn;
  1878. pointr(nn, &x.sa);
  1879. bn = x.snd->val;
  1880. switch (bn) {
  1881. case 1:
  1882. strcpy(rn, "#IMPLODE");
  1883. break;
  1884. case 2:
  1885. strcpy(rn, "#EXPLODE");
  1886. break;
  1887. case 3:
  1888. strcpy(rn, "#ATOM");
  1889. break;
  1890. case 4:
  1891. strcpy(rn, "#NUMBER");
  1892. break;
  1893. case 5:
  1894. strcpy(rn, "#IDENT");
  1895. break;
  1896. case 6:
  1897. strcpy(rn, "#LIST");
  1898. break;
  1899. case 7:
  1900. strcpy(rn, "#TREE");
  1901. break;
  1902. case 8:
  1903. strcpy(rn, "#TATOM");
  1904. break;
  1905. case 9:
  1906. strcpy(rn, "#FATOM");
  1907. break;
  1908. case 10:
  1909. strcpy(rn, "#_KEYWORD");
  1910. break;
  1911. case 11:
  1912. strcpy(rn, "#_SPECDESC");
  1913. break;
  1914. case 12:
  1915. strcpy(rn, "#LEN");
  1916. break;
  1917. case 13:
  1918. strcpy(rn, "#_SPECATOM");
  1919. break;
  1920. case 14:
  1921. strcpy(rn, "#_RULENAME");
  1922. break;
  1923. case 15:
  1924. strcpy(rn, "#_VARNAME");
  1925. break;
  1926. case 16:
  1927. strcpy(rn, "#_RULETOATOM");
  1928. break;
  1929. case 17:
  1930. strcpy(rn, "#_VARNTOATOM");
  1931. break;
  1932. case 18:
  1933. strcpy(rn, "#_VARDESLOC");
  1934. break;
  1935. case 19:
  1936. strcpy(rn, "#DEBUG");
  1937. break;
  1938. case 20:
  1939. strcpy(rn, "#_SPECTODSC");
  1940. break;
  1941. case 21:
  1942. strcpy(rn, "#_CONTENT2");
  1943. break;
  1944. case 22:
  1945. strcpy(rn, "#CHR");
  1946. break;
  1947. case 23:
  1948. strcpy(rn, "#PARM");
  1949. break;
  1950. case 24:
  1951. strcpy(rn, "#_TOTATOM");
  1952. break;
  1953. case 25:
  1954. strcpy(rn, "#ORD");
  1955. break;
  1956. case 26:
  1957. strcpy(rn, "#CALL_PAS");
  1958. break;
  1959. }/* case */
  1960. if (out_screen)
  1961. fputs(rn, stdout);
  1962. else
  1963. fputs(rn, out);
  1964. } /* prblt */
  1965. Void srchrule(rd, pp)
  1966. long rd;
  1967. ptr_ *pp;
  1968. {
  1969. /*=================*/
  1970. /* rd w st-prostr. */
  1971. /*=================*/
  1972. /*(rd: a; (* adres deskriptora #l * )
  1973. (* w st-prostranstwe
  1974. var
  1975. pp: ptr (* ukaz. na sled. posle #l |l-t w spiske
  1976. programmy * ) ); */
  1977. /*====================================*/
  1978. /* poisk w spiske programmy |l-ta, */
  1979. /* sled. za #l. */
  1980. /* esli w deskriptore #l net ssylki */
  1981. /* na |tot |l-t, to wstawitx ee w */
  1982. /* deskriptor #l */
  1983. /*====================================*/
  1984. mpd x, z;
  1985. ptr_ y;
  1986. a v1, v, name;
  1987. ruledescriptor *WITH;
  1988. pointr(rd, &x.sa);
  1989. /* polu~itx deskriptor #l */
  1990. if (x.srd->fragmadr == 0) {
  1991. /* nuven poisk w spiske programmy */
  1992. name = x.srd->name;
  1993. v1 = x.srd->nomintab;
  1994. /* s-adres #l w sr-prostranstwe */
  1995. first(vs[0], &y);
  1996. /* y na na~alo spiska
  1997. programmy */
  1998. v = y.cel;
  1999. pointr(v, &z.sa);
  2000. while (z.srd->name != name) {
  2001. while (y.cel != 0)
  2002. next(&y);
  2003. next(&y);
  2004. v = y.cel;
  2005. pointr(v, &z.sa);
  2006. } /* #l najden */
  2007. next(&y);
  2008. /* y na "base prawila #l" */
  2009. /* zapisatx informaci` w deskriptor #l */
  2010. points(v1, &x.sa);
  2011. x.srd->fragmadr = y.UU.U1.curfragment;
  2012. x.srd->nomintab = y.nel;
  2013. } /* poisk */
  2014. else {
  2015. /* w deskriptore #l estx ssylka na spisok
  2016. programmy*/
  2017. v = x.srd->fragmadr;
  2018. pointr(v, &z.sa);
  2019. WITH = x.srd;
  2020. if (z.smld->dtype == listmain)
  2021. y.cel = z.smld->elt[WITH->nomintab - 1];
  2022. else
  2023. y.cel = z.sfld->elt[WITH->nomintab - 1];
  2024. y.ptrtype = ptrlist;
  2025. y.nel = WITH->nomintab;
  2026. y.UU.U1.curfragment = WITH->fragmadr;
  2027. }
  2028. *pp = y;
  2029. } /* srchrule */
  2030. Void srchrule1(rd, pp)
  2031. long rd;
  2032. ptr_ *pp;
  2033. {
  2034. /*=================*/
  2035. /* rd w sr-prostr. */
  2036. /*=================*/
  2037. /*(rd: a; (* adres deskriptora #l * )
  2038. (* w sr-prostranstwe * )
  2039. var pp: ptr (* ukaz. na sled.
  2040. posle #l |l-t w spiske
  2041. programmy * ) );
  2042. */
  2043. /*====================================*/
  2044. /* poisk w spiske programmy |l-ta, */
  2045. /* sled. za #l. */
  2046. /* esli w deskriptore #l net ssylki */
  2047. /* na |tot |l-t, to wstawitx ee w */
  2048. /* deskriptor #l */
  2049. /*====================================*/
  2050. mpd x, z;
  2051. ptr_ y;
  2052. a v, name;
  2053. ruledescriptor *WITH;
  2054. pointr(rd, &x.sa);
  2055. /* polu~itx deskriptor #l */
  2056. if (x.srd->fragmadr == 0) {
  2057. /* nuven poisk w spiske programmy */
  2058. name = x.srd->name;
  2059. first(vs[0], &y);
  2060. /* y na na~alo spiska
  2061. programmy */
  2062. v = y.cel;
  2063. pointr(v, &z.sa);
  2064. while (z.srd->name != name) {
  2065. while (y.cel != 0)
  2066. next(&y);
  2067. next(&y);
  2068. v = y.cel;
  2069. pointr(v, &z.sa);
  2070. } /* #l najden */
  2071. next(&y);
  2072. /* y na "base prawila #l" */
  2073. /* zapisatx informaci` w deskriptor #l */
  2074. points(rd, &x.sa);
  2075. x.srd->fragmadr = y.UU.U1.curfragment;
  2076. x.srd->nomintab = y.nel;
  2077. } /* poisk */
  2078. else {
  2079. /* w deskriptore #l estx ssylka na spisok
  2080. programmy*/
  2081. v = x.srd->fragmadr;
  2082. pointr(v, &z.sa);
  2083. WITH = x.srd;
  2084. if (z.smld->dtype == listmain)
  2085. y.cel = z.smld->elt[WITH->nomintab - 1];
  2086. else
  2087. y.cel = z.sfld->elt[WITH->nomintab - 1];
  2088. y.ptrtype = ptrlist;
  2089. y.nel = WITH->nomintab;
  2090. y.UU.U1.curfragment = WITH->fragmadr;
  2091. }
  2092. *pp = y;
  2093. } /* srchrule */
  2094. Void lastop()
  2095. {
  2096. /*================================================*/
  2097. /* whod: v[base -2] v[base -1] */
  2098. /* #l $e */
  2099. /* wyhod: zna~enie oswoboditx */
  2100. /* perem. $e */
  2101. /* */
  2102. /*================================================*/
  2103. ptr_ p;
  2104. mpd x;
  2105. a k;
  2106. srchrule(v[base - 3], &p);
  2107. /* p ukaz. na sled.posle #l |l-t w tabl.prawil*/
  2108. k = p.cel;
  2109. pointr(k, &x.sa);
  2110. /* polu~itx dostup k base poslednego wyzowa #l */
  2111. k = x.snd->val;
  2112. if (k >= 0) { /* change from x.snd^.sign=true 3-oct-89 */
  2113. pointr(v[base - 2], &x.sa);
  2114. /* polu~itx dostup k deskr.$e */
  2115. v[base - 3] = v[k + x.svd->location - 1];
  2116. } else
  2117. v[base - 3] = null_;
  2118. base--; /* osw.stek */
  2119. } /* lastop */
  2120. Static Void errstrmes(n, m)
  2121. long n;
  2122. Char *m;
  2123. {
  2124. Char STR2[130];
  2125. switch (n) {
  2126. case 1:
  2127. sprintf(m, "Interpreter stack size overflow (stack size = %d);",
  2128. varnum);
  2129. break;
  2130. case 2:
  2131. strcpy(m, "Assignment left side is not list or tree");
  2132. break;
  2133. case 3:
  2134. strcpy(m, "List index is not number");
  2135. break;
  2136. case 4:
  2137. strcpy(m, "Using [..] not for list");
  2138. break;
  2139. case 5:
  2140. strcpy(m, "Index value exceeds list bounds");
  2141. break;
  2142. case 6:
  2143. strcpy(m, "Not list or tree after \"::\"");
  2144. break;
  2145. case 7:
  2146. strcpy(m, "Not atomic name before \"::\"");
  2147. break;
  2148. case 8:
  2149. strcpy(m, "NULL in left side of assignment");
  2150. break;
  2151. case 9:
  2152. strcpy(m, "Not numerical value in left side of \"+:=\" statement");
  2153. break;
  2154. case 10:
  2155. strcpy(m, "Not numerical value in right side of \"+:=\" statement");
  2156. break;
  2157. case 11:
  2158. strcpy(m, "File specification is not atom");
  2159. break;
  2160. case 12:
  2161. strcpy(m, "Too long file specification");
  2162. break;
  2163. case 13:
  2164. strcpy(m, "Too much open text files");
  2165. break;
  2166. case 14:
  2167. strcpy(m, "File not open for output");
  2168. break;
  2169. case 15:
  2170. strcpy(m, "Wrong file name in SAVE statement ");
  2171. break;
  2172. case 16:
  2173. strcpy(m, "File was not closed before new opening");
  2174. break;
  2175. case 17:
  2176. strcpy(m, "Atom length exceeds file record length");
  2177. break;
  2178. case 18:
  2179. strcpy(m, "Not exist file in LOAD statement ");
  2180. break;
  2181. case 19:
  2182. strcpy(m, "Wrong file name in OPEN statement ");
  2183. break;
  2184. case 21:
  2185. strcpy(m, "Selector after \".\" is not identifier ");
  2186. break;
  2187. case 22:
  2188. strcpy(m, "Selector in tree constructor is not identifier ");
  2189. break;
  2190. case 23:
  2191. strcpy(m, "Not tree before \".\" operation ");
  2192. break;
  2193. case 24:
  2194. strcpy(m, "Not tree or list as base of FORALL-IN statement ");
  2195. break;
  2196. case 25:
  2197. strcpy(m, "Atom length more than 80 bytes in #IMPLODE ");
  2198. break;
  2199. case 26:
  2200. strcpy(m, "\"BRANCHES\" option cannot be used for lists ");
  2201. break;
  2202. default:
  2203. strcpy(m, "Unknown error");
  2204. break;
  2205. }
  2206. }
  2207. Void err(n)
  2208. long n;
  2209. {
  2210. /* kod o{ibki */
  2211. string80 m, STR1;
  2212. Char STR2[174];
  2213. errstrmes(n, m);
  2214. sprintf(m, "*** ERROR %s %s", long_to_str(STR1, n), strcpy(STR2, m));
  2215. if (out_open)
  2216. fprintf(out, "%s\n", m);
  2217. puts(m);
  2218. } /* err */
  2219. Void errstr(n, s)
  2220. long n;
  2221. Char *s;
  2222. {
  2223. /* kod o{ibki */
  2224. string80 m, STR1;
  2225. Char STR3[254];
  2226. errstrmes(n, m);
  2227. sprintf(m, "*** ERROR %s %s%s", long_to_str(STR1, n), strcpy(STR3, m), s);
  2228. if (out_open)
  2229. fprintf(out, "%s\n", m);
  2230. puts(m);
  2231. } /* err */
  2232. Void getval(m)
  2233. long *m;
  2234. {
  2235. /* ssylka na perem.ili obxekt */
  2236. /*========================================*/
  2237. /* esli m -peremennaq, to w m pomestitx */
  2238. /* ssylku na ee zna~enie */
  2239. /* */
  2240. /*========================================*/
  2241. mpd x;
  2242. if (((*m) & 511) == 0 && *m < 65535L && *m >= 0)
  2243. return;
  2244. pointr(*m, &x.sa);
  2245. if (((1L << ((long)x.svd->dtype)) &
  2246. ((1L << ((long)fvariable + 1)) - (1L << ((long)variable)))) != 0 &&
  2247. !x.svd->guard)
  2248. *m = v[mybase + x.svd->location - 1];
  2249. }
  2250. /* End. */