Nife version Beta
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

1615 lines
38 KiB

  1. /* Copyright (C) 2011-2014 Patrick H. E. Foubet - S.E.R.I.A.N.E.
  2. This program is free software: you can redistribute it and/or modify
  3. it under the terms of the GNU General Public License as published by
  4. the Free Software Foundation, either version 3 of the License, or any
  5. later version.
  6. This program is distributed in the hope that it will be useful,
  7. but WITHOUT ANY WARRANTY; without even the implied warranty of
  8. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  9. GNU General Public License for more details.
  10. You should have received a copy of the GNU General Public License
  11. along with this program. If not, see <http://www.gnu.org/licenses/>
  12. *******************************************************************/
  13. /* stackF.c */
  14. #include "conf.h"
  15. #include <stdio.h>
  16. #include <stdlib.h>
  17. #include <string.h>
  18. #include <strings.h>
  19. #include "nife.h"
  20. #include "mth.h"
  21. #include "err.h"
  22. #include "lib.h"
  23. #include "stackF.h"
  24. #include "stackN.h"
  25. #include "stackC.h"
  26. #include "stackL.h"
  27. #include "stackV.h"
  28. #include "tasks.h"
  29. #define MAXCODE 2048
  30. int FctInTask=0;
  31. static void * stackF = VIDE;
  32. struct Fct {
  33. char *l; /* libelle */
  34. void *n; /* next */
  35. void *c; /* code */
  36. short typ; /* type : 0 std, 1 sys in compilation, 2 sys terminated */
  37. };
  38. void initFct(char *Lib, int typ)
  39. {
  40. void * M, *L;
  41. struct Fct * N;
  42. if ((M = malloc(sizeof(struct Fct))) == NULL) stopErr("initFct","malloc");
  43. if ((L = malloc(strlen(Lib)+1)) == NULL) stopErr("initFct","malloc");
  44. strcpy((char*)L,Lib);
  45. N = (struct Fct*)M;
  46. N->l = (char*)L;
  47. N->n = stackF;
  48. N->c = VIDE;
  49. N->typ = typ;
  50. stackF = M;
  51. }
  52. static void eraseFct(struct Fct *F)
  53. {
  54. int i,n;
  55. char *C, *E;
  56. void *A, *W;
  57. struct Fct *FD;
  58. /* printf("eraseFct(%s) at 0x%lx\n", F->l, (long)F); */
  59. free((void*)F->l);
  60. /* free associates memories */
  61. if (F->c != VIDE) {
  62. A = F->c;
  63. n = sizeof(A);
  64. i = *(int*)A;
  65. C = (char*)A+(3*sizeof(int));
  66. E = C+i;
  67. while (C < E) {
  68. switch((Code)*C) {
  69. case T_CHA :
  70. case T_CHAS :
  71. case T_NUM :
  72. case T_BKC :
  73. case T_BKC1 :
  74. bcopy((void*)(C+1),(void*)&W,n);
  75. free(W);
  76. break;
  77. case T_FCTD :
  78. case T_FCTDS :
  79. case T_FCTDW :
  80. case T_FCTDWS :
  81. bcopy((void*)(C+1),(void*)&W,n);
  82. FD = (struct Fct*)W;
  83. eraseFct(FD);
  84. break;
  85. default:
  86. break;
  87. }
  88. C+= n+1;
  89. }
  90. free(A);
  91. }
  92. free((void*)F);
  93. }
  94. void updDynFct(void *AF, int M) /* M:0=init, 1=start, 2=stop */
  95. {
  96. int i,n;
  97. char *C, *E;
  98. void *A, *W;
  99. struct Fct *F, *FD;
  100. if (AF == VIDE) return;
  101. F = (struct Fct *)AF;
  102. /* printf("updDynFct(%s) at 0x%lx\n", F->l, (long)F); */
  103. if (F->c == VIDE) return;
  104. A = F->c;
  105. n = sizeof(A);
  106. i = *(int*)A;
  107. C = (char*)A+(3*sizeof(int));
  108. E = C+i;
  109. switch(M) {
  110. case 0 : /* init */
  111. while (C < E) {
  112. switch((Code)*C) {
  113. case T_CHAS :
  114. *C=T_CHA;
  115. break;
  116. case T_VARS :
  117. *C=T_VAR;
  118. break;
  119. case T_EXEKS :
  120. *C=T_EXEK;
  121. break;
  122. case T_FCTD :
  123. case T_FCTDS :
  124. case T_FCTDW :
  125. case T_FCTDWS :
  126. *C=T_EXEK;
  127. bcopy((void*)(C+1),(void*)&W,n);
  128. FD = (struct Fct*)W;
  129. eraseFct(FD);
  130. break;
  131. default:
  132. break;
  133. }
  134. C+= n+1;
  135. }
  136. break;
  137. case 1 : /* start */
  138. while (C < E) {
  139. switch((Code)*C) {
  140. case T_FCTDS :
  141. *C=T_FCTD;
  142. break;
  143. case T_FCTDWS :
  144. *C=T_FCTDW;
  145. break;
  146. default:
  147. break;
  148. }
  149. C+= n+1;
  150. }
  151. break;
  152. case 2 : /* stop */
  153. while (C < E) {
  154. switch((Code)*C) {
  155. case T_EXEK :
  156. *C=T_EXEKS;
  157. break;
  158. case T_FCTD :
  159. *C=T_FCTDS;
  160. break;
  161. case T_FCTDW :
  162. *C=T_FCTDWS;
  163. break;
  164. default:
  165. break;
  166. }
  167. C+= n+1;
  168. }
  169. break;
  170. default:
  171. break;
  172. }
  173. }
  174. void rmLastFct(void)
  175. {
  176. struct Fct *Elt;
  177. if (stackF != VIDE) {
  178. Elt = (struct Fct *)stackF;
  179. if (Elt->typ==2) return;
  180. stackF = Elt->n;
  181. eraseFct(Elt);
  182. } else messErr(7);
  183. }
  184. static void unlinkLastFct(void)
  185. {
  186. struct Fct *Elt;
  187. if (stackF != VIDE) {
  188. Elt = (struct Fct *)stackF;
  189. stackF = Elt->n;
  190. }
  191. }
  192. struct Fct *putCodeFct(void* C)
  193. {
  194. struct Fct *Elt;
  195. if (stackF != VIDE) {
  196. Elt = (struct Fct *)stackF;
  197. if (Elt->c == VIDE) Elt->c = C;
  198. else messErr(8);
  199. }
  200. else messErr(7);
  201. return Elt;
  202. }
  203. void IF_show_stackF(void)
  204. {
  205. void * Next;
  206. struct Fct * N;
  207. char Ctyp;
  208. Next = stackF;
  209. while (Next != VIDE) {
  210. N = (struct Fct*) Next;
  211. if (N->typ) Ctyp='S'; else Ctyp=' ';
  212. printf(" %-25s%c %d octets\n",N->l,Ctyp,*((int*)N->c));
  213. Next = N->n;
  214. }
  215. printf("<end of functions stack>\n");
  216. }
  217. static char cod[MAXCODE];
  218. static int i_cod;
  219. /* pile pour IF ELSE THEN */
  220. static int i_adr;
  221. static void * adr[MAXCODE/4];
  222. static char tad[MAXCODE/4];
  223. /* pile pour BEGIN ... WHILE ... REPEAT / BEGIN ... AGAIN / BEGIN ... UNTIL */
  224. static int i_adB;
  225. static int adB[MAXCODE/4];
  226. static char tcB[MAXCODE/4];
  227. /* pile pour DO ... LOOP / +LOOP */
  228. static int i_adD;
  229. static int adD[MAXCODE/4];
  230. static char tcD[MAXCODE/4];
  231. /* pour l'execution */
  232. static int I_DO=-1;
  233. static char S_DO[MAXCODE/4];
  234. static long D_DO[MAXCODE/4], L_DO[MAXCODE/4];
  235. void IF_nDO (void)
  236. {
  237. putLong((long long)(I_DO+1));
  238. }
  239. static void IF_getIndDo(int v)
  240. {
  241. int i = I_DO - v;
  242. if (i<0) putLong((long long)0);
  243. else putLong((long long)D_DO[i]);
  244. }
  245. int tadExist(Code c)
  246. {
  247. int i=0;
  248. while (i<i_adr) {
  249. if (tad[i] == c) return 1;
  250. i++;
  251. }
  252. return 0;
  253. }
  254. void IF_finFct(void)
  255. {
  256. void * M;
  257. struct Fct * F;
  258. int i,l, *ea, *Ea;
  259. if ((M = malloc((3*sizeof(int))+i_cod)) == NULL)
  260. stopErr("IF_finFct","malloc");
  261. ea = (int*)M;
  262. *ea++ = i_cod;
  263. *ea=0;
  264. Ea=ea+1;
  265. *Ea=0;
  266. /* on remplace tous les MYSELF */
  267. l = sizeof(M);
  268. for (i=0; i<i_cod; i+=(l+1)) {
  269. if (cod[i]==T_MYSF) {
  270. cod[i] = T_FCT;
  271. bcopy((void*)&M,(void*)&cod[i+1],l);
  272. } else {
  273. if (cod[i]==T_ONER) {
  274. if (*ea==0) *ea = i;
  275. else {
  276. messErr(46);
  277. return;
  278. }
  279. } else {
  280. if (cod[i]==T_END) {
  281. if (*Ea==0) *Ea = i;
  282. else {
  283. messErr(47);
  284. return;
  285. }
  286. }
  287. }
  288. }
  289. }
  290. bcopy((void*)cod,(void*)((char*)M+(3*sizeof(int))),i_cod);
  291. F=putCodeFct(M);
  292. if (F->typ) {
  293. F->typ=2;
  294. addFonU(F->l,M);
  295. }
  296. /* printf("Total Fct : %d + %d !\n",i_cod,(3*sizeof(int))); */
  297. _MODIF_fctEnCours_(0);
  298. }
  299. void makeFct(Code c,void *A)
  300. {
  301. int d,i;
  302. long L, L2, LE;
  303. d = sizeof(A);
  304. /* printf("makeFct Entree : code %d + %d\n",(int)c,i_cod); */
  305. switch(c) {
  306. case T_RET :
  307. case T_NUM :
  308. case T_CHA :
  309. case T_LIB :
  310. case T_FCT :
  311. case T_MYSF :
  312. case T_DO_I :
  313. case T_DO_J :
  314. case T_DO_K :
  315. case T_VAR :
  316. case T_BKC :
  317. case T_BKC1 :
  318. case T_ONER :
  319. case T_END :
  320. case T_JEND :
  321. case T_EXEK :
  322. cod[i_cod++] = c;
  323. bcopy((void*)&A,(void*)&cod[i_cod],d);
  324. i_cod+=d;
  325. break;
  326. case T_IF :
  327. cod[i_cod++] = c;
  328. adr[i_adr]=(void*)&cod[i_cod];
  329. i_cod+=d;
  330. tad[i_adr++]=c;
  331. break;
  332. case T_ELSE :
  333. if (tad[i_adr-1] == T_IF) {
  334. cod[i_cod++] = T_JMP;
  335. adr[i_adr]=(void*)&cod[i_cod];
  336. L = (void*)&(cod[i_cod]) - adr[i_adr-1];
  337. i_cod+=d;
  338. bcopy((void*)&L,adr[i_adr-1],d);
  339. tad[i_adr++]=c;
  340. } else messErr(14);
  341. break;
  342. case T_THEN :
  343. if ((tad[i_adr-1] == T_IF) || (tad[i_adr-1] == T_ELSE)) {
  344. L = (void*)&cod[i_cod+1] - adr[i_adr-1] - (sizeof(void*)+1);/*AV5*/
  345. bcopy((void*)&L,adr[i_adr-1],d);
  346. tad[i_adr]='\0';
  347. while (tad[i_adr] != T_IF) i_adr--; /* depile adr */
  348. } else messErr(14);
  349. break;
  350. case T_BEGI :
  351. adB[i_adB]=i_cod;
  352. tcB[i_adB++]=c;
  353. break;
  354. case T_DO :
  355. cod[i_cod++] = c;
  356. i_cod+=d;
  357. adD[i_adD]=i_cod;
  358. tcD[i_adD++]=c;
  359. cod[i_cod++] = T_IFD;
  360. L = d+1;
  361. bcopy((void*)&L,(void*)&cod[i_cod],d);
  362. i_cod+=d;
  363. cod[i_cod++] = T_GOTO;
  364. L = -1;
  365. bcopy((void*)&L,(void*)&cod[i_cod],d);
  366. i_cod+=d;
  367. break;
  368. case T_PLOO :
  369. case T_LOOP :
  370. if (tcD[i_adD-1] == T_DO) {
  371. i_adD--; /* on depile */
  372. cod[i_cod++] = c;
  373. i_cod+=d;
  374. cod[i_cod++] = T_GOTO;
  375. L = adD[i_adD];
  376. bcopy((void*)&L,(void*)&cod[i_cod],d);
  377. i_cod+=d;
  378. /* maj des breaks GOTO -1 */
  379. LE = i_cod;
  380. for(i=L;i<i_cod-(d+1);i+=(d+1)) {
  381. if (cod[i] == T_GOTO) {
  382. bcopy((void*)&cod[i+1],(void*)&L2,d);
  383. if (L2==-1) bcopy((void*)&LE,(void*)&cod[i+1],d);
  384. }
  385. }
  386. } else messErr(39);
  387. break;
  388. case T_AGAI :
  389. case T_REPE :
  390. if (tcB[i_adB-1] == T_BEGI) {
  391. i_adB--; /* on depile */
  392. cod[i_cod++] = T_GOTO;
  393. L = adB[i_adB];
  394. bcopy((void*)&L,(void*)&cod[i_cod],d);
  395. i_cod+=d;
  396. /* maj des breaks GOTO -1 */
  397. LE = i_cod;
  398. for(i=L;i<i_cod-(d+1);i+=(d+1)) {
  399. if (cod[i] == T_GOTO) {
  400. bcopy((void*)&cod[i+1],(void*)&L2,d);
  401. if (L2==-1) bcopy((void*)&LE,(void*)&cod[i+1],d);
  402. }
  403. }
  404. } else messErr(22);
  405. break;
  406. case T_UNTI :
  407. case T_WHIL :
  408. if (tcB[i_adB-1] == T_BEGI) {
  409. cod[i_cod++] = T_IFN;
  410. /* if (c==T_UNTI) cod[i_cod++] = T_IFN;
  411. else cod[i_cod++] = T_IF;
  412. */
  413. L = d+1;
  414. bcopy((void*)&L,(void*)&cod[i_cod],d);
  415. i_cod+=d;
  416. cod[i_cod++] = T_GOTO;
  417. if (c==T_UNTI) L = adB[i_adB-1];
  418. else L = -1;
  419. bcopy((void*)&L,(void*)&cod[i_cod],d);
  420. i_cod+=d;
  421. if (c==T_UNTI) {
  422. i_adB--; /* depile adB */
  423. /* maj des breaks GOTO -1 */
  424. LE = i_cod;
  425. for(i=L;i<i_cod-(d+1);i+=(d+1)) {
  426. if (cod[i] == T_GOTO) {
  427. bcopy((void*)&cod[i+1],(void*)&L2,d);
  428. if (L2==-1) bcopy((void*)&LE,(void*)&cod[i+1],d);
  429. }
  430. }
  431. }
  432. } else messErr(22);
  433. break;
  434. case T_BREA :
  435. cod[i_cod++] = T_GOTO;
  436. L = -1; /* special value for BREAK */
  437. bcopy((void*)&L,(void*)&cod[i_cod],d);
  438. i_cod+=d;
  439. break;
  440. default :
  441. messErr(11);
  442. }
  443. }
  444. static void newFct2(char * S, int U)
  445. {
  446. char Lib[LDFLT+1];
  447. strncpy(Lib,S,LDFLT);
  448. Lib[LDFLT]='\0';
  449. initFct(Lib, U);
  450. _MODIF_fctEnCours_(1);
  451. dropTrSuite();
  452. i_cod = 0;
  453. i_adr = 0;
  454. i_adB = 0;
  455. i_adD = 0;
  456. }
  457. static void newFct0(char * S)
  458. {
  459. newFct2(S,0);
  460. }
  461. static void newFct1(char * S)
  462. {
  463. newFct2(S,1);
  464. }
  465. void IF_debFct(void)
  466. {
  467. putTrSuite(newFct0);
  468. }
  469. void IF_debFctS(void)
  470. {
  471. putTrSuite(newFct1);
  472. }
  473. int D_Cod=0; /* deep of execution functions */
  474. static int D_LooP=0; /* deep of execution loops */
  475. static int Do_Evts=0; /* Global events indicator for do...loop */
  476. void IF_DO_MLeave (void)
  477. {
  478. long P, i;
  479. getParLong(&P);
  480. i=I_DO+1;
  481. if (i) {
  482. if (P > i) P=i;
  483. Do_Evts=P;
  484. }
  485. }
  486. void IF_DO_Leave (void)
  487. {
  488. if (I_DO>=0) Do_Evts=1;
  489. }
  490. void IF_DO_Next (void)
  491. {
  492. if (I_DO>=0) Do_Evts=-1;
  493. }
  494. void IF_DO_Show (void)
  495. {
  496. printf("do vars : I_DO=%d Evts=%d\n",I_DO, Do_Evts);
  497. }
  498. void execCod(void *A)
  499. {
  500. int i,n, ea, Ea, *ai, InDo=0, OnErr=0, mFCTP;
  501. long L, P;
  502. char * C, *D, *F, *W, *S, *ADo_Next, *ADo_Leave;
  503. void * T, *T2;
  504. void (*f)(void);
  505. struct Fct * FR;
  506. /* printf("pid = %d ITASK=%d FctInTask=%d\n",getpid(),ITASK,FctInTask);*/
  507. if (FctInTask) {
  508. if (ITASK==0) {
  509. if (FctInTask==-1) {
  510. FctInTask=0; return;
  511. }
  512. if (MakeTask(A)) return;
  513. }
  514. if (ITASK!=FctInTask) return;
  515. }
  516. D_Cod++;
  517. ai = (int*)A;
  518. i = *ai++;
  519. ea = *ai++;
  520. Ea = *ai;
  521. if (ea) tellOnErr(A);
  522. C = (char*)A+(3*sizeof(int));
  523. D = C;
  524. F = C+i;
  525. n = sizeof(T);
  526. while (C <= F) {
  527. /* printf("execCod : %s %d - %x : %ld\n",
  528. codByAddr(A),(int)(C-D),*C,(long)*(C+1));
  529. */
  530. if (noErr() && ((C==F) || ((Code)*C != T_ONER)) ) { /* to find onerr: */
  531. if (ea && (OnErr==0)) {
  532. C = D+ea;
  533. } else {
  534. printf("Called in %s err=%d i=%d/%d cod=<%x>\n",
  535. codByAddr(A),noErr(),(int)(C-D),i,*C);
  536. break; /* end of while */
  537. }
  538. }
  539. if (C==F) break; /* end of code */
  540. switch((Code)*C) {
  541. case T_ONER :
  542. if (noErr()==0) { /* jmp end: */
  543. if (Ea>ea) C = D+Ea;
  544. else C = F; /* to break */
  545. } else {
  546. if (OnErr==0) {
  547. OnErr=1;
  548. majLastErr(A);
  549. razErr();
  550. } else C = F;
  551. }
  552. break;
  553. case T_RET :
  554. C = F; /* to break */
  555. break;
  556. case T_END :
  557. break; /* nothing */
  558. case T_JEND :
  559. if (Ea) C = D+Ea;
  560. else C = F; /* to break */
  561. break;
  562. case T_NUM :
  563. bcopy((void*)(C+1),(void*)&T,n);
  564. insertVal(T);
  565. break;
  566. case T_CHA :
  567. bcopy((void*)(C+1),(void*)&W,n);
  568. putString(W);
  569. break;
  570. case T_LIB :
  571. if (InstallOn) {
  572. if (InstallOn < 3) {
  573. bcopy((void*)(C+1),(void*)&T,n);
  574. _MODIF_FCT_INST_(T);
  575. _MODIF_FCT_TYP_(1);
  576. } else {
  577. _MODIF_FCT_INST_(VIDE);
  578. _MODIF_FCT_TYP_(0);
  579. }
  580. InstallOn=0;
  581. } else {
  582. bcopy((void*)(C+1),(void*)&f,n);
  583. f();
  584. /* free context loops */
  585. if (Do_Evts) { /* quit or cut */
  586. /*printf("execCod T_LIB : Evts %d\n",Do_Evts);*/
  587. if (InDo) {
  588. if (Do_Evts>0) {
  589. C=ADo_Leave;
  590. I_DO--;
  591. InDo = 0;
  592. Do_Evts--;
  593. } else {
  594. C=ADo_Next;
  595. Do_Evts=0;
  596. }
  597. } else { /* quit */
  598. C = F;
  599. }
  600. }
  601. }
  602. break;
  603. case T_FCT :
  604. if (InstallOn) {
  605. if (InstallOn < 3) {
  606. bcopy((void*)(C+1),(void*)&T,n);
  607. T2=fctByCode(T);
  608. _MODIF_FCT_INST_(T2);
  609. _MODIF_FCT_TYP_(2);
  610. } else {
  611. _MODIF_FCT_INST_(VIDE);
  612. _MODIF_FCT_TYP_(0);
  613. }
  614. InstallOn=0;
  615. } else {
  616. bcopy((void*)(C+1),(void*)&T,n);
  617. execCod(T);
  618. /* free context loops */
  619. if (Do_Evts) { /* quit or cut */
  620. /*printf("execCod T_FCT : Evts %d\n",Do_Evts);*/
  621. if (InDo) {
  622. if (Do_Evts>0) {
  623. C=ADo_Leave;
  624. I_DO--;
  625. InDo = 0;
  626. Do_Evts--;
  627. } else {
  628. C=ADo_Next;
  629. Do_Evts=0;
  630. }
  631. } else { /* quit */
  632. C = F;
  633. }
  634. }
  635. }
  636. break;
  637. case T_FCTDS :
  638. case T_EXEKS :
  639. if ((S = getString()) != NULL)
  640. free((void*)S); /* remove the string */
  641. break;
  642. case T_FCTD :
  643. if ((S = getString()) != NULL)
  644. free((void*)S); /* remove the string */
  645. if (noErr()) break;
  646. case T_FCTDW :
  647. case T_FCTP :
  648. bcopy((void*)(C+1),(void*)&T,n);
  649. FR = (struct Fct *)T;
  650. execCod(FR->c);
  651. /* free context loops */
  652. if (Do_Evts) { /* quit or cut */
  653. /*printf("execCod T_FCTD : Evts %d\n",Do_Evts);*/
  654. if (InDo) {
  655. if (Do_Evts>0) {
  656. C=ADo_Leave;
  657. I_DO--;
  658. InDo = 0;
  659. Do_Evts--;
  660. } else {
  661. C=ADo_Next;
  662. Do_Evts=0;
  663. }
  664. } else { /* quit */
  665. C = F;
  666. }
  667. }
  668. if (*C == T_FCTP) {
  669. if (mFCTP) *C = T_FCTDW;
  670. else *C = T_FCTD;
  671. }
  672. break;
  673. case T_EXEK :
  674. if ((S = getString()) != NULL) {
  675. if (strlen(S)>0) { /* to do with T_FCTD */
  676. mFCTP=0;
  677. T = makeFunction(S);
  678. if (T != VIDE) {
  679. bcopy((void*)&T, (void*)(C+1),n);
  680. *C = T_FCTP;
  681. C -= (n+1);
  682. unlinkLastFct();
  683. /* upgrading precedent code ? not always ! */
  684. if (C >= D) {
  685. if (*C == T_CHA) { /* case of a string */
  686. *C = T_CHAS;
  687. mFCTP=1;
  688. }
  689. if (*C == T_VAR) { /* case of a variable string */
  690. bcopy((void*)(C+1),(void*)&W,n);
  691. if (isVarChar(W)) {
  692. *C = T_VARS;
  693. mFCTP=1;
  694. }
  695. }
  696. }
  697. } else /* error in compilation */
  698. *C = T_EXEKS;
  699. }
  700. free((void*)S);
  701. }
  702. break;
  703. case T_IF :
  704. if (!getBool()) {
  705. bcopy((void*)(C+1),(void*)&L,n);
  706. C += L;
  707. }
  708. break;
  709. case T_IFN :
  710. if (getBool()) {
  711. bcopy((void*)(C+1),(void*)&L,n);
  712. C += L;
  713. }
  714. break;
  715. case T_DO :
  716. I_DO++;
  717. InDo=1;
  718. /* maj do_adresses */
  719. W = C + (2*(n+1));
  720. bcopy((void*)(W+1),(void*)&L,n);
  721. ADo_Leave=D+L-n-1;
  722. ADo_Next=ADo_Leave-(2*(n+1));
  723. /* printf("execCod T_DO : AL= %d AN=%d\n",
  724. (int)(ADo_Leave-D), (int)(ADo_Next-D));*/
  725. getParLong(&P);
  726. D_DO[I_DO] = P;
  727. getParLong(&P);
  728. L_DO[I_DO] = P;
  729. if (P > D_DO[I_DO]) S_DO[I_DO]=0;
  730. else S_DO[I_DO]=1;
  731. break;
  732. case T_DO_I :
  733. IF_getIndDo(0);
  734. break;
  735. case T_DO_J :
  736. IF_getIndDo(1);
  737. break;
  738. case T_DO_K :
  739. IF_getIndDo(2);
  740. break;
  741. case T_IFD :
  742. if (S_DO[I_DO]) {
  743. if (D_DO[I_DO] > L_DO[I_DO]) {
  744. bcopy((void*)(C+1),(void*)&L,n);
  745. C += L;
  746. } else {
  747. I_DO--;
  748. InDo=0;
  749. }
  750. } else {
  751. if (D_DO[I_DO] < L_DO[I_DO]) {
  752. bcopy((void*)(C+1),(void*)&L,n);
  753. C += L;
  754. } else {
  755. I_DO--;
  756. InDo=0;
  757. }
  758. }
  759. break;
  760. case T_LOOP :
  761. if (S_DO[I_DO]) D_DO[I_DO]--;
  762. else D_DO[I_DO]++;
  763. break;
  764. case T_PLOO :
  765. getParLong(&P);
  766. D_DO[I_DO]+=P;
  767. break;
  768. case T_JMP :
  769. bcopy((void*)(C+1),(void*)&L,n);
  770. C += L;
  771. break;
  772. case T_GOTO :
  773. bcopy((void*)(C+1),(void*)&L,n);
  774. C = D + L - n-1;
  775. break;
  776. case T_VAR :
  777. if (InstallOn) {
  778. if (InstallOn == 3) {
  779. bcopy((void*)(C+1),(void*)&T,n);
  780. _MODIF_FCT_INST_(T);
  781. _MODIF_FCT_TYP_(3);
  782. } else {
  783. _MODIF_FCT_INST_(VIDE);
  784. _MODIF_FCT_TYP_(0);
  785. }
  786. InstallOn=0;
  787. } else {
  788. bcopy((void*)(C+1),(void*)&W,n);
  789. executeVar(W);
  790. /* free context loops */
  791. if (Do_Evts) { /* quit or cut */
  792. /*printf("execCod T_VAR : Evts %d\n",Do_Evts);*/
  793. if (InDo) {
  794. if (Do_Evts>0) {
  795. C=ADo_Leave;
  796. I_DO--;
  797. InDo = 0;
  798. Do_Evts--;
  799. } else {
  800. C=ADo_Next;
  801. Do_Evts=0;
  802. }
  803. } else { /* quit */
  804. C = F;
  805. }
  806. }
  807. }
  808. break;
  809. case T_BKC :
  810. bcopy((void*)(C+1),(void*)&W,n);
  811. execLib(W);
  812. break;
  813. case T_BKC1 : /* like makeFct */
  814. bcopy((void*)(C+1),(void*)&W,n);
  815. /* try to modify the code */
  816. if (VARS==2) { /* VARS UP */
  817. if ((T = varByName(W)) != VIDE) {
  818. *C = T_VAR;
  819. } else {
  820. if ((T = fctByName(W)) != VIDE) {
  821. *C = T_FCT;
  822. FR = (struct Fct *)T;
  823. T = FR->c;
  824. }
  825. }
  826. } else {
  827. if ((T = fctByName(W)) != VIDE) {
  828. *C = T_FCT;
  829. FR = (struct Fct *)T;
  830. T = FR->c;
  831. } else {
  832. if ((VARS==1) && ((T = varByName(W)) != VIDE)) {
  833. *C = T_VAR;
  834. }
  835. }
  836. }
  837. if ((Code)*C != T_BKC1) { /* code is updated */
  838. bcopy((void*)&T, (void*)(C+1),n);
  839. C-=(n+1); /* it must be executed */
  840. }
  841. break;
  842. case T_NOP :
  843. case T_CHAS :
  844. case T_VARS :
  845. case T_FCTDWS :
  846. break;
  847. default :
  848. messErr(11);
  849. }
  850. C+= n+1;
  851. }
  852. D_Cod--;
  853. if (ea) tellOnErr(VIDE);
  854. }
  855. void execFctV(void * A)
  856. {
  857. struct Fct * N;
  858. N = (struct Fct*) A;
  859. execCod(N->c);
  860. }
  861. int IF_execFct(char * L)
  862. {
  863. void * Next;
  864. struct Fct * N;
  865. Next = stackF;
  866. while (Next != VIDE) {
  867. N = (struct Fct*) Next;
  868. if (strcmp(N->l,L)==0) {
  869. if (fctEnCours) makeFct(T_FCT,N->c);
  870. else execCod(N->c);
  871. return 1;
  872. }
  873. Next = N->n;
  874. }
  875. return 0;
  876. }
  877. void * fctByName(char * L)
  878. {
  879. void * Next;
  880. struct Fct * N;
  881. Next = stackF;
  882. while (Next != VIDE) {
  883. N = (struct Fct*) Next;
  884. if (strcmp(N->l,L)==0) return Next;
  885. Next = N->n;
  886. }
  887. return VIDE;
  888. }
  889. void * codFctByInd(long i)
  890. {
  891. void * Next;
  892. struct Fct * N;
  893. long j=0;
  894. Next = stackF;
  895. while (Next != VIDE) {
  896. N = (struct Fct*) Next;
  897. j++;
  898. if (i==j) return (N->c);
  899. Next = N->n;
  900. }
  901. return VIDE;
  902. }
  903. void * fctByInd(long i)
  904. {
  905. void * Next;
  906. struct Fct * N;
  907. long j=0;
  908. Next = stackF;
  909. while (Next != VIDE) {
  910. N = (struct Fct*) Next;
  911. j++;
  912. if (i==j) return Next;
  913. Next = N->n;
  914. }
  915. return VIDE;
  916. }
  917. void * fctByCode(void * C)
  918. {
  919. void * Next;
  920. struct Fct * N;
  921. Next = stackF;
  922. while (Next != VIDE) {
  923. N = (struct Fct*) Next;
  924. if (N->c==C) return Next;
  925. Next = N->n;
  926. }
  927. return VIDE;
  928. }
  929. static void rmFct(char * L)
  930. {
  931. void ** PNext;
  932. struct Fct * N;
  933. dropTrSuite();
  934. PNext = &stackF;
  935. while (*PNext != VIDE) {
  936. N = (struct Fct*) *PNext;
  937. if (N->typ==0)
  938. if (strcmp(N->l,L)==0) {
  939. *PNext = N->n;
  940. eraseFct(N);
  941. return;
  942. }
  943. PNext = &N->n;
  944. }
  945. messErr(21);
  946. }
  947. static void rmAFct(char * L)
  948. {
  949. void ** PNext;
  950. struct Fct * N;
  951. dropTrSuite();
  952. PNext = &stackF;
  953. while (*PNext != VIDE) {
  954. N = (struct Fct*) *PNext;
  955. if ((N->typ==0) && (strncmp(N->l,L,strlen(L))==0)) {
  956. *PNext = N->n;
  957. eraseFct(N);
  958. }
  959. else PNext = &N->n;
  960. }
  961. }
  962. static void rmOFct(char * L)
  963. {
  964. void ** PNext, ** FP;
  965. struct Fct * N, * F;
  966. dropTrSuite();
  967. F = VIDE;
  968. PNext = &stackF;
  969. while (*PNext != VIDE) {
  970. N = (struct Fct*) *PNext;
  971. if (N->typ==0)
  972. if (strcmp(N->l,L)==0) {
  973. FP = PNext;
  974. F = N;
  975. }
  976. PNext = &N->n;
  977. }
  978. if (F != VIDE) {
  979. *FP = F->n;
  980. eraseFct(F);
  981. }
  982. else messErr(21);
  983. }
  984. char * fctByAddr(void * A)
  985. {
  986. void * Next;
  987. struct Fct * N;
  988. Next = stackF;
  989. while (Next != VIDE) {
  990. N = (struct Fct*) Next;
  991. if (Next==A) return N->l;
  992. Next = N->n;
  993. }
  994. return NULL;
  995. }
  996. long iFctByCode(void * A)
  997. {
  998. void * Next;
  999. struct Fct * N;
  1000. long i=0;
  1001. Next = stackF;
  1002. while (Next != VIDE) {
  1003. i++;
  1004. N = (struct Fct*) Next;
  1005. if (N->c==A) return i;
  1006. Next = N->n;
  1007. }
  1008. return 0L;
  1009. }
  1010. long iFctByAddr(void * A)
  1011. {
  1012. void * Next;
  1013. struct Fct * N;
  1014. long i=0;
  1015. Next = stackF;
  1016. while (Next != VIDE) {
  1017. i++;
  1018. N = (struct Fct*) Next;
  1019. if (Next==A) return i;
  1020. Next = N->n;
  1021. }
  1022. return 0L;
  1023. }
  1024. char * codByAddr(void * A)
  1025. {
  1026. void * Next;
  1027. struct Fct * N;
  1028. Next = stackF;
  1029. while (Next != VIDE) {
  1030. N = (struct Fct*) Next;
  1031. if (N->c==A) return N->l;
  1032. Next = N->n;
  1033. }
  1034. return NULL;
  1035. }
  1036. void prMarge(int n)
  1037. {
  1038. int N, i;
  1039. N = n*3;
  1040. for(i=0;i<N;i++) printf(" ");
  1041. }
  1042. static void scanFoncI(void * AdF, int marge)
  1043. {
  1044. void *A, *W;
  1045. struct Fct * N;
  1046. int i,n, ea, Ea, *ai;
  1047. long L;
  1048. char * C, *F, *D, lm[6];
  1049. N = (struct Fct *)AdF;
  1050. *lm = '\0';
  1051. A = N->c;
  1052. ai = (int*)A;
  1053. i = *ai++;
  1054. ea = *ai++;
  1055. Ea = *ai;
  1056. C = (char*)A+(3*sizeof(int));
  1057. D = C;
  1058. F = C+i;
  1059. n = sizeof(A);
  1060. if (marge) prMarge(marge);
  1061. if (N->typ) printf ("System ");
  1062. printf("Fonction : %s (%d) : 0x%lx\n", N->l, i, (unsigned long)A );
  1063. if (ea+Ea) {
  1064. if (ea) printf("Catching error at %d",ea);
  1065. if (Ea) {
  1066. if (ea) printf(" - ");
  1067. printf("End label at %d",Ea);
  1068. }
  1069. printf("\n");
  1070. }
  1071. while (C < F) {
  1072. if (marge) prMarge(marge);
  1073. printf(" %.4d : ",(int)(C-D));
  1074. switch((Code)*C) {
  1075. case T_NOP :
  1076. case T_CHAS :
  1077. case T_VARS :
  1078. case T_FCTDWS :
  1079. printf("NOP\n");
  1080. break;
  1081. case T_FCTDS :
  1082. case T_EXEKS :
  1083. printf("\"drop\n");
  1084. break;
  1085. case T_RET :
  1086. printf("RETURN\n");
  1087. break;
  1088. case T_ONER :
  1089. printf("onerr: label\n");
  1090. break;
  1091. case T_END :
  1092. printf("end: label\n");
  1093. break;
  1094. case T_JEND :
  1095. printf("goto end:\n");
  1096. break;
  1097. case T_NUM :
  1098. bcopy((void*)(C+1),(void*)&W,n);
  1099. printf("Number value : ");
  1100. printNumber(W);
  1101. printf("\n");
  1102. break;
  1103. case T_CHA :
  1104. bcopy((void*)(C+1),(void*)&W,n);
  1105. printf("Character String \"%s\"\n",(char*)W);
  1106. break;
  1107. case T_LIB :
  1108. bcopy((void*)(C+1),(void*)&W,n);
  1109. printf("Call to library : %s\n", libByAddr(W));
  1110. break;
  1111. case T_FCT :
  1112. bcopy((void*)(C+1),(void*)&W,n);
  1113. printf("Function : %s\n", codByAddr(W));
  1114. break;
  1115. case T_FCTD :
  1116. printf("\"drop + ");
  1117. case T_FCTDW :
  1118. bcopy((void*)(C+1),(void*)&W,n);
  1119. N = (struct Fct *)W;
  1120. printf("Dynamic Function at 0x%lx\n", (long)W);
  1121. scanFoncI(W,marge+1);
  1122. break;
  1123. case T_IF :
  1124. bcopy((void*)(C+1),(void*)&L,n);
  1125. printf("IF false goto %ld\n",(C-D)+L+n+1);
  1126. break;
  1127. case T_DO :
  1128. printf("DO [ LIMIT I -- ]\n");
  1129. break;
  1130. case T_DO_I :
  1131. printf("GET I [ -- I ]\n");
  1132. break;
  1133. case T_DO_J :
  1134. printf("GET J [ -- J ]\n");
  1135. break;
  1136. case T_DO_K :
  1137. printf("GET K [ -- K ]\n");
  1138. break;
  1139. case T_LOOP :
  1140. printf("I=+/-1\n");
  1141. break;
  1142. case T_PLOO :
  1143. printf("I += V [ V -- ]\n");
  1144. break;
  1145. case T_IFN :
  1146. bcopy((void*)(C+1),(void*)&L,n);
  1147. printf("IF true goto %ld\n",(C-D)+L+n+1);
  1148. break;
  1149. case T_IFD :
  1150. bcopy((void*)(C+1),(void*)&L,n);
  1151. printf("IF (LIMIT NOT REACHED) goto %ld\n",(C-D)+L+n+1);
  1152. break;
  1153. case T_JMP :
  1154. bcopy((void*)(C+1),(void*)&L,n);
  1155. printf("JMP $+%ld\n",L);
  1156. break;
  1157. case T_GOTO :
  1158. bcopy((void*)(C+1),(void*)&L,n);
  1159. printf("GOTO %ld\n",L);
  1160. break;
  1161. case T_EXEK :
  1162. printf("Dynamic Compile (\"execk) !\n");
  1163. break;
  1164. case T_VAR :
  1165. bcopy((void*)(C+1),(void*)&W,n);
  1166. printf("Call variable : %s\n", varByAddr(W));
  1167. break;
  1168. case T_BKC1 :
  1169. strcpy(lm,"1st ");
  1170. case T_BKC :
  1171. bcopy((void*)(C+1),(void*)&W,n);
  1172. printf("Back Compile %s: \"%s\"\n",lm, (char*)W);
  1173. break;
  1174. default :
  1175. printf("0x%x : code inconnu !!\n",(int)*C);
  1176. }
  1177. C+= n+1;
  1178. }
  1179. }
  1180. static void scanFonc(char * Lib)
  1181. {
  1182. void ** PNext;
  1183. struct Fct * N;
  1184. dropTrSuite();
  1185. PNext = &stackF;
  1186. while (*PNext != VIDE) {
  1187. N = (struct Fct*) *PNext;
  1188. if (strcmp(N->l,Lib)==0) break;
  1189. PNext = &N->n;
  1190. }
  1191. if (strcmp(N->l,Lib)!=0) {
  1192. messErr(21);
  1193. return;
  1194. }
  1195. scanFoncI((void*)N ,0);
  1196. }
  1197. void IF_execCS(void)
  1198. {
  1199. char * f;
  1200. f = getString();
  1201. if (f != NULL) {
  1202. if (!IF_execFct(f)) {
  1203. printf("%s - ",f); messErr(21);
  1204. }
  1205. free((void*)f);
  1206. }
  1207. }
  1208. void IF_execCSl(void)
  1209. {
  1210. char * f;
  1211. f = getString();
  1212. if (f != NULL) {
  1213. if (IF_execFct(f)) putBool(TRUE);
  1214. else putBool(FALSE);
  1215. free((void*)f);
  1216. }
  1217. else putBool(FALSE);
  1218. }
  1219. void IF_execCSv(void)
  1220. {
  1221. char * f;
  1222. f = getString();
  1223. if (f != NULL) {
  1224. if (!IF_execVar(f)) {
  1225. printf("%s - ",f); messErr(24);
  1226. }
  1227. free((void*)f);
  1228. }
  1229. }
  1230. void IF_execCSvl(void)
  1231. {
  1232. char * f;
  1233. f = getString();
  1234. if (f != NULL) {
  1235. if (IF_execVar(f)) putBool(TRUE);
  1236. else putBool(FALSE);
  1237. free((void*)f);
  1238. }
  1239. else putBool(FALSE);
  1240. }
  1241. void IF_delFct(void)
  1242. {
  1243. putTrSuite(rmFct);
  1244. }
  1245. void IF_delAFct(void)
  1246. {
  1247. putTrSuite(rmAFct);
  1248. }
  1249. void IF_delOFct(void)
  1250. {
  1251. putTrSuite(rmOFct);
  1252. }
  1253. void IF_scanFct(void)
  1254. {
  1255. putTrSuite(scanFonc);
  1256. }
  1257. static void IF_instruct(Code C)
  1258. {
  1259. if (fctEnCours) makeFct(C,NULL);
  1260. else messErr(13);
  1261. }
  1262. void IF_RET(void) { IF_instruct(T_RET); }
  1263. void IF_IF(void) { IF_instruct(T_IF); }
  1264. void IF_THEN(void) { IF_instruct(T_THEN); }
  1265. void IF_ELSE(void) { IF_instruct(T_ELSE); }
  1266. void IF_BEGIN(void) { IF_instruct(T_BEGI); }
  1267. void IF_AGAIN(void) { IF_instruct(T_AGAI); }
  1268. void IF_UNTIL(void) { IF_instruct(T_UNTI); }
  1269. void IF_WHILE(void) { IF_instruct(T_WHIL); }
  1270. void IF_REPEAT(void) { IF_instruct(T_REPE); }
  1271. void IF_BREAK(void) { IF_instruct(T_BREA); }
  1272. void IF_MYSELF(void) { IF_instruct(T_MYSF); }
  1273. void IF_DO(void) { IF_instruct(T_DO); }
  1274. void IF_LOOP(void) { IF_instruct(T_LOOP); }
  1275. void IF_PLOOP(void) { IF_instruct(T_PLOO); }
  1276. void IF_I_DO(void) { IF_instruct(T_DO_I); }
  1277. void IF_J_DO(void) { IF_instruct(T_DO_J); }
  1278. void IF_K_DO(void) { IF_instruct(T_DO_K); }
  1279. void IF_ONERR(void) { IF_instruct(T_ONER); }
  1280. void IF_END(void) { IF_instruct(T_END); }
  1281. void IF_JEND(void) { IF_instruct(T_JEND); }
  1282. void IF_EXEK(void) { IF_instruct(T_EXEK); }
  1283. /* code for back compilation of calling functions and variables */
  1284. void suiteBackC(char *S)
  1285. {
  1286. void * M;
  1287. dropTrSuite();
  1288. if (strlen(S) > LDFLT) {
  1289. messErr(9);
  1290. return;
  1291. }
  1292. if (S[strlen(S)-1] != '\'') {
  1293. messErr(44);
  1294. return;
  1295. }
  1296. S[strlen(S)-1] = '\0';
  1297. if ((M = malloc(strlen(S)+1)) == NULL) stopErr("suiteBackC","malloc");
  1298. #ifdef DEBUG_M
  1299. printf("New String address : %lu \n",(unsigned long)M);
  1300. #endif
  1301. strcpy((char*)M,S);
  1302. if (fctEnCours) makeFct(T_BKC,M);
  1303. else messErr(13);
  1304. }
  1305. void IF_debBackC(void)
  1306. {
  1307. putTrSuite(suiteBackC);
  1308. }
  1309. void suiteBackC1(char *S)
  1310. {
  1311. void * M;
  1312. dropTrSuite();
  1313. if (strlen(S) > LDFLT) {
  1314. messErr(9);
  1315. return;
  1316. }
  1317. if (S[strlen(S)-1] != '`') {
  1318. messErr(44);
  1319. return;
  1320. }
  1321. S[strlen(S)-1] = '\0';
  1322. if ((M = malloc(strlen(S)+1)) == NULL) stopErr("suiteBackC1","malloc");
  1323. #ifdef DEBUG_M
  1324. printf("New String address : %lu \n",(unsigned long)M);
  1325. #endif
  1326. strcpy((char*)M,S);
  1327. if (fctEnCours) makeFct(T_BKC1,M);
  1328. else messErr(13);
  1329. }
  1330. void IF_debBackC1(void)
  1331. {
  1332. putTrSuite(suiteBackC1);
  1333. }
  1334. void dump_code(int fd, char * C)
  1335. {
  1336. void * A;
  1337. uint32_t i;
  1338. write(fd, C, 1);
  1339. bcopy((void*)(C+1),(void*)&A,sizeof(A));
  1340. switch((Code)*C) {
  1341. case T_ONER :
  1342. case T_RET :
  1343. case T_END :
  1344. case T_JEND :
  1345. case T_NOP :
  1346. case T_DO_I :
  1347. case T_DO_J :
  1348. case T_DO_K :
  1349. case T_LOOP :
  1350. case T_PLOO :
  1351. case T_EXEK :
  1352. break; /* nothing */
  1353. case T_NUM :
  1354. dump_eltN(fd, A, 0);
  1355. break;
  1356. case T_CHA :
  1357. case T_BKC :
  1358. case T_BKC1 :
  1359. dump_eltC(fd, (char*)A);
  1360. break;
  1361. case T_LIB :
  1362. i = iLibByAddr(A);
  1363. write(fd, (void*)&i, sizeof(i));
  1364. break;
  1365. case T_FCT :
  1366. i = iFctByCode(A);
  1367. write(fd, (void*)&i, sizeof(i));
  1368. break;
  1369. case T_VAR :
  1370. i = iVarByAddr(A);
  1371. write(fd, (void*)&i, sizeof(i));
  1372. break;
  1373. case T_IF :
  1374. case T_IFN :
  1375. case T_DO :
  1376. case T_IFD :
  1377. case T_JMP :
  1378. case T_GOTO :
  1379. bcopy((void*)(C+1),(void*)&i,sizeof(i));
  1380. write(fd, (void*)&i, sizeof(i));
  1381. break;
  1382. /* en principe pas possible !!!
  1383. case T_FCTP :
  1384. i = iFctByAddr(A);
  1385. write(fd, (void*)&i, sizeof(i));
  1386. break;
  1387. *********************/
  1388. default :
  1389. printf("dump_code : Code %d inconnu !\n",(int)(*C));
  1390. messErr(58);
  1391. }
  1392. }
  1393. void dump_stackF(int fd)
  1394. {
  1395. uint32_t n=0, vv;
  1396. long v, vi, i, j, pas, t;
  1397. int *av;
  1398. void *Next, *A;
  1399. struct Fct * N;
  1400. char * C, *F;
  1401. Next = stackF;
  1402. while (Next != VIDE) {
  1403. N = (struct Fct*) Next;
  1404. n++;
  1405. Next = N->n;
  1406. }
  1407. write(fd, (void*)&n, sizeof(n));
  1408. t = sizeof(A) + 1;
  1409. for (i=n; i>0; i--) {
  1410. Next = stackF;
  1411. j=0;
  1412. while (Next != VIDE) {
  1413. N = (struct Fct*) Next;
  1414. j++;
  1415. if (i==j) break;
  1416. Next = N->n;
  1417. }
  1418. updDynFct(Next,0);
  1419. write(fd, (void*)&(N->typ), sizeof(N->typ));
  1420. dump_eltC(fd, N->l);
  1421. A = N->c;
  1422. av = (int*)A;
  1423. vi = (long)*av++; /* i */
  1424. vv = vi / t;
  1425. write(fd, (void*)&vv, sizeof(vv));
  1426. v = (long)*av++; /* ea */
  1427. vv = v / t;
  1428. write(fd, (void*)&vv, sizeof(vv));
  1429. v = (long)*av++; /* Ea */
  1430. vv = v / t;
  1431. write(fd, (void*)&vv, sizeof(vv));
  1432. C = (char*)A+(3*sizeof(int));
  1433. F = C+vi;
  1434. pas = sizeof(A) + 1;
  1435. while (C < F) {
  1436. dump_code(fd, C);
  1437. C += pas;
  1438. }
  1439. }
  1440. dump_rest_pr(0,n,"user functions");
  1441. }
  1442. void restore_links_stackF(void)
  1443. {
  1444. void **ANext, *A;
  1445. return;
  1446. }
  1447. static int NbARIV, NbARIL, NbARIF;
  1448. void restore_code(int fd, char * b, long delta)
  1449. {
  1450. void * A;
  1451. uint32_t i;
  1452. int nc;
  1453. if ((read(fd, (void*)b, 1)) != 1) return;
  1454. switch((Code)*b) {
  1455. case T_NUM :
  1456. A = restore_eltN(fd);
  1457. bcopy((void*)(&A),(void*)(b+1),sizeof(A));
  1458. break;
  1459. case T_CHA :
  1460. case T_BKC :
  1461. case T_BKC1 :
  1462. A = (void*)restore_eltC(fd);
  1463. bcopy((void*)(&A),(void*)(b+1),sizeof(A));
  1464. break;
  1465. case T_LIB :
  1466. nc = read(fd, (void*)&i, sizeof(i));
  1467. A = libByInd(i);
  1468. bcopy((void*)(&A),(void*)(b+1),sizeof(A));
  1469. NbARIL++;
  1470. break;
  1471. case T_FCT :
  1472. nc = read(fd, (void*)&i, sizeof(i));
  1473. A = codFctByInd(i-delta);
  1474. /* printf("i=%d delta=%d A=%lx\n",i,delta,(long)A); */
  1475. bcopy((void*)(&A),(void*)(b+1),sizeof(A));
  1476. NbARIF++;
  1477. break;
  1478. case T_VAR :
  1479. nc = read(fd, (void*)&i, sizeof(i));
  1480. A = varAddrByInd(i);
  1481. bcopy((void*)(&A),(void*)(b+1),sizeof(A));
  1482. NbARIV++;
  1483. break;
  1484. case T_IF :
  1485. case T_IFN :
  1486. case T_DO :
  1487. case T_IFD :
  1488. case T_JMP :
  1489. case T_GOTO :
  1490. nc = read(fd, (void*)&i, sizeof(i));
  1491. bcopy((void*)(&i),(void*)(b+1),sizeof(i));
  1492. break;
  1493. default :
  1494. break;
  1495. }
  1496. /* printf("\tCODE=%d i=%d\n", (int)*b, (int)i); */
  1497. }
  1498. void restore_stackF(int fd)
  1499. {
  1500. uint32_t n=0, vv;
  1501. long i, vi, v, pas, t;
  1502. short typ;
  1503. char *Lib, *C, *F;
  1504. void * M;
  1505. struct Fct *Elt;
  1506. int *bi, nc;
  1507. if (read(fd, (void*)&n, sizeof(n)) != sizeof(n)) return;
  1508. /* suppress all fcts */
  1509. rmAllFonU();
  1510. while (stackF != VIDE) {
  1511. Elt = (struct Fct *)stackF;
  1512. stackF = Elt->n;
  1513. eraseFct(Elt);
  1514. }
  1515. /* printf("Nb fct : %d\n", n); */
  1516. NbARIV=NbARIF=NbARIL=0;
  1517. t = sizeof(M) + 1;
  1518. for (i=0; i<n; i++) {
  1519. nc = read(fd, (void*)&typ, sizeof(typ));
  1520. Lib = restore_eltC(fd);
  1521. initFct(Lib,typ);
  1522. nc=read(fd, (void*)&vv, sizeof(vv));
  1523. vi = vv * t;
  1524. if ((M = malloc((3*sizeof(int))+vi)) == NULL)
  1525. stopErr("restore_stackF","malloc");
  1526. bi = (int*)M;
  1527. *bi++ = (int)vi;
  1528. nc=read(fd, (void*)&vv, sizeof(vv));
  1529. v = vv * t;
  1530. *bi++ = (int)v;
  1531. /* printf("Nom=<%s> type=%d vi=%d v1=%d", Lib, typ, (int)vi, (int)v); */
  1532. nc=read(fd, (void*)&vv, sizeof(vv));
  1533. v = vv * t;
  1534. *bi = (int)v;
  1535. /* printf(" v2=%d\n", (int)v); */
  1536. C = (char*)M+(3*sizeof(int));
  1537. F = C+vi;
  1538. pas = sizeof(M) + 1;
  1539. putCodeFct(M);
  1540. while (C < F) {
  1541. restore_code(fd, C, n-(i+1));
  1542. C += pas;
  1543. }
  1544. }
  1545. dump_rest_pr(1,n,"user functions");
  1546. rest_links_pr(NbARIV, "variable", "user functions");
  1547. rest_links_pr(NbARIL, "library function", "user functions");
  1548. rest_links_pr(NbARIF, "user function", "user functions");
  1549. }