nef2.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792
  1. #include "globrig.h"
  2. #include "define.h"
  3. #include "defpage.h"
  4. #include "ley.h"
  5. #include "nef2.h"
  6. /***************** nef2.inc ***************/
  7. extern Void next PP((ptr_ *p));
  8. extern boolean eqatoms PP((long p1, long p2));
  9. extern Void first PP((long p, ptr_ *pp));
  10. extern Void lconc PP((long *a1, long a2));
  11. /* add an element*/
  12. extern Void crlst PP((long *l));
  13. /* s-adr. added element */
  14. /* s- adr. new fragment */
  15. extern Void crlistfr PP((long el, long *f));
  16. extern Void crtree PP((long *t));
  17. /* make empty tree */
  18. /* s-address of new tree fragment */
  19. extern Void crtreefr PP((long sel, long ob, long *frag));
  20. /* where to change */
  21. /* change to adr */
  22. extern Void changeel PP((ptr_ *pp, long adr));
  23. /* input - s-address */
  24. /* output:long integer value */
  25. extern boolean plnum PP((long sval, long *intval));
  26. /* input - any number */
  27. extern Void mknumb PP((long n, long *r));
  28. /* output - new descriptor (number) */
  29. /* s-address of main tree descr*/
  30. /* selector, a-address */
  31. /* object*/
  32. extern Void addel3 PP((long *tr_, long sel, long ob));
  33. /* 1-st tree */
  34. /* 2-nd tree */
  35. extern Void addtre PP((long *m, long t2));
  36. extern boolean compatom PP((long op, long adr1, long adr2));
  37. extern double take_fatom PP((long a1));
  38. Void next(p)
  39. ptr_ *p;
  40. {
  41. /* refers to list/tree element */
  42. /*=======================================*/
  43. /* moves reference to next element , */
  44. /* if no more elements then */
  45. /* p.nel = 0 */
  46. /*=======================================*/
  47. mpd x;
  48. a y, a1;
  49. if (p->nel != 0) {
  50. switch (p->ptrtype) {
  51. case ptrlist:
  52. a1 = p->UU.U1.curfragment;
  53. pointr(a1, &x.sa); /* access fragment */
  54. switch (x.smld->dtype) {
  55. case listmain:
  56. if (p->nel < x.smld->elnum) { /* may stay in this descriptor */
  57. p->nel++;
  58. p->cel = x.smld->elt[p->nel - 1];
  59. } else {
  60. /* to next deskriptor */
  61. y = x.smld->next;
  62. if (y == 0) { /* end of list */
  63. p->nel = 0;
  64. p->cel = 0;
  65. } else {
  66. pointr(y, &x.sa);
  67. p->nel = 1;
  68. p->cel = x.sfld->elt[0];
  69. p->UU.U1.curfragment = y;
  70. }
  71. }
  72. break;
  73. case listfragm:
  74. if (p->nel < x.sfld->elnum) { /* may stay here */
  75. p->nel++;
  76. p->cel = x.sfld->elt[p->nel - 1];
  77. } else {
  78. do {
  79. y = x.sfld->next;
  80. /* go next */
  81. if (y == 0) { /* end of list */
  82. p->nel = 0;
  83. p->cel = 0;
  84. } else {
  85. pointr(y, &x.sa);
  86. if (x.sfld->elnum > 0) {
  87. p->nel = 1;
  88. p->cel = x.sfld->elt[0];
  89. p->UU.U1.curfragment = y;
  90. goto _L99;
  91. }
  92. }
  93. } while (x.sfld->next != 0); /* next.deskr. */
  94. }
  95. break;
  96. default:
  97. printf(" Internal error (NEXT-1)\n");
  98. break;
  99. }/* case */
  100. break;
  101. /* ptrlist */
  102. case ptrtree: /*------ tree --------*/
  103. a1 = p->UU.U1.curfragment;
  104. pointr(a1, &x.sa); /* access to fragment */
  105. switch (x.smtd->dtype) {
  106. case treemain:
  107. if (p->nel < x.smtd->arcnum) { /* may stay here */
  108. p->nel++;
  109. p->cel = x.smtd->arc[p->nel - 1].elt;
  110. p->UU.U1.arc = x.smtd->arc[p->nel - 1].arcname;
  111. } else {
  112. /* go to next descriptor */
  113. y = x.smtd->next;
  114. if (y == 0) { /* end of tree */
  115. p->nel = 0;
  116. p->cel = 0;
  117. } else {
  118. pointr(y, &x.sa);
  119. while (x.sftd->next != 0 && x.sftd->arcnum == 0) {
  120. y = x.sftd->next;
  121. pointr(y, &x.sa);
  122. }
  123. if (x.sftd->arcnum > 0) {
  124. p->nel = 1;
  125. p->cel = x.sftd->arc[0].elt;
  126. p->UU.U1.arc = x.sftd->arc[0].arcname;
  127. p->UU.U1.curfragment = y;
  128. } else {
  129. p->cel = 0;
  130. p->nel = 0;
  131. }
  132. }
  133. }
  134. break;
  135. case treefragm:
  136. if (p->nel < x.sftd->arcnum) { /* may stay here */
  137. p->nel++;
  138. p->cel = x.sftd->arc[p->nel - 1].elt;
  139. p->UU.U1.arc = x.sftd->arc[p->nel - 1].arcname;
  140. } else {
  141. do {
  142. y = x.sftd->next;
  143. /* go to next */
  144. if (y == 0) { /* end of tree */
  145. p->nel = 0;
  146. p->cel = 0;
  147. } else {
  148. pointr(y, &x.sa);
  149. while (x.sftd->next != 0 && x.sftd->arcnum == 0) {
  150. y = x.sftd->next;
  151. pointr(y, &x.sa);
  152. }
  153. if (x.sftd->arcnum > 0) {
  154. p->nel = 1;
  155. p->cel = x.sftd->arc[0].elt;
  156. p->UU.U1.arc = x.sftd->arc[0].arcname;
  157. p->UU.U1.curfragment = y;
  158. goto _L99;
  159. }
  160. p->cel = 0;
  161. p->nel = 0;
  162. } /*else */
  163. } while (x.sftd->next != 0); /* else */
  164. }
  165. break;
  166. default:
  167. printf(" Internal error NEXT-2\n");
  168. break;
  169. }/* case */
  170. break;
  171. /* ptrtree */
  172. case packedlist:
  173. /* ---- list built-in in ptr ---------- */
  174. if (p->nel == p->plistsize) {
  175. p->nel = 0;
  176. p->cel = null_;
  177. } else {
  178. p->nel++;
  179. /* nel <= plistsize <= 4 */
  180. p->cel = p->UU.plistelt[p->nel - 2];
  181. }
  182. break;
  183. default:
  184. printf(" Internal error NEXT-3 \n");
  185. break;
  186. }/* big case */
  187. }
  188. _L99: ; /*exit*/
  189. } /* next */
  190. boolean eqatoms(p1, p2)
  191. long p1, p2;
  192. {
  193. /* atom address */
  194. /* atom address */
  195. /*===================================*/
  196. /* equivalence of two atoms */
  197. /*===================================*/
  198. mpd s1, s2;
  199. if (p1 == p2)
  200. return true;
  201. else if (p1 != 0) {
  202. pointr(p1, &s1.sa);
  203. if (p2 != 0) {
  204. pointr(p2, &s2.sa);
  205. return (!memcmp(s1.sc8, s2.sc8, sizeof(atomdescriptor)) ||
  206. (((1L << ((long)s1.sad->dtype)) &
  207. (((1L << ((long)keyword + 1)) - (1L << ((long)atom))) |
  208. (1L << ((long)fatom)))) !=
  209. 0 &&
  210. ((1L << ((long)s2.sad->dtype)) &
  211. (((1L << ((long)keyword + 1)) - (1L << ((long)atom))) |
  212. (1L << ((long)fatom)))) !=
  213. 0 &&
  214. s1.sad->name == s2.sad->name) ||
  215. (s1.sad->dtype == tatom &&
  216. s2.sad->dtype == tatom &&
  217. s1.sad->name == s2.sad->name) ||
  218. (s1.sad->dtype == number &&
  219. s2.sad->dtype == number &&
  220. s1.snd->val == s2.snd->val));
  221. /* p2c: nef2.z, line 710: Note:
  222. * Line breaker spent 0.9+0.49 seconds, 5000 tries on line 811 [251] */
  223. /* added 20-jul-1989 in pc/at */
  224. } else /* p2 = 0 */
  225. return (s1.smld->totalelnum == 0);
  226. } else if (p2 != 0) {
  227. pointr(p2, &s2.sa);
  228. return (s2.smld->totalelnum == 0);
  229. } else
  230. return true;
  231. /* p1 = 0 */
  232. } /* eqatoms */
  233. Void first(p, pp)
  234. long p;
  235. ptr_ *pp;
  236. {
  237. /* address of main descriptor of tree/list */
  238. /* result */
  239. /*=======================================*/
  240. /* sets first element of tree or list to pp */
  241. /* if p=null then pp.nel = 0 */
  242. /*=======================================*/
  243. mpd x;
  244. a y;
  245. pp->ptrtype = ptrlist;
  246. if (p == null_) {
  247. pp->nel = 0;
  248. pp->cel = 0;
  249. } else { /*1*/
  250. pointr(p, &x.sa);
  251. if (x.smld->dtype == listmain)
  252. pp->ptrtype = ptrlist;
  253. else
  254. pp->ptrtype = ptrtree;
  255. switch (pp->ptrtype) {
  256. case ptrlist:
  257. /*----------- for lists -----------------*/
  258. if (x.smld->totalelnum == 0) { /* empty list */
  259. pp->nel = 0;
  260. pp->cel = 0;
  261. } /*2*/
  262. else { /*2*/
  263. pp->nel = 1;
  264. pp->cel = x.smld->elt[0];
  265. pp->UU.U1.curfragment = p;
  266. } /*2*/
  267. /*2*/
  268. break;
  269. case ptrtree:
  270. /*----------- for trees -----------------*/
  271. if (x.smtd->totalarcnum == 0) { /* empty tree */
  272. pp->nel = 0;
  273. pp->cel = 0;
  274. } else { /*2*/
  275. if (x.smtd->arcnum != 0) {
  276. pp->nel = 1;
  277. pp->cel = x.smtd->arc[0].elt;
  278. pp->UU.U1.arc = x.smtd->arc[0].arcname;
  279. pp->UU.U1.curfragment = p;
  280. } else {
  281. while (x.sftd->next != 0 && x.sftd->arcnum == 0) {
  282. y = x.sftd->next;
  283. pointr(y, &x.sa);
  284. }
  285. pp->nel = 1;
  286. pp->cel = x.sftd->arc[0].elt;
  287. pp->UU.U1.arc = x.sftd->arc[0].arcname;
  288. pp->UU.U1.curfragment = y;
  289. }
  290. } /*2*/
  291. break;
  292. default:
  293. printf("Internal FIRST error (not agregate)\n");
  294. break;
  295. }/* case */
  296. } /*1*/
  297. pp->UU.U1.mainadr = p;
  298. } /* first */
  299. Void crlst(l)
  300. long *l;
  301. {
  302. /* sozdatx pustoj spisok */
  303. mpd x;
  304. gets5(l, &x.sa);
  305. x.smld->dtype = listmain;
  306. x.smld->lastfragm = *l;
  307. } /* crlst */
  308. Void crlistfr(el, f)
  309. long el, *f;
  310. {
  311. /* s-adr. dob.|l-ta */
  312. /* s- adr.sozdannogo fragmenta */
  313. /*========================================*/
  314. /* sozdaet nowyj deskriptor fragmenta */
  315. /* spiska i dobawlqet tuda el */
  316. /*========================================*/
  317. mpd y;
  318. fragmlistdescriptor *WITH;
  319. gets5(f, &y.sa);
  320. WITH = y.sfld;
  321. WITH->dtype = listfragm;
  322. WITH->elnum = 1;
  323. WITH->elt[0] = el;
  324. } /* crlistfr */
  325. Void crtree(t)
  326. long *t;
  327. {
  328. /* make empty tree */
  329. mpd x;
  330. gets5(t, &x.sa);
  331. x.smtd->dtype = treemain;
  332. } /* creatree */
  333. Void crtreefr(sel, ob, frag)
  334. long sel, ob, *frag;
  335. {
  336. /* s-address of new tree fragment */
  337. /*===========================================*/
  338. /* makes new fragment of tree and adds */
  339. /* to him an element */
  340. /*===========================================*/
  341. mpd y;
  342. fragmtreedescriptor *WITH;
  343. gets5(frag, &y.sa);
  344. WITH = y.sftd; /* with */
  345. WITH->dtype = treefragm;
  346. WITH->arcnum = 1;
  347. WITH->arc[0].arcname = sel;
  348. WITH->arc[0].elt = ob;
  349. } /* crtreefr */
  350. Void lconc(a1, a2)
  351. long *a1, a2;
  352. {
  353. /*==========================*/
  354. /* a1 - mainlist, */
  355. /* a2 - l`boj obxekt */
  356. /* ( a1 !. a2 ) --> a1 */
  357. /*==========================*/
  358. /* wyhod */
  359. a l; /* s-nomer glawn.deskr.spiska */
  360. a m;
  361. mpd x, y, z;
  362. mainlistdescriptor *WITH;
  363. fragmlistdescriptor *WITH1;
  364. if (*a1 == null_) {
  365. /* creates empty list */
  366. gets5(&l, &x.sa);
  367. x.smld->dtype = listmain;
  368. x.smld->lastfragm = l;
  369. } else {
  370. l = *a1;
  371. points(l, &x.sa);
  372. }
  373. /* fi */
  374. WITH = x.smld;
  375. if (WITH->dtype != listmain) {
  376. l = null_;
  377. goto _L1;
  378. }
  379. WITH->totalelnum++;
  380. if (WITH->lastfragm == l) { /* ends on the same first descriptor */
  381. if (WITH->elnum == mainlistelnum) {
  382. gets5(&m, &y.sa);
  383. WITH1 = y.sfld;
  384. WITH1->dtype = listfragm;
  385. WITH1->elnum = 1;
  386. WITH1->elt[0] = a2;
  387. WITH->lastfragm = m;
  388. WITH->next = m;
  389. } else {
  390. WITH->elnum++;
  391. WITH->elt[WITH->elnum - 1] = a2;
  392. }
  393. } else {
  394. points(WITH->lastfragm, &z.sa);
  395. if (z.sfld->elnum == fragmlistelnum) {
  396. gets5(&m, &y.sa);
  397. WITH1 = y.sfld;
  398. WITH1->dtype = listfragm;
  399. WITH1->elnum = 1;
  400. WITH1->elt[0] = a2;
  401. z.sfld->next = m;
  402. points(l, &x.sa);
  403. WITH->lastfragm = m;
  404. } else {
  405. /* using with is danger here */
  406. z.sfld->elnum++;
  407. z.sfld->elt[z.sfld->elnum - 1] = a2;
  408. }
  409. }
  410. _L1:
  411. *a1 = l; /* nuvno, esli l sozdaw.zanowo */
  412. } /* lconc */
  413. Void changeel(pp, adr)
  414. ptr_ *pp;
  415. long adr;
  416. {
  417. /* where to change */
  418. /* change to adr */
  419. /* changes one element of list */
  420. mpd x;
  421. a a1;
  422. if (pp->ptrtype != ptrlist) {
  423. printf(" Internal error (Changeel) ");
  424. return;
  425. }
  426. a1 = pp->UU.U1.curfragment;
  427. points(a1, &x.sa);
  428. if (x.sfld->dtype == listfragm)
  429. x.sfld->elt[pp->nel - 1] = adr;
  430. else
  431. x.smld->elt[pp->nel - 1] = adr;
  432. pp->cel = adr;
  433. }
  434. boolean plnum(sval, intval)
  435. long sval, *intval;
  436. {
  437. /* input - s-address*/
  438. /* output:long integer value */
  439. /* returns integer if it is list parameter; */
  440. mpd x;
  441. if (sval == 0)
  442. return false;
  443. else {
  444. pointr(sval, &x.sa); /* access to atom in memory */
  445. if (x.snd->dtype != number)
  446. return false;
  447. else {
  448. *intval = x.snd->val; /* access to number */
  449. return true;
  450. }
  451. }
  452. } /*plnum*/
  453. Void mknumb(n, r)
  454. long n, *r;
  455. {
  456. mpd x;
  457. numberdescriptor *WITH;
  458. gets1(r, &x.sa);
  459. WITH = x.snd; /* with */
  460. WITH->dtype = number;
  461. WITH->val = n;
  462. } /* mknumb */
  463. Void addel3(tr_, sel, ob)
  464. long *tr_, sel, ob;
  465. {
  466. /* s-address of main tree descr*/
  467. /* selector, a-address */
  468. /* object*/
  469. /*===============================*/
  470. /* add element to tree */
  471. /* tr := tr ++ <. sel : ob .> */
  472. /*===============================*/
  473. /* wyhod s tr:=l */
  474. /* wyhod bez tr:=l */
  475. a l; /* s-adres glawnogo derewa */
  476. mpd x; /* dostup k glawnomu deskr.derewa */
  477. mpd y;
  478. a n, npred;
  479. long i;
  480. maintreedescriptor *WITH;
  481. long FORLIM;
  482. fragmtreedescriptor *WITH1;
  483. if (*tr_ == null_) /* sozdatx pustoe derewo */
  484. crtree(&l);
  485. else
  486. l = *tr_;
  487. pointr(l, &x.sa);
  488. /* dostup k glawn.fragmentu */
  489. if (x.smtd->dtype != treemain) { /* tr ne derewo */
  490. l = null_;
  491. goto _L1;
  492. }
  493. if (ob == null_) /* ni~ego ne menqem */
  494. goto _L2;
  495. if (x.smtd->totalarcnum == 0) {
  496. points(l, &x.sa);
  497. WITH = x.smtd; /* with */
  498. WITH->totalarcnum = 1;
  499. WITH->arcnum = 1;
  500. WITH->arc[0].arcname = sel;
  501. WITH->arc[0].elt = ob;
  502. goto _L1;
  503. }
  504. WITH = x.smtd; /* with */
  505. FORLIM = WITH->arcnum;
  506. /*======================*/
  507. /* poisk sel w l */
  508. /*======================*/
  509. for (i = 0; i < FORLIM; i++) {
  510. if (WITH->arc[i].arcname == sel) {
  511. points(l, &y.sa);
  512. y.smtd->arc[i].elt = ob;
  513. goto _L1;
  514. }
  515. }
  516. npred = l;
  517. n = WITH->next;
  518. /* prodolvaem poisk w fragmentah */
  519. while (n != null_) {
  520. pointr(n, &y.sa);
  521. WITH1 = y.sftd;
  522. /* with */
  523. FORLIM = WITH1->arcnum;
  524. for (i = 0; i < FORLIM; i++) {
  525. if (WITH1->arc[i].arcname == sel) {
  526. points(n, &y.sa);
  527. y.sftd->arc[i].elt = ob;
  528. goto _L1;
  529. }
  530. }
  531. npred = n;
  532. n = WITH1->next;
  533. } /* while */
  534. /*========================================*/
  535. /* |l-ta w tr net. */
  536. /* w npred s-adres poslednego fragmenta , */
  537. /* nuvno dobawitx |l-t w konce */
  538. /*========================================*/
  539. points(l, &x.sa);
  540. WITH = x.smtd; /* with */
  541. WITH->totalarcnum++;
  542. if (WITH->arcnum != maintreearcnum) {
  543. /* dobawim tut-ve */
  544. WITH->arcnum++;
  545. WITH->arc[WITH->arcnum - 1].arcname = sel;
  546. WITH->arc[WITH->arcnum - 1].elt = ob;
  547. goto _L1;
  548. }
  549. if (WITH->next == null_) {
  550. /*===========================================*/
  551. /* pricepim nowyj fragment k glawnomu fragm. */
  552. /* i pomestim tuda |l-t */
  553. /*===========================================*/
  554. crtreefr(sel, ob, &n);
  555. WITH->next = n;
  556. goto _L1;
  557. }
  558. /* dobawlqem |l-t w ne glawnom fragmente */
  559. points(npred, &x.sa);
  560. WITH1 = x.sftd; /* with */
  561. if (WITH1->arcnum != fragmtreearcnum) {
  562. /* dobawim tut-ve */
  563. WITH1->arcnum++;
  564. WITH1->arc[WITH1->arcnum - 1].arcname = sel;
  565. WITH1->arc[WITH1->arcnum - 1].elt = ob;
  566. } else { /* pricepim nowyj fragment */
  567. crtreefr(sel, ob, &n);
  568. WITH1->next = n;
  569. }
  570. _L1:
  571. *tr_ = l;
  572. _L2: ;
  573. } /* addel */
  574. Void addtre(m, t2)
  575. long *m, t2;
  576. {
  577. /* 1-st tree */
  578. /* 2-nd tree */
  579. /*==============*/
  580. /* m ++:= t2 */
  581. /*==============*/
  582. /* wyhod */
  583. mpd x;
  584. long i;
  585. a n;
  586. maintreedescriptor mx;
  587. fragmtreedescriptor fx;
  588. if (t2 == null_)
  589. goto _L1;
  590. pointr(t2, &x.sa);
  591. if (x.smtd->dtype != treemain) {
  592. *m = null_;
  593. goto _L1;
  594. }
  595. /* cikl po t2, prisoedinqem |l-ty po odnomu */
  596. mx = *x.smtd;
  597. for (i = 0; i < mx.arcnum; i++)
  598. addel3(m, mx.arc[i].arcname, mx.arc[i].elt);
  599. n = mx.next; /* with */
  600. /* prodolvaem w fragmentah */
  601. while (n != null_) {
  602. pointr(n, &x.sa);
  603. fx = *x.sftd;
  604. for (i = 0; i < fx.arcnum; i++)
  605. addel3(m, fx.arc[i].arcname, fx.arc[i].elt);
  606. n = fx.next; /* with */
  607. } /* while */
  608. _L1: ;
  609. } /* addtre */
  610. boolean compatom(op, adr1, adr2)
  611. long op, adr1, adr2;
  612. {
  613. /* op in 1..4 1 < 2 <= 3 > 4 >=
  614. compares valid a-adresses of two valid atoms of types
  615. atom idatom keyword tatom */
  616. bl80 a1, a2;
  617. long i, l1, l2;
  618. if (adr1 == adr2)
  619. return (op == 2 || op == 4);
  620. else {
  621. pointa(adr1, a1, &l1);
  622. pointa(adr2, a2, &l2);
  623. i = 1;
  624. _L1:
  625. if (i > l1)
  626. return (op <= 2);
  627. else if (i > l2)
  628. return (op >= 3);
  629. else if (a1[i - 1] > a2[i - 1])
  630. return (op >= 3);
  631. else if (a1[i - 1] < a2[i - 1])
  632. return (op <= 2);
  633. else {
  634. i++;
  635. goto _L1;
  636. }
  637. }
  638. }
  639. double take_fatom(a1)
  640. long a1;
  641. {
  642. bl80 a80_;
  643. long j;
  644. double *rre;
  645. pointa(a1, a80_, &j);
  646. rre = (double *)a80_;
  647. return (*rre);
  648. }
  649. /* End. */